Part 1
First read in the input
maze<-dict()
carlist<-list()
for(i in 1:length(input)){
linei<-input[i]
for(j in 1:nchar(input[1])){
x<-str_sub(linei,j,j)
if(x %in% c("-","|","\\","/","+")){
maze$set(paste(j,i),x)}
if(x%in%c(">","<")){
maze$set(paste(j,i),"-")
if(x==">"){cr<-list(j,i,"E","L")
}else{cr<-list(j,i,"W","L")}
carlist<-c(carlist,list(cr))}
if(x%in%c("v","^")){
maze$set(paste(j,i),"|")
if(x=="v"){cr<-list(j,i,"S","L")
}else{cr<-list(j,i,"N","L")}
carlist<-c(carlist,list(cr))}}}
The function to move a car
carmove<-function(c,m){
##depends on the car's direction
nc<-c
switch(c[[3]],
"N"={
x<-m$get(paste(c[[1]],c[[2]]-1))
nc[[2]]<-c[[2]]-1
switch(x,
"|"={},
"\\"={nc[[3]]<-"W"},
"/"={nc[[3]]<-"E"},
"+"={switch(c[[4]],
"L"={nc[[3]]<-"W"
nc[[4]]<-"S"},
"S"={nc[[4]]<-"R"},
"R"={nc[[3]]<-"E"
nc[[4]]<-"L"},
cat("bad plus\n"))},
cat("badN\n"))},
"S"={
x<-m$get(paste(c[[1]],c[[2]]+1))
nc[[2]]<-c[[2]]+1
switch(x,
"|"={},
"\\"={nc[[3]]<-"E"},
"/"={nc[[3]]<-"W"},
"+"={switch(c[[4]],
"L"={nc[[3]]<-"E"
nc[[4]]<-"S"},
"S"={nc[[4]]<-"R"},
"R"={nc[[3]]<-"W"
nc[[4]]<-"L"},
cat("bad plus\n"))},
cat(nc[[1]],nc[[2]],"badS",x,"\n"))},
"E"={
x<-m$get(paste(c[[1]]+1,c[[2]]))
nc[[1]]<-c[[1]]+1
switch(x,
"-"={},
"\\"={nc[[3]]<-"S"},
"/"={nc[[3]]<-"N"},
"+"={switch(c[[4]],
"L"={nc[[3]]<-"N"
nc[[4]]<-"S"},
"S"={nc[[4]]<-"R"},
"R"={nc[[3]]<-"S"
nc[[4]]<-"L"},
cat("bad plus\n"))},
cat("badE\n"))},
"W"={
x<-m$get(paste(c[[1]]-1,c[[2]]))
nc[[1]]<-c[[1]]-1
switch(x,
"-"={},
"\\"={nc[[3]]<-"N"},
"/"={nc[[3]]<-"S"},
"+"={switch(c[[4]],
"L"={nc[[3]]<-"S"
nc[[4]]<-"S"},
"S"={nc[[4]]<-"R"},
"R"={nc[[3]]<-"N"
nc[[4]]<-"L"},
cat("bad plus\n"))},
cat("badW\n"))},
cat("bad direction\n"))
nc}
Check to see if any of the things are in the same place
crashed<-function(crs,m){
### first, sort the coordinates
sortcoord<-sapply(crs,function(x){
paste(sprintf("%03d",x[[2]]),sprintf("%03d",x[[1]]),sep=",")})
crs<-crs[order(sortcoord)]
i<-1
x<-NA
while(i<=length(crs)){
## create a holder for crashed cars
crashed<-c()
## move the car
crs[[i]]<-carmove(crs[[i]],m)
## start checking for cars in the same place
j<-1
while(j<=length(crs)){
## don't compare to itself
if(i==j){j<-j+1
## if there is a crash, add the compare car to the crash list
next}else if(crs[[i]][[1]]==crs[[j]][[1]]&&crs[[i]][[2]]==crs[[j]][[2]]){
crashed<-c(crashed,j)}
j<-j+1}
## if there is a crashed car, add the first car to it
if(length(crashed>0)){
x<-c(crs[[i]][[1]],crs[[i]][[2]])
break}
i<-i+1}
x}
findcrashes<-function(cr,m){
keepgoing<-TRUE
while(keepgoing){
## move the cars -
cr<-lapply(cr,function(x){carmove(x,m)})
## see if anything crashed
crashq<-crashed(cr,m)
## if so, stop, if not, keep going
if(!any(is.na(crashq))){keepgoing<-FALSE}}
## adjust because it's 1 indexed
crashq<-crashq-c(1,1)
## turn back to a string
str_c(crashq,collapse=",")}
findcrashes(carlist,maze)
[1] "100,21"
100,21
Part 2
Takes in the car list, but removes any that have crashed
avert<-function(crs,m){
## first sort the cars in order vertical then horizontal
sortcoord<-sapply(crs,function(x){
paste(sprintf("%03d",x[[2]]),sprintf("%03d",x[[1]]),sep=",")})
crs<-crs[order(sortcoord)]
### find and remove crashes
i<-1
while(i<=length(crs)){
## create a holder for crashed cars
crashed<-c()
## move the car
crs[[i]]<-carmove(crs[[i]],m)
## start checking for cars in the same place
j<-1
while(j<=length(crs)){
## don't compare to itself
if(i==j){j<-j+1
## if there is a crash, add the compare car to the crash list
next}else if(crs[[i]][[1]]==crs[[j]][[1]]&&crs[[i]][[2]]==crs[[j]][[2]]){
crashed<-c(crashed,j)}
j<-j+1}
## if there is a crashed car, add the first car to it
if(length(crashed>0)){
## for debugging, give the crash coordinates
cat("crash at ",crs[[i]][[1]]-1,",",crs[[i]][[2]]-1)
crashed<-c(crashed,i)
## remove all crashed cars
crs<-crs[-crashed]
## if only one car left STOP RIGHT THERE
# if(length(crs)==1){return(crs)}
next}
i<-i+1}
crs}
avoidcrashes<-function(cr,m){
keepgoing<-TRUE
tick<-1
carcount<-length(cr)
while(keepgoing){
### move and remove the cars
cr<-avert(cr,m)
## if only one car left, stop
if(length(cr)==1){keepgoing<-FALSE}
if(length(cr)!=carcount){
cat(" at ",tick,"\n")
carcount<-length(cr)}
tick<-tick+1}
cr<-cr[[1]]
## adjust for 0 index
cr<-c(cr[[1]],cr[[2]])-c(1,1)
## turn to a string
str_c(cr,collapse=",")}
part2<-avoidcrashes(carlist,maze)
crash at 100 , 21 at 303
crash at 89 , 17 at 441
crash at 67 , 115 at 476
crash at 38 , 20 at 1092
crash at 58 , 149 at 1123
crash at 52 , 57 at 1209
crash at 104 , 116 at 7904
crash at 89 , 121 at 19217
part2
[1] "113,108"
113,108
LS0tDQp0aXRsZTogIkRheSAxMyBOb3RlYm9vayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShjb2xsZWN0aW9ucykNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KYGBgDQoNCmBgYHtyfQ0KI2lucHV0PC1yZWFkX2xpbmVzKCJEYXkxM1NhbXBsZS50eHQiKQ0KaW5wdXQ8LXJlYWRfbGluZXMoIi4uLy4uL0FvQ0RhdGEvQU9DMjAxOC9EYXkxMy50eHQiKQ0KYGBgDQoNCiMjIFBhcnQgMQ0KRmlyc3QgcmVhZCBpbiB0aGUgaW5wdXQNCg0KDQpgYGB7cn0NCm1hemU8LWRpY3QoKQ0KY2FybGlzdDwtbGlzdCgpDQpmb3IoaSBpbiAxOmxlbmd0aChpbnB1dCkpew0KICBsaW5laTwtaW5wdXRbaV0NCiAgZm9yKGogaW4gMTpuY2hhcihpbnB1dFsxXSkpew0KICAgIHg8LXN0cl9zdWIobGluZWksaixqKQ0KICAgIGlmKHggJWluJSBjKCItIiwifCIsIlxcIiwiLyIsIisiKSl7DQogICAgICBtYXplJHNldChwYXN0ZShqLGkpLHgpfQ0KICAgIGlmKHglaW4lYygiPiIsIjwiKSl7DQogICAgICBtYXplJHNldChwYXN0ZShqLGkpLCItIikNCiAgICAgIGlmKHg9PSI+Iil7Y3I8LWxpc3QoaixpLCJFIiwiTCIpDQogICAgICB9ZWxzZXtjcjwtbGlzdChqLGksIlciLCJMIil9DQogICAgICBjYXJsaXN0PC1jKGNhcmxpc3QsbGlzdChjcikpfQ0KICAgIGlmKHglaW4lYygidiIsIl4iKSl7DQogICAgICBtYXplJHNldChwYXN0ZShqLGkpLCJ8IikNCiAgICAgIGlmKHg9PSJ2Iil7Y3I8LWxpc3QoaixpLCJTIiwiTCIpDQogICAgICB9ZWxzZXtjcjwtbGlzdChqLGksIk4iLCJMIil9DQogICAgICBjYXJsaXN0PC1jKGNhcmxpc3QsbGlzdChjcikpfX19DQoNCmBgYA0KDQpUaGUgZnVuY3Rpb24gdG8gbW92ZSBhIGNhcg0KYGBge3J9DQpjYXJtb3ZlPC1mdW5jdGlvbihjLG0pew0KICAjI2RlcGVuZHMgb24gdGhlIGNhcidzIGRpcmVjdGlvbg0KICBuYzwtYw0KICBzd2l0Y2goY1tbM11dLA0KICAgICAgICAgIk4iPXsNCiAgICAgICAgICAgeDwtbSRnZXQocGFzdGUoY1tbMV1dLGNbWzJdXS0xKSkNCiAgICAgICAgICAgbmNbWzJdXTwtY1tbMl1dLTENCiAgICAgICAgICAgc3dpdGNoKHgsDQogICAgICAgICAgICAgICAgICAifCI9e30sDQogICAgICAgICAgICAgICAgICAiXFwiPXtuY1tbM11dPC0iVyJ9LA0KICAgICAgICAgICAgICAgICAgIi8iPXtuY1tbM11dPC0iRSJ9LA0KICAgICAgICAgICAgICAgICAgIisiPXtzd2l0Y2goY1tbNF1dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkwiPXtuY1tbM11dPC0iVyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jW1s0XV08LSJTIn0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUyI9e25jW1s0XV08LSJSIn0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUiI9e25jW1szXV08LSJFIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNbWzRdXTwtIkwifSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdCgiYmFkIHBsdXNcbiIpKX0sDQogICAgICAgICAgICAgICAgICBjYXQoImJhZE5cbiIpKX0sDQogICAgICAgICAiUyI9ew0KICAgICAgICAgICB4PC1tJGdldChwYXN0ZShjW1sxXV0sY1tbMl1dKzEpKQ0KICAgICAgICAgICBuY1tbMl1dPC1jW1syXV0rMQ0KICAgICAgICAgICBzd2l0Y2goeCwNCiAgICAgICAgICAgICAgICAgICJ8Ij17fSwNCiAgICAgICAgICAgICAgICAgICJcXCI9e25jW1szXV08LSJFIn0sDQogICAgICAgICAgICAgICAgICAiLyI9e25jW1szXV08LSJXIn0sDQogICAgICAgICAgICAgICAgICAiKyI9e3N3aXRjaChjW1s0XV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTCI9e25jW1szXV08LSJFIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNbWzRdXTwtIlMifSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTIj17bmNbWzRdXTwtIlIifSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSIj17bmNbWzNdXTwtIlciDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY1tbNF1dPC0iTCJ9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0KCJiYWQgcGx1c1xuIikpfSwNCiAgICAgICAgICAgICAgICAgIGNhdChuY1tbMV1dLG5jW1syXV0sImJhZFMiLHgsIlxuIikpfSwNCiAgICAgICAgICJFIj17DQogICAgICAgICAgIHg8LW0kZ2V0KHBhc3RlKGNbWzFdXSsxLGNbWzJdXSkpDQogICAgICAgICAgIG5jW1sxXV08LWNbWzFdXSsxDQogICAgICAgICAgIHN3aXRjaCh4LA0KICAgICAgICAgICAgICAgICAgIi0iPXt9LA0KICAgICAgICAgICAgICAgICAgIlxcIj17bmNbWzNdXTwtIlMifSwNCiAgICAgICAgICAgICAgICAgICIvIj17bmNbWzNdXTwtIk4ifSwNCiAgICAgICAgICAgICAgICAgICIrIj17c3dpdGNoKGNbWzRdXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMIj17bmNbWzNdXTwtIk4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY1tbNF1dPC0iUyJ9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMiPXtuY1tbNF1dPC0iUiJ9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlIiPXtuY1tbM11dPC0iUyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jW1s0XV08LSJMIn0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXQoImJhZCBwbHVzXG4iKSl9LA0KICAgICAgICAgICAgICAgICAgY2F0KCJiYWRFXG4iKSl9LA0KICAgICAgICAgIlciPXsNCiAgICAgICAgICAgeDwtbSRnZXQocGFzdGUoY1tbMV1dLTEsY1tbMl1dKSkNCiAgICAgICAgICAgbmNbWzFdXTwtY1tbMV1dLTENCiAgICAgICAgICAgc3dpdGNoKHgsDQogICAgICAgICAgICAgICAgICAiLSI9e30sDQogICAgICAgICAgICAgICAgICAiXFwiPXtuY1tbM11dPC0iTiJ9LA0KICAgICAgICAgICAgICAgICAgIi8iPXtuY1tbM11dPC0iUyJ9LA0KICAgICAgICAgICAgICAgICAgIisiPXtzd2l0Y2goY1tbNF1dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkwiPXtuY1tbM11dPC0iUyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jW1s0XV08LSJTIn0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUyI9e25jW1s0XV08LSJSIn0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUiI9e25jW1szXV08LSJOIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNbWzRdXTwtIkwifSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdCgiYmFkIHBsdXNcbiIpKX0sDQogICAgICAgICAgICAgICAgICBjYXQoImJhZFdcbiIpKX0sDQogICAgICAgICBjYXQoImJhZCBkaXJlY3Rpb25cbiIpKQ0KICBuY30NCmBgYA0KDQpDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSB0aGluZ3MgYXJlIGluIHRoZSBzYW1lIHBsYWNlDQoNCmBgYHtyfQ0KY3Jhc2hlZDwtZnVuY3Rpb24oY3JzLG0pew0KICAjIyMgZmlyc3QsIHNvcnQgdGhlIGNvb3JkaW5hdGVzDQogIHNvcnRjb29yZDwtc2FwcGx5KGNycyxmdW5jdGlvbih4KXsNCiAgICBwYXN0ZShzcHJpbnRmKCIlMDNkIix4W1syXV0pLHNwcmludGYoIiUwM2QiLHhbWzFdXSksc2VwPSIsIil9KQ0KICBjcnM8LWNyc1tvcmRlcihzb3J0Y29vcmQpXQ0KICBpPC0xDQogIHg8LU5BDQogIHdoaWxlKGk8PWxlbmd0aChjcnMpKXsNCiAgICAjIyBjcmVhdGUgYSBob2xkZXIgZm9yIGNyYXNoZWQgY2Fycw0KICAgIGNyYXNoZWQ8LWMoKQ0KICAgICMjIG1vdmUgdGhlIGNhcg0KICAgIGNyc1tbaV1dPC1jYXJtb3ZlKGNyc1tbaV1dLG0pDQogICAgIyMgc3RhcnQgY2hlY2tpbmcgZm9yIGNhcnMgaW4gdGhlIHNhbWUgcGxhY2UNCiAgICBqPC0xDQogICAgd2hpbGUoajw9bGVuZ3RoKGNycykpew0KICAgICAgIyMgZG9uJ3QgY29tcGFyZSB0byBpdHNlbGYNCiAgICAgIGlmKGk9PWope2o8LWorMQ0KICAgICAgIyMgaWYgdGhlcmUgaXMgYSBjcmFzaCwgYWRkIHRoZSBjb21wYXJlIGNhciB0byB0aGUgY3Jhc2ggbGlzdA0KICAgICAgbmV4dH1lbHNlIGlmKGNyc1tbaV1dW1sxXV09PWNyc1tbal1dW1sxXV0mJmNyc1tbaV1dW1syXV09PWNyc1tbal1dW1syXV0pew0KICAgICAgICBjcmFzaGVkPC1jKGNyYXNoZWQsail9DQogICAgICBqPC1qKzF9DQogICAgIyMgaWYgdGhlcmUgaXMgYSBjcmFzaGVkIGNhciwgYWRkIHRoZSBmaXJzdCBjYXIgdG8gaXQNCiAgICBpZihsZW5ndGgoY3Jhc2hlZD4wKSl7DQogICAgICB4PC1jKGNyc1tbaV1dW1sxXV0sY3JzW1tpXV1bWzJdXSkNCiAgICBicmVha30NCiAgICBpPC1pKzF9DQogIHh9DQpgYGANCg0KYGBge3J9DQpmaW5kY3Jhc2hlczwtZnVuY3Rpb24oY3IsbSl7DQogIGtlZXBnb2luZzwtVFJVRQ0KICB3aGlsZShrZWVwZ29pbmcpew0KICAgICMjIG1vdmUgdGhlIGNhcnMgLSANCiAgICBjcjwtbGFwcGx5KGNyLGZ1bmN0aW9uKHgpe2Nhcm1vdmUoeCxtKX0pDQogICAgIyMgc2VlIGlmIGFueXRoaW5nIGNyYXNoZWQNCiAgICBjcmFzaHE8LWNyYXNoZWQoY3IsbSkNCiAgICAjIyBpZiBzbywgc3RvcCwgaWYgbm90LCBrZWVwIGdvaW5nDQogICAgaWYoIWFueShpcy5uYShjcmFzaHEpKSl7a2VlcGdvaW5nPC1GQUxTRX19DQogICMjIGFkanVzdCBiZWNhdXNlIGl0J3MgMSBpbmRleGVkDQogIGNyYXNocTwtY3Jhc2hxLWMoMSwxKQ0KICAjIyB0dXJuIGJhY2sgdG8gYSBzdHJpbmcNCiAgc3RyX2MoY3Jhc2hxLGNvbGxhcHNlPSIsIil9DQpgYGANCg0KDQpgYGB7cn0NCmZpbmRjcmFzaGVzKGNhcmxpc3QsbWF6ZSkNCmBgYA0KIyMgUGFydCAyDQoNCg0KVGFrZXMgaW4gdGhlIGNhciBsaXN0LCBidXQgcmVtb3ZlcyBhbnkgdGhhdCBoYXZlIGNyYXNoZWQNCg0KYGBge3J9DQphdmVydDwtZnVuY3Rpb24oY3JzLG0pew0KICAjIyBmaXJzdCBzb3J0IHRoZSBjYXJzIGluIG9yZGVyIHZlcnRpY2FsIHRoZW4gaG9yaXpvbnRhbA0KICBzb3J0Y29vcmQ8LXNhcHBseShjcnMsZnVuY3Rpb24oeCl7DQogICAgcGFzdGUoc3ByaW50ZigiJTAzZCIseFtbMl1dKSxzcHJpbnRmKCIlMDNkIix4W1sxXV0pLHNlcD0iLCIpfSkNCiAgY3JzPC1jcnNbb3JkZXIoc29ydGNvb3JkKV0NCiAgIyMjIGZpbmQgYW5kIHJlbW92ZSBjcmFzaGVzDQogIGk8LTENCiAgd2hpbGUoaTw9bGVuZ3RoKGNycykpew0KICAgICMjIGNyZWF0ZSBhIGhvbGRlciBmb3IgY3Jhc2hlZCBjYXJzDQogICAgY3Jhc2hlZDwtYygpDQogICAgIyMgbW92ZSB0aGUgY2FyDQogICAgY3JzW1tpXV08LWNhcm1vdmUoY3JzW1tpXV0sbSkNCiAgICAjIyBzdGFydCBjaGVja2luZyBmb3IgY2FycyBpbiB0aGUgc2FtZSBwbGFjZQ0KICAgIGo8LTENCiAgICB3aGlsZShqPD1sZW5ndGgoY3JzKSl7DQogICAgICAjIyBkb24ndCBjb21wYXJlIHRvIGl0c2VsZg0KICAgICAgaWYoaT09ail7ajwtaisxDQogICAgICAjIyBpZiB0aGVyZSBpcyBhIGNyYXNoLCBhZGQgdGhlIGNvbXBhcmUgY2FyIHRvIHRoZSBjcmFzaCBsaXN0DQogICAgICBuZXh0fWVsc2UgaWYoY3JzW1tpXV1bWzFdXT09Y3JzW1tqXV1bWzFdXSYmY3JzW1tpXV1bWzJdXT09Y3JzW1tqXV1bWzJdXSl7DQogICAgICAgIGNyYXNoZWQ8LWMoY3Jhc2hlZCxqKX0NCiAgICAgIGo8LWorMX0NCiAgICAjIyBpZiB0aGVyZSBpcyBhIGNyYXNoZWQgY2FyLCBhZGQgdGhlIGZpcnN0IGNhciB0byBpdA0KICAgIGlmKGxlbmd0aChjcmFzaGVkPjApKXsNCiAgICAgICMjIGZvciBkZWJ1Z2dpbmcsIGdpdmUgdGhlIGNyYXNoIGNvb3JkaW5hdGVzDQogICAgICBjYXQoImNyYXNoIGF0ICIsY3JzW1tpXV1bWzFdXS0xLCIsIixjcnNbW2ldXVtbMl1dLTEpDQogICAgICBjcmFzaGVkPC1jKGNyYXNoZWQsaSkNCiAgICAgICMjIHJlbW92ZSBhbGwgY3Jhc2hlZCBjYXJzDQogICAgICBjcnM8LWNyc1stY3Jhc2hlZF0NCiAgICAgICMjIGlmIG9ubHkgb25lIGNhciBsZWZ0IFNUT1AgUklHSFQgVEhFUkUNCiAgICAgIyBpZihsZW5ndGgoY3JzKT09MSl7cmV0dXJuKGNycyl9DQogICAgbmV4dH0NCiAgICBpPC1pKzF9DQogIGNyc30NCmBgYA0KDQoNCmBgYHtyfQ0KYXZvaWRjcmFzaGVzPC1mdW5jdGlvbihjcixtKXsNCiAga2VlcGdvaW5nPC1UUlVFDQogIHRpY2s8LTENCiAgY2FyY291bnQ8LWxlbmd0aChjcikNCiAgd2hpbGUoa2VlcGdvaW5nKXsNCiAgICAjIyMgbW92ZSBhbmQgcmVtb3ZlIHRoZSBjYXJzDQogICAgY3I8LWF2ZXJ0KGNyLG0pDQogICAgIyMgaWYgb25seSBvbmUgY2FyIGxlZnQsIHN0b3ANCiAgICBpZihsZW5ndGgoY3IpPT0xKXtrZWVwZ29pbmc8LUZBTFNFfQ0KICAgIGlmKGxlbmd0aChjcikhPWNhcmNvdW50KXsNCiAgICAgIGNhdCgiIGF0ICIsdGljaywiXG4iKQ0KICAgICAgY2FyY291bnQ8LWxlbmd0aChjcil9DQogICAgdGljazwtdGljaysxfQ0KICBjcjwtY3JbWzFdXQ0KICAjIyBhZGp1c3QgZm9yIDAgaW5kZXgNCiAgY3I8LWMoY3JbWzFdXSxjcltbMl1dKS1jKDEsMSkNCiAgIyMgdHVybiB0byBhIHN0cmluZw0KICBzdHJfYyhjcixjb2xsYXBzZT0iLCIpfQ0KYGBgDQoNCg0KYGBge3J9DQpwYXJ0MjwtYXZvaWRjcmFzaGVzKGNhcmxpc3QsbWF6ZSkNCnBhcnQyDQpgYGANCg==