PageSourceSearch

https://chipinfo.pro/articles

html chipinfo.pro collected 2026-10-04 22:35:52 UTC 30,617 bytes, 636 lines download raw bytes

1<!DOCTYPE html>
2<html lang='ru' xml:lang='ru' xmlns='http://www.w3.org/1999/xhtml'>
3<head>
4  <title>Статьи</title>
5  <base href="https://chipinfo.pro/" />
6  <meta name="viewport" content="width=device-width, initial-scale=0.6" />
7  <meta https-equiv="content-type" content="text/html; charset=utf-8" />
8  <meta name="description" content="Статьи по электронике" />
9  <meta name="keywords" content="электроника, электротехника, компоненты, электронные, база, резисторы, конденсаторы, транзисторы, микросхемы, тиристоры, диоды, стабилитроны, аналоги, стабилизаторы, микроконтроллеры" />
10  <meta property="og:title" content="ChipInfo" />
11  <meta property="og:site_name" content="ChipInfo" />
12  <meta property="og:description" content="The coolest electronics guide ChipInfo.pro" />
13  <meta property="og:url" content="https://chipinfo.pro/">
14  <meta property="og:type" content="website" />
15  <meta name="yandex-tableau-widget" content="logo=https://chipinfo.pro/style/favicon.png, color=#f5f5f5" />
16  <meta name="theme-color" content="#cccc">
17  <meta name="csrf-token" content="Pe9wF9xfrAEwRBgoHKl2nnhRuzLB4dC42hNEB6Z3">
18	<link rel="stylesheet" href="https://chipinfo.pro/style/style.css" />
19  <link rel="stylesheet" href="https://chipinfo.pro/style/components.css" />
20		<link rel="shortcut icon" href="https://chipinfo.pro/style/favicon.ico" type="image/vnd.microsoft.icon" />
21	<link rel="icon" href="https://chipinfo.pro/style/favicon.ico" type="image/vnd.microsoft.icon" />
22  <link rel="icon" href="https://chipinfo.pro/style/favicon.svg" type="image/svg+xml">
23	<link rel="manifest" href="https://chipinfo.pro/manifest.json" />
24	<link rel="dns-prefetch" href="https://mc.yandex.ru">
25	<link rel="dns-prefetch" href="https://an.yandex.ru">
26	<link rel="dns-prefetch" href="https://site.yandex.net">
27  <link rel="dns-prefetch" href="https://vk.com">
28  
28<script type="text/javascript" src="https://vk.com/js/api/openapi.js?122"></script>
28
29  
29<script type="text/javascript" src="https://chipinfo.pro/core/vanicom.min.js"></script>
29
30  
30<script type="text/javascript" src="https://chipinfo.pro/core/core.js"></script>
30
31	
31<script type="text/javascript" src="https://chipinfo.pro/core/debounce.js"></script>
31
32	
32<script type="text/javascript" src="https://mc.yandex.ru/metrika/watch.js" async></script>
32<!-- Метрика -->
33  
33<script type="text/javascript" src="https://an.yandex.ru/system/context.js" async></script>
33<!-- Реклама -->
34
35  
35<script type="text/javascript">
36	var csrf_token = 'Pe9wF9xfrAEwRBgoHKl2nnhRuzLB4dC42hNEB6Z3';
37	var appRoutes = {
38		base: 'https://chipinfo.pro/',
39		tags: {
40			materials: 'https://chipinfo.pro/api/tags/materials'
41		},
42		auth: {
43			login: 'https://chipinfo.pro/login',
44			register: 'https://chipinfo.pro/register',
45			passwordEmail: 'https://chipinfo.pro/password/email',
46			passwordReset: 'https://chipinfo.pro/password/reset'
47		},
48					};
49
50	var ads_row_id = null;
51	var ya_block_id = null;
52	var warningBlockStyles = { display: 'block', position: 'fixed', width: '100%', left: '0px', bottom: '0px', zIndex: '1000', background: '#0d5c88', color: '#fff' };
53	var warningInnerStyles = { width: '100%', padding: '10px 0', margin: '0 auto', textAlign: 'center', fontSize: '70%' };
54	var adsBlockCommonStyles = { color: '#9A9A9A', margin: '0px auto', overflow: 'hidden' };
55	var adsRowCommonStyles = { margin: '0px auto', display: 'flex', flexDirection: 'column', alignContent: 'center' };
56
57  var getMainBlock = () => document.getElementsByClassName('main-content-container')[0];
58
59	function loadAds(idForRender) {
60		window["yandexContextAsyncCallbacks"] = window["yandexContextAsyncCallbacks"] || [];
61		window["yandexContextAsyncCallbacks"].push(function() {
62			if ( window.innerWidth < 1000 ) {
63				Ya.Context.AdvManager.render({ blockId: "R-A-257534-2", renderTo: idForRender, async: true });
64			} else if ( window.innerWidth < 1700 ) {
65				Ya.Context.AdvManager.render({ blockId: "R-A-257534-1", renderTo: idForRender, async: true });
66			} else {
67				Ya.Context.AdvManager.render({ blockId: "R-A-257534-3", renderTo: idForRender, async: true });
68			}
69		});
70	};
71
72	function appendStyles(node, stylesObj){
73		var rulesToAppend =	Object.keys(stylesObj);
74		forEach(rulesToAppend, (rule) => {
75			node.style[rule] = stylesObj[rule];
76		});
77		return node;
78	};
79
80	function createAdsBlock(){
81		if (ads_row_id) {
82			var adsNodeToDelete = document.getElementById(ads_row_id);
83      getMainBlock().removeChild(adsNodeToDelete);
84		}
85		var ya_block = document.createElement("div");
86		var ads_block = appendStyles(document.createElement("div"), adsBlockCommonStyles);
87		var ads_row = appendStyles(document.createElement("div"), adsRowCommonStyles);
88
89		ya_block.id = getRandomString(10);
90		ads_row.id = getRandomString(10);
91		ads_row_id = ads_row.id;
92		ya_block_id = ya_block.id;
93
94    if ( main_width() <= 860 ){
95			ads_row = appendStyles(
96				ads_row, { minWidth: '300px', maxWidth: '660px', margin: '0 20px', marginBottom: '50px', fontSize: '60%', wordBreak: 'break-all' }
97			);
98    } else if ( main_width() <= 1400 ){
99			ads_row = appendStyles(ads_row, { minWidth: '800px', maxWidth: '1000px', padding: '20px' });
100		} else if ( main_width() <= 1760 ){
101			ads_row = appendStyles(ads_row, { minWidth: '900px', maxWidth: '1100px', padding: '20px' });
102		} else {
103			ads_row = appendStyles(
104				ads_row, { maxWidth: '240px', height: '75vh', position: 'fixed', left: (((main_width() - 1200)/2) - 254)/2 + 'px', bottom: '50px', justifyContent: 'end' }
105			);
106		}
107
108		ads_block.appendChild(ya_block);
109		ads_row.appendChild(ads_block);
110		getMainBlock().appendChild(ads_row);
111		loadAds(ya_block_id);
112	};
113
114	function createWarnBlock(innerText){
115		var warning = appendStyles(document.createElement("div"), warningBlockStyles);
116		var warning_inner = appendStyles(document.createElement("div"), warningInnerStyles);
117		warning_inner.innerHTML = innerText;
118		warning.appendChild(warning_inner);
119		return warning;
120	};
121
122	function initCopyButtons() {
123		var copyButtons = document.getElementsByClassName('copy-btn');
124		if (copyButtons.length>0){
125			console.log("CopyButtons found. Set their events.");
126			for (var i = 0; i < copyButtons.length; i++) {
127				copyButtons[i].addEventListener('click', function(eve) {
128					var eventTarget = getEventTarget(eve);
129					// Установка атрибута через JS copyBtn.dataset.target = 'ID-ЦЕЛИ'
130					// Установка атрибута через HTML <span data-target="ID-ЦЕЛИ">
131					var copyTarget = document.getElementById(eventTarget.getAttribute('data-target'));
132					// createRange - func from Document Object Model Range, support most browsers beginning with IE9
133					var range = document.createRange(copyTarget);
134					// Select
135					range.selectNode(copyTarget);
136					window.getSelection().addRange(range);
137					try { // Try copy
138						var msg = 'unsuccessful';
139						if (document.queryCommandSupported('copy')) {
140							// document.queryCommandSupported('copy') - эту проверку можно пропустить, т.к. это одна из самых поддерживаемых команд
141							var successful = document.execCommand('copy');
142							var msg = successful ? 'success' : msg;
143						}
144						console.log('Copy target was ' + msg);
145					} catch(err) { console.error('Oops, unable to copy');	}
146					// Deselect
147					window.getSelection().removeAllRanges();
148				});
149			}
150		}
151	}
152
153	document.addEventListener('DOMContentLoaded', function(){
154			if (getCookie('siteTheme') === 'dark' || getLocalItem('theme') === 'dark') {
155  			var themeSelector = document.getElementById('theme-selector');
156  			if (themeSelector) { // Есть страницы на которых нет подвала, например 404-я
157  				themeSelector.getElementsByClassName('custom-radio')[0].classList.toggle('checked');
158  			}
159				setTheme('dark');
160			} else {
161				setTheme('light');
162			}
163
164	    window.onscroll = function(){
165	        var o = window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop;
166	        if ( o === null || o < 450 ) { document.getElementById("arrow-to-top").style.visibility = "hidden"; }
167	        else {	document.getElementById("arrow-to-top").style.visibility="visible"; }
168	    };
169
170	    	});
171
172  // Активируется после полной загрузки страницы, включая все зависимости, такие как изображения и стили
173	window.onload = function(){
174		initCopyButtons();
175
176    var tabsBlocks = document.getElementsByClassName('tabs-container');
177    if (tabsBlocks.length>0){
178        console.log("Tabs conteiners found. Initiate.");
179        for (var i = 0; i < tabsBlocks.length; i++) {
180            var tabLinks = tabsBlocks[i].getElementsByClassName('tab-label');
181            for (var ii = 0; ii < tabLinks.length; ii++) {
182                tabLinks[ii].addEventListener('click', function() {
183                    tabsHandler(this, tabsBlocks[i]);
184                });
185            }
186        }
187    }
188
189		var foldingLists = document.getElementsByClassName('folding-list-control');
190		if (foldingLists.length>0){
191			console.log("Folding lists found. Initiate.");
192			for (var i = 0; i < foldingLists.length; i++) {
193				foldingLists[i].addEventListener('click', function() {
194					interfaceHandlers.foldingListHandler(this, foldingLists[i]);
195				});
196			}
197		}
198
199		var spoilersBlocks = document.getElementsByClassName('spoiler');
200		if (spoilersBlocks.length>0){
201			console.log("Folding lists found. Initiate.");
202			for (var i = 0; i < spoilersBlocks.length; i++) {
203				spoilersBlocks[i].addEventListener('click', function() {
204					interfaceHandlers.spoilersHandler(this, spoilersBlocks[i]);
205				});
206			}
207		}
208
209		var multiselectBlocks = document.querySelectorAll(".multiselect_block");
210		multiselectBlocks.forEach(parent => {
211			 let label = parent.querySelector(".multiselect_box_label");
212			 let select = parent.querySelector(".multiselect_field");
213			 let text = label.innerHTML;
214			 select.addEventListener("change", function(element) {
215					 let selectedOptions = this.selectedOptions;
216					 label.innerHTML = "";
217					 for (let option of selectedOptions) {
218							 let button = document.createElement("button");
219							 button.type = "button";
220							 button.className = "btn_multiselect";
221							 button.textContent = option.value;
222							 button.onclick = () => {
223									 option.selected = false;
224									 button.remove();
225									 if (!select.selectedOptions.length) label.innerHTML = text
226							 };
227							 label.append(button);
228					 }
229			 })
230		})
231
232	  var currentURL = document.location.href;
233		if (currentURL && (typeof(window) !== 'undefined') && currentURL.includes('#')) {
234			currentURL = currentURL.split('#')[0];
235			window.history.replaceState({}, document.title, currentURL);
236		}
237		
238		createAdsBlock();
239
240		window.addEventListener('resize', debounce(createAdsBlock, 800, { 'debounceMaxWait': 1500 }));
241	};
242</script>
242
243</head>
244<body>    <div id="main-menu-background">
245<div id="main-menu-block" class="no-select">
246<div id="menu-items-container">
247    <li class="menu-item icon"><a href="/" id="main-menu-homelink"><div class="main-menu-linkpics">&nbsp; </div></a></li>
248    <li class="menu-item icon"><a href="/progs" id="main-menu-calclink"><div class="main-menu-linkpics">&nbsp; </div></a></li>
249	<li class="menu-item icon">
250	        <a onclick="modalHandler('auth-modal');" id="main-menu-userlink"><div class="main-menu-linkpics">&nbsp; </div></a>
251		</li>
252    <li class="menu-item"><a href="articles">Articles</a></li>
253    <li class="menu-item" onclick="menuHandler(event);"><a>Reference materials</a>
254        <ul class="main-lowmenu">
255  			  			<li><a href="infos/materials">Параметры материалов</a></li>
256  			  			<li><a href="infos/physics">Справочник физических параметров и величин</a></li>
257  			  			<li><a href="infos/protocols">Описания протоколов</a></li>
258  			  			<li><a href="infos/standards">Стандарты</a></li>
259  			  			<li><a href="infos/treatment">Химическая обработка поверхностей</a></li>
260  			  			<li><a href="infos/antennas">Антенны и радиопередающие устройства</a></li>
261  			  			<li><a href="infos/electronics_design">Конструирование радиоэлектроники</a></li>
262  			  			<li><a href="books">Books</a></li>
263        </ul>
264    </li>
265	<li class="menu-item"><a href="schematic">Schematic</a></li>
266	<li class="menu-item" onclick="menuHandler(event);"><a>Radiocomponents</a>
267		<ul class="main-lowmenu">
268						<li><a href="elements/acoustic">Акустические компоненты
269</a></li>
270						<li><a href="elements/capacitor">Конденсаторы</a></li>
271						<li><a href="elements/vacuum_tube">Радиолампы</a></li>
272						<li><a href="elements/chip">Микросхемы</a></li>
273						<li><a href="elements/resonator">Резонаторы</a></li>
274						<li><a href="elements/battery">Аккумуляторы</a></li>
275						<li><a href="elements/mcu">Микроконтроллеры</a></li>
276						<li><a href="elements/transistor">Транзисторы</a></li>
277						<li><a href="elements/diode">Диоды</a></li>
278						<li><a href="elements/rezistor">Резисторы</a></li>
279					</ul>
280	</li>
281</div>
282
283<div id="search-container">
284    <div
285      class="ya-site-form ya-site-form_inited_no"
286      data-bem="{&quot;action&quot;:&quot;https://chipinfo.pro/find&quot;,&quot;arrow&quot;:false,&quot;bg&quot;:&quot;transparent&quot;,&quot;fontsize&quot;:14,&quot;fg&quot;:&quot;#000000&quot;,&quot;language&quot;:&quot;ru&quot;,&quot;logo&quot;:&quot;rb&quot;,&quot;publicname&quot;:&quot;Поиск по ChipInfo.pro&quot;,&quot;suggest&quot;:false,&quot;target&quot;:&quot;_self&quot;,&quot;tld&quot;:&quot;ru&quot;,&quot;type&quot;:3,&quot;usebigdictionary&quot;:false,&quot;searchid&quot;:2018356,&quot;input_fg&quot;:&quot;#000000&quot;,&quot;input_bg&quot;:&quot;#dfdfdf&quot;,&quot;input_placeholder&quot;:&quot;поиск по сайту...&quot;,&quot;input_placeholderColor&quot;:&quot;#999999&quot;,&quot;input_borderColor&quot;:&quot;#666666&quot;}">
287        <form action="https://yandex.ru/search/site/" method="get" target="_self" accept-charset="utf-8">
288          <input type="hidden" name="searchid" value="2018356"/>
289          <input type="hidden" name="l10n" value="ru"/>
290          <input type="hidden" name="reqenc" value="utf-8"/>
291          <input type="search" name="text" value=""/>
292          <input type="submit" value="Найти"/>
293        </form>
294    </div>
295    
295<script type="text/javascript">(function(w,d,c){var s=d.createElement('script'),h=d.getElementsByTagName('script')[0],e=d.documentElement;if((' '+e.className+' ').indexOf(' ya-page_js_yes ')===-1){e.className+=' ya-page_js_yes';}s.type='text/javascript';s.async=true;s.charset='utf-8';s.src=(d.location.protocol==='https:'?'https:':'http:')+'//site.yandex.net/v2.0/js/all.js';h.parentNode.insertBefore(s,h);(w[c]||(w[c]=[])).push(function(){Ya.Site.Form.init()})})(window,document,'yandex_site_callbacks');</script>
295
296</div>
297
298
299<div id="main-menu-mobile-icon" onclick="document.getElementById('menu-items-container').classList.toggle('mobile-show');"><span >&equiv;</span></div>
300</div>
301
302</div>
303
304    <div class="main-content-container">
305<div id="content-center-column">
306	<h2>Список статей по разделам</h2>
307
308		<div class="post">
309	<h3 class="section-caption"><a href="article/diy">DIY</a></h3>
310	<hr size="1px"/>
311				<a href="article/diy/simple_charger">			Краткий гайд по созданию примтивного зарядного устройства (powerbank) своими руками		</a><br/>
312				<a href="article/diy/hakko_t12_soldering_station">			Обзор и сравнение нескольких версий паяльных станций на Hakko T12		</a><br/>
313				<a href="article/diy/stepper_drivers_current">			Установка тока шаговых двигателей на драйверах разного типа		</a><br/>
314			</div>
315		<div class="post">
316	<h3 class="section-caption"><a href="article/medley">Разное</a></h3>
317	<hr size="1px"/>
318				<a href="article/medley/electrolytic_capacitor_removal">			Способ удаления электролитических конденсаторов без пайки		</a><br/>
319				<a href="article/medley/sound_recovery">			Про восстановление старых записей		</a><br/>
320				<a href="article/medley/filler_compound">			Выбор заливочного компаунда для плат работающих в условиях космоса		</a><br/>
321				<a href="article/medley/strength_of_pipe_and_rod">			Сравнение прочности трубы и прутка		</a><br/>
322			</div>
323		<div class="post">
324	<h3 class="section-caption"><a href="article/basics_of_circuitry">Цикл «Основы схемотехники»</a></h3>
325	<hr size="1px"/>
326				<a href="article/basics_of_circuitry/blocking_capacitor">			Назначение и расчёт блокировочного конденсатора		</a><br/>
327				<a href="article/basics_of_circuitry/charge_allocation">			Распределение зарядов по поверхности проводников		</a><br/>
328				<a href="article/basics_of_circuitry/mosfets_as_key">			Особенности использования полевых транзисторов («MOSFET») в качестве электронного ключа		</a><br/>
329				<a href="article/basics_of_circuitry/pwm_filter">			Краткое введение в методологию расчёта простейших фильтров для ШИМ-сигналов		</a><br/>
330				<a href="article/basics_of_circuitry/bipolar_cascades_comparison">			Сравнение свойств каскадов на биполярных транзисторах		</a><br/>
331				<a href="article/basics_of_circuitry/bipolar_transistors_in_switching_mode">			Схемы и принципы использования биполярных транзисторов в ключевом режиме		</a><br/>
332				<a href="article/basics_of_circuitry/current_measurement">			Описание основных принципов и методов измерения тока в схемотехнике		</a><br/>
333			</div>
334		<div class="post">
335	<h3 class="section-caption"><a href="article/popular_science">Научно-популярное</a></h3>
336	<hr size="1px"/>
337				<a href="article/popular_science/about_the_higgs_particle">			Чем так важна частица Хиггса?		</a><br/>
338				<a href="article/popular_science/particle_decay">			Пара слов о распаде и стабильности частиц		</a><br/>
339				<a href="article/popular_science/about_cosmological_constant">			Краткая история космологической постоянной Лямбда		</a><br/>
340				<a href="article/popular_science/hours_and_minutes">			Почему в часе 60 минут?		</a><br/>
341				<a href="article/popular_science/the_unexplained_effectiveness_of_math">			Непостижимая эффективность математики в естественных науках		</a><br/>
342			</div>
343		<div class="post">
344	<h3 class="section-caption"><a href="article/paradoxes">
344Парадоксы</a></h3>
345	<hr size="1px"/>
346				<a href="article/paradoxes/simpsons_paradox">			Парадокс Симпсона		</a><br/>
347			</div>
348	</div>
349</div>
350
351        <div id="auth-modal" class="modal-container">
352  <div class="modal-body">
353    <div class="tabs-container">
354      <div class="tab-header">
355        <div class="tab-label active"><a name="login-tab">Вход</a></div>
356              </div>
357      <div class="tab active login-tab">
358        <div id="loginForm">
359          <div class="common-loginForm-errors error-div"></div>
360          <input type="hidden" name="_token" value="Pe9wF9xfrAEwRBgoHKl2nnhRuzLB4dC42hNEB6Z3">          <div class="controls-row">
361            <label for="username">Имя пользователя <span class="hint">(username)</span></label>
362            <div class="half-column">
363              <input type="text" class="form-control " name="username" value="" required autocomplete="username" autofocus>
364              <div class="username-loginForm-errors error-div"></div>
365            </div>
366          </div>
367          <div class="controls-row">
368            <label for="password">Password</label>
369            <div class="half-column">
370              <input type="password" class="form-control " name="password" required autocomplete="current-password">
371              <div class="password-loginForm-errors error-div"></div>
372            </div>
373          </div>
374          <div class="controls-row">
375            <div class="half-column">
376              <div class="form-check">
377                <input class="form-check-input" type="checkbox" name="remember">
378                <label class="form-check-label" for="remember">Запомнить сессию</label>
379              </div>
380            </div>
381          </div>
382          <div class="controls-row">
383            <button onclick="formValidation('loginForm')" class="btn btn-primary">Войти</button>
384            <a class="btn btn-link" href="https://chipinfo.pro/password/reset">Забыли пароль?</a>
385          </div>
386        </div>
387      </div>
388      
389      
390      <div class="shared-captcha-block" id="shared-captcha-block">
391        <h3>Проверка</h3>
392        <div class="controls-row captcha-row">
393          <div class="half-column">
394            <div class="captcha-block">
395              <img src="" alt="captcha" class="captcha-image" id="shared-captcha-img" data-loading="true">
396              <button type="button" class="captcha-refresh" id="shared-captcha-refresh" title="Обновить">&#8635;</button>
397            </div>
398          </div>
399          <div class="half-column" style="flex-direction: column;">
400            <div class="captcha-status" id="shared-captcha-status"></div>
401            <input type="text" class="form-control captcha-input" id="shared-captcha-input" name="captcha" required autocomplete="off" maxlength="6" placeholder="XXXXXX" style="text-transform: uppercase;">
402            <div class="captcha-errors error-div" id="shared-captcha-errors"></div>
403          </div>
404        </div>
405      </div>
406    </div>
407  </div>
408</div>
409<script>
410(function() {
411  var captchaToken = 'f34a30f53c7f65783f07efc216d2192e';
412  var captchaUrl = 'https://chipinfo.pro/captcha';
413  var refreshCooldown = null;
414
415  function setCaptchaStatus(text, isError) {
416    var status = document.getElementById('shared-captcha-status');
417    if (status) {
418      status.innerText = text || '';
419      status.className = 'captcha-status' + (isError ? ' error' : '');
420    }
421  }
422
423  function setRefreshDisabled(disabled, countdown) {
424    var btn = document.getElementById('shared-captcha-refresh');
425    if (btn) {
426      btn.disabled = disabled;
427      if (countdown && countdown > 0) {
428        btn.innerText = countdown;
429      } else {
430        btn.innerHTML = '&#8635;';
431      }
432    }
433  }
434
435  function startCooldown(seconds) {
436    if (refreshCooldown) {
437      clearInterval(refreshCooldown);
438    }
439
440    var remaining = seconds;
441    setRefreshDisabled(true, remaining);
442    setCaptchaStatus('Обновление через ' + remaining + ' сек.', false);
443
444    refreshCooldown = setInterval(function() {
445      remaining--;
446      if (remaining <= 0) {
447        clearInterval(refreshCooldown);
448        refreshCooldown = null;
449        setRefreshDisabled(false, 0);
450        setCaptchaStatus('', false);
451      } else {
452        setRefreshDisabled(true, remaining);
453        setCaptchaStatus('Обновление через ' + remaining + ' сек.', false);
454      }
455    }, 1000);
456  }
457
458  // force - принудительное обновление (сбрасывает cooldown)
459  window.refreshSharedCaptcha = function(force) {
460    var img = document.getElementById('shared-captcha-img');
461    if (!img) return;
462
463    // При принудительном обновлении сбрасываем cooldown
464    if (force && refreshCooldown) {
465      clearInterval(refreshCooldown);
466      refreshCooldown = null;
467      setRefreshDisabled(false, 0);
468    }
469
470    if (refreshCooldown) return;
471
472    setCaptchaStatus('Загрузка...', false);
473
474    var xhr = new XMLHttpRequest();
475    xhr.open('GET', captchaUrl + '?token=' + encodeURIComponent(captchaToken) + '&_=' + Date.now(), true);
476    xhr.responseType = 'blob';
477    xhr.withCredentials = true;
478
479    xhr.onload = function() {
480      if (xhr.status === 200) {
481        var blob = xhr.response;
482        img.src = URL.createObjectURL(blob);
483        img.removeAttribute('data-loading');
484        setCaptchaStatus('', false);
485        // После успешной загрузки запускаем cooldown
486        startCooldown(15);
487      } else if (xhr.status === 429) {
488        // Rate limit
489        try {
490          var reader = new FileReader();
491          reader.onload = function() {
492            var json = JSON.parse(reader.result);
493            startCooldown(json.wait || 30);
494          };
495          reader.readAsText(xhr.response);
496        } catch (e) {
497          startCooldown(15);
498        }
499      } else if (xhr.status === 403) {
500        setCaptchaStatus('Ошибка токена. Перезагрузите страницу.', true);
501      } else {
502        setCaptchaStatus('Ошибка загрузки', true);
503      }
504    };
505
506    xhr.onerror = function() {
507      setCaptchaStatus('Ошибка сети', true);
508    };
509
510    xhr.send();
511  };
512
513  // Обработчик обновления капчи
514  document.getElementById('shared-captcha-refresh').addEventListener('click', function() {
515    refreshSharedCaptcha(false);
516  });
517
518  // Загружаем капчу сразу
519  setTimeout(function() {
520    refreshSharedCaptcha(false);
521  }, 100);
522})();
523
524var formValidation = function(form_type) {
525  var form_block = document.getElementById(form_type);
526  var inputs_to_validate = form_block.getElementsByTagName('input');
527  var data_to_send = {};
528
529  for (var i = 0; i < inputs_to_validate.length; i++) {
530    if (inputs_to_validate[i].type === 'checkbox') {
531      data_to_send[inputs_to_validate[i].name] = inputs_to_validate[i].checked;
532    } else {
533      var value = inputs_to_validate[i].value;
534      if (inputs_to_validate[i].name === 'captcha') {
535        value = value.toUpperCase();
536      }
537      data_to_send[inputs_to_validate[i].name] = value;
538    }
539  }
540
541  // Добавляем значение капчи из общего поля
542  var sharedCaptchaInput = document.getElementById('shared-captcha-input');
543  if (sharedCaptchaInput) {
544    data_to_send['captcha'] = sharedCaptchaInput.value.toUpperCase();
545  }
546
547  // Обнуляем старые ошибки
548  var errors_divs = form_block.getElementsByClassName('error-div');
549  for (var i = 0; i < errors_divs.length; i++) { errors_divs[i].innerHTML = ''; }
550  // Очищаем ошибки капчи
551  var captchaErrors = document.getElementById('shared-captcha-errors');
552  if (captchaErrors) captchaErrors.innerHTML = '';
553
554  var authUrlMap = {
555    'login': appRoutes.auth.login,
556    'register': appRoutes.auth.register,
557    'password/email': appRoutes.auth.passwordEmail,
558    'password/reset': appRoutes.auth.passwordReset
559  };
560
561  makeRequest({
562    url: authUrlMap[form_type] || (appRoutes.base + form_type),
563    type: 'POST',
564    callback: function (response) {
565      var res = responseHandler(response);
566      if (!res.success) { // ошибки
567        // Очищаем поле капчи
568        var captchaInput = document.getElementById('shared-captcha-input');
569        if (captchaInput) { captchaInput.value = ''; }
570
571        // Принудительно обновляем капчу (код в сессии уже сброшен при валидации)
572        refreshSharedCaptcha(true);
573
574        forEach(Object.keys(res.data), function(key){
575          var new_error = document.createElement('div');
576          new_error.innerText = res.data[key];
577
578          // Ошибки капчи показываем в отдельном блоке
579          if (key === 'captcha') {
580            var captchaErrors = document.getElementById('shared-captcha-errors');
581            if (captchaErrors) {
582              captchaErrors.appendChild(new_error);
583            }
584          } else {
585            var errorContainer = form_block.getElementsByClassName(key+'-'+form_type+'-errors')[0];
586            if (!errorContainer) {
587              errorContainer = form_block.getElementsByClassName('common-'+form_type+'-errors')[0];
588            }
589            if (errorContainer) {
590              errorContainer.appendChild(new_error);
591            }
592          }
593        });
594      } else {
595        if (form_type === 'registerForm') {
596          window.location = 'messages/successRegister';
597        } else {
598          window.location = '/';
599        }
600      }
601    },
602    data: JSON.stringify(data_to_send)
603  });
604}
605</script>
605
606    
607    <div id="footer">
608	<div id="footer-container">
609		<div id="footer-contacts">
610			<a href="mailto:contact&#64;chipinfo&#46;pro"><span class="social-icons mail-icon">@</span>&nbsp; E-mail</a> &nbsp; &nbsp; &nbsp;
611			<a href="https://t.me/electrochatic" alt="Чат ChipInfo.pro в Telergam"><span class="social-icons telegram-icon">&nbsp;</span>&nbsp; Telegram</a>
612		</div>
613		<div class="radio-container"  id="theme-selector" >Theme: <div class="custom-radio" onclick="changeThemeHandler(this, 'changeTheme');">
614    <div class="radio-on-title">Light</div>
615    <div class="radio-state-marker no-select"><div class="radio-punkt">&nbsp;</div></div>
616    <div class="radio-off-title">Dark</div>
617</div>
618</div>
619</div>
620
621<br/><br/>
622
623<!-- Metrika -->
624<script type="text/javascript">
625(function(w,c) {
626	(w[c] = w[c] || []).push(function() {
627		try { w.yaCounter19901995 = new Ya.Metrika({ id:19901995, webvisor:true, clickmap:true, trackLinks:true, accurateTrackBounce:false }); } catch(e) { }
628	}); })(window, "yandex_metrika_callbacks");
629</script>
629
630<noscript><div><img src="//mc.yandex.ru/watch/19901995" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
631<!-- Metrika -->
632</div>
633
634<div id="arrow-to-top" class="no-select" onclick="window.scrollTo({ top:0, behavior:'smooth' });"> &circ; </div>
635</body>
636</html>

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.