Name : 나현성

ID : 202001240

================================================================================

Q1. (10 points)

1). Change the name “John” to “Clair”.


x <- list(name = "John", age = 19, speaks = c("English", "French"))
x

You can NOT do like this :

x <- list(name = "Clair", age = 19, speaks = c("English", "French"))
x

your answer:

x <- list(name = "John", age = 19, speaks = c("English", "French"))
x$name <- "Clair"
x
  1. Change the speaks “English” to “Korean”.

your answer :

x$speaks[x$speaks == "English"] <- "Korean"
x

Q2. Subsetting (10 points)

  1. subset linked in data for those linkedin is greater than 10 and facebook is less than 10.

linkedin <- c(16, 9, 13, 5, 2, 17, 14)
facebook <- c(17, 7, 5, 16, 8, 13, 14)

The output is: [1] 13

your answer:

linkedin[linkedin > 10 & facebook < 10]
  1. use which () to subset linkedin for facebook is less than 10.

[1] 9 13 2


linkedin <- c(16, 9, 13, 5, 2, 17, 14)
facebook <- c(17, 7, 5, 16, 8, 13, 14)

your answer:

linkedin[which(facebook < 10)]

Q3. data drame questions (15 points)

  1. Create a data frame as in the output using data.frame().

Output ‘data.frame’: 2 obs. of 3 variables: $ SN :int 1 2 $ Age :num 21 15 $ Name:chr “John” “Dora”

your answer:

df <- data.frame(SN = c(1, 2),
                 Age = c(21, 15),
                 Name = c("John", "Dora"))
str(df)
  1. change the name to the following by TWO different ways.

‘data.frame’: 2 obs. of 3 variables: $ SN : num 1 2 $ Age : num 21 15 $ Name: chr “Charlie” “Devy”

your answer:

df$Name <- c("Charlie", "Devy")
str(df)

your answer:

df[["Name"]] <- c("Charlie", "Devy")
 str(df)
  1. create a new row and bind it to the data frame by TWO different ways.

str(Output) ‘data.frame’: 4 obs. of 3 variables: $ SN : num 1 2 1 1 $ Age : num 21 15 16 16 $ Name: chr “John” “Dora” “Paul” “Paul”

your answer:

library(dplyr)
new_row <- data.frame(SN = 1, Age = 16, Name = "Paul")
df1 <- bind_rows(df, new_row, new_row)
str(df1)

your answer:

new_row <- data.frame(SN = 1, Age = 16, Name = "Paul")
df2 <- rbind(df, new_row, new_row)
str(df2)

Q4. Function questions. Fill the blank to get the output as : (10 points)

Output

Enter a number: 8 [1] “The factorial of 8 is 40320”

————————————————————————

Example: Find the factorial of a number  

# take input from the user  

num = as.integer(readline(prompt="Enter a number: "))  

factorial = 1  

# check is the number is negative, positive or zero  

if(num < 0) {  
  
     print("Sorry, factorial does not exist for negative numbers")  
  
    } else _____ (num ____ 0) {  
      
         print("The factorial of 0 is 1")  

      } else {  
      
           for(i in _______) {  
      
              factorial = factorial * i  
    
           }  
 
         print(paste("The factorial of", _______ ,"is", ___________))  
      }  

Output  

————————————————————————

your answer:

 num = as.integer(readline(prompt="Enter a number: "))
factorial = 1

if(num < 0) {
  print("Sorry, factorial does not exist for negative numbers")
} else if(num == 0) {
  print("The factorial of 0 is 1")
} else {
  for(i in 1:num) {
    factorial = factorial * i
  }
  print(paste("The factorial of", num, "is", factorial))
}
Output  

Q5. when one is to use pivot_wider format and when one is to use pivot_longer form? (5 points)

your answer: pivot longer : 열 이름이 문자라고 가정하기 때문에 연도 열을 숫자로 변환해야 한다. pivot wider : pivot_longer의 역함수이다. 첫 번째 인수는 데이터에 대한 것이지만 보여주지 않는다. 그리고 names_from 인수는 어떤 변수를 열 이름으로 사용할지 pivot_wider에 알려준준다. 즉 데이터를 분산할 때는 pivot wider, 데이터를 모을 때는 pivot longer를 쓴다.

Q6. Do the following (10 points)

library(tidyverse)
library(dslabs)

data("murders")

murders %>% 
  mutate(rate = total/population*100000) %>%
  group_by(region) %>%
  summarize(avg = mean(rate)) %>%
  mutate(region = factor(region)) %>%

ggplot(aes(region, avg)) +
  geom_bar(stat="identity") +
  ylab("Murder Rate Average")
  1. How to reorder from the largest to the smallest? Show the resultant plot.

your answer

library(tidyverse)
library(dslabs)

data("murders")

murders %>%
  mutate(rate = total/population * 100000) %>%
  group_by(region) %>%
  summarize(avg = mean(rate)) %>%
  mutate(region = factor(region, avg, .desc = TRUE)) %>%
  
ggplot(aes(region, avg)) +
  geom_bar(stat = "identity") +
  ylab("Murder Rate Average")
  1. How to add error bars on the plot?

your answer

library(tidyverse)
library(dslabs)

data("murders")

murders %>% 
 mutate(rate = total/population * 100000) %>% 
  group_by(region) %>% 
  summarize(avg = mean(rate), sd = sd(rate)) %>% 
  mutate(region = factor(region)) %>%
  
ggplot(aes(region, avg)) + 
  geom_bar(stat = "identity") + 
  geom_errorbar(aes(ymin = avg - sd, ymax = avg + sd)) + 
  ylab("Murder Rate Average")

Q7. Regex questions. 27 points (each 3 points)

  1. What should be in x?

⦁ str_subset(x, “.\\(\\^\\\).”)

your answer

 [1] "a$^$z"

⦁ str_subset(x, “[a-z]\\(\\^\\\)[a-z]”)

your answer

[1] "a$^$z"

⦁ str_subset(x, “\[|\]”)

your answer

[1] "[|]"
  1. Use str_() to have the same results for grepl()

filter_taxa(grepl(pattern = "^[a-zA-Z]+$", taxon_names)) %>% # remove "odd" taxa
  

your answer

  1. What does this mean?

⦁ What does this mean?

"([2-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})"

: 첫 번째 자리 숫자는 2~9 뒤에 숫자 0~9가 2번 반복되며 총 3자리라는 것을 알 수 있다. 구분은 - . 또는 공백이다. 그리고 두 번째 그룹에서는 숫자가 3자리라는 것을 알 수 있고 세 번째 그룹은 숫자가 4자리라는 것을 알 수 있다.

⦁ What does this mean != “” below?


filter_taxa(taxon_names != "") 

⦁ the meaning ?


paste0("*\\.",ext,"\\.", fext,"$")

⦁ What does this mean?

(\d{1,2}\/\d{1,2}\/\d{4})
  1. What is the utility of regex? (i.e., why do we need to learn regex?)

your answer: regex는 텍스트 문자의 특정 패턴을 설명하는 방법이다. 이러한 표현식은 주어진 문자열이 패턴과 일치하는지 여부를 결정하는 데 사용할 수 있다.

Q8. Tidyverse question (10 points)

The American Community Survey (ACS) on languages spoken at home across the U.S. dcldata::languages_states contains data from the 2013 ACS on the number of at-home speakers of non-English speakers by state.


install.packages("remotes")
remotes::install_github("dcl-docs/dcldata")

library(dcldata)
dcldata::languages_states
  1. Extract speakers of Korean by state and list the top 10 states of Korean speakers.

your answer :

library(dcldata)
library(dplyr)

dcldata::languages_states %>%
  filter(language == "Korean") %>%
  arrange(desc(speakers)) %>%
   slice(1:10)
  1. Can you write without saving as sample_data just using pipe line %>% ? (You DON’T need the actual “sample” data for this question. Just show the command lines.)
ssample_data <- sample_data[sample_data$Experiment == "ecotypes", ]
sample_data <- sample_data <- filter(sample_data,
                              Site %in% c("Mah", "Jam", "Sil"),
                              Age == 3)

your answer :

sample_data %>%
  filter(Experiment == "ecotypes") %>%
  filter(Site %in% c("Mah", "Jam", "Sil"), Age == 3)
LS0tDQp0aXRsZTogIk1hcmluZSBCaW9pbmZvcm1hdGljcyBNaWQtdGVybSBleGFtIDIwMjUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KIyMgTmFtZSA6IOuCmO2YhOyEsQ0KDQojIyBJRCA6IDIwMjAwMTI0MA0KDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIyMgUTEuICgxMCBwb2ludHMpDQoNCjEpLiBDaGFuZ2UgdGhlIG5hbWUgIkpvaG4iIHRvICJDbGFpciIuDQoNCmBgYHtyfQ0KDQp4IDwtIGxpc3QobmFtZSA9ICJKb2huIiwgYWdlID0gMTksIHNwZWFrcyA9IGMoIkVuZ2xpc2giLCAiRnJlbmNoIikpDQp4DQpgYGANCg0KWW91IGNhbiBOT1QgZG8gbGlrZSB0aGlzIDoNCg0KYGBge3J9DQp4IDwtIGxpc3QobmFtZSA9ICJDbGFpciIsIGFnZSA9IDE5LCBzcGVha3MgPSBjKCJFbmdsaXNoIiwgIkZyZW5jaCIpKQ0KeA0KYGBgDQoNCiMjIyMgeW91ciBhbnN3ZXI6DQoNCmBgYHtyfQ0KeCA8LSBsaXN0KG5hbWUgPSAiSm9obiIsIGFnZSA9IDE5LCBzcGVha3MgPSBjKCJFbmdsaXNoIiwgIkZyZW5jaCIpKQ0KeCRuYW1lIDwtICJDbGFpciINCngNCmBgYA0KDQoyKSAgQ2hhbmdlIHRoZSBzcGVha3MgIkVuZ2xpc2giIHRvICJLb3JlYW4iLg0KDQojIyMjIHlvdXIgYW5zd2VyIDoNCg0KYGBge3J9DQp4JHNwZWFrc1t4JHNwZWFrcyA9PSAiRW5nbGlzaCJdIDwtICJLb3JlYW4iDQp4DQpgYGANCg0KIyMjIFEyLiBTdWJzZXR0aW5nICgxMCBwb2ludHMpDQoNCjEpICBzdWJzZXQgbGlua2VkIGluIGRhdGEgZm9yIHRob3NlIGxpbmtlZGluIGlzIGdyZWF0ZXIgdGhhbiAxMCBhbmQNCiAgICBmYWNlYm9vayBpcyBsZXNzIHRoYW4gMTAuDQoNCmBgYHtyfQ0KDQpsaW5rZWRpbiA8LSBjKDE2LCA5LCAxMywgNSwgMiwgMTcsIDE0KQ0KZmFjZWJvb2sgPC0gYygxNywgNywgNSwgMTYsIDgsIDEzLCAxNCkNCmBgYA0KDQpUaGUgb3V0cHV0IGlzOiBbMV0gMTMNCg0KIyMjIyB5b3VyIGFuc3dlcjoNCg0KYGBge3J9DQpsaW5rZWRpbltsaW5rZWRpbiA+IDEwICYgZmFjZWJvb2sgPCAxMF0NCmBgYA0KDQoyKSAgdXNlIHdoaWNoICgpIHRvIHN1YnNldCBsaW5rZWRpbiBmb3IgZmFjZWJvb2sgaXMgbGVzcyB0aGFuIDEwLg0KDQpbMV0gOSAxMyAyDQoNCmBgYHtyfQ0KDQpsaW5rZWRpbiA8LSBjKDE2LCA5LCAxMywgNSwgMiwgMTcsIDE0KQ0KZmFjZWJvb2sgPC0gYygxNywgNywgNSwgMTYsIDgsIDEzLCAxNCkNCg0KYGBgDQoNCiMjIyMgeW91ciBhbnN3ZXI6DQoNCmBgYHtyfQ0KbGlua2VkaW5bd2hpY2goZmFjZWJvb2sgPCAxMCldDQpgYGANCg0KIyMjIFEzLiBkYXRhIGRyYW1lIHF1ZXN0aW9ucyAoMTUgcG9pbnRzKQ0KDQoxKSAgQ3JlYXRlIGEgZGF0YSBmcmFtZSBhcyBpbiB0aGUgb3V0cHV0IHVzaW5nIGRhdGEuZnJhbWUoKS4NCg0KT3V0cHV0ICdkYXRhLmZyYW1lJzogMiBvYnMuIG9mIDMgdmFyaWFibGVzOiBcJCBTTiA6aW50IDEgMiBcJCBBZ2UgOm51bQ0KMjEgMTUgXCQgTmFtZTpjaHIgIkpvaG4iICJEb3JhIg0KDQojIyMjIHlvdXIgYW5zd2VyOg0KDQpgYGB7cn0NCmRmIDwtIGRhdGEuZnJhbWUoU04gPSBjKDEsIDIpLA0KICAgICAgICAgICAgICAgICBBZ2UgPSBjKDIxLCAxNSksDQogICAgICAgICAgICAgICAgIE5hbWUgPSBjKCJKb2huIiwgIkRvcmEiKSkNCnN0cihkZikNCmBgYA0KDQoyKSAgY2hhbmdlIHRoZSBuYW1lIHRvIHRoZSBmb2xsb3dpbmcgYnkgKipUV08gZGlmZmVyZW50Kiogd2F5cy4NCg0KJ2RhdGEuZnJhbWUnOiAyIG9icy4gb2YgMyB2YXJpYWJsZXM6IFwkIFNOIDogbnVtIDEgMiBcJCBBZ2UgOiBudW0gMjEgMTUNClwkIE5hbWU6IGNociAiQ2hhcmxpZSIgIkRldnkiDQoNCiMjIyMgeW91ciBhbnN3ZXI6DQoNCmBgYHtyfQ0KZGYkTmFtZSA8LSBjKCJDaGFybGllIiwgIkRldnkiKQ0Kc3RyKGRmKQ0KYGBgDQoNCiMjIyMgeW91ciBhbnN3ZXI6DQoNCmBgYHtyfQ0KZGZbWyJOYW1lIl1dIDwtIGMoIkNoYXJsaWUiLCAiRGV2eSIpDQogc3RyKGRmKQ0KYGBgDQoNCjMpICBjcmVhdGUgYSBuZXcgcm93IGFuZCBiaW5kIGl0IHRvIHRoZSBkYXRhIGZyYW1lIGJ5ICoqVFdPIGRpZmZlcmVudCoqDQogICAgd2F5cy4NCg0Kc3RyKE91dHB1dCkgJ2RhdGEuZnJhbWUnOiA0IG9icy4gb2YgMyB2YXJpYWJsZXM6IFwkIFNOIDogbnVtIDEgMiAxIDEgXCQNCkFnZSA6IG51bSAyMSAxNSAxNiAxNiBcJCBOYW1lOiBjaHIgIkpvaG4iICJEb3JhIiAiUGF1bCIgIlBhdWwiDQoNCiMjIyMgeW91ciBhbnN3ZXI6DQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCm5ld19yb3cgPC0gZGF0YS5mcmFtZShTTiA9IDEsIEFnZSA9IDE2LCBOYW1lID0gIlBhdWwiKQ0KZGYxIDwtIGJpbmRfcm93cyhkZiwgbmV3X3JvdywgbmV3X3JvdykNCnN0cihkZjEpDQpgYGANCg0KIyMjIyB5b3VyIGFuc3dlcjoNCg0KYGBge3J9DQpuZXdfcm93IDwtIGRhdGEuZnJhbWUoU04gPSAxLCBBZ2UgPSAxNiwgTmFtZSA9ICJQYXVsIikNCmRmMiA8LSByYmluZChkZiwgbmV3X3JvdywgbmV3X3JvdykNCnN0cihkZjIpDQpgYGANCg0KIyMjIFE0LiBGdW5jdGlvbiBxdWVzdGlvbnMuIEZpbGwgdGhlIGJsYW5rIHRvIGdldCB0aGUgb3V0cHV0IGFzIDogKDEwIHBvaW50cykNCg0KT3V0cHV0DQoNCkVudGVyIGEgbnVtYmVyOiA4IFsxXSAiVGhlIGZhY3RvcmlhbCBvZiA4IGlzIDQwMzIwIg0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpgYGAgcg0KRXhhbXBsZTogRmluZCB0aGUgZmFjdG9yaWFsIG9mIGEgbnVtYmVyICANCg0KIyB0YWtlIGlucHV0IGZyb20gdGhlIHVzZXIgIA0KDQpudW0gPSBhcy5pbnRlZ2VyKHJlYWRsaW5lKHByb21wdD0iRW50ZXIgYSBudW1iZXI6ICIpKSAgDQoNCmZhY3RvcmlhbCA9IDEgIA0KDQojIGNoZWNrIGlzIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUsIHBvc2l0aXZlIG9yIHplcm8gIA0KDQppZihudW0gPCAwKSB7ICANCiAgDQogICAgIHByaW50KCJTb3JyeSwgZmFjdG9yaWFsIGRvZXMgbm90IGV4aXN0IGZvciBuZWdhdGl2ZSBudW1iZXJzIikgIA0KICANCiAgICB9IGVsc2UgX19fX18gKG51bSBfX19fIDApIHsgIA0KICAgICAgDQogICAgICAgICBwcmludCgiVGhlIGZhY3RvcmlhbCBvZiAwIGlzIDEiKSAgDQoNCiAgICAgIH0gZWxzZSB7ICANCiAgICAgIA0KICAgICAgICAgICBmb3IoaSBpbiBfX19fX19fKSB7ICANCiAgICAgIA0KICAgICAgICAgICAgICBmYWN0b3JpYWwgPSBmYWN0b3JpYWwgKiBpICANCiAgICANCiAgICAgICAgICAgfSAgDQogDQogICAgICAgICBwcmludChwYXN0ZSgiVGhlIGZhY3RvcmlhbCBvZiIsIF9fX19fX18gLCJpcyIsIF9fX19fX19fX19fKSkgIA0KICAgICAgfSAgDQoNCk91dHB1dCAgDQpgYGANCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIHlvdXIgYW5zd2VyOg0KDQpgYGB7cn0NCiBudW0gPSBhcy5pbnRlZ2VyKHJlYWRsaW5lKHByb21wdD0iRW50ZXIgYSBudW1iZXI6ICIpKQ0KZmFjdG9yaWFsID0gMQ0KDQppZihudW0gPCAwKSB7DQogIHByaW50KCJTb3JyeSwgZmFjdG9yaWFsIGRvZXMgbm90IGV4aXN0IGZvciBuZWdhdGl2ZSBudW1iZXJzIikNCn0gZWxzZSBpZihudW0gPT0gMCkgew0KICBwcmludCgiVGhlIGZhY3RvcmlhbCBvZiAwIGlzIDEiKQ0KfSBlbHNlIHsNCiAgZm9yKGkgaW4gMTpudW0pIHsNCiAgICBmYWN0b3JpYWwgPSBmYWN0b3JpYWwgKiBpDQogIH0NCiAgcHJpbnQocGFzdGUoIlRoZSBmYWN0b3JpYWwgb2YiLCBudW0sICJpcyIsIGZhY3RvcmlhbCkpDQp9DQpPdXRwdXQgIA0KYGBgDQoNCiMjIyBRNS4gd2hlbiBvbmUgaXMgdG8gdXNlIHBpdm90X3dpZGVyIGZvcm1hdCBhbmQgd2hlbiBvbmUgaXMgdG8gdXNlIHBpdm90X2xvbmdlciBmb3JtPyAoNSBwb2ludHMpDQoNCnlvdXIgYW5zd2VyOiBwaXZvdCBsb25nZXIgOiDsl7Qg7J2066aE7J20IOusuOyekOudvOqzoCDqsIDsoJXtlZjquLAg65WM66y47JeQIOyXsOuPhCDsl7TsnYQNCuyIq+yekOuhnCDrs4DtmZjtlbTslbwg7ZWc64ukLiBwaXZvdCB3aWRlciA6IHBpdm90X2xvbmdlcuydmCDsl63tlajsiJjsnbTri6QuIOyyqyDrsojsp7gNCuyduOyImOuKlCDrjbDsnbTthLDsl5Ag64yA7ZWcIOqyg+ydtOyngOunjCDrs7Tsl6zso7zsp4Ag7JWK64qU64ukLiDqt7jrpqzqs6AgbmFtZXNfZnJvbSDsnbjsiJjripQNCuyWtOuWpCDrs4DsiJjrpbwg7Je0IOydtOumhOycvOuhnCDsgqzsmqntlaDsp4AgcGl2b3Rfd2lkZXLsl5Ag7JWM66Ck7KSA7KSA64ukLiDspokg642w7J207YSw66W8DQrrtoTsgrDtlaAg65WM64qUIHBpdm90IHdpZGVyLCDrjbDsnbTthLDrpbwg66qo7J2EIOuVjOuKlCBwaXZvdCBsb25nZXLrpbwg7JO064ukLg0KDQojIyMgUTYuIERvIHRoZSBmb2xsb3dpbmcgKDEwIHBvaW50cykNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHNsYWJzKQ0KDQpkYXRhKCJtdXJkZXJzIikNCmBgYA0KDQpgYGB7cn0NCg0KbXVyZGVycyAlPiUgDQogIG11dGF0ZShyYXRlID0gdG90YWwvcG9wdWxhdGlvbioxMDAwMDApICU+JQ0KICBncm91cF9ieShyZWdpb24pICU+JQ0KICBzdW1tYXJpemUoYXZnID0gbWVhbihyYXRlKSkgJT4lDQogIG11dGF0ZShyZWdpb24gPSBmYWN0b3IocmVnaW9uKSkgJT4lDQoNCmdncGxvdChhZXMocmVnaW9uLCBhdmcpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKw0KICB5bGFiKCJNdXJkZXIgUmF0ZSBBdmVyYWdlIikNCg0KYGBgDQoNCjEpICBIb3cgdG8gcmVvcmRlciBmcm9tIHRoZSBsYXJnZXN0IHRvIHRoZSBzbWFsbGVzdD8gU2hvdyB0aGUgcmVzdWx0YW50DQogICAgcGxvdC4NCg0KIyMjIyB5b3VyIGFuc3dlcg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkc2xhYnMpDQoNCmRhdGEoIm11cmRlcnMiKQ0KDQptdXJkZXJzICU+JQ0KICBtdXRhdGUocmF0ZSA9IHRvdGFsL3BvcHVsYXRpb24gKiAxMDAwMDApICU+JQ0KICBncm91cF9ieShyZWdpb24pICU+JQ0KICBzdW1tYXJpemUoYXZnID0gbWVhbihyYXRlKSkgJT4lDQogIG11dGF0ZShyZWdpb24gPSBmYWN0b3IocmVnaW9uLCBhdmcsIC5kZXNjID0gVFJVRSkpICU+JQ0KICANCmdncGxvdChhZXMocmVnaW9uLCBhdmcpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHlsYWIoIk11cmRlciBSYXRlIEF2ZXJhZ2UiKQ0KDQpgYGANCg0KMikgIEhvdyB0byBhZGQgZXJyb3IgYmFycyBvbiB0aGUgcGxvdD8NCg0KIyMjIyB5b3VyIGFuc3dlcg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkc2xhYnMpDQoNCmRhdGEoIm11cmRlcnMiKQ0KDQptdXJkZXJzICU+JSANCiBtdXRhdGUocmF0ZSA9IHRvdGFsL3BvcHVsYXRpb24gKiAxMDAwMDApICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uKSAlPiUgDQogIHN1bW1hcml6ZShhdmcgPSBtZWFuKHJhdGUpLCBzZCA9IHNkKHJhdGUpKSAlPiUgDQogIG11dGF0ZShyZWdpb24gPSBmYWN0b3IocmVnaW9uKSkgJT4lDQogIA0KZ2dwbG90KGFlcyhyZWdpb24sIGF2ZykpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYXZnIC0gc2QsIHltYXggPSBhdmcgKyBzZCkpICsgDQogIHlsYWIoIk11cmRlciBSYXRlIEF2ZXJhZ2UiKQ0KYGBgDQoNCiMjIyBRNy4gUmVnZXggcXVlc3Rpb25zLiAyNyBwb2ludHMgKGVhY2ggMyBwb2ludHMpDQoNCjEpICBXaGF0IHNob3VsZCBiZSBpbiB4Pw0KDQripoEgc3RyX3N1YnNldCh4LCAiLlxcJFxcXlxcJC4iKQ0KDQojIyMjIHlvdXIgYW5zd2VyDQoNCmBgYHtyfQ0KIFsxXSAiYSReJHoiDQpgYGANCg0K4qaBIHN0cl9zdWJzZXQoeCwgIlthLXpdXFwkXFxeXFwkW2Etel0iKQ0KDQojIyMjIHlvdXIgYW5zd2VyDQoNCmBgYHtyfQ0KWzFdICJhJF4keiINCmBgYA0KDQripoEgc3RyX3N1YnNldCh4LCAiXFxbXHxcXF0iKQ0KDQojIyMjIHlvdXIgYW5zd2VyDQoNCmBgYHtyfQ0KWzFdICJbfF0iDQpgYGANCg0KMikgIFVzZSBzdHJcXygpIHRvIGhhdmUgdGhlIHNhbWUgcmVzdWx0cyBmb3IgZ3JlcGwoKQ0KDQpgYGB7cn0NCg0KZmlsdGVyX3RheGEoZ3JlcGwocGF0dGVybiA9ICJeW2EtekEtWl0rJCIsIHRheG9uX25hbWVzKSkgJT4lICMgcmVtb3ZlICJvZGQiIHRheGENCiAgDQpgYGANCg0KIyMjIyB5b3VyIGFuc3dlcg0KDQpgYGB7cn0NCg0KYGBgDQoNCjMpICBXaGF0IGRvZXMgdGhpcyBtZWFuPw0KDQripoEgV2hhdCBkb2VzIHRoaXMgbWVhbj8NCg0KYGBge3J9DQoiKFsyLTldWzAtOV17Mn0pWy0gLl0oWzAtOV17M30pWy0gLl0oWzAtOV17NH0pIg0KDQpgYGANCg0KOiDssqsg67KI7Ke4IOyekOumrCDsiKvsnpDripQgMlx+OSDrkqTsl5Ag7Iir7J6QIDBcfjnqsIAgMuuyiCDrsJjrs7XrkJjrqbAg7LSdIDPsnpDrpqzrnbzripQNCuqyg+ydhCDslYwg7IiYIOyeiOuLpC4g6rWs67aE7J2AIC0gLiDrmJDripQg6rO167Cx7J2064ukLiDqt7jrpqzqs6Ag65GQIOuyiOynuCDqt7jro7nsl5DshJzripQNCuyIq+yekOqwgCAz7J6Q66as652864qUIOqyg+ydhCDslYwg7IiYIOyeiOqzoCDshLgg67KI7Ke4IOq3uOujueydgCDsiKvsnpDqsIAgNOyekOumrOudvOuKlCDqsoPsnYQg7JWMDQrsiJgg7J6I64ukLg0KDQripoEgV2hhdCBkb2VzIHRoaXMgbWVhbiAhPSAiIiBiZWxvdz8NCg0KYGBge3J9DQoNCmZpbHRlcl90YXhhKHRheG9uX25hbWVzICE9ICIiKSANCg0KYGBgDQoNCuKmgSB0aGUgbWVhbmluZyA/DQoNCmBgYHtyfQ0KDQpwYXN0ZTAoIipcXC4iLGV4dCwiXFwuIiwgZmV4dCwiJCIpDQoNCmBgYA0KDQripoEgV2hhdCBkb2VzIHRoaXMgbWVhbj8NCg0KYGBgIHINCihcZHsxLDJ9XC9cZHsxLDJ9XC9cZHs0fSkNCmBgYA0KDQo0KSAgV2hhdCBpcyB0aGUgdXRpbGl0eSBvZiByZWdleD8gKGkuZS4sIHdoeSBkbyB3ZSBuZWVkIHRvIGxlYXJuIHJlZ2V4PykNCg0KeW91ciBhbnN3ZXI6IHJlZ2V464qUIO2FjeyKpO2KuCDrrLjsnpDsnZgg7Yq57KCVIO2MqO2EtOydhCDshKTrqoXtlZjripQg67Cp67KV7J2064ukLiDsnbTrn6ztlZwNCu2RnO2YhOyLneydgCDso7zslrTsp4Qg66y47J6Q7Je07J20IO2MqO2EtOqzvCDsnbzsuZjtlZjripTsp4Ag7Jes67aA66W8IOqysOygle2VmOuKlCDrjbAg7IKs7Jqp7ZWgIOyImA0K7J6I64ukLg0KDQojIyMgUTguIFRpZHl2ZXJzZSBxdWVzdGlvbiAoMTAgcG9pbnRzKQ0KDQpUaGUgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAoQUNTKSBvbiBsYW5ndWFnZXMgc3Bva2VuIGF0IGhvbWUgYWNyb3NzDQp0aGUgVS5TLiBkY2xkYXRhOjpsYW5ndWFnZXNfc3RhdGVzIGNvbnRhaW5zIGRhdGEgZnJvbSB0aGUgMjAxMyBBQ1Mgb24NCnRoZSBudW1iZXIgb2YgYXQtaG9tZSBzcGVha2VycyBvZiBub24tRW5nbGlzaCBzcGVha2VycyBieSBzdGF0ZS4NCg0KYGBge3J9DQoNCmluc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKQ0KcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImRjbC1kb2NzL2RjbGRhdGEiKQ0KDQpsaWJyYXJ5KGRjbGRhdGEpDQpkY2xkYXRhOjpsYW5ndWFnZXNfc3RhdGVzDQpgYGANCg0KMSkgIEV4dHJhY3Qgc3BlYWtlcnMgb2YgS29yZWFuIGJ5IHN0YXRlIGFuZCBsaXN0IHRoZSB0b3AgMTAgc3RhdGVzIG9mDQogICAgS29yZWFuIHNwZWFrZXJzLg0KDQojIyMjIHlvdXIgYW5zd2VyIDoNCg0KYGBge3J9DQpsaWJyYXJ5KGRjbGRhdGEpDQpsaWJyYXJ5KGRwbHlyKQ0KDQpkY2xkYXRhOjpsYW5ndWFnZXNfc3RhdGVzICU+JQ0KICBmaWx0ZXIobGFuZ3VhZ2UgPT0gIktvcmVhbiIpICU+JQ0KICBhcnJhbmdlKGRlc2Moc3BlYWtlcnMpKSAlPiUNCiAgIHNsaWNlKDE6MTApDQpgYGANCg0KMikgIENhbiB5b3Ugd3JpdGUgd2l0aG91dCBzYXZpbmcgYXMgc2FtcGxlX2RhdGEganVzdCB1c2luZyBwaXBlIGxpbmUNCiAgICAlXD4lID8gKFlvdSBET07igJlUIG5lZWQgdGhlIGFjdHVhbCDigJxzYW1wbGXigJ0gZGF0YSBmb3IgdGhpcyBxdWVzdGlvbi4NCiAgICBKdXN0IHNob3cgdGhlIGNvbW1hbmQgbGluZXMuKQ0KDQpgYGB7cn0NCnNzYW1wbGVfZGF0YSA8LSBzYW1wbGVfZGF0YVtzYW1wbGVfZGF0YSRFeHBlcmltZW50ID09ICJlY290eXBlcyIsIF0NCnNhbXBsZV9kYXRhIDwtIHNhbXBsZV9kYXRhIDwtIGZpbHRlcihzYW1wbGVfZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpdGUgJWluJSBjKCJNYWgiLCAiSmFtIiwgIlNpbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlID09IDMpDQoNCmBgYA0KDQojIyMjIHlvdXIgYW5zd2VyIDoNCg0KYGBge3J9DQpzYW1wbGVfZGF0YSAlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnQgPT0gImVjb3R5cGVzIikgJT4lDQogIGZpbHRlcihTaXRlICVpbiUgYygiTWFoIiwgIkphbSIsICJTaWwiKSwgQWdlID09IDMpDQpgYGANCg==