summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2018-01-23 18:11:37 +0100
committerDimitri Sokolyuk <demon@dim13.org>2018-01-23 18:11:37 +0100
commit9f46bb27ae80b3ec06a63c86210655f302578496 (patch)
treed7d9deee298a4ed40c5ab8c1d3324c5655d1c89a
parent2717a968130af9199250d257cb12e937b5fe8d15 (diff)
add fixtures
-rw-r--r--href_test.go51
-rw-r--r--testdata/linux.org.ru676
-rw-r--r--testdata/openbsd.org142
-rw-r--r--testdata/opennet.ru606
-rw-r--r--testdata/undeadly.org405
5 files changed, 1871 insertions, 9 deletions
diff --git a/href_test.go b/href_test.go
index fe69810..86a0b8b 100644
--- a/href_test.go
+++ b/href_test.go
@@ -1,21 +1,54 @@
package main
-import "testing"
+import (
+ "io"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "testing"
+)
func TestTitle(t *testing.T) {
testCases := []struct {
- url, title string
+ golden, title, contentType string
}{
- {`https://www.linux.org.ru`, `LINUX.ORG.RU - Русская информация об ОС Linux`},
- {`http://www.opennet.ru`, `Проект OpenNet - всё, что связано с открытым ПО, открытыми технологиями, Linux, BSD и Unix`},
- {`http://www.openbsd.org`, `OpenBSD`},
- {`http://undeadly.org`, `OpenBSD Journal: A resource for the OpenBSD community`},
+ {
+ `testdata/linux.org.ru`,
+ `LINUX.ORG.RU - Русская информация об ОС Linux`,
+ `text/html;charset=utf-8`,
+ },
+ {
+ `testdata/opennet.ru`,
+ `Проект OpenNet - всё, что связано с открытым ПО, открытыми технологиями, Linux, BSD и Unix`,
+ `text/html; charset=koi8-r`,
+ },
+ {
+ `testdata/openbsd.org`,
+ `OpenBSD`,
+ `text/html`,
+ },
+ {
+ `testdata/undeadly.org`,
+ `OpenBSD Journal: A resource for the OpenBSD community`,
+ `text/html`,
+ },
}
for _, tc := range testCases {
- t.Run(tc.url, func(t *testing.T) {
- title, err := getTitle(tc.url)
+ t.Run(tc.golden, func(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ fd, err := os.Open(tc.golden)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ defer fd.Close()
+ w.Header().Set("Content-Type", tc.contentType)
+ io.Copy(w, fd)
+ }))
+ defer ts.Close()
+ title, err := getTitle(ts.URL)
if err != nil {
- t.Error(tc.url, err)
+ t.Error(tc.golden, err)
}
if title != tc.title {
t.Errorf("got %v, want %v", title, tc.title)
diff --git a/testdata/linux.org.ru b/testdata/linux.org.ru
new file mode 100644
index 0000000..7b9c5c8
--- /dev/null
+++ b/testdata/linux.org.ru
@@ -0,0 +1,676 @@
+<!DOCTYPE html>
+<html lang=ru>
+<head>
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:600&amp;subset=latin,cyrillic' rel='stylesheet'
+ type='text/css'>
+ <link rel="stylesheet" type="text/css" href="/tango/combined.css?20180106-2102">
+
+<link rel="yandex-tableau-widget" href="/manifest.json" />
+<meta name="referrer" content="always">
+
+<script type="text/javascript">
+ /*!
+ * $script.js Async loader & dependency manager
+ * https://github.com/ded/script.js
+ * (c) Dustin Diaz, Jacob Thornton 2011
+ * License: MIT
+ */
+(function(e,d,f){typeof f.module!="undefined"&&f.module.exports?f.module.exports=d():typeof f.define!="undefined"&&f.define=="function"&&f.define.amd?define(e,d):f[e]=d()})("$script",function(){function y(f,e){for(var h=0,g=f.length;h<g;++h){if(!e(f[h])){return E}}return 1}function x(d,c){y(d,function(b){return !c(b)})}function w(p,k,h){function c(b){return b.call?b():K[b]}function q(){if(!--d){K[e]=1,f&&f();for(var b in I){y(b.split("|"),c)&&!x(I[b],c)&&(I[b]=[])}}}p=p[D]?p:[p];var g=k&&k.call,f=g?k:h,e=g?p.join(""):k,d=p.length;return setTimeout(function(){x(p,function(b){if(G[b]){return e&&(J[e]=1),G[b]==2&&q()}G[b]=1,e&&(J[e]=1),v(!L.test(b)&&H?H+b+".js":b,q)})},0),w}function v(h,g){var b=N.createElement("script"),a=E;b.onload=b.onerror=b[z]=function(){if(b[B]&&!/^c|loade/.test(b[B])||a){return}b.onload=b[z]=null,a=1,G[h]=2,g()},b.async=1,b.src=h,M.insertBefore(b,M.firstChild)}var N=document,M=N.getElementsByTagName("head")[0],L=/^https?:\/\//,K={},J={},I={},H,G={},F="string",E=!1,D="push",C="DOMContentLoaded",B="readyState",A="addEventListener",z="onreadystatechange";return !N[B]&&N[A]&&(N[A](C,function u(){N.removeEventListener(C,u,E),N[B]="complete"},E),N[B]="loading"),w.get=v,w.order=function(f,e,h){(function g(a){a=f.shift(),f.length?w(a,g):w(a,e,h)})()},w.path=function(b){H=b},w.ready=function(f,d,h){f=f[D]?f:[f];var g=[];return !x(f,function(b){K[b]||g[D](b)})&&y(f,function(b){return K[b]})?d():!function(b){I[b]=I[b]||[],I[b][D](d),h&&h(g)}(f.join("|")),w},w},this);</script>
+
+<!--[if lt IE 9]>
+ <script src="/webjars/html5shiv/3.7.2/html5shiv.min.js" type="text/javascript"></script>
+<![endif]-->
+
+<script type="text/javascript">
+ $script('/webjars/jquery/1.12.3/jquery.min.js', 'jquery');
+
+ $script.ready('jquery', function() {
+ $script('/js/plugins.js?20180106-2102', 'plugins');
+ $script('/js/lor.js?20180106-2102', 'lorjs');
+ });
+
+ $script('/js/highlight.pack.js', 'hljs', function() { hljs.initHighlightingOnLoad(); });
+</script>
+<title>LINUX.ORG.RU - Русская информация об ОС Linux</title>
+<meta name="Keywords" content="linux линукс операционная система документация gnu бесплатное свободное програмное обеспечение софт unix юникс software free documentation operating system новости news">
+<meta name="Description" content="Все о Linux на русском языке">
+<link rel="alternate" title="L.O.R RSS" href="section-rss.jsp?section=1" type="application/rss+xml">
+<link rel="search" title="Search L.O.R." href="/search.jsp">
+
+<base href="https://www.linux.org.ru/">
+
+<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+<meta name="viewport" content="initial-scale=1.0">
+</head>
+<body>
+<div id="hd">
+ <a id="sitetitle" href="/">LINUX.ORG.RU</a>
+
+ <div class="menu">
+ <div id="loginGreating">
+ <div id="regmenu" class="head">
+ <a href="https://www.linux.org.ru/register.jsp">Регистрация</a> -
+ <a id="loginbutton" href="https://www.linux.org.ru/login.jsp">Вход</a>
+ </div>
+
+ <form method=POST action="https://www.linux.org.ru//ajax_login_process" style="display: none" id="regform">
+ <input type="hidden" name="csrf" value="E3bWwLZQrQpResx7cOny5w==">
+<label>Имя: <input type=text name=nick size=15 placeholder="nick или email" autocapitalize="off"></label>
+ <label>Пароль: <input type=password name=passwd size=15></label>
+ <input type=submit value="Вход">
+ <input id="hide_loginbutton" type="button" value="Отмена">
+ </form>
+ </div>
+
+ <ul>
+ <li><a href="/news/">Новости</a></li>
+ <li><a href="/gallery/">Галерея</a></li>
+
+ <li><a href="/forum/">Форум</a></li>
+ <li><a href="/tracker/">Трекер</a></li>
+ <li><a href="/search.jsp">Поиск</a></li>
+ </ul>
+ </div>
+</div>
+<div style="clear: both"></div>
+<div id="bd">
+<div id="mainpage">
+<div id="news">
+
+<div align="center" width="100%">
+ <style>
+ .lor-main-adaptive-tango { width: 320px; height: 100px; }
+ @media(min-width: 500px) { .lor-main-adaptive-tango { width: 468px; height: 60px; } }
+ @media(min-width: 768px) { .lor-main-adaptive-tango { width: 728px; height: 90px; } }
+ </style>
+ <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+ <!-- lor-main-adaptive-tango -->
+ <ins class="adsbygoogle lor-main-adaptive-tango"
+ style="display:inline-block"
+ data-ad-client="ca-pub-6069094673001350"
+ data-ad-slot="7413794834"></ins>
+ <script>
+ (adsbygoogle = window.adsbygoogle || []).push({});
+ </script>
+</div>
+<article class=news id="topic-13978254">
+<h2>
+ <a href="/news/internet/13978254">DuckDuckGo ужесточяет защиту приватности пользователей</a>
+</h2>
+<div class="entry-userpic">
+ <a href="/news/internet/">
+ <img src="/tango/img/applications-internet.png" width=64 height=64 alt="Группа Интернет"></a>
+</div>
+<div class="entry-body">
+<div class=msg>
+ <p>Компания DuckDuckGo заявила об ужесточении контроля за соблюдением приватности для своих пользователей. Для повышения приватности теперь предлагается защита пользовательских данных не только во время поиска в интернете, но и защита при просмотре и навигации в сети Интернет.</p><p>Для этого были выпущены обновлённые дополнения для браузеров и мобильные приложения (DuckDuckGo Mobile v4.0+).</p><p><br>&gt;&gt;&gt; <a href="https://addons.mozilla.org/firefox/addon/duckduckgo-for-firefox/">Дополнение для браузера Firefox</a><br>&gt;&gt;&gt; <a href="https://github.com/duckduckgo/Android">Мобильное приложение для Android</a></p><p>&gt;&gt;&gt; <a href="http://spreadprivacy.com/privacy-simplified/">Подробности</a></div>
+<p class="tags"><i class="icon-tag"></i>&nbsp;<a class=tag rel=tag href="/tag/duckduckgo">duckduckgo</a>, <a class=tag rel=tag href="/tag/privacy">privacy</a>, <a class=tag rel=tag href="/tag/%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82">интернет</a></p><div class=sign>
+ <a itemprop="creator" href="/people/atsym/profile">atsym</a>
+
+(<time datetime="2018-01-23T19:51:07.683+03:00" itemprop="datePublished">23.01.2018 19:51:07</time>)
+
+</div>
+<div class="nav">
+<a href="/news/internet/13978254#comments">4&nbsp;комментария</a></div>
+ </div>
+</article>
+<article class=news id="topic-13977688">
+<h2>
+ <a href="/news/conference/13977688">Видео и презентации по итогам Linux Piter #3 доступны для просмотра </a>
+</h2>
+<div class="entry-userpic">
+ <a href="/news/conference/">
+ <img src="/tango/img/x-office-presentation.png" width=64 height=64 alt="Группа Конференции и встречи"></a>
+</div>
+<div class="entry-body">
+<div class=msg>
+ <p>По традиции, спустя какое-то время, мы выложили все видео по итогам LinuxPiter #3 в открытый доступ.</p><p>Каждая видео-запись имеет <b>русскую</b> и <b>английскую</b> версию. Напомню, что на конференции первый поток был на английском с синхронным переводом на русский, а второй наоборот и мы записали все звуковые дорожки. Желающие могут высказаться о качестве синхронного перевода в комметариях.</p><p>Итак:
+</p><ul><li><b><a href="https://www.youtube.com/channel/UCIv5C9-OxbfeDrdPa3c_tkQ?view_as=subscriber">Youtube-канал конференции Linux Piter</a></b>
+</li><li> Для удобства все видео и презентации собраны на
+<b><a href="https://it-events.com/ru/events/9745/materials"> сайте конференции</a></b>
+</li></ul><p>В ближайшее время на <a href="https://www.youtube.com/channel/UCIv5C9-OxbfeDrdPa3c_tkQ?view_as=subscriber">youtube-канале конференции Linux Piter</a> мы опубликуем видео-интервью со спикерами в рамках проекта #DevTalkRu.</p><p>Приятного и полезного просмотра. </p><p>&gt;&gt;&gt; <a href="https://it-events.com/en/events/9745/materials">Материалы</a></div>
+<p class="tags"><i class="icon-tag"></i>&nbsp;<a class=tag rel=tag href="/tag/linux">linux</a>, <a class=tag rel=tag href="/tag/linuxpiter">linuxpiter</a>, <a class=tag rel=tag href="/tag/linux%20piter">linux piter</a>, <a class=tag rel=tag href="/tag/%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D1%8F">конференция</a></p><div class=sign>
+ <a itemprop="creator" href="/people/denrit/profile">denrit</a>
+
+(<time datetime="2018-01-23T14:58:41.091+03:00" itemprop="datePublished">23.01.2018 14:58:41</time>)
+
+</div>
+<div class="nav">
+<a href="/news/conference/13977688#comments">9&nbsp;комментариев</a></div>
+ </div>
+</article>
+<article class="infoblock mini-news" id="topic-13967357">
+Мини-новость:
+ <a href="/news/debian/13967357">Google отказывается от Ubuntu в пользу Debian в качестве рабочего окружения для своих инженеров</a>
+
+
+ (533&nbsp;комментария)
+ </article>
+<article class=news id="topic-13968078">
+<h2>
+ <a href="/news/opensource/13968078">Релиз Wine 3.0</a>
+</h2>
+<div class="entry-userpic">
+ <a href="/news/opensource/">
+ <img src="/tango/img/opensource-logo.png" width=65 height=65 alt="Группа Open Source"></a>
+</div>
+<div class="entry-body">
+<div class=msg>
+ <p>Команда Wine выпустила очередную стабильную мажорную версию Wine.<br>Подготовка релиза заняла год и включает в себя 6000 изменений. <a href="https://www.winehq.org/announce/3.0">Полный список улучшений</a>, ключевые:</p><ul><li> Поддержка Direct3D 10 и 11<br> </li><li> Поток команд Direct3D<br> </li><li> Графический драйвер Android<br> </li><li> Улучшенная поддержка DirectWrite и Direct2D.<br> </li></ul><p>&gt;&gt;&gt; <a href="https://www.winehq.org/news/2018011801">Подробности</a></div>
+<p class="tags"><i class="icon-tag"></i>&nbsp;<a class=tag rel=tag href="/tag/wine">wine</a>, <a class=tag rel=tag href="/tag/winehq">winehq</a></p><div class=sign>
+ <a itemprop="creator" href="/people/michey/profile">michey</a>
+
+(<time datetime="2018-01-18T20:56:48.438+03:00" itemprop="datePublished">18.01.2018 20:56:48</time>)
+
+</div>
+<div class="nav">
+<a href="/news/opensource/13968078#comments">263&nbsp;комментария</a>&nbsp;(стр. <a href="/news/opensource/13968078/page1#comments">2</a> <a href="/news/opensource/13968078/page2#comments">3</a> <a href="/news/opensource/13968078/page3#comments">4</a> <a href="/news/opensource/13968078/page4#comments">5</a> <a href="/news/opensource/13968078/page5#comments">6</a>)</div>
+ </div>
+</article>
+<article class=news id="topic-13960217">
+<h2>
+ <a href="/news/hardware/13960217">На базе ВМК МГУ начала работу &#171;Лаборатория электроники &#8222;Байкал&#8220;&#187; (ЛэБ)</a>
+</h2>
+<div class="entry-userpic">
+ <a href="/news/hardware/">
+ <img src="/tango/img/hardware-logo.png" width=65 height=75 alt="Группа Hardware and Drivers"></a>
+</div>
+<div class="entry-body">
+<div class=msg>
+ <p>В сотрудничестве с компанией &#171;Байкал Электроникс&#187; на базе центра обработки данных факультета ВМК МГУ имени М.В. Ломоносова начала работу &#171;Лаборатория электроники &#8222;Байкал&#8220;&#187; (ЛэБ). В лаборатории можно оценить производительность построенной на базе архитектуры MIPS Warrior P-class P5600 SoC Baikal-T1 и отлаживать программы для нее. </p><p>Доступ в ЛэБ организован через baik.al и baikal.cs.msu.ru. В первую очередь доступ предоставляется студентам, преподавателям и сотрудникам МГУ, возможна регистрация научных сотрудников и разработчиков ПО из других организаций.</p><p>Кроме того, в первом квартале 2018 года начнётся розничная продажа плат БФК 3.1 на основе процессора Baikal. По данным <a href="http://www.cnews.ru/news/top/2018-01-11_tsena_na_protsessory_bajkal_snizhaetsya_v_chetyre">C-News</a>, розничная стоимость платы будет около 50 000 руб. Ранее такие платы продавались только юридическим лицам и стоили около 200 000 руб.</p><p>&gt;&gt;&gt; <a href="https://www.baikalelectronics.ru/about/press-center/news/CSMSU_lab/">Подробности</a></div>
+<p class="tags"><i class="icon-tag"></i>&nbsp;<a class=tag rel=tag href="/tag/baikal">baikal</a>, <a class=tag rel=tag href="/tag/mips">mips</a></p><div class=sign>
+ <a itemprop="creator" href="/people/cdslow/profile">cdslow</a>
+
+(<time datetime="2018-01-16T15:21:35.184+03:00" itemprop="datePublished">16.01.2018 15:21:35</time>)
+
+</div>
+<div class="nav">
+<a href="/news/hardware/13960217#comments">699&nbsp;комментариев</a>&nbsp;(стр. <a href="/news/hardware/13960217/page1#comments">2</a> <a href="/news/hardware/13960217/page2#comments">3</a> <a href="/news/hardware/13960217/page3#comments">4</a> ... <a href="/news/hardware/13960217/page11#comments">12</a> <a href="/news/hardware/13960217/page12#comments">13</a> <a href="/news/hardware/13960217/page13#comments">14</a>)</div>
+ </div>
+</article>
+<article class="infoblock mini-news" id="topic-13956183">
+Мини-новость:
+ <a href="/news/security/13956183">AMD чипы уязвимы к обоим вариантам Spectre</a>
+
+
+ (238&nbsp;комментариев)
+ </article>
+<article class=news id="topic-13953242">
+<h2>
+ <a href="/news/multimedia/13953242">MusE 3.0</a>
+</h2>
+<div class="entry-userpic">
+ <a href="/news/multimedia/">
+ <img src="/tango/img/multimedia.png" width=65 height=75 alt="Группа Мультимедиа"></a>
+</div>
+<div class="entry-body">
+<div class=msg>
+ <p>Выпущена новая версия MIDI-секвенсера <a href="http://muse-sequencer.org">MusE</a>.<br><br>Главные изменения:</p><ul><li> завершён порт на Qt5;</li><li> переписан микшер;</li><li> переработан диалог маршрутизации сигнала;</li><li> улучшена поддержка LV2, добавлена поддержка Native VST FX и Native VST shell;</li><li> внесены различные улучшения в плагины в собственном формате MESS;</li><li>добавлена поддержка RtAudio (главным образом, ради поддержки PulseAudio);</li><li> улучшена управляемость горячими клавишами;</li><li> улучшено редактирование автоматизации.</li></ul><p>&gt;&gt;&gt; <a href="http://muse-sequencer.org/index.php/News">Подробности</a></div>
+<p class="tags"><i class="icon-tag"></i>&nbsp;<a class=tag rel=tag href="/tag/daw">daw</a>, <a class=tag rel=tag href="/tag/midi">midi</a>, <a class=tag rel=tag href="/tag/muse">muse</a>, <a class=tag rel=tag href="/tag/%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B0">музыка</a></p><div class=sign>
+ <a itemprop="creator" href="/people/AP/profile">AP</a>
+
+(<time datetime="2018-01-12T00:57:08.162+03:00" itemprop="datePublished">12.01.2018 0:57:08</time>)
+
+</div>
+<div class="nav">
+<a href="/news/multimedia/13953242#comments">286&nbsp;комментариев</a>&nbsp;(стр. <a href="/news/multimedia/13953242/page1#comments">2</a> <a href="/news/multimedia/13953242/page2#comments">3</a> <a href="/news/multimedia/13953242/page3#comments">4</a> <a href="/news/multimedia/13953242/page4#comments">5</a> <a href="/news/multimedia/13953242/page5#comments">6</a>)</div>
+ </div>
+</article>
+<section>
+ <h2>Еще новости</h2>
+
+ <div class="container" id="main-page-news">
+ <section>
+ <h3>Январь 2018</h3>
+ <ul>
+ <li>
+ <a href="/news/opensource/13952637"><l:title>Слияние LEDE с OpenWRT</l:title></a>
+ (46&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/ubuntu/13952945"><l:title>Версия ядра с патчами Meltdown и Spectre ломает загрузку Ubuntu</l:title></a>
+ (122&nbsp;комментария)</li>
+ <li>
+ <a href="/news/russia/13948816"><l:title>Министерство обороны РФ начало переводить служебные компьютеры на Astra Linux SE</l:title></a>
+ (1069&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/opensource/13943863"><l:title>Western Digital планирует выпустить миллиард чипов на RISC-V</l:title></a>
+ (244&nbsp;комментария)</li>
+ <li>
+ <a href="/news/opensource/13943140"><l:title>Состоялся релиз Miller 5.3.0</l:title></a>
+ (55&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/internet/13939992"><l:title>Вышла новая версия BIRD Internet Routing Daemon</l:title></a>
+ (49&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/security/13940877"><l:title>Уязвимость в прошивке процессоров AMD</l:title></a>
+ (308&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/development/13938173"><l:title>Вышел Rust 1.23</l:title></a>
+ (383&nbsp;комментария)</li>
+ <li>
+ <a href="/news/security/13934697"><l:title>Meltdown и Spectre&nbsp;&mdash; названия двух атак на процессоры Intel/AMD/ARM64/Power</l:title></a>
+ (1408&nbsp;комментариев)</li>
+ </ul>
+ </section>
+ <section>
+ <h3>Январь 2018</h3>
+ <ul>
+ <li>
+ <a href="/news/linux-general/13933490"><l:title>Linux Journal 2.0: спасение легендарного издания о Linux</l:title></a>
+ (62&nbsp;комментария)</li>
+ <li>
+ <a href="/news/hardware/13932721"><l:title>flashrom 1.0&nbsp;&mdash; утилита для прошивки из работающей ОС</l:title></a>
+ (33&nbsp;комментария)</li>
+ <li>
+ <a href="/news/gnu/13931329"><l:title>Вышел GNU nano 2.9.2</l:title></a>
+ (252&nbsp;комментария)</li>
+ <li>
+ <a href="/news/opensource/13931073"><l:title>Вышел dhcpcd 7.0.0</l:title></a>
+ (17&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/development/13930377"><l:title>Code::Blocks 17.12</l:title></a>
+ (44&nbsp;комментария)</li>
+ <li>
+ <a href="/news/openoffice/13927353"><l:title>OpenOffice 4.1.5</l:title></a>
+ (20&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/gnu/13930203"><l:title>GNU dbm 1.14</l:title></a>
+ (16&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/hardware/13931789"><l:title>Разработчики Linux и Windows работают над закрытием аппаратной уязвимости процессоров Intel</l:title></a>
+ (1008&nbsp;комментариев)</li>
+ <li>
+ <a href="/news/games/13927812"><l:title>Для свободной загрузки доступны исходники сервера World in Conflict</l:title></a>
+ (32&nbsp;комментария)</li>
+ </ul>
+ </section>
+ </div>
+</section>
+<nav>
+ <a href="add-section.jsp?section=1" class="btn btn-primary">Добавить новость</a>
+ <a href="/news/" class="btn btn-default">Все новости</a>
+ <a class="btn btn-default" href="/view-all.jsp?section=1">Неподтвержденные новости</a>
+</nav>
+
+ <p>
+ <i class="icon-rss"></i>
+ <a href="section-rss.jsp?section=1">
+ RSS-подписка на новости
+ </a>
+ </p>
+</div>
+
+<aside id=boxlets>
+
+ <div align="center" style="margin-bottom: 0.5em">
+ <a href="http://qrator.net/" rel="nofollow" target="_blank">
+ <img src="/adv/qrator-box.png" width="250" style="max-width: 100%; height: auto" alt="Protected by Qrator">
+ </a>
+ </div>
+
+ <div class="boxlet">
+ <h2><a href="/polls/">Опрос</a></h2>
+
+ <div class="boxlet_content">
+ <p>
+ Уязвима ли ваша система к Spectre или Meltdown?</p>
+
+
+
+
+
+
+
+
+
+
+ <form action="/vote.jsp" method="POST" style="margin-bottom: 1em">
+ <input type="hidden" name="csrf" value="E3bWwLZQrQpResx7cOny5w==">
+
+ <input type="hidden" name="voteid" value="2843">
+
+
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22067">
+
+
+
+ Уязвима к Spectre Variant 1
+ </label>
+ </div>
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22068">
+
+
+
+ Не уязвима к Spectre Variant 1
+ </label>
+ </div>
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22069">
+
+
+
+ Уязвима к Spectre Variant 2
+ </label>
+ </div>
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22070">
+
+
+
+ Не уязвима к Spectre Variant 2
+ </label>
+ </div>
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22071">
+
+
+
+ Уязвима к Meltdown
+ </label>
+ </div>
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22072">
+
+
+
+ Не уязвима к Meltdown
+ </label>
+ </div>
+
+
+ <div class="checkbox">
+ <label>
+
+
+ <input type="checkbox"
+ name="vote" value="22073">
+
+
+
+ Не могу запустить скрипт, у меня лапки
+ </label>
+ </div>
+
+
+
+ <button type="submit" class="btn btn-small btn-default">Голосовать</button>
+</form>
+
+<a href="/view-vote.jsp?vote=2843">результаты</a> (408/215 голосов)
+ <br>
+ <a href="/polls/">итоги прошедших опросов...</a>
+ <br>
+ [<a href="/add.jsp?group=19387">добавить опрос</a>]
+ </div></div>
+ <div class="boxlet">
+ <h2>Top 10</h2>
+
+<div class="boxlet_content">
+ Наиболее обсуждаемые темы этого месяца:
+ <ul>
+ <li>
+ <a href="/news/security/13934697">Meltdown и Spectre&nbsp;&mdash; названия двух атак на процессоры Intel/AMD/ARM64/Power</a>
+
+ (стр.&nbsp;<a href="/news/security/13934697/page28?lastmod=1516621799798">29</a>)
+
+ (1408)
+ </li>
+ <li>
+ <a href="/news/russia/13948816">Министерство обороны РФ начало переводить служебные компьютеры на Astra Linux SE</a>
+
+ (стр.&nbsp;<a href="/news/russia/13948816/page21?lastmod=1516702355495">22</a>)
+
+ (1069)
+ </li>
+ <li>
+ <a href="/news/hardware/13931789">Разработчики Linux и Windows работают над закрытием аппаратной уязвимости процессоров Intel</a>
+
+ (стр.&nbsp;<a href="/news/hardware/13931789/page20?lastmod=1516702397453">21</a>)
+
+ (1008)
+ </li>
+ <li>
+ <a href="/news/russia/13923905">Выпуск дистрибутивов Альт Сервер, Альт Рабочая станция и Альт Образование версии 8.2</a>
+
+ (стр.&nbsp;<a href="/news/russia/13923905/page19?lastmod=1516161784070">20</a>)
+
+ (1000)
+ </li>
+ <li>
+ <a href="/news/hardware/13960217">На базе ВМК МГУ начала работу «Лаборатория электроники „Байкал“» (ЛэБ)</a>
+
+ (стр.&nbsp;<a href="/news/hardware/13960217/page13?lastmod=1516723607619">14</a>)
+
+ (699)
+ </li>
+ <li>
+ <a href="/forum/development/13963733">Яр 0.4.0 разочаровывающий</a>
+
+ (стр.&nbsp;<a href="/forum/development/13963733/page10?lastmod=1516560093981">11</a>)
+
+ (539)
+ </li>
+ <li>
+ <a href="/news/debian/13967357">Google отказывается от Ubuntu в пользу Debian в качестве рабочего окружения для своих инженеров</a>
+
+ (стр.&nbsp;<a href="/news/debian/13967357/page10?lastmod=1516726625862">11</a>)
+
+ (533)
+ </li>
+ <li>
+ <a href="/news/hardware/13910159">NVIDIA объявила о прекращении поддержки драйверов для 32-х битных ОС</a>
+
+ (стр.&nbsp;<a href="/news/hardware/13910159/page9?lastmod=1514949155693">10</a>)
+
+ (478)
+ </li>
+ <li>
+ <a href="/news/development/13938173">Вышел Rust 1.23</a>
+
+ (стр.&nbsp;<a href="/news/development/13938173/page7?lastmod=1516611100334">8</a>)
+
+ (383)
+ </li>
+ <li>
+ <a href="/news/multimedia/13912349">Вышла Darktable 2.4.0</a>
+
+ (стр.&nbsp;<a href="/news/multimedia/13912349/page7?lastmod=1515341671032">8</a>)
+
+ (380)
+ </li>
+ </ul>
+</div></div>
+ <div class="boxlet">
+ <h2><a href="/gallery/">Галерея</a></h2>
+
+ <div class="boxlet_content boxlet-gallery">
+ <div style="margin-bottom: 1em">
+ <div align="center">
+ <a href="/gallery/workplaces/13973869">
+ <img sizes="(min-width: 60em) 24vw, 100vw"
+ srcset="images/17876/500px.jpg 500w, images/17876/1000px.jpg 1000w"
+ src="images/17876/500px.jpg"
+ alt="Скриншот: Когда устанавливал FreeBSD, устал, но пришёл надёжный друг и всё доделал.">
+ </a>
+ </div>
+ <a href="/gallery/workplaces/13973869">Когда устанавливал FreeBSD, устал, но пришёл надёжный друг и всё доделал.</a> от burato (196)
+ </div>
+ <div style="margin-bottom: 1em">
+ <div align="center">
+ <a href="/gallery/screenshots/13970919">
+ <img sizes="(min-width: 60em) 24vw, 100vw"
+ srcset="images/17875/500px.jpg 500w, images/17875/1000px.jpg 1000w"
+ src="images/17875/500px.jpg"
+ alt="Скриншот: Занимательная археология 2">
+ </a>
+ </div>
+ <a href="/gallery/screenshots/13970919">Занимательная археология 2</a> от Vsevolod-linuxoid (36)
+ </div>
+ <div style="margin-bottom: 1em">
+ <div align="center">
+ <a href="/gallery/screenshots/13964187">
+ <img sizes="(min-width: 60em) 24vw, 100vw"
+ srcset="images/17873/500px.jpg 500w, images/17873/1000px.jpg 1000w"
+ src="images/17873/500px.jpg"
+ alt="Скриншот: Оранжевое настроение">
+ </a>
+ </div>
+ <a href="/gallery/screenshots/13964187">Оранжевое настроение</a> от meliafaro (26)
+ </div>
+ <a href="/gallery/">другие скриншоты...</a>
+ </div></div>
+ <div class="boxlet">
+ <h2>Облако Меток</h2>
+
+ <div class="boxlet_content">
+ <p align="center">
+ <a class="cloud0" href="/tag/3d">3d</a>
+ <a class="cloud3" href="/tag/amd">amd</a>
+ <a class="cloud7" href="/tag/android">android</a>
+ <a class="cloud0" href="/tag/apache">apache</a>
+ <a class="cloud8" href="/tag/arch">arch</a>
+ <a class="cloud0" href="/tag/arm">arm</a>
+ <a class="cloud0" href="/tag/awesome">awesome</a>
+ <a class="cloud5" href="/tag/bash">bash</a>
+ <a class="cloud1" href="/tag/bug">bug</a>
+ <a class="cloud4" href="/tag/c">c</a>
+ <a class="cloud6" href="/tag/c++">c++</a>
+ <a class="cloud4" href="/tag/centos">centos</a>
+ <a class="cloud0" href="/tag/chrome">chrome</a>
+ <a class="cloud10" href="/tag/debian">debian</a>
+ <a class="cloud0" href="/tag/debian%20jessie">debian jessie</a>
+ <a class="cloud1" href="/tag/emacs">emacs</a>
+ <a class="cloud5" href="/tag/fedora">fedora</a>
+ <a class="cloud5" href="/tag/firefox">firefox</a>
+ <a class="cloud1" href="/tag/freebsd">freebsd</a>
+ <a class="cloud8" href="/tag/gentoo">gentoo</a>
+ <a class="cloud0" href="/tag/git">git</a>
+ <a class="cloud4" href="/tag/gnome">gnome</a>
+ <a class="cloud2" href="/tag/google">google</a>
+ <a class="cloud0" href="/tag/gtk">gtk</a>
+ <a class="cloud1" href="/tag/hdd">hdd</a>
+ <a class="cloud2" href="/tag/intel">intel</a>
+ <a class="cloud3" href="/tag/iptables">iptables</a>
+ <a class="cloud5" href="/tag/java">java</a>
+ <a class="cloud2" href="/tag/javascript">javascript</a>
+ <a class="cloud7" href="/tag/kde">kde</a>
+ <a class="cloud1" href="/tag/kernel">kernel</a>
+ <a class="cloud0" href="/tag/kvm">kvm</a>
+ <a class="cloud10" href="/tag/linux">linux</a>
+ <a class="cloud3" href="/tag/lor">lor</a>
+ <a class="cloud1" href="/tag/mint">mint</a>
+ <a class="cloud2" href="/tag/mysql">mysql</a>
+ <a class="cloud1" href="/tag/network">network</a>
+ <a class="cloud2" href="/tag/nginx">nginx</a>
+ <a class="cloud4" href="/tag/nvidia">nvidia</a>
+ <a class="cloud0" href="/tag/openbox">openbox</a>
+ <a class="cloud3" href="/tag/opensource">opensource</a>
+ <a class="cloud3" href="/tag/opensuse">opensuse</a>
+ <a class="cloud1" href="/tag/openvpn">openvpn</a>
+ <a class="cloud0" href="/tag/perl">perl</a>
+ <a class="cloud4" href="/tag/php">php</a>
+ <a class="cloud0" href="/tag/pulseaudio">pulseaudio</a>
+ <a class="cloud6" href="/tag/python">python</a>
+ <a class="cloud5" href="/tag/qt">qt</a>
+ <a class="cloud1" href="/tag/ssh">ssh</a>
+ <a class="cloud3" href="/tag/steam">steam</a>
+ <a class="cloud3" href="/tag/systemd">systemd</a>
+ <a class="cloud10" href="/tag/ubuntu">ubuntu</a>
+ <a class="cloud0" href="/tag/usb">usb</a>
+ <a class="cloud1" href="/tag/vim">vim</a>
+ <a class="cloud1" href="/tag/virtualbox">virtualbox</a>
+ <a class="cloud1" href="/tag/vpn">vpn</a>
+ <a class="cloud2" href="/tag/web">web</a>
+ <a class="cloud3" href="/tag/wifi">wifi</a>
+ <a class="cloud2" href="/tag/windows">windows</a>
+ <a class="cloud3" href="/tag/wine">wine</a>
+ <a class="cloud4" href="/tag/xfce">xfce</a>
+ <a class="cloud2" href="/tag/xorg">xorg</a>
+ <a class="cloud3" href="/tag/%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C">безопасность</a>
+ <a class="cloud0" href="/tag/%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F">виртуализация</a>
+ <a class="cloud0" href="/tag/%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0">графика</a>
+ <a class="cloud1" href="/tag/%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D1%8B">драйверы</a>
+ <a class="cloud4" href="/tag/%D0%B6%D0%B6">жж</a>
+ <a class="cloud2" href="/tag/%D0%B7%D0%B2%D1%83%D0%BA">звук</a>
+ <a class="cloud5" href="/tag/%D0%B8%D0%B3%D1%80%D1%8B">игры</a>
+ <a class="cloud3" href="/tag/%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F%20%D1%83%D1%81%D0%BF%D0%B5%D1%85%D0%B0">история успеха</a>
+ <a class="cloud0" href="/tag/%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">образование</a>
+ <a class="cloud4" href="/tag/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">программирование</a>
+ <a class="cloud1" href="/tag/%D0%BF%D1%8F%D1%82%D0%BD%D0%B8%D1%86%D0%B0">пятница</a>
+ <a class="cloud6" href="/tag/%D1%81%D0%BF%D0%B2">спв</a>
+ <a class="cloud3" href="/tag/%D1%8F%D0%B4%D1%80%D0%BE">ядро</a>
+ </p>
+ <p>
+ <a href="/tags/">все метки...</a>
+ </p>
+ </div></div>
+ </aside>
+</div>
+
+</div>
+<div id="ft">
+ <p id="ft-info">
+ <a href="/about">О Сервере</a> -
+ <a href="/help/rules.md">Правила форума</a><br>
+
+ Разработка и&nbsp;поддержка&nbsp;&#8212; <a href="/people/maxcom/profile">Максим Валянский</a> 1998&ndash;2018<br>
+ Сервер для сайта предоставлен &laquo;<a href="http://www.ittelo.ru/" target="_blank">ITTelo</a>&raquo;
+ </p>
+
+<script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-2184304-1']);
+ _gaq.push(['_setCustomVar', 1, 'Authorized', 'false']);
+ _gaq.push(['_setCustomVar', 2, 'Style', 'tango']);
+ _gaq.push(['_setSiteSpeedSampleRate', 10]);
+ _gaq.push(['_gat._forceSSL']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = 'https://ssl.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+</script>
+
+</div>
+</body>
+</html>
diff --git a/testdata/openbsd.org b/testdata/openbsd.org
new file mode 100644
index 0000000..a18d934
--- /dev/null
+++ b/testdata/openbsd.org
@@ -0,0 +1,142 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <title>OpenBSD</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="description" content="the main OpenBSD page">
+ <meta name="copyright" content="This document copyright 1999-2017
+ by OpenBSD.">
+ <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
+ <link rel="canonical" href="https://www.openbsd.org/">
+ <style type="text/css">
+ body {
+ color: black;
+ background-color: white;
+ margin: 0 50px 0 0;
+ }
+ .main {
+ width: 100%;
+ height: 100%;
+ border: 0;
+ border-collapse: collapse;
+ }
+ .main td {
+ padding: 4px;
+ }
+ .sidebar {
+ background-color: #6bbdd6;
+ width: 175px;
+ border-right: 11px solid #007b9c;
+ }
+ .header {
+ text-align: center;
+ }
+ .header img {
+ margin-bottom: 19px;
+ }
+ .callout {
+ font-weight: bold;
+ color: #e00000;
+ }
+ .align-top {
+ vertical-align: top;
+ }
+ .align-bottom {
+ vertical-align: bottom;
+ }
+ </style>
+</head>
+<body>
+<table class="main">
+ <tr>
+ <td class="sidebar align-top">
+ <big><b>About OpenBSD</b></big><br>
+ &nbsp;<a href="goals.html">Project&nbsp;Goals</a><br>
+ &nbsp;<a href="plat.html">Hardware Platforms</a><br>
+ &nbsp;<a href="security.html">Security</a>
+ &nbsp;<a href="crypto.html">Crypto</a><br>
+ &nbsp;<a href="events.html">Events and Papers</a>
+ &nbsp;<a href="innovations.html">Innovations</a><br>
+ <p>
+ <big><b>Getting&nbsp;OpenBSD</b></big><br>
+ &nbsp;<a href="faq/faq4.html#Download">Download</a><br>
+ <p>
+ <big><b>Getting&nbsp;Source</b></big><br>
+ &nbsp;<a href="anoncvs.html">AnonCVS</a>
+ &nbsp;<a href="cvsync.html">CVSync</a><br>
+ &nbsp;<a href="https://cvsweb.openbsd.org/">CVS on Web</a><br>
+ &nbsp;<a href="https://github.com/openbsd">GitHub Mirror</a><br>
+ <p>
+ <big><b>OpenBSD&nbsp;Resources</b></big><br>
+ &nbsp;<a href="faq/index.html">FAQ</a><br>
+ &nbsp;<a href="https://man.openbsd.org">Manual Pages</a><br>
+ &nbsp;<a href="errata62.html">Patches</a><br>
+ &nbsp;<a href="ircs://irc.freenode.net:6697/openbsd">IRC Channel</a><br>
+ &nbsp;<a href="report.html">Reporting Problems</a><br>
+ &nbsp;<a href="mail.html">Mailing Lists</a><br>
+ &nbsp;<a href="lyrics.html">Songs</a> &amp;
+ <a href="orders.html">Artwork</a><br>
+ &nbsp;<a href="hackathons.html">Hackathons</a><br>
+ &nbsp;<a href="support.html">Commercial Support</a><br>
+ <p>
+ <big><b>Supporting&nbsp;OpenBSD</b></big><br>
+ &nbsp;<a href="https://openbsdstore.com">Buy OpenBSD Products</a><br>
+ &nbsp;<a href="donations.html">Donations</a><br>
+ &nbsp;<a href="http://www.openbsdfoundation.org/"><i>OpenBSD Foundation</i></a>
+ </td>
+ <td class="align-top">
+ <div class="header">
+ <a href="62.html">
+ <img border="0" src="images/puffy62.gif" height="236" width="599" alt="[OpenBSD 6.2]"></a>
+ <br>
+ <span class="callout">
+ Only two remote holes in the default install, in a heck of a long time!<br>
+ </span>
+ </div>
+
+ <p>
+ The OpenBSD project produces a <b>FREE</b>, multi-platform 4.4BSD-based
+ UNIX-like operating system. Our efforts emphasize portability,
+ standardization, correctness, <a href="security.html">proactive security</a> and
+ <a href="crypto.html">integrated cryptography</a>. As an example of the
+ effect OpenBSD has, the popular <a href="https://www.openssh.com">OpenSSH</a>
+ software comes from OpenBSD.
+ <p>
+ OpenBSD is freely available from our download sites.
+ <p>
+ The current release is <a href="62.html">OpenBSD 6.2</a>, released Oct 9, 2017.
+ <p>
+ OpenBSD is developed entirely by volunteers.
+ The project's development environment
+ and <a href="hackathons.html">developer events</a>
+ are funded through contributions collected by
+ <a href="http://www.openbsdfoundation.org">The OpenBSD Foundation</a>.
+ Contributions ensure that OpenBSD will remain a vibrant and
+ <a href="policy.html">free</a> operating system.
+ </td>
+ </tr>
+ <tr>
+ <td class="sidebar align-bottom">
+ <a href="images/rack2009.jpg">
+ <img width="60" height="90" src="images/rack2009-s.png"
+ style="float:left;"></a>
+ </td>
+ <td class="align-bottom">
+ <hr>
+ Associated projects:
+ <a href="https://www.openssh.com">OpenSSH</a>,
+ <a href="http://www.openbgpd.org">OpenBGPD</a>,
+ <a href="http://www.openntpd.org">OpenNTPD</a>,
+ <a href="https://www.opensmtpd.org">OpenSMTPD</a>,
+ <a href="http://www.openiked.org">OpenIKED</a>,
+ <a href="http://mandoc.bsd.lv">mandoc</a>,
+ <a href="https://www.libressl.org">LibreSSL</a>
+ <br>
+ <small>
+ <em>This site Copyright &copy; 1996-2017 OpenBSD.</em><br>
+ </small>
+ </td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/testdata/opennet.ru b/testdata/opennet.ru
new file mode 100644
index 0000000..d6baff5
--- /dev/null
+++ b/testdata/opennet.ru
@@ -0,0 +1,606 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=koi8-r">
+ <TITLE> OpenNet - ӣ, , , Linux, BSD Unix</TITLE>
+ <meta name="KeyWords" content="Unix, Linux, FreeBSD, OpenBSD, Solaris, Cisco, , , , , , security, , , , , , , , FAQ, perl">
+ <meta name="Description" content=" OpenNet - Unix , ">
+ <link rel="icon" type="image/png" href="/favicon.png">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_all.rss" title=" : + -">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_6.rss" title="OpenNews RSS: ">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_mini.rss" title="Mini-News RSS: -">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_review.rss" title=": ">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_arts.rss" title=": ">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_sec.rss" title=": ">
+ <link rel="alternate" type="application/rss+xml" href="/opennews/opennews_prog.rss" title=": ">
+ <link rel="search" href="/opensearch.xml" title="OpenNet.ru search" type="application/opensearchdescription+xml">
+ <script language="JavaScript" src="/ajax_idx.js"></script>
+</HEAD>
+<BODY BGCOLOR="#DDE1C2" TEXT="#404040">
+<LINK REL="stylesheet" href="/opennet4.css" type="text/css">
+<!--htdig_noindex-->
+<FORM method="get" action="http://www.opennet.ru/search.shtml">
+<aside>
+<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+<TR>
+<TD VALIGN="BOTTOM" BGCOLOR="#E9EAD6" style="background: #E9EAD6 url('/back.gif') repeat-x bottom left">
+<A HREF="http://www.opennet.ru/"><IMG SRC="/opennet2.gif" HEIGHT=60 WIDTH=249 ALT="The OpenNET Project" BORDER="0"></A><br>
+</TD>
+
+<TD BGCOLOR="#B0B190" WIDTH="1"><IMG SRC="/p.gif" HEIGHT=1 WIDTH=1 ALT=""></TD>
+
+<TD VALIGN=TOP ALIGN=RIGHT WIDTH="728" HEIGHT="90" BGCOLOR="#D9DAC6">
+<TABLE BORDER=0 CELLPADDING=0 WIDTH="728">
+<TR>
+<TD HEIGHT=90 BGCOLOR="#D9DAC6">
+</p>
+
+</TD>
+</TR>
+</TABLE>
+</TD>
+
+<TD BGCOLOR="#B0B190" WIDTH="1"><IMG SRC="/p.gif" HEIGHT=1 WIDTH=1 ALT=""></TD>
+<TD WIDTH="40" BGCOLOR="#E9EAD6" style="background: #E9EAD6 url('/back.gif') repeat-x bottom left">&nbsp;</TD>
+<TD BGCOLOR="#B0B190" WIDTH="1"><IMG SRC="/p.gif" HEIGHT=1 WIDTH=1 ALT=""></TD>
+
+<TD VALIGN=TOP ALIGN=RIGHT WIDTH="0" BGCOLOR="#E9EAD6" ROWSPAN=3>
+</TD>
+
+</TR>
+
+<TR BGCOLOR="#B0B190"><TD COLSPAN=6><IMG SRC="/p.gif" HEIGHT=1 WIDTH=1 ALT=""></TD></TR>
+
+
+<TR BGCOLOR="#E9EAD6">
+<TD ALIGN=CENTER COLSPAN=5>
+<table width="100%">
+<tr>
+<td rowspan=2 width=300 nowrap class="h">
+<INPUT type=hidden name=exclude value="index|/man.shtml"><A HREF="./search.shtml" class="h"><u></u></A>&nbsp;(<A HREF="./keywords/" class="h"></A>):&nbsp;<INPUT type="text" size="20" name="words" value="" title=' google "g "'>
+</td><td width="20%">
+&nbsp; <A HREF="./opennews/" class="h"><b><u></u></b></A> (<a href="./news/opennet.shtml" class="h">+</a>)
+</td><td width="20%">
+ <A HREF="./mp/" class="h"><b><u></u></b></A>
+</td><td width="18%">
+ <A HREF="http://wiki.opennet.ru" class="h"><b><u>WIKI</u></b></A>
+</td><td width="18%">
+ <A HREF="./man.shtml" class="h"><b><u>MAN'</u></b></A>
+</td><td width="18%">
+ <A HREF="./forum/" class="h"><b><u></u></b></A>
+</td><td width="6%" align=right>
+ <a href="https://twitter.com/opennetru"><img src="/twitter.png" height="16" width="16" alt="twitter" title="Twitter" border="0"></a>&nbsp;<a href="https://vk.com/opennet"><img src="/img/vkontakte.gif" height="16" width="16" title="" border="0"></a>&nbsp;<a href="https://t.me/opennet_ru"><img src="/img/telegram2.png" height="16" width="16" title="Telegram" border="0"></a>
+</td></tr>
+</table>
+</TD>
+<TD BGCOLOR="#B0B190" WIDTH="1"><IMG SRC="/p.gif" HEIGHT=1 WIDTH=1 ALT=""></TD>
+</TR>
+<TR BGCOLOR="#B0B190"><TD COLSPAN=7><IMG SRC="/p.gif" HEIGHT=2 WIDTH=1 ALT=""></TD></TR>
+</TABLE>
+</aside>
+<style>
+ .hdr_mobile {
+ text-align: center;
+ display: none;
+ margin: 0px;
+ padding: 0px;
+ }
+</style>
+<div class=hdr_mobile>
+<div style="margin-left: auto; margin-right: auto; width: 100%; height: 70px; border:1px solid #b0b190; min-width: 360px; max-width: 600px; background: #E9EAD6 url('/back.gif') repeat-x bottom left;">
+<div style="float:left; width: 249px; height: 60px; margin-top: 10px;">
+<A HREF="http://www.opennet.ru"><IMG SRC="/opennet2_lite.gif" style="height: 60px; width: 249px; border: 1px;" ALT="The OpenNET Project / Index page"></A>
+</div>
+<div style="float: left; text-align: center; height: 70px; width: 331px; padding: 5px; margin-left: 10px;">
+<br><small>[ <a href="/opennews/"></a>/<a href="/opennews/?full_lines=15&amp;lines=15&amp;mid_lines=00">++</a> | <a href="/forum/"></a> | <a href="http://wiki.opennet.ru">wiki</a> | <a href="/keywords/"></a>
+]</small>
+<a href="https://t.me/opennet_ru"><img src="/img/telegram2.png" height="16" width="16" title="Telegram" border="0"></a>
+</div>
+</div>
+</div>
+<div style="clear: both;"></div>
+
+
+<div style="float: left; width: 279; text-align: left;padding-right: 60px;" id=adv><A HREF="http://www.ip-as.ru" target=_blank><IMG SRC="/img/ipas3.gif" BORDER="0" width="279" height="40"></A></div>
+<div style="padding-top: 0px;position:absolute;left:50%;margin-left:-235px;width:470px;" id=adv2>
+</div>
+<div style="width: 279;float: right;" id=adv3>
+</div>
+<div style="clear: both;"></div>
+<br>
+</FORM>
+<!--/htdig_noindex-->
+
+
+
+<link rel="stylesheet" href="/opennet_idx5.css" type="text/css">
+
+<div class=m_col id=as2>
+
+
+<div id="tabs_top">
+<div class="tab-selected" id="tab1" onclick="tabClick(1)">&nbsp;</div>
+<div class="tab" id="tab2" onclick="tabClick(2)">-</div>
+<div class="tab" id="tab3" onclick="tabClick(3)"></div>
+<div class="tab-null"><a href="/opennews/"></a>&nbsp;</div>
+</div>
+<div id="top_news">
+<table class=ttxt style="margin-bottom: 0px; border-bottom: none">
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >23.01</td><td class=tnews><a href="/opennews/art.shtml?num=47949"> Firefox 58</a> <span class=cnt>(46 +14)</span></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >23.01</td><td class=tnews><a href="/opennews/art.shtml?num=47950">Facebook Detectron </a> <span class=cnt>(17 +9)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >22.01</td><td class=tnews><a href="/opennews/art.shtml?num=47948"> Intel </a> <span class=cnt>(223 +57)</span></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >22.01</td><td class=tnews><a href="/opennews/art.shtml?num=47944"> Minibase, Linux</a> <span class=cnt>(73 +17)</span></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >22.01</td><td class=tnews><a href="/opennews/art.shtml?num=47943"> WineD3D Windows, DirectX 11 OpenGL</a> <span class=cnt>(56 +28)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td colspan=3 style="padding-top: 0px; padding-bottom: 0px; text-align: right; font-size: 9pt"><a href="#" onclick="tabClick(2)">&gt;&gt; 1 - </a></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >21.01</td><td class=tnews><a href="/opennews/art.shtml?num=47940"> Java JavaScript </a> <span class=cnt>(91 +2)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate style="font-weight: bold">19.01</td><td class=tnews><a href="/opennews/art.shtml?num=47936"> NeoPG GnuPG 2</a> <span class=cnt>(122 +26)</span></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >19.01</td><td class=tnews><a href="/opennews/art.shtml?num=47935"> Git 2.16.0</a> <span class=cnt>(63 +30)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate style="font-weight: bold">18.01</td><td class=tnews><a href="/opennews/art.shtml?num=47934"> Wine 3.0 </a> <span class=cnt>(139 +50)</span></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >18.01</td><td class=tnews><a href="/opennews/art.shtml?num=47930"> Firefox 58 </a> <span class=cnt>(144 +32)</span></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >18.01</td><td class=tnews><a href="/opennews/art.shtml?num=47929">Google Goobuntu (Ubuntu) gLinux (Debian)</a> <span class=cnt>(269 +63)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td width=12><img src="/img/i_bug.gif" height="12" width="12" title="bug" align=middle></td><td class=tdate >17.01</td><td class=tnews><a href="/opennews/art.shtml?num=47927"> </a> <span class=cnt>(50 +16)</span></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >17.01</td><td class=tnews><a href="/opennews/art.shtml?num=47922">Mozilla </a> <span class=cnt>(82 +69)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td width=12><img src="/img/i_bug.gif" height="12" width="12" title="bug" align=middle></td><td class=tdate >16.01</td><td class=tnews><a href="/opennews/art.shtml?num=47919"> ң Chrome </a> <span class=cnt>(60 +25)</span></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >16.01</td><td class=tnews><a href="/opennews/art.shtml?num=47916"> KDE Plasma 5.12</a> <span class=cnt>(144 +35)</span></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >16.01</td><td class=tnews><a href="/opennews/art.shtml?num=47913"> Web API Firefox HTTPS</a> <span class=cnt>(190 &ndash;14)</span></td></tr>
+<tr><td width=12><img src="/img/i_bug.gif" height="12" width="12" title="bug" align=middle></td><td class=tdate >16.01</td><td class=tnews><a href="/opennews/art.shtml?num=47912"> BitTorrent- Transmission, </a> <span class=cnt>(87 +14)</span></td></tr>
+<tr><td class=tdelim colspan=2></td><td class=tdelim0></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >15.01</td><td class=tnews><a href="/opennews/art.shtml?num=47907"> Coreboot 4.7</a> <span class=cnt>(66 +29)</span></td></tr>
+<tr><td width=12><img src="/img/i_prog.gif" height="12" width="12" title="" align=middle></td><td class=tdate >15.01</td><td class=tnews><a href="/opennews/art.shtml?num=47906"> LittleFS, </a> <span class=cnt>(89 +34)</span></td></tr>
+<tr><td width=12><img src="/img/i_news.gif" height="12" width="12" title="" align=middle></td><td class=tdate >15.01</td><td class=tnews><a href="/opennews/art.shtml?num=47902"> CSS, JavaScript</a> <span class=cnt>(35 +31)</span></td></tr>
+</table>
+</div>
+<div style="border-top: 1px solid #b0b190;width: 100%; text-align: right; font-size: 70%;"><a href="/opennews/opennews_all.rss"><b>RSS</b></a> | <a href="/announce_news.shtml?c=f"> </a> | <span id="next_link"><a href="/opennews/main.shtml"></a> | <a href="/opennews/main.shtml?skip_10_version=on"> 20 <font color=red>&gt;&gt;</font></a></span></div>
+
+
+
+
+
+</div>
+<div class=r_col id=as1>
+<aside>
+
+<!-- #include file="adv.inc"-->
+
+<td valign="top" width="25%">
+<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+<!-- 300x600 -->
+<ins class="adsbygoogle"
+ style="display:inline-block;width:300px;height:600px"
+ data-ad-client="ca-pub-2075278885744463"
+ data-ad-slot="3190089036"></ins>
+<script>
+ var re = new RegExp('Android|Mobile|Opera Mini','');
+ if (navigator.userAgent && re.exec(navigator.userAgent) == null){
+ (adsbygoogle = window.adsbygoogle || []).push({});
+ }
+</script>
+<br><br>
+
+<!--
+<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+<ins class="adsbygoogle"
+ style="display:inline-block;width:240px;height:400px"
+ data-ad-client="ca-pub-2075278885744463"
+ data-ad-slot="3329689834"></ins>
+<script>
+ (adsbygoogle = window.adsbygoogle || []).push({});
+</script>
+<br><br>
+-->
+
+</aside>
+</div>
+<div style="clear: both;"></div>
+
+<div class=m_col id=as2>
+
+<table class=thdr>
+<tr><td><a href="/tips/sml/"><u></u></a></td></tr>
+</table>
+<!--htdig_noindex-->
+<table class=tlist>
+<tr><td><b>-</b> 15.01 <A HREF="/tips/3048_yubikey_crypt_ssh_gpg_auth.shtml"> USB- Yubikey 4 GPG SSH</A></td></tr>
+<tr><td><b>-</b> 02.01 <A HREF="/tips/3047_wifi_repeater_mesh_route_nat_firmware.shtml"> WiFi- Mesh-</A></td></tr>
+<tr><td><b>-</b> 27.12 <A HREF="/tips/3046_wifi_amplifier_signal.shtml"> </A></td></tr>
+<tr><td><b>-</b> 12.12 <A HREF="/tips/3044_paywall_browser_useragent.shtml"> </A></td></tr>
+<tr><td><b>-</b> 02.12 <A HREF="/tips/3040_compile_chromeos_chromiumos_qemu_gpu_virglrenderer_opengl.shtml"> ChromiumOS QEMU</A></td></tr>
+
+</table>
+<!--/htdig_noindex-->
+<br><br>
+<table class=thdr>
+<tr><td><a href="http://forum.opennet.ru/"><u><b></b></u></a></td></tr>
+</table>
+<table class=ttxt>
+<tr><td width=50% class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID1"> </a></td>
+<td width=50% class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID15"> </a></td></tr>
+<tr><td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID6"> CISCO</a></td>
+<td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID8">WEB </a></td></tr>
+<tr><td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID9"></a></td>
+<td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID10"></a></td></tr>
+<tr><td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID12">Squid . </a></td>
+<td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID14">Samba Windows</a></td></tr>
+<tr><td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID2"> </a></td>
+<td class=tmenu><b>-</b> <a href="http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=list&amp;forum=vsluhforumID13"> </a></td></tr>
+</table>
+
+
+<br><br>
+<table class=thdr>
+<tr><td><a HREF="/mp/"><u> </u></a></td></tr>
+</table>
+
+<table class=ttxt>
+<tr><td style="padding: 5px;">
+<tr><td width="50%" class=i><b><A href="/mp/admin/"></a></b>
+<div class=i>
+<a href="/mp/traffic/" class=i></a>,
+<a href="/mp/monitoring/" class=i></a>,
+<a href="/mp/auth/" class=i>ldap</a>,
+<a href="/mp/vpn/" class=i>vpn</a>...
+</div>
+</td>
+
+<td width="50%" class=i><A href="/mp/user/"><b>, </a></b>
+<div class=i>
+<a href="/mp/rus/" class=i></a>,
+<a href="/mp/multimedia/" class=i></a>,
+<a href="/mp/x/" class=i></a>...
+</div>
+</td></tr>
+
+<tr><td colspan=2>&nbsp;</td></tr>
+
+<tr><td class=i><b><A href="/mp/programmer/"> Unix Web</a></b>
+<div class=i>
+<a href="/mp/gcc/" class=i></a>,
+<a href="/mp/perl/" class=i>perl</a>,
+<a href="/mp/python/" class=i>python</a>,
+<a href="/mp/java/" class=i>java</a>,
+<a href="/mp/php/" class=i>php</a>,
+<a href="/mp/sql/" class=i></a>...
+</div>
+</td>
+
+<td class=i><b><a href="/mp/security/">, </a></b>
+<div class=i>
+<a href="/mp/firewall/" class=i>firewall</a>,
+<a href="/mp/quota/" class=i></a>,
+<a href="/mp/crypt/" class=i></a>...
+</div>
+</td></tr>
+
+<tr><td colspan=2>&nbsp;</td></tr>
+
+<tr><td class=i><b><a href="/mp/route/"> </a></b>
+<div class=i>
+<a href="/mp/apache/" class=i>apache</a>,
+<a href="/mp/samba/" class=i>samba</a>,
+<a href="/mp/proxy/" class=i>proxy</a>,
+<a href="/mp/ftp/" class=i>ftp</a>,
+<a href="/mp/mail/" class=i></a>...
+</div>
+</td>
+
+<td class=i><b><a href="/mp/admin/"> </a></b>
+<div class=i>
+<a href="/mp/cisco/" class=i>cisco</a>,
+<a href="/mp/linux/" class=i>linux</a>,
+<a href="/mp/bsd" class=i>bsd</a>,
+<a href="/mp/solaris/" class=i>solaris</a>,
+<a href="/mp/hardware/" class=i></a>...
+</div>
+</td></tr>
+
+</table>
+<div style="width: 100%; text-align: right; font-size: 70%;">
+<a href="/docs"> </a> | <a href="/filebase.shtml"> </a>
+</div>
+</div>
+<div class=r_col id=as1>
+<aside>
+
+
+<form method="get" action="/cgi-bin/opennet/jump.cgi">
+<table class=thdr style="padding: 0;">
+<tr><td>
+
+<select name="to" onChange="submit()" style="font-size: 9pt; width: 170px; background-color: #C7CBB1; color: #0000AD;">
+<option value="/mp/">
+<option value="admin">
+ <option value="mail">&nbsp;&nbsp;|--
+ <option value="dns">&nbsp;&nbsp;|-- DNS
+ <option value="apache">&nbsp;&nbsp;|-- HTTP-
+ <option value="ftp">&nbsp;&nbsp;|-- FTP, BitTorrent
+ <option value="samba">&nbsp;&nbsp;|-- Samba, Windows
+ <option value="auth">&nbsp;&nbsp;|-- LDAP, Radius, Tacacs
+ <option value="proxy">&nbsp;&nbsp;|-- Proxy, squid, socks
+<option value="">
+ <option value="route">&nbsp;&nbsp;|-- , NAT
+ <option value="firewall">&nbsp;&nbsp;|-- Firewall,
+ <option value="voip">&nbsp;&nbsp;|-- VoIP, Asterisk
+ <option value="vpn">&nbsp;&nbsp;|-- VPN, PPPoE PPTP, IPSec
+ <option value="crypt">&nbsp;&nbsp;|-- , SSH, SSL
+<option value="">
+ <option value="tune">&nbsp;&nbsp;|-- ,
+ <option value="cluster">&nbsp;&nbsp;|--
+ <option value="virtual">&nbsp;&nbsp;|--
+ <option value="traffic">&nbsp;&nbsp;|--
+ <option value="monitoring">&nbsp;&nbsp;|-- ,
+ <option value="security">&nbsp;&nbsp;|--
+<option value="">
+ <option value="fs">&nbsp;&nbsp;|--
+ <option value="backup">&nbsp;&nbsp;|--
+ <option value="hardware">&nbsp;&nbsp;|-- ,
+ <option value="kernel">&nbsp;&nbsp;|-- (kernel)
+ <option value="quota">&nbsp;&nbsp;|-- , ACL,
+<option value="">
+<option value="user">
+ <option value="rus">&nbsp;&nbsp;|--
+ <option value="x">&nbsp;&nbsp;|-- X Window
+ <option value="multimedia">&nbsp;&nbsp;|-- , ,
+ <option value="dialup">&nbsp;&nbsp;|-- Dial-up, ISP, PPP
+<option value="">
+<option value="programmer">
+ <option value="web">&nbsp;&nbsp;|-- Web-
+ <option value="shell">&nbsp;&nbsp;|-- Shell-
+ <option value="perl">&nbsp;&nbsp;|-- Perl
+ <option value="python">&nbsp;&nbsp;|-- Python
+ <option value="gcc">&nbsp;&nbsp;|-- GCC, /++
+ <option value="php">&nbsp;&nbsp;|-- PHP
+ <option value="java">&nbsp;&nbsp;|-- Java, JSP
+ <option value="javascript">&nbsp;&nbsp;|-- JavaScript
+ <option value="html">&nbsp;&nbsp;|-- HTML, CSS
+ <option value="sql">&nbsp;&nbsp;|-- MySQL, PostgreSQL, NoSQL
+<option value="">
+<option value="linux">Linux
+<option value="bsd">FreeBSD, OpenBSD, NetBSD
+<option value="solaris">Solaris
+<option value="cisco">Cisco,
+
+</select>&nbsp;<input type="submit" value="&gt;" style="background-color: #C7CBB1; color: #0000AD; border: 0px;">
+</td></tr>
+</table>
+
+
+<table class=ttxt>
+<tr style="background-color: #F9EAD6;"><td class=tmenu><a href="http://ua.opennet.ru/"><u><b>UA.opennet.ru</b></u></a></td><td class=tmenu></td></tr>
+<tr><td class=tmenu><a href="http://opennet.ru/"><u><b>opennet.ru</b></u></a></td><td class=tmenu> </td></tr>
+<tr><td class=tmenu><a href="http://mobile.opennet.ru/"><u><b>m</b>.opennet.ru</u></a></td><td class=tmenu>. </td></tr>
+<tr><td class=tmenu><a href="http://wiki.opennet.ru/"><u><b>wiki</b>.opennet.ru</u></a></td><td class=tmenu> </td></tr>
+<tr><td class=tmenu><a href="http://solaris.opennet.ru/"><u><b>solaris</b>.opennet.ru</u></a></td><td class=tmenu>Solaris</td></tr>
+<tr><td class=tmenu><a href="http://bsd.opennet.ru/"><u><b>bsd</b>.opennet.ru</u></a></td><td class=tmenu>*BSD</td></tr>
+<tr><td class=tmenu><a href="http://cisco.opennet.ru/"><u><b>cisco</b>.opennet.ru</u></a></td class=tmenu><td class=tmenu>Cisco</td></tr>
+<tr><td class=tmenu><a href="http://linux.opennet.ru/"><u><b>linux</b>.opennet.ru</u></a></td class=tmenu><td class=tmenu>Linux</td></tr>
+<tr><td class=tmenu><a href="http://web.opennet.ru/"><u><b>web</b>.opennet.ru</u></a></td><td class=tmenu></td></tr>
+<tr><td class=tmenu><a href="http://security.opennet.ru/"><u><b>security</b>.opennet.ru</u></a></td><td class=tmenu></td></tr>
+<tr><td class=tmenu><a href="http://palm.opennet.ru/"><u><b>palm</b>.opennet.ru</u></a></td><td class=tmenu> Linux</td></tr>
+<tr><td class=tmenu><a href="http://grab.opennet.ru/"><u><b>grab</b>.opennet.ru</u></a></td><td class=tmenu> </td></tr>
+<tr><td class=tmenu><a href="http://twitter.com/opennetru"><img src="/twitter.png" height="16" width="16" alt="twitter" title="Twitter" border="0"></a> &nbsp;<a href="http://vk.com/opennet"><img src="/img/vkontakte.gif" height="16" width="16" title="" border="0"></a></td><td class=tmenu> </td></tr>
+</table>
+
+<script language=JavaScript>
+var plugin=(navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
+
+if ( plugin ) {
+
+ plugin=parseInt(plugin.description.substring(plugin.description.indexOf(".")-2))>=6;
+
+}
+
+else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0
+
+ && (navigator.userAgent.indexOf("Windows 95")>=0 || navigator.userAgent.indexOf("Windows 98")>=0 || navigator.userAgent.indexOf("Windows NT")>=0)) {
+
+ document.write('<SCR'+'IPT LANGUAGE=VBScript\> \n');
+
+ document.write('on error resume next \n');
+
+ document.write('plugin=( IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6")))\n');
+
+ document.write('</SCRIPT\> \n');
+
+}
+
+if ( plugin ) {
+
+ var swf_url = '/img/bsh_1.swf' + '?link1=' + 'http://click.opennet.ru/cgi-bin/opennet/hjump.cgi?bsh_1';
+ document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width=240 height=100>');
+ document.write('<param name=movie value="' + swf_url + '"><param name=menu value=false><param name=quality value=high><param name="play" value="true">');
+ document.write('<OBJECT TYPE="application/x-shockwave-flash" data="' + swf_url + '" width=240 height=100>');
+ document.write('<param name=movie value="' + swf_url + '"><param name=menu value=false><param name=quality value=high><param name="play" value="true">');
+ document.write('</object>');
+ document.write('</object>');
+
+}else{
+ document.write('<a href=http://click.opennet.ru/cgi-bin/opennet/hjump.cgi?bsh_1 target=_blank><img src=/img/bsh_1.gif width=240 height=100 border=0></a>');
+}
+</script>
+<noscript><a href=http://click.opennet.ru/cgi-bin/opennet/hjump.cgi?bsh_1 target=_blank><img src=/img/bsh_1.gif width=240 height=100 border=0></a></noscript>
+
+<!-- #include file="poll2.inc"-->
+</form>
+<br>
+<script language=JavaScript src="http://www.opennet.ru/cgi-bin/opennet/hints.cgi?button_network">
+</script>
+<center><font size="-2"><a href="/banners2.shtml"> .</a></font></center>
+
+
+
+</aside>
+</div>
+<div style="clear: both;"></div>
+
+<br>
+
+<div style="float:left; width: 33%; min-width: 360px; padding: 2px;">
+
+<table class=thdr>
+<tr><td><a href="/lastsoft/"><u> </u></a></td></tr>
+</table>
+<table class=tlist>
+<tr><td><b>-</b> 23.01&nbsp;<a href="/opennews/art.shtml?num=47949"> Firefox 58</a> <span class=cnt>(46 +14)</span></td></tr>
+<tr><td><b>-</b> 20.01&nbsp;<a href="/opennews/art.shtml?num=47937"> GNU Wget 1.19.3</a> <span class=cnt>(20 +16)</span></td></tr>
+<tr><td><b>-</b> 19.01&nbsp;<a href="/opennews/art.shtml?num=47935"> Git 2.16.0</a> <span class=cnt>(63 +30)</span></td></tr>
+<tr><td><b>-</b> 18.01&nbsp;<a href="/opennews/art.shtml?num=47934"> Wine 3.0 </a> <span class=cnt>(139 +50)</span></td></tr>
+<tr><td><b>-</b> 17.01&nbsp;<a href="/opennews/art.shtml?num=47926"> web- Min 1.7</a> <span class=cnt>(72 &ndash;29)</span></td></tr>
+<tr><td><b>-</b> 17.01&nbsp;<a href="/opennews/art.shtml?num=47921"> VirtualBox 5.2.6</a> <span class=cnt>(26 +11)</span></td></tr>
+<tr><td><b>-</b> 16.01&nbsp;<a href="/opennews/art.shtml?num=47918"> web- QupZilla 2.2.4</a> <span class=cnt>(44 +16)</span></td></tr>
+<tr><td><b>-</b> 16.01&nbsp;<a href="/opennews/art.shtml?num=47916"> KDE Plasma 5.12</a> <span class=cnt>(144 +35)</span></td></tr>
+<tr><td><b>-</b> 15.01&nbsp;<a href="/opennews/art.shtml?num=47911"> NGINX Unit 0.4</a> <span class=cnt>(17 +8)</span></td></tr>
+<tr><td><b>-</b> 15.01&nbsp;<a href="/opennews/art.shtml?num=47908"> Pale Moon 27.7.0</a> <span class=cnt>(53 +26)</span></td></tr>
+
+</table>
+<table class=ttxt>
+<tr><td class=tmenu>
+&nbsp; 23.01&nbsp;<a href="http://www.troll.no/products/qt.html">Qt 5.9.4</a><br>
+&nbsp; 23.01&nbsp;<a href="http://www.opennet.ru/prog/info/1468.shtml">SQLite 3.22.0</a><br>
+&nbsp; 22.01&nbsp;<a href="http://www.opennet.ru/prog/info/67.shtml">wget 1.19.4</a><br>
+&nbsp; 20.01&nbsp;<a href="http://www.opennet.ru/prog/info/2087.shtml">ClamAV 0.99.2.1</a><br>
+&nbsp; 19.01&nbsp;<a href="http://mesa3d.org">mesa 3d 17.3.3</a><br>
+&nbsp; 19.01&nbsp;<a href="http://cmake.org/">cmake 3.10.2</a><br>
+&nbsp; 18.01&nbsp;<a href="http://www.opennet.ru/prog/info/2791.shtml">GIT 2.16</a><br>
+&nbsp; 18.01&nbsp;<a href="http://www.opennet.ru/opennews/art.shtml?num=47934">wine 3.0</a><br>
+&nbsp; 17.01&nbsp;<a href="http://www.opennet.ru/prog/info/88.shtml">BIND 9.11.2-P1, 9.10.6, 9.9.11-P1</a><br>
+&nbsp; 17.01&nbsp;<a href="http://wordpress.org">WordPress 4.9.2</a><br>
+&nbsp; 16.01&nbsp;<a href="http://www.opennet.ru/prog/info/228.shtml">MySQL 5.7.21</a><br>
+&nbsp; 15.01&nbsp;<a href="http://palemoon.org">Pale Moon 27.7.0</a><br>
+&nbsp; 15.01&nbsp;<a href="http://projects.gnome.org/NetworkManager/">NetworkManager 1.10.2, 1.8.6</a><br>
+&nbsp; 14.01&nbsp;<a href="http://kdenlive.org">Kdenlive 17.12.1</a><br>
+&nbsp; 12.01&nbsp;<a href="http://krita.org">Krita 3.3.3</a><br>
+&nbsp; 12.01&nbsp;<a href="http://www.opennet.ru/prog/info/2471.shtml">Asterisk 15.2.0, 13.19.0</a><br>
+
+</td></tr>
+<tr bgcolor="#D9DAC6" align=right><td class=tmenu><a href="/opennews/opennews_prog.rss">RSS</a> | <a href="/lastsoft/"> <font color=red>&gt;&gt;</font></a>&nbsp;</td></tr>
+</table>
+
+</div>
+<div style="float:left; width: 33%; min-width: 360px; padding: 2px;">
+
+<table class=thdr>
+<tr><td><a href="/security/"><u> </u></a></td></tr>
+</table>
+
+<table class=tlist>
+<tr><td><b>-</b> 17.01&nbsp;<a href="/opennews/art.shtml?num=47927"> </a> <span class=cnt>(50 +16)</span></td></tr>
+<tr><td><b>-</b> 17.01&nbsp;<a href="/opennews/art.shtml?num=47924"> ISC BIND DHCP . KPTI BIND</a> <span class=cnt>(18 +9)</span></td></tr>
+<tr><td><b>-</b> 17.01&nbsp;<a href="/opennews/art.shtml?num=47920"> Java SE, MySQL, VirtualBox Oracle </a> <span class=cnt>(39 +6)</span></td></tr>
+<tr><td><b>-</b> 16.01&nbsp;<a href="/opennews/art.shtml?num=47919"> ң Chrome </a> <span class=cnt>(60 +25)</span></td></tr>
+<tr><td><b>-</b> 16.01&nbsp;<a href="/opennews/art.shtml?num=47912"> BitTorrent- Transmission, </a> <span class=cnt>(87 +14)</span></td></tr>
+<tr><td><b>-</b> 15.01&nbsp;<a href="/opennews/art.shtml?num=47910"> SoftEther VPN 11 </a> <span class=cnt>(56 +16)</span></td></tr>
+<tr><td><b>-</b> 13.01&nbsp;<a href="/opennews/art.shtml?num=47897"> Lenovo IBM </a> <span class=cnt>(102 +31)</span></td></tr>
+<tr><td><b>-</b> 12.01&nbsp;<a href="/opennews/art.shtml?num=47894"> Glibc, </a> <span class=cnt>(68 +17)</span></td></tr>
+<tr><td><b>-</b> 12.01&nbsp;<a href="/opennews/art.shtml?num=47891"> - ף NPM</a> <span class=cnt>(85 +31)</span></td></tr>
+<tr><td><b>-</b> 12.01&nbsp;<a href="/opennews/art.shtml?num=47890"> OpenSSH sftp, chroot</a> <span class=cnt>(14 +10)</span></td></tr>
+<tr><td><b>-</b> 11.01&nbsp;<a href="/opennews/art.shtml?num=47889">21 3D- Blender</a> <span class=cnt>(77 +18)</span></td></tr>
+<tr><td><b>-</b> 11.01&nbsp;<a href="/opennews/art.shtml?num=47887"> WhatsApp Signal</a> <span class=cnt>(54 +15)</span></td></tr>
+<tr><td><b>-</b> 10.01&nbsp;<a href="/opennews/art.shtml?num=47883">Let's Encrypt </a> <span class=cnt>(37 +11)</span></td></tr>
+<tr><td><b>-</b> 10.01&nbsp;<a href="/opennews/art.shtml?num=47880"> , Meltdown Spectre</a> <span class=cnt>(213 +45)</span></td></tr>
+<tr><td><b>-</b> 10.01&nbsp;<a href="/opennews/art.shtml?num=47882"> Let's Encrypt</a> <span class=cnt>(62 +20)</span></td></tr>
+
+<!-- #include virtual="./news/sec_news_cache.inc"-->
+<tr bgcolor="#D9DAC6" align=right><td class=tmenu><a href="/opennews/opennews_sec.rss">RSS</a> | <a href="/security/"></a> | <a href="/opennews/index.shtml?f=vuln&subsection=on&skip=15"> <font color=red>&gt;&gt;</font></A>&nbsp;</td></tr>
+</table>
+
+</div>
+<div style="float:left; width: 33%; min-width: 360px; padding: 2px;">
+
+
+
+<!--htdig_noindex-->
+<table class=thdr>
+<tr><td> <a href="http://forum.opennet.ru"></a></b> (<a href="/openforum/forum_all.rss">RSS</a>)</td></tr>
+</table>
+<table class=tlist>
+<tr><td><b>-</b> 11:07 <a href="/openforum/vsluhforumID1/97109.html" title=" : . , ">FreeBSD 10.3: </a>&nbsp;(1)</td></tr>
+<tr><td><b>-</b> 17:55 <a href="/openforum/vsluhforumID1/97108.html" title=" : Samba, / Linux">NAS cifs </a>&nbsp;(4)</td></tr>
+<tr><td><b>-</b> 11:53 <a href="/openforum/vsluhforumID6/2254.html" title=" CISCO . .: ">7206 VXR PPPoE Client</a>&nbsp;(5)</td></tr>
+<tr><td><b>-</b> 13:43 <a href="/openforum/vsluhforumID7/1057.html" title=" .: Asus Eee PC"> MC</a>&nbsp;(11)</td></tr>
+<tr><td><b>-</b> 15:44 <a href="/openforum/vsluhforumID1/97106.html" title=" : / FreeBSD"> bash</a>&nbsp;(4)</td></tr>
+<tr><td><b>-</b> 13:34 <a href="/openforum/vsluhforumID6/2253.html" title=" CISCO . .: VoIP"> CUE</a>&nbsp;(0)</td></tr>
+<tr><td><b>-</b> 13:20 <a href="/openforum/vsluhforumID6/2252.html" title=" CISCO . .: "> ip iptables</a>&nbsp;(4)</td></tr>
+<tr><td><b>-</b> 11:55 <a href="/openforum/vsluhforumID7/1056.html" title=" .: Asus Eee PC"> </a>&nbsp;(14)</td></tr>
+<tr><td><b>-</b> 08:58 <a href="/openforum/vsluhforumID1/97105.html" title=" : FTP / Linux">FTP Centos 7</a>&nbsp;(1)</td></tr>
+<tr><td><b>-</b> 02:14 <a href="/openforum/vsluhforumID8/8111.html" title="WEB : Apache, http-"> apache .</a>&nbsp;(0)</td></tr>
+<tr><td><b>-</b> 10:20 <a href="/openforum/vsluhforumID1/97104.html" title=" : DHCP / FreeBSD"> DHCP</a>&nbsp;(12)</td></tr>
+<tr><td><b>-</b> 10:05 <a href="/openforum/vsluhforumID1/97103.html" title=" : , "> RAID0 (mdadm)?</a>&nbsp;(4)</td></tr>
+<tr><td><b>-</b> 10:46 <a href="/openforum/vsluhforumID1/97102.html" title=" : , NAT / Linux"> </a>&nbsp;(6)</td></tr>
+<tr><td><b>-</b> 19:17 <a href="/openforum/vsluhforumID12/7302.html" title=" Squid : ">Outlook Express </a>&nbsp;(1)</td></tr>
+<tr><td><b>-</b> 07:30 <a href="/openforum/vsluhforumID7/1055.html" title=" .: Asus Eee PC"> </a>&nbsp;(41)</td></tr>
+
+</table>
+<!--/htdig_noindex-->
+
+
+</div>
+<div style="clear: both;"></div>
+
+<script language="JavaScript">
+if (document.location.hash == '#mini'){
+ tabClick(2);
+}else if (document.location.hash == '#imp'){
+ tabClick(3);
+}
+</script>
+
+
+<aside>
+<!--htdig_noindex-->
+<noindex>
+<br>
+
+<table id=ibm_adv align=center><tr valign=top><td width="605">
+<iframe src="http://www.opennet.ru/adv_lc.html" height="240" width="605" scrolling="no" name="ibm" border="0" frameborder="0" target="_blank" marginheight="0" marginwidth="0"></iframe>
+</td></tr></table>
+</noindex>
+<!--/htdig_noindex-->
+</aside>
+
+<!-- footer -->
+<!--htdig_noindex-->
+<br>
+<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=1 WIDTH="100%" BGCOLOR="#B0B190">
+<TR><TD>
+<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" VALIGN="MIDDLE">
+<TR>
+<TD WIDTH="35%" BGCOLOR="#E9EAD6" ALIGN=LEFT>
+<FONT SIZE="-1">
+&nbsp;&nbsp;<A HREF="/cgi-bin/opennet/bookmark.cgi">&nbsp;&nbsp;</A><BR>
+&nbsp;&nbsp;<A HREF="/cgi-bin/opennet/bookmark.cgi?submit=add" target="blank_">&nbsp;&nbsp;</A>
+</FONT>
+</TD>
+<TD WIDTH="65%" ALIGN=RIGHT BGCOLOR="#E9EAD6">
+<FONT SIZE="-1">Created&nbsp;1996-2018&nbsp;by&nbsp;<B><A HREF="/contact.shtml" title="email mc@tyumen.ru">Maxim&nbsp;Chirkov</A></B></FONT>&nbsp;&nbsp;<BR>
+<FONT SIZE="-1"><A HREF="http://www.opennet.ru/add.shtml"></A>,&nbsp;<A HREF="http://www.opennet.ru/reklama.shtml"></A>,&nbsp;<A HREF="http://www.opennet.ru/banners2.shtml"></A>,&nbsp;<A HREF="./guide.shtml"></A></FONT>&nbsp;&nbsp;
+</TD>
+</TR>
+</TABLE>
+</TD></TR>
+</TABLE>
+
+
+<div align=right><table><tr><td>
+<a target=_blank href="http://www.ihor.ru"><img src="/img/ihor_but.png" border=0 height=31 width=88 alt="Hosting by Ihor"></a>
+<script>
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+ ga('create', 'UA-123449-1', 'auto');
+ ga('send', 'pageview');
+</script>
+</td></tr></table>
+</div>
+</form>
+<!--/htdig_noindex-->
+<!-- end of footer -->
+
+</BODY>
+</HTML>
diff --git a/testdata/undeadly.org b/testdata/undeadly.org
new file mode 100644
index 0000000..ba7b7ef
--- /dev/null
+++ b/testdata/undeadly.org
@@ -0,0 +1,405 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link rel="stylesheet" href="themes/default.css" title="default/standard theme">
+
+
+<link rel="alternate" type="application/xml" title="RSS" href="https://undeadly.org/cgi?action=rss">
+<title>OpenBSD Journal: A resource for the OpenBSD community</title>
+</head>
+<body>
+
+<header id="page_hdr">
+
+
+
+
+
+<div id="logo">
+<a href="/cgi?action=front"><img src="images/MangaRamblo_25_x.png" alt="Front page"></a>
+</div>
+
+<div id="search">
+<form action="https://undeadly.org/cgi" method="post">
+<input type="hidden" name="action" value="search">
+<input id="f_q" type="text" name="q" required>
+<input type="submit" title="We canardly search!" name="submit" value="Search site">
+</form>
+</div>
+
+<p class="branding">OpenBSD Journal</p>
+
+<nav id="menubar">
+<p><a href="/cgi?action=front">Home</a>
+<a href="/cgi?action=archive">Archives</a>
+<a href="/cgi?action=about">About</a>
+
+<a href="https://undeadly.org/cgi?action=submit">Submit Story</a>
+<a href="https://undeadly.org/cgi?action=register">Create Account</a>
+<a href="https://undeadly.org/cgi?action=login">Login</a>
+</p>
+</nav>
+
+
+<h1 id="front">OpenBSD Journal</h1>
+</header>
+
+
+<main>
+<div id="primary">
+
+<article class="story" id="s20180115073406">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20180115073406">CPU microcode update code for amd64</a></h1>
+<p class="attrib">Contributed by
+<a href="https://undeadly.org">Paul 'WEiRD' de Weerd</a>
+on <time datetime="2018-01-14T11:37:59Z">2018-01-14</time>
+from the not-very-firm-ware dept.</p>
+</header>
+<div class="story_text">
+<p>Patrick Wildt (<kbd>patrick@</kbd>) recently <a href="https://marc.info/?l=openbsd-cvs&amp;m=151570987406841&amp;w=2">committed</a> some code that will update the Intel microcode on many Intel CPUs, a diff initially written by Stefan Fritsch (<kbd>sf@</kbd>). The <a href="https://en.wikipedia.org/wiki/Microcode">microcode</a> of your CPU is basically the firmware that runs on your (Intel) processor, defining its instruction set in terms of so called "microinstructions". The new code depends, of course, on the corresponding firmware package, <a href="https://marc.info/?l=openbsd-ports-cvs&amp;m=151561760123386&amp;w=2">ported</a> by Patrick which can be installed using a very recent <a href="https://man.openbsd.org/fw_update">fw_update(1)</a>. Of course, this all plays into the recently revealed problems in Intel (and other) CPUs, <a href="https://spectreattack.com/">Meltdown and Spectre</a>.</p>
+
+</div>
+<p><a href="/cgi?action=article;sid=20180115073406">Read more&hellip;</a></p>
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20180115073406">3 comments (4d15:34 ago)</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20180110090224">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20180110090224"><i>Handling of CPU bugs disclosure 'incredibly bad': OpenBSD's de Raadt</i></a></h1>
+<p class="attrib">Contributed by
+<a href="http://www.openbsdfoundation.org/donations.html">rueda</a>
+on <time datetime="2018-01-09T08:54:53Z">2018-01-09</time>
+from the we-are-not-amused dept.</p>
+</header>
+<div class="story_text">
+<p><a href="https://www.itwire.com/"><i>ITWire</i></a>
+has published
+<a href="https://www.itwire.com/security/81338-handling-of-cpu-bug-disclosure-incredibly-bad-openbsd-s-de-raadt.html">an article</a>
+regarding Theo de Raadt's (<kbd>deraadt@</kbd>) reaction to the
+<i>Meltdown</i>/<i>Spectre</i> disclosures.</p>
+<p>One choice quote reads:
+<blockquote>
+Intel engineers attended the same conferences as other company engineers, and read the same papers about performance enhancing strategies – so it is hard to believe they ignored the risky aspects.
+</blockquote>
+</p>
+
+</div>
+
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20180110090224">2 comments (10d23:46 ago)</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20180109082916">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20180109082916">OpenBSD-current now has 'smtpctl spf walk'</a></h1>
+<p class="attrib">Contributed by
+<a href="http://bsdly.blogspot.com/">Peter N. M. Hansteen</a>
+on <time datetime="2018-01-09T06:17:51Z">2018-01-09</time>
+from the check-my-senders dept.</p>
+</header>
+<div class="story_text">
+If you run a mail service, you probably like to have greylisting in place, via <a href="https://man.openbsd.org/spamd">spamd(8)</a> or similar means. However, there are some sites that simply do not play well with greylisting, and for those it's useful to extract <a href="https://en.wikipedia.org/wiki/Sender_Policy_Framework">SPF</a> information to identify their valid outgoing SMTP hosts.
+<p>
+Now OpenBSD offers a straightforward mechanism to do that and fill your nospamd table, right from the <a href="https://man.openbsd.org/smtpctl">smtpctl</a> utility via the subcommand <tt>spf walk</tt>. Gilles Chehade (gilles@) describes how in a recent blog post titled <a href="https://poolp.org/posts/2018-01-08/spfwalk/">spfwalk</a>.
+<p>
+This feature is still in need of testing, so please grab a snapshot and test!
+<p>
+
+</div>
+
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20180109082916">1 comment (13d17:00 ago)</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20180106082238">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20180106082238">Response to the &quot;Meltdown&quot; Vulnerability</a></h1>
+<p class="attrib">Contributed by
+<a href="http://www.openbsdfoundation.org/donations.html">rueda</a>
+on <time datetime="2018-01-06T06:27:49Z">2018-01-06</time>
+from the moronoculture dept.</p>
+</header>
+<div class="story_text">
+<p>A
+<a href="https://marc.info/?l=openbsd-tech&amp;m=151521435721902">message to <kbd>tech@</kbd></a>
+from Philip Guenther (<kbd>guenther@</kbd>) provides the first public
+information from developers regarding the OpenBSD response to the recently
+announced
+<a href="https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html"><abbr>CPU</abbr> vulnerabilities</a>:
+<blockquote><pre>So, yes, we the OpenBSD developers are not totally asleep and a handful of
+us are working out how to deal with Intel's fuck-up aka the Meltdown
+attack. While we have the advantage of less complexity in this area (e.g.,
+no 32bit-on-64bit compat), there's still a pile of details to work through
+about what has to be *always* in the page tables vs what can/should/must be
+hidden.</pre>
+</blockquote>
+<p><a href="https://marc.info/?l=openbsd-tech&amp;m=151521435721902">Read it</a>
+and weep&hellip;</p>
+
+</div>
+
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20180106082238">2 comments (15d13:10 ago)</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20171229080944">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20171229080944">BSDCAN2017 Interview with Peter Hessler, Reyk Floeter, and Henning Brauer</a></h1>
+<p class="attrib">Contributed by
+<a href="http://www.openbsdfoundation.org/donations.html">rueda</a>
+on <time datetime="2017-12-29T03:51:20Z">2017-12-29</time>
+from the Oxford comma dept.</p>
+</header>
+<div class="story_text">
+<p>In a
+<a href="https://marc.info/?l=openbsd-misc&amp;m=151450488816852">message to <kbd>misc@</kbd></a>,
+Tom Smyth wrote (in part):</p>
+<blockquote><pre>While attending BSDCAN2017 in Ottawa I met many OpenBSD Developers,
+and I was fortunate to grab a few moments and video an interview
+with Peter Hessler, Henning Brauer and Reyk Floeter and talk to
+them about OpenBSD generally,
+I really appreciate the guys generosity in their time on the
+interview
+I have posted the video here
+<a href="https://www.youtube.com/watch?v=e-Xim3_rJns">https://www.youtube.com/watch?v=e-Xim3_rJns&amp;feature=youtu.be</a>
+</pre></blockquote>
+<p>Nice work, Tom!</p>
+
+</div>
+
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20171229080944">No comments</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20171208082246">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20171208082246"><kbd>pledge()</kbd> work in progress</a></h1>
+<p class="attrib">Contributed by
+<a href="http://www.openbsdfoundation.org/donations.html">rueda</a>
+on <time datetime="2017-12-08T08:22:46Z">2017-12-08</time>
+from the (the) man on pledge dept.</p>
+</header>
+<div class="story_text">
+<p>In a
+<a href="https://marc.info/?l=openbsd-tech&amp;m=151268831628549">message to <kbd>tech@</kbd></a>,
+Theo de Raadt (<kbd>deraadt@</kbd>) provided some insights into ongoing
+work on <a href="https://man.openbsd.org/pledge.2"><kbd>pledge(2)</kbd></a>:</p>
+<blockquote><pre>
+I wanted to give an update that a two pledge-related changes are being
+worked on. The semantics and integration are complicated so it is
+taking some time.
+</pre></blockquote>
+
+</div>
+<p><a href="/cgi?action=article;sid=20171208082246">Read more&hellip;</a></p>
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20171208082246">No comments</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20171208082238">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20171208082238"><kbd>arm64</kbd> platform now officially supported [and has <kbd>syspatch(8)</kbd>]</a></h1>
+<p class="attrib">Contributed by
+<a href="http://www.openbsdfoundation.org/donations.html">rueda</a>
+on <time datetime="2017-12-08T08:22:38Z">2017-12-08</time>
+from the not so armless dept.</p>
+</header>
+<div class="story_text">
+<p><a href="https://www.openbsd.org/arm64.html"><kbd>arm64</kbd></a> is now an
+officially supported platform for OpenBSD.
+As some readers will have <a href="https://fastly.cdn.openbsd.org/pub/OpenBSD/syspatch/6.2/arm64/">noticed</a>,
+there's now
+<a href="https://man.openbsd.org/syspatch.8"><kbd>syspatch(8)</kbd></a> support, too.</p>
+<p>Theo de Raadt (<kbd>deraadt@</kbd>) committed the following change:</p>
+<blockquote><pre>
+CVSROOT: /cvs
+Module name: www
+Changes by: deraadt@cvs.openbsd.org 2017/12/07 12:00:12
+
+Modified files:
+ . : plat.html
+
+Log message:
+graduate arm64 to supported; having syspatch it is even beyond some other systems
+</pre></blockquote>
+
+</div>
+
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20171208082238">5 comments (43d8:52 ago)</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20171205045703">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20171205045703">s2k17 Hackathon Report: Stefan Sperling (stsp@) on wireless (iwm(4), athn(4) and more) progress</a></h1>
+<p class="attrib">Contributed by
+<a href="http://bsdly.blogspot.com/">Peter N. M. Hansteen</a>
+on <time datetime="2017-12-05T04:57:03Z">2017-12-05</time>
+from the snowshoe puffy dept.</p>
+</header>
+<div class="story_text">
+<blockquote>
+I could not travel to the Toronto t2k17 hackathon earlier this year,
+in circumstances which left me with a voucher for an already purchased
+intercontinental flight ticket and hiking clothes I had bought for
+a trip into the Canadian mountains.
+</blockquote>
+
+</div>
+<p><a href="/cgi?action=article;sid=20171205045703">Read more&hellip;</a></p>
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20171205045703">2 comments (44d4:30 ago)</a>
+</span></p>
+</div>
+</article>
+<article class="story" id="s20171126090055">
+<header class="story_item_hdr">
+<h1 class="story_subj"><a href="/cgi?action=article;sid=20171126090055">Reflections on Hackathons</a></h1>
+<p class="attrib">Contributed by
+Bob Beck
+on <time datetime="2017-11-26T09:00:55Z">2017-11-26</time>
+from the hacks from the wild dept.</p>
+</header>
+<div class="story_text">
+<p>Bob Beck (<kbd>beck@</kbd>) writes:</p>
+<blockquote>
+<p>So, I am sitting in my kitchen with a car packed full of food, packing up my last things
+and getting ready to drive south for a Hackathon. This one is a little different, since it is
+in a wilderness hut I have to hike/ski into.. If the hike doesn't kill me, living for 5 days inside
+a structure heated by wood where Germans are present to stoke the fire might. So here's
+a bit of a ramble about hackathons.</p>
+</blockquote>
+
+</div>
+<p><a href="/cgi?action=article;sid=20171126090055">Read more&hellip;</a></p>
+<div class="x_cmds_status">
+<p><span class="x_cmds"><a href="/cgi?action=article;sid=20171126090055">5 comments (54d18:03 ago)</a>
+</span></p>
+</div>
+</article>
+
+
+</div>
+<div id="extras">
+
+<div class="extra">
+<h2>Donate!</h2>
+<p>Donate to <a href="http://www.openbsd.com/donations.html">OpenBSD</a></p>
+</div>
+
+<div class="extra">
+<h2>Features</h2>
+<p>We are constantly on the lookout for stories of how you put OpenBSD to work.
+Please submit any informative articles on how OpenBSD is helping your company.</p>
+</div>
+
+<div class="extra">
+<h2>Earlier Articles</h2>
+<ul><li><time datetime="2017-11-20">Mon, Nov 20</time><ul><li><b><time datetime="2017-11-20T07:59:03Z">07:59</time></b>
+<a href="/cgi?action=article;sid=20171120075903">p2k17 Hackathon report: Antoine Jacoutot on ports+packages progress</a>
+(2)</li>
+</ul></li>
+<li><time datetime="2017-11-18">Sat, Nov 18</time><ul><li><b><time datetime="2017-11-18T19:03:25Z">19:03</time></b>
+<a href="/cgi?action=article;sid=20171118190325">Official OpenBSD 6.2 CD set - the only one to be made!</a>
+(7)</li>
+</ul></li>
+<li><time datetime="2017-11-13">Mon, Nov 13</time><ul><li><b><time datetime="2017-11-13T23:53:34Z">23:53</time></b>
+<a href="/cgi?action=article;sid=20171113235334">p2k17 Hackathon report: Florian Obser on network stack progress, kernel relinking and more</a>
+(3)</li>
+<li><b><time datetime="2017-11-13T09:18:07Z">09:18</time></b>
+<a href="/cgi?action=article;sid=20171113091807">p2k17 Hackathon Report: Landry Breuil on Mozilla things and much more</a>
+(4)</li>
+</ul></li>
+<li><time datetime="2017-11-10">Fri, Nov 10</time><ul><li><b><time datetime="2017-11-10T12:46:56Z">12:46</time></b>
+<a href="/cgi?action=article;sid=20171110124656">p2k17 Hackathon Report: Anthony J. Bentley on firmware, games and securing pkg_add runs</a>
+(2)</li>
+<li><b><time datetime="2017-11-10T12:46:45Z">12:46</time></b>
+<a href="/cgi?action=article;sid=20171110124645">p2k17 Hackathon report: Sebastian Reitenbach on Puppet progress</a>
+(0)</li>
+</ul></li>
+<li><time datetime="2017-11-09">Thu, Nov 09</time><ul><li><b><time datetime="2017-11-09T17:14:47Z">17:14</time></b>
+<a href="/cgi?action=article;sid=20171109171447">p2k17 Hackathon report: Christian Weisgerber on random devices, build failures and gettext</a>
+(4)</li>
+</ul></li>
+<li><time datetime="2017-11-08">Wed, Nov 08</time><ul><li><b><time datetime="2017-11-08T07:21:17Z">07:21</time></b>
+<a href="/cgi?action=article;sid=20171108072117">p2k17 Hackathon report: Jeremy Evans on ruby progress, postgresql and webdriver work</a>
+(0)</li>
+</ul></li>
+<li><time datetime="2017-11-07">Tue, Nov 07</time><ul><li><b><time datetime="2017-11-07T22:52:58Z">22:52</time></b>
+<a href="/cgi?action=article;sid=20171107225258">Paul Irofti (pirofti@) on hotplugd(8), math ports, xhci(4) and other kernel advancements</a>
+(2)</li>
+</ul></li>
+</ul>
+
+</div>
+
+<div class="extra">
+<h2>OpenBSD Errata</h2>
+<p id="errata_vers"><i>OpenBSD 6.2</i></p>
+<table id="errata_tbl">
+<tr><td><a href="https://www.openbsd.org/errata62.html#p004_libssl"><span class="erratum_num">004</span></a></td><td><span class="erratum_date">2018-01-14</span> <span class="erratum_kind">RELIABILITY</span> <span class="erratum_desc">An incorrect TLS extensions block is generated when no extensions are present, which can result in handshake failures. </span></td></tr>
+<tr><td><a href="https://www.openbsd.org/errata62.html#p003_mpls"><span class="erratum_num">003</span></a></td><td><span class="erratum_date">2017-12-10</span> <span class="erratum_kind">RELIABILITY</span> <span class="erratum_desc">A number of bugs were discovered in the MPLS stack that can be used to remotely trigger kernel crashes. </span></td></tr>
+<tr><td><a href="https://www.openbsd.org/errata62.html#p002_fktrace"><span class="erratum_num">002</span></a></td><td><span class="erratum_date">2017-12-01</span> <span class="erratum_kind"><strong class="security_erratum">SECURITY</strong></span> <span class="erratum_desc">The fktrace(2) system call had insufficient security checks.</span></td></tr>
+<tr><td><a href="https://www.openbsd.org/errata62.html#p001_tcb_invalid"><span class="erratum_num">001</span></a></td><td><span class="erratum_date">2017-10-13</span> <span class="erratum_kind">RELIABILITY</span> <span class="erratum_desc">A local user could trigger a kernel panic by using an invalid TCB value.</span></td></tr>
+</table>
+
+<p><a href="/errata/errata.rss"><img src="images/xml.gif" alt="Unofficial RSS feed of OpenBSD errata"></a></p>
+</div>
+
+<div class="extra">
+<h2>OpenBSD Resources</h2>
+<ul>
+<li><a href="http://openports.se">OpenBSD Ports Tracker</a></li>
+<li><a href="http://www.onlamp.com/bsd/">OReilly BSD DevCenter</a></li>
+<li><a href="http://daemonforums.org/">OpenBSD discussions</a></li>
+<li><a href="http://hup.hu/taxonomy/term/67">Hungarian OpenBSD news</a></li>
+<li><a href="http://bsdforums.unixro.net/forum/16">Romanian OpenBSD Discussions</a></li>
+<li><a href="http://obsd.ru/">Russian OpenBSD community</a></li>
+</ul>
+</div>
+
+<div class="extra">
+<h2><abbr>XML</abbr>/<abbr>RSS</abbr>/<abbr>RDF</abbr></h2>
+<p>Users wishing <abbr>RSS</abbr>/<abbr>RDF</abbr> summary files of <em>OpenBSD Journal</em>
+can retrieve: <a href="/cgi?action=rss"><img src="images/xml.gif" alt="RSS feed"></a></p>
+</div>
+
+<div class="extra">
+<h2>Credits</h2>
+<p id="credits">Copyright &copy;
+<time datetime="2004">2004</time>-<time datetime="2008">2008</time>
+<a href="http://www.benzedrine.ch/dhartmei.html">Daniel Hartmeier</a>.
+All rights reserved.
+Articles and comments are copyright their respective authors,
+submission implies license to publish on this web site.
+Contents of the archive prior to
+<time datetime="2004-04-02">April 2nd 2004</time> as well as images
+and HTML templates were copied from the fabulous original
+<a href="http://web.archive.org/web/20010331150409/http://deadly.org/">deadly.org</a> with
+<a href="http://monkey.org/~jose">Jose</a>'s and
+<a href="mailto:jamesp@deadly.org">Jim</a>'s kind permission.
+This journal runs as <abbr>CGI</abbr> with
+<a href="https://man.openbsd.org/httpd.8">httpd(8)</a>
+on <a href="https://www.openbsd.org/">OpenBSD</a>, the
+<a href="/src/">source code</a> is
+<a href="http://www.opensource.org/licenses/bsd-license.php">BSD licensed</a>.
+undeadly \Un*dead"ly\, a. Not subject to death; immortal. [Obs.]</p>
+
+</div>
+
+</div>
+</main>
+
+</body>
+</html>