Модуль:Дорожная карта

Материал из Справочника наблюдателя
Перейти к:навигация, поиск

(i)      Описание модуля[]

Документация отсутствует!


local p = {}

local family = 'Дорожная карта'
local tab  = mw.loadData( 'Модуль:' .. family .. '/Параметры')
local billModule = require ('Модуль:Ссылки на закон')

local function defValue ( val, def)
	if (val or '') == '' then
		return def
	end
	return val
end


function tableFlip (x)
	if x then
		local y = {}
		for k, v in pairs (x) do
			y [mw.text.trim(tostring(v))] = mw.text.trim(tostring(k))
		end
		return y
	end
end


function prostr (fedNo, code)
	if code == true then
		return fedNo
	end
	local n1 = tab.regions [code[1]].strpr [fedNo]
	local n2
	if  #code == 1 then
		n2 = n1
	elseif #code == 2 then
		n2 = tab.regions [code[2]].strpr [fedNo]
	else --  #code > 2
		for i = 2, #code do
			if tab.regions [code[i]].strpr [fedNo] ~= n1 then
				n2 = 1
				break
			end
		end
		if n2 then
			n1,n2 = nil,nil
		end
	end
	local res
	if not n1 then
		res = '<span class="rm-nonumber">' .. fedNo .. '</span>'
	else
		res = n1
	end
	if n2 ~= n1 then
		if not n2 then
			res = res .. '/<span class="rm-nonumber">' .. fedNo .. '</span>'
		else
			res = res .. n2
		end
	end
	return res
end


function checkMarker (s)
	return mw.ustring.gsub (s, '%(/(.-)/%)', '<span class="rm-marker">[<span>%1</span>]</span>')
end

function addBill (view, textPara, code, link, addl, addc, sect, subs)
	return billModule.parseBill (textPara, code, addc, sect, subs, view == 'Экран', link, addl, checkMarker)
--[==[
	if (textPara or '') == '' then
		return nil
	end
	if not addl then
		addl = ':Статья '
	end
	if not addc then
		addc = 'ст.'
	end
	local testA, testS = mw.ustring.match (textPara, '^%s*(%d[%d%.%-−]+)%s*:([^,;]+)$')
	if testA then
		textPara = '<_' .. testA .. ':' .. mw.ustring.gsub (testS, '%+', ', ') .. '_>'
	else
		testA = mw.ustring.match (textPara, '^%s*(%d[%d%.%-−]+)%s*$')
		if testA then
			textPara = '<_' .. testA .. '_>'
		end
	end
	if view ~= 'Экран' then
		textPara = mw.ustring.gsub (textPara , '<_([^#][^:]-)_>', addc .. '&nbsp;%1')
		textPara = mw.ustring.gsub (textPara, '<_([^#][^:]-):%s*(%d[^:]-)_>', sect .. '&nbsp;%2&nbsp;' .. addc .. '&nbsp;%1')
		textPara = mw.ustring.gsub (textPara, '<_([^#][^:]-):%s*(%d[^:]-):%s*([^:]-)_>', subs .. '&nbsp;%3&nbsp;' .. sect .. '&nbsp;%2&nbsp;' .. addc .. '&nbsp;%1')
		textPara = mw.ustring.gsub (textPara, '<_([^#][^:]-):(.-)_>', '%2&nbsp;' .. addc .. '&nbsp;%1')
	else
		textPara = mw.ustring.gsub (textPara , '<_([^#][^:]-)_>', '[[' .. link .. addl .. '%1|' .. addc .. '&nbsp;%1]]')
		textPara = mw.ustring.gsub (textPara, '<_([^#][^:]-):%s*(%d[^:]-)_>', '[[' .. link .. addl .. '%1|' .. sect .. '&nbsp;%2&nbsp;' .. addc .. '&nbsp;%1]]')
		textPara = mw.ustring.gsub (textPara, '<_([^#][^:]-):%s*(%d[^:]-):%s*([^:]-)_>', '[[' .. link .. addl .. '%1|' .. subs .. '&nbsp;%3&nbsp;' .. sect .. '&nbsp;%2&nbsp;' .. addc .. '&nbsp;%1]]')
		textPara = mw.ustring.gsub (textPara, '<_([^#][^:]-):(.-)_>', '[[' .. link .. addl .. '%1|%2&nbsp;' .. addc .. '&nbsp;%1]]')
	end
	return '<b>' .. code .. ':</b>&nbsp;' .. checkMarker (textPara)
--]==]
end

------------------------------------------------------------------- Формирование
-- Функция вызывается из основного шаблона [[Шаблон:Дорожная карта]] и
-- использует его параметры.
-- * Выполняет нормализацию параметров
-- * При вызове с параметром «вид=Экран» возвращает URL экранной формы (вызов
--   страницы [[Избирательная кампания/Дорожная карта]] с параметрами в URL
-- * При вызове с параметрами вид=(формат печати) заказывает a2f и
--   возвращает текст, содержащий ссылку на экранную форму и версию для печати.
--------------------------------------------------------------------------------

p ['Формирование'] = function (frame)
	local gArgs = frame:getParent ().args
	-- тип --
	local countMethod = mw.ustring.lower(defValue (gArgs['тип'], 'ручной'))
	if not tab.methods [countMethod] then
		return 'Ошибка: недопустимое значение параметра «тип»'
	elseif type (tab.methods [countMethod]) == 'string' then
		countMethod = tab.methods [countMethod]
	end
	-- место, регион --
	local pageName = mw.title.getCurrentTitle().baseText
--[==[
	local pageCity, pageReg, pageDate = mw.ustring.match (pageName, '^(.+) %((.+)%)%, (%d%d%.%d%d%.%d%d%d%d)$')
	if not pageCity then
		pageCity, pageDate = mw.ustring.match (pageName, '^(.+)%, (%d%d%.%d%d%.%d%d%d%d)$')
		pageReg = ''
	end

	local city = defValue (gArgs ['место'], pageCity or '_')
	local reg = defValue (gArgs ['регион'], pageReg or '')
	-- дата --
	local vDate = defValue (gArgs ['дата'], pageDate or '')
	local d,m,y =  mw.ustring.match (vDate, '^(%d%d)%.(%d%d)%.(%d%d%d%d)$')
	if d then
		local months = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'}
		d = tonumber (d)
		m = months [tonumber(m)]
		y = tonumber (y)
		vDate = d .. ' ' .. m .. ' ' .. y  .. ' года'
	end
--]==]
	local city, reg, vDate = '-', '-', '-'
	-- код --
	local code = defValue (gArgs ['код'], 'все')
	-- кампаний --
	local campCount = tonumber (gArgs ['кампаний'] or 1) or 1
	if campCount < 1 then
		campCount = '1'
	end
	-- округов --
	local constCount = gArgs ['округов'] or ''
	if constCount == 'нет' or constCount == '1' then
		constCount = ''
	end
	-- твиттер --
	local twitter = defValue (gArgs ['твиттер'], 'выборы')
	twitter = mw.ustring.gsub (twitter, '#', '')
	-- вид --
	local view = mw.ustring.lower (defValue (gArgs ['вид'], 'Экран'))
	view = mw.ustring.upper (mw.ustring.sub (view,1,1)) .. mw.ustring.sub (view,2,-1)
	if view == 'Нет' then
		view = 'Экран'
	end
	if not tab.views[view] then
		return 'Ошибка: несуществующий вид печатной формы: ' .. view
	end

	local res = tostring (mw.uri.fullUrl( 'Избирательные кампании/' .. family , 'code=' .. code .. '&method=' .. countMethod .. '&flags=' .. (gArgs ['условия'] or '') .. '&view=Экран'))
	if view ~= 'Экран' then
		local label = defValue (gArgs ['метка'], view .. ', ' .. tab.methods [countMethod].file)
		res = '[' .. res .. ' ' .. label .. ']' .. frame:callParserFunction{ name = '#a2f',
				args = { 'Избирательные кампании/' .. family .. '/Файл doc/pattern',
						pageName .. '/' .. city .. '!' .. reg .. '!' .. vDate .. '!' .. code .. '!' .. campCount .. '!' .. (gArgs ['кандидатов'] or '') .. '!' .. view .. '!' .. constCount .. '!' .. countMethod
								 .. '!' .. (gArgs ['условия'] or '') .. '!' .. twitter .. '!' .. (gArgs ['смс'] or ''),
						pageName .. ' [' .. label .. '].doc'
						} }
		res = res .. ' ([http://www.nablawiki.ru/images/ArticleToFile/'
			..  mw.uri.encode(pageName .. ' [' .. label .. '].doc', 'PATH')
			.. ' версия для печати])'
			.. ' [[Категория:Страницы, формирующие дорожные карты]]'
	end
	return res
end

---------------------------------------------------- Формирование печатной формы
-- Вызов этой функции с параметром {{FULLPAGENAME}} должен являться единственным
-- содержимым страницы «Избирательные кампании/Дорожная карта/Файл doc/pattern»,
-- которая вызывается срабатыванием a2f. Параметр (имя страницы) определяется
-- заказом a2f, там в единую строку собраны все входные параметры.
-- Выполняет вызов страницы «Избирательные кампании/Дорожная карта/Файл doc/
-- pattern/имя-печатной формы» со всеми параметрами
--------------------------------------------------------------------------------

--		Формат заголовка страницы
--		1                 2            3             4           5          6               7                 8          9             10         11             12             13
--		{{BASEPAGENAME}}/{{{место|}}}!{{{регион|}}}!{{{дата|}}}!{{{код|}}}!{{{кампаний|}}}!{{{кандидатов|}}}!{{{вид|}}}!{{{округов|}}}!{{{тип|}}}!{{{условия|}}}!{{{твиттер|}}}!{{{смс}}}
--		BASEPAGENAME должно относиться к странице «кампания/Дорожная карта» (либо к ее включению на странице кампании), поэтому можно
--		считать, что там также содержится «место, дата» либо «место (регион), дата».

p ['Формирование печатной формы'] = function (frame)
	local basePageName, headerCity, headerReg, headerDate, headerCode, headerCampCount, headerCandCount, headerView, headerConstCount, headerMethod, headerFlags, twitter, sms =
											mw.ustring.match (frame.args[1], '^([^/]+)/([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!([^!]*)$')
	if not tab.views[headerView] or headerView == 'Экран' then
		return 'Неверные параметры! «' .. frame.args[1] .. '»: ' .. headerView
	end;
	-- разбор места и даты делается только здесь, потому что иначе заголовок страницы превосходит ограничение Mediawiki в 255 байтов

	-- место, регион --
	headerCity, headerReg, headerDate = mw.ustring.match (basePageName, '^(.+) %((.+)%)%, (%d%d%.%d%d%.%d%d%d%d)$')
	if not headerCity then
		headerCity, headerDate = mw.ustring.match (basePageName, '^(.+)%, (%d%d%.%d%d%.%d%d%d%d)$')
		headerReg = ''
	end
	if not headerCity then
		headerCity, headerReg, headerDate = '_', '', ''
	end
	-- дата --
	local d,m,y =  mw.ustring.match (headerDate, '^(%d%d)%.(%d%d)%.(%d%d%d%d)$')
	if d then
		local months = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'}
		d = tonumber (d)
		m = months [tonumber(m)]
		y = tonumber (y)
		headerDate = d .. ' ' .. m .. ' ' .. y  .. ' года'
	end


	-- Вызываем pattern печатной формы нужного вида, передаем все параметры — это залог их глобальности
	return frame:expandTemplate {title = ':Избирательные кампании/' .. family .. '/Файл doc/pattern/' .. (tab.views [headerView].redirect or headerView),
		args = {headerCity=headerCity, headerReg=headerReg, headerDate=headerDate, code=headerCode, headerCampCount=headerCampCount,
						headerCandCount=headerCandCount, method=headerMethod, headerConstCount=headerConstCount, view=headerView, flags=headerFlags, twitter=twitter, sms=sms }}
end


--[[	Функция вызывается со страницы
		«Избирательные кампании/Дорожная карта (х)/Файл doc/pattern/Компактная»
		К моменту вызова функции уже сформированы все html-заголовки вплоть до
		<body> и главного div, определяющего печатный формат страницы.
]]

p ['Шапка компактной формы'] = function (frame)
	local gArgs = frame:getParent ().args
	countMethod = tab.methods [gArgs.method].name
	local headerCity, headerDate  = gArgs.headerCity, gArgs.headerDate
	if headerCity == '' then
		headerCity = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
	end
	if headerDate == '' then
		headerDate = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
	end
	local a, b = mw.ustring.match (headerDate, '^(.+ .+) (20.. года)$')
	if b then
		headerDate = a .. '<br>' .. b
	end
	local res = [[
      <table class="nwrm-hdr">
        <tr>
          <td class="nwrm-hdr-title">ДОРОЖНАЯ КАРТА</td>
          <td class="nwrm-hdr-space">&nbsp;</td>
          <td class="nwrm-hdr-date">]] .. headerDate .. [[</td>
          <td class="nwrm-hdr-space">&nbsp;</td>
          <td class="nwrm-hdr-city">]] .. headerCity .. '<span class="nwrm-hdr-reg"><br>' .. gArgs.headerReg .. '</span></td>'

	if gArgs.headerConstCount ~= '' then
		res = res .. [[
          <td class="nwrm-hdr-space">&nbsp;</td>
          <td class="nwrm-hdr-constituency">№ округа</td>]]

	end

	res = res .. [[
          <td class="nwrm-hdr-space">&nbsp;</td>
          <td class="nwrm-hdr-district">№ УИК</td>
        </tr>
      </table>
      <table class="rm-2col">
        <tr>
          <td><p class="nwrm-hdr-c">&nabla; <i>nablawiki.ru, 2020.&nbsp;  Концепция  К−З−К, 2012</i></p></td>
          <td><p class="nwrm-hdr-type">]] .. countMethod ..[[</p></td>
        </tr>
      </table>
]]
	return res
end

--[[	Функция вызывается со страницы
		«Избирательные кампании/Дорожная карта (х)/Файл doc/pattern/Блокнот»
		   ((( !!!!  это не так, все берем из parent frame
		с передачей всех параметров, сформированных для этой страницы функцией
		'Формирование печатной формы'. Имена параметров следует согласовать
		с параметрами исходного шаблона («Шаблон:Дорожная карта (3)/Печатная форма»,
		который нужно переименовать в просто «Дорожная карта (х)»).
		       !!!!  )))
		К моменту вызова функции уже сформированы все html-заголовки вплоть до
		<body> и, возможно, главных div, определяющих формат страницы.
]]

p ['Шапка блокнота'] = function (frame)
	local gArgs = frame:getParent ().args
	countMethod = tab.methods [gArgs.method].name
	local headerCity, headerReg, headerDate  = gArgs.headerCity, gArgs.headerReg, gArgs.headerDate

	if headerCity == '' then
		headerCity, headerReg = headerReg, ''
	end

	if headerDate == '' then
		headerDate = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
	end

	return [[
<table class="nwrm-hdr"><tr><td>
<p class="nwrm-hdr-title">«ДОРОЖНЫЙ БЛОКНОТ»</p>
<p class="nwrm-hdr-subtitle1">общественного контролёра в участковой избирательной комиссии</p>
<p class="nwrm-hdr-subtitle2">(наблюдателя, представителя СМИ, члена УИК с правом совещательного голоса)</p>
<p class="nwrm-hdr-city">]] .. headerCity .. [[</p>
<p class="nwrm-hdr-reg">]] .. headerReg .. [[</p>
<p class="nwrm-hdr-date">]] .. headerDate .. [[</p>
<p class="nwrm-hdr-type">]] .. countMethod ..[[</p>
</td></tr></table>
<div style="text-align:left; ">
<p class="rm-blockName">Личные данные:</p>
<table style="width:61%; 	border-collapse: collapse; "><tr><td class="nwrm-hdr-anketa">Фамилия:&nbsp;  </td><td style="border-bottom: 0.25pt solid black; width:100%">&nbsp;</td></tr></table>
<table style="width:61%; 	border-collapse: collapse; "><tr><td class="nwrm-hdr-anketa">Имя:&nbsp;      </td><td style="border-bottom: 0.25pt solid black; width:100%">&nbsp;</td></tr></table>
<table style="width:61%; 	border-collapse: collapse; "><tr><td class="nwrm-hdr-anketa">Отчество:&nbsp; </td><td style="border-bottom: 0.25pt solid black; width:100%">&nbsp;</td></tr></table>
<table style="width:61%; 	border-collapse: collapse; "><tr><td class="nwrm-hdr-anketa">Мобильный&nbsp;телефон:&nbsp; </td><td td style="text-align:right; ">&nbsp;</td><td class="nwrm-hdr-anketa">+7 ( __ __ __ ) __ __ __  — __ __ — __ __</td></tr></table>
<p class="rm-blockName">Место наблюдения:</p>
<table style="width:100%; 	border-collapse: collapse; "><tr><td class="nwrm-hdr-anketa">Район,&nbsp;населенный&nbsp;пункт:&nbsp; </td><td style="border-bottom: 0.25pt solid black; width:100%">&nbsp;</td></tr></table>
<table style="border-collapse: collapse; "><tr><td class="nwrm-hdr-anketa">Номер избирательного участка:&nbsp; </td><td>__ __ __ __</td></tr></table>
</div>
<p class="rm-pagebreak">&nbsp;</p>
]]
end


--[[Функция работает на основную (хронологическую) таблицу для компактной, новой и экранной форм.
]]

p ['Заголовок основной таблицы'] = function (frame)
	local gArgs = frame:getParent ().args
	local view = gArgs.view
	local rowspan = ' rowspan=2'
	if view =='Новая' then
		rowspan = ''
	end

	local res = [[
      <table class="rm">
        <tr>
          <th]] .. rowspan .. [[><p class="rmp-th">Контролируемое событие</p></th>
]]
	if gArgs.view ~= 'Экран' then
		res = res .. [[
	      <th]] .. rowspan .. [[><p class="rmp-th">кол-во/<br>время</p></th>
]]
	end
	if gArgs.view == 'Компактная' then
		res = res .. [[
          <th]] .. rowspan .. [[><p class="rmp-th">да</p></th>
          <th]] .. rowspan .. [[><p class="rmp-th">нет</p></th>
]]
	end
	if gArgs.view ~= 'Новая' then
		res = res .. [[
          <th colspan=2 style="border-bottom:0; "><p class="rmp-th" style="text-align:right; ">Куда писать жалобу</p></th>
]]
	else
		res = res .. [[
          <th ><p class="rmp-th">Каким законом установлено</p></th>
]]
	end
	res = res .. [[
          <th]] .. rowspan .. [[><p class="rmp-th">Норма об отв-сти</p></th>
]]

	if gArgs.view == 'Экран' then
		res = res .. [[
	      <th]] .. rowspan .. [[><p class="rmp-th">Полезные ссылки</p></th>
]]
	end
	if gArgs.view ~= 'Новая' then
		res = res .. [[
        </tr>
        <tr>
          <th ><p class="rmp-th">Каким законом установлено</p></th>
          <th style="border-top:0"><p class="rmp-th">&nbsp;</p></th>
]]
	end
	return res .. [[
        </tr>
]]

end

--[[Функция работает на основную (хронологическую) таблицу для компактной и новой форм.
]]

p ['Завершение основной таблицы'] = function (frame)
	local gArgs = frame:getParent ().args
	local view = gArgs.view
	local res = [[
        <tr>
          <td class="rm-constrLabel">&alpha;</td>
          <td>&nbsp;</td>
]]
	if view == 'Компактная' then
		res = res .. [[
          <td>&nbsp;</td>
          <td>&nbsp;</td>
]]
	end
	res = res .. [[
          <td class="rm-constrLabel">&beta;</td>
]]
	if view == 'Компактная' then
		res = res .. [[
          <td class="rm-constrLabel-small">&gamma;</td>
]]
	end
	return res .. [[
          <td class="rm-constrLabel">&delta;</td>
        </tr>
      </table><!-- Покончили с главной таблицей -->
      <p class="rm-text">&alpha;, &beta;, &gamma;, &delta; — метки для «Конструктора жалоб» (см. последнюю страницу).</p>
      <p class="rm-text">&nbsp;</p>
]]

end

p ['Заголовок таблицы хардкора'] = function (frame)
	local gArgs = frame:getParent ().args
	local view = gArgs.view
	local res = [[
            <table class="rm">
              <tr>
                <td class="rm-constrLabel">&alpha;</td>
                <td class="rm-constrLabel">&beta;</td>
]]
	if view == 'Компактная' then
		res = res .. [[
              <td class="rm-constrLabel-small">&gamma;</td>
]]
	end
	return res .. [[
              <td class="rm-constrLabel">&delta;</td>
            </tr>
]]
end



--[[Функция работает на основную (хронологическую) таблицу для блокнота.
]]

p ['Заголовок основной таблицы блокнота'] = function (frame)
	return '<table class="rm">'
end

--------------------------------------------------------------------------------
-- Формирование заголовка раздела

p ['Раздел'] = function (frame)
	local ownArgs = frame.args
	local gArgs = frame:getParent().args
	local code, method, view, flags, chapter = gArgs.code, gArgs.method, gArgs.view, gArgs.flags, gArgs.chapter

	if not tab.methods [method].incC then
		return ''
	end
	if view ~= 'Блокнот' then
		return '        <tr>\n          <td class="rm-section" colspan=' .. tab.views[view].cols .. '><p  class="rmp-section">' .. ownArgs [1] .. '</p></td>\n        </tr>\n'
	else
		return [[
        <tr  style="page-break-inside: avoid; ">
  	      <td class="rm-section" colspan=]] .. tab.views[view].cols .. '><p  style="page-break-after:avoid; "><span class="rm-section-t">&nbsp;' .. mw.text.trim (ownArgs [1]) .. [[.&nbsp;</span></p></td>
        </tr>
        <tr style="page-break-inside: avoid; ">
          <th rowspan=2 ><p  style="page-break-after:avoid; ">№</p></th>
          <th rowspan=2 ><p  style="page-break-after:avoid; ">Действие или событие</p></th>
          <th rowspan=2 ><p  style="page-break-after:avoid; ">Да?</p></th>
          <th colspan=2 style="text-align:right; border-bottom:0; "><p  style="page-break-after:avoid; ">Комиссия, куда жаловаться</p></th>
          <th rowspan=2 ><p  style="page-break-after:avoid; ">Ответственность</p></th>
        </tr>
        <tr>
          <th ><p  style="page-break-after:avoid; ">Норма</p></th>
          <th style="border-top:0"><p  style="page-break-after:avoid; ">&nbsp;</p></th>
        </tr>
]]
	end
end



--------------------------------------------------------------------------------
-- Формирование заголовка ветвления

p ['Ветка'] = function (frame)
	local ownArgs = frame.args
	local gArgs = frame:getParent().args
	local code, method, view, flags, chapter = gArgs.code, gArgs.method, gArgs.view, gArgs.flags, gArgs.chapter
	local forMethod = mw.text.trim (mw.ustring.lower (ownArgs [1]))
	local txt  = mw.text.trim (ownArgs [2])
	local class
	if not code then
		return '<b>(' .. ownArgs[1] .. ') ' .. ownArgs[2] .. '</b><br>'
	end
	if forMethod == 'коиб' then
		if tab.methods[method].incK == 1 then
			class = 'outside'
			txt = 'О действиях при наличии КОИБ см. раздел «' .. txt .. '» на вкладыше'
		elseif (tab.methods[method].incK == 3)  and  not tab.methods[method].incC  then
			class = 'section'
			txt = txt .. ' (КОИБ)'
		else
			return nil
		end
	elseif forMethod == 'ручной' then
		if tab.methods[method].incM == 1 then
			class = 'outside'
			txt = 'О действиях при ручном подсчете см. раздел «' .. txt .. '» на вкладыше'
		elseif tab.methods[method].incM == 3  and  not tab.methods[method].incC then
			class = 'section'
			txt = txt .. ' (ручной подсчет)'
		else
			return nil
		end
	else
		class = 'section'
		txt = 'НЕВЕРНОЕ УКАЗАНИЕ СПОСОБА ПОДСЧЕТА ДЛЯ ВЕТВЛЕНИЯ: «' .. ownArgs [1] .. '»!'
	end
	return [[
        <tr>
          <td class="rm-]] .. class .. [[" colspan=]] .. tab.views[view].cols .. [[><p class="rmp-]] .. class ..[[">]] .. txt .. [[</p></td>
        </tr>
]]
end



--------------------------------------------------------------------------------
-- Формирование основной строки таблицы
-- Передаваемые параметры:
---- событие=Событие
---- совет=Совет
---- если=список-условий
---- для=список-кодов
---- кроме=список-кодов
---- дляКОИБ=тоже/нет/текст


p ['Строка'] = function (frame)

	local ownArgs = frame.args
	local gArgs = frame:getParent().args
	local code, method, view, flags, chapter = gArgs.code, gArgs.method, gArgs.view, gArgs.flags, gArgs.chapter
	local univers
	function prostr1 (x)
		return prostr (x, univers or code)
	end
	if not code then
		return ownArgs['событие'] .. '<br>'
	end

	local debugFlag = defValue (ownArgs ['debug'], nil)

-- разбираемся со статусом строки по отношению к КОИБ
-- дляКОИБ = (пусто) | нет | да
	local forkoib = ownArgs ['дляКОИБ'] or ''
	local koibLabel

	if (forkoib == '')  then
		if not tab.methods[method].incC then
			return ''
		end
	elseif forkoib == 'нет' then
		if tab.methods[method].incM < 2 then
			return ''
		end
		koibLabel = -1
	else -- значит, да!
		if tab.methods[method].incK < 2 then
			return ''
		end
		koibLabel = 1
	end
	-- с точки зрения КОИБ строка точно рисуется, с пометкой или без


	if code == 'все' then
		univers = true
		code = {}
		for k,v in pairs (tab.regions) do
			table.insert (code, k)
		end
		table.sort (code)
	elseif code == 'нет' then
		code = nil
	else
		code = mw.text.split (code, ',', true)
	end

	local codeSet
	if code then
		codeSet = tableFlip (code)
	end

	local forCode  = ownArgs ['для']
	if forCode == '' then
		forCode = nil
	end
	if forCode then
		if not codeSet then
			return '' -- нас интересуют только универсальные строки
		end
		forCode = mw.text.split (forCode, ',', true)
	end

	local forNoCode = ownArgs ['кроме']
	if forNoCode == '' then
		forNoCode = nil
	end
	if forNoCode then
		forNoCode = mw.text.split (forNoCode, ',', true)
	end

	if forCode and forNoCode then
		return 'Ошибка: либо туда, либо сюда :: ' .. ownArgs['событие']
	end

	if not univers then
		local yes
		if forCode then
			for i, val in ipairs (forCode) do
				if codeSet [mw.text.trim (val)] then
					yes = true
					break
				end
			end
		elseif forNoCode then
			for i, val in ipairs (forNoCode) do
				if codeSet [mw.text.trim (val)] then
					yes = true
					break
				end
			end
			yes = not yes
		else
			yes = true
		end

		if not yes then
			return -- не подходит
		end
	end

	-- строку надо показывать, если
	-- все указанные в forFlags условия выполняются (присутствуют во flags), или
	-- flags не указан и (ЗАМЕНЯЕМ НА "ИЛИ", т.к. даже ФЗГ имеет флаги) режим univers
	-- в forFlags значение может быть с минусом (отрицание)

	if flags == '' then -- если флаги не заданы, то берем флаги первого указанного региона
		flags = tab.regions [ code[1] or tab.fzgCode ].flags
	elseif flags == 'нет' then
		flags = ''
	end

	flags = mw.ustring.lower (flags)

	if flags == '' then
		flags = nil
	else
		flags = mw.text.split (flags, ',', true)
		flags = tableFlip (flags)
	end

	if flags ['доср-уик'] or flags ['доср-тик'] then
		flags ['доср'] = true
	end
	if flags ['доср'] or flags ['доср-ог'] or flags ['доср-цик'] then
		flags ['доср-все'] = true
	end


	local forFlags = ownArgs ['если']
	if forFlags == '' then
		forFlags = nil
	end
	if forFlags then
		forFlags = mw.text.split (mw.ustring.lower(forFlags), ',', true)
	end


	if flags and forFlags then
		if flags ['доср-уик'] or flags ['доср-тик'] then
			flags ['доср'] = true
		end
		local condName
		yes = true
		for i, val in ipairs (forFlags) do
			condName = mw.text.trim (val)
			if ( mw.ustring.sub (condName, 1, 1) == '-' and flags [mw.ustring.sub (condName, 2, -1)] )
				or ( mw.ustring.sub (condName, 1, 1) ~= '-' and not flags [condName] ) then
--				if condName == '-мм' then
--					return '<tr><td>ОБЛОМ ' .. mw.dumpObject( flags ) .. '</td></tr>'
--				end
				yes = false
				break
			end
		end
		if not univers and not yes then
			return -- должны выполняться все условия
		end
	elseif forFlags and not flags and not univers then
		return
	end

	-- по условиям проходим
	local outres = {}
	table.insert (outres, '        <tr style="page-break-inside: avoid; ">\n')
	if view == 'Блокнот' then
		local colorClass
		if koibLabel == -1 then
			colorClass = 'rm-manualNumber'
		elseif koibLabel == 1 then
			colorClass = 'rm-koibNumber'
		else
			colorClass = 'rm-Number'
		end
		table.insert (outres, '          <td class="' .. colorClass ..'"><p>&nbsp;&nbsp;&nbsp;</p></td>\n')
	end
	table.insert (outres, '          <td class="rm-situation"><p class="rmp-situation">')

	if view ~= 'Блокнот' then
		if koibLabel == 1 and tab.methods[method].incK == 2 then
			table.insert (outres, '<span class="rm-only-K">&nbsp;K&nbsp;</span>&nbsp;')
		elseif  koibLabel == -1 and tab.methods[method].incM == 2 then
			table.insert (outres, '<span class="rm-only-R">&nbsp;Р&nbsp;</span>&nbsp;')
		end
	end

	if univers and forCode then
		for key,val in ipairs (forCode) do
			table.insert (outres, '<span  class="rm-reg-marker-reg">(' .. val .. ')</span> ')
		end
	end
	if univers and forNoCode then
		for key,val in ipairs (forNoCode) do
			table.insert (outres, '<span  class="rm-reg-marker-noreg">(−' .. val .. ')</span> ')
		end
	end
	if univers and forFlags then
		for key,val in ipairs (forFlags) do
			table.insert (outres, '<span  class="rm-reg-marker">[' .. val .. ']</span> ')
		end
	end

	local txt = checkMarker (ownArgs ['событие'])
	table.insert (outres,  (mw.ustring.gsub (txt, '<_#(.-)_>',  prostr1 )))

	txt = ownArgs ['совет'] or ''
	if txt ~= '' then
		table.insert (outres,  '. &nbsp;<span class="rm-hint">' .. txt .. '</span>')
	end
	table.insert (outres,  '</p></td>\n')

	if chapter == 'main' and (view == 'Компактная' or view == 'Новая') then
		txt = ownArgs ['показатель']
		if txt == 'есть' or txt == 'да' then
			txt = '          <td class="rm-data"><p class="rmp-data">'
		else
			txt = '          <td class="rm-data-X"><p class="rmp-data-X">X'
		end
		table.insert (outres,  txt .. '</p></td>\n')
		if view == 'Компактная' then
			table.insert (outres,  '<td class="rm-yes">&nbsp;</td>\n          <td class="rm-no">&nbsp;</td>\n')
		end
	elseif view == 'Блокнот' then
		table.insert (outres,  '          <td class="rm-yes"><span style="font-size:16pt;">&#x2751;</span><br>(да)</td>\n')
	end

	-- НПА
	table.insert (outres, '          <td  class="rm-rule"><p class="rmp-rule">')

	if univers and forFlags then
		for key,val in ipairs (forFlags) do
			table.insert (outres, '<span  class="rm-reg-marker">[' .. val .. ']</span> ')
		end
	end

	local billtab = {}
	table.insert (billtab, addBill (view, ownArgs ['все'],
		tab.regions[tab.fzgCode].code, tab.regions[tab.fzgCode].link, tab.regions[tab.fzgCode].addl, tab.regions[tab.fzgCode].addc, tab.regions[tab.fzgCode].sect, tab.regions[tab.fzgCode].subs))
	table.insert (billtab, addBill (view, ownArgs ['КОИБ'],
		tab.regions[tab.koibCode].code, tab.regions[tab.koibCode].link, tab.regions[tab.koibCode].addl, tab.regions[tab.koibCode].addc, tab.regions[tab.koibCode].sect, tab.regions[tab.koibCode].subs))

	if code then
		for i = 1, #code do
			table.insert (billtab, addBill (view, ownArgs [code[i]],
				tab.regions[code[i]].code, tab.regions[code[i]].link, tab.regions[code[i]].addl, tab.regions[code[i]].addc, tab.regions[code[i]].sect, tab.regions[code[i]].subs))
			if tab.regions[code[i]].code1 then
				table.insert (billtab, addBill (view, ownArgs [code[i]..'+'],
					tab.regions[code[i]].code1, tab.regions[code[i]].link1, tab.regions[code[i]].addl1, tab.regions[code[i]].addc1, tab.regions[code[i]].sect1, tab.regions[code[i]].subs1))
			end
		end
	end
	table.insert (outres, table.concat (billtab, '; '))
	table.insert (outres, '</p></td>\n')
	if view ~= 'Новая' then
		table.insert (outres, '          <td class="rm-addr"><p class="rmp-addr">' .. (ownArgs['куда'] or '') .. '</p></td>\n')
	end
	table.insert (outres, '          <td class="rm-penalty"><p class="rmp-penalty">')

	billtab = {}
	table.insert (billtab, addBill (view, ownArgs ['КоАП'], 'КоАП', 'НПА:Кодекс Российской Федерации об административных правонарушениях', nil, nil, 'ч.', 'п.'))
	table.insert (billtab, addBill (view, ownArgs ['УК'], 'УК', 'НПА:Уголовный кодекс Российской Федерации', nil, nil, 'ч.', 'п.'))
	table.insert (outres, table.concat (billtab, '; '))

	table.insert (outres, '</p></td>\n')
	if view == 'Экран' then
		table.insert (outres, '          <td class="rm-links">' .. (ownArgs['ТС'] or '') ..
        				'&nbsp; <span class="doclink" style="font-weight:bold; font-style:italic">' .. (ownArgs['жалоба'] or '') .. '</span></td>\n') -- rm-???
	end

	table.insert (outres, '        </tr>\n')
	return table.concat (outres)
end

p ['Сокращения'] = function (frame)
	local ownArgs = frame.args
	local gArgs = frame:getParent().args
	local code, method, view, flags, chapter = gArgs.code, gArgs.method, gArgs.view, gArgs.flags, gArgs.chapter

	local outres = {}
	local univers
	if code == 'все' then
		univers = true
		code = {}
		for k,v in pairs (tab.regions) do
			table.insert (code, k)
		end
		table.sort (code)
	elseif code == 'нет' then
		code = {}
	else
		code = mw.text.split (code, ',', true)
	end
	if not univers then
		table.insert (code, 1, tab.fzgCode)
		if tab.methods[method].incK ~= 0 then
			table.insert (code, 2, tab.koibCode)
		end
	end
	for key, val in ipairs (code) do
		table.insert (outres, '<p class="rm-abbr"><b>' .. tab.regions[val].code .. '</b> — ' .. tab.regions[val].name .. '</p>')
		if tab.regions[val].code1 then
			table.insert (outres, '<p class="rm-abbr"><b>' .. tab.regions[val].code1 .. '</b> — ' .. tab.regions[val].name1 .. '</p>')
		end
	end
	table.insert (outres, '<p class="rm-abbr"><b>ИМН</b> — «Порядок подачи заявления о включении избирателя в список избирателей по месту нахождения...» (пост. ЦИК от 06.06.2018 № 161/1316−7)</p>')
	table.insert (outres, '<p class="rm-abbr"><b>ДГЦИК</b> — «Порядок досрочного голосования... с применением дополнительных форм организации голосования... 13.09.2020» (пост. ЦИК от 24.07.2020 № 260/1916−7)</p>')
	table.insert (outres, '<p class="rm-abbr"><b>КоАП</b> — Кодекс РФ об административных правонарушениях</p>')
    table.insert (outres, '<p class="rm-abbr"><b>УК</b> — Уголовный кодекс РФ</p>')
    table.insert (outres, '<p class="rm-abbr"><b>ПРГ</b> — право решающего голоса (или член комиссии с правом решающего голоса</p>')
    table.insert (outres, '<p class="rm-abbr"><b>ПСГ</b> — право совещательного голоса (или член комиссии с правом совещательного голоса</p>')
    table.insert (outres, '<p class="rm-abbr"><b>ТИК</b> — территориальная (или иная вышестоящая) комиссия</p>')
    table.insert (outres, '<p class="rm-abbr"><b>УИК</b> — участковая избирательная комиссия</p>')
    table.insert (outres, '<p class="rm-abbr"><b>УФП</b> — увеличенная форма протокола</p>')
    table.insert (outres, '<p class="rm-abbr"><b>ст.</b> — статья, <b>п.</b> — пункт, <b>ч.</b> — часть, <b>п/п</b> — подпункт</p>')
	return table.concat (outres)
end

p ['Таблица сведений о выездах'] = function (frame)
	local gArgs = frame:getParent().args
	local code, method, view, flags, chapter, twitter = gArgs.code, gArgs.method, gArgs.view, gArgs.flags, gArgs.chapter, gArgs.twitter
	twitter = '#' .. mw.ustring.gsub (twitter, ' ', ' &nbsp; #')
	if view == 'Экран' or not tab.methods[method].incC then
		return ''
	end
	return [==[
        <tr style="page-break-inside: avoid; ">
          <td colspan=]==] .. tab.views[view].cols .. [==[>
            <table class="rm-2col">
              <tr>
                <td class="rm-left">
                  <table class="rm-box1">
                    <tr>
                      <td style="text-align:right; font-size:16pt; line-height: 16pt; mso-line-height-rule: exactly; font-weight: bold; ">8 (800) 333 33 50</td>
                      <td style="padding-left: 3pt; ">Сообщайте о нарушениях<br>Получайте консультации<br>Бесплатные звонки из любой точки России</td>
                    </tr>
                    <tr>
                      <td style="text-align:right; font-size:12pt; line-height: 12pt; mso-line-height-rule: exactly; font-style: italic;  font-weight: bold; ">www.kartanarusheniy.org</td>
                      <td style="padding-left: 3pt; ">Следите за ситуацией<br>по «Карте нарушений»</td>
                    </tr>
                    <tr>
                      <td style="text-align:right; font-size:12pt; line-height: 12pt; mso-line-height-rule: exactly; font-style: italic;  font-weight: bold; ">]==] .. twitter .. [==[</td>
                      <td style="padding-left: 3pt; ">Освещайте события дня в социальных сетях</td>
                    </tr>
                  </table>
                  <p class="rm-blockName" style="margin-top:12pt; ">Сведения о явке избирателей (не путайтесь в надомниках!)</p>
                  <table class="rm" style="border-width:0; ">
                    <tr>
                      <td style="width:2.1cm; height:16pt; border-left:none; "><p class="rmp-counting">По состоянию<br>на ... <i>(время)</i></p></td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; border-left:none; "><p class="rmp-counting">Явка по данным<br>комиссии</p></td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                      <td>&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; border-left:none; border-bottom:none; "><p class="rmp-counting">Явка по данным<br>наблюдателей</p></td>
                      <td style="border-left:none; border-bottom:none; ">&nbsp;</td>
                      <td style="border-left:none; border-bottom:none; ">&nbsp;</td>
                      <td style="border-left:none; border-bottom:none; ">&nbsp;</td>
                      <td style="border-left:none; border-bottom:none; ">&nbsp;</td>
                      <td style="border-left:none; border-bottom:none; ">&nbsp;</td>
                      <td style="border-left:none; border-bottom:none; ">&nbsp;</td>
                    </tr>
                  </table>
                </td>
                <td class="rm-spaceLR"></td>
                <td class="rm-right">
                  <p class="rm-blockName">Сведения о выездах для голосования вне помещения</p>
                  <table class="rm" style="border-width:0; ">
                    <tr>
                      <th><p class="rmp-home-th">Объявлено <i>(время)</i></p></th>
                      <th><p class="rmp-home-th">Выехали <i>(время)</i></p></th>
                      <th><p class="rmp-home-th">Набл. есть?</p></th>
                      <th><p class="rmp-home-th">№ ящика</p></th>
                      <th><p class="rmp-home-th">Размер выписки</p></th>
                      <th><p class="rmp-home-th">Взято бюллетеней</p></th>
                      <th><p class="rmp-home-th">Число отказов</p></th>
                      <th><p class="rmp-home-th">Сверх плана</p></th>
                      <th style="border-right:none; "><p class="rmp-home-th">Вернулись <i>(время)</i></p></th>
                   </tr>
                    <tr>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; border-right:none; ">&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; border-right:none; ">&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; border-right:none; ">&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; border-right:none; ">&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; ">&nbsp;</td>
                      <td style="height:16pt; border-right:none; ">&nbsp;</td>
                    </tr>
                    <tr>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; ">&nbsp;</td>
                      <td style="height:16pt; border-bottom: none; border-right:none; ">&nbsp;</td>
                    </tr>
                  </table>
                </td>
              </tr>
            </table>
          </td>
        </tr>
]==]

end

function makeReport (code, candCount, dosrU, dosrT, dosrOG, otkr, nostr4, ou)
	function strprComp (aaa, bbb)
		local aaad, bbbd = tonumber (aaa), tonumber (bbb)
		local aaal, bbbl = '0', '0'
		if not aaad then
			aaad = tonumber (mw.ustring.sub (aaa,1,-2))
			aaal = mw.ustring.sub (aaa,-1,-1)
		end
		if not bbbd then
			bbbd = tonumber (mw.ustring.sub (bbb,1,-2))
			bbbl = mw.ustring.sub (bbb,-1,-1)
		end
		return aaad < bbbd or (aaad == bbbd and aaal < bbbl)
	end


	local outres = {}
	local setS0 = tab.regions [code].strpr
	local setS = tableFlip (setS0)  -- setS - набор пар  loc=fed
	if nostr4 and not (dosrOG or dosrU) then
		setS [setS0 ['4']] = nil
	end
	setS [setS0 ['12']] = nil
	local dosr = dosrU or dosrT -- or dosrOG (досрочное голосование отдельных групп не влечет отдельного подсчета)
	if not ou and setS0['11а'] then
		setS[setS0['11а']], setS[setS0['11б']], setS[setS0['11в']],
			setS[setS0['11г']], setS[setS0['11д']], setS[setS0['11е']]
				= nil, nil, nil, nil, nil, nil
	end

	function printCell (locCode)
		-- т.к. в основном протоколе всегда не меньше 11 строк, жалобы и досрочка всегда будут только в самой правой колонке
		local color = ''
		if setS [locCode] then -- это обычный код
			table.insert (outres, '          <td class="rm-strpr-str">' .. tab.strprText[setS [locCode]] .. '</td><td class="rm-strpr-num">' .. locCode .. '</td>')
		else
			if locCode == 'пустышка' then
				table.insert (outres, '          <td class="rm-strpr-str" colspan=4>&nbsp;</td>\n')
				return
			elseif locCode == 'доЗгл' then
				table.insert (outres, '          <td class="rm-strpr-dosrHeader" colspan=4>Отдельный подсчет<br>по бюллетеням проголосовавших досрочно</td>\n')
				return
			elseif locCode == 'жалобы' then
				table.insert (outres, '          <td class="rm-strpr-str" colspan=2 style="width:17.93%;">'.. tab.strprText ['жалобы'] .. '</td>')
			else -- досрочные показатели
				table.insert (outres, '          <td class="rm-strpr-dosr" colspan=2 style="width:17.93%;">'.. tab.strprText [locCode] .. '</td>')
				color = '-dosr'
			end
		end
		local doText = '&nbsp;'
		if setS [locCode] == '4' then
			if not dosrT then
				doText = '= 0'
			elseif not (dosrOG or dosrU) then
				doText = '= [' .. setS0['3'] .. ']'
			end
		elseif setS [locCode] == '3' then
			if not ( dosrT or dosrU or dosrOG )  then
				doText = '= 0'
			end
		end
		table.insert (outres, '<td class="rm-strpr-data1' .. color ..'">&nbsp;</td><td class="rm-strpr-data2'	 .. color ..'">' .. doText .. '</td>\n')
	end

	local arrayS = {}
	for loc,fed in pairs (setS) do
		table.insert (arrayS, loc)
	end
	table.sort (arrayS, strprComp)	--  arrayS   - отсортированный массив loc
	local m = #arrayS % 3
	if (m == 0 and dosr) or (m == 1) or (m == 2 and not dosr) then
		table.insert (arrayS, 'жалобы') -- Число жалоб
	end
	if dosr then
		if m == 0 then
			table.insert (arrayS, 'доЗгл') -- Заголовок досрочки
		end
		table.insert (arrayS, 'доВсего')
		table.insert (arrayS, 'доДей')
		table.insert (arrayS, 'доНедей')
		table.insert (arrayS, 'доНеуст')
	elseif m == 1 then
		table.insert  (arrayS, 'пустышка') -- пустышка
	end

	m = math.floor (#arrayS / 3 + 0.1) -- это всегда целое
	table.insert (outres, '      <table class="rm-strpr">\n')
	for i = 1, m do
		table.insert (outres, '        <tr>\n')
		printCell (arrayS [i])
		printCell (arrayS [i+m])
		printCell (arrayS [i+2*m])
		table.insert (outres, '        </tr>\n')  --<td>' .. ( arrayS [i+2*m] or '???' ) .. '</td>
	end
	table.insert (outres, [[
      </table>
      <table class="rm-strpr">
        <tr>
          <td  class="rm-strpr-header" colspan=12>Результаты кандидатов</td>
        </tr>
]]		)

	if dosr then
		table.insert (outres, [[
        <tr>
        	<td class="rm-strpr-header" colspan=2>Кандидат</td>
        	<td  class="rm-strpr-header" colspan=2 style="border-left-width: 0.25pt; ">Общий итог</td>
        	<td  class="rm-strpr-dosrHeader" colspan=2 style="border-left-width: 0.25pt; ">Отд. подсчет досроч.</td>
        	<td class="rm-strpr-header" colspan=2>Кандидат</td>
        	<td  class="rm-strpr-header" colspan=2 style="border-left-width: 0.25pt; ">Общий итог</td>
        	<td  class="rm-strpr-dosrHeader" colspan=2 style="border-left-width: 0.25pt; ">Отд. подсчет досроч.</td>
        </tr>
]]			)
		m = math.floor ((candCount+1) / 2 + .1)
	else
		m = math.floor ((candCount+2) / 3 + .1)
	end
	for i = tonumber(setS0 ['12']), tonumber(setS0 ['12']) + m - 1 do
		table.insert (outres, '        <tr>\n')
		table.insert (outres, '          <td class="rm-strpr-str">&nbsp;</td><td class="rm-strpr-num">' .. i .. '</td><td class="rm-strpr-data1">&nbsp;</td><td class="rm-strpr-data2">&nbsp;</td>')
		if dosr then
			table.insert (outres, '<td class="rm-strpr-data1-dosr">&nbsp;</td><td class="rm-strpr-data2-dosr">&nbsp;</td>\n')
			table.insert (outres, '          <td class="rm-strpr-str-plus">&nbsp;</td><td class="rm-strpr-num">' .. (i+m) .. '</td><td class="rm-strpr-data1">&nbsp;</td><td class="rm-strpr-data2">&nbsp;</td>')
			table.insert (outres, '<td class="rm-strpr-data1-dosr">&nbsp;</td><td class="rm-strpr-data2-dosr">&nbsp;</td>\n')
		else
			table.insert (outres, '          <td class="rm-strpr-str">&nbsp;</td><td class="rm-strpr-num">' .. (i+m) .. '</td><td class="rm-strpr-data1">&nbsp;</td><td class="rm-strpr-data2">&nbsp;</td>\n')
			table.insert (outres, '          <td class="rm-strpr-str">&nbsp;</td><td class="rm-strpr-num">' .. (i+2*m) .. '</td><td class="rm-strpr-data1">&nbsp;</td><td class="rm-strpr-data2">&nbsp;</td>\n')
		end
		table.insert (outres, '        </tr>\n')
	end
	table.insert (outres, '      </table>\n')


	return table.concat (outres)
end

p ['Таблица итогов голосования'] = function (frame)
	local gArgs = frame:getParent().args
	local code, method, view, chapter, candCount, flags = gArgs.code, gArgs.method, gArgs.view, gArgs.chapter, gArgs.headerCandCount, gArgs.flags
	code = mw.text.split (code,',') or ''
	if code == '' or code =='все' or code == 'нет' then
		code = tab.fzgCode
	else
		code = mw.text.trim (code [1])
	end

	if flags == '' then -- если флаги не заданы, то берем флаги первого указанного региона
		flags = tab.regions [code].flags
	elseif flags == 'нет' then
		flags = ''
	end

	flags = mw.ustring.lower (flags)

	if flags == '' then
		flags = {}
	else
		flags = mw.text.split (flags, ',', true)
		flags = tableFlip (flags)
	end

	return makeReport (code, candCount, flags ['доср-уик'], flags ['доср-тик'], flags ['доср-ог'], false, flags['без-строки-тик'], flags['оу'])
end

p ['SMS-ЦИК и ящики'] = function (frame)
	local gArgs = frame:getParent().args
	local code, method, view, chapter, constCount, flags, sms = gArgs.code, gArgs.method, gArgs.view, gArgs.chapter, gArgs.headerConstCount, gArgs.flags, gArgs.sms
	code = mw.text.split (code,',') or ''
	if code == '' or code =='все' or code == 'нет' then
		code = tab.fzgCode
	else
		code = mw.text.trim (code [1])
	end

	if flags == '' then -- если флаги не заданы, то берем флаги первого указанного региона
		flags = tab.regions [code].flags
	elseif flags == 'нет' then
		flags = ''
	end

	flags = mw.ustring.lower (flags)

	if flags == '' then
		flags = {}
	else
		flags = mw.text.split (flags, ',', true)
		flags = tableFlip (flags)
	end

	if sms == '' then
		sms = '(код)'
	end

	local outres = {}
	table.insert (outres, [[
      <table class="rm-2col">
        <tr>
]]		)
	if flags ['доср-ог'] then
		table.insert (outres, [[
          <td class="rm-2col-2d3">
            <p class="rm-blockName">Обработка переносных ящиков при подсчете</p>
            <table class="rm">
              <tr>
                <td class="rm-rule" style="width: 1.5cm; height: 16pt; "><p class="rmp-mob-count">№ ящика</p></td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">досрочное / надомное</p></td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">Пломбы проверены?</p></td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">Заявлений</p></td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">Бюллетеней</p></td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
                <td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td><td style="width: 10%; ">&nbsp;</td>
              </tr>
            </table>
          </td>
]]			)
	else
		table.insert (outres, [[
          <td class="rm-left">
            <p class="rm-blockName">Обработка переносных ящиков при подсчете</p>
            <table class="rm">
              <tr>
                <td class="rm-rule" style="width: 1.5cm; height: 16pt; "><p class="rmp-mob-count">№ ящика</p></td><td style="width: 33.3%; ">&nbsp;</td><td style="width: 33.3%; ">&nbsp;</td><td style="width: 33.3%; ">&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">Пломбы проверены?</p></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">Заявлений</p></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
              </tr>
              <tr>
                <td class="rm-rule" style="height: 16pt; "><p class="rmp-mob-count">Бюллетеней</p></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
              </tr>
            </table>
          </td>
]]			)
	end
	table.insert (outres, '		      <td class="rm-spaceLR"></td>\n')

	if flags ['доср-ог'] then
		table.insert (outres, '		      <td class="rm-2col-1d3">')
	else
		table.insert (outres, '		      <td class="rm-right">')
	end
	table.insert (outres, [[
		        <p class="rm-text" style="text-align: right; font-size:14pt; line-height:100%; font-weight:bold; ">SMS−ЦИК &nbsp; (903) 767 62 42&nbsp;</p>
]]		)
	if flags ['доср-ог'] then
		table.insert (outres, [[
		        <p class="rm-text">&nbsp;</p>
]]		)
	end
	table.insert (outres, [[
		        <p class="rm-text" style="text-align: right; ">Как только итоги голосования станут<br>известны, отправьте sms-сообщение:</p>
		        <p class="rm-text" style="text-align: right; font-size:10pt; line-height:100%; font-weight:bold; ">]] .. sms .. ' &nbsp;')
    if constCount ~= '' then
    	table.insert (outres, '(округ) &nbsp;')
    end
    table.insert (outres, '(№ УИК) &nbsp;')
	table.insert (outres, '[' .. tab.regions [code].strpr ['10'] .. '] &nbsp;')
	table.insert (outres, '[' .. tab.regions [code].strpr ['11'] .. '] &nbsp;')
	table.insert (outres, '[' .. tab.regions [code].strpr ['12'] .. ']...</p>\n')
	if flags ['доср-ог'] then
		table.insert (outres, [[
		        <p class="rm-text">&nbsp;</p>
]]		)
	end
	table.insert (outres, [[
		        <p class="rm-text" style="text-align: right; ">Переданные в СМС-ЦИК результаты доступны<br>по&nbsp;адресу: <i>http://sms-cik.org/elections/]] .. sms .. [[</i></p>
		      </td>
]]		)
	table.insert (outres, [[
        </tr>
      </table>
]]		)
	return table.concat (outres)
end



--[===[
	table.insert (outres, [[
      <table class="rm-sms0">
        <table class="rm-sms">
          <tr>
            <td style="font-size:14pt; line-height:100%; text-align:right; font-weight:bold; ">SMS−ЦИК &nbsp; (902) 114 80 11&nbsp;</td>
            <td>Как только результат голосования стал<br>известен, отправьте sms-сообщение —</td>
            <td style="font-size:14pt; line-height:100%; text-align:right; font-weight:bold; ">&nbsp; ]] .. sms .. ' &nbsp;')
    if constCount ~= '' then
    	table.insert (outres, '(округ) &nbsp;')
    end
    table.insert (outres, '(№ УИК) &nbsp;')
	table.insert (outres, '[' .. tab.regions [code].strpr ['10'] .. '] &nbsp;')
	table.insert (outres, '[' .. tab.regions [code].strpr ['11'] .. '] &nbsp;')
	table.insert (outres, '[' .. tab.regions [code].strpr ['12'] .. ']...</td>\n')
	table.insert (outres, [[
          </tr>
        </table>
      </table>
]]		)

	return table.concat (outres)
end
--]===]

return p