Zum Inhalt springen

„Modul:Cycling race“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
fix
test
Zeile 1.673: Zeile 1.673:
link = "[[Special:AboutTopic/" .. Qnumber .. "|" .. Label .. "]]"
link = "[[Special:AboutTopic/" .. Qnumber .. "|" .. Label .. "]]"
else
else
local title = mw.title.makeTitle( 0, Label )
local black_list = {}
if wiki == 'de' then
--local title = mw.title.new(Label) -- detect if there is a different local article with the same name
if not title.exists then link = "[[" .. Label.. "]]" else link = Label end
black_list = { ["Samuel Williams"] = false, ["Peter Williams"] = false } end
if black_list[Label] == true then --if Label ~= "Samuel Williams" and Label ~= "Peter Williams" then
--local title = mw.title.makeTitle( 0, Label )
local title = mw.title.new(Label) -- detect if there is a different local article with the same name
if not title.exists then link = "[[" .. Label.. "]]" else link = Label end
else link = Label end
end
end
else link = Label end
else link = Label end

Version vom 28. August 2016, 11:21 Uhr

Dokumentation

Das Modul Cycling race ist ein in Lua geschriebenes Programm und gehört zum Wikidata:WikiProjekt Radsport. Das Modul übernimmt nur Daten aus der Wikidata; mit Hilfe entsprechender Vorlagen werden diese Inhalte in einer Tabelle, Infobox, o. Ä. dargestellt und dürfen für die Wikipedia-Artikel verwendet werden. Das Modul selbst wird ebenso als Module:Cycling race auf Wikidata bereitgestellt, wo der entsprechende Quelltext von der Community weiterentwickelt wird. Der Code wird in regelmäßigen Abständen aktualisiert. Das Modul steht für alle Sprachversionen der Wikipedia zur Verfügung.

Allgemeine Hinweise

Es wird empfohlen, dass jede Verbesserung des Moduls bzw. des Codes zunächst auf der entsprechenden Hauptseite erfolgen soll. Verbesserungsvorschläge, Wünsche oder Fehlermeldungen sollen ebenso auf der Diskussionsseite des Moduls (in englischer Sprache) eingereicht und besprochen werden.

Sämtliche Updates auf der Wikidata-Hauptseite können 1:1 für die deutschsprachige Wikipedia-Seite übernommen werden. Nach dem Update wird empfohlen, die Vorlagen auf ihre vollständige Funktion zu überprüfen. Der Inhalt des Quellcodes darf nicht umgenannt werden.

Vorlagen

Übersicht der Vorlagen in alphabetischer Reihenfolge (Stand: Januar 2023)
Vorlage Beschreibung Kopiervorlage
Vorlage:Cycling race/bestyoungclassification Nachwuchswertung (Zeit)
{{Cycling race/bestyoungclassification|Wikidata-ID}}
Vorlage:Cycling race/bestyoungclassificationbypoints Nachwuchswertung (Punkte)
{{Cycling race/bestyoungclassificationbypoints|Wikidata-ID}}
Vorlage:Cycling race/calendar Rennkalender (inkl. Ergebnis) für UCI-Rennserien
{{Cycling race/calendar|Kürzel|Jahr}}
Vorlage:Cycling race/combinationclassification Kombinationswertung
{{Cycling race/combinationclassification|Wikidata-ID}}
Vorlage:Cycling race/combativeclassification Kämpferischster Fahrer
{{Cycling race/combativeclassification|Wikidata-ID}}
Vorlage:Cycling race/custompointsclassification Titelname ändern (Punkteklassements)
{{Cycling race/custompointsclassification|Wikidata-ID|p=Pxxxx|t=Titelname}}
Vorlage:Cycling race/generalclassification Gesamtwertung (Zeit)
{{Cycling race/generalclassification|Wikidata-ID}}
Vorlage:Cycling race/infobox Infobox (für jeweilige Ausgabe einer Rundfahrt & eines Eintagesrennen; nicht für Etappen und Radrennen im Allgemeinen)
{{Cycling race/infobox|Wikidata-ID}}
Vorlage:Cycling race/listofstages Etappenliste
{{Cycling race/listofstages|Wikidata-ID}}
Vorlage:Cycling race/listofstagesclassification Wertungen im Tourverlauf
{{Cycling race/listofstagesclassification|Wikidata-ID}}
Vorlage:Cycling race/listofteams Übersicht teilnehmender Teams bei Rundfahrt & Eintagesrennen
{{Cycling race/listofteams|Wikidata-ID}}
Vorlage:Cycling race/listofwinners Siegerliste (Rundfahrt und Eintagesrennen; Platz 1 bis 3 je Ausgabe)
{{Cycling race/listofwinners|Wikidata-ID}}
Vorlage:Cycling race/mountainsclassification Bergwertung
{{Cycling race/mountainsclassification|Wikidata-ID}}
Vorlage:Cycling race/pointsclassification Punktewertung
{{Cycling race/pointsclassification|Wikidata-ID}}
Vorlage:Cycling race/raceinfobox Infobox (Radrennen im Allgemeinen)
{{Cycling race/raceinfobox|Wikidata-ID}}
Vorlage:Cycling race/sprintsclassification Sprintwertung im Zwischensprint
{{Cycling race/sprintsclassification|Wikidata-ID}}
Vorlage:Cycling race/stageclassification Etappenergebnis (Zeit)
{{Cycling race/stageclassification|Wikidata-ID}}
Vorlage:Cycling race/stageinfobox Infobox (Etappen)
{{Cycling race/stageinfobox|Wikidata-ID}}
Vorlage:Cycling race/stagetitle Etappentitel (Start und Ziel, Etappenprofil und Streckenlänge)
{{Cycling race/stagetitle|Wikidata-ID}}
Vorlage:Cycling race/startlist Fahrerfeld/Startliste (Rundfahrt & Eintagesrennen)
{{Cycling race/startlist|Wikidata-ID}}
Vorlage:Cycling race/teamranking Bestplatzierung eines Teams (inkl. bester Fahrer) in einer UCI-Radrennserie
{{Cycling race/teamranking|Wikidata-ID|Kürzel}}
Vorlage:Cycling race/teamriderCompetitionranking Bestplatzierung in einer vordefinierten UCI-Radrennserie in einer Saison
{{Cycling race/teamriderCompetitionranking|Wikidata-ID|Kürzel}}
Vorlage:Cycling race/teamsclassificationbytime Mannschaftswertung (Zeit)
{{Cycling race/teamsclassificationbytime|Wikidata-ID}}
Vorlage:Cycling race/teamsclassificationbypoints Mannschaftswertung (Punkte)
{{Cycling race/teamsclassificationbypoints|Wikidata-ID}}
Vorlage:Cycling race/teamtimetrialclassification Etappenergebnis (nur bei Teamzeitfahren)
{{Cycling race/teamtimetrialclassification|Wikidata-ID}}
Vorlage:Cycling race/teamroster Übersicht Teamkader
{{Cycling race/teamroster|Wikidata-ID}}
Vorlage:Cycling race/UCIclassification UCI-Rangliste in einer Saison (Team)
{{Cycling race/UCIclassification|Wikidata-ID}}
Vorlage:Cycling race/victories Siegerliste (Team)
{{Cycling race/victories|Wikidata-ID}}

Übersetzung der Vorlagen

Saisons im UCI-Kalender und Grand Tours (inkl. Wertungstrikots)


local p = {}
flag_table = {}

function headoftableII(x) -- En-têtes des tableaux générant les classements
	local l10nDef = { }
	l10nDef["//fr.wikipedia.org"] = {"Coureur", "Pays", "Équipe", "Temps", "Points", "Classement de l'étape", "Classement général", "Classement par points", "Classement de la montagne", "Classement des sprints", "Classement du meilleur jeune", "Classement par équipes"}
	l10nDef["//br.wikipedia.org"] = {"Reder", "Bro", "Skipailh", "Amzer", "Poentoù", "Renkadur an tennad", "Renkadur hollek", "Renkadur a-boentoù", "Renkadur ar menez", "Renkadur ar sprintoù", "Renkadur ar yaouank gwellañ", "Renkadur a-skipailh"}
	l10nDef["//ca.wikipedia.org"] = {"Corredor", "País", "Equip", "Temps", "Punts", "Classificació de l'etapa", "Classificació general", "Classificació per punts", "Classificació de la muntanya", "Classificació dels esprints", "Classificació del millor jove", "Classificació per equips"}
	l10nDef["//da.wikipedia.org"] = {"Rytter", "Land", "Hold", "Tid", "Point", "Etapeplacering", "Samlede placering", "Pointkonkurrence", "Bjergkonkurrence", "Sprintkonkurrence", "Ungdomskonkurrence", "Holdkonkurrence"}
	l10nDef["//de.wikipedia.org"] = {"Fahrer", "Land", "Team", "Zeit", "Punkte", "Etappenergebnis", "Gesamtwertung", "Punktewertung", "Bergwertung", "Sprintwertung", "Nachwuchswertung", "Mannschaftswertung"}
	l10nDef["//eo.wikipedia.org"] = {"Kuranto", "Lando", "Teamo", "Tempo", "Poentoj", "Etapa klasifiko", "Gxenerala klasifiko", "Klasifiko laux poentoj", "Klasifiko por la montaro", "Klasifiko por la sprintoj", "Klasifiko de la plej bona juno", "Klasifiko po teamo"}
	l10nDef["//es.wikipedia.org"] = {"Ciclista", "País", "Equipo", "Tiempo", "Puntos", "Clasificación de la etapa", "Clasificación general", "Clasificación por puntos", "Clasificación de la montaña", "Clasificación de los sprints", "Clasificación del mejor joven", "Clasificación por equipos"}
	l10nDef["//eu.wikipedia.org"] = {"Txirrindularia", "Herrialdea", "Taldea", "Denbora", "Puntua", "Etapako sailkapena", "Sailkapen orokorra", "Puntukako sailkapena", "Mendiko sailkapena", "Esprinetako sailkapena", "Gazte onenaren sailkapena", "Taldekako sailkapena"}
	l10nDef["//fi.wikipedia.org"] = {"Pyöräilijä", "Maa", "Joukkue", "Aika", "Pisteet", "Etapin tulokset", "Kokonaistilanne", "Pistekilpailu", "Vuoristokilpailu", "Sprinttikilpailu", "Nuorten kilpailu", "Joukkuekilpailu"}
	l10nDef["//fo.wikipedia.org"] = {"Súkklari", "Land", "Lið", "Tíð", "Stig", "Teinaplasering", "Samlað plasering", "Stigkappingin", "Fjallakappingin", "Spurtkappingin", "Ungdómskappingin", "Liðkappingin"}
	l10nDef["//lb.wikipedia.org"] = {"Coureur", "Land", "Equipe", "Zäit", "Punkten", "Etappeklassement", "Generalklassement", "Klassement no Punkten", "Biergpräis", "Sprintklassement", "Beschte Jonken", "Equippeklassement"}
	l10nDef["//no.wikipedia.org"] = {"Rytter", "Land", "Lag", "Tid", "Poeng", "Etappeplassering", "Sammenlagtplassering", "Poengkonkurranse", "Klatrekonkurranse", "Sprintkonkurranse", "Ungdomskonkurranse", "Lagkonkurranse"}
	l10nDef["//nl.wikipedia.org"] = {"Renner", "Land", "Ploeg", "Tijd", "Punten", "Etappeklassement", "Algemeen Klassement", "Puntenklassement", "Bergklassement", "Sprintklassement", "Jongerenklassement", "Ploegenklassement"}
	l10nDef["//ro.wikipedia.org"] = {"Ciclist", "Țară", "Echipă", "Timp", "Puncte", "Clasamentul etapei", "Clasament general", "Clasament pe puncte", "Clasament cățărători", "Clasament sprinteri", "Clasamentul celui mai bun tânăr", "Clasament pe echipe"}
	l10nDef["//www.wikidata.org"] = l10nDef["//fr.wikipedia.org"]
	local l10n = l10nDef[mw.site.server]
	if not l10n then l10n = l10nDef["//fr.wikipedia.org"] end  -- default
	return l10n[x]
end

function getSquadTableColumn(x)
	local l10nDef = { } -- note (in the table), note (below the table)
	l10nDef["fr"] = {"Cycliste", "Date de naissance", "Équipe précédente", "note", "note"}
	l10nDef["en"] = {"Rider", "Date of birth", "Previous team", "note", "note"}
	l10nDef["br"] = {"Reder", "Deiziad genel", "Previous team", "note", "note"}
	l10nDef["ca"] = {"Ciclista", "Data de naixement", "Equip previ", "Nota", "Nota"}
	l10nDef["cs"] = {"Cyklista", "Datum narození", "Previous team", "note", "note"}
	l10nDef["da"] = {"Rytter", "Fødselsdag", "Seneste hold", "note", "note"}
	l10nDef["de"] = {"Name", "Geburtsdatum", "Vorheriges Team", "Anm.", "Anmerkung"}
	l10nDef["eo"] = {"Antaŭnomo Nomo", "Naskiĝtago", "Previous team", "note", "note"}
	l10nDef["es"] = {"Corredor", "Fecha de nacimiento", "Previous team", "note", "note"}
	l10nDef["eu"] = {"Izena", "Jaiotze-data", "Previous team", "note", "note"}
	l10nDef["fi"] = {"Ajaja", "Syntymäaika", "Previous team", "note", "note"}
	l10nDef["fo"] = {"Súkklari", "Føðingardagur", "Previous team", "note", "note"}
	l10nDef["hu"] = {"Név", "Születésnap", "Previous team", "note", "note"}
	l10nDef["it"] = {"Ciclista", "Data di nascita", "Previous team", "Nota", "Nota"}
	l10nDef["ja"] = {"選手名", "生年月日", "Previous team", "脚注", "脚注"}
	l10nDef["lb"] = {"Coureur", "Gebuertsdatum", "Previous team", "note", "note"}
	l10nDef["lv"] = {"Braucējs", "Dzimšanas datums", "Iepriekšējā komanda", "piezīme", "piezīme"}
	l10nDef["mk"] = {"Велосипедист", "Датум на раѓање", "Previous team", "Фуснота", "Фуснота"}
	l10nDef["nl"] = {"Naam", "Geboortedatum", "Previous team", "noot", "noot"}
	l10nDef["no"] = {"Rytter", "Fødselsdato", "Tidligere lag", "note", "note"}
	l10nDef["pl"] = {"Imię i nazwisko", "Data urodzenia", "Previous team", "Przypis", "Przypis"}
	l10nDef["pt"] = {"Ciclista", "Data de Nascimento", "Previous team", "Nota", "Nota"}
	l10nDef["ro"] = {"Ciclist", "Data nașterii", "Previous team", "note", "note"}
	l10nDef["ru"] = {"Гонщик", "Дата рождения", "Previous team", "Сноска", "Сноска"}
	l10nDef["sv"] = {"Namn", "Födelsedatum", "Previous team", "not", "not"}
	l10nDef["zh"] = {"車手", "出生日期", "Previous team", "脚注", "脚注"}

	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then l10n=l10nDef["fr"]
	else l10n=l10nDef[string.sub(wiki,string.find(wiki,"%a+"))] end
	return l10n[x]
end

function infobox_translate(x) -- This function permits to translate fields of the infobox, take the line below, give a Wikipedia (ex : mk), and translate all fields. By default, English values are taken.
	-- l10nDef["//??.wikipedia.org"] = {"RACE DETAILS", "COURSE", "COMPETITION", "COMPETITIONS", "STAGES", "DATE", "DATES", "DISTANCE", "COUNTRY", "COUNTRIES", 
	-- "JOURNEY ORIGIN", "JOURNEY DESTINATION", "TEAMS", "STARTING RIDERS", "ARRIVING RIDERS", "AVERAGE SPEED", "COST", "PALMARES", "WINNER", "SECOND", "THIRD", 
	-- "POINTS", "MOUNTAINS", "SPRINTS", "YOUTH", "COMBATIVITY", "COMBINATION", "TEAM", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation"}
 	local l10nDef = { }
	l10nDef["//fr.wikipedia.org"] = {"Généralités", "Course", "Compétition", "Compétitions", "Étapes", "Date", "Dates", "Distance", "Pays", "Pays",
	"Lieu de départ", "Lieu d'arrivée", "Équipes", "Partants", "Arrivants", "Vitesse moyenne", "Coût", "Résultats", "Vainqueur", "Deuxième", "Troisième",
	"Classement par points", "Meilleur grimpeur", "Meilleur sprinteur", "Meilleur jeune", "Super-combatif", "Meilleur au combiné", "Meilleure équipe", "Image", 
	"Légende", "Carte", "Special 1", "Special 2", "Documentation"}
	l10nDef["//en.wikipedia.org"] = {"Race details", "Course", "Competition", "Competitions", "Stages", "Date", "Dates", "Distance", "Country", "Countries",
	"Journey origin", "Journey destination", "Teams", "Starting riders", "Arriving riders", "Average speed", "Cost", "Palmares", "Winner", "Second", 
	"Third", "Points", "Mountains", "Sprints", "Youth", "Combativity", "Combination", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation"}
	l10nDef["//br.wikipedia.org"] = {"Hollegezhioù", "Redadeg", "Kevezadeg", "Kevezadegoù", "Tennadoù", "Deiziad", "Deiziadoù", "Hed", "Bro", "Broioù",
	"Lec'h loc'hañ", "Lec'h degouezhout", "Skipailhoù", "Loc'herien", "Erruerien", "Tizh keitat", "Koust", "Disoc'hoù", "Gounezer", "Eil", "Trede",
	"Renkadur a-boentoù", "Kraper gwellañ", "Sprinter gwellañ", "Yaouank gwellañ", "Stourmer meur", "Gwellañ el liesrenkadur", "Skipailh gwellañ", "Picture", "Caption", 
	"Map", "Special 1", "Special 2", "Documentation"}
	l10nDef["//ca.wikipedia.org"] = {"Detalls de la cursa", "Cursa", "Competició", "Competicions", "Etapes", "Data", "Dates", "Distància", "País", "Països",
	"Sortida", "Arribada", "Equips", "Inscrits", "Finalitzen", "Velocitat mitjana", "Cost", "Palmarès", "Vencedor", "Segon", "Tercer", "Punts", "Muntanya", 
	"Esprints", "Joves", "Combativitat", "Combinada", "Equip", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentació"}
	l10nDef["//cs.wikipedia.org"] = {"Přehled", "Závod", "Soutěž", "Soutěže", "Počet etap", "Datum", "Datum", "Celková délka", "Země", "Země", "Start", "Cíl", 
	"Týmy", "Běžci", "Příjezdy", "Rychlostní průměr", "Náklady", "Konečné pořadí", "Celkový vítěz", "2. místo", "3. místo", "Vítěz bodovací soutěže", "Nejlepší vrchař", 
	"Nejlepší sprinter", "Nejlepší mladý jezdec", "Nejaktivnější jezdec", "Nejlepší kombinovaná", "Nejlepší družstvo", "Picture", "Caption", "Map", "Special 1", 
	"Special 2", "Dokumentace"}
	l10nDef["//da.wikipedia.org"] = {"Løbsdetaljer", "Rute", "Konkurrence", "Konkurrencer", "Etaper", "Dato", "Datoer", "Distance", "Land", "Lande", "Startby", 
	"Målby", "Hold", "Startende ryttere", "Fuldførende ryttere", "Gennemsnitlig fart", "Pris", "Resultater", "Vinder", "Toer", "Treer", "Pointtrøje", "Bjergtrøje", 
	"Sprinttrøje", "Ungdomstrøje", "Mest angrebsivrige", "Kombinationstrøje", "Holdkonkurrence", "Billede", "Billedtekst", "Kort", "Special 1", "Special 2", "Dokumentation"}
	l10nDef["//de.wikipedia.org"] = {"Allgemeines", "Ausgabe", "Rennserie", " Wettbewerb", "Etappen", "Datum", "Datum", "Gesamtlänge", "Austragungsland", "Austragungsländer", 
	"Start", "Ziel", "Teams", "Fahrer am Start", "Fahrer im Ziel", "Durchschnitts­geschwindigkeit", "Kosten", "Sieger", "Gesamtwertung", "Zweiter", 
	"Dritter", "Punktewertung", "Bergwertung", "Sprintwertung", "Nachwuchswertung", "Kämpferischster Fahrer", "Kombinationswertung", "Teamwertung", "Bild", "Beschriftung", 
	"Karte", "Special 1", "Special 2", "Dokumentation"}
	l10nDef["//eo.wikipedia.org"] = {"Gxeneralajxo", "Bicikla konkurso", "Konkuro", "Konkuroj", "Etapoj", "Dato", "Datoj", "Longo", "Lando", "Landoj",
	"Komencloko", "Alvenloko", "Teamoj", "Startantoj", "Alvenantoj", "Averagxa rapido", "Kosto", "Rezultoj", "Venkinto", "Dua pozicio", "Tria pozicio",
	"Klasifiko laux poentoj", "Plej bona grimpanto", "Plej bona sprinto", "Plej bona juno", "Superbatalema", "Plej bona por kombino", "Plej bona teamo", "Picture", 
	"Caption", "Map", "Special 1", "Special 2", "Dokumentado"}
	l10nDef["//es.wikipedia.org"] = {"Detalles", "Carrera", "Válida para", "Válida para", "Etapas", "Fecha", "Fechas", "Distancia total", "País", "Países", 
	"Lugar de inicio", "Lugar de llegada", "Equipos", "Ciclistas que iniciaron", "Ciclistas que finalizaron", "Velocidad media", "Costo", "Clasificación final", 
	"Ganador", "Segundo", "Tercero", "Puntos", "Montaña", "Sprints", "Jóvenes", "Combatividad", "Combinación", "Equipo", "Picture", "Caption", "Map", "Special 1", 
	"Special 2", "Documentación"}
	l10nDef["//eu.wikipedia.org"] = {"Lasterketaren xehetasunak", "Ibilbidea", "Lehiaketa", "Lehiaketak", "Etapak", "Data", "Datak", "Distantzia", "Herrialdea", "Herrialdeak",
	"Jardunaldiko abiapuntua", "Jardunaldiko helmuga", "Taldeak", "Abiatutako txirrindulariak", "Iritsitako txirrindulariak", "Batez besteko abiadura", "Kostua", "Azken sailkapena", 
	"Irabazlea", "Bigarrena", "Hirugarrena", "Puntuak", "Mendiak", "Esprintak", "Gazteak", "Saiatuena", "Konbinatua", "Taldeak", "Picture", "Caption", "Map", 
	"Special 1", "Special 2", "Dokumentazioa"}
	l10nDef["//fi.wikipedia.org"] = {"Kilpailun tiedot", "Nimi", "Kilpailu", "Kilpailut", "Etapit", "Päivä", "Päivät", "Matka", "Maa", "Maat",
	"Lähtöpaikka", "Saapumispaikka", "Joukkueet", "Osallistuneet pyöräilijät", "Maaliin saapuneet pyöräilijät", "Keskinopeus", "Kustannukset", "Lopputilanne", "Voittaja",
	"Toinen", "Kolmas", "Pistekilpailu", "Mäkikirikilpailu", "Sprintit", "Nuoret", "Yritteliäin", "Yhdistelmä", "Joukkue", "Kuva", "Kuvateksti", "Kartta", "Special 1", 
	"Special 2", "Ohjesivu"}
	l10nDef["//fo.wikipedia.org"] = {"Smálutir", "Leið", "Kapping", "Kappingar", "Teinar", "Dagfesting", "Dagfestingar", "Strekki", "Land", "Lond", "Byrjunarbýur", 
	"Málbýur", "Lið", "Byrjandi súkklarar", "Fullførandi súkklarar", "Miðalferð", "Virðisløn", "Palmares", "Vinnari", "Nr. 2", "Nr. 3", "Stig", "Fjøll", 
	"Spurtar", "Ungdómur", "Mest álopssinnaður", "Kombinatión", "Lið", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentation"}
	l10nDef["//lb.wikipedia.org"] = {"Detailer", "Course", "Kompetitioun", "Kompetitiounen", "Etappen", "Datum", "Datumer", "Distanz", "Land", "Länner", 
	"Depart", "Arrivée", "Equippen", "Um Depart", "Ukomm", "Vitesse-Moyenne", "Käschten", "Palmarès", "Gewënner", "Zweeten", "Drëtten", "Beschte Sprinter", "Biergpräis", 
	"Sprinter", "Beschte Jonken", "Kombativitéit", "Kombinatioun", "Equipe", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentatioun"}
	l10nDef["//lv.wikipedia.org"] = {"Sacensību informācija", "Maršruts", "Sacensība", "Sacensības", "Posmi", "Datums", "Datumi", "Distance", 
	"Valsts", "Valstis", "Starts", "Finišs", "Komandas", "Braucēji startā", "Braucēji finišā", "Vidējais ātrums", "Izmaksas", "Rezultāti", 
	"Uzvarētājs", "Otrais", "Trešais", "Punkti", "Kalnu karalis", "Sprints", "Jaunais braucējs", "Cīnītājs", "Kombinācija", "Komanda", "Atēls", "Paraksts", 
	"Karte", "Papildinformācija 1", "Papildinformācija 2", "Dokumentācija"}
	l10nDef["//mk.wikipedia.org"] = {"Детали за трката", "Издание", "Натпреварување", "Натпреварувања", "Етапи", "Датум", "Датуми", "Растојание", 
	"Држава", "Држави", "Поаѓалиште", "Одредиште", "Екипи", "Возачи на почеток", "Возачи на крај", "Просечна брзина", "Трошоци", "Добитници на наградите", 
	"Победник", "Второпласиран", "Третопласиран", "Бодовен", "Планински", "Спринтерски", "Младински", "Борбеност", "Комбиниран", "Екипен", "слика", "опис", 
	"местоположбена карта", "Special 1", "Special 2", "Документација"}
	l10nDef["//nl.wikipedia.org"] = {"Wedstrijddetails", "Koers", "Wedstrijd", "Wedstrijden", "Etappes", "Datum", "Datums", "Afstand", "Land", "Landen", "Startplaats", 
	"Finishplaats", "Teams", "Aantal coureurs aan de start", "Aantal coureurs bij de aankomst", "Gemiddelde snelheid", "Kosten", "Palmares", "Winnaar", "Tweede", 
	"Derde", "Punten", "Bergen", "Sprints", "Jeugd", "Aanvalslust", "Combinatie", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentatie"}
	l10nDef["//no.wikipedia.org"] = {"Detaljer", "Ritt", "Konkurranse", "Konkurranser", "Etapper", "Dato", "Datoer", "Distanse", "Land", "Land", 
	"Startby", "Målby", "Lag", "Startende ryttere", "Fullførende ryttere", "Gjennomsnittsfart", "Kostnad", "Resultater", "Vinner", "2. plass", "3. plass", 
	"Poeng", "Klatre", "Sprint", "Ungdom", "Mest offensive", "Kombinasjon", "Lagkonkurranse", "Bilde", "Bildetekst", "Kart", "Special 1", "Special 2", "Dokumentasjon"}
	l10nDef["//pl.wikipedia.org"] = {"Wyrażenia ogólne", "Wyścig", "Konkurencja", "Konkursy", "Etapów", "Data", "Daty", "Dystans", "Państwo", "Państwy", "Odejście", 
	"Przyjazd", "Zespoły", "Zgłoszenia", "Ukończyło wyścig", "Średnia prędkość", "Koszt", "Podium", "Pierwsze miejsce", "Drugie miejsce", "Trzecie miejsce", "Punktowa", 
	"Górska", "Sprinterska", "Młodzieżowa", "Najaktywniejszych", "Kombinowana", "Drużynowa", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentacja"}
	l10nDef["//ro.wikipedia.org"] = {"Detalii cursă", "Cursă", "Competiție", "Competiții", "Etape", "Dată", "Date", "Distanță", "Țară", "Țări", "Start", "Sosire", 
	"Echipe", "Cicliști la start", "Cicliști la sosire", "Viteză medie", "Cost", "Palmares", "Câștigător", "Al doilea", "Al treilea", "Clasament pe puncte", 
	"Cel mai bun cățărător", "Cel mai bun sprinter", "Cel mai bun tânăr", "Combativitate", "Combinat", "Echipă", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentație"}
	l10nDef["//ru.wikipedia.org"] = {"Детали гонки", "Маршрут", "Соревнование", "Соревнования", "Этапы", "Дата", "Даты", "Дистанция", "Страна", "Страны", 
	"Место старта", "Пункт назначения", "Команды", "Вышло на старт гонщиков", "Финишировало гонщиков", "Средняя скорость", "Призовые", "Призёры", "Победитель", 
	"Второй", "Третий", "Очковая", "Горная", "Спринтерская", "Молодёжная", "Бойцовская", "Комбинированная", "Командная", "Picture", "Caption", "Map", "Special 1", 
	"Special 2", "Документация"}
	l10nDef["//sv.wikipedia.org"] = {"Race details", "Course", "Competition", "Competitions", "Stages", "Date", "Dates", "Distance", "Country", "Countries",
	"Journey origin", "Journey destination", "Teams", "Starting riders", "Arriving riders", "Average speed", "Cost", "Palmares", "Winner", "Second", 
	"Third", "Points", "Mountains", "Sprints", "Youth", "Combativity", "Combination", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation"}
	l10nDef["//www.wikidata.org"] = l10nDef["//en.wikipedia.org"]
	local l10n = l10nDef[mw.site.server]
	if not l10n then l10n = l10nDef["//en.wikipedia.org"] end  -- default
	return l10n[x]
end 

function unit_of_time(x)
	local l10nDef = { } 
	l10nDef["//fr.wikipedia.org"] = {"en", " h ", " min ", " s"}
	l10nDef["//lb.wikipedia.org"] = {"", " h ", " min ", " s"}
	l10nDef["//es.wikipedia.org"] = {"", " h ", " min ", " s"}
	l10nDef["//da.wikipedia.org"] = {"", "t ", "' ", '"'}
	l10nDef["//de.wikipedia.org"] = {"", " h ", " min ", " s"}
	l10nDef["//it.wikipedia.org"] = {"", "h", "'", '"'}
	l10nDef["//br.wikipedia.org"] = {"", "e ", "' ", '"'}
	l10nDef["//no.wikipedia.org"] = {"", "t ", "' ", '"'}
	l10nDef["//ru.wikipedia.org"] = {"", "ч ", "' ", ""}
	l10nDef["//mk.wikipedia.org"] = {"", "ч ", "' ", ""}
	l10nDef["//eu.wikipedia.org"] = {"", " o ", " min ", " s"}
	l10nDef["//nl.wikipedia.org"] = {"", "u", "'", '"'}
	l10nDef["//fo.wikipedia.org"] = {"", "t ", "' ", '"'}
	l10nDef["//fi.wikipedia.org"] = {"", ".", ".", ""}
	l10nDef["//www.wikidata.org"] = {"", "h ", "' ", '"'}

	local l10n = l10nDef[mw.site.server]
	if not l10n then l10n = l10nDef["//www.wikidata.org"] end  -- default for lv,cs,en,ca,hu,ro,pt,pl,sv
	return l10n[x]
end

function number(gender, b, wiki)
local str
if b=="" then return "" end
str = b .. ". "
if wiki == "ca" then 
	if b==1 then str = b.."r" end
	if b==2 then str = b.."n" end
	if b==3 then str = b.."r" end
	if b==4 then str = b.."t" end	
	if b>4  then str = b.."è" end
end
if wiki=="es" then str = b..".ª" end
if wiki=="fr" or wiki=="www" then
	if b==1  then 
		if gender == 'm' then str="1<sup>er</sup>"
		elseif gender == 'f' then str="1<sup>re</sup>"
		else str="1<sup>e</sup>" end
	else str=b.."<sup>e</sup>" end 
end
if wiki=="nl" then str=b.."e" end
if wiki=="ru" then str=b.."-й" end
if wiki=="eo" then str=b.."-a" end
return str
end

function classification(item, property, wiki)
	local entity = mw.wikibase.getEntityObject( item )
	local g = {nr={}, riderIDs={}, riderNames={}, riderGender={}, jersey={}, jerseyIDs={}, jersey_name={}, flags={}, country={}, 
		team={}, time={}, time_gap={}, time_date=false, no_country=true }
	local startOfSeason = '' --'+2016-01-01T00:00:00Z'

	pcall(function() startOfSeason = entity.claims["P580"][1].mainsnak.datavalue.value.time end) 
	if startOfSeason == '' then 
		if pcall(function() startOfSeason = entity.claims["P585"][1].mainsnak.datavalue.value.time end) then
		else
			local Sitelink = entity:getSitelink('enwiki') or entity:getSitelink('frwiki') or entity:getSitelink('dewiki') or ''
			if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
			else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z' 
			end 
		end
	end

	local k, v, a, b, rank
	local max_rank = 0
	local nr_jersey -- number of jerseys one rider has

pcall(function()
	for k, _ in pairs(entity.claims[property]) do -- look into all statements
		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'
			rank = tonumber(v.datavalue.value.amount) break
		end
		if rank > max_rank then max_rank = rank end

		nr_jersey = 1
		g.jersey[rank], g.jersey_name[rank], g.jerseyIDs[rank] = {}, {}, {}
		local entity_jersey
		if pcall(function()
		for _, v in pairs(entity.claims[property][k].qualifiers['P2912']) do -- for property 'distinctive jersey'
			g.jerseyIDs[rank][nr_jersey] = 'Q'..v.datavalue.value['numeric-id']
			entity_jersey = mw.wikibase.getEntityObject(g.jerseyIDs[rank][nr_jersey])	
			g.jersey[rank][nr_jersey] = 'File:'.. entity_jersey.claims['P18'][1].mainsnak.datavalue.value
			g.jersey_name[rank][nr_jersey] = entity_jersey:getLabel() or entity_jersey:getLabel( 'fr' ) 
			nr_jersey = nr_jersey + 1
		end		
		end) then else g.jersey[rank][1] = '' end

		g.riderIDs[rank] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id']
		g.riderNames[rank] = WPlink(g.riderIDs[rank])

		a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject( g.riderIDs[rank] ), 'P21', 1)
		if a == true then 
			if b == 6581097 then g.riderGender[rank] = 'm' -- men
			elseif b == 6581072 then g.riderGender[rank] = 'f' -- female
			else g.riderGender[rank] = '' end
		else g.riderGender[rank] = '' end

		g.nr[rank] = rank

		a, b = timeStartEnd(g.riderIDs[rank], "P27", 'numeric-id', startOfSeason)
	   	if a == true then 
	   		g.flags[rank] = flag('Q'..b, startOfSeason) 
	   		-- Add your wiki if you don´t want to see the country names written in the table
			if wiki ~= 'www' and wiki ~= 'your wiki' then 
	   			local country = mw.wikibase.getEntityObject( 'Q'..b )
	   			g.country[rank] = country:getLabel() or country:getLabel('en') .. ' (en)'
			end
	   	end

		g.team[rank] = national_team(wiki, g.riderIDs[rank], startOfSeason, entity, property, k)

	   	if pcall(function()
			for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time'
		   		g.time[rank] = tonumber(v.datavalue.value.amount)
			end 
		end) then else g.time[rank] = '' end
	
	   	if pcall(function()
			for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap'
		   		g.time_gap[rank] = tonumber(v.datavalue.value.amount)
			end 
		end) then else g.time_gap[rank] = '' end	
	
	end -- end for
end)

	for i= 1,max_rank do
		if g.nr[i] == nil then g.nr[i]='' end
		if g.riderNames[i] == nil then g.riderNames[i]='' end
--		if g.jersey[i] == nil then g.jersey[i] ='' end
		if g.flags[i] == nil then g.flags[i]='' end
		if g.country[i] == nil then g.country[i]='' else g.no_country=false end
		if g.team[i] == nil then g.team[i]='' end
		if g.time[i] == nil then g.time[i] ='' end
		if g.time[i] ~= '' then g.time_date = true end
		if g.time_gap[i] == nil then g.time_gap[i] ='' end
	end
	
	return g
end

function p.generalclassification(frame)
local WDlink_on
local wiki = string.match(mw.site.server, "%a+")
frame.args[1] =	string.gsub(frame.args[1], "%c", "")
local item =frame.args[1]
local property = 'P2321' 
local content = classification(item, property, wiki)
local time_headoftable = '' -- if there is time data in the classification, print the column time
if content.time_date == true then time_headoftable = headoftableII(4) end

if wiki == "mk" or wiki == "ja" or wiki == "lv" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

local tableStart = '<table border="0" cellspacing="0" cellpadding="0"><th colspan="5" style="padding:2px 2px; text-align:center; background-color:#FFDF80">'
local tableHeader1 = ''
if WDlink_on == false then tableHeader1 = tableHeader1 .. '<span style="float:left">[[File:Wikidata-logo S.svg|12px|link=d:'.. frame.args[1].. '#P2321]]</span>' end
tableHeader1 = tableHeader1 .. headoftableII(7)
local tableHeader2 = '<tr>'.. 
	'<th colspan="2" nowrap style="text-align:center;padding:2px 2px">'..headoftableII(1)..
	'<th nowrap style="text-align:center">'..headoftableII(2)..
	'<th nowrap style="text-align:center">'..headoftableII(3)..	
	'</th><th nowrap style="text-align:center">'..time_headoftable .. '</th></tr>'  -- '' or 'temp', depending on available time data 
local tableBody = ''
local tableEnd = '</th></table>'

local i = 1
local bg_color -- background color
while content.riderNames[i] do
	tableBody = tableBody .. '<tr' 
	-- find the right background color if a rider has more then one jersey
	-- see Wikidata:WikiProject Cycling/Kit to translate/Jerseys
	if type(content.jersey[i]) == 'table' and content.jersey[i][1] ~= '' then
		local num = 1 -- loop for more then one jersey per rider
		while content.jerseyIDs[i][num] ~= nil do
			if content.jerseyIDs[i][num] == "Q24257872" then bg_color="#FF8666" end -- Jersey red.svg
			if content.jerseyIDs[i][num] == "Q24257763" then bg_color="pink" -- Jersey pink.svg
				if wiki == "ca" then bg_color="lightpink" end
			end
			if content.jerseyIDs[i][num] == "Q24257871" then bg_color="#FFFF99" end -- Jersey yellow.svg
--			if content.jerseyIDs[i][num] == "???" then bg_color="Azure" end -- Jersey white.svg
--			if content.jerseyIDs[i][num] == "???" then bg_color="#99CBFF" end -- Jersey blue.svg
--			if content.jerseyIDs[i][num] == "Q24257991" then bg_color="???" end -- Jersey gold.svg		
--			if content.jerseyIDs[i][num] == "Q24258056" then bg_color="???" end --	Jersey orange.svg		
--			if content.jerseyIDs[i][num] == "File:Jersey yellow.svg" then bg_color="???" end -- Jersey yellow.svg
--			if content.jerseyIDs[i][num] == "Q24645208" then bg_color="???" end -- Jersey green.svg
--			if content.jerseyIDs[i][num] == "Q24258125" then bg_color="???" end -- Jersey green 2.svg
			num = num + 1
		end
	end

	if i == 1 then 
		tableBody = tableBody ..' style="font-weight:bold;' -- winner is formated bold
		if type(content.jersey[i]) == 'table' and content.jersey[i][1] ~= '' and bg_color ~= nil then -- background color of winner depending on jersey	
			tableBody = tableBody ..'background-color:'..bg_color..'"' 
		else tableBody = tableBody ..'"' end
	end
	tableBody = tableBody ..'><td nowrap style="padding:2px 0.5em 2px 0.5em;text-align:center">'.. number(content.riderGender[i], content.nr[i], wiki)..
		'</td><td nowrap style="padding:0 0.2em 0 0.2em">'.. content.riderNames[i]
	if type(content.jersey[i]) == 'table' and content.jersey[i][1] ~= '' then
		tableBody = tableBody ..' '
		local num = 1 -- loop for more then one jersey per rider
		while content.jersey[i][num] ~= nil do
			tableBody = tableBody ..'[['..content.jersey[i][num]..'|20px|'..content.jersey_name[i][num]..']]'
			num = num + 1
		end
	end

	tableBody = tableBody.. '</td><td nowrap style="padding:0 0.2em 0 0.2em;">'.. content.flags[i].. ' '.. content.country[i]..
	'</td><td style="padding:0 0.2em 0 0.2em">' .. content.team[i]

	-- calculate time
	if content.time[i] == '' and content.time_gap[i] == '' then tableBody = tableBody .. '</td><td>' else
		local h,m,s=0,0,0
		if i == 1 and content.time[i]~='' then 
			if content.time[i] < 60 then s = content.time[i]
			elseif content.time[i] < 3600 then m = math.modf(content.time[i]/60) s = content.time[i] - m*60
			else h = math.modf(content.time[i]/3600) m = math.modf((content.time[i] - h*3600)/60)  s = content.time[i] - h*3600 - m*60
			end			

			tableBody = tableBody.. '</td><td nowrap style="padding:0 0.2em 0 0.2em"> '..unit_of_time(1)..' '
			if h>0 then tableBody = tableBody..mw.ustring.format ('%i'..unit_of_time(2), h) end
			if m>0 then tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(3), m) end
			tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(4), s)
		elseif content.time_gap[i]~= '' then
			local dif = tonumber(content.time_gap[i]) 
			if dif < 60 then s = dif 
			elseif dif < 3600 then m = math.modf(dif/60) s = dif - m*60
			else h = math.modf(dif/3600) m = math.modf((dif - h*3600)/60)  s = dif - h*3600 - m*60
			end
			tableBody = tableBody.. '</td><td style="padding:0 0.2em 0 0.2em; text-align:right">'
			if h>0 then tableBody = tableBody..mw.ustring.format ('+ %i'..unit_of_time(2), h) end
			if m>0 and h>0 then tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(3), m) end
			if m>0 and h==0 then tableBody = tableBody.. mw.ustring.format('+ %i'..unit_of_time(3), m) end
			if s>=0 and (h>0 or m>0) then tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(4), s) end
			if s>=0 and h==0 and m==0 then tableBody = tableBody.. mw.ustring.format('+ %i'..unit_of_time(4), s) end
		end
	end		
	i = i + 1
end -- end while

tableBody = tableBody.. '</td></tr>' 

return '<table style="border:1px solid rgb(200,200,200)"><tr><td>'.. 
	tableStart.. tableHeader1.. tableHeader2.. tableBody.. tableEnd.. '</td></tr></table><br style="clear:left;">' 
end

function p.stageclassification(frame)
local WDlink_on
local wiki = string.match(mw.site.server, "%a+")
frame.args[1] =	string.gsub(frame.args[1], "%c", "")
local item =frame.args[1]
local property = 'P2417' 
local content = classification(item, property, wiki)
local time_headoftable = '' -- if there is time data in the classification, print the column time
if content.time_date == true then time_headoftable = headoftableII(4) end

if wiki == "mk" or wiki == "ja" or wiki == "lv" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

local tableStart = '<table border="0" cellspacing="0" cellpadding="0"><th colspan="5" style="padding:2px 2px; text-align:center; background-color:#FFDF80">'
local tableHeader1 = ''
if WDlink_on == false then tableHeader1 = tableHeader1 .. '<span style="float:left">[[File:Wikidata-logo S.svg|12px|link=d:'.. frame.args[1].. '#P2321]]</span>' end
tableHeader1 = tableHeader1 .. headoftableII(6)
local tableHeader2 = '<tr>'.. 
	'<th colspan="2" nowrap style="text-align:center;padding:2px 2px">'..headoftableII(1)..
	'<th nowrap style="text-align:center">'..headoftableII(2)..
	'<th nowrap style="text-align:center">'..headoftableII(3)..	
	'</th><th nowrap style="text-align:center">'..time_headoftable .. '</th></tr>'  -- '' or 'temp', depending on available time data 
local tableBody = ''
local tableEnd = '</th></table>'


local i = 1
local bg_color -- background color
while content.riderNames[i] do
	tableBody = tableBody .. '<tr' 	
	if i == 1 then tableBody = tableBody ..' style="font-weight:bold;"' end -- winner is formated bold
	tableBody = tableBody ..'><td nowrap style="padding:2px 0.5em 2px 0.5em;text-align:center">'.. number(content.riderGender[i], content.nr[i], wiki)..
		'</td><td nowrap style="padding:0 0.2em 0 0.2em">'.. content.riderNames[i]
	if type(content.jersey[i]) == 'table' and content.jersey[i][1] ~= '' then
		tableBody = tableBody ..' '
		local num = 1 -- loop for more then one jersey per rider
		while content.jersey[i][num] ~= nil do
			tableBody = tableBody ..'[['..content.jersey[i][num]..'|20px|'..content.jersey_name[i][num]..']]'
			num = num + 1
		end
	end

	tableBody = tableBody.. '</td><td nowrap style="padding:0 0.2em 0 0.2em;">'.. content.flags[i].. ' '.. content.country[i]..
	'</td><td style="padding:0 0.2em 0 0.2em">' .. content.team[i]

	-- calculate time
	if content.time[i] == '' and content.time_gap[i] == '' then tableBody = tableBody .. '</td><td>' else
		local h,m,s=0,0,0
		if i == 1 and content.time[i]~='' then 
			if content.time[i] < 60 then s = content.time[i]
			elseif content.time[i] < 3600 then m = math.modf(content.time[i]/60) s = content.time[i] - m*60
			else h = math.modf(content.time[i]/3600) m = math.modf((content.time[i] - h*3600)/60)  s = content.time[i] - h*3600 - m*60
			end			

			tableBody = tableBody.. '</td><td nowrap style="padding:0 0.2em 0 0.2em"> '..unit_of_time(1)..' '
			if h>0 then tableBody = tableBody..mw.ustring.format ('%i'..unit_of_time(2), h) end
			if m>0 then tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(3), m) end
			tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(4), s)
		elseif content.time_gap[i]~= '' then
			local dif = tonumber(content.time_gap[i]) 
			if dif < 60 then s = dif 
			elseif dif < 3600 then m = math.modf(dif/60) s = dif - m*60
			else h = math.modf(dif/3600) m = math.modf((dif - h*3600)/60)  s = dif - h*3600 - m*60
			end
			tableBody = tableBody.. '</td><td style="padding:0 0.2em 0 0.2em; text-align:right">'
			if h>0 then tableBody = tableBody..mw.ustring.format ('+ %i'..unit_of_time(2), h) end
			if m>0 and h>0 then tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(3), m) end
			if m>0 and h==0 then tableBody = tableBody.. mw.ustring.format('+ %i'..unit_of_time(3), m) end
			if s>=0 and (h>0 or m>0) then tableBody = tableBody.. mw.ustring.format('%02i'..unit_of_time(4), s) end
			if s>=0 and h==0 and m==0 then tableBody = tableBody.. mw.ustring.format('+ %i'..unit_of_time(4), s) end
		end
	end		
	i = i + 1
end -- end while

tableBody = tableBody.. '</td></tr>' 

return '<table style="float:left; margin-right:0.5em; border:1px solid rgb(200,200,200)"><tr><td>'.. 
	tableStart.. tableHeader1.. tableHeader2.. tableBody.. tableEnd.. '</td></tr></table>' 
end

function references(entity, property, var1)
	local wiki = string.match(mw.site.server, "%a+")
	local ref1, ref2, ref2b, ref3, ref4 = "", " ", "", "", ""
	local url, ref
	local lang = mw.language.getContentLanguage()
	local a, b

	if wiki == 'www' then wiki = 'fr' lang = mw.getLanguage('fr') end

	a, b = pcall(fooB, 'value', entity, property, var1, 1, 'P854', 1) -- url
	if a == true then ref1 = b end
	a, b = pcall(fooB, 'text', entity, property, var1, 1, 'P1476', 1) -- Originaltitel der webpage, "language": "fr"
	if a == true then 
		ref2 = b 
		ref2b= entity.claims[property][var1].references[1].snaks['P1476'][1].datavalue.value.language or ''
		if ref2b == wiki then ref2b = '' else ref2b = '(' .. ref2b .. ') ' end
	end
	a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P577', 1) -- publication date
	if a == true then
		local _, _, year, m, d = string.find(b,"(%d+)-(%d+)-(%d+)")
		if d ~= '00' and m ~= '00' then
			if wiki == "de" then ref3 = ', ' .. lang:formatDate( "j. F Y", b) 
			elseif wiki == "en" then ref3 = ', ' .. lang:formatDate( "Y F, j", b) .. '.' 
			elseif wiki == "fr" then ref3 = ', ' .. lang:formatDate( "j F Y", b)
			else ref3 = ', ' .. func_date (b, wiki, 'long') .. '.'  --lang:formatDate( "j n Y", b) .. '.' 
			end
		elseif d == '00' and m ~= '00' then
			d = '01'
			if wiki == "de" then ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d ) 
			elseif wiki == "en" then ref3 =', ' .. lang:formatDate( "Y F", year..'-'..m..'-'..d )..'.'
			elseif wiki == "fr" then ref3 =', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )				
			else ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.'
			end
		else ref3 = year 
		end
	end
	a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P813', 1) -- Retrieved
	if a == true then 
		if wiki == "de" then ref4 = ", (abgerufen am " .. lang:formatDate( "j. F Y", b).. ')'
		elseif wiki == "en" then ref4 = " Retrieved " .. lang:formatDate( "Y F, j", b) .. '.'
		elseif wiki == "fr" then ref4 = " (consulté le " .. lang:formatDate( "j F Y", b) .. ')'
		else ref4 = " Retrieved " .. func_date (b, wiki, 'long').. '.' --lang:formatDate( "j n Y", b) .. '.'
		end
	end

	if ref1~='' then --and ref2~='' then
		local _, start = string.find( ref1, '//' ) 
		local ende, _ = string.find( ref1, '/', start + 1 )
		local s = string.sub(ref1, start + 1, ende - 1) 
		local s2 = string.gsub(s, "www.", "")
		if wiki == "fr" then 
		-- fr: "(en) « Lloyd Mondory ... EPO », sur velonews.competitor.com (consulté le 30 april 2016), 30 octobre 2015." 
			if ref2~=' ' then url= ', sur <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end
			ref = ref2b .. '« ['.. ref1.. ' '.. ref2.. '] »' .. url .. ref4 .. ref3 ..'.'
		elseif wiki == "en" then 
		-- en: "Inflation ... recession", Pittsburgh Post-Gazette, October 16, 2009. Retrieved 2010-01-21.
			if ref2~=' ' then url= ', <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end
			ref = '"['.. ref1.. ' '.. ref2.. '"]'.. ref2b .. url .. ref3 .. ref4			
		elseif wiki == "de" then 
			if ref2~=' ' then url= ' In: <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end			
			ref = '<span style="font-style:italic;">['.. ref1.. ' '.. ref2.. '.]</span> '.. url.. ref3 .. ref4 ..'.'
		else 
			if ref2~=' ' then url= ' <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end			
			ref = ref2b .. '['.. ref1.. ' '.. ref2.. '] ' .. url.. ref3 .. ref4 
		end
--	end-- end if wiki == 'www'	
return ref or ''
else return ''
end 
end

function p.infobox(frame)
	local t = {is_a="", class="", stage="", starttime="", endtime="", time="", date="", dates="", length="", length_unit="", 
	startplace="", endplace="", nr_teams="", nr_participants_start="", nr_participants_end="", speed="", speed_unit="", cost="", cost_unit="", 
	first="", first_team="", second="", second_team="", third="", third_team="", winner_point="", winner_point_team="", winner_mountain="", winner_mountain_team="", 
	winner_sprint="", winner_sprint_team="", winner_young="", winner_young_team="", winner_fighting="", winner_fighting_team="", winner_combination="", 
	winner_combination_team="", winner_team="", previous="", next=""}
	local ref = {stage="", starttime="", endtime="", time="", date="", dates="", length="", nr_participants_start="", nr_participants_end="", 
	speed="", speed_unit="", cost="", first="", second="", third="", winner_point="", winner_mountain="", winner_sprint="", winner_young="", 
	winner_fighting="", winner_combination="", winner_team=""}
	local tt = {icon="", picture="", caption="", name="", nr="", map="" }
	local ttt = {tour={}, country={}}
	local tttt = {special_1a="", special_1b="", special_2a="", special_2b=""}
	
	local entity = ""
	local y, m, d = "", "", ""
	local y2, m2, d2 = "", "", ""
	local a, b, c, k, num, i
	local entityId = frame.args[1]
	local lang = mw.language.getContentLanguage()
	local wiki = string.match(mw.site.server, "%a+")
	local results = false
	local a1, b1, c1, a2, b2, c2
	local timeofrace

	if type( entityId ) ~= 'string' then error( 'parameter must be a string') end
	if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end
	local entity = mw.wikibase.getEntity( entityId )

	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end

	if localFrame.args[infobox_translate(29)] then tt.picture = localFrame.args[infobox_translate(29)] end 
	if localFrame.args[infobox_translate(30)] then tt.caption = localFrame.args[infobox_translate(30)] end 
	if localFrame.args[infobox_translate(31)] then tt.map = localFrame.args[infobox_translate(31)] end 

	if  entity:getLabel() ~= nil then tt.name = entity:getLabel()
	else
		if entity:getLabel( 'fr' ) ~= nil then tt.name = entity:getLabel( 'fr' ).. " (fr)"
		else tt.name = "Wikidata doesn´t know" end 
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P641', 1) 
	if a == true then -- icon for road bicycle racing, Q3609 (road bicycle racing)
		if b == 3609 then tt.icon = " [[File:Cycling (road) pictogram.svg|35px]]" end 
	end
	a, b = pcall(fooA, 'value', entity, 'P18', 1) 
	if a == true and tt.picture == "" then 
		local v
		tt.picture = b
		if pcall(foo3, entity, "P18", 1, "P2096", 1) then
			for _, v in pairs(entity.claims["P18"]) do
				for num=1,#v.qualifiers["P2096"] do
					if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode() then
					tt.caption = v.qualifiers["P2096"][num].datavalue.value.text end
				end
			end
		end
	end
	
	-- For FR Wiki and Wikidata, exception that permit to display 1er, 2e... for the edition number ; 
	-- for RU Wiki, -й is written after the value of P393
	a, b = pcall(fooA, 'value', entity, 'P393', 1)
	if a == true and tt.nr == "" then
		tt.nr = b .. ". "
		if wiki == "fr" or wiki == "www" then
			if b == 1  then tt.nr = "1<sup>re</sup> " else tt.nr = b .."<sup>e</sup> " end end
		if wiki == "nl" then tt.nr = b .."e " end
		if wiki == "ru" then tt.nr = b .."-й " end
		if wiki == "eo" then tt.nr = b .."-a " end
		if wiki == "cs" then tt.nr = b ..". " end
	end
	-- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem
	local class = { "Q22231106", "Q22231107", "Q22231108", "Q22231109", "Q22231110", "Q22231111", "Q22231112",
		"Q22231113", "Q22231114", "Q22231115", "Q22231116", "Q22231117", "Q22231118", "Q22231119", "Q23015458", "Q23005601", "Q23005603" } 
	a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- first value for P31
	c, d = pcall(fooA, 'numeric-id', entity, 'P31', 2) -- second value for P31
	if a == true and c == true then -- for two values
		for i=1,#class do -- #class = number of elements in class
   			if "Q"..b == class[i] then t.class = "c"..b t.is_a = "Q"..d break end
   			if "Q"..d == class[i] then t.class = "c"..d t.is_a = "Q"..b break end  		
   		end
 	else -- if there is only one value, assume it is not a class
		if a == true or c == true then t.is_a = "Q"..b end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P361', 1) -- Competition of the cycling race : UCI World Tour 2016, UCI Europe Tour 2016...
	if a == true then --ttt.tour = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P361"]) do
			ttt.tour[i] = "T" .. v.mainsnak.datavalue.value["numeric-id"]
		end
	end

	if t.stage == "" then
		if pcall(function() -- This function count the number of value for P527 to determine the number of stages
			t.stage = table.getn(entity.claims["P527"])
		end
		) then else t.stage = "" end
	end

	a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', 1) 
	if a1 == true and t.starttime == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', i) 
		end  
		--b1 = "+2015-07-04T00:00:00Z"
		_, _, y, m, d = string.find(b1, "(%d+)-(%d+)-(%d+)")  
	end
	a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', 1) 
	if a2 == true and t.endtime == "" then i = 1
		while a2 == true and c2 == 'deprecated' do 
			i = i + 1 
			a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', i) 
		end  
		--b2 = "+2015-07-05T00:00:00Z"
		_, _, y2, m2, d2 = string.find(b2, "(%d+)-(%d+)-(%d+)")
	end
	if a1 == true and t.starttime == "" then 
		if y ~= y2 then t.starttime = lang:formatDate( "j F Y", b1 ) 
		elseif m ~= m2 then t.starttime = lang:formatDate( "j F", b1 )
		else t.starttime = lang:formatDate( "j", b1 )
		end
		if wiki == "br" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j", b1 ) .." a viz ".. lang:formatDate( "F Y", b1 )		
			elseif m ~= m2 then t.starttime = lang:formatDate( "j", b1 ) .." a viz ".. lang:formatDate( "F", b1 )		
			else t.starttime = lang:formatDate( "j", b1 ) .." "	
			end	end	
		if wiki == "ca" or wiki == "es" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j", b1 ) .." de ".. lang:formatDate( "F", b1 ) .." de ".. lang:formatDate( "Y", b1 )
			elseif m ~= m2 then t.starttime = lang:formatDate( "j", b1 ) .." de ".. lang:formatDate( "F", b1 )		
			else t.starttime = lang:formatDate( "j", b1 ) .." "	
			end	end	
		if wiki == "cs" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j. xg Y", b1 )
			elseif m ~= m2 then t.starttime = lang:formatDate( "j. xg", b1 )
			else t.starttime = lang:formatDate( "j", b1 )
			end	end	
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" then  
			if y ~= y2 then t.starttime = lang:formatDate( "j. F Y", b1 ) 
			elseif m ~= m2 then t.starttime = lang:formatDate( "j. F", b1 )
			else t.starttime = lang:formatDate( "j.", b1 )
			end	end			
		if wiki == "en" then 
			if y ~= y2 then t.starttime = lang:formatDate( "F d, Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F d", b1 )	
			else t.starttime = lang:formatDate( "F d", b1 )
			end	end			
		if wiki == "eo" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j", b1 ) .."-a de ".. lang:formatDate( "F Y", b1 )		
			elseif m ~= m2 then t.starttime = lang:formatDate( "j", b1 ) .."-a de ".. lang:formatDate( "F", b1 )		
			else t.starttime = lang:formatDate( "j", b1 ) .."-a "	
			end	end	
		if wiki == "eu" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y", b1 ) ..".eko ".. lang:formatDate( "F", b1 ) .."k ".. lang:formatDate( "j", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F", b1 ) .."k ".. lang:formatDate( "j", b1 ) 		
			else t.starttime = lang:formatDate( "F", b1 ) .."k ".. lang:formatDate( "j", b1 )
			end	end	
		if wiki == "ja" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y年m月d日", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "Y年m月d日", b1 )	
			else t.starttime = lang:formatDate( "Y年m月d日", b1 )
			end	end			
		if wiki == "lv" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b1 )	
			else t.starttime = lang:formatDate( "Y. \\g\\a\\d\\a j.", b1 )
			end	end
		if wiki == "pl" then 
			local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
			if y ~= y2 then t.starttime = lang:formatDate( "j ", b1 ) .. date_pl[tonumber(lang:formatDate( "n", b1 ))] .. lang:formatDate( " Y", b1 ) 
			elseif m ~= m2 then t.starttime = lang:formatDate( "j ", b1 ) .. date_pl[tonumber(lang:formatDate( "n", b1 ))]
			else t.starttime = lang:formatDate( "j", b1 )
			end	end				
	end -- if a1
	if a2 == true and t.endtime == "" then 
		t.endtime = lang:formatDate( "j F Y", b2 ) 
		timeofrace = b2
		if wiki == "br" then t.endtime = lang:formatDate( "j", b2 ) .." a viz ".. lang:formatDate( "F Y", b2 ) end
		if wiki == "ca" or wiki == "es" then t.endtime = lang:formatDate( "j", b2 ) .." de ".. lang:formatDate( "F", b2 ) .." de ".. lang:formatDate( "Y", b2 ) end
		if wiki == "cs" then t.endtime = lang:formatDate( "j. xg Y", b2 ) end
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" then t.endtime = lang:formatDate( "j. F Y", b2 ) end
		if wiki == "en" then
			if y ~= y2 then t.endtime = lang:formatDate( "F d, Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "F d, Y", b2 )	
			else t.endtime = lang:formatDate( "d, Y", b2 )	
			end	end			
		if wiki == "eo" then t.endtime = lang:formatDate( "j", b2 ) .."-a de ".. lang:formatDate( "F Y", b2 ) end		
		if wiki == "eu" then t.endtime = lang:formatDate( "Y", b2 ) ..".eko ".. lang:formatDate( "F", b2 ) .."k ".. lang:formatDate( "j", b2 ) end
		if wiki == "ja" then 
			if y ~= y2 then t.endtime = lang:formatDate( "Y年m月d日", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "m月d日", b2 )	
			else t.endtime = lang:formatDate( "d日", b2 )	
			end	end	
		if wiki == "lv" then 
			if y ~= y2 then t.endtime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "j. F", b2 )	
			else t.endtime = lang:formatDate( "j. F", b2 )	
			end	end
		if wiki == "pl" then 
			local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
			t.endtime = lang:formatDate( "j ", b2 ) .. date_pl[tonumber(lang:formatDate( "n", b2 ))] .. lang:formatDate( " Y", b2 ) end				
	end -- if a2

-- This function give a format to dates when P585 (date) is used in a single day race
	a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) 
	if a1 == true and t.time == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i) 
		end  		
		t.time = func_date (b1, wiki, 'long') 
		timeofrace = b1
	end

	-- This function permits to display an unity (the kilometer) for a distance, with exceptions for macedionan, russian and japanese 
	-- that have other symbols 
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P2043', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "mk" then t.length_unit = 'км' end
			if  wiki == "ru" then t.length_unit = 'км' end
			if  wiki == "ja" then t.length_unit = 'キロメートル' end
		end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place
	if a == true then --and ttt.country == "" then ttt.country = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P17"]) do
   			ttt.country[i] = "C" .. v.mainsnak.datavalue.value["numeric-id"]
   		end
 	end			
	-- Function that give the starting place of a race 
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) 
	if a1 == true and t.startplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i) 
		end   
		t.startplace = "Q" .. b1 
	end	
	-- Function that give the finishing place of a race
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) 
	if a1 == true and t.endplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i) 
		end   
		t.endplace = "Q" .. b1 
	end	
	-- This function counts the number of value for P1923 (participating teams) and give the number of team that participate at the race
    if pcall(function() 
         t.nr_teams = table.getn(entity.claims["P1923"])
         end        	
      ) then else t.nr_teams = "" end   

	-- Function that give the number of cyclists at the beginning and at the finishing of a race
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) 
	if a1 == true and t.nr_participants_start == "" and t.nr_participants_end == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i) 
		end 
		local v
		for _, v in pairs(entity.claims["P1132"]) do
			if pcall(function()
		   		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then
				t.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
				end
			) then else t.nr_participants_start = "" end
			if pcall(function()
				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 15053716 then
				t.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
			end
			) then else t.nr_participants_end = "" end
		end	-- for 	
	end -- if a1

	-- This function permits to display an unity (the kilometer per hour) for an average speed, with exceptions for macedionan, russian and japanese 
	-- that have other symbols
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', 1) 
	if a1 == true and t.speed == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', i) 
		end 
		t.speed = b1
		a1, b1 = pcall(fooA, 'unit', entity, 'P2052', 1)
		if b1 == "http://www.wikidata.org/entity/Q180154" then
			t.speed_unit = 'km/h'
			if  wiki == "nl" then t.speed_unit = 'km/u' end
			if  wiki == "mk" then t.speed_unit = 'км/ч' end
			if  wiki == "ru" then t.speed_unit = 'км/ч' end
			if  wiki == "ja" then t.speed_unit = 'キロメートル毎時' end			
		end
	end	-- if a1
 	-- This function permits to display an unity for the cost of a cycling race
	a, b = pcall(fooA, 'amount', entity, 'P2130', 1)
	if a == true and t.cost == "" then 
		t.cost = b 
		a, b = pcall(fooA, 'unit', entity, 'P2130', 1)
		if b == "http://www.wikidata.org/entity/Q4916" then t.cost_unit = '€' end	
		if b == "http://www.wikidata.org/entity/Q4917" then t.cost_unit = '$' end	
	end

	a, b = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image
	if a == true and tt.map == "" then tt.map = b end
	a, b = pcall(fooA, 'numeric-id', entity, 'P155', 1) 
	if a == true and t.previous == "" then t.previous = "Q"..b end	
	a, b = pcall(fooA, 'numeric-id', entity, 'P156', 1) 
	if a == true and t.next == "" then t.next = "Q"..b end
	
	local note, qual, id, id_team
	-- By entering a value just below, the Wikipedia added will have Wikidata logos associated with cyclists in the infobox	
	if wiki == "www" or wiki == "mk" or wiki == "ja" or wiki == "lv" or wiki == "ru" then note = 'q' else note = 'f' end 
	-- By entering a value just below, the Wikipedia added will show the team of the winner
	if pcall(foo3, entity, "P1346", 1, "P642", 1) then
		local k, v, vv
		for k, v in pairs(entity.claims["P1346"]) do
			if pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) then else id=nil end -- id = rider id
			if id ~= nil then
				--timeofrace = "+2016-03-00T00:00:00Z" 
				-- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race
				if timeofrace ~= nil and timeofrace ~= '' then a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace) end
				if a == true and b ~= nil then id_team = 't' .. b  else id_team = '' end 
			end
			id=v.mainsnak.datavalue.value['numeric-id'] -- rider ID						
			-- looks into race item if the winner has a P54 statement for beeng a member of a national team 
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do 
					id_team = '2t'.. ' ('.. national_team(wiki, 'Q'..id, startOfSeason, entity, 'P1346', k).. ')' 
				end
			end) 
			-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..)
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do 
					qual=vv.datavalue.value['numeric-id']

--		if pcall(function() qual=v.qualifiers["P642"][1].datavalue.value["numeric-id"] end) then else qual=nil end  
		if id~=nil and qual~=nil and v.rank~='deprecated' then 
			if qual == 20882667 and t.first=="" then t.first=note..id t.first_team=id_team ref.first=references(entity,"P1346",k) results=true end
			if qual == 20882668 and t.second=="" then t.second=note..id t.second_team=id_team ref.second=references(entity,"P1346",k) results=true end
			if qual == 20882669 and t.third=="" then t.third=note..id t.third_team=id_team ref.third=references(entity,"P1346",k) results=true end
			if qual == 20883007 and t.winner_point=="" then t.winner_point=note..id t.winner_point_team=id_team ref.winner_point=references(entity,"P1346",k) results=true end
			if qual == 20883212 and t.winner_mountain=="" then t.winner_mountain=note..id t.winner_mountain_team=id_team ref.winner_mountain=references(entity,"P1346",k) results=true end   			
  			if qual == 20883328 and t.winner_sprint=="" then t.winner_sprint=note..id t.winner_sprint_team=id_team ref.winner_sprint=references(entity,"P1346",k) results=true end
			if qual == 20883139 and t.winner_young=="" then t.winner_young=note..id t.winner_young_team=id_team ref.winner_young=references(entity,"P1346",k) results=true end  
			if qual == 20893983 and t.winner_fighting=="" then t.winner_fighting=note..id t.winner_fighting_team=id_team ref.winner_fighting=references(entity,"P1346",k) results=true end
			if qual == 20893979 and t.winner_combination=="" then t.winner_combination=note..id t.winner_combination_team=id_team ref.winner_combination=references(entity,"P1346",k) results=true end
			if qual == 20882921 and t.winner_team == "" then t.winner_team = note .. id ref.winner_team=references(entity,"P1346",k) results = true end
 		end -- if id
 		
				end
			end) 
		end	-- for
	end  -- end if pcall

	-- code for references
	local list = {} -- list[1][1] = value from ref.first, list [1][2] = 'first'
	local k
	for k in pairs(ref) do 
		if ref[k]~='' then table.insert(list, {ref[k], k}) end 
	end
	local w, ww 	
	num = #list
	for w=num,1,-1 do
		for ww=1,w do
	--		mw.log ('w=',w,' ww= ', ww)
			if w ~= ww then 
				if list[w][1] == list[ww][1] then list[w][1] = frame:extensionTag{name='ref', args={name=entityId..ww}} break end	
			else list[w][1] = frame:extensionTag{name='ref', content=list[w][1], args={name=entityId..ww}} end 
		end
	end
	for i=1,num do 
		ref[ list[i][2] ] = list[i][1] --list[num+1-i][1] 
	end

	-- transform Q/q-number into flag / WPlink / WDlink
	local k
	local team = true
	local wd = " [[File:Wikidata-logo S.svg|12px|link=d:"	

	for k in pairs(ttt) do -- "^C" ttt.country, "^T" ttt.tour
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^C") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "C", "Q") ttt[k][i] = flag(ttt[k][i], timeofrace).." ".. WPlink( ttt[k][i] ) end end
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^T") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "T", "Q") ttt[k][i] = WPlink( ttt[k][i] ) end end
	end	
	for k in pairs(t) do 
		if string.find(t[k], "^Q") then --t[k], k = startplace, endplace, ... find variables with an item as value
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k] )	end
		end
		if string.find(t[k], "^q") then -- find variables with an item as value (in section Résultats)
			t[k] = mw.ustring.upper( t[k] )
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]"
			else	
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k], team )..ref[k]..wd..t[k].."]]" end
			end
		end
		if string.find(t[k], "^f") then -- no WDitem, frWP
			t[k] = string.gsub(t[k], "f", "Q")
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]
			else	
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k], 'winner_team' )..ref[k] else t[k] = WPlink( t[k], 'winner_team' )..ref[k] end
			end
		end	
		if string.find(t[k], "^c") then -- find "class"-items, first asci = "c"
			t[k] = string.gsub(t[k], "c", "Q")
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k], "Q22348500" ) end
		end
		if string.find(t[k], "^t") then 
			t[k] = string.gsub(t[k], "t", "Q")
			--timeofrace = "+2008-04-09T00:00:00Z"
			if pcall(foo1, t[k]) then t[k] = " (" .. WPlink( t[k], 'team', timeofrace ) .. ")" end
		end
		if string.find(t[k], "^2t") then t[k] = string.gsub(t[k], "2t", "") end		
	end

    --local nl ="&#10;"
    -- local tooltip = infobox_bottom(2) .. nl .. mw.text.encode( property(1) .. ' (P393)' ) .. nl .. mw.text.encode( property(2) ..' (P17)')
    
    if t.length ~= "" then 
    	t.length, _ = string.gsub(t.length, "[+]", "") -- delets "+" sign from t.length 
    	t.length = lang:formatNum(tonumber(t.length)) -- formats t.length in the way it is done in the local Wiki
    end    
    if t.speed ~= "" then 
    	t.speed, _ = string.gsub(t.speed, "[+]", "")
    	t.speed = lang:formatNum(tonumber(t.speed))
    end
    if t.cost ~= "" then 
    	t.cost, _ = string.gsub(t.cost, "[+]", "")
    	t.cost = lang:formatNum(tonumber(t.cost))
    end
    
   	local span1, span2 = "<span style='color:#3366CC'>&#x25C0; </span>", "<span style='color:#3366CC'> &#x25B6;</span>"
    local k = t.previous
	local i, _ = string.find(k, "|")
	local j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.previous = string.sub(k, 1, i) .. span1 .. string.match(string.sub(k, i+1, j-1), "%d%d%d%d") .. string.sub(k, j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.previous = '' else t.previous = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.previous ~= "" then t.previous = span1 .. t.previous end 
	end

	k = t.next
	i, _ = string.find(k, "|")
	j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.next = string.sub(k, 1, i) .. string.match(string.sub(k, i+1, j-1), "%d%d%d%d") .. span2 .. string.sub(k,j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.next = "" else t.next = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.next ~= "" then t.next = t.next .. span2 end 
	end

	tt.caption = string.gsub(tt.caption, "{{(%w+)}}", function (n) return frame:expandTemplate{ title = n }  end)

	local z = {stage=5, date=6, dates=7, length=8, startplace=11, endplace=12, nr_teams=13, nr_participants_start=14, nr_participants_end=15, 
	speed=16, cost=17, first=19, second=20, third=21, winner_point=22, winner_mountain=23, winner_sprint=24, winner_young=25, winner_fighting=26, winner_combination=27,
	winner_team=28}
	
	local i, k, s
	for i,k in pairs(z) do
		s = localFrame.args[mw.ustring.gsub(infobox_translate(k), "&#173;", "")] -- filter soft hyphen out
		if s~="" and s~=nil then
			if k<19 then t[i] = s end
			if k>=19 and k<=27 then t[i] = t[i].. t[i..'_team'].. ' '.. s end
			if k==28 then t[i] = t[i].. ' '.. s end
			if i=="length" then t.length_unit="" end
			if i=="speed" then t.speed_unit="" end
			if i=="cost" then t.cost_unit="" end
		else
			if k>=19 and k<=27 then t[i] = t[i].. t[i..'_team'] end
		end
	end

	if localFrame.args[infobox_translate(32)]~="" and localFrame.args[infobox_translate(32)]~=nil then 
	i, k = string.find(localFrame.args[infobox_translate(32)] , ":")
		tttt.special_1a = string.sub(localFrame.args[infobox_translate(32)], 1, i-1)
		tttt.special_1b = string.sub(localFrame.args[infobox_translate(32)], k+1)
	end
	if localFrame.args[infobox_translate(33)]~="" and localFrame.args[infobox_translate(33)]~=nil then
	i, k = string.find(localFrame.args[infobox_translate(33)] , ":")
		tttt.special_2a = string.sub(localFrame.args[infobox_translate(33)], 1, i-1)
		tttt.special_2b = string.sub(localFrame.args[infobox_translate(33)], k+1)
	end

	if wiki == "fi" then
		if t.starttime ~= "" then t.starttime = mw.ustring.gsub(t.starttime, "%a+", "%0ta") end
		if t.endtime ~= "" then t.endtime = mw.ustring.gsub(t.endtime, "%a+", "%0ta") end
		if t.time ~= "" then t.time = mw.ustring.gsub(t.time, "%a+", "%0ta") end
	end

 	tab = "<table cellpadding='4' cellspacing='0' style='float:right; width:300px; border:1px solid rgb(200,200,200);"
    tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; clear:left; "
    tab = tab .. "text-align:left; font-size:85%; line-height:1.6em;'>" 
	if wiki == "eo" then tab = "<table style='width:23em; border:1px solid rgb(200,200,200);"
    	tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; "
    	tab = tab .. "text-align:left; font-size:85%; line-height:1.6em;' class='infobox' >"
    end
	tab = tab .. "<tr><td colspan='2' style='border-bottom:5px solid white; font-size:175%; background:#FFDF80; text-align:center'>" 
	tab = tab .. "<table style='width:100%'><tr><td>" .. tt.name .."</td><td>" .. tt.icon .. "</td></tr></table></td></tr>"
	if tt.picture ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. tt.picture .."|center|300px]]</td></tr>" end
	if tt.picture ~= "" and tt.caption ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center; font-size:80%'>"..tt.caption.."</td></tr>" end
	tab = tab .. "<tr><td colspan='2' style='background-color:#FFDF80; text-align:center'>'''"..infobox_translate(1).."'''</td></tr>"
	if tt.nr ~= "" and t.is_a ~= "" then tab = tab.."<tr><td style='width:40%'>'''"..infobox_translate(2).."'''</td><td>" .. tt.nr .. " " .. t.is_a .. "</td></tr>" end
	if ttt.tour[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #ttt.tour == 1 then tab = tab..infobox_translate(3).."'''</td><td>" else tab = tab..infobox_translate(4).."'''</td><td>" end	
		for i=1,#ttt.tour do tab = tab .. ttt.tour[i] if i == 1 then tab = tab .. " " ..t.class end tab = tab .. "<br>" end
		tab = tab.."</td></tr>" end		
	if t.stage ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(5).."'''</td><td>" .. t.stage.."</td></tr>" end	
	if (t.starttime~="" or t.endtime~="") and t.date=="" and t.dates=="" then tab = tab.."<tr><td>'''"..infobox_translate(7).."'''</td><td>" .. t.starttime.." – " ..t.endtime .."</td></tr>" end
	--if t.endtime ~= "" then tab = tab.."<tr><td>".."Date de fin".."</td><td>" .. t.endtime .. "</td></tr>" end	
	if t.time~="" and t.date=="" and t.dates=="" then tab = tab.."<tr><td>'''"..infobox_translate(6).."'''</td><td>" .. t.time.."</td></tr>" end	
	if t.date~="" then tab = tab.."<tr><td>'''"..infobox_translate(6).."'''</td><td>" .. t.date.."</td></tr>" end
	if t.dates~="" then tab = tab.."<tr><td>'''"..infobox_translate(7).."'''</td><td>" .. t.dates.."</td></tr>" end	
	if t.length ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(8).."'''</td><td>" .. t.length.." "..t.length_unit.."</td></tr>" end	
	if ttt.country[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #ttt.country == 1 then tab = tab..infobox_translate(9).."'''</td><td>" else tab = tab..infobox_translate(10).."'''</td><td>" end
		for i=1,#ttt.country-1 do tab = tab .. ttt.country[i].."<br>" end tab = tab .. ttt.country[#ttt.country].."</td></tr>" end	
	if t.startplace ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(11).."'''</td><td>" .. t.startplace .. "</td></tr>" end	
	if t.endplace ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(12).."'''</td><td>" .. t.endplace .. "</td></tr>" end
	if t.nr_teams ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(13).."'''</td><td>" .. t.nr_teams .. "</td></tr>" end
	if t.nr_participants_start ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(14).."'''</td><td>" .. t.nr_participants_start .. "</td></tr>" end
	if t.nr_participants_end ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(15).."'''</td><td>" .. t.nr_participants_end .. "</td></tr>" end	
	if t.speed ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(16).."'''</td><td>" .. t.speed .. " "..t.speed_unit.."</td></tr>" end		
	if t.cost ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(17).."'''</td><td>" .. t.cost .. " "..t.cost_unit.. "</td></tr>" end	
	if tttt.special_1a ~= "" then tab = tab.."<tr><td>'''"..tttt.special_1a.."'''</td><td>" .. tttt.special_1b.. "</td></tr>" end	
	if tttt.special_2a ~= "" then tab = tab.."<tr><td>'''"..tttt.special_2a.."'''</td><td>" .. tttt.special_2b.. "</td></tr>" end
	
	if results then tab = tab.."<tr><td colspan='2' style='border-bottom:5px solid white; background-color:#FFDF80; text-align:center'>'''"..infobox_translate(18).."'''</td></tr>" end
	if t.first ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(19).."'''</td><td>" .. t.first .. "</td></tr>" end	
	if t.second ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(20).."'''</td><td>" .. t.second .. "</td></tr>" end	
	if t.third ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(21).."'''</td><td>" .. t.third .. "</td></tr>" end
	if t.winner_point ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(22).."'''</td><td>" .. t.winner_point .. "</td></tr>" end
	if t.winner_mountain ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(23).."'''</td><td>" .. t.winner_mountain .. "</td></tr>" end
	if t.winner_sprint ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(24).."'''</td><td>" .. t.winner_sprint .. "</td></tr>" end
	if t.winner_young ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(25).."'''</td><td>" .. t.winner_young .. "</td></tr>" end
	if t.winner_fighting ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(26).."'''</td><td>" .. t.winner_fighting .. "</td></tr>" end	
	if t.winner_combination ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(27).."'''</td><td>" .. t.winner_combination .. "</td></tr>" end	
	if t.winner_team ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(28).."'''</td><td>" .. t.winner_team .. "</td></tr>" end	
	if tt.map ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. tt.map .."|center|300px]]".."</td></tr>" end	

	tab = tab.."<tr><td>"..t.previous.."</td><td style='text-align:right'>" .. t.next .. "</td></tr>"
	local s = "d:Wikidata:WikiProject Cycling/Documentation/infobox" 
	tab = tab .. "<tr><td colspan='2' style='text-align:right; border-top:3px solid #FFDF80; font-size:75%'>" .. "[[" .. s .. "|" .. infobox_translate(34) .. "]] [[File:Wikidata-logo S.svg|12px|link=d:".. frame.args[1]  .. "]]" --infobox_bottom(1) 
	--tab = tab .. "<span style='float:right' title='".. tooltip .. "'>[[File:High-contrast-help-browser.svg|10px|right|link=]]"	
	tab = tab .. "</span></td></tr>" 
	if wiki == "eo" then tab = tab ..changetemplate() end
	tab= tab.."</table>"
	return tab
end

function national_team(wiki, riderID, startOfSeason, entity, property, k)
-- property: statement where the rider is the value
-- k: loop 
local national_team, team, nationality
if pcall(function()
	local teamID, i,j, s 
	for _, v in pairs(entity.claims[property][k].qualifiers['P54']) do -- for property 'member of sports team'
		teamID = 'Q'.. v.datavalue.value['numeric-id'] break
	end

	national_team = mw.wikibase.getEntity( teamID )
	-- calculate s for national team item
	a, b = pcall(fooA, 'numeric-id', national_team, 'P31', 1) -- test if country
	if a == true and b == 20738667 then -- Q20738667 = national cycling team U23
		if wiki == 'fr' or wiki == 'www' then s =  ' espoirs' else s = ' U23' end
	elseif a == true and b == 23726798 then s = '' end -- Q23726798 = national cycling team

	a, b = timeStartEnd(riderID, "P27", 'numeric-id', startOfSeason)
	if a == true then
		local nation = mw.wikibase.getEntityObject( 'Q'..b )
		nationality = nation:getLabel() or nation:getLabel('en') .. ' (en)'
	end

	if national_team:getSitelink() == nil then
		team = nationality.. s
	else
		team = WPlink(teamID, 'team', startOfSeason)
		i, j = mw.ustring.find(team, "|")
		if i ~= nil and j ~= nil then 
		 	j=j+1
  			team = mw.ustring.sub(team,1,i).. nationality..s.. ']]'
		end
	end
	
end) then 
else 
	pcall(function()
	a, b = timeStartEnd(riderID, 'P54', 'numeric-id', startOfSeason)
	if a == true then
		national_team = mw.wikibase.getEntity( 'Q'..b )
--		g.team[rank] = national_team:getLabel() or g.country[rank].. s
		team = WPlink('Q'..b, 'team', startOfSeason)
	end
	end)
end
return team
end

function func_date (date, wiki, mode)
--	local wiki = 'cs'
--	local mode = 'small'
--	local date = '+2016-05-20'
	local function standard(datum) 
		if mode=='long' then return mw.language.getContentLanguage():formatDate("j F Y", datum) end 
		if mode=='small' then return mw.language.getContentLanguage():formatDate("j M", datum) end 		
	end
	local function br(datum) 
		local lang = mw.getLanguage('br') 
		if mode=='long' then return lang:formatDate("j", datum ) .." a viz ".. lang:formatDate("F Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum ) .." a viz ".. lang:formatDate("M", datum) end 		
	end	
	local function ca(datum, language) 
		local lang = mw.getLanguage(language) 
		if mode=='long' then return lang:formatDate("j", datum) .." de ".. lang:formatDate("F", datum) .." de ".. lang:formatDate("Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum) .." de ".. lang:formatDate("M", datum) end 		
	end
	local function cs(datum)
		local lang = mw.getLanguage('cs') 		
		if mode=='long' then return lang:formatDate("j. xg Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum)  ..". xg ".. lang:formatDate("M", datum) end 		
	end
	local function de(datum, language) 
		if mode=='long' then return mw.getLanguage(language):formatDate("j. F Y", datum) end 
		if mode=='small' then return mw.getLanguage(language):formatDate("j. M", datum) end 	
	end		
	local function eo(datum) 
		local lang = mw.getLanguage('eo') 
		if mode=='long' then return lang:formatDate("j", datum) .."-a de ".. lang:formatDate("F Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum) .."-a de ".. lang:formatDate("M", datum) end 		
	end	
	local function en(datum) 
		if mode=='long' then return mw.getLanguage('en'):formatDate("F d, Y", datum) end 
		if mode=='small' then return mw.getLanguage('en'):formatDate("M d", datum) end 	
		end
	local function eu(datum) 
		local lang = mw.getLanguage('eu') 
		if mode=='long' then return lang:formatDate( "Y", datum) ..".eko ".. lang:formatDate("F", datum) .."k ".. lang:formatDate("j", datum) end 
		if mode=='small' then return lang:formatDate( "M", datum) .."k ".. lang:formatDate("j", datum) end 		
	end
	local function fi(datum) -- may be different
		if mode=='long' then return mw.ustring.gsub(mw.getLanguage('fi'):formatDate("j. F Y", date), "%a+", "%0ta") end 
		if mode=='small' then return mw.getLanguage('fi'):formatDate("j. M", date) end 		
	end 
	local function ja(datum) 
		if mode=='long' then return mw.getLanguage('ja'):formatDate("Y年m月d日", datum) end 
		if mode=='small' then return mw.getLanguage('ja'):formatDate("m月d日", datum) end	
	end	
	local function lv(datum)
		local lang = mw.getLanguage('lv') 
		if mode=='long' then return lang:formatDate("Y.", datum)  .." gada ".. lang:formatDate("j. F", datum) end 
		if mode=='small' then return lang:formatDate("Y. M", datum) end 		
	end 	
	local function pl(datum) 
		local lang = mw.getLanguage('pl') 
		local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
		if mode=='long' then return lang:formatDate("j ", datum) .. date_pl[tonumber(lang:formatDate("n", datum))] .. lang:formatDate(" Y", datum) end 
		if mode=='small' then return lang:formatDate("j M", datum) end 		
	end		

	local x = {['']=standard(date), ['br']=br(date), ['ca']=ca(date,'ca'), ['cs']=cs(date), ['da']=de(date,'da'), ['de']=de(date,'de'), ['en']=en(date), ['eo']=eo(date), 
		['es']=ca(date,'es'), ['eu']=eu(date), ['fi']=fi(date), ['fo']=de(date,'fo'), ['ja']=ja(date), ['lv']=lv(date), ['no']=de(date,'no'), ['pl']=pl(date)}

	--mw.log(b1, x['no'])
	return x[wiki] or x['']
end

function p.teamroster(frame)
if frame.args[1] ~= nil then frame.args[1] =	string.gsub(frame.args[1], "%c", "") end	
local squadSeason = mw.wikibase.getEntityObject( frame.args[1] )
local flags = {}
local riderIds, riderNames, riderBirthdays, givenname, familyname, riderTeam, time = {}, {}, {}, {}, {}, {}, {}
local riderStart, riderEnd, riderPosition, riderReason, riderRef = {}, {}, {}, {}, {}
local index, riderNames_transl, riderNames_notransl = {}, {}, {}
local labelMissing = false
local wiki = string.match(mw.site.server, "%a+")	
local lang = mw.language.getContentLanguage()
local WDlink_on
local team, rider, startOfSeason
--wiki = 'ru' 
local function trans(date, month, day)
	if date ~= '' then 
		local _, _, y, m, d = string.find(date, "(%d+)-(%d+)-(%d+)") 
		if m == '00' then m = month end
		if d == '00' then d = day end
		date = '+'..y..'-'..m..'-'..d..'T00:00:00Z'		
		return date 
	else return '' end
end
local function name(i, wiki, transl, names, givenname, familyname)
	-- transform name "A B ..." into "B ... A"
	local _, count = mw.ustring.gsub(names, " ", " ")
	local a,b,c,d = '', '', '', ''
	local done = false
	mw.log('count=', count)
	if count ~= nil then count = count + 1 else count = 1 end

	if count > 1 then
		if count == 2 then
			if names~='' then _, _, a, b =  mw.ustring.find(names, "(%S+)%s+(%S+)") names=b..' '..a..":"..i end
		else
--			if givenname ~= '' then mw.log ('Anzahl Vornamen:', givenname) end
--			if familyname ~= '' then mw.log ('Anzahl Nachnamen:', familyname) end
			local name_parts_lv = {'da', 'de', 'di', 'De', 'la', 'Le', 'ten', 'van', 'Van'}
			local name_parts_mk = {'да', 'ди', 'де', 'Де', 'ла', 'Ле', 'тен', 'ван', 'Ван'}
			local name_parts_ru = {'да', 'ди', 'де', 'Де', 'ла', 'Ле', 'тен', 'ван', 'Ван'}	
			local name_parts    = {'da', 'de', 'di', 'De', 'la', 'Le', 'ten', 'van', 'Van'}
			local v
			if count == 3 and names~='' then
				_, _, a, b, c =  mw.ustring.find(names, "(%S+)%s+(%S+)%s+(%S+)")
				if wiki == 'mk' then
					for _,v in ipairs(name_parts_mk) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if wiki == 'lv' then
					for _,v in ipairs(name_parts_lv) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if wiki == 'ru' then
					for _,v in ipairs(name_parts_ru) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if wiki ~= 'lv' and wiki ~= 'mk' and wiki ~= 'ru' then
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end				
				if transl == 'notransl' then --or (wiki~='lv' and wiki~='mk' and wiki~='ru' and wiki~='ja') then
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if not done and familyname==2 then names = b..' '..c..' '..a..":"..i done = true end
				if not done and familyname==1 then names = c..' '..a..' '..b..":"..i done = true end
				if not done and familyname==0 then names = c..' '..a..' '..b..":"..i done = true end
			end
			if count > 3 and names~='' then
				_, _, a, b, c, d =  mw.ustring.find(names, "(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
				if wiki == 'mk' then
					for _,v in ipairs(name_parts_mk) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts_mk) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if wiki == 'lv' then
					for _,v in ipairs(name_parts_lv) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts_lv) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if wiki == 'ru' then
					for _,v in ipairs(name_parts_ru) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end	
					for _,v in ipairs(name_parts_ru) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if wiki ~= 'lv' and wiki ~= 'mk' and wiki ~= 'ru' then
					for _,v in ipairs(name_parts) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if transl == 'notransl' then --or (wiki~='lv' and wiki~='mk' and wiki~='ru' and wiki~='ja') then
					for _,v in ipairs(name_parts) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if not done then names = b..' '..c..' '..d..' '..a..":"..i end
			end
		end
	end
	return names
end

local localFrame
local sort
--[[
 The word 'sort' is used to sort the riders after the surname. It could look like this in the Wikipedia article
{{Cycling race/teamroster|Q21769847
| sort
}}
A rider called 'Laurens De Vreese' is sorted after 'De Vreese Laurens'. If you want to sort after 'Vreese Laurens De' 
change that in the code. In lvWiki, mkWiki and ruWiki sorting is standard, there is no need to switch sorting on in the article
]]
if frame.args[2] ~= nil then 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end
	if mw.ustring.find(mw.ustring.lower(frame.args[2]), "sort") then sort = true else sort = false end
else sort = false 
end
if wiki == "lv" or wiki == "mk" or wiki == "ru" then sort = true end

pcall(function() team = squadSeason.claims["P361"][1].mainsnak.datavalue.value['numeric-id'] end)

-- WDlink_on is used to decide if a Wikidata flag will be shown
if wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

if pcall(function() startOfSeason = squadSeason.claims["P580"][1].mainsnak.datavalue.value.time end) then 
else 
	local Sitelink = squadSeason:getSitelink('enwiki') or squadSeason:getSitelink('frwiki') or squadSeason:getSitelink('dewiki') or ''
	if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
	else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z' 
	end 
end	

local i = 1
pcall(function()
while squadSeason.claims["P527"][i]  do
	riderIds[i] = 'Q' .. squadSeason.claims["P527"][i].mainsnak.datavalue.value['numeric-id']
	riderNames[i] = WPlink(riderIds[i])

	rider = mw.wikibase.getEntityObject(riderIds[i])
	if pcall(function() riderBirthdays[i] = rider.claims["P569"][1].mainsnak.datavalue.value.time end
   	) then else riderBirthdays[i] = '' end
 	if pcall(function() local k	for k, _ in pairs(rider.claims["P735"]) do givenname[i] = k end end
   	) then else givenname[i] = 0 end
 	if pcall(function() local k for k, _ in pairs(rider.claims["P734"]) do familyname[i] = k end end
   	) then else familyname[i] = 0 end

	pcall(function()
		local language
		if wiki == "www" then language = 'en' else language = wiki end
		local entity=mw.wikibase.getEntity(riderIds[i])
		if wiki == 'mk' or wiki == 'ru' then
			if entity:getLabel(language) ~= nil and (mw.ustring.byte(entity:getLabel(language), 1, 1) > 127 and mw.ustring.byte(entity:getLabel(language), 3, 3) > 127)
			then riderNames_transl[i] = entity.labels[language].value riderNames_notransl[i] = '' mw.log(i, 'transl 1a ', entity.labels[language].value, mw.ustring.byte(entity:getLabel(language), 3, 3) )
			else riderNames_notransl[i] = entity.labels['en'].value or entity.labels['fr'].value or entity.labels['de'].value riderNames_transl[i] = '' mw.log(i, 'notransl 1a ', riderNames_notransl[i])
			end
		end
		if wiki ~= 'mk' and wiki ~= 'ru' then
			if entity:getLabel(language) ~= nil then riderNames_transl[i] = entity.labels[language].value riderNames_notransl[i] = '' mw.log(i, 'transl 1b ', entity.labels[language].value, mw.ustring.byte(entity:getLabel(language), 3, 3) )
			else riderNames_notransl[i] = entity.labels['en'].value or entity.labels['fr'].value or entity.labels['de'].value riderNames_transl[i] = '' mw.log(i, 'notransl 1b ', riderNames_notransl[i]) 
			end
		end
	end)

	if sort == true then
	riderNames_transl[i] = name(i, wiki, 'transl', riderNames_transl[i], givenname[i], familyname[i])		
	riderNames_notransl[i] = name(i, wiki, 'notransl', riderNames_notransl[i], givenname[i], familyname[i])
	else index[i] = i
	end

	if pcall(function()
		local date = squadSeason.claims["P527"][i].qualifiers["P580"][1].datavalue.value.time or ''
		riderStart[i] = func_date(trans(date,'01', '01'), wiki, 'small') 
	end
	) then else riderStart[i] = '' end 	

	if pcall(function()
		local date = squadSeason.claims["P527"][i].qualifiers["P582"][1].datavalue.value.time
		riderEnd[i] = func_date(trans(date,'12', '31'), wiki, 'small') 
	end
	) then else riderEnd[i] = '' end

	if pcall(function()	
	riderPosition[i] =  'Q' .. squadSeason.claims["P527"][i].qualifiers["P39"][1].datavalue.value['numeric-id'] 
	local entity = mw.wikibase.getEntity( riderPosition[i] )
	local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel( 'en' ) 
	--if label == null then label = entity:getLabel( 'en' ) end
	riderPosition[i] = ', ' .. label end
	) then else riderPosition[i] = '' end		

	riderReason[i] = ''
	pcall(function() riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1643"][1].datavalue.value['numeric-id'] end)
	if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1642"][1].datavalue.value['numeric-id'] end) end
	if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1534"][1].datavalue.value['numeric-id'] end) end
	if riderReason[i] ~= '' then
		local entity = mw.wikibase.getEntity( riderReason[i] )
		local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel('en')
		--if label == null then label = entity:getLabel( 'en' ) end
		riderRef[i] = references(squadSeason, 'P527', i)
		riderReason[i] = ', ' .. label
	 end

	local a, b
	local timeofrace
	local changedTime = '+0000-00-00'
	local changedTeam = ''
	local entity, label
	local stagiaire	
	time[i]='' riderTeam[i] = ''
	if pcall(function() timeofrace = squadSeason.claims["P527"][i].qualifiers["P580"][1].datavalue.value.time end) 
	then else timeofrace = startOfSeason end
	if team ~= nil then a = true b = team -- if team known, don´t search for team
		else a, b = timeStartEnd(riderIds[i], 'P54', 'numeric-id', timeofrace) team = b
	end 
	if a == true and b ~= nil then 
--		mw.log('1', riderNames[i], a, b)
		pcall(function()
			local v
			for _, v in pairs(rider.claims["P54"]) do -- look into all P54 teams
				pcall(function() -- get trainee data from rider item
					if v.mainsnak.datavalue.value['numeric-id'] == b  then -- print riderStart[i], riderEnd[i], riderPosition[i], riderReason[i]
						if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. v.qualifiers["P1643"][1].datavalue.value['numeric-id'] end) end
						if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. v.qualifiers["P1642"][1].datavalue.value['numeric-id'] end) end
						if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. v.qualifiers["P1534"][1].datavalue.value['numeric-id'] end) end
						if string.sub(riderReason[i],1,1)=='Q' then -- only for these pcall-functions, not for those at line 970
							local entity = mw.wikibase.getEntity( riderReason[i] )
							local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel('en')
							if pcall(function()	riderRef[i] = references(squadSeason, 'P527', i) end) then else riderRef[i]='' end
							--		riderRef[i] = references(squadSeason, 'P527', i)
							riderReason[i] = ', ' .. label
						end					

						local date1 = v.qualifiers["P580"][1].datavalue.value.time
						date1 = trans(date1,'01','01')
						local _, _, y1, m1, d1 = string.find(date1, "(%d+)-(%d+)-(%d+)")
						local date2
						if pcall(function() date2 = v.qualifiers["P582"][1].datavalue.value.time end) then else date2='+'..y1..'-12-31T00:00:00Z' end 
						date2 = trans(date2,'12','31')						
						local _, _, y2, m2, d2 = string.find(date2, "(%d+)-(%d+)-(%d+)")
						local _, _, y3, m3, d3 = string.find(startOfSeason, "(%d+)-(%d+)-(%d+)")

						if  (y1 == y3 or y2 == y3) and ((y1 == y3 and (m1 ~= '01' or d1 ~= '01')) or (y2 == y3 and (m2 ~= '12' or d2 ~= '31'))) then 
							-- riders who start after 1 January or end earlier then 31 December in the season 
							riderStart[i] = func_date(date1, wiki,'small') 
							if pcall(function() 
								local date = v.qualifiers["P582"][1].datavalue.value.time
								riderEnd[i] = func_date(date2, wiki,'small') 
								end 
							) then else riderEnd[i] = func_date('+'..y1..'-12-31T00:00:00Z', wiki,'small') end

							if riderPosition[i] == '' then -- find the 'position' (P39) of a rider
								pcall(function() riderPosition[i] ='Q' ..v.qualifiers["P39"][1].datavalue.value['numeric-id']
									local entity = mw.wikibase.getEntity( riderPosition[i] )
									local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel( 'en' ) 	
									riderPosition[i] = ', ' .. label
								end)
							end	
						end						
					end
				end)
			
				stagiaire = ''
				pcall(function() stagiaire = v.qualifiers["P39"][1].datavalue.value['numeric-id'] end)
				if v.mainsnak.datavalue.value['numeric-id'] ~= b and stagiaire == '' then -- find previous team and end time for the rider at that team
					local date1 = v.qualifiers["P580"][1].datavalue.value.time
					date1 = trans(date1,'01','01')
					local _, _, y1, m1, d1 = string.find(date1, "(%d+)-(%d+)-(%d+)")
					local date2
					if pcall(function() date2 = v.qualifiers["P582"][1].datavalue.value.time end) then else date2='+'..y1..'-12-31T00:00:00Z' end 
					date2 = trans(date2,'12','31')						
					local _, _, y2, m2, d2 = string.find(date2, "(%d+)-(%d+)-(%d+)")
					local _, _, y3, m3, d3 = string.find(startOfSeason, "(%d+)-(%d+)-(%d+)")
					if y1 <= y3 then -- start time < season time
						pcall(function()
							local timeP582 = v.qualifiers["P582"][1].datavalue.value.time
							timeP582 = trans(timeP582,'12', '31')
							if timeP582 >= changedTime then -- find maximum end time
								-- Case Pierre-Roger Latour: Chambéry CF (2012 - 2014), time season at 2013
								-- Task: changedTime should be after start time, but before startOfSeason
								local _, _, y4, m4, d4 = string.find(timeP582, "(%d+)-(%d+)-(%d+)")
								if y4 > y3 then changedTime = '+'..y3..'-12-31T00:00:00Z' else changedTime = timeP582 end
								changedTeam = v.mainsnak.datavalue.value['numeric-id']
 							end -- end if							
						end) -- end function
						-- print riderTeam[i], time[i]
						if changedTime ~= '+0000-00-00' then						
							pcall(function() riderTeam[i] = WPlink( 'Q'..changedTeam , 'team', changedTime ) end) 
							local _, _, y1, _, _ = string.find(changedTime, "(%d+)-(%d+)-(%d+)") 
							time[i] = ' ('..y1..')'					
						end
					end
				end -- end if			
			end -- end for
		end) -- end function
	end -- end if

	if pcall(function()
		local a, b = timeStartEnd(riderIds[i], "P27", 'numeric-id', startOfSeason)
       	flags[i] = flag('Q'..b, startOfSeason)
		end
	) then else flags[i] = '' end

    i = i + 1 
end
end)

-- sorting names after surname
if sort == true then
	if language~='ja' then 
		table.sort(riderNames_transl, function(a,b) return a<b end) 
		table.sort(riderNames_notransl, function(a,b) return a<b end) 
	end
	local ii, v1, v2, name1, name2, number
	i = 1
	-- sorting riders with a translation
	for ii,name1 in ipairs(riderNames_transl) do
		if name1 ~= '' then 
			v1, v2 = mw.ustring.find(name1, ":") 
			number = mw.ustring.sub(name1, v2+1) 
			name2, _ = mw.ustring.gsub(name1, ":%d+", "")
			index[i] = tonumber(number) 
--			mw.log(i, number, name2 )		
			i = i + 1
		end
	end
	-- sorting riders without a translation
	for ii,name1 in ipairs(riderNames_notransl) do
		if name1 ~= '' then 
			v1, v2 = mw.ustring.find(name1, ":") 
			number = mw.ustring.sub(name1, v2+1) 
			name2, _ = mw.ustring.gsub(name1, ":%d+", "")
			index[i] = tonumber(number)
--			mw.log(i, number, name2 )		
			i = i + 1
		end		
	end	
end

local tableBody= ''
local tableHeader = '<table border="0" cellspacing="0" cellpadding="2">'
   	.. '<tr style="background-color:#FFDF80;"><th nowrap style="text-align:left;">' 
if WDlink_on == false then tableHeader = tableHeader .. '[[File:Wikidata-logo S.svg|12px|link=d:'.. frame.args[1].. '#P527]]&nbsp;&nbsp;&nbsp;' end
tableHeader = tableHeader..getSquadTableColumn(1)..'</th><th nowrap style="text-align:right">'..getSquadTableColumn(2) .. 
	'&nbsp;</th><th nowrap style="text-align:left;padding:0 0.5em">'..getSquadTableColumn(3) .. '&nbsp;</th></tr>'
local tableFoot = '</table>'
local tableEndText = ''
local tableSize = table.getn(riderNames)
local iii = 1
i = 1
while index[i] do
	tableBody = tableBody.. '<tr><td nowrap style="padding:0 1em 0 0">'.. flags[index[i]].. ' '.. riderNames[index[i]]
  	if WDlink_on == true then tableBody = tableBody.. ' '.. wdLink(riderIds[index[i]]) end
   	if riderStart[index[i]]~='' or riderEnd[index[i]]~='' then
   		tableBody=tableBody..'<span style="font-size:80%; color:#686868"> ('..riderStart[index[i]]..'–'..riderEnd[index[i]].. riderPosition[index[i]]
   		if riderReason[index[i]] ~= '' then tableBody=tableBody.. ', [[#tr_'..i..frame.args[1]..'|'..getSquadTableColumn(4)..']]' end
   		tableBody=tableBody .. ')</span>'
   	elseif riderReason[index[i]]~='' then
   		tableBody=tableBody.. '<span style="font-size:80%; color:#686868"> ([[#tr_'..i..frame.args[1]..'|'..getSquadTableColumn(4)..']]'.. ')</span>'
   	end
   	tableBody = tableBody.. '</td><td nowrap style="text-align:right">'
	if wiki == 'lv' then
		local _, _, y1, m1, d1 = string.find(startOfSeason,"(%d+)-(%d+)-0*(%d+)")
		local _, _, y2, m2, d2 = string.find(riderBirthdays[index[i]],"(%d+)-(%d+)-0*(%d+)")
		tableBody = tableBody.. frame:expandTemplate{ title = 'Template:Birth date and age2', args = { y1, m1, d1, y2, m2, d2 } }.. '</td>'
	else tableBody = tableBody.. func_date (riderBirthdays[index[i]], wiki, 'long') ..'</td>' end
	tableBody = tableBody.. '<td style="padding:0 0.5em; text-align:left">'
	if riderTeam[index[i]] ~= nil then tableBody = tableBody.. riderTeam[index[i]].. time[index[i]] end --.. '</td></tr>'
	tableBody = tableBody..'</td></tr>'

	if riderReason[index[i]] ~= '' then
		if iii == 1 then tableEndText = tableEndText.. getSquadTableColumn(5)..': '.. riderNames[index[i]].. riderReason[index[i]] 
		else tableEndText = tableEndText.. '<span style="color:white">'.. getSquadTableColumn(5)..': </span>'.. riderNames[index[i]].. riderReason[index[i]] end
		iii = iii + 1
		if riderRef[index[i]] ~= '' then tableEndText = tableEndText.. 
			frame:extensionTag{name='ref', content=riderRef[index[i]], args = {name='tr_'..i..frame.args[1]}} end
		tableEndText = tableEndText.. '<br>'
	end
	i = i + 1
end

--if tableEndText ~= '' then tableEndText = getSquadTableColumn(5)..': <span style="font-size:80%; color:#686868">'.. tableEndText .. '</span>' end    

local borderStyle = 'border:1px solid rgb(200,200,200); padding: 4px'
if wiki == 'lv' then
	borderStyle = 'border:0'
end
local tableStart = '<table style="'.. borderStyle.. '"><tr><td style="vertical-align:top;">'
local tableEnd = '</td></tr></table>'

if labelMissing then tableEnd = tableEnd .. getMissingLabelTrackingCategory() end

return tableStart.. tableHeader.. tableBody.. tableFoot.. tableEnd.. tableEndText 
end

function timeStartEnd(Qid, property, mode, timeofrace)
-- mode = 'numeric-id', property = 'P54', Qid = 'Q123'
local entity = 	mw.wikibase.getEntity(Qid)
local a, b = pcall(fooA, mode, entity, property, 1)
local starttime, endtime

if a == true then
	local timeStartEnd = {}
	local num = 1
	local v
	for _, v in pairs(entity.claims[property]) do
		if pcall(function () starttime = v.qualifiers["P580"][1].datavalue.value.time end) then 
   			starttime = v.qualifiers["P580"][1].datavalue.value.time
			local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)")
			if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end
		end
		if pcall(function () endtime = v.qualifiers["P582"][1].datavalue.value.time end) then 
			endtime = v.qualifiers["P582"][1].datavalue.value.time
			local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)")
			if m == '00' and d == '00' then endtime = '+'..year..'-12-31T00:00:00Z' end
			if m == '01' and d == '01' then endtime = '+'..year..'-12-31T00:00:00Z' end	
		end
  		if v.qualifiers then
 			if (not v.qualifiers["P580"] or starttime <= timeofrace)
 				and
 				(not v.qualifiers["P582"] or endtime >= timeofrace)
 			then
 				timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
 				num = num + 1
 			end
 		else
 			timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
 			num = num + 1
 		end
 	end	
	return a, timeStartEnd[1]
else return false, '' end
end

function WPlink(Qnumber, ...) 
local link
local entity = mw.wikibase.getEntity( Qnumber )
local Sitelink = entity:getSitelink() -- link to WParticle
local Label = entity:getLabel() or ''
local Label_fr = entity:getLabel( 'fr' ) or ''
local Sitelink_claas = mw.wikibase.getEntity( 'Q22348500' ):getSitelink() 
local a, b
local official_name = ""
local wiki = string.match(mw.site.server, "%a+")

if arg[1] == nil then 	
	if pcall(foo1, Qnumber) then 
		if Sitelink ~= nil then 
			link = "[[" .. Sitelink .. "|" .. mw.text.trim(string.gsub(Sitelink, "%b()", "")..' ') .. "]]"	
			if wiki == "de" then -- ru riders get label as alias, to shorten the name
				local a, b = pcall(fooA, 'numeric-id', entity, 'P27', 1) 
				if a == true and (b==159 or b==184 or b==212 or b==232) then link = "[[" .. Sitelink .. "|" .. Label .. "]]" end
			end
		elseif Label ~= '' then 
			if wiki ~= 'www' then
				if wiki == "lv" then
					link = "[[Special:AboutTopic/" .. Qnumber .. "|" .. Label .. "]]"
				else
					local black_list = {}
					if wiki == 'de' then
						black_list = { ["Samuel Williams"] = false, ["Peter Williams"] = false } end
					if black_list[Label] == true then --if Label ~= "Samuel Williams" and Label ~= "Peter Williams" then 				
						--local title = mw.title.makeTitle( 0, Label )
						local title = mw.title.new(Label) -- detect if there is a different local article with the same name 
						if not title.exists then link = "[[" .. Label.. "]]" else link = Label end 
					else link = Label end
				end
			else link = Label end
		else link = Label end 
	else return "unknown ID in function WPlink" end
	if link == '' then 
		link = Label_fr 
		if link ~= '' then link = string.gsub(link, "%b()", "").. " (fr)"
		else
			link = entity:getLabel( 'en' ) or ''
			if link ~= '' then link = string.gsub(link, "%b()", "").. " (en)" 
			else link =  "(label missing)" end  
		end 
	end
end -- if arg[1] == nil
if arg[1] == 'winner_team' then -- Qnumber of a team
	a, b = pcall(fooA, 'text', entity, 'P1448', 1) 
	if a == true then official_name = b end	
	if pcall(foo1, Qnumber) then 
		if Sitelink ~= nil and official_name == b then link = "[[" .. Sitelink .. "|" .. official_name .. "]]"	
		else -- if there is no saison article, then print team article (if available)
			a, b = pcall(fooA, 'numeric-id', entity, 'P361', 1) 
			if a == true then 	
				local entity = mw.wikibase.getEntity( 'Q'.. b ) -- Qnumber of team
				local Sitelink = entity:getSitelink() -- link to WParticle			
				if Sitelink ~= nil and official_name ~= nil and official_name ~='' then 
					link = "[["..Sitelink.."|"..official_name.."]]" else if Sitelink ~= nil then link = '[['..Sitelink..']]' end end
			else link = Sitelink end
		end
	else return "unknown ID in function WPlink" end
	if link == nil then 
		link = Label_fr 
		if link == nil then link = "(label missing)" else link = link .. " (fr)" end -- if no fr:label else fr.label plus ...
	end
end -- end arg[1] 
if arg[1] == 'team' then -- add '(team of the winner)'
	a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) 
	if a == true then official_name = b end
	if Sitelink ~= nil and official_name ~= nil and official_name ~='' then link = "[[" .. Sitelink .. "|" .. official_name .. "]]"	end
	if Sitelink == nil and official_name ~= nil and official_name ~='' then link = official_name end	
end -- end arg[1] 

if arg[1] == "Q22348500" then -- add weblink from item "Q22348500" if available
	if pcall(foo1, Qnumber) then --Sitelink_claas
		if Sitelink == nil then 
			if Sitelink_claas ~= nil then link = "[[" .. Sitelink_claas .. "|" .. Label .. "]]" 
			elseif entity:getLabel( 'fr' )~=nil then link = entity:getLabel( 'fr' )
			elseif entity:getLabel( 'en' )~=nil then link = entity:getLabel( 'en' )
			elseif entity:getLabel( 'de' )~=nil then link = entity:getLabel( 'de' )				
			else link = Label 
			end 
		end
	end
end
return link
end

function getMissingLabelTrackingCategory()
	local l10nDef = { }
	l10nDef["//cs.wikipedia.org"] = '[[Kategorie:Údržba:Doplnit štítek na Wikidatech]]'
	l10nDef["//lv.wikipedia.org"] = '[[Category:Vikidatos trūkst nosaukuma latviešu valodā]]'

	local l10n = l10nDef[mw.site.server]
	if not l10n then
    	l10n = ''
	end
	return l10n
end 

function changetemplate () -- for eoWiki
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {title="sxangxu sxablonon2", args = {["sxablono"] = "Cycling race/infobox"}}
return n			
end

function fooA (mode,entity,property,var)
local snak	
if mode=="value" then snak=entity.claims[property][var].mainsnak.datavalue.value 
else snak=entity.claims[property][var].mainsnak.datavalue.value[mode]
end
return snak, entity.claims[property][var].rank
end

function fooB (mode, entity_var, property, var1, var2, ref, var3)
local snak 
if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value 
else snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value[mode]
end
return snak
end

function foo1 (arg)
local entity = mw.wikibase.getEntity( arg ) 
end

function foo2 (entity_var, property, var)
local snak = entity_var.claims[property][var].mainsnak.datavalue.value.amount 
end

function foo3 (entity_var, property, var1, quali, var2) 
local snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value.amount 
end

function winner (t, winner_id)
	tt = {}
	local num
	for num=1,t.number do
		table.insert(tt, "")
	end
	local wiki = string.match(mw.site.server, "%a+")	
	local winner, time_var, sitelink, nationality 
	local go
	local WDlink_on

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "lv" or wiki == "ru" then WDlink_on = true else WDlink_on = false end
	for num=1,t.number do
	-- winner: Qnumber of vainqueur du classement général
	i = 1
   	if pcall(foo2, t.race[num][2], "P1346", i) then 
   		while t.race[num][2].claims["P1346"][i] do	-- suche nach "Gewinner der Gesamtwertung"
   			if pcall(foo3, t.race[num][2], "P1346", i, "P642", 1) then go = true else go = false end
            if go == true and t.race[num][2].claims["P1346"][i].qualifiers.P642[1].datavalue.value['numeric-id'] == winner_id then 
	    		winner = "Q"..t.race[num][2].claims["P1346"][i].mainsnak.datavalue.value['numeric-id'] 
				if wiki == "www" then sitelink = mw.wikibase.getEntity( winner ):getSitelink( 'frwiki' )
				else sitelink = mw.wikibase.sitelink( winner ) 
				end 
 				if sitelink == nil then 
 					if mw.wikibase.getEntity(winner):getLabel() ~= nil then sitelink = '[['.. mw.wikibase.getEntity( winner ):getLabel() .. ']]' 
					elseif mw.wikibase.getEntity(winner):getLabel('fr')~=nil then sitelink=mw.wikibase.getEntity(winner):getLabel('fr').. " (fr)" 
					elseif mw.wikibase.getEntity(winner):getLabel('en')~=nil then sitelink=mw.wikibase.getEntity(winner):getLabel('en').. " (en)" 	
					elseif mw.wikibase.getEntity(winner):getLabel('de')~=nil then sitelink=mw.wikibase.getEntity(winner):getLabel('de').. " (de)"	
					else sitelink = "—" end
				else 
					if wiki == "de" then -- ru riders get label as alias, to shorten the name
						local a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( winner ), 'P27', 1) 
						if a == true and (b==159 or b==184 or b==212 or b==232) then 
							sitelink = "[["..sitelink.."|".. mw.wikibase.getEntity(winner):getLabel('de').."]]" 
						else sitelink = "[[" .. sitelink .. "|" .. string.gsub(sitelink, "%b()", "") .. "]]" end
					else sitelink = "[[" .. sitelink .. "|" .. string.gsub(sitelink, "%b()", "") .. "]]" end									
				end
			
				-- get date of the race, e.g. "+2016-01-01T00:00:00Z"
				-- P585 (point in time for a single day race) or P580 (start time for a stage race)
				if pcall(foo2, t.race[num][2], "P585", 1) then 
				time_var = t.race[num][2].claims["P585"][1].mainsnak.datavalue.value.time 
				elseif pcall(foo2, t.race[num][2], "P580", 1) then 
				time_var = t.race[num][2].claims["P580"][1].mainsnak.datavalue.value.time 
				else end
			
				-- get nationality of the winner, nationality could have changed, therefore look for qualifiers p580 and p582
				if pcall(foo2, mw.wikibase.getEntity( winner ), "P27", 1) then -- standard: only one nationality
					nationality = "Q"..mw.wikibase.getEntity( winner ).claims["P27"][1].mainsnak.datavalue.value['numeric-id']
					tt[num] = flag(nationality, time_var) .. " " .. sitelink .. " " 
					if WDlink_on == true then tt[num] = tt[num].. wdLink(winner) end
				else tt[num] = "  " .. sitelink .. " " .. wdLink(winner) end
				if pcall(foo2, mw.wikibase.getEntity( winner ), "P27", 2) then 	-- if person has more than one nationality calculate tt[num] again
					local a, b = timeStartEnd(winner, "P27", 'numeric-id', time_var)
					tt[num] = flag('Q'..b, time_var) .. " " .. sitelink .. " " 
					if WDlink_on == true then tt[num] = tt[num].. wdLink(winner) end
				end
			end -- end if
			i = i + 1	
		end -- end while	
	else  end  -- end if pcall
	end -- end for
return tt
end

function p.listofwinners(frame)
	local t = {number, race={}, year={}, vainqueur={}, second={}, troisieme={}}
	local entity0 = ''
	if pcall(foo1, frame.args[1]) then entity0 = mw.wikibase.getEntity( frame.args[1] ) end
	local tt, k, sitelink
	local num = 1 
	local go, race
	local wiki = string.match(mw.site.server, "%a+")
	local WDlink_on

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "lv" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

	if pcall(foo2, entity0, "P527", num) then go = true else go = false end
	while go == true and entity0.claims["P527"][num] do
		race = 'Q'..entity0.claims["P527"][num].mainsnak.datavalue.value['numeric-id'] -- Qnumbers of the parts of a tour
		tt = {}
		table.insert(tt, race) 
		table.insert(tt, mw.wikibase.getEntityObject(race))
		if pcall(foo2, tt[2], "P585", 1) then -- P585(point in time for a single day race) or P580(start time for a stage race)
			k = tt[2].claims["P585"][1].mainsnak.datavalue.value.time
		elseif pcall(foo2, tt[2], "P580", 1) then 
			k = tt[2].claims["P580"][1].mainsnak.datavalue.value.time
		end
		local year = '0'
		if k ~= nil then _, _, year, _, _ = string.find(k, "(%d+)-(%d+)-(%d+)") end
		table.insert(tt, year)
		table.insert(t.race, tt)
		table.sort(t.race, function(a,b) return a[3] < b[3] end) -- t.race is sorted after year
		num = num + 1
	end -- end while	
	t.number = num - 1

	tt = {}
	for num=1,t.number do -- build first column with link to wikipedia article and to wikidata item
		if wiki == "www" then sitelink = t.race[num][2]:getSitelink( 'frwiki' )
		else sitelink = mw.wikibase.sitelink( t.race[num][1] ) 
		end 
 		if sitelink == nil then sitelink = t.race[num][3] 
		else sitelink = "[[" .. sitelink .. "|" .. t.race[num][3] .. "]]" 
		end
	if WDlink_on == false then table.insert(tt, sitelink) else table.insert(tt, sitelink.. " " .. wdLink(t.race[num][1]) ) end 
	end 
	table.insert(t.year, tt)
	table.insert(t.vainqueur, winner(t, 20882667))
	table.insert(t.second,  winner(t, 20882668))
	table.insert(t.troisieme, winner(t, 20882669))

	local table_first, table_proto, table_last, table_center
	table_first = "<table cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black;"
	table_first = table_first .. "margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; "
	table_first = table_first .. "text-align:left; vertical-align:top; font-size:85%; line-height:1.6em;'>" 

	table_proto = "<tr style='background:#FFDF80; text-align:center;'><th>"
	if WDlink_on == false then table_proto = table_proto .. "[[File:Wikidata-logo S.svg|12px|link=d:".. frame.args[1].. "#P527]]" end    
	table_proto = table_proto.. headoftableIV(1).. "</th><th>".. headoftableIV(2).. "</th><th>".. headoftableIV(3).. "</th><th>".. headoftableIV(4).. "</th></tr>"
	table_center = ""
	table_last = "</table>"

	local table_center = ""
	for var=1, t.number do -- t.race[var][3]
	table_center = table_center .. "<tr><td style='text-align:center'>".. t.year[table.getn(t.year)][var].."</td>"
	table_center = table_center .. "<td>"..t.vainqueur[table.getn(t.vainqueur)][var].."</td>"
	table_center = table_center .. "<td>"..t.second[table.getn(t.second)][var].."</td>"
	table_center = table_center .. "<td>"..t.troisieme[table.getn(t.troisieme)][var].."</td></tr>" 
	end
	return table_first .. table_proto .. table_center .. table_last 
end

function p.listofstages(frame)
	if frame.args[1] ~= nil then frame.args[1] = string.gsub(frame.args[1], "%c", "") end
	local i, k, v, uu, ii, nationality
	local entity, etape, stage = {}, {}, {}
	local series_ordinal, point_of_time, length = {}, {}, {}
	local sitelinks_etape, sitelinks1, sitelinks2, sitelinks3, sitelinks4 = {}, {}, {}, {}, {}
	local y, m, d = {}, {}, {}
	local flag1, flag2 = {}, {}
	local number0, number1, number2 = {}, {}, {}
	local level = false
	local a, b, num, var
	local wiki = string.match(mw.site.server, "%a+")
	local entity0 = mw.wikibase.getEntityObject( frame.args[1] )
	local WDlink_on
	local _, _, key1, key01, key11, key12, key2, key21, key22, val
	local WPcontent = {}

	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end
	if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end 
--[=[ It is possible to give the table listofstages in the article commands which overwrites data from Wikidata. It could look like this:
{{Cycling race/listofstages|Q18574623
| RoW  1: locaTION Ab : [[1a1b]]
| after row 1 : date : 99 août 	
| after row 1 : icon : [[File:Stage rest day.svg|vbght frthzt fdgtr]]
| after row 1: text : rest day at [[aaa bbb ccc]] 
|row 4:  location A : [[4a4a]]abc
| row 3 : winner a : <sup>tzhgt<sup/>
| row 4 : winner b : kjuzhgt<br />bbjje
| row 4 : icon : [[File:Mediummountainstage.svg|xcvbbgf fgtr]] 
| row 4 : distance : <s>141.8</s> 122<ref>test</ref>
}}
The first paramer is "row x" or "after row x". "after row" adds a new row after row x into the table to print e.g. a rest day. The second parameters are 
"location [a/b/ab]", "date", "icon", "text", "winner [a/b]" and "distance". "a" and "b" means the first and the second location or winner. "ab" could be used if 
start location and end location are the same. The file data for the icon looks this way: [[File:Stage rest day.svg|any text]]  
]=]
if localFrame.args[2] ~= nil then
	--	local WProw, WPcourse, WPwinner = mw.ustring.lower(headoftable(1)), mw.ustring.lower(headoftable(3)), mw.ustring.lower(headoftable(5))
	local WProw, WPnew_row, WPcourse, WPtext, WPdate, WPwinner, WPicon, WPdistance = 'row', 'afterrow', 'location', 'text', 'date', 'winner', 'icon', 'distance'	
	for num,var in pairs(localFrame.args) do 
		if num > 1 and mw.ustring.find(mw.ustring.lower(localFrame.args[num]), WProw) then
			_, _, key1, key2, val = mw.ustring.find(localFrame.args[num], "([^:]+)%s*:?%s*([^:]*)%s*:%s*(%C+)")
			_, _, key01, key11, key12 = mw.ustring.find(key1, "(%a+)%s*(%a+)%s*(%d+)")
			key12 = tonumber(key12) key11 = mw.ustring.lower(key01..key11)
			key2 = mw.ustring.lower(mw.text.trim(key2))			
--			mw.log('key1=', key1, 'key2=', key2, 'val=', val)
--			mw.log('key01=', '|'..key01..'|', 'key11=', '|'..key11..'|', 'key12=', '|'..key12..'|')
			_, _, key21, key22 = mw.ustring.find(key2, "(%a+)%s*(%a*)")
			key21 = mw.ustring.lower(key21) key22 = mw.ustring.lower(key22)
--			mw.log('key21=', '|'..key21..'|', 'key22=', '|'..key22..'|')

			if type(WPcontent[key12]) ~= 'table' then WPcontent[key12] = {} end
			if key11 == WProw and key21 == WPcourse then WPcontent[key12][key22] = val end
			if key11 == WPnew_row and key2 == WPdate then
				WPcontent[key12]['date'] = val
				WPcontent[key12]['text'] = WPcontent[key12]['text'] or ''
				WPcontent[key12]['icon (new row)'] = WPcontent[key12]['icon (new row)'] or ''
			end
			if key11 == WPnew_row and key2 == WPtext then
				WPcontent[key12]['text'] = 	val
				WPcontent[key12]['date'] = 	WPcontent[key12]['date'] or ''
				WPcontent[key12]['icon (new row)'] = WPcontent[key12]['icon (new row)'] or ''
			end
			if key11 == WPnew_row and key2 == WPicon then
				val = mw.ustring.gsub(val, "|", "|border|right|20px|", 1)
				WPcontent[key12]['icon (new row)'] = val
				WPcontent[key12]['date'] = 	WPcontent[key12]['date'] or ''
				WPcontent[key12]['text'] = WPcontent[key12]['text'] or ''
			end
			if key11 == WProw and key21 == WPwinner and key22 == 'a' then WPcontent[key12]['stage winner'] = val end
			if key11 == WProw and key21 == WPwinner and key22 == 'b' then WPcontent[key12]['general winner'] = val end
			if key11 == WProw and key21 == WPicon then
				val = mw.ustring.gsub(val, "|", "|border|right|20px|", 1) WPcontent[key12]['icon'] = val end
			if key11 == WProw and key21 == WPdistance then WPcontent[key12]['distance'] = val end
		end
	end
end
	-- if there is one 'P527' then level = true
	a, b = pcall(fooA, 'numeric-id', entity0, 'P527', 1)
	if a == true then level = true end

	-- read series_ordinal and the Qnumber and sort them after series_ordinal, eg: 1 2a 2b 3 4 5
	local parts = {}
	for num, v in pairs(entity0.claims["P527"]) do
		etape[num] = 'Q'..v.mainsnak.datavalue.value['numeric-id']
		entity[num] = mw.wikibase.getEntityObject( etape[num] )
		a, b = pcall(fooA, 'value', entity[num], 'P1545', 1)
		if a == true then series_ordinal[num] = b else series_ordinal[num] = " " end
		table.insert(parts, num, {nr = series_ordinal[num], Qnum = etape[num]})
	end

	-- sort parts after nr = series_ordinal[num], not Qnum
	table.sort(parts, function(a, b)
		local num1 = string.sub(a.nr, string.find(a.nr, "%d+"))
		local num2 = string.sub(b.nr, string.find(b.nr, "%d+"))
		local char1, char2
		if string.find(a.nr, "%a") then char1 = string.sub(a.nr, string.find(a.nr, "%a")) else char1 = "" end
		if string.find(b.nr, "%a") then char2 = string.sub(b.nr, string.find(b.nr, "%a")) else char2 = "" end

		local comp
		if char1 == "" and char2 == "" then comp = tonumber(num1) < tonumber(num2) end
		if char1 ~= "" and char2 == "" then comp = tonumber(num1) < tonumber(num2) end
		if char1 == "" and char2 ~= "" then comp = tonumber(num1) < tonumber(num2) end
		if char1 ~= "" and char2 ~= "" then comp = char1 < char2 end
		return comp end)
		--return a.nr < b.nr end)

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "lv" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

	var = #entity0.claims["P527"]
	for num=1,var do
		-- collect data from Wikidata in tables 
		entity[num] = mw.wikibase.getEntityObject( parts[num].Qnum )
		if WDlink_on == false then number0[num]= " " else number0[num] = "&nbsp;" .. wdLink(parts[num].Qnum) end
		sitelinks_etape[num] = entity[num]:getSitelink()

		a, b = pcall(fooA, 'value', entity[num], 'P1545', 1)
		if a == true then series_ordinal[num] =  b else series_ordinal[num] = " " end
		a, b = pcall(fooA, 'time', entity[num], 'P585', 1)
		if a == true then point_of_time[num] =  b else point_of_time[num] = " " end
		a, b = pcall(fooA, 'numeric-id', entity[num], 'P1427', 1)
		if a == true then sitelinks1[num] =  WPlink( 'Q'..b ) else sitelinks1[num] = " " end
		a, b = pcall(fooA, 'numeric-id', entity[num], 'P1444', 1)
		if a == true then sitelinks2[num] =  WPlink( 'Q'..b ) else sitelinks2[num] = " " end
		a, b = pcall(fooA, 'amount', entity[num], 'P2043', 1)
		if a == true then length[num] =  b else length[num] = " " end

	flag1[num] = ' '
	sitelinks3[num] = ' '
	number1[num]  = ' '
	local id, qual
	-- find the vainqueur d'étape, Q20882747
	if pcall(foo3, entity[num], "P1346", 1, "P642", 1) then
		local v
		for _, v in pairs(entity[num].claims["P1346"]) do
			if pcall(function() id = v.mainsnak.datavalue.value['numeric-id'] end) then else id = nil end
			qual = v.qualifiers["P642"][1].datavalue.value["numeric-id"]
			if id ~= nil and v.rank ~= 'deprecated' then
				if qual == 20882747 then
					number1[num]  = 'Q' .. id
					a, b = timeStartEnd(number1[num], "P27", 'numeric-id', point_of_time[num])
					if a == true then
						flag1[num] = flag('Q'..b, point_of_time[num])
						sitelinks3[num] = WPlink( number1[num] )
					else
						a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(number1[num]), 'P17', 1)
						if a == true then
							flag1[num] = flag('Q'..b, point_of_time[num])
							sitelinks3[num] = WPlink( number1[num], 'winner_team' )
						end
					end
					if WDlink_on == false then number1[num]="" else number1[num] =
						"<span style='white-space:nowrap'>&nbsp;[[File:Wikidata-logo S.svg|12px|link=d:".. number1[num] .. ']]</span>' end
				end
 			end -- if id
  		end	-- for
	end  -- end if pcall

	flag2[num] = ' '
	sitelinks4[num] = ' '
	number2[num]  = ' '
	local id, qual
	-- find the leader du classement général à l'issue de l'étape, Q20882763
	if pcall(foo3, entity[num], "P1346", 1, "P642", 1) then
		local v
		for _, v in pairs(entity[num].claims["P1346"]) do
			if pcall(function() id = v.mainsnak.datavalue.value['numeric-id'] end) then else id = nil end
			qual = v.qualifiers["P642"][1].datavalue.value["numeric-id"]
			if id ~= nil and v.rank ~= 'deprecated' then
				if qual == 20882763 or qual == 20882667 then
					number2[num]  = 'Q' .. id
					a, b = timeStartEnd(number2[num], "P27", 'numeric-id', point_of_time[num])
					if a == true then
						flag2[num] = flag( 'Q'..b, point_of_time[num])
						sitelinks4[num] = WPlink( number2[num] )		
					else
						a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(number2[num]), 'P17', 1)
						if a == true then
							flag2[num] = flag( 'Q'..b, point_of_time[num])
							sitelinks4[num] = WPlink( number2[num], 'winner_team' )			
						end
					end
					if WDlink_on == false then number2[num]="" else number2[num] =
						"<span style='white-space:nowrap'>&nbsp;[[File:Wikidata-logo S.svg|12px|link=d:"..number2[num] .. ']]</span>' end
				end
 			end -- if id
  		end	-- for
	end  -- end if pcall
	
	if pcall(function()
		-- find the type of stages
		i = 1
		stage[num] = ""
		uu = entity[num].claims["P31"][i].mainsnak.datavalue.value['numeric-id']
		while entity[num].claims["P31"][i] do
			if uu == 20646667 then stage[num] = typeofstage('plain stage') break end
			if uu == 20646670 then stage[num] = typeofstage('hilly stage') break end
			if uu == 20680270 then stage[num] = typeofstage('intermediate stage') break end
			if uu == 20646668 then stage[num] = typeofstage('mountain stage') break end
			if uu == 485321 then stage[num] = typeofstage('time trial stage', 485321) break end -- prologue
			if uu == 2266066 then stage[num] = typeofstage('time trial stage', 2266066) break end -- individual time trial
			if uu == 2348250 then stage[num] = typeofstage('time trial stage', 2348250) break end -- team time trial
			if uu == 20679712 then stage[num] = typeofstage('uphill time trial stage') break end
			i = i + 1
		end
		end)
	then else stage[num] = " " end

     _, _, y[num], m[num], d[num] = string.find(point_of_time[num], "(%d+)-(%d+)-(%d+)") -- d = day, m = month

	end -- end for num=1,var do

	local table_first, table_proto, table_last
	table_first = "<table border='0' cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black; "
	table_first = table_first .. "margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; "
	table_first = table_first .. "text-align:left; font-size:85%; line-height:1.6em;'>"
	table_proto = "<tr style='background:#FFDF80; text-align:center;'><th nowrap>"
	if WDlink_on == false then table_proto = table_proto .. "[[File:Wikidata-logo S.svg|12px|link=d:".. localFrame.args[1].. "#P527]]" end
	table_proto = table_proto.. headoftable(1) .."</th><th>" ..	headoftable(2) .."</th><th>".. headoftable(3)..
	"</th>".. "<th style='color:#FFDF80'>type</th>" .."<th>".. headoftable(4).. "</th><th>".. headoftable(5).."</th><th>".. headoftable(6).. "</th></tr>"
	table_last = "</table>"

     -- build table for output
	local table_center = ""
	var = #entity0.claims["P527"]
	for num=1, var do
		local a, b
		a, _ = string.gsub(series_ordinal[num], "%a", "") -- 20, not 20a
		if string.find(series_ordinal[num], "%a") then b = string.sub(series_ordinal[num], string.find(series_ordinal[num], "%a"))
		else b = "" end
		local ee, er = stageLink(series_ordinal[num], a, b)
		if series_ordinal[num] == "0" then
			er = "#"..func_prologue()
			ee = func_prologue()
		end
		local stageNr -- if there is a wikipedia article of that stage show it or show the section
		if sitelinks_etape[num] == nil then stageNr = "[["..er.."|"..ee.."]]" else stageNr = "[["..sitelinks_etape[num].."|"..ee.."]]" end

		local day = tostring(tonumber(d[num]))
		if day == "1" and (wiki == "fr") then day = "1<sup>er</sup>" end
		if wiki == "lv" then stageNr = series_ordinal[num] end
		local month = func_month(m[num])
		local date = day..' ' .. month
		if wiki == "br" then date = day.. " a viz ".. month  end
		if wiki == "ca" or wiki == "es" then date = day .. " de ".. month end
		if wiki == "eo" then date = day.. "-a de ".. month end
		if wiki == "eu" then date = month.. "k ".. day end
		if wiki == "ja" then date = month.. day .. "日" end
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" or wiki == "lv" then date = day.. ". ".. month end
		if wiki == "cs" then date = day.. ". xg ".. month end
		if wiki == "en" then date = month.. " ".. day end

		if pcall(function()
			length[num] = mw.language.getContentLanguage():formatNum(tonumber(length[num])) 
			end        	
		) then else length[num] = " " end

		if type(WPcontent[num]) == 'table' and WPcontent[num]['a'] ~= nil then sitelinks1[num] = WPcontent[num]['a'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['b'] ~= nil then sitelinks2[num] = WPcontent[num]['b'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['ab'] ~= nil then sitelinks1[num] = WPcontent[num]['ab'] sitelinks2[num] = '' end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['icon'] ~= nil then stage[num] = WPcontent[num]['icon'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['distance'] ~= nil then length[num] = WPcontent[num]['distance'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['stage winner'] ~= nil then
			flag1[num] = '' sitelinks3[num] = WPcontent[num]['stage winner'] number1[num]= '' end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['general winner'] ~= nil then
			flag2[num] = '' sitelinks4[num] = WPcontent[num]['general winner'] number2[num]= '' end

		table_center = table_center.. "<tr><td style='text-align:center; white-space:nowrap'>".. stageNr .. "<span style='white-space:nowrap'>&nbsp;".. number0[num].."</span>"..
		"</td><td style='white-space:nowrap; text-align:right; padding-right:0px'>"..date.. "</td><td style='padding-right:0px'>".. sitelinks1[num]
		if sitelinks2[num] ~= '' then table_center = table_center.. " – " end
		table_center = table_center.. sitelinks2[num].."</td><td style='padding-top:10px'>".. stage[num].. "</td><td style='text-align:center'>".. length[num].. "</td>"
		if type(WPcontent[num]) == 'table' and WPcontent[num]['stage winner'] ~= nil then
			table_center = table_center.. "<td style='text-align:center'>".. flag1[num].. ' '.. sitelinks3[num].. number1[num]
		else table_center = table_center.. "<td>".. flag1[num].. ' '.. sitelinks3[num].. number1[num] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['general winner'] ~= nil then
			table_center = table_center.. "<td style='text-align:center'>".. flag2[num].. ' '.. sitelinks4[num].. number2[num].. "</td></tr>"
		else table_center = table_center.. "<td>".. flag2[num].. ' '.. sitelinks4[num].. number2[num].. "</td></tr>" end

		if type(WPcontent[num]) == 'table' and (WPcontent[num]['date'] ~= nil or WPcontent[num]['text'] ~= nil or WPcontent[num]['icon (new row)'] ~= nil) 
		then table_center = table_center.. "<tr><td></td>"
			if WPcontent[num]['icon (new row)'] == '' then table_center = table_center.."<td nowrap style='text-align:right; padding:3px 0px 10px 0px'>".. WPcontent[num]['date']
			else table_center = table_center.."<td style='text-align:right; padding-right:0px'>".. WPcontent[num]['date'] end
			if WPcontent[num]['icon (new row)'] == '' then table_center = table_center.."</td><td style='text-align:left; padding:3px 4px 10px'>"..WPcontent[num]['text']
			else table_center = table_center.."</td><td style='text-align:left'>"..WPcontent[num]['text'] end
			table_center = table_center.."</td><td style='padding-top:10px'>".. WPcontent[num]['icon (new row)'].. "</td><td colspan='3' ></td></tr>"
		end
    end

    local tabl = table_first.. table_proto
    if level == true then tabl = tabl.. table_center.. table_last else tabl = tabl.. table_last end
    return tabl
end

function func_prologue() -- returns the word "Prologue"
	local l10nDef = { ["fr"]="Prologue", ["en"]="Prologue", ["br"]="Prolog", ["ca"]="Pròleg", ["cs"]="Prolog", ["de"]="Prolog", ["da"]="Prolog", ["eo"]="Prologo",
	["es"]="Prólogo", ["eu"]="Aitzinetapa", ["fi"]="Prologi", ["fo"]="Forteinur", ["hu"]="Prolog", ["it"]="Prologo", ["ja"]="プロローグ", ["la"]="Incipit prologus", ["lb"]="Prolog", ["lv"]="Prologs",
	["mk"]="Пролог",  ["nl"]="Proloog", ["no"]="Prolog", ["pl"]="Prologu", ["pt"]="Prólogo", ["ro"]="Prolog", ["ru"]="Пролог", ["sk"]="Prológ", ["sv"]="Prolog" }

	local wiki,word=mw.site.server 
	if wiki=='//www.wikidata.org' then return l10nDef["fr"]
	else return l10nDef[string.sub(wiki,string.find(wiki,"%a+"))] end
end

function stageLink(x, a, b) -- x= 10a: a = 10, b = a. x = 5: a = 5, b = "" 
	local l10nDef = {["fr"]="étape", ["en"]="Stage", ["br"]="Tennad", ["ca"]="Etapa", ["cs"]="Etapa", ["de"]="Etappe", ["da"]="etape", ["eo"]="Etapo",
	["es"]="Etapa", ["eu"]="Etapa", ["fi"]="Etappi", ["fo"]="Teinur", ["hu"]="Szakasz", ["it"]="Tappa", ["ja"]="ステージ", ["la"]="Statio", ["lb"]="Etapp", ["lv"]="Posms", ["mk"]="Етапа",
	["nl"]="Etappe", ["no"]="Etappe", ["pl"]="Etap", ["pt"]="Etapa", ["ro"]="Etapa", ["ru"]="Этап", ["sk"]="Etapa", ["sv"]="Etapp" }		                

	local wiki,l10n=mw.site.server
	local word1, word2
	if wiki=='//www.wikidata.org' then word2=l10nDef["fr"]
	else word2=l10nDef[string.sub(wiki,string.find(wiki,"%a+"))] end
	local word = word2

-- fr: {{1re}} étape, {{2e}} étape
	if mw.site.server == "//www.wikidata.org" or mw.site.server == "//fr.wikipedia.org" then
		if b == "" then -- series_ordinal without character
			if a == "1" then word1 = "1<sup>re</sup> "..word else word1 = a.."<sup>e</sup> "..word end -- table text = {{1re}} étape, {{2ae}} étape,
			if a == "1" then word2 = "#1re "..word else word2 = "#"..a.."e  "..word end --text of section header = #1re étape, #2e étape
			return word1, word2
		end
		if b ~= "" then -- series_ordinal with character: instead of eg "1a re" it is "1re a"
			if a == "1" then word1 = "1<sup>re</sup> "..b.." "..word else word1 = a.."<sup>e</sup> "..b.." "..word end -- table text = {{1re}} étape, {{2ae}} étape,
			if a == "1" then word2 = "#1re "..b.." "..word else word2 = "#"..a.."e"..b.." "..word end --text of section header = #1re étape, #2e étape
			return word1, word2
		end
	end
	if mw.site.server == "//de.wikipedia.org" or mw.site.server == "//da.wikipedia.org" then return a..". "..b.." "..word, "#"..word.." ".. x end

	-- default
	word1 = x                  -- table text = 1, 2a, 3
	word2 = "#"..word.." ".. x -- text of section header = #Etappe 2a, #Stage 4
	return word1, word2 
end

function func_month(x) 
	local l10nDef = { }
	l10nDef["fr"] = {"janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."}
	l10nDef["en"] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
	l10nDef["be"] = {"studz.", "liut.", "sak.", "kras.", "mai.", "cherv.", "lip.", "zhniven'", "veras", "kastr.", "list.", "snezh."}
	l10nDef["bg"] = {"ian.", "fevr.", "mart", "april", "mai", "iuni", "iuli", "avg.", "sept.", "okt.", "noem.", "dek."}
	l10nDef["br"] = {"Genver", "C'hwevrer", "Meurzh", "Ebrel", "Mae", "Mezheven", "Gouere", "Eost", "Gwengolo", "Here", "Du", "Kerzu"}
	l10nDef["ca"] = {"gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"}
	l10nDef["cs"] = {"led.", "ún.", "bře.", "dub.", "kvě.", "čvn.", "čvc.", "srp.", "září.", "říj.", "list.", "pros."}
	l10nDef["da"] = {"jan.", "febr.", "marts", "april", "maj", "juni", "juli", "aug.", "sept.", "okt.", "nov.", "dec."}
	l10nDef["de"] = {"Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."}
	l10nDef["eo"] = {"janu.", "febr.", "marto", "apr.", "majo", "jun.", "jul.", "auxg.", "sept.", "okt.", "nov.", "dec."}
	l10nDef["es"] = {"enero", "feb.", "marzo", "abr.", "mayo", "jun.", "jul.", "agosto", "sept.", "oct.", "nov.", "dic."}
	l10nDef["et"] = {"jaan.", "veebr.", "märts", "apr.", "mai", "juuni", "juuli", "aug.", "sept.", "okt.", "nov.", "dets."}
	l10nDef["eu"] = {"urtarrila", "otsaila", "martxoa", "apirila", "maiatza", "ekaina", "uztaila", "abuztua", "iraila", "urria", "azaroa", "abendua"}
	l10nDef["fi"] = {"tammikuuta", "helmikuuta", "maaliskuuta", "huhtikuuta", "toukokuuta", "kesäkuuta", "heinäkuuta", "elokuuta", "syyskuuta", "lokakuuta", "marraskuuta", "joulukuuta"}
	l10nDef["fo"] = {"januar", "februar", "mars", "apríl", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"}
	l10nDef["hu"] = {"január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"}
	l10nDef["id"] = {"Djan.", "Peb.", "Mrt.", "Apr.", "Mai", "Djuni", "Djuli", "Ag.", "Sept.", "Okt.", "Nop.", "Des."}
	l10nDef["it"] = {"genn.", "febbr.", "mar.", "apr.", "magg.", "giugno", "luglio", "ag.", "sett.", "ott.", "nov.", "dic."}
	l10nDef["ja"] = {"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"}
	l10nDef["la"] = {"Ian.", "Febr.", "Mart.", "Apr.", "Mai.", "Iun.", "Iul.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."}
	l10nDef["lb"] = {"Januar", "Februar", "Mäerz", "Abrëll", "Mee", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}
	l10nDef["lt"] = {"saus.", "vas.", "kovas", "bal.", "geg.", "birz", "liepa", "rugp.", "rugs.", "spalis", "lapkr.", "gr."}
	l10nDef["lv"] = {"janvāris", "februāris", "marts", "aprīlis", "maijs", "jūnijs", "jūlijs", "augusts", "septembris", "oktobris", "novembris", "decembris"}
	l10nDef["mk"] = {"јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"}
	l10nDef["ms"] = {"Jan.", "Feb.", "Mac", "Apr.", "Mei", "Jun", "Julai", "Og", "Sept.", "Okt.", "Nov.", "Dis."}
	l10nDef["no"] = {"jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."}
	l10nDef["nl"] = {"jan.", "feb.", "maart", "apr.", "mei", "juni", "juli", "aug.", "sept.", "okt.", "nov.", "dec."}
	l10nDef["pl"] = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
	l10nDef["pt"] = {"jan.", "fev.", "março", "abril", "maio", "junho", "julho", "agosto", "set.", "out.", "nov.", "dez."}
	l10nDef["ro"] = {"Ian.", "Feb.", "Mar.", "Apr.", "Mai", "Iun.", "Iul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."}
	l10nDef["ru"] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"}
	l10nDef["sh"] = {"sijec.", "velj.", "ozuj.", "trav.", "svib.", "lip.", "srp.", "kol.", "ruj.", "list.", "stud.", "pros."}
	l10nDef["sk"] = {"jan.", "feb.", "mar.", "apr.", "máj", "jún.", "júl.", "aug.", "sept.", "okt.", "nov.", "dec."}
	l10nDef["sl"] = {"jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "avg.", "sept.", "okt.", "nov.", "dec."}
	l10nDef["sv"] = {"jan.", "febr.", "mars", "april", "maj", "juni", "juli", "aug.", "sept.", "okt.", "nov.", "dec."}
	l10nDef["zh"] = {"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"}

	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then return l10nDef["fr"][tonumber(x)]
	else return l10nDef[string.sub(wiki,string.find(wiki,"%a+"))][tonumber(x)] end
end

function headoftable(x) -- En-tête du tableau listant les étapes
	local l10nDef={ }
	l10nDef["fr"]={"Étape", "Date", "Villes étapes", "Distance (km)", "Vainqueur d'étape", "Leader du classement général"}
	l10nDef["en"]={"Stage", "Date", "Course", "Distance (km)", "Stage winner", "Overall leader"}
	l10nDef["br"]={"Tennad", "Deiziad", "Kêr loc'hañ ha kêr degouezhout", "Hed (km)", "Trec'hour", "E penn ar renkamant hollek"}
	l10nDef["ca"]={"Etapa", "Data", "Ciutats d'etapa", "Distància (km)", "Vencedor de l'etapa", "Líder de la general"}
	l10nDef["cs"]={"Etapa", "Datum", "Trasa", "Vzdálenost (km)", "Vítěz", "Průběžný lídr"}
	l10nDef["da"]={"Etape", "Dato", "Start – Mål", "Afstand (km)", "Etapevinder", "Førende rytter"}
	l10nDef["de"]={"Etappe", "Datum", "Etappenorte", "Länge (km)", "Etappen&shy;sieger", "Gesamt&shy;führender"}
	l10nDef["eo"]={"Etapo", "Dato", "Etapa urbo", "Longo (km)", "Venkinto de la etapo", "Estro de la gxeneralo klasado"}
	l10nDef["es"]={"Etapa", "Fecha", "Recorrido", "Distancia (km)", "Ganador", "Líder"}
	l10nDef["eu"]={"Etapa", "Data", "Ibilbidea", "Distantzia (km)", "Irabazlea", "Liderra"}
	l10nDef["fi"]={"Etappi", "Päivä", "Reitti", "Pituus (km)", "Voittaja", "Kokonaiskilpailun johtaja"}
	l10nDef["fo"]={"Etape", "Dagur", "Byrjan – Mál", "Vegalongd (km)", "Teina&shy;vinnari", "Gula troyggjan"}
	l10nDef["hu"]={"Szakasz", "Időpont", "Végpontok", "Hossz (km)", "Szakasz&shy;győztes", "Általános vezető"}
	l10nDef["it"]={"Tappa", "Data", "Percorso", "Distanza (km)", "Vincitore di tappa", "Leader cl. generale"}
	l10nDef["ja"]={"ステージ", "開催日", "コース", "距離 (km)", "ステージ勝者", "全体リーダー"}
	l10nDef["la"]={"Statio", "Dies", "Iter", "Distantia (km)", "Victor", "Altiore princeps"}
	l10nDef["lb"]={"Etapp", "Datum", "Etappestied", "Längt (km)", "Gewënner", "General&shy;klassement"}
	l10nDef["lv"]={"Posms", "Datums", "Maršruts", "Posma garums (km)", "Uzvarētājs", "Kopvērtējuma līderis"}
	l10nDef["mk"]={"Етапа", "Датум", "Тек", "Растојание (км)", "Победник", "Cевкупен лидер"}
	l10nDef["nl"]={"Etappe", "Datum", "Start – Finish", "Afstand (km)", "Winnaar", "Klassements&shy;leider"}
	l10nDef["no"]={"Etappe", "Dato", "Start – Målgang", "Lengde (km)", "Etappe&shy;vinner", "Sammenlagt&shy;leder"}
	l10nDef["pl"]={"Etap", "Data", "Start – Meta", "Dystans (km)", "Zwycięzca etapu", "Lider"}
	l10nDef["pt"]={"Etapa", "Data", "Percurso", "Distância (km)", "Vencedor", "Líder geral"}
	l10nDef["ro"]={"Etapa", "Dată", "Start – Sosire", "Distanță (km)", "Câștigător", "Liderul global"}
	l10nDef["ru"]={"Этап", "Дата", "Маршрут", "Длина (км)", "Победитель", "Лидер генеральной классификации"}
	l10nDef["sk"]={"Etapa", "Dátum", "Trasa", "Vzdialenosť (km)", "Víťaz", "Priebežný líder"}
	l10nDef["sv"]={"Etapp", "Datum", "Start – mål", "Distans (km)", "Skede vinnare", "Övergripande ledare"}
	l10nDef["als"]=l10nDef["fr"]

	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then l10n=l10nDef["fr"]
	else l10n=l10nDef[string.sub(wiki,string.find(wiki,"%a+"))] end

	return l10n[x]
end 

function headoftableIII(x) -- En-tête du tableau listant les équipes participantes (P1923)
	local l10nDef = { }
	l10nDef["//fr.wikipedia.org"] = {"Nom de l'équipe", "Pays", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Équipe continentale professionnelle", "Équipes continentales professionnelles", "Équipe continentale", "Équipes continentales", "Équipe nationale", "Équipes nationales", "Équipe régionale et de club", "Équipes régionales et de clubs", "Équipe cycliste professionnelle", "Équipes cyclistes professionnelles", "Équipe cycliste amateur", "Équipes cyclistes amateurs", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Équipe mixte", "Équipes mixtes", "Équipe féminine", "Équipes féminines"}
	l10nDef["//br.wikipedia.org"] = {"Anv skipailh", "Bro", "Kod", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Skipailh kevandir a-vicher", "Skipailhoù kevandir a-vicher", "Skipailh kevandir", "Skipailhoù kevandir", "Skipailh bro", "Skipailhoù bro", "Skipailh rannvro ha klub", "Skipailhoù rannvro ha club", "Skipailh marc'h-houarn a-vicher", "Skipailhoù marc'h-houarn a-vicher", "Skipailh marc'h-houarn amatour", "Skipailhoù marc'h-houarn amatour", "Strollad sport I", "Strolladoù sport I", "Strollad sport II", "Strolladoù sport II", "Strollad sport III", "Strolladoù sport III", "Skipailh kemmesk", "Skipailhoù kemmesk", "Skipailh merc'hed", "Skipailhoù merc'hed"}
	l10nDef["//ca.wikipedia.org"] = {"Nom de l'equip", "País", "Codi", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Equip continental professional", "Equips continentals professionals", "Equip continental", "Equips continentals", "Equip nacional", "Equips nacionals", "Equip regional i de club", "Equips regionals i de clubs", "Equip ciclista professional", "Equips ciclistes professionals", "Equip ciclista amateur", "Equips ciclistes amateurs", "Grup esportiu I", "Grups esportius I", "Grup esportiu II", "Grups esportius II", "Grup esportiu III", "Grups esportius III", "Equip mixt", "Equips mixtos", "Equip femení", "Equips femenins"}
	l10nDef["//da.wikipedia.org"] = {"Holdnavn", "Land", "Kode", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professionelt kontinentalhold", "Professionelle kontinentalhold", "Kontinentalhold", "Kontinentale hold", "Landshold", "Landshold", "Regional- og klubhold", "Regional- og klubhold", "Prohold", "Prohold", "Amatørhold", "Amatørhold", "Sportsgruppe I", "Sportsgruppe I", "Sportsgruppe II", "Sportsgruppe II", "Sportsgruppe III", "Sportsgruppe III", "Mix-hold", "Mix-hold", "Kvindehold", "Kvindehold"}
	l10nDef["//eo.wikipedia.org"] = {"Nomo de la teamo", "Lando", "Kodo", "Monda teamo", "Mondaj teamoj", "ProTeamo", "ProTeamoj", "Profesiista kontinenta teamo", "Profesiistaj kontinentaj teamoj", "Kontinenta teamo", "Kontinentaj teamoj", "Nacia teamo", "Naciaj teamoj", "Regiona aux kluba teamo", "Regionaj aux klubaj teamoj", "Profesiista bicikla teamo", "Profesiistaj biciklaj teamoj", "Amatora bicikla teamo", "Amatoraj biciklaj teamoj", "Sporta grupo 1", "Sportaj grupoj 1", "Sporta grupo 2", "Sportaj grupoj 2", "Sporta grupo 3", "Sportaj grupoj 3", "Miksa teamo", "Miksaj teamoj", "Ina teamo", "Inaj teamoj"}
	l10nDef["//es.wikipedia.org"] = {"Nombre del equipo", "País", "Código", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Equipo continental profesional", "Equipos continentales profesionales", "Equipo continental", "Equipos continentales", "Equipo nacional", "Equipos nacionales", "Equipo regional de club", "Equipos regionales de clubes", "Equipo del ciclista profesional", "Equipos de los ciclistas profesionales", "Equipo ciclista aficionado", "Equipos ciclistas de aficionados", "Grupo deportivo I", "Grupos deportivos I", "Grupo deportivo II", "Grupos deportivos II", "Grupo deportivo III", "Grupos deportivos III", "Equipo mixto", "Equipos mixtos", "Equipo femenino", "Equipos femeninos"}
	l10nDef["//eu.wikipedia.org"] = {"Taldearen izena", "Herrialdea", "Kodea", "Munduko taldea", "Munduko taldeak", "Pro taldea", "Pro taldeak", "Kontinenteko talde profesionala", "Kontinenteko talde profesionala", "Kontinenteko taldea", "Kontinenteko taldeak", "Estatuko taldea", "Estatuko taldeak", "Eskualdeko eta klubeko taldea", "Eskualdeko eta klubeko taldeak", "Txirrindulari talde profesionala", "Txirrindulari talde profesionalak", "Txirrindulari talde amateurra", "Txirrindulari talde amateurrak", "I. mailako kirol taldea", "I. mailako kirol taldeak", "II. mailako kirol taldea", "II. mailako kirol taldeak", "III. mailako kirol taldea", "III. mailako kirol taldeak", "Talde mistoa", "Talde mistoak", "Emakume taldea", "Emakume taldeak"}
	l10nDef["//lb.wikipedia.org"] = {"Equippennumm", "Land", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professionell Kontinentalequipe", "Professionell Kontinentalequippen", "Kontinentalequipe", "Kontinentalequippen", "Nationalequipe", "Nationalequippen", "Regional- a Klubequipe", "Regional- a Klubequippen", "Professionell Vëlosequipe", "Professionell Vëlosequippen", "Amateursequipe", "Amateursequippen", "Sportsgrupp I", "Sportsgruppen I", "Sportsgrupp II", "Sportsgruppen II", "Sportsgrupp III", "Sportsgruppen III", "Gemëscht Equipe", "Gemëscht Equippen", "Dammenequipe", "Dammenequippen"}
	l10nDef["//no.wikipedia.org"] = {"Lagnavn", "Land", "Kode", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Profesjonelt kontinentallag", "Profesjonelle kontinentallag", "Kontinentallag", "Kontinentale lag", "Nasjonallag", "Nasjonale lag", "Équipe régionale et de club", "Équipes régionales et de clubs", "Profflag", "Profflag", "Amatørlag", "Amatørlag", "Sportsgruppe I", "Sportsgruppe I", "Sportsgruppe II", "Sportsgruppe II", "Sportsgruppe III", "Sportsgruppe III", "Mix-lag", "Mix-lag", "Kvinnelag", "Kvinnelag"}
	l10nDef["//ro.wikipedia.org"] = {"Numele echipei", "Țară", "Cod", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Echipă continentală profesionistă", "Echipe continentale profesioniste", "Echipă continentală", "Echipe continentale", "Echipă națională", "Echipe naționale", "Echipă regională și de club", "Echipe regionale și de club", "Echipă ciclistă profesionistă", "Echipe cicliste profesioniste", "Echipă ciclistă de amatori", "Echipe cicliste de amatori", "Grup sportiv I", "Grupuri sportive I", "Grup sportiv II", "Grupuri sportive II", "Grup sportiv III", "Grupuri sportive III", "Echipă mixtă", "Echipe mixte", "Echipă feminină", "Echipe feminine"}
	l10nDef["//www.wikidata.org"] = l10nDef["//fr.wikipedia.org"]
	local l10n = l10nDef[mw.site.server]
	if not l10n then l10n = l10nDef["//fr.wikipedia.org"] end  -- default
	return l10n[x]
end 

function headoftableIV(x) -- En-tête du tableau du palmarès d'une course cycliste
	local l10nDef = { }
	l10nDef["//fr.wikipedia.org"] = {"Année", "Vainqueur", "Deuxième", "Troisième"}
	l10nDef["//en.wikipedia.org"] = {"Year", "Winner", "Second", "Third"}
	l10nDef["//br.wikipedia.org"] = {"Bloavezh", "1añ", "2l", "3de"}
	l10nDef["//ca.wikipedia.org"] = {"Any", "Vencedor", "Segon", "Tercer"}
	l10nDef["//cs.wikipedia.org"] = {"Ročník", "Vítěz", "Druhý", "Třetí"}
	l10nDef["//da.wikipedia.org"] = {"År", "Vinder", "Toer", "Treer"}
	l10nDef["//de.wikipedia.org"] = {"Jahr", "Sieger", "Zweiter", "Dritter"}
	l10nDef["//eo.wikipedia.org"] = {"Jaro", "Venkinto", "Dua pozicio", "Tria pozicio"}
	l10nDef["//es.wikipedia.org"] = {"Año", "Ganador", "Segundo", "Tercero"}
	l10nDef["//eu.wikipedia.org"] = {"Urtea", "Irabazlea", "Bigarrena", "Hirugarrena"}
	l10nDef["//fi.wikipedia.org"] = {"Vuosi", "Voittaja", "Toinen", "Kolmas"}
	l10nDef["//fo.wikipedia.org"] = {"Ár", "Vinnari", "Nr. 2", "Nr. 3"}
	l10nDef["//hu.wikipedia.org"] = {"Év", "Versenyző", "Második", "Harmadik"}
	l10nDef["//it.wikipedia.org"] = {"Anno", "Vincitore", "Secondo", "Terzo"}
	l10nDef["//ja.wikipedia.org"] = {"年", "優勝", "準優勝", "3位"}
	l10nDef["//lb.wikipedia.org"] = {"Joer", "Gewënner", "Zweeten", "Drëtten"}
	l10nDef["//lv.wikipedia.org"] = {"Gads", "Uzvarētājs", "Otrais", "Trešais"}
	l10nDef["//mk.wikipedia.org"] = {"Година", "Победник", "Второпласиран", "Третопласиран"}
	l10nDef["//nl.wikipedia.org"] = {"Jaar", "Winnaar", "Tweede", "Derde"}
	l10nDef["//no.wikipedia.org"] = {"År", "Vinner", "Andreplass", "Tredjeplass"}
	l10nDef["//pl.wikipedia.org"] = {"Rok", "Pierwsze", "Drugie", "Trzecie"}
	l10nDef["//pt.wikipedia.org"] = {"Ano", "Vencedor", "Segundo", "Terceiro"}
	l10nDef["//ro.wikipedia.org"] = {"An", "Câștigător", "Locul doi", "Locul trei"}
	l10nDef["//ru.wikipedia.org"] = {"Год", "Победитель", "Второй", "Третий"}
	l10nDef["//sr.wikipedia.org"] = {"Година", "Победник", "Други", "Трећи"}
	l10nDef["//sv.wikipedia.org"] = {"År", "Vinnare", "Andra", "Tredje"}
	l10nDef["//www.wikidata.org"] = {"Année", "Vainqueur", "Deuxième", "Troisième"}
	local l10n = l10nDef[mw.site.server]
	if not l10n then l10n = l10nDef["//fr.wikipedia.org"] end  -- default
	return l10n[x]
end 

function typeofstage(x, typ)
 	--  plain, hilly, inter, ... must be "" or "any text"
 	--  l10nDef[""] = {plain = "", hilly="", inter='', mount='', time_prologue='', time_team='', time_indiv='', uphill='', rest=''}
	local l10nDef = { }
	l10nDef["fr"] = {plain = "étape de plaine", hilly="étape vallonnée", inter='étape de moyenne montagne', mount='étape de montagne', time_prologue='prologue', time_team='contre-la-montre par équipes', time_indiv='contre-la-montre individuel', uphill='contre-la-montre en côte', rest='étape de repos'}	
	l10nDef["en"] = {plain = "plain stage", hilly="hilly stage", inter='intermediate stage', mount='mountain stage', time_prologue='time trial stage', time_team='team time trial stage', time_indiv='individual time trial stage', uphill='uphill time trial stage', rest='rest day'}
	l10nDef["br"] = {plain = "tennad plaen", hilly="tennad digompez", inter='tennad damveneziek', mount='tennad meneziek', time_prologue='', time_team='ABEU a-skipailhoù', time_indiv='ABEU', uphill='', rest='devezh diskuizh'}
	l10nDef["ca"] = {plain = "etapa plana", hilly="etapa accidentada", inter='etapa de mitja muntanya', mount='etapa de muntanya', time_prologue='pròleg', time_team='contrarellotge per equips', time_indiv='contrarellotge individual', uphill='', rest='etapa de descans'}
	l10nDef["cs"] = {plain = "rovinatá etapa", hilly="", inter='kopcovitá etapa', mount='horská etapa', time_prologue='prolog', time_team='týmová časovka', time_indiv='individuální časovka', uphill='', rest=''}
	l10nDef["da"] = {plain = "flad etape", hilly="kuperet etape", inter='middel bjergetape', mount='bjergetape', time_prologue='prolog', time_team='holdtidskørsel', time_indiv='enkeltstart', uphill='bjergenkeltstart', rest='hviledag'}
	l10nDef["de"] = {plain = "Flachetappe", hilly="Hügelige Etappe", inter='Mittelschwere Etappe', mount='Hochgebirgsetappe', time_prologue='Prolog', time_team='Teamzeitfahren', time_indiv='Einzelzeitfahren', uphill='Bergzeitfahren', rest='Ruhetag'}
	l10nDef["eo"] = {plain = "ebena etapo", hilly="malebena etapo", inter='mezgranda montaro etapo', mount='montara etapo', time_prologue='prologo', time_team='teama kontraux-la-kronometro', time_indiv='individua kontraux-la-kronometro', uphill='malebena kontraux-la-kronometro', rest='ripoza etapo'}
	l10nDef["es"] = {plain = "etapa llana", hilly="etapa escarpada", inter='etapa de media montaña', mount='etapa de montaña', time_prologue='prólogo', time_team='contrarreloj por equipos', time_indiv='contrarreloj individual', uphill='cronoescalada', rest='jornada de descanso'}
	l10nDef["eu"] = {plain = "etapa laua", hilly="etapa gorabeheratsua", inter='bitarteko etapa', mount='mendiko etapa', time_prologue='aitzinetapa', time_team='taldekako erlojupekoa', time_indiv='banakako erlojupekoa', uphill='erlojupeko igoera', rest='atseden eguna'}
	l10nDef["fi"] = {plain = "Tasamaaetappi", hilly="Mäkietappi", inter='Keskivaikea vuorietappi', mount='Vuorietappi', time_prologue='', time_team='Joukkueaika-ajo', time_indiv='Henkilökohtainen aika-ajo', uphill='', rest='välipäivä'}
	l10nDef["fo"] = {plain = "Slætt", hilly="Slætt við brúgvasteinum", inter='Óslætt', mount='Fjallateinur', time_prologue='Forteinur', time_team='Liðsúkkling', time_indiv='Einkultstartur', uphill='', rest='Hvílidagur'}
	l10nDef["ja"] = {plain = "平坦ステージ", hilly="丘陵ステージ", inter='中間ステージ', mount='山岳ステージ', time_prologue='タイムトライアルステージ', time_team='チームタイムトライアルステージ', time_indiv='個人タイムトライアルステージ', uphill='アップヒルタイムトライアルステージ', rest='休養日'}
	l10nDef["lb"] = {plain = "Flaach Etapp", hilly="Hiwweleg Etapp", inter='Mëttelschwéier Etapp', mount='Biergetapp', time_prologue='Prolog', time_team='Contre-la-montre (Equipe)', time_indiv='Contre-la-montre (Eenzel)', uphill='Biergcourse', rest='Roudag'}
	l10nDef["lv"] = {plain = "līdzenuma posms", hilly="paugurains posms", inter='vidēju kalnu posms', mount='kalnu posms', time_prologue='individuālais brauciens', time_team='komandu brauciens', time_indiv='individuālais brauciens', uphill='individuālais brauciens kalnā', rest='atpūtas diena'}	
	l10nDef["mk"] = {plain = "рамна етапа", hilly="ридеста етапа", inter='среднопланинска етапа', mount='планинска етапа', time_prologue='пролог', time_team='екипен хронометар', time_indiv='индивидуален хронометар', uphill='', rest='ден за одмор'}	
	l10nDef["nl"] = {plain = "vlakke rit", hilly="heuvelrit", inter='heuvelrit', mount='bergrit', time_prologue='proloog', time_team='ploegentijdrit', time_indiv='individuele tijdrit', uphill='klimtijdrit', rest='rustdag'}
	l10nDef["no"] = {plain = "flat etappe", hilly="kupert etappe", inter='middels klatreetappe', mount='klatreetappe', time_prologue='prolog', time_team='lagtempo', time_indiv='temporitt', uphill='klatretempoetappe', rest='hviledag'}
	l10nDef["pl"] = {plain = "płaski", hilly="", inter='pagórkowaty', mount='górski', time_prologue='prologu', time_team='jazda drużynowa na czas', time_indiv='jazda indywidualna na czas', uphill='', rest=''}
	l10nDef["ro"] = {plain = "etapă de plat", hilly="etapă valonată", inter='etapă intermediară', mount='etapă de munte', time_prologue='prolog', time_team='contratimp pe echipe', time_indiv='contratimp individual', uphill='', rest='zi de repaus'}
	l10nDef["ru"] = {plain = "равнинный", hilly="холмистый", inter='горный', mount='высокогорный', time_prologue='пролог', time_team='командная разделка', time_indiv='индивидуальная разделка', uphill='горная разделка', rest='день отдыха'}
	l10nDef["sv"] = {plain = "Flack etapp", hilly="", inter='Kuperat', mount='Bergsetapp', time_prologue='Prolog', time_team='Lagtempoetapp', time_indiv='Tempoetapp', uphill='', rest='Vilodag'}

	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then l10n=l10nDef["fr"]
	else l10n=l10nDef[string.sub(wiki,string.find(wiki,"%a+"))] end

 	if x=='plain stage' then return "[[File:Plainstage.svg|border|right|20px|"..l10n.plain.."]]" end
 	if x=='hilly stage' then return "[[File:Hillystage.svg|border|right|20px|"..l10n.hilly.."]]" end
  	if x=='intermediate stage' then return "[[File:Mediummountainstage.svg|right|border|20px|"..l10n.inter.."]]" end
  	if x=='mountain stage' then return "[[File:Mountainstage.svg|border|right|20px|"..l10n.mount.."]]" end
  	if x=='uphill time trial stage' then return "[[File:Mountainstage.svg|border|right|20px|"..l10n.uphill.."]]" end
   	if x=='rest day' then return "[[File:Stage rest day.svg|border|right|20px|"..l10n.rest.."]]" end
   	if x=='time trial stage' then 
   		if typ==2348250 then return "[[File:Time Trial.svg|right|20px|"..l10n.time_team.."]]" end
   		if typ==2266066 then return "[[File:Time Trial.svg|right|20px|"..l10n.time_indiv.."]]" end
   		if typ==485321  then return "[[File:Time Trial.svg|right|20px|"..l10n.time_prologue.."]]" end
    end	
end

function wdLink (id)
	return "[[File:Wikidata-logo S.svg|12px|link=d:" .. id .. "]]"
end

function flag (x, date)
	local year,m,d
	if date==nil then date = '+'..os.date('%Y-%m-%d') end 	
	local flag1 = { -- Q..a current flag, Q..b, Q..c older flag. date: "+2016", "+2016-01-30", ..
	Q29a={"[[File:Flag of Spain.svg|border|20px|ESP]]","+1982",""},
	Q29b={"[[File:Flag of Spain (1977 - 1981).svg|border|20px|ESP]]","+1977","+1981"},
	Q30= "[[File:Flag of the United States (Pantone).svg|border|20px|USA]]",
	Q31= "[[File:Flag of Belgium (civil).svg|border|20px|BEL]]",
	Q38a={"[[File:Flag of Italy.svg|border|20px|ITA]]","+1947",""},
	Q38b={"[[File:Flag of Italy (1861-1946) crowned.svg|border|20px|ITA]]","+1861","+1946"},
	Q39="[[File:Flag of Switzerland.svg|border|15px|SUI]]",
	Q55= "[[File:Flag of the Netherlands.svg|border|20px|NED]]",
	Q142="[[File:Flag of France.svg|border|20px|FRA]]",
	Q145="[[File:Flag of the United Kingdom.svg|border|20px|GBR]]",
	Q183a={"[[File:Flag of Germany.svg|border|20px|GER]]","+1949-05-23",""},
	Q183b={"[[File:Flag of German Reich (1935–1945).svg|border|20px|GER]]","+1935","+1945"},
	Q183c={"[[File:Flag of the NSDAP (1920–1945).svg|border|20px|GER]]","+1933","+1935"},
	Q183d={"[[File:Flag of Germany (3-2 aspect ratio).svg|border|20px|GER]]","+1919","+1933"},
	Q183e={"[[File:Flag of the German Empire.svg|border|20px|GER]]","+1866","+1918"},
	Q218a={"[[File:Flag of Romania.svg|border|20px|ROU]]","+1989-12-27",""},
	Q218b={"[[File:Flag of Romania (1965-1989).svg|border|20px|ROU]]","+1965","+1989-12-26"},
	Q218c={"[[File:Flag of Romania (1952-1965).svg|border|20px|ROU]]","+1952","+1965"},
	Q218d={"[[File:Flag of Romania (1948-1952).svg|border|20px|ROU]]","+1948","+1952"},
	Q218e={"[[File:Flag of Romania.svg|border|20px|ROU]]","+1867-07-01","+1948"},
	Q224a={"[[File:Flag of Croatia.svg|border|20px|CRO]]","+1990-12-21",""},
	Q224b={"[[File:Flag of Croatia (white chequy).svg|border|20px|CRO]]","+1990-06-27","+1990-12-21"}
	}

	if flag1[x..'a']~=nil and date>=flag1[x..'a'][2] and flag1[x..'a'][3]=='' then return flag1[x..'a'][1] end
	if flag1[x..'b']~=nil and date>=flag1[x..'b'][2] and date<=flag1[x..'b'][3] then return flag1[x..'b'][1] end
	if flag1[x..'c']~=nil and date>=flag1[x..'c'][2] and date<=flag1[x..'c'][3] then return flag1[x..'c'][1] end
	if flag1[x..'d']~=nil and date>=flag1[x..'d'][2] and date<=flag1[x..'d'][3] then return flag1[x..'d'][1] end
	if flag1[x..'e']~=nil and date>=flag1[x..'e'][2] and date<=flag1[x..'e'][3] then return flag1[x..'e'][1] end	
	if flag1[x]~=nil then return flag1[x] end	

	local flag2 = { Q16={'Q80110','CAN'}, Q17={'Q43175','JPN'}, Q20={'Q83149','NOR'}, Q27={'Q82205','IRL'}, Q35={'Q60149','DEN'}, Q36={'Q42436','POL'}, 
	Q37={'Q81477','LTU'}, Q39={'Q124020','SUI'}, Q77={'Q171103','URU'},  Q145={'Q83278','GBR'}, Q159={'Q16611','RUS'}, Q191={'Q81471','EST'}, Q211={'Q130449','LAT'},
	Q212={'Q127974','UKR'}, Q214={'Q160861','SVK'}, Q232={'Q131650','KAZ'}, Q262={'Q83392','DZA'}, Q408={'Q81676','AUS'}, Q739={'Q160425','COL'} }  	

	local xx
	if flag_table[x] ~= nil then return flag_table[x] end

	if flag2[x]~=nil then xx = x x = flag2[x] end -- transform x to new x 
	if type(x)=='table' and pcall(foo1,x[1]) then -- for transformed x
		local entity=mw.wikibase.getEntity(x[1])
		local a,b=pcall(fooA,'value',entity,'P18',1) -- P18 (image)
		if a==true then 
			flag_table[xx] = "[[File:"..b.."|border|20px|"..x[2].."]]" 		
			return "[[File:"..b.."|border|20px|"..x[2].."]]" 
		end 
	end
	if type(x)=='string' and pcall(foo1,x) then -- reading the flag data from untransformed items, e.g. Q29 
		local entity = mw.wikibase.getEntity( x ) 
		local flags = entity.claims["P41"]
		local possible_flag = {}
		local num = 1
		if pcall(fooA, 'numeric-id', entity, 'P41', 1) then
		local v
		for _, v in pairs(flags) do
			if v.qualifiers then
				if (not v.qualifiers["P580"] or v.qualifiers["P580"][1].datavalue.value.time <= date)
					and (not v.qualifiers["P582"] or v.qualifiers["P582"][1].datavalue.value.time >= date)
				then possible_flag[num]=v.mainsnak.datavalue.value num=num+1 end
			else possible_flag[num]=v.mainsnak.datavalue.value num=num+1 end
		end	
		local file="[[File:"..possible_flag[1].."|border|20px" 
		local a2,b2=pcall(fooA,'value',entity,'P984',1) -- P984 (country code by the International Olympic Committee)				
		if a2==true then file=file.."|"..b2.."]]" else file=file.."]]" end 
		flag_table[x] = file		
		return file
		end	
	end 
	return " "
end 

return p