<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AFormat_TemplateData%2Fglobal</id>
	<title>Module:Format TemplateData/global - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AFormat_TemplateData%2Fglobal"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Format_TemplateData/global&amp;action=history"/>
	<updated>2026-05-07T05:32:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Format_TemplateData/global&amp;diff=136308&amp;oldid=prev</id>
		<title>imported&gt;Tholme: imported from dewiki</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Format_TemplateData/global&amp;diff=136308&amp;oldid=prev"/>
		<updated>2022-08-01T15:57:10Z</updated>

		<summary type="html">&lt;p&gt;imported from dewiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Export = { suite    = &amp;quot;TemplateDataGlobal&amp;quot;,&lt;br /&gt;
                 serial   = &amp;quot;2020-08-01&amp;quot;,&lt;br /&gt;
                 item     = 51435481,&lt;br /&gt;
                 subpages = &amp;quot;TemplateData&amp;quot;,&lt;br /&gt;
                 suffix   = &amp;quot;tab&amp;quot; }&lt;br /&gt;
--[=[&lt;br /&gt;
Retrieve TemplateData from Commons:Data (or other global source)&lt;br /&gt;
require()&lt;br /&gt;
Inspired by [[User:Yurik]].&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe = Export&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local failsafe = function ( atleast )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     atleast  -- string, with required version&lt;br /&gt;
    --                         or &amp;quot;wikidata&amp;quot; or &amp;quot;~&amp;quot; or &amp;quot;@&amp;quot; or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2020-08-01&lt;br /&gt;
    local last  = ( atleast == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local link  = ( atleast == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = Failsafe.item&lt;br /&gt;
        since = false&lt;br /&gt;
        if type( item ) == &amp;quot;number&amp;quot;  and  item &amp;gt; 0 then&lt;br /&gt;
            local suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            local entity = mw.wikibase.getEntity( suited )&lt;br /&gt;
            if type( entity ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local seek = Failsafe.serialProperty or &amp;quot;P348&amp;quot;&lt;br /&gt;
                local vsn  = entity:formatPropertyValues( seek )&lt;br /&gt;
                if type( vsn ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                   type( vsn.value ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
                   vsn.value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    if last  and  vsn.value == Failsafe.serial then&lt;br /&gt;
                        r = false&lt;br /&gt;
                    elseif link then&lt;br /&gt;
                        if mw.title.getCurrentTitle().prefixedText  ==&lt;br /&gt;
                           mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                            r = false&lt;br /&gt;
                        else&lt;br /&gt;
                            r = suited&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        r = vsn.value&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        if not since  or  since &amp;lt;= Failsafe.serial then&lt;br /&gt;
            r = Failsafe.serial&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fair( already, adapt, append )&lt;br /&gt;
    -- Merge local definitions into global base&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     already  -- global item&lt;br /&gt;
    --     adapt    -- local override item&lt;br /&gt;
    --     append   -- append to sequence table&lt;br /&gt;
    -- Returns merged item&lt;br /&gt;
    local r&lt;br /&gt;
    if already and adapt then&lt;br /&gt;
        if type( already ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
           type( adapt ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            r = already&lt;br /&gt;
            if append then&lt;br /&gt;
                for i = 1, #adapt do&lt;br /&gt;
                    table.insert( r, adapt[ i ] )&lt;br /&gt;
                end    -- for i&lt;br /&gt;
            else&lt;br /&gt;
                for k, v in pairs( adapt ) do&lt;br /&gt;
                    r[ k ] = v&lt;br /&gt;
                end    -- for k, v&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = adapt&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = already or adapt&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function feed( apply )&lt;br /&gt;
    -- Retrieve override from JSON code&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  --  string, with JSON&lt;br /&gt;
    -- Returns string, with error message, or table&lt;br /&gt;
    local lucky, r = pcall( mw.text.jsonDecode, apply )&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        r = &amp;quot;fatal JSON error in LOCAL override&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- feed()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function find( access )&lt;br /&gt;
    -- Fetch data from page&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --    access  -- string, with core page name&lt;br /&gt;
    -- Returns&lt;br /&gt;
    --    1. string, with prefixed page name&lt;br /&gt;
    --    2. table with JSON data, or error message&lt;br /&gt;
    local storage = access&lt;br /&gt;
    local lucky, r&lt;br /&gt;
    if Export.suffix  and  not storage:find( &amp;quot;.&amp;quot;, 2, true ) then&lt;br /&gt;
        local k = -1 - #Export.suffix&lt;br /&gt;
        if storage:sub( k ) ~= &amp;quot;.&amp;quot; .. Export.suffix then&lt;br /&gt;
            storage = string.format( &amp;quot;%s.%s&amp;quot;, storage, Export.suffix )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if Export.subpages  and  not storage:find( &amp;quot;/&amp;quot;, 1, true ) then&lt;br /&gt;
        storage = string.format( &amp;quot;%s/%s&amp;quot;, Export.subpages, storage )&lt;br /&gt;
    end&lt;br /&gt;
    lucky, r = pcall( mw.ext.data.get, storage, &amp;quot;_&amp;quot; )&lt;br /&gt;
    storage = &amp;quot;Data:&amp;quot; .. storage&lt;br /&gt;
    if mw.site.siteName ~= &amp;quot;Wikimedia Commons&amp;quot; then&lt;br /&gt;
        storage = &amp;quot;commons:&amp;quot; .. storage&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) ~= &amp;quot;table&amp;quot;  and  type( r ) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = &amp;quot;INVALID&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return storage, r&lt;br /&gt;
end -- find()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function flat( apply )&lt;br /&gt;
    -- Convert tabular data into TemplateData&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply -- table, with tabular data&lt;br /&gt;
    -- Returns string, with error message, or table, with TemplateData&lt;br /&gt;
    local r, scream&lt;br /&gt;
    local function failed( at, alert )&lt;br /&gt;
              if scream then&lt;br /&gt;
                  scream = string.format( &amp;quot;%s * #%d: %s&amp;quot;,&lt;br /&gt;
                                          scream, at, alert )&lt;br /&gt;
              else&lt;br /&gt;
                  scream = add&lt;br /&gt;
              end&lt;br /&gt;
          end -- failed()&lt;br /&gt;
    if type( apply.schema ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       type( apply.schema.fields ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       type( apply.data ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local order = { }&lt;br /&gt;
        local entry, got, params, parOrder, s, sign, td, v&lt;br /&gt;
        for k, v in pairs( apply.schema.fields ) do&lt;br /&gt;
            if type( v ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                table.insert( order, v.name )&lt;br /&gt;
            end&lt;br /&gt;
        end    -- for k, v&lt;br /&gt;
        for i = 1, #apply.data do&lt;br /&gt;
            entry = apply.data[ i ]&lt;br /&gt;
            if type( entry ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                got  = { }&lt;br /&gt;
                sign = false&lt;br /&gt;
                for j = 1, #entry do&lt;br /&gt;
                    s = order[ j ]&lt;br /&gt;
                    v = entry[ j ]&lt;br /&gt;
                    if type( v ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                        v = mw.text.trim( v )&lt;br /&gt;
                        if v == &amp;quot;&amp;quot; then&lt;br /&gt;
                            v = false&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    if v then&lt;br /&gt;
                        if s == &amp;quot;name&amp;quot; then&lt;br /&gt;
                            sign = v&lt;br /&gt;
                        elseif s == &amp;quot;aliases&amp;quot; then&lt;br /&gt;
                            if type( v ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                                got.aliases = mw.text.split( v,&lt;br /&gt;
                                                             &amp;quot;%s*|%s*&amp;quot; )&lt;br /&gt;
                            else&lt;br /&gt;
                                failed( i, &amp;quot;aliases not a string&amp;quot; )&lt;br /&gt;
                            end&lt;br /&gt;
                        else&lt;br /&gt;
                            got[ s ] = v&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end    -- for j&lt;br /&gt;
                if sign == &amp;quot;|&amp;quot; then&lt;br /&gt;
                    if td then&lt;br /&gt;
                        failed( i, &amp;quot;root repeated&amp;quot; )&lt;br /&gt;
                    else&lt;br /&gt;
                        td = { description = got.description }&lt;br /&gt;
                        if type( got.type ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                            td.format = got.type:gsub( &amp;quot;N&amp;quot;, &amp;quot;\n&amp;quot; )&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                elseif sign then&lt;br /&gt;
                    if params then&lt;br /&gt;
                        if params[ sign ] then&lt;br /&gt;
                            failed( i, &amp;quot;name repeated: &amp;quot; .. sign )&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        params   = { }&lt;br /&gt;
                        parOrder = { }&lt;br /&gt;
                    end&lt;br /&gt;
                    params[ sign ] = got&lt;br /&gt;
                    table.insert( parOrder, sign )&lt;br /&gt;
                else&lt;br /&gt;
                    failed( i, &amp;quot;missing name&amp;quot; )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                failed( i, &amp;quot;invalid component&amp;quot; )&lt;br /&gt;
            end&lt;br /&gt;
        end    -- for i&lt;br /&gt;
        r = td or { }&lt;br /&gt;
        r.params     = params&lt;br /&gt;
        r.paramOrder = parOrder&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;bad tabular structure&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return scream or r or &amp;quot;EMPTY&amp;quot;&lt;br /&gt;
end -- flat()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function flush( assembly, avoid )&lt;br /&gt;
    -- Remove element from sequence table&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assembly  -- sequence table&lt;br /&gt;
    --     avoid     -- element&lt;br /&gt;
    for i = 1, #assembly do&lt;br /&gt;
        if assembly[ i ] == avoid then&lt;br /&gt;
            table.remove( assembly, i )&lt;br /&gt;
            break    -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end    -- for i&lt;br /&gt;
end -- flush()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fold( already, adapt )&lt;br /&gt;
    -- Merge local parameter definitions into global base&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     already  -- table, with global data&lt;br /&gt;
    --     adapt    -- sequence table, with local params overrides&lt;br /&gt;
    -- Returns string, with error message, or table, with TemplateData&lt;br /&gt;
    local order  = { }&lt;br /&gt;
    local params = { }&lt;br /&gt;
    local r = already&lt;br /&gt;
    local entry, override, s&lt;br /&gt;
    r.params     = r.params or { }&lt;br /&gt;
    r.paramOrder = r.paramOrder or { }&lt;br /&gt;
    for i = 1, #adapt do&lt;br /&gt;
        override = adapt[ i ]&lt;br /&gt;
        if type( override ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            r = string.format( &amp;quot;No object at LOCAL params[%d]&amp;quot;, i )&lt;br /&gt;
            break    -- for i&lt;br /&gt;
        elseif type( override.global ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            s     = override.global&lt;br /&gt;
            entry = r.params[ s ]&lt;br /&gt;
            if type( entry ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                flush( r.paramOrder, s )&lt;br /&gt;
                if type( override[&amp;quot;local&amp;quot;] ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                    s = override[&amp;quot;local&amp;quot;]&lt;br /&gt;
                    override[&amp;quot;local&amp;quot;] = nil&lt;br /&gt;
                elseif override[&amp;quot;local&amp;quot;] == false then&lt;br /&gt;
                    entry = nil&lt;br /&gt;
                end&lt;br /&gt;
                if entry then&lt;br /&gt;
                    override.global = nil&lt;br /&gt;
                    for k, v in pairs( override ) do&lt;br /&gt;
                        entry[ k ] = fair( entry[ k ], override[ k ],&lt;br /&gt;
                                           ( k == &amp;quot;aliases&amp;quot; ) )&lt;br /&gt;
                    end    -- for k, v&lt;br /&gt;
                    table.insert( order, s )&lt;br /&gt;
                end&lt;br /&gt;
                params[ s ] = entry&lt;br /&gt;
            else&lt;br /&gt;
                r = string.format( &amp;quot;No GLOBAL params %s for LOCAL [%d]&amp;quot;,&lt;br /&gt;
                                   s, i )&lt;br /&gt;
                break    -- for i&lt;br /&gt;
            end&lt;br /&gt;
        elseif type( override[&amp;quot;local&amp;quot;] ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            s = override[&amp;quot;local&amp;quot;]&lt;br /&gt;
            override[&amp;quot;local&amp;quot;] = nil&lt;br /&gt;
            params[ s ] = override&lt;br /&gt;
            table.insert( order, s )&lt;br /&gt;
        else&lt;br /&gt;
            r = string.format( &amp;quot;No name for LOCAL params[%d]&amp;quot;, i )&lt;br /&gt;
            break    -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end    -- for i&lt;br /&gt;
    if type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        for i = 1, #r.paramOrder do&lt;br /&gt;
            s = r.paramOrder[ i ]&lt;br /&gt;
            params[ s ] = r.params[ s ]&lt;br /&gt;
            table.insert( order, s )&lt;br /&gt;
        end    -- for i&lt;br /&gt;
        r.params     = params&lt;br /&gt;
        r.paramOrder = order&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fold()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fork( already, adapt )&lt;br /&gt;
    -- Merge local definitions into global base&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     already  -- table, with global data&lt;br /&gt;
    --     adapt    -- table, with local overrides&lt;br /&gt;
    -- Returns string, with error message, or table, with TemplateData&lt;br /&gt;
    local root = { &amp;quot;description&amp;quot;, &amp;quot;format&amp;quot;, &amp;quot;maps&amp;quot;, &amp;quot;sets&amp;quot;, &amp;quot;style&amp;quot; }&lt;br /&gt;
    local r = already&lt;br /&gt;
    for k, v in pairs( root ) do&lt;br /&gt;
        if adapt[ v ] then&lt;br /&gt;
            r[ v ] = fair( r[ v ], adapt[ v ] )&lt;br /&gt;
        end&lt;br /&gt;
    end    -- for k, v&lt;br /&gt;
    if type( adapt.params ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = fold( r, adapt.params )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fork()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function furnish( apply, at, adapt )&lt;br /&gt;
    -- Convert external data into TemplateData&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- table, with external data&lt;br /&gt;
    --     at     -- string, with page name&lt;br /&gt;
    --     adapt  -- JSON string or table or not, with local overrides&lt;br /&gt;
    -- Returns string, with error message, or table, with TemplateData&lt;br /&gt;
    local r&lt;br /&gt;
    if at:sub( -4 ) == &amp;quot;.tab&amp;quot; then&lt;br /&gt;
        r = flat( apply )&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;Unknown page format: &amp;quot; .. at&lt;br /&gt;
    end&lt;br /&gt;
    if adapt  and  type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local override = adapt&lt;br /&gt;
        if type( adapt ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            override = feed( adapt )&lt;br /&gt;
            if type( override ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                r = override&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( override ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            r = fork( r, override )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- furnish()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Export.failsafe = function ( frame )&lt;br /&gt;
    -- Versioning interface&lt;br /&gt;
    local s = type( frame )&lt;br /&gt;
    local since&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        since = frame.args[ 1 ]&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        since = frame&lt;br /&gt;
    end&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since )&lt;br /&gt;
        if since == &amp;quot;&amp;quot; then&lt;br /&gt;
            since = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- Export.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Export.fetch = function ( access, adapt )&lt;br /&gt;
    -- Fetch data from site&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     access  -- string, with page specification&lt;br /&gt;
    --     adapt   -- JSON string or table or not, with local overrides&lt;br /&gt;
    -- Returns&lt;br /&gt;
    --    1. string, with error message or prefixed page name&lt;br /&gt;
    --    2. table with TemplateData, or not&lt;br /&gt;
    local storage, t = find( access )&lt;br /&gt;
    local s&lt;br /&gt;
    if type( t ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        t = furnish( t, storage, adapt )&lt;br /&gt;
        if type( t ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            s = t&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        s = t&lt;br /&gt;
    end&lt;br /&gt;
    if type( t ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        storage = string.format( &amp;quot;[[%s]]&amp;quot;, storage )&lt;br /&gt;
        if s then&lt;br /&gt;
            storage = string.format( &amp;quot;%s * %s&amp;quot;, storage, s )&lt;br /&gt;
        end&lt;br /&gt;
        t = false&lt;br /&gt;
    end&lt;br /&gt;
    return storage, t&lt;br /&gt;
end -- Export.fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return Export&lt;/div&gt;</summary>
		<author><name>imported&gt;Tholme</name></author>
	</entry>
</feed>