China is Redrawing the Map of World Science

China is Redrawing the Map of World Science by some metrics:

R Codes for collecting data and Visualization:

library(rvest)
library(tidyverse)


#=======================================================
#     Research and development spending by country
#=======================================================


spending_link <- "https://en.wikipedia.org/wiki/List_of_countries_by_research_and_development_spending"

spending_link %>% 
  read_html() %>% 
  html_table(fill = TRUE) %>% 
  .[[3]] %>% 
  select(-Year, -Source) -> df_spending

names(df_spending) <- c("country", "expOn_RD", "percent_GDP", "per_capital_RD")

df_spending <- df_spending %>% 
  mutate(expOn_RD = as.numeric(expOn_RD), 
         per_capital_RD = as.numeric(per_capital_RD %>% str_replace_all("\\,", "")), 
         percent_GDP = str_replace_all(percent_GDP, "%", "") %>% as.numeric())

#===============================
#     Total Research Paper
#===============================

total_paper_link <- "https://www.scimagojr.com/countryrank.php?fbclid=IwAR2BP_UlTzsowsNXuVL44keV9pJPJ2T3-Xn156CWYrz51BTm4XR3w9CqQa4"


total_paper_link %>% 
  read_html() %>% 
  html_table(fill = TRUE) %>% 
  .[[1]] -> df_total_research_paper

df_total_research_paper <- df_total_research_paper[, -c(1:2)]
names(df_total_research_paper) <- names(df_total_research_paper) %>% str_replace_all("-| ", "")

#===============================
#   Technical Journal Papers
#===============================

stem_paper_link <- "https://www.worldatlas.com/articles/20-countries-publishing-the-most-scholarly-articles.html"

stem_paper_link %>% 
  read_html() %>% 
  html_table(fill = TRUE) %>% 
  .[[1]] -> df_stem

names(df_stem) <- c("rank", "country", "paper_num_stem")
df_stem <- df_stem %>% mutate(paper_num_stem = str_replace_all(paper_num_stem, "[^0-9]", "") %>% as.numeric())

#=====================
#  Create our theme
#=====================

library(hrbrthemes)

# Colors selected: 
my_colors <- c("#8C3F4D", "#3E606F")

df_total_research_paper %>% 
  slice(1:20) %>% 
  arrange(Documents) %>% 
  mutate(Country = factor(Country, levels = Country)) %>% 
  mutate(Documents = round(Documents / 1000), 0) %>% 
  ggplot(aes(Country, Documents)) + 
  geom_col(fill = my_colors[1], color = my_colors[1]) + 
  coord_flip() + 
  geom_text(aes(label = Documents), color = "white", hjust = 1.1, size = 5) + 
  theme_modern_rc(plot_title_size = 22, caption_size = 10, 
                  axis_text_size = 14, axis_title_size = 12,  plot_margin = margin(35, 35, 35, 35)) +
  theme(panel.grid.major.y = element_blank()) + 
  theme(panel.grid.minor.x = element_blank()) + 
  scale_y_continuous(labels = scales::comma, expand = c(0.01, 0)) + 
  labs(title = "The Top 20 Countries by Number of Research Papers Published", 
       x = NULL, y = "Number of Research Papers", 
       caption = "Data Source: https://www.scimagojr.com", 
       subtitle = "China is ranked country second behind the United States with 5901 (in thousands)  papers published in all fields.\nThis number does not include Hong Kong and Macau territories.")



df_stem %>% 
  arrange(paper_num_stem) %>% 
  mutate(country = factor(country, levels = country)) %>% 
  mutate(paper_num_stem = round(paper_num_stem / 1000), 0) %>% 
  ggplot(aes(country, paper_num_stem)) + 
  geom_col(fill = my_colors[1], color = my_colors[1]) + 
  coord_flip() + 
  geom_text(aes(label = paper_num_stem), color = "white", hjust = 1.1, size = 5) + 
  theme_modern_rc(plot_title_size = 22, caption_size = 10, 
                  axis_text_size = 14, axis_title_size = 12,  plot_margin = margin(35, 35, 35, 35)) +
  theme(panel.grid.major.y = element_blank()) + 
  theme(panel.grid.minor.x = element_blank()) + 
  scale_y_continuous(labels = scales::comma, expand = c(0.01, 0)) + 
  labs(title = "The Top 20 Countries by Number of Scientific and Technical Papers Published", 
       x = NULL, y = "Number of Research Papers", 
       caption = "Data Source: https://www.worldatlas.com", 
       subtitle = "China is ranked country second behind the United States with 401 (in thousands) scientific/technical papers published.\nThis number does not include Hong Kong and Macau territories.")



df_spending %>% 
  filter(country != "European Union") %>% 
  slice(1:20) %>% 
  arrange(expOn_RD) %>% 
  mutate(country = factor(country, levels = country)) -> df_spending


df_spending %>% 
  ggplot(aes(country, expOn_RD)) + 
  geom_col(fill = my_colors[1], color = my_colors[1]) + 
  coord_flip() + 
  geom_text(data = df_spending %>% slice(16:20), aes(label = expOn_RD), color = "white", hjust = 1.1, size = 5) +  
  geom_text(data = df_spending %>% slice(1:15), aes(label = expOn_RD), color = "white", hjust = -0.1, size = 5) + 
  theme_modern_rc(plot_title_size = 22, caption_size = 10, 
                  axis_text_size = 14, axis_title_size = 12,  plot_margin = margin(35, 35, 35, 35)) +
  theme(panel.grid.major.y = element_blank()) + 
  theme(panel.grid.minor.x = element_blank()) + 
  scale_y_continuous(labels = scales::comma, expand = c(0.01, 0)) + 
  labs(title = "The Top 20 Countries by Research and Development Spending", 
       x = NULL, y = "Expenditures on R&D", 
       caption = "Data Source: http://uis.unesco.org/apps/visualisations/research-and-development-spending/", 
       subtitle = "Global spending on R&D has reached a record high of almost US$ 1.7 trillion. About 10 countries account for 80% of spending.\nChina is ranked country second behind the United States with R&D spending of 451.9 Billions Dollars.\nThis number does not include Hong Kong and Macau territories.")
LS0tDQp0aXRsZTogIkNoaW5hIGlzIFJlZHJhd2luZyB0aGUgTWFwIG9mIFdvcmxkIFNjaWVuY2UiIA0Kc3VidGl0bGU6ICJSIGZvciBQbGVhc3VyZSINCmF1dGhvcjogIk5ndXllbiBDaGkgRHVuZyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogemVuYnVybg0KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogImZsYXRseSINCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCi0tLQ0KDQpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLnJldGluYT0yKQ0KYGBgDQoNCiMgQ2hpbmEgaXMgUmVkcmF3aW5nIHRoZSBNYXAgb2YgV29ybGQgU2NpZW5jZQ0KDQpDaGluYSBpcyBSZWRyYXdpbmcgdGhlIE1hcCBvZiBXb3JsZCBTY2llbmNlIGJ5IHNvbWUgbWV0cmljczogDQoNCg0KIVtdKEM6XFxVc2Vyc1xcWmJvb2tcRGVza3RvcFxccGljXFxwMS5qcGcpIA0KDQoNCiFbXShDOlxcVXNlcnNcXFpib29rXERlc2t0b3BcXHBpY1xccDIuanBnKQ0KDQoNCiFbXShDOlxcVXNlcnNcXFpib29rXERlc2t0b3BcXHBpY1xccDMuanBnKQ0KDQoNClIgQ29kZXMgZm9yIGNvbGxlY3RpbmcgZGF0YSBhbmQgVmlzdWFsaXphdGlvbjogDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCg0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojICAgICBSZXNlYXJjaCBhbmQgZGV2ZWxvcG1lbnQgc3BlbmRpbmcgYnkgY291bnRyeQ0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQpzcGVuZGluZ19saW5rIDwtICJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX2NvdW50cmllc19ieV9yZXNlYXJjaF9hbmRfZGV2ZWxvcG1lbnRfc3BlbmRpbmciDQoNCnNwZW5kaW5nX2xpbmsgJT4lIA0KICByZWFkX2h0bWwoKSAlPiUgDQogIGh0bWxfdGFibGUoZmlsbCA9IFRSVUUpICU+JSANCiAgLltbM11dICU+JSANCiAgc2VsZWN0KC1ZZWFyLCAtU291cmNlKSAtPiBkZl9zcGVuZGluZw0KDQpuYW1lcyhkZl9zcGVuZGluZykgPC0gYygiY291bnRyeSIsICJleHBPbl9SRCIsICJwZXJjZW50X0dEUCIsICJwZXJfY2FwaXRhbF9SRCIpDQoNCmRmX3NwZW5kaW5nIDwtIGRmX3NwZW5kaW5nICU+JSANCiAgbXV0YXRlKGV4cE9uX1JEID0gYXMubnVtZXJpYyhleHBPbl9SRCksIA0KICAgICAgICAgcGVyX2NhcGl0YWxfUkQgPSBhcy5udW1lcmljKHBlcl9jYXBpdGFsX1JEICU+JSBzdHJfcmVwbGFjZV9hbGwoIlxcLCIsICIiKSksIA0KICAgICAgICAgcGVyY2VudF9HRFAgPSBzdHJfcmVwbGFjZV9hbGwocGVyY2VudF9HRFAsICIlIiwgIiIpICU+JSBhcy5udW1lcmljKCkpDQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojICAgICBUb3RhbCBSZXNlYXJjaCBQYXBlcg0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KdG90YWxfcGFwZXJfbGluayA8LSAiaHR0cHM6Ly93d3cuc2NpbWFnb2pyLmNvbS9jb3VudHJ5cmFuay5waHA/ZmJjbGlkPUl3QVIyQlBfVWxUenNvd3NOWHVWTDQ0a2VWOXBKUEoyVDMtWG4xNTZDV1lyejUxQlRtNFhSM3c5Q3FRYTQiDQoNCg0KdG90YWxfcGFwZXJfbGluayAlPiUgDQogIHJlYWRfaHRtbCgpICU+JSANCiAgaHRtbF90YWJsZShmaWxsID0gVFJVRSkgJT4lIA0KICAuW1sxXV0gLT4gZGZfdG90YWxfcmVzZWFyY2hfcGFwZXINCg0KZGZfdG90YWxfcmVzZWFyY2hfcGFwZXIgPC0gZGZfdG90YWxfcmVzZWFyY2hfcGFwZXJbLCAtYygxOjIpXQ0KbmFtZXMoZGZfdG90YWxfcmVzZWFyY2hfcGFwZXIpIDwtIG5hbWVzKGRmX3RvdGFsX3Jlc2VhcmNoX3BhcGVyKSAlPiUgc3RyX3JlcGxhY2VfYWxsKCItfCAiLCAiIikNCg0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgICBUZWNobmljYWwgSm91cm5hbCBQYXBlcnMNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCnN0ZW1fcGFwZXJfbGluayA8LSAiaHR0cHM6Ly93d3cud29ybGRhdGxhcy5jb20vYXJ0aWNsZXMvMjAtY291bnRyaWVzLXB1Ymxpc2hpbmctdGhlLW1vc3Qtc2Nob2xhcmx5LWFydGljbGVzLmh0bWwiDQoNCnN0ZW1fcGFwZXJfbGluayAlPiUgDQogIHJlYWRfaHRtbCgpICU+JSANCiAgaHRtbF90YWJsZShmaWxsID0gVFJVRSkgJT4lIA0KICAuW1sxXV0gLT4gZGZfc3RlbQ0KDQpuYW1lcyhkZl9zdGVtKSA8LSBjKCJyYW5rIiwgImNvdW50cnkiLCAicGFwZXJfbnVtX3N0ZW0iKQ0KZGZfc3RlbSA8LSBkZl9zdGVtICU+JSBtdXRhdGUocGFwZXJfbnVtX3N0ZW0gPSBzdHJfcmVwbGFjZV9hbGwocGFwZXJfbnVtX3N0ZW0sICJbXjAtOV0iLCAiIikgJT4lIGFzLm51bWVyaWMoKSkNCg0KIz09PT09PT09PT09PT09PT09PT09PQ0KIyAgQ3JlYXRlIG91ciB0aGVtZQ0KIz09PT09PT09PT09PT09PT09PT09PQ0KDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQoNCiMgQ29sb3JzIHNlbGVjdGVkOiANCm15X2NvbG9ycyA8LSBjKCIjOEMzRjREIiwgIiMzRTYwNkYiKQ0KDQpkZl90b3RhbF9yZXNlYXJjaF9wYXBlciAlPiUgDQogIHNsaWNlKDE6MjApICU+JSANCiAgYXJyYW5nZShEb2N1bWVudHMpICU+JSANCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSwgbGV2ZWxzID0gQ291bnRyeSkpICU+JSANCiAgbXV0YXRlKERvY3VtZW50cyA9IHJvdW5kKERvY3VtZW50cyAvIDEwMDApLCAwKSAlPiUgDQogIGdncGxvdChhZXMoQ291bnRyeSwgRG9jdW1lbnRzKSkgKyANCiAgZ2VvbV9jb2woZmlsbCA9IG15X2NvbG9yc1sxXSwgY29sb3IgPSBteV9jb2xvcnNbMV0pICsgDQogIGNvb3JkX2ZsaXAoKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gRG9jdW1lbnRzKSwgY29sb3IgPSAid2hpdGUiLCBoanVzdCA9IDEuMSwgc2l6ZSA9IDUpICsgDQogIHRoZW1lX21vZGVybl9yYyhwbG90X3RpdGxlX3NpemUgPSAyMiwgY2FwdGlvbl9zaXplID0gMTAsIA0KICAgICAgICAgICAgICAgICAgYXhpc190ZXh0X3NpemUgPSAxNCwgYXhpc190aXRsZV9zaXplID0gMTIsICBwbG90X21hcmdpbiA9IG1hcmdpbigzNSwgMzUsIDM1LCAzNSkpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hLCBleHBhbmQgPSBjKDAuMDEsIDApKSArIA0KICBsYWJzKHRpdGxlID0gIlRoZSBUb3AgMjAgQ291bnRyaWVzIGJ5IE51bWJlciBvZiBSZXNlYXJjaCBQYXBlcnMgUHVibGlzaGVkIiwgDQogICAgICAgeCA9IE5VTEwsIHkgPSAiTnVtYmVyIG9mIFJlc2VhcmNoIFBhcGVycyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IGh0dHBzOi8vd3d3LnNjaW1hZ29qci5jb20iLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDaGluYSBpcyByYW5rZWQgY291bnRyeSBzZWNvbmQgYmVoaW5kIHRoZSBVbml0ZWQgU3RhdGVzIHdpdGggNTkwMSAoaW4gdGhvdXNhbmRzKSAgcGFwZXJzIHB1Ymxpc2hlZCBpbiBhbGwgZmllbGRzLlxuVGhpcyBudW1iZXIgZG9lcyBub3QgaW5jbHVkZSBIb25nIEtvbmcgYW5kIE1hY2F1IHRlcnJpdG9yaWVzLiIpDQoNCg0KDQpkZl9zdGVtICU+JSANCiAgYXJyYW5nZShwYXBlcl9udW1fc3RlbSkgJT4lIA0KICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBjb3VudHJ5KSkgJT4lIA0KICBtdXRhdGUocGFwZXJfbnVtX3N0ZW0gPSByb3VuZChwYXBlcl9udW1fc3RlbSAvIDEwMDApLCAwKSAlPiUgDQogIGdncGxvdChhZXMoY291bnRyeSwgcGFwZXJfbnVtX3N0ZW0pKSArIA0KICBnZW9tX2NvbChmaWxsID0gbXlfY29sb3JzWzFdLCBjb2xvciA9IG15X2NvbG9yc1sxXSkgKyANCiAgY29vcmRfZmxpcCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXBlcl9udW1fc3RlbSksIGNvbG9yID0gIndoaXRlIiwgaGp1c3QgPSAxLjEsIHNpemUgPSA1KSArIA0KICB0aGVtZV9tb2Rlcm5fcmMocGxvdF90aXRsZV9zaXplID0gMjIsIGNhcHRpb25fc2l6ZSA9IDEwLCANCiAgICAgICAgICAgICAgICAgIGF4aXNfdGV4dF9zaXplID0gMTQsIGF4aXNfdGl0bGVfc2l6ZSA9IDEyLCAgcGxvdF9tYXJnaW4gPSBtYXJnaW4oMzUsIDM1LCAzNSwgMzUpKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSwgZXhwYW5kID0gYygwLjAxLCAwKSkgKyANCiAgbGFicyh0aXRsZSA9ICJUaGUgVG9wIDIwIENvdW50cmllcyBieSBOdW1iZXIgb2YgU2NpZW50aWZpYyBhbmQgVGVjaG5pY2FsIFBhcGVycyBQdWJsaXNoZWQiLCANCiAgICAgICB4ID0gTlVMTCwgeSA9ICJOdW1iZXIgb2YgUmVzZWFyY2ggUGFwZXJzIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogaHR0cHM6Ly93d3cud29ybGRhdGxhcy5jb20iLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDaGluYSBpcyByYW5rZWQgY291bnRyeSBzZWNvbmQgYmVoaW5kIHRoZSBVbml0ZWQgU3RhdGVzIHdpdGggNDAxIChpbiB0aG91c2FuZHMpIHNjaWVudGlmaWMvdGVjaG5pY2FsIHBhcGVycyBwdWJsaXNoZWQuXG5UaGlzIG51bWJlciBkb2VzIG5vdCBpbmNsdWRlIEhvbmcgS29uZyBhbmQgTWFjYXUgdGVycml0b3JpZXMuIikNCg0KDQoNCmRmX3NwZW5kaW5nICU+JSANCiAgZmlsdGVyKGNvdW50cnkgIT0gIkV1cm9wZWFuIFVuaW9uIikgJT4lIA0KICBzbGljZSgxOjIwKSAlPiUgDQogIGFycmFuZ2UoZXhwT25fUkQpICU+JSANCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gY291bnRyeSkpIC0+IGRmX3NwZW5kaW5nDQoNCg0KZGZfc3BlbmRpbmcgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIGV4cE9uX1JEKSkgKyANCiAgZ2VvbV9jb2woZmlsbCA9IG15X2NvbG9yc1sxXSwgY29sb3IgPSBteV9jb2xvcnNbMV0pICsgDQogIGNvb3JkX2ZsaXAoKSArIA0KICBnZW9tX3RleHQoZGF0YSA9IGRmX3NwZW5kaW5nICU+JSBzbGljZSgxNjoyMCksIGFlcyhsYWJlbCA9IGV4cE9uX1JEKSwgY29sb3IgPSAid2hpdGUiLCBoanVzdCA9IDEuMSwgc2l6ZSA9IDUpICsgIA0KICBnZW9tX3RleHQoZGF0YSA9IGRmX3NwZW5kaW5nICU+JSBzbGljZSgxOjE1KSwgYWVzKGxhYmVsID0gZXhwT25fUkQpLCBjb2xvciA9ICJ3aGl0ZSIsIGhqdXN0ID0gLTAuMSwgc2l6ZSA9IDUpICsgDQogIHRoZW1lX21vZGVybl9yYyhwbG90X3RpdGxlX3NpemUgPSAyMiwgY2FwdGlvbl9zaXplID0gMTAsIA0KICAgICAgICAgICAgICAgICAgYXhpc190ZXh0X3NpemUgPSAxNCwgYXhpc190aXRsZV9zaXplID0gMTIsICBwbG90X21hcmdpbiA9IG1hcmdpbigzNSwgMzUsIDM1LCAzNSkpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hLCBleHBhbmQgPSBjKDAuMDEsIDApKSArIA0KICBsYWJzKHRpdGxlID0gIlRoZSBUb3AgMjAgQ291bnRyaWVzIGJ5IFJlc2VhcmNoIGFuZCBEZXZlbG9wbWVudCBTcGVuZGluZyIsIA0KICAgICAgIHggPSBOVUxMLCB5ID0gIkV4cGVuZGl0dXJlcyBvbiBSJkQiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBodHRwOi8vdWlzLnVuZXNjby5vcmcvYXBwcy92aXN1YWxpc2F0aW9ucy9yZXNlYXJjaC1hbmQtZGV2ZWxvcG1lbnQtc3BlbmRpbmcvIiwgDQogICAgICAgc3VidGl0bGUgPSAiR2xvYmFsIHNwZW5kaW5nIG9uIFImRCBoYXMgcmVhY2hlZCBhIHJlY29yZCBoaWdoIG9mIGFsbW9zdCBVUyQgMS43IHRyaWxsaW9uLiBBYm91dCAxMCBjb3VudHJpZXMgYWNjb3VudCBmb3IgODAlIG9mIHNwZW5kaW5nLlxuQ2hpbmEgaXMgcmFua2VkIGNvdW50cnkgc2Vjb25kIGJlaGluZCB0aGUgVW5pdGVkIFN0YXRlcyB3aXRoIFImRCBzcGVuZGluZyBvZiA0NTEuOSBCaWxsaW9ucyBEb2xsYXJzLlxuVGhpcyBudW1iZXIgZG9lcyBub3QgaW5jbHVkZSBIb25nIEtvbmcgYW5kIE1hY2F1IHRlcnJpdG9yaWVzLiIpDQoNCg0KYGBgDQoNCg==