<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://thirdworldcup.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AStats%2FPenalties</id>
	<title>Модуль:Stats/Penalties - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://thirdworldcup.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AStats%2FPenalties"/>
	<link rel="alternate" type="text/html" href="http://thirdworldcup.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Stats/Penalties&amp;action=history"/>
	<updated>2026-06-07T17:18:47Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://thirdworldcup.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Stats/Penalties&amp;diff=70112&amp;oldid=prev</id>
		<title>Lord: Новая страница: «local p = {} local Config = require(&#039;Module:Config&#039;)  function p.render(frame)     local json_data = mw.text.jsonDecode(mw.title.new(&#039;Module:Data/GrandStats.json&#039;):getContent())     local data = json_data.StatsPages.Penalties     local global_played = json_data.Players      local function calc_pok(g, u) return g - (u - g) * 2 end     local function bld_pok(pok) return {text = (pok &gt; 0 and &quot;+&quot; .. pok or tostring(pok)), style = Config.styles.center .. &quot; font-w...»</title>
		<link rel="alternate" type="text/html" href="http://thirdworldcup.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Stats/Penalties&amp;diff=70112&amp;oldid=prev"/>
		<updated>2026-06-06T02:54:26Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local p = {} local Config = require(&amp;#039;Module:Config&amp;#039;)  function p.render(frame)     local json_data = mw.text.jsonDecode(mw.title.new(&amp;#039;Module:Data/GrandStats.json&amp;#039;):getContent())     local data = json_data.StatsPages.Penalties     local global_played = json_data.Players      local function calc_pok(g, u) return g - (u - g) * 2 end     local function bld_pok(pok) return {text = (pok &amp;gt; 0 and &amp;quot;+&amp;quot; .. pok or tostring(pok)), style = Config.styles.center .. &amp;quot; font-w...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local Config = require(&amp;#039;Module:Config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local json_data = mw.text.jsonDecode(mw.title.new(&amp;#039;Module:Data/GrandStats.json&amp;#039;):getContent())&lt;br /&gt;
    local data = json_data.StatsPages.Penalties&lt;br /&gt;
    local global_played = json_data.Players&lt;br /&gt;
&lt;br /&gt;
    local function calc_pok(g, u) return g - (u - g) * 2 end&lt;br /&gt;
    local function bld_pok(pok) return {text = (pok &amp;gt; 0 and &amp;quot;+&amp;quot; .. pok or tostring(pok)), style = Config.styles.center .. &amp;quot; font-weight:bold;&amp;quot;} end&lt;br /&gt;
    local function format_pct(g, u) return u == 0 and &amp;quot;0&amp;quot; or string.gsub(string.format(&amp;quot;%.2f&amp;quot;, math.floor((g / u * 100) * 100 + 0.5) / 100), &amp;quot;%.&amp;quot;, &amp;quot;,&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
    local function get_medal(p_name, metric, y_num)&lt;br /&gt;
        if not metric then return &amp;quot;&amp;quot; end&lt;br /&gt;
        local gp = global_played[p_name]&lt;br /&gt;
        if not gp or not gp.AS_compiled or not gp.AS_compiled.metrics[metric] then return &amp;quot;&amp;quot; end&lt;br /&gt;
        if y_num then&lt;br /&gt;
            local y_data = gp.AS_compiled.metrics[metric].years[y_num] or gp.AS_compiled.metrics[metric].years[tostring(y_num)]&lt;br /&gt;
            return y_data and y_data.color or &amp;quot;&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            return gp.AS_compiled.metrics[metric].color or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function build_chrono(data_type)&lt;br /&gt;
        local list = {}&lt;br /&gt;
        for name, p in pairs(data.players) do if p[data_type].u &amp;gt; 0 then p.name = name; table.insert(list, {name = name, d = p[data_type]}) end end&lt;br /&gt;
        table.sort(list, function(a, b)&lt;br /&gt;
            local pokA, pokB = calc_pok(a.d.g, a.d.u), calc_pok(b.d.g, b.d.u)&lt;br /&gt;
            if pokA ~= pokB then return pokA &amp;gt; pokB end&lt;br /&gt;
            if a.d.g ~= b.d.g then return a.d.g &amp;gt; b.d.g end&lt;br /&gt;
            local sA, sB = a.d.g, b.d.g&lt;br /&gt;
            for i = #Config.years, 1, -1 do&lt;br /&gt;
                local y = Config.years[i]&lt;br /&gt;
                local a_y = a.d.years[y] or a.d.years[tostring(y)]&lt;br /&gt;
                local b_y = b.d.years[y] or b.d.years[tostring(y)]&lt;br /&gt;
                sA = sA - (a_y and a_y.g or 0); sB = sB - (b_y and b_y.g or 0)&lt;br /&gt;
                if sA ~= sB then return sA &amp;gt; sB end&lt;br /&gt;
            end&lt;br /&gt;
            return a.name &amp;lt; b.name&lt;br /&gt;
        end)&lt;br /&gt;
&lt;br /&gt;
        local cols = Config.builder.merge({&amp;#039;Место&amp;#039;, &amp;#039;Игрок&amp;#039;}, Config.builder.years(Config.years), {&amp;#039;ВСЕГО&amp;#039;, &amp;#039;%&amp;#039;, &amp;#039;[[Лучший пенальтист#Система определения победителя|Показатель]]&amp;#039;})&lt;br /&gt;
        local tbl = Config.builder.start(cols)&lt;br /&gt;
        local col_u, col_g, tot_u, tot_g = {}, {}, 0, 0&lt;br /&gt;
        for _, y in ipairs(Config.years) do col_u[y]=0; col_g[y]=0 end&lt;br /&gt;
&lt;br /&gt;
        local metric = (data_type == &amp;quot;all&amp;quot;) and &amp;quot;pens_scored&amp;quot; or nil&lt;br /&gt;
        for rank, item in ipairs(list) do&lt;br /&gt;
            local r_data = { rank, {text = &amp;quot;[[&amp;quot; .. string.gsub(item.name, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) .. &amp;quot;]]&amp;quot;, style = Config.styles.center_nowrap} }&lt;br /&gt;
            for _, y in ipairs(Config.years) do&lt;br /&gt;
                local y_node = item.d.years[y] or item.d.years[tostring(y)]&lt;br /&gt;
                local u = y_node and y_node.u or 0&lt;br /&gt;
                local g = y_node and y_node.g or 0&lt;br /&gt;
                col_u[y] = col_u[y] + u; col_g[y] = col_g[y] + g&lt;br /&gt;
                &lt;br /&gt;
                local y_medal = get_medal(item.name, metric, y)&lt;br /&gt;
                local cell_style = Config.styles.center_nowrap&lt;br /&gt;
                if y_medal ~= &amp;quot;&amp;quot; then cell_style = cell_style .. &amp;quot; &amp;quot; .. y_medal end&lt;br /&gt;
&lt;br /&gt;
                if u &amp;gt; 0 then&lt;br /&gt;
                    table.insert(r_data, {text = u .. &amp;#039;/&amp;#039; .. g, style = cell_style})&lt;br /&gt;
                else&lt;br /&gt;
                    local gp = global_played[item.name]&lt;br /&gt;
                    local played = gp and gp.AS_compiled.played_years and (gp.AS_compiled.played_years[y] or gp.AS_compiled.played_years[tostring(y)])&lt;br /&gt;
                    if played then&lt;br /&gt;
                        table.insert(r_data, {text = &amp;quot;0/0&amp;quot;, style = cell_style})&lt;br /&gt;
                    else&lt;br /&gt;
                        table.insert(r_data, &amp;quot;&amp;quot;)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            tot_u = tot_u + item.d.u; tot_g = tot_g + item.d.g&lt;br /&gt;
            &lt;br /&gt;
            local tot_medal = get_medal(item.name, metric, nil)&lt;br /&gt;
            local tot_style = Config.styles.center .. &amp;quot; font-weight:bold;&amp;quot;&lt;br /&gt;
            if tot_medal ~= &amp;quot;&amp;quot; then tot_style = tot_style .. &amp;quot; &amp;quot; .. tot_medal end&lt;br /&gt;
            &lt;br /&gt;
            table.insert(r_data, {text = item.d.u .. &amp;#039;/&amp;#039; .. item.d.g, style = tot_style})&lt;br /&gt;
            table.insert(r_data, format_pct(item.d.g, item.d.u) .. &amp;#039;%&amp;#039;)&lt;br /&gt;
            table.insert(r_data, bld_pok(calc_pok(item.d.g, item.d.u)))&lt;br /&gt;
            Config.builder.row(tbl, r_data)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local f_data = { &amp;quot;&amp;quot;, {text=&amp;quot;&amp;#039;&amp;#039;&amp;#039;ВСЕГО&amp;#039;&amp;#039;&amp;#039;&amp;quot;, style = Config.styles.center} }&lt;br /&gt;
        for _, y in ipairs(Config.years) do table.insert(f_data, {text = col_u[y] &amp;gt; 0 and (col_u[y] .. &amp;#039;/&amp;#039; .. col_g[y]) or &amp;#039;0&amp;#039;, style = Config.styles.center .. &amp;quot; font-weight:bold;&amp;quot;}) end&lt;br /&gt;
        table.insert(f_data, {text = tot_u .. &amp;#039;/&amp;#039; .. tot_g, style = Config.styles.center .. &amp;quot; font-weight:bold;&amp;quot;})&lt;br /&gt;
        table.insert(f_data, {text = format_pct(tot_g, tot_u) .. &amp;#039;%&amp;#039;, style = Config.styles.center .. &amp;quot; font-weight:bold;&amp;quot;})&lt;br /&gt;
        table.insert(f_data, bld_pok(calc_pok(tot_g, tot_u)))&lt;br /&gt;
        Config.builder.row(tbl, f_data)&lt;br /&gt;
        return tostring(tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function build_results(data_type, spec_year)&lt;br /&gt;
        local list, t_u, t_g, t_k, t_o, t_w, t_p, t_c = {}, 0, 0, 0, 0, 0, 0, 0&lt;br /&gt;
        for name, p in pairs(data.players) do&lt;br /&gt;
            local d = spec_year and (p[data_type].years[spec_year] or p[data_type].years[tostring(spec_year)]) or p[data_type]&lt;br /&gt;
            if d and d.u &amp;gt; 0 then table.insert(list, {name = name, d = d, stvor = d.g + d.k, frame = d.g + d.k + d.p + d.c}) end&lt;br /&gt;
        end&lt;br /&gt;
        table.sort(list, function(a, b)&lt;br /&gt;
            local pA, pB = calc_pok(a.d.g, a.d.u), calc_pok(b.d.g, b.d.u)&lt;br /&gt;
            if pA ~= pB then return pA &amp;gt; pB end&lt;br /&gt;
            if a.d.g ~= b.d.g then return a.d.g &amp;gt; b.d.g end&lt;br /&gt;
            if not spec_year then&lt;br /&gt;
                local sA, sB = a.d.g, b.d.g&lt;br /&gt;
                for i = #Config.years, 1, -1 do&lt;br /&gt;
                    local y = Config.years[i]&lt;br /&gt;
                    local a_y = data.players[a.name][data_type].years[y] or data.players[a.name][data_type].years[tostring(y)]&lt;br /&gt;
                    local b_y = data.players[b.name][data_type].years[y] or data.players[b.name][data_type].years[tostring(y)]&lt;br /&gt;
                    sA = sA - (a_y and a_y.g or 0); sB = sB - (b_y and b_y.g or 0)&lt;br /&gt;
                    if sA ~= sB then return sA &amp;gt; sB end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if a.stvor ~= b.stvor then return a.stvor &amp;gt; b.stvor end&lt;br /&gt;
            if a.frame ~= b.frame then return a.frame &amp;gt; b.frame end&lt;br /&gt;
            return a.name &amp;lt; b.name&lt;br /&gt;
        end)&lt;br /&gt;
&lt;br /&gt;
        local tbl = Config.builder.start({&amp;#039;Место&amp;#039;, &amp;#039;Игрок&amp;#039;, &amp;#039;%&amp;#039;, &amp;#039;[[Лучший пенальтист#Система определения победителя|Показатель]]&amp;#039;, &amp;#039;Удары&amp;#039;, &amp;#039;Голы&amp;#039;, &amp;#039;вр.&amp;#039;, &amp;#039;в.&amp;#039;, &amp;#039;м.&amp;#039;, &amp;#039;шт.&amp;#039;, &amp;#039;п.&amp;#039;})&lt;br /&gt;
        for rank, item in ipairs(list) do&lt;br /&gt;
            local d = item.d&lt;br /&gt;
            t_u=t_u+d.u; t_g=t_g+d.g; t_k=t_k+d.k; t_o=t_o+d.o; t_w=t_w+d.w; t_p=t_p+d.p; t_c=t_c+d.c&lt;br /&gt;
            Config.builder.row(tbl, { rank, {text = &amp;quot;[[&amp;quot; .. string.gsub(item.name, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) .. &amp;quot;]]&amp;quot;, style = Config.styles.center_nowrap}, format_pct(d.g, d.u), bld_pok(calc_pok(d.g, d.u)), {text=d.u, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=d.g, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, d.k, d.o, d.w, d.p, d.c })&lt;br /&gt;
        end&lt;br /&gt;
        if t_u &amp;gt; 0 then&lt;br /&gt;
            Config.builder.row(tbl, { {text=&amp;quot;&amp;#039;&amp;#039;&amp;#039;ВСЕГО&amp;#039;&amp;#039;&amp;#039;&amp;quot;, colspan=2, style=Config.styles.center}, {text=format_pct(t_g, t_u), style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, bld_pok(calc_pok(t_g, t_u)), {text=t_u, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=t_g, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=t_k, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=t_o, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=t_w, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=t_p, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=t_c, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;} })&lt;br /&gt;
        end&lt;br /&gt;
        return tostring(tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function build_tournaments(data_type)&lt;br /&gt;
        local tbl = Config.builder.start({&amp;#039;№&amp;#039;, &amp;#039;ЧТМ&amp;#039;, &amp;#039;%&amp;#039;, &amp;#039;[[Лучший пенальтист#Система определения победителя|Показатель]]&amp;#039;, &amp;#039;Удары&amp;#039;, &amp;#039;Голы&amp;#039;, &amp;#039;вр.&amp;#039;, &amp;#039;в.&amp;#039;, &amp;#039;м.&amp;#039;, &amp;#039;шт.&amp;#039;, &amp;#039;п.&amp;#039;})&lt;br /&gt;
        local tot_u, tot_g, tot_k, tot_o, tot_w, tot_p, tot_c, rank = 0,0,0,0,0,0,0,1&lt;br /&gt;
        for _, year in ipairs(Config.years) do&lt;br /&gt;
            local d = data.tournaments[year] or data.tournaments[tostring(year)]&lt;br /&gt;
            if d and d[data_type].u &amp;gt; 0 then&lt;br /&gt;
                local td = d[data_type]&lt;br /&gt;
                Config.builder.row(tbl, { rank, &amp;quot;[[&amp;quot; .. year .. &amp;quot;]]&amp;quot;, format_pct(td.g, td.u), bld_pok(calc_pok(td.g, td.u)), {text=td.u, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=td.g, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, td.k, td.o, td.w, td.p, td.c })&lt;br /&gt;
                rank = rank + 1; tot_u=tot_u+td.u; tot_g=tot_g+td.g; tot_k=tot_k+td.k; tot_o=tot_o+td.o; tot_w=tot_w+td.w; tot_p=tot_p+td.p; tot_c=tot_c+td.c&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        Config.builder.row(tbl, { {text=&amp;quot;&amp;#039;&amp;#039;&amp;#039;ВСЕГО&amp;#039;&amp;#039;&amp;#039;&amp;quot;, colspan=2, style=Config.styles.center}, {text=format_pct(tot_g, tot_u), style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, bld_pok(calc_pok(tot_g, tot_u)), {text=tot_u, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=tot_g, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=tot_k, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=tot_o, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=tot_w, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=tot_p, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;}, {text=tot_c, style=Config.styles.center..&amp;quot; font-weight:bold;&amp;quot;} })&lt;br /&gt;
        return tostring(tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function build_simple(data_type, metric_key)&lt;br /&gt;
        local start_year = Config.years[1]&lt;br /&gt;
        if metric_key and Config.metrics[metric_key] and Config.metrics[metric_key].start then start_year = Config.metrics[metric_key].start end&lt;br /&gt;
        local valid_years = {}&lt;br /&gt;
        for _, y in ipairs(Config.years) do if y &amp;gt;= start_year then table.insert(valid_years, y) end end&lt;br /&gt;
&lt;br /&gt;
        local list = {}&lt;br /&gt;
        for name, p in pairs(data.players) do if p[data_type].total &amp;gt; 0 then table.insert(list, {name = name, d = p[data_type]}) end end&lt;br /&gt;
        table.sort(list, function(a, b)&lt;br /&gt;
            if a.d.total ~= b.d.total then return a.d.total &amp;gt; b.d.total end&lt;br /&gt;
            local sA, sB = a.d.total, b.d.total&lt;br /&gt;
            for i = #valid_years, 1, -1 do&lt;br /&gt;
                local y = valid_years[i]&lt;br /&gt;
                sA = sA - (a.d.years[y] or a.d.years[tostring(y)] or 0)&lt;br /&gt;
                sB = sB - (b.d.years[y] or b.d.years[tostring(y)] or 0)&lt;br /&gt;
                if sA ~= sB then return sA &amp;gt; sB end&lt;br /&gt;
            end&lt;br /&gt;
            return a.name &amp;lt; b.name&lt;br /&gt;
        end)&lt;br /&gt;
&lt;br /&gt;
        local cols = Config.builder.merge({&amp;#039;Место&amp;#039;, &amp;#039;Игрок&amp;#039;}, Config.builder.years(valid_years), {&amp;#039;ВСЕГО&amp;#039;})&lt;br /&gt;
        local tbl = Config.builder.start(cols)&lt;br /&gt;
        local col_totals = {}; for _, y in ipairs(valid_years) do col_totals[y] = 0 end&lt;br /&gt;
        local grand_total = 0&lt;br /&gt;
        &lt;br /&gt;
        for rank, item in ipairs(list) do&lt;br /&gt;
            local r_data = { rank, {text=&amp;quot;[[&amp;quot; .. string.gsub(item.name, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) .. &amp;quot;]]&amp;quot;, style=Config.styles.center_nowrap} }&lt;br /&gt;
            for _, y in ipairs(valid_years) do &lt;br /&gt;
                local val = item.d.years[y] or item.d.years[tostring(y)] or 0&lt;br /&gt;
                &lt;br /&gt;
                local y_medal = get_medal(item.name, metric_key, y)&lt;br /&gt;
                local cell_style = Config.styles.center_nowrap&lt;br /&gt;
                if y_medal ~= &amp;quot;&amp;quot; then cell_style = cell_style .. &amp;quot; &amp;quot; .. y_medal end&lt;br /&gt;
&lt;br /&gt;
                if val &amp;gt; 0 then &lt;br /&gt;
                    table.insert(r_data, {text = tostring(val), style = cell_style})&lt;br /&gt;
                    col_totals[y] = col_totals[y] + val&lt;br /&gt;
                else&lt;br /&gt;
                    local gp = global_played[item.name]&lt;br /&gt;
                    local played = gp and gp.AS_compiled.played_years and (gp.AS_compiled.played_years[y] or gp.AS_compiled.played_years[tostring(y)])&lt;br /&gt;
                    if played then&lt;br /&gt;
                        table.insert(r_data, {text = &amp;quot;0&amp;quot;, style = cell_style})&lt;br /&gt;
                    else&lt;br /&gt;
                        table.insert(r_data, &amp;quot;&amp;quot;)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            local tot_medal = get_medal(item.name, metric_key, nil)&lt;br /&gt;
            local tot_style = Config.styles.center .. &amp;quot; font-weight:bold;&amp;quot;&lt;br /&gt;
            if tot_medal ~= &amp;quot;&amp;quot; then tot_style = tot_style .. &amp;quot; &amp;quot; .. tot_medal end&lt;br /&gt;
            &lt;br /&gt;
            table.insert(r_data, {text=tostring(item.d.total), style=tot_style}); grand_total = grand_total + item.d.total&lt;br /&gt;
            Config.builder.row(tbl, r_data)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if metric_key and Config.metrics[metric_key] and Config.metrics[metric_key].adjustments then&lt;br /&gt;
            for k, v in pairs(Config.metrics[metric_key].adjustments) do&lt;br /&gt;
                if k == &amp;quot;total&amp;quot; then grand_total = grand_total + v &lt;br /&gt;
                else&lt;br /&gt;
                    local k_num = tonumber(k)&lt;br /&gt;
                    if k_num and col_totals[k_num] then col_totals[k_num] = col_totals[k_num] + v; grand_total = grand_total + v end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local footer_data = { &amp;quot;&amp;quot;, {text=&amp;quot;&amp;#039;&amp;#039;&amp;#039;ВСЕГО&amp;#039;&amp;#039;&amp;#039;&amp;quot;, style=Config.styles.center} }&lt;br /&gt;
        for _, year in ipairs(valid_years) do table.insert(footer_data, {text=&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. tostring(col_totals[year]) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, style=Config.styles.center}) end&lt;br /&gt;
        table.insert(footer_data, {text=&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. tostring(grand_total) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, style=Config.styles.center})&lt;br /&gt;
        Config.builder.row(tbl, footer_data)&lt;br /&gt;
        return tostring(tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local output = { Config.styles.wiki_templates }&lt;br /&gt;
    table.insert(output, &amp;quot;== Пробитые пенальти ==&amp;quot;); table.insert(output, &amp;quot;=== Всего ===\n&amp;#039;&amp;#039;(Всего ударов/Забитых ударов)&amp;#039;&amp;#039;&amp;quot;); table.insert(output, build_chrono(&amp;quot;all&amp;quot;))&lt;br /&gt;
    table.insert(output, &amp;quot;=== Только в игровое время ===\n&amp;#039;&amp;#039;(Без учёта серий пенальти)&amp;#039;&amp;#039;&amp;quot;); table.insert(output, build_chrono(&amp;quot;ingame&amp;quot;))&lt;br /&gt;
    table.insert(output, &amp;quot;== Результаты ударов ==&amp;quot;); table.insert(output, &amp;quot;=== Все пенальти ===&amp;quot;); table.insert(output, build_results(&amp;quot;all&amp;quot;))&lt;br /&gt;
    for _, y in ipairs(Config.years) do &lt;br /&gt;
        local t_data = data.tournaments[y] or data.tournaments[tostring(y)]&lt;br /&gt;
        if t_data and t_data.all.u &amp;gt; 0 then table.insert(output, &amp;quot;==== [[&amp;quot; .. y .. &amp;quot;]] ====&amp;quot;); table.insert(output, build_results(&amp;quot;all&amp;quot;, y)) end &lt;br /&gt;
    end&lt;br /&gt;
    table.insert(output, &amp;quot;=== Только в игровое время ===&amp;quot;); table.insert(output, build_results(&amp;quot;ingame&amp;quot;))&lt;br /&gt;
    for _, y in ipairs(Config.years) do &lt;br /&gt;
        local t_data = data.tournaments[y] or data.tournaments[tostring(y)]&lt;br /&gt;
        if t_data and t_data.ingame.u &amp;gt; 0 then table.insert(output, &amp;quot;==== [[&amp;quot; .. y .. &amp;quot;]] ====&amp;quot;); table.insert(output, build_results(&amp;quot;ingame&amp;quot;, y)) end &lt;br /&gt;
    end&lt;br /&gt;
    table.insert(output, &amp;quot;== Статистика по чемпионатам ==&amp;quot;); table.insert(output, &amp;quot;=== Все пенальти ===&amp;quot;); table.insert(output, build_tournaments(&amp;quot;all&amp;quot;))&lt;br /&gt;
    table.insert(output, &amp;quot;=== Только в игровое время ===&amp;quot;); table.insert(output, build_tournaments(&amp;quot;ingame&amp;quot;))&lt;br /&gt;
    table.insert(output, &amp;quot;== Отбитые пенальти ==\n&amp;#039;&amp;#039;Учитываются только сэйвы. Удары мимо и выше ворот, а также в каркас в данную статистику не входят.&amp;#039;&amp;#039;&amp;quot;); table.insert(output, build_simple(&amp;quot;saves&amp;quot;, &amp;quot;pens_saved&amp;quot;))&lt;br /&gt;
    table.insert(output, &amp;quot;== Привезённые пенальти ==\n&amp;#039;&amp;#039;Официально подсчитываются начиная с [[ЧТМ-2026]]. Данный термин означает фол в собственной штрафной, после которого был назначен пенальти.&amp;#039;&amp;#039;&amp;quot;); table.insert(output, build_simple(&amp;quot;fouls&amp;quot;, &amp;quot;caused_pens&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    return frame:preprocess(table.concat(output, &amp;quot;\n\n&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lord</name></author>
	</entry>
</feed>