GDP các nước thuộc khu vực Đông Nam Á

# 99. Rchart --------------------------------------------------------------
library(ggplot2)
library(readxl)
library(dplyr)
library(reshape2)
library(extrafont)
my_font <- "OfficinaSansITC"


df1 <- read_excel('D:\\VUDT\\8.TRAINING\\Chart\\world_bank\\Popular Indicators.xlsx',sheet = 1)




# 99.1 GPD, Pop -----------------------------------------------------------
library(ggplot2)
library(dplyr)
library(reshape2)
library(ggrepel)
library(ggthemes)
library(grid)
library(cowplot)
library(extrafont)
my_font <- "OfficinaSansITC"



df1 <- read_excel('D:\\VUDT\\8.TRAINING\\Chart\\world_bank\\Popular Indicators.xlsx',sheet = 1)
# df1 %>% select(`Series Name`) %>% distinct() %>% View()

df <- 
  df1 %>% 
  filter(`Series Name` %in% c('Population, total','GDP (current US$)','Inflation, GDP deflator (annual %)')) %>% 
  select(`Country Name`,`Series Name`,`2017 [YR2017]`,`2016 [YR2016]`) %>% 
  filter(`Country Name` %in% c('Brunei Darussalam','Cambodia','Indonesia','Lao PDR','Malaysia','Myanmar',
                               'Philippines','Singapore','Thailand','Timor-Leste','Vietnam')) 

df <- 
  df %>%
  select(`Country Name`,`Series Name`,`2017 [YR2017]`) %>% 
  dcast(`Country Name` ~ `Series Name`)

names(df)[1] <- 'Country'
names(df)[2] <- 'GDP'
names(df)[3] <- 'INF'
names(df)[4] <- 'POP'


df$GDP <- as.numeric(df$GDP)
df$POP <- as.numeric(df$POP)
df$INF <- as.numeric(df$INF)


df <- 
  df %>% 
  mutate(GDP = GDP/1e9,
         POP = POP/1e6)


Label.Point <- df$Country


# Hàm hồi quy Số lượng sales và số tiền giải ngân mới....
lm.fit <- lm(data = df,
             GDP ~ POP)  
lm.fit.square <- lm.fit %>% summary()
# lm.fit.square$r.squared
lm.fit.square$coefficients %>% as.data.frame() -> a


df %>%
  ggplot(aes(x = POP,y = GDP)) +
  geom_point(aes(size = GDP/POP), colour = '#23576E') +
  geom_smooth(aes(fill='red'),
              formula = y ~ log(x),
              method = 'lm',
              se = FALSE,
              color = 'red') +
  geom_text_repel(aes(label = df$Country),
                  color = 'gray20',
                  size = 3,
                  min.segment.length = 1,
                  segment.colour = 'red',
                  family = 'serif',
                  box.padding = unit(1, 'lines'),
                  data = subset(df, df$Country %in% Label.Point)) +
  geom_hline(yintercept = mean(df$GDP), linetype="dashed", size=.1) +
  # theme_economist() +
  # theme_bw() +
  theme(plot.background = element_rect(fill = "#EFF2F4", color = NA)) + 
  theme(panel.background = element_rect(fill = "#EFF2F4", color = NA)) +
  theme(legend.background = element_rect(fill = "#EFF2F4", color = NA)) +
  theme(text = element_text(family = 'serif'),
        # title = element_text(size = 14),
        plot.title = element_text(hjust = 0.5,face = 'bold'),
        axis.text.x = element_text(size = 9) ,
        axis.text.y = element_text(size = 9) ,
        legend.text = element_text(size = 7),
        legend.title = element_text(size = 7),
        legend.position = 'top') +
  scale_fill_manual(name='', values=c('red'),
                    # labels=c('R_square=52%')
                    labels = paste0('R_square =',round(lm.fit.square$r.squared,2)*100,'%')) +
  # scale_shape_discrete(name='Amount disbursement') +
  scale_colour_gradient() +
  # guides(size = FALSE) +
  geom_curve(aes(x = 200, y = 190, xend = 200, yend = 250),arrow = arrow(length = unit(0.01, 'npc'))) +
  annotate('text', x = 200, y = 170, size = 3, family = 'serif', label = "GDP b\u00ECnh qu\u00E2n khu v\u1EF1c\n \u0110\u00F4ng Nam \u00C1")+
  labs(x = ' \r\n\r\nT\u00D4\u0309NG D\u00C2N S\u00D4\u0301 (TRI\u00CA\u0323U NG\u01AF\u01A0\u0300I)',
       y = 'T\u00D4\u0309NG SA\u0309N PH\u00C2\u0309M QU\u00D4\u0301C N\u00D4\u0323I (TY\u0309 USD)',
       size ="GDP tr\u00EAn \u0111\u00E2\u0300u ng\u01B0\u01A1\u0300i (Nghi\u0300n  USD)",
       title = '',
       caption = "Ngu\u00F4\u0300n: https://databank.worldbank.org") -> A1


# A2 <- add_sub(A1,'Ta\u0301c gia\u0309: Vu\u0303 \u0110\u0103\u0323ng\nMail: tuanvu.dang257@gmail.com',
#               x = 0,
#               hjust = 0,
#               fontface = 'plain',
#               fontfamily = 'serif',
#               size= 10) 
  
A2 <- A1
ggdraw(A2)

GDP bình quân đầu người các nước khu vực Đông Nam Á.

# 99.2 GDP - Đông Nam Á --------------------------------------------------
df_2016 <- 
  df1 %>% 
  filter(`Series Name` %in% c('Population, total','GDP (current US$)')) %>% 
  select(`Country Name`,`Series Name`,`2016 [YR2016]`) %>% 
  filter(`Country Name` %in% c('Brunei Darussalam','Cambodia','Indonesia','Lao PDR','Malaysia','Myanmar',
                               'Philippines','Singapore','Thailand','Timor-Leste','Vietnam')) 

df_2016 <- df_2016 %>% dcast(`Country Name` ~ `Series Name`)
df_2016$`GDP (current US$)` <- as.numeric(df_2016$`GDP (current US$)`)
df_2016$`Population, total` <- as.numeric(df_2016$`Population, total`)

df_2016 <- df_2016 %>% mutate(`2016 [YR2016]` = (`GDP (current US$)`/`Population, total`))

df_2017 <- 
  df1 %>% 
  filter(`Series Name` %in% c('Population, total','GDP (current US$)')) %>% 
  select(`Country Name`,`Series Name`,`2017 [YR2017]`) %>% 
  filter(`Country Name` %in% c('Brunei Darussalam','Cambodia','Indonesia','Lao PDR','Malaysia','Myanmar',
                               'Philippines','Singapore','Thailand','Timor-Leste','Vietnam')) 

df_2017 <- df_2017 %>% dcast(`Country Name` ~ `Series Name`)
df_2017$`GDP (current US$)` <- as.numeric(df_2017$`GDP (current US$)`)
df_2017$`Population, total` <- as.numeric(df_2017$`Population, total`)

df_2017 <- df_2017 %>% mutate(`2017 [YR2017]` = (`GDP (current US$)`/`Population, total`))

df <- df_2017 %>% left_join(df_2016, by = 'Country Name') %>% select(`Country Name`,`2017 [YR2017]`,`2016 [YR2016]`)

df$`2017 [YR2017]` <- as.numeric(df$`2017 [YR2017]`)
df$`2016 [YR2016]` <- as.numeric(df$`2016 [YR2016]`)
# df %>% arrange(`2017 [YR2017]`)
# df %>% View()

left_label <- paste(df$`Country Name`, round(df$`2016 [YR2016]`,0),sep=", ")
right_label <- paste(df$`Country Name`, round(df$`2017 [YR2017]`,0),sep=", ")
df$class <- ifelse((df$`2017 [YR2017]` > median(df$`2017 [YR2017]`)), "green", "red")

left_label <- c("Brunei Darussalam, 26939","","Indonesia, 3569","" ,          
                "Malaysia, 9515","","","Singapore, 55243",        
                "Thailand, 5979","","Vietnam, 2171"  )

right_label <- c( "Brunei Darussalam, 28291","=","Indonesia, 3846","",           
                  "Malaysia, 9952","","","Singapore, 57714",        
                  "Thailand, 6595","","Vietnam, 2342" )

# Plot
p <- ggplot(df) + 
  geom_segment(aes(x=2016, xend=2017, y=`2016 [YR2016]`, yend=`2017 [YR2017]`, col=class), size=.75, show.legend=F) + 
  geom_vline(xintercept=2016, linetype="dashed", size=.1) + 
  geom_vline(xintercept=2017, linetype="dashed", size=.1) +
  scale_color_manual(labels = c("Up", "Down"), 
                     values = c("green"="#00ba38", "red"="#f8766d")) +  # color of lines
  labs(x="", 
       # y="D\u01B0 n\u01A1\u0323 cu\u00F4\u0301i ki\u0300",
       y = "",
       title = 'T\u00D4\u0309NG SA\u0309N PH\u00C2\u0309M QU\u00D4\u0301C N\u00D4\u0323I TR\u00CAN \u0110\u00C2\u0300U NG\u01AF\u01A0\u0300I\n KHU V\u01AF\u0323C \u0110\u00D4NG NAM A\u0301 (NGHI\u0300N USD)') +   # Axis labels
  xlim(2015.5,2017.5) + ylim(0,(1.1*(max(df$`2016 [YR2016]`, df$`2017 [YR2017]`))))  # X and Y axis limits

# Add texts
p <- p + geom_text(label=left_label, y=df$`2016 [YR2016]`, x=rep(2016, NROW(df)), hjust=1.1, size=3.5, family = 'serif')
p <- p + geom_text(label=right_label, y=df$`2017 [YR2017]`, x=rep(2017, NROW(df)), hjust=-0.1, size=3.5, family = 'serif')
p <- p + geom_text(label="2016", x=2016, y=1.1*(max(df$`2016 [YR2016]`, df$`2017 [YR2017]`)), hjust=1.2, size=5, family = 'serif')  # title
p <- p + geom_text(label="2017", x=2017, y=1.1*(max(df$`2016 [YR2016]`, df$`2017 [YR2017]`)), hjust=-0.1, size=5, family = 'serif')  # title

# Minify theme
p1 <- 
  p + 
  theme(panel.background = element_blank(), 
        panel.grid = element_blank(),
        axis.ticks = element_blank(),
        axis.text.x = element_blank(),
        panel.border = element_blank(),
        plot.margin = unit(c(1,2,1,2), "cm"),
        axis.title = element_text(family = my_font,size = 16),
        text = element_text(family = 'serif')) +
  theme(title = element_text(size = 16)) +
  theme(plot.title = element_text(hjust = 0.5,face = 'bold')) +
  theme(plot.background = element_rect(fill = "#EFF2F4", color = NA)) + 
  theme(panel.background = element_rect(fill = "#EFF2F4", color = NA)) +
  theme(legend.background = element_rect(fill = "#EFF2F4", color = NA))

p1

# library("gridExtra")
# grid.arrange(ggdraw(A2),p1,
#              ncol = 2, nrow = 1)
LS0tDQp0aXRsZTogIkdEUC3EkMO0bmcgTmFtIMOBIg0KYXV0aG9yOiAiUkNoYXJ0Ig0KZGF0ZTogIk1heSAyNywgMjAxOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsd2FybmluZyA9IEYsZXJyb3IgPSBGLG1lc3NhZ2UgPSBGKQ0KYGBgDQoNCg0KDQojIEdEUCBjw6FjIG7GsOG7m2MgdGh14buZYyBraHUgduG7sWMgxJDDtG5nIE5hbSDDgQ0KYGBge3J9DQojIDk5LiBSY2hhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGV4dHJhZm9udCkNCm15X2ZvbnQgPC0gIk9mZmljaW5hU2Fuc0lUQyINCg0KDQpkZjEgPC0gcmVhZF9leGNlbCgnRDpcXFZVRFRcXDguVFJBSU5JTkdcXENoYXJ0XFx3b3JsZF9iYW5rXFxQb3B1bGFyIEluZGljYXRvcnMueGxzeCcsc2hlZXQgPSAxKQ0KDQoNCg0KDQojIDk5LjEgR1BELCBQb3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ3JpZCkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoZXh0cmFmb250KQ0KbXlfZm9udCA8LSAiT2ZmaWNpbmFTYW5zSVRDIg0KDQoNCg0KZGYxIDwtIHJlYWRfZXhjZWwoJ0Q6XFxWVURUXFw4LlRSQUlOSU5HXFxDaGFydFxcd29ybGRfYmFua1xcUG9wdWxhciBJbmRpY2F0b3JzLnhsc3gnLHNoZWV0ID0gMSkNCiMgZGYxICU+JSBzZWxlY3QoYFNlcmllcyBOYW1lYCkgJT4lIGRpc3RpbmN0KCkgJT4lIFZpZXcoKQ0KDQpkZiA8LSANCiAgZGYxICU+JSANCiAgZmlsdGVyKGBTZXJpZXMgTmFtZWAgJWluJSBjKCdQb3B1bGF0aW9uLCB0b3RhbCcsJ0dEUCAoY3VycmVudCBVUyQpJywnSW5mbGF0aW9uLCBHRFAgZGVmbGF0b3IgKGFubnVhbCAlKScpKSAlPiUgDQogIHNlbGVjdChgQ291bnRyeSBOYW1lYCxgU2VyaWVzIE5hbWVgLGAyMDE3IFtZUjIwMTddYCxgMjAxNiBbWVIyMDE2XWApICU+JSANCiAgZmlsdGVyKGBDb3VudHJ5IE5hbWVgICVpbiUgYygnQnJ1bmVpIERhcnVzc2FsYW0nLCdDYW1ib2RpYScsJ0luZG9uZXNpYScsJ0xhbyBQRFInLCdNYWxheXNpYScsJ015YW5tYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaGlsaXBwaW5lcycsJ1NpbmdhcG9yZScsJ1RoYWlsYW5kJywnVGltb3ItTGVzdGUnLCdWaWV0bmFtJykpIA0KDQpkZiA8LSANCiAgZGYgJT4lDQogIHNlbGVjdChgQ291bnRyeSBOYW1lYCxgU2VyaWVzIE5hbWVgLGAyMDE3IFtZUjIwMTddYCkgJT4lIA0KICBkY2FzdChgQ291bnRyeSBOYW1lYCB+IGBTZXJpZXMgTmFtZWApDQoNCm5hbWVzKGRmKVsxXSA8LSAnQ291bnRyeScNCm5hbWVzKGRmKVsyXSA8LSAnR0RQJw0KbmFtZXMoZGYpWzNdIDwtICdJTkYnDQpuYW1lcyhkZilbNF0gPC0gJ1BPUCcNCg0KDQpkZiRHRFAgPC0gYXMubnVtZXJpYyhkZiRHRFApDQpkZiRQT1AgPC0gYXMubnVtZXJpYyhkZiRQT1ApDQpkZiRJTkYgPC0gYXMubnVtZXJpYyhkZiRJTkYpDQoNCg0KZGYgPC0gDQogIGRmICU+JSANCiAgbXV0YXRlKEdEUCA9IEdEUC8xZTksDQogICAgICAgICBQT1AgPSBQT1AvMWU2KQ0KDQoNCkxhYmVsLlBvaW50IDwtIGRmJENvdW50cnkNCg0KDQojIEjDoG0gaOG7k2kgcXV5IFPhu5EgbMaw4bujbmcgc2FsZXMgdsOgIHPhu5EgdGnhu4FuIGdp4bqjaSBuZ8OibiBt4bubaS4uLi4NCmxtLmZpdCA8LSBsbShkYXRhID0gZGYsDQogICAgICAgICAgICAgR0RQIH4gUE9QKSAgDQpsbS5maXQuc3F1YXJlIDwtIGxtLmZpdCAlPiUgc3VtbWFyeSgpDQojIGxtLmZpdC5zcXVhcmUkci5zcXVhcmVkDQpsbS5maXQuc3F1YXJlJGNvZWZmaWNpZW50cyAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+IGENCg0KDQpkZiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gUE9QLHkgPSBHRFApKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBHRFAvUE9QKSwgY29sb3VyID0gJyMyMzU3NkUnKSArDQogIGdlb21fc21vb3RoKGFlcyhmaWxsPSdyZWQnKSwNCiAgICAgICAgICAgICAgZm9ybXVsYSA9IHkgfiBsb2coeCksDQogICAgICAgICAgICAgIG1ldGhvZCA9ICdsbScsDQogICAgICAgICAgICAgIHNlID0gRkFMU0UsDQogICAgICAgICAgICAgIGNvbG9yID0gJ3JlZCcpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IGRmJENvdW50cnkpLA0KICAgICAgICAgICAgICAgICAgY29sb3IgPSAnZ3JheTIwJywNCiAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgbWluLnNlZ21lbnQubGVuZ3RoID0gMSwNCiAgICAgICAgICAgICAgICAgIHNlZ21lbnQuY29sb3VyID0gJ3JlZCcsDQogICAgICAgICAgICAgICAgICBmYW1pbHkgPSAnc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgYm94LnBhZGRpbmcgPSB1bml0KDEsICdsaW5lcycpLA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldChkZiwgZGYkQ291bnRyeSAlaW4lIExhYmVsLlBvaW50KSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKGRmJEdEUCksIGxpbmV0eXBlPSJkYXNoZWQiLCBzaXplPS4xKSArDQogICMgdGhlbWVfZWNvbm9taXN0KCkgKw0KICAjIHRoZW1lX2J3KCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRUZGMkY0IiwgY29sb3IgPSBOQSkpICsgDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRUZGMkY0IiwgY29sb3IgPSBOQSkpICsNCiAgdGhlbWUobGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRUZGMkY0IiwgY29sb3IgPSBOQSkpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnc2VyaWYnKSwNCiAgICAgICAgIyB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LGZhY2UgPSAnYm9sZCcpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkgLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkgLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICd0b3AnKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWU9JycsIHZhbHVlcz1jKCdyZWQnKSwNCiAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHM9YygnUl9zcXVhcmU9NTIlJykNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGFzdGUwKCdSX3NxdWFyZSA9Jyxyb3VuZChsbS5maXQuc3F1YXJlJHIuc3F1YXJlZCwyKSoxMDAsJyUnKSkgKw0KICAjIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWU9J0Ftb3VudCBkaXNidXJzZW1lbnQnKSArDQogIHNjYWxlX2NvbG91cl9ncmFkaWVudCgpICsNCiAgIyBndWlkZXMoc2l6ZSA9IEZBTFNFKSArDQogIGdlb21fY3VydmUoYWVzKHggPSAyMDAsIHkgPSAxOTAsIHhlbmQgPSAyMDAsIHllbmQgPSAyNTApLGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjAxLCAnbnBjJykpKSArDQogIGFubm90YXRlKCd0ZXh0JywgeCA9IDIwMCwgeSA9IDE3MCwgc2l6ZSA9IDMsIGZhbWlseSA9ICdzZXJpZicsIGxhYmVsID0gIkdEUCBiXHUwMEVDbmggcXVcdTAwRTJuIGtodSB2XHUxRUYxY1xuIFx1MDExMFx1MDBGNG5nIE5hbSBcdTAwQzEiKSsNCiAgbGFicyh4ID0gJyBcclxuXHJcblRcdTAwRDRcdTAzMDlORyBEXHUwMEMyTiBTXHUwMEQ0XHUwMzAxIChUUklcdTAwQ0FcdTAzMjNVIE5HXHUwMUFGXHUwMUEwXHUwMzAwSSknLA0KICAgICAgIHkgPSAnVFx1MDBENFx1MDMwOU5HIFNBXHUwMzA5TiBQSFx1MDBDMlx1MDMwOU0gUVVcdTAwRDRcdTAzMDFDIE5cdTAwRDRcdTAzMjNJIChUWVx1MDMwOSBVU0QpJywNCiAgICAgICBzaXplID0iR0RQIHRyXHUwMEVBbiBcdTAxMTFcdTAwRTJcdTAzMDB1IG5nXHUwMUIwXHUwMUExXHUwMzAwaSAoTmdoaVx1MDMwMG4gIFVTRCkiLA0KICAgICAgIHRpdGxlID0gJycsDQogICAgICAgY2FwdGlvbiA9ICJOZ3VcdTAwRjRcdTAzMDBuOiBodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmciKSAtPiBBMQ0KDQoNCiMgQTIgPC0gYWRkX3N1YihBMSwnVGFcdTAzMDFjIGdpYVx1MDMwOTogVnVcdTAzMDMgXHUwMTEwXHUwMTAzXHUwMzIzbmdcbk1haWw6IHR1YW52dS5kYW5nMjU3QGdtYWlsLmNvbScsDQojICAgICAgICAgICAgICAgeCA9IDAsDQojICAgICAgICAgICAgICAgaGp1c3QgPSAwLA0KIyAgICAgICAgICAgICAgIGZvbnRmYWNlID0gJ3BsYWluJywNCiMgICAgICAgICAgICAgICBmb250ZmFtaWx5ID0gJ3NlcmlmJywNCiMgICAgICAgICAgICAgICBzaXplPSAxMCkgDQogIA0KQTIgPC0gQTENCmdnZHJhdyhBMikNCg0KYGBgDQoNCg0KIyBHRFAgYsOsbmggcXXDom4gxJHhuqd1IG5nxrDhu51pIGPDoWMgbsaw4bubYyBraHUgduG7sWMgxJDDtG5nIE5hbSDDgS4NCg0KYGBgIHtyfQ0KDQojIDk5LjIgR0RQIC0gxJDDtG5nIE5hbSDDgSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGZfMjAxNiA8LSANCiAgZGYxICU+JSANCiAgZmlsdGVyKGBTZXJpZXMgTmFtZWAgJWluJSBjKCdQb3B1bGF0aW9uLCB0b3RhbCcsJ0dEUCAoY3VycmVudCBVUyQpJykpICU+JSANCiAgc2VsZWN0KGBDb3VudHJ5IE5hbWVgLGBTZXJpZXMgTmFtZWAsYDIwMTYgW1lSMjAxNl1gKSAlPiUgDQogIGZpbHRlcihgQ291bnRyeSBOYW1lYCAlaW4lIGMoJ0JydW5laSBEYXJ1c3NhbGFtJywnQ2FtYm9kaWEnLCdJbmRvbmVzaWEnLCdMYW8gUERSJywnTWFsYXlzaWEnLCdNeWFubWFyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGhpbGlwcGluZXMnLCdTaW5nYXBvcmUnLCdUaGFpbGFuZCcsJ1RpbW9yLUxlc3RlJywnVmlldG5hbScpKSANCg0KZGZfMjAxNiA8LSBkZl8yMDE2ICU+JSBkY2FzdChgQ291bnRyeSBOYW1lYCB+IGBTZXJpZXMgTmFtZWApDQpkZl8yMDE2JGBHRFAgKGN1cnJlbnQgVVMkKWAgPC0gYXMubnVtZXJpYyhkZl8yMDE2JGBHRFAgKGN1cnJlbnQgVVMkKWApDQpkZl8yMDE2JGBQb3B1bGF0aW9uLCB0b3RhbGAgPC0gYXMubnVtZXJpYyhkZl8yMDE2JGBQb3B1bGF0aW9uLCB0b3RhbGApDQoNCmRmXzIwMTYgPC0gZGZfMjAxNiAlPiUgbXV0YXRlKGAyMDE2IFtZUjIwMTZdYCA9IChgR0RQIChjdXJyZW50IFVTJClgL2BQb3B1bGF0aW9uLCB0b3RhbGApKQ0KDQpkZl8yMDE3IDwtIA0KICBkZjEgJT4lIA0KICBmaWx0ZXIoYFNlcmllcyBOYW1lYCAlaW4lIGMoJ1BvcHVsYXRpb24sIHRvdGFsJywnR0RQIChjdXJyZW50IFVTJCknKSkgJT4lIA0KICBzZWxlY3QoYENvdW50cnkgTmFtZWAsYFNlcmllcyBOYW1lYCxgMjAxNyBbWVIyMDE3XWApICU+JSANCiAgZmlsdGVyKGBDb3VudHJ5IE5hbWVgICVpbiUgYygnQnJ1bmVpIERhcnVzc2FsYW0nLCdDYW1ib2RpYScsJ0luZG9uZXNpYScsJ0xhbyBQRFInLCdNYWxheXNpYScsJ015YW5tYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaGlsaXBwaW5lcycsJ1NpbmdhcG9yZScsJ1RoYWlsYW5kJywnVGltb3ItTGVzdGUnLCdWaWV0bmFtJykpIA0KDQpkZl8yMDE3IDwtIGRmXzIwMTcgJT4lIGRjYXN0KGBDb3VudHJ5IE5hbWVgIH4gYFNlcmllcyBOYW1lYCkNCmRmXzIwMTckYEdEUCAoY3VycmVudCBVUyQpYCA8LSBhcy5udW1lcmljKGRmXzIwMTckYEdEUCAoY3VycmVudCBVUyQpYCkNCmRmXzIwMTckYFBvcHVsYXRpb24sIHRvdGFsYCA8LSBhcy5udW1lcmljKGRmXzIwMTckYFBvcHVsYXRpb24sIHRvdGFsYCkNCg0KZGZfMjAxNyA8LSBkZl8yMDE3ICU+JSBtdXRhdGUoYDIwMTcgW1lSMjAxN11gID0gKGBHRFAgKGN1cnJlbnQgVVMkKWAvYFBvcHVsYXRpb24sIHRvdGFsYCkpDQoNCmRmIDwtIGRmXzIwMTcgJT4lIGxlZnRfam9pbihkZl8yMDE2LCBieSA9ICdDb3VudHJ5IE5hbWUnKSAlPiUgc2VsZWN0KGBDb3VudHJ5IE5hbWVgLGAyMDE3IFtZUjIwMTddYCxgMjAxNiBbWVIyMDE2XWApDQoNCmRmJGAyMDE3IFtZUjIwMTddYCA8LSBhcy5udW1lcmljKGRmJGAyMDE3IFtZUjIwMTddYCkNCmRmJGAyMDE2IFtZUjIwMTZdYCA8LSBhcy5udW1lcmljKGRmJGAyMDE2IFtZUjIwMTZdYCkNCiMgZGYgJT4lIGFycmFuZ2UoYDIwMTcgW1lSMjAxN11gKQ0KIyBkZiAlPiUgVmlldygpDQoNCmxlZnRfbGFiZWwgPC0gcGFzdGUoZGYkYENvdW50cnkgTmFtZWAsIHJvdW5kKGRmJGAyMDE2IFtZUjIwMTZdYCwwKSxzZXA9IiwgIikNCnJpZ2h0X2xhYmVsIDwtIHBhc3RlKGRmJGBDb3VudHJ5IE5hbWVgLCByb3VuZChkZiRgMjAxNyBbWVIyMDE3XWAsMCksc2VwPSIsICIpDQpkZiRjbGFzcyA8LSBpZmVsc2UoKGRmJGAyMDE3IFtZUjIwMTddYCA+IG1lZGlhbihkZiRgMjAxNyBbWVIyMDE3XWApKSwgImdyZWVuIiwgInJlZCIpDQoNCmxlZnRfbGFiZWwgPC0gYygiQnJ1bmVpIERhcnVzc2FsYW0sIDI2OTM5IiwiIiwiSW5kb25lc2lhLCAzNTY5IiwiIiAsICAgICAgICAgIA0KICAgICAgICAgICAgICAgICJNYWxheXNpYSwgOTUxNSIsIiIsIiIsIlNpbmdhcG9yZSwgNTUyNDMiLCAgICAgICAgDQogICAgICAgICAgICAgICAgIlRoYWlsYW5kLCA1OTc5IiwiIiwiVmlldG5hbSwgMjE3MSIgICkNCg0KcmlnaHRfbGFiZWwgPC0gYyggIkJydW5laSBEYXJ1c3NhbGFtLCAyODI5MSIsIj0iLCJJbmRvbmVzaWEsIDM4NDYiLCIiLCAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAiTWFsYXlzaWEsIDk5NTIiLCIiLCIiLCJTaW5nYXBvcmUsIDU3NzE0IiwgICAgICAgIA0KICAgICAgICAgICAgICAgICAgIlRoYWlsYW5kLCA2NTk1IiwiIiwiVmlldG5hbSwgMjM0MiIgKQ0KDQojIFBsb3QNCnAgPC0gZ2dwbG90KGRmKSArIA0KICBnZW9tX3NlZ21lbnQoYWVzKHg9MjAxNiwgeGVuZD0yMDE3LCB5PWAyMDE2IFtZUjIwMTZdYCwgeWVuZD1gMjAxNyBbWVIyMDE3XWAsIGNvbD1jbGFzcyksIHNpemU9Ljc1LCBzaG93LmxlZ2VuZD1GKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjAxNiwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9LjEpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD0yMDE3LCBsaW5ldHlwZT0iZGFzaGVkIiwgc2l6ZT0uMSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiVXAiLCAiRG93biIpLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImdyZWVuIj0iIzAwYmEzOCIsICJyZWQiPSIjZjg3NjZkIikpICsgICMgY29sb3Igb2YgbGluZXMNCiAgbGFicyh4PSIiLCANCiAgICAgICAjIHk9IkRcdTAxQjAgblx1MDFBMVx1MDMyMyBjdVx1MDBGNFx1MDMwMWkga2lcdTAzMDAiLA0KICAgICAgIHkgPSAiIiwNCiAgICAgICB0aXRsZSA9ICdUXHUwMEQ0XHUwMzA5TkcgU0FcdTAzMDlOIFBIXHUwMEMyXHUwMzA5TSBRVVx1MDBENFx1MDMwMUMgTlx1MDBENFx1MDMyM0kgVFJcdTAwQ0FOIFx1MDExMFx1MDBDMlx1MDMwMFUgTkdcdTAxQUZcdTAxQTBcdTAzMDBJXG4gS0hVIFZcdTAxQUZcdTAzMjNDIFx1MDExMFx1MDBENE5HIE5BTSBBXHUwMzAxIChOR0hJXHUwMzAwTiBVU0QpJykgKyAgICMgQXhpcyBsYWJlbHMNCiAgeGxpbSgyMDE1LjUsMjAxNy41KSArIHlsaW0oMCwoMS4xKihtYXgoZGYkYDIwMTYgW1lSMjAxNl1gLCBkZiRgMjAxNyBbWVIyMDE3XWApKSkpICAjIFggYW5kIFkgYXhpcyBsaW1pdHMNCg0KIyBBZGQgdGV4dHMNCnAgPC0gcCArIGdlb21fdGV4dChsYWJlbD1sZWZ0X2xhYmVsLCB5PWRmJGAyMDE2IFtZUjIwMTZdYCwgeD1yZXAoMjAxNiwgTlJPVyhkZikpLCBoanVzdD0xLjEsIHNpemU9My41LCBmYW1pbHkgPSAnc2VyaWYnKQ0KcCA8LSBwICsgZ2VvbV90ZXh0KGxhYmVsPXJpZ2h0X2xhYmVsLCB5PWRmJGAyMDE3IFtZUjIwMTddYCwgeD1yZXAoMjAxNywgTlJPVyhkZikpLCBoanVzdD0tMC4xLCBzaXplPTMuNSwgZmFtaWx5ID0gJ3NlcmlmJykNCnAgPC0gcCArIGdlb21fdGV4dChsYWJlbD0iMjAxNiIsIHg9MjAxNiwgeT0xLjEqKG1heChkZiRgMjAxNiBbWVIyMDE2XWAsIGRmJGAyMDE3IFtZUjIwMTddYCkpLCBoanVzdD0xLjIsIHNpemU9NSwgZmFtaWx5ID0gJ3NlcmlmJykgICMgdGl0bGUNCnAgPC0gcCArIGdlb21fdGV4dChsYWJlbD0iMjAxNyIsIHg9MjAxNywgeT0xLjEqKG1heChkZiRgMjAxNiBbWVIyMDE2XWAsIGRmJGAyMDE3IFtZUjIwMTddYCkpLCBoanVzdD0tMC4xLCBzaXplPTUsIGZhbWlseSA9ICdzZXJpZicpICAjIHRpdGxlDQoNCiMgTWluaWZ5IHRoZW1lDQpwMSA8LSANCiAgcCArIA0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwyLDEsMiksICJjbSIpLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsc2l6ZSA9IDE2KSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnc2VyaWYnKSkgKw0KICB0aGVtZSh0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsZmFjZSA9ICdib2xkJykpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0VGRjJGNCIsIGNvbG9yID0gTkEpKSArIA0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0VGRjJGNCIsIGNvbG9yID0gTkEpKSArDQogIHRoZW1lKGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0VGRjJGNCIsIGNvbG9yID0gTkEpKQ0KDQpwMQ0KDQoNCiMgbGlicmFyeSgiZ3JpZEV4dHJhIikNCiMgZ3JpZC5hcnJhbmdlKGdnZHJhdyhBMikscDEsDQojICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEpDQoNCmBgYA0KDQo=