Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2021-2022. El repo del trabajo está aquí.

La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. Introducción

El 80% de la riqueza mundial está en manos del 1% de las personas, y en 2018 las 8 personas más ricas tenían tanta riqueza como la mitad más pobre de la humanidad1.

Este trabajo tiene como objetivo mostrar cómo, según la revista Forbes, el grupo de las personas más ricas del mundo ha cambiado a lo largo de los años. Responderá a las preguntas de quiénes se encuentran entre las personas más ricas del mundo, en qué países se encuentran los multimillonarios y cómo cambia su edad y su riqueza promedio con el tiempo. Para 2021, se examinará la participación de diferentes sectores empresariales en la lista de 100 multimillonarios y para 2019, la referencia al ranking de libertad económica de los países del mundo.

2. Datos

Desgargando los datos

A lo largo de este análisis voy a utilizar los datos sacados de la pagina web Kaggle.

#Cargo los datos previamente desgargados de la pagina Kaggle
df <- read.csv("./datos/billionaires.csv", fileEncoding="UTF-8")
bil21 <- read.csv("./datos/Billionaire 2021.csv")
bilgeo <- read.csv("./datos/forbes_billionaires_geo.csv")
ecofree19 <- read.csv("./datos/economic_freedom_index2019_data.csv")

Chequeando los datos

#chequeo tipo de datos en los datasets
str(df)
#> 'data.frame':    200 obs. of  7 variables:
#>  $ year         : int  2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 ...
#>  $ rank         : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ name         : chr  "Jeff Bezos" "Elon Musk" "Bernard Arnault & family" "Bill Gates" ...
#>  $ net_worth    : num  177 151 150 124 97 96 93 91.5 89 84.5 ...
#>  $ age          : int  57 49 72 65 36 90 76 48 47 63 ...
#>  $ natinality   : chr  "United States" "United States" "France" "United States" ...
#>  $ source_wealth: chr  "Amazon" "Tesla, SpaceX" "LVMH" "Microsoft" ...
names(df)
#> [1] "year"          "rank"          "name"          "net_worth"    
#> [5] "age"           "natinality"    "source_wealth"

str(bil21)
#> 'data.frame':    2755 obs. of  7 variables:
#>  $ Name    : chr  "Jeff Bezos" "Elon Musk" "Bernard Arnault & family" "Bill Gates" ...
#>  $ NetWorth: chr  "$177 B" "$151 B" "$150 B" "$124 B" ...
#>  $ Country : chr  "United States" "United States" "France" "United States" ...
#>  $ Source  : chr  "Amazon" "Tesla, SpaceX" "LVMH" "Microsoft" ...
#>  $ Rank    : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ Age     : chr  "57" "49" "72" "65" ...
#>  $ Industry: chr  "Technology" "Automotive" "Fashion & Retail" "Technology" ...
names(bil21)
#> [1] "Name"     "NetWorth" "Country"  "Source"   "Rank"     "Age"      "Industry"

str(bilgeo)
#> 'data.frame':    2755 obs. of  13 variables:
#>  $ Name       : chr  "Jeff Bezos" "Elon Musk" "Bernard Arnault & family" "Bill Gates" ...
#>  $ NetWorth   : num  177 151 150 124 97 96 93 91.5 89 84.5 ...
#>  $ Country    : chr  "United States" "United States" "France" "United States" ...
#>  $ Source     : chr  "Amazon" "Tesla, SpaceX" "LVMH" "Microsoft" ...
#>  $ Rank       : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ Age        : num  57 49 72 65 36 90 76 48 47 64 ...
#>  $ Residence  : chr  "Seattle, Washington" "Austin, Texas" "Paris, France" "Medina, Washington" ...
#>  $ Citizenship: chr  "United States" "United States" "France" "United States" ...
#>  $ Status     : chr  "In Relationship" "In Relationship" "Married" "Divorced" ...
#>  $ Children   : num  4 7 5 3 2 3 4 1 3 3 ...
#>  $ Education  : chr  "Bachelor of Arts/Science, Princeton University" "Bachelor of Arts/Science, University of Pennsylvania" "Bachelor of Arts/Science, Ecole Polytechnique de Paris" "Drop Out, Harvard University" ...
#>  $ Self_made  : chr  "True" "True" "False" "True" ...
#>  $ geometry   : chr  "POINT (-122.3300624 47.6038321)" "POINT (-97.74369950000001 30.2711286)" "POINT (2.3514616 48.8566969)" "POINT (-122.2264453 47.620548)" ...
names(bilgeo)
#>  [1] "Name"        "NetWorth"    "Country"     "Source"      "Rank"       
#>  [6] "Age"         "Residence"   "Citizenship" "Status"      "Children"   
#> [11] "Education"   "Self_made"   "geometry"

str(ecofree19)
#> 'data.frame':    186 obs. of  34 variables:
#>  $ CountryID                  : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ Country.Name               : chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
#>  $ WEBNAME                    : chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
#>  $ Region                     : chr  "Asia-Pacific" "Europe" "Middle East and North Africa" "Sub-Saharan Africa" ...
#>  $ World.Rank                 : chr  "152" "52" "171" "156" ...
#>  $ Region.Rank                : chr  "39" "27" "14" "33" ...
#>  $ X2019.Score                : chr  "51.5" "66.5" "46.2" "50.6" ...
#>  $ Property.Rights            : chr  "19.6" "54.8" "31.6" "35.9" ...
#>  $ Judical.Effectiveness      : chr  "29.6" "30.6" "36.2" "26.6" ...
#>  $ Government.Integrity       : chr  "25.2" "40.4" "28.9" "20.5" ...
#>  $ Tax.Burden                 : chr  "91.7" "86.3" "76.4" "83.9" ...
#>  $ Gov.t.Spending             : chr  "80.3" "73.9" "48.7" "80.7" ...
#>  $ Fiscal.Health              : chr  "99.3" "80.6" "18.7" "58.2" ...
#>  $ Business.Freedom           : chr  "49.2" "69.3" "61.6" "55.7" ...
#>  $ Labor.Freedom              : chr  "60.4" "52.7" "49.9" "58.8" ...
#>  $ Monetary.Freedom           : chr  "76.7" "81.5" "74.9" "55.4" ...
#>  $ Trade.Freedom              : chr  "66.0" "87.8" "67.4" "61.2" ...
#>  $ Investment.Freedom         : chr  "10" "70" "30" "30" ...
#>  $ Financial.Freedom          : chr  "10" "70" "30" "40" ...
#>  $ Tariff.Rate....            : chr  "7.0" "1.1" "8.8" "9.4" ...
#>  $ Income.Tax.Rate....        : chr  "20.0" "23.0" "35.0" "17.0" ...
#>  $ Corporate.Tax.Rate....     : chr  "20.0" "15.0" "23.0" "30.0" ...
#>  $ Tax.Burden...of.GDP        : chr  "5.0" "24.9" "24.5" "20.6" ...
#>  $ Gov.t.Expenditure...of.GDP : chr  "25.6" "29.5" "41.4" "25.3" ...
#>  $ Country                    : chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
#>  $ Population..Millions.      : chr  "35.5" "2.9" "41.5" "28.2" ...
#>  $ GDP..Billions..PPP.        : chr  "$69.6 " "$36.0 " "$632.9 " "$190.3 " ...
#>  $ GDP.Growth.Rate....        : chr  "2.5" "3.9" "2.0" "0.7" ...
#>  $ X5.Year.GDP.Growth.Rate....: chr  "2.9" "2.5" "3.1" "2.9" ...
#>  $ GDP.per.Capita..PPP.       : chr  "$1,958" "$12,507" "$15,237" "$6,753" ...
#>  $ Unemployment....           : chr  "8.8" "13.9" "10.0" "8.2" ...
#>  $ Inflation....              : chr  "5.0" "2.0" "5.6" "31.7" ...
#>  $ FDI.Inflow..Millions.      : chr  "53.9" "1,119.1" "1,203.0" "-2,254.5" ...
#>  $ Public.Debt....of.GDP.     : chr  "7.3" "71.2" "25.8" "65.3" ...
names(ecofree19)
#>  [1] "CountryID"                   "Country.Name"               
#>  [3] "WEBNAME"                     "Region"                     
#>  [5] "World.Rank"                  "Region.Rank"                
#>  [7] "X2019.Score"                 "Property.Rights"            
#>  [9] "Judical.Effectiveness"       "Government.Integrity"       
#> [11] "Tax.Burden"                  "Gov.t.Spending"             
#> [13] "Fiscal.Health"               "Business.Freedom"           
#> [15] "Labor.Freedom"               "Monetary.Freedom"           
#> [17] "Trade.Freedom"               "Investment.Freedom"         
#> [19] "Financial.Freedom"           "Tariff.Rate...."            
#> [21] "Income.Tax.Rate...."         "Corporate.Tax.Rate...."     
#> [23] "Tax.Burden...of.GDP"         "Gov.t.Expenditure...of.GDP" 
#> [25] "Country"                     "Population..Millions."      
#> [27] "GDP..Billions..PPP."         "GDP.Growth.Rate...."        
#> [29] "X5.Year.GDP.Growth.Rate...." "GDP.per.Capita..PPP."       
#> [31] "Unemployment...."            "Inflation...."              
#> [33] "FDI.Inflow..Millions."       "Public.Debt....of.GDP."

Procesando los datos

#cambio el nombre de la columna en df
df <- df %>% rename(nationality = natinality)

#Conjunto dos datasets de 2021
bil21 <- bil21 %>% 
  select(Name, Industry)

bil21 <- left_join(bilgeo, bil21, by = "Name")

rm(bilgeo)

#ajusto el dataset a las necesidades del analisis 
ecofree19 <- ecofree19 %>% 
  select(Country = Country.Name, World.Rank, Region) %>% 
  mutate(World_rank = as.integer(World.Rank), .before = Region) %>% 
  select(!World.Rank)






3. Análisis de las personas más ricas en 2021

Al principio quiero examinar la situación entre los multimillonarios en 2021. Voy a comprobar quién fue más rico en el mundo según Forbes en este año, en que industrias operaban los multimillonarios y en cuales países la concentración del patrimonio fue más grande. Luego iré a los datos personales como edad o número de hijos que tienen.

3.1 Análisis general

Las cinco personas más ricas en el mundo en 2021

En la siguiente tabla, podemos ver quién ocupó los 5 primeros lugares entre las personas más ricas del mundo según el ranking del Forbes, de qué países provienen las personas seleccionadas y cuál es la fuente de su riqueza.


#tabla
df1 <- df %>% 
  filter(year == 2021, rank <= 5)

photo <- c("https://besthqwallpapers.com/Uploads/12-2-2021/154136/thumb2-jeff-bezos-2021-american-entrepreneur-guys-american-celebrity.jpg", "https://s1.cdn.autoevolution.com/images/news/tesla-patents-are-now-free-for-all-company-wont-sue-if-used-in-good-faith-132103_1.jpg", 
         "https://robbreport.com/wp-content/uploads/2020/01/shutterstock_1106081120-digi.jpg",
         "https://miro.medium.com/max/900/1*NIcdbmI2XEeF4ZgANs-nTw.jpeg", "https://cdn.images.express.co.uk/img/dynamic/59/590x/625516_1.jpg")

df1_con_fotos <- df1 %>% select(!year & !age) %>% add_column(photo) %>%
  mutate(nationality = case_when(
    str_detect(nationality,'France') ~ "https://raw.githubusercontent.com/BjnNowak/TdF/main/fr.png",
    str_detect(nationality,'United States') ~ "https://raw.githubusercontent.com/BjnNowak/TdF/main/us.png"
  ))


df1_con_fotos %>% gt() %>% 
  gt::text_transform(locations = cells_body(columns = c(photo)),
                     fn = function(x) {gt::web_image(x, height = 80)}) %>% 
  gtExtras::gt_img_rows(columns = nationality, height = 40) %>%
  gtExtras::gt_theme_nytimes() %>% 
  cols_label(
    net_worth = md("Net worth<br>(billion $)"),
    source_wealth = "source wealth") %>%
  tab_style(
    style = list(
      cell_text(font=google_font(
        name = "Roboto Condensed"
      ), align = "center",v_align = "middle")),
    locations = cells_column_labels(
      columns = c(
        rank, name, net_worth, nationality, source_wealth, photo)
    ))
rank name Net worth
(billion $)
nationality source wealth photo
1 Jeff Bezos 177 Amazon
2 Elon Musk 151 Tesla, SpaceX
3 Bernard Arnault & family 150 LVMH
4 Bill Gates 124 Microsoft
5 Mark Zuckerberg 97 Facebook

Industrias más populares en 2021 que generan los ingresos para los multimillonarios

En el siguiente paso descubriremos qué industrias generaron riqueza para los ricos en el ranking.


# world cloud industry
D_words <- bil21 %>%
  select(Industry) %>%
  group_by(Industry) %>% 
  count(name = "Freq") %>% 
  arrange(desc(Freq)) %>% 
  ungroup()
  

Cl <- D_words

hwordcloud(text = Cl$Industry, size = Cl$Freq, 
           width = "100%", height = "320px",
           theme = "darkblue")

Como podemos observar, el mayor número de empresas se encontraba en la industria financiera y de inversiones (371 empresas), seguida de la tecnología (366) y la manufactura (333 empresas). Los siguientes resultados se situaban por debajo de las 300 empresas (sanidad, inmobiliaria, alimentación y bebidas).

Concentración de riqueza en el mundo en 2021

Ahora se mostrará en el mapa la concentración de riqueza en 2021.

#mapa concentración del patrimonio en 2021

data(World)
world <- World ; rm(World)

world1 <- world %>% 
  select(Country = name, geometry)

mapa1 <- bil21 %>% 
  select(NetWorth, Country) %>% 
  group_by(Country) %>% 
  mutate (suma = sum(NetWorth)) %>% 
  distinct(Country, suma) 

mapa2 <- left_join(world1, mapa1, by = "Country")


ggplot() + geom_sf(data = mapa2, aes(fill = suma)) +
  scale_fill_continuous_sequential(palette = "Red-blue", name = "Miles de milliones de dólares")+
  labs(
    title = "Concentración del patrimonio en 2021"
   ) +  theme_void() +
   theme(legend.position = "bottom", legend.key.width = unit(1, "cm"))

Definitivamente, la mayor cantidad del patrimonio de las personas con una riqueza estimada en más de un millón de dólares se encuentra en los Estados Unidos, seguida de China. Al mismo tiempo, las personas con una riqueza igual o superior a mil millones de dólares se encuentran en prácticamente todos los continentes.

3.2 Análisis de los datos personales de los multimillonarios en 2021

En esta parte, voy a analizar disponibles datos personales de personas del ranking Forbes. Primero comenzaré mostrando una tabla con los resultados extremos y medios de edad, patrimonio y número de hijos para el año 2021.

Datos extremos y medios: edad, riqueza y número de hijos

#edad
age <- bil21 %>% 
  select(Age) %>% 
  drop_na()

min <- age %>% 
  slice_min(Age, n = 1) %>% 
  rename(Min = Age)

max <- age %>% 
  slice_max(Age, n = 1) %>% 
  rename(Max = Age)

mean <- age %>% 
  summarise(Mean = mean(Age, na.rm = TRUE))

#patrimonio
Net <- bil21 %>% 
  select(NetWorth)

Nmin <- Net %>% 
  slice_min(NetWorth, n = 1) %>% 
  rename(Min = NetWorth)

Nmax <- Net %>% 
  slice_max(NetWorth, n = 1) %>% 
  rename(Max = NetWorth)

Nmean <- Net %>% 
  summarise(Mean = mean(NetWorth, na.rm = TRUE))

#hijos
Child <- bil21 %>% 
  select(Children) %>% 
  drop_na()

Cmin <- Child %>% 
  slice_min(Children, n = 1) %>% 
  rename(Min = Children)

Cmax <- Child %>% 
  slice_max(Children, n = 1) %>% 
  rename(Max = Children)

Cmean <- Child %>% 
  summarise(Mean = mean(Children, na.rm = TRUE))

# Tabla data
TablaMean <- mean %>% 
  rbind(Nmean, Cmean)

TablaMax <- max %>% 
  rbind(Nmax, Cmax)

TablaMin <- min %>% 
  rbind(1, 0)

Tabla21 <- bind_cols(" " = rbind("Age", "Net Worth (billion $)", "Children")) %>% 
  bind_cols(TablaMin, TablaMean, TablaMax) 

rm(min, max, mean, Nmin, Nmax, Nmean, Cmin, Cmax, Cmean, TablaMin, TablaMax, TablaMean, Child)
  
# Tabla


kbl(Tabla21) %>%
  kable_material_dark()
Min Mean Max
Age 18 63.265175 99
Net Worth (billion $) 1 4.744730 177
Children 0 2.976834 23

Generalmente, el multimillonario más joven en 2021 tiene 18 años, y el multimillonario más mayor tiene 99 años. La edad promedio en la lista es 63. Lo que muestra que un gran grupo de las 2761 personas que están en la lista son personas de mediana edad y mayores.

Para aparecer en la lista, el patrimonio neto debe ser de 1 mil millones de dólares, por lo tanto, este es el mínimo. El patrimonio neto promedio fue casi 5 mil millones, y el número uno en el ranking de los multimillonarios es una riqueza de 177 mil millones de dólares.

Podemos afirmar que los multimillonarios tienen un promedio de tres hijos y el poseedor del récord en la lista tiene hasta 23 hijos y este es Roman Avdeev de Russia.

Distribución de edad media y desviación típica.

En el gráfico de barras se mostrará la distribución de edad de los multimillonarios.

age <- bil21 %>% 
  select(Age) %>% 
  drop_na()

age_mean <- bil21 %>% 
  select(Name, Rank, Age, NetWorth, Children, Education) %>% 
  summarise(Mean = mean(Age, na.rm = TRUE), Des = sd(Age, na.rm = TRUE))

ggplot(age, aes(Age)) +
  geom_histogram(binwidth = 1, aes(y=..density..),  color="darkgrey", fill = "steelblue", alpha = 0.5)+
  geom_density( color="purple", size = 1) +
  stat_function(fun = dnorm, colour = "red", size = 1, args = list(mean = age_mean$Mean, sd = age_mean$Des))  + 
  xlim(c(15, 100)) +
  theme_minimal()+ 
  theme(axis.text.x=element_text(colour = "grey20", size = 8), axis.text.y=element_text(colour = "grey20", size = 8)) +
  annotate(geom = "text", x = 63.26, y = 0.033, label = "mean age = 63", size = 4.5, color = "darkblue") +
  #annotate(geom = "point", x = 63.26, y = 0.0297, colour = "firebrick3", size = 5, shape = 8) %>% 
  annotate("segment", x = 63.26, xend = 63.26, y = 0.0297, yend = 0.0319, colour = "darkblue", arrow = arrow(length = unit(2, "mm")))

Podemos notar que la mayor densidad de personas se encuentra en el rango de edad de 50 a 75 años. La edad promedio de las personas en la lista de Forbes es de aproximadamente 63 años. La densidad más alta está por delante del punto medio, como lo confirma la línea de desviación típica, en púrpura.

Edad y nacionalidad de las 5 personas más jóvenes en el ranking

age_min <- bil21 %>% 
  select(Name, Age, Rank, NetWorth, Country, Children, Education) %>% 
  slice_min(Age, n=5)

ggplot(age_min, aes(x=Name, y=Age, label = Country)) +
  geom_segment(aes(x=Name, xend=Name, y=0, yend=Age), color="orange", size = 1, linetype="dotdash") +
  geom_point(color="red", size=8, alpha=0.6) +
  geom_text(data = age_min, aes(label = Age), color = "yellow", size = 4) +
  coord_flip() +
  theme_light() +
  geom_label_repel()

El más joven de la lista es Kevin DavidLehmann, de 18 años, de Alemania. Él es la única persona en la lista de menores de 20 años. Este es un logro notable, a pesar de que la fortuna es patrimonio familiar y no proviene de su propio negocio. Entre las 5 personas más jóvenes también hay hermanos de Noruega y un ciudadano chino de 24 años. La lista la cierra Austin Russell, de 26 años, de Estados Unidos, que es el único que es el creador de su propia fortuna. Como dice wikipedia: “Su empresa Luminar Technologies se especializa en tecnologías lidar y percepción de máquinas, utilizadas principalmente en automóviles autónomos” 2.

Edad contra patrimonio

# age vs networth

AgeNet <- bil21 %>% 
  select(Age, NetWorth) %>% 
  drop_na()

ggplot(AgeNet, aes(Age, NetWorth)) +
  geom_point() +
  geom_jitter(color = "skyblue", alpha = 0.2) +
  coord_flip() +
    theme_minimal() +
  labs(
    title = "Relación entre edad y patrimonio neto",
    y = "Net worth"
  )

Como se puede ver en el gráfico, la mayor cantidad de personas tiene activos que no superan los 25 mil millones dólares, y entre ellos, como vimos en el gráfico anterior, el grupo de edad más grande son las personas entre 50 y 75 años. Al mismo tiempo, es difícil percibir la relación entre edad y riqueza, aunque las personas con el patrimonio neto más alto no son extremadamente jóvenes (menos de 35) o extremadamente mayores (más de 90). Entonces, parece que la construcción de una fortuna no depende de la edad, sino de la capacidad empresarial o del patrimonio familiar.

Edad y numero de hijos de las 5 personas mas ancianos en el ranking

age_max <- bil21 %>% 
  select(Name, Age, Rank, NetWorth, Country, Children, Education) %>% 
  slice_max(Age, n=5)


ggplot(age_max, aes(x=Name, y=Age)) +
  geom_segment(aes(x=Name, xend=Name, y=0, yend=Age), color="skyblue") +
  geom_point(color="darkblue", size=7, alpha=0.6) +
  geom_segment(aes(x=Name, xend=Name, y=0, yend=Children), color="skyblue") +
  geom_point(data = age_max, aes(Name, Children, color="pink", size=7, alpha=0.6)) +
  geom_text(data = age_max, aes(label = Age), color = "lightpink", size = 4) +
  theme_light() +
  coord_flip() +
  labs(
    title = "Número de hijos y edad",
    subtitle = "Las 6 personas más ancianas en el ranking en 2021",
    y = "Number of children and age"
  ) +
  theme(legend.position = "none") +
  annotate(geom = "text", x = "Robert Kuok", y = 8, label = "8", size = 4, color = "darkblue") +
  annotate(geom = "text", x = "Masatoshi Ito", y = 3, label = "3", size = 4, color = "darkblue") +
  annotate(geom = "text", x = "George Joseph", y = 5, label = "5", size = 4, color = "darkblue") +
  annotate(geom = "text", x = "David Murdock", y = 3, label = "3", size = 4, color = "darkblue") +
  annotate(geom = "text", x = "Charles Munger", y = 8, label = "8", size = 4, color = "darkblue") +
  annotate(geom = "text", x = "Masatoshi Ito", y = 49, label = "Número de hijos", size = 4, color = "darkblue") +
  annotate(geom = "curve", x = "Masatoshi Ito", y = 33, xend = "Robert Kuok", yend = 10, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "Masatoshi Ito", y = 33, xend = "Masatoshi Ito", yend = 5, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "Masatoshi Ito", y = 33, xend = "George Joseph", yend = 7, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm")))+
  annotate(geom = "curve", x = "Masatoshi Ito", y = 33, xend = "David Murdock", yend = 5, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "Masatoshi Ito", y = 33, xend = "Charles Munger", yend = 10, 
           curvature = .2, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "text", x = "David Murdock", y = 56, label = "Edad", size = 4, color = "darkblue") +
  annotate(geom = "curve", x = "David Murdock", y = 63, xend = "Robert Kuok", yend = 94, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "David Murdock", y = 63, xend = "Masatoshi Ito", yend = 94, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "David Murdock", y = 63, xend = "George Joseph", yend = 95, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm")))+
  annotate(geom = "curve", x = "David Murdock", y = 63, xend = "David Murdock", yend = 95, 
           curvature = .3, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "David Murdock", y = 63, xend = "Charles Munger", yend = 94, 
           curvature = .2, color = "skyblue", arrow = arrow(length = unit(2, "mm"))) +
  annotate(geom = "curve", x = "David Murdock", y = 63, xend = "Ana Maria Brescia Cafferata", yend = 94, 
           curvature = .2, color = "skyblue", arrow = arrow(length = unit(2, "mm")))

El gráfico muestra a las personas que ocupan los primeros 5 lugares entre las personas más ancianos de la lista. De hecho, el gráfico muestra los primeros 3 lugares con 6 personas, ya que el tercer lugar son las personas del mismo año, a la impresionante edad de 97 años. Los datos disponibles indican que 5 de los 6 multimillonarios más ancianos son hombres y tienen al menos tres hijos.

Las 5 personas que tienen más hijos

Al tener una fortuna muy grande, es extremadamente importante tener herederos. Por lo tanto, muy a menudo las personas más ricas del mundo tienen muchos descendientes a quienes pueden transmitir su riqueza. Ahora comprobaremos quiénes son las personas con el mayor número de hijos, cuántos años tienen, de qué países son, cuánto patrimonio tienen y qué puesto ocupan en la lista de Forbes.

Rec <- bil21 %>% 
  select(Name, Children, Age, Country, NetWorth, Rank, Source) %>% 
  slice_max(Children, n = 5)



kbl(Rec, align = "c") %>% 
  kable_minimal() %>% 
  column_spec(2, bold = T, color = "lightcoral") %>% 
  column_spec(1, bold = T) %>% 
  kable_styling(fixed_thead = list(enabled = T, 
                                   background = "lightcoral"))
Name Children Age Country NetWorth Rank Source
Roman Avdeev 23 53 Russia 1.8 1750 banking, development
Suhail Bahwan 15 82 Oman 2.3 1362 diversified
Frank VanderSloot 14 72 United States 3.4 891 nutrition, wellness products
David Siegel 13 86 United States 6.5 404 hedge funds
Farris Wilks 11 69 United States 1.3 2263 natural gas
Dan Gertler 11 47 Israel 1.2 2378 mining

Como muestran los datos de la tabla, el poseedor del récord es Roman Avdeev de Rusia, que tiene 23 hijos. Los siguientes lugares en el ranking pertenecen a los ciudadanos de Omán, Estados Unidos e Israel. Todas las personas de la lista son hombres y cada uno tiene más de 10 descendientes.

Relación entre el patrimonio neto y el número de hijos


NetChild <- bil21 %>% 
  select(Name, NetWorth, Children) %>% 
  drop_na()

ggplot(NetChild, aes(NetWorth, Children)) +  
  geom_point(color = "lightpink3", size = 2) +
  geom_point(shape = 1, color = "pink4") +
  geom_jitter(color = "mistyrose1", alpha = 0.2) +
  theme_minimal() +
  labs(
    title = "Relación entre patrimonio neto y numero de hijos",
    x = "Number of children",
    y = "Net worth"
  ) +
    annotate(geom = "text", x = 23, y = 24, label = "23 hijos, 1.8 mil millones $", color = "pink4") +
  annotate(geom = "text", x = 171, y = 8, angle=90, label = " 177 mil millones $, 4 hijos", color = "pink4")

El gráfico muestra que el grupo más grande no tiene más de 5 hijos y, al mismo tiempo, tiene una riqueza de hasta 25 mil millones dólares. Los extremos son 23 niños y 1,8 mil millones dólares del patrimonio neto de Roman Avdeev, y 177 mil millones dólares y 4 niños, un resultado que pertenece a Jeff Bezos.

Estado civil de los multimillonarios en 2021

Al final de esta parte del análisis, en el gráfico circular, veremos el estado civil de las personas con más de 1 mil millones dólares del patrimonio.

stan <- bil21 %>% 
  select(Status) %>% 
  group_by(Status) %>% 
  summarise(NN = n()) %>% 
  arrange(desc(NN)) %>% 
  ungroup()
stan[2, 1] <- "Unknown"




ggplot(stan, aes(x = "", y = NN, fill = Status))+
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start=0) +
  scale_fill_discrete_sequential(palette = "Hawaii") +
  theme_minimal() +
  labs(title = "Civil status",
       x = " ",
       y = " ")

Definitivamente más del 60% de las personas están casadas, las partes más pequeñas están ocupadas por personas divorciadas, viudas o solteras. Aproximadamente el 25% de los datos son de “estado desconocido”.

4. Análisis de las personas más ricas a lo largo del tiempo

En la segunda parte voy a usar los datos de los años 2002 - 2021, que indican las 10 personas más ricas en cada año. El database contiene también el tamaño del patrimonio neto, edad nacionalidad y la fuente de riqueza. Intentaré comprobar cómo cambian los resultados a lo largo del tiempo.

El cambio del tamaño del patrimonio a lo largo del tiempo

Ahora venimos a ilustrar el cambio en el tamaño del patrimonio en el período 2002-2021. Además podremos observar los cambios de las personas (o familias) en los seleccionados puestos del ranking.



Fortune <- df %>% 
  group_by(year) 

ggplot( Fortune,
        aes(year, net_worth, group = rank, color = factor(rank))
) +
  geom_line() +
  scale_color_viridis_d() +
  
  geom_text(check_overlap = TRUE, show.legend = FALSE, hjust = 1, vjust = 0, nudge_y = 2, aes(label = name)) +
  labs(x = "Year",
       y = "Net worth",
       color = "Rank") +
  theme_minimal() +
  theme(legend.position = "bottom", legend.key.width = unit(0.5, "cm")) +
  scale_x_continuous(breaks = seq(2000, 2025, 5), limits = c(2000, 2025)) +
  transition_reveal(year) +
  view_follow() 

En general, la tendencia es creciente, lo que significa, que el patrimonio en los 10 primeros puestos de la lista de Forbes es mayor casi cada año, o podemos decir, que el patrimonio aumenta en oleadas. Vale la pena mencionar que en 2002 el tamaño del patrimonio neto en el primer puesto de la lista fue 60 mil millones dólares, mientras que en el año 2021 es 177 mil millones dólares. Esto confirma la tesis de que los ricos se están volviendo más ricos y que la desigualdad de ingresos en el mundo se está profundizando3.

La edad promedio de las 10 personas más ricas en 2002-2021

En la siguiente animación podemos observar como cambia la edad media entre 2002 y 2021. Un tono más rojo, significa un promedio de edad más alto, el tinte amarillo - la edad media más baja. En el primer periodo la edad promedio creció, después fue variable pero alcanzó el más alto resultado en 2015, cuando fue de 74.3 años. Es importante destacar que desde 2003 la edad media de las 10 personas más ricas en el mundo no cayó por debajo de 60 años.

AgeMean <- df %>% 
  group_by(year) %>% 
  summarise(Mean = mean(age))

ggplot(AgeMean, aes(year, Mean, fill = Mean)) +
  geom_col()+
  theme_minimal() +
  xlab("Year") +
  theme(
    panel.grid = element_blank(),
    panel.grid.major.y = element_line(color = "white"),
    panel.ontop = TRUE,
    legend.position = "none"
  ) +
  scale_fill_continuous_sequential(palette = "OrYel") +
  scale_y_continuous(breaks = seq(0, 80, 20), limits = c(0, 80)) +
  transition_states(year, wrap = FALSE) +
  shadow_mark()

Mapa de concentración del patrimonio en 2002-2021

En el mapa de abajo se muestra el cambio en la concentración de la riqueza que pertenece a las 10 personas más ricas del mundo, desglosado por país.

data(World)
world <- World ; rm(World)

world1 <- world %>% 
  select(Country = name, geometry)

mapa2 <- df %>% 
  select(year, net_worth, Country = nationality) %>% 
  group_by(year, Country) %>% 
  mutate (suma = sum(net_worth)) %>% 
  distinct(year, Country, suma) 

mapa3 <- left_join(world1, mapa2, by = "Country")%>% 
  drop_na()

ggplot() + 
  geom_sf(data = world1) +
  geom_sf(data = mapa3, aes(fill = suma)) +
  scale_fill_continuous_sequential(palette = "Dark Mint", name = "Miles de milliones de dólares")+
  labs(
    title = "Year: {current_frame}"
  ) +  theme_void() +
   theme(legend.position = "bottom", legend.key.width = unit(1, "cm")) +
  transition_manual(year)

Es bastante obvio que en cada año, los Estados Unidos son marcados en el mapa, pero lo más interesante es, que la variedad de los países a la vanguardia disminuye cada año y los Estados Unidos concentran más y más de la riqueza. España desaparece del mapa en 2021, con la desaparición de la lista de las 10 personas más ricas de Amancio Ortega. Aunque, curiosamente se sitúa justo fuera de los 10 mejores puestos, en el puesto 114.

5. Comparación: el ranking Forbes y el ranking de libertad económica

El rango de los países en el ranking de los multimillonarios y en el ranking de libertad económica

Teniendo en cuenta que la riqueza tarda años en acumularse, decidí que tal comparación podría tener sentido. Para las necesidades de esta comparación, construí el ranking de países. El mejor puesto tiene el país que apareció más veces en la lista de los 10 multimillonarios en los años 2002-2019. Por otro lado, usaba el ranking de la libertad económica del 2019. Podemos observar los resultados en la tabla y en el gráfico. Los puntos azules marcan las posiciones de los países en el ranking de los multimillonarios y los cuadrados indican lugares en el ranking de libertad económica.


rank1 <- df %>% 
  filter(year <= 2019) %>% 
  select(Country = nationality) %>% 
  count(Country) %>% 
  rename(Observations = n) %>% 
  arrange(desc(Observations)) %>% 
  mutate(Rank = c(1:13)) %>% 
  select(!Observations)

rank1 <- left_join(rank1, ecofree19, by = "Country")

rank1 <- rank1 %>% 
  rename("RankE" = "World_rank")

kbl(rank1) %>% 
  kable_minimal() %>% 
  scroll_box(width = "420px", height = "160px") %>% 
  kable_styling(position = "c")
Country Rank RankE Region
United States 1 12 Americas
Mexico 2 66 Americas
India 3 129 Asia-Pacific
Spain 4 57 Europe
France 5 71 Europe
Germany 6 24 Europe
Sweden 7 19 Europe
Hong Kong 8 1 Asia-Pacific
Saudi Arabia 9 91 Middle East and North Africa
Brazil 10 150 Americas
Canada 11 8 Americas
Japan 12 30 Asia-Pacific
Russia 13 98 Europe
  
  
ggplot(rank1) +
  geom_segment(aes(x = Rank, xend = Rank, y = Rank, yend = RankE), color = "lightsteelblue3") +
  geom_point(aes(x = Rank, y = Rank), color = "midnightblue", shape = 20, size = 3, fill = "lightcyan1", stroke = 1) +
  geom_point(aes(x = Rank, y = RankE), color = "midnightblue", shape = 22, size = 3, fill = "oldlace", stroke = 1) +
  scale_x_reverse(breaks = seq(1, 13, 1), label = c("United States", "Mexico", "India", "Spain", "France", "Germany", "Sweden", "Hong Kong", "Saudi Arabia", "Brazil", "Canada", "Japan", "Russia" )) +
  coord_flip() +
  theme_minimal() +
  labs(
    title = "Los puestos en dos rankings",
    x = "Country"
  ) +
  scale_y_continuous(breaks = seq(1, 150, 149))

Analizando los resultados, como se puede ver, los Estados Unidos son el lugar que aparece con mayor frecuencia en la lista de las personas más ricas del mundo. También aparecieron allí varios países europeos, entre ellos España. Cuando comparamos los resultados de estos países en el ranking de libertad económica, a veces los puestos en ambos rankings son muy altos, pero para los países como Brasil, India o Rusia los resultados son divergentes. Estos países se situaban en la lista de los multimillonarios (esto ya es una distinción), pero su libertad económica no está en un puesto alto. Así que la comparación del ranking de los países más populares en la lista de los multimillonarios y el ranking de la libertad económica para estos países nos muestra que no hay una conexión entre estos factores.

6. Amancio Ortega en la lista de Forbes

Al final, un pequeño bonus. ¿Cuál es la presencia del único representante de España entre las 10 personas más ricas del mundo? En primer lugar, un poquito de datos sobre este célebre español, del año 2021. Luego un dibujo que muestra su imagen y por último, el cambio de su patrimonio neto a lo largo del tiempo.

ortega <- df %>% 
  filter(name == "Amancio Ortega")

ortegaT <- ortega %>% 
  filter(year == 2020) %>% 
  select(name, age, nationality, source = source_wealth)

kbl(ortegaT, align = "c") %>% 
  kable_paper() %>% 
  row_spec(1, bold = T, color = "white", background = "chocolate")
name age nationality source
Amancio Ortega 84 Spain Inditex, Zara

knitr::include_graphics(here::here("./assets/ortega3.jpeg"))

ortegaG <- ortega %>% 
  select(year, net_worth, rank)


ggplot(ortegaG, aes(year, net_worth)) +
  geom_line(color = "darkolivegreen3") +
  geom_point(color = "chocolate4", shape = 1, size = 3) +
  theme_minimal() +
  scale_x_continuous(breaks = seq(2007, 2021, 2), limits = c(2007, 2021)) +
  labs(
    title = "El cambio del patrimonio de Amancio Ortega",
    x = "Year",
    y = "Net worth (billion $)"
  ) + 
  annotate(geom = "text", x = 2007, y = 27, label = "24.0", size = 4) +
  annotate(geom = "text", x = 2017, y = 74, label = "71.3", size = 4) +
  annotate(geom = "point", shape = 1, x = 2017, y = 71.3, size = 3, color = "chocolate4") +
  transition_reveal(year)



7. Bibliografía y trabajos en los que ha basado

Para este análisis, utilicé las siguientes fuentes de Internet:



Información de mi R-sesión:

- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.1.1 (2021-08-10)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Polish_Poland.1250          
 ctype    Polish_Poland.1250          
 tz       Europe/Warsaw               
 date     2022-01-06                  

- Packages -------------------------------------------------------------------
 package      * version    date       lib source                               
 abind          1.4-5      2016-07-21 [1] CRAN (R 4.1.0)                       
 assertthat     0.2.1      2019-03-21 [1] CRAN (R 4.1.1)                       
 backports      1.2.1      2020-12-09 [1] CRAN (R 4.1.0)                       
 base64enc      0.1-3      2015-07-28 [1] CRAN (R 4.1.0)                       
 broom          0.7.9      2021-07-27 [1] CRAN (R 4.1.1)                       
 bslib          0.3.1      2021-10-06 [1] CRAN (R 4.1.2)                       
 cellranger     1.1.0      2016-07-27 [1] CRAN (R 4.1.1)                       
 checkmate      2.0.0      2020-02-06 [1] CRAN (R 4.1.1)                       
 class          7.3-19     2021-05-03 [2] CRAN (R 4.1.1)                       
 classInt       0.4-3      2020-04-07 [1] CRAN (R 4.1.1)                       
 cli            3.0.1      2021-07-17 [1] CRAN (R 4.1.1)                       
 clipr          0.7.1      2020-10-08 [1] CRAN (R 4.1.1)                       
 codetools      0.2-18     2020-11-04 [2] CRAN (R 4.1.1)                       
 colorspace   * 2.0-2      2021-06-24 [1] CRAN (R 4.1.1)                       
 commonmark     1.7        2018-12-01 [1] CRAN (R 4.1.1)                       
 crayon         1.4.2      2021-10-29 [1] CRAN (R 4.1.2)                       
 crosstalk      1.2.0      2021-11-04 [1] CRAN (R 4.1.2)                       
 DBI            1.1.1      2021-01-15 [1] CRAN (R 4.1.1)                       
 dbplyr         2.1.1      2021-04-06 [1] CRAN (R 4.1.1)                       
 desc           1.4.0      2021-09-28 [1] CRAN (R 4.1.2)                       
 details        0.2.1      2020-01-12 [1] CRAN (R 4.1.1)                       
 dichromat      2.0-0      2013-01-24 [1] CRAN (R 4.1.0)                       
 digest         0.6.27     2020-10-24 [1] CRAN (R 4.1.1)                       
 dplyr        * 1.0.7      2021-06-18 [1] CRAN (R 4.1.1)                       
 e1071          1.7-9      2021-09-16 [1] CRAN (R 4.1.2)                       
 ellipsis       0.3.2      2021-04-29 [1] CRAN (R 4.1.1)                       
 evaluate       0.14       2019-05-28 [1] CRAN (R 4.1.1)                       
 fansi          0.5.0      2021-05-25 [1] CRAN (R 4.1.1)                       
 farver         2.1.0      2021-02-28 [1] CRAN (R 4.1.1)                       
 fastmap        1.1.0      2021-01-25 [1] CRAN (R 4.1.1)                       
 fontawesome    0.2.2      2021-07-02 [1] CRAN (R 4.1.2)                       
 forcats      * 0.5.1      2021-01-27 [1] CRAN (R 4.1.1)                       
 fs             1.5.0      2020-07-31 [1] CRAN (R 4.1.1)                       
 generics       0.1.1      2021-10-25 [1] CRAN (R 4.1.2)                       
 gganimate    * 1.0.7      2020-10-15 [1] CRAN (R 4.1.1)                       
 ggplot2      * 3.3.5      2021-06-25 [1] CRAN (R 4.1.1)                       
 ggrepel      * 0.9.1      2021-01-15 [1] CRAN (R 4.1.1)                       
 gifski         1.4.3-1    2021-05-02 [1] CRAN (R 4.1.1)                       
 glue           1.4.2      2020-08-27 [1] CRAN (R 4.1.1)                       
 gridExtra      2.3        2017-09-09 [1] CRAN (R 4.1.1)                       
 gt           * 0.3.1.9000 2021-11-26 [1] Github (rstudio/gt@e441737)          
 gtable         0.3.0      2019-03-25 [1] CRAN (R 4.1.1)                       
 gtExtras     * 0.2.2.12   2021-11-26 [1] Github (jthomasmock/gtExtras@540a392)
 haven          2.4.3      2021-08-04 [1] CRAN (R 4.1.1)                       
 here           1.0.1      2020-12-13 [1] CRAN (R 4.1.1)                       
 highr          0.9        2021-04-16 [1] CRAN (R 4.1.1)                       
 hms            1.1.1      2021-09-26 [1] CRAN (R 4.1.2)                       
 htmltools      0.5.2      2021-08-25 [1] CRAN (R 4.1.1)                       
 htmlwidgets    1.5.4      2021-09-08 [1] CRAN (R 4.1.1)                       
 httr           1.4.2      2020-07-20 [1] CRAN (R 4.1.1)                       
 hwordcloud   * 0.1.0      2019-08-07 [1] CRAN (R 4.1.2)                       
 jquerylib      0.1.4      2021-04-26 [1] CRAN (R 4.1.1)                       
 jsonlite       1.7.2      2020-12-09 [1] CRAN (R 4.1.1)                       
 kableExtra   * 1.3.4      2021-02-20 [1] CRAN (R 4.1.1)                       
 KernSmooth     2.23-20    2021-05-03 [2] CRAN (R 4.1.1)                       
 klippy       * 0.0.0.9500 2021-11-18 [1] Github (rlesur/klippy@378c247)       
 knitr        * 1.33       2021-04-24 [1] CRAN (R 4.1.1)                       
 labeling       0.4.2      2020-10-20 [1] CRAN (R 4.1.0)                       
 lattice        0.20-44    2021-05-02 [1] CRAN (R 4.1.1)                       
 leafem         0.1.6      2021-05-24 [1] CRAN (R 4.1.1)                       
 leaflet        2.0.4.1    2021-01-07 [1] CRAN (R 4.1.1)                       
 leafsync       0.1.0      2019-03-05 [1] CRAN (R 4.1.1)                       
 lifecycle      1.0.1      2021-09-24 [1] CRAN (R 4.1.2)                       
 lubridate      1.7.10     2021-02-26 [1] CRAN (R 4.1.1)                       
 lwgeom         0.2-7      2021-07-28 [1] CRAN (R 4.1.1)                       
 magrittr       2.0.1      2020-11-17 [1] CRAN (R 4.1.1)                       
 modelr         0.1.8      2020-05-19 [1] CRAN (R 4.1.1)                       
 munsell        0.5.0      2018-06-12 [1] CRAN (R 4.1.1)                       
 paletteer      1.4.0      2021-07-20 [1] CRAN (R 4.1.1)                       
 pillar         1.6.4      2021-10-18 [1] CRAN (R 4.1.2)                       
 pkgconfig      2.0.3      2019-09-22 [1] CRAN (R 4.1.1)                       
 plyr           1.8.6      2020-03-03 [1] CRAN (R 4.1.1)                       
 png            0.1-7      2013-12-03 [1] CRAN (R 4.1.0)                       
 prettyunits    1.1.1      2020-01-24 [1] CRAN (R 4.1.1)                       
 progress       1.2.2      2019-05-16 [1] CRAN (R 4.1.1)                       
 proxy          0.4-26     2021-06-07 [1] CRAN (R 4.1.1)                       
 purrr        * 0.3.4      2020-04-17 [1] CRAN (R 4.1.1)                       
 R6             2.5.1      2021-08-19 [1] CRAN (R 4.1.1)                       
 raster         3.4-13     2021-06-18 [1] CRAN (R 4.1.1)                       
 RColorBrewer * 1.1-2      2014-12-07 [1] CRAN (R 4.1.0)                       
 Rcpp           1.0.7      2021-07-07 [1] CRAN (R 4.1.1)                       
 readr        * 2.0.1      2021-08-10 [1] CRAN (R 4.1.1)                       
 readxl         1.3.1      2019-03-13 [1] CRAN (R 4.1.1)                       
 rematch2       2.1.2      2020-05-01 [1] CRAN (R 4.1.1)                       
 reprex         2.0.1      2021-08-05 [1] CRAN (R 4.1.1)                       
 rlang          0.4.11     2021-04-30 [1] CRAN (R 4.1.1)                       
 rmarkdown      2.10       2021-08-06 [1] CRAN (R 4.1.1)                       
 rprojroot      2.0.2      2020-11-15 [1] CRAN (R 4.1.1)                       
 rstudioapi     0.13       2020-11-12 [1] CRAN (R 4.1.1)                       
 rvest          1.0.1      2021-07-26 [1] CRAN (R 4.1.1)                       
 s2             1.0.7      2021-09-28 [1] CRAN (R 4.1.2)                       
 sass           0.4.0      2021-05-12 [1] CRAN (R 4.1.1)                       
 scales         1.1.1      2020-05-11 [1] CRAN (R 4.1.1)                       
 sessioninfo    1.1.1      2018-11-05 [1] CRAN (R 4.1.1)                       
 sf             1.0-4      2021-11-14 [1] CRAN (R 4.1.2)                       
 sp             1.4-5      2021-01-10 [1] CRAN (R 4.1.1)                       
 stars          0.5-3      2021-06-08 [1] CRAN (R 4.1.1)                       
 stringi        1.7.4      2021-08-25 [1] CRAN (R 4.1.1)                       
 stringr      * 1.4.0      2019-02-10 [1] CRAN (R 4.1.1)                       
 svglite        2.0.0      2021-02-20 [1] CRAN (R 4.1.1)                       
 systemfonts    1.0.3      2021-10-13 [1] CRAN (R 4.1.1)                       
 tibble       * 3.1.4      2021-08-25 [1] CRAN (R 4.1.1)                       
 tidyr        * 1.1.3      2021-03-03 [1] CRAN (R 4.1.1)                       
 tidyselect     1.1.1      2021-04-30 [1] CRAN (R 4.1.1)                       
 tidyverse    * 1.3.1      2021-04-15 [1] CRAN (R 4.1.1)                       
 tmap         * 3.3-2      2021-06-16 [1] CRAN (R 4.1.1)                       
 tmaptools      3.1-1      2021-01-19 [1] CRAN (R 4.1.1)                       
 tweenr         1.0.2      2021-03-23 [1] CRAN (R 4.1.1)                       
 tzdb           0.1.2      2021-07-20 [1] CRAN (R 4.1.1)                       
 units          0.7-2      2021-06-08 [1] CRAN (R 4.1.1)                       
 utf8           1.2.2      2021-07-24 [1] CRAN (R 4.1.1)                       
 vctrs          0.3.8      2021-04-29 [1] CRAN (R 4.1.1)                       
 viridis      * 0.6.2      2021-10-13 [1] CRAN (R 4.1.2)                       
 viridisLite  * 0.4.0      2021-04-13 [1] CRAN (R 4.1.1)                       
 webshot        0.5.2      2019-11-22 [1] CRAN (R 4.1.1)                       
 withr          2.4.3      2021-11-30 [1] CRAN (R 4.1.2)                       
 wk             0.5.0      2021-07-13 [1] CRAN (R 4.1.1)                       
 wordcloud2   * 0.2.1      2018-01-03 [1] CRAN (R 4.1.2)                       
 xfun           0.25       2021-08-06 [1] CRAN (R 4.1.1)                       
 XML            3.99-0.7   2021-08-17 [1] CRAN (R 4.1.1)                       
 xml2           1.3.2      2020-04-23 [1] CRAN (R 4.1.1)                       
 yaml           2.2.1      2020-02-01 [1] CRAN (R 4.1.0)                       

[1] C:/Users/Alicja/Documents/R/win-library/4.1
[2] C:/Program Files/R/R-4.1.1/library






  1. OXFAM, 2018↩︎

  2. Wikipedia, “Austin Russel”↩︎

  3. Lichnerowicz, 2021↩︎

  4. Forbes, 2021↩︎

LS0tDQp0aXRsZTogIk11bHRpbWlsbG9uYXJpb3MgZW4gZWwgbXVuZG8iDQpzdWJ0aXRsZTogIkFsaWNqYSBNxYJ5bmVrIChhbWx5QGFsdW1uaS51di5lcykiIA0KYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIxIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgdGhlbWU6IHBhcGVyDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkod29yZGNsb3VkMikgDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoZ3QpIA0KbGlicmFyeShndEV4dHJhcykNCmxpYnJhcnkoa2xpcHB5KSAgDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShjb2xvcnNwYWNlKQ0KbGlicmFyeShod29yZGNsb3VkKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDAuNjI4LCBvdXQud2lkdGggPSAiNzUlIiwgZmlnLmFsaWduID0gImNlbnRlciIpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQ0KYGBgDQoNCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIHNvbG8gSEFTIGRlIFNVU1RJVFVJUiAicGVyZXpwNDQiIHBvciB0dSB1c3VhcmlvIGRlIEdpdGh1Yi0tPg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGljamFNbC90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBIQVMgREUgQ0FNQklBUiBOQURBLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KIyBbMS4gSW50cm9kdWNjacOzbl17LnZlcmRlY2l0b30NCg0KRWwgODAlIGRlIGxhIHJpcXVlemEgbXVuZGlhbCBlc3TDoSBlbiBtYW5vcyBkZWwgMSUgZGUgbGFzIHBlcnNvbmFzLCB5IGVuIDIwMTggbGFzIDggcGVyc29uYXMgbcOhcyByaWNhcyB0ZW7DrWFuIHRhbnRhIHJpcXVlemEgY29tbyBsYSBtaXRhZCBtw6FzIHBvYnJlIGRlIGxhIGh1bWFuaWRhZFteMV0uDQoNCkVzdGUgdHJhYmFqbyB0aWVuZSBjb21vIG9iamV0aXZvIG1vc3RyYXIgY8OzbW8sIHNlZ8O6biBsYSByZXZpc3RhIEZvcmJlcywgZWwgZ3J1cG8gZGUgbGFzIHBlcnNvbmFzIG3DoXMgcmljYXMgZGVsIG11bmRvIGhhIGNhbWJpYWRvIGEgbG8gbGFyZ28gZGUgbG9zIGHDsW9zLiBSZXNwb25kZXLDoSBhIGxhcyBwcmVndW50YXMgZGUgcXVpw6luZXMgc2UgZW5jdWVudHJhbiBlbnRyZSBsYXMgcGVyc29uYXMgbcOhcyByaWNhcyBkZWwgbXVuZG8sIGVuIHF1w6kgcGHDrXNlcyBzZSBlbmN1ZW50cmFuIGxvcyBtdWx0aW1pbGxvbmFyaW9zIHkgY8OzbW8gY2FtYmlhIHN1IGVkYWQgeSBzdSByaXF1ZXphIHByb21lZGlvIGNvbiBlbCB0aWVtcG8uIFBhcmEgMjAyMSwgc2UgZXhhbWluYXLDoSBsYSBwYXJ0aWNpcGFjacOzbiBkZSBkaWZlcmVudGVzIHNlY3RvcmVzIGVtcHJlc2FyaWFsZXMgZW4gbGEgbGlzdGEgZGUgMTAwIG11bHRpbWlsbG9uYXJpb3MgeSBwYXJhIDIwMTksIGxhIHJlZmVyZW5jaWEgYWwgcmFua2luZyBkZSBsaWJlcnRhZCBlY29uw7NtaWNhIGRlIGxvcyBwYcOtc2VzIGRlbCBtdW5kby4NCjxicj4NCg0KIyAyLiBEYXRvcyANCiMjIHsudGFic2V0fQ0KDQojIyMgRGVzZ2FyZ2FuZG8gbG9zIGRhdG9zIA0KDQpBIGxvIGxhcmdvIGRlIGVzdGUgYW7DoWxpc2lzIHZveSBhIHV0aWxpemFyIGxvcyBkYXRvcyBzYWNhZG9zIGRlIGxhIHBhZ2luYSB3ZWIgW0thZ2dsZV0od3d3LkthZ2dsZS5jb20pLg0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAnZm9sZC1zaG93JywgZmlnLmRpbT1jKDUsIDMpfQ0KI0NhcmdvIGxvcyBkYXRvcyBwcmV2aWFtZW50ZSBkZXNnYXJnYWRvcyBkZSBsYSBwYWdpbmEgS2FnZ2xlDQpkZiA8LSByZWFkLmNzdigiLi9kYXRvcy9iaWxsaW9uYWlyZXMuY3N2IiwgZmlsZUVuY29kaW5nPSJVVEYtOCIpDQpiaWwyMSA8LSByZWFkLmNzdigiLi9kYXRvcy9CaWxsaW9uYWlyZSAyMDIxLmNzdiIpDQpiaWxnZW8gPC0gcmVhZC5jc3YoIi4vZGF0b3MvZm9yYmVzX2JpbGxpb25haXJlc19nZW8uY3N2IikNCmVjb2ZyZWUxOSA8LSByZWFkLmNzdigiLi9kYXRvcy9lY29ub21pY19mcmVlZG9tX2luZGV4MjAxOV9kYXRhLmNzdiIpDQoNCmBgYA0KDQoNCiMjIyBDaGVxdWVhbmRvIGxvcyBkYXRvcw0KDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICdmb2xkLXNob3cnfQ0KI2NoZXF1ZW8gdGlwbyBkZSBkYXRvcyBlbiBsb3MgZGF0YXNldHMNCnN0cihkZikNCm5hbWVzKGRmKQ0KDQpzdHIoYmlsMjEpDQpuYW1lcyhiaWwyMSkNCg0Kc3RyKGJpbGdlbykNCm5hbWVzKGJpbGdlbykNCg0Kc3RyKGVjb2ZyZWUxOSkNCm5hbWVzKGVjb2ZyZWUxOSkNCg0KDQpgYGANCg0KIyMjIFByb2Nlc2FuZG8gbG9zIGRhdG9zDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICdmb2xkLXNob3cnfQ0KI2NhbWJpbyBlbCBub21icmUgZGUgbGEgY29sdW1uYSBlbiBkZg0KZGYgPC0gZGYgJT4lIHJlbmFtZShuYXRpb25hbGl0eSA9IG5hdGluYWxpdHkpDQoNCiNDb25qdW50byBkb3MgZGF0YXNldHMgZGUgMjAyMQ0KYmlsMjEgPC0gYmlsMjEgJT4lIA0KICBzZWxlY3QoTmFtZSwgSW5kdXN0cnkpDQoNCmJpbDIxIDwtIGxlZnRfam9pbihiaWxnZW8sIGJpbDIxLCBieSA9ICJOYW1lIikNCg0Kcm0oYmlsZ2VvKQ0KDQojYWp1c3RvIGVsIGRhdGFzZXQgYSBsYXMgbmVjZXNpZGFkZXMgZGVsIGFuYWxpc2lzIA0KZWNvZnJlZTE5IDwtIGVjb2ZyZWUxOSAlPiUgDQogIHNlbGVjdChDb3VudHJ5ID0gQ291bnRyeS5OYW1lLCBXb3JsZC5SYW5rLCBSZWdpb24pICU+JSANCiAgbXV0YXRlKFdvcmxkX3JhbmsgPSBhcy5pbnRlZ2VyKFdvcmxkLlJhbmspLCAuYmVmb3JlID0gUmVnaW9uKSAlPiUgDQogIHNlbGVjdCghV29ybGQuUmFuaykNCmBgYA0KDQo8YnI+PGJyPjxicj48YnI+DQoNCjxicj4NCg0KIyAzLiBBbsOhbGlzaXMgZGUgbGFzIHBlcnNvbmFzIG3DoXMgcmljYXMgZW4gMjAyMQ0KDQpBbCBwcmluY2lwaW8gcXVpZXJvIGV4YW1pbmFyIGxhIHNpdHVhY2nDs24gZW50cmUgbG9zIG11bHRpbWlsbG9uYXJpb3MgZW4gMjAyMS4gVm95IGEgY29tcHJvYmFyIHF1acOpbiBmdWUgbcOhcyByaWNvIGVuIGVsIG11bmRvIHNlZ8O6biBGb3JiZXMgZW4gZXN0ZSBhw7FvLCBlbiBxdWUgaW5kdXN0cmlhcyBvcGVyYWJhbiBsb3MgbXVsdGltaWxsb25hcmlvcyB5IGVuIGN1YWxlcyBwYcOtc2VzIGxhIGNvbmNlbnRyYWNpw7NuIGRlbCBwYXRyaW1vbmlvIGZ1ZSBtw6FzIGdyYW5kZS4gTHVlZ28gaXLDqSBhIGxvcyBkYXRvcyBwZXJzb25hbGVzIGNvbW8gZWRhZCBvIG7Dum1lcm8gZGUgaGlqb3MgcXVlIHRpZW5lbi4NCg0KIyMgMy4xIEFuw6FsaXNpcyBnZW5lcmFsDQoNCiMjIyBMYXMgY2luY28gcGVyc29uYXMgbcOhcyByaWNhcyBlbiBlbCBtdW5kbyBlbiAyMDIxDQoNCkVuIGxhIHNpZ3VpZW50ZSB0YWJsYSwgcG9kZW1vcyB2ZXIgcXVpw6luIG9jdXDDsyBsb3MgNSBwcmltZXJvcyBsdWdhcmVzIGVudHJlIGxhcyBwZXJzb25hcyBtw6FzIHJpY2FzIGRlbCBtdW5kbyBzZWfDum4gZWwgcmFua2luZyBkZWwgRm9yYmVzLCBkZSBxdcOpIHBhw61zZXMgcHJvdmllbmVuIGxhcyBwZXJzb25hcyBzZWxlY2Npb25hZGFzIHkgY3XDoWwgZXMgbGEgZnVlbnRlIGRlIHN1IHJpcXVlemEuDQpgYGB7cn0NCg0KI3RhYmxhDQpkZjEgPC0gZGYgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxLCByYW5rIDw9IDUpDQoNCnBob3RvIDwtIGMoImh0dHBzOi8vYmVzdGhxd2FsbHBhcGVycy5jb20vVXBsb2Fkcy8xMi0yLTIwMjEvMTU0MTM2L3RodW1iMi1qZWZmLWJlem9zLTIwMjEtYW1lcmljYW4tZW50cmVwcmVuZXVyLWd1eXMtYW1lcmljYW4tY2VsZWJyaXR5LmpwZyIsICJodHRwczovL3MxLmNkbi5hdXRvZXZvbHV0aW9uLmNvbS9pbWFnZXMvbmV3cy90ZXNsYS1wYXRlbnRzLWFyZS1ub3ctZnJlZS1mb3ItYWxsLWNvbXBhbnktd29udC1zdWUtaWYtdXNlZC1pbi1nb29kLWZhaXRoLTEzMjEwM18xLmpwZyIsIA0KICAgICAgICAgImh0dHBzOi8vcm9iYnJlcG9ydC5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjAvMDEvc2h1dHRlcnN0b2NrXzExMDYwODExMjAtZGlnaS5qcGciLA0KICAgICAgICAgImh0dHBzOi8vbWlyby5tZWRpdW0uY29tL21heC85MDAvMSpOSWNkYm1JMlhFZUY0WmdBTnMtblR3LmpwZWciLCAiaHR0cHM6Ly9jZG4uaW1hZ2VzLmV4cHJlc3MuY28udWsvaW1nL2R5bmFtaWMvNTkvNTkweC82MjU1MTZfMS5qcGciKQ0KDQpkZjFfY29uX2ZvdG9zIDwtIGRmMSAlPiUgc2VsZWN0KCF5ZWFyICYgIWFnZSkgJT4lIGFkZF9jb2x1bW4ocGhvdG8pICU+JQ0KICBtdXRhdGUobmF0aW9uYWxpdHkgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChuYXRpb25hbGl0eSwnRnJhbmNlJykgfiAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0Jqbk5vd2FrL1RkRi9tYWluL2ZyLnBuZyIsDQogICAgc3RyX2RldGVjdChuYXRpb25hbGl0eSwnVW5pdGVkIFN0YXRlcycpIH4gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Cam5Ob3dhay9UZEYvbWFpbi91cy5wbmciDQogICkpDQoNCg0KZGYxX2Nvbl9mb3RvcyAlPiUgZ3QoKSAlPiUgDQogIGd0Ojp0ZXh0X3RyYW5zZm9ybShsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBjKHBob3RvKSksDQogICAgICAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKHgpIHtndDo6d2ViX2ltYWdlKHgsIGhlaWdodCA9IDgwKX0pICU+JSANCiAgZ3RFeHRyYXM6Omd0X2ltZ19yb3dzKGNvbHVtbnMgPSBuYXRpb25hbGl0eSwgaGVpZ2h0ID0gNDApICU+JQ0KICBndEV4dHJhczo6Z3RfdGhlbWVfbnl0aW1lcygpICU+JSANCiAgY29sc19sYWJlbCgNCiAgICBuZXRfd29ydGggPSBtZCgiTmV0IHdvcnRoPGJyPihiaWxsaW9uICQpIiksDQogICAgc291cmNlX3dlYWx0aCA9ICJzb3VyY2Ugd2VhbHRoIikgJT4lDQogIHRhYl9zdHlsZSgNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjZWxsX3RleHQoZm9udD1nb29nbGVfZm9udCgNCiAgICAgICAgbmFtZSA9ICJSb2JvdG8gQ29uZGVuc2VkIg0KICAgICAgKSwgYWxpZ24gPSAiY2VudGVyIix2X2FsaWduID0gIm1pZGRsZSIpKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKA0KICAgICAgY29sdW1ucyA9IGMoDQogICAgICAgIHJhbmssIG5hbWUsIG5ldF93b3J0aCwgbmF0aW9uYWxpdHksIHNvdXJjZV93ZWFsdGgsIHBob3RvKQ0KICAgICkpDQoNCmBgYA0KDQoNCiMjIyBJbmR1c3RyaWFzIG3DoXMgcG9wdWxhcmVzIGVuIDIwMjEgcXVlIGdlbmVyYW4gbG9zIGluZ3Jlc29zIHBhcmEgbG9zIG11bHRpbWlsbG9uYXJpb3MNCg0KRW4gZWwgc2lndWllbnRlIHBhc28gZGVzY3VicmlyZW1vcyBxdcOpIGluZHVzdHJpYXMgZ2VuZXJhcm9uIHJpcXVlemEgcGFyYSBsb3Mgcmljb3MgZW4gZWwgcmFua2luZy4NCg0KYGBge3J9DQoNCiMgd29ybGQgY2xvdWQgaW5kdXN0cnkNCkRfd29yZHMgPC0gYmlsMjEgJT4lDQogIHNlbGVjdChJbmR1c3RyeSkgJT4lDQogIGdyb3VwX2J5KEluZHVzdHJ5KSAlPiUgDQogIGNvdW50KG5hbWUgPSAiRnJlcSIpICU+JSANCiAgYXJyYW5nZShkZXNjKEZyZXEpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KICANCg0KQ2wgPC0gRF93b3Jkcw0KDQpod29yZGNsb3VkKHRleHQgPSBDbCRJbmR1c3RyeSwgc2l6ZSA9IENsJEZyZXEsIA0KICAgICAgICAgICB3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjMyMHB4IiwNCiAgICAgICAgICAgdGhlbWUgPSAiZGFya2JsdWUiKQ0KDQpgYGANCkNvbW8gcG9kZW1vcyBvYnNlcnZhciwgZWwgbWF5b3IgbsO6bWVybyBkZSBlbXByZXNhcyBzZSBlbmNvbnRyYWJhIGVuIGxhIGluZHVzdHJpYSBmaW5hbmNpZXJhIHkgZGUgaW52ZXJzaW9uZXMgKDM3MSBlbXByZXNhcyksIHNlZ3VpZGEgZGUgbGEgdGVjbm9sb2fDrWEgKDM2NikgeSBsYSBtYW51ZmFjdHVyYSAoMzMzIGVtcHJlc2FzKS4gTG9zIHNpZ3VpZW50ZXMgcmVzdWx0YWRvcyBzZSBzaXR1YWJhbiBwb3IgZGViYWpvIGRlIGxhcyAzMDAgZW1wcmVzYXMgKHNhbmlkYWQsIGlubW9iaWxpYXJpYSwgYWxpbWVudGFjacOzbiB5IGJlYmlkYXMpLg0KDQoNCiMjIyBDb25jZW50cmFjacOzbiBkZSByaXF1ZXphIGVuIGVsIG11bmRvIGVuIDIwMjENCg0KQWhvcmEgc2UgbW9zdHJhcsOhIGVuIGVsIG1hcGEgbGEgY29uY2VudHJhY2nDs24gZGUgcmlxdWV6YSBlbiAyMDIxLg0KYGBge3J9DQojbWFwYSBjb25jZW50cmFjacOzbiBkZWwgcGF0cmltb25pbyBlbiAyMDIxDQoNCmRhdGEoV29ybGQpDQp3b3JsZCA8LSBXb3JsZCA7IHJtKFdvcmxkKQ0KDQp3b3JsZDEgPC0gd29ybGQgJT4lIA0KICBzZWxlY3QoQ291bnRyeSA9IG5hbWUsIGdlb21ldHJ5KQ0KDQptYXBhMSA8LSBiaWwyMSAlPiUgDQogIHNlbGVjdChOZXRXb3J0aCwgQ291bnRyeSkgJT4lIA0KICBncm91cF9ieShDb3VudHJ5KSAlPiUgDQogIG11dGF0ZSAoc3VtYSA9IHN1bShOZXRXb3J0aCkpICU+JSANCiAgZGlzdGluY3QoQ291bnRyeSwgc3VtYSkgDQoNCm1hcGEyIDwtIGxlZnRfam9pbih3b3JsZDEsIG1hcGExLCBieSA9ICJDb3VudHJ5IikNCg0KDQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IG1hcGEyLCBhZXMoZmlsbCA9IHN1bWEpKSArDQogIHNjYWxlX2ZpbGxfY29udGludW91c19zZXF1ZW50aWFsKHBhbGV0dGUgPSAiUmVkLWJsdWUiLCBuYW1lID0gIk1pbGVzIGRlIG1pbGxpb25lcyBkZSBkw7NsYXJlcyIpKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmNlbnRyYWNpw7NuIGRlbCBwYXRyaW1vbmlvIGVuIDIwMjEiDQogICApICsgIHRoZW1lX3ZvaWQoKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMSwgImNtIikpDQpgYGANCkRlZmluaXRpdmFtZW50ZSwgbGEgbWF5b3IgY2FudGlkYWQgZGVsIHBhdHJpbW9uaW8gZGUgbGFzIHBlcnNvbmFzIGNvbiB1bmEgcmlxdWV6YSBlc3RpbWFkYSBlbiBtw6FzIGRlIHVuIG1pbGzDs24gZGUgZMOzbGFyZXMgc2UgZW5jdWVudHJhIGVuIGxvcyBFc3RhZG9zIFVuaWRvcywgc2VndWlkYSBkZSBDaGluYS4gQWwgbWlzbW8gdGllbXBvLCBsYXMgcGVyc29uYXMgY29uIHVuYSByaXF1ZXphIGlndWFsIG8gc3VwZXJpb3IgYSBtaWwgbWlsbG9uZXMgZGUgZMOzbGFyZXMgc2UgZW5jdWVudHJhbiBlbiBwcsOhY3RpY2FtZW50ZSB0b2RvcyBsb3MgY29udGluZW50ZXMuDQoNCiMjIDMuMiBBbsOhbGlzaXMgZGUgbG9zIGRhdG9zIHBlcnNvbmFsZXMgZGUgbG9zIG11bHRpbWlsbG9uYXJpb3MgZW4gMjAyMQ0KDQpFbiBlc3RhIHBhcnRlLCB2b3kgYSBhbmFsaXphciBkaXNwb25pYmxlcyBkYXRvcyBwZXJzb25hbGVzIGRlIHBlcnNvbmFzIGRlbCByYW5raW5nIEZvcmJlcy4gUHJpbWVybyBjb21lbnphcsOpIG1vc3RyYW5kbyB1bmEgdGFibGEgY29uIGxvcyByZXN1bHRhZG9zICBleHRyZW1vcyB5IG1lZGlvcyBkZSBlZGFkLCBwYXRyaW1vbmlvIHkgbsO6bWVybyBkZSBoaWpvcyBwYXJhIGVsIGHDsW8gMjAyMS4NCg0KIyMjIERhdG9zIGV4dHJlbW9zIHkgbWVkaW9zOiBlZGFkLCByaXF1ZXphIHkgbsO6bWVybyBkZSBoaWpvcw0KDQoNCmBgYHtyfQ0KI2VkYWQNCmFnZSA8LSBiaWwyMSAlPiUgDQogIHNlbGVjdChBZ2UpICU+JSANCiAgZHJvcF9uYSgpDQoNCm1pbiA8LSBhZ2UgJT4lIA0KICBzbGljZV9taW4oQWdlLCBuID0gMSkgJT4lIA0KICByZW5hbWUoTWluID0gQWdlKQ0KDQptYXggPC0gYWdlICU+JSANCiAgc2xpY2VfbWF4KEFnZSwgbiA9IDEpICU+JSANCiAgcmVuYW1lKE1heCA9IEFnZSkNCg0KbWVhbiA8LSBhZ2UgJT4lIA0KICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4oQWdlLCBuYS5ybSA9IFRSVUUpKQ0KDQojcGF0cmltb25pbw0KTmV0IDwtIGJpbDIxICU+JSANCiAgc2VsZWN0KE5ldFdvcnRoKQ0KDQpObWluIDwtIE5ldCAlPiUgDQogIHNsaWNlX21pbihOZXRXb3J0aCwgbiA9IDEpICU+JSANCiAgcmVuYW1lKE1pbiA9IE5ldFdvcnRoKQ0KDQpObWF4IDwtIE5ldCAlPiUgDQogIHNsaWNlX21heChOZXRXb3J0aCwgbiA9IDEpICU+JSANCiAgcmVuYW1lKE1heCA9IE5ldFdvcnRoKQ0KDQpObWVhbiA8LSBOZXQgJT4lIA0KICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4oTmV0V29ydGgsIG5hLnJtID0gVFJVRSkpDQoNCiNoaWpvcw0KQ2hpbGQgPC0gYmlsMjEgJT4lIA0KICBzZWxlY3QoQ2hpbGRyZW4pICU+JSANCiAgZHJvcF9uYSgpDQoNCkNtaW4gPC0gQ2hpbGQgJT4lIA0KICBzbGljZV9taW4oQ2hpbGRyZW4sIG4gPSAxKSAlPiUgDQogIHJlbmFtZShNaW4gPSBDaGlsZHJlbikNCg0KQ21heCA8LSBDaGlsZCAlPiUgDQogIHNsaWNlX21heChDaGlsZHJlbiwgbiA9IDEpICU+JSANCiAgcmVuYW1lKE1heCA9IENoaWxkcmVuKQ0KDQpDbWVhbiA8LSBDaGlsZCAlPiUgDQogIHN1bW1hcmlzZShNZWFuID0gbWVhbihDaGlsZHJlbiwgbmEucm0gPSBUUlVFKSkNCg0KIyBUYWJsYSBkYXRhDQpUYWJsYU1lYW4gPC0gbWVhbiAlPiUgDQogIHJiaW5kKE5tZWFuLCBDbWVhbikNCg0KVGFibGFNYXggPC0gbWF4ICU+JSANCiAgcmJpbmQoTm1heCwgQ21heCkNCg0KVGFibGFNaW4gPC0gbWluICU+JSANCiAgcmJpbmQoMSwgMCkNCg0KVGFibGEyMSA8LSBiaW5kX2NvbHMoIiAiID0gcmJpbmQoIkFnZSIsICJOZXQgV29ydGggKGJpbGxpb24gJCkiLCAiQ2hpbGRyZW4iKSkgJT4lIA0KICBiaW5kX2NvbHMoVGFibGFNaW4sIFRhYmxhTWVhbiwgVGFibGFNYXgpIA0KDQpybShtaW4sIG1heCwgbWVhbiwgTm1pbiwgTm1heCwgTm1lYW4sIENtaW4sIENtYXgsIENtZWFuLCBUYWJsYU1pbiwgVGFibGFNYXgsIFRhYmxhTWVhbiwgQ2hpbGQpDQogIA0KIyBUYWJsYQ0KDQoNCmtibChUYWJsYTIxKSAlPiUNCiAga2FibGVfbWF0ZXJpYWxfZGFyaygpDQpgYGANCkdlbmVyYWxtZW50ZSwgZWwgbXVsdGltaWxsb25hcmlvIG3DoXMgam92ZW4gZW4gMjAyMSB0aWVuZSAxOCBhw7FvcywgeSBlbCBtdWx0aW1pbGxvbmFyaW8gbcOhcyBtYXlvciB0aWVuZSA5OSBhw7Fvcy4gTGEgZWRhZCBwcm9tZWRpbyBlbiBsYSBsaXN0YSBlcyA2My4gTG8gcXVlIG11ZXN0cmEgcXVlIHVuIGdyYW4gZ3J1cG8gZGUgbGFzIDI3NjEgcGVyc29uYXMgcXVlIGVzdMOhbiBlbiBsYSBsaXN0YSBzb24gcGVyc29uYXMgZGUgbWVkaWFuYSBlZGFkIHkgbWF5b3Jlcy4NCg0KUGFyYSBhcGFyZWNlciBlbiBsYSBsaXN0YSwgZWwgcGF0cmltb25pbyBuZXRvIGRlYmUgc2VyIGRlIDEgbWlsIG1pbGxvbmVzIGRlIGTDs2xhcmVzLCBwb3IgbG8gdGFudG8sIGVzdGUgZXMgZWwgbcOtbmltby4gRWwgcGF0cmltb25pbyBuZXRvIHByb21lZGlvIGZ1ZSBjYXNpIDUgbWlsIG1pbGxvbmVzLCB5IGVsIG7Dum1lcm8gdW5vIGVuIGVsIHJhbmtpbmcgZGUgbG9zIG11bHRpbWlsbG9uYXJpb3MgZXMgdW5hIHJpcXVlemEgZGUgMTc3IG1pbCBtaWxsb25lcyBkZSBkw7NsYXJlcy4NCg0KUG9kZW1vcyBhZmlybWFyIHF1ZSBsb3MgbXVsdGltaWxsb25hcmlvcyB0aWVuZW4gdW4gcHJvbWVkaW8gZGUgdHJlcyBoaWpvcyB5IGVsIHBvc2VlZG9yIGRlbCByw6ljb3JkIGVuIGxhIGxpc3RhIHRpZW5lIGhhc3RhIDIzIGhpam9zIHkgZXN0ZSBlcyBSb21hbiBBdmRlZXYgZGUgUnVzc2lhLiANCg0KDQoNCiMjIyBEaXN0cmlidWNpw7NuIGRlIGVkYWQgbWVkaWEgeSBkZXN2aWFjacOzbiB0w61waWNhLg0KDQpFbiBlbCBncsOhZmljbyBkZSBiYXJyYXMgc2UgbW9zdHJhcsOhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZWRhZCBkZSBsb3MgbXVsdGltaWxsb25hcmlvcy4NCmBgYHtyfQ0KYWdlIDwtIGJpbDIxICU+JSANCiAgc2VsZWN0KEFnZSkgJT4lIA0KICBkcm9wX25hKCkNCg0KYWdlX21lYW4gPC0gYmlsMjEgJT4lIA0KICBzZWxlY3QoTmFtZSwgUmFuaywgQWdlLCBOZXRXb3J0aCwgQ2hpbGRyZW4sIEVkdWNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4oQWdlLCBuYS5ybSA9IFRSVUUpLCBEZXMgPSBzZChBZ2UsIG5hLnJtID0gVFJVRSkpDQoNCmdncGxvdChhZ2UsIGFlcyhBZ2UpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgYWVzKHk9Li5kZW5zaXR5Li4pLCAgY29sb3I9ImRhcmtncmV5IiwgZmlsbCA9ICJzdGVlbGJsdWUiLCBhbHBoYSA9IDAuNSkrDQogIGdlb21fZGVuc2l0eSggY29sb3I9InB1cnBsZSIsIHNpemUgPSAxKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGNvbG91ciA9ICJyZWQiLCBzaXplID0gMSwgYXJncyA9IGxpc3QobWVhbiA9IGFnZV9tZWFuJE1lYW4sIHNkID0gYWdlX21lYW4kRGVzKSkgICsgDQogIHhsaW0oYygxNSwgMTAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkrIA0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3VyID0gImdyZXkyMCIsIHNpemUgPSA4KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGNvbG91ciA9ICJncmV5MjAiLCBzaXplID0gOCkpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDYzLjI2LCB5ID0gMC4wMzMsIGxhYmVsID0gIm1lYW4gYWdlID0gNjMiLCBzaXplID0gNC41LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsNCiAgI2Fubm90YXRlKGdlb20gPSAicG9pbnQiLCB4ID0gNjMuMjYsIHkgPSAwLjAyOTcsIGNvbG91ciA9ICJmaXJlYnJpY2szIiwgc2l6ZSA9IDUsIHNoYXBlID0gOCkgJT4lIA0KICBhbm5vdGF0ZSgic2VnbWVudCIsIHggPSA2My4yNiwgeGVuZCA9IDYzLjI2LCB5ID0gMC4wMjk3LCB5ZW5kID0gMC4wMzE5LCBjb2xvdXIgPSAiZGFya2JsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKQ0KDQpgYGANCg0KUG9kZW1vcyBub3RhciBxdWUgbGEgbWF5b3IgZGVuc2lkYWQgZGUgcGVyc29uYXMgc2UgZW5jdWVudHJhIGVuIGVsIHJhbmdvIGRlIGVkYWQgZGUgNTAgYSA3NSBhw7Fvcy4gTGEgZWRhZCBwcm9tZWRpbyBkZSBsYXMgcGVyc29uYXMgZW4gbGEgbGlzdGEgZGUgRm9yYmVzIGVzIGRlIGFwcm94aW1hZGFtZW50ZSA2MyBhw7Fvcy4gTGEgZGVuc2lkYWQgbcOhcyBhbHRhIGVzdMOhIHBvciBkZWxhbnRlIGRlbCBwdW50byBtZWRpbywgY29tbyBsbyBjb25maXJtYSBsYSBsw61uZWEgZGUgZGVzdmlhY2nDs24gdMOtcGljYSwgZW4gcMO6cnB1cmEuDQoNCiMjIyBFZGFkIHkgbmFjaW9uYWxpZGFkIGRlIGxhcyA1IHBlcnNvbmFzIG3DoXMgasOzdmVuZXMgZW4gZWwgcmFua2luZw0KDQpgYGB7cn0NCmFnZV9taW4gPC0gYmlsMjEgJT4lIA0KICBzZWxlY3QoTmFtZSwgQWdlLCBSYW5rLCBOZXRXb3J0aCwgQ291bnRyeSwgQ2hpbGRyZW4sIEVkdWNhdGlvbikgJT4lIA0KICBzbGljZV9taW4oQWdlLCBuPTUpDQoNCmdncGxvdChhZ2VfbWluLCBhZXMoeD1OYW1lLCB5PUFnZSwgbGFiZWwgPSBDb3VudHJ5KSkgKw0KICBnZW9tX3NlZ21lbnQoYWVzKHg9TmFtZSwgeGVuZD1OYW1lLCB5PTAsIHllbmQ9QWdlKSwgY29sb3I9Im9yYW5nZSIsIHNpemUgPSAxLCBsaW5ldHlwZT0iZG90ZGFzaCIpICsNCiAgZ2VvbV9wb2ludChjb2xvcj0icmVkIiwgc2l6ZT04LCBhbHBoYT0wLjYpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBhZ2VfbWluLCBhZXMobGFiZWwgPSBBZ2UpLCBjb2xvciA9ICJ5ZWxsb3ciLCBzaXplID0gNCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9saWdodCgpICsNCiAgZ2VvbV9sYWJlbF9yZXBlbCgpDQpgYGANCg0KRWwgbcOhcyBqb3ZlbiBkZSBsYSBsaXN0YSBlcyBLZXZpbiBEYXZpZExlaG1hbm4sIGRlIDE4IGHDsW9zLCBkZSBBbGVtYW5pYS4gw4lsIGVzIGxhIMO6bmljYSBwZXJzb25hIGVuIGxhIGxpc3RhIGRlIG1lbm9yZXMgZGUgMjAgYcOxb3MuIEVzdGUgZXMgdW4gbG9ncm8gbm90YWJsZSwgYSBwZXNhciBkZSBxdWUgbGEgZm9ydHVuYSBlcyBwYXRyaW1vbmlvIGZhbWlsaWFyIHkgbm8gcHJvdmllbmUgZGUgc3UgcHJvcGlvIG5lZ29jaW8uIEVudHJlIGxhcyA1IHBlcnNvbmFzIG3DoXMgasOzdmVuZXMgdGFtYmnDqW4gaGF5IGhlcm1hbm9zIGRlIE5vcnVlZ2EgeSB1biBjaXVkYWRhbm8gY2hpbm8gZGUgMjQgYcOxb3MuIExhIGxpc3RhIGxhIGNpZXJyYSBBdXN0aW4gUnVzc2VsbCwgZGUgMjYgYcOxb3MsIGRlIEVzdGFkb3MgVW5pZG9zLCBxdWUgZXMgZWwgw7puaWNvIHF1ZSBlcyBlbCBjcmVhZG9yIGRlIHN1IHByb3BpYSBmb3J0dW5hLiBDb21vIGRpY2Ugd2lraXBlZGlhOiAq4oCcU3UgZW1wcmVzYSBMdW1pbmFyIFRlY2hub2xvZ2llcyBzZSBlc3BlY2lhbGl6YSBlbiB0ZWNub2xvZ8OtYXMgbGlkYXIgeSBwZXJjZXBjacOzbiBkZSBtw6FxdWluYXMsIHV0aWxpemFkYXMgcHJpbmNpcGFsbWVudGUgZW4gYXV0b23Ds3ZpbGVzIGF1dMOzbm9tb3PigJ0qIFteMl0uDQoNCiMjIyBFZGFkIGNvbnRyYSBwYXRyaW1vbmlvDQoNCmBgYHtyfQ0KIyBhZ2UgdnMgbmV0d29ydGgNCg0KQWdlTmV0IDwtIGJpbDIxICU+JSANCiAgc2VsZWN0KEFnZSwgTmV0V29ydGgpICU+JSANCiAgZHJvcF9uYSgpDQoNCmdncGxvdChBZ2VOZXQsIGFlcyhBZ2UsIE5ldFdvcnRoKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2ppdHRlcihjb2xvciA9ICJza3libHVlIiwgYWxwaGEgPSAwLjIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlJlbGFjacOzbiBlbnRyZSBlZGFkIHkgcGF0cmltb25pbyBuZXRvIiwNCiAgICB5ID0gIk5ldCB3b3J0aCINCiAgKQ0KDQpgYGANCg0KQ29tbyBzZSBwdWVkZSB2ZXIgZW4gZWwgZ3LDoWZpY28sIGxhIG1heW9yIGNhbnRpZGFkIGRlIHBlcnNvbmFzIHRpZW5lIGFjdGl2b3MgcXVlIG5vIHN1cGVyYW4gbG9zIDI1IG1pbCBtaWxsb25lcyBkw7NsYXJlcywgeSBlbnRyZSBlbGxvcywgY29tbyB2aW1vcyBlbiBlbCBncsOhZmljbyBhbnRlcmlvciwgZWwgZ3J1cG8gZGUgZWRhZCBtw6FzIGdyYW5kZSBzb24gbGFzIHBlcnNvbmFzIGVudHJlIDUwIHkgNzUgYcOxb3MuIEFsIG1pc21vIHRpZW1wbywgZXMgZGlmw61jaWwgcGVyY2liaXIgbGEgcmVsYWNpw7NuIGVudHJlIGVkYWQgeSByaXF1ZXphLCBhdW5xdWUgbGFzIHBlcnNvbmFzIGNvbiBlbCBwYXRyaW1vbmlvIG5ldG8gbcOhcyBhbHRvIG5vIHNvbiBleHRyZW1hZGFtZW50ZSBqw7N2ZW5lcyAobWVub3MgZGUgMzUpIG8gZXh0cmVtYWRhbWVudGUgbWF5b3JlcyAobcOhcyBkZSA5MCkuIEVudG9uY2VzLCBwYXJlY2UgcXVlIGxhIGNvbnN0cnVjY2nDs24gZGUgdW5hIGZvcnR1bmEgbm8gZGVwZW5kZSBkZSBsYSBlZGFkLCBzaW5vIGRlIGxhIGNhcGFjaWRhZCBlbXByZXNhcmlhbCBvIGRlbCBwYXRyaW1vbmlvIGZhbWlsaWFyLg0KDQoNCiMjIyBFZGFkIHkgbnVtZXJvIGRlIGhpam9zIGRlIGxhcyA1IHBlcnNvbmFzIG1hcyBhbmNpYW5vcyBlbiBlbCByYW5raW5nDQoNCmBgYHtyfQ0KYWdlX21heCA8LSBiaWwyMSAlPiUgDQogIHNlbGVjdChOYW1lLCBBZ2UsIFJhbmssIE5ldFdvcnRoLCBDb3VudHJ5LCBDaGlsZHJlbiwgRWR1Y2F0aW9uKSAlPiUgDQogIHNsaWNlX21heChBZ2UsIG49NSkNCg0KDQpnZ3Bsb3QoYWdlX21heCwgYWVzKHg9TmFtZSwgeT1BZ2UpKSArDQogIGdlb21fc2VnbWVudChhZXMoeD1OYW1lLCB4ZW5kPU5hbWUsIHk9MCwgeWVuZD1BZ2UpLCBjb2xvcj0ic2t5Ymx1ZSIpICsNCiAgZ2VvbV9wb2ludChjb2xvcj0iZGFya2JsdWUiLCBzaXplPTcsIGFscGhhPTAuNikgKw0KICBnZW9tX3NlZ21lbnQoYWVzKHg9TmFtZSwgeGVuZD1OYW1lLCB5PTAsIHllbmQ9Q2hpbGRyZW4pLCBjb2xvcj0ic2t5Ymx1ZSIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gYWdlX21heCwgYWVzKE5hbWUsIENoaWxkcmVuLCBjb2xvcj0icGluayIsIHNpemU9NywgYWxwaGE9MC42KSkgKw0KICBnZW9tX3RleHQoZGF0YSA9IGFnZV9tYXgsIGFlcyhsYWJlbCA9IEFnZSksIGNvbG9yID0gImxpZ2h0cGluayIsIHNpemUgPSA0KSArDQogIHRoZW1lX2xpZ2h0KCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk7Dum1lcm8gZGUgaGlqb3MgeSBlZGFkIiwNCiAgICBzdWJ0aXRsZSA9ICJMYXMgNiBwZXJzb25hcyBtw6FzIGFuY2lhbmFzIGVuIGVsIHJhbmtpbmcgZW4gMjAyMSIsDQogICAgeSA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gYW5kIGFnZSINCiAgKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gIlJvYmVydCBLdW9rIiwgeSA9IDgsIGxhYmVsID0gIjgiLCBzaXplID0gNCwgY29sb3IgPSAiZGFya2JsdWUiKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAiTWFzYXRvc2hpIEl0byIsIHkgPSAzLCBsYWJlbCA9ICIzIiwgc2l6ZSA9IDQsIGNvbG9yID0gImRhcmtibHVlIikgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gIkdlb3JnZSBKb3NlcGgiLCB5ID0gNSwgbGFiZWwgPSAiNSIsIHNpemUgPSA0LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9ICJEYXZpZCBNdXJkb2NrIiwgeSA9IDMsIGxhYmVsID0gIjMiLCBzaXplID0gNCwgY29sb3IgPSAiZGFya2JsdWUiKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAiQ2hhcmxlcyBNdW5nZXIiLCB5ID0gOCwgbGFiZWwgPSAiOCIsIHNpemUgPSA0LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9ICJNYXNhdG9zaGkgSXRvIiwgeSA9IDQ5LCBsYWJlbCA9ICJOw7ptZXJvIGRlIGhpam9zIiwgc2l6ZSA9IDQsIGNvbG9yID0gImRhcmtibHVlIikgKw0KICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwgeCA9ICJNYXNhdG9zaGkgSXRvIiwgeSA9IDMzLCB4ZW5kID0gIlJvYmVydCBLdW9rIiwgeWVuZCA9IDEwLCANCiAgICAgICAgICAgY3VydmF0dXJlID0gLjMsIGNvbG9yID0gInNreWJsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKSArDQogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ID0gIk1hc2F0b3NoaSBJdG8iLCB5ID0gMzMsIHhlbmQgPSAiTWFzYXRvc2hpIEl0byIsIHllbmQgPSA1LCANCiAgICAgICAgICAgY3VydmF0dXJlID0gLjMsIGNvbG9yID0gInNreWJsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKSArDQogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ID0gIk1hc2F0b3NoaSBJdG8iLCB5ID0gMzMsIHhlbmQgPSAiR2VvcmdlIEpvc2VwaCIsIHllbmQgPSA3LCANCiAgICAgICAgICAgY3VydmF0dXJlID0gLjMsIGNvbG9yID0gInNreWJsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKSsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJjdXJ2ZSIsIHggPSAiTWFzYXRvc2hpIEl0byIsIHkgPSAzMywgeGVuZCA9ICJEYXZpZCBNdXJkb2NrIiwgeWVuZCA9IDUsIA0KICAgICAgICAgICBjdXJ2YXR1cmUgPSAuMywgY29sb3IgPSAic2t5Ymx1ZSIsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgyLCAibW0iKSkpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJjdXJ2ZSIsIHggPSAiTWFzYXRvc2hpIEl0byIsIHkgPSAzMywgeGVuZCA9ICJDaGFybGVzIE11bmdlciIsIHllbmQgPSAxMCwgDQogICAgICAgICAgIGN1cnZhdHVyZSA9IC4yLCBjb2xvciA9ICJza3libHVlIiwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDIsICJtbSIpKSkgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gIkRhdmlkIE11cmRvY2siLCB5ID0gNTYsIGxhYmVsID0gIkVkYWQiLCBzaXplID0gNCwgY29sb3IgPSAiZGFya2JsdWUiKSArDQogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ID0gIkRhdmlkIE11cmRvY2siLCB5ID0gNjMsIHhlbmQgPSAiUm9iZXJ0IEt1b2siLCB5ZW5kID0gOTQsIA0KICAgICAgICAgICBjdXJ2YXR1cmUgPSAuMywgY29sb3IgPSAic2t5Ymx1ZSIsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgyLCAibW0iKSkpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJjdXJ2ZSIsIHggPSAiRGF2aWQgTXVyZG9jayIsIHkgPSA2MywgeGVuZCA9ICJNYXNhdG9zaGkgSXRvIiwgeWVuZCA9IDk0LCANCiAgICAgICAgICAgY3VydmF0dXJlID0gLjMsIGNvbG9yID0gInNreWJsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKSArDQogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ID0gIkRhdmlkIE11cmRvY2siLCB5ID0gNjMsIHhlbmQgPSAiR2VvcmdlIEpvc2VwaCIsIHllbmQgPSA5NSwgDQogICAgICAgICAgIGN1cnZhdHVyZSA9IC4zLCBjb2xvciA9ICJza3libHVlIiwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDIsICJtbSIpKSkrDQogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ID0gIkRhdmlkIE11cmRvY2siLCB5ID0gNjMsIHhlbmQgPSAiRGF2aWQgTXVyZG9jayIsIHllbmQgPSA5NSwgDQogICAgICAgICAgIGN1cnZhdHVyZSA9IC4zLCBjb2xvciA9ICJza3libHVlIiwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDIsICJtbSIpKSkgKw0KICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwgeCA9ICJEYXZpZCBNdXJkb2NrIiwgeSA9IDYzLCB4ZW5kID0gIkNoYXJsZXMgTXVuZ2VyIiwgeWVuZCA9IDk0LCANCiAgICAgICAgICAgY3VydmF0dXJlID0gLjIsIGNvbG9yID0gInNreWJsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKSArDQogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ID0gIkRhdmlkIE11cmRvY2siLCB5ID0gNjMsIHhlbmQgPSAiQW5hIE1hcmlhIEJyZXNjaWEgQ2FmZmVyYXRhIiwgeWVuZCA9IDk0LCANCiAgICAgICAgICAgY3VydmF0dXJlID0gLjIsIGNvbG9yID0gInNreWJsdWUiLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpKQ0KDQpgYGANCg0KRWwgZ3LDoWZpY28gbXVlc3RyYSBhIGxhcyBwZXJzb25hcyBxdWUgb2N1cGFuIGxvcyBwcmltZXJvcyA1IGx1Z2FyZXMgZW50cmUgbGFzIHBlcnNvbmFzIG3DoXMgYW5jaWFub3MgZGUgbGEgbGlzdGEuIERlIGhlY2hvLCBlbCBncsOhZmljbyBtdWVzdHJhIGxvcyBwcmltZXJvcyAzIGx1Z2FyZXMgY29uIDYgcGVyc29uYXMsIHlhIHF1ZSBlbCB0ZXJjZXIgbHVnYXIgc29uIGxhcyBwZXJzb25hcyBkZWwgbWlzbW8gYcOxbywgYSBsYSBpbXByZXNpb25hbnRlIGVkYWQgZGUgOTcgYcOxb3MuIExvcyBkYXRvcyBkaXNwb25pYmxlcyBpbmRpY2FuIHF1ZSA1IGRlIGxvcyA2IG11bHRpbWlsbG9uYXJpb3MgbcOhcyBhbmNpYW5vcyBzb24gaG9tYnJlcyB5IHRpZW5lbiBhbCBtZW5vcyB0cmVzIGhpam9zLiANCg0KDQojIyMgTGFzIDUgcGVyc29uYXMgcXVlIHRpZW5lbiBtw6FzIGhpam9zDQoNCkFsIHRlbmVyIHVuYSBmb3J0dW5hIG11eSBncmFuZGUsIGVzIGV4dHJlbWFkYW1lbnRlIGltcG9ydGFudGUgdGVuZXIgaGVyZWRlcm9zLiBQb3IgbG8gdGFudG8sIG11eSBhIG1lbnVkbyBsYXMgcGVyc29uYXMgbcOhcyByaWNhcyBkZWwgbXVuZG8gdGllbmVuIG11Y2hvcyBkZXNjZW5kaWVudGVzIGEgcXVpZW5lcyBwdWVkZW4gdHJhbnNtaXRpciBzdSByaXF1ZXphLiBBaG9yYSBjb21wcm9iYXJlbW9zIHF1acOpbmVzIHNvbiBsYXMgcGVyc29uYXMgY29uIGVsIG1heW9yIG7Dum1lcm8gZGUgaGlqb3MsIGN1w6FudG9zIGHDsW9zIHRpZW5lbiwgZGUgcXXDqSBwYcOtc2VzIHNvbiwgY3XDoW50byBwYXRyaW1vbmlvIHRpZW5lbiB5IHF1w6kgcHVlc3RvIG9jdXBhbiBlbiBsYSBsaXN0YSBkZSBGb3JiZXMuIA0KDQoNCmBgYHtyfQ0KUmVjIDwtIGJpbDIxICU+JSANCiAgc2VsZWN0KE5hbWUsIENoaWxkcmVuLCBBZ2UsIENvdW50cnksIE5ldFdvcnRoLCBSYW5rLCBTb3VyY2UpICU+JSANCiAgc2xpY2VfbWF4KENoaWxkcmVuLCBuID0gNSkNCg0KDQoNCmtibChSZWMsIGFsaWduID0gImMiKSAlPiUgDQogIGthYmxlX21pbmltYWwoKSAlPiUgDQogIGNvbHVtbl9zcGVjKDIsIGJvbGQgPSBULCBjb2xvciA9ICJsaWdodGNvcmFsIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gbGlzdChlbmFibGVkID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSAibGlnaHRjb3JhbCIpKQ0KDQpgYGANCg0KQ29tbyBtdWVzdHJhbiBsb3MgZGF0b3MgZGUgbGEgdGFibGEsIGVsIHBvc2VlZG9yIGRlbCByw6ljb3JkIGVzIFJvbWFuIEF2ZGVldiBkZSBSdXNpYSwgcXVlIHRpZW5lIDIzIGhpam9zLiBMb3Mgc2lndWllbnRlcyBsdWdhcmVzIGVuIGVsIHJhbmtpbmcgcGVydGVuZWNlbiBhIGxvcyBjaXVkYWRhbm9zIGRlIE9tw6FuLCBFc3RhZG9zIFVuaWRvcyBlIElzcmFlbC4gVG9kYXMgbGFzIHBlcnNvbmFzIGRlIGxhIGxpc3RhIHNvbiBob21icmVzIHkgY2FkYSB1bm8gdGllbmUgbcOhcyBkZSAxMCBkZXNjZW5kaWVudGVzLg0KDQoNCiMjIyBSZWxhY2nDs24gZW50cmUgZWwgcGF0cmltb25pbyBuZXRvIHkgZWwgbsO6bWVybyBkZSBoaWpvcw0KDQpgYGB7cn0NCg0KTmV0Q2hpbGQgPC0gYmlsMjEgJT4lIA0KICBzZWxlY3QoTmFtZSwgTmV0V29ydGgsIENoaWxkcmVuKSAlPiUgDQogIGRyb3BfbmEoKQ0KDQpnZ3Bsb3QoTmV0Q2hpbGQsIGFlcyhOZXRXb3J0aCwgQ2hpbGRyZW4pKSArICANCiAgZ2VvbV9wb2ludChjb2xvciA9ICJsaWdodHBpbmszIiwgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChzaGFwZSA9IDEsIGNvbG9yID0gInBpbms0IikgKw0KICBnZW9tX2ppdHRlcihjb2xvciA9ICJtaXN0eXJvc2UxIiwgYWxwaGEgPSAwLjIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSZWxhY2nDs24gZW50cmUgcGF0cmltb25pbyBuZXRvIHkgbnVtZXJvIGRlIGhpam9zIiwNCiAgICB4ID0gIk51bWJlciBvZiBjaGlsZHJlbiIsDQogICAgeSA9ICJOZXQgd29ydGgiDQogICkgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAyMywgeSA9IDI0LCBsYWJlbCA9ICIyMyBoaWpvcywgMS44IG1pbCBtaWxsb25lcyAkIiwgY29sb3IgPSAicGluazQiKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxNzEsIHkgPSA4LCBhbmdsZT05MCwgbGFiZWwgPSAiIDE3NyBtaWwgbWlsbG9uZXMgJCwgNCBoaWpvcyIsIGNvbG9yID0gInBpbms0IikNCmBgYA0KDQpFbCBncsOhZmljbyBtdWVzdHJhIHF1ZSBlbCBncnVwbyBtw6FzIGdyYW5kZSBubyB0aWVuZSBtw6FzIGRlIDUgaGlqb3MgeSwgYWwgbWlzbW8gdGllbXBvLCB0aWVuZSB1bmEgcmlxdWV6YSBkZSBoYXN0YSAyNSBtaWwgbWlsbG9uZXMgZMOzbGFyZXMuIExvcyBleHRyZW1vcyBzb24gMjMgbmnDsW9zIHkgMSw4IG1pbCBtaWxsb25lcyBkw7NsYXJlcyBkZWwgcGF0cmltb25pbyBuZXRvIGRlIFJvbWFuIEF2ZGVldiwgeSAxNzcgbWlsIG1pbGxvbmVzIGTDs2xhcmVzIHkgNCBuacOxb3MsIHVuIHJlc3VsdGFkbyBxdWUgcGVydGVuZWNlIGEgSmVmZiBCZXpvcy4NCg0KDQojIyMgRXN0YWRvIGNpdmlsIGRlIGxvcyBtdWx0aW1pbGxvbmFyaW9zIGVuIDIwMjENCg0KQWwgZmluYWwgZGUgZXN0YSBwYXJ0ZSBkZWwgYW7DoWxpc2lzLCBlbiBlbCBncsOhZmljbyBjaXJjdWxhciwgdmVyZW1vcyBlbCBlc3RhZG8gY2l2aWwgZGUgbGFzIHBlcnNvbmFzIGNvbiBtw6FzIGRlIDEgbWlsIG1pbGxvbmVzIGTDs2xhcmVzIGRlbCBwYXRyaW1vbmlvLg0KDQpgYGB7cn0NCnN0YW4gPC0gYmlsMjEgJT4lIA0KICBzZWxlY3QoU3RhdHVzKSAlPiUgDQogIGdyb3VwX2J5KFN0YXR1cykgJT4lIA0KICBzdW1tYXJpc2UoTk4gPSBuKCkpICU+JSANCiAgYXJyYW5nZShkZXNjKE5OKSkgJT4lIA0KICB1bmdyb3VwKCkNCnN0YW5bMiwgMV0gPC0gIlVua25vd24iDQoNCg0KDQoNCmdncGxvdChzdGFuLCBhZXMoeCA9ICIiLCB5ID0gTk4sIGZpbGwgPSBTdGF0dXMpKSsNCiAgZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZV9zZXF1ZW50aWFsKHBhbGV0dGUgPSAiSGF3YWlpIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkNpdmlsIHN0YXR1cyIsDQogICAgICAgeCA9ICIgIiwNCiAgICAgICB5ID0gIiAiKQ0KDQpgYGANCkRlZmluaXRpdmFtZW50ZSBtw6FzIGRlbCA2MCUgZGUgbGFzIHBlcnNvbmFzIGVzdMOhbiBjYXNhZGFzLCBsYXMgcGFydGVzIG3DoXMgcGVxdWXDsWFzIGVzdMOhbiBvY3VwYWRhcyBwb3IgcGVyc29uYXMgZGl2b3JjaWFkYXMsIHZpdWRhcyBvIHNvbHRlcmFzLiBBcHJveGltYWRhbWVudGUgZWwgMjUlIGRlIGxvcyBkYXRvcyBzb24gZGUgImVzdGFkbyBkZXNjb25vY2lkbyIuDQo8YnI+DQoNCiMgNC4gQW7DoWxpc2lzIGRlIGxhcyBwZXJzb25hcyBtw6FzIHJpY2FzIGEgbG8gbGFyZ28gZGVsIHRpZW1wbw0KDQpFbiBsYSBzZWd1bmRhIHBhcnRlIHZveSBhIHVzYXIgbG9zIGRhdG9zIGRlIGxvcyBhw7FvcyAyMDAyIC0gMjAyMSwgcXVlIGluZGljYW4gbGFzIDEwIHBlcnNvbmFzIG3DoXMgcmljYXMgZW4gY2FkYSBhw7FvLiBFbCBkYXRhYmFzZSBjb250aWVuZSB0YW1iacOpbiBlbCB0YW1hw7FvIGRlbCBwYXRyaW1vbmlvIG5ldG8sIGVkYWQgbmFjaW9uYWxpZGFkIHkgbGEgZnVlbnRlIGRlIHJpcXVlemEuIEludGVudGFyw6kgY29tcHJvYmFyIGPDs21vIGNhbWJpYW4gbG9zIHJlc3VsdGFkb3MgYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KDQoNCg0KIyMgRWwgY2FtYmlvIGRlbCB0YW1hw7FvIGRlbCBwYXRyaW1vbmlvIGEgbG8gbGFyZ28gZGVsIHRpZW1wbw0KDQpBaG9yYSB2ZW5pbW9zIGEgaWx1c3RyYXIgZWwgY2FtYmlvIGVuIGVsIHRhbWHDsW8gZGVsIHBhdHJpbW9uaW8gZW4gZWwgcGVyw61vZG8gMjAwMi0yMDIxLiBBZGVtw6FzIHBvZHJlbW9zIG9ic2VydmFyIGxvcyBjYW1iaW9zIGRlIGxhcyBwZXJzb25hcyAobyBmYW1pbGlhcykgZW4gbG9zIHNlbGVjY2lvbmFkb3MgcHVlc3RvcyBkZWwgcmFua2luZy4gDQoNCmBgYHtyfQ0KDQoNCkZvcnR1bmUgPC0gZGYgJT4lIA0KICBncm91cF9ieSh5ZWFyKSANCg0KZ2dwbG90KCBGb3J0dW5lLA0KICAgICAgICBhZXMoeWVhciwgbmV0X3dvcnRoLCBncm91cCA9IHJhbmssIGNvbG9yID0gZmFjdG9yKHJhbmspKQ0KKSArDQogIGdlb21fbGluZSgpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKCkgKw0KICANCiAgZ2VvbV90ZXh0KGNoZWNrX292ZXJsYXAgPSBUUlVFLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBoanVzdCA9IDEsIHZqdXN0ID0gMCwgbnVkZ2VfeSA9IDIsIGFlcyhsYWJlbCA9IG5hbWUpKSArDQogIGxhYnMoeCA9ICJZZWFyIiwNCiAgICAgICB5ID0gIk5ldCB3b3J0aCIsDQogICAgICAgY29sb3IgPSAiUmFuayIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuNSwgImNtIikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCAyMDI1LCA1KSwgbGltaXRzID0gYygyMDAwLCAyMDI1KSkgKw0KICB0cmFuc2l0aW9uX3JldmVhbCh5ZWFyKSArDQogIHZpZXdfZm9sbG93KCkgDQoNCmBgYA0KDQpFbiBnZW5lcmFsLCBsYSB0ZW5kZW5jaWEgZXMgY3JlY2llbnRlLCBsbyBxdWUgc2lnbmlmaWNhLCBxdWUgZWwgcGF0cmltb25pbyBlbiBsb3MgMTAgIHByaW1lcm9zIHB1ZXN0b3MgZGUgbGEgbGlzdGEgZGUgRm9yYmVzIGVzIG1heW9yIGNhc2kgY2FkYSBhw7FvLCBvIHBvZGVtb3MgZGVjaXIsIHF1ZSBlbCBwYXRyaW1vbmlvIGF1bWVudGEgZW4gb2xlYWRhcy4gVmFsZSBsYSBwZW5hIG1lbmNpb25hciBxdWUgZW4gMjAwMiBlbCB0YW1hw7FvIGRlbCBwYXRyaW1vbmlvIG5ldG8gZW4gZWwgcHJpbWVyIHB1ZXN0byBkZSBsYSBsaXN0YSBmdWUgNjAgbWlsIG1pbGxvbmVzIGTDs2xhcmVzLCBtaWVudHJhcyBxdWUgZW4gZWwgYcOxbyAyMDIxIGVzIDE3NyBtaWwgbWlsbG9uZXMgZMOzbGFyZXMuIEVzdG8gY29uZmlybWEgbGEgdGVzaXMgZGUgcXVlIGxvcyByaWNvcyBzZSBlc3TDoW4gdm9sdmllbmRvIG3DoXMgcmljb3MgeSBxdWUgbGEgZGVzaWd1YWxkYWQgZGUgaW5ncmVzb3MgZW4gZWwgbXVuZG8gc2UgZXN0w6EgcHJvZnVuZGl6YW5kb1teM10uDQoNCiMjIExhIGVkYWQgcHJvbWVkaW8gZGUgbGFzIDEwIHBlcnNvbmFzIG3DoXMgcmljYXMgZW4gMjAwMi0yMDIxDQoNCkVuIGxhIHNpZ3VpZW50ZSBhbmltYWNpw7NuIHBvZGVtb3Mgb2JzZXJ2YXIgY29tbyBjYW1iaWEgbGEgZWRhZCBtZWRpYSBlbnRyZSAyMDAyIHkgMjAyMS4gVW4gdG9ubyBtw6FzIHJvam8sIHNpZ25pZmljYSB1biBwcm9tZWRpbyBkZSBlZGFkIG3DoXMgYWx0bywgZWwgdGludGUgYW1hcmlsbG8gLSBsYSBlZGFkIG1lZGlhIG3DoXMgYmFqYS4gRW4gZWwgcHJpbWVyIHBlcmlvZG8gbGEgZWRhZCBwcm9tZWRpbyBjcmVjacOzLCBkZXNwdcOpcyBmdWUgdmFyaWFibGUgcGVybyBhbGNhbnrDsyBlbCBtw6FzIGFsdG8gcmVzdWx0YWRvIGVuIDIwMTUsIGN1YW5kbyBmdWUgZGUgNzQuMyBhw7Fvcy4gRXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWUgZGVzZGUgMjAwMyBsYSBlZGFkIG1lZGlhIGRlIGxhcyAxMCBwZXJzb25hcyBtw6FzIHJpY2FzIGVuIGVsIG11bmRvIG5vIGNhecOzIHBvciBkZWJham8gZGUgNjAgYcOxb3MuDQoNCmBgYHtyfQ0KQWdlTWVhbiA8LSBkZiAlPiUgDQogIGdyb3VwX2J5KHllYXIpICU+JSANCiAgc3VtbWFyaXNlKE1lYW4gPSBtZWFuKGFnZSkpDQoNCmdncGxvdChBZ2VNZWFuLCBhZXMoeWVhciwgTWVhbiwgZmlsbCA9IE1lYW4pKSArDQogIGdlb21fY29sKCkrDQogIHRoZW1lX21pbmltYWwoKSArDQogIHhsYWIoIlllYXIiKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIiksDQogICAgcGFuZWwub250b3AgPSBUUlVFLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIg0KICApICsNCiAgc2NhbGVfZmlsbF9jb250aW51b3VzX3NlcXVlbnRpYWwocGFsZXR0ZSA9ICJPclllbCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA4MCwgMjApLCBsaW1pdHMgPSBjKDAsIDgwKSkgKw0KICB0cmFuc2l0aW9uX3N0YXRlcyh5ZWFyLCB3cmFwID0gRkFMU0UpICsNCiAgc2hhZG93X21hcmsoKQ0KYGBgDQoNCg0KIyMgTWFwYSBkZSBjb25jZW50cmFjacOzbiBkZWwgcGF0cmltb25pbyBlbiAyMDAyLTIwMjENCg0KRW4gZWwgbWFwYSBkZSBhYmFqbyBzZSBtdWVzdHJhIGVsIGNhbWJpbyBlbiBsYSBjb25jZW50cmFjacOzbiBkZSBsYSByaXF1ZXphIHF1ZSBwZXJ0ZW5lY2UgYSBsYXMgMTAgcGVyc29uYXMgbcOhcyByaWNhcyBkZWwgbXVuZG8sIGRlc2dsb3NhZG8gcG9yIHBhw61zLiANCg0KYGBge3J9DQpkYXRhKFdvcmxkKQ0Kd29ybGQgPC0gV29ybGQgOyBybShXb3JsZCkNCg0Kd29ybGQxIDwtIHdvcmxkICU+JSANCiAgc2VsZWN0KENvdW50cnkgPSBuYW1lLCBnZW9tZXRyeSkNCg0KbWFwYTIgPC0gZGYgJT4lIA0KICBzZWxlY3QoeWVhciwgbmV0X3dvcnRoLCBDb3VudHJ5ID0gbmF0aW9uYWxpdHkpICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgQ291bnRyeSkgJT4lIA0KICBtdXRhdGUgKHN1bWEgPSBzdW0obmV0X3dvcnRoKSkgJT4lIA0KICBkaXN0aW5jdCh5ZWFyLCBDb3VudHJ5LCBzdW1hKSANCg0KbWFwYTMgPC0gbGVmdF9qb2luKHdvcmxkMSwgbWFwYTIsIGJ5ID0gIkNvdW50cnkiKSU+JSANCiAgZHJvcF9uYSgpDQoNCmdncGxvdCgpICsgDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBtYXBhMywgYWVzKGZpbGwgPSBzdW1hKSkgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXNfc2VxdWVudGlhbChwYWxldHRlID0gIkRhcmsgTWludCIsIG5hbWUgPSAiTWlsZXMgZGUgbWlsbGlvbmVzIGRlIGTDs2xhcmVzIikrDQogIGxhYnMoDQogICAgdGl0bGUgPSAiWWVhcjoge2N1cnJlbnRfZnJhbWV9Ig0KICApICsgIHRoZW1lX3ZvaWQoKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMSwgImNtIikpICsNCiAgdHJhbnNpdGlvbl9tYW51YWwoeWVhcikNCmBgYA0KRXMgYmFzdGFudGUgb2J2aW8gcXVlIGVuIGNhZGEgYcOxbywgbG9zIEVzdGFkb3MgVW5pZG9zIHNvbiBtYXJjYWRvcyBlbiBlbCBtYXBhLCBwZXJvIGxvIG3DoXMgaW50ZXJlc2FudGUgZXMsIHF1ZSBsYSB2YXJpZWRhZCBkZSBsb3MgcGHDrXNlcyBhIGxhIHZhbmd1YXJkaWEgZGlzbWludXllIGNhZGEgYcOxbyB5IGxvcyBFc3RhZG9zIFVuaWRvcyBjb25jZW50cmFuIG3DoXMgeSBtw6FzIGRlIGxhIHJpcXVlemEuIEVzcGHDsWEgZGVzYXBhcmVjZSBkZWwgbWFwYSBlbiAyMDIxLCBjb24gbGEgZGVzYXBhcmljacOzbiBkZSBsYSBsaXN0YSBkZSBsYXMgMTAgcGVyc29uYXMgbcOhcyByaWNhcyBkZSAqKkFtYW5jaW8gT3J0ZWdhKiouIEF1bnF1ZSwgY3VyaW9zYW1lbnRlIHNlIHNpdMO6YSAganVzdG8gZnVlcmEgZGUgbG9zIDEwIG1lam9yZXMgcHVlc3RvcywgZW4gZWwgcHVlc3RvIDExW140XS4NCjxicj4NCg0KIyA1LiBDb21wYXJhY2nDs246IGVsIHJhbmtpbmcgRm9yYmVzIHkgZWwgcmFua2luZyBkZSBsaWJlcnRhZCBlY29uw7NtaWNhDQoNCiMjIEVsIHJhbmdvIGRlIGxvcyBwYcOtc2VzIGVuIGVsIHJhbmtpbmcgZGUgbG9zIG11bHRpbWlsbG9uYXJpb3MgeSBlbiBlbCByYW5raW5nIGRlIGxpYmVydGFkIGVjb27Ds21pY2ENCg0KVGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYSByaXF1ZXphIHRhcmRhIGHDsW9zIGVuIGFjdW11bGFyc2UsIGRlY2lkw60gcXVlIHRhbCBjb21wYXJhY2nDs24gcG9kcsOtYSB0ZW5lciBzZW50aWRvLiBQYXJhIGxhcyBuZWNlc2lkYWRlcyBkZSBlc3RhIGNvbXBhcmFjacOzbiwgY29uc3RydcOtIGVsIHJhbmtpbmcgZGUgcGHDrXNlcy4gRWwgbWVqb3IgcHVlc3RvIHRpZW5lIGVsIHBhw61zIHF1ZSBhcGFyZWNpw7MgbcOhcyB2ZWNlcyBlbiBsYSBsaXN0YSBkZSBsb3MgMTAgbXVsdGltaWxsb25hcmlvcyBlbiBsb3MgYcOxb3MgMjAwMi0yMDE5LiBQb3Igb3RybyBsYWRvLCB1c2FiYSBlbCByYW5raW5nIGRlIGxhIGxpYmVydGFkIGVjb27Ds21pY2EgZGVsIDIwMTkuIFBvZGVtb3Mgb2JzZXJ2YXIgbG9zIHJlc3VsdGFkb3MgZW4gbGEgdGFibGEgeSBlbiBlbCBncsOhZmljby4gTG9zIHB1bnRvcyBhenVsZXMgbWFyY2FuIGxhcyBwb3NpY2lvbmVzIGRlIGxvcyBwYcOtc2VzIGVuIGVsIHJhbmtpbmcgZGUgbG9zIG11bHRpbWlsbG9uYXJpb3MgeSBsb3MgY3VhZHJhZG9zIGluZGljYW4gbHVnYXJlcyBlbiBlbCByYW5raW5nIGRlIGxpYmVydGFkIGVjb27Ds21pY2EuDQoNCmBgYHtyfQ0KDQpyYW5rMSA8LSBkZiAlPiUgDQogIGZpbHRlcih5ZWFyIDw9IDIwMTkpICU+JSANCiAgc2VsZWN0KENvdW50cnkgPSBuYXRpb25hbGl0eSkgJT4lIA0KICBjb3VudChDb3VudHJ5KSAlPiUgDQogIHJlbmFtZShPYnNlcnZhdGlvbnMgPSBuKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhPYnNlcnZhdGlvbnMpKSAlPiUgDQogIG11dGF0ZShSYW5rID0gYygxOjEzKSkgJT4lIA0KICBzZWxlY3QoIU9ic2VydmF0aW9ucykNCg0KcmFuazEgPC0gbGVmdF9qb2luKHJhbmsxLCBlY29mcmVlMTksIGJ5ID0gIkNvdW50cnkiKQ0KDQpyYW5rMSA8LSByYW5rMSAlPiUgDQogIHJlbmFtZSgiUmFua0UiID0gIldvcmxkX3JhbmsiKQ0KDQprYmwocmFuazEpICU+JSANCiAga2FibGVfbWluaW1hbCgpICU+JSANCiAgc2Nyb2xsX2JveCh3aWR0aCA9ICI0MjBweCIsIGhlaWdodCA9ICIxNjBweCIpICU+JSANCiAga2FibGVfc3R5bGluZyhwb3NpdGlvbiA9ICJjIikNCiAgDQogIA0KZ2dwbG90KHJhbmsxKSArDQogIGdlb21fc2VnbWVudChhZXMoeCA9IFJhbmssIHhlbmQgPSBSYW5rLCB5ID0gUmFuaywgeWVuZCA9IFJhbmtFKSwgY29sb3IgPSAibGlnaHRzdGVlbGJsdWUzIikgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gUmFuaywgeSA9IFJhbmspLCBjb2xvciA9ICJtaWRuaWdodGJsdWUiLCBzaGFwZSA9IDIwLCBzaXplID0gMywgZmlsbCA9ICJsaWdodGN5YW4xIiwgc3Ryb2tlID0gMSkgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gUmFuaywgeSA9IFJhbmtFKSwgY29sb3IgPSAibWlkbmlnaHRibHVlIiwgc2hhcGUgPSAyMiwgc2l6ZSA9IDMsIGZpbGwgPSAib2xkbGFjZSIsIHN0cm9rZSA9IDEpICsNCiAgc2NhbGVfeF9yZXZlcnNlKGJyZWFrcyA9IHNlcSgxLCAxMywgMSksIGxhYmVsID0gYygiVW5pdGVkIFN0YXRlcyIsICJNZXhpY28iLCAiSW5kaWEiLCAiU3BhaW4iLCAiRnJhbmNlIiwgIkdlcm1hbnkiLCAiU3dlZGVuIiwgIkhvbmcgS29uZyIsICJTYXVkaSBBcmFiaWEiLCAiQnJhemlsIiwgIkNhbmFkYSIsICJKYXBhbiIsICJSdXNzaWEiICkpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJMb3MgcHVlc3RvcyBlbiBkb3MgcmFua2luZ3MiLA0KICAgIHggPSAiQ291bnRyeSINCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMSwgMTUwLCAxNDkpKQ0KDQpgYGANCg0KQW5hbGl6YW5kbyBsb3MgcmVzdWx0YWRvcywgY29tbyBzZSBwdWVkZSB2ZXIsIGxvcyBFc3RhZG9zIFVuaWRvcyBzb24gZWwgbHVnYXIgcXVlIGFwYXJlY2UgY29uIG1heW9yIGZyZWN1ZW5jaWEgZW4gbGEgbGlzdGEgZGUgbGFzIHBlcnNvbmFzIG3DoXMgcmljYXMgZGVsIG11bmRvLiBUYW1iacOpbiBhcGFyZWNpZXJvbiBhbGzDrSB2YXJpb3MgcGHDrXNlcyBldXJvcGVvcywgZW50cmUgZWxsb3MgRXNwYcOxYS4gQ3VhbmRvIGNvbXBhcmFtb3MgbG9zIHJlc3VsdGFkb3MgZGUgZXN0b3MgcGHDrXNlcyBlbiBlbCByYW5raW5nIGRlIGxpYmVydGFkIGVjb27Ds21pY2EsIGEgdmVjZXMgbG9zIHB1ZXN0b3MgZW4gYW1ib3MgcmFua2luZ3Mgc29uIG11eSBhbHRvcywgcGVybyBwYXJhIGxvcyBwYcOtc2VzIGNvbW8gQnJhc2lsLCBJbmRpYSBvIFJ1c2lhIGxvcyByZXN1bHRhZG9zIHNvbiBkaXZlcmdlbnRlcy4gRXN0b3MgcGHDrXNlcyBzZSBzaXR1YWJhbiBlbiBsYSBsaXN0YSBkZSBsb3MgbXVsdGltaWxsb25hcmlvcyAoZXN0byB5YSBlcyB1bmEgZGlzdGluY2nDs24pLCBwZXJvIHN1IGxpYmVydGFkIGVjb27Ds21pY2Egbm8gZXN0w6EgZW4gdW4gcHVlc3RvIGFsdG8uIEFzw60gcXVlIGxhIGNvbXBhcmFjacOzbiBkZWwgcmFua2luZyBkZSBsb3MgcGHDrXNlcyBtw6FzIHBvcHVsYXJlcyBlbiBsYSBsaXN0YSBkZSBsb3MgbXVsdGltaWxsb25hcmlvcyB5IGVsIHJhbmtpbmcgZGUgbGEgbGliZXJ0YWQgZWNvbsOzbWljYSBwYXJhIGVzdG9zIHBhw61zZXMgbm9zIG11ZXN0cmEgcXVlIG5vIGhheSB1bmEgY29uZXhpw7NuIGVudHJlIGVzdG9zIGZhY3RvcmVzLg0KPGJyPg0KDQojIDYuIEFtYW5jaW8gT3J0ZWdhIGVuIGxhIGxpc3RhIGRlIEZvcmJlcw0KDQpBbCBmaW5hbCwgdW4gcGVxdWXDsW8gYm9udXMuIMK/Q3XDoWwgZXMgbGEgcHJlc2VuY2lhIGRlbCDDum5pY28gcmVwcmVzZW50YW50ZSBkZSBFc3Bhw7FhIGVudHJlIGxhcyAxMCBwZXJzb25hcyBtw6FzIHJpY2FzIGRlbCBtdW5kbz8gRW4gcHJpbWVyIGx1Z2FyLCB1biBwb3F1aXRvIGRlIGRhdG9zIHNvYnJlIGVzdGUgY8OpbGVicmUgZXNwYcOxb2wsIGRlbCBhw7FvIDIwMjEuIEx1ZWdvIHVuIGRpYnVqbyBxdWUgbXVlc3RyYSBzdSBpbWFnZW4geSBwb3Igw7psdGltbywgZWwgY2FtYmlvIGRlIHN1IHBhdHJpbW9uaW8gbmV0byBhIGxvIGxhcmdvIGRlbCB0aWVtcG8uIA0KDQpgYGB7cn0NCm9ydGVnYSA8LSBkZiAlPiUgDQogIGZpbHRlcihuYW1lID09ICJBbWFuY2lvIE9ydGVnYSIpDQoNCm9ydGVnYVQgPC0gb3J0ZWdhICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMCkgJT4lIA0KICBzZWxlY3QobmFtZSwgYWdlLCBuYXRpb25hbGl0eSwgc291cmNlID0gc291cmNlX3dlYWx0aCkNCg0Ka2JsKG9ydGVnYVQsIGFsaWduID0gImMiKSAlPiUgDQogIGthYmxlX3BhcGVyKCkgJT4lIA0KICByb3dfc3BlYygxLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImNob2NvbGF0ZSIpDQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoIi4vYXNzZXRzL29ydGVnYTMuanBlZyIpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCm9ydGVnYUcgPC0gb3J0ZWdhICU+JSANCiAgc2VsZWN0KHllYXIsIG5ldF93b3J0aCwgcmFuaykNCg0KDQpnZ3Bsb3Qob3J0ZWdhRywgYWVzKHllYXIsIG5ldF93b3J0aCkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtvbGl2ZWdyZWVuMyIpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJjaG9jb2xhdGU0Iiwgc2hhcGUgPSAxLCBzaXplID0gMykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDcsIDIwMjEsIDIpLCBsaW1pdHMgPSBjKDIwMDcsIDIwMjEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRWwgY2FtYmlvIGRlbCBwYXRyaW1vbmlvIGRlIEFtYW5jaW8gT3J0ZWdhIiwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiTmV0IHdvcnRoIChiaWxsaW9uICQpIg0KICApICsgDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAyMDA3LCB5ID0gMjcsIGxhYmVsID0gIjI0LjAiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gMjAxNywgeSA9IDc0LCBsYWJlbCA9ICI3MS4zIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMSwgeCA9IDIwMTcsIHkgPSA3MS4zLCBzaXplID0gMywgY29sb3IgPSAiY2hvY29sYXRlNCIpICsNCiAgdHJhbnNpdGlvbl9yZXZlYWwoeWVhcikNCmBgYA0KPGJyPjxicj4NCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KDQoNCiMgNy4gQmlibGlvZ3JhZsOtYSB5IHRyYWJham9zIGVuIGxvcyBxdWUgaGEgYmFzYWRvDQoNClBhcmEgZXN0ZSBhbsOhbGlzaXMsIHV0aWxpY8OpIGxhcyBzaWd1aWVudGVzIGZ1ZW50ZXMgZGUgSW50ZXJuZXQ6DQoNCi0gW0ZvcmJlcyBiaWxsaW9uYWlyZXNdKGh0dHBzOi8vd3d3LmZvcmJlcy5jb20vYmlsbGlvbmFpcmVzLykNCi0gW0thZ2dsZV0oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS8pDQotIFtPeGZhbV0oaHR0cHM6Ly93d3cub3hmYW0ub3JnL2VzL3RheG9ub215L3Rlcm0vMTQ4MCkNCi0gPGh0dHBzOi8vYml6bmVzLmdhemV0YXByYXduYS5wbC9hcnR5a3VseS84MzE2MTk3LGJvZ2FjZW5pZS1zaWUtbmFqYm9nYXRzenljaC1zdGF0eXN0eWtpLmh0bWw+DQotIDxodHRwczovL3d3dy5wYXJraWV0LmNvbS9Hb3Nwb2RhcmthLS0tU3dpYXQvMzA5Mjk5ODY2LUJvZ2FjaS1zYS1jb3Jhei1ib2dhdHNpLmh0bWw+DQotIDxodHRwczovL2J1c2luZXNzaW5zaWRlci5jb20ucGwvZmluYW5zZS9qYWtpLXByb2NlbnQtbWFqYXRrdS1zd2lhdGEtcG9zaWFkYWphLW5hamJvZ2F0c2ktZGFuZS0yMDE3LXJvay85bGRycHc4Pg0KLSA8aHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2thYmxlRXh0cmEvdmlnbmV0dGVzL2F3ZXNvbWVfdGFibGVfaW5faHRtbC5odG1sI1RhYmxlX1N0eWxlcz4NCi0gPGh0dHBzOi8vYmpubm93YWsubmV0bGlmeS5hcHAvMjAyMS8xMC8wNC9yLWJlYXV0aWZ1bC10YWJsZXMtd2l0aC1ndC1hbmQtZ3RleHRyYXMvPg0KLSA8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQXVzdGluX1J1c3NlbGxfKGVudHJlcHJlbmV1cik+DQotIDxodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9wbC9kb2NzL0xlYXJuL0dldHRpbmdfc3RhcnRlZF93aXRoX3RoZV93ZWIvQ1NTX2Jhc2ljcz4NCi0gPGh0dHA6Ly9ob3cyaHRtbC5wbC9jemNpb25rYS1jc3MvPg0KDQo8YnI+DQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQpzZXNzaW9uaW5mbzo6c2Vzc2lvbl9pbmZvKCkgJT4lIGRldGFpbHM6OmRldGFpbHMoc3VtbWFyeSA9ICdJbmZvcm1hY2nDs24gZGUgbWkgUi1zZXNpw7NuOicpIA0KYGBgDQoNCjxkaXYgY2xhc3M9InRvY2lmeS1leHRlbmQtcGFnZSIgZGF0YS11bmlxdWU9InRvY2lmeS1leHRlbmQtcGFnZSIgc3R5bGU9ImhlaWdodDogMDsiPjwvZGl2Pg0KPGJyPjxicj4NCg0KPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+DQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNClteMV06IE9YRkFNLCAyMDE4DQpbXjJdOiBXaWtpcGVkaWEsICJBdXN0aW4gUnVzc2VsIg0KW14zXTogTGljaG5lcm93aWN6LCAyMDIxDQpbXjRdOiBGb3JiZXMsIDIwMjENCg==