This is the entry point for the paper “Measuring the Landscape of Civil War.”

In this file, a raw csv file of the events dataset created for the Mau Mau rebellion is loaded and processed.

Load Library

rm(list=ls()); gc() #clear objects from memory
library(MeasuringLandscape)
library(tidyverse) #load independently just to make sure %>% gets imported
knitr::opts_knit$set(progress = TRUE, verbose = TRUE)
knitr::opts_chunk$set(fig.width = 12, fig.height = 8, warning = FALSE, message = FALSE, cache = TRUE)
options(width = 160)

Load Events Data

events <- MeasuringLandscape:::prep_events(fromscratch = F)
dim(events)
[1] 10469    25

Dates

Basic cleaning. Format is usually DD.MM.YYYY but sometimes multiple days are included by DD1/DD2/MM/YY. Sometimes year is YY or YYYY.

#p_load(date)
events <- events %>%
          dplyr::mutate(event_date_clean=event_date) %>%
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"[[:digit:]]+/", "")) %>%
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"[[:digit:]]+/", "")) %>% #strip off extra day at the front 01/02.12.1950
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"\\.", "/")) %>% #Convert periods to slashes
          dplyr::mutate(event_date_clean=trimws(event_date_clean)) %>% #trim whitespace
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"/52", "/1952")) %>% #convert 2 digit years to 4 digit years
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"/53", "/1953")) %>%
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"/54", "/1954")) %>%
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"/55", "/1955")) %>%
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"/56", "/1956")) %>%
          dplyr::mutate(event_date_clean=stringr::str_replace_all(event_date_clean,"/19524", "/1954")) %>% #clean typo
          dplyr::mutate(event_date_clean= lubridate::dmy(event_date_clean) ) #Feed to lubridate
 67 failed to parse.
  
events %>% filter(is.na(event_date_clean)) %>% dplyr::select(starts_with("event_date")) %>% distinct() %>% print(n=40) #visualize errors
events$event_date_clean_year <- lubridate::year(events$event_date_clean)
events$event_date_clean_year %>% janitor::tabyl() %>% round(3)
    .    n percent valid_percent
  953    1   0.000         0.000
 1855    1   0.000         0.000
 1952  157   0.015         0.020
 1953 3025   0.289         0.384
 1954 3165   0.302         0.402
 1955 1330   0.127         0.169
 1956  112   0.011         0.014
 1957   27   0.003         0.003
 1958    7   0.001         0.001
 1985    1   0.000         0.000
 1995   18   0.002         0.002
 2005    1   0.000         0.000
 2013    2   0.000         0.000
 2023    1   0.000         0.000
 2057   21   0.002         0.003
 2058    8   0.001         0.001
 2060    1   0.000         0.000
 2061    1   0.000         0.000
   NA 2590   0.247            NA

How often are event dates missing?

table(is.na(events$event_date))

FALSE  TRUE 
 7946  2523 

The documents also have dates, sometimes spanning a period of time. Can use that to nail down missing dates.

(events$document_date_type <- events$document_date %>% 
                             tolower() %>% 
                             mosaic::derivedFactor(
                                          "unknown" = T,
                                          "missing"     = stringr::str_detect(.,"obscured|missing|illegible|xx|Document missing"),
                                          "on the"      = stringr::str_detect(.,"on the"),
                                          "to"          = stringr::str_detect(.," to"),
                                          "for"         = stringr::str_detect(.,"For "),
                                          "week"        = stringr::str_detect(.,"week"),
                                          "week ending" = stringr::str_detect(.,"week ending"),
                                          "period"      = stringr::str_detect(.,"period"),
                                          "fortnight"   = stringr::str_detect(.,"fortnight"),
                                          "ending"      = stringr::str_detect(.,"ending"),
                                          .method = "last",
                                          .default = "unknown"
                            ) 
 ) %>% janitor::tabyl() 
           .    n     percent
                0 0.000000000
     unknown  877 0.083771134
     missing  324 0.030948515
      on the  101 0.009647531
          to 1640 0.156652975
         for    0 0.000000000
        week  130 0.012417614
 week ending    0 0.000000000
      period  226 0.021587544
   fortnight  562 0.053682300
      ending 6609 0.631292387
events$document_date_clean <- events$document_date %>% tolower() %>% 
                             stringr::str_replace_all("Fortnight Ended |period|week ending|for |the |fortnight |ending |week |From |on ","") %>%
                             stringr::str_replace_all("[Digits]*th|[Digits]*st|[Digits]*rd|[Digits]*nd","")
events <- events %>% 
         dplyr::select(-one_of("document_date_1","document_date_2")) %>%  #separate will continue to add columns every time its run
                              tidyr ::separate(col=document_date_clean,
                                        into=c("document_date_1","document_date_2"),
                                        sep = " to|to |To | - ", remove=F, extra="drop", fill="right")
Unknown columns: `document_date_1`, `document_date_2`
events$document_date_clean_1 <- events$document_date_1 %>% 
                                 stringr::str_replace_all("[[:digit:]]+/", "")   %>% #strip off extra day at the front 01/02.12.1950
                                 stringr::str_replace_all("\\.", "/")             %>% #Convert periods to slashes
                                 trimws() %>%                            
                                 lubridate::dmy()
 2356 failed to parse.
events$document_date_clean_2 <- events$document_date_2 %>% 
                                 stringr::str_replace_all("[[:digit:]]+/", "")   %>% #strip off extra day at the front 01/02.12.1950
                                 stringr::str_replace_all("\\.", "/")             %>% #Convert periods to slashes
                                 trimws() %>%                            
                                 lubridate::dmy()    
 257 failed to parse.
events %>% filter(is.na(document_date_clean_1)) %>% dplyr::select(starts_with("document_date")) %>% distinct() %>% print(n=40) #visualize errors
events$document_date_best_date <- events$document_date_clean_2
condition <- is.na(events$document_date_best_date)
events$document_date_best_date[condition] <- events$document_date_clean_1[condition]
(events$document_date_best_year <- lubridate::year(events$document_date_best_date)) %>% janitor::tabyl() %>% round(3)
    .    n percent valid_percent
 1952  101   0.010         0.011
 1953 3275   0.313         0.348
 1954 3751   0.358         0.398
 1955 1892   0.181         0.201
 1956  281   0.027         0.030
 1957   68   0.006         0.007
 1958   26   0.002         0.003
 1959    4   0.000         0.000
 1960    4   0.000         0.000
 1961    4   0.000         0.000
 2052   10   0.001         0.001
   NA 1053   0.101            NA

Type of Event

cat("\014")

events$type_clean <- stringr::str_trim(stringi::stri_trans_totitle(events$type))
events$type_clean_agglow <- events$type_clean %>%
  stringr::str_trim() %>%
  tolower() %>%
  forcats::fct_collapse( #removed Car dependency for forcats
             'desertion'='desertion',
             'escape'='escape',
             'abduction'=c('abduction','kidnapping','kidnap','kitnap','kindnap'),
             'assault'=c('assault','attack','assaulted','assaults','assualt','assult'),
             'murder'=c('murder','elimination','kidnap / murder',''),
             'arson'=c('arson','burn'),
             'cattle slashing'=c('slashed','stampede'),
             'vandalism'='vandalism',
             'theft'=c('theft','thefts','thet','missing','lost','entry'),
             'punishment'=c('confiscate','sentenced'),
             'rebel capture'=c('capture','captured'),
             'oathing'=c('oath','oathing','recruitment','recruited'),
             'contact'=c('contact','caontact','contacts','drove off','drive off','drove  off',
              'chased off','broke up oathing','ambush'),
             'patrol'=c('patrol','police and kpr patrol','sweep'),
             'screening'=c('screening','sreening'),
             'unclassified'=c('type')
)

Unknown levels in f: kidnapping, , recruitment, patrol

events$type_clean_agglow %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(.,digits = 1)

Factor dat contains implicit NA, consider using forcats::fct_explicit_na‘janitor::adorn_crosstab’ is deprecated. Use ‘use the various adorn_ functions instead. See the “tabyl” vignette for examples.’ instead. See help(“Deprecated”)

Collapse Event Types

(events$type_clean_aggmed <- events$type_clean_agglow %>% forcats::fct_collapse(
                                 'physical violence'=c('abduction','assault','murder'),
                                 'property destruction'=c('vandalism','arson','cattle slashing'),
                                 'theft'=c('theft'),
                                 'security operations'=c('contact','screening','sreening','patrol','punishment'),
                                 'unclassified'=c('desertion','escape','unclassified')
                            )
 ) %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)
Unknown levels in `f`: sreeningFactor `dat` contains implicit NA, consider using `forcats::fct_explicit_na`'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")
NA
(events$type_clean_agghigh <- events$type_clean_aggmed %>% forcats::fct_collapse(
                                 'rebel activity'=c('oathing','physical violence','property destruction','theft'),
                                 'government activity'=c('rebel capture','security operations')
                            )
) %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)
Factor `dat` contains implicit NA, consider using `forcats::fct_explicit_na`'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")

Initiator of Event

Collapsed Initiators to just Rebels, Government, and Civilians

cat("\014")

initiator_target_master_clean <- list(
  
'ammunition'=c('ammunition'),
'explosives'=c('explosives', 'gelignite'),
'firearms'=c('firearms','arms', 'firearm', 'gun', 'pistol', 'rifle', 'ammunition', 'rifile', 'shotgun', 'verey pistol'),
'other weapons'=c('other weapons','axe','scabbard','weapons'),
'colonial authorities'=c('colonial authorities','councillor', 'district commissioner', 'district officer', 'forest ranger', 'game ranger', 'game warden', 'government', 'government employees', 'port authority', 'public works department', 'screening team' , 'do', 'govrnment', 'wakamba screening team', 'do munuga','african do','dcmeru', 'colonial authorities' ,'govtemployee' ),
'tribal authorities'=c('tribal authorities','chief', 'elders', 'headman' , 'chief chostram','chief eliud', "chief's sentry") ,
'private property'=c('private property','buildings', 'cattle dip', 'duka', 'farms', 'garage', 'homes','huts', 'hotel', 'land rover', 'lorry', 'market', 'office', 'oxcart', 'property',  'pump house', 'sawmill', 'shops', 'stores', 'tractor', 'vehicle', 'windmill' , "bullock's farm",'cattle boma','coffe trees','coffee trees', 'cuthouse','dairy farm','dip','house','household', 'houses','hut','instrument','labour camp post','labour huts','lorries','lucerne sheds','maize shamba', 'milk factory','pig sty','private property', 'property of civilians','shop','store','thika fishing camp','vehicles'),
'cash'=c('cash', 'funds', 'money' , "conductor's takings"),
'food'=c('banana', 'barley', 'bran', 'cabbage', 'coffee', 'corn', 'cream', 'crops', 'dairy', 'food', 'fruit', 'grain', 'honey', 'maize',  'meat', 'milk', 'oats', 'posho', 'potatoes', 'sugar', 'vegetable', 'wheat',
'food','food etc','food store','food stores','foodstuffs','fruits','grains', 'grains+cloth +money','green maize cobs','potato','potato store','potatos','skimmed milk','sugar cane','sugar maize','vegetables','vegitable garden', 'vegitables','wheat bags','wheat store','wheet','whisky') ,
'livestock'=c('beast', 'cattle', 'cow', 'herd', 'livestock', 'pig', 'sheep', 'steer', 'stock',
'animal', 'bulls','calf','calves','chicken','cows','donkey','goat','goats',
'head of cattle','head of cow','head of sheep','heifer','heifers',
'lamb','live stock','livestock','livestocks','masai herd','milk cow','ox','ox cart',
'oxen','ram','red poll cattle','shee','sheep or ox','steers','stocks' ),
'medicine'=c('medical supplies', 'medicine', 'm&b tablets', 'medicines'),
'supplies'=c('supplies','bags', 'bedding', 'blankets', 'books', 'charcoal', 'cloth', 'clothing', 'cooking utensils', 'cutlery', 'equipment', 'farm implements', 
'household items','instruments', 'iron', 'pails','petrol', 'provisions', 'oil', 'sacks', 'supplies', 'tarpaulin', 'thatch', 'timber', 
'tobacco', 'tools', 'uniforms', 'wire', 'wireless set', 'whiskey', 'articles','bag','battery','bucket','ciga','cigarettes','clothes',
'clothing etc','cloths','dairy item','dairy record book','goods', 'material','oil+tins','provisionv','railway uniforms','supplies', 'tarpaulian','typewriter','v- drive belts', 'gunny bags' ),
'church'=c('church'),
'infrastructure'=c('airstrip', 'bridges', 'half built village', 'roads', 'trenches', 'water tank','bridge', 'bridge broken', 'bridge damaged', 'infrastructure', 'milt property', 'miltproperty', 'prison camp','stn damaged'),
'school'=c('school', 'school','school building','school house','school property','schools'),
'home guard'=c('bg','kg','eg', 'guard','embu guard', 'farm guard', 'forest guard', 'home guard','ikandine guard', 'kathanjure guard', 'kijabe guard',
'kikuyu guard', 'masai guard', 'meru guard', 'nandi guard', 'nkubu guard', 'stock guard', 'tigoni guard','tp and eg patrol','hg','tp patrol','home guard patrol',
'm', 'm/g','m/g patrol','g', 'kathanjure hg','k g', 'ng', 'eg patrol', 'hg camp','hg leader','hg patrol','hg post','home','home guard','kg post'),
'arab combat units'=c('arab combat' , 'arab combat unit','arab combat units'),
'asian combat units'=c('asian combat', 'asian combat unit', 'asian combat team', 'second asian combat unit','asian combat units' ),
'kings african rifles'=c('kings african rifles','3 kar', '4 kar', '5 kar', '6 kar', '7 kar', '23 kar', '26 kar','k.a.r','k.p.r','k.a.r.', '5th k.a.r','5kar','5 k.a.r','4th kar','kar' ) ,
'british military'=c('british military', 'devonshire regiment','devons', 'field intelligence assistant', 'field intelligence officer', 'fio', 'gloucestershire regiment', 'glosters', 'lancashire fusiliers', 
"king's shropshire light infantry", 'royal east kent regiment', 'buffs', 'royal fusiliers', 'royal highland regiment','black watch', 'watch', 'royal inniskilling fusiliers', 'royal irish fusiliers', 'royal northumberland fusiliers', 'rnf','police and military', 'army' , 'lancashire fusilliers', 'sp company 1 royal innisks', '1 rnf', 'rif', 'ksli', 'inniskillings', 'fia','1 glosters', '1 bw', '1 buffs', 
'\"a\" company 1 royal innisks', '\"a\" company', 'royal fusilers', 'of devons','of 1 glosters', 'lanc fus', 'fusiliers', 'fio kruger','fios','a co devon','4 platoon support company',
'\"c\" company1 royal innisks','6 platoonsp company 1 royal innisks','1 lf', '\"c\" company', '\"d\" company','\"a\"','\"a\" company bw','buffs ambush','d company',
"d' force",'devens', 'c company','\"d\" force', 'army officer', 'british army officer', 'british military', 'buffs patrol', 'european officer', 'european soldiers', 'gloster patrol' ),
'kenya regiment'=c('kenya regiment','captain folliott’s team' , 'kr', 'kenreg', 'kenregg','kenya regiment sergeant', 'kenya regt','keniya regiment','kenya regiment private'),
 'military (generic)'=c('military (generic)', 'captain', 'company', 'military', 'army', 'military property', 'platoon', 'security forces', 'security force', 'coy', 'striking force' ,'sentry', 'non commissioned officers', 'patrol', 'sentrie', 'sgt white' ),
'psuedo gangs'=c('psuedo gangs','pseudo gang', 'pseudo team', 'trojan', 'psuedo gangs', 'trojan team' , 'tracker group', 'pseudo teams'),
'royal air force'=c('royal air force','raf', 'bombers', 'air strike', 'harvards', 'raf lincolns','flying squard'),
'paramilitary'=c('paramilitary','general service unit', 'gsu' ),
'cid'=c('cid'),
'kenya police'=c('kenya police', 'kp' , "kp constables' quarters", 'kpa' ),
'kenya police reserve'=c('kenya police reserve', 'kpr', 'kpr officers', 'reserve police officer', 'rpo' , 'rpos', 'police and k.p.r'),
'police (generic)'=c('police (generic)','constable', 'police', 'polce','policy party'),
'railway police'=c('railway police' ),
'special branch'=c('special branch', 'blue doctor team', 'special branch team', 'sb officers' ),
'tribal police'=c('githumu police', 'masai special constable', 'tribal police', 'tp' , 'tpeg','african constable', 'african costable', 'african special constable', 'tribal police'),
'tribal police reserve'=c('tribal police reserve', 'tpr')  ,
'communities'=c('communities','manyatta', 'fishing camp', 'sublocation', 'village', 'camp' , 'villages') ,
'detainees'=c('detainees', 'prisoner', 'prisoners'),
'suspected insurgents'=c('suspected insurgents','bandits', 'food foragers', 'gangs', 'gang', 'kiama kia muingi' , 'kkm', 'komerera' , 'mau mau', 'oath administrator', 'passive wing',
'rebels', 'suspects', 'terrorists','terrorosts','terrorist', 'gunman', 'terorist', 'gunmen', 'resistance group','resistance groups', 'oath administrater','oath administrators','passive wing members', 'resistance','suspect', 'suspected insurgents','terroist','terroists','terrost') ,
'civilians'=c('civilians','africans', 'children', 'civilian', 'driver', 'employees', 'evangelist', 'family', 'farm boys', 'girls', 'informer',
'kikuyu', 'laborour', 'loyalist', 'masai', 'men', 'mission staff', 'owner', 'passengers', 'people',  'tugen tribesmen' , 'stranger', 'sikh',
'herd boys', 'isiolo game scouts', 'farm labour', 'farmer', 'european', 'employer', 'employee', 'civilan','shopkeeper' , 'students', 'teachers',
'turkana', 'vigilantes', 'women', 'workers','villagers',  'labour', 'local labour', 'kikuyus', 'embu', 'tiriki houseboy', 'samburu', 'manager', 'woman',
'vetofficer', 'mrhiggins', 'masai party','kuria tribesmen','manager of akira estates', 'kuria tribesmen','chstephen','african',
'catholic misson staff', 'african staff', 'asian women', 'bus conductor', 'child', 'civilian(food carriers)', 'civilian(schoolmaster)', 'civilians',
'civilion', 'committee', 'committee member',  'courier','elder','embu tractor driver', 'employees of club','engine boy','girl','golf club staff','his own hut',
'hotel keeper','houseboy','illegal residents','indian','interpreter','kem','kikiyu', 'kikuyu assessor','kikuyu families','kikuyu houseboy','kikuyu labourer','kikyu',
'kirua village','labour line','labour lines','labourer','labourers', 'laboures','labourline','labours','males','man','maragoli','maragoli labourer',
'masai elders','masai tribesman','members of the thika committee', 'mna section leaders','municipal inspectors','non kikuyu employees','person',
'prostitutes','purke masai','pwd employee','railway employees', 'school master','school teacher','sisters committee','somali','staff','strangers',
'taxi drivers','teacher','treasurers', "headman's son","norton traill's labour","gordon's labour", 'food carriers') 
)
regex <- "\\.|patrol|[1-9]\\s*rd|[1-9]\\s*th" # with regex start trying to get more of these to automatically map instead of generating lots of hand codings
events$initiator_clean <- events$initiator %>% stringr::str_trim() %>% gsub(regex, "", ., ignore.case =T) %>% tolower()
events <- events %>%
  dplyr::select(-one_of("initiator_clean_1", "initiator_clean_2", "initiator_clean_3")) %>% # separate will continue to add columns every time its run
  tidyr ::separate(
    col = initiator_clean,
    into = c("initiator_clean_1", "initiator_clean_2", "initiator_clean_3"),
    sep = "and|\\\\|/|\\&|,", remove = F, extra = "drop", fill = "right"
  )
Unknown columns: `initiator_clean_1`, `initiator_clean_2`, `initiator_clean_3`
events <- events %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*police.*", "police", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*guard.*", "guard", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*terror.*|.*mau mau.*|.*gang.*", "terrorist", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*kpr.*|.*k p r.*", "kpr", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*kar.*|.*k a r.*", "kar", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*coy.*", "coy", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*gsu.*", "gsu", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*watch.*", "watch", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(trimws(.)))
events <- events %>% 
          mutate(initiator_clean_1_agglow = do.call(forcats::fct_collapse, c(list(events$initiator_clean_1), initiator_target_master_clean)) %>% as.character() ) %>%
          mutate(initiator_clean_2_agglow = do.call(forcats::fct_collapse, c(list(events$initiator_clean_2), initiator_target_master_clean)) %>% as.character()) %>%
          mutate(initiator_clean_3_agglow = do.call(forcats::fct_collapse, c(list(events$initiator_clean_3), initiator_target_master_clean)) %>% as.character())
Unknown levels in `f`: ammunition, explosives, gelignite, firearms, arms, firearm, gun, pistol, rifle, ammunition, rifile, shotgun, verey pistol, other weapons, axe, scabbard, weapons, colonial authorities, councillor, district commissioner, district officer, government employees, port authority, public works department, colonial authorities, govtemployee, tribal authorities, elders, chief's sentry, private property, buildings, cattle dip, duka, farms, garage, homes, huts, hotel, land rover, lorry, market, office, oxcart, property, pump house, sawmill, shops, stores, tractor, vehicle, windmill, bullock's farm, cattle boma, coffe trees, coffee trees, cuthouse, dairy farm, dip, house, household, houses, hut, instrument, labour camp post, labour huts, lorries, lucerne sheds, maize shamba, milk factory, pig sty, private property, property of civilians, shop, store, thika fishing camp, vehicles, cash, funds, money, conductor's takings, banana, barley, bran, cabbage, coffee, corn, cream, crops, dairy, food, fruit, grain, honey, maize, meat, milk, oats, posho, potatoes, sugar, vegetable, wheat, food, food etc, food store, food stores, foodstuffs, fruits, grains, grains+cloth +money, green maize cobs, potato, potato store, potatos, skimmed milk, sugar cane, sugar maize, vegetables, vegitable garden, vegitables, wheat bags, wheat store, wheet, whisky, beast, cattle, cow, herd, livestock, pig, sheep, steer, stock, animal, bulls, calf, calves, chicken, cows, donkey, goat, goats, head of cattle, head of cow, head of sheep, heifer, heifers, lamb, live stock, livestock, livestocks, masai herd, milk cow, ox, ox cart, oxen, ram, red poll cattle, shee, sheep or ox, steers, stocks, medical supplies, medicine, m&b tablets, medicines, supplies, bags, bedding, blankets, books, charcoal, cloth, clothing, cooking utensils, cutlery, equipment, farm implements, household items, instruments, iron, pails, petrol, provisions, oil, sacks, supplies, tarpaulin, thatch, timber, tobacco, tools, uniforms, wire, wireless set, whiskey, articles, bag, battery, bucket, ciga, cigarettes, clothes, clothing etc, cloths, dairy item, dairy record book, goods, material, oil+tins, provisionv, railway uniforms, supplies, tarpaulian, typewriter, v- drive belts, gunny bags, church, airstrip, bridges, half built village, roads, trenches, water tank, bridge, bridge broken, bridge damaged, infrastructure, milt property, miltproperty, prison camp, stn damaged, school, school, school building, school house, school property, schools, embu guard, farm guard, forest guard, home guard, ikandine guard, kathanjure guard, kijabe guard, kikuyu guard, masai guard, meru guard, nandi guard, nkubu guard, stock guard, tigoni guard, tp and eg patrol, tp patrol, home guard patrol, m/g, m/g patrol, g, eg patrol, hg camp, hg leader, hg patrol, hg post, home, home guard, kg post, arab combat, arab combat units, asian combat, asian combat units, kings african rifles, 3 kar, 4 kar, 5 kar, 6 kar, 7 kar, 23 kar, 26 kar, k.a.r, k.p.r, k.a.r., 5th k.a.r, 5kar, 5 k.a.r, 4th kar, british military, devonshire regiment, field intelligence assistant, field intelligence officer, gloucestershire regiment, glosters, king's shropshire light infantry, royal east kent regiment, royal fusiliers, royal highland regiment, black watch, royal inniskilling fusiliers, royal northumberland fusiliers, rnf, police and military, army officer, british army officer, british military, buffs patrol, european officer, european soldiers, gloster patrol, captain folliott’s team, kenya regiment private, military (generic), captain, military property, platoon, non commissioned officers, patrol, sentrie, sgt white, psuedo gangs, pseudo gang, psuedo gangs, royal air force, paramilitary, kenya police, kp, kp constables' quarters, kpa, kenya police reserve, kpr officers, reserve police officer, police and k.p.r, police (generic), railway police, githumu police, masai special constable, tribal police, african constable, african costable, african special constable, tribal police, tribal police reserve, communities, manyatta, fishing camp, sublocation, village, camp, villages, detainees, prisoner, prisoners, suspected insurgents, bandits, food foragers, gangs, gang, kiama kia muingi, kkm, komerera, mau mau, oath administrator, passive wing, suspects, terrorists, terrorosts, oath administrater, oath administrators, passive wing members, resistance, suspect, suspected insurgents, terroist, terroists, terrost, africans, children, driver, employees, evangelist, family, farm boys, girls, informer, laborour, loyalist, mission staff, passengers, people, shopkeeper, students, teachers, vigilantes, women, workers, catholic misson staff, african staff, asian women, bus conductor, child, civilian(food carriers), civilian(schoolmaster), civilion, committee, committee member, courier, elder, embu tractor driver, employees of club, engine boy, girl, golf club staff, his own hut, hotel keeper, houseboy, illegal residents, indian, interpreter, kem, kikiyu, kikuyu assessor, kikuyu families, kikuyu houseboy, kikuyu labourer, kikyu, kirua village, labour line, labour lines, labourer, labourers, laboures, labourline, labours, males, man, maragoli, maragoli labourer, masai elders, masai tribesman, members of the thika committee, mna section leaders, municipal inspectors, non kikuyu employees, person, prostitutes, purke masai, pwd employee, railway employees, school master, school teacher, sisters committee, somali, staff, strangers, taxi drivers, teacher, treasurers, headman's son, gordon's labour, food carriersUnknown levels in `f`: ammunition, explosives, gelignite, firearms, arms, firearm, gun, pistol, rifle, ammunition, rifile, shotgun, verey pistol, other weapons, axe, scabbard, weapons, colonial authorities, councillor, district commissioner, district officer, forest ranger, game ranger, game warden, government employees, port authority, public works department, screening team, govrnment, wakamba screening team, do munuga, african do, dcmeru, colonial authorities, govtemployee, tribal authorities, elders, headman, chief chostram, chief eliud, chief's sentry, private property, buildings, cattle dip, duka, farms, garage, homes, huts, hotel, land rover, lorry, market, office, oxcart, property, pump house, sawmill, shops, stores, tractor, vehicle, windmill, bullock's farm, cattle boma, coffe trees, coffee trees, cuthouse, dairy farm, dip, house, household, houses, hut, instrument, labour camp post, labour huts, lorries, lucerne sheds, maize shamba, milk factory, pig sty, private property, property of civilians, shop, store, thika fishing camp, vehicles, cash, funds, money, conductor's takings, banana, barley, bran, cabbage, coffee, corn, cream, crops, dairy, food, fruit, grain, honey, maize, meat, milk, oats, posho, potatoes, sugar, vegetable, wheat, food, food etc, food store, food stores, foodstuffs, fruits, grains, grains+cloth +money, green maize cobs, potato, potato store, potatos, skimmed milk, sugar cane, sugar maize, vegetables, vegitable garden, vegitables, wheat bags, wheat store, wheet, whisky, beast, cattle, cow, herd, livestock, pig, sheep, steer, stock, animal, bulls, calf, calves, chicken, cows, donkey, goat, goats, head of cattle, head of cow, head of sheep, heifer, heifers, lamb, live stock, livestock, livestocks, masai herd, milk cow, ox, ox cart, oxen, ram, red poll cattle, shee, sheep or ox, steers, stocks, medical supplies, medicine, m&b tablets, medicines, supplies, bags, bedding, blankets, books, charcoal, cloth, clothing, cooking utensils, cutlery, equipment, farm implements, household items, instruments, iron, pails, petrol, provisions, oil, sacks, supplies, tarpaulin, thatch, timber, tobacco, tools, uniforms, wire, wireless set, whiskey, articles, bag, battery, bucket, ciga, cigarettes, clothes, clothing etc, cloths, dairy item, dairy record book, goods, material, oil+tins, provisionv, railway uniforms, supplies, tarpaulian, typewriter, v- drive belts, gunny bags, church, airstrip, bridges, half built village, roads, trenches, water tank, bridge, bridge broken, bridge damaged, infrastructure, milt property, miltproperty, prison camp, stn damaged, school, school, school building, school house, school property, schools, bg, embu guard, farm guard, forest guard, home guard, ikandine guard, kathanjure guard, kijabe guard, kikuyu guard, masai guard, meru guard, nandi guard, nkubu guard, stock guard, tigoni guard, tp and eg patrol, tp patrol, home guard patrol, m/g, m/g patrol, kathanjure hg, k g, ng, eg patrol, hg camp, hg leader, hg patrol, hg post, home, home guard, kg post, arab combat, arab combat unit, arab combat units, asian combat, asian combat team, second asian combat unit, asian combat units, kings african rifles, 3 kar, 4 kar, 5 kar, 6 kar, 7 kar, 23 kar, 26 kar, k.a.r, k.p.r, k.a.r., 5th k.a.r, 5kar, 5 k.a.r, 4th kar, british military, devonshire regiment, devons, field intelligence assistant, field intelligence officer, fio, gloucestershire regiment, glosters, lancashire fusiliers, king's shropshire light infantry, royal east kent regiment, royal fusiliers, royal highland regiment, black watch, royal inniskilling fusiliers, royal irish fusiliers, royal northumberland fusiliers, rnf, police and military, lancashire fusilliers, sp company 1 royal innisks, 1 rnf, rif, ksli, inniskillings, 1 glosters, 1 bw, 1 buffs, "a" company 1 royal innisks, "a" company, royal fusilers, of devons, of 1 glosters, lanc fus, fusiliers, fio kruger, fios, a co devon, 4 platoon support company, "c" company1 royal innisks, 6 platoonsp company 1 royal innisks, 1 lf, "c" company, "d" company, "a", "a" company bw, buffs ambush, d company, d' force, devens, c company, "d" force, army officer, british army officer, british military, buffs patrol, european officer, european soldiers, gloster patrol, captain folliott’s team, kenreg, kenregg, kenya regiment sergeant, keniya regiment, kenya regiment private, military (generic), captain, company, military property, platoon, security forces, security force, striking force, sentry, non commissioned officers, patrol, sentrie, sgt white, psuedo gangs, pseudo gang, pseudo team, trojan, psuedo gangs, trojan team, tracker group, pseudo teams, royal air force, raf, bombers, air strike, harvards, raf lincolns, flying squard, paramilitary, general service unit, cid, kenya police, kp constables' quarters, kpa, kenya police reserve, kpr officers, reserve police officer, rpo, rpos, police and k.p.r, police (generic), constable, polce, policy party, railway police, special branch, blue doctor team, special branch team, sb officers, githumu police, masai special constable, tribal police, tpeg, african constable, african costable, african special constable, tribal police, tribal police reserve, communities, manyatta, fishing camp, sublocation, village, camp, villages, detainees, prisoner, prisoners, suspected insurgents, bandits, food foragers, gangs, gang, kiama kia muingi, kkm, komerera, mau mau, oath administrator, passive wing, rebels, suspects, terrorists, terrorosts, gunman, terorist, gunmen, resistance group, resistance groups, oath administrater, oath administrators, passive wing members, resistance, suspect, suspected insurgents, terroist, terroists, terrost, africans, children, civilian, driver, employees, evangelist, family, farm boys, girls, informer, kikuyu, laborour, loyalist, masai, men, mission staff, owner, passengers, people, tugen tribesmen, stranger, sikh, herd boys, isiolo game scouts, farm labour, farmer, european, employer, employee, civilan, shopkeeper, students, teachers, turkana, vigilantes, women, workers, villagers, local labour, kikuyus, embu, tiriki houseboy, samburu, manager, woman, vetofficer, mrhiggins, masai party, kuria tribesmen, manager of akira estates, kuria tribesmen, chstephen, african, catholic misson staff, african staff, asian women, bus conductor, child, civilian(food carriers), civilian(schoolmaster), civilion, committee, committee member, courier, elder, embu tractor driver, employees of club, engine boy, girl, golf club staff, his own hut, hotel keeper, houseboy, illegal residents, indian, interpreter, kem, kikiyu, kikuyu assessor, kikuyu families, kikuyu houseboy, kikuyu labourer, kikyu, kirua village, labour line, labour lines, labourer, labourers, laboures, labourline, labours, males, man, maragoli, maragoli labourer, masai elders, masai tribesman, members of the thika committee, mna section leaders, municipal inspectors, non kikuyu employees, person, prostitutes, purke masai, pwd employee, railway employees, school master, school teacher, sisters committee, somali, staff, strangers, taxi drivers, teacher, treasurers, headman's son, norton traill's labour, gordon's labour, food carriersUnknown levels in `f`: ammunition, explosives, gelignite, firearms, arms, firearm, gun, pistol, rifle, ammunition, rifile, shotgun, verey pistol, other weapons, axe, scabbard, weapons, colonial authorities, councillor, district commissioner, district officer, forest ranger, game ranger, game warden, government, government employees, port authority, public works department, screening team, do, govrnment, wakamba screening team, do munuga, african do, dcmeru, colonial authorities, govtemployee, tribal authorities, chief, elders, headman, chief chostram, chief eliud, chief's sentry, private property, buildings, cattle dip, duka, farms, garage, homes, huts, hotel, land rover, lorry, market, office, oxcart, property, pump house, sawmill, shops, stores, tractor, vehicle, windmill, bullock's farm, cattle boma, coffe trees, coffee trees, cuthouse, dairy farm, dip, house, household, houses, hut, instrument, labour camp post, labour huts, lorries, lucerne sheds, maize shamba, milk factory, pig sty, private property, property of civilians, shop, store, thika fishing camp, vehicles, cash, funds, money, conductor's takings, banana, barley, bran, cabbage, coffee, corn, cream, crops, dairy, food, fruit, grain, honey, maize, meat, milk, oats, posho, potatoes, sugar, vegetable, wheat, food, food etc, food store, food stores, foodstuffs, fruits, grains, grains+cloth +money, green maize cobs, potato, potato store, potatos, skimmed milk, sugar cane, sugar maize, vegetables, vegitable garden, vegitables, wheat bags, wheat store, wheet, whisky, beast, cattle, cow, herd, livestock, pig, sheep, steer, stock, animal, bulls, calf, calves, chicken, cows, donkey, goat, goats, head of cattle, head of cow, head of sheep, heifer, heifers, lamb, live stock, livestock, livestocks, masai herd, milk cow, ox, ox cart, oxen, ram, red poll cattle, shee, sheep or ox, steers, stocks, medical supplies, medicine, m&b tablets, medicines, supplies, bags, bedding, blankets, books, charcoal, cloth, clothing, cooking utensils, cutlery, equipment, farm implements, household items, instruments, iron, pails, petrol, provisions, oil, sacks, supplies, tarpaulin, thatch, timber, tobacco, tools, uniforms, wire, wireless set, whiskey, articles, bag, battery, bucket, ciga, cigarettes, clothes, clothing etc, cloths, dairy item, dairy record book, goods, material, oil+tins, provisionv, railway uniforms, supplies, tarpaulian, typewriter, v- drive belts, gunny bags, church, airstrip, bridges, half built village, roads, trenches, water tank, bridge, bridge broken, bridge damaged, infrastructure, milt property, miltproperty, prison camp, stn damaged, school, school, school building, school house, school property, schools, bg, eg, embu guard, farm guard, forest guard, home guard, ikandine guard, kathanjure guard, kijabe guard, kikuyu guard, masai guard, meru guard, nandi guard, nkubu guard, stock guard, tigoni guard, tp and eg patrol, tp patrol, home guard patrol, m, m/g, m/g patrol, g, kathanjure hg, k g, ng, eg patrol, hg camp, hg leader, hg patrol, hg post, home, home guard, kg post, arab combat, arab combat unit, arab combat units, asian combat, asian combat unit, asian combat team, second asian combat unit, asian combat units, kings african rifles, 3 kar, 4 kar, 5 kar, 6 kar, 7 kar, 23 kar, 26 kar, k.a.r, k.p.r, k.a.r., 5th k.a.r, 5kar, 5 k.a.r, 4th kar, british military, devonshire regiment, devons, field intelligence assistant, field intelligence officer, fio, gloucestershire regiment, glosters, lancashire fusiliers, king's shropshire light infantry, royal east kent regiment, buffs, royal fusiliers, royal highland regiment, black watch, watch, royal inniskilling fusiliers, royal irish fusiliers, royal northumberland fusiliers, rnf, police and military, army, lancashire fusilliers, sp company 1 royal innisks, 1 rnf, rif, ksli, inniskillings, 1 glosters, 1 bw, 1 buffs, "a" company 1 royal innisks, "a" company, royal fusilers, of devons, of 1 glosters, lanc fus, fusiliers, fio kruger, fios, a co devon, 4 platoon support company, "c" company1 royal innisks, 6 platoonsp company 1 royal innisks, 1 lf, "c" company, "d" company, "a", "a" company bw, buffs ambush, d company, d' force, devens, c company, "d" force, army officer, british army officer, british military, buffs patrol, european officer, european soldiers, gloster patrol, kenya regiment, captain folliott’s team, kr, kenreg, kenregg, kenya regiment sergeant, kenya regt, keniya regiment, kenya regiment private, military (generic), captain, company, army, military property, platoon, security forces, security force, coy, striking force, sentry, non commissioned officers, patrol, sentrie, sgt white, psuedo gangs, pseudo gang, pseudo team, trojan, psuedo gangs, trojan team, tracker group, pseudo teams, royal air force, raf, bombers, air strike, harvards, raf lincolns, flying squard, paramilitary, general service unit, gsu, cid, kenya police, kp, kp constables' quarters, kpa, kenya police reserve, kpr officers, reserve police officer, rpo, rpos, police and k.p.r, police (generic), constable, polce, policy party, railway police, special branch, blue doctor team, special branch team, sb officers, githumu police, masai special constable, tribal police, tpeg, african constable, african costable, african special constable, tribal police, tribal police reserve, tpr, communities, manyatta, fishing camp, sublocation, village, camp, villages, detainees, prisoner, prisoners, suspected insurgents, bandits, food foragers, gangs, gang, kiama kia muingi, kkm, komerera, mau mau, oath administrator, passive wing, rebels, suspects, terrorists, terrorosts, terrorist, gunman, terorist, gunmen, resistance group, resistance groups, oath administrater, oath administrators, passive wing members, resistance, suspect, suspected insurgents, terroist, terroists, terrost, africans, children, civilian, driver, employees, evangelist, family, farm boys, girls, informer, laborour, loyalist, masai, men, mission staff, owner, passengers, people, tugen tribesmen, stranger, sikh, herd boys, isiolo game scouts, farm labour, farmer, european, employer, employee, civilan, shopkeeper, students, teachers, turkana, vigilantes, women, workers, villagers, labour, local labour, kikuyus, embu, tiriki houseboy, samburu, manager, woman, vetofficer, mrhiggins, masai party, kuria tribesmen, manager of akira estates, kuria tribesmen, chstephen, african, catholic misson staff, african staff, asian women, bus conductor, child, civilian(food carriers), civilian(schoolmaster), civilion, committee, committee member, courier, elder, embu tractor driver, employees of club, engine boy, girl, golf club staff, his own hut, hotel keeper, houseboy, illegal residents, indian, interpreter, kem, kikiyu, kikuyu assessor, kikuyu families, kikuyu houseboy, kikuyu labourer, kikyu, kirua village, labour line, labour lines, labourer, labourers, laboures, labourline, labours, males, man, maragoli, maragoli labourer, masai elders, masai tribesman, members of the thika committee, mna section leaders, municipal inspectors, non kikuyu employees, person, prostitutes, purke masai, pwd employee, railway employees, school master, school teacher, sisters committee, somali, staff, strangers, taxi drivers, teacher, treasurers, headman's son, norton traill's labour, gordon's labour, food carriers
#https://community.rstudio.com/t/using-list-argument-with-fct-collapse/6552/7
# sort(table(events$initiator_clean_1_agglow))
lowlevelagg <- c(
  "arab combat units", "cid", "psuedo gangs", "asian combat units", "special branch",
  "tribal authorities", "tribal police reserve", "royal air force",
  "paramilitary", "kenya regiment", "tribal police", "kenya police reserve", "kenya police",
  "british military", "civilians", "Kings African Rifles", "military (generic)", "police (generic)",
  "railway police", "home guard", "colonial authorities", "suspected insurgents"
)
#events <- events %>%
#  mutate(initiator_clean_1_agglow=ifelse(initiator_clean_1_agglow  %in% lowlevelagg & !is.na(initiator_clean_1_agglow),initiator_clean_1_agglow, "uncategorized")) %>%
#  mutate(initiator_clean_2_agglow=ifelse(initiator_clean_2_agglow  %in% lowlevelagg & !is.na(initiator_clean_2_agglow),initiator_clean_2_agglow, "uncategorized")) %>%  
#  mutate(initiator_clean_3_agglow=ifelse(initiator_clean_3_agglow  %in% lowlevelagg & !is.na(initiator_clean_3_agglow),initiator_clean_3_agglow, "uncategorized"))
# table(events$initiator_clean_1_agglow, useNA="always")

events[, c("initiator_clean_1_aggmed", "initiator_clean_2_aggmed", "initiator_clean_3_aggmed")] <-
  events[, c("initiator_clean_1_agglow", "initiator_clean_2_agglow", "initiator_clean_3_agglow")]
events <- events %>%
  mutate_at(
    vars(starts_with("initiator_clean_1_aggmed|initiator_clean_2_aggmed|initiator_clean_3_aggmed")),
    .funs = funs(forcats::fct_collapse(
     'police'=c('cid','kenya police reserve','kenya police','police (generic)','railway police','special branch','tribal police','tribal police reserve') ,
     'military'=c('arab combat units','asian combat units','british military','kings african rifles','kenya regiment','military (generic)','psuedo gangs','royal air force') , 
     'civil authorities'=c('colonial authorities', 'tribal authorities')
     ))
  )

events$initiator_clean_2_aggmed %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)

events[, c("initiator_clean_1_agghigh", "initiator_clean_2_agghigh", "initiator_clean_3_agghigh")] <-
  events[, c("initiator_clean_1_aggmed", "initiator_clean_2_aggmed", "initiator_clean_3_aggmed")]
events <- events %>%
  mutate_at(
    vars(starts_with("initiator_clean_1_agghigh|initiator_clean_2_agghigh|initiator_clean_3_agghigh")),
    .funs = funs(forcats::fct_collapse(
                  'government'=c('civil authorities', 'home guard', 'military', 'police', 'paramilitary') ,
                  'rebels'=c('suspected insurgents') 
          ))
  )

events$initiator_clean_3_agghigh %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)

Target of Event

regex <- "\\.|patrol|[1-9]\\s*rd|[1-9]\\s*th" # with regex start trying to get more of these to automatically map instead of generating lots of hand codings
events$target_clean <- events$initiator %>% stringr::str_trim() %>% tolower() %>% gsub(regex, "", .)
events <- events %>%
  dplyr::select(-one_of("target_clean_1", "target_clean_2", "target_clean_3")) %>% # separate will continue to add columns every time its run so drop old versions. First time this is run will throw a warning.
  tidyr ::separate(
    col = initiator_clean,
    into = c("target_clean_1", "target_clean_2", "target_clean_3"),
    sep = "and|\\\\|/|\\&|,", remove = F, extra = "drop", fill = "right"
  )
Unknown columns: `target_clean_1`, `target_clean_2`, `target_clean_3`
events <- events %>% 
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*terror.*|.*erori.*|.*erroris*|.*mau mau.*|.*gang.*", "terrorist", ., ignore.case =T))  )  %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*police.*", "police", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*guard.*", "guard", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*kpr.*|.*k p r.*", "kpr", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*kar.*|.*k a r.*", "kar", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*coy.*", "coy", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*gsu.*", "gsu", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*watch.*", "watch", ., ignore.case =T))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(trimws(.)))
events$target_clean_1 %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)
'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")
events <- events %>% 
          mutate(target_clean_1_agglow = do.call(forcats::fct_collapse, c(list(events$target_clean_1), initiator_target_master_clean)) %>% as.character() ) %>%
          mutate(target_clean_2_agglow = do.call(forcats::fct_collapse, c(list(events$target_clean_2), initiator_target_master_clean)) %>% as.character()) %>%
          mutate(target_clean_3_agglow = do.call(forcats::fct_collapse, c(list(events$target_clean_3), initiator_target_master_clean)) %>% as.character())
Unknown levels in `f`: ammunition, explosives, gelignite, firearms, arms, firearm, gun, pistol, rifle, ammunition, rifile, shotgun, verey pistol, other weapons, axe, scabbard, weapons, colonial authorities, councillor, district commissioner, district officer, government employees, port authority, public works department, colonial authorities, govtemployee, tribal authorities, elders, chief's sentry, private property, buildings, cattle dip, duka, farms, garage, homes, huts, hotel, land rover, lorry, market, office, oxcart, property, pump house, sawmill, shops, stores, tractor, vehicle, windmill, bullock's farm, cattle boma, coffe trees, coffee trees, cuthouse, dairy farm, dip, house, household, houses, hut, instrument, labour camp post, labour huts, lorries, lucerne sheds, maize shamba, milk factory, pig sty, private property, property of civilians, shop, store, thika fishing camp, vehicles, cash, funds, money, conductor's takings, banana, barley, bran, cabbage, coffee, corn, cream, crops, dairy, food, fruit, grain, honey, maize, meat, milk, oats, posho, potatoes, sugar, vegetable, wheat, food, food etc, food store, food stores, foodstuffs, fruits, grains, grains+cloth +money, green maize cobs, potato, potato store, potatos, skimmed milk, sugar cane, sugar maize, vegetables, vegitable garden, vegitables, wheat bags, wheat store, wheet, whisky, beast, cattle, cow, herd, livestock, pig, sheep, steer, stock, animal, bulls, calf, calves, chicken, cows, donkey, goat, goats, head of cattle, head of cow, head of sheep, heifer, heifers, lamb, live stock, livestock, livestocks, masai herd, milk cow, ox, ox cart, oxen, ram, red poll cattle, shee, sheep or ox, steers, stocks, medical supplies, medicine, m&b tablets, medicines, supplies, bags, bedding, blankets, books, charcoal, cloth, clothing, cooking utensils, cutlery, equipment, farm implements, household items, instruments, iron, pails, petrol, provisions, oil, sacks, supplies, tarpaulin, thatch, timber, tobacco, tools, uniforms, wire, wireless set, whiskey, articles, bag, battery, bucket, ciga, cigarettes, clothes, clothing etc, cloths, dairy item, dairy record book, goods, material, oil+tins, provisionv, railway uniforms, supplies, tarpaulian, typewriter, v- drive belts, gunny bags, church, airstrip, bridges, half built village, roads, trenches, water tank, bridge, bridge broken, bridge damaged, infrastructure, milt property, miltproperty, prison camp, stn damaged, school, school, school building, school house, school property, schools, embu guard, farm guard, forest guard, home guard, ikandine guard, kathanjure guard, kijabe guard, kikuyu guard, masai guard, meru guard, nandi guard, nkubu guard, stock guard, tigoni guard, tp and eg patrol, tp patrol, home guard patrol, m/g, m/g patrol, g, eg patrol, hg camp, hg leader, hg patrol, hg post, home, home guard, kg post, arab combat, arab combat units, asian combat, asian combat units, kings african rifles, 3 kar, 4 kar, 5 kar, 6 kar, 7 kar, 23 kar, 26 kar, k.a.r, k.p.r, k.a.r., 5th k.a.r, 5kar, 5 k.a.r, 4th kar, british military, devonshire regiment, field intelligence assistant, field intelligence officer, gloucestershire regiment, glosters, king's shropshire light infantry, royal east kent regiment, royal fusiliers, royal highland regiment, black watch, royal inniskilling fusiliers, royal northumberland fusiliers, rnf, police and military, army officer, british army officer, british military, buffs patrol, european officer, european soldiers, gloster patrol, captain folliott’s team, kenya regiment private, military (generic), captain, military property, platoon, non commissioned officers, patrol, sentrie, sgt white, psuedo gangs, pseudo gang, psuedo gangs, royal air force, paramilitary, kenya police, kp, kp constables' quarters, kpa, kenya police reserve, kpr officers, reserve police officer, police and k.p.r, police (generic), railway police, githumu police, masai special constable, tribal police, african constable, african costable, african special constable, tribal police, tribal police reserve, communities, manyatta, fishing camp, sublocation, village, camp, villages, detainees, prisoner, prisoners, suspected insurgents, bandits, food foragers, gangs, gang, kiama kia muingi, kkm, komerera, mau mau, oath administrator, passive wing, suspects, terrorists, terrorosts, terorist, oath administrater, oath administrators, passive wing members, resistance, suspect, suspected insurgents, terroist, terroists, terrost, africans, children, driver, employees, evangelist, family, farm boys, girls, informer, laborour, loyalist, mission staff, passengers, people, shopkeeper, students, teachers, vigilantes, women, workers, catholic misson staff, african staff, asian women, bus conductor, child, civilian(food carriers), civilian(schoolmaster), civilion, committee, committee member, courier, elder, embu tractor driver, employees of club, engine boy, girl, golf club staff, his own hut, hotel keeper, houseboy, illegal residents, indian, interpreter, kem, kikiyu, kikuyu assessor, kikuyu families, kikuyu houseboy, kikuyu labourer, kikyu, kirua village, labour line, labour lines, labourer, labourers, laboures, labourline, labours, males, man, maragoli, maragoli labourer, masai elders, masai tribesman, members of the thika committee, mna section leaders, municipal inspectors, non kikuyu employees, person, prostitutes, purke masai, pwd employee, railway employees, school master, school teacher, sisters committee, somali, staff, strangers, taxi drivers, teacher, treasurers, headman's son, gordon's labour, food carriersUnknown levels in `f`: ammunition, explosives, gelignite, firearms, arms, firearm, gun, pistol, rifle, ammunition, rifile, shotgun, verey pistol, other weapons, axe, scabbard, weapons, colonial authorities, councillor, district commissioner, district officer, forest ranger, game ranger, game warden, government employees, port authority, public works department, screening team, govrnment, wakamba screening team, do munuga, african do, dcmeru, colonial authorities, govtemployee, tribal authorities, elders, headman, chief chostram, chief eliud, chief's sentry, private property, buildings, cattle dip, duka, farms, garage, homes, huts, hotel, land rover, lorry, market, office, oxcart, property, pump house, sawmill, shops, stores, tractor, vehicle, windmill, bullock's farm, cattle boma, coffe trees, coffee trees, cuthouse, dairy farm, dip, house, household, houses, hut, instrument, labour camp post, labour huts, lorries, lucerne sheds, maize shamba, milk factory, pig sty, private property, property of civilians, shop, store, thika fishing camp, vehicles, cash, funds, money, conductor's takings, banana, barley, bran, cabbage, coffee, corn, cream, crops, dairy, food, fruit, grain, honey, maize, meat, milk, oats, posho, potatoes, sugar, vegetable, wheat, food, food etc, food store, food stores, foodstuffs, fruits, grains, grains+cloth +money, green maize cobs, potato, potato store, potatos, skimmed milk, sugar cane, sugar maize, vegetables, vegitable garden, vegitables, wheat bags, wheat store, wheet, whisky, beast, cattle, cow, herd, livestock, pig, sheep, steer, stock, animal, bulls, calf, calves, chicken, cows, donkey, goat, goats, head of cattle, head of cow, head of sheep, heifer, heifers, lamb, live stock, livestock, livestocks, masai herd, milk cow, ox, ox cart, oxen, ram, red poll cattle, shee, sheep or ox, steers, stocks, medical supplies, medicine, m&b tablets, medicines, supplies, bags, bedding, blankets, books, charcoal, cloth, clothing, cooking utensils, cutlery, equipment, farm implements, household items, instruments, iron, pails, petrol, provisions, oil, sacks, supplies, tarpaulin, thatch, timber, tobacco, tools, uniforms, wire, wireless set, whiskey, articles, bag, battery, bucket, ciga, cigarettes, clothes, clothing etc, cloths, dairy item, dairy record book, goods, material, oil+tins, provisionv, railway uniforms, supplies, tarpaulian, typewriter, v- drive belts, gunny bags, church, airstrip, bridges, half built village, roads, trenches, water tank, bridge, bridge broken, bridge damaged, infrastructure, milt property, miltproperty, prison camp, stn damaged, school, school, school building, school house, school property, schools, bg, embu guard, farm guard, forest guard, home guard, ikandine guard, kathanjure guard, kijabe guard, kikuyu guard, masai guard, meru guard, nandi guard, nkubu guard, stock guard, tigoni guard, tp and eg patrol, tp patrol, home guard patrol, m/g, m/g patrol, kathanjure hg, k g, ng, eg patrol, hg camp, hg leader, hg patrol, hg post, home, home guard, kg post, arab combat, arab combat unit, arab combat units, asian combat, asian combat team, second asian combat unit, asian combat units, kings african rifles, 3 kar, 4 kar, 5 kar, 6 kar, 7 kar, 23 kar, 26 kar, k.a.r, k.p.r, k.a.r., 5th k.a.r, 5kar, 5 k.a.r, 4th kar, british military, devonshire regiment, devons, field intelligence assistant, field intelligence officer, fio, gloucestershire regiment, glosters, lancashire fusiliers, king's shropshire light infantry, royal east kent regiment, royal fusiliers, royal highland regiment, black watch, royal inniskilling fusiliers, royal irish fusiliers, royal northumberland fusiliers, rnf, police and military, lancashire fusilliers, sp company 1 royal innisks, 1 rnf, rif, ksli, inniskillings, 1 glosters, 1 bw, 1 buffs, "a" company 1 royal innisks, "a" company, royal fusilers, of devons, of 1 glosters, lanc fus, fusiliers, fio kruger, fios, a co devon, 4 platoon support company, "c" company1 royal innisks, 6 platoonsp company 1 royal innisks, 1 lf, "c" company, "d" company, "a", "a" company bw, buffs ambush, d company, d' force, devens, c company, "d" force, army officer, british army officer, british military, buffs patrol, european officer, european soldiers, gloster patrol, captain folliott’s team, kenreg, kenregg, kenya regiment sergeant, keniya regiment, kenya regiment private, military (generic), captain, company, military property, platoon, security forces, security force, striking force, sentry, non commissioned officers, patrol, sentrie, sgt white, psuedo gangs, pseudo gang, pseudo team, trojan, psuedo gangs, trojan team, tracker group, pseudo teams, royal air force, raf, bombers, air strike, harvards, raf lincolns, flying squard, paramilitary, general service unit, cid, kenya police, kp constables' quarters, kpa, kenya police reserve, kpr officers, reserve police officer, rpo, rpos, police and k.p.r, police (generic), constable, polce, policy party, railway police, special branch, blue doctor team, special branch team, sb officers, githumu police, masai special constable, tribal police, tpeg, african constable, african costable, african special constable, tribal police, tribal police reserve, communities, manyatta, fishing camp, sublocation, village, camp, villages, detainees, prisoner, prisoners, suspected insurgents, bandits, food foragers, gangs, gang, kiama kia muingi, kkm, komerera, mau mau, oath administrator, passive wing, rebels, suspects, terrorists, terrorosts, gunman, terorist, gunmen, resistance group, resistance groups, oath administrater, oath administrators, passive wing members, resistance, suspect, suspected insurgents, terroist, terroists, terrost, africans, children, civilian, driver, employees, evangelist, family, farm boys, girls, informer, kikuyu, laborour, loyalist, masai, men, mission staff, owner, passengers, people, tugen tribesmen, stranger, sikh, herd boys, isiolo game scouts, farm labour, farmer, european, employer, employee, civilan, shopkeeper, students, teachers, turkana, vigilantes, women, workers, villagers, local labour, kikuyus, embu, tiriki houseboy, samburu, manager, woman, vetofficer, mrhiggins, masai party, kuria tribesmen, manager of akira estates, kuria tribesmen, chstephen, african, catholic misson staff, african staff, asian women, bus conductor, child, civilian(food carriers), civilian(schoolmaster), civilion, committee, committee member, courier, elder, embu tractor driver, employees of club, engine boy, girl, golf club staff, his own hut, hotel keeper, houseboy, illegal residents, indian, interpreter, kem, kikiyu, kikuyu assessor, kikuyu families, kikuyu houseboy, kikuyu labourer, kikyu, kirua village, labour line, labour lines, labourer, labourers, laboures, labourline, labours, males, man, maragoli, maragoli labourer, masai elders, masai tribesman, members of the thika committee, mna section leaders, municipal inspectors, non kikuyu employees, person, prostitutes, purke masai, pwd employee, railway employees, school master, school teacher, sisters committee, somali, staff, strangers, taxi drivers, teacher, treasurers, headman's son, norton traill's labour, gordon's labour, food carriersUnknown levels in `f`: ammunition, explosives, gelignite, firearms, arms, firearm, gun, pistol, rifle, ammunition, rifile, shotgun, verey pistol, other weapons, axe, scabbard, weapons, colonial authorities, councillor, district commissioner, district officer, forest ranger, game ranger, game warden, government, government employees, port authority, public works department, screening team, do, govrnment, wakamba screening team, do munuga, african do, dcmeru, colonial authorities, govtemployee, tribal authorities, chief, elders, headman, chief chostram, chief eliud, chief's sentry, private property, buildings, cattle dip, duka, farms, garage, homes, huts, hotel, land rover, lorry, market, office, oxcart, property, pump house, sawmill, shops, stores, tractor, vehicle, windmill, bullock's farm, cattle boma, coffe trees, coffee trees, cuthouse, dairy farm, dip, house, household, houses, hut, instrument, labour camp post, labour huts, lorries, lucerne sheds, maize shamba, milk factory, pig sty, private property, property of civilians, shop, store, thika fishing camp, vehicles, cash, funds, money, conductor's takings, banana, barley, bran, cabbage, coffee, corn, cream, crops, dairy, food, fruit, grain, honey, maize, meat, milk, oats, posho, potatoes, sugar, vegetable, wheat, food, food etc, food store, food stores, foodstuffs, fruits, grains, grains+cloth +money, green maize cobs, potato, potato store, potatos, skimmed milk, sugar cane, sugar maize, vegetables, vegitable garden, vegitables, wheat bags, wheat store, wheet, whisky, beast, cattle, cow, herd, livestock, pig, sheep, steer, stock, animal, bulls, calf, calves, chicken, cows, donkey, goat, goats, head of cattle, head of cow, head of sheep, heifer, heifers, lamb, live stock, livestock, livestocks, masai herd, milk cow, ox, ox cart, oxen, ram, red poll cattle, shee, sheep or ox, steers, stocks, medical supplies, medicine, m&b tablets, medicines, supplies, bags, bedding, blankets, books, charcoal, cloth, clothing, cooking utensils, cutlery, equipment, farm implements, household items, instruments, iron, pails, petrol, provisions, oil, sacks, supplies, tarpaulin, thatch, timber, tobacco, tools, uniforms, wire, wireless set, whiskey, articles, bag, battery, bucket, ciga, cigarettes, clothes, clothing etc, cloths, dairy item, dairy record book, goods, material, oil+tins, provisionv, railway uniforms, supplies, tarpaulian, typewriter, v- drive belts, gunny bags, church, airstrip, bridges, half built village, roads, trenches, water tank, bridge, bridge broken, bridge damaged, infrastructure, milt property, miltproperty, prison camp, stn damaged, school, school, school building, school house, school property, schools, bg, eg, embu guard, farm guard, forest guard, home guard, ikandine guard, kathanjure guard, kijabe guard, kikuyu guard, masai guard, meru guard, nandi guard, nkubu guard, stock guard, tigoni guard, tp and eg patrol, tp patrol, home guard patrol, m, m/g, m/g patrol, g, kathanjure hg, k g, ng, eg patrol, hg camp, hg leader, hg patrol, hg post, home, home guard, kg post, arab combat, arab combat unit, arab combat units, asian combat, asian combat unit, asian combat team, second asian combat unit, asian combat units, kings african rifles, 3 kar, 4 kar, 5 kar, 6 kar, 7 kar, 23 kar, 26 kar, k.a.r, k.p.r, k.a.r., 5th k.a.r, 5kar, 5 k.a.r, 4th kar, british military, devonshire regiment, devons, field intelligence assistant, field intelligence officer, fio, gloucestershire regiment, glosters, lancashire fusiliers, king's shropshire light infantry, royal east kent regiment, buffs, royal fusiliers, royal highland regiment, black watch, watch, royal inniskilling fusiliers, royal irish fusiliers, royal northumberland fusiliers, rnf, police and military, army, lancashire fusilliers, sp company 1 royal innisks, 1 rnf, rif, ksli, inniskillings, 1 glosters, 1 bw, 1 buffs, "a" company 1 royal innisks, "a" company, royal fusilers, of devons, of 1 glosters, lanc fus, fusiliers, fio kruger, fios, a co devon, 4 platoon support company, "c" company1 royal innisks, 6 platoonsp company 1 royal innisks, 1 lf, "c" company, "d" company, "a", "a" company bw, buffs ambush, d company, d' force, devens, c company, "d" force, army officer, british army officer, british military, buffs patrol, european officer, european soldiers, gloster patrol, kenya regiment, captain folliott’s team, kr, kenreg, kenregg, kenya regiment sergeant, kenya regt, keniya regiment, kenya regiment private, military (generic), captain, company, army, military property, platoon, security forces, security force, coy, striking force, sentry, non commissioned officers, patrol, sentrie, sgt white, psuedo gangs, pseudo gang, pseudo team, trojan, psuedo gangs, trojan team, tracker group, pseudo teams, royal air force, raf, bombers, air strike, harvards, raf lincolns, flying squard, paramilitary, general service unit, gsu, cid, kenya police, kp, kp constables' quarters, kpa, kenya police reserve, kpr officers, reserve police officer, rpo, rpos, police and k.p.r, police (generic), constable, polce, policy party, railway police, special branch, blue doctor team, special branch team, sb officers, githumu police, masai special constable, tribal police, tpeg, african constable, african costable, african special constable, tribal police, tribal police reserve, tpr, communities, manyatta, fishing camp, sublocation, village, camp, villages, detainees, prisoner, prisoners, suspected insurgents, bandits, food foragers, gangs, gang, kiama kia muingi, kkm, komerera, mau mau, oath administrator, passive wing, rebels, suspects, terrorists, terrorosts, terrorist, gunman, terorist, gunmen, resistance group, resistance groups, oath administrater, oath administrators, passive wing members, resistance, suspect, suspected insurgents, terroist, terroists, terrost, africans, children, civilian, driver, employees, evangelist, family, farm boys, girls, informer, laborour, loyalist, masai, men, mission staff, owner, passengers, people, tugen tribesmen, stranger, sikh, herd boys, isiolo game scouts, farm labour, farmer, european, employer, employee, civilan, shopkeeper, students, teachers, turkana, vigilantes, women, workers, villagers, labour, local labour, kikuyus, embu, tiriki houseboy, samburu, manager, woman, vetofficer, mrhiggins, masai party, kuria tribesmen, manager of akira estates, kuria tribesmen, chstephen, african, catholic misson staff, african staff, asian women, bus conductor, child, civilian(food carriers), civilian(schoolmaster), civilion, committee, committee member, courier, elder, embu tractor driver, employees of club, engine boy, girl, golf club staff, his own hut, hotel keeper, houseboy, illegal residents, indian, interpreter, kem, kikiyu, kikuyu assessor, kikuyu families, kikuyu houseboy, kikuyu labourer, kikyu, kirua village, labour line, labour lines, labourer, labourers, laboures, labourline, labours, males, man, maragoli, maragoli labourer, masai elders, masai tribesman, members of the thika committee, mna section leaders, municipal inspectors, non kikuyu employees, person, prostitutes, purke masai, pwd employee, railway employees, school master, school teacher, sisters committee, somali, staff, strangers, taxi drivers, teacher, treasurers, headman's son, norton traill's labour, gordon's labour, food carriers
lowlevelagg <- c(
  "church", "kenya police", "medicine", "tribal police reserve", "detainees", "kenya regiment", "other weapons",
  "paramilitary", "ammunition", "communities", "british military", "military (generic)", "tribal authorities", "kenya police reserve", "tribal police",
  "Kings African Rifles", "infrastructure", "school", "cash", "colonial authorities", "police (generic)", "supplies", "firearms", "food", "private property",
  "home guard", "civilians", "livestock", "suspected insurgents"
)
#events <- events %>%
#   mutate(target_clean_1_agglow=ifelse(target_clean_1_agglow  %in% lowlevelagg & !is.na(target_clean_1_agglow),target_clean_1_agglow, "uncategorized")) %>%
#   mutate(target_clean_2_agglow=ifelse(target_clean_2_agglow  %in% lowlevelagg & !is.na(target_clean_2_agglow),target_clean_2_agglow, "uncategorized")) %>% 
#   mutate(target_clean_3_agglow=ifelse(target_clean_3_agglow  %in% lowlevelagg & !is.na(target_clean_3_agglow),target_clean_3_agglow, "uncategorized"))
events$target_clean_1_agglow %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)
'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")
events[, c("target_clean_1_aggmed", "target_clean_2_aggmed", "target_clean_3_aggmed")] <-
  events[, c("target_clean_1_agglow", "target_clean_2_agglow", "target_clean_3_agglow")]
events <- events %>%
  mutate_at(
    vars(starts_with("initiator_clean_1_aggmed|initiator_clean_2_aggmed|initiator_clean_3_aggmed")),
    .funs = funs(forcats::fct_collapse(temp,
     'police'=c('cid','kenya police reserve','kenya police','police (generic)','railway police','special branch','tribal police','tribal police reserve') ,
     'military'=c('arab combat units','asian combat units','british military','Kings African Rifles','kenya regiment','military (generic)','psuedo gangs','royal air force'), 
     'civil authorities'=c('colonial authorities', 'tribal authorities'),
     'armaments'=c('ammunition','firearms','other weapons'),
     'provisions'=c('cash','food','livestock','medicine','supplies'),
     'public buildings'=c('church','school','infrastructure') 
     ))
  )
events$initiator_clean_1_aggmed %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)
'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")

events[, c("target_clean_1_agghigh", "target_clean_2_agghigh", "target_clean_3_agghigh")] <-
  events[, c("target_clean_1_aggmed", "target_clean_2_aggmed", "target_clean_3_aggmed")]
events <- events %>%
  mutate_at(
    vars(starts_with("target_clean_1_agghigh|target_clean_2_agghigh|target_clean_3_agghigh")),
    .funs = funs(forcats::fct_collapse(
                  'government'=c('civil authorities', 'home guard', 'military', 'police', 'paramilitary') ,
                  'rebels'=c('suspected insurgents','detainees') ,
                  'property'=c('armaments','private property','provisions','public buildings') ,
                  'civilians'=c('communities','communities')
          ))
  )

events$target_clean_1_agghigh %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)

Count of Initiators and Targets

# These numbers are estimates and can be changed
# These columns are dirty and when an incoherent value is given, it is set to missing.
recode_counts <- function(indata){
  acouple <- "2"
  afew <- "3"
  agang <- "6"
  agang_large <- "12"
  
  indata %>% tolower() %>% dplyr::recode(
    "100+"= "100",
    "??"= "",
    "1 bag"= "1",
    "1 blanket"= "1",
    "1 burnt down"= "1",
    "1 civilian"= "1",
    "1 cow, 6 sheep"= "7",
    "1 cow"= "1",
    "1 goat, clothing"= "1",
    "1 goat"= "1",
    "1 looted"= "1",
    "1 looted"= "1",
    "1 ox"= "1",
    "1 sheep and chickens"= "1",
    "1 sheep, some chickens"= "1",
    "1 sheep"= "1",
    "1 shotgun ,30 rounds"= "31",
    "1 shotgun + 10rds"= "11",
    "1 steer"= "1",
    "1 village, 1 market"= "1",
    "1 wounded"= "1",
    "1 wrecked"= "1",
    "1+"= "1",
    "1+3"= "4",
    "1+some"= "1",
    "10 acres"= "10",
    "10 bags"= "10",
    "10 cattle"= "10",
    "10 sacks"= "10",
    "10 to 12"= "11",
    "10 to 15"= "13",
    "10/14/2013"= "",
    "10/15/2013"= "",
    "10/20/2013"= "",
    "100 lb"= "100",
    "100-130"= "115",
    "100-150"= "125",
    "100+"= "100",
    "10000"= "",
    "109 cattle"= "109",
    "10bags potatoes"= "10",
    "11 cattle"= "11",
    "11 sheep"= "11",
    "112 bore & 20.1.45 &7 rds"= "112",
    "12 bags"= "12",
    "12 cattle"= "12",
    "12 goats"= "12",
    "12 to 15"= "13",
    "12 to 20"= "17",
    "12/14/2013"= "",
    "120 cattle"= "120",
    "120+1"= "121",
    "13 sheep"= "13",
    "13-15"= "14",
    "1300 worth"= "1300",
    "14 cattle"= "14",
    "14 goats"= "14",
    "14 head"= "14",
    "14+"= "14",
    "15 - 20"= "18",
    "15 cattle"= "15",
    "15 to 20"= "17",
    "15 to 20"= "17",
    "15 to 25"= "20",
    "15-20"= "17",
    "15+"= "15",
    "150-200"= "175",
    "150+"= "150",
    "151 cattle"= "151",
    "17 cattle"= "17",
    "172 bags burnt"= "172",
    "18 cattle"= "18",
    "19 bags"= "19",
    "196 rounds"= "196",
    "2 bags maize"= "2",
    "2 bags"= "2",
    "2 bags"= "2",
    "2 buckets"= "2",
    "2 cattle hamstrung"= "2",
    "2 cattle, corn"= "3",
    "2 cattle"= "2",
    "2 cows"= "2",
    "2 debbies"= "2",
    "2 goats"= "2",
    "2 groups"= "2",
    "2 huts burnt"= "2",
    "2 sheep"= "2",
    "2 watches, cash"= "2",
    "2/3/2013"= "",
    "2+"= "2",
    "20 bags maize, 9 goats, 32 chickens and ducks, cash"= "60",
    "20 bags"= "20",
    "20 cattle"= "20",
    "20 goats"= "20",
    "20 sheep"= "20",
    "20 to 25"= "23",
    "20 to 30"= "25",
    "20 to 40"= "30",
    "20-25"= "23",
    "20-30"= "25",
    "20-35"= "30",
    "20-50"= "35",
    "20/30"= "25",
    "20/30"= "25",
    "20+"= "20",
    "200 yds"= "200",
    "200-300"= "250",
    "200+"= "200",
    "2000 acres"= "2000",
    "21 goats"= "21",
    "21 head"= "21",
    "22 cattle"= "22",
    "25 to 30"= "28",
    "25-30"= "27",
    "25-30"= "27",
    "28 killed"= "28",
    "28 sheep"= "28",
    "3 bags"= "3",
    "3 bags"= "3",
    "3 bikes"= "3",
    "3 cattle"= "3",
    "3 cattle"= "3",
    "3 goats"= "3",
    "3 or 4"= "3",
    "3 or 4"= "3",
    "3 pangas"= "3",
    "3 sheep, 2 calves"= "5",
    "3 sheep"= "3",
    "3 to 4"= "3",
    "3 to 4"= "3",
    "3/10/2013"= "",
    "3/4/2013"= "",
    "3/5/2013"= "",
    "3/6/2013"= "",
    "3+"= "3",
    "3+3+1+2"= "9",
    "3+some"= "3",
    "30 acres"= "30",
    "30 cattle"= "30",
    "30 to 40"= "35",
    "30-35"= "33",
    "30-40"= "35",
    "30-50"= "40",
    "30+"= "30",
    "300-400"= "350",
    "300+"= "300",
    "35 bags"= "35",
    "35 to 40"= "37",
    "38 cattle"= "38",
    "3or 4"= "3",
    "4 bags potatoes"= "4",
    "4 bags"= "4",
    "4 goats"= "4",
    "4 groups"= "",
    "4 or 5"= "4",
    "4 oxen"= "4",
    "4 sheep"= "4",
    "4 to 8"= "6",
    "4/6/2013"= "",
    "40 bag"= "40",
    "40 cattle"= "40",
    "40 sacks"= "40",
    "40 sheep"= "40",
    "40 to 50"= "45",
    "40/50"= "45",
    "40-50"= "45",
    "400 cattle"= "400",
    "4000"= "",
    "40161"="",
    "44 cattle"= "44",
    "5 bags"= "5",
    "5 calves"= "5",
    "5 cattle"= "5",
    "5 destroyed"= "5",
    "5 goats"= "5",
    "5 killed"= "5",
    "5 or 6"= "5",
    "5 sheep, 1 ox"= "6",
    "5 sheep"= "5",
    "5 to 6"= "5",
    "5/10/2013"= "",
    "5/6/2013"= "",
    "50 cattle"= "50",
    "50 to 60"= "55",
    "50-100"= "75",
    "50-60"= "55",
    "50-75"= "62",
    "50+"= "50",
    "50+"= "50",
    "5000 acres"= "5000",
    "519 +"= "519",
    "53 detained"= "53",
    "54 sheep and goats"= "54",
    "56 committee members"= "56",
    "6 bag"= "6",
    "6 bags"= "6",
    "6 cattle"= "6",
    "6 cattle"= "6",
    "6 goats"= "6",
    "6 or 7"= "6",
    "6 sheep and goats"= "6",
    "6 sheep"= "6",
    "6 to 7"= "6",
    "6 to 8"= "7",
    "6 to 9"= "8",
    "6-8 man"= "7",
    "6/10/2013"= "",
    "6/8/2013"= "",
    "60-100"= "80",
    "60-70"= "65",
    "64 cattle"= "64",
    "7 bags"= "7",
    "7 cattle"= "7",
    "7 sheep"= "7",
    "7/10/2013"= "",
    "70 bags"= "70",
    "70 cattle, sheep"= "70",
    "70-100"= "85",
    "70000"= "",
    "75 rounds"= "75",
    "8 bags potatoes"= "8",
    "8 cattle"= "8",
    "8 cows slashed"= "8",
    "8 cows"= "8",
    "8 sheep"= "8",
    "8 to 10"= "9",
    "8/10/2013"= "",
    "80 cattle"= "80",
    "80-100"= "90",
    "84 sheep, 1 cow, 5 chickens"= "90",
    "9 cattle"= "9",
    "9 sheep"= "9",
    "9 to 10"= "9",
    "9+9"= "18",
    "900(not clear)"= "900",
    "all locals"= "",
    "all"= "",
    "app 5"= "5",
    "app. 100"= "100",
    "app. 120"= "120",
    "armed gang"= agang,
    "band"= agang,
    "bands"= "",
    "cattle slashing"= "",
    "clothing"= "",
    "considerable quantity"= "",
    "fairly large gang"= agang_large,
    "few bags"= "",
    "few"= "",
    "food"= "",
    "gang"= agang,
    "gangs"= agang_large,
    "guards"= afew,
    "half village"= "",
    "labour"= "",
    "large crowd"= "",
    "large force"= agang_large,
    "large gang"= agang_large,
    "large meeting"= "",
    "large number"= "",
    "large numbers"= "",
    "large quantities"= "",
    "large quantity"= "",
    "large re-oathing ceremony"= "",
    "large scale"= "",
    "large"= agang_large,
    "largish gang"= agang_large,
    "local populace"= "",
    "many thousand"= "2000",
    "mob"= "",
    "not given"= "",
    "number"= "",
    "occupants"= "",
    "over 200"= "200",
    "Party"= agang,
    "party"= agang,
    "patrol"= agang,
    "posho"= "",
    "potatoes"= "",
    "quantity of clothing"= "",
    "section"= "",
    "several gangs"= agang_large,
    "several"= "3",
    "sheep and goats"= "",
    "shs 2,300/-"= "2300",
    "shs 60/-"= "60",
    "shs. 1,000"= "1000",
    "shs. 18"= "18",
    "shs. 30"= "30",
    "small gang"= agang,
    "small gangs"= agang,
    "small group"= agang,
    "small party"= afew,
    "small"= agang,
    "some"= afew,
    "sufficient food"= "",
    "unknown"= "",
    "very large gang"= agang_large,
    "villages in ndia, gichugu, embu divisions"= "",
    "wives"= ""
  ) %>% as.numeric() %>% return()
  
}
events$initiator_numbers_numeric <- events$initiator_numbers %>% recode_counts()
NAs introduced by coercion
events$target_numbers_numeric <- events$target_numbers %>% recode_counts()
NAs introduced by coercion
events$affected_count_numeric <- events$affected_count %>% recode_counts()
NAs introduced by coercion

Casualties

events[, c(
  "government_killed_clean", "government_wounded_clean", "government_captured_clean",
  "rebels_killed_clean", "rebels_wounded_clean", "rebels_captured_clean",
  "civilians_killed_clean", "civilians_wounded_clean", "civilians_captured_clean"
)] <-
  events[, c(
    "government_killed", "government_wounded", "government_captured",
    "rebels_killed", "rebels_wounded", "rebels_captured",
    "civilians_killed", "civilians_wounded", "civilians_captured"
  )]
events <- events %>% mutate_at(
  .vars = c(
    "government_killed_clean", "government_wounded_clean", "government_captured_clean",
    "rebels_killed_clean", "rebels_wounded_clean", "rebels_captured_clean",
    "civilians_killed_clean", "civilians_wounded_clean", "civilians_captured_clean"
  ),
  funs(as.numeric(forcats::fct_collapse(.,
                                  '1'=c('unKnown','unknown','UnKnown','UNKNOWN','Unkown','Unknown','Number','More','101','146','122','208','94'),
                                  '2'=c('Few','others','Few','some'),
                                  '3'=c('Many','Sevaral','several','Several More','Several others','Some','Council of elders','Council of war','Several','Majority','many','Gang','Several','Small gang','3+'),
                                  '100'='100+',
                                  '23'='23 Families',
                                  '28'='28 families',
                                  '35'='30-40',
                                  '50'='50+',
                                  '45'='4500', 
                                  '80'='800', 
                                  '6'='6+' , 
                                  '10'='10+' ,
                                  '10197'=NA,
                                  '7'='48') %>%
                    fct_explicit_na(na_level='0')
                  )
       )
)

Unknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Unknown, Number, More, 146, 122, 208, 94, Few, others, Few, Many, Sevaral, several, Several More, Several others, Council of elders, Council of war, Several, Majority, many, Gang, Several, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NA, 48Unknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Unknown, Number, More, 101, 146, 122, 208, 94, Few, others, Few, some, Many, Sevaral, several, Several More, Several others, Some, Council of elders, Council of war, Several, Majority, many, Gang, Several, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NA, 48Unknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Unknown, Number, More, 101, 146, 122, 208, 94, Few, others, Few, some, Many, Sevaral, several, Several More, Several others, Some, Council of elders, Council of war, Several, Majority, many, Gang, Several, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NA, 48Unknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Number, More, 101, 146, 122, 208, 94, Few, others, Few, some, Sevaral, several, Several More, Several others, Council of elders, Council of war, Majority, many, Gang, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NAUnknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Unknown, Number, 101, 146, 122, 208, some, Council of elders, Council of war, Majority, many, Gang, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 10+, NAUnknown levels in f: More, 101, 146, 122, 208, 94, others, Many, Sevaral, Several More, Several others, 6+, NAUnknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Unknown, Number, More, 101, 146, 122, 208, 94, Few, others, Few, some, Many, Sevaral, several, Several More, Several others, Council of elders, Council of war, Several, Majority, many, Gang, Several, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NA, 48Unknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Unknown, Number, More, 101, 146, 122, 208, 94, Few, others, Few, some, Many, Sevaral, several, Several More, Several others, Some, Council of elders, Council of war, Several, Majority, many, Gang, Several, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NA, 48Unknown levels in f: unKnown, unknown, UnKnown, UNKNOWN, Unkown, Number, More, 101, 146, 122, 208, 94, Few, others, Few, some, Sevaral, Several More, Several others, Some, Council of elders, Council of war, Majority, many, Gang, Small gang, 3+, 100+, 23 Families, 28 families, 30-40, 50+, 4500, 800, 6+, 10+, NA, 48

events <- events %>% mutate_at(.vars = c(
  "government_killed_clean", "government_wounded_clean", "government_captured_clean",
  "rebels_killed_clean", "rebels_wounded_clean", "rebels_captured_clean",
  "civilians_killed_clean", "civilians_wounded_clean", "civilians_captured_clean"
), funs(as.numeric))
events <- events %>%
  mutate(rebels_killedwounded_clean = rebels_killed_clean + rebels_wounded_clean) %>%
  mutate(government_killed_wounded_clean = government_killed_clean + government_wounded_clean) %>%
  mutate(rebels_government_killedwounded_clean = rebels_killed_clean + rebels_wounded_clean) %>%
  mutate(rebels_government_killed_clean = rebels_killed_clean + government_killed_clean) %>%
  mutate(rebels_government_civilians_killed_clean = rebels_killed_clean + government_killed_clean + civilians_killed_clean)
events %>% janitor::crosstab(initiator_clean_1_agghigh, type_clean_agghigh) %>% janitor::adorn_crosstab(digits = 1)
'janitor::crosstab' is deprecated.
Use 'tabyl(dat, var1, var2, ...)' instead.
See help("Deprecated")Factor `type_clean_agghigh` contains implicit NA, consider using `forcats::fct_explicit_na`'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")
events %>% janitor::crosstab(target_clean_1_agghigh, type_clean_agghigh) %>% janitor::adorn_crosstab(digits = 1)
'janitor::crosstab' is deprecated.
Use 'tabyl(dat, var1, var2, ...)' instead.
See help("Deprecated")Factor `type_clean_agghigh` contains implicit NA, consider using `forcats::fct_explicit_na`'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")
events %>% janitor::crosstab(target_clean_1_agghigh, initiator_clean_1_agghigh) %>% janitor::adorn_crosstab(digits = 1)
'janitor::crosstab' is deprecated.
Use 'tabyl(dat, var1, var2, ...)' instead.
See help("Deprecated")'janitor::adorn_crosstab' is deprecated.
Use 'use the various adorn_ functions instead.  See the "tabyl" vignette for examples.' instead.
See help("Deprecated")

Clean Map Coordinates (East Africa Grid System)

cat("\014")

#Cases to handle
#"928141"
#"311449  328445    338443"
#"EASTING 30 and 27"
#"EastLeigh Sect.7"
#"FARM 535/4"
#"HAC  0202"
#"HAC.577236"
#"HZN 974641 & HZN 974651"
#"HZJ. 8595"
#"HZJ. 465765, HZJ. 459771, HZJ. 451756"
#"HZJ 42765, HZJ 42375and HZJ 429761"
#"HZH 960610, HZH 960630, HZH 977538"
#"H.Z.R. 4786"
#"HAD 1708, HAD 1709"
#"HAD 3326/3327"
#"HZJ 42765, HZJ 42375and HZJ 429761"
#"HZJ 9518  9617"
#"HZP 7430, HZP 9029, HZP 6448, HZP 7252, HZP 9448"
events$map_coordinate %>% janitor::tabyl() 
                        .  n      percent valid_percent
                       ??  1 9.552011e-05  0.0001717918
                     1182  1 9.552011e-05  0.0001717918
                     1200  1 9.552011e-05  0.0001717918
                    12053  1 9.552011e-05  0.0001717918
                    12402  1 9.552011e-05  0.0001717918
                     1280  1 9.552011e-05  0.0001717918
                     1281  1 9.552011e-05  0.0001717918
                     1663  1 9.552011e-05  0.0001717918
                   184157  1 9.552011e-05  0.0001717918
                     1870  2 1.910402e-04  0.0003435836
                     1914  1 9.552011e-05  0.0001717918
                     2113  1 9.552011e-05  0.0001717918
                     2122  1 9.552011e-05  0.0001717918
                   214123  1 9.552011e-05  0.0001717918
                   223348  1 9.552011e-05  0.0001717918
                     2287  1 9.552011e-05  0.0001717918
                     2314  1 9.552011e-05  0.0001717918
                     2396  1 9.552011e-05  0.0001717918
                     2405  1 9.552011e-05  0.0001717918
                     2407  1 9.552011e-05  0.0001717918
                     2410  1 9.552011e-05  0.0001717918
                     2555  1 9.552011e-05  0.0001717918
                     2575  1 9.552011e-05  0.0001717918
                     2608  3 2.865603e-04  0.0005153754
                     2619  1 9.552011e-05  0.0001717918
                   270527  1 9.552011e-05  0.0001717918
                     2722  1 9.552011e-05  0.0001717918
                     2727  1 9.552011e-05  0.0001717918
                     2753  1 9.552011e-05  0.0001717918
                     2832  1 9.552011e-05  0.0001717918
                     2849  1 9.552011e-05  0.0001717918
                     2854  1 9.552011e-05  0.0001717918
                     2862  1 9.552011e-05  0.0001717918
                     2863  1 9.552011e-05  0.0001717918
                   287428  1 9.552011e-05  0.0001717918
                     2904  1 9.552011e-05  0.0001717918
                     2923  1 9.552011e-05  0.0001717918
                     2924  1 9.552011e-05  0.0001717918
                     2932  1 9.552011e-05  0.0001717918
                    29774  1 9.552011e-05  0.0001717918
                     3021  1 9.552011e-05  0.0001717918
                     3025  2 1.910402e-04  0.0003435836
   3045  3545  3540  3141  1 9.552011e-05  0.0001717918
                   310189  1 9.552011e-05  0.0001717918
 311449  328445    338443  1 9.552011e-05  0.0001717918
                   315505  1 9.552011e-05  0.0001717918
                     3210  1 9.552011e-05  0.0001717918
                     3257  1 9.552011e-05  0.0001717918
                     3342  1 9.552011e-05  0.0001717918
                     3344  1 9.552011e-05  0.0001717918
                     3351  1 9.552011e-05  0.0001717918
                     3357  2 1.910402e-04  0.0003435836
                   341088  1 9.552011e-05  0.0001717918
                     3555  1 9.552011e-05  0.0001717918
                    36334  1 9.552011e-05  0.0001717918
                     3705  1 9.552011e-05  0.0001717918
                     3709  1 9.552011e-05  0.0001717918
                     3727  1 9.552011e-05  0.0001717918
                     3730  1 9.552011e-05  0.0001717918
                     3743  1 9.552011e-05  0.0001717918
                   375197  1 9.552011e-05  0.0001717918
                     3761  2 1.910402e-04  0.0003435836
                     3833  2 1.910402e-04  0.0003435836
                     3849  1 9.552011e-05  0.0001717918
                     3854  1 9.552011e-05  0.0001717918
                     4021  1 9.552011e-05  0.0001717918
                     4030  1 9.552011e-05  0.0001717918
                     4052  1 9.552011e-05  0.0001717918
                     4126  1 9.552011e-05  0.0001717918
                     4152  3 2.865603e-04  0.0005153754
                     4467  1 9.552011e-05  0.0001717918
                     4646  1 9.552011e-05  0.0001717918
               4872  5271  1 9.552011e-05  0.0001717918
                     5030  1 9.552011e-05  0.0001717918
                   506413  1 9.552011e-05  0.0001717918
                   511558  1 9.552011e-05  0.0001717918
                     5152  1 9.552011e-05  0.0001717918
                     5155  1 9.552011e-05  0.0001717918
                     5246  1 9.552011e-05  0.0001717918
                     5249  1 9.552011e-05  0.0001717918
                     5317  1 9.552011e-05  0.0001717918
                     5448  1 9.552011e-05  0.0001717918
                   552197  1 9.552011e-05  0.0001717918
                     5627  1 9.552011e-05  0.0001717918
                      563  1 9.552011e-05  0.0001717918
                     5720  1 9.552011e-05  0.0001717918
                   587361  1 9.552011e-05  0.0001717918
                   600570  1 9.552011e-05  0.0001717918
                     6020  1 9.552011e-05  0.0001717918
                     6050  2 1.910402e-04  0.0003435836
                   610340  1 9.552011e-05  0.0001717918
                     6154  2 1.910402e-04  0.0003435836
                     6225  2 1.910402e-04  0.0003435836
                    63343  1 9.552011e-05  0.0001717918
                     6424  1 9.552011e-05  0.0001717918
                   644526  1 9.552011e-05  0.0001717918
                     6452  2 1.910402e-04  0.0003435836
                     6638  1 9.552011e-05  0.0001717918
                     6640  1 9.552011e-05  0.0001717918
                     6654  1 9.552011e-05  0.0001717918
                     6740  1 9.552011e-05  0.0001717918
                      677  1 9.552011e-05  0.0001717918
                     6825  1 9.552011e-05  0.0001717918
                     6826  1 9.552011e-05  0.0001717918
                     7039  1 9.552011e-05  0.0001717918
                     7050  1 9.552011e-05  0.0001717918
                     7196  1 9.552011e-05  0.0001717918
                     7247  2 1.910402e-04  0.0003435836
                     7248  1 9.552011e-05  0.0001717918
                     7397  1 9.552011e-05  0.0001717918
                     7552  1 9.552011e-05  0.0001717918
                      757  1 9.552011e-05  0.0001717918
                     7570  1 9.552011e-05  0.0001717918
                     7754  2 1.910402e-04  0.0003435836
                     8134  1 9.552011e-05  0.0001717918
                     8153  1 9.552011e-05  0.0001717918
                     8345  1 9.552011e-05  0.0001717918
                     8351  1 9.552011e-05  0.0001717918
                    85154  1 9.552011e-05  0.0001717918
                     8516  1 9.552011e-05  0.0001717918
                     8556  1 9.552011e-05  0.0001717918
                   878560  1 9.552011e-05  0.0001717918
                     9245  2 1.910402e-04  0.0003435836
                   928141  1 9.552011e-05  0.0001717918
                     9649  1 9.552011e-05  0.0001717918
        EASTING 30 and 27  1 9.552011e-05  0.0001717918
         EastLeigh Sect.7  1 9.552011e-05  0.0001717918
               FARM 535/4  1 9.552011e-05  0.0001717918
                 GZM 6590  1 9.552011e-05  0.0001717918
                 H?? 4397  1 9.552011e-05  0.0001717918
               H.D.597254  1 9.552011e-05  0.0001717918
              H.Z.R. 4786  2 1.910402e-04  0.0003435836
                 HAA 8106  1 9.552011e-05  0.0001717918
                HAB  7310  2 1.910402e-04  0.0003435836
                 HAB 0535  1 9.552011e-05  0.0001717918
                 HAB 0578  1 9.552011e-05  0.0001717918
                 HAB 1316  2 1.910402e-04  0.0003435836
                 HAB 2106  1 9.552011e-05  0.0001717918
                 HAB 2244  1 9.552011e-05  0.0001717918
                 HAB 5640  1 9.552011e-05  0.0001717918
                 HAB 5806  4 3.820804e-04  0.0006871672
                 HAB 5830  1 9.552011e-05  0.0001717918
                 HAB 6232  2 1.910402e-04  0.0003435836
                 HAB 6234  1 9.552011e-05  0.0001717918
                 HAB 6305  1 9.552011e-05  0.0001717918
                 HAB 6401  1 9.552011e-05  0.0001717918
                 HAB 6403  1 9.552011e-05  0.0001717918
                 HAB 6405  1 9.552011e-05  0.0001717918
                 HAB 6505  5 4.776005e-04  0.0008589589
                 HAB 6507  1 9.552011e-05  0.0001717918
                 HAB 6609  2 1.910402e-04  0.0003435836
                 HAB 6630  1 9.552011e-05  0.0001717918
                 HAB 6639  2 1.910402e-04  0.0003435836
               HAB 670100  1 9.552011e-05  0.0001717918
                 HAB 6707  3 2.865603e-04  0.0005153754
                 HAB 6709  1 9.552011e-05  0.0001717918
                 HAB 6710  1 9.552011e-05  0.0001717918
                 HAB 6734  3 2.865603e-04  0.0005153754
                 HAB 6788  1 9.552011e-05  0.0001717918
                 HAB 6804  2 1.910402e-04  0.0003435836
                 HAB 6807  2 1.910402e-04  0.0003435836
                 HAB 6811  1 9.552011e-05  0.0001717918
                 HAB 6818  3 2.865603e-04  0.0005153754
                 HAB 6829  1 9.552011e-05  0.0001717918
                 HAB 6841  2 1.910402e-04  0.0003435836
                 HAB 6904  2 1.910402e-04  0.0003435836
                 HAB 6908  1 9.552011e-05  0.0001717918
                 HAB 6913  1 9.552011e-05  0.0001717918
                 HAB 6921  4 3.820804e-04  0.0006871672
                 HAB 6941  1 9.552011e-05  0.0001717918
                 HAB 7001  1 9.552011e-05  0.0001717918
                 HAB 7002  1 9.552011e-05  0.0001717918
                 HAB 7013  1 9.552011e-05  0.0001717918
                 HAB 7016  1 9.552011e-05  0.0001717918
                 HAB 7024  1 9.552011e-05  0.0001717918
                 HAB 7040  1 9.552011e-05  0.0001717918
                 HAB 7045  1 9.552011e-05  0.0001717918
                 HAB 7102  1 9.552011e-05  0.0001717918
                 HAB 7107  1 9.552011e-05  0.0001717918
                 HAB 7135  1 9.552011e-05  0.0001717918
                 HAB 7145  1 9.552011e-05  0.0001717918
                 HAB 7200  2 1.910402e-04  0.0003435836
                 HAB 7208  1 9.552011e-05  0.0001717918
                 HAB 7211  1 9.552011e-05  0.0001717918
                 HAB 7214  2 1.910402e-04  0.0003435836
                 HAB 7216  1 9.552011e-05  0.0001717918
                 HAB 7231 11 1.050721e-03  0.0018897097
                 HAB 7302  1 9.552011e-05  0.0001717918
                 HAB 7305  1 9.552011e-05  0.0001717918
                 HAB 7308  1 9.552011e-05  0.0001717918
                 HAB 7315  2 1.910402e-04  0.0003435836
                 HAB 7316  1 9.552011e-05  0.0001717918
                 HAB 7405  1 9.552011e-05  0.0001717918
                 HAB 7413  2 1.910402e-04  0.0003435836
                 HAB 7419  1 9.552011e-05  0.0001717918
                 HAB 7501  3 2.865603e-04  0.0005153754
                 HAB 7511  1 9.552011e-05  0.0001717918
                 HAB 7519  1 9.552011e-05  0.0001717918
                 HAB 7526  1 9.552011e-05  0.0001717918
               HAB 753068  1 9.552011e-05  0.0001717918
                 HAB 7605  1 9.552011e-05  0.0001717918
                 HAB 7611  1 9.552011e-05  0.0001717918
                 HAB 7624  4 3.820804e-04  0.0006871672
                 HAB 7630  1 9.552011e-05  0.0001717918
                 HAB 7655  1 9.552011e-05  0.0001717918
                 HAB 7702  1 9.552011e-05  0.0001717918
                 HAB 7712  1 9.552011e-05  0.0001717918
                 HAB 7801  4 3.820804e-04  0.0006871672
                 HAB 7803  1 9.552011e-05  0.0001717918
                 HAB 7807  1 9.552011e-05  0.0001717918
                 HAB 7810  1 9.552011e-05  0.0001717918
                 HAB 7813  1 9.552011e-05  0.0001717918
                 HAB 7815  5 4.776005e-04  0.0008589589
                 HAB 7852  2 1.910402e-04  0.0003435836
                 HAB 7912  1 9.552011e-05  0.0001717918
                 HAB 7933  3 2.865603e-04  0.0005153754
                 HAB 8000  1 9.552011e-05  0.0001717918
                 HAB 8002  1 9.552011e-05  0.0001717918
                 HAB 8003  1 9.552011e-05  0.0001717918
                 HAB 8010  9 8.596810e-04  0.0015461261
                 HAB 8017  1 9.552011e-05  0.0001717918
                 HAB 8027  1 9.552011e-05  0.0001717918
                 HAB 8125 10 9.552011e-04  0.0017179179
                 HAB 8132  1 9.552011e-05  0.0001717918
                 HAB 8200  1 9.552011e-05  0.0001717918
                 HAB 8226  1 9.552011e-05  0.0001717918
                 HAB 8300  4 3.820804e-04  0.0006871672
                 HAB 8303  1 9.552011e-05  0.0001717918
                 HAB 8321  1 9.552011e-05  0.0001717918
                 HAB 8409  3 2.865603e-04  0.0005153754
                 HAB 8423  1 9.552011e-05  0.0001717918
                 HAB 8509  1 9.552011e-05  0.0001717918
                 HAB 8524  1 9.552011e-05  0.0001717918
                 HAB 8604  1 9.552011e-05  0.0001717918
                 HAB 8605  4 3.820804e-04  0.0006871672
                 HAB 8606  3 2.865603e-04  0.0005153754
                 HAB 8710  3 2.865603e-04  0.0005153754
                 HAB 8714  2 1.910402e-04  0.0003435836
                 HAB 8803  1 9.552011e-05  0.0001717918
                 HAB 8906  3 2.865603e-04  0.0005153754
               HAB 895250  1 9.552011e-05  0.0001717918
                 HAB 9002  1 9.552011e-05  0.0001717918
                 HAB 9102  1 9.552011e-05  0.0001717918
                 HAB 9103  1 9.552011e-05  0.0001717918
                 HAB 9117  1 9.552011e-05  0.0001717918
                 HAB 9127  2 1.910402e-04  0.0003435836
                 HAB 9129  1 9.552011e-05  0.0001717918
                 HAB 9204  1 9.552011e-05  0.0001717918
                 HAB 9227  2 1.910402e-04  0.0003435836
                 HAB 9229  1 9.552011e-05  0.0001717918
 [ reached 'max' / getOption("max.print") -- omitted 3774 rows ]
events$map_coordinate_clean <- events$map_coordinate %>% stringr::str_replace_all("[[:punct:]]| ", "") 
(events$map_coordinate_clean_length <- events$map_coordinate_clean %>% nchar() ) %>% janitor::tabyl() %>% round(3)
  .    n percent valid_percent
  0    1   0.000         0.000
  3   10   0.001         0.002
  4  110   0.011         0.019
  5   11   0.001         0.002
  6   29   0.003         0.005
  7 3155   0.301         0.542
  8   38   0.004         0.007
  9 2414   0.231         0.415
 10    6   0.001         0.001
 11   10   0.001         0.002
 12    1   0.000         0.000
 13    2   0.000         0.000
 14   12   0.001         0.002
 15    1   0.000         0.000
 16    3   0.000         0.001
 18    7   0.001         0.001
 19    3   0.000         0.001
 20    1   0.000         0.000
 27    5   0.000         0.001
 28    1   0.000         0.000
 35    1   0.000         0.000
 NA 4648   0.444            NA
(events$map_coordinate_clean_text <- events$map_coordinate_clean %>% gsub("[0-9]", "\\1",.)) %>% janitor::tabyl()  %>% mutate_if(is.numeric, round,2) #Split into a text component and numeric component
(events$map_coordinate_clean_number <- events$map_coordinate_clean %>% gsub("[A-Za-z]", "\\1", .) ) %>% janitor::tabyl()  %>% mutate_if(is.numeric, round,2)
(events$map_coordinate_clean_text_band <- events$map_coordinate_clean_text %>% substring(1,1) ) %>% janitor::tabyl()  %>% mutate_if(is.numeric, round,2)
(events$map_coordinate_clean_text_block <- events$map_coordinate_clean_text %>% substring(2,2) ) %>% janitor::tabyl()  %>% mutate_if(is.numeric, round,2)
(events$map_coordinate_clean_text_subblock <-  events$map_coordinate_clean_text %>%  substring(3,3) ) %>% janitor::tabyl()  %>% mutate_if(is.numeric, round,2)
(events$map_coordinate_clean_number_length <- events$map_coordinate_clean_number %>% nchar() ) %>% janitor::tabyl()  %>% mutate_if(is.numeric, round,2)
(events$map_coordinate_clean_number_easting <- events$map_coordinate_clean_number %>%
                                              substring(1, events$map_coordinate_clean_number_length/2) %>% as.numeric() ) %>%
                                              janitor::tabyl()  %>% mutate_if(is.numeric, round,2)
(events$map_coordinate_clean_number_northing <- events$map_coordinate_clean_number %>%
                                              substring(events$map_coordinate_clean_number_length/2+1, events$map_coordinate_clean_number_length) %>%
                                              as.numeric() )  %>%
                                              janitor::tabyl()  %>% mutate_if(is.numeric, round,2)

Convert Coordinates to lat long

#
cat("\014")
print("Starting Converting Coordinates, may take some time")
for(i in 1:nrow(events)){
  # print(i)
  #The “exposition” pipe operator, %$% exposes the names within the left-hand side object to the right-hand side expression. Essentially, it is a short-hand for using the with functions 
  suppressMessages({
    temp <- with(events[i,] ,
                 MeasuringLandscape:::EAGS2LatLong(band=map_coordinate_clean_text_band,
                                        block=map_coordinate_clean_text_block,
                                        subblock=map_coordinate_clean_text_subblock,
                                        easting=map_coordinate_clean_number_easting , 
                                        northing=map_coordinate_clean_number_northing)
    )
    events$map_coordinate_clean_latitude[i] <- temp$latitude
    events$map_coordinate_clean_longitude[i] <- temp$longitude
  })
  #print(is.na(events$map_coordinate_clean_latitude[i]))
}
print("Finished Converting Coordinates")
#(temp <- events %>% mutate(map_coordinate_clean_row=1:n()) %>% filter(is.na(map_coordinate_clean_latitude) & !is.na(map_coordinate_clean)) %>% select(starts_with("map_coordinate_clean")) ) %>% distinct() %>% print(n=40) #visualize errors
#dim(temp) #195 coordinates don't convert.
testing=F
if(testing){
  i=3684
  events[i,] %>%  select(starts_with("map_coordinate_clean")) %$% EAGS2LatLong(band=map_coordinate_clean_text_band,
                                                                              block=map_coordinate_clean_text_block,
                                                                              subblock=map_coordinate_clean_text_subblock,
                                                                              easting=map_coordinate_clean_number_easting , 
                                                                              northing=map_coordinate_clean_number_northing)
  
  with(events[i,], map_coordinate_clean)
  with(events[i,], map_coordinate)
  band <- with(events[i,], map_coordinate_clean_text_band)
  block <- with(events[i,],map_coordinate_clean_text_block)
  subblock <- with(events[i,],map_coordinate_clean_text_subblock) #
  easting <- with(events[i,],map_coordinate_clean_number_easting)
  northing <- with(events[i,],map_coordinate_clean_number_northing)
}
stats::quantile(events$map_coordinate_clean_latitude, probs =c(.005,.01,.1,.5,.9,.99,.995), na.rm=T, type=9) 
      0.5%         1%        10%        50%        90%        99%      99.5% 
-1.7190692 -1.5442831 -1.0403576 -0.4886414  0.0452442  0.7058103  2.2342679 
stats::quantile(events$map_coordinate_clean_longitude, probs =c(.005,.01,.1,.5,.9,.99,.995), na.rm=T, type=9)
    0.5%       1%      10%      50%      90%      99%    99.5% 
35.67124 35.78910 36.36309 36.93511 37.45506 38.26145 39.87161 
#plot(events$map_coordinate_clean_longitude,events$map_coordinate_clean_latitude) #plot with the outliers
#This is just to remove absolutely clear outliers. Not to set the region of interest.
#Outlier Bounding Box:
#NE 4.62933, 41.899059
#SW -4.71712, 33.90884
events$map_coordinate_clean_latitude[events$map_coordinate_clean_latitude < -4.71712 |
                                      events$map_coordinate_clean_latitude>4.62933] <- NA
events$map_coordinate_clean_longitude[events$map_coordinate_clean_longitude < 33.90884 |
                                      events$map_coordinate_clean_longitude>41.899059] <- NA
plot(events$map_coordinate_clean_longitude,events$map_coordinate_clean_latitude)

District of Document

cat("\014")

#clean document district
events$document_district_clean <- events$document_district %>% stringi::stri_trans_totitle() %>% stringr::str_trim() %>% as.factor()
events$document_district_clean <- events$document_district_clean %>% forcats::fct_collapse( 
                                   'Embu'=c('Embu-Fort Hall Border'),
                                   'Baringo'=c('BARINGO'),
                                   'FORT HALL'=c('Fort Hall'),
                                   'Naivasha'=c('Naviasha'),
                                   'Nyeri' = c('Nyeri Settled Area'),
                                   'Nyeri' = c('South Nyeri Reserve') ,
                                   'Nairobi' = c('Jock Scott'),
                                   NULL=c('',' ' ,'Document District','Kitui','Matathia', 'H/M','Reference Serial')
)

Unknown levels in f: BARINGO

events$document_unit_type <- NA
condition <- events$document_district_clean %in% c("Rift Valley","Central Province"); table(condition)

condition FALSE TRUE 9278 1191

events$document_unit_type[condition] <- "Province"
#Jock Scott Nairobi City
condition <- events$document_district_clean %in% c("Nairobi"); table(condition)

condition FALSE TRUE 10075 394

events$document_unit_type[condition] <- "City"
condition <- events$document_district %in% c("JOCK SCOTT"); table(condition)

condition FALSE TRUE 10357 112

events$document_unit_type[condition] <- "Operation Jock Scott"
#Missing? Elgeyo/Marakwet
#Baringo, , Embu, Fort Hall, Kajiado, Kiambu, Kitui, Laikipia, Machakos, Meru, Naivasha, Nakuru, Nanyuki, Narok, Nyeri, Thika
condition <- events$document_district_clean %in% c("Baringo","Embu","Fort Hall","Kajiado","Kiambu",
                                                 "Laikipia","Machakos","Meru","Naivasha","Nakuru",
                                                  "Nanyuki","Narok","Nyeri","Thika"); table(condition)

condition FALSE TRUE 2808 7661

events$document_unit_type[condition] <- "District"
events$document_unit_type %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)

‘janitor::adorn_crosstab’ is deprecated. Use ‘use the various adorn_ functions instead. See the “tabyl” vignette for examples.’ instead. See help(“Deprecated”)

events$document_district_clean  %>%
  janitor::tabyl(sort = TRUE) %>%
  janitor::adorn_crosstab(digits = 1)

Factor dat contains implicit NA, consider using forcats::fct_explicit_na‘janitor::adorn_crosstab’ is deprecated. Use ‘use the various adorn_ functions instead. See the “tabyl” vignette for examples.’ instead. See help(“Deprecated”)

Handle suffixes and directions

# Now we need to handle suffixes and combined locations
# "farm" now is followed by things because they crunched in additional location info at the end
## "coles estate farm
## agriculture experimental farm
## demonstration farm
## "farm near churo"
## reubens farm near churo
################################################
events$location_text_ruleclean <- events$location_text %>% stringr::str_trim() %>% tolower()
events <- events %>% 
          dplyr::select(-one_of("location_text_ruleclean_connector_prefix","location_text_ruleclean_connector_suffix")) %>%  #this intentionally throws a warning
          tidyr ::separate(col=location_text_ruleclean,
                    into=c("location_text_ruleclean_connector_prefix","location_text_ruleclean_connector_suffix"),
                    sep = " of | near ", remove=F, extra="drop", fill="right")
Unknown columns: `location_text_ruleclean_connector_prefix`, `location_text_ruleclean_connector_suffix`
events <- events %>% mutate(name_clean=stringr::str_trim(tolower(location_text))) %>%
           mutate(name_clean_posessive=grepl("'s|`s",name_clean)) %>%
           mutate(name_cleaner=trimws(name_clean)  ) %>%
           mutate(name_cleaner=gsub("'s|`s","",name_cleaner, fixed=T)  ) %>%
           mutate(name_cleaner= stringr::str_replace_all(name_cleaner, "[[:punct:]]|`", "")  ) %>% 
           mutate(name_cleaner= stringr::str_replace_all(name_cleaner, "[^[:alnum:] ]", "")  ) %>%  #removes all the weird unicode and ascii
           mutate(name_cleaner=trimws(name_cleaner)  ) %>%
           mutate(name_cleaner_nospace= stringr::str_replace_all(name_cleaner, " ", "") )

Create a Simple Features Version GIS Version

events_sf <- events %>% # filter(!is.na(longitude) & !is.na(latitude))  %>%
  distinct() %>%
  # filter( between(longitude, 30.0,45.0)  )  %>%  #Flag ROI but don't subset on it yet
  # filter( between(latitude, -5.0,5.0) ) %>%
  mutate(name_clean = stringr::str_trim(tolower(location_text))) %>%
  mutate(name_clean_posessive = grepl("'s|`s", name_clean)) %>%
  mutate(name_cleaner = trimws(name_clean)) %>%
  mutate(name_cleaner = gsub("'s|`s", "", name_cleaner, fixed = T)) %>%
  mutate(name_cleaner = stringr::str_replace_all(name_cleaner, "[[:punct:]]|`", "")) %>%
  mutate(name_cleaner = trimws(name_cleaner)) %>%
  mutate(name_cleaner_nospace = stringr::str_replace_all(name_cleaner, " ", ""))
# Avoid creating geometries where one of the two is NA
events_sf$map_coordinate_clean_longitude[is.na(events_sf$map_coordinate_clean_latitude)] <- NA
events_sf$map_coordinate_clean_latitude[is.na(events_sf$map_coordinate_clean_longitude)] <- NA
#events_sf$event_hash <- NULL #Make sure we're not hashing on the previous hash which might be a random walk
events_sf <- events_sf %>%
            sf::st_as_sf(coords = c("map_coordinate_clean_longitude", "map_coordinate_clean_latitude"),
                     crs = 4326, agr = "constant", remove = F, na.fail = F) # %>% 
             #mutate(event_hash = apply(., 1, digest, algo="xxhash64") ) #Do this once and only once
valid <- sf::st_is_valid(events_sf$geometry); table(valid)
valid
 TRUE 
10469 
eventsnames_sf <- events_sf %>% 
  select("name_cleaner", "geometry") %>% 
  setNames(c("name", "geometry")) %>% 
  mutate(source_dataset = "events")

Output Cleaned Files

saveRDS(events_sf, glue::glue(getwd(), "/../inst/extdata/events_sf.Rdata"))
LS0tCnRpdGxlOiAiMDEgUHJlcCBFdmVudHMgQ291bnRzIgphdXRob3I6ICJSZXggVy4gRG91Z2xhc3MgYW5kIEtyaXN0ZW4gSGFya25lc3MiCmRhdGU6ICJNYXJjaCA5LCAyMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQo8c3R5bGU+CiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQo8L3N0eWxlPgoKClRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgcGFwZXIgIk1lYXN1cmluZyB0aGUgTGFuZHNjYXBlIG9mIENpdmlsIFdhci4iIAoKSW4gdGhpcyBmaWxlLCBhIHJhdyBjc3YgZmlsZSBvZiB0aGUgZXZlbnRzIGRhdGFzZXQgY3JlYXRlZCBmb3IgdGhlIE1hdSBNYXUgcmViZWxsaW9uIGlzIGxvYWRlZCBhbmQgcHJvY2Vzc2VkLgoKIyBMb2FkIExpYnJhcnkKCmBgYHtyICwgcmVzdWx0cz0naGlkZScsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpybShsaXN0PWxzKCkpOyBnYygpICNjbGVhciBvYmplY3RzIGZyb20gbWVtb3J5CmxpYnJhcnkoTWVhc3VyaW5nTGFuZHNjYXBlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkgI2xvYWQgaW5kZXBlbmRlbnRseSBqdXN0IHRvIG1ha2Ugc3VyZSAlPiUgZ2V0cyBpbXBvcnRlZAoKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3MgPSBUUlVFLCB2ZXJib3NlID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGNhY2hlID0gVFJVRSkKb3B0aW9ucyh3aWR0aCA9IDE2MCkKCmBgYAoKIyBMb2FkIEV2ZW50cyBEYXRhCgpgYGB7cn0KZXZlbnRzIDwtIE1lYXN1cmluZ0xhbmRzY2FwZTo6OnByZXBfZXZlbnRzKGZyb21zY3JhdGNoID0gRikKZGltKGV2ZW50cykKYGBgCgojIERhdGVzCkJhc2ljIGNsZWFuaW5nLiBGb3JtYXQgaXMgdXN1YWxseSBERC5NTS5ZWVlZIGJ1dCBzb21ldGltZXMgbXVsdGlwbGUgZGF5cyBhcmUgaW5jbHVkZWQgYnkgREQxL0REMi9NTS9ZWS4gU29tZXRpbWVzIHllYXIgaXMgWVkgb3IgWVlZWS4gCgpgYGB7ciB9CgojcF9sb2FkKGRhdGUpCmV2ZW50cyA8LSBldmVudHMgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKGV2ZW50X2RhdGVfY2xlYW49ZXZlbnRfZGF0ZSkgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKGV2ZW50X2RhdGVfY2xlYW49c3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKGV2ZW50X2RhdGVfY2xlYW4sIltbOmRpZ2l0Ol1dKy8iLCAiIikpICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShldmVudF9kYXRlX2NsZWFuPXN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChldmVudF9kYXRlX2NsZWFuLCJbWzpkaWdpdDpdXSsvIiwgIiIpKSAlPiUgI3N0cmlwIG9mZiBleHRyYSBkYXkgYXQgdGhlIGZyb250IDAxLzAyLjEyLjE5NTAKICAgICAgICAgIGRwbHlyOjptdXRhdGUoZXZlbnRfZGF0ZV9jbGVhbj1zdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoZXZlbnRfZGF0ZV9jbGVhbiwiXFwuIiwgIi8iKSkgJT4lICNDb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcwogICAgICAgICAgZHBseXI6Om11dGF0ZShldmVudF9kYXRlX2NsZWFuPXRyaW13cyhldmVudF9kYXRlX2NsZWFuKSkgJT4lICN0cmltIHdoaXRlc3BhY2UKICAgICAgICAgIGRwbHlyOjptdXRhdGUoZXZlbnRfZGF0ZV9jbGVhbj1zdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoZXZlbnRfZGF0ZV9jbGVhbiwiLzUyIiwgIi8xOTUyIikpICU+JSAjY29udmVydCAyIGRpZ2l0IHllYXJzIHRvIDQgZGlnaXQgeWVhcnMKICAgICAgICAgIGRwbHlyOjptdXRhdGUoZXZlbnRfZGF0ZV9jbGVhbj1zdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoZXZlbnRfZGF0ZV9jbGVhbiwiLzUzIiwgIi8xOTUzIikpICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShldmVudF9kYXRlX2NsZWFuPXN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChldmVudF9kYXRlX2NsZWFuLCIvNTQiLCAiLzE5NTQiKSkgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKGV2ZW50X2RhdGVfY2xlYW49c3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKGV2ZW50X2RhdGVfY2xlYW4sIi81NSIsICIvMTk1NSIpKSAlPiUKICAgICAgICAgIGRwbHlyOjptdXRhdGUoZXZlbnRfZGF0ZV9jbGVhbj1zdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoZXZlbnRfZGF0ZV9jbGVhbiwiLzU2IiwgIi8xOTU2IikpICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShldmVudF9kYXRlX2NsZWFuPXN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChldmVudF9kYXRlX2NsZWFuLCIvMTk1MjQiLCAiLzE5NTQiKSkgJT4lICNjbGVhbiB0eXBvCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKGV2ZW50X2RhdGVfY2xlYW49IGx1YnJpZGF0ZTo6ZG15KGV2ZW50X2RhdGVfY2xlYW4pICkgI0ZlZWQgdG8gbHVicmlkYXRlCiAgCmV2ZW50cyAlPiUgZmlsdGVyKGlzLm5hKGV2ZW50X2RhdGVfY2xlYW4pKSAlPiUgZHBseXI6OnNlbGVjdChzdGFydHNfd2l0aCgiZXZlbnRfZGF0ZSIpKSAlPiUgZGlzdGluY3QoKSAlPiUgcHJpbnQobj00MCkgI3Zpc3VhbGl6ZSBlcnJvcnMKCmV2ZW50cyRldmVudF9kYXRlX2NsZWFuX3llYXIgPC0gbHVicmlkYXRlOjp5ZWFyKGV2ZW50cyRldmVudF9kYXRlX2NsZWFuKQpldmVudHMkZXZlbnRfZGF0ZV9jbGVhbl95ZWFyICU+JSBqYW5pdG9yOjp0YWJ5bCgpICU+JSByb3VuZCgzKQoKYGBgCgpIb3cgb2Z0ZW4gYXJlIGV2ZW50IGRhdGVzIG1pc3Npbmc/CgpgYGB7ciB9CnRhYmxlKGlzLm5hKGV2ZW50cyRldmVudF9kYXRlKSkKYGBgCgpUaGUgZG9jdW1lbnRzIGFsc28gaGF2ZSBkYXRlcywgc29tZXRpbWVzIHNwYW5uaW5nIGEgcGVyaW9kIG9mIHRpbWUuIENhbiB1c2UgdGhhdCB0byBuYWlsIGRvd24gbWlzc2luZyBkYXRlcy4KCmBgYHtyIH0KCihldmVudHMkZG9jdW1lbnRfZGF0ZV90eXBlIDwtIGV2ZW50cyRkb2N1bWVudF9kYXRlICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xvd2VyKCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc2FpYzo6ZGVyaXZlZEZhY3RvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc3NpbmciICAgICA9IHN0cmluZ3I6OnN0cl9kZXRlY3QoLiwib2JzY3VyZWR8bWlzc2luZ3xpbGxlZ2libGV8eHh8RG9jdW1lbnQgbWlzc2luZyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhlIiAgICAgID0gc3RyaW5ncjo6c3RyX2RldGVjdCguLCJvbiB0aGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIiAgICAgICAgICA9IHN0cmluZ3I6OnN0cl9kZXRlY3QoLiwiIHRvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IiICAgICAgICAgPSBzdHJpbmdyOjpzdHJfZGV0ZWN0KC4sIkZvciAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlZWsiICAgICAgICA9IHN0cmluZ3I6OnN0cl9kZXRlY3QoLiwid2VlayIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2VlayBlbmRpbmciID0gc3RyaW5ncjo6c3RyX2RldGVjdCguLCJ3ZWVrIGVuZGluZyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVyaW9kIiAgICAgID0gc3RyaW5ncjo6c3RyX2RldGVjdCguLCJwZXJpb2QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcnRuaWdodCIgICA9IHN0cmluZ3I6OnN0cl9kZXRlY3QoLiwiZm9ydG5pZ2h0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRpbmciICAgICAgPSBzdHJpbmdyOjpzdHJfZGV0ZWN0KC4sImVuZGluZyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kID0gImxhc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9ICJ1bmtub3duIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICkgJT4lIGphbml0b3I6OnRhYnlsKCkgCgoKZXZlbnRzJGRvY3VtZW50X2RhdGVfY2xlYW4gPC0gZXZlbnRzJGRvY3VtZW50X2RhdGUgJT4lIHRvbG93ZXIoKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKCJGb3J0bmlnaHQgRW5kZWQgfHBlcmlvZHx3ZWVrIGVuZGluZ3xmb3IgfHRoZSB8Zm9ydG5pZ2h0IHxlbmRpbmcgfHdlZWsgfEZyb20gfG9uICIsIiIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiW0RpZ2l0c10qdGh8W0RpZ2l0c10qc3R8W0RpZ2l0c10qcmR8W0RpZ2l0c10qbmQiLCIiKQoKZXZlbnRzIDwtIGV2ZW50cyAlPiUgCiAgICAgICAgIGRwbHlyOjpzZWxlY3QoLW9uZV9vZigiZG9jdW1lbnRfZGF0ZV8xIiwiZG9jdW1lbnRfZGF0ZV8yIikpICU+JSAgI3NlcGFyYXRlIHdpbGwgY29udGludWUgdG8gYWRkIGNvbHVtbnMgZXZlcnkgdGltZSBpdHMgcnVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZHlyIDo6c2VwYXJhdGUoY29sPWRvY3VtZW50X2RhdGVfY2xlYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvPWMoImRvY3VtZW50X2RhdGVfMSIsImRvY3VtZW50X2RhdGVfMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiB0b3x0byB8VG8gfCAtICIsIHJlbW92ZT1GLCBleHRyYT0iZHJvcCIsIGZpbGw9InJpZ2h0IikKCmV2ZW50cyRkb2N1bWVudF9kYXRlX2NsZWFuXzEgPC0gZXZlbnRzJGRvY3VtZW50X2RhdGVfMSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiW1s6ZGlnaXQ6XV0rLyIsICIiKSAgICU+JSAjc3RyaXAgb2ZmIGV4dHJhIGRheSBhdCB0aGUgZnJvbnQgMDEvMDIuMTIuMTk1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIlxcLiIsICIvIikgICAgICAgICAgICAgJT4lICNDb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltd3MoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YnJpZGF0ZTo6ZG15KCkKCmV2ZW50cyRkb2N1bWVudF9kYXRlX2NsZWFuXzIgPC0gZXZlbnRzJGRvY3VtZW50X2RhdGVfMiAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiW1s6ZGlnaXQ6XV0rLyIsICIiKSAgICU+JSAjc3RyaXAgb2ZmIGV4dHJhIGRheSBhdCB0aGUgZnJvbnQgMDEvMDIuMTIuMTk1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIlxcLiIsICIvIikgICAgICAgICAgICAgJT4lICNDb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltd3MoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YnJpZGF0ZTo6ZG15KCkgICAgCgpldmVudHMgJT4lIGZpbHRlcihpcy5uYShkb2N1bWVudF9kYXRlX2NsZWFuXzEpKSAlPiUgZHBseXI6OnNlbGVjdChzdGFydHNfd2l0aCgiZG9jdW1lbnRfZGF0ZSIpKSAlPiUgZGlzdGluY3QoKSAlPiUgcHJpbnQobj00MCkgI3Zpc3VhbGl6ZSBlcnJvcnMKCgpldmVudHMkZG9jdW1lbnRfZGF0ZV9iZXN0X2RhdGUgPC0gZXZlbnRzJGRvY3VtZW50X2RhdGVfY2xlYW5fMgpjb25kaXRpb24gPC0gaXMubmEoZXZlbnRzJGRvY3VtZW50X2RhdGVfYmVzdF9kYXRlKQpldmVudHMkZG9jdW1lbnRfZGF0ZV9iZXN0X2RhdGVbY29uZGl0aW9uXSA8LSBldmVudHMkZG9jdW1lbnRfZGF0ZV9jbGVhbl8xW2NvbmRpdGlvbl0KKGV2ZW50cyRkb2N1bWVudF9kYXRlX2Jlc3RfeWVhciA8LSBsdWJyaWRhdGU6OnllYXIoZXZlbnRzJGRvY3VtZW50X2RhdGVfYmVzdF9kYXRlKSkgJT4lIGphbml0b3I6OnRhYnlsKCkgJT4lIHJvdW5kKDMpCgpgYGAKCgojIFR5cGUgb2YgRXZlbnQKCmBgYHtyICwgcmVzdWx0cz0iYXNpcyJ9CgpjYXQoIlwwMTQiKQpldmVudHMkdHlwZV9jbGVhbiA8LSBzdHJpbmdyOjpzdHJfdHJpbShzdHJpbmdpOjpzdHJpX3RyYW5zX3RvdGl0bGUoZXZlbnRzJHR5cGUpKQoKZXZlbnRzJHR5cGVfY2xlYW5fYWdnbG93IDwtIGV2ZW50cyR0eXBlX2NsZWFuICU+JQogIHN0cmluZ3I6OnN0cl90cmltKCkgJT4lCiAgdG9sb3dlcigpICU+JQogIGZvcmNhdHM6OmZjdF9jb2xsYXBzZSggI3JlbW92ZWQgQ2FyIGRlcGVuZGVuY3kgZm9yIGZvcmNhdHMKICAgICAgICAgICAgICdkZXNlcnRpb24nPSdkZXNlcnRpb24nLAogICAgICAgICAgICAgJ2VzY2FwZSc9J2VzY2FwZScsCiAgICAgICAgICAgICAnYWJkdWN0aW9uJz1jKCdhYmR1Y3Rpb24nLCdraWRuYXBwaW5nJywna2lkbmFwJywna2l0bmFwJywna2luZG5hcCcpLAogICAgICAgICAgICAgJ2Fzc2F1bHQnPWMoJ2Fzc2F1bHQnLCdhdHRhY2snLCdhc3NhdWx0ZWQnLCdhc3NhdWx0cycsJ2Fzc3VhbHQnLCdhc3N1bHQnKSwKICAgICAgICAgICAgICdtdXJkZXInPWMoJ211cmRlcicsJ2VsaW1pbmF0aW9uJywna2lkbmFwIC8gbXVyZGVyJywnJyksCiAgICAgICAgICAgICAnYXJzb24nPWMoJ2Fyc29uJywnYnVybicpLAogICAgICAgICAgICAgJ2NhdHRsZSBzbGFzaGluZyc9Yygnc2xhc2hlZCcsJ3N0YW1wZWRlJyksCiAgICAgICAgICAgICAndmFuZGFsaXNtJz0ndmFuZGFsaXNtJywKICAgICAgICAgICAgICd0aGVmdCc9YygndGhlZnQnLCd0aGVmdHMnLCd0aGV0JywnbWlzc2luZycsJ2xvc3QnLCdlbnRyeScpLAogICAgICAgICAgICAgJ3B1bmlzaG1lbnQnPWMoJ2NvbmZpc2NhdGUnLCdzZW50ZW5jZWQnKSwKICAgICAgICAgICAgICdyZWJlbCBjYXB0dXJlJz1jKCdjYXB0dXJlJywnY2FwdHVyZWQnKSwKICAgICAgICAgICAgICdvYXRoaW5nJz1jKCdvYXRoJywnb2F0aGluZycsJ3JlY3J1aXRtZW50JywncmVjcnVpdGVkJyksCiAgICAgICAgICAgICAnY29udGFjdCc9YygnY29udGFjdCcsJ2Nhb250YWN0JywnY29udGFjdHMnLCdkcm92ZSBvZmYnLCdkcml2ZSBvZmYnLCdkcm92ZSAgb2ZmJywKICAgICAgICAgICAgICAnY2hhc2VkIG9mZicsJ2Jyb2tlIHVwIG9hdGhpbmcnLCdhbWJ1c2gnKSwKICAgICAgICAgICAgICdwYXRyb2wnPWMoJ3BhdHJvbCcsJ3BvbGljZSBhbmQga3ByIHBhdHJvbCcsJ3N3ZWVwJyksCiAgICAgICAgICAgICAnc2NyZWVuaW5nJz1jKCdzY3JlZW5pbmcnLCdzcmVlbmluZycpLAogICAgICAgICAgICAgJ3VuY2xhc3NpZmllZCc9YygndHlwZScpCikKCmV2ZW50cyR0eXBlX2NsZWFuX2FnZ2xvdyAlPiUKICBqYW5pdG9yOjp0YWJ5bChzb3J0ID0gVFJVRSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fY3Jvc3N0YWIoLixkaWdpdHMgPSAxKQoKCmBgYAoKIyMgQ29sbGFwc2UgRXZlbnQgVHlwZXMKCmBgYHtyICxjYWNoZT1UfQoKKGV2ZW50cyR0eXBlX2NsZWFuX2FnZ21lZCA8LSBldmVudHMkdHlwZV9jbGVhbl9hZ2dsb3cgJT4lIGZvcmNhdHM6OmZjdF9jb2xsYXBzZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BoeXNpY2FsIHZpb2xlbmNlJz1jKCdhYmR1Y3Rpb24nLCdhc3NhdWx0JywnbXVyZGVyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSBkZXN0cnVjdGlvbic9YygndmFuZGFsaXNtJywnYXJzb24nLCdjYXR0bGUgc2xhc2hpbmcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZWZ0Jz1jKCd0aGVmdCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VjdXJpdHkgb3BlcmF0aW9ucyc9YygnY29udGFjdCcsJ3NjcmVlbmluZycsJ3NyZWVuaW5nJywncGF0cm9sJywncHVuaXNobWVudCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5jbGFzc2lmaWVkJz1jKCdkZXNlcnRpb24nLCdlc2NhcGUnLCd1bmNsYXNzaWZpZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogKSAlPiUKICBqYW5pdG9yOjp0YWJ5bChzb3J0ID0gVFJVRSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkKIApgYGAKCmBgYHtyICxjYWNoZT1UfQoKKGV2ZW50cyR0eXBlX2NsZWFuX2FnZ2hpZ2ggPC0gZXZlbnRzJHR5cGVfY2xlYW5fYWdnbWVkICU+JSBmb3JjYXRzOjpmY3RfY29sbGFwc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWJlbCBhY3Rpdml0eSc9Yygnb2F0aGluZycsJ3BoeXNpY2FsIHZpb2xlbmNlJywncHJvcGVydHkgZGVzdHJ1Y3Rpb24nLCd0aGVmdCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ292ZXJubWVudCBhY3Rpdml0eSc9YygncmViZWwgY2FwdHVyZScsJ3NlY3VyaXR5IG9wZXJhdGlvbnMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQopICU+JQogIGphbml0b3I6OnRhYnlsKHNvcnQgPSBUUlVFKSAlPiUKICBqYW5pdG9yOjphZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQoKYGBgCgoKCgojIEluaXRpYXRvciBvZiBFdmVudAoKQ29sbGFwc2VkIEluaXRpYXRvcnMgdG8ganVzdCBSZWJlbHMsIEdvdmVybm1lbnQsIGFuZCBDaXZpbGlhbnMKCmBgYHtyICwgcmVzdWx0cz0iYXNpcyJ9CgpjYXQoIlwwMTQiKQoKaW5pdGlhdG9yX3RhcmdldF9tYXN0ZXJfY2xlYW4gPC0gbGlzdCgKICAKJ2FtbXVuaXRpb24nPWMoJ2FtbXVuaXRpb24nKSwKCidleHBsb3NpdmVzJz1jKCdleHBsb3NpdmVzJywgJ2dlbGlnbml0ZScpLAoKJ2ZpcmVhcm1zJz1jKCdmaXJlYXJtcycsJ2FybXMnLCAnZmlyZWFybScsICdndW4nLCAncGlzdG9sJywgJ3JpZmxlJywgJ2FtbXVuaXRpb24nLCAncmlmaWxlJywgJ3Nob3RndW4nLCAndmVyZXkgcGlzdG9sJyksCgonb3RoZXIgd2VhcG9ucyc9Yygnb3RoZXIgd2VhcG9ucycsJ2F4ZScsJ3NjYWJiYXJkJywnd2VhcG9ucycpLAoKJ2NvbG9uaWFsIGF1dGhvcml0aWVzJz1jKCdjb2xvbmlhbCBhdXRob3JpdGllcycsJ2NvdW5jaWxsb3InLCAnZGlzdHJpY3QgY29tbWlzc2lvbmVyJywgJ2Rpc3RyaWN0IG9mZmljZXInLCAnZm9yZXN0IHJhbmdlcicsICdnYW1lIHJhbmdlcicsICdnYW1lIHdhcmRlbicsICdnb3Zlcm5tZW50JywgJ2dvdmVybm1lbnQgZW1wbG95ZWVzJywgJ3BvcnQgYXV0aG9yaXR5JywgJ3B1YmxpYyB3b3JrcyBkZXBhcnRtZW50JywgJ3NjcmVlbmluZyB0ZWFtJyAsICdkbycsICdnb3Zybm1lbnQnLCAnd2FrYW1iYSBzY3JlZW5pbmcgdGVhbScsICdkbyBtdW51Z2EnLCdhZnJpY2FuIGRvJywnZGNtZXJ1JywgJ2NvbG9uaWFsIGF1dGhvcml0aWVzJyAsJ2dvdnRlbXBsb3llZScgKSwKCid0cmliYWwgYXV0aG9yaXRpZXMnPWMoJ3RyaWJhbCBhdXRob3JpdGllcycsJ2NoaWVmJywgJ2VsZGVycycsICdoZWFkbWFuJyAsICdjaGllZiBjaG9zdHJhbScsJ2NoaWVmIGVsaXVkJywgImNoaWVmJ3Mgc2VudHJ5IikgLAoKJ3ByaXZhdGUgcHJvcGVydHknPWMoJ3ByaXZhdGUgcHJvcGVydHknLCdidWlsZGluZ3MnLCAnY2F0dGxlIGRpcCcsICdkdWthJywgJ2Zhcm1zJywgJ2dhcmFnZScsICdob21lcycsJ2h1dHMnLCAnaG90ZWwnLCAnbGFuZCByb3ZlcicsICdsb3JyeScsICdtYXJrZXQnLCAnb2ZmaWNlJywgJ294Y2FydCcsICdwcm9wZXJ0eScsICAncHVtcCBob3VzZScsICdzYXdtaWxsJywgJ3Nob3BzJywgJ3N0b3JlcycsICd0cmFjdG9yJywgJ3ZlaGljbGUnLCAnd2luZG1pbGwnICwgImJ1bGxvY2sncyBmYXJtIiwnY2F0dGxlIGJvbWEnLCdjb2ZmZSB0cmVlcycsJ2NvZmZlZSB0cmVlcycsICdjdXRob3VzZScsJ2RhaXJ5IGZhcm0nLCdkaXAnLCdob3VzZScsJ2hvdXNlaG9sZCcsICdob3VzZXMnLCdodXQnLCdpbnN0cnVtZW50JywnbGFib3VyIGNhbXAgcG9zdCcsJ2xhYm91ciBodXRzJywnbG9ycmllcycsJ2x1Y2VybmUgc2hlZHMnLCdtYWl6ZSBzaGFtYmEnLCAnbWlsayBmYWN0b3J5JywncGlnIHN0eScsJ3ByaXZhdGUgcHJvcGVydHknLCAncHJvcGVydHkgb2YgY2l2aWxpYW5zJywnc2hvcCcsJ3N0b3JlJywndGhpa2EgZmlzaGluZyBjYW1wJywndmVoaWNsZXMnKSwKCidjYXNoJz1jKCdjYXNoJywgJ2Z1bmRzJywgJ21vbmV5JyAsICJjb25kdWN0b3IncyB0YWtpbmdzIiksCgonZm9vZCc9YygnYmFuYW5hJywgJ2JhcmxleScsICdicmFuJywgJ2NhYmJhZ2UnLCAnY29mZmVlJywgJ2Nvcm4nLCAnY3JlYW0nLCAnY3JvcHMnLCAnZGFpcnknLCAnZm9vZCcsICdmcnVpdCcsICdncmFpbicsICdob25leScsICdtYWl6ZScsICAnbWVhdCcsICdtaWxrJywgJ29hdHMnLCAncG9zaG8nLCAncG90YXRvZXMnLCAnc3VnYXInLCAndmVnZXRhYmxlJywgJ3doZWF0JywKJ2Zvb2QnLCdmb29kIGV0YycsJ2Zvb2Qgc3RvcmUnLCdmb29kIHN0b3JlcycsJ2Zvb2RzdHVmZnMnLCdmcnVpdHMnLCdncmFpbnMnLCAnZ3JhaW5zK2Nsb3RoICttb25leScsJ2dyZWVuIG1haXplIGNvYnMnLCdwb3RhdG8nLCdwb3RhdG8gc3RvcmUnLCdwb3RhdG9zJywnc2tpbW1lZCBtaWxrJywnc3VnYXIgY2FuZScsJ3N1Z2FyIG1haXplJywndmVnZXRhYmxlcycsJ3ZlZ2l0YWJsZSBnYXJkZW4nLCAndmVnaXRhYmxlcycsJ3doZWF0IGJhZ3MnLCd3aGVhdCBzdG9yZScsJ3doZWV0Jywnd2hpc2t5JykgLAoKJ2xpdmVzdG9jayc9YygnYmVhc3QnLCAnY2F0dGxlJywgJ2NvdycsICdoZXJkJywgJ2xpdmVzdG9jaycsICdwaWcnLCAnc2hlZXAnLCAnc3RlZXInLCAnc3RvY2snLAonYW5pbWFsJywgJ2J1bGxzJywnY2FsZicsJ2NhbHZlcycsJ2NoaWNrZW4nLCdjb3dzJywnZG9ua2V5JywnZ29hdCcsJ2dvYXRzJywKJ2hlYWQgb2YgY2F0dGxlJywnaGVhZCBvZiBjb3cnLCdoZWFkIG9mIHNoZWVwJywnaGVpZmVyJywnaGVpZmVycycsCidsYW1iJywnbGl2ZSBzdG9jaycsJ2xpdmVzdG9jaycsJ2xpdmVzdG9ja3MnLCdtYXNhaSBoZXJkJywnbWlsayBjb3cnLCdveCcsJ294IGNhcnQnLAonb3hlbicsJ3JhbScsJ3JlZCBwb2xsIGNhdHRsZScsJ3NoZWUnLCdzaGVlcCBvciBveCcsJ3N0ZWVycycsJ3N0b2NrcycgKSwKCidtZWRpY2luZSc9YygnbWVkaWNhbCBzdXBwbGllcycsICdtZWRpY2luZScsICdtJmIgdGFibGV0cycsICdtZWRpY2luZXMnKSwKCidzdXBwbGllcyc9Yygnc3VwcGxpZXMnLCdiYWdzJywgJ2JlZGRpbmcnLCAnYmxhbmtldHMnLCAnYm9va3MnLCAnY2hhcmNvYWwnLCAnY2xvdGgnLCAnY2xvdGhpbmcnLCAnY29va2luZyB1dGVuc2lscycsICdjdXRsZXJ5JywgJ2VxdWlwbWVudCcsICdmYXJtIGltcGxlbWVudHMnLCAKJ2hvdXNlaG9sZCBpdGVtcycsJ2luc3RydW1lbnRzJywgJ2lyb24nLCAncGFpbHMnLCdwZXRyb2wnLCAncHJvdmlzaW9ucycsICdvaWwnLCAnc2Fja3MnLCAnc3VwcGxpZXMnLCAndGFycGF1bGluJywgJ3RoYXRjaCcsICd0aW1iZXInLCAKJ3RvYmFjY28nLCAndG9vbHMnLCAndW5pZm9ybXMnLCAnd2lyZScsICd3aXJlbGVzcyBzZXQnLCAnd2hpc2tleScsICdhcnRpY2xlcycsJ2JhZycsJ2JhdHRlcnknLCdidWNrZXQnLCdjaWdhJywnY2lnYXJldHRlcycsJ2Nsb3RoZXMnLAonY2xvdGhpbmcgZXRjJywnY2xvdGhzJywnZGFpcnkgaXRlbScsJ2RhaXJ5IHJlY29yZCBib29rJywnZ29vZHMnLCAnbWF0ZXJpYWwnLCdvaWwrdGlucycsJ3Byb3Zpc2lvbnYnLCdyYWlsd2F5IHVuaWZvcm1zJywnc3VwcGxpZXMnLCAndGFycGF1bGlhbicsJ3R5cGV3cml0ZXInLCd2LSBkcml2ZSBiZWx0cycsICdndW5ueSBiYWdzJyApLAoKJ2NodXJjaCc9YygnY2h1cmNoJyksCgonaW5mcmFzdHJ1Y3R1cmUnPWMoJ2FpcnN0cmlwJywgJ2JyaWRnZXMnLCAnaGFsZiBidWlsdCB2aWxsYWdlJywgJ3JvYWRzJywgJ3RyZW5jaGVzJywgJ3dhdGVyIHRhbmsnLCdicmlkZ2UnLCAnYnJpZGdlIGJyb2tlbicsICdicmlkZ2UgZGFtYWdlZCcsICdpbmZyYXN0cnVjdHVyZScsICdtaWx0IHByb3BlcnR5JywgJ21pbHRwcm9wZXJ0eScsICdwcmlzb24gY2FtcCcsJ3N0biBkYW1hZ2VkJyksCgonc2Nob29sJz1jKCdzY2hvb2wnLCAnc2Nob29sJywnc2Nob29sIGJ1aWxkaW5nJywnc2Nob29sIGhvdXNlJywnc2Nob29sIHByb3BlcnR5Jywnc2Nob29scycpLAoKJ2hvbWUgZ3VhcmQnPWMoJ2JnJywna2cnLCdlZycsICdndWFyZCcsJ2VtYnUgZ3VhcmQnLCAnZmFybSBndWFyZCcsICdmb3Jlc3QgZ3VhcmQnLCAnaG9tZSBndWFyZCcsJ2lrYW5kaW5lIGd1YXJkJywgJ2thdGhhbmp1cmUgZ3VhcmQnLCAna2lqYWJlIGd1YXJkJywKJ2tpa3V5dSBndWFyZCcsICdtYXNhaSBndWFyZCcsICdtZXJ1IGd1YXJkJywgJ25hbmRpIGd1YXJkJywgJ25rdWJ1IGd1YXJkJywgJ3N0b2NrIGd1YXJkJywgJ3RpZ29uaSBndWFyZCcsJ3RwIGFuZCBlZyBwYXRyb2wnLCdoZycsJ3RwIHBhdHJvbCcsJ2hvbWUgZ3VhcmQgcGF0cm9sJywKJ20nLCAnbS9nJywnbS9nIHBhdHJvbCcsJ2cnLCAna2F0aGFuanVyZSBoZycsJ2sgZycsICduZycsICdlZyBwYXRyb2wnLCAnaGcgY2FtcCcsJ2hnIGxlYWRlcicsJ2hnIHBhdHJvbCcsJ2hnIHBvc3QnLCdob21lJywnaG9tZSBndWFyZCcsJ2tnIHBvc3QnKSwKCidhcmFiIGNvbWJhdCB1bml0cyc9YygnYXJhYiBjb21iYXQnICwgJ2FyYWIgY29tYmF0IHVuaXQnLCdhcmFiIGNvbWJhdCB1bml0cycpLAoKJ2FzaWFuIGNvbWJhdCB1bml0cyc9YygnYXNpYW4gY29tYmF0JywgJ2FzaWFuIGNvbWJhdCB1bml0JywgJ2FzaWFuIGNvbWJhdCB0ZWFtJywgJ3NlY29uZCBhc2lhbiBjb21iYXQgdW5pdCcsJ2FzaWFuIGNvbWJhdCB1bml0cycgKSwKCidraW5ncyBhZnJpY2FuIHJpZmxlcyc9Yygna2luZ3MgYWZyaWNhbiByaWZsZXMnLCczIGthcicsICc0IGthcicsICc1IGthcicsICc2IGthcicsICc3IGthcicsICcyMyBrYXInLCAnMjYga2FyJywnay5hLnInLCdrLnAucicsJ2suYS5yLicsICc1dGggay5hLnInLCc1a2FyJywnNSBrLmEucicsJzR0aCBrYXInLCdrYXInICkgLAoKJ2JyaXRpc2ggbWlsaXRhcnknPWMoJ2JyaXRpc2ggbWlsaXRhcnknLCAnZGV2b25zaGlyZSByZWdpbWVudCcsJ2Rldm9ucycsICdmaWVsZCBpbnRlbGxpZ2VuY2UgYXNzaXN0YW50JywgJ2ZpZWxkIGludGVsbGlnZW5jZSBvZmZpY2VyJywgJ2ZpbycsICdnbG91Y2VzdGVyc2hpcmUgcmVnaW1lbnQnLCAnZ2xvc3RlcnMnLCAnbGFuY2FzaGlyZSBmdXNpbGllcnMnLCAKImtpbmcncyBzaHJvcHNoaXJlIGxpZ2h0IGluZmFudHJ5IiwgJ3JveWFsIGVhc3Qga2VudCByZWdpbWVudCcsICdidWZmcycsICdyb3lhbCBmdXNpbGllcnMnLCAncm95YWwgaGlnaGxhbmQgcmVnaW1lbnQnLCdibGFjayB3YXRjaCcsICd3YXRjaCcsICdyb3lhbCBpbm5pc2tpbGxpbmcgZnVzaWxpZXJzJywgJ3JveWFsIGlyaXNoIGZ1c2lsaWVycycsICdyb3lhbCBub3J0aHVtYmVybGFuZCBmdXNpbGllcnMnLCAncm5mJywncG9saWNlIGFuZCBtaWxpdGFyeScsICdhcm15JyAsICdsYW5jYXNoaXJlIGZ1c2lsbGllcnMnLCAnc3AgY29tcGFueSAxIHJveWFsIGlubmlza3MnLCAnMSBybmYnLCAncmlmJywgJ2tzbGknLCAnaW5uaXNraWxsaW5ncycsICdmaWEnLCcxIGdsb3N0ZXJzJywgJzEgYncnLCAnMSBidWZmcycsIAonXCJhXCIgY29tcGFueSAxIHJveWFsIGlubmlza3MnLCAnXCJhXCIgY29tcGFueScsICdyb3lhbCBmdXNpbGVycycsICdvZiBkZXZvbnMnLCdvZiAxIGdsb3N0ZXJzJywgJ2xhbmMgZnVzJywgJ2Z1c2lsaWVycycsICdmaW8ga3J1Z2VyJywnZmlvcycsJ2EgY28gZGV2b24nLCc0IHBsYXRvb24gc3VwcG9ydCBjb21wYW55JywKJ1wiY1wiIGNvbXBhbnkxIHJveWFsIGlubmlza3MnLCc2IHBsYXRvb25zcCBjb21wYW55IDEgcm95YWwgaW5uaXNrcycsJzEgbGYnLCAnXCJjXCIgY29tcGFueScsICdcImRcIiBjb21wYW55JywnXCJhXCInLCdcImFcIiBjb21wYW55IGJ3JywnYnVmZnMgYW1idXNoJywnZCBjb21wYW55JywKImQnIGZvcmNlIiwnZGV2ZW5zJywgJ2MgY29tcGFueScsJ1wiZFwiIGZvcmNlJywgJ2FybXkgb2ZmaWNlcicsICdicml0aXNoIGFybXkgb2ZmaWNlcicsICdicml0aXNoIG1pbGl0YXJ5JywgJ2J1ZmZzIHBhdHJvbCcsICdldXJvcGVhbiBvZmZpY2VyJywgJ2V1cm9wZWFuIHNvbGRpZXJzJywgJ2dsb3N0ZXIgcGF0cm9sJyApLAoKJ2tlbnlhIHJlZ2ltZW50Jz1jKCdrZW55YSByZWdpbWVudCcsJ2NhcHRhaW4gZm9sbGlvdHTigJlzIHRlYW0nICwgJ2tyJywgJ2tlbnJlZycsICdrZW5yZWdnJywna2VueWEgcmVnaW1lbnQgc2VyZ2VhbnQnLCAna2VueWEgcmVndCcsJ2tlbml5YSByZWdpbWVudCcsJ2tlbnlhIHJlZ2ltZW50IHByaXZhdGUnKSwKCiAnbWlsaXRhcnkgKGdlbmVyaWMpJz1jKCdtaWxpdGFyeSAoZ2VuZXJpYyknLCAnY2FwdGFpbicsICdjb21wYW55JywgJ21pbGl0YXJ5JywgJ2FybXknLCAnbWlsaXRhcnkgcHJvcGVydHknLCAncGxhdG9vbicsICdzZWN1cml0eSBmb3JjZXMnLCAnc2VjdXJpdHkgZm9yY2UnLCAnY295JywgJ3N0cmlraW5nIGZvcmNlJyAsJ3NlbnRyeScsICdub24gY29tbWlzc2lvbmVkIG9mZmljZXJzJywgJ3BhdHJvbCcsICdzZW50cmllJywgJ3NndCB3aGl0ZScgKSwKCidwc3VlZG8gZ2FuZ3MnPWMoJ3BzdWVkbyBnYW5ncycsJ3BzZXVkbyBnYW5nJywgJ3BzZXVkbyB0ZWFtJywgJ3Ryb2phbicsICdwc3VlZG8gZ2FuZ3MnLCAndHJvamFuIHRlYW0nICwgJ3RyYWNrZXIgZ3JvdXAnLCAncHNldWRvIHRlYW1zJyksCgoncm95YWwgYWlyIGZvcmNlJz1jKCdyb3lhbCBhaXIgZm9yY2UnLCdyYWYnLCAnYm9tYmVycycsICdhaXIgc3RyaWtlJywgJ2hhcnZhcmRzJywgJ3JhZiBsaW5jb2xucycsJ2ZseWluZyBzcXVhcmQnKSwKCidwYXJhbWlsaXRhcnknPWMoJ3BhcmFtaWxpdGFyeScsJ2dlbmVyYWwgc2VydmljZSB1bml0JywgJ2dzdScgKSwKCidjaWQnPWMoJ2NpZCcpLAoKJ2tlbnlhIHBvbGljZSc9Yygna2VueWEgcG9saWNlJywgJ2twJyAsICJrcCBjb25zdGFibGVzJyBxdWFydGVycyIsICdrcGEnICksCgona2VueWEgcG9saWNlIHJlc2VydmUnPWMoJ2tlbnlhIHBvbGljZSByZXNlcnZlJywgJ2twcicsICdrcHIgb2ZmaWNlcnMnLCAncmVzZXJ2ZSBwb2xpY2Ugb2ZmaWNlcicsICdycG8nICwgJ3Jwb3MnLCAncG9saWNlIGFuZCBrLnAucicpLAoKJ3BvbGljZSAoZ2VuZXJpYyknPWMoJ3BvbGljZSAoZ2VuZXJpYyknLCdjb25zdGFibGUnLCAncG9saWNlJywgJ3BvbGNlJywncG9saWN5IHBhcnR5JyksCgoncmFpbHdheSBwb2xpY2UnPWMoJ3JhaWx3YXkgcG9saWNlJyApLAoKJ3NwZWNpYWwgYnJhbmNoJz1jKCdzcGVjaWFsIGJyYW5jaCcsICdibHVlIGRvY3RvciB0ZWFtJywgJ3NwZWNpYWwgYnJhbmNoIHRlYW0nLCAnc2Igb2ZmaWNlcnMnICksCgondHJpYmFsIHBvbGljZSc9YygnZ2l0aHVtdSBwb2xpY2UnLCAnbWFzYWkgc3BlY2lhbCBjb25zdGFibGUnLCAndHJpYmFsIHBvbGljZScsICd0cCcgLCAndHBlZycsJ2FmcmljYW4gY29uc3RhYmxlJywgJ2FmcmljYW4gY29zdGFibGUnLCAnYWZyaWNhbiBzcGVjaWFsIGNvbnN0YWJsZScsICd0cmliYWwgcG9saWNlJyksCgondHJpYmFsIHBvbGljZSByZXNlcnZlJz1jKCd0cmliYWwgcG9saWNlIHJlc2VydmUnLCAndHByJykgICwKCidjb21tdW5pdGllcyc9YygnY29tbXVuaXRpZXMnLCdtYW55YXR0YScsICdmaXNoaW5nIGNhbXAnLCAnc3VibG9jYXRpb24nLCAndmlsbGFnZScsICdjYW1wJyAsICd2aWxsYWdlcycpICwKCidkZXRhaW5lZXMnPWMoJ2RldGFpbmVlcycsICdwcmlzb25lcicsICdwcmlzb25lcnMnKSwKCidzdXNwZWN0ZWQgaW5zdXJnZW50cyc9Yygnc3VzcGVjdGVkIGluc3VyZ2VudHMnLCdiYW5kaXRzJywgJ2Zvb2QgZm9yYWdlcnMnLCAnZ2FuZ3MnLCAnZ2FuZycsICdraWFtYSBraWEgbXVpbmdpJyAsICdra20nLCAna29tZXJlcmEnICwgJ21hdSBtYXUnLCAnb2F0aCBhZG1pbmlzdHJhdG9yJywgJ3Bhc3NpdmUgd2luZycsCidyZWJlbHMnLCAnc3VzcGVjdHMnLCAndGVycm9yaXN0cycsJ3RlcnJvcm9zdHMnLCd0ZXJyb3Jpc3QnLCAnZ3VubWFuJywgJ3Rlcm9yaXN0JywgJ2d1bm1lbicsICdyZXNpc3RhbmNlIGdyb3VwJywncmVzaXN0YW5jZSBncm91cHMnLCAnb2F0aCBhZG1pbmlzdHJhdGVyJywnb2F0aCBhZG1pbmlzdHJhdG9ycycsJ3Bhc3NpdmUgd2luZyBtZW1iZXJzJywgJ3Jlc2lzdGFuY2UnLCdzdXNwZWN0JywgJ3N1c3BlY3RlZCBpbnN1cmdlbnRzJywndGVycm9pc3QnLCd0ZXJyb2lzdHMnLCd0ZXJyb3N0JykgLAoKJ2NpdmlsaWFucyc9YygnY2l2aWxpYW5zJywnYWZyaWNhbnMnLCAnY2hpbGRyZW4nLCAnY2l2aWxpYW4nLCAnZHJpdmVyJywgJ2VtcGxveWVlcycsICdldmFuZ2VsaXN0JywgJ2ZhbWlseScsICdmYXJtIGJveXMnLCAnZ2lybHMnLCAnaW5mb3JtZXInLAona2lrdXl1JywgJ2xhYm9yb3VyJywgJ2xveWFsaXN0JywgJ21hc2FpJywgJ21lbicsICdtaXNzaW9uIHN0YWZmJywgJ293bmVyJywgJ3Bhc3NlbmdlcnMnLCAncGVvcGxlJywgICd0dWdlbiB0cmliZXNtZW4nICwgJ3N0cmFuZ2VyJywgJ3Npa2gnLAonaGVyZCBib3lzJywgJ2lzaW9sbyBnYW1lIHNjb3V0cycsICdmYXJtIGxhYm91cicsICdmYXJtZXInLCAnZXVyb3BlYW4nLCAnZW1wbG95ZXInLCAnZW1wbG95ZWUnLCAnY2l2aWxhbicsJ3Nob3BrZWVwZXInICwgJ3N0dWRlbnRzJywgJ3RlYWNoZXJzJywKJ3R1cmthbmEnLCAndmlnaWxhbnRlcycsICd3b21lbicsICd3b3JrZXJzJywndmlsbGFnZXJzJywgICdsYWJvdXInLCAnbG9jYWwgbGFib3VyJywgJ2tpa3V5dXMnLCAnZW1idScsICd0aXJpa2kgaG91c2Vib3knLCAnc2FtYnVydScsICdtYW5hZ2VyJywgJ3dvbWFuJywKJ3ZldG9mZmljZXInLCAnbXJoaWdnaW5zJywgJ21hc2FpIHBhcnR5Jywna3VyaWEgdHJpYmVzbWVuJywnbWFuYWdlciBvZiBha2lyYSBlc3RhdGVzJywgJ2t1cmlhIHRyaWJlc21lbicsJ2Noc3RlcGhlbicsJ2FmcmljYW4nLAonY2F0aG9saWMgbWlzc29uIHN0YWZmJywgJ2FmcmljYW4gc3RhZmYnLCAnYXNpYW4gd29tZW4nLCAnYnVzIGNvbmR1Y3RvcicsICdjaGlsZCcsICdjaXZpbGlhbihmb29kIGNhcnJpZXJzKScsICdjaXZpbGlhbihzY2hvb2xtYXN0ZXIpJywgJ2NpdmlsaWFucycsCidjaXZpbGlvbicsICdjb21taXR0ZWUnLCAnY29tbWl0dGVlIG1lbWJlcicsICAnY291cmllcicsJ2VsZGVyJywnZW1idSB0cmFjdG9yIGRyaXZlcicsICdlbXBsb3llZXMgb2YgY2x1YicsJ2VuZ2luZSBib3knLCdnaXJsJywnZ29sZiBjbHViIHN0YWZmJywnaGlzIG93biBodXQnLAonaG90ZWwga2VlcGVyJywnaG91c2Vib3knLCdpbGxlZ2FsIHJlc2lkZW50cycsJ2luZGlhbicsJ2ludGVycHJldGVyJywna2VtJywna2lraXl1JywgJ2tpa3V5dSBhc3Nlc3NvcicsJ2tpa3V5dSBmYW1pbGllcycsJ2tpa3V5dSBob3VzZWJveScsJ2tpa3V5dSBsYWJvdXJlcicsJ2tpa3l1JywKJ2tpcnVhIHZpbGxhZ2UnLCdsYWJvdXIgbGluZScsJ2xhYm91ciBsaW5lcycsJ2xhYm91cmVyJywnbGFib3VyZXJzJywgJ2xhYm91cmVzJywnbGFib3VybGluZScsJ2xhYm91cnMnLCdtYWxlcycsJ21hbicsJ21hcmFnb2xpJywnbWFyYWdvbGkgbGFib3VyZXInLAonbWFzYWkgZWxkZXJzJywnbWFzYWkgdHJpYmVzbWFuJywnbWVtYmVycyBvZiB0aGUgdGhpa2EgY29tbWl0dGVlJywgJ21uYSBzZWN0aW9uIGxlYWRlcnMnLCdtdW5pY2lwYWwgaW5zcGVjdG9ycycsJ25vbiBraWt1eXUgZW1wbG95ZWVzJywncGVyc29uJywKJ3Byb3N0aXR1dGVzJywncHVya2UgbWFzYWknLCdwd2QgZW1wbG95ZWUnLCdyYWlsd2F5IGVtcGxveWVlcycsICdzY2hvb2wgbWFzdGVyJywnc2Nob29sIHRlYWNoZXInLCdzaXN0ZXJzIGNvbW1pdHRlZScsJ3NvbWFsaScsJ3N0YWZmJywnc3RyYW5nZXJzJywKJ3RheGkgZHJpdmVycycsJ3RlYWNoZXInLCd0cmVhc3VyZXJzJywgImhlYWRtYW4ncyBzb24iLCJub3J0b24gdHJhaWxsJ3MgbGFib3VyIiwiZ29yZG9uJ3MgbGFib3VyIiwgJ2Zvb2QgY2FycmllcnMnKSAKCgopCmBgYAoKYGBge3J9CnJlZ2V4IDwtICJcXC58cGF0cm9sfFsxLTldXFxzKnJkfFsxLTldXFxzKnRoIiAjIHdpdGggcmVnZXggc3RhcnQgdHJ5aW5nIHRvIGdldCBtb3JlIG9mIHRoZXNlIHRvIGF1dG9tYXRpY2FsbHkgbWFwIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBsb3RzIG9mIGhhbmQgY29kaW5ncwpldmVudHMkaW5pdGlhdG9yX2NsZWFuIDwtIGV2ZW50cyRpbml0aWF0b3IgJT4lIHN0cmluZ3I6OnN0cl90cmltKCkgJT4lIGdzdWIocmVnZXgsICIiLCAuLCBpZ25vcmUuY2FzZSA9VCkgJT4lIHRvbG93ZXIoKQoKZXZlbnRzIDwtIGV2ZW50cyAlPiUKICBkcGx5cjo6c2VsZWN0KC1vbmVfb2YoImluaXRpYXRvcl9jbGVhbl8xIiwgImluaXRpYXRvcl9jbGVhbl8yIiwgImluaXRpYXRvcl9jbGVhbl8zIikpICU+JSAjIHNlcGFyYXRlIHdpbGwgY29udGludWUgdG8gYWRkIGNvbHVtbnMgZXZlcnkgdGltZSBpdHMgcnVuCiAgdGlkeXIgOjpzZXBhcmF0ZSgKICAgIGNvbCA9IGluaXRpYXRvcl9jbGVhbiwKICAgIGludG8gPSBjKCJpbml0aWF0b3JfY2xlYW5fMSIsICJpbml0aWF0b3JfY2xlYW5fMiIsICJpbml0aWF0b3JfY2xlYW5fMyIpLAogICAgc2VwID0gImFuZHxcXFxcfC98XFwmfCwiLCByZW1vdmUgPSBGLCBleHRyYSA9ICJkcm9wIiwgZmlsbCA9ICJyaWdodCIKICApCgpldmVudHMgPC0gZXZlbnRzICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJpbml0aWF0b3JfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qcG9saWNlLioiLCAicG9saWNlIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLipndWFyZC4qIiwgImd1YXJkIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLip0ZXJyb3IuKnwuKm1hdSBtYXUuKnwuKmdhbmcuKiIsICJ0ZXJyb3Jpc3QiLCAuLCBpZ25vcmUuY2FzZSA9VCkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKmtwci4qfC4qayBwIHIuKiIsICJrcHIiLCAuLCBpZ25vcmUuY2FzZSA9VCkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKmthci4qfC4qayBhIHIuKiIsICJrYXIiLCAuLCBpZ25vcmUuY2FzZSA9VCkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKmNveS4qIiwgImNveSIsIC4sIGlnbm9yZS5jYXNlID1UKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJpbml0aWF0b3JfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qZ3N1LioiLCAiZ3N1IiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLip3YXRjaC4qIiwgIndhdGNoIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8iKSksIGZ1bnModHJpbXdzKC4pKSkKCmV2ZW50cyA8LSBldmVudHMgJT4lIAogICAgICAgICAgbXV0YXRlKGluaXRpYXRvcl9jbGVhbl8xX2FnZ2xvdyA9IGRvLmNhbGwoZm9yY2F0czo6ZmN0X2NvbGxhcHNlLCBjKGxpc3QoZXZlbnRzJGluaXRpYXRvcl9jbGVhbl8xKSwgaW5pdGlhdG9yX3RhcmdldF9tYXN0ZXJfY2xlYW4pKSAlPiUgYXMuY2hhcmFjdGVyKCkgKSAlPiUKICAgICAgICAgIG11dGF0ZShpbml0aWF0b3JfY2xlYW5fMl9hZ2dsb3cgPSBkby5jYWxsKGZvcmNhdHM6OmZjdF9jb2xsYXBzZSwgYyhsaXN0KGV2ZW50cyRpbml0aWF0b3JfY2xlYW5fMiksIGluaXRpYXRvcl90YXJnZXRfbWFzdGVyX2NsZWFuKSkgJT4lIGFzLmNoYXJhY3RlcigpKSAlPiUKICAgICAgICAgIG11dGF0ZShpbml0aWF0b3JfY2xlYW5fM19hZ2dsb3cgPSBkby5jYWxsKGZvcmNhdHM6OmZjdF9jb2xsYXBzZSwgYyhsaXN0KGV2ZW50cyRpbml0aWF0b3JfY2xlYW5fMyksIGluaXRpYXRvcl90YXJnZXRfbWFzdGVyX2NsZWFuKSkgJT4lIGFzLmNoYXJhY3RlcigpKQoKI2h0dHBzOi8vY29tbXVuaXR5LnJzdHVkaW8uY29tL3QvdXNpbmctbGlzdC1hcmd1bWVudC13aXRoLWZjdC1jb2xsYXBzZS82NTUyLzcKCiMgc29ydCh0YWJsZShldmVudHMkaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93KSkKCmxvd2xldmVsYWdnIDwtIGMoCiAgImFyYWIgY29tYmF0IHVuaXRzIiwgImNpZCIsICJwc3VlZG8gZ2FuZ3MiLCAiYXNpYW4gY29tYmF0IHVuaXRzIiwgInNwZWNpYWwgYnJhbmNoIiwKICAidHJpYmFsIGF1dGhvcml0aWVzIiwgInRyaWJhbCBwb2xpY2UgcmVzZXJ2ZSIsICJyb3lhbCBhaXIgZm9yY2UiLAogICJwYXJhbWlsaXRhcnkiLCAia2VueWEgcmVnaW1lbnQiLCAidHJpYmFsIHBvbGljZSIsICJrZW55YSBwb2xpY2UgcmVzZXJ2ZSIsICJrZW55YSBwb2xpY2UiLAogICJicml0aXNoIG1pbGl0YXJ5IiwgImNpdmlsaWFucyIsICJLaW5ncyBBZnJpY2FuIFJpZmxlcyIsICJtaWxpdGFyeSAoZ2VuZXJpYykiLCAicG9saWNlIChnZW5lcmljKSIsCiAgInJhaWx3YXkgcG9saWNlIiwgImhvbWUgZ3VhcmQiLCAiY29sb25pYWwgYXV0aG9yaXRpZXMiLCAic3VzcGVjdGVkIGluc3VyZ2VudHMiCikKCiNldmVudHMgPC0gZXZlbnRzICU+JQojICBtdXRhdGUoaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93PWlmZWxzZShpbml0aWF0b3JfY2xlYW5fMV9hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEoaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93KSxpbml0aWF0b3JfY2xlYW5fMV9hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpICU+JQojICBtdXRhdGUoaW5pdGlhdG9yX2NsZWFuXzJfYWdnbG93PWlmZWxzZShpbml0aWF0b3JfY2xlYW5fMl9hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEoaW5pdGlhdG9yX2NsZWFuXzJfYWdnbG93KSxpbml0aWF0b3JfY2xlYW5fMl9hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpICU+JSAgCiMgIG11dGF0ZShpbml0aWF0b3JfY2xlYW5fM19hZ2dsb3c9aWZlbHNlKGluaXRpYXRvcl9jbGVhbl8zX2FnZ2xvdyAgJWluJSBsb3dsZXZlbGFnZyAmICFpcy5uYShpbml0aWF0b3JfY2xlYW5fM19hZ2dsb3cpLGluaXRpYXRvcl9jbGVhbl8zX2FnZ2xvdywgInVuY2F0ZWdvcml6ZWQiKSkKCiMgdGFibGUoZXZlbnRzJGluaXRpYXRvcl9jbGVhbl8xX2FnZ2xvdywgdXNlTkE9ImFsd2F5cyIpCmBgYAoKYGBge3IgQ29sbGFwc2UgRXZlbnQgSW5pdGF0b3JzIE1lZGl1bSAsY2FjaGU9VH0KCmV2ZW50c1ssIGMoImluaXRpYXRvcl9jbGVhbl8xX2FnZ21lZCIsICJpbml0aWF0b3JfY2xlYW5fMl9hZ2dtZWQiLCAiaW5pdGlhdG9yX2NsZWFuXzNfYWdnbWVkIildIDwtCiAgZXZlbnRzWywgYygiaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93IiwgImluaXRpYXRvcl9jbGVhbl8yX2FnZ2xvdyIsICJpbml0aWF0b3JfY2xlYW5fM19hZ2dsb3ciKV0KZXZlbnRzIDwtIGV2ZW50cyAlPiUKICBtdXRhdGVfYXQoCiAgICB2YXJzKHN0YXJ0c193aXRoKCJpbml0aWF0b3JfY2xlYW5fMV9hZ2dtZWR8aW5pdGlhdG9yX2NsZWFuXzJfYWdnbWVkfGluaXRpYXRvcl9jbGVhbl8zX2FnZ21lZCIpKSwKICAgIC5mdW5zID0gZnVucyhmb3JjYXRzOjpmY3RfY29sbGFwc2UoCiAgICAgJ3BvbGljZSc9YygnY2lkJywna2VueWEgcG9saWNlIHJlc2VydmUnLCdrZW55YSBwb2xpY2UnLCdwb2xpY2UgKGdlbmVyaWMpJywncmFpbHdheSBwb2xpY2UnLCdzcGVjaWFsIGJyYW5jaCcsJ3RyaWJhbCBwb2xpY2UnLCd0cmliYWwgcG9saWNlIHJlc2VydmUnKSAsCiAgICAgJ21pbGl0YXJ5Jz1jKCdhcmFiIGNvbWJhdCB1bml0cycsJ2FzaWFuIGNvbWJhdCB1bml0cycsJ2JyaXRpc2ggbWlsaXRhcnknLCdraW5ncyBhZnJpY2FuIHJpZmxlcycsJ2tlbnlhIHJlZ2ltZW50JywnbWlsaXRhcnkgKGdlbmVyaWMpJywncHN1ZWRvIGdhbmdzJywncm95YWwgYWlyIGZvcmNlJykgLCAKICAgICAnY2l2aWwgYXV0aG9yaXRpZXMnPWMoJ2NvbG9uaWFsIGF1dGhvcml0aWVzJywgJ3RyaWJhbCBhdXRob3JpdGllcycpCiAgICAgKSkKICApCgpldmVudHMkaW5pdGlhdG9yX2NsZWFuXzJfYWdnbWVkICU+JQogIGphbml0b3I6OnRhYnlsKHNvcnQgPSBUUlVFKSAlPiUKICBqYW5pdG9yOjphZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQpgYGAKCmBgYHtyIENvbGxhcHNlIEV2ZW50IEluaXRhdG9ycyBIaWdoICxjYWNoZT1UfQoKZXZlbnRzWywgYygiaW5pdGlhdG9yX2NsZWFuXzFfYWdnaGlnaCIsICJpbml0aWF0b3JfY2xlYW5fMl9hZ2doaWdoIiwgImluaXRpYXRvcl9jbGVhbl8zX2FnZ2hpZ2giKV0gPC0KICBldmVudHNbLCBjKCJpbml0aWF0b3JfY2xlYW5fMV9hZ2dtZWQiLCAiaW5pdGlhdG9yX2NsZWFuXzJfYWdnbWVkIiwgImluaXRpYXRvcl9jbGVhbl8zX2FnZ21lZCIpXQpldmVudHMgPC0gZXZlbnRzICU+JQogIG11dGF0ZV9hdCgKICAgIHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8xX2FnZ2hpZ2h8aW5pdGlhdG9yX2NsZWFuXzJfYWdnaGlnaHxpbml0aWF0b3JfY2xlYW5fM19hZ2doaWdoIikpLAogICAgLmZ1bnMgPSBmdW5zKGZvcmNhdHM6OmZjdF9jb2xsYXBzZSgKICAgICAgICAgICAgICAgICAgJ2dvdmVybm1lbnQnPWMoJ2NpdmlsIGF1dGhvcml0aWVzJywgJ2hvbWUgZ3VhcmQnLCAnbWlsaXRhcnknLCAncG9saWNlJywgJ3BhcmFtaWxpdGFyeScpICwKICAgICAgICAgICAgICAgICAgJ3JlYmVscyc9Yygnc3VzcGVjdGVkIGluc3VyZ2VudHMnKSAKICAgICAgICAgICkpCiAgKQoKZXZlbnRzJGluaXRpYXRvcl9jbGVhbl8zX2FnZ2hpZ2ggJT4lCiAgamFuaXRvcjo6dGFieWwoc29ydCA9IFRSVUUpICU+JQogIGphbml0b3I6OmFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpCmBgYAoKIyBUYXJnZXQgb2YgRXZlbnQKCmBgYHtyICwgY2FjaGU9VH0KCnJlZ2V4IDwtICJcXC58cGF0cm9sfFsxLTldXFxzKnJkfFsxLTldXFxzKnRoIiAjIHdpdGggcmVnZXggc3RhcnQgdHJ5aW5nIHRvIGdldCBtb3JlIG9mIHRoZXNlIHRvIGF1dG9tYXRpY2FsbHkgbWFwIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBsb3RzIG9mIGhhbmQgY29kaW5ncwpldmVudHMkdGFyZ2V0X2NsZWFuIDwtIGV2ZW50cyRpbml0aWF0b3IgJT4lIHN0cmluZ3I6OnN0cl90cmltKCkgJT4lIHRvbG93ZXIoKSAlPiUgZ3N1YihyZWdleCwgIiIsIC4pCgpldmVudHMgPC0gZXZlbnRzICU+JQogIGRwbHlyOjpzZWxlY3QoLW9uZV9vZigidGFyZ2V0X2NsZWFuXzEiLCAidGFyZ2V0X2NsZWFuXzIiLCAidGFyZ2V0X2NsZWFuXzMiKSkgJT4lICMgc2VwYXJhdGUgd2lsbCBjb250aW51ZSB0byBhZGQgY29sdW1ucyBldmVyeSB0aW1lIGl0cyBydW4gc28gZHJvcCBvbGQgdmVyc2lvbnMuIEZpcnN0IHRpbWUgdGhpcyBpcyBydW4gd2lsbCB0aHJvdyBhIHdhcm5pbmcuCiAgdGlkeXIgOjpzZXBhcmF0ZSgKICAgIGNvbCA9IGluaXRpYXRvcl9jbGVhbiwKICAgIGludG8gPSBjKCJ0YXJnZXRfY2xlYW5fMSIsICJ0YXJnZXRfY2xlYW5fMiIsICJ0YXJnZXRfY2xlYW5fMyIpLAogICAgc2VwID0gImFuZHxcXFxcfC98XFwmfCwiLCByZW1vdmUgPSBGLCBleHRyYSA9ICJkcm9wIiwgZmlsbCA9ICJyaWdodCIKICApCgpldmVudHMgPC0gZXZlbnRzICU+JSAKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgidGFyZ2V0X2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKnRlcnJvci4qfC4qZXJvcmkuKnwuKmVycm9yaXMqfC4qbWF1IG1hdS4qfC4qZ2FuZy4qIiwgInRlcnJvcmlzdCIsIC4sIGlnbm9yZS5jYXNlID1UKSkgICkgICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qcG9saWNlLioiLCAicG9saWNlIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLipndWFyZC4qIiwgImd1YXJkIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLiprcHIuKnwuKmsgcCByLioiLCAia3ByIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLiprYXIuKnwuKmsgYSByLioiLCAia2FyIiwgLiwgaWdub3JlLmNhc2UgPVQpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLipjb3kuKiIsICJjb3kiLCAuLCBpZ25vcmUuY2FzZSA9VCkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgidGFyZ2V0X2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKmdzdS4qIiwgImdzdSIsIC4sIGlnbm9yZS5jYXNlID1UKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qd2F0Y2guKiIsICJ3YXRjaCIsIC4sIGlnbm9yZS5jYXNlID1UKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKHRyaW13cyguKSkpCgpldmVudHMkdGFyZ2V0X2NsZWFuXzEgJT4lCiAgamFuaXRvcjo6dGFieWwoc29ydCA9IFRSVUUpICU+JQogIGphbml0b3I6OmFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpCmBgYAoKYGBge3J9CgpldmVudHMgPC0gZXZlbnRzICU+JSAKICAgICAgICAgIG11dGF0ZSh0YXJnZXRfY2xlYW5fMV9hZ2dsb3cgPSBkby5jYWxsKGZvcmNhdHM6OmZjdF9jb2xsYXBzZSwgYyhsaXN0KGV2ZW50cyR0YXJnZXRfY2xlYW5fMSksIGluaXRpYXRvcl90YXJnZXRfbWFzdGVyX2NsZWFuKSkgJT4lIGFzLmNoYXJhY3RlcigpICkgJT4lCiAgICAgICAgICBtdXRhdGUodGFyZ2V0X2NsZWFuXzJfYWdnbG93ID0gZG8uY2FsbChmb3JjYXRzOjpmY3RfY29sbGFwc2UsIGMobGlzdChldmVudHMkdGFyZ2V0X2NsZWFuXzIpLCBpbml0aWF0b3JfdGFyZ2V0X21hc3Rlcl9jbGVhbikpICU+JSBhcy5jaGFyYWN0ZXIoKSkgJT4lCiAgICAgICAgICBtdXRhdGUodGFyZ2V0X2NsZWFuXzNfYWdnbG93ID0gZG8uY2FsbChmb3JjYXRzOjpmY3RfY29sbGFwc2UsIGMobGlzdChldmVudHMkdGFyZ2V0X2NsZWFuXzMpLCBpbml0aWF0b3JfdGFyZ2V0X21hc3Rlcl9jbGVhbikpICU+JSBhcy5jaGFyYWN0ZXIoKSkKCmxvd2xldmVsYWdnIDwtIGMoCiAgImNodXJjaCIsICJrZW55YSBwb2xpY2UiLCAibWVkaWNpbmUiLCAidHJpYmFsIHBvbGljZSByZXNlcnZlIiwgImRldGFpbmVlcyIsICJrZW55YSByZWdpbWVudCIsICJvdGhlciB3ZWFwb25zIiwKICAicGFyYW1pbGl0YXJ5IiwgImFtbXVuaXRpb24iLCAiY29tbXVuaXRpZXMiLCAiYnJpdGlzaCBtaWxpdGFyeSIsICJtaWxpdGFyeSAoZ2VuZXJpYykiLCAidHJpYmFsIGF1dGhvcml0aWVzIiwgImtlbnlhIHBvbGljZSByZXNlcnZlIiwgInRyaWJhbCBwb2xpY2UiLAogICJLaW5ncyBBZnJpY2FuIFJpZmxlcyIsICJpbmZyYXN0cnVjdHVyZSIsICJzY2hvb2wiLCAiY2FzaCIsICJjb2xvbmlhbCBhdXRob3JpdGllcyIsICJwb2xpY2UgKGdlbmVyaWMpIiwgInN1cHBsaWVzIiwgImZpcmVhcm1zIiwgImZvb2QiLCAicHJpdmF0ZSBwcm9wZXJ0eSIsCiAgImhvbWUgZ3VhcmQiLCAiY2l2aWxpYW5zIiwgImxpdmVzdG9jayIsICJzdXNwZWN0ZWQgaW5zdXJnZW50cyIKKQoKI2V2ZW50cyA8LSBldmVudHMgJT4lCiMgICBtdXRhdGUodGFyZ2V0X2NsZWFuXzFfYWdnbG93PWlmZWxzZSh0YXJnZXRfY2xlYW5fMV9hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEodGFyZ2V0X2NsZWFuXzFfYWdnbG93KSx0YXJnZXRfY2xlYW5fMV9hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpICU+JQojICAgbXV0YXRlKHRhcmdldF9jbGVhbl8yX2FnZ2xvdz1pZmVsc2UodGFyZ2V0X2NsZWFuXzJfYWdnbG93ICAlaW4lIGxvd2xldmVsYWdnICYgIWlzLm5hKHRhcmdldF9jbGVhbl8yX2FnZ2xvdyksdGFyZ2V0X2NsZWFuXzJfYWdnbG93LCAidW5jYXRlZ29yaXplZCIpKSAlPiUgCiMgICBtdXRhdGUodGFyZ2V0X2NsZWFuXzNfYWdnbG93PWlmZWxzZSh0YXJnZXRfY2xlYW5fM19hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEodGFyZ2V0X2NsZWFuXzNfYWdnbG93KSx0YXJnZXRfY2xlYW5fM19hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpCgpldmVudHMkdGFyZ2V0X2NsZWFuXzFfYWdnbG93ICU+JQogIGphbml0b3I6OnRhYnlsKHNvcnQgPSBUUlVFKSAlPiUKICBqYW5pdG9yOjphZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQpgYGAKCgpgYGB7ciAgLGNhY2hlPVR9CgpldmVudHNbLCBjKCJ0YXJnZXRfY2xlYW5fMV9hZ2dtZWQiLCAidGFyZ2V0X2NsZWFuXzJfYWdnbWVkIiwgInRhcmdldF9jbGVhbl8zX2FnZ21lZCIpXSA8LQogIGV2ZW50c1ssIGMoInRhcmdldF9jbGVhbl8xX2FnZ2xvdyIsICJ0YXJnZXRfY2xlYW5fMl9hZ2dsb3ciLCAidGFyZ2V0X2NsZWFuXzNfYWdnbG93IildCmV2ZW50cyA8LSBldmVudHMgJT4lCiAgbXV0YXRlX2F0KAogICAgdmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXzFfYWdnbWVkfGluaXRpYXRvcl9jbGVhbl8yX2FnZ21lZHxpbml0aWF0b3JfY2xlYW5fM19hZ2dtZWQiKSksCiAgICAuZnVucyA9IGZ1bnMoZm9yY2F0czo6ZmN0X2NvbGxhcHNlKHRlbXAsCiAgICAgJ3BvbGljZSc9YygnY2lkJywna2VueWEgcG9saWNlIHJlc2VydmUnLCdrZW55YSBwb2xpY2UnLCdwb2xpY2UgKGdlbmVyaWMpJywncmFpbHdheSBwb2xpY2UnLCdzcGVjaWFsIGJyYW5jaCcsJ3RyaWJhbCBwb2xpY2UnLCd0cmliYWwgcG9saWNlIHJlc2VydmUnKSAsCiAgICAgJ21pbGl0YXJ5Jz1jKCdhcmFiIGNvbWJhdCB1bml0cycsJ2FzaWFuIGNvbWJhdCB1bml0cycsJ2JyaXRpc2ggbWlsaXRhcnknLCdLaW5ncyBBZnJpY2FuIFJpZmxlcycsJ2tlbnlhIHJlZ2ltZW50JywnbWlsaXRhcnkgKGdlbmVyaWMpJywncHN1ZWRvIGdhbmdzJywncm95YWwgYWlyIGZvcmNlJyksIAogICAgICdjaXZpbCBhdXRob3JpdGllcyc9YygnY29sb25pYWwgYXV0aG9yaXRpZXMnLCAndHJpYmFsIGF1dGhvcml0aWVzJyksCiAgICAgJ2FybWFtZW50cyc9YygnYW1tdW5pdGlvbicsJ2ZpcmVhcm1zJywnb3RoZXIgd2VhcG9ucycpLAogICAgICdwcm92aXNpb25zJz1jKCdjYXNoJywnZm9vZCcsJ2xpdmVzdG9jaycsJ21lZGljaW5lJywnc3VwcGxpZXMnKSwKICAgICAncHVibGljIGJ1aWxkaW5ncyc9YygnY2h1cmNoJywnc2Nob29sJywnaW5mcmFzdHJ1Y3R1cmUnKSAKICAgICApKQogICkKCmV2ZW50cyRpbml0aWF0b3JfY2xlYW5fMV9hZ2dtZWQgJT4lCiAgamFuaXRvcjo6dGFieWwoc29ydCA9IFRSVUUpICU+JQogIGphbml0b3I6OmFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpCmBgYAoKYGBge3IgQ29sbGFwc2UgRXZlbnQgSW5pdGF0b3JzICxjYWNoZT1UfQoKZXZlbnRzWywgYygidGFyZ2V0X2NsZWFuXzFfYWdnaGlnaCIsICJ0YXJnZXRfY2xlYW5fMl9hZ2doaWdoIiwgInRhcmdldF9jbGVhbl8zX2FnZ2hpZ2giKV0gPC0KICBldmVudHNbLCBjKCJ0YXJnZXRfY2xlYW5fMV9hZ2dtZWQiLCAidGFyZ2V0X2NsZWFuXzJfYWdnbWVkIiwgInRhcmdldF9jbGVhbl8zX2FnZ21lZCIpXQpldmVudHMgPC0gZXZlbnRzICU+JQogIG11dGF0ZV9hdCgKICAgIHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8xX2FnZ2hpZ2h8dGFyZ2V0X2NsZWFuXzJfYWdnaGlnaHx0YXJnZXRfY2xlYW5fM19hZ2doaWdoIikpLAogICAgLmZ1bnMgPSBmdW5zKGZvcmNhdHM6OmZjdF9jb2xsYXBzZSgKICAgICAgICAgICAgICAgICAgJ2dvdmVybm1lbnQnPWMoJ2NpdmlsIGF1dGhvcml0aWVzJywgJ2hvbWUgZ3VhcmQnLCAnbWlsaXRhcnknLCAncG9saWNlJywgJ3BhcmFtaWxpdGFyeScpICwKICAgICAgICAgICAgICAgICAgJ3JlYmVscyc9Yygnc3VzcGVjdGVkIGluc3VyZ2VudHMnLCdkZXRhaW5lZXMnKSAsCiAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSc9YygnYXJtYW1lbnRzJywncHJpdmF0ZSBwcm9wZXJ0eScsJ3Byb3Zpc2lvbnMnLCdwdWJsaWMgYnVpbGRpbmdzJykgLAogICAgICAgICAgICAgICAgICAnY2l2aWxpYW5zJz1jKCdjb21tdW5pdGllcycsJ2NvbW11bml0aWVzJykKICAgICAgICAgICkpCiAgKQoKZXZlbnRzJHRhcmdldF9jbGVhbl8xX2FnZ2hpZ2ggJT4lCiAgamFuaXRvcjo6dGFieWwoc29ydCA9IFRSVUUpICU+JQogIGphbml0b3I6OmFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpCmBgYAoKCgojIyBDb3VudCBvZiBJbml0aWF0b3JzIGFuZCBUYXJnZXRzCgpgYGB7ciBDb3VudCBvZiBJbml0aWF0b3JzfQoKIyBUaGVzZSBudW1iZXJzIGFyZSBlc3RpbWF0ZXMgYW5kIGNhbiBiZSBjaGFuZ2VkCiMgVGhlc2UgY29sdW1ucyBhcmUgZGlydHkgYW5kIHdoZW4gYW4gaW5jb2hlcmVudCB2YWx1ZSBpcyBnaXZlbiwgaXQgaXMgc2V0IHRvIG1pc3NpbmcuCgpyZWNvZGVfY291bnRzIDwtIGZ1bmN0aW9uKGluZGF0YSl7CiAgYWNvdXBsZSA8LSAiMiIKICBhZmV3IDwtICIzIgogIGFnYW5nIDwtICI2IgogIGFnYW5nX2xhcmdlIDwtICIxMiIKICAKICBpbmRhdGEgJT4lIHRvbG93ZXIoKSAlPiUgZHBseXI6OnJlY29kZSgKICAgICIxMDArIj0gIjEwMCIsCiAgICAiPz8iPSAiIiwKICAgICIxIGJhZyI9ICIxIiwKICAgICIxIGJsYW5rZXQiPSAiMSIsCiAgICAiMSBidXJudCBkb3duIj0gIjEiLAogICAgIjEgY2l2aWxpYW4iPSAiMSIsCiAgICAiMSBjb3csIDYgc2hlZXAiPSAiNyIsCiAgICAiMSBjb3ciPSAiMSIsCiAgICAiMSBnb2F0LCBjbG90aGluZyI9ICIxIiwKICAgICIxIGdvYXQiPSAiMSIsCiAgICAiMSBsb290ZWQiPSAiMSIsCiAgICAiMSBsb290ZWQiPSAiMSIsCiAgICAiMSBveCI9ICIxIiwKICAgICIxIHNoZWVwIGFuZCBjaGlja2VucyI9ICIxIiwKICAgICIxIHNoZWVwLCBzb21lIGNoaWNrZW5zIj0gIjEiLAogICAgIjEgc2hlZXAiPSAiMSIsCiAgICAiMSBzaG90Z3VuICwzMCByb3VuZHMiPSAiMzEiLAogICAgIjEgc2hvdGd1biArIDEwcmRzIj0gIjExIiwKICAgICIxIHN0ZWVyIj0gIjEiLAogICAgIjEgdmlsbGFnZSwgMSBtYXJrZXQiPSAiMSIsCiAgICAiMSB3b3VuZGVkIj0gIjEiLAogICAgIjEgd3JlY2tlZCI9ICIxIiwKICAgICIxKyI9ICIxIiwKICAgICIxKzMiPSAiNCIsCiAgICAiMStzb21lIj0gIjEiLAogICAgIjEwIGFjcmVzIj0gIjEwIiwKICAgICIxMCBiYWdzIj0gIjEwIiwKICAgICIxMCBjYXR0bGUiPSAiMTAiLAogICAgIjEwIHNhY2tzIj0gIjEwIiwKICAgICIxMCB0byAxMiI9ICIxMSIsCiAgICAiMTAgdG8gMTUiPSAiMTMiLAogICAgIjEwLzE0LzIwMTMiPSAiIiwKICAgICIxMC8xNS8yMDEzIj0gIiIsCiAgICAiMTAvMjAvMjAxMyI9ICIiLAogICAgIjEwMCBsYiI9ICIxMDAiLAogICAgIjEwMC0xMzAiPSAiMTE1IiwKICAgICIxMDAtMTUwIj0gIjEyNSIsCiAgICAiMTAwKyI9ICIxMDAiLAogICAgIjEwMDAwIj0gIiIsCiAgICAiMTA5IGNhdHRsZSI9ICIxMDkiLAogICAgIjEwYmFncyBwb3RhdG9lcyI9ICIxMCIsCiAgICAiMTEgY2F0dGxlIj0gIjExIiwKICAgICIxMSBzaGVlcCI9ICIxMSIsCiAgICAiMTEyIGJvcmUgJiAyMC4xLjQ1ICY3IHJkcyI9ICIxMTIiLAogICAgIjEyIGJhZ3MiPSAiMTIiLAogICAgIjEyIGNhdHRsZSI9ICIxMiIsCiAgICAiMTIgZ29hdHMiPSAiMTIiLAogICAgIjEyIHRvIDE1Ij0gIjEzIiwKICAgICIxMiB0byAyMCI9ICIxNyIsCiAgICAiMTIvMTQvMjAxMyI9ICIiLAogICAgIjEyMCBjYXR0bGUiPSAiMTIwIiwKICAgICIxMjArMSI9ICIxMjEiLAogICAgIjEzIHNoZWVwIj0gIjEzIiwKICAgICIxMy0xNSI9ICIxNCIsCiAgICAiMTMwMCB3b3J0aCI9ICIxMzAwIiwKICAgICIxNCBjYXR0bGUiPSAiMTQiLAogICAgIjE0IGdvYXRzIj0gIjE0IiwKICAgICIxNCBoZWFkIj0gIjE0IiwKICAgICIxNCsiPSAiMTQiLAogICAgIjE1IC0gMjAiPSAiMTgiLAogICAgIjE1IGNhdHRsZSI9ICIxNSIsCiAgICAiMTUgdG8gMjAiPSAiMTciLAogICAgIjE1IHRvIDIwIj0gIjE3IiwKICAgICIxNSB0byAyNSI9ICIyMCIsCiAgICAiMTUtMjAiPSAiMTciLAogICAgIjE1KyI9ICIxNSIsCiAgICAiMTUwLTIwMCI9ICIxNzUiLAogICAgIjE1MCsiPSAiMTUwIiwKICAgICIxNTEgY2F0dGxlIj0gIjE1MSIsCiAgICAiMTcgY2F0dGxlIj0gIjE3IiwKICAgICIxNzIgYmFncyBidXJudCI9ICIxNzIiLAogICAgIjE4IGNhdHRsZSI9ICIxOCIsCiAgICAiMTkgYmFncyI9ICIxOSIsCiAgICAiMTk2IHJvdW5kcyI9ICIxOTYiLAogICAgIjIgYmFncyBtYWl6ZSI9ICIyIiwKICAgICIyIGJhZ3MiPSAiMiIsCiAgICAiMiBiYWdzIj0gIjIiLAogICAgIjIgYnVja2V0cyI9ICIyIiwKICAgICIyIGNhdHRsZSBoYW1zdHJ1bmciPSAiMiIsCiAgICAiMiBjYXR0bGUsIGNvcm4iPSAiMyIsCiAgICAiMiBjYXR0bGUiPSAiMiIsCiAgICAiMiBjb3dzIj0gIjIiLAogICAgIjIgZGViYmllcyI9ICIyIiwKICAgICIyIGdvYXRzIj0gIjIiLAogICAgIjIgZ3JvdXBzIj0gIjIiLAogICAgIjIgaHV0cyBidXJudCI9ICIyIiwKICAgICIyIHNoZWVwIj0gIjIiLAogICAgIjIgd2F0Y2hlcywgY2FzaCI9ICIyIiwKICAgICIyLzMvMjAxMyI9ICIiLAogICAgIjIrIj0gIjIiLAogICAgIjIwIGJhZ3MgbWFpemUsIDkgZ29hdHMsIDMyIGNoaWNrZW5zIGFuZCBkdWNrcywgY2FzaCI9ICI2MCIsCiAgICAiMjAgYmFncyI9ICIyMCIsCiAgICAiMjAgY2F0dGxlIj0gIjIwIiwKICAgICIyMCBnb2F0cyI9ICIyMCIsCiAgICAiMjAgc2hlZXAiPSAiMjAiLAogICAgIjIwIHRvIDI1Ij0gIjIzIiwKICAgICIyMCB0byAzMCI9ICIyNSIsCiAgICAiMjAgdG8gNDAiPSAiMzAiLAogICAgIjIwLTI1Ij0gIjIzIiwKICAgICIyMC0zMCI9ICIyNSIsCiAgICAiMjAtMzUiPSAiMzAiLAogICAgIjIwLTUwIj0gIjM1IiwKICAgICIyMC8zMCI9ICIyNSIsCiAgICAiMjAvMzAiPSAiMjUiLAogICAgIjIwKyI9ICIyMCIsCiAgICAiMjAwIHlkcyI9ICIyMDAiLAogICAgIjIwMC0zMDAiPSAiMjUwIiwKICAgICIyMDArIj0gIjIwMCIsCiAgICAiMjAwMCBhY3JlcyI9ICIyMDAwIiwKICAgICIyMSBnb2F0cyI9ICIyMSIsCiAgICAiMjEgaGVhZCI9ICIyMSIsCiAgICAiMjIgY2F0dGxlIj0gIjIyIiwKICAgICIyNSB0byAzMCI9ICIyOCIsCiAgICAiMjUtMzAiPSAiMjciLAogICAgIjI1LTMwIj0gIjI3IiwKICAgICIyOCBraWxsZWQiPSAiMjgiLAogICAgIjI4IHNoZWVwIj0gIjI4IiwKICAgICIzIGJhZ3MiPSAiMyIsCiAgICAiMyBiYWdzIj0gIjMiLAogICAgIjMgYmlrZXMiPSAiMyIsCiAgICAiMyBjYXR0bGUiPSAiMyIsCiAgICAiMyBjYXR0bGUiPSAiMyIsCiAgICAiMyBnb2F0cyI9ICIzIiwKICAgICIzIG9yIDQiPSAiMyIsCiAgICAiMyBvciA0Ij0gIjMiLAogICAgIjMgcGFuZ2FzIj0gIjMiLAogICAgIjMgc2hlZXAsIDIgY2FsdmVzIj0gIjUiLAogICAgIjMgc2hlZXAiPSAiMyIsCiAgICAiMyB0byA0Ij0gIjMiLAogICAgIjMgdG8gNCI9ICIzIiwKICAgICIzLzEwLzIwMTMiPSAiIiwKICAgICIzLzQvMjAxMyI9ICIiLAogICAgIjMvNS8yMDEzIj0gIiIsCiAgICAiMy82LzIwMTMiPSAiIiwKICAgICIzKyI9ICIzIiwKICAgICIzKzMrMSsyIj0gIjkiLAogICAgIjMrc29tZSI9ICIzIiwKICAgICIzMCBhY3JlcyI9ICIzMCIsCiAgICAiMzAgY2F0dGxlIj0gIjMwIiwKICAgICIzMCB0byA0MCI9ICIzNSIsCiAgICAiMzAtMzUiPSAiMzMiLAogICAgIjMwLTQwIj0gIjM1IiwKICAgICIzMC01MCI9ICI0MCIsCiAgICAiMzArIj0gIjMwIiwKICAgICIzMDAtNDAwIj0gIjM1MCIsCiAgICAiMzAwKyI9ICIzMDAiLAogICAgIjM1IGJhZ3MiPSAiMzUiLAogICAgIjM1IHRvIDQwIj0gIjM3IiwKICAgICIzOCBjYXR0bGUiPSAiMzgiLAogICAgIjNvciA0Ij0gIjMiLAogICAgIjQgYmFncyBwb3RhdG9lcyI9ICI0IiwKICAgICI0IGJhZ3MiPSAiNCIsCiAgICAiNCBnb2F0cyI9ICI0IiwKICAgICI0IGdyb3VwcyI9ICIiLAogICAgIjQgb3IgNSI9ICI0IiwKICAgICI0IG94ZW4iPSAiNCIsCiAgICAiNCBzaGVlcCI9ICI0IiwKICAgICI0IHRvIDgiPSAiNiIsCiAgICAiNC82LzIwMTMiPSAiIiwKICAgICI0MCBiYWciPSAiNDAiLAogICAgIjQwIGNhdHRsZSI9ICI0MCIsCiAgICAiNDAgc2Fja3MiPSAiNDAiLAogICAgIjQwIHNoZWVwIj0gIjQwIiwKICAgICI0MCB0byA1MCI9ICI0NSIsCiAgICAiNDAvNTAiPSAiNDUiLAogICAgIjQwLTUwIj0gIjQ1IiwKICAgICI0MDAgY2F0dGxlIj0gIjQwMCIsCiAgICAiNDAwMCI9ICIiLAogICAgIjQwMTYxIj0iIiwKICAgICI0NCBjYXR0bGUiPSAiNDQiLAogICAgIjUgYmFncyI9ICI1IiwKICAgICI1IGNhbHZlcyI9ICI1IiwKICAgICI1IGNhdHRsZSI9ICI1IiwKICAgICI1IGRlc3Ryb3llZCI9ICI1IiwKICAgICI1IGdvYXRzIj0gIjUiLAogICAgIjUga2lsbGVkIj0gIjUiLAogICAgIjUgb3IgNiI9ICI1IiwKICAgICI1IHNoZWVwLCAxIG94Ij0gIjYiLAogICAgIjUgc2hlZXAiPSAiNSIsCiAgICAiNSB0byA2Ij0gIjUiLAogICAgIjUvMTAvMjAxMyI9ICIiLAogICAgIjUvNi8yMDEzIj0gIiIsCiAgICAiNTAgY2F0dGxlIj0gIjUwIiwKICAgICI1MCB0byA2MCI9ICI1NSIsCiAgICAiNTAtMTAwIj0gIjc1IiwKICAgICI1MC02MCI9ICI1NSIsCiAgICAiNTAtNzUiPSAiNjIiLAogICAgIjUwKyI9ICI1MCIsCiAgICAiNTArIj0gIjUwIiwKICAgICI1MDAwIGFjcmVzIj0gIjUwMDAiLAogICAgIjUxOSArIj0gIjUxOSIsCiAgICAiNTMgZGV0YWluZWQiPSAiNTMiLAogICAgIjU0IHNoZWVwIGFuZCBnb2F0cyI9ICI1NCIsCiAgICAiNTYgY29tbWl0dGVlIG1lbWJlcnMiPSAiNTYiLAogICAgIjYgYmFnIj0gIjYiLAogICAgIjYgYmFncyI9ICI2IiwKICAgICI2IGNhdHRsZSI9ICI2IiwKICAgICI2IGNhdHRsZSI9ICI2IiwKICAgICI2IGdvYXRzIj0gIjYiLAogICAgIjYgb3IgNyI9ICI2IiwKICAgICI2IHNoZWVwIGFuZCBnb2F0cyI9ICI2IiwKICAgICI2IHNoZWVwIj0gIjYiLAogICAgIjYgdG8gNyI9ICI2IiwKICAgICI2IHRvIDgiPSAiNyIsCiAgICAiNiB0byA5Ij0gIjgiLAogICAgIjYtOCBtYW4iPSAiNyIsCiAgICAiNi8xMC8yMDEzIj0gIiIsCiAgICAiNi84LzIwMTMiPSAiIiwKICAgICI2MC0xMDAiPSAiODAiLAogICAgIjYwLTcwIj0gIjY1IiwKICAgICI2NCBjYXR0bGUiPSAiNjQiLAogICAgIjcgYmFncyI9ICI3IiwKICAgICI3IGNhdHRsZSI9ICI3IiwKICAgICI3IHNoZWVwIj0gIjciLAogICAgIjcvMTAvMjAxMyI9ICIiLAogICAgIjcwIGJhZ3MiPSAiNzAiLAogICAgIjcwIGNhdHRsZSwgc2hlZXAiPSAiNzAiLAogICAgIjcwLTEwMCI9ICI4NSIsCiAgICAiNzAwMDAiPSAiIiwKICAgICI3NSByb3VuZHMiPSAiNzUiLAogICAgIjggYmFncyBwb3RhdG9lcyI9ICI4IiwKICAgICI4IGNhdHRsZSI9ICI4IiwKICAgICI4IGNvd3Mgc2xhc2hlZCI9ICI4IiwKICAgICI4IGNvd3MiPSAiOCIsCiAgICAiOCBzaGVlcCI9ICI4IiwKICAgICI4IHRvIDEwIj0gIjkiLAogICAgIjgvMTAvMjAxMyI9ICIiLAogICAgIjgwIGNhdHRsZSI9ICI4MCIsCiAgICAiODAtMTAwIj0gIjkwIiwKICAgICI4NCBzaGVlcCwgMSBjb3csIDUgY2hpY2tlbnMiPSAiOTAiLAogICAgIjkgY2F0dGxlIj0gIjkiLAogICAgIjkgc2hlZXAiPSAiOSIsCiAgICAiOSB0byAxMCI9ICI5IiwKICAgICI5KzkiPSAiMTgiLAogICAgIjkwMChub3QgY2xlYXIpIj0gIjkwMCIsCiAgICAiYWxsIGxvY2FscyI9ICIiLAogICAgImFsbCI9ICIiLAogICAgImFwcCA1Ij0gIjUiLAogICAgImFwcC4gMTAwIj0gIjEwMCIsCiAgICAiYXBwLiAxMjAiPSAiMTIwIiwKICAgICJhcm1lZCBnYW5nIj0gYWdhbmcsCiAgICAiYmFuZCI9IGFnYW5nLAogICAgImJhbmRzIj0gIiIsCiAgICAiY2F0dGxlIHNsYXNoaW5nIj0gIiIsCiAgICAiY2xvdGhpbmciPSAiIiwKICAgICJjb25zaWRlcmFibGUgcXVhbnRpdHkiPSAiIiwKICAgICJmYWlybHkgbGFyZ2UgZ2FuZyI9IGFnYW5nX2xhcmdlLAogICAgImZldyBiYWdzIj0gIiIsCiAgICAiZmV3Ij0gIiIsCiAgICAiZm9vZCI9ICIiLAogICAgImdhbmciPSBhZ2FuZywKICAgICJnYW5ncyI9IGFnYW5nX2xhcmdlLAogICAgImd1YXJkcyI9IGFmZXcsCiAgICAiaGFsZiB2aWxsYWdlIj0gIiIsCiAgICAibGFib3VyIj0gIiIsCiAgICAibGFyZ2UgY3Jvd2QiPSAiIiwKICAgICJsYXJnZSBmb3JjZSI9IGFnYW5nX2xhcmdlLAogICAgImxhcmdlIGdhbmciPSBhZ2FuZ19sYXJnZSwKICAgICJsYXJnZSBtZWV0aW5nIj0gIiIsCiAgICAibGFyZ2UgbnVtYmVyIj0gIiIsCiAgICAibGFyZ2UgbnVtYmVycyI9ICIiLAogICAgImxhcmdlIHF1YW50aXRpZXMiPSAiIiwKICAgICJsYXJnZSBxdWFudGl0eSI9ICIiLAogICAgImxhcmdlIHJlLW9hdGhpbmcgY2VyZW1vbnkiPSAiIiwKICAgICJsYXJnZSBzY2FsZSI9ICIiLAogICAgImxhcmdlIj0gYWdhbmdfbGFyZ2UsCiAgICAibGFyZ2lzaCBnYW5nIj0gYWdhbmdfbGFyZ2UsCiAgICAibG9jYWwgcG9wdWxhY2UiPSAiIiwKICAgICJtYW55IHRob3VzYW5kIj0gIjIwMDAiLAogICAgIm1vYiI9ICIiLAogICAgIm5vdCBnaXZlbiI9ICIiLAogICAgIm51bWJlciI9ICIiLAogICAgIm9jY3VwYW50cyI9ICIiLAogICAgIm92ZXIgMjAwIj0gIjIwMCIsCiAgICAiUGFydHkiPSBhZ2FuZywKICAgICJwYXJ0eSI9IGFnYW5nLAogICAgInBhdHJvbCI9IGFnYW5nLAogICAgInBvc2hvIj0gIiIsCiAgICAicG90YXRvZXMiPSAiIiwKICAgICJxdWFudGl0eSBvZiBjbG90aGluZyI9ICIiLAogICAgInNlY3Rpb24iPSAiIiwKICAgICJzZXZlcmFsIGdhbmdzIj0gYWdhbmdfbGFyZ2UsCiAgICAic2V2ZXJhbCI9ICIzIiwKICAgICJzaGVlcCBhbmQgZ29hdHMiPSAiIiwKICAgICJzaHMgMiwzMDAvLSI9ICIyMzAwIiwKICAgICJzaHMgNjAvLSI9ICI2MCIsCiAgICAic2hzLiAxLDAwMCI9ICIxMDAwIiwKICAgICJzaHMuIDE4Ij0gIjE4IiwKICAgICJzaHMuIDMwIj0gIjMwIiwKICAgICJzbWFsbCBnYW5nIj0gYWdhbmcsCiAgICAic21hbGwgZ2FuZ3MiPSBhZ2FuZywKICAgICJzbWFsbCBncm91cCI9IGFnYW5nLAogICAgInNtYWxsIHBhcnR5Ij0gYWZldywKICAgICJzbWFsbCI9IGFnYW5nLAogICAgInNvbWUiPSBhZmV3LAogICAgInN1ZmZpY2llbnQgZm9vZCI9ICIiLAogICAgInVua25vd24iPSAiIiwKICAgICJ2ZXJ5IGxhcmdlIGdhbmciPSBhZ2FuZ19sYXJnZSwKICAgICJ2aWxsYWdlcyBpbiBuZGlhLCBnaWNodWd1LCBlbWJ1IGRpdmlzaW9ucyI9ICIiLAogICAgIndpdmVzIj0gIiIKICApICU+JSBhcy5udW1lcmljKCkgJT4lIHJldHVybigpCiAgCn0KCmV2ZW50cyRpbml0aWF0b3JfbnVtYmVyc19udW1lcmljIDwtIGV2ZW50cyRpbml0aWF0b3JfbnVtYmVycyAlPiUgcmVjb2RlX2NvdW50cygpCmV2ZW50cyR0YXJnZXRfbnVtYmVyc19udW1lcmljIDwtIGV2ZW50cyR0YXJnZXRfbnVtYmVycyAlPiUgcmVjb2RlX2NvdW50cygpCmV2ZW50cyRhZmZlY3RlZF9jb3VudF9udW1lcmljIDwtIGV2ZW50cyRhZmZlY3RlZF9jb3VudCAlPiUgcmVjb2RlX2NvdW50cygpCgoKYGBgCgojIENhc3VhbHRpZXMKCmBgYHtyIENhc3VhbHRpZXMsIHJlc3VsdHM9ImFzaXMifQoKZXZlbnRzWywgYygKICAiZ292ZXJubWVudF9raWxsZWRfY2xlYW4iLCAiZ292ZXJubWVudF93b3VuZGVkX2NsZWFuIiwgImdvdmVybm1lbnRfY2FwdHVyZWRfY2xlYW4iLAogICJyZWJlbHNfa2lsbGVkX2NsZWFuIiwgInJlYmVsc193b3VuZGVkX2NsZWFuIiwgInJlYmVsc19jYXB0dXJlZF9jbGVhbiIsCiAgImNpdmlsaWFuc19raWxsZWRfY2xlYW4iLCAiY2l2aWxpYW5zX3dvdW5kZWRfY2xlYW4iLCAiY2l2aWxpYW5zX2NhcHR1cmVkX2NsZWFuIgopXSA8LQogIGV2ZW50c1ssIGMoCiAgICAiZ292ZXJubWVudF9raWxsZWQiLCAiZ292ZXJubWVudF93b3VuZGVkIiwgImdvdmVybm1lbnRfY2FwdHVyZWQiLAogICAgInJlYmVsc19raWxsZWQiLCAicmViZWxzX3dvdW5kZWQiLCAicmViZWxzX2NhcHR1cmVkIiwKICAgICJjaXZpbGlhbnNfa2lsbGVkIiwgImNpdmlsaWFuc193b3VuZGVkIiwgImNpdmlsaWFuc19jYXB0dXJlZCIKICApXQoKZXZlbnRzIDwtIGV2ZW50cyAlPiUgbXV0YXRlX2F0KAogIC52YXJzID0gYygKICAgICJnb3Zlcm5tZW50X2tpbGxlZF9jbGVhbiIsICJnb3Zlcm5tZW50X3dvdW5kZWRfY2xlYW4iLCAiZ292ZXJubWVudF9jYXB0dXJlZF9jbGVhbiIsCiAgICAicmViZWxzX2tpbGxlZF9jbGVhbiIsICJyZWJlbHNfd291bmRlZF9jbGVhbiIsICJyZWJlbHNfY2FwdHVyZWRfY2xlYW4iLAogICAgImNpdmlsaWFuc19raWxsZWRfY2xlYW4iLCAiY2l2aWxpYW5zX3dvdW5kZWRfY2xlYW4iLCAiY2l2aWxpYW5zX2NhcHR1cmVkX2NsZWFuIgogICksCiAgZnVucyhhcy5udW1lcmljKGZvcmNhdHM6OmZjdF9jb2xsYXBzZSguLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnPWMoJ3VuS25vd24nLCd1bmtub3duJywnVW5Lbm93bicsJ1VOS05PV04nLCdVbmtvd24nLCdVbmtub3duJywnTnVtYmVyJywnTW9yZScsJzEwMScsJzE0NicsJzEyMicsJzIwOCcsJzk0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMic9YygnRmV3Jywnb3RoZXJzJywnRmV3Jywnc29tZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMnPWMoJ01hbnknLCdTZXZhcmFsJywnc2V2ZXJhbCcsJ1NldmVyYWwgTW9yZScsJ1NldmVyYWwgb3RoZXJzJywnU29tZScsJ0NvdW5jaWwgb2YgZWxkZXJzJywnQ291bmNpbCBvZiB3YXInLCdTZXZlcmFsJywnTWFqb3JpdHknLCdtYW55JywnR2FuZycsJ1NldmVyYWwnLCdTbWFsbCBnYW5nJywnMysnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDAnPScxMDArJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyMyc9JzIzIEZhbWlsaWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyOCc9JzI4IGZhbWlsaWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICczNSc9JzMwLTQwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1MCc9JzUwKycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNDUnPSc0NTAwJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnODAnPSc4MDAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2Jz0nNisnICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTAnPScxMCsnICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDE5Nyc9TkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNyc9JzQ4JykgJT4lCiAgICAgICAgICAgICAgICAgICAgZmN0X2V4cGxpY2l0X25hKG5hX2xldmVsPScwJykKICAgICAgICAgICAgICAgICAgKQogICAgICAgKQopCgpldmVudHMgPC0gZXZlbnRzICU+JSBtdXRhdGVfYXQoLnZhcnMgPSBjKAogICJnb3Zlcm5tZW50X2tpbGxlZF9jbGVhbiIsICJnb3Zlcm5tZW50X3dvdW5kZWRfY2xlYW4iLCAiZ292ZXJubWVudF9jYXB0dXJlZF9jbGVhbiIsCiAgInJlYmVsc19raWxsZWRfY2xlYW4iLCAicmViZWxzX3dvdW5kZWRfY2xlYW4iLCAicmViZWxzX2NhcHR1cmVkX2NsZWFuIiwKICAiY2l2aWxpYW5zX2tpbGxlZF9jbGVhbiIsICJjaXZpbGlhbnNfd291bmRlZF9jbGVhbiIsICJjaXZpbGlhbnNfY2FwdHVyZWRfY2xlYW4iCiksIGZ1bnMoYXMubnVtZXJpYykpCgpldmVudHMgPC0gZXZlbnRzICU+JQogIG11dGF0ZShyZWJlbHNfa2lsbGVkd291bmRlZF9jbGVhbiA9IHJlYmVsc19raWxsZWRfY2xlYW4gKyByZWJlbHNfd291bmRlZF9jbGVhbikgJT4lCiAgbXV0YXRlKGdvdmVybm1lbnRfa2lsbGVkX3dvdW5kZWRfY2xlYW4gPSBnb3Zlcm5tZW50X2tpbGxlZF9jbGVhbiArIGdvdmVybm1lbnRfd291bmRlZF9jbGVhbikgJT4lCiAgbXV0YXRlKHJlYmVsc19nb3Zlcm5tZW50X2tpbGxlZHdvdW5kZWRfY2xlYW4gPSByZWJlbHNfa2lsbGVkX2NsZWFuICsgcmViZWxzX3dvdW5kZWRfY2xlYW4pICU+JQogIG11dGF0ZShyZWJlbHNfZ292ZXJubWVudF9raWxsZWRfY2xlYW4gPSByZWJlbHNfa2lsbGVkX2NsZWFuICsgZ292ZXJubWVudF9raWxsZWRfY2xlYW4pICU+JQogIG11dGF0ZShyZWJlbHNfZ292ZXJubWVudF9jaXZpbGlhbnNfa2lsbGVkX2NsZWFuID0gcmViZWxzX2tpbGxlZF9jbGVhbiArIGdvdmVybm1lbnRfa2lsbGVkX2NsZWFuICsgY2l2aWxpYW5zX2tpbGxlZF9jbGVhbikKCmBgYAoKYGBge3IgQ29sbGFwc2UgRXZlbnQgVHlwZXMsY2FjaGU9VH0KCmV2ZW50cyAlPiUgamFuaXRvcjo6Y3Jvc3N0YWIoaW5pdGlhdG9yX2NsZWFuXzFfYWdnaGlnaCwgdHlwZV9jbGVhbl9hZ2doaWdoKSAlPiUgamFuaXRvcjo6YWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkKZXZlbnRzICU+JSBqYW5pdG9yOjpjcm9zc3RhYih0YXJnZXRfY2xlYW5fMV9hZ2doaWdoLCB0eXBlX2NsZWFuX2FnZ2hpZ2gpICU+JSBqYW5pdG9yOjphZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQpldmVudHMgJT4lIGphbml0b3I6OmNyb3NzdGFiKHRhcmdldF9jbGVhbl8xX2FnZ2hpZ2gsIGluaXRpYXRvcl9jbGVhbl8xX2FnZ2hpZ2gpICU+JSBqYW5pdG9yOjphZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQpgYGAKCgoKIyBDbGVhbiBNYXAgQ29vcmRpbmF0ZXMgKEVhc3QgQWZyaWNhIEdyaWQgU3lzdGVtKQoKYGBge3IgfQoKY2F0KCJcMDE0IikKCiNDYXNlcyB0byBoYW5kbGUKIyI5MjgxNDEiCiMiMzExNDQ5ICAzMjg0NDUgICAgMzM4NDQzIgojIkVBU1RJTkcgMzAgYW5kIDI3IgojIkVhc3RMZWlnaCBTZWN0LjciCiMiRkFSTSA1MzUvNCIKIyJIQUMgIDAyMDIiCiMiSEFDLjU3NzIzNiIKIyJIWk4gOTc0NjQxICYgSFpOIDk3NDY1MSIKIyJIWkouIDg1OTUiCiMiSFpKLiA0NjU3NjUsIEhaSi4gNDU5NzcxLCBIWkouIDQ1MTc1NiIKIyJIWkogNDI3NjUsIEhaSiA0MjM3NWFuZCBIWkogNDI5NzYxIgojIkhaSCA5NjA2MTAsIEhaSCA5NjA2MzAsIEhaSCA5Nzc1MzgiCiMiSC5aLlIuIDQ3ODYiCiMiSEFEIDE3MDgsIEhBRCAxNzA5IgojIkhBRCAzMzI2LzMzMjciCiMiSFpKIDQyNzY1LCBIWkogNDIzNzVhbmQgSFpKIDQyOTc2MSIKIyJIWkogOTUxOCAgOTYxNyIKIyJIWlAgNzQzMCwgSFpQIDkwMjksIEhaUCA2NDQ4LCBIWlAgNzI1MiwgSFpQIDk0NDgiCgpldmVudHMkbWFwX2Nvb3JkaW5hdGUgJT4lIGphbml0b3I6OnRhYnlsKCkgCgpldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW4gPC0gZXZlbnRzJG1hcF9jb29yZGluYXRlICU+JSBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIltbOnB1bmN0Ol1dfCAiLCAiIikgCihldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbGVuZ3RoIDwtIGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbiAlPiUgbmNoYXIoKSApICU+JSBqYW5pdG9yOjp0YWJ5bCgpICU+JSByb3VuZCgzKQoKKGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl90ZXh0IDwtIGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbiAlPiUgZ3N1YigiWzAtOV0iLCAiXFwxIiwuKSkgJT4lIGphbml0b3I6OnRhYnlsKCkgICU+JSBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsMikgI1NwbGl0IGludG8gYSB0ZXh0IGNvbXBvbmVudCBhbmQgbnVtZXJpYyBjb21wb25lbnQKKGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9udW1iZXIgPC0gZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuICU+JSBnc3ViKCJbQS1aYS16XSIsICJcXDEiLCAuKSApICU+JSBqYW5pdG9yOjp0YWJ5bCgpICAlPiUgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLDIpCgooZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX3RleHRfYmFuZCA8LSBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fdGV4dCAlPiUgc3Vic3RyaW5nKDEsMSkgKSAlPiUgamFuaXRvcjo6dGFieWwoKSAgJT4lIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwyKQooZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX3RleHRfYmxvY2sgPC0gZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX3RleHQgJT4lIHN1YnN0cmluZygyLDIpICkgJT4lIGphbml0b3I6OnRhYnlsKCkgICU+JSBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsMikKKGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl90ZXh0X3N1YmJsb2NrIDwtICBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fdGV4dCAlPiUgIHN1YnN0cmluZygzLDMpICkgJT4lIGphbml0b3I6OnRhYnlsKCkgICU+JSBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsMikKCihldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbnVtYmVyX2xlbmd0aCA8LSBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbnVtYmVyICU+JSBuY2hhcigpICkgJT4lIGphbml0b3I6OnRhYnlsKCkgICU+JSBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsMikKKGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9udW1iZXJfZWFzdGluZyA8LSBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbnVtYmVyICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyaW5nKDEsIGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9udW1iZXJfbGVuZ3RoLzIpICU+JSBhcy5udW1lcmljKCkgKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphbml0b3I6OnRhYnlsKCkgICU+JSBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsMikKCihldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbnVtYmVyX25vcnRoaW5nIDwtIGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9udW1iZXIgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHJpbmcoZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX251bWJlcl9sZW5ndGgvMisxLCBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbnVtYmVyX2xlbmd0aCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5udW1lcmljKCkgKSAgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYW5pdG9yOjp0YWJ5bCgpICAlPiUgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLDIpCgpgYGAKCiMjIENvbnZlcnQgQ29vcmRpbmF0ZXMgdG8gbGF0IGxvbmcKCmBgYHtyICxyZXN1bHRzPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PUZBTFNFfQoKIwoKY2F0KCJcMDE0IikKcHJpbnQoIlN0YXJ0aW5nIENvbnZlcnRpbmcgQ29vcmRpbmF0ZXMsIG1heSB0YWtlIHNvbWUgdGltZSIpCmZvcihpIGluIDE6bnJvdyhldmVudHMpKXsKICAjIHByaW50KGkpCiAgI1RoZSDigJxleHBvc2l0aW9u4oCdIHBpcGUgb3BlcmF0b3IsICUkJSBleHBvc2VzIHRoZSBuYW1lcyB3aXRoaW4gdGhlIGxlZnQtaGFuZCBzaWRlIG9iamVjdCB0byB0aGUgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb24uIEVzc2VudGlhbGx5LCBpdCBpcyBhIHNob3J0LWhhbmQgZm9yIHVzaW5nIHRoZSB3aXRoIGZ1bmN0aW9ucyAKICBzdXBwcmVzc01lc3NhZ2VzKHsKICAgIHRlbXAgPC0gd2l0aChldmVudHNbaSxdICwKICAgICAgICAgICAgICAgICBNZWFzdXJpbmdMYW5kc2NhcGU6OjpFQUdTMkxhdExvbmcoYmFuZD1tYXBfY29vcmRpbmF0ZV9jbGVhbl90ZXh0X2JhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaz1tYXBfY29vcmRpbmF0ZV9jbGVhbl90ZXh0X2Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYmxvY2s9bWFwX2Nvb3JkaW5hdGVfY2xlYW5fdGV4dF9zdWJibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc3Rpbmc9bWFwX2Nvb3JkaW5hdGVfY2xlYW5fbnVtYmVyX2Vhc3RpbmcgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcnRoaW5nPW1hcF9jb29yZGluYXRlX2NsZWFuX251bWJlcl9ub3J0aGluZykKICAgICkKICAgIGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sYXRpdHVkZVtpXSA8LSB0ZW1wJGxhdGl0dWRlCiAgICBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbG9uZ2l0dWRlW2ldIDwtIHRlbXAkbG9uZ2l0dWRlCiAgfSkKICAjcHJpbnQoaXMubmEoZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX2xhdGl0dWRlW2ldKSkKfQpwcmludCgiRmluaXNoZWQgQ29udmVydGluZyBDb29yZGluYXRlcyIpCgpgYGAKCmBgYHtyfQoKIyh0ZW1wIDwtIGV2ZW50cyAlPiUgbXV0YXRlKG1hcF9jb29yZGluYXRlX2NsZWFuX3Jvdz0xOm4oKSkgJT4lIGZpbHRlcihpcy5uYShtYXBfY29vcmRpbmF0ZV9jbGVhbl9sYXRpdHVkZSkgJiAhaXMubmEobWFwX2Nvb3JkaW5hdGVfY2xlYW4pKSAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJtYXBfY29vcmRpbmF0ZV9jbGVhbiIpKSApICU+JSBkaXN0aW5jdCgpICU+JSBwcmludChuPTQwKSAjdmlzdWFsaXplIGVycm9ycwojZGltKHRlbXApICMxOTUgY29vcmRpbmF0ZXMgZG9uJ3QgY29udmVydC4KCnRlc3Rpbmc9RgppZih0ZXN0aW5nKXsKICBpPTM2ODQKICBldmVudHNbaSxdICU+JSAgc2VsZWN0KHN0YXJ0c193aXRoKCJtYXBfY29vcmRpbmF0ZV9jbGVhbiIpKSAlJCUgRUFHUzJMYXRMb25nKGJhbmQ9bWFwX2Nvb3JkaW5hdGVfY2xlYW5fdGV4dF9iYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaz1tYXBfY29vcmRpbmF0ZV9jbGVhbl90ZXh0X2Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJibG9jaz1tYXBfY29vcmRpbmF0ZV9jbGVhbl90ZXh0X3N1YmJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXN0aW5nPW1hcF9jb29yZGluYXRlX2NsZWFuX251bWJlcl9lYXN0aW5nICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcnRoaW5nPW1hcF9jb29yZGluYXRlX2NsZWFuX251bWJlcl9ub3J0aGluZykKICAKICB3aXRoKGV2ZW50c1tpLF0sIG1hcF9jb29yZGluYXRlX2NsZWFuKQogIHdpdGgoZXZlbnRzW2ksXSwgbWFwX2Nvb3JkaW5hdGUpCiAgYmFuZCA8LSB3aXRoKGV2ZW50c1tpLF0sIG1hcF9jb29yZGluYXRlX2NsZWFuX3RleHRfYmFuZCkKICBibG9jayA8LSB3aXRoKGV2ZW50c1tpLF0sbWFwX2Nvb3JkaW5hdGVfY2xlYW5fdGV4dF9ibG9jaykKICBzdWJibG9jayA8LSB3aXRoKGV2ZW50c1tpLF0sbWFwX2Nvb3JkaW5hdGVfY2xlYW5fdGV4dF9zdWJibG9jaykgIwogIGVhc3RpbmcgPC0gd2l0aChldmVudHNbaSxdLG1hcF9jb29yZGluYXRlX2NsZWFuX251bWJlcl9lYXN0aW5nKQogIG5vcnRoaW5nIDwtIHdpdGgoZXZlbnRzW2ksXSxtYXBfY29vcmRpbmF0ZV9jbGVhbl9udW1iZXJfbm9ydGhpbmcpCn0KCnN0YXRzOjpxdWFudGlsZShldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbGF0aXR1ZGUsIHByb2JzID1jKC4wMDUsLjAxLC4xLC41LC45LC45OSwuOTk1KSwgbmEucm09VCwgdHlwZT05KSAKc3RhdHM6OnF1YW50aWxlKGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sb25naXR1ZGUsIHByb2JzID1jKC4wMDUsLjAxLC4xLC41LC45LC45OSwuOTk1KSwgbmEucm09VCwgdHlwZT05KQojcGxvdChldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbG9uZ2l0dWRlLGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sYXRpdHVkZSkgI3Bsb3Qgd2l0aCB0aGUgb3V0bGllcnMKCiNUaGlzIGlzIGp1c3QgdG8gcmVtb3ZlIGFic29sdXRlbHkgY2xlYXIgb3V0bGllcnMuIE5vdCB0byBzZXQgdGhlIHJlZ2lvbiBvZiBpbnRlcmVzdC4KI091dGxpZXIgQm91bmRpbmcgQm94OgojTkUgNC42MjkzMywgNDEuODk5MDU5CiNTVyAtNC43MTcxMiwgMzMuOTA4ODQKZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX2xhdGl0dWRlW2V2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sYXRpdHVkZSA8IC00LjcxNzEyIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbGF0aXR1ZGU+NC42MjkzM10gPC0gTkEKZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX2xvbmdpdHVkZVtldmVudHMkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbG9uZ2l0dWRlIDwgMzMuOTA4ODQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sb25naXR1ZGU+NDEuODk5MDU5XSA8LSBOQQpwbG90KGV2ZW50cyRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sb25naXR1ZGUsZXZlbnRzJG1hcF9jb29yZGluYXRlX2NsZWFuX2xhdGl0dWRlKQoKYGBgCgogICAgCgojIERpc3RyaWN0IG9mIERvY3VtZW50CgoKYGBge3IgLCByZXN1bHRzPSJhc2lzIn0KCmNhdCgiXDAxNCIpCgojY2xlYW4gZG9jdW1lbnQgZGlzdHJpY3QKZXZlbnRzJGRvY3VtZW50X2Rpc3RyaWN0X2NsZWFuIDwtIGV2ZW50cyRkb2N1bWVudF9kaXN0cmljdCAlPiUgc3RyaW5naTo6c3RyaV90cmFuc190b3RpdGxlKCkgJT4lIHN0cmluZ3I6OnN0cl90cmltKCkgJT4lIGFzLmZhY3RvcigpCgpldmVudHMkZG9jdW1lbnRfZGlzdHJpY3RfY2xlYW4gPC0gZXZlbnRzJGRvY3VtZW50X2Rpc3RyaWN0X2NsZWFuICU+JSBmb3JjYXRzOjpmY3RfY29sbGFwc2UoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbWJ1Jz1jKCdFbWJ1LUZvcnQgSGFsbCBCb3JkZXInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFyaW5nbyc9YygnQkFSSU5HTycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGT1JUIEhBTEwnPWMoJ0ZvcnQgSGFsbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOYWl2YXNoYSc9YygnTmF2aWFzaGEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTnllcmknID0gYygnTnllcmkgU2V0dGxlZCBBcmVhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ055ZXJpJyA9IGMoJ1NvdXRoIE55ZXJpIFJlc2VydmUnKSAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05haXJvYmknID0gYygnSm9jayBTY290dCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEw9YygnJywnICcgLCdEb2N1bWVudCBEaXN0cmljdCcsJ0tpdHVpJywnTWF0YXRoaWEnLCAnSC9NJywnUmVmZXJlbmNlIFNlcmlhbCcpCikKCgpldmVudHMkZG9jdW1lbnRfdW5pdF90eXBlIDwtIE5BCmNvbmRpdGlvbiA8LSBldmVudHMkZG9jdW1lbnRfZGlzdHJpY3RfY2xlYW4gJWluJSBjKCJSaWZ0IFZhbGxleSIsIkNlbnRyYWwgUHJvdmluY2UiKTsgdGFibGUoY29uZGl0aW9uKQpldmVudHMkZG9jdW1lbnRfdW5pdF90eXBlW2NvbmRpdGlvbl0gPC0gIlByb3ZpbmNlIgoKI0pvY2sgU2NvdHQgTmFpcm9iaSBDaXR5CmNvbmRpdGlvbiA8LSBldmVudHMkZG9jdW1lbnRfZGlzdHJpY3RfY2xlYW4gJWluJSBjKCJOYWlyb2JpIik7IHRhYmxlKGNvbmRpdGlvbikKZXZlbnRzJGRvY3VtZW50X3VuaXRfdHlwZVtjb25kaXRpb25dIDwtICJDaXR5IgoKY29uZGl0aW9uIDwtIGV2ZW50cyRkb2N1bWVudF9kaXN0cmljdCAlaW4lIGMoIkpPQ0sgU0NPVFQiKTsgdGFibGUoY29uZGl0aW9uKQpldmVudHMkZG9jdW1lbnRfdW5pdF90eXBlW2NvbmRpdGlvbl0gPC0gIk9wZXJhdGlvbiBKb2NrIFNjb3R0IgoKCiNNaXNzaW5nPyBFbGdleW8vTWFyYWt3ZXQKI0JhcmluZ28sICwgRW1idSwgRm9ydCBIYWxsLCBLYWppYWRvLCBLaWFtYnUsIEtpdHVpLCBMYWlraXBpYSwgTWFjaGFrb3MsIE1lcnUsIE5haXZhc2hhLCBOYWt1cnUsIE5hbnl1a2ksIE5hcm9rLCBOeWVyaSwgVGhpa2EKY29uZGl0aW9uIDwtIGV2ZW50cyRkb2N1bWVudF9kaXN0cmljdF9jbGVhbiAlaW4lIGMoIkJhcmluZ28iLCJFbWJ1IiwiRm9ydCBIYWxsIiwiS2FqaWFkbyIsIktpYW1idSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFpa2lwaWEiLCJNYWNoYWtvcyIsIk1lcnUiLCJOYWl2YXNoYSIsIk5ha3VydSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbnl1a2kiLCJOYXJvayIsIk55ZXJpIiwiVGhpa2EiKTsgdGFibGUoY29uZGl0aW9uKQpldmVudHMkZG9jdW1lbnRfdW5pdF90eXBlW2NvbmRpdGlvbl0gPC0gIkRpc3RyaWN0IgoKZXZlbnRzJGRvY3VtZW50X3VuaXRfdHlwZSAlPiUKICBqYW5pdG9yOjp0YWJ5bChzb3J0ID0gVFJVRSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkKCmV2ZW50cyRkb2N1bWVudF9kaXN0cmljdF9jbGVhbiAgJT4lCiAgamFuaXRvcjo6dGFieWwoc29ydCA9IFRSVUUpICU+JQogIGphbml0b3I6OmFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpCgpgYGAKCiMgSGFuZGxlIHN1ZmZpeGVzIGFuZCBkaXJlY3Rpb25zCgpgYGB7ciwgY2FjaGU9VCB9CgojIE5vdyB3ZSBuZWVkIHRvIGhhbmRsZSBzdWZmaXhlcyBhbmQgY29tYmluZWQgbG9jYXRpb25zCiMgImZhcm0iIG5vdyBpcyBmb2xsb3dlZCBieSB0aGluZ3MgYmVjYXVzZSB0aGV5IGNydW5jaGVkIGluIGFkZGl0aW9uYWwgbG9jYXRpb24gaW5mbyBhdCB0aGUgZW5kCiMjICJjb2xlcyBlc3RhdGUgZmFybQojIyBhZ3JpY3VsdHVyZSBleHBlcmltZW50YWwgZmFybQojIyBkZW1vbnN0cmF0aW9uIGZhcm0KIyMgImZhcm0gbmVhciBjaHVybyIKIyMgcmV1YmVucyBmYXJtIG5lYXIgY2h1cm8KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpldmVudHMkbG9jYXRpb25fdGV4dF9ydWxlY2xlYW4gPC0gZXZlbnRzJGxvY2F0aW9uX3RleHQgJT4lIHN0cmluZ3I6OnN0cl90cmltKCkgJT4lIHRvbG93ZXIoKQpldmVudHMgPC0gZXZlbnRzICU+JSAKICAgICAgICAgIGRwbHlyOjpzZWxlY3QoLW9uZV9vZigibG9jYXRpb25fdGV4dF9ydWxlY2xlYW5fY29ubmVjdG9yX3ByZWZpeCIsImxvY2F0aW9uX3RleHRfcnVsZWNsZWFuX2Nvbm5lY3Rvcl9zdWZmaXgiKSkgJT4lICAjdGhpcyBpbnRlbnRpb25hbGx5IHRocm93cyBhIHdhcm5pbmcKICAgICAgICAgIHRpZHlyIDo6c2VwYXJhdGUoY29sPWxvY2F0aW9uX3RleHRfcnVsZWNsZWFuLAogICAgICAgICAgICAgICAgICAgIGludG89YygibG9jYXRpb25fdGV4dF9ydWxlY2xlYW5fY29ubmVjdG9yX3ByZWZpeCIsImxvY2F0aW9uX3RleHRfcnVsZWNsZWFuX2Nvbm5lY3Rvcl9zdWZmaXgiKSwKICAgICAgICAgICAgICAgICAgICBzZXAgPSAiIG9mIHwgbmVhciAiLCByZW1vdmU9RiwgZXh0cmE9ImRyb3AiLCBmaWxsPSJyaWdodCIpCgpgYGAKCgoKYGBge3J9CgpldmVudHMgPC0gZXZlbnRzICU+JSBtdXRhdGUobmFtZV9jbGVhbj1zdHJpbmdyOjpzdHJfdHJpbSh0b2xvd2VyKGxvY2F0aW9uX3RleHQpKSkgJT4lCiAgICAgICAgICAgbXV0YXRlKG5hbWVfY2xlYW5fcG9zZXNzaXZlPWdyZXBsKCInc3xgcyIsbmFtZV9jbGVhbikpICU+JQogICAgICAgICAgIG11dGF0ZShuYW1lX2NsZWFuZXI9dHJpbXdzKG5hbWVfY2xlYW4pICApICU+JQogICAgICAgICAgIG11dGF0ZShuYW1lX2NsZWFuZXI9Z3N1YigiJ3N8YHMiLCIiLG5hbWVfY2xlYW5lciwgZml4ZWQ9VCkgICkgJT4lCiAgICAgICAgICAgbXV0YXRlKG5hbWVfY2xlYW5lcj0gc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKG5hbWVfY2xlYW5lciwgIltbOnB1bmN0Ol1dfGAiLCAiIikgICkgJT4lIAogICAgICAgICAgIG11dGF0ZShuYW1lX2NsZWFuZXI9IHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChuYW1lX2NsZWFuZXIsICJbXls6YWxudW06XSBdIiwgIiIpICApICU+JSAgI3JlbW92ZXMgYWxsIHRoZSB3ZWlyZCB1bmljb2RlIGFuZCBhc2NpaQogICAgICAgICAgIG11dGF0ZShuYW1lX2NsZWFuZXI9dHJpbXdzKG5hbWVfY2xlYW5lcikgICkgJT4lCiAgICAgICAgICAgbXV0YXRlKG5hbWVfY2xlYW5lcl9ub3NwYWNlPSBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwobmFtZV9jbGVhbmVyLCAiICIsICIiKSApCgoKYGBgCgojIENyZWF0ZSBhIFNpbXBsZSBGZWF0dXJlcyBWZXJzaW9uIEdJUyBWZXJzaW9uCgoKYGBge3J9CgpldmVudHNfc2YgPC0gZXZlbnRzICU+JSAjIGZpbHRlcighaXMubmEobG9uZ2l0dWRlKSAmICFpcy5uYShsYXRpdHVkZSkpICAlPiUKICBkaXN0aW5jdCgpICU+JQogICMgZmlsdGVyKCBiZXR3ZWVuKGxvbmdpdHVkZSwgMzAuMCw0NS4wKSAgKSAgJT4lICAjRmxhZyBST0kgYnV0IGRvbid0IHN1YnNldCBvbiBpdCB5ZXQKICAjIGZpbHRlciggYmV0d2VlbihsYXRpdHVkZSwgLTUuMCw1LjApICkgJT4lCiAgbXV0YXRlKG5hbWVfY2xlYW4gPSBzdHJpbmdyOjpzdHJfdHJpbSh0b2xvd2VyKGxvY2F0aW9uX3RleHQpKSkgJT4lCiAgbXV0YXRlKG5hbWVfY2xlYW5fcG9zZXNzaXZlID0gZ3JlcGwoIidzfGBzIiwgbmFtZV9jbGVhbikpICU+JQogIG11dGF0ZShuYW1lX2NsZWFuZXIgPSB0cmltd3MobmFtZV9jbGVhbikpICU+JQogIG11dGF0ZShuYW1lX2NsZWFuZXIgPSBnc3ViKCInc3xgcyIsICIiLCBuYW1lX2NsZWFuZXIsIGZpeGVkID0gVCkpICU+JQogIG11dGF0ZShuYW1lX2NsZWFuZXIgPSBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwobmFtZV9jbGVhbmVyLCAiW1s6cHVuY3Q6XV18YCIsICIiKSkgJT4lCiAgbXV0YXRlKG5hbWVfY2xlYW5lciA9IHRyaW13cyhuYW1lX2NsZWFuZXIpKSAlPiUKICBtdXRhdGUobmFtZV9jbGVhbmVyX25vc3BhY2UgPSBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwobmFtZV9jbGVhbmVyLCAiICIsICIiKSkKCiMgQXZvaWQgY3JlYXRpbmcgZ2VvbWV0cmllcyB3aGVyZSBvbmUgb2YgdGhlIHR3byBpcyBOQQpldmVudHNfc2YkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbG9uZ2l0dWRlW2lzLm5hKGV2ZW50c19zZiRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sYXRpdHVkZSldIDwtIE5BCmV2ZW50c19zZiRtYXBfY29vcmRpbmF0ZV9jbGVhbl9sYXRpdHVkZVtpcy5uYShldmVudHNfc2YkbWFwX2Nvb3JkaW5hdGVfY2xlYW5fbG9uZ2l0dWRlKV0gPC0gTkEKI2V2ZW50c19zZiRldmVudF9oYXNoIDwtIE5VTEwgI01ha2Ugc3VyZSB3ZSdyZSBub3QgaGFzaGluZyBvbiB0aGUgcHJldmlvdXMgaGFzaCB3aGljaCBtaWdodCBiZSBhIHJhbmRvbSB3YWxrCgpldmVudHNfc2YgPC0gZXZlbnRzX3NmICU+JQogICAgICAgICAgICBzZjo6c3RfYXNfc2YoY29vcmRzID0gYygibWFwX2Nvb3JkaW5hdGVfY2xlYW5fbG9uZ2l0dWRlIiwgIm1hcF9jb29yZGluYXRlX2NsZWFuX2xhdGl0dWRlIiksCiAgICAgICAgICAgICAgICAgICAgIGNycyA9IDQzMjYsIGFnciA9ICJjb25zdGFudCIsIHJlbW92ZSA9IEYsIG5hLmZhaWwgPSBGKSAjICU+JSAKICAgICAgICAgICAgICNtdXRhdGUoZXZlbnRfaGFzaCA9IGFwcGx5KC4sIDEsIGRpZ2VzdCwgYWxnbz0ieHhoYXNoNjQiKSApICNEbyB0aGlzIG9uY2UgYW5kIG9ubHkgb25jZQp2YWxpZCA8LSBzZjo6c3RfaXNfdmFsaWQoZXZlbnRzX3NmJGdlb21ldHJ5KTsgdGFibGUodmFsaWQpCgpldmVudHNuYW1lc19zZiA8LSBldmVudHNfc2YgJT4lIAogIHNlbGVjdCgibmFtZV9jbGVhbmVyIiwgImdlb21ldHJ5IikgJT4lIAogIHNldE5hbWVzKGMoIm5hbWUiLCAiZ2VvbWV0cnkiKSkgJT4lIAogIG11dGF0ZShzb3VyY2VfZGF0YXNldCA9ICJldmVudHMiKQoKYGBgCgojIE91dHB1dCBDbGVhbmVkIEZpbGVzCgpgYGB7cn0KCnNhdmVSRFMoZXZlbnRzX3NmLCBnbHVlOjpnbHVlKGdldHdkKCksICIvLi4vaW5zdC9leHRkYXRhL2V2ZW50c19zZi5SZGF0YSIpKQoKYGBgCgo=