Prepare Data for Correcting VSIC Code

Dưới đây là toàn bộ R codes phiên bản rút gọn (không giải thích dài dòng) của post trước.

# Clear R environment: 

rm(list = ls())

# Load some R packages: 

library(readxl)
library(dplyr)
library(tidyr)
library(stringr)

# Load data (download from https://dangkykinhdoanh.gov.vn/vn/Pages/NganhNghe.aspx): 

read_xls("Bảng chuyển đổi VSIC 2018 - VSIC 2007.xls") -> vsic_converted

vsic_converted %>% slice(-c(1:4)) -> vsic_converted

names(vsic_converted) <- c("vsic_new_c3", "vsic_new_c4", "sector_name_new", 
                           "vsic_old_c3", "vsic_old_c4", "sector_name_old")

# Prepare data for correcting: 

vsic_converted %>% 
  filter(vsic_new_c3 != vsic_old_c3) %>% 
  select(vsic_new_c3, vsic_old_c3, sector_name_new, sector_name_old) -> vsic_diff_c3

vsic_converted %>% 
  filter(vsic_new_c4 != vsic_old_c4) -> vsic_diff_c4

vsic_diff_c4 %>% 
  filter(!duplicated(vsic_old_c4)) %>% 
  select(vsic_new_c4, code_l4 = vsic_old_c4) -> convert_table_c4

read_excel("df_sector_code.xlsx") -> df_sector_code

# Prepare data for correcting: 

df_sector_code %>% 
  mutate(code_level1 = case_when(str_count(code_level1) == 0 ~ NA_character_, TRUE ~ code_level1)) %>% 
  fill(code_level1, .direction = "down") %>% 
  filter(str_detect(sector_name_latin, "[a-z]")) %>% 
  mutate(code_level2 = case_when(str_count(code_level2) == 0 ~ NA_character_, TRUE ~ code_level2)) %>% 
  fill(code_level2, .direction = "down") -> df_sector_code_filled

df_sector_code %>% 
  select(code_level1, sector_name_latin) %>% 
  filter(str_count(code_level1) != 0) -> df_sector_l1

full_join(df_sector_l1, 
          df_sector_code_filled %>% select(code_level1, code_level2)) -> df_sector_l1

df_sector_l1 %>% 
  rename(code_l2 = code_level2) %>% 
  filter(!duplicated(code_l2)) -> df_sector_l1

Functions for Cleaning VES Data

# Function for processing/cleaning data: 

cleaning_data_tax_vsic_code <- function(your_ves_data) {
  
  # Convert to text and extract sector codes at all levels: 
  
  your_ves_data %>% 
    mutate(nganh_kd = as.character(nganh_kd)) %>% 
    mutate(code_l2 = str_sub(nganh_kd, start = 1, end = 2), 
           code_l3 = str_sub(nganh_kd, start = 1, end = 3), 
           code_l4 = str_sub(nganh_kd, start = 1, end = 4), 
           code_5_end = str_sub(nganh_kd, start = 5, end = 5)) -> ves_data
  
  # Remove missing at nganh_kd: 
  
  ves_data %>% filter(!is.na(nganh_kd)) -> ves_data
  
  # Remove missing at ma_thue: 
  
  ves_data %>% filter(!is.na(ma_thue)) -> ves_data
  
  #---------------
  # VSIC 5 digits
  #---------------
  
  ves_data %>% 
    mutate(nganh_kd = case_when(str_count(nganh_kd) == 4 ~ str_c("0", nganh_kd), TRUE ~ nganh_kd)) %>% 
    filter(str_count(nganh_kd) == 5) -> ves_data
  
  #----------------------
  # Tax code processing
  #----------------------
  
  # Remove missing: 
  
  ves_data %>% filter(!is.na(ma_thue)) -> ves_data
  
  # Remove duplications: 
  
  ves_data %>% filter(!duplicated(ma_thue)) -> ves_data
  
  # Remove cases != 10 digits: 
  
  ves_data %>% filter(str_count(ma_thue) == 10) -> ves_data

  return(ves_data)
  
}



# Function corrects VSIC Level 3: 

process_vsic3 <- function(your_df) {

  full_join(your_df, 
            vsic_diff_c3 %>% select(vsic_new_c3, code_l3 = vsic_old_c3),
            by = c("code_l3")) -> your_df
  
  your_df %>% 
    mutate(code_l3_adj = case_when(is.na(vsic_new_c3) ~ code_l3, TRUE ~ vsic_new_c3)) -> final_df
  
  return(final_df)
}

# Function corrects VSIC Level 4:


process_vsic4 <- function(your_df) {
  
  full_join(your_df, convert_table_c4, by = "code_l4") -> your_df
  
  your_df %>% 
    mutate(code_l4_adj = case_when(is.na(vsic_new_c4) ~ code_l4, TRUE ~ vsic_new_c4)) %>% 
    mutate(nganh_kd_adj = str_c(code_l4_adj, code_5_end)) %>% 
    mutate(code_l2_adj = str_sub(nganh_kd_adj, start = 1, end = 2)) -> final_df
  
  return(final_df)
  
}


# Funtions join sector name: 

add_sector_name_at_level_1 <- function(your_df) {
  
  inner_join(your_df, 
             df_sector_l1, 
             by = c("code_l2_adj" = "code_l2")) -> final_df
  
  return(final_df)
  
}

Use The Functions

library(haven) # For importing data from Stata files: 

read_dta("F:\\VES_from_MaiVu_FTU\\Stata_2015\\dn2015.dta") %>% 
  cleaning_data_tax_vsic_code() %>% 
  process_vsic3() %>% 
  process_vsic4() %>% 
  add_sector_name_at_level_1() -> dn2015_after_processing

For Reporting

library(knitr)

dn2015_after_processing %>% 
  filter(!is.na(kqkd1)) %>% 
  group_by(sector_name_latin) %>% 
  summarise(Min = min(kqkd1), 
            Max = max(kqkd1), 
            SD = sd(kqkd1), 
            Median = median(kqkd1), 
            N_obs = n()) %>% 
  arrange(-N_obs) %>% 
  mutate(sector_name_short = str_sub(sector_name_latin, 1, 20)) %>% 
  select(-sector_name_latin) %>% 
  select(sector_name_short, everything()) %>% 
  kable()
sector_name_short Min Max SD Median N_obs
BAN BUON VA BAN LE; 0 105559749 395966.60 2102.0 169612
CONG NGHIEP CHE BIEN 0 375812792 2059143.28 2529.0 72810
XAY DUNG -26 11966123 133276.12 1717.0 58651
HOAT DONG CHUYEN MON -95 3404914 43026.90 437.0 36985
VAN TAI KHO BAI 0 12235791 177607.50 2182.0 26511
HOAT DONG HANH CHINH 0 4815353 68250.97 672.0 17313
DICH VU LUU TRU VA A 0 4694252 62100.38 586.0 16056
THONG TIN VA TRUYEN 0 57474075 803345.92 232.0 9458
HOAT DONG KINH DOANH 0 7292986 169680.21 290.5 8624
GIAO DUC VA DAO TAO 0 1136408 35180.19 106.0 5283
HOAT DONG TAI CHINH, -292 22942233 785044.73 1699.0 3175
HOAT DONG DICH VU KH 0 366965 13330.10 165.0 3155
NGHE THUAT, VUI CHOI 0 38174412 843315.37 153.0 2417
CUNG CAP NUOC; HOAT 0 2826496 118502.49 1002.0 1702
SAN XUAT VA PHAN PHO 0 77951360 3103259.73 2445.0 1495
Y TE VA HOAT DONG TR 0 969653 59694.20 753.9 1420
HOAT DONG CUA CAC TO 0 455638 55533.97 1050.0 74
LS0tDQp0aXRsZTogIkRhdGEgUHJlLXByb2Nlc3Npbmc6IFZpZXRuYW0gRW50ZXJwcmlzZSBTdXJ2ZXkgKFZFUykgRGF0YSAtIENvbmRlbnNlZCBWZXJzaW9uIg0KYXV0aG9yOiAnQXV0aG9yOiBOZ3V5ZW4gQ2hpIER1bmcnDQpzdWJ0aXRsZTogRGF0YSBQcmUtcHJvY2Vzc2luZyBTZXJpZXMsIEZUVSBTaG9ydCBDb3Vyc2UNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUpDQoNCmBgYA0KDQoNCiFbXShDOlxcVXNlcnNcXEFkbWluXFxEb2N1bWVudHNcXHZlcy5wbmcpDQoNCiMgUHJlcGFyZSBEYXRhIGZvciBDb3JyZWN0aW5nIFZTSUMgQ29kZQ0KDQpExrDhu5tpIMSRw6J5IGzDoCB0b8OgbiBi4buZIFIgY29kZXMgcGhpw6puIGLhuqNuIHLDunQgZ+G7jW4gKGtow7RuZyBnaeG6o2kgdGjDrWNoIGTDoGkgZMOybmcpIGPhu6dhIFtwb3N0IHRyxrDhu5tjXShodHRwczovL3JwdWJzLmNvbS9jaGlkdW5na3QvMTAxMjMwNSkuIA0KDQpgYGB7cn0NCiMgQ2xlYXIgUiBlbnZpcm9ubWVudDogDQoNCnJtKGxpc3QgPSBscygpKQ0KDQojIExvYWQgc29tZSBSIHBhY2thZ2VzOiANCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBMb2FkIGRhdGEgKGRvd25sb2FkIGZyb20gaHR0cHM6Ly9kYW5na3lraW5oZG9hbmguZ292LnZuL3ZuL1BhZ2VzL05nYW5oTmdoZS5hc3B4KTogDQoNCnJlYWRfeGxzKCJC4bqjbmcgY2h1eeG7g24gxJHhu5VpIFZTSUMgMjAxOCAtIFZTSUMgMjAwNy54bHMiKSAtPiB2c2ljX2NvbnZlcnRlZA0KDQp2c2ljX2NvbnZlcnRlZCAlPiUgc2xpY2UoLWMoMTo0KSkgLT4gdnNpY19jb252ZXJ0ZWQNCg0KbmFtZXModnNpY19jb252ZXJ0ZWQpIDwtIGMoInZzaWNfbmV3X2MzIiwgInZzaWNfbmV3X2M0IiwgInNlY3Rvcl9uYW1lX25ldyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInZzaWNfb2xkX2MzIiwgInZzaWNfb2xkX2M0IiwgInNlY3Rvcl9uYW1lX29sZCIpDQoNCiMgUHJlcGFyZSBkYXRhIGZvciBjb3JyZWN0aW5nOiANCg0KdnNpY19jb252ZXJ0ZWQgJT4lIA0KICBmaWx0ZXIodnNpY19uZXdfYzMgIT0gdnNpY19vbGRfYzMpICU+JSANCiAgc2VsZWN0KHZzaWNfbmV3X2MzLCB2c2ljX29sZF9jMywgc2VjdG9yX25hbWVfbmV3LCBzZWN0b3JfbmFtZV9vbGQpIC0+IHZzaWNfZGlmZl9jMw0KDQp2c2ljX2NvbnZlcnRlZCAlPiUgDQogIGZpbHRlcih2c2ljX25ld19jNCAhPSB2c2ljX29sZF9jNCkgLT4gdnNpY19kaWZmX2M0DQoNCnZzaWNfZGlmZl9jNCAlPiUgDQogIGZpbHRlcighZHVwbGljYXRlZCh2c2ljX29sZF9jNCkpICU+JSANCiAgc2VsZWN0KHZzaWNfbmV3X2M0LCBjb2RlX2w0ID0gdnNpY19vbGRfYzQpIC0+IGNvbnZlcnRfdGFibGVfYzQNCg0KcmVhZF9leGNlbCgiZGZfc2VjdG9yX2NvZGUueGxzeCIpIC0+IGRmX3NlY3Rvcl9jb2RlDQoNCiMgUHJlcGFyZSBkYXRhIGZvciBjb3JyZWN0aW5nOiANCg0KZGZfc2VjdG9yX2NvZGUgJT4lIA0KICBtdXRhdGUoY29kZV9sZXZlbDEgPSBjYXNlX3doZW4oc3RyX2NvdW50KGNvZGVfbGV2ZWwxKSA9PSAwIH4gTkFfY2hhcmFjdGVyXywgVFJVRSB+IGNvZGVfbGV2ZWwxKSkgJT4lIA0KICBmaWxsKGNvZGVfbGV2ZWwxLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHNlY3Rvcl9uYW1lX2xhdGluLCAiW2Etel0iKSkgJT4lIA0KICBtdXRhdGUoY29kZV9sZXZlbDIgPSBjYXNlX3doZW4oc3RyX2NvdW50KGNvZGVfbGV2ZWwyKSA9PSAwIH4gTkFfY2hhcmFjdGVyXywgVFJVRSB+IGNvZGVfbGV2ZWwyKSkgJT4lIA0KICBmaWxsKGNvZGVfbGV2ZWwyLCAuZGlyZWN0aW9uID0gImRvd24iKSAtPiBkZl9zZWN0b3JfY29kZV9maWxsZWQNCg0KZGZfc2VjdG9yX2NvZGUgJT4lIA0KICBzZWxlY3QoY29kZV9sZXZlbDEsIHNlY3Rvcl9uYW1lX2xhdGluKSAlPiUgDQogIGZpbHRlcihzdHJfY291bnQoY29kZV9sZXZlbDEpICE9IDApIC0+IGRmX3NlY3Rvcl9sMQ0KDQpmdWxsX2pvaW4oZGZfc2VjdG9yX2wxLCANCiAgICAgICAgICBkZl9zZWN0b3JfY29kZV9maWxsZWQgJT4lIHNlbGVjdChjb2RlX2xldmVsMSwgY29kZV9sZXZlbDIpKSAtPiBkZl9zZWN0b3JfbDENCg0KZGZfc2VjdG9yX2wxICU+JSANCiAgcmVuYW1lKGNvZGVfbDIgPSBjb2RlX2xldmVsMikgJT4lIA0KICBmaWx0ZXIoIWR1cGxpY2F0ZWQoY29kZV9sMikpIC0+IGRmX3NlY3Rvcl9sMQ0KDQoNCmBgYA0KDQojIEZ1bmN0aW9ucyBmb3IgQ2xlYW5pbmcgVkVTIERhdGENCg0KYGBge3J9DQojIEZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nL2NsZWFuaW5nIGRhdGE6IA0KDQpjbGVhbmluZ19kYXRhX3RheF92c2ljX2NvZGUgPC0gZnVuY3Rpb24oeW91cl92ZXNfZGF0YSkgew0KICANCiAgIyBDb252ZXJ0IHRvIHRleHQgYW5kIGV4dHJhY3Qgc2VjdG9yIGNvZGVzIGF0IGFsbCBsZXZlbHM6IA0KICANCiAgeW91cl92ZXNfZGF0YSAlPiUgDQogICAgbXV0YXRlKG5nYW5oX2tkID0gYXMuY2hhcmFjdGVyKG5nYW5oX2tkKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX2wyID0gc3RyX3N1YihuZ2FuaF9rZCwgc3RhcnQgPSAxLCBlbmQgPSAyKSwgDQogICAgICAgICAgIGNvZGVfbDMgPSBzdHJfc3ViKG5nYW5oX2tkLCBzdGFydCA9IDEsIGVuZCA9IDMpLCANCiAgICAgICAgICAgY29kZV9sNCA9IHN0cl9zdWIobmdhbmhfa2QsIHN0YXJ0ID0gMSwgZW5kID0gNCksIA0KICAgICAgICAgICBjb2RlXzVfZW5kID0gc3RyX3N1YihuZ2FuaF9rZCwgc3RhcnQgPSA1LCBlbmQgPSA1KSkgLT4gdmVzX2RhdGENCiAgDQogICMgUmVtb3ZlIG1pc3NpbmcgYXQgbmdhbmhfa2Q6IA0KICANCiAgdmVzX2RhdGEgJT4lIGZpbHRlcighaXMubmEobmdhbmhfa2QpKSAtPiB2ZXNfZGF0YQ0KICANCiAgIyBSZW1vdmUgbWlzc2luZyBhdCBtYV90aHVlOiANCiAgDQogIHZlc19kYXRhICU+JSBmaWx0ZXIoIWlzLm5hKG1hX3RodWUpKSAtPiB2ZXNfZGF0YQ0KICANCiAgIy0tLS0tLS0tLS0tLS0tLQ0KICAjIFZTSUMgNSBkaWdpdHMNCiAgIy0tLS0tLS0tLS0tLS0tLQ0KICANCiAgdmVzX2RhdGEgJT4lIA0KICAgIG11dGF0ZShuZ2FuaF9rZCA9IGNhc2Vfd2hlbihzdHJfY291bnQobmdhbmhfa2QpID09IDQgfiBzdHJfYygiMCIsIG5nYW5oX2tkKSwgVFJVRSB+IG5nYW5oX2tkKSkgJT4lIA0KICAgIGZpbHRlcihzdHJfY291bnQobmdhbmhfa2QpID09IDUpIC0+IHZlc19kYXRhDQogIA0KICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAjIFRheCBjb2RlIHByb2Nlc3NpbmcNCiAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgDQogICMgUmVtb3ZlIG1pc3Npbmc6IA0KICANCiAgdmVzX2RhdGEgJT4lIGZpbHRlcighaXMubmEobWFfdGh1ZSkpIC0+IHZlc19kYXRhDQogIA0KICAjIFJlbW92ZSBkdXBsaWNhdGlvbnM6IA0KICANCiAgdmVzX2RhdGEgJT4lIGZpbHRlcighZHVwbGljYXRlZChtYV90aHVlKSkgLT4gdmVzX2RhdGENCiAgDQogICMgUmVtb3ZlIGNhc2VzICE9IDEwIGRpZ2l0czogDQogIA0KICB2ZXNfZGF0YSAlPiUgZmlsdGVyKHN0cl9jb3VudChtYV90aHVlKSA9PSAxMCkgLT4gdmVzX2RhdGENCg0KICByZXR1cm4odmVzX2RhdGEpDQogIA0KfQ0KDQoNCg0KIyBGdW5jdGlvbiBjb3JyZWN0cyBWU0lDIExldmVsIDM6IA0KDQpwcm9jZXNzX3ZzaWMzIDwtIGZ1bmN0aW9uKHlvdXJfZGYpIHsNCg0KICBmdWxsX2pvaW4oeW91cl9kZiwgDQogICAgICAgICAgICB2c2ljX2RpZmZfYzMgJT4lIHNlbGVjdCh2c2ljX25ld19jMywgY29kZV9sMyA9IHZzaWNfb2xkX2MzKSwNCiAgICAgICAgICAgIGJ5ID0gYygiY29kZV9sMyIpKSAtPiB5b3VyX2RmDQogIA0KICB5b3VyX2RmICU+JSANCiAgICBtdXRhdGUoY29kZV9sM19hZGogPSBjYXNlX3doZW4oaXMubmEodnNpY19uZXdfYzMpIH4gY29kZV9sMywgVFJVRSB+IHZzaWNfbmV3X2MzKSkgLT4gZmluYWxfZGYNCiAgDQogIHJldHVybihmaW5hbF9kZikNCn0NCg0KIyBGdW5jdGlvbiBjb3JyZWN0cyBWU0lDIExldmVsIDQ6DQoNCg0KcHJvY2Vzc192c2ljNCA8LSBmdW5jdGlvbih5b3VyX2RmKSB7DQogIA0KICBmdWxsX2pvaW4oeW91cl9kZiwgY29udmVydF90YWJsZV9jNCwgYnkgPSAiY29kZV9sNCIpIC0+IHlvdXJfZGYNCiAgDQogIHlvdXJfZGYgJT4lIA0KICAgIG11dGF0ZShjb2RlX2w0X2FkaiA9IGNhc2Vfd2hlbihpcy5uYSh2c2ljX25ld19jNCkgfiBjb2RlX2w0LCBUUlVFIH4gdnNpY19uZXdfYzQpKSAlPiUgDQogICAgbXV0YXRlKG5nYW5oX2tkX2FkaiA9IHN0cl9jKGNvZGVfbDRfYWRqLCBjb2RlXzVfZW5kKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX2wyX2FkaiA9IHN0cl9zdWIobmdhbmhfa2RfYWRqLCBzdGFydCA9IDEsIGVuZCA9IDIpKSAtPiBmaW5hbF9kZg0KICANCiAgcmV0dXJuKGZpbmFsX2RmKQ0KICANCn0NCg0KDQojIEZ1bnRpb25zIGpvaW4gc2VjdG9yIG5hbWU6IA0KDQphZGRfc2VjdG9yX25hbWVfYXRfbGV2ZWxfMSA8LSBmdW5jdGlvbih5b3VyX2RmKSB7DQogIA0KICBpbm5lcl9qb2luKHlvdXJfZGYsIA0KICAgICAgICAgICAgIGRmX3NlY3Rvcl9sMSwgDQogICAgICAgICAgICAgYnkgPSBjKCJjb2RlX2wyX2FkaiIgPSAiY29kZV9sMiIpKSAtPiBmaW5hbF9kZg0KICANCiAgcmV0dXJuKGZpbmFsX2RmKQ0KICANCn0NCg0KYGBgDQoNCiMgVXNlIFRoZSBGdW5jdGlvbnMNCg0KYGBge3J9DQpsaWJyYXJ5KGhhdmVuKSAjIEZvciBpbXBvcnRpbmcgZGF0YSBmcm9tIFN0YXRhIGZpbGVzOiANCg0KcmVhZF9kdGEoIkY6XFxWRVNfZnJvbV9NYWlWdV9GVFVcXFN0YXRhXzIwMTVcXGRuMjAxNS5kdGEiKSAlPiUgDQogIGNsZWFuaW5nX2RhdGFfdGF4X3ZzaWNfY29kZSgpICU+JSANCiAgcHJvY2Vzc192c2ljMygpICU+JSANCiAgcHJvY2Vzc192c2ljNCgpICU+JSANCiAgYWRkX3NlY3Rvcl9uYW1lX2F0X2xldmVsXzEoKSAtPiBkbjIwMTVfYWZ0ZXJfcHJvY2Vzc2luZw0KYGBgDQoNCiMgRm9yIFJlcG9ydGluZw0KDQpgYGB7cn0NCmxpYnJhcnkoa25pdHIpDQoNCmRuMjAxNV9hZnRlcl9wcm9jZXNzaW5nICU+JSANCiAgZmlsdGVyKCFpcy5uYShrcWtkMSkpICU+JSANCiAgZ3JvdXBfYnkoc2VjdG9yX25hbWVfbGF0aW4pICU+JSANCiAgc3VtbWFyaXNlKE1pbiA9IG1pbihrcWtkMSksIA0KICAgICAgICAgICAgTWF4ID0gbWF4KGtxa2QxKSwgDQogICAgICAgICAgICBTRCA9IHNkKGtxa2QxKSwgDQogICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4oa3FrZDEpLCANCiAgICAgICAgICAgIE5fb2JzID0gbigpKSAlPiUgDQogIGFycmFuZ2UoLU5fb2JzKSAlPiUgDQogIG11dGF0ZShzZWN0b3JfbmFtZV9zaG9ydCA9IHN0cl9zdWIoc2VjdG9yX25hbWVfbGF0aW4sIDEsIDIwKSkgJT4lIA0KICBzZWxlY3QoLXNlY3Rvcl9uYW1lX2xhdGluKSAlPiUgDQogIHNlbGVjdChzZWN0b3JfbmFtZV9zaG9ydCwgZXZlcnl0aGluZygpKSAlPiUgDQogIGthYmxlKCkNCmBgYA0KDQoNCg0K