Документация
--[[
------------------------------------------
--             AutoDescriptionHuman
-- Модуль для заполнения людей. 
------------------------------------------
--]]

local Dates = require("Module:Dates")
local Declension = require("Module:Declension")
local Langs = require("Module:Langs")
local MathTonumber = require("Module:Math/tonumber")
local ReturnGendered = require("Module:ReturnGendered")
local SerializeTable = require("Module:SerializeTable")
local Math = require("Module:Math")

local AutoDescriptionHuman={}

-- Нам необходимо сформировать и вернуть три переменных
local description = "" -- уточнение (то, что в скобочках после имени, например, на языке оригинала, годы жизни и т.п.)
local details = "" -- строка описания
local categories = "[[Категория:Люди по алфавиту]]" -- категории

-- Промежуточный масив сущностей, в который помещаются результаты парсинга перед формированием описания
local entitiesArray = {P21 = "", P27 = "", P39 = "", P69 = "", P101 = {}, P101Q ="", P108Q = "", 
 P136="", P166="", P184="", P185="", P463 = {}, P463Q = "", P509 = "", P512 = "", P551="", P569 = "", 
 P570 = "", P734 = "", P735 = "", P737Q = "", P800="", P802="", P937="", P1066="", P1196="", P1303="", P1344="", 
 P3373="", erdosNumber = "", male = "", female = "", langName="", nativeName="", 
 placeOfBirth="", countryOfBirth="", placeOfDeath="", countryOfDeath="", 
 occupations = "", dayB="", monthB="", yearB="", dayD="", monthD="", yearD="", 
 occupation={}, idOccupation={}, upOccupation={}, citizenship={}, employer={}, 
 influencedBy={}, edu={}, eduStart={}, eduEnd={}, docAdvisor={}, docStud={}, stu={}, 
 pup={}, moth="", father="", genre={}, instrument={}, residence={}, residenceEnd={}, 
 residenceSt={}, sibling={}, award={}, awardPIT={}, awardTW={}, awardPM={}, participantOf={}, 
 notableWork={}, workLocation={}, academicDegree={}, academicDegreeDate={}, academicDegreeF={}, 
 academicDegreeEdu={}, positionHeld={},positionHeldStart={},positionHeldEnd={},positionHeldPG={},
 positionHeldPT={},positionHeldReplace={},positionHeldReplaceBy={}}

-- Точка входа
function AutoDescriptionHuman.launch(entity)
 local successLaunchParsing, errCodeParsing, successLaunchForming, errCodeForming -- Признак успешного завершения и сообщения об ошибке парсинга и форминга соответственно
 successLaunchParsing, errCodeParsing = pcall(function() AutoDescriptionHuman.parsing(entity) end) -- Парсим карточку Викиданных, тестируя функцию парсинга на ошибки.
 if successLaunchParsing then successLaunchForming, errCodeForming = pcall(function() AutoDescriptionHuman.forming() end) end -- формируем переменные, тестируя функцию форминга на ошибки
 if not successLaunchParsing or not successLaunchForming then
  categories = categories .. "[[Категория:Страницы с ошибками в модуле]][[Категория:Страницы с ошибками в модуле AutoDescriptionHuman]]"
  if errCodeParsing then categories = categories .. "[[Категория:Страницы с ошибкой: " .. errCodeParsing .. "]]" end
  if errCodeForming then categories = categories .. "[[Категория:Страницы с ошибкой: " .. errCodeForming .. "]]" end
 end
 return details, description, categories
end	

-- Последовательно проходим свойства в карточке викиданных, для формирования массива сущностей entitiesArray
function AutoDescriptionHuman.parsing(entity)
	entitiesArray["P569"]=AutoDescriptionHuman.parseP569(entity)
	entitiesArray["P570"]=AutoDescriptionHuman.parseP570(entity)
	AutoDescriptionHuman.parseP19(entity)
	AutoDescriptionHuman.parseP20(entity)
	AutoDescriptionHuman.parseP21(entity)
	AutoDescriptionHuman.parseP22(entity)
	AutoDescriptionHuman.parseP25(entity)
	AutoDescriptionHuman.parseP27(entity)
	entitiesArray["P39"]=AutoDescriptionHuman.parseP39(entity)
	entitiesArray["P69"]=AutoDescriptionHuman.parseP69(entity)
	AutoDescriptionHuman.parseP101(entity)
	entitiesArray["P106"]=AutoDescriptionHuman.parseP106(entity)
	AutoDescriptionHuman.parseP108(entity)
	entitiesArray["P136"]=AutoDescriptionHuman.parseP136(entity)
	entitiesArray["P166"]=AutoDescriptionHuman.parseP166(entity)
	entitiesArray["P184"]=AutoDescriptionHuman.parseP184(entity)
	entitiesArray["P185"]=AutoDescriptionHuman.parseP185(entity)
	entitiesArray["P463Q"]=AutoDescriptionHuman.parseP463(entity)
	entitiesArray["P509"]=AutoDescriptionHuman.parseP509(entity)
	entitiesArray["P512"]=AutoDescriptionHuman.parseP512(entity)
	entitiesArray["P551"]=AutoDescriptionHuman.parseP551(entity)
	AutoDescriptionHuman.parseP734(entity)
	AutoDescriptionHuman.parseP735(entity)
	entitiesArray["P737Q"]=AutoDescriptionHuman.parseP737(entity)
	entitiesArray["P800"]=AutoDescriptionHuman.parseP800(entity)
	entitiesArray["P802"]=AutoDescriptionHuman.parseP802(entity)
	entitiesArray["P937"]=AutoDescriptionHuman.parseP937(entity)
	entitiesArray["P1066"]=AutoDescriptionHuman.parseP1066(entity)
	entitiesArray["P1196"]=AutoDescriptionHuman.parseP1196(entity)
	entitiesArray["P1303"]=AutoDescriptionHuman.parseP1303(entity)
	entitiesArray["P1344"]=AutoDescriptionHuman.parseP1344(entity)
	AutoDescriptionHuman.parseP1559(entity)
	entitiesArray["P2021"]=AutoDescriptionHuman.parseP2021(entity)
	entitiesArray["P3373"]=AutoDescriptionHuman.parseP3373(entity)
end

function AutoDescriptionHuman.forming()
 if(entitiesArray.langName ~= "" or entitiesArray["P569"] ~= "" or entitiesArray["P570"] ~= "") then	
   details = details .. "(" 
   if(entitiesArray.langName ~= "") then  details = details ..   Langs.launch(entitiesArray.langName, entitiesArray.nativeName) .. "; " end
   if(entitiesArray["P569"] ~= "" and entitiesArray["P570"] ~= "") then details = details .. "[[" .. entitiesArray["P569"] .. " года]]"	
   elseif (entitiesArray["P569"] ~= "") then details = details .. "род. [[" .. entitiesArray["P569"] .. " года]]"	
   end	
   if(entitiesArray["placeOfBirth"] ~= "") then  details = details .. ", [[" .. entitiesArray["placeOfBirth"] .. "]]" end 
   if(entitiesArray["countryOfBirth"] ~= "") then  details = details .. ", [[" .. entitiesArray["countryOfBirth"] .. "]]" end 
   if(entitiesArray["P569"] ~= "" and entitiesArray["P570"] ~= "") then details = details .. "  — [[" .. entitiesArray["P570"] .. " года]]" 	
   elseif (entitiesArray["P570"] ~= "") then details = details .. "ум. [[" .. entitiesArray["P570"] .. " года]]" 
   end
   if(entitiesArray["placeOfDeath"] ~= "") then  details = details .. ",  [[" .. entitiesArray["placeOfDeath"] .. "]]" end
   if(entitiesArray["countryOfDeath"] ~= "") then  details = details .. ", [[" .. entitiesArray["countryOfDeath"] .. "]]" end 
   details = details .. ")"
 end

 if (entitiesArray["P21"] == "мужской пол") then 
  categories = categories .. "[[Категория:Мужчины по алфавиту]]" 
 elseif (entitiesArray["P21"] == "женский пол") then
  categories = categories .. "[[Категория:Женщины по алфавиту]]"
 elseif (entitiesArray["P21"] == "транс-мужчина") then
  categories = categories .. "[[Категория:Транс-мужчины по алфавиту]]"
 elseif (entitiesArray["P21"] == "транс-женщина") then
  categories = categories .. "[[Категория:Транс-женщины по алфавиту]]"
 elseif (entitiesArray["P21"] == "интерсекс") then
  categories = categories .. "[[Категория:Интерсексуалы по алфавиту]]"
 elseif (entitiesArray["P21"] == "гендерфлюид") then
  categories = categories .. "[[Категория:Гендерфлюиды по алфавиту]]"
 elseif (entitiesArray["P21"] == "небинарный пол") then
  categories = categories .. "[[Категория:Небинарный пол по алфавиту]]"
 elseif (entitiesArray["P21"] == "") then
  categories = categories .. "[[Категория:Пол не установлен]]"
 else
  categories = categories .. "[[Категория:Пол не определён]]"
 end
 
 if(entitiesArray["P734"] == nil) then
  categories = categories .. "[[Категория:Фамилия не установлена (nil)]]"
 elseif(entitiesArray["P734"] == "") then
  categories = categories .. "[[Категория:Фамилия не установлена (empty)]]"
 else 
  categories = categories .. "[[Категория:"..entitiesArray["P734"].." (однофамильцы по алфавиту)]]"
 end
 
 if(entitiesArray["P735"] == nil) then
  categories = categories .. "[[Категория:Имя не установлено (nil)]]"
 elseif(entitiesArray["P735"] == "") then
  categories = categories .. "[[Категория:Имя не установлено (empty)]]"
 else 
  categories = categories .. "[[Категория:"..entitiesArray["P735"].." (тёзки по алфавиту)]]"
 end
 
 if (entitiesArray["occupation"][1] ~= "") then
 	for ki, vi in pairs (entitiesArray.occupation) do
     	if(ki=="1") then 
         if(entitiesArray["P21"] == "мужской пол") then 
          description = description .. vi .. " "
         elseif (ReturnGendered.launch(vi, entitiesArray["P21"], 2) ~= "") then 
          description = description .. ReturnGendered.launch(vi, entitiesArray["P21"], 2) .. " " 
         end
     	else
     		p=true
     		for i=1, (ki-1), 1 do
     			if (entitiesArray.occupation and entitiesArray.occupation[i] and string.find(vi, entitiesArray.occupation[i])) then 
     				p=false
     			end
     		end	
     		if(p~=false) then
     			if(entitiesArray["P21"] == "мужской пол") then description = description ..  "[[" ..  vi .. "]]" .. ", " 
     			else
     			 local rg = ReturnGendered.launch(vi, entitiesArray["P21"], 2)
     			 if (rg ~= nil and rg ~= "") then description = description ..  "[[" .. rg .. "]]" .. ", "  end  
     			end
     		end
     	end	
    end	
    description=description:sub(1, #description - 2)
    description = description .. ". " 
 end
 if (entitiesArray["P2021"] ~= "") then description = description .. "[[Число Эрдёша]]: " .. entitiesArray["P2021"] .. ". " end
 if (entitiesArray["P101"][1] ~= "" and string.find(entitiesArray.P101Q, "Q")) then
 	description = description .. " Занимался исследованиями в области: "
 	for ki, vi in pairs (entitiesArray.P101) do
     	if(Declension.declineWord(vi, 6) ~= "Logical error Declension.declineWord(arg): word not found") then description = description .. "[[" .. vi .. "|" .. Declension.declineWord(vi, 6) .. "]], "   
     	else description = description .. "[[" .. vi ..  "]], " end
    end	
    description=description:sub(1, #description - 2)
    description = description .. ". " 
 end	
 if(entitiesArray["P463Q"] ~= "") then
   description = description .. "<br>Членство в организациях: " -- ReturnGendered.launch("Участник", entitiesArray["P21"], 2) .. " организаций: "
   for ki, vi in pairs (entitiesArray.P463) do
  	description = description .. "[[" .. vi ..  "]], "
   end	
   description=description:sub(1, #description - 2)
   description = description .. ". "
 end	
 if(entitiesArray["P69"] == "edu") then 
 	local i=1
 	description = description .. "<br>Образование: "
 	for ki, vi in pairs (entitiesArray.edu) do
 		description = description .. "[[" .. vi ..  "]]"  
 		if(entitiesArray.eduStart[i] ~= "None") then description = description .. " с " .. "[[" .. entitiesArray.eduStart[i] .. " год]]а" end
 		if(entitiesArray.eduEnd[i] ~= "None") then description = description .. " по ".. "[[" .. entitiesArray.eduEnd[i] .. " год]]" end
 		i=i+1
 		description = description .. ", "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end
 if(entitiesArray["P512"] == "full") then
 	local len=0
 	for k, v in pairs (entitiesArray.academicDegree) do
 		len=len+1
 	end	
 	if (len>1) then  description = description .. "Учёные степени: "
 	else description = description .. "Учёная степень: " end
 	for k, v in pairs (entitiesArray.academicDegree) do
 		description = description .. v
 		if (entitiesArray.academicDegreeF[k] ~= "None" or entitiesArray.academicDegreeDate[k] ~= "None" or entitiesArray.academicDegreeEdu[k] ~= "None") then 
 			description = description .. " ("
 			if(entitiesArray.academicDegreeDate[k] ~= "None") then 
 				description = description .. "[[" .. entitiesArray.academicDegreeDate[k] .. " год]]"
 				if(entitiesArray.academicDegreeF[k] ~= "None") then description = description .. "; [[" .. entitiesArray.academicDegreeF[k] .. "]]"	end
 				if(entitiesArray.academicDegreeEdu[k] ~= "None") then description = description .. "; [[" .. entitiesArray.academicDegreeEdu[k] .. "]]"	end
 			elseif(entitiesArray.academicDegreeF[k] ~= "None") then 	
 				description = description .. "[[" .. entitiesArray.academicDegreeF[k] .. "]]"
 				if(entitiesArray.academicDegreeEdu[k] ~= "None") then description = description .. "; [[" .. entitiesArray.academicDegreeEdu[k] .. "]]"	end
 			elseif(entitiesArray.academicDegreeEdu[k] ~= "None") then description = description .. "[[" .. entitiesArray.academicDegreeEdu[k] .. "]]"	end
 			description = description .. ")"
 		end	
 		description = description .. ", "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 if (entitiesArray["employer"][1] ~= "" and string.find(entitiesArray.P108Q, "Q")) then
 	description = description .. "<br>Место работы: "
 	for ki, vi in pairs (entitiesArray.employer) do
 		description = description .. "[[" .. vi ..  "]], " 
    end	
    description=description:sub(1, #description - 2)
    description = description .. ". " 
 end
 if(entitiesArray["P737Q"] ~= "") then
   local rg = ReturnGendered.launch("Испытал", entitiesArray["P21"], 3)
   if (rg ~= nil and rg ~= "") then
   	description = description .. rg .. " влияние: " 
    for ki, vi in pairs (entitiesArray.influencedBy) do
  	 description = description .. "[[" .. vi ..  "]], "
    end	
    description=description:sub(1, #description - 2)
    description = description .. ". "
   end
 end	
 if(entitiesArray["P184"] == "full") then
 	description = description .. "Научный руководитель: "
 	for ki, vi in pairs (entitiesArray.docAdvisor) do
 		description = description .. "[[" .. vi ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end	
 if(entitiesArray["P185"] == "full") then
 	local len = 0
 	for ki, vi in pairs (entitiesArray.docStud) do
 		len=ki
 	end	
 	if(len>1) then  description = description .. "Аспиранты: "
    else description = description .. "Аспирант: " end
 	for ki, vi in pairs (entitiesArray.docStud) do
 		description = description .. "[[" .. vi ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end	
 if(entitiesArray["P802"] == "full") then
 	local len = 0
 	for ki, vi in pairs (entitiesArray.stu) do
 		len=ki
 	end	
 	if(len>1) then  description = description .. "Студенты: "
    else description = description .. "Студент: " end
 	for ki, vi in pairs (entitiesArray.stu) do
 		description = description .. "[[" .. vi ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end	
 if(entitiesArray["P1066"] == "full") then
 	description = description .. "Учитель: "
 	for ki, vi in pairs (entitiesArray.pup) do
 		description = description .. "[[" .. vi ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end	
 if(entitiesArray["moth"] ~= "") then 	description = description .. "<br>[[Мать]]: [[" .. entitiesArray["moth"] .. "]]. " end	
 if(entitiesArray["father"] ~= "") then 	description = description .. "[[Отец]]: [[" .. entitiesArray["father"] .. "]]. " end	
 if(entitiesArray["P136"] == "full") then
 	local len = 0
 	for ki, vi in pairs (entitiesArray.stu) do
 		len=len+1
 	end	
 	if(len>1) then  description = description .. "Жанры: "
    else description = description .. "Жанр: " end
 	for ki, vi in pairs (entitiesArray.genre) do
 		description = description .. "[[" .. vi ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end	
 if(entitiesArray["P1303"] == "full") then
 	local len = 0
 	for ki, vi in pairs (entitiesArray.instrument) do
 		len=len+1
 	end	
 	if(len>1) then  description = description .. "Музыкальные инструменты: "
    else description = description .. "Музыкальный инструмент: " end
 	for ki, vi in pairs (entitiesArray.instrument) do
 		description = description .. "[[" .. vi ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". "
 end	
 if(entitiesArray["P551"] == "full") then
 	local len = 0
 	for k, v in pairs (entitiesArray.residence) do
 		len=len+1
 	end	
 	if(len>1) then  description = description .. "<br>Места жительства: "
    else description = description .. "<br>Место жительства: " end
 	for k, v in pairs (entitiesArray.residence) do
 		description = description .. "[[" .. v ..  "]]"
 		if(entitiesArray.residenceSt[k] ~= "NoNe") then description = description .. " с " .. "[[" .. entitiesArray.residenceSt[k] .. " год]]а" end
 		if(entitiesArray.residenceEnd[k] ~= "NoNe") then description = description .. " по ".. "[[" .. entitiesArray.residenceEnd[k] .. " год]]" end
 		description = description .. ", "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 if(entitiesArray["P937"] == "full") then
 	local len = 0
 	for k, v in pairs (entitiesArray.workLocation) do
 		len=len+1
 	end	
 	if(len>1) then  description = description .. "<br>Места активности: "
    else description = description .. "<br>Место активности: " end
 	for k, v in pairs (entitiesArray.workLocation) do
 		description = description .. "[[" .. v ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 if(entitiesArray["P3373"] == "full") then
 	local len = 0
 	for k, v in pairs (entitiesArray.sibling) do
 		len=len+1
 	end	
 	if(len>1) then  description = description .. "Сиблинги: "
    else description = description .. "Сиблинг: " end
 	for k, v in pairs (entitiesArray.sibling) do
 		description = description .. "[[" .. v ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 if(entitiesArray["P1344"] == "full") then
 	description = description .. "Участие в: "
 	for k, v in pairs (entitiesArray.participantOf) do
 		description = description .. "[[" .. v ..  "]], "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 if(entitiesArray["P166"] == "full") then
 	description = description .. "<br>Награды и премии: "
 	for k, v in pairs (entitiesArray.award) do
 		description = description .. "[[" .. v ..  "]]"
 		if(entitiesArray.awardPIT[k]~="") then description = description .. " ([[" .. entitiesArray.awardPIT[k] .. " год]]" end
 		if(entitiesArray.awardTW[k]~="") then description = description .. "; совместно с:" .. entitiesArray.awardTW[k] end
 		if(entitiesArray.awardPM[k]~="") then description = description .. "; призовой фонд: " .. entitiesArray.awardPM[k] end
 		if(entitiesArray.awardPIT[k]~="") then description = description .. ")" end
 		description = description .. ", "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end		
 if(entitiesArray["P800"] == "full") then
 	description = description .. "<br>Выдающиеся работы: "  
 	for k, v in pairs (entitiesArray.notableWork) do
 		description = description .. "«[[" .. v ..  "]]», "
 	end	
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 if (entitiesArray["P39"] == "full") then
 	local len=0
 	for k, v in pairs (entitiesArray.positionHeld) do
 		len=len+1
 	end	
 	if (len>1) then  description = description .. "<br>Занимаемые должности: "
 	else description = description .. "<br>Занимаемая должность: " end	
    for k, v in pairs (entitiesArray.positionHeld) do
    	description = description .. v 
    	if(entitiesArray.positionHeldStart[k] ~= "None") then description = description .. " с [[" .. entitiesArray.positionHeldStart[k] .. " год]]а" end
    	if(entitiesArray.positionHeldEnd[k] ~= "None") then description = description .. " по [[" .. entitiesArray.positionHeldEnd[k] .. " год]]" end
    	if(entitiesArray.positionHeldPG[k] ~= "None" and entitiesArray.positionHeldPG[k] ~= nil) then description = description .. ": «[[" .. entitiesArray.positionHeldPG[k] .. "]]»" end
    	if(entitiesArray.positionHeldReplace[k] ~= "None") then description = description .. " после [[" .. entitiesArray.positionHeldReplace[k] .. "]]" end
    	if(entitiesArray.positionHeldReplaceBy[k] ~= "None") then description = description .. " перед [[" .. entitiesArray.positionHeldReplaceBy[k] .. "]]" end
    	description = description .. "; " 
    end
    description=description:sub(1, #description - 2)
    description=description..". " 
 end	
 
 if(entitiesArray["P27"] ~= "") then
 	for ki, vi in pairs (entitiesArray.citizenship) do
 		categories = categories .. "[[Категория:Люди:" .. vi .. "]]"
 	end	
 end	
 if(entitiesArray["P569"] ~= "") then 
 	if(entitiesArray["dayB"] ~= nil and (string.find(entitiesArray["monthB"], "значение неизвестно") == nil) and entitiesArray["dayB"] ~= "" and entitiesArray["monthB"] ~= "") then categories = categories .. " [[Категория:Родившиеся " .. entitiesArray["P569"] .. " года]]"
 	elseif (entitiesArray["monthB"] ~= "") then categories = categories .. " [[Категория:Родившиеся в " .. Declension.declineWord(entitiesArray.monthB, 6) .. " " .. entitiesArray.yearB .. " года]]" end
 end
 if(entitiesArray["placeOfBirth"] ~= "") then 
 	if (Declension.declineWord(entitiesArray["placeOfBirth"], 6) == "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:Города без склонения]]" .. "[[Категория:Место рождения: " .. entitiesArray["placeOfBirth"] .. "]]"
 	else categories = categories .. " [[Категория:Родившиеся в " .. Declension.declineWord(entitiesArray["placeOfBirth"], 6).. "]]" end
 end 
 if(entitiesArray["countryOfBirth"] ~= "") then 
 	if (Declension.declineWord(entitiesArray["countryOfBirth"], 6) == "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:Страны без склонения]]".. "[[Категория:Место рождения: " .. entitiesArray["countryOfBirth"] .. "]]"
 	elseif (entitiesArray["countryOfBirth"] == "Франция") then categories = categories .. " [[Категория:Родившиеся во " .. Declension.declineWord(entitiesArray["countryOfBirth"], 6).. "]]"
 	else categories = categories .. " [[Категория:Родившиеся в " .. Declension.declineWord(entitiesArray["countryOfBirth"], 6).. "]]" 
 	end
 end 
 if(entitiesArray["dayB"] ~= "" and entitiesArray["dayB"] ~= nil and string.find(entitiesArray["monthB"], "значение неизвестно") == nil) then categories = categories .. " [[Категория:Родившиеся " .. entitiesArray["dayB"] .. " " .. entitiesArray["monthB"] .. "]]" end 
 if(entitiesArray["yearB"] ~= "" and entitiesArray["yearB"] ~= nil) then categories = categories .. " [[Категория:Родившиеся в " .. entitiesArray["yearB"] .. " году]]" end 
 if(entitiesArray["P570"] ~= "") then categories = categories .. " [[Категория:Умершие " .. entitiesArray["P570"] .. " года]]" end
 if(entitiesArray["placeOfDeath"] ~= "") then 
 	if (Declension.declineWord(entitiesArray["placeOfDeath"], 6) == "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:Города без склонения]]" .. "[[Категория:Место смерти: " .. entitiesArray["placeOfDeath"] .. "]]"
 	else categories = categories .. " [[Категория:Умершие в " .. Declension.declineWord(entitiesArray["placeOfDeath"], 6).. "]]" end
 end 
 if(entitiesArray["countryOfDeath"] ~= "") then 
 	if (Declension.declineWord(entitiesArray["countryOfDeath"], 6) == "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:Страны без склонения]]" .. "[[Категория:Место смерти: " .. entitiesArray["countryOfDeath"] .. "]]"
	elseif (entitiesArray["countryOfDeath"] == "Франция") then categories = categories .. " [[Категория:Умершие во " .. Declension.declineWord(entitiesArray["countryOfDeath"], 6).. "]]"
	else categories = categories .. " [[Категория:Умершие в " .. Declension.declineWord(entitiesArray["countryOfDeath"], 6).. "]]" end
 end 
 if(entitiesArray["dayD"] ~= "" and entitiesArray["dayD"] ~= nil) then categories = categories .. " [[Категория:Умершие " .. entitiesArray["dayD"] .. " " .. entitiesArray["monthD"] .. "]]" end 
 if(entitiesArray["yearD"] ~= "" and entitiesArray["yearD"] ~= nil) then categories = categories .. " [[Категория:Умершие в " .. entitiesArray["yearD"] .. " году]]" end 
 if (entitiesArray["occupation"][1] ~= "") then 
 	local p=false
 	local q=false
 	for ki, vi in pairs (entitiesArray.occupation) do
 	 if(entitiesArray["P21"] ~= "мужской пол" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) ~= "Logical error Declension.declineWord(arg): word not found") then
 	  categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " по алфавиту]]"  	
 	 elseif(Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then
 	  categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " по алфавиту]]" 
 	 else
 	   p=true 
 	   categories = categories .. "[[Категория:Род занятий: " .. vi .. " ]]"
 	 end
 		
 	    if (Declension.declineWord(entitiesArray["countryOfBirth"], 6) == "Logical error Declension.declineWord(arg): word not found") then q=true
 	    elseif (Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then 
 	    	if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. " [[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Declension.declineWord(entitiesArray["countryOfBirth"], 2).. "]]" 
 	    	else categories = categories .. " [[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Declension.declineWord(entitiesArray["countryOfBirth"], 2).. "]]" end
 	    end
 	    if(entitiesArray.yearB ~= "" and Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then 
 	    	if(vi ~= "блогер" and vi ~= "Блогер") then
 	    		local yC=entitiesArray.yearB
 	    		if (#yC==4) then
      	    		if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Math.roman((yC:match('%d%d') + "1")) .. " века]]"
 	        		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman((yC:match('%d%d') + "1")) .. " века]]" end 
 	        	elseif (#yC==3) then
      	    		if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Math.roman((yC:match('%d') + "1")) .. " века]]"
 	        		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman((yC:match('%d') + "1")) .. " века]]" end
 	        	else	
      	    		if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Math.roman(("1")) .. " века]]"
 	        		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman(("1")) .. " века]]" end
 	        	end	
 	    	end
 	    end
 	    if(entitiesArray.yearD ~= "" and Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then 
 	    	if(vi ~= "блогер" and vi ~= "Блогер") then
 	    		local yC=entitiesArray.yearD
 	    		if (#yC==4) then
      	    		if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Math.roman((yC:match('%d%d') + "1")) .. " века]]"
 	        		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman((yC:match('%d%d') + "1")) .. " века]]" end 
 	        	elseif (#yC==3) then
      	    		if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Math.roman((yC:match('%d') + "1")) .. " века]]"
 	        		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman((yC:match('%d') + "1")) .. " века]]" end
 	        	else	
      	    		if(entitiesArray["P21"] ~= "мужской пол" and ReturnGendered.launch(vi, entitiesArray["P21"], 2)~="" and Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7)~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(ReturnGendered.launch(vi, entitiesArray["P21"], 2), 7) .. " " .. Math.roman(("1")) .. " века]]"
 	        		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman(("1")) .. " века]]" end
 	        	end	
 	    	end
 	    end  
 	end	
 	if (p == true) then categories = categories .. "[[Категория:Профессии без склонения]]" end
 	if (q == true) then categories = categories .. "[[Категория:Страны без склонения]]" end
 end	
 if(entitiesArray["upOccupation"][1] ~= "") then
   local p=false
   local q=false
   for ki, vi in pairs (entitiesArray.upOccupation) do
     if (vi ~= "bin") then 
 		if(Declension.declineWord(vi, 7) == "Logical error Declension.declineWord(arg): word not found") then 
 			p=true 
 			categories = categories .. "[[Категория:Род занятий: " .. vi .. " ]]"  
 		else categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " по алфавиту]]" end
 	    if (Declension.declineWord(entitiesArray["countryOfBirth"], 6) == "Logical error Declension.declineWord(arg): word not found") then q=true
 	    elseif (Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. " [[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Declension.declineWord(entitiesArray["countryOfBirth"], 2).. "]]" end
 	    if(entitiesArray.yearB ~= "" and Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman((entitiesArray.yearB:match('%d%d') + "1")) .. " века]]" end
 	    if(entitiesArray.yearD ~= "" and Declension.declineWord(vi, 7) ~= "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:" .. Declension.declineWord(vi, 7) .. " " .. Math.roman((entitiesArray.yearD:match('%d%d') + "1")) .. " века]]" end 
     end
   end
   if (p == true) then categories = categories .. "[[Категория:Профессии без склонения]]" end
   if (q == true) then categories = categories .. "[[Категория:Страны без склонения]]" end
 end
 if(entitiesArray["P463Q"] ~= "") then
   local p=false
   for ki, vi in pairs (entitiesArray.P463) do
   	if(Declension.declineWord(vi, 2) == "Logical error Declension.declineWord(arg): word not found") then 
   		p=true  
   		categories = categories .. "[[Категория:" .. vi .. " (участники)]]"
   	else categories = categories .. "[[Категория: Участники " .. Declension.declineWord(vi, 2) .. "]]" end
   end
   if (p == true) then categories = categories .. "[[Категория:Организации без склонения]]" end
 end	
 if(entitiesArray["P69"] == "edu") then
   local p=false
   for ki, vi in pairs (entitiesArray.edu) do
   	if(Declension.declineWord(vi, 2) == "Logical error Declension.declineWord(arg): word not found") then 
   		p=true  
   		categories = categories .. "[[Категория:" .. vi .. " (выпускники)]]"
   	else categories = categories .. "[[Категория: Выпускники " .. Declension.declineWord(vi, 2) .. "]]" end
   end
   if (p == true) then categories = categories .. "[[Категория:Образовательные учреждения без склонения]]" end
 end
 if(entitiesArray["P551"] == "full") then
   local p=false
   for ki, vi in pairs (entitiesArray.residence) do
   	if(Declension.declineWord(vi, 2) == "Logical error Declension.declineWord(arg): word not found") then 
   		p=true  
   		categories = categories .. "[[Категория:Место жительства: " .. vi .. " ]]"
   	else categories = categories .. "[[Категория: Жители " .. Declension.declineWord(vi, 2) .. "]]" end
   end
   if (p == true) then categories = categories .. "[[Категория:Города без склонения]]" end
 end
 if(entitiesArray["P166"] == "full") then
   local p=false
   for ki, vi in pairs (entitiesArray.award) do
   	if(Declension.declineWord(vi, 2) == "Logical error Declension.declineWord(arg): word not found") then 
   		p=true  
   		categories = categories .. "[[Категория:" .. vi .. " (лауреаты)]]"
   	else categories = categories .. "[[Категория: Лауреаты " .. Declension.declineWord(vi, 2) .. "]]" end
   end
   if (p == true) then categories = categories .. "[[Категория:Награды без склонения]]" end
 end
 if(entitiesArray["P1344"] == "full") then
   local p=false
   for ki, vi in pairs (entitiesArray.participantOf) do
   	if(Declension.declineWord(vi, 2) == "Logical error Declension.declineWord(arg): word not found") then 
   		p=true  
   		categories = categories .. "[[Категория:" .. vi .. " (участники)]]"
   	else categories = categories .. "[[Категория: Участники " .. Declension.declineWord(vi, 2) .. "]]" end
   end
   if (p == true) then categories = categories .. "[[Категория:Мероприятия без склонения]]" end
 end
end 

function AutoDescriptionHuman.parseP19(entity)
 	local values=entity:formatPropertyValues("P19",mw.wikibase.entity.claimRanks).value
 	if(values ~= "") then entitiesArray["placeOfBirth"]=values end
 	local q
 	local p19Statements=mw.wikibase.getBestStatements(entity:getId(), 'P19' )
	for ki, vi in pairs (p19Statements) do
		q = vi['mainsnak']['datavalue']['value']['id']
	end
	if q== nil then 
		for ki, vi in pairs (p19Statements) do
		  q = vi['references']['mainsnak']['datavalue']['value']['id']
	    end
	end
 	if(q ~= nil) then local p17Statements=mw.wikibase.getBestStatements(q, 'P17' ) 
 	local i=1	
 	local country=""
 	local year=MathTonumber.integerModule(entitiesArray["yearB"])
	for ki, vi in pairs (p17Statements) do
 	    local start=""
 	    local enD=""
		if (i == 1) then country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
        else
        	if(vi['qualifiers'] ~= nil) then
        		if((vi['qualifiers']['P582'] ~= nil)) then enD=MathTonumber.integerModule(vi['qualifiers']['P582'][1]['datavalue']['value']['time']) end
        		if((vi['qualifiers']['P580'] ~= nil)) then start=MathTonumber.integerModule(vi['qualifiers']['P580'][1]['datavalue']['value']['time']) end
        	else country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) end
        	if(enD ~= "" and (enD-year)>0) then 
        		if(start ~= "") then
        			if(year-start > 0) then country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) end
        		else country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) end	
            end
        end
		i=i+1
	end	
	entitiesArray["countryOfBirth"] = entitiesArray["countryOfBirth"] .. country
	end
	local p19Statements=entity:getAllStatements("P19")
	for ki, vi in pairs (p19Statements) do
		if(vi['qualifiers'] ~= nil and vi['qualifiers']['P17'] ~= nil) then entitiesArray["countryOfBirth"] = mw.wikibase.getLabel(vi['qualifiers']['P17'][1]['datavalue']['value']['id']) end
	end	
end  

function AutoDescriptionHuman.parseP20(entity)
 	local values=entity:formatPropertyValues("P20",mw.wikibase.entity.claimRanks).value
 	if(values ~= "") then entitiesArray["placeOfDeath"]=values end
 	local q
 	local p20Statements=mw.wikibase.getBestStatements(entity:getId(), 'P20' )
	for ki, vi in pairs (p20Statements) do
		if(vi['mainsnak'] ~= nil and vi['mainsnak']['datavalue'] ~= nil) then 
			q = vi['mainsnak']['datavalue']['value']['id']
		end
	end
	if q== nil then 
		for ki, vi in pairs (p20Statements) do
		  q = vi['references']['mainsnak']['datavalue']['value']['id']
	    end
	end
    if(q ~= nil) then local p17Statements=mw.wikibase.getBestStatements(q, 'P17' )
 	local i=1	
 	local country=""
 	local year=MathTonumber.integerModule(entitiesArray["yearD"])
	for ki, vi in pairs (p17Statements) do
 	    local start=""
 	    local enD=""
		if (i == 1) then country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
        else
        	if(vi['qualifiers'] ~= nil) then
        		if((vi['qualifiers']['P582'] ~= nil)) then enD=MathTonumber.integerModule(vi['qualifiers']['P582'][1]['datavalue']['value']['time']) end
        		if((vi['qualifiers']['P580'] ~= nil)) then start=MathTonumber.integerModule(vi['qualifiers']['P580'][1]['datavalue']['value']['time']) end
        	else country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) end
        	if(enD ~= "" and (year-enD)<0) then 
        		if(start ~= "") then
        			if(year-start > 0) then country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) end
        		else country=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) end	
            end
        end
		i=i+1
	end	
	entitiesArray["countryOfDeath"] = country
	end
	local p20Statements=entity:getAllStatements("P20")
	for ki, vi in pairs (p20Statements) do
		if(vi['qualifiers'] ~= nil and vi['qualifiers']['P17']  ~= nil) then entitiesArray["countryOfDeath"] = mw.wikibase.getLabel(vi['qualifiers']['P17'][1]['datavalue']['value']['id']) end
	end	
end  

function AutoDescriptionHuman.parseP21(entity)
 	local values=entity:formatPropertyValues("P21",mw.wikibase.entity.claimRanks).value
 	entitiesArray["P21"]=values
 	if (values == "мужской пол") then male="1"
 	elseif (values == "женский пол") then female="1" end
end  

function AutoDescriptionHuman.parseP22(entity)
 	local values=entity:formatPropertyValues("P22",mw.wikibase.entity.claimRanks).value
 	if(values ~= nil) then entitiesArray["father"]=values
 	else entitiesArray["father"]="" end
end  

function AutoDescriptionHuman.parseP25(entity)
 	local values=entity:formatPropertyValues("P25",mw.wikibase.entity.claimRanks).value
 	if(values ~= nil) then entitiesArray["moth"]=values
 	else entitiesArray["moth"]="" end
end  

function AutoDescriptionHuman.parseP27(entity)
 	local values=entity:formatPropertyValues("P27",mw.wikibase.entity.claimRanks).value
 	entitiesArray["P27"]=values
 	if(values ~= nil) then
 		local p27Statements=entity:getAllStatements("P27")
 		local i=1
 		for ki, vi in pairs (p27Statements) do
 			if(vi['mainsnak']['datavalue'] ~= nil and vi['mainsnak']['datavalue']['value'] ~= nil and vi['mainsnak']['datavalue']['value']['id'] ~= nil) then 
 			 entitiesArray["citizenship"][i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
 			 i=i+1
 			end
 		end	
 	end	
end  

function AutoDescriptionHuman.parseP39(entity)
	local p39Statements=entity:getAllStatements("P39")
 	local value=""
 	for k, v in pairs (p39Statements) do
 		entitiesArray.positionHeld[k]=mw.wikibase.getLabel(v['mainsnak']['datavalue']['value']['id']) 
 		entitiesArray.positionHeldStart[k]="None"
 		entitiesArray.positionHeldEnd[k]="None"
 		entitiesArray.positionHeldPG[k]="None"
 		entitiesArray.positionHeldPT[k]="None"
 		entitiesArray.positionHeldReplace[k]="None"
 		entitiesArray.positionHeldReplaceBy[k]="None"
    	if(v['qualifiers'] ~= nil) then
    		if(v['qualifiers'] ~= nil and v['qualifiers']['P580'] ~= nil 
    		   and v['qualifiers']['P580'][1] ~= nil and v['qualifiers']['P580'][1]['datavalue'] ~= nil 
    		   and v['qualifiers']['P580'][1]['datavalue']['value']['time'] ~= nil) 
    		then entitiesArray.positionHeldStart[k]=MathTonumber.integerModule(v['qualifiers']['P580'][1]['datavalue']['value']['time']) 
    		else entitiesArray.positionHeldStart[k]="None" end
    	    if(v['qualifiers'] ~= nil
    	       and v['qualifiers']['P582'] ~= nil
    	       and v['qualifiers']['P582'][1] ~= nil
    	       and v['qualifiers']['P582'][1]['datavalue'] ~= nil
    	       and v['qualifiers']['P582'][1]['datavalue']['value'] ~= nil
    	       and v['qualifiers']['P582'][1]['datavalue']['value']['time'] ~= nil
    	       and v['qualifiers']['P582'][1]['snaktype'] ~= nil -- Что это и следующая строка и зачем в этом запросе?
    	       and v['qualifiers']['P582'][1]['snaktype'] ~= "novalue") 
    	     then entitiesArray.positionHeldEnd[k]=MathTonumber.integerModule(v['qualifiers']['P582'][1]['datavalue']['value']['time'])
    		 else entitiesArray.positionHeldEnd[k]="None" end
    	    if(v['qualifiers']['P4100'] ~= nil and v['qualifiers']['P4100'][1] ~= nil and v['qualifiers']['P4100'][1]['datavalue'] ~= nil and v['qualifiers']['P4100'][1]['datavalue']['value']['id']~=nil and v['qualifiers']['P4100'][1]['datavalue']['value']['id']~="") 
    	     then entitiesArray.positionHeldPG[k]=mw.wikibase.getLabel(v['qualifiers']['P4100'][1]['datavalue']['value']['id'])
    		 else entitiesArray.positionHeldPG[k]="None" end
    	    if(v['qualifiers']['P2937'] ~= nil) 
    	     then entitiesArray.positionHeldPT[k]=mw.wikibase.getLabel(v['qualifiers']['P2937'][1]['datavalue']['value']['id'])
    		 else entitiesArray.positionHeldPG[k]="None" end
    	    if(v['qualifiers']['P1365'] ~= nil and v['qualifiers']['P1365'][1] ~= nil and v['qualifiers']['P1365'][1]['datavalue'] ~= nil and v['qualifiers']['P1365'][1]['datavalue']['value'] ~= nil) 
    	     then entitiesArray.positionHeldReplace[k]=mw.wikibase.getLabel(v['qualifiers']['P1365'][1]['datavalue']['value']['id'])
    		 else entitiesArray.positionHeldReplace[k]="None" end
    	    if(v['qualifiers']['P1366'] ~= nil and v['qualifiers']['P1366'][1] ~= nil and v['qualifiers']['P1366'][1]['datavalue'] ~= nil and v['qualifiers']['P1366'][1]['datavalue']['value'] ~= nil) 
    	     then entitiesArray.positionHeldReplaceBy[k]=mw.wikibase.getLabel(v['qualifiers']['P1366'][1]['datavalue']['value']['id'])
    		 else entitiesArray.positionHeldReplaceBy[k]="None" end
    	end	
    	value=v['mainsnak']['datavalue']['value']['id']
 	end	
    if(string.find(value, "Q")) then return "full" 
    else return "" end
end  

function AutoDescriptionHuman.parseP69(entity)
	local p69Statements=entity:getAllStatements("P69")
 	local i=1
 	local value=""
    for ki, vi in pairs (p69Statements) do
    	if(vi['mainsnak'] ~= nil and vi['mainsnak']['datavalue']  ~= nil and vi['mainsnak']['datavalue']['value']  ~= nil and vi['mainsnak']['datavalue']['value']['id']  ~= nil) then
    	 entitiesArray.edu[i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
 	    end	
    	if(vi['qualifiers'] ~= nil) then
    		if(vi['qualifiers']['P580'] ~= nil and vi['qualifiers']['P580'][1] ~= nil and vi['qualifiers']['P580'][1]['datavalue'] ~= nil 
    		   and vi['qualifiers']['P580'][1]['datavalue']['value'] ~= nil and vi['qualifiers']['P580'][1]['datavalue']['value']['time'] ~= nil) 
    		then 
    		 entitiesArray.eduStart[i]=MathTonumber.integerModule(vi['qualifiers']['P580'][1]['datavalue']['value']['time'])
    		else entitiesArray.eduStart[i]="None" end
    		if(vi['qualifiers']['P582'] ~= nil and vi['qualifiers']['P582'][1] ~= nil and vi['qualifiers']['P582'][1]['datavalue'] ~= nil
    		   and vi['qualifiers']['P582'][1]['datavalue']['value'] ~= nil and vi['qualifiers']['P582'][1]['datavalue']['value']['time'] ~= nil) 
    		then 
    		  entitiesArray.eduEnd[i]=MathTonumber.integerModule(vi['qualifiers']['P582'][1]['datavalue']['value']['time'])
    		else entitiesArray.eduEnd[i]="None" end
    	else entitiesArray.eduStart[i]="None" entitiesArray.eduEnd[i]="None" end 
    	i=i+1
    	if(vi['mainsnak'] ~= nil and vi['mainsnak']['datavalue']  ~= nil and vi['mainsnak']['datavalue']['value']  ~= nil and vi['mainsnak']['datavalue']['value']['id']  ~= nil) then
    	 value=vi['mainsnak']['datavalue']['value']['id'] 
 	    end	
    end
    if(string.find(value, "Q")) then return "edu"
    else return "" end
end  

function AutoDescriptionHuman.parseP101(entity)
 	local p101Statements=entity:getAllStatements("P101")
 	local i=1
    for ki, vi in pairs (p101Statements) do
    	entitiesArray.P101[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
    	entitiesArray.P101Q=vi['mainsnak']['datavalue']['value']['id']
    	i=i+1
    end
end  

function AutoDescriptionHuman.parseP106(entity)
 local p106Statements = entity:getAllStatements("P106")
 local i=1
 for ki, vi in pairs (p106Statements) do
   entitiesArray.occupation[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   entitiesArray.idOccupation[i]= vi['mainsnak']['datavalue']['value']['id'] 
   i=i+1
 end
 i=1
 for ki, vi in pairs (entitiesArray.occupation) do
   local j=1
   local p279Statements=mw.wikibase.getBestStatements(entitiesArray.idOccupation[i], 'P279' )
	for kj, vj in pairs (p279Statements) do
		entitiesArray["upOccupation"][i] = mw.wikibase.getLabel(vj['mainsnak']['datavalue']['value']['id']) 
		for kz, vz in pairs (entitiesArray.occupation) do
			if(vz==entitiesArray["upOccupation"][i]) then entitiesArray["upOccupation"][i]="bin" end
		end	
	end	
	if (entitiesArray["upOccupation"][i] == "род занятий" or entitiesArray["upOccupation"][i] == "личность") then entitiesArray["upOccupation"][i]="bin" end
	if (entitiesArray["upOccupation"][i] == "игрок") then entitiesArray["upOccupation"][i]="спортсмен" end 
   i=i+1
 end	
end  

function AutoDescriptionHuman.parseP108(entity)
 local p108Statements = entity:getAllStatements("P108")
 local i=1
 for ki, vi in pairs (p108Statements) do
   entitiesArray.employer[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   entitiesArray.P108Q=vi['mainsnak']['datavalue']['value']['id']
   i=i+1
 end
end  

function AutoDescriptionHuman.parseP136(entity)
 local p136Statements = entity:getAllStatements("P136")
 local i=1
 local value=""
 for ki, vi in pairs (p136Statements) do
   entitiesArray.genre[i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   value=vi['mainsnak']['datavalue']['value']['id']
   i=i+1
 end
 if(string.find(value, "Q")) then return "full"
 else return "" end
end  

function AutoDescriptionHuman.parseP166(entity)
 local p166Statements = entity:getAllStatements("P166")
 local value=""
 for k, v in pairs (p166Statements) do
 	entitiesArray.award[k]=mw.wikibase.getLabel(v['mainsnak']['datavalue']['value']['id']) 
    value=v['mainsnak']['datavalue']['value']['id']
    entitiesArray.awardPIT[k]=""
    entitiesArray.awardTW[k]=""
    entitiesArray.awardPM[k]=""
    if(v['qualifiers'] ~= nil) then
    	if(v['qualifiers']['P1706'] ~= nil) then
    		local p1706Statements = v['qualifiers']['P1706']
    		for ki, vi in pairs (p1706Statements) do
    			entitiesArray.awardTW[k]=entitiesArray.awardTW[k] .. " [[" .. mw.wikibase.getLabel(vi['datavalue']['value']['id']) .. "]]" 
    		end	
    	end	
    	if(v['qualifiers']['P585'] ~= nil and v['qualifiers']['P585'][1] ~= nil
           and v['qualifiers']['P585'][1]['datavalue'] ~= nil and v['qualifiers']['P585'][1]['datavalue']['value'] ~= nil
           and v['qualifiers']['P585'][1]['datavalue']['value']['time'] ~= nil) then 
         entitiesArray.awardPIT[k] = MathTonumber.integerModule(v['qualifiers']['P585'][1]['datavalue']['value']['time']) 
        end	
    	if(v['qualifiers']['P2121'] ~= nil and v['qualifiers']['P2121'][1] ~= nil
           and v['qualifiers']['P2121'][1]['datavalue'] ~= nil and v['qualifiers']['P2121'][1]['datavalue']['value'] ~= nil
           and v['qualifiers']['P2121'][1]['datavalue']['value']['amount'] ~= nil) then 
         entitiesArray.awardPM[k] = MathTonumber.integerModule(v['qualifiers']['P2121'][1]['datavalue']['value']['amount']) 
        end
    end	
 end
 if(string.find(value, "Q")) then return "full"
 else return "" end
end  

function AutoDescriptionHuman.parseP184(entity)
 local p184Statements = entity:getAllStatements("P184")
 local i=1
 local value=""
 for ki, vi in pairs (p184Statements) do
   entitiesArray.docAdvisor[i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   value=vi['mainsnak']['datavalue']['value']['id']
   i=i+1
 end
 if(string.find(value, "Q")) then return "full"
 else return "" end
end  

function AutoDescriptionHuman.parseP185(entity)
 local p185Statements = entity:getAllStatements("P185")
 local i=1
 local value=""
 for ki, vi in pairs (p185Statements) do
   entitiesArray.docStud[i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   value=vi['mainsnak']['datavalue']['value']['id']
   i=i+1
 end
 if(string.find(value, "Q")) then return "full"
 else return "" end
end 

function AutoDescriptionHuman.parseP463(entity)
  local p463Statements = entity:getAllStatements("P463")
  local i=1
  for ki, vi in pairs (p463Statements) do
  	entitiesArray.P463[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
  	entitiesArray.P463Q=vi['mainsnak']['datavalue']['value']['id'] 
  	i=i+1
  end	
  if(string.find(entitiesArray.P463Q, "Q")) then return entitiesArray.P463Q 
  else return "" end
end  

function AutoDescriptionHuman.parseP509(entity)
 local value = entity:formatPropertyValues("P509",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end  

function AutoDescriptionHuman.parseP512(entity)
  local p512Statements = entity:getAllStatements("P512")
  local value = ""
  local i=1
  for k, v in pairs (p512Statements) do
  	entitiesArray.academicDegree[i]=mw.wikibase.getLabel(v['mainsnak']['datavalue']['value']['id'])
  	entitiesArray.academicDegreeDate[i]="None"
  	entitiesArray.academicDegreeF[i]="None"
  	entitiesArray.academicDegreeEdu[i]="None"
  	if(v['qualifiers'] ~= nil) then
  		if(v['qualifiers']['P101'] ~= nil) then entitiesArray.academicDegreeF[k]=mw.wikibase.getLabel(v['qualifiers']['P101'][1]['datavalue']['value']['id'])
  		else entitiesArray.academicDegreeF[k]="None" end
  		if(v['qualifiers']['P69'] ~= nil) then entitiesArray.academicDegreeEdu[k]=mw.wikibase.getLabel(v['qualifiers']['P69'][1]['datavalue']['value']['id'])
  		else entitiesArray.academicDegreeEdu[k]="None" end
  		if(v['qualifiers']['P813'] ~= nil) then entitiesArray.academicDegreeDate[k]=v['qualifiers']['P813'][1]['datavalue']['value']['time']
  		else entitiesArray.academicDegreeDate[k]="None" end
  		if(v['qualifiers']['P585'] ~= nil) then entitiesArray.academicDegreeDate[k]=MathTonumber.integerModule(v['qualifiers']['P585'][1]['datavalue']['value']['time'])
  		elseif (entitiesArray.academicDegreeDate[k] == "None") then entitiesArray.academicDegreeDate[k]="None" end
  	end	
  	value=v['mainsnak']['datavalue']['value']['id']
  	i=i+1
  end	
  if(string.find(value, "Q")) then return "full" 
  else return "" end
end  

function AutoDescriptionHuman.parseP551(entity)
  local p551Statements = entity:getAllStatements("P551")
  local value = ""
  local i=1
  for k, v in pairs (p551Statements) do
  	entitiesArray.residence[i]=mw.wikibase.getLabel(v['mainsnak']['datavalue']['value']['id']) 
  	entitiesArray.residenceSt[i]="NoNe"
  	entitiesArray.residenceEnd[i]="NoNe"
  	if(v['qualifiers'] ~= nil) then
  		if(v['qualifiers']['P582'] ~= nil and v['qualifiers']['P582'][1] ~= nil 
  		   and v['qualifiers']['P582'][1]['datavalue'] ~= nil and v['qualifiers']['P582'][1]['datavalue']['value'] ~= nil 
  		   and v['qualifiers']['P582'][1]['datavalue']['value']['time'] ~= nil) then 
         entitiesArray.residenceEnd[i]=MathTonumber.integerModule(v['qualifiers']['P582'][1]['datavalue']['value']['time']) 
  		else entitiesArray.residenceEnd[i]="NoNe" end
  		if(v['qualifiers']['P580'] ~= nil and v['qualifiers']['P580'][1] ~= nil
           and v['qualifiers']['P580'][1]['datavalue'] ~= nil and v['qualifiers']['P580'][1]['datavalue']['value'] ~= nil
           and v['qualifiers']['P580'][1]['datavalue']['value']['time'] ~= nil) then 
         entitiesArray.residenceSt[i]=MathTonumber.integerModule(v['qualifiers']['P580'][1]['datavalue']['value']['time']) 
  		else entitiesArray.residenceSt[i]="NoNe" end
  	end	
  	value=v['mainsnak']['datavalue']['value']['id']
  	i=i+1
  end	
  if(string.find(value, "Q")) then return "full" 
  else return "" end
end  

function AutoDescriptionHuman.parseP569(entity)
 local valuesP=entity:formatPropertyValues("P569", { mw.wikibase.entity.claimRanks.RANK_PREFERRED }).value
 local valuesN=entity:formatPropertyValues("P569", { mw.wikibase.entity.claimRanks.RANK_NORMAL }).value
 local valuesC=entity:formatPropertyValues("P569",mw.wikibase.entity.claimRanks).value
 local values=""
 if(valuesP ~= nil) then values=valuesP end
 if(values == "" and valuesN ~= nil) then values=valuesN end
 if(values == "" and valuesC ~= nil) then values=valuesC end
 if(values ~= "") then 
 	entitiesArray["dayB"]=values:match"(%d+)[-/.%s]" 
 	entitiesArray["monthB"]=string.gsub(values, '[^а-я]', '' )
 	if(string.find(values, "февраля")) then entitiesArray["monthB"]="февраля" 
 	elseif (string.find(values, "ноября")) then  entitiesArray["monthB"]="ноября" 
 	elseif (string.find(values, "сентября")) then  entitiesArray["monthB"]="сентября" 
 	elseif (string.find(values, "апреля")) then  entitiesArray["monthB"]="апреля" 
 	elseif (string.find(values, "июля")) then  entitiesArray["monthB"]="июля" 
 	elseif (string.find(values, "июль")) then  entitiesArray["monthB"]="июль" 
 	elseif (string.find(values, "марта")) then  entitiesArray["monthB"]="марта"
 	elseif (string.find(values, "июня")) then  entitiesArray["monthB"]="июня" 
 	elseif (string.find(values, "декабря")) then  entitiesArray["monthB"]="декабря" 
 	elseif (string.find(values, "января")) then  entitiesArray["monthB"]="января" 
 	elseif (string.find(values, "августа")) then  entitiesArray["monthB"]="августа" 
 	elseif (string.find(values, "октября")) then  entitiesArray["monthB"]="октября" 
 	elseif (string.find(values, "значение неизвестно")) then  entitiesArray["dayB"]=""  entitiesArray["monthB"]=""  entitiesArray["yearB"]="" 	
    end
 	entitiesArray["yearB"]=values:match(' %d*%d%d')
 	if(#values <= 4) then
 		entitiesArray["dayB"]=""
 		entitiesArray["monthB"]=""
 		entitiesArray["yearB"]=values
 	elseif(entitiesArray["yearB"] ~= nil) then entitiesArray["yearB"]=entitiesArray["yearB"]:sub(2,#entitiesArray["yearB"]) end	
 	return values   
 else return ""
 end
end  

function AutoDescriptionHuman.parseP570(entity)
 local valuesP=entity:formatPropertyValues("P570", { mw.wikibase.entity.claimRanks.RANK_PREFERRED }).value
 local valuesN=entity:formatPropertyValues("P570", { mw.wikibase.entity.claimRanks.RANK_NORMAL }).value
 local valuesC=entity:formatPropertyValues("P570",mw.wikibase.entity.claimRanks).value
 local values=""
 if(valuesP ~= nil) then values=valuesP end
 if(values == "" and valuesN ~= nil) then values=valuesN end
 if(values == "" and valuesC ~= nil) then values=valuesC end
 if(values ~= "") then
 	entitiesArray["dayD"]=values:match"(%d+)[-/.%s]"
 	entitiesArray["monthD"]=string.gsub(values, '[^а-я]', '' )
 	if(string.find(values, "февраля")) then entitiesArray["monthD"]="февраля"  
 	elseif (string.find(values, "ноября")) then  entitiesArray["monthD"]="ноября" 
 	elseif (string.find(values, "сентября")) then  entitiesArray["monthD"]="сентября" 
 	elseif (string.find(values, "апреля")) then  entitiesArray["monthD"]="апреля" 
 	elseif (string.find(values, "июля")) then  entitiesArray["monthD"]="июля" 
 	elseif (string.find(values, "марта")) then  entitiesArray["monthD"]="марта"
 	elseif (string.find(values, "июня")) then  entitiesArray["monthD"]="июня" 
 	elseif (string.find(values, "декабря")) then  entitiesArray["monthD"]="декабря" 
 	elseif (string.find(values, "января")) then  entitiesArray["monthD"]="января" 
 	elseif (string.find(values, "августа")) then  entitiesArray["monthD"]="августа"
 	elseif (string.find(values, "октября")) then  entitiesArray["monthD"]="октября" 
	elseif (string.find(values, "значение неизвестно")) then  entitiesArray["dayD"]=""  entitiesArray["monthD"]=""  entitiesArray["yearD"]="" 
    end
 	entitiesArray["yearD"]=values:match(' %d*%d%d')
 	if(#values <= 4) then
 		entitiesArray["dayD"]=""
 		entitiesArray["monthD"]=""
 		entitiesArray["yearD"]=values
 	elseif(entitiesArray["yearD"] ~= nil) then entitiesArray["yearD"]=entitiesArray["yearD"]:sub(2,#entitiesArray["yearD"]) 
 	end	
 	return values   
 else return ""
 end
end  

function AutoDescriptionHuman.parseP734(entity)
 local p734Statement = mw.wikibase.getBestStatements(entity:getId(), "P734")
 if(p734Statement ~= nil) then 
  for ki, vi in pairs (p734Statement) do
   if(vi["mainsnak"] ~= nil 
      and vi["mainsnak"]["datavalue"] ~= nil
      and vi["mainsnak"]["datavalue"]["value"] ~= nil
      and vi["mainsnak"]["datavalue"]["value"]["id"] ~= nil) then
     local givenNameId = vi["mainsnak"]["datavalue"]["value"]["id"]
     if(givenNameId ~= nil and givenNameId ~= "") then
      local givenName = mw.wikibase.getLabelByLang(givenNameId, "ru")
      if(givenName ~= nil) then entitiesArray["P734"] = givenName end
     end
   end
  end
 end
 return ""
end  

function AutoDescriptionHuman.parseP735(entity)
 local p735Statement = mw.wikibase.getBestStatements(entity:getId(), "P735")
 if(p735Statement ~= nil) then 
  for ki, vi in pairs (p735Statement) do
   if(vi["mainsnak"] ~= nil 
      and vi["mainsnak"]["datavalue"] ~= nil
      and vi["mainsnak"]["datavalue"]["value"] ~= nil
      and vi["mainsnak"]["datavalue"]["value"]["id"] ~= nil) then
     local givenNameId = vi["mainsnak"]["datavalue"]["value"]["id"]
     if(givenNameId ~= nil and givenNameId ~= "") then
      local givenName = mw.wikibase.getLabelByLang(givenNameId, "ru")
      if(givenName ~= nil) then entitiesArray["P735"] = givenName end
     end
   end
  end
 end
 return ""
end  

function AutoDescriptionHuman.parseP737(entity)
  local p737Statements = entity:getAllStatements("P737")
  local i=1
  for ki, vi in pairs (p737Statements) do
  	entitiesArray.influencedBy[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
  	entitiesArray.P737Q=vi['mainsnak']['datavalue']['value']['id'] 
  	i=i+1
  end	
  if(string.find(entitiesArray.P737Q, "Q")) then return entitiesArray.P737Q 
  else return "" end
end  

function AutoDescriptionHuman.parseP800(entity)
  local p800Statements = entity:getAllStatements("P800")
  local i=1
  local value=""
  for ki, vi in pairs (p800Statements) do
  	entitiesArray.notableWork[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
  	value=vi['mainsnak']['datavalue']['value']['id'] 
  	i=i+1
  end	
  if(string.find(value, "Q")) then return "full"
  else return "" end
end  

function AutoDescriptionHuman.parseP802(entity)
  local p802Statements = entity:getAllStatements("P802")
  local i=1
  local value=""
  for ki, vi in pairs (p802Statements) do
  	entitiesArray.stu[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
  	value=vi['mainsnak']['datavalue']['value']['id'] 
  	i=i+1
  end	
  if(string.find(value, "Q")) then return "full"
  else return "" end
end  

function AutoDescriptionHuman.parseP937(entity)
  local p937Statements = entity:getAllStatements("P937")
  local i=1
  local value=""
  for ki, vi in pairs (p937Statements) do
  	entitiesArray.workLocation[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
  	value=vi['mainsnak']['datavalue']['value']['id'] 
  	i=i+1
  end	
  if(string.find(value, "Q")) then return "full"
  else return "" end
end  

function AutoDescriptionHuman.parseP1066(entity)
  local p1066Statements = entity:getAllStatements("P1066")
  local i=1
  local value=""
  for ki, vi in pairs (p1066Statements) do
  	entitiesArray.pup[i]= mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
  	value=vi['mainsnak']['datavalue']['value']['id'] 
  	i=i+1
  end	
  if(string.find(value, "Q")) then return "full"
  else return "" end
end  

function AutoDescriptionHuman.parseP1196(entity)
 local value = entity:formatPropertyValues("P1196",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end   

function AutoDescriptionHuman.parseP1303(entity)
 local p1303Statements = entity:getAllStatements("P1303")
 local i=1
 local value=""
 for ki, vi in pairs (p1303Statements) do
   entitiesArray.instrument[i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   value=vi['mainsnak']['datavalue']['value']['id']
   i=i+1
 end
 if(string.find(value, "Q")) then return "full"
 else return "" end
end  

function AutoDescriptionHuman.parseP1344(entity)
 local p1344Statements = entity:getAllStatements("P1344")
 local i=1
 local value=""
 for ki, vi in pairs (p1344Statements) do
   entitiesArray.participantOf[i]=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']) 
   value=vi['mainsnak']['datavalue']['value']['id']
   i=i+1
 end
 if(string.find(value, "Q")) then return "full"
 else return "" end
end  

function AutoDescriptionHuman.parseP1559(entity)
 local p1559Statements = entity:getAllStatements("P1559")	
 for ki, vi in pairs (p1559Statements) do
 	if (vi['mainsnak']['datavalue']['value']['language']) then entitiesArray.langName=vi['mainsnak']['datavalue']['value']['language'] end
 	if (vi['mainsnak']['datavalue']['value']['text']) then entitiesArray.nativeName=vi['mainsnak']['datavalue']['value']['text'] end
 end	
end  

function AutoDescriptionHuman.parseP2021(entity)
 local value = entity:formatPropertyValues("P2021",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end   

function AutoDescriptionHuman.parseP3373(entity)
 local p3373Statements = entity:getAllStatements("P3373")	
 local value=""
 for k, v in pairs (p3373Statements) do
 	entitiesArray.sibling[k]=mw.wikibase.getLabel(v['mainsnak']['datavalue']['value']['id'])
 	value=v['mainsnak']['datavalue']['value']['id']
 end	
 if(string.find(value, "Q")) then return "full" end
end   

return AutoDescriptionHuman