diff --git a/admin/survey/export/latexclasses/class.LatexDocument.php b/admin/survey/export/latexclasses/class.LatexDocument.php index d5b021162..14bc5e0c3 100644 --- a/admin/survey/export/latexclasses/class.LatexDocument.php +++ b/admin/survey/export/latexclasses/class.LatexDocument.php @@ -477,7 +477,7 @@ class LatexDocument{ /********************* END TEST *****************************/ //brisanje temp datotek tex - unlink($filenameTex); //tex + //unlink($filenameTex); //tex unlink($filename.".aux"); //aux unlink($filename.".log"); //log unlink($filename.".pdf"); //pdf diff --git a/admin/survey/export/latexclasses/class.LatexSurveyElement.php b/admin/survey/export/latexclasses/class.LatexSurveyElement.php index 71ad88f08..556abbf2f 100644 --- a/admin/survey/export/latexclasses/class.LatexSurveyElement.php +++ b/admin/survey/export/latexclasses/class.LatexSurveyElement.php @@ -875,14 +875,15 @@ class LatexSurveyElement{ $image = $lang['srv_pc_unavailable']; $text = $textPrej.' '.$image.' '.$textPotem; } */ - + $text = ''; $text = $textPrej.' '; - if(filesize($imageNameTest) > 0){ + //if(filesize($imageNameTest) > 0){ + if(file_exists($imageNameTest)){ $text .= $textPrej.' '.PIC_SIZE_ANS."{".$imageName."}"; }else{ $image = $lang['srv_pc_unavailable']; - $text .= $image; + $text .= $image; } $text .= ' '.$textPotem; } diff --git a/admin/survey/modules/mod_EVOLI/R/Evoli_teamship_meter_dan.R b/admin/survey/modules/mod_EVOLI/R/Evoli_teamship_meter_dan.R new file mode 100644 index 000000000..52f92a339 --- /dev/null +++ b/admin/survey/modules/mod_EVOLI/R/Evoli_teamship_meter_dan.R @@ -0,0 +1,1597 @@ +################################# +# EVOLi skupinsko poro\u010Dilo +# "Teamship Meter" denish version +################################# + +#------------- ENCODING 1KA STRE?NIK ----------------# +# Nastavimo encoding za potrebe stre?nika +# Pogosto se na 1KA stre?niku pokvarijo ?umniki, +# zato ?umniki (v PDF poro?ilu) lokalno delajo, +# na stre?niku pa ne +Sys.setlocale(category = "LC_ALL", locale = "slovenian") +#------------- ENCODING 1KA STRE?NIK ----------------# + +#------------- LIST OF REQUIRED PACKAGES ----------------# +# Install packages from CRAN +p_needed <- + c('tools', + 'Cairo', + 'gridExtra', + 'ggplot2', + 'grid', + 'scales', + 'memisc', + 'plyr', + 'dplyr') + +# packages <- rownames(installed.packages()) +# p_to_install <- p_needed[!(p_needed %in% packages)] +# +# if (length(p_to_install) > 0) { +# install.packages(p_to_install) +# } + +# Load the packages +lapply(p_needed, require, character.only = TRUE) +#------------- LIST OF REQUIRED PACKAGES ----------------# + + +#------------- CUSTOM FUNCTIONS ----------------# +source("modules/mod_EVOLI/R/my_functions_teamship_dan.R") +#------------- CUSTOM FUNCTIONS ----------------# + + +#------------- PASSING ARGUMENTS FROM CMD LINE ----------------# +params <- commandArgs(trailingOnly=TRUE) +ID <- params[1] +#------------- PASSING ARGUMENTS FROM CMD LINE ----------------# + + +#------------- FOLDERS WHERE PDF WILL BE SAVED ----------------# +dir.create('modules/mod_EVOLI/results', showWarnings = FALSE) + +# Sliko/graf bomo nato s pomo?jo latex funkcije "includegraphics" +# vstavili v PDF poro?ilo narejeno s pomo?jo tools::texi2pdf + +dir.create('modules/mod_EVOLI/results/slike', showWarnings = FALSE) +#------------- FOLDERS WHERE PDF WILL BE SAVED ----------------# + + +#------------- IMPORT DATA ----------------# +data <- read.csv2( + "modules/mod_EVOLI/temp/evoli_teamship.csv", + sep = ";", + header = T, + fill = T, + stringsAsFactors = FALSE, + encoding = "UTF-8" + ) + +if (data[1, 1] == ("Ustreznost") | + data[1, 1] == ("Relevance")) { + data <- data[2:nrow(data), ] +} + +data <- subset(data, skupina == ID) + +# ?e oddelek nima podatka oziroma je manjkajo?a vrednost, +# ga odstranimo v izogib errorju pri izdelavi frekven?ne tabele +data <- subset(data, oddelek_ime != -1) + +# Izberemo samo koncane ankete +data <- subset(data, status == 6) +#------------- IMPORT DATA ----------------# + + +#------------- TEAMS / ODDELKI ----------------# +# Skupine, za katere se bodo ra\u010Dunale vrednosti in grafi (glej SINTAX) + +# Pred ra?unanjem odstranimo vrstice z "vrednostmi za neodgovor spremenljivke" +junk.data <- c("-1", "-2", "-3", "-4", "-5") +data <- data[!apply( + data[grep("var", names(data), value = T)], + 1, + function(x) {any(x %in% junk.data)} + ), + ] + +# ?tevilo vseh odgovorov za tabelo frekvenc in odstotkov +n.answers <- sum(data$XDEPT != "") + +# Preimenuj en stolpec zaradi podvojenosti +colnames(data)[5] = "oddelek_ime2" +colnames(data)[8] = "oddelek_ime" + +# Oddelki (aggregate data by ime oddelka) +oddelek_length <- aggregate( + data[,"oddelek_ime", drop=F], + list(group=data$oddelek_ime), + length + ) + +# Izra\u010Dunamo dele? odgovorov za vsak oddelek +oddelek_length$percentage <- + round(oddelek_length$oddelek_ime / sum(oddelek_length$oddelek_ime) * 100, 1) + +# Check if the report should be as Single team EM or as Multiple team EM +# (Multiple team EM has departments oddelek_length$group) +if(any(oddelek_length$group == "-1")) { + oddelek_length$group <- unique(data$skupina_ime) + data["oddelek_ime"] <- unique(data$skupina_ime) +} +#------------- TEAMS / ODDELKI ----------------# + + +#------------- LATEX FREQUENCY TABLE ----------------# +# Generating table of frequencies and percentages for each area +table <- cbind.data.frame( + freq=as.numeric(c(oddelek_length$oddelek_ime)), + perc=as.numeric(c(oddelek_length$percentage)) + ) + +# Add TOTAl +table <- rbind(table, colSums(table, na.rm=TRUE)) + +# Paste % simbol +table$perc <- round(table$perc, 0) +table$perc <- paste0(table$perc, "\\%", sep = "") + +# Name of rows +rownames(table) <- c(oddelek_length$group, "Total") + +# Name of rows +colnames(table) <- c('Antal', 'Procent') + +# Latex Table: vertikalne \u010Drte pri vsaki vrstici +table.tex <- + capture.output(Hmisc::latex(table, + rowlabel = "Teamship M\u00E5ler", + file = "", + where = "H", + rowlabel.just = "p{6.5cm}", + col.just = c("|c","|c"), + n.rgroup = rep_len(1, nrow(table)), + rowname = Hmisc::latexTranslate(rownames(table)) + ) + ) +#------------- LATEX FREQUENCY TABLE ----------------# + + +#------------- TEAMS / PODRO?JA: QUALITY CLIMATE ----------------# +# Izra\u010Dunamo vrednosti (glej excel datoteko": Variables ankete...) +# Spremenljivke pretvorimo v ?tevilske zaradi ra\u010Dunanja aritm. sredine + +data[grep("var", names(data), value = TRUE)] <- + sapply(data[grep("var", names(data), value = TRUE)], as.numeric) +#------------- TEAMS / PODRO?JA: QUALITY CLIMATE ----------------# + + +#------------- SINTAX: ALL TEAMS ----------------# +# Najprej izra\u010Dunamo ?tevilo in dele?e ocen vrednosti na lestvici od 1 do 5 +# Ra\u010Dunamo po navodilih datoteke "Variables ankete...": +# Gre za rekodiranje odgovorov iz lestvice 1-4 na lestvico 1-5 + +### Each team member brings out their best ### +bringsbest <- prep.dat(data, + c( + "var001", + "var016", + "var031", + "var046", + "var061", + "var076", + "var090", + "var102", + "var115", + "var118" + )) + +### Everyone identifies with the vision ### +identifiesvision <- prep.dat(data, + c( + "var002", + "var017", + "var032", + "var047", + "var062", + "var077" + )) + +### Success criteria are shared ### +criteriashared <- prep.dat(data, + c( + "var003", + "var018", + "var033", + "var048", + "var063", + "var078", + "var091", + "var103" + )) + +### The team is organised around its success criteria ### +organisedcriteria <- prep.dat(data, + c( + "var004", + "var019", + "var034", + "var049", + "var064", + "var079", + "var092" + )) + +### Everyone is willing to change instantly ### +willingchange <- prep.dat(data, + c( + "var005", + "var020", + "var035", + "var050", + "var065" + )) + +### The team can overcome obstacles ### +overcome <- prep.dat(data, + c( + "var006", + "var021", + "var036", + "var051", + "var066", + "var080", + "var093", + "var104", + "var111" + )) + +### Everyone possesses professional skills" +professionalskills <- prep.dat(data, + c( + "var007", + "var022", + "var037", + "var052", + "var067", + "var081" + )) + +### Everyone has relational skills ### +relationalskills <- prep.dat(data, + c( + "var008", + "var023", + "var038", + "var053", + "var068", + "var082", + "var094", + "var105" + )) + +### The team is a "we" team ### +isweteam <- prep.dat(data, + c( + "var009", + "var024", + "var039", + "var054", + "var069", + "var083", + "var095", + "var106", + "var112", + "var116" + )) + +### Everyone learns and shares ### +learnsshares <- prep.dat(data, + c( + "var010", + "var025", + "var040", + "var055", + "var070", + "var084", + "var096", + "var107" + )) + +### The team is a whole team ### +wholeteam <- prep.dat(data, + c( + "var011", + "var026", + "var041", + "var056", + "var071", + "var085", + "var097" + )) + +### The team leader is visible ### +leadervisible <- prep.dat(data, + c( + "var012", + "var027", + "var042", + "var057", + "var072", + "var086", + "var098" + )) + +### The team leader helps everyone to achieve success ### +leaderhelps <- prep.dat(data, + c( + "var013", + "var028", + "var043", + "var058", + "var073", + "var087", + "var099", + "var108", + "var113" + )) + +### The team leader enjoys respect ### +leaderenjoys <- prep.dat(data, + c( + "var014", + "var029", + "var044", + "var059", + "var074", + "var088", + "var100", + "var109", + "var114", + "var117" + )) + +### Good performance is rewarded ### +performance <- prep.dat(data, + c( + "var015", + "var030", + "var045", + "var060", + "var075", + "var089", + "var101" + )) + +#------------- SINTAX: ALL TEAMS ----------------# + + +#------------- DATA PREPARATION FOR GGPLOT: ALL TEAMS ----------------# +# Dodamo labele frekvencam (1-5), ki se bodo izrisale v grafih + +bringsbest <- labScore(bringsbest, + "Alle teammedlemmer yder deres bedste") +identifiesvision <- labScore(identifiesvision, + "Alle identificerer sig med visionen") +criteriashared <- labScore(criteriashared, + "Succeskriterier er f\u00E6lles") +organisedcriteria <- labScore(organisedcriteria, + "Teamet er organiseret omkring succeskriterierne") +willingchange <- labScore(willingchange, + "Alle er villige til at forandre sig \u00F8jeblikkeligt") +overcome <- labScore(overcome, + "Teamet kan overvinde hindringer") +professionalskills <- labScore(professionalskills, + "Alle har faglige færdigheder") +relationalskills <- labScore(relationalskills, + "Alle har f\u00E6rdigheder i samspil") +isweteam <- labScore(isweteam, + 'Teamet er et "vi-team"') +learnsshares <- labScore(learnsshares, + "Alle l\u00E6rer og deler viden med hinanden") +wholeteam <- labScore(wholeteam, + 'Teamet er et "helt" team') +leadervisible <- labScore(leadervisible, + "Teamlederen er synlig") +leaderhelps <- labScore(leaderhelps, + "Teamlederen hj\u00E6lper alle med at f\u00E5 succes") +leaderenjoys <- labScore(leaderenjoys, + "Teamlederen nyder respekt") +performance <- labScore(performance, + "Gode pr\u00E6stationer belønnes") + + +# Combine all variables and create data frame +df <- rbind( + bringsbest, + identifiesvision, + criteriashared, + organisedcriteria, + willingchange, + overcome, + professionalskills, + relationalskills, + isweteam, + learnsshares, + wholeteam, + leadervisible, + leaderhelps, + leaderenjoys, + performance +) + + +# Get the levels for type in the required order +df$label = factor(df$label, + levels = c( + "Meget utilfredsstillende", + "Utilfredsstillende", + "Gennemsnitlig", + "Meget tilfredsstillende", + "S\u00E6rdeles tilfredsstillende" + ) +) + +df = arrange(df, name, desc(label)) + +# Format the labels and calculate their positions +df = ddply(df, + .(name), + transform, + pos = (cumsum(Percentage) - 0.5 * Percentage) +) + +df$label1 = paste0(sprintf("%.0f", df$Percentage), "%") + + +# User-defined order of names on axis +df$name <- factor( + df$name , + levels = c( + rev(c( + "Alle teammedlemmer yder deres bedste", + "Alle identificerer sig med visionen", + "Succeskriterier er f\u00E6lles", + "Teamet er organiseret omkring succeskriterierne", + "Alle er villige til at forandre sig \u00F8jeblikkeligt", + "Teamet kan overvinde hindringer", + "Alle har faglige færdigheder", + "Alle har f\u00E6rdigheder i samspil", + 'Teamet er et "vi-team"', + "Alle l\u00E6rer og deler viden med hinanden", + 'Teamet er et "helt" team', + "Teamlederen er synlig", + "Teamlederen hj\u00E6lper alle med at f\u00E5 succes", + "Teamlederen nyder respekt", + "Gode pr\u00E6stationer belønnes" + ) + ) + ) +) + +df <- df[order(df$name), ] + +#------------- DATA PREPARATION FOR GGPLOT: ALL TEAMS ----------------# + + +#------------- GGPLOT: EMPLOYEESHIP FOR ALL TEAMS ----------------# +# BEGIN: Save ggplot to pdf +cairo_pdf( + paste('modules/mod_EVOLI/results/slike/meter_all_teams.pdf', sep = ''), + pointsize = 12, + width = 9, + height = 6 +) + +p <- ggplot(df, aes(x = factor(name))) + + + # Vertikalne sive \u010Drte prikazane za stolpi\u010Dnim diagramom + geom_hline(yintercept = 0, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 10, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 30, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 40, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 60, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 70, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 80, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 90, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 100, col = "gray", alpha = 0.5, size = 0.7) + + + # Dolo\u010Dimo polo?aj prikaza dele?ev v grafu + geom_col(aes(y = Percentage, fill = label), + position = position_stack(reverse = TRUE), + width = .5) + + + # Vertikalne rde\u010De \u010Drte + geom_hline(yintercept = 20, colour = "#AA0000", alpha = 1, size = 0.8) + + geom_hline(yintercept = 50, colour = "#AA0000", alpha = 1, size = 0.8) + + + # Set the position to its complementary / izris dele?ev + geom_text(aes(y = 100 - pos, label = label1), size = 4) + + + # Rest of theme, polo?aj osi je na vrhu grafa + coord_flip() + + + scale_y_continuous( + position = "right", + expand = c(0, 0), + breaks = seq(min(0), max(0, 102), by = 10), + limits = c(0, 102), + labels = dollar_format(suffix = "%", prefix = "") + ) + + + scale_fill_manual( + values = c( + "#ff0000", + "#ffff00", + "#b2b2b2", + "#1baf05", + "#007FFF" + ), + drop = FALSE + ) + + + xlab("") + ylab("") + + + theme_bw() + theme( + axis.line = element_blank(), + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + panel.border = element_blank(), + panel.background = element_blank() + ) + + + theme( + legend.position = "bottom", + legend.title = element_blank(), + legend.key.size = unit(0.7, "line"), + legend.text = element_text(size = 12) + ) + +# Add axis text colour, size and style +p1 <- p + theme( + axis.text.x = element_text(colour = "black", size = 11, face = "plain"), + axis.text.y = element_text(colour = "black", size = 11, face = "plain"), + plot.margin=unit(c(1, 1, 1, -0.4), units = "line"), + plot.background = element_rect(colour = 'gray', fill = 'NA', size = 0.5), + plot.title = element_text(hjust = 0.4,size = 15, face = "bold") + ) #+ + #ggtitle("Employeeship for all teams") + +p1 + theme(axis.ticks=element_blank()) + +# END: Save ggplot to pdf +dev.off() + +# Shranimo sliko in vklju\u010Dimo v pdf: LATEX +tex.meter_all_teams <- c(paste0( + "\\begin{figure}[H]", + # "\\caption{ \\textbf{\\large{Teamship factors for all teams}}}", + paste0( + "\\centerline{\\includegraphics[width=1\\textwidth]{slike/meter_all_teams.pdf}}" + ), + "\\end{figure}" + ) + ) +#------------- GGPLOT EMPLOYEESHIP FOR ALL TEAMS ----------------# + + +#------------- EMPLOYEESHIP FOR SEPARATE TEAMS ----------------# +Oddeleki.tmp <- list() + +# S pomo?jo zanke za vsak oddelek posebej naredimo poro?ilo + +if (nrow(oddelek_length) > 0) { + for(oddelek in oddelek_length$group) { + + Oddelki_podatki <- subset(data, oddelek == oddelek_ime) + Oddelki_podatki[grep("var", names(Oddelki_podatki), value = TRUE)] <- + sapply(Oddelki_podatki[grep("var", names(Oddelki_podatki), value = TRUE)], + as.numeric) + + + #------------- FILLABLE NOTES/FORMS ----------------# + # Pod vsakim grafom "Team Employeeship Meter" naj bo za vnos komentarjev + # (fillable form) simbol svin?nika + simbol <- "\\ding{46} " + + # Ime forme + label_Notes <- "Bem\u00E6rkninger:" + + # Forma + form <- c("\\begin{Form} + \\noindent + \\TextField[name=",oddelek,", multiline=true, width=\\linewidth,height=10cm,bordercolor=0 0 0]{} + \\end{Form}") + + # Concatenate + FillableFORM <- c(simbol, label_Notes, "\\\\[0.1cm]",form) + + # Not needed right now + vspace <- "\\vspace*{18pt}" + #------------- FILLABLE NOTES/FORMS ----------------# + + + # Najprej izra?unamo ?tevilo in dele?e ocen vrednosti na lestvici od 1 do 4 + # in jih pretvorimo na lestico 1 do 5 + + ### Each team member brings out their best ### + odd_bringsbest <- prep.dat(Oddelki_podatki, + c( + "var001", + "var016", + "var031", + "var046", + "var061", + "var076", + "var090", + "var102", + "var115", + "var118" + )) + + ### Everyone identifies with the vision ### + odd_identifiesvision <- prep.dat(Oddelki_podatki, + c( + "var002", + "var017", + "var032", + "var047", + "var062", + "var077" + )) + + ### Success criteria are shared ### + odd_criteriashared <- prep.dat(Oddelki_podatki, + c( + "var003", + "var018", + "var033", + "var048", + "var063", + "var078", + "var091", + "var103" + )) + + ### The team is organised around its success criteria ### + odd_organisedcriteria <- prep.dat(Oddelki_podatki, + c( + "var004", + "var019", + "var034", + "var049", + "var064", + "var079", + "var092" + )) + + ### Everyone is willing to change instantly ### + odd_willingchange <- prep.dat(Oddelki_podatki, + c( + "var005", + "var020", + "var035", + "var050", + "var065" + )) + + ### The team can overcome obstacles ### + odd_overcome <- prep.dat(Oddelki_podatki, + c( + "var006", + "var021", + "var036", + "var051", + "var066", + "var080", + "var093", + "var104", + "var111" + )) + + ### Everyone possesses professional skills" + odd_professionalskills <- prep.dat(Oddelki_podatki, + c( + "var007", + "var022", + "var037", + "var052", + "var067", + "var081" + )) + + ### Everyone has relational skills ### + odd_relationalskills <- prep.dat(Oddelki_podatki, + c( + "var008", + "var023", + "var038", + "var053", + "var068", + "var082", + "var094", + "var105" + )) + + ### The team is a "we" team ### + odd_isweteam <- prep.dat(Oddelki_podatki, + c( + "var009", + "var024", + "var039", + "var054", + "var069", + "var083", + "var095", + "var106", + "var112", + "var116" + )) + + ### Everyone learns and shares ### + odd_learnsshares <- prep.dat(Oddelki_podatki, + c( + "var010", + "var025", + "var040", + "var055", + "var070", + "var084", + "var096", + "var107" + )) + + ### The team is a whole team ### + odd_wholeteam <- prep.dat(Oddelki_podatki, + c( + "var011", + "var026", + "var041", + "var056", + "var071", + "var085", + "var097" + )) + + ### The team leader is visible ### + odd_leadervisible <- prep.dat(Oddelki_podatki, + c( + "var012", + "var027", + "var042", + "var057", + "var072", + "var086", + "var098" + )) + + ### The team leader helps everyone to achieve success ### + odd_leaderhelps <- prep.dat(Oddelki_podatki, + c( + "var013", + "var028", + "var043", + "var058", + "var073", + "var087", + "var099", + "var108", + "var113" + )) + + ### The team leader enjoys respect ### + odd_leaderenjoys <- prep.dat(Oddelki_podatki, + c( + "var014", + "var029", + "var044", + "var059", + "var074", + "var088", + "var100", + "var109", + "var114", + "var117" + )) + + ### Good performance is rewarded ### + odd_performance <- prep.dat(Oddelki_podatki, + c( + "var015", + "var030", + "var045", + "var060", + "var075", + "var089", + "var101" + )) + + + #------------- DATA PREPARATION FOR GGPLOT ----------------# + + odd_bringsbest <- labScore(odd_bringsbest, + "Alle teammedlemmer yder deres bedste") + odd_identifiesvision <- labScore(odd_identifiesvision, + "Alle identificerer sig med visionen") + odd_criteriashared <- labScore(odd_criteriashared, + "Succeskriterier er f\u00E6lles") + odd_organisedcriteria <- labScore(odd_organisedcriteria, + "Teamet er organiseret omkring succeskriterierne") + odd_willingchange <- labScore(odd_willingchange, + "Alle er villige til at forandre sig \u00F8jeblikkeligt") + odd_overcome <- labScore(odd_overcome, + "Teamet kan overvinde hindringer") + odd_professionalskills <- labScore(odd_professionalskills, + "Alle har faglige færdigheder") + odd_relationalskills <- labScore(odd_relationalskills, + "Alle har f\u00E6rdigheder i samspil") + odd_isweteam <- labScore(odd_isweteam, + 'Teamet er et "vi-team"') + odd_learnsshares <- labScore(odd_learnsshares, + "Alle l\u00E6rer og deler viden med hinanden") + odd_wholeteam <- labScore(odd_wholeteam, + 'Teamet er et "helt" team') + odd_leadervisible <- labScore(odd_leadervisible, + "Teamlederen er synlig") + odd_leaderhelps <- labScore(odd_leaderhelps, + "Teamlederen hj\u00E6lper alle med at f\u00E5 succes") + odd_leaderenjoys <- labScore(odd_leaderenjoys, + "Teamlederen nyder respekt") + odd_performance <- labScore(odd_performance, + "Gode pr\u00E6stationer belønnes") + + + # Combine all variables and create data frame + odd.df <- rbind( + odd_bringsbest, + odd_identifiesvision, + odd_criteriashared, + odd_organisedcriteria, + odd_willingchange, + odd_overcome, + odd_professionalskills, + odd_relationalskills, + odd_isweteam, + odd_learnsshares, + odd_wholeteam, + odd_leadervisible, + odd_leaderhelps, + odd_leaderenjoys, + odd_performance + ) + + + # Get the levels for type in the required order + odd.df$label = factor(odd.df$label, + levels = c( + "Meget utilfredsstillende", + "Utilfredsstillende", + "Gennemsnitlig", + "Meget tilfredsstillende", + "S\u00E6rdeles tilfredsstillende" + ) + ) + + odd.df = arrange(odd.df, name, desc(label)) + + # Format the labels and calculate their positions + odd.df = ddply(odd.df, + .(name), + transform, + pos = (cumsum(Percentage) - 0.5 * Percentage) + ) + + odd.df$label1 = paste0(sprintf("%.0f", odd.df$Percentage), "%") + + + # User-defined order of names on axis + odd.df$name <- factor( + odd.df$name , + levels = c( + rev(c( + "Alle teammedlemmer yder deres bedste", + "Alle identificerer sig med visionen", + "Succeskriterier er f\u00E6lles", + "Teamet er organiseret omkring succeskriterierne", + "Alle er villige til at forandre sig \u00F8jeblikkeligt", + "Teamet kan overvinde hindringer", + "Alle har faglige færdigheder", + "Alle har f\u00E6rdigheder i samspil", + 'Teamet er et "vi-team"', + "Alle l\u00E6rer og deler viden med hinanden", + 'Teamet er et "helt" team', + "Teamlederen er synlig", + "Teamlederen hj\u00E6lper alle med at f\u00E5 succes", + "Teamlederen nyder respekt", + "Gode pr\u00E6stationer belønnes" + ) + ) + ) + ) + + odd.df <- odd.df[order(odd.df$name), ] + + #------------- DATA PREPARATION FOR GGPLOT ----------------# + + + #------------- GGPLOT EMPLOYEESHIP ODDELKI ----------------# + # Pripravimo dokument + cairo_pdf( + paste( + 'modules/mod_EVOLI/results/slike/meter_', + replace.characters(oddelek), + '.pdf', + sep = "" + ), + pointsize = 15, + width = 9, + height = 6 + ) + + # Konstrukcija grafa + S <- ggplot(odd.df, aes(x = factor(name))) + + + # Vertikalne sive ?rte, prikazane za stolpi?nim diagramom + geom_hline(yintercept = 0, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 10, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 30, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 40, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 60, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 70, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 80, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 90, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 100, col = "gray", alpha = 0.5, size = 0.7) + + + # Dolo?imo polo?aj prikaza dele?ev v grafu + geom_col(aes(y = Percentage, fill = label), + position = position_stack(reverse = TRUE), + width = .5) + + + # Vertikalne rde?e ?rte + geom_hline(yintercept = 20, colour = "#AA0000", alpha = 1, size = 0.8) + + geom_hline(yintercept = 50, colour = "#AA0000", alpha = 1, size = 0.8) + + + # Izris dele?ev + geom_text(aes(y = 100 - pos, label = label1), size = 4) + + + # Rest of theme, polo?aj osi je na vrhu grafa + coord_flip() + + scale_y_continuous( + position = "right", + expand = c(0, 0), + breaks = seq(min(0), max(0, 102), by = 10), + limits = c(0, 102), + labels = dollar_format(suffix = "%", prefix = "") + ) + + + scale_fill_manual(values = c( + "#ff0000", + "#ffff00", + "#b2b2b2", + "#1baf05", + "#007FFF" + ), + drop = FALSE) + + + xlab("") + ylab("") + + + theme_bw() + + + theme( + axis.line = element_blank(), + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + panel.border = element_blank(), + panel.background = element_blank() + ) + + + theme( + legend.position="bottom", + legend.title = element_blank(), + legend.key.size = unit(0.7, "line"), + legend.text=element_text(size = 12) + ) + + # Add axis text colour, size and style + S1 <- S + theme( + axis.text.x = element_text(colour = "black", size = 11, face = "plain"), + axis.text.y = element_text(colour = "black", size = 11, face = "plain"), + plot.margin = unit(c(1, 1, 1, -0.4), units = "line"), + plot.background = element_rect(colour = 'gray', fill = 'NA', size = 0.5), + plot.title = element_text(hjust = 0.4,size = 15, face = "bold") + ) + + + # In case of letter ? we need to add extra space because of encoding + ggtitle(tidy.c.space(oddelek)) + + + print(S1 + theme(axis.ticks = element_blank())) + + # Save ggplot to pdf + dev.off() + + Oddeleki.tmp[[oddelek]] <- c(paste0( + "\\begin{figure}[H]", + #"\\caption{ \\textbf{\\large{Oddelki_podatki}}}", + paste0( + "\\centerline{\\includegraphics[width=1\\textwidth]{slike/meter_", + replace.characters(oddelek), + ".pdf}}" + ), + "\\end{figure}" + ), + FillableFORM) + + }} else { + Oddeleki.tmp[[oddelek]] <- NULL + fillableForm_Serv <- NULL + vspace <- NULL + } + +#------------- EMPLOYEESHIP FOR SEPARATE TEAMS ----------------# + + +#------------- EMPLOYEESHIP FOR SEPARATE FACTORS ----------------# +Lastnosti.tmp <- list() + + +lastnosti_length = unique(df$name) + +las_bringsbest <- data.frame() +las_identifiesvision <- data.frame() +las_criteriashared <- data.frame() +las_organisedcriteria <- data.frame() +las_willingchange <- data.frame() +las_overcome <- data.frame() +las_professionalskills <- data.frame() +las_relationalskills <- data.frame() +las_isweteam <- data.frame() +las_learnsshares <- data.frame() +las_wholeteam <- data.frame() +las_leadervisible <- data.frame() +las_leaderhelps <- data.frame() +las_leaderenjoys <- data.frame() +las_performance <- data.frame() + + +for (oddelek in oddelek_length$group) { + data_temp <- data[ which(data$oddelek_ime==oddelek), ] + + ### Each team member brings out their best ### + las_bringsbest_temp <- prep.dat(data_temp, + c( + "var001", + "var016", + "var031", + "var046", + "var061", + "var076", + "var090", + "var102", + "var115", + "var118" + )) + + las_bringsbest_temp$name <- oddelek + las_bringsbest <- rbind(las_bringsbest, las_bringsbest_temp) + + ### Everyone identifies with the vision ### + las_identifiesvision_temp <- prep.dat(data_temp, + c( + "var002", + "var017", + "var032", + "var047", + "var062", + "var077" + )) + + las_identifiesvision_temp$name <- oddelek + las_identifiesvision <- rbind(las_identifiesvision, las_identifiesvision_temp) + + ### Success criteria are shared ### + las_criteriashared_temp <- prep.dat(data_temp, + c( + "var003", + "var018", + "var033", + "var048", + "var063", + "var078", + "var091", + "var103" + )) + + las_criteriashared_temp$name <- oddelek + las_criteriashared <- rbind(las_criteriashared, las_criteriashared_temp) + + ### The team is organised around its success criteria ### + las_organisedcriteria_temp <- prep.dat(data_temp, + c( + "var004", + "var019", + "var034", + "var049", + "var064", + "var079", + "var092" + )) + + las_organisedcriteria_temp$name <- oddelek + las_organisedcriteria <- rbind(las_organisedcriteria, las_organisedcriteria_temp) + + ### Everyone is willing to change instantly ### + las_willingchange_temp <- prep.dat(data_temp, + c( + "var005", + "var020", + "var035", + "var050", + "var065" + )) + + las_willingchange_temp$name <- oddelek + las_willingchange <- rbind(las_willingchange, las_willingchange_temp) + + ### The team can overcome obstacles ### + las_overcome_temp <- prep.dat(data_temp, + c( + "var006", + "var021", + "var036", + "var051", + "var066", + "var080", + "var093", + "var104", + "var111" + )) + + las_overcome_temp$name <- oddelek + las_overcome <- rbind(las_overcome, las_overcome_temp) + + ### Everyone possesses professional skills" + las_professionalskills_temp <- prep.dat(data_temp, + c( + "var007", + "var022", + "var037", + "var052", + "var067", + "var081" + )) + + las_professionalskills_temp$name <- oddelek + las_professionalskills <- rbind(las_professionalskills, las_professionalskills_temp) + + ### Everyone has relational skills ### + las_relationalskills_temp <- prep.dat(data_temp, + c( + "var008", + "var023", + "var038", + "var053", + "var068", + "var082", + "var094", + "var105" + )) + + las_relationalskills_temp$name <- oddelek + las_relationalskills <- rbind(las_relationalskills, las_relationalskills_temp) + + ### The team is a "we" team ### + las_isweteam_temp <- prep.dat(data_temp, + c( + "var009", + "var024", + "var039", + "var054", + "var069", + "var083", + "var095", + "var106", + "var112", + "var116" + )) + + las_isweteam_temp$name <- oddelek + las_isweteam <- rbind(las_isweteam, las_isweteam_temp) + + ### Everyone learns and shares ### + las_learnsshares_temp <- prep.dat(data_temp, + c( + "var010", + "var025", + "var040", + "var055", + "var070", + "var084", + "var096", + "var107" + )) + + las_learnsshares_temp$name <- oddelek + las_learnsshares <- rbind(las_learnsshares, las_learnsshares_temp) + + ### The team is a whole team ### + las_wholeteam_temp <- prep.dat(data_temp, + c( + "var011", + "var026", + "var041", + "var056", + "var071", + "var085", + "var097" + )) + + las_wholeteam_temp$name <- oddelek + las_wholeteam <- rbind(las_wholeteam, las_wholeteam_temp) + + ### The team leader is visible ### + las_leadervisible_temp <- prep.dat(data_temp, + c( + "var012", + "var027", + "var042", + "var057", + "var072", + "var086", + "var098" + )) + + las_leadervisible_temp$name <- oddelek + las_leadervisible <- rbind(las_leadervisible, las_leadervisible_temp) + + ### The team leader helps everyone to achieve success ### + las_leaderhelps_temp <- prep.dat(data_temp, + c( + "var013", + "var028", + "var043", + "var058", + "var073", + "var087", + "var099", + "var108", + "var113" + )) + + las_leaderhelps_temp$name <- oddelek + las_leaderhelps <- rbind(las_leaderhelps, las_leaderhelps_temp) + + ### The team leader enjoys respect ### + las_leaderenjoys_temp <- prep.dat(data_temp, + c( + "var014", + "var029", + "var044", + "var059", + "var074", + "var088", + "var100", + "var109", + "var114", + "var117" + )) + + las_leaderenjoys_temp$name <- oddelek + las_leaderenjoys <- rbind(las_leaderenjoys, las_leaderenjoys_temp) + + ### Good performance is rewarded ### + las_performance_temp <- prep.dat(data_temp, + c( + "var015", + "var030", + "var045", + "var060", + "var075", + "var089", + "var101" + )) + + las_performance_temp$name <- oddelek + las_performance <- rbind(las_performance, las_performance_temp) + +} + +las_list <- list(las_bringsbest, + las_identifiesvision, + las_criteriashared, + las_organisedcriteria, + las_willingchange, + las_overcome, + las_professionalskills, + las_relationalskills, + las_isweteam, + las_learnsshares, + las_wholeteam, + las_leadervisible, + las_leaderhelps, + las_leaderenjoys, + las_performance) + +factor_list <- list("Alle teammedlemmer yder deres bedste", + "Alle identificerer sig med visionen", + "Succeskriterier er f\u00E6lles", + "Teamet er organiseret omkring succeskriterierne", + "Alle er villige til at forandre sig \u00F8jeblikkeligt", + "Teamet kan overvinde hindringer", + "Alle har faglige færdigheder", + "Alle har f\u00E6rdigheder i samspil", + 'Teamet er et "vi-team"', + "Alle l\u00E6rer og deler viden med hinanden", + 'Teamet er et "helt" team', + "Teamlederen er synlig", + "Teamlederen hj\u00E6lper alle med at f\u00E5 succes", + "Teamlederen nyder respekt", + "Gode pr\u00E6stationer belønnes") + + +if (length(las_list) > 0) { + for (i in seq(1, length(las_list), by=1)) { + + # Add labels + las_list[[i]] <- las_labScore(las_list[[i]]) + + # Get the levels for type in the required order + las_list[[i]]$label = factor(las_list[[i]]$label, + levels = c( + "Meget utilfredsstillende", + "Utilfredsstillende", + "Gennemsnitlig", + "Meget tilfredsstillende", + "S\u00E6rdeles tilfredsstillende" + ) + ) + + las_list[[i]] = arrange(las_list[[i]], name, desc(label)) + + # Format the labels and calculate their positions + las_list[[i]] = ddply(las_list[[i]], + .(name), + transform, + pos = (cumsum(Percentage) - 0.5 * Percentage) + ) + + las_list[[i]]$label1 = paste0(sprintf("%.0f", las_list[[i]]$Percentage), "%") + + + + las_list[[i]] <- las_list[[i]][order(las_list[[i]]$name), ] + + + #------------- GGPLOT EMPLOYEESHIP FACTORS ----------------# + # Pripravimo dokument + cairo_pdf( + paste( + 'modules/mod_EVOLI/results/slike/meter_factor_', + replace.characters(i), + '.pdf', + sep = "" + ), + pointsize = 15, + width = 9, + height = 6 + ) + + # Konstrukcija grafa + L <- ggplot(las_list[[i]], aes(x = factor(name))) + + + # Vertikalne sive ?rte, prikazane za stolpi?nim diagramom + geom_hline(yintercept = 0, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 10, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 30, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 40, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 60, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 70, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 80, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 90, col = "gray", alpha = 0.5, size = 0.7) + + geom_hline(yintercept = 100, col = "gray", alpha = 0.5, size = 0.7) + + + # Dolo?imo polo?aj prikaza dele?ev v grafu + geom_col(aes(y = Percentage, fill = label), + position = position_stack(reverse = TRUE), + width = .5) + + + # Vertikalne rde?e ?rte + geom_hline(yintercept = 20, colour = "#AA0000", alpha = 1, size = 0.8) + + geom_hline(yintercept = 50, colour = "#AA0000", alpha = 1, size = 0.8) + + + # Izris dele?ev + geom_text(aes(y = 100 - pos, label = label1), size = 4) + + + # Rest of theme, polo?aj osi je na vrhu grafa + coord_flip() + + scale_y_continuous( + position = "right", + expand = c(0, 0), + breaks = seq(min(0), max(0, 102), by = 10), + limits = c(0, 102), + labels = dollar_format(suffix = "%", prefix = "") + ) + + + scale_fill_manual(values = c( + "#ff0000", + "#ffff00", + "#b2b2b2", + "#1baf05", + "#007FFF" + ), + drop = FALSE) + + + xlab("") + ylab("") + + + theme_bw() + + + theme( + axis.line = element_blank(), + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + panel.border = element_blank(), + panel.background = element_blank() + ) + + + theme( + legend.position="bottom", + legend.title = element_blank(), + legend.key.size = unit(0.7, "line"), + legend.text=element_text(size = 12) + ) + + # Add axis text colour, size and style + L1 <- L + theme( + axis.text.x = element_text(colour = "black", size = 11, face = "plain"), + axis.text.y = element_text(colour = "black", size = 11, face = "plain"), + plot.margin = unit(c(1, 1, 1, -0.4), units = "line"), + plot.background = element_rect(colour = 'gray', fill = 'NA', size = 0.5), + plot.title = element_text(hjust = 0.4,size = 15, face = "bold") + ) + + + # In case of letter ? we need to add extra space because of encoding + ggtitle(factor_list[[i]]) + + + print(L1 + theme(axis.ticks = element_blank())) + + # Save ggplot to pdf + dev.off() + + Lastnosti.tmp[[i]] <- c(paste0( + "\\begin{figure}[H]", + paste0( + "\\centerline{\\includegraphics[width=1\\textwidth]{slike/meter_factor_", + replace.characters(i), + ".pdf}}" + ), + "\\end{figure}" + ), + FillableFORM) + + } + +} else { + Lastnosti.tmp[[i]] <- NULL + fillableForm_Serv <- NULL + vspace <- NULL +} + +#------------- EMPLOYEESHIP FOR SEPARATE FACTORS ----------------# + + +#------------- ORGANISATION INFORMATION ----------------# +# Organisation name (on first page/ head of pages) +organisation <- unique(data$skupina_ime) + +# Date on first page +date <- unique(data$itime) + +# Customer name on second page +junk <- c("-1", "-2", "-3", "-4", "-5") + +customer <- + ifelse( + all(unique(data$ime) %in% junk.data), + "K\u00E6re!", + paste0("K\u00E6re ", data$ime, "!") + ) +#------------- ORGANISATION INFORMATION ----------------# + + +#------------- GENERATING PDF ----------------# +# Scan latex files where we defined structure of a document +# Define document (first page, ...) +tex.head <- scan( + "modules/mod_EVOLI/latexkosi/teamship_meter_head_dan.tex", + character(0), + sep = "\n", + quiet = TRUE, + encoding = 'UTF-8' + ) + +tex.text <- scan( + "modules/mod_EVOLI/latexkosi/teamship_meter_text_dan.tex", + character(0), + sep = "\n", + quiet = TRUE, + encoding = 'UTF-8' + ) + +# Organization name +tex.head <- gsub( + pattern = '!organisation!', + replacement = Hmisc::latexTranslate(organisation), + x = tex.head + ) + +# Date +tex.head <- gsub( + pattern = '!date!', + replacement = Hmisc::latexTranslate(date), + x = tex.head + ) + +# Organisation name +tex.head <- gsub( + pattern = 'COMPANY NAME', + replacement = Hmisc::latexTranslate(organisation), + x = tex.head, + fixed = TRUE + ) + +# Customer name +tex.head <- gsub( + pattern = '!name!', + replacement = Hmisc::latexTranslate(customer), + x = tex.head, + fixed = TRUE + ) + +# End latex document +tex.foot <- scan( + "modules/mod_EVOLI/latexkosi/foot.tex", + character(0), + sep = "\n", + quiet = TRUE + ) + +# Get working directory +Rdirektorij <- getwd() + +# Compiling file +tex.izbor <- c( + tex.head, + tex.meter_all_teams, + "\\vspace*{30px}", + "\\begin{center}", + organisation, + "\\end{center}", + table.tex, + "\\pagebreak", + "\\chapter[\\Large \\textbf{Resultater i teams}]{\\Large \\textbf{Teamship M\u00E5ler}}", + "\\begingroup\\let\\clearpage\\endgroup", + "\\chapter*{\\normalsize \\textbf{Resultater i teams}}", + Oddeleki.tmp, + "\\pagebreak", + "\\chapter[\\Large \\textbf{Team resultater for hver af de 15 Teamship-faktorer}]{\\Large \\textbf{Team resultater for faktorerne}}", + "\\begingroup\\let\\clearpage\\endgroup", + "\\chapter*{\\normalsize \\textbf{Team resultater for hver af de 15 Teamship-faktorer}}", + Lastnosti.tmp, + tex.text, + "\\end{document}" + ) + +# File folder +setwd(paste(Rdirektorij, "modules/mod_EVOLI/results", sep = "/")) + +# Name of tex file +cat(unlist(tex.izbor), file = paste0("Teamship-Meter-dan.tex"), sep = "\n") + +# Pdf file +tools::texi2pdf(file = paste0("Teamship-Meter-dan.tex"), + quiet = TRUE, + clean = TRUE) + +setwd(Rdirektorij) +#------------- GENERATING PDF ----------------# \ No newline at end of file diff --git a/admin/survey/modules/mod_EVOLI/R/my_functions_teamship_dan.R b/admin/survey/modules/mod_EVOLI/R/my_functions_teamship_dan.R new file mode 100644 index 000000000..8c03c4590 --- /dev/null +++ b/admin/survey/modules/mod_EVOLI/R/my_functions_teamship_dan.R @@ -0,0 +1,104 @@ + +#---------------- Load some useful functions ----------------# + +# Funkcija ?tevila z .5 zaokro?i navzgor +# Sprejme decimalno ?tevilo, vrne celo ?tevilo +# (glej "Sintaksa ankete Teamship 23072019 - FDV (1).xlsx") + +round2 = function(x) { + x <- round(x, 1) + + # Najprej rekodiramo rezultate kot ?eli stranka: glej xlsx file + x <- ifelse(x >= 4.9, 5, + ifelse(x >= 4.1 & x <= 4.8, 4, + ifelse(x >= 3.1 & x <= 4.0, 3, + ifelse(x >= 2.1 & x <= 3.0, 2, + ifelse(x >= 1.3 & x <= 2.0, 1, NA))))) + return(x) +} + + + +# Funkcija ?umnike nadomesti z ustreznimi unicode znaki za rabo na 1KA serverju +# Sprejme vektor, vrne popravljen vektor + +replace.characters <- function(vector.to.tidy){ + vector.to.tidy <- gsub("-", "", vector.to.tidy) + vector.to.tidy <- gsub(" ", "", vector.to.tidy) + vector.to.tidy <- gsub("\u010C", "C", vector.to.tidy) + vector.to.tidy <- gsub("\u0160", "S", vector.to.tidy) + vector.to.tidy <- gsub("\u017D", "Z", vector.to.tidy) + vector.to.tidy <- gsub("\u010D", "c", vector.to.tidy) + vector.to.tidy <- gsub("\u0161", "s", vector.to.tidy) + vector.to.tidy <- gsub("\u017E", "z", vector.to.tidy) + vector.to.tidy <- gsub("\u017E", "z", vector.to.tidy) + + vector.to.tidy <- gsub("[(\\...\\,)]", "", vector.to.tidy) + + return(vector.to.tidy) +} + + + +# Funkcija sprejme vektor in za ?-jem doda presledek +# Sprejme vektor, vrne popravljen vektor + +tidy.c.space <- function(vector.to.tidy){ + vector.to.tidy <- gsub("\u010C", "\u010C ", vector.to.tidy) + vector.to.tidy <- gsub("\u010D", "\u010D ", vector.to.tidy) + + return(vector.to.tidy) +} + + + +# Funkcija pripravi podatke za risanje grafa. Skalira podatke za faktor 5/4 +# Sprejme data frame in spremenljivko, vrne data frame (frekvence in odstotki) + +prep.dat <- function(df, variable) { + df <- round2(rowMeans(df[, variable], na.rm = TRUE) / 4 * 5) + df <- data.frame(prop.table(table(df)) * 100) + + names(df)[1] <- "Frequency" + names(df)[2] <- "Percentage" + + return(df) +} + + + +# Funkcija poimenuje stolpce v grafu za razvrstitev rezultatov +# Sprejme data frame in ?tevil?ne oznake, vrne opisne oznake + +labScore <- function(df, labelord) { + df$label <- ifelse(df$Frequency == 1, "Meget utilfredsstillende", + ifelse(df$Frequency == 2, "Utilfredsstillende", + ifelse(df$Frequency == 3, "Gennemsnitlig", + ifelse(df$Frequency == 4, "Meget tilfredsstillende", + ifelse(df$Frequency == 5, + "S\u00E6rdeles tilfredsstillende", NA))))) + + # Imena, po katerih bomo razvrstili stolpce v grafih + df$name <- labelord + + return(df) +} + + + +# Funkcija poimenuje stolpce v grafu za razvrstitev rezultatov +# Sprejme data frame in ?tevil?ne oznake, vrne opisne oznake + +las_labScore <- function(df) { + df$label <- ifelse(df$Frequency == 1, "Meget utilfredsstillende", + ifelse(df$Frequency == 2, "Utilfredsstillende", + ifelse(df$Frequency == 3, "Gennemsnitlig", + ifelse(df$Frequency == 4, "Meget tilfredsstillende", + ifelse(df$Frequency == 5, + "S\u00E6rdeles tilfredsstillende", NA))))) + + return(df) +} + + +#---------------- Load some useful functions ----------------# \ No newline at end of file diff --git a/admin/survey/modules/mod_EVOLI/latexkosi/logo/teamship_meter_dan.png b/admin/survey/modules/mod_EVOLI/latexkosi/logo/teamship_meter_dan.png new file mode 100644 index 000000000..c84785f3e Binary files /dev/null and b/admin/survey/modules/mod_EVOLI/latexkosi/logo/teamship_meter_dan.png differ diff --git a/admin/survey/modules/mod_EVOLI/latexkosi/teamship_meter_head_dan.tex b/admin/survey/modules/mod_EVOLI/latexkosi/teamship_meter_head_dan.tex new file mode 100644 index 000000000..fe10d22c6 --- /dev/null +++ b/admin/survey/modules/mod_EVOLI/latexkosi/teamship_meter_head_dan.tex @@ -0,0 +1,470 @@ +% Teamship Meter, English report + +% Packages and definitions +% Opredelitev dokumenta +\documentclass[11pt, a4paper]{report} +\usepackage[cm]{fullpage} +\setlength{\headheight}{12pt} + +% Opredelitev pisave +\usepackage[default,scale=0.95]{opensans} +\usepackage{arev} +\usepackage{textcomp} +\usepackage[danish]{babel} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\UseRawInputEncoding + + +% Slovenian characters +\catcode `č=13 +\def č{\v c} +\catcode `š=13 +\def š{\v s} +\catcode `ž=13 +\def ž{\v z} +\catcode `Č=13 +\def Č{\v C} +\catcode `Š=13 +\def Š{\v S} +\catcode `Ž=13 +\def Ž{\v Z} + + + +\usepackage{enumitem} % layout of list environments +\setlist{nolistsep} +\usepackage[normalem]{ulem} % allows line breaks and manual hyphenation within the underlined +\usepackage{etoolbox} +\usepackage[none]{hyphenat} % no hyphenation + +\usepackage{graphicx} +\usepackage[table,xcdraw]{xcolor} +\usepackage[skip=0pt]{caption} % minimum margin between figure titles +\captionsetup[figure]{labelformat=empty} % no "Figure" below a figure + +\usepackage{float} +\usepackage{multirow} +\usepackage{tikz} +\usetikzlibrary{shapes.multipart} +\usepackage{pifont} % pencil symbol below graphs + +% drawing boxes in legend or table environment +\newcommand*\circled[1]{\tikz[baseline=(char.base)] {\node[shape=circle,draw,inner sep=1pt] (char) {#1};}} +\newcommand{\mycbox}[1]{\tikz{\path[draw=#1,fill=#1] (0,0) rectangle (0.40cm,0.40cm);}} + +% chapter formatting +\usepackage{titlesec} +\titleformat{\chapter}[block]{\centering\Large\bfseries}{}{0pt}{\Large} % {format}{label}{sep} +\titlespacing*{\chapter}{0pt}{-13pt}{10pt} + +\renewcommand{\thechapter}{} % no numbering of chapters +\renewcommand\thesection{\Alph{section}} +\renewcommand\thesubsection{\thechapter.\arabic{subsection}} + +\makeatletter +\patchcmd{\l@chapter} + {\hfil} + {\leaders\hbox{\normalfont$\m@th\mkern \@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill} + {}{} +\makeatother + +\usepackage{array,calc} +\newcolumntype{A}[1]{>{\begin{minipage}{#1}\vspace{\tabcolsep}}l<{\vspace{\tabcolsep}\end{minipage}}} +\newenvironment{Complement}[1][0.75cm]{\hspace{#1}\begin{minipage}{\linewidth-#1}\hspace{-#1}\ignorespaces}{\end{minipage}} + +% hyperlinks +\usepackage{hyperref} +\hypersetup{ + colorlinks=true, + linkcolor=black, + urlcolor=black, + pdfstartview={XYZ null null 1}, + pdftitle={naslov!} +} +\urlstyle{same} + +% Custim collor url: last page +\newcommand{\MYhref}[3][blue]{\href{#2}{\color{#1}{#3}}}% + +\newcommand{\answerbox}[1][3\baselineskip]{% + \noindent\framebox[\linewidth]{% + \raisebox{0pt}[0pt][#1]{}% + }\par\medskip% +} + +% header and footer +\usepackage{fancyhdr} +\pagestyle{fancyplain} +\fancyhf{} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} + +\fancyhead[L] {\color{red} Teamship M{\aa}ler - !organisation!} +\fancyhead[R] {\textcopyright \hspace{1mm} 2020 - Claus M{\o}ller Consulting} +\fancyfoot[c]{\small{\thepage}} +\headsep 20pt + +% different footer on first page +\fancypagestyle{specialfooter}{% + \fancyhf{} + \renewcommand\headrulewidth{0pt} + \fancyfoot[c]{ \vspace{-1\baselineskip} \textcopyright \hspace{1mm} 2020 - Claus M{\o}ller Consulting .Alle rettigheder forbeholdes.} +} + +% table of contents +%\usepackage{tocloft} +\renewcommand{\contentsname}{Contents} % title +\setcounter{tocdepth}{0} % only chapters in table of contents +%\renewcommand\cftchapfont{\Large \bfseries} + + +% Body of this .tex file +\begin{document} + +\begin{titlepage} + \thispagestyle{specialfooter} + \begin{center} + \vspace*{-5.5\baselineskip} % Da bo slika na vrhu vertical space + \noindent\makebox[\textwidth]{\includegraphics[width=12cm]{../latexkosi/logo/teamship_meter_dan.png}}~\\[2.5cm] + + \hspace*{-2.3\baselineskip} \includegraphics[width=17cm]{../latexkosi/logo/logo_teamship.png}~\\[5.5cm] % horizontal space + \end{center} + + \hspace*{-2.5\baselineskip} \noindent\underline{\makebox[7in][l]{Organisation: !organisation!}} ~\\[0.5cm] + \hspace*{-1.3\baselineskip} \noindent\underline{\makebox[4in][l]{Date: !date!} \makebox[2.975in][l] {Consultant:}} ~\\[0.5cm] +\end{titlepage} + + +\cleardoublepage % ensure we're on an odd page + + +% PAGE 2 +\noindent\hspace{0.12\linewidth}\begin{minipage}{0.85\linewidth} +\begin{flushleft} +!name! \\ + +\bigskip \bigskip +Her er resultaterne for \textit{Teamship M{\aa}ler}testen som du lige har udf{\o}rt \\ + +\bigskip +Teamship M{\aa}ler er mere end et sæt m{\aa}leværkt{\o}jer. Det er ogs{\aa} et \\ +uddannelsesv{\ae}rkt{\o}j, brugbart til tr{\ae}ning af team medlemmer i alle teams. \\ + +\bigskip +Ved at anvende Teamship M{\aa}ler f{\aa}r teamet de følgende fordele: +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize} + \item Alle bliver klar over hvad der kr{\ae}ves for at v{\ae}re et godt teammedlem. + \item Alle bliver klar over hvad der kr{\ae}ves for at hele teamet pr{\ae}sterer. + \item Teamlederen bliver klar over hvad der kr{\ae}ves for at f{\aa} det bedste frem +i alle teammedlemmer og hvordan der skabes ekstraordin{\ae}re resultater med og \\ + gennem et "rigtig'' team. + \item The team leader can learn what it takes to enjoy respect from the other team members. + \item The team leader and the team will be able to monitor the progress and take corrective actions, if necessary. +\end{itemize} + +\bigskip +P{\aa} de f{\o}lgende sider f{\aa}r du en introduktion til Teamship M{\aa}ler. \\ +\vspace{3\baselineskip} +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.1\linewidth}\begin{minipage}[t]{0.1\textwidth} +\end{minipage} + +\vspace{2\baselineskip} + +\begingroup +\let\clearpage\endgroup +% a \clearpage will close the group and restore the meaning +\tableofcontents + +% PAGE 3 +\begin{center} +\chapter{\Large \textbf{Om CMC's Teamship M{\o}ler}} +\end{center} + +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\large \textbf{P{\aa} vej mod et vinderhold}} \\ + +\textit{Vinderhold best{\aa}r af succesrige individer der spiller sammen.} \\ + +En succesrig virksomhed kan beskrives som et \textit{team af vinderhold}. \\ + +\hspace*{0.8\baselineskip}For at en virksomhed kan f{\aa} succes m{\aa} hvert enkelt team i virksomheden være et vinderhold og de enkelte teams m{\aa} kunne samarbejde og st{\o}tte hinanden. \\ + +\hspace*{0.8\baselineskip}For at et hold kan blive et vinderhold m{\aa} de enkelte teammedlemmer have succes og de m{\aa} kunne samarbejde og st{\o}tte hinanden.\\ + +Et succesrigt team udviser \textit{Teamship}. \\ + +\hspace*{0.8\baselineskip}Teamship eksisterer n{\aa}r alle i teamet: +\renewcommand\labelitemi{\large$-$} +\begin{itemize} + \item \textbf{kan}, dvs. har de f{\ae}rdigheden og den viden der skal til + \item \textbf{vil}, dvs. samarbejder og yder deres bedste som individer og som teammedlemmer + \item \textbf{f{\aa}r lov}, i.e. bemyndiges til at tage ansvar og initiativ. +\end{itemize} + +\bigskip +Teamship handler om hvordan en virksomhed kan udvikle og fasthold Teamship samt skabe vinderhold, \textbf{{\ae}gte teams } -- ikke bare arbejdsgrupper. \\ + +\hspace*{0.8\baselineskip}\textit{Teamship er det der giver mange virksomheder et forspring i forhold til konkurrenterne.} \\ + +\bigskip +{\large \textbf{Teams inden for sport}} \\ + +Det er Claus M{\o}ller's erfaring og overbevisning at virksomheder kan hente en mængde inspiration fra sportsverdenen, n{\aa}r det g{\ae}lder effektivt holdarbejde. \\ + +Man kan lære en masse ved at se p{\aa} alle de forskellige sportsgrene der er baseret p{\aa} teams/hold -- hvad enten det er basketball, volleyball, hockey, cricket, baseball, rugby, h{\aa}ndbold, fodbold, kapsejlads eller roning. \\ + +\bigskip +Da fodbold er den mest udbredte holdsport i verden, har vi valgt at bruge denne sportsgren som det gennemg{\aa}ende eksempel. \\ + +\bigskip +Virksomheder ville opn{\aa} mere succes hvis virksomhedens ''hold'' var lige s{\aa} engagerede som fodboldhold. \\ +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.53\textwidth} +\begin{flushleft} + +{\large \textbf{Teamship bogen}} \\ + +Bogen giver b{\aa}de inspiration og praktisk hj{\ae}lp til virksomhedens ledelse, teamledere og \\ + -medlemmer til at sammens{\ae}tte og \\ udvikle vinderhold.\\ +Den giver forslag til, hvordan ''virksomheds-hold'' \\ +kan have gavn af at efterligne og indf{\o}re de træk \\ + der er karakteristiske for succesrige \\ fodboldhold. \\ + +\hspace*{0.8\baselineskip}Til implementering af disse forslag giver bogen \\ + 2 v{\ae}rkt{\o}jer der g{\aa}r h{\aa}nd i h{\aa}nd med \\ +Teamship M{\aa}ler: +\renewcommand\labelitemi{\large$-$} +\begin{itemize} +\item \textit{Kan/vil modellen} \\ Et v{\ae}rkt{\o}j til at sammens{\ae}tte vinderhold. +\item \textit{Teamship-politik} \\ Et v{\ae}rkt{\o}j til at forme Teamship-kulturen i virksomheder. +\end{itemize} + +\bigskip +Bogen er for alle: \\ + +\bigskip +\textbf{Teamledere} \\ + +Teamlederen kan f{\aa} inspiration og konkrete \\ + værkt{\o}jer til at: \\ +\renewcommand\labelitemi{\large$-$} +\begin{itemize} + \item skabe et effektivt team + \item sikre {\ae}gte holdf{\o}lelse + \item blive respekteret af alle teammedlemmer + \item opn{\aa} bedre resultater +\end{itemize} + +\bigskip +\textbf{Teammedlemmer} \\ + +Som teammedlemmer kan alle ansatte f{\aa} \\ + inspiration og hj{\ae}lp til at: +\renewcommand\labelitemi{\large$-$} +\begin{itemize} + \item præstere mere + \item forst{\aa} deres egen rolle som \\ teammedlemmer + \item have indstillingen: ''Jeg spiller, for at jeg selv \\ og teamet vinde'' + \item tage ansvar for teamets success og fiasko + \item f{\aa} bedre muligheder, indflydelse, karriere, afl{\o}nning, st{\o}rre anerkendelse -- og bedre livskvalitet. +\end{itemize} +\end{flushleft} +\end{minipage} + +%\newpage + +% PAGE 4 +\begin{center} +\chapter{\Large \textbf{15 Teamship-faktorer}} +\end{center} + +\begin{minipage}[t]{0.48\textwidth} +\begin{flushleft} +\textbf{Teamship-faktorer} \\ + +I mere end 40 {\aa}r har Claus M{\o}ller hjulpet virksomheder i alle brancher i mange forskellige kulturer overalt i verden med at skabe vinderhold ved at indf{\o}re Teamship. \\ + +\hspace*{0.8\baselineskip}Hans egen erfaring underst{\o}ttet af grundig forskning tyder p{\aa}, at vinderteams har et antal faktorer tilf{\ae}lles. \\ + +\hspace*{0.8\baselineskip}Claus M{\o}ller har identiferet 15 faktorer, som ser ud til at karakterisere de mest effektive teams. \\ + +\hspace*{0.8\baselineskip}Vi kalder disse karakteristika \textit{Teamship-faktorer}. \\ + +\bigskip +\textbf{Sådan skabes Teamship} \\ + +P{\aa} de f{\o}lgende sider behandles hver af de 15 Teamship-faktorer. \\ + +\hspace*{0.8\baselineskip}For hver faktor beskrives: \\ + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] + \item Hvordan vinder-fodboldhold ''spiller''. + \item Hvordan teams i virksomheder desv{\ae}rre alt for ofte ''spiller''. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} + +For hver faktor er det ogs{\aa} angivet, hvad teams i virksomheder kan g{\o}re for at indf{\o}re holdsportens {\aa}nd. I bogens kapitel En \textit{Teamship-politik} finds flere konkrete r{\aa}d. \\ +\bigskip +\textbf{Karakteristika ved vinderteams -- i fodbold og i virksomheder} \\ + +\bigskip +\begin{enumerate} + \item Alle teammedlemmer yder deres bedste + \item Alle identificerer sig med visionen + \item Succeskriterier er f{\ae}lles + \item Teamet er organiseret omkring succeskriterierne + \item Alle er villige til at forandre sig {\o}jeblikkeligt + \item Teamet kan overvinde forhindringer + \item Alle har faglige f{\ae}rdigheder + \item Alle har f{\ae}rdigheder i samspil + \item Teamet er et ''vi-team'' + \item Alle lærer og deler viden med hinanden + \item Teamet er et ''helt'' team + \item Teamlederen er synlig + \item Teamlederen hj{\ae}lper alle med at f{\aa} succes + \item Teamlederen nyder respekt + \item Gode pr{\ae}stationer bel{\o}nnes +\end{enumerate} + +\end{flushleft} +\end{minipage} + +\vspace{4\baselineskip} +\begin{center} + \begin{minipage}{0.7\linewidth} + \begin{flushleft} + På de følgende sider beskrives: + \renewcommand\labelitemi{\large$-$} + \begin{itemize} + \item vigtigheden af hver af de 15 Teamship-faktorer. + + \end{itemize} + \end{flushleft} + \end{minipage} +\end{center} + +\newpage + +% PAGE 5 +\chapter{\Large \textbf{S{\aa}dan anvendes v{\ae}rkt{\o}jet}} +\begin{center} +\begin{minipage}{0.83\linewidth} +\begin{center} + \vspace*{\baselineskip} + {\large \textbf{S{\aa}dan anvender den enkelte v{\ae}rkt{\o}jet}} +\end{center} + +\begin{flushleft} + \renewcommand\labelitemi{\large$\bullet$} + \begin{itemize} + \item Hvert teammedlem gennemg{\aa}r sin egen besvarelse af Teamship M{\aa}ler. Derved opn{\aa}s en bevidsthed om, p{\aa} hvilke omr{\aa}der teamkulturen efter den enkeltes opfattelse skal udvikles. + \item Ved at sammenligne egen besvarelse med det samlede teamresultat, kan hver enkelt se, hvordan hans/hendes vurdering er i forhold til kollegernes vurdering. + \item Med denne nye indsigt kan den enkelte bedre bidrage til at udvikle team-kulturen. + \end{itemize} + + \bigskip + \begin{center} + {\large \textbf{S{\aa}dan anvender virksomheden v{\ae}rkt{\o}jet}} + \end{center} + + \begin{itemize} + \item Teamship M{\aa}ler anvendes af alle teams i virksomheden. Resultaterne fra de forskellige teams sammenlignes og diskuteres for at opn{\aa} forbedringer i hele virksomheden p{\aa} baggrund af de bedste resultater (''benchmarking''). + \item Topledelsen kan anvende værkt{\o}jet til at identificere de teams, der tr{\ae}nger til hj{\ae}lp, eller teams, som hele virksomheden kan l{\ae}re noget af. + \item Man kan f{\aa} et indtryk af hele virksomhedens st{\ae}rke og svage sider ved at se p{\aa} de omr{\aa}der, hvor alle teams stort set f{\aa}r samme vurdering. + \item Hvis et teams resultater for en eller flere faktorer afviger v{\ae}sentligt fra alle andre teams resultater, f{\aa}r man et indtryk af dette teams s{\ae}rpr{\ae}g. + \item Teamship M{\aa}ler b{\o}r anvendes af alle teams mindst en gang om {\aa}ret og i forbindelse med organisations{\ae}ndringer. + \end{itemize} + +\end{flushleft} +\end{minipage} +\end{center} + +%\newpage + +% PAGE 6 + +\begin{center} +\chapter{\Large Hvad viser graferne?} +\end{center} +\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +De ansatte har vurderet omr{\aa}derne p{\aa} en skala fra 1 til 5.\\ + +\centerline{\includegraphics[width=6cm]{../latexkosi/logo/legend_description_dan.png}}~\\[0cm] + +Graferne viser svarenes fordeling i procent. \\ +Teamet vurderer det samlede team resultat af Teamship M{\aa}ler. \\ + +\bigskip +En god tommelfingerregel er, at forbedringer skal foretages inden for en enkelt faktor hvis: +\renewcommand\labelitemi{\large$-$} +\begin{itemize} + \item \textbf{mere end 20 \%} af de ansatte har svaret 'Utilfredsstillende' eller 'Meget utilfredsstillender', eller/og + \item \textbf{mindre end 50 \%} af de ansatte har svaret 'S{\ae}rdeles tilfredsstillende' eller 'Meget tilfredsstillende'. +\end{itemize} +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} + +\textbf{\large S{\aa}dan anvender teamet v{\ae}rkt{\o}jet} +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item Alle teammedlemmer kan blive bedt om at \\ + give en karakter for hvert enkelt udsagn inden \\ + for de faktorer, hvor der skal ske forbedringer, \\ + og dermed foretage en mere grundig \\ + vurdering. \bigskip +\item Det samlede resultat af Teamship M{\aa}ler \\ + diskuteres grundigt p{\aa} et m{\o}de for alle \\ +teammedlemmer. M{\o}det skal munde ud i en \\ + konkret plan for udvikling og forbedring \\ + af teamkulturen. Denne plan \\ +skal med mellemrum justeres p{\aa} \\ + teamm{\o}der. \bigskip +\item I afsnittet af om ''Gode r{\aa}d'', er der for hver \\ +faktor givet nogle anbefalinger til hvordan \\ + teamet kan komme fra det nuv{\ae}rende til \\ +det ideale præstationsniveau -- og \\ +dermed forme Teamship-kulturen. +\end{itemize} + +\end{flushleft} +\end{minipage} + + + +\newpage + +\begin{center} +\LARGE\textbf{COMPANY NAME} +\end{center} + + +\begingroup % chapter on same page. Remove pagebreak after a chapter (Only for one chapter!) +\renewcommand{\cleardoublepage}{} +\renewcommand{\clearpage}{} +\chapter{\Large \textbf{Teamship-faktorer}} +\endgroup + + +% \end{document} \ No newline at end of file diff --git a/admin/survey/modules/mod_EVOLI/latexkosi/teamship_meter_text_dan.tex b/admin/survey/modules/mod_EVOLI/latexkosi/teamship_meter_text_dan.tex new file mode 100644 index 000000000..ed59ef63c --- /dev/null +++ b/admin/survey/modules/mod_EVOLI/latexkosi/teamship_meter_text_dan.tex @@ -0,0 +1,899 @@ + +% PAGE 10 +\begin{center} +\chapter{\Large \textbf{Karakteristika ved teams der udviser Teamship}} +\end{center} + +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\textbf{1. Alle teammedlemmer yder deres bedste}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item I vores team yder alle deres bedste -- hver eneste dag. +\item Vi f{\o}ler alle et ''ejerskab'' for vores egne og teamets successer og fiaskoer. N{\aa}r vi vinder, vinder vi alle. N{\aa}r vi taber, taber vi alle. +\item Alle er engagerede i deres arbejde med hjerne og hjerte. +\item Alle arbejder h{\aa}rdt for at leve op til de krav og forventninger der stilles til teamet af omgivelserne og af teammedlemmerne selv. +\item Uden for teamets ''fire v{\ae}gge'' taler vi p{\ae}nt om vores team. +\item Vi er alle stolte af at v{\ae}re medlemmer af vores team. +\item Vi forsvarer alle teamet mod angreb. +\item Vi venter ikke p{\aa} at andre skal stille os opgaver -- vi er ''selvstartere''. +\item Det forventes og accepteres at alle kommer med ideer og forslag til forbedringer. +\item Vi er alle aktive ''spillere'' i stedet for passive ''tilskuere''. +\item Vores arbejdsplads er karakteriseret af sammenhold, entusiasme, og en ægte kamp{\aa}nd for at opn{\aa} succes. +\item Hvis et teammedlem ikke kan eller vil yde sit bedste, forventes og accepteres det af alle at han/hun s{\ae}ttes af teamet. +\end{itemize} + +\bigskip +{\textbf{2. Alle identificerer sig med visionen}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Teamet har en vision: Et st{\o}rre, v{\ae}rdifuldt, ambiti{\o}st, langsigtet m{\aa}l, klart beskrevet som en ønsket situation opn{\aa}et p{\aa} et bestemt tidspunkt. +\item Visionen kommunikeres til os alle p{\aa} en s{\aa}dan m{\aa}de at vi kender den og forst{\aa}r den. +\item Visionen er tilstr{\ae}kkelig ambiti{\o}s og betydningsfuld til at vi alle kan bidrage til dens gennemf{\o}relse. +\item Alle teammedlemmer opfordres til at bidrage til visionens formulering. +\item Alle identificerer sig med visionen. +\item Visionen gennemsyrer dagligdagen i teamet, giver energi og skaber ''{\ae}gte'' kamp{\aa}nd for at opn{\aa} succes. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\textbf{3. Succeskriterier er f{\ae}lles}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Teamets succeskriterier forst{\aa}s og accepteres \\ af alle. +\item Succeskriterierne er en integreret del af \\ teamets dagligdag. +\item I vores team er der fuldst{\ae}ndig overensstemmelse mellem teamets og de \\ + enkelte teammedlemmers succeskriterier. \\ +Hvert enkelt teammedlems succes bidrager \\ +til hele teamets succes og omvendt. +\item Vores pr{\ae}stationer er samordnede. Vi tr{\ae}kker alle i samme retning. +\item Vi sammenholder vores pr{\ae}stationer og fremskridt med vores succeskriterier. +\item Vores succeskriterier vurderes regelm{\ae}ssigt \\ + og ajourf{\o}res n{\aa}r det er n{\o}dvendigt. +\item Alle teammedlemmer opfordres til at bidrage \\ +ved fastl{\ae}ggelsen og ajourf{\o}ringen af \\ + succeskriterierne. +\end{itemize} + +\bigskip +{\textbf{4. Teamet er organiseret omkring succeskriterierne}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item I vores team er vi organiseret direkte omkring vores succeskriterier -- i stedet for at v{\ae}re organiseret omkring traditionelle funktioner. +\item Vi bruger alle vores tid og energi p{\aa} at skabe merv{\ae}rdi og succes for teamet. +\item Alle teammedlemmer har et klart billede af \\ +deres rolle i teamet og ved hvad der forventes \\ + af dem. +\item Vi bruger ingen eller meget lidt energi p{\aa} \\ politik og territorieafm{\ae}rkning. +\item Der er ingen h{\ae}mmende regler eller forordninger og intet overdrevet bureaukrati \\ + der forhindrer os i at g{\o}re de rigtige ting -- de \\ + ting der skaber merv{\ae}rdi. +\item Vi yder service til vores eksterne og interne kunder i stedet for vores eget hierarki. +\item Vi ser mere p{\aa} den proces der skal til for at \\ + skabe resultater end p{\aa} selve \\ + resultaterne. +\end{itemize} + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 11 +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\textbf{5. Alle er villige til at forandre sig {\o}jeblikkeligt}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item I vores team b{\aa}de kan og vil hvert teammedlem {\ae}ndre taktik og adf{\ae}rd p{\aa} et {\o}jeblik n{\aa}r det er n{\o}dvendigt. +\item Hvert teammedlem kan let tilpasse sig nye situationer og nye forhold. +\item Fleksibilitet forventes og udvises af alle. +\item Vi forventer alle det uventede. N{\aa}r det uventede sker pr{\o}ver vi at f{\aa} det bedste ud af den nye situation. +\item Ingen t{\ae}nker eller siger: ''Det er jeg ikke ansat til'' eller ''Det st{\aa}r der ikke i min stillingsbeskrivelse. +\end{itemize} + +\bigskip +{\textbf{6. Teamet kan overvinde hindringer}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item N{\aa}r vi st{\aa}r over for en forhindring p{\aa} vej mod m{\aa}let, kan vores team mobilisere den n{\o}dvendige energi til at l{\o}se problemet. +\item N{\aa}r der opst{\aa}r et problem tager vores team h{\aa}nd om det. Vores team f{\o}ler sig ansvarlig for at finde en l{\o}sning. Vi skubber ikke problemet over p{\aa} andre -- vi l{\o}ser det. +\item N{\aa}r vi kommer ud for problemer, forhindringer og konflikter n{\o}jes vi ikke med at tale om dem -- vi g{\o}r noget ved dem. +\item Vi er alle bemyndigede til at tage de n{\o}dvendige beslutninger for at l{\o}se problemerne n{\aa}r og hvor de m{\aa}tte opst{\aa}. +\item Vi registrerer alle sammen de sm{\aa} signaler der peger p{\aa} at et problem er ved at opst{\aa}. Vi forudser eventuelle forhindringer. +\item Vi analyserer alle problemer. Vi foregriber fremtidige problemer ved at arbejde med {\aa}rsagerne i stedet for symptomerne. +\item N{\aa}r vi ser en mulighed for udvikling i forl{\o}bet handler vi {\o}jeblikkelig for at f{\aa} udbytte af den. +\item N{\aa}r vi st{\aa}r over for problemer som virker vanskelige eller umulige at l{\o}se fors{\o}ger vi at se mulighederne i stedet for problemerne i ''krisen''. +\item Vi har en v{\ae}rkt{\o}jskasse med almindelige probleml{\o}sningsmetoder og kreativitetsteknikker som vi kan v{\ae}lge blandt. +\item Vi l{\o}ser problemer b{\aa}de individuelt og gennem teamwork. +\item Vi lader ikke bureaukratiet og formaliteterne forhindre os i at handle n{\aa}r det er n{\o}dvendigt. Vi bruger vores sunde fornuft som hovedregel. Hvis en eksisterende regel ikke passer til en given situation -- bryder vi den. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\textbf{7. Alle har faglige f{\ae}rdigheder}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Vi er alle i stand til at udf{\o}re vores arbejdsopgaver professionelt. +\item Vi har alle den n{\o}dvendige uddannelse og \\ tr{\ae}ning. +\item Vi har alle tilstr{\ae}kkelig erfaring. +\item Vi har allesammen de n{\o}dvendige \\ f{\ae}rdigheder. +\item I vores team f{\o}lger vi princippet om multifunktionelle ansatte. Alle har mere \\ + end en f{\ae}rdighed/specialitet og kan \\ + udfylde mere end én rolle. +\item Alle teammedlemmer kan arbejde i andre \\ + teams I virksomheden og p{\aa} \\ + tv{\ae}rs af faggr{\ae}nserne. +\end{itemize} + +\bigskip +{\textbf{8. Alle har f{\ae}rdigheder i samspil}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Vi er gode til teamwork. Vi samarbejder og ''spiller'' godt sammen. +\item Vi ser alle vores opgaver og aktiviteter som elementer i en proces. +\item Hvert teammedlem interesserer sig for \\ + andre teammedlemmers specielle \\ + f{\ae}rdigheder. +\item Alle kender deres egne styrker og \\ +svagheder og udnytter denne \\ + viden til at styrke arbejdsprocessen. +\item Alle forst{\aa}r arbejdsgangen og systemet \\ bag. +\item Alle kan overdrage en opgave p{\aa} en m{\aa}de,\\ + s{\aa} processen k{\o}rer videre \\ + uforstyrret. +\item Alle kommunikerer l{\o}bende med de andre teammedlemmer. De lytter, stiller \\ + sp{\o}rgsm{\aa}l, giver oplysninger, \\ +afstemmer den f{\ae}lles forst{\aa}else osv. +\item Vi ved alle, hvorn{\aa}r i processen der er \\ +brug for vores bidrag. +\item Alle teammedlemmer ved hvorn{\aa}r det er \\ + det rigtige tidspunkt at involvere \\ + andre teammedlemmer i \\ arbejdsprocessen. +\end{itemize} + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 12 +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\textbf{9. Teamet er et ''vi-team''}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Vores team er et ''vi-team'' og ikke et ''mig-team''. +\item Alle teammedlemmer st{\aa}r sammen for at vinde. +\item Vi har ingen konkurrenter eller ”fjender” inden for vores egen virksomhed. Vi har ingen interne stridigheder mellem teammedlemmerne. +\item Ingen vinder p{\aa} bekostning af teamet eller et andet teammedlem. +\item Hvert teammedlem viser bet{\ae}nksomhed og respekt for de andre teammedlemmer. +\item Vi giver hinanden konstruktiv kritik -- inden for teamets ''fire v{\ae}gge''. +\item Vi kan v{\ae}re uenige og diskutere. Alle siger deres mening. Men n{\aa}r en beslutning er endeligt truffet, er vi loyale over for den, ogs{\aa} selv om vi ikke er helt enige. +\item Vi respekterer hinanden, selv om vi er uenige. +\item Alle spiller for, at de selv og teamet vinder. Ingen spiller for sig selv p{\aa} bekostning af teamet. +\end{itemize} + +\bigskip +{\textbf{10. Alle l{\ae}rer og deler viden med hinanden}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Vi bruger hinandens f{\ae}rdigheder og viden og l{\ae}rer af hinanden hele tiden. +\item Alle deler deres viden, erfaring og f{\ae}rdigheder med andre. +\item Vi f{\o}ler os ansvarlige for b{\aa}de vores egen og teamets udvikling. +\item Vi arrangerer kurser for alle teammedlemmerne for at udvikle deres f{\ae}rdigheder og viden, b{\aa}de som specialister og generalister. +\item Nye teammedlemmer opmuntres til at dele deres viden og f{\o}rsteh{\aa}ndsindtryk. De opmuntres til at stille sp{\o}rgsm{\aa}l ved teamets etablerede rutiner og vaner. +\item N{\aa}r et teammedlem har deltaget i et kursus, en udstilling osv., vil andre i teamet f{\aa} gl{\ae}de af den nyerhvervede viden. Der afs{\ae}ttes tid til, at ''kursusdeltageren'' kan dele det l{\ae}rte med andre. +\item Vi opmuntrer alle til at interessere sig for andre teammedlemmers arbejde og at dele viden om deres arbejde med andre. +\item Ideer og kreative forbedringsforslag fra alle teammedlemmer forventes og v{\ae}rds{\ae}ttes. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + + +\bigskip +{\textbf{11. Teamet er et ''helt'' team}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item I vores team har vi mennesker med \\ + forskellige baggrunde med hensyn \\ + til alder, erfaring, uddannelse, k{\o}n osv. +\item I vores team har vi komplement{\ae}re \\ +f{\ae}rdigheder, dvs. det enkelte \\ + teammedlems specielle f{\ae}rdigheder \\ + supplerer de andre \\ + teammedlemmers specielle \\ + f{\ae}rdigheder. +\item Sammen besidder vi alle de f{\ae}rdigheder, \\ +der skal til for at opfylde de \\ + krav og forventninger, der \\ +stilles til hele teamet -- b{\aa}de \\ + hvad ang{\aa}r professionelle \\ + og generelle f{\ae}rdigheder. +\item Vores team har mennesker, som kan \\ + producere -- som g{\o}r noget \\ + i stedet for bare at tale \\ + om det. +\item Vores team har mennesker, som kan administrere -- planl{\ae}gge, koordinere, \\ + styre, kontrollere og f{\o}lge op. +\item Vores team har mennesker, som kan \\ +forny -- f{\aa} nye ideer og skabe\\ + forandring. +\item Vores team har mennesker, som kan \\ + integrere -- f{\aa} mennesker til at arbejde \\ + sammen og tr{\ae}kke i samme \\ + retning. + + +\end{itemize} + +\bigskip +{\textbf{12. Teamlederen er synlig}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Vores teamleder er ogs{\aa} et teammedlem. +\item Vores teamleder er yderst synlig. \\ +Vores teamleder deltager i og \\ + er engageret i teamets og \\ + det enkelte teammedlems succes. +\item Vores teamleder ved, hvad der sker i ''fingerspidserne'' af vores team. +\item Vores teamleder viser interesse i hvert teammedlems pr{\ae}stationer. +\item Vores teamleder bliver ved med at v{\ae}re involveret i at f{\o}lge forl{\o}bet i de projekter, \\ +som han/hun har sat i gang. +\item Anerkendelse og kritik af teamet og teammedlemmerne baseres p{\aa} \\ + teamlederens egne oplevelser -- ikke p{\aa}\\ + andenh{\aa}nds viden. +\item Vores teamleder deltager sammen med \\ + teamet i de f{\ae}lles aktiviteter: \\ +tr{\ae}ning, festligheder, selskaber \\ +og sport. +\end{itemize} + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 13 +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +{\textbf{13. Teamlederen hj{\ae}lper alle med at f{\aa} succes}} \\ + +Vores teamleder: +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item er ikke bare villig til at lade os f{\aa} ansvar. Vores teamleder opmuntrer os til at tage ansvar. +\item hj{\ae}lper alle teammedlemmer med at opn{\aa} og str{\ae}be efter succes. +\item st{\o}tter vores team og dets medlemmer. +\item opmuntrer os til at betjene vores interne og eksterne kunder -- i stedet for at yde service til teamlederen og hierarkiet. +\item fokuserer mere p{\aa} vores styrker end p{\aa} vores svagheder. +\item irettes{\ae}tter os p{\aa} en s{\aa}dan m{\aa}de, at vi kan beholde vores selvrespekt. +\item fokuserer p{\aa} teamets og dets medlemmers succes -- i stedet for p{\aa} sin egen succes, position, rang og vinding. +\item forventer og accepterer ideer fra os -- og f{\o}rer ikke bare sine egne ideer frem. +\item inspirerer os til at yde vores bedste og g{\o}re fuldt brug af vores viden og talenter. +\end{itemize} + +\bigskip +{\textbf{14. Teamlederen nyder respekt}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Vores team er succesrigt og vores teamleder bidrager i h{\o}j grad til vores succes. +\item Vi respekterer vores teamleder for hans/hendes faglige f{\ae}rdigheder. Vores ledere ved, hvad det drejer sig om. +\item Vi respekterer vores teamleder for hans/hendes menneskelige evner. +\end{itemize} + +\bigskip +Vores teamleder: +\begin{itemize}[leftmargin=*] +\item har integritet. +\item giver os {\aa}ben og {\ae}rlig information. +\item forsvarer os imod angreb. + +\item svigter aldrig et teammedlem for at redde sit eget skind. +\item omtaler os positivt uden for teamet og kommer kun med konstruktiv kritik inden for teamets ''fire v{\ae}gge''. +\item tager aldrig {\ae}ren for andres resultater og ideer. +\item tager selv skylden for manglende succes i stedet for at skyde skylden p{\aa} andre. +\item opmuntrer og st{\o}tter samarbejdet med andre teams og teamledere. +\end{itemize} +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} + +\bigskip +{\textbf{15. Gode pr{\ae}stationer bel{\o}nnes}} + +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item Anerkendelse/irettes{\ae}ttelser af hele \\ + teamet og af de enkelte teammedlemmer \\ + f{\o}lger det samme regels{\ae}t, dvs. \\ +de gives konsekvent p{\aa} grundlag \\ +af samme indstilling, adf{\ae}rd \\ + og pr{\ae}stationer. +\item Vores teamleder kender og f{\o}lger reglen:\\ + ''Det der bel{\o}nnes, bliver gjort''. +\item Alle i vores team f{\aa}r anerkendelse for \\ + gode individuelle pr{\ae}stationer -- inklusive \\ + dem, hvis pr{\ae}stationer ikke \\ + er umiddelbart synlige. +\item Alle f{\aa}r anerkendelse for deres bidrag \\ +til teamets og virksomhedens succes. +\item Alle teammedlemmer, der b{\aa}de kan og vil, tilbydes mere ansvar, handlefrihed og nye udfordringer. +\item Personlig udvikling tilskyndes, anerkendes \\ + og opmuntres. +\item Alle giver anerkendelse til andre teammedlemmer for gode pr{\ae}stationer. +\end{itemize} + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 14 +\begin{center} + +\begin{minipage}{0.87\linewidth} + +\chapter{\Large \textbf{How to shape the Teamship culture}} + +\begin{flushleft} +In order to create, maintain and develop a Teamship culture we strongly recommend using the Teamship booklet as your source of inspiration and two other tools: + +\vspace{1.5\baselineskip} +\noindent\hspace{0.3\linewidth}\begin{minipage}{0.7\linewidth} +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize} +\item Can/will model +\item Teamship policy +\end{itemize} +\end{minipage} + +\bigskip \bigskip +\begin{center} +{\large \textbf{Can/will model}} \\ +\textbf{A tool to put together a winning team} +\end{center} + +It takes competent players and a competent coach to create a winning team -- a competent team. The Can/will model can be used to analyse the capability of the individual team member and select the right ones for the team. \\ + +\bigskip +Read more about the Can/will model in the \textit{Teamship} booklet. + +\bigskip \bigskip +\begin{center} +{\large \textbf{Teamship policy}} \\ +\textbf{A tool to shape the Teamship culture in organisations} +\end{center} + +In order to implement and sustain a Teamship culture it is vital to communicate to all team members in all teams what is understood by Teamship in the organisation and in each team. \\ + +\bigskip +The special attitudes and sets of behaviour which together form the Teamship culture have to be clearly phrased and shared by everyone in the team. Teamship has to be discussed over and over again among team members in all teams. \\ + +\bigskip +We recommend all organisations to have a Teamship policy as a part of the overall company policies. This policy should describes the framework, rules and guidelines to be adhered to by everyone. \\ + +\bigskip +The Teamship policy should be phrased in such a way that it makes sense and is valid for the entire organisation -- the team of teams -- as well as for each team. \\ + +\end{flushleft} +\end{minipage} +\end{center} + +\newpage + +% PAGE 15 +\begin{center} +{\Large \textbf{Good advice on shaping the Teamship culture}} +\end{center} + +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} +If the team scored unsatisfactorily in one or more of the Teamship factors, the following good advice can be used as an inspiration to improve the situation. \\ + +\bigskip +{\large \textbf{1. Each team member brings out their best }} \\ + +\bigskip +\textbf{Closing the commitment gap} \\ + +People tend to perform at their best as team members when: +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item they have a high degree of self--esteem +\item they feel that what they do is meaningful +\item they know what is expected from them +\item their contributions are appreciated, made visible and rewarded +\item they are supported +\item they are faced with demands +\item they are allowed to do what they are willing and capable of doing +\item they are frequently informed and invited to participate in a real dialogue +\item they are treated with respect +\item they are currently inspired to improve and break the limits. +\end{itemize} +To close a commitment gap or an "ownership gap" is a very complex task, because there are several reasons for the gap. \\ + +\hspace*{0.8\baselineskip}Commitment as well as ownership attitude and behaviour depend very much on how well the team adheres to the Teamship policy related to the following 14 Teamship factors. These factors touch most of the issues decisive for an individual's commitment and sense of ownership. \\ + +\bigskip +\textit{Read more about commitment and ownership in the books Be a Double Bagger (The chapter Single bagger or double bagger?), My Life Tree (chapter 2, How do I look at life?) and Employeeship (The entire book is about how to mobilise everyone's energy and commitment).} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} +{\large \textbf{2. Everyone identifies with the vision }} \\ + +\bigskip +\textbf{Making everyone identify with the vision} \\ + +Claus M{\o}ller recommends to follow these guidelines: + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\renewcommand\labelitemii{\large$-$} +\begin{itemize}[leftmargin=*] +\item Make sure that the vision is a real vision: \bigskip + +\begin{itemize}[leftmargin=*] +\item that it clearly describes a desirable state +\item that it has a deadline +\item that it is both compelling, challenging and realistic +\item that it is meaningful and worthwhile to all team members +\item that it appeals to both heart and mind. +\end{itemize} + +\bigskip +\item Make sure that the vision is effectively marketed in the organisation and in each team: \bigskip + +\begin{itemize}[leftmargin=*] +\item that it is communicated again and again +\item that everyone is given a chance to match and adjust their understanding of the vision +\item that each team and each team member get help to break down the vision into small operational components +\item that it is clear what the team and the team members can do to make the vision come true +\item that everyone is invited to contribute to the creation of the vision. +\end{itemize} + +\bigskip +\item Create a new vision when the old one is coming true. This should be done to anticipate the almost inevitable \textit{energy drop} which occurs after a big success. +\end{itemize} + +\bigskip +\textit{Read more about goal setting in the book Time Manager -- the Key to Personal Effectiveness and about personal goals in the book My Life Tree (Chapter 6).} \\ + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 16 +\begin{minipage}[t]{0.5\textwidth} +\begin{flushleft} +{\large \textbf{3. Success criteria are shared}} \\ + +\bigskip +\textbf{Sharing and aligning success criteria} \\ + +Establish clear success criteria. Make sure that they are understood and accepted by all team members. Put them on paper. \\ + +Bring about an ongoing dialogue concerning: +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item the main purpose of the team +\item the contribution of each team member +\item how to measure individual success and team success +\item how to avoid conflicts between the team goal and the goals of the team members +\item how to ensure that all contributions are aligned and everyone pulls in the same direction +\item how to avoid conflicts between teams. +\end{itemize} + +\bigskip +{\large \textbf{4. The team is organised around its success criteria}} \\ + +\bigskip +\textbf{Getting organised for success} \\ + +Have a clear picture of the goal and the tasks. Describe the processes which lead to team success and organise the team around them. \\ + +Make sure that everybody knows their own role in the process. Discuss between the team members: +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item How to maximise the time and energy spent on value adding activities. +\item How to avoid wasting time on inappropriate activities. +\item How to minimise restricting rules and excessive bureaucracy. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +{\large \textbf{5. Everyone is willing to change instantly.}} \\ + +\bigskip +\textbf{Closing the flexibility gap} \\ + +Communicate clearly and often that willingness to change is expected from everyone. Reward flexible behaviour and willingness to change. \\ + +\hspace*{0.8\baselineskip}Test the flexibility and change willingness of team members prior to engagement. \\ + +\hspace*{0.8\baselineskip}Discuss how the team and each team member can be prepared to "expect the unexpected". \\ + +\hspace*{0.8\baselineskip}Build flexibility into any job description. \\ + +\hspace*{0.8\baselineskip}Discuss how the team and its members can embrace change and make it a natural part of their daily lives. \\ + +\hspace*{0.8\baselineskip}Provide adequate balance between what is stable and what should be flexible in order for people to feel that it is safe to change. \\ + +\bigskip +\textit{Read more about change in the book Employeeship (Epilogue, p. 183 -- 197).} \\ + +\vspace{1.5\baselineskip} +{\large \textbf{6. The team can overcome obstacles}} \\ + +\bigskip +\textbf{Overcoming obstacles} \\ + +Communicate clearly and often that all team members are expected to try everything to remove any obstacle on the way towards the goal. \\ + +\hspace*{0.8\baselineskip}Identify frequently occurring obstacles and establish ways of overcoming them. Inspire everyone to solve the problems rather than talking about them. At team meetings discuss: +\renewcommand\labelitemi{\large$-$} +\begin{itemize}[leftmargin=*] +\item How we can learn from our mistakes and avoid repeating them. +\item How we can register signals indicating that an obstacle is coming up. +\item How we can solve problems both through individual effort and teamwork. +\end{itemize} +Create a \textit{tool box} of methods and creativity techniques to anticipate, prevent, and deal with obstacles -- and to implement decision. \\ + +\bigskip +\textit{Read more about how to implement and overcome obstacles in the book Employeeship (The chapter on Initiative, p. 64-75 and the chapter on Implementation p. 108-123). The Practical Manager itself is an implementation tool.} \\ + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 17 +\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +{\large \textbf{7. Everyone possesses professional skills}} \\ + +\bigskip +\textbf{Developing professional skills and multifunctionality} \\ + +\hspace*{0.8\baselineskip}Define clearly the professional demands put on each team member in terms of training, experience and skills. Assess currently how well the demands are met by each team member. Make a development plan for each team member which keeps them on the desired level of competence. \\ + +\hspace*{0.8\baselineskip}Promote multi--functionality through job rotation and other initiatives. When engaging new team members try to get people who are capable and willing to perform more than one type of job. \\ + +\hspace*{0.8\baselineskip}Train all team members to become multifunctional.\\ + +\bigskip +\textit{Read more about multifunctionality in the book Employeeship (p.166-167).} \\ + +\bigskip +{\large \textbf{8. Everyone has relational skills}} \\ + +\bigskip +\textbf{Developing relational skills} \\ + +\hspace*{0.8\baselineskip}Define clearly what is understood by real teamwork. Emphasise frequently the importance of real teamwork. Allocate time for team members to practise teamwork and to get to know each other personally and professionally. \\ + +\hspace*{0.8\baselineskip}Develop these four kinds of relational skills: \\ + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item \textbf{Game comprehension:} Ability to comprehend, evaluate, decide and act in a specific situation based on a full understanding of the nature of the game and the work processes and systems behind it. +\item \textbf{Passing skills:} Ability to pass on, respectively receive a task in such a way that the work process flows on smoothly. +\item \textbf{Communication skills:} Ability to read signals from as well as send clear signals to other team members in order to advance the work process. +\item \textbf{People skills:} Ability to improve interpersonal relations and promote real teamwork. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +{\large \textbf{9. The team is a "we team"}} \\ + +\bigskip +\textbf{Developing a "we culture"} \\ + +\hspace*{0.8\baselineskip}Define clearly the characteristics of a "we" culture and a "we" team. Stress the importance of everyone playing for themselves and for their team. Do not allow anyone to win at the expense of the team or a team mate. \\ + +\hspace*{0.8\baselineskip}Promote the notion that the organisation is a team of teams. Break down all barriers between departments, functions and hierarchical levels. Avoid using the words we and them in the meaning "we against them". Demonstrate that we means all of us: Management and staff, team leader and team members. \\ + +\hspace*{0.8\baselineskip}Encourage all team members to come up with constructive criticism within the privacy of the team and to speak positively about the team when outside the team. \\ + +\bigskip +\textit{Read more about how to create a "we culture" in the book Employeeship (p. 140-145).} + +\bigskip +{\large \textbf{10. Everyone learns and shares}} \\ + +\bigskip +\textbf{Shaping the learning culture} \\ + +\hspace*{0.8\baselineskip}Define the characteristics of a true learning organisation and team. \\ + +\hspace*{0.8\baselineskip}Establish practices and routines for learning and knowledge sharing: \textit{Learn to learn.} Use adequate information technology. \\ + +\hspace*{0.8\baselineskip}Organise training courses for all team members to develop their skills and knowledge as specialists as well as generalists. \\ + +\hspace*{0.8\baselineskip}Encourage new team members to share their knowledge and first--hand impressions. Ask them to question the established routines and habits of the organisation and the team. \\ + +\hspace*{0.8\baselineskip}Whenever a team member has attended a course, an exhibition etc. or gained new knowledge in other ways, let the other in the team benefit from this new found knowledge. Allocate time to share. \\ + +\hspace*{0.8\baselineskip}Encourage everybody to take responsibility for their own development and that of the team and the organisation. \\ + +\hspace*{0.8\baselineskip}Let everyone learn and share with both people inside and outside the team/organisation. \\ + +\textit{Read more about the principles of the learning organisation in the book Employeeship (p. 168-171).} + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 18 +\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +{\large \textbf{11. The team is a "whole team"}} \\ + +\bigskip +\textbf{Creating "whole" teams} \\ + +\hspace*{0.8\baselineskip}Make teams of people with different backgrounds, in terms of age, experience, education, sex, etc. \\ + +\hspace*{0.8\baselineskip}Make sure that each team has members with complementary skills: \\ + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item People who can \textbf{produce} -- do it, instead of just talking about it. +\item People who can \textbf{administrate} -- plan, coordinate, monitor, control and follow up. +\item People who can \textbf{innovate} -- come up with new ideas and provoke change. +\item People who can \textbf{integrate} -- encourage people to work together and pull in the same direction. +\end{itemize} + +\bigskip +{\large \textbf{12. The team leader is visible}} \\ + +\bigskip +\textbf{Making team leaders visible} \\ + +\hspace*{0.8\baselineskip}The following principles should be adhered to by the team leader: \\ + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item Show an interest in each team member's performance. +\item Be visibly involved in keeping the momentum of all projects you have initiated. +\item Base your recognition and criticism of team members on your own experience -- not on second-hand knowledge. +\item Participate together with the team in common activities: training, celebration, parties, sport, etc. +\item Provide a solid base for all team activities in order to make all team members feel comfortable as multi-functional team members. +\end{itemize} + +\bigskip +{\large \textbf{13. The team leader helps everyone to achieve success}} \\ + +\bigskip +\textbf{Performing as a real coach} \\ + +All team leaders should know and practise the following principles of coaching: \\ + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item Allow the capable and willing team members to take responsibility. +\item Encourage everyone to serve internal and external clients, rather than servicing the team leader. +\end{itemize} + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item Focus more on the team members' strong points than on their weak points. +\item Reprimand the team members in such a way that they keep their self--esteem. +\item Focus on the success of the team and its members -- not on own success. +\item Invite all team members to come up with ideas. Do not just promote own ideas. +\item Inspire the team members to bring out their best and fully utilise their knowledge and talents. +\item Allow each team member the freedom to develop their individual style and specialist skills. +\item Do not "blow their own trumpet". Enable team members to play harmoniously together. +\end{itemize} + +\bigskip +Team leaders should meet in learning and sharing sessions to develop coaching skills. \\ + +\bigskip +\textit{Read more about coaching and delegation in the book Employeeship (p.98-107).} \\ + +\bigskip +{\large \textbf{14. The team leader enjoys respect}} \\ + +\bigskip +\textbf{Deserving respect from team members} \\ + +In order for team leaders to deserve loyalty and respect from each team member they must: \\ + +\bigskip +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item Contribute highly to the team success. +\item Have professional and people skills +\item Have integrity. Be open and honest. +\item Defend each team member against attack. +\item Never betray a team member. +\item Talk positively about the team members outside and only criticise inside the team. +\item Never take the credit for results or ideas they have not created. +\item Respect the team members' differences. +\item Replace incompetent team members. +\item Practise what they preach. +\end{itemize} + +\bigskip +\textit{Read more about Loyalty and how the leader can gain respect in the book Employeeship (p. 52-63, and p. 124-135).} + +\end{flushleft} +\end{minipage} + +\newpage + +% PAGE 19 +\begin{center} + +\begin{minipage}{0.5\linewidth} + +\begin{flushleft} +{\large \textbf{15. Good performance is rewarded}} \\ + +\bigskip +\textbf{Making people feel OK} \\ + +Create a positive strokes culture where: \\ + +\renewcommand\labelitemi{\large$\bullet$} +\begin{itemize}[leftmargin=*] +\item Everyone gets recognition for good performance -- including those whose performance is not immediately visible. +\item Personal development is encouraged, recognised and rewarded. +\item Everyone gives recognition to fellow team mates for good performance. +\item Remuneration systems are designed to promote the team members' feeling of ownership. E.g. by including bonuses and other rewards for teamwork, contributions to others and committed performance. +\item Everybody knows how to increase own self--esteem and that of others. +\item Everybody can give and receive negative strokes, reprimands -- without violating anyone's self--esteem. +\end{itemize} + +\bigskip +\textit{Read more about self-esteem, recognition and strokes in the books Be a Double Bagger (p. 18-49), My Life Tree (p. 43-93) and Putting People First (p. 17-24, p. 45-62).} + +\end{flushleft} +\end{minipage} +\end{center} + +\newpage + +% PAGE 20 +\begin{center} +{\Large \textbf{The next steps}} +\end{center} + +%\vspace*{-2\baselineskip} + +\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +\renewcommand{\ULdepth}{1.8pt} +The Teamship Meter is a tool designed to monitor, develop and shape the team culture, so the team is "fighting fit". \\ + +\bigskip +If you want to learn more about how you can develop and sustain winning teams, \textbf{real teams} -- rather than just working groups, you have the following options: \\ + +\bigskip +\textbf{1. \href{https://clausmoller.com/en/contact-us/}{ \underline {Contact Claus M{\o}ller Consulting}}} \\ + +to get more detailed verbal or written feedback -- or coaching and consulting. \\ + +\bigskip +\textbf{2. \href{https://clausmoller.com/en/product/employeeship/}{ \underline {Read the Employeeship book}}} \\ + +The book is illustrating what it takes to be a good employee, and how the energy of all employees can be mobilised to ensure the survival and growth of the company. \\ + +\hspace*{0.8\baselineskip}The book provides inspiration and methods for everyone to display responsibility, loyalty and initiative. \\ + +\hspace*{0.8\baselineskip}It also gives specific suggestions for the policies and systems the company should adopt and implement to bring out the best in everyone. \\ + +\bigskip +\textbf{3. \href{https://clausmoller.com/en/product/heart-work/}{ \underline {Read Heart Work}}} \\ + +(A Book on emotional intelligence) \\ + +to get an in--depth understanding of Emotional Intelligence part of Employeeship. Learn why it is + +\end{flushleft} +\end{minipage}% +%second column +\noindent\hspace{0.05\linewidth}\begin{minipage}[t]{0.52\textwidth} +\begin{flushleft} +\renewcommand{\ULdepth}{1.8pt} +important both in your private life and at work and how Emotional Intelligence can be developed for individuals, teams and organisations. \\ + +\bigskip +\textbf{4. \href{https://clausmoller.com/en/practical-leadership/}{ \underline {Participate in Practical Leadership seminar}}} \\ + +to learn more about Practical Leadership, a programme based around the principles of \MYhref{https://clausmoller.com/concepts/}{\uline{General Business Excellence}}. You will learn how to manage productivity, relationships, quality and apply practical management and leadership principles. \\ + +\bigskip +\textbf{5. \href{https://clausmoller.com/en/product/energy-meter-for-multiple-teams/}{ \underline {Use the Team Energy Meter}}} \\ + +A tool to analyse, evaluate and develop the Employeeship culture of a team and an entire organisation within 11 Employeeship factors. \\ + +\hspace*{0.8\baselineskip}The tool is a simple and fast aid for the management and staff to identify areas in which a change or a more detailed analysis of the culture is required. \\ + +\bigskip +\textbf{6. \href{mailto:info@clausmoller.com}{ \underline {Use the Team EQ Meter}}} \\ + +to accurately assess and develop the Emotional Intelligence of your team and your organisation. \\ + +\end{flushleft} +\end{minipage} + +\vspace{1.5\baselineskip} +\begin{center} +\begin{minipage}{0.9\linewidth} +\begin{center} +Claus M{\o}ller Consulting helps organisations to measure, improve and manage productivity, relationships, quality and leadership. \\ +\end{center} +\end{minipage} +\end{center} + + +\begin{center} +Claus M{\o}ller Consulting offers keynote addresses, leadership education, tailored seminars, executive coaching, and online diagnostic tools to companies and organisations worldwide to enable them to achieve long--lasting results on personal, team and organisational level. \\ +\bigskip +\end{center} + +\vspace{0.5\baselineskip} +\begin{center} +\includegraphics[width=5.5cm]{../latexkosi/logo/CMC.png} +\end{center} + +\vspace*{.2\baselineskip} +\renewcommand{\ULdepth}{1.8pt} +\begin{center} +Contact us for more information about consultancy, seminars and tools. \\ \uline{info@clausmoller.com} $\bullet$ \uline{https://www.clausmoller.com} +\end{center} + +%\end{document} \ No newline at end of file diff --git a/frontend/drupal/.htaccess b/frontend/drupal/.htaccess index 8fc78d32d..ff1f01a34 100644 --- a/frontend/drupal/.htaccess +++ b/frontend/drupal/.htaccess @@ -141,9 +141,9 @@ RewriteRule ^(.*)$ /d/index.php?q=$1 [L,QSA] RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.js $1\.js\.gz [QSA] - # Serve correct content types, and prevent mod_deflate double gzip. - RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1] - RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1] + # Serve correct content types, and prevent double compression. + RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=no-brotli:1] + RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=no-brotli:1] # Serve correct encoding type. @@ -154,8 +154,10 @@ RewriteRule ^(.*)$ /d/index.php?q=$1 [L,QSA] -# Add headers to all responses. +# Various header fixes. # Disable content sniffing, since it's an attack vector. Header always set X-Content-Type-Options nosniff + # Disable Proxy header, since it's an attack vector. + RequestHeader unset Proxy diff --git a/frontend/drupal/CHANGELOG.txt b/frontend/drupal/CHANGELOG.txt index dcef8ea97..cda01053c 100644 --- a/frontend/drupal/CHANGELOG.txt +++ b/frontend/drupal/CHANGELOG.txt @@ -1,3 +1,9 @@ +Drupal 7.81, 2021-06-02 +----------------------- +- Block Google FLoC by default +- Testing and accessibility enhancements +- Various bug fixes, optimizations and improvements + Drupal 7.80, 2021-04-20 ----------------------- - Fixed security issues: diff --git a/frontend/drupal/includes/bootstrap.inc b/frontend/drupal/includes/bootstrap.inc index f9202da9f..2387e2b83 100644 --- a/frontend/drupal/includes/bootstrap.inc +++ b/frontend/drupal/includes/bootstrap.inc @@ -8,7 +8,7 @@ /** * The current system version. */ -define('VERSION', '7.80'); +define('VERSION', '7.81'); /** * Core API compatibility. diff --git a/frontend/drupal/includes/common.inc b/frontend/drupal/includes/common.inc index 690c00478..2ca4fa06f 100644 --- a/frontend/drupal/includes/common.inc +++ b/frontend/drupal/includes/common.inc @@ -2696,6 +2696,19 @@ function drupal_deliver_html_page($page_callback_result) { drupal_add_http_header('X-Frame-Options', $frame_options); } + if (variable_get('block_interest_cohort', TRUE)) { + $permissions_policy = drupal_get_http_header('Permissions-Policy'); + if (is_null($permissions_policy)) { + drupal_add_http_header('Permissions-Policy', 'interest-cohort=()'); + } + else { + // Only add interest-cohort if the header does not contain it already. + if (strpos($permissions_policy, 'interest-cohort') === FALSE) { + drupal_add_http_header('Permissions-Policy', 'interest-cohort=()', TRUE); + } + } + } + // Menu status constants are integers; page content is a string or array. if (is_int($page_callback_result)) { // @todo: Break these up into separate functions? @@ -3392,7 +3405,7 @@ function drupal_group_css($css) { * @see system_element_info() */ function drupal_aggregate_css(&$css_groups) { - $preprocess_css = (variable_get('preprocess_css', FALSE) && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update')); + $preprocess_css = (variable_get('preprocess_css', FALSE) && !defined('MAINTENANCE_MODE')); // For each group that needs aggregation, aggregate its items. foreach ($css_groups as $key => $group) { @@ -3851,8 +3864,10 @@ function drupal_load_stylesheet_content($contents, $optimize = FALSE) { // whitespace. // @see http://php.net/manual/regexp.reference.subpatterns.php $contents = preg_replace('< + # Do not strip any space from within single or double quotes + (' . $double_quot . '|' . $single_quot . ') # Strip leading and trailing whitespace. - \s*([@{};,])\s* + | \s*([@{};,])\s* # Strip only leading whitespace from: # - Closing parenthesis: Retain "@media (bar) and foo". | \s+([\)]) @@ -3860,11 +3875,11 @@ function drupal_load_stylesheet_content($contents, $optimize = FALSE) { # - Opening parenthesis: Retain "@media (bar) and foo". # - Colon: Retain :pseudo-selectors. | ([\(:])\s+ - >xS', - // Only one of the three capturing groups will match, so its reference + >xSs', + // Only one of the four capturing groups will match, so its reference // will contain the wanted value and the references for the // two non-matching groups will be replaced with empty strings. - '$1$2$3', + '$1$2$3$4', $contents ); // End the file with a new line. @@ -4505,7 +4520,7 @@ function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALS * @see drupal_add_js() */ function drupal_pre_render_scripts(array $elements) { - $preprocess_js = (variable_get('preprocess_js', FALSE) && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update')); + $preprocess_js = (variable_get('preprocess_js', FALSE) && !defined('MAINTENANCE_MODE')); // A dummy query-string is added to filenames, to gain control over // browser-caching. The string changes on every update or full cache @@ -6924,7 +6939,7 @@ function drupal_array_set_nested_value(array &$array, array $parents, $value, $f function &drupal_array_get_nested_value(array &$array, array $parents, &$key_exists = NULL) { $ref = &$array; foreach ($parents as $parent) { - if (is_array($ref) && array_key_exists($parent, $ref)) { + if (is_array($ref) && (isset($ref[$parent]) || array_key_exists($parent, $ref))) { $ref = &$ref[$parent]; } else { diff --git a/frontend/drupal/includes/form.inc b/frontend/drupal/includes/form.inc index f2557e832..3f6c7661a 100644 --- a/frontend/drupal/includes/form.inc +++ b/frontend/drupal/includes/form.inc @@ -3924,6 +3924,11 @@ function theme_button($variables) { $element['#attributes']['type'] = 'submit'; element_set_attributes($element, array('id', 'name', 'value')); + // Remove name attribute, if empty, for W3C compliance. + if (isset($element['#attributes']['name']) && $element['#attributes']['name'] === '') { + unset($element['#attributes']['name']); + } + $element['#attributes']['class'][] = 'form-' . $element['#button_type']; if (!empty($element['#attributes']['disabled'])) { $element['#attributes']['class'][] = 'form-button-disabled'; diff --git a/frontend/drupal/includes/menu.inc b/frontend/drupal/includes/menu.inc index 0f38d6f50..b97927511 100644 --- a/frontend/drupal/includes/menu.inc +++ b/frontend/drupal/includes/menu.inc @@ -1500,13 +1500,25 @@ function menu_tree_check_access(&$tree, $node_links = array()) { $nids = array_keys($node_links); $select = db_select('node', 'n'); $select->addField('n', 'nid'); - $select->condition('n.status', 1); + // When a menu administrator who we know has permission to see unpublished + // nodes is administering the menu, included the unpublished nodes in the + // tree, with a special flag so that the Menu module can label them. + // Otherwise, exclude these nodes from the tree. + if (!empty($GLOBALS['menu_admin']) && user_access('bypass node access')) { + $select->addField('n', 'status'); + } + else { + $select->condition('n.status', 1); + } $select->condition('n.nid', $nids, 'IN'); $select->addTag('node_access'); - $nids = $select->execute()->fetchCol(); - foreach ($nids as $nid) { - foreach ($node_links[$nid] as $mlid => $link) { - $node_links[$nid][$mlid]['access'] = TRUE; + $node_objects = $select->execute()->fetchAll(); + foreach ($node_objects as $node_object) { + foreach ($node_links[$node_object->nid] as $mlid => $link) { + $node_links[$node_object->nid][$mlid]['access'] = TRUE; + if (isset($node_object->status)) { + $node_links[$node_object->nid][$mlid]['node_unpublished'] = !$node_object->status; + } } } } @@ -1868,7 +1880,7 @@ function menu_navigation_links($menu_name, $level = 0) { $router_item = menu_get_item(); $links = array(); foreach ($tree as $item) { - if (!$item['link']['hidden']) { + if ($item['link']['access'] && !$item['link']['hidden']) { $class = ''; $l = $item['link']['localized_options']; $l['href'] = $item['link']['href']; diff --git a/frontend/drupal/includes/theme.inc b/frontend/drupal/includes/theme.inc index 5b602f8d7..a1b9324a0 100644 --- a/frontend/drupal/includes/theme.inc +++ b/frontend/drupal/includes/theme.inc @@ -418,7 +418,7 @@ class ThemeRegistry Extends DrupalCacheArray { // are not registered, just check the existence of the key in the registry. // Use array_key_exists() here since a NULL value indicates that the theme // hook exists but has not yet been requested. - return array_key_exists($offset, $this->storage); + return isset($this->storage[$offset]) || array_key_exists($offset, $this->storage); } public function offsetGet($offset) { diff --git a/frontend/drupal/misc/autocomplete.js b/frontend/drupal/misc/autocomplete.js index 09ceeec0f..5c8b57be4 100644 --- a/frontend/drupal/misc/autocomplete.js +++ b/frontend/drupal/misc/autocomplete.js @@ -17,7 +17,7 @@ Drupal.behaviors.autocomplete = { $($input[0].form).submit(Drupal.autocompleteSubmit); $input.parent() .attr('role', 'application') - .append($('') + .append($('') .attr('id', $input.attr('id') + '-autocomplete-aria-live') ); new Drupal.jsAC($input, acdb[uri]); diff --git a/frontend/drupal/modules/aggregator/aggregator.info b/frontend/drupal/modules/aggregator/aggregator.info index dac556160..9814958fe 100644 --- a/frontend/drupal/modules/aggregator/aggregator.info +++ b/frontend/drupal/modules/aggregator/aggregator.info @@ -7,7 +7,7 @@ files[] = aggregator.test configure = admin/config/services/aggregator/settings stylesheets[all][] = aggregator.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/aggregator/tests/aggregator_test.info b/frontend/drupal/modules/aggregator/tests/aggregator_test.info index 840f68f53..25e6ac2bf 100644 --- a/frontend/drupal/modules/aggregator/tests/aggregator_test.info +++ b/frontend/drupal/modules/aggregator/tests/aggregator_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/block/block.info b/frontend/drupal/modules/block/block.info index 95907c03b..0315b069b 100644 --- a/frontend/drupal/modules/block/block.info +++ b/frontend/drupal/modules/block/block.info @@ -6,7 +6,7 @@ core = 7.x files[] = block.test configure = admin/structure/block -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/block/tests/block_test.info b/frontend/drupal/modules/block/tests/block_test.info index 1a0b512fb..e352c4577 100644 --- a/frontend/drupal/modules/block/tests/block_test.info +++ b/frontend/drupal/modules/block/tests/block_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/block/tests/themes/block_test_theme/block_test_theme.info b/frontend/drupal/modules/block/tests/themes/block_test_theme/block_test_theme.info index 87a8d6262..899b7b72a 100644 --- a/frontend/drupal/modules/block/tests/themes/block_test_theme/block_test_theme.info +++ b/frontend/drupal/modules/block/tests/themes/block_test_theme/block_test_theme.info @@ -13,7 +13,7 @@ regions[footer] = Footer regions[highlighted] = Highlighted regions[help] = Help -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/blog/blog.info b/frontend/drupal/modules/blog/blog.info index 80ca6e702..b4bdbecef 100644 --- a/frontend/drupal/modules/blog/blog.info +++ b/frontend/drupal/modules/blog/blog.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = blog.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/book/book.info b/frontend/drupal/modules/book/book.info index 5f9d340aa..c2d7f7d1c 100644 --- a/frontend/drupal/modules/book/book.info +++ b/frontend/drupal/modules/book/book.info @@ -7,7 +7,7 @@ files[] = book.test configure = admin/content/book/settings stylesheets[all][] = book.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/color/color.info b/frontend/drupal/modules/color/color.info index 3906b758f..a94a318f8 100644 --- a/frontend/drupal/modules/color/color.info +++ b/frontend/drupal/modules/color/color.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = color.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/comment/comment.info b/frontend/drupal/modules/comment/comment.info index e7fcca1dc..4d11958cc 100644 --- a/frontend/drupal/modules/comment/comment.info +++ b/frontend/drupal/modules/comment/comment.info @@ -9,7 +9,7 @@ files[] = comment.test configure = admin/content/comment stylesheets[all][] = comment.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/contact/contact.info b/frontend/drupal/modules/contact/contact.info index d12f98cb1..533d0c026 100644 --- a/frontend/drupal/modules/contact/contact.info +++ b/frontend/drupal/modules/contact/contact.info @@ -6,7 +6,7 @@ core = 7.x files[] = contact.test configure = admin/structure/contact -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/contextual/contextual.info b/frontend/drupal/modules/contextual/contextual.info index 165551cba..f77a83cd5 100644 --- a/frontend/drupal/modules/contextual/contextual.info +++ b/frontend/drupal/modules/contextual/contextual.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = contextual.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/dashboard/dashboard.info b/frontend/drupal/modules/dashboard/dashboard.info index fd30f8401..3661e5601 100644 --- a/frontend/drupal/modules/dashboard/dashboard.info +++ b/frontend/drupal/modules/dashboard/dashboard.info @@ -7,7 +7,7 @@ files[] = dashboard.test dependencies[] = block configure = admin/dashboard/customize -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/dblog/dblog.info b/frontend/drupal/modules/dblog/dblog.info index 5ca79fca0..0dbbe15be 100644 --- a/frontend/drupal/modules/dblog/dblog.info +++ b/frontend/drupal/modules/dblog/dblog.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = dblog.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/field.form.inc b/frontend/drupal/modules/field/field.form.inc index 280f778ff..1d5a632b1 100644 --- a/frontend/drupal/modules/field/field.form.inc +++ b/frontend/drupal/modules/field/field.form.inc @@ -213,14 +213,25 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, '#language' => $langcode, '#field_parents' => $parents, '#columns' => array_keys($field['columns']), - // For multiple fields, title and description are handled by the wrapping table. - '#title' => $multiple ? '' : $title, - '#description' => $multiple ? '' : $description, + '#title' => $title, + '#description' => $description, // Only the first widget should be required. '#required' => $delta == 0 && $instance['required'], '#delta' => $delta, '#weight' => $delta, ); + // For multiple fields, title and description are handled by the wrapping + // table. + if ($multiple) { + if ($delta == 0) { + $element['#title'] = $title; + } + else { + $element['#title'] = t('!title (value @number)', array('@number' => $delta + 1, '!title' => $title)); + } + $element['#title_display'] = 'invisible'; + $element['#description'] = ''; + } if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) { // Input field for the delta (drag-n-drop reordering). if ($multiple) { diff --git a/frontend/drupal/modules/field/field.info b/frontend/drupal/modules/field/field.info index 48bd97047..6839caa3a 100644 --- a/frontend/drupal/modules/field/field.info +++ b/frontend/drupal/modules/field/field.info @@ -11,7 +11,7 @@ dependencies[] = field_sql_storage required = TRUE stylesheets[all][] = theme/field.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/modules/field_sql_storage/field_sql_storage.info b/frontend/drupal/modules/field/modules/field_sql_storage/field_sql_storage.info index 9ce8bf4e9..dcd907f0c 100644 --- a/frontend/drupal/modules/field/modules/field_sql_storage/field_sql_storage.info +++ b/frontend/drupal/modules/field/modules/field_sql_storage/field_sql_storage.info @@ -7,7 +7,7 @@ dependencies[] = field files[] = field_sql_storage.test required = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/modules/list/list.info b/frontend/drupal/modules/field/modules/list/list.info index 92bbf7233..579dc142a 100644 --- a/frontend/drupal/modules/field/modules/list/list.info +++ b/frontend/drupal/modules/field/modules/list/list.info @@ -7,7 +7,7 @@ dependencies[] = field dependencies[] = options files[] = tests/list.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/modules/list/tests/list_test.info b/frontend/drupal/modules/field/modules/list/tests/list_test.info index 5854cb3a1..1790ae689 100644 --- a/frontend/drupal/modules/field/modules/list/tests/list_test.info +++ b/frontend/drupal/modules/field/modules/list/tests/list_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/modules/number/number.info b/frontend/drupal/modules/field/modules/number/number.info index 54ea521ec..3b102f21a 100644 --- a/frontend/drupal/modules/field/modules/number/number.info +++ b/frontend/drupal/modules/field/modules/number/number.info @@ -6,7 +6,7 @@ core = 7.x dependencies[] = field files[] = number.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/modules/options/options.info b/frontend/drupal/modules/field/modules/options/options.info index d3e47aa9e..e39194426 100644 --- a/frontend/drupal/modules/field/modules/options/options.info +++ b/frontend/drupal/modules/field/modules/options/options.info @@ -6,7 +6,7 @@ core = 7.x dependencies[] = field files[] = options.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/modules/text/text.info b/frontend/drupal/modules/field/modules/text/text.info index 3b7a36f0e..039f9352a 100644 --- a/frontend/drupal/modules/field/modules/text/text.info +++ b/frontend/drupal/modules/field/modules/text/text.info @@ -7,7 +7,7 @@ dependencies[] = field files[] = text.test required = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field/tests/field.test b/frontend/drupal/modules/field/tests/field.test index adf2413ba..5312f2d45 100644 --- a/frontend/drupal/modules/field/tests/field.test +++ b/frontend/drupal/modules/field/tests/field.test @@ -1810,6 +1810,27 @@ class FieldFormTestCase extends FieldTestCase { // Test with several multiple fields in a form } + /** + * Tests the position of the required label. + */ + public function testFieldFormUnlimitedRequired() { + $this->field = $this->field_unlimited; + $this->field_name = $this->field['field_name']; + $this->instance['field_name'] = $this->field_name; + $this->instance['required'] = TRUE; + field_create_field($this->field); + field_create_instance($this->instance); + + // Display creation form -> 1 widget. + $this->drupalGet('test-entity/add/test-bundle'); + $result = $this->xpath("//label[not(contains(@class, 'element-invisible')) and contains(text(), :label)]/span/text()", array(':label' => $this->instance['label'])); + $this->assertEqual($result[0], '*', 'Required symbol added to field label.'); + // Check that the label of the field input is visually hidden and contains + // the field title and an indication of the delta for a11y. + $result = $this->xpath("//label[contains(@class, 'element-invisible') and contains(text(), :label)]/span/text()", array(':label' => $this->instance['label'])); + $this->assertEqual($result[0], '*', 'Required symbol and field label are visually hidden.'); + } + /** * Tests widget handling of multiple required radios. */ diff --git a/frontend/drupal/modules/field/tests/field_test.info b/frontend/drupal/modules/field/tests/field_test.info index 324e12093..a0ddebee5 100644 --- a/frontend/drupal/modules/field/tests/field_test.info +++ b/frontend/drupal/modules/field/tests/field_test.info @@ -6,7 +6,7 @@ files[] = field_test.entity.inc version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/field_ui/field_ui.info b/frontend/drupal/modules/field_ui/field_ui.info index 555d69283..5c23008d1 100644 --- a/frontend/drupal/modules/field_ui/field_ui.info +++ b/frontend/drupal/modules/field_ui/field_ui.info @@ -6,7 +6,7 @@ core = 7.x dependencies[] = field files[] = field_ui.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/file/file.info b/frontend/drupal/modules/file/file.info index 92deebac9..a10872a01 100644 --- a/frontend/drupal/modules/file/file.info +++ b/frontend/drupal/modules/file/file.info @@ -6,7 +6,7 @@ core = 7.x dependencies[] = field files[] = tests/file.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/file/tests/file_module_test.info b/frontend/drupal/modules/file/tests/file_module_test.info index b134008d4..17ba53a57 100644 --- a/frontend/drupal/modules/file/tests/file_module_test.info +++ b/frontend/drupal/modules/file/tests/file_module_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/filter/filter.info b/frontend/drupal/modules/filter/filter.info index 2a71c6c3c..421e1d649 100644 --- a/frontend/drupal/modules/filter/filter.info +++ b/frontend/drupal/modules/filter/filter.info @@ -7,7 +7,7 @@ files[] = filter.test required = TRUE configure = admin/config/content/formats -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/forum/forum.info b/frontend/drupal/modules/forum/forum.info index 514e2557a..536373c9c 100644 --- a/frontend/drupal/modules/forum/forum.info +++ b/frontend/drupal/modules/forum/forum.info @@ -9,7 +9,7 @@ files[] = forum.test configure = admin/structure/forum stylesheets[all][] = forum.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/help/help.info b/frontend/drupal/modules/help/help.info index 62d626758..e88bd0263 100644 --- a/frontend/drupal/modules/help/help.info +++ b/frontend/drupal/modules/help/help.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = help.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/image/image.info b/frontend/drupal/modules/image/image.info index 6a9abc05e..a26d4813b 100644 --- a/frontend/drupal/modules/image/image.info +++ b/frontend/drupal/modules/image/image.info @@ -7,7 +7,7 @@ dependencies[] = file files[] = image.test configure = admin/config/media/image-styles -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/image/tests/image_module_test.info b/frontend/drupal/modules/image/tests/image_module_test.info index 8c4c7cd91..627606909 100644 --- a/frontend/drupal/modules/image/tests/image_module_test.info +++ b/frontend/drupal/modules/image/tests/image_module_test.info @@ -6,7 +6,7 @@ core = 7.x files[] = image_module_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/locale/locale.info b/frontend/drupal/modules/locale/locale.info index a48d54d2d..0b9b08f7c 100644 --- a/frontend/drupal/modules/locale/locale.info +++ b/frontend/drupal/modules/locale/locale.info @@ -6,7 +6,7 @@ core = 7.x files[] = locale.test configure = admin/config/regional/language -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/locale/tests/locale_test.info b/frontend/drupal/modules/locale/tests/locale_test.info index 7a682fc2d..d8bbf12ef 100644 --- a/frontend/drupal/modules/locale/tests/locale_test.info +++ b/frontend/drupal/modules/locale/tests/locale_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/menu/menu.info b/frontend/drupal/modules/menu/menu.info index db77373d1..e5c167c25 100644 --- a/frontend/drupal/modules/menu/menu.info +++ b/frontend/drupal/modules/menu/menu.info @@ -6,7 +6,7 @@ core = 7.x files[] = menu.test configure = admin/structure/menu -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/menu/menu.test b/frontend/drupal/modules/menu/menu.test index bb792ee8e..e1a7f3fbf 100644 --- a/frontend/drupal/modules/menu/menu.test +++ b/frontend/drupal/modules/menu/menu.test @@ -222,6 +222,14 @@ class MenuTestCase extends DrupalWebTestCase { $this->assertMenuLink($item2['mlid'], array('depth' => 2, 'has_children' => 1, 'p1' => $item1['mlid'], 'p2' => $item2['mlid'], 'p3' => 0)); $this->assertMenuLink($item3['mlid'], array('depth' => 3, 'has_children' => 0, 'p1' => $item1['mlid'], 'p2' => $item2['mlid'], 'p3' => $item3['mlid'], 'p4' => 0)); + // Add 102 menu links with increasing weights, then make sure the last-added + // item's weight doesn't get changed because of the old hardcoded delta = 50 + $items = array(); + for ($i = -50; $i <= 51; $i++) { + $items[$i] = $this->addMenuLink(0, 'node/' . $node1->nid, $menu_name, TRUE, strval($i)); + } + $this->assertMenuLink($items[51]['mlid'], array('weight' => '51')); + // Verify menu links. $this->verifyMenuLink($item1, $node1); $this->verifyMenuLink($item2, $node2, $item1, $node1); @@ -286,15 +294,37 @@ class MenuTestCase extends DrupalWebTestCase { $this->assertFieldByName('link_path', $path, 'Path no longer has query or fragment.'); } + /** + * Tries to use the navigation menu as the source for secondary links. + */ + function testNavigationAsSecondaryMenu() { + $this->drupalLogin($this->big_user); + + // Go to the menu settings page and make the navigation the source for the + // secondary menu. + $edit = array( + 'menu_main_links_source' => 'main-menu', + 'menu_secondary_links_source' => 'navigation', + ); + $this->drupalGet('admin/structure/menu/settings'); + $this->drupalPost(NULL, $edit, t('Save configuration')); + + // Now visit the user page. There should be an 'Add content' link in the + // navigation block and one in the secondary menu. + $this->drupalGet('user'); + $this->assertNoUniqueText(t('Add content')); + } + /** * Add a menu link using the menu module UI. * * @param integer $plid Parent menu link id. * @param string $link Link path. * @param string $menu_name Menu name. + * @param string $weight Menu link weight * @return array Menu link created. */ - function addMenuLink($plid = 0, $link = '', $menu_name = 'navigation', $expanded = TRUE) { + function addMenuLink($plid = 0, $link = '', $menu_name = 'navigation', $expanded = TRUE, $weight = '0') { // View add menu link page. $this->drupalGet("admin/structure/menu/manage/$menu_name/add"); $this->assertResponse(200); @@ -307,7 +337,7 @@ class MenuTestCase extends DrupalWebTestCase { 'enabled' => TRUE, // Use this to disable the menu and test. 'expanded' => $expanded, // Setting this to true should test whether it works when we do the std_user tests. 'parent' => $menu_name . ':' . $plid, - 'weight' => '0', + 'weight' => $weight, ); // Add menu link. @@ -604,6 +634,50 @@ class MenuTestCase extends DrupalWebTestCase { $this->assertText(t('Menus'), 'Add menu node was displayed'); } } + + /** + * Tests that menu admin lists can include menu items for unpublished nodes. + */ + function testUnpublishedNodeMenuItem() { + // Log in as an administrator who can view unpublished nodes. + $menu_and_node_admin_user = $this->drupalCreateUser(array( + 'bypass node access', + 'administer menu', + )); + $this->drupalLogin($menu_and_node_admin_user); + + // Create an unpublished node with a menu link. + $title = $this->randomName(); + $node = $this->drupalCreateNode(array( + 'type' => 'article', + 'title' => $title, + 'status' => NODE_NOT_PUBLISHED, + )); + $edit = array( + 'link_path' => 'node/' . $node->nid, + 'link_title' => $title, + 'description' => '', + 'enabled' => TRUE, + 'expanded' => TRUE, + 'parent' => 'navigation:0', + 'weight' => '0', + ); + $this->drupalPost('admin/structure/menu/manage/navigation/add', $edit, t('Save')); + + // Verify that the administrator can see the menu link (with a label + // indicating that it is unpublished) on the menu management page. + $this->drupalGet('admin/structure/menu/manage/navigation'); + $this->assertText($title . ' (unpublished)', 'Menu link to unpublished node is visible to users with "bypass node access" permission.'); + + // Verify that a user who cannot view unpublished nodes does not see the + // menu link on the menu management page. + $menu_admin_user = $this->drupalCreateUser(array('administer menu')); + $this->drupalLogin($menu_admin_user); + $this->drupalGet('admin/structure/menu/manage/navigation'); + $this->assertResponse(200); + $this->assertNoText($title, 'Menu link to unpublished node is not visible to users without the "bypass node access" permission.'); + } + } /** @@ -758,4 +832,5 @@ class MenuNodeTestCase extends DrupalWebTestCase { $options = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option)); return $this->assertTrue(isset($selects[0]) && !isset($options[0]), $message ? $message : t('Option @option for field @id does not exist.', array('@option' => $option, '@id' => $id)), t('Browser')); } + } diff --git a/frontend/drupal/modules/node/content_types.inc b/frontend/drupal/modules/node/content_types.inc index c451dc7e0..446da7d69 100644 --- a/frontend/drupal/modules/node/content_types.inc +++ b/frontend/drupal/modules/node/content_types.inc @@ -417,14 +417,16 @@ function node_type_delete_confirm($form, &$form_state, $type) { $form['name'] = array('#type' => 'value', '#value' => $type->name); $message = t('Are you sure you want to delete the content type %type?', array('%type' => $type->name)); - $caption = ''; $num_nodes = db_query("SELECT COUNT(*) FROM {node} WHERE type = :type", array(':type' => $type->type))->fetchField(); if ($num_nodes) { - $caption .= '

' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. If you remove this content type, you will not be able to edit the %type content and it may not display correctly.', '%type is used by @count pieces of content on your site. If you remove %type, you will not be able to edit the %type content and it may not display correctly.', array('%type' => $type->name)) . '

'; + drupal_set_title($message, PASS_THROUGH); + $caption = '

' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. You cannot remove this content type until you have removed all of the %type content.', '%type is used by @count pieces of content on your site. You cannot remove this content type until you have removed all of the %type content.', array('%type' => $type->name)) . '

'; + $form['description'] = array('#markup' => $caption); + return $form; } - $caption .= '

' . t('This action cannot be undone.') . '

'; + $caption = '

' . t('This action cannot be undone.') . '

'; return confirm_form($form, $message, 'admin/structure/types', $caption, t('Delete')); } diff --git a/frontend/drupal/modules/node/node.info b/frontend/drupal/modules/node/node.info index 9e166f964..11cc29203 100644 --- a/frontend/drupal/modules/node/node.info +++ b/frontend/drupal/modules/node/node.info @@ -9,7 +9,7 @@ required = TRUE configure = admin/structure/types stylesheets[all][] = node.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/node/node.module b/frontend/drupal/modules/node/node.module index 1c0e51869..cf41ce714 100644 --- a/frontend/drupal/modules/node/node.module +++ b/frontend/drupal/modules/node/node.module @@ -3055,18 +3055,12 @@ function node_access($op, $node, $account = NULL) { $query->condition($nids); $query->range(0, 1); - $grants = db_or(); - foreach (node_access_grants($op, $account) as $realm => $gids) { - foreach ($gids as $gid) { - $grants->condition(db_and() - ->condition('gid', $gid) - ->condition('realm', $realm) - ); - } - } + $grants = node_add_node_grants_to_query(node_access_grants($op, $account)); + if (count($grants) > 0) { $query->condition($grants); } + $result = (bool) $query ->execute() ->fetchField(); @@ -3084,6 +3078,31 @@ function node_access($op, $node, $account = NULL) { return FALSE; } +/** + * Helper function to create the or condition for a node grants check. + * + * @param $account + * The grants to add to the query, usually gotten via node_access_grants(). + * @param $table_alias + * Optional, the alias to the node access table. + * + * @return + * TRUE if the operation may be performed, FALSE otherwise. + */ +function node_add_node_grants_to_query($node_access_grants, $table_alias = '') { + $grants = db_or(); + $prefix = $table_alias ? $table_alias . '.' : ''; + foreach ($node_access_grants as $realm => $gids) { + if (!empty($gids)) { + $grants->condition(db_and() + ->condition($prefix . 'gid', $gids, 'IN') + ->condition($prefix . 'realm', $realm) + ); + } + } + return $grants; +} + /** * Implements hook_node_access(). */ @@ -3252,15 +3271,8 @@ function node_access_view_all_nodes($account = NULL) { ->condition('nid', 0) ->condition('grant_view', 1, '>='); - $grants = db_or(); - foreach (node_access_grants('view', $account) as $realm => $gids) { - foreach ($gids as $gid) { - $grants->condition(db_and() - ->condition('gid', $gid) - ->condition('realm', $realm) - ); - } - } + $grants = node_add_node_grants_to_query(node_access_grants('view', $account)); + if (count($grants) > 0 ) { $query->condition($grants); } @@ -3422,17 +3434,7 @@ function _node_query_node_access_alter($query, $type) { $subquery = db_select('node_access', 'na') ->fields('na', array('nid')); - $grant_conditions = db_or(); - // If any grant exists for the specified user, then user has access - // to the node for the specified operation. - foreach ($grants as $realm => $gids) { - foreach ($gids as $gid) { - $grant_conditions->condition(db_and() - ->condition('na.gid', $gid) - ->condition('na.realm', $realm) - ); - } - } + $grant_conditions = node_add_node_grants_to_query($grants, 'na'); // Attach conditions to the subquery for nodes. if (count($grant_conditions->conditions())) { diff --git a/frontend/drupal/modules/node/node.test b/frontend/drupal/modules/node/node.test index e8eb459e3..f0ff8e7d6 100644 --- a/frontend/drupal/modules/node/node.test +++ b/frontend/drupal/modules/node/node.test @@ -1614,6 +1614,48 @@ class NodeTypeTestCase extends DrupalWebTestCase { $this->assertTrue(isset($types[$type]->disabled) && empty($types[$type]->disabled), format_string('%type type is enabled.', array('%type' => $type))); } } + + /** + * Tests deleting a content type that still has content. + */ + function testNodeTypeDeletion() { + // Create a content type programmatically. + $type = $this->drupalCreateContentType(); + + // Log in a test user. + $web_user = $this->drupalCreateUser(array( + 'bypass node access', + 'administer content types', + )); + $this->drupalLogin($web_user); + + // Add a new node of this type. + $node = $this->drupalCreateNode(array('type' => $type->type)); + // Attempt to delete the content type, which should not be allowed. + $this->drupalGet('admin/structure/types/manage/' . $type->name . '/delete'); + $this->assertRaw( + t( + '%type is used by 1 piece of content on your site. You cannot remove this content type until you have removed all of the %type content.', + array('%type' => $type->name) + ), + 'The content type will not be deleted until all nodes of that type are removed.' + ); + $this->assertNoText(t('This action cannot be undone.'), 'The node type deletion confirmation form is not available.'); + + // Delete the node. + node_delete($node->nid); + // Attempt to delete the content type, which should now be allowed. + $this->drupalGet('admin/structure/types/manage/' . $type->name . '/delete'); + $this->assertRaw( + t( + 'Are you sure you want to delete the content type %type?', + array('%type' => $type->name) + ), + 'The content type is available for deletion.' + ); + $this->assertText(t('This action cannot be undone.'), 'The node type deletion confirmation form is available.'); + } + } /** diff --git a/frontend/drupal/modules/node/tests/node_access_test.info b/frontend/drupal/modules/node/tests/node_access_test.info index e023592cf..15322d681 100644 --- a/frontend/drupal/modules/node/tests/node_access_test.info +++ b/frontend/drupal/modules/node/tests/node_access_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/node/tests/node_test.info b/frontend/drupal/modules/node/tests/node_test.info index b2917e831..9680680ac 100644 --- a/frontend/drupal/modules/node/tests/node_test.info +++ b/frontend/drupal/modules/node/tests/node_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/node/tests/node_test_exception.info b/frontend/drupal/modules/node/tests/node_test_exception.info index 8bf4c8a14..a18fd1c02 100644 --- a/frontend/drupal/modules/node/tests/node_test_exception.info +++ b/frontend/drupal/modules/node/tests/node_test_exception.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/openid/openid.info b/frontend/drupal/modules/openid/openid.info index c5cb0c3c4..8b46933cd 100644 --- a/frontend/drupal/modules/openid/openid.info +++ b/frontend/drupal/modules/openid/openid.info @@ -5,7 +5,7 @@ package = Core core = 7.x files[] = openid.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/openid/tests/openid_test.info b/frontend/drupal/modules/openid/tests/openid_test.info index 8bd7fd891..e12b3757c 100644 --- a/frontend/drupal/modules/openid/tests/openid_test.info +++ b/frontend/drupal/modules/openid/tests/openid_test.info @@ -6,7 +6,7 @@ core = 7.x dependencies[] = openid hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/overlay/overlay.info b/frontend/drupal/modules/overlay/overlay.info index f45f8daed..488a77326 100644 --- a/frontend/drupal/modules/overlay/overlay.info +++ b/frontend/drupal/modules/overlay/overlay.info @@ -4,7 +4,7 @@ package = Core version = VERSION core = 7.x -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/path/path.admin.inc b/frontend/drupal/modules/path/path.admin.inc index 28b06189b..248971f4f 100644 --- a/frontend/drupal/modules/path/path.admin.inc +++ b/frontend/drupal/modules/path/path.admin.inc @@ -11,7 +11,11 @@ * When filter key passed, perform a standard search on the given key, * and return the list of matching URL aliases. */ -function path_admin_overview($keys = NULL) { +function path_admin_overview() { + // Get search keys. + $args = func_get_args(); + $keys = implode('/', $args); + // Add the filter form above the overview table. $build['path_admin_filter_form'] = drupal_get_form('path_admin_filter_form', $keys); // Enable language column if locale is enabled or if we have any alias with language diff --git a/frontend/drupal/modules/path/path.info b/frontend/drupal/modules/path/path.info index 6d4d607d3..a3129aaf5 100644 --- a/frontend/drupal/modules/path/path.info +++ b/frontend/drupal/modules/path/path.info @@ -6,7 +6,7 @@ core = 7.x files[] = path.test configure = admin/config/search/path -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/path/path.test b/frontend/drupal/modules/path/path.test index f6131ce62..578825182 100644 --- a/frontend/drupal/modules/path/path.test +++ b/frontend/drupal/modules/path/path.test @@ -107,6 +107,55 @@ class PathTestCase extends DrupalWebTestCase { $this->drupalGet($edit['alias']); $this->assertNoText($node1->title, 'Alias was successfully deleted.'); $this->assertResponse(404); + + // Create third and fourth test node. + $node3 = $this->drupalCreateNode(); + $node4 = $this->drupalCreateNode(); + + // Give the node aliases a common first part. + $name = $this->randomName(4); + + // Create aliases containing a slash. + $edit = array(); + $edit['source'] = 'node/' . $node3->nid; + $alias3 = $name . '/' . $this->randomName(5); + $edit['alias'] = $alias3; + $this->drupalPost('admin/config/search/path/add', $edit, t('Save')); + $edit['source'] = 'node/' . $node4->nid; + $alias4 = $name . '/' . $this->randomName(4); + $edit['alias'] = $alias4; + $this->drupalPost('admin/config/search/path/add', $edit, t('Save')); + + // Confirm that the aliases work. + $this->drupalGet($alias3); + $this->assertText($node3->title, 'Alias works.'); + $this->assertResponse(200); + $this->drupalGet($alias4); + $this->assertText($node4->title, 'Alias works.'); + $this->assertResponse(200); + + // Confirm that filters containing slashes work. + $this->drupalGet('admin/config/search/path/list/' . $alias3); + $this->assertFieldByName('filter', $alias3); + $this->assertText($alias3, 'Searched-for alias with slash found.'); + $this->assertNoText($alias4, 'Different alias with slash not found.'); + $this->assertResponse(200); + + // Delete aliases. + $pid = $this->getPID($alias3); + $this->drupalPost('admin/config/search/path/edit/' . $pid, array(), t('Delete')); + $this->drupalPost(NULL, array(), t('Confirm')); + $pid = $this->getPID($alias4); + $this->drupalPost('admin/config/search/path/edit/' . $pid, array(), t('Delete')); + $this->drupalPost(NULL, array(), t('Confirm')); + + // Confirm that the aliases no longer work. + $this->drupalGet($alias3); + $this->assertNoText($node3->title, 'Alias was successfully deleted.'); + $this->assertResponse(404); + $this->drupalGet($alias4); + $this->assertNoText($node4->title, 'Alias was successfully deleted.'); + $this->assertResponse(404); } /** diff --git a/frontend/drupal/modules/php/php.info b/frontend/drupal/modules/php/php.info index 5fd7ce9b8..cfd6349ca 100644 --- a/frontend/drupal/modules/php/php.info +++ b/frontend/drupal/modules/php/php.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = php.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/poll/poll.info b/frontend/drupal/modules/poll/poll.info index bb82be47d..a23b62480 100644 --- a/frontend/drupal/modules/poll/poll.info +++ b/frontend/drupal/modules/poll/poll.info @@ -6,7 +6,7 @@ core = 7.x files[] = poll.test stylesheets[all][] = poll.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/profile/profile.info b/frontend/drupal/modules/profile/profile.info index dcc03f38d..1b8ab1dad 100644 --- a/frontend/drupal/modules/profile/profile.info +++ b/frontend/drupal/modules/profile/profile.info @@ -11,7 +11,7 @@ configure = admin/config/people/profile ; See user_system_info_alter(). hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/rdf/rdf.info b/frontend/drupal/modules/rdf/rdf.info index 50a5b0171..74c38cd49 100644 --- a/frontend/drupal/modules/rdf/rdf.info +++ b/frontend/drupal/modules/rdf/rdf.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x files[] = rdf.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/rdf/tests/rdf_test.info b/frontend/drupal/modules/rdf/tests/rdf_test.info index 2593a3d94..df4ee0b5f 100644 --- a/frontend/drupal/modules/rdf/tests/rdf_test.info +++ b/frontend/drupal/modules/rdf/tests/rdf_test.info @@ -6,7 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = blog -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/search/search.info b/frontend/drupal/modules/search/search.info index e91d74c7e..c673507e3 100644 --- a/frontend/drupal/modules/search/search.info +++ b/frontend/drupal/modules/search/search.info @@ -8,7 +8,7 @@ files[] = search.test configure = admin/config/search/settings stylesheets[all][] = search.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/search/tests/search_embedded_form.info b/frontend/drupal/modules/search/tests/search_embedded_form.info index c9696727a..000ad5e00 100644 --- a/frontend/drupal/modules/search/tests/search_embedded_form.info +++ b/frontend/drupal/modules/search/tests/search_embedded_form.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/search/tests/search_extra_type.info b/frontend/drupal/modules/search/tests/search_extra_type.info index b0091f8eb..c73c41bac 100644 --- a/frontend/drupal/modules/search/tests/search_extra_type.info +++ b/frontend/drupal/modules/search/tests/search_extra_type.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/search/tests/search_node_tags.info b/frontend/drupal/modules/search/tests/search_node_tags.info index 861bca5c5..e3c551b4a 100644 --- a/frontend/drupal/modules/search/tests/search_node_tags.info +++ b/frontend/drupal/modules/search/tests/search_node_tags.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/shortcut/shortcut.info b/frontend/drupal/modules/shortcut/shortcut.info index 467bf751c..660236ad9 100644 --- a/frontend/drupal/modules/shortcut/shortcut.info +++ b/frontend/drupal/modules/shortcut/shortcut.info @@ -6,7 +6,7 @@ core = 7.x files[] = shortcut.test configure = admin/config/user-interface/shortcut -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/drupal_web_test_case.php b/frontend/drupal/modules/simpletest/drupal_web_test_case.php index f212b0eb5..e2dc2322d 100644 --- a/frontend/drupal/modules/simpletest/drupal_web_test_case.php +++ b/frontend/drupal/modules/simpletest/drupal_web_test_case.php @@ -51,6 +51,20 @@ abstract class DrupalTestCase { */ protected $timeLimit = 500; + /** + * Whether to cache the installation part of the setUp() method. + * + * @var bool + */ + public $useSetupInstallationCache = FALSE; + + /** + * Whether to cache the modules installation part of the setUp() method. + * + * @var bool + */ + public $useSetupModulesCache = FALSE; + /** * Current results of this test case. * @@ -1448,6 +1462,159 @@ class DrupalWebTestCase extends DrupalTestCase { $this->setupEnvironment = TRUE; } + /** + * Copies the cached tables and files for a cached installation setup. + * + * @param string $cache_key_prefix + * (optional) Additional prefix for the cache key. + * + * @return bool + * TRUE when the cache was usable and loaded, FALSE when cache was not + * available. + * + * @see DrupalWebTestCase::setUp() + */ + protected function loadSetupCache($cache_key_prefix = '') { + $cache_key = $this->getSetupCacheKey($cache_key_prefix); + $cache_file = $this->originalFileDirectory . '/simpletest/' . $cache_key . '/simpletest-cache-setup'; + + if (file_exists($cache_file)) { + return $this->copySetupCache($cache_key, substr($this->databasePrefix, 10)); + } + + return FALSE; + } + + /** + * Returns the cache key used for the setup caching. + * + * @param string $cache_key_prefix + * (optional) Additional prefix for the cache key. + * + * @return string + * The cache key to use, by default only based on the profile used by the + * test. + */ + protected function getSetupCacheKey($cache_key_prefix = '') { + // The cache key needs to start with a numeric character, so that the cached + // installation gets cleaned up properly. + $cache_key_prefix = hash('crc32b', $cache_key_prefix . $this->profile); + return '1c' . $cache_key_prefix; + } + + /** + * Store the installation setup to a cache. + * + * @param string $cache_key_prefix + * (optional) Additional prefix for the cache key. + * + * @return bool + * TRUE if the installation was stored in the cache, FALSE otherwise. + */ + protected function storeSetupCache($cache_key_prefix = '') { + $cache_key = $this->getSetupCacheKey($cache_key_prefix); + $lock_key = 'simpletest_store_cache_' . $cache_key . '_' . $this->testId; + + // All concurrent tests share the same test id. Therefore it is possible to + // use the lock to ensure that only one process will store the cache. This + // is important as else DB tables created by one process could be deleted + // by another as the cache copying is idempotent. + if (! lock_acquire($lock_key)) { + return FALSE; + } + + // Try to copy the installation to the setup cache - now that we have a + // lock to do so. + if (!$this->copySetupCache(substr($this->databasePrefix, 10), $cache_key)) { + // It is non-fatal if the cache cannot be copied as the next test run + // will try it again. + $this->assert('debug', t('Storing cache with key @key failed', array('@key' => $cache_key)), 'storeSetupCache'); + + lock_release($lock_key); + return FALSE; + } + + // Inform others that this cache is usable now. + $cache_file = $this->originalFileDirectory . '/simpletest/' . $cache_key . '/simpletest-cache-setup'; + file_put_contents($cache_file, time(NULL)); + + lock_release($lock_key); + return TRUE; + } + + /** + * Copy the setup cache from/to another table and files directory. + * + * @param string $from + * The prefix_id / cache_key from where to copy. + * @param string $to + * The prefix_id / cache_key to where to copy. + * + * @return bool + * TRUE if the setup cache was copied to the current installation, FALSE + * otherwise. + */ + protected function copySetupCache($from, $to) { + $from_prefix = 'simpletest' . $from; + $to_prefix = 'simpletest' . $to; + + try { + $tables = db_query("SHOW TABLES LIKE :prefix", array(':prefix' => db_like($from_prefix) . '%' ))->fetchCol(); + + if (count($tables) == 0) { + return FALSE; + } + + foreach ($tables as $from_table) { + $table = substr($from_table, strlen($from_prefix)); + $to_table = $to_prefix . $table; + + // Remove the table in case the copying process was interrupted. + db_query('DROP TABLE IF EXISTS ' . $to_table); + db_query('CREATE TABLE ' . $to_table . ' LIKE ' . $from_table); + db_query('ALTER TABLE ' . $to_table . ' DISABLE KEYS'); + db_query('INSERT ' . $to_table . ' SELECT * FROM ' . $from_table); + db_query('ALTER TABLE ' . $to_table . ' ENABLE KEYS'); + } + } + catch (Exception $e) { + return FALSE; + } + + $from_dir = $this->originalFileDirectory . '/simpletest/' . $from; + $to_dir = $this->originalFileDirectory . '/simpletest/' . $to; + $this->recursiveDirectoryCopy($from_dir, $to_dir); + + return TRUE; + } + + /** + * Recursively copy one directory to another. + * + * @param $src + * The source directory. + * @param $dest + * The destination directory. + */ + protected function recursiveDirectoryCopy($src, $dst) { + $dir = opendir($src); + + if (!file_exists($dst)){ + mkdir($dst); + } + while (($file = readdir($dir)) !== FALSE) { + if ($file != '.' && $file != '..') { + if (is_dir($src . '/' . $file)) { + $this->recursiveDirectoryCopy($src . '/' . $file, $dst . '/' . $file); + } + else { + copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + closedir($dir); + } + /** * Sets up a Drupal site for running functional and integration tests. * @@ -1501,57 +1668,108 @@ class DrupalWebTestCase extends DrupalTestCase { // profile's hook_install() and other hook implementations are never invoked. $conf['install_profile'] = $this->profile; - // Perform the actual Drupal installation. - include_once DRUPAL_ROOT . '/includes/install.inc'; - drupal_install_system(); + $has_installation_cache = FALSE; + $has_modules_cache = FALSE; - $this->preloadRegistry(); + if ($this->useSetupModulesCache) { + $modules = func_get_args(); + // Modules can be either one parameter or multiple. + if (isset($modules[0]) && is_array($modules[0])) { + $modules = $modules[0]; + } + $modules = array_unique($modules); + sort($modules); - // Set path variables. - variable_set('file_public_path', $this->public_files_directory); - variable_set('file_private_path', $this->private_files_directory); - variable_set('file_temporary_path', $this->temp_files_directory); - - // Set the 'simpletest_parent_profile' variable to add the parent profile's - // search path to the child site's search paths. - // @see drupal_system_listing() - // @todo This may need to be primed like 'install_profile' above. - variable_set('simpletest_parent_profile', $this->originalProfile); - - // Include the testing profile. - variable_set('install_profile', $this->profile); - $profile_details = install_profile_info($this->profile, 'en'); - - // Install the modules specified by the testing profile. - module_enable($profile_details['dependencies'], FALSE); - - // Install modules needed for this test. This could have been passed in as - // either a single array argument or a variable number of string arguments. - // @todo Remove this compatibility layer in Drupal 8, and only accept - // $modules as a single array argument. - $modules = func_get_args(); - if (isset($modules[0]) && is_array($modules[0])) { - $modules = $modules[0]; - } - if ($modules) { - $success = module_enable($modules, TRUE); - $this->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules)))); + $modules_cache_key_prefix = hash('crc32b', serialize($modules)) . '_'; + $has_modules_cache = $this->loadSetupCache($modules_cache_key_prefix); } - // Run the profile tasks. - $install_profile_module_exists = db_query("SELECT 1 FROM {system} WHERE type = 'module' AND name = :name", array( - ':name' => $this->profile, - ))->fetchField(); - if ($install_profile_module_exists) { - module_enable(array($this->profile), FALSE); + if (!$has_modules_cache && $this->useSetupInstallationCache) { + $has_installation_cache = $this->loadSetupCache(); } - // Reset/rebuild all data structures after enabling the modules. - $this->resetAll(); + if ($has_modules_cache || $has_installation_cache) { + // Reset path variables. + variable_set('file_public_path', $this->public_files_directory); + variable_set('file_private_path', $this->private_files_directory); + variable_set('file_temporary_path', $this->temp_files_directory); + $this->refreshVariables(); - // Run cron once in that environment, as install.php does at the end of - // the installation process. - drupal_cron_run(); + // Load all enabled modules + module_load_all(); + + $this->pass(t('Using cache: @cache (@key)', array( + '@cache' => $has_modules_cache ? t('Modules Cache') : t('Installation Cache'), + '@key' => $this->getSetupCacheKey($has_modules_cache ? $modules_cache_key_prefix : ''), + ))); + } + else { + // Perform the actual Drupal installation. + include_once DRUPAL_ROOT . '/includes/install.inc'; + drupal_install_system(); + + $this->preloadRegistry(); + + // Set path variables. + variable_set('file_public_path', $this->public_files_directory); + variable_set('file_private_path', $this->private_files_directory); + variable_set('file_temporary_path', $this->temp_files_directory); + + // Set the 'simpletest_parent_profile' variable to add the parent profile's + // search path to the child site's search paths. + // @see drupal_system_listing() + // @todo This may need to be primed like 'install_profile' above. + variable_set('simpletest_parent_profile', $this->originalProfile); + + // Include the testing profile. + variable_set('install_profile', $this->profile); + $profile_details = install_profile_info($this->profile, 'en'); + + // Install the modules specified by the testing profile. + module_enable($profile_details['dependencies'], FALSE); + + if ($this->useSetupInstallationCache) { + $this->storeSetupCache(); + } + } + + if (!$has_modules_cache) { + // Install modules needed for this test. This could have been passed in as + // either a single array argument or a variable number of string arguments. + // @todo Remove this compatibility layer in Drupal 8, and only accept + // $modules as a single array argument. + $modules = func_get_args(); + if (isset($modules[0]) && is_array($modules[0])) { + $modules = $modules[0]; + } + if ($modules) { + $success = module_enable($modules, TRUE); + $this->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules)))); + } + + // Run the profile tasks. + $install_profile_module_exists = db_query("SELECT 1 FROM {system} WHERE type = 'module' AND name = :name", array( + ':name' => $this->profile, + ))->fetchField(); + if ($install_profile_module_exists) { + module_enable(array($this->profile), FALSE); + } + + // Reset/rebuild all data structures after enabling the modules. + $this->resetAll(); + + // Run cron once in that environment, as install.php does at the end of + // the installation process. + drupal_cron_run(); + + if ($this->useSetupModulesCache) { + $this->storeSetupCache($modules_cache_key_prefix); + } + } + else { + // Reset/rebuild all data structures after enabling the modules. + $this->resetAll(); + } // Ensure that the session is not written to the new environment and replace // the global $user session with uid 1 from the new test site. diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css b/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css index c47e8429a..ed8c15c50 100644 --- a/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css +++ b/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css @@ -7,6 +7,11 @@ A large comment block to test for segfaults and speed. This is 60K a's. Extreme but useful to demonstrate flaws in comment striping regexp. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/ .test1 { display:block;} +/* A pseudo selector with essential whitespace wrapped in quotes. */ +img[style*="float: right"] { + padding-left:5px; +} + /* A multiline IE-mac hack (v.2) taken fron Zen theme*/ /* Hides from IE-mac \*/ html .clear-block { diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css b/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css index 1feb8f1bd..65823082e 100644 --- a/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css +++ b/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css @@ -1 +1 @@ -.test1{display:block;}html .clear-block{height:1%;}.clear-block{display:block;font:italic bold 12px/30px Georgia,serif;}.test2{display:block;}.bkslshv1{background-color:#C00;}.test3{display:block;}.test4{display:block;}.comment-in-double-quotes:before{content:"/* ";}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-double-quotes:after{content:" */";}.comment-in-single-quotes:before{content:'/*';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-single-quotes:after{content:'*/';}.comment-in-mixed-quotes:before{content:'"/*"';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-mixed-quotes:after{content:"'*/'";}.comment-in-quotes-with-escaped:before{content:'/* \" \' */';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-quotes-with-escaped:after{content:"*/ \" \ '";} +.test1{display:block;}img[style*="float: right"]{padding-left:5px;}html .clear-block{height:1%;}.clear-block{display:block;font:italic bold 12px/30px Georgia,serif;}.test2{display:block;}.bkslshv1{background-color:#C00;}.test3{display:block;}.test4{display:block;}.comment-in-double-quotes:before{content:"/* ";}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-double-quotes:after{content:" */";}.comment-in-single-quotes:before{content:'/*';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-single-quotes:after{content:'*/';}.comment-in-mixed-quotes:before{content:'"/*"';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-mixed-quotes:after{content:"'*/'";}.comment-in-quotes-with-escaped:before{content:'/* \" \' */';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-quotes-with-escaped:after{content:"*/ \" \ '";} diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css b/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css index c47e8429a..ed8c15c50 100644 --- a/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css +++ b/frontend/drupal/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css @@ -7,6 +7,11 @@ A large comment block to test for segfaults and speed. This is 60K a's. Extreme but useful to demonstrate flaws in comment striping regexp. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/ .test1 { display:block;} +/* A pseudo selector with essential whitespace wrapped in quotes. */ +img[style*="float: right"] { + padding-left:5px; +} + /* A multiline IE-mac hack (v.2) taken fron Zen theme*/ /* Hides from IE-mac \*/ html .clear-block { diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css b/frontend/drupal/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css index c7bb9dcd1..e22077a21 100644 --- a/frontend/drupal/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css +++ b/frontend/drupal/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css @@ -1,4 +1,4 @@ body{margin:0;padding:0;background:#edf5fa;font:76%/170% Verdana,sans-serif;color:#494949;}.this .is .a .test{font:1em/100% Verdana,sans-serif;color:#494949;}.this .is .a -.test{font:1em/100% Verdana,sans-serif;color:#494949;}some :pseudo .thing{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10');-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10')";}::-moz-selection{background:#000;color:#fff;}::selection{background:#000;color:#fff;}@media print{*{background:#000 !important;color:#fff !important;}@page{margin:0.5cm;}}@media screen and (max-device-width:480px){background:#000;color:#fff;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;} +.test{font:1em/100% Verdana,sans-serif;color:#494949;}some :pseudo .thing{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10');-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10')";}::-moz-selection{background:#000;color:#fff;}::selection{background:#000;color:#fff;}@media print{*{background:#000 !important;color:#fff !important;}@page{margin:0.5cm;}}@media screen and (max-device-width:480px){background:#000;color:#fff;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;} diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css b/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css new file mode 100644 index 000000000..3fe0f7d50 --- /dev/null +++ b/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css @@ -0,0 +1,31 @@ +/* Example from https://www.w3.org/TR/CSS2/syndata.html#rule-sets */ +q[example="public class foo\ +{\ + private int x;\ +\ + foo(int x) {\ + this.x = x;\ + }\ +\ +}"] { color: red } + +/* A pseudo selector with essential whitespace wrapped in quotes. */ +q[style*="quotes: none"] { + quotes: none; +} + +q[style*='quotes: none'] { + quotes: none; +} + +q:after { + content: ": colon & escaped double \" quotes \"."; +} + +q:after { + content: ' (brackets & escaped single \' quotes \') '; +} + +q:after { + content: "I'm Quote"; +} diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css.optimized.css b/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css.optimized.css new file mode 100644 index 000000000..716cef729 --- /dev/null +++ b/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css.optimized.css @@ -0,0 +1,9 @@ +q[example="public class foo\ +{\ + private int x;\ +\ + foo(int x) {\ + this.x = x;\ + }\ +\ +}"]{color:red}q[style*="quotes: none"]{quotes:none;}q[style*='quotes: none']{quotes:none;}q:after{content:": colon & escaped double \" quotes \".";}q:after{content:' (brackets & escaped single \' quotes \') ';}q:after{content:"I'm Quote";} diff --git a/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css.unoptimized.css b/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css.unoptimized.css new file mode 100644 index 000000000..3fe0f7d50 --- /dev/null +++ b/frontend/drupal/modules/simpletest/files/css_test_files/quotes.css.unoptimized.css @@ -0,0 +1,31 @@ +/* Example from https://www.w3.org/TR/CSS2/syndata.html#rule-sets */ +q[example="public class foo\ +{\ + private int x;\ +\ + foo(int x) {\ + this.x = x;\ + }\ +\ +}"] { color: red } + +/* A pseudo selector with essential whitespace wrapped in quotes. */ +q[style*="quotes: none"] { + quotes: none; +} + +q[style*='quotes: none'] { + quotes: none; +} + +q:after { + content: ": colon & escaped double \" quotes \"."; +} + +q:after { + content: ' (brackets & escaped single \' quotes \') '; +} + +q:after { + content: "I'm Quote"; +} diff --git a/frontend/drupal/modules/simpletest/simpletest.info b/frontend/drupal/modules/simpletest/simpletest.info index 474a8fb9b..7d503300a 100644 --- a/frontend/drupal/modules/simpletest/simpletest.info +++ b/frontend/drupal/modules/simpletest/simpletest.info @@ -58,7 +58,7 @@ files[] = tests/upgrade/update.trigger.test files[] = tests/upgrade/update.field.test files[] = tests/upgrade/update.user.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/simpletest.module b/frontend/drupal/modules/simpletest/simpletest.module index 6a60d5949..ebc9b4bf0 100644 --- a/frontend/drupal/modules/simpletest/simpletest.module +++ b/frontend/drupal/modules/simpletest/simpletest.module @@ -592,7 +592,8 @@ function simpletest_clean_temporary_directories() { $files = scandir('public://simpletest'); foreach ($files as $file) { $path = 'public://simpletest/' . $file; - if (is_dir($path) && is_numeric($file)) { + // Ensure that cache directories are cleaned as well. + if (is_dir($path) && (is_numeric($file) || strpos($file, '1c') === 0)) { file_unmanaged_delete_recursive($path); $count++; } diff --git a/frontend/drupal/modules/simpletest/tests/actions_loop_test.info b/frontend/drupal/modules/simpletest/tests/actions_loop_test.info index 908bed8d6..d84f0939e 100644 --- a/frontend/drupal/modules/simpletest/tests/actions_loop_test.info +++ b/frontend/drupal/modules/simpletest/tests/actions_loop_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/ajax_forms_test.info b/frontend/drupal/modules/simpletest/tests/ajax_forms_test.info index 01aaa0404..3c9acfc7f 100644 --- a/frontend/drupal/modules/simpletest/tests/ajax_forms_test.info +++ b/frontend/drupal/modules/simpletest/tests/ajax_forms_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/ajax_test.info b/frontend/drupal/modules/simpletest/tests/ajax_test.info index a6a924674..4b8b4e96c 100644 --- a/frontend/drupal/modules/simpletest/tests/ajax_test.info +++ b/frontend/drupal/modules/simpletest/tests/ajax_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/batch_test.info b/frontend/drupal/modules/simpletest/tests/batch_test.info index 24f8bf779..8878b8a52 100644 --- a/frontend/drupal/modules/simpletest/tests/batch_test.info +++ b/frontend/drupal/modules/simpletest/tests/batch_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/boot_test_1.info b/frontend/drupal/modules/simpletest/tests/boot_test_1.info index d09ef328c..d7a7cc3b2 100644 --- a/frontend/drupal/modules/simpletest/tests/boot_test_1.info +++ b/frontend/drupal/modules/simpletest/tests/boot_test_1.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/boot_test_2.info b/frontend/drupal/modules/simpletest/tests/boot_test_2.info index ab2ca587f..00a205616 100644 --- a/frontend/drupal/modules/simpletest/tests/boot_test_2.info +++ b/frontend/drupal/modules/simpletest/tests/boot_test_2.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/common.test b/frontend/drupal/modules/simpletest/tests/common.test index ff3996763..f5b85bad0 100644 --- a/frontend/drupal/modules/simpletest/tests/common.test +++ b/frontend/drupal/modules/simpletest/tests/common.test @@ -1069,7 +1069,8 @@ class CascadingStylesheetsUnitTest extends DrupalUnitTestCase { 'css_input_without_import.css', 'css_input_with_import.css', 'css_subfolder/css_input_with_import.css', - 'comment_hacks.css' + 'comment_hacks.css', + 'quotes.css', ); $path = drupal_get_path('module', 'simpletest') . '/files/css_test_files'; foreach ($testfiles as $file) { @@ -3244,3 +3245,55 @@ class DrupalGetQueryArrayTestCase extends DrupalWebTestCase { } } + +/** + * Test for block_interest_cohort. + */ +class BlockInterestCohortTest extends DrupalWebTestCase { + + public static function getInfo() { + return array( + 'name' => 'Block Interest Cohort', + 'description' => 'Check Permissions-Policy header to disable Google FLoC', + 'group' => 'System', + ); + } + + function setUp() { + parent::setUp('common_test'); + } + + /** + * Tests that FLoC is blocked by default. + */ + function testDefaultBlocking() { + $this->drupalGet('node'); + $this->assertEqual($this->drupalGetHeader('Permissions-Policy'), 'interest-cohort=()', 'FLoC is blocked by default.'); + } + + /** + * Tests that an existing interest-cohort policy is not overwritten. + */ + function testExistingInterestCohortPolicy() { + $this->drupalGet('common-test/existing_interest_cohort_policy'); + $this->assertEqual($this->drupalGetHeader('Permissions-Policy'), 'interest-cohort=*', 'Existing interest-cohort policy is not overwritten.'); + } + + /** + * Tests that an existing header is appended to correctly. + */ + function testExistingPolicyHeader() { + $this->drupalGet('common-test/existing_permissions_policy_header'); + $this->assertTrue((strpos($this->drupalGetHeader('Permissions-Policy'), 'geolocation=(),interest-cohort=()') !== FALSE), 'The existing header is appended to.'); + } + + /** + * Tests that FLoC blocking can be disabled. + */ + function testDisableBlocking() { + variable_set('block_interest_cohort', FALSE); + $this->drupalGet('node'); + $this->assertFalse($this->drupalGetHeader('Permissions-Policy'), 'FLoC blocking can be disabled.'); + } + +} diff --git a/frontend/drupal/modules/simpletest/tests/common_test.info b/frontend/drupal/modules/simpletest/tests/common_test.info index 44d709b81..15d76e061 100644 --- a/frontend/drupal/modules/simpletest/tests/common_test.info +++ b/frontend/drupal/modules/simpletest/tests/common_test.info @@ -7,7 +7,7 @@ stylesheets[all][] = common_test.css stylesheets[print][] = common_test.print.css hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/common_test.module b/frontend/drupal/modules/simpletest/tests/common_test.module index d092c9249..d7b97bc89 100644 --- a/frontend/drupal/modules/simpletest/tests/common_test.module +++ b/frontend/drupal/modules/simpletest/tests/common_test.module @@ -52,6 +52,18 @@ function common_test_menu() { 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); + $items['common-test/existing_interest_cohort_policy'] = array( + 'title' => 'Test existing interest-cohort policy', + 'page callback' => 'existing_interest_cohort_policy', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['common-test/existing_permissions_policy_header'] = array( + 'title' => 'Test existing Permissions-Policy header', + 'page callback' => 'existing_permissions_policy_header', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); return $items; } @@ -286,3 +298,19 @@ function common_test_js_and_css_querystring() { function common_test_cron() { throw new Exception(t('Uncaught exception')); } + +/** + * Page callback. + */ +function existing_interest_cohort_policy() { + drupal_add_http_header('Permissions-Policy', 'interest-cohort=*'); + print __FUNCTION__; +} + +/** + * Page callback. + */ +function existing_permissions_policy_header() { + drupal_add_http_header('Permissions-Policy', 'geolocation=()'); + print __FUNCTION__; +} diff --git a/frontend/drupal/modules/simpletest/tests/common_test_cron_helper.info b/frontend/drupal/modules/simpletest/tests/common_test_cron_helper.info index a0f668b80..4db789dec 100644 --- a/frontend/drupal/modules/simpletest/tests/common_test_cron_helper.info +++ b/frontend/drupal/modules/simpletest/tests/common_test_cron_helper.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/database_test.info b/frontend/drupal/modules/simpletest/tests/database_test.info index 87cd43f9d..bb4d83700 100644 --- a/frontend/drupal/modules/simpletest/tests/database_test.info +++ b/frontend/drupal/modules/simpletest/tests/database_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info b/frontend/drupal/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info index 37f8b035a..6081961fa 100644 --- a/frontend/drupal/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info +++ b/frontend/drupal/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info @@ -7,7 +7,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/frontend/drupal/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index d88417ed3..210c5e7ba 100644 --- a/frontend/drupal/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/frontend/drupal/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/frontend/drupal/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info index d966bd21b..d5e2724ae 100644 --- a/frontend/drupal/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info +++ b/frontend/drupal/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/entity_cache_test.info b/frontend/drupal/modules/simpletest/tests/entity_cache_test.info index a15be7285..2e06c3511 100644 --- a/frontend/drupal/modules/simpletest/tests/entity_cache_test.info +++ b/frontend/drupal/modules/simpletest/tests/entity_cache_test.info @@ -6,7 +6,7 @@ core = 7.x dependencies[] = entity_cache_test_dependency hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/entity_cache_test_dependency.info b/frontend/drupal/modules/simpletest/tests/entity_cache_test_dependency.info index 72522da34..b471c08e8 100644 --- a/frontend/drupal/modules/simpletest/tests/entity_cache_test_dependency.info +++ b/frontend/drupal/modules/simpletest/tests/entity_cache_test_dependency.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/entity_crud_hook_test.info b/frontend/drupal/modules/simpletest/tests/entity_crud_hook_test.info index f381ce040..1d6a4d0b8 100644 --- a/frontend/drupal/modules/simpletest/tests/entity_crud_hook_test.info +++ b/frontend/drupal/modules/simpletest/tests/entity_crud_hook_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/entity_query_access_test.info b/frontend/drupal/modules/simpletest/tests/entity_query_access_test.info index 62e5fee13..d05746fa4 100644 --- a/frontend/drupal/modules/simpletest/tests/entity_query_access_test.info +++ b/frontend/drupal/modules/simpletest/tests/entity_query_access_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/error_test.info b/frontend/drupal/modules/simpletest/tests/error_test.info index 58c54e331..fc36a6402 100644 --- a/frontend/drupal/modules/simpletest/tests/error_test.info +++ b/frontend/drupal/modules/simpletest/tests/error_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/file_test.info b/frontend/drupal/modules/simpletest/tests/file_test.info index f1f287751..96621d7b2 100644 --- a/frontend/drupal/modules/simpletest/tests/file_test.info +++ b/frontend/drupal/modules/simpletest/tests/file_test.info @@ -6,7 +6,7 @@ core = 7.x files[] = file_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/filter_test.info b/frontend/drupal/modules/simpletest/tests/filter_test.info index cf51e69ec..9b89aecda 100644 --- a/frontend/drupal/modules/simpletest/tests/filter_test.info +++ b/frontend/drupal/modules/simpletest/tests/filter_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/form.test b/frontend/drupal/modules/simpletest/tests/form.test index 23af5f4c7..a4213241e 100644 --- a/frontend/drupal/modules/simpletest/tests/form.test +++ b/frontend/drupal/modules/simpletest/tests/form.test @@ -852,6 +852,12 @@ class FormsElementsLabelsTestCase extends DrupalWebTestCase { $this->assertEqual($elements[0]['title'], 'Checkboxes test' . ' (' . t('Required') . ')', 'Title attribute found.'); $elements = $this->xpath('//div[@id="edit-form-radios-title-attribute"]'); $this->assertEqual($elements[0]['title'], 'Radios test' . ' (' . t('Required') . ')', 'Title attribute found.'); + + // Check that empty name attribute is not printed on buttons. + $elements = $this->xpath('//input[@id="edit-form-button-with-name"]'); + $this->assertTrue($elements[0]['name'] == 'op', 'Name attribute found.'); + $elements = $this->xpath('//input[@id="edit-form-button-without-name"]'); + $this->assertFalse(isset($elements[0]['name']), 'No name attribute found.'); } } diff --git a/frontend/drupal/modules/simpletest/tests/form_test.info b/frontend/drupal/modules/simpletest/tests/form_test.info index c3f8ba901..06353b5ef 100644 --- a/frontend/drupal/modules/simpletest/tests/form_test.info +++ b/frontend/drupal/modules/simpletest/tests/form_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/form_test.module b/frontend/drupal/modules/simpletest/tests/form_test.module index 9f071826e..63730c9fd 100644 --- a/frontend/drupal/modules/simpletest/tests/form_test.module +++ b/frontend/drupal/modules/simpletest/tests/form_test.module @@ -1022,6 +1022,16 @@ function form_label_test_form() { '#title_display' => 'attribute', '#required' => TRUE, ); + // Button elements with and without name attribute. + $form['form_button_with_name'] = array( + '#type' => 'button', + '#value' => t('Button with name'), + ); + $form['form_button_without_name'] = array( + '#type' => 'button', + '#value' => t('Button without name'), + '#name' => '', + ); return $form; } diff --git a/frontend/drupal/modules/simpletest/tests/image_test.info b/frontend/drupal/modules/simpletest/tests/image_test.info index 009cffe85..79781caec 100644 --- a/frontend/drupal/modules/simpletest/tests/image_test.info +++ b/frontend/drupal/modules/simpletest/tests/image_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/menu_test.info b/frontend/drupal/modules/simpletest/tests/menu_test.info index 80fa7d0fc..9cc4d67cd 100644 --- a/frontend/drupal/modules/simpletest/tests/menu_test.info +++ b/frontend/drupal/modules/simpletest/tests/menu_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/module_test.info b/frontend/drupal/modules/simpletest/tests/module_test.info index 8fb3bf27d..c7ff0786b 100644 --- a/frontend/drupal/modules/simpletest/tests/module_test.info +++ b/frontend/drupal/modules/simpletest/tests/module_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/path_test.info b/frontend/drupal/modules/simpletest/tests/path_test.info index 0de0cf6e1..26016c248 100644 --- a/frontend/drupal/modules/simpletest/tests/path_test.info +++ b/frontend/drupal/modules/simpletest/tests/path_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/psr_0_test/psr_0_test.info b/frontend/drupal/modules/simpletest/tests/psr_0_test/psr_0_test.info index efc8711bd..2261da817 100644 --- a/frontend/drupal/modules/simpletest/tests/psr_0_test/psr_0_test.info +++ b/frontend/drupal/modules/simpletest/tests/psr_0_test/psr_0_test.info @@ -5,7 +5,7 @@ core = 7.x hidden = TRUE package = Testing -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/psr_4_test/psr_4_test.info b/frontend/drupal/modules/simpletest/tests/psr_4_test/psr_4_test.info index ab7ec3eea..e7be9bba1 100644 --- a/frontend/drupal/modules/simpletest/tests/psr_4_test/psr_4_test.info +++ b/frontend/drupal/modules/simpletest/tests/psr_4_test/psr_4_test.info @@ -5,7 +5,7 @@ core = 7.x hidden = TRUE package = Testing -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/requirements1_test.info b/frontend/drupal/modules/simpletest/tests/requirements1_test.info index 31be1944b..718bb0d51 100644 --- a/frontend/drupal/modules/simpletest/tests/requirements1_test.info +++ b/frontend/drupal/modules/simpletest/tests/requirements1_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/requirements2_test.info b/frontend/drupal/modules/simpletest/tests/requirements2_test.info index 792456984..a81d18a81 100644 --- a/frontend/drupal/modules/simpletest/tests/requirements2_test.info +++ b/frontend/drupal/modules/simpletest/tests/requirements2_test.info @@ -7,7 +7,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/session_test.info b/frontend/drupal/modules/simpletest/tests/session_test.info index 7b66b3892..ed5293711 100644 --- a/frontend/drupal/modules/simpletest/tests/session_test.info +++ b/frontend/drupal/modules/simpletest/tests/session_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_dependencies_test.info b/frontend/drupal/modules/simpletest/tests/system_dependencies_test.info index eeedee4ab..842e8614b 100644 --- a/frontend/drupal/modules/simpletest/tests/system_dependencies_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_dependencies_test.info @@ -6,7 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = _missing_dependency -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info b/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info index f1b38e520..cb5b3bf4f 100644 --- a/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info @@ -6,7 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = system_incompatible_core_version_test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_test.info b/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_test.info index ce6cd080b..0fa176aad 100644 --- a/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_incompatible_core_version_test.info @@ -5,7 +5,7 @@ version = VERSION core = 5.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info b/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info index f18384529..be40aa489 100644 --- a/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info @@ -7,7 +7,7 @@ hidden = TRUE ; system_incompatible_module_version_test declares version 1.0 dependencies[] = system_incompatible_module_version_test (>2.0) -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_test.info b/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_test.info index 51390e80a..36d47a7fc 100644 --- a/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_incompatible_module_version_test.info @@ -5,7 +5,7 @@ version = 1.0 core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_project_namespace_test.info b/frontend/drupal/modules/simpletest/tests/system_project_namespace_test.info index 111c3fb24..3a384c43a 100644 --- a/frontend/drupal/modules/simpletest/tests/system_project_namespace_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_project_namespace_test.info @@ -6,7 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = drupal:filter -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/system_test.info b/frontend/drupal/modules/simpletest/tests/system_test.info index 7221a8d6e..9f301f1b1 100644 --- a/frontend/drupal/modules/simpletest/tests/system_test.info +++ b/frontend/drupal/modules/simpletest/tests/system_test.info @@ -6,7 +6,7 @@ core = 7.x files[] = system_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/taxonomy_test.info b/frontend/drupal/modules/simpletest/tests/taxonomy_test.info index 4b8696bd4..ec0b3924a 100644 --- a/frontend/drupal/modules/simpletest/tests/taxonomy_test.info +++ b/frontend/drupal/modules/simpletest/tests/taxonomy_test.info @@ -6,7 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = taxonomy -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/theme_test.info b/frontend/drupal/modules/simpletest/tests/theme_test.info index 318c76873..f58f8030c 100644 --- a/frontend/drupal/modules/simpletest/tests/theme_test.info +++ b/frontend/drupal/modules/simpletest/tests/theme_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info b/frontend/drupal/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info index e4338553e..1139b44c0 100644 --- a/frontend/drupal/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info +++ b/frontend/drupal/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info @@ -6,7 +6,7 @@ hidden = TRUE settings[basetheme_only] = base theme value settings[subtheme_override] = base theme value -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info b/frontend/drupal/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info index 188521739..6ee0b5143 100644 --- a/frontend/drupal/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info +++ b/frontend/drupal/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info @@ -6,7 +6,7 @@ hidden = TRUE settings[subtheme_override] = subtheme value -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/themes/test_theme/test_theme.info b/frontend/drupal/modules/simpletest/tests/themes/test_theme/test_theme.info index 470df24fd..75a4e88bd 100644 --- a/frontend/drupal/modules/simpletest/tests/themes/test_theme/test_theme.info +++ b/frontend/drupal/modules/simpletest/tests/themes/test_theme/test_theme.info @@ -17,7 +17,7 @@ stylesheets[all][] = system.base.css settings[theme_test_setting] = default value -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info b/frontend/drupal/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info index 1c23ececb..e70e191d2 100644 --- a/frontend/drupal/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info +++ b/frontend/drupal/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info @@ -4,7 +4,7 @@ core = 7.x hidden = TRUE engine = nyan_cat -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/update_script_test.info b/frontend/drupal/modules/simpletest/tests/update_script_test.info index 3084effa1..e98ed2585 100644 --- a/frontend/drupal/modules/simpletest/tests/update_script_test.info +++ b/frontend/drupal/modules/simpletest/tests/update_script_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/update_test_1.info b/frontend/drupal/modules/simpletest/tests/update_test_1.info index fa2eb75fe..3ab697a06 100644 --- a/frontend/drupal/modules/simpletest/tests/update_test_1.info +++ b/frontend/drupal/modules/simpletest/tests/update_test_1.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/update_test_2.info b/frontend/drupal/modules/simpletest/tests/update_test_2.info index fa2eb75fe..3ab697a06 100644 --- a/frontend/drupal/modules/simpletest/tests/update_test_2.info +++ b/frontend/drupal/modules/simpletest/tests/update_test_2.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/update_test_3.info b/frontend/drupal/modules/simpletest/tests/update_test_3.info index fa2eb75fe..3ab697a06 100644 --- a/frontend/drupal/modules/simpletest/tests/update_test_3.info +++ b/frontend/drupal/modules/simpletest/tests/update_test_3.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/url_alter_test.info b/frontend/drupal/modules/simpletest/tests/url_alter_test.info index e2775bb4d..80cb93327 100644 --- a/frontend/drupal/modules/simpletest/tests/url_alter_test.info +++ b/frontend/drupal/modules/simpletest/tests/url_alter_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/simpletest/tests/xmlrpc_test.info b/frontend/drupal/modules/simpletest/tests/xmlrpc_test.info index c83dae688..c64924176 100644 --- a/frontend/drupal/modules/simpletest/tests/xmlrpc_test.info +++ b/frontend/drupal/modules/simpletest/tests/xmlrpc_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/statistics/statistics.info b/frontend/drupal/modules/statistics/statistics.info index f55e71530..ebe6be5b0 100644 --- a/frontend/drupal/modules/statistics/statistics.info +++ b/frontend/drupal/modules/statistics/statistics.info @@ -6,7 +6,7 @@ core = 7.x files[] = statistics.test configure = admin/config/system/statistics -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/syslog/syslog.info b/frontend/drupal/modules/syslog/syslog.info index 45ee371c7..90b55f9b5 100644 --- a/frontend/drupal/modules/syslog/syslog.info +++ b/frontend/drupal/modules/syslog/syslog.info @@ -6,7 +6,7 @@ core = 7.x files[] = syslog.test configure = admin/config/development/logging -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/system/system.info b/frontend/drupal/modules/system/system.info index 6cff0a625..30f827ff4 100644 --- a/frontend/drupal/modules/system/system.info +++ b/frontend/drupal/modules/system/system.info @@ -12,7 +12,7 @@ files[] = system.test required = TRUE configure = admin/config/system -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/system/system.install b/frontend/drupal/modules/system/system.install index d6707bedf..01b0af474 100644 --- a/frontend/drupal/modules/system/system.install +++ b/frontend/drupal/modules/system/system.install @@ -520,6 +520,37 @@ function system_requirements($phase) { } } + // Warning for httpoxy on IIS with affected PHP versions. + // @see https://www.drupal.org/node/2783079 + if (strpos($software, 'Microsoft-IIS') !== FALSE && (version_compare(PHP_VERSION, '5.5.38', '<') + || (version_compare(PHP_VERSION, '5.6.0', '>=') && version_compare(PHP_VERSION, '5.6.24', '<')) + || (version_compare(PHP_VERSION, '7.0.0', '>=') && version_compare(PHP_VERSION, '7.0.9', '<')) + )) { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $webconfig = file_get_contents('web.config'); + // If you are here the web.config file must - of course - be well formed. + // But the PHP DOM component will throw warnings on some XML compliant + // stuff, so silently parse the configuration file. + @$dom->loadHTML($webconfig); + $httpoxy_rewrite = FALSE; + foreach ($dom->getElementsByTagName('rule') as $rule) { + foreach ($rule->attributes as $attr) { + if (@$attr->name == 'name' && @$attr->nodeValue == 'Erase HTTP_PROXY') { + $httpoxy_rewrite = TRUE; + break 2; + } + } + } + if (!$httpoxy_rewrite) { + $requirements['iis_httpoxy_protection'] = array( + 'title' => t('IIS httpoxy protection'), + 'value' => t('Your PHP runtime version is affected by the httpoxy vulnerability.'), + 'description' => t('Either update your PHP runtime version or uncomment the "Erase HTTP_PROXY" rule in your web.config file and add HTTP_PROXY to the allowed headers list. See more details in the security advisory.', array('@link' => 'https://www.drupal.org/SA-CORE-2016-003')), + 'severity' => REQUIREMENT_ERROR, + ); + } + } + return $requirements; } diff --git a/frontend/drupal/modules/system/tests/cron_queue_test.info b/frontend/drupal/modules/system/tests/cron_queue_test.info index c2c263643..116a661c8 100644 --- a/frontend/drupal/modules/system/tests/cron_queue_test.info +++ b/frontend/drupal/modules/system/tests/cron_queue_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/system/tests/system_cron_test.info b/frontend/drupal/modules/system/tests/system_cron_test.info index 36a21de0f..1f1e03d88 100644 --- a/frontend/drupal/modules/system/tests/system_cron_test.info +++ b/frontend/drupal/modules/system/tests/system_cron_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/taxonomy/taxonomy.info b/frontend/drupal/modules/taxonomy/taxonomy.info index d696969d7..ad773aeca 100644 --- a/frontend/drupal/modules/taxonomy/taxonomy.info +++ b/frontend/drupal/modules/taxonomy/taxonomy.info @@ -8,7 +8,7 @@ files[] = taxonomy.module files[] = taxonomy.test configure = admin/structure/taxonomy -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/toolbar/toolbar.info b/frontend/drupal/modules/toolbar/toolbar.info index 0ffdee0ea..7944ab7b4 100644 --- a/frontend/drupal/modules/toolbar/toolbar.info +++ b/frontend/drupal/modules/toolbar/toolbar.info @@ -4,7 +4,7 @@ core = 7.x package = Core version = VERSION -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/tracker/tracker.info b/frontend/drupal/modules/tracker/tracker.info index eb4f6db49..6463bc776 100644 --- a/frontend/drupal/modules/tracker/tracker.info +++ b/frontend/drupal/modules/tracker/tracker.info @@ -6,7 +6,7 @@ version = VERSION core = 7.x files[] = tracker.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/translation/tests/translation_test.info b/frontend/drupal/modules/translation/tests/translation_test.info index b5e861514..6b5b43dfa 100644 --- a/frontend/drupal/modules/translation/tests/translation_test.info +++ b/frontend/drupal/modules/translation/tests/translation_test.info @@ -5,7 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/translation/translation.info b/frontend/drupal/modules/translation/translation.info index 4362b7d44..fe2d19d5b 100644 --- a/frontend/drupal/modules/translation/translation.info +++ b/frontend/drupal/modules/translation/translation.info @@ -6,7 +6,7 @@ version = VERSION core = 7.x files[] = translation.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/trigger/tests/trigger_test.info b/frontend/drupal/modules/trigger/tests/trigger_test.info index 1b1099e44..acc680c29 100644 --- a/frontend/drupal/modules/trigger/tests/trigger_test.info +++ b/frontend/drupal/modules/trigger/tests/trigger_test.info @@ -4,7 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/trigger/trigger.info b/frontend/drupal/modules/trigger/trigger.info index 7d18ab017..5c7013c9d 100644 --- a/frontend/drupal/modules/trigger/trigger.info +++ b/frontend/drupal/modules/trigger/trigger.info @@ -6,7 +6,7 @@ core = 7.x files[] = trigger.test configure = admin/structure/trigger -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/aaa_update_test.info b/frontend/drupal/modules/update/tests/aaa_update_test.info index 290880308..1e163cc99 100644 --- a/frontend/drupal/modules/update/tests/aaa_update_test.info +++ b/frontend/drupal/modules/update/tests/aaa_update_test.info @@ -4,7 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/bbb_update_test.info b/frontend/drupal/modules/update/tests/bbb_update_test.info index 55eb983b4..c4fd1dbef 100644 --- a/frontend/drupal/modules/update/tests/bbb_update_test.info +++ b/frontend/drupal/modules/update/tests/bbb_update_test.info @@ -4,7 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/ccc_update_test.info b/frontend/drupal/modules/update/tests/ccc_update_test.info index 981b5b381..2e9cffb69 100644 --- a/frontend/drupal/modules/update/tests/ccc_update_test.info +++ b/frontend/drupal/modules/update/tests/ccc_update_test.info @@ -4,7 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info b/frontend/drupal/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info index 06efabaa2..90d9ce3ea 100644 --- a/frontend/drupal/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info +++ b/frontend/drupal/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info @@ -3,7 +3,7 @@ description = Test theme which is used as admin theme. core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info b/frontend/drupal/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info index dc984ae9a..3b92ff10f 100644 --- a/frontend/drupal/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info +++ b/frontend/drupal/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info @@ -3,7 +3,7 @@ description = Test theme which acts as a base theme for other test subthemes. core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info b/frontend/drupal/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info index afdbc931c..c2e05c860 100644 --- a/frontend/drupal/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info +++ b/frontend/drupal/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info @@ -4,7 +4,7 @@ core = 7.x base theme = update_test_basetheme hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/tests/update_test.info b/frontend/drupal/modules/update/tests/update_test.info index 0844cdd68..47ca4dda2 100644 --- a/frontend/drupal/modules/update/tests/update_test.info +++ b/frontend/drupal/modules/update/tests/update_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/update/update.info b/frontend/drupal/modules/update/update.info index 95b1c78d2..d564fbdae 100644 --- a/frontend/drupal/modules/update/update.info +++ b/frontend/drupal/modules/update/update.info @@ -6,7 +6,7 @@ core = 7.x files[] = update.test configure = admin/reports/updates/settings -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/user/tests/user_flood_test.info b/frontend/drupal/modules/user/tests/user_flood_test.info index 845418525..5b25a920a 100644 --- a/frontend/drupal/modules/user/tests/user_flood_test.info +++ b/frontend/drupal/modules/user/tests/user_flood_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/user/tests/user_form_test.info b/frontend/drupal/modules/user/tests/user_form_test.info index 0cfa543cb..1dabda93d 100644 --- a/frontend/drupal/modules/user/tests/user_form_test.info +++ b/frontend/drupal/modules/user/tests/user_form_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/user/tests/user_session_test.info b/frontend/drupal/modules/user/tests/user_session_test.info index ca482bdb5..781643bf4 100644 --- a/frontend/drupal/modules/user/tests/user_session_test.info +++ b/frontend/drupal/modules/user/tests/user_session_test.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/modules/user/user.info b/frontend/drupal/modules/user/user.info index 4bed910d2..221d12acb 100644 --- a/frontend/drupal/modules/user/user.info +++ b/frontend/drupal/modules/user/user.info @@ -9,7 +9,7 @@ required = TRUE configure = admin/config/people stylesheets[all][] = user.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/profiles/minimal/minimal.info b/frontend/drupal/profiles/minimal/minimal.info index bd8f3f6f5..5c58ad0d1 100644 --- a/frontend/drupal/profiles/minimal/minimal.info +++ b/frontend/drupal/profiles/minimal/minimal.info @@ -5,7 +5,7 @@ core = 7.x dependencies[] = block dependencies[] = dblog -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/profiles/standard/standard.info b/frontend/drupal/profiles/standard/standard.info index 2e10e0d05..c95011aef 100644 --- a/frontend/drupal/profiles/standard/standard.info +++ b/frontend/drupal/profiles/standard/standard.info @@ -24,7 +24,7 @@ dependencies[] = field_ui dependencies[] = file dependencies[] = rdf -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/frontend/drupal/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index 79d3e5bcf..127a9ca1b 100644 --- a/frontend/drupal/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/frontend/drupal/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -6,7 +6,7 @@ core = 7.x hidden = TRUE files[] = drupal_system_listing_compatible_test.test -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/frontend/drupal/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info index 91e34f6c6..b7f6cc052 100644 --- a/frontend/drupal/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info +++ b/frontend/drupal/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info @@ -8,7 +8,7 @@ version = VERSION core = 6.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/profiles/testing/testing.info b/frontend/drupal/profiles/testing/testing.info index bf2a85a18..173e2b21e 100644 --- a/frontend/drupal/profiles/testing/testing.info +++ b/frontend/drupal/profiles/testing/testing.info @@ -4,7 +4,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/scripts/run-tests.sh b/frontend/drupal/scripts/run-tests.sh index f5c4a144f..b18fd142a 100755 --- a/frontend/drupal/scripts/run-tests.sh +++ b/frontend/drupal/scripts/run-tests.sh @@ -156,6 +156,23 @@ All arguments are long options. --verbose Output detailed assertion messages in addition to summary. + --fail-only When paired with --verbose, do not print the detailed messages + for passing tests. + + --cache (Experimental) Cache result of setUp per installation profile. + This will create one cache entry per profile and is generally safe + to use. + To clear all cache entries use --clean. + + --cache-modules + + (Experimental) Cache result of setUp per installation profile and + installed modules. This will create one copy of the database + tables per module-combination and therefore this option should not + be used when running all tests. This is most useful for local + development of individual test cases. This option implies --cache. + To clear all cache entries use --clean. + [,[, ...]] One or more tests to be run. By default, these are interpreted @@ -199,7 +216,10 @@ function simpletest_script_parse_args() { 'directory' => '', 'color' => FALSE, 'verbose' => FALSE, + 'cache' => FALSE, + 'cache-modules' => FALSE, 'test_names' => array(), + 'fail-only' => FALSE, // Used internally. 'test-id' => 0, 'execute-test' => '', @@ -380,6 +400,8 @@ function simpletest_script_execute_batch($test_id, $test_classes) { * Bootstrap Drupal and run a single test. */ function simpletest_script_run_one_test($test_id, $test_class) { + global $args; + try { // Bootstrap Drupal. drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); @@ -387,6 +409,8 @@ function simpletest_script_run_one_test($test_id, $test_class) { simpletest_classloader_register(); $test = new $test_class($test_id); + $test->useSetupInstallationCache = !empty($args['cache']); + $test->useSetupModulesCache = !empty($args['cache-modules']); $test->run(); $info = $test->getInfo(); @@ -422,6 +446,13 @@ function simpletest_script_command($test_id, $test_class) { if ($args['color']) { $command .= ' --color'; } + if ($args['cache-modules']) { + $command .= ' --cache --cache-modules'; + } + elseif ($args['cache']) { + $command .= ' --cache'; + } + $command .= " --php " . escapeshellarg($php) . " --test-id $test_id --execute-test " . escapeshellarg($test_class); return $command; } @@ -677,7 +708,7 @@ function simpletest_script_reporter_display_results() { $results = db_query("SELECT * FROM {simpletest} WHERE test_id = :test_id ORDER BY test_class, message_id", array(':test_id' => $test_id)); $test_class = ''; foreach ($results as $result) { - if (isset($results_map[$result->status])) { + if (isset($results_map[$result->status]) && (!$args['fail-only'] || $result->status !== 'pass')) { if ($result->test_class != $test_class) { // Display test class every time results are for new test class. echo "\n\n---- $result->test_class ----\n\n\n"; diff --git a/frontend/drupal/themes/bartik/bartik.info b/frontend/drupal/themes/bartik/bartik.info index 7cae615b3..362a89c8a 100644 --- a/frontend/drupal/themes/bartik/bartik.info +++ b/frontend/drupal/themes/bartik/bartik.info @@ -34,7 +34,7 @@ regions[footer] = Footer settings[shortcut_module_link] = 0 -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/themes/garland/garland.info b/frontend/drupal/themes/garland/garland.info index 8f05df631..af05df347 100644 --- a/frontend/drupal/themes/garland/garland.info +++ b/frontend/drupal/themes/garland/garland.info @@ -7,7 +7,7 @@ stylesheets[all][] = style.css stylesheets[print][] = print.css settings[garland_width] = fluid -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/themes/seven/seven.info b/frontend/drupal/themes/seven/seven.info index 0de4cdf22..0a0ff0113 100644 --- a/frontend/drupal/themes/seven/seven.info +++ b/frontend/drupal/themes/seven/seven.info @@ -13,7 +13,7 @@ regions[page_bottom] = Page bottom regions[sidebar_first] = First sidebar regions_hidden[] = sidebar_first -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/themes/stark/stark.info b/frontend/drupal/themes/stark/stark.info index b66f128d5..9801638e7 100644 --- a/frontend/drupal/themes/stark/stark.info +++ b/frontend/drupal/themes/stark/stark.info @@ -5,7 +5,7 @@ version = VERSION core = 7.x stylesheets[all][] = layout.css -; Information added by Drupal.org packaging script on 2021-04-21 -version = "7.80" +; Information added by Drupal.org packaging script on 2021-06-02 +version = "7.81" project = "drupal" -datestamp = "1619021862" +datestamp = "1622633234" diff --git a/frontend/drupal/web.config b/frontend/drupal/web.config index 1d82aab63..dcf948dbb 100644 --- a/frontend/drupal/web.config +++ b/frontend/drupal/web.config @@ -26,6 +26,18 @@ + diff --git a/sql/update2.sql b/sql/update2.sql index 47f0ea37d..571af115c 100644 --- a/sql/update2.sql +++ b/sql/update2.sql @@ -9499,3 +9499,8 @@ UPDATE misc SET value='21.05.24' WHERE what="version"; INSERT INTO srv_help (help, what) VALUES ('Operatorji', 'srv_if_operator'); UPDATE misc SET value='21.05.25' WHERE what="version"; + + +# Drupal verzija je bila posodobljena in vpišemo na 1ka.si in te +UPDATE misc SET value='7.81' WHERE what="drupal version"; +UPDATE misc SET value='21.06.10' WHERE what="version";