# -*- coding: utf-8 -*-
import copy
from collections import defaultdict
from itertools import product
FALL = '|'
RIVER = '~'
POOL = 'N'
SOURCE = 'x'
SOURCE_AND_FALL = '*'
SOURCE_AND_RIVER = 'X'
SOURCE_AND_POOL = '%'
BLOCK = '#'
LRAMP = '/'
RRAMP = '\\ '
SPACE = ' '
LRAMP_AND_FALL = 'd'
RRAMP_AND_FALL = 'b'
LRAMP_AND_RIVER = '}'
RRAMP_AND_RIVER = '{'
LRAMP_AND_POOL = ']'
RRAMP_AND_POOL = '['
def isSource( cell) :
return cell in [ SOURCE, SOURCE_AND_FALL, SOURCE_AND_RIVER, SOURCE_AND_POOL]
def isLRamp( cell) :
return cell in [ LRAMP, LRAMP_AND_FALL, LRAMP_AND_RIVER, LRAMP_AND_POOL]
def isRRamp( cell) :
return cell in [ RRAMP, RRAMP_AND_FALL, RRAMP_AND_RIVER, RRAMP_AND_POOL]
def isRamp( cell) :
return isLRamp( cell) or isRRamp( cell)
def isFall( cell) :
return cell in [ FALL, SOURCE_AND_FALL, LRAMP_AND_FALL, RRAMP_AND_FALL]
def isRiver( cell) :
return cell in [ RIVER, LRAMP_AND_RIVER, RRAMP_AND_RIVER, SOURCE_AND_RIVER]
def isPool( cell) :
return cell in [ POOL, LRAMP_AND_POOL, RRAMP_AND_POOL, SOURCE_AND_POOL]
def isSpace( cell) :
return cell in [ SPACE, SOURCE, LRAMP, RRAMP]
def isWetAndLeaky( cell) :
return isFall( cell) or isRiver( cell) or isPool( cell) # or isSource(cell) #TODO Should we include source here?
def supportsRiver( cell) :
return cell == BLOCK or isPool( cell)
def isOpenAtBottom( cell) :
return not ( isRamp( cell) or cell == BLOCK)
def waterCanFlowIn( grid, i, j) :
# Can water flow in from left
if not isRRamp( grid[ ( i, j) ] ) and grid[ ( i, j-1 ) ] in [ RIVER, POOL, SOURCE_AND_RIVER, SOURCE_AND_POOL, RRAMP_AND_RIVER, RRAMP_AND_POOL] :
return True
# Can water flow in from left
return not isLRamp( grid[ ( i, j) ] ) and grid[ ( i, j+1 ) ] in [ RIVER, POOL, SOURCE_AND_RIVER, SOURCE_AND_POOL, LRAMP_AND_RIVER, LRAMP_AND_POOL]
def findBackground( cell) :
if cell in [ SPACE, FALL, RIVER, POOL] :
return SPACE
elif cell in [ BLOCK] :
return BLOCK
elif isSource( cell) :
return SOURCE
elif isLRamp( cell) :
return LRAMP
elif isRRamp( cell) :
return RRAMP
raise Exception
def makeSpace( cell) :
background = findBackground( cell)
if background == SPACE:
return SPACE
elif background == SOURCE:
return SOURCE
elif background == LRAMP:
return LRAMP
elif background == RRAMP:
return RRAMP
raise Exception
def makeFall( cell) :
background = findBackground( cell)
if background == SPACE:
return FALL
elif background == SOURCE:
return SOURCE_AND_FALL
elif background == LRAMP:
return LRAMP_AND_RIVER
elif background == RRAMP:
return RRAMP_AND_RIVER
raise Exception
def makeRiver( cell) :
background = findBackground( cell)
if background == SPACE:
return RIVER
elif background == SOURCE:
return SOURCE_AND_RIVER
elif background == LRAMP:
return LRAMP_AND_RIVER
elif background == RRAMP:
return RRAMP_AND_RIVER
raise Exception
def makePool( cell) :
background = findBackground( cell)
if background == SPACE:
return POOL
elif background == SOURCE:
return SOURCE_AND_POOL
elif background == LRAMP:
return LRAMP_AND_POOL
elif background == RRAMP:
return RRAMP_AND_POOL
raise Exception
def isRiverComplete( grid, i, j) :
# Check to left
if not isRRamp( grid[ i, j] ) :
a = j-1
while ( isRiver( grid[ i, a] ) or isPool( grid[ i, a] ) ) and not isRamp( grid[ i, a] ) :
a -= 1
if isSpace( grid[ i, a] ) and not isLRamp( grid[ i, a] ) :
return False
# Check to right
if not isLRamp( grid[ i, j] ) :
a = j+1
while ( isRiver( grid[ i, a] ) or isPool( grid[ i, a] ) ) and not isRamp( grid[ i, a] ) :
a += 1
if isSpace( grid[ i, a] ) and not isRRamp( grid[ i, a] ) :
return False
return True
gridStr = """\
x
# /
#####
# #
# # /
###\\ /#"""
gridCells = map ( lambda x: list ( x) , gridStr.split ( '\n ' ) )
height = len ( gridCells)
width = len ( gridCells[ 0 ] )
grid = defaultdict( lambda : SPACE)
for i in range ( height) :
for j in range ( width) :
grid[ ( i, j) ] = gridCells[ i] [ j]
def displayGrid( grid) :
print
for i in range ( height) :
row = ''
for j in range ( width) :
row = row+grid[ ( i, j) ]
print row
t = 0
while t < 26 :
displayGrid( grid)
newGrid = defaultdict( lambda : SPACE)
for i, j in product( range ( height) , range ( width) ) :
cell = grid[ ( i, j) ]
if cell == FALL and supportsRiver( grid[ ( i+1 , j) ] ) :
#A water fall with ground or pool under it becomes a river.
newGrid[ ( i, j) ] = makeRiver( cell)
elif isSpace( cell) and supportsRiver( grid[ ( i+1 , j) ] ) and waterCanFlowIn( grid, i, j) :
#A space with ground or pool under it and river next to it becomes a river.
newGrid[ ( i, j) ] = makeRiver( cell)
elif isSpace( cell) and isWetAndLeaky( grid[ ( i-1 , j) ] ) :
#A space with a water fall, spring or river above it becomes a water fall.
newGrid[ ( i, j) ] = makeFall( cell)
elif isSpace( cell) and waterCanFlowIn( grid, i, j) :
#A space with a river or pool next to it, and no support below becomes a water fall.
newGrid[ ( i, j) ] = makeFall( cell)
elif isRiver( cell) and isRiverComplete( grid, i, j) :
#A horizontal row of rivers squares bounded at both ends by walls/ramps becomes a horizontal row of pool squares.
newGrid[ ( i, j) ] = makePool( cell)
elif isOpenAtBottom( cell) and isPool( grid[ ( i+1 , j) ] ) and not isPool( cell) :
#A space above a pool becomes a river
newGrid[ ( i, j) ] = makeRiver( cell)
elif isSource( cell) :
#A dry source becomes wet
newGrid[ ( i, j) ] = makeFall( cell)
else :
#Else by default things stay the same
newGrid[ ( i, j) ] = cell
# TODO Drying up rules
#A pool or river without ground under it becomes a water fall (e.g. could be caused by bashing).
#A pool with water fall next to it becomes a river.
#A horizontal collection of river tiles without a water fall or spring above them dries up (I think this rule in particular needs some thinking about).
grid = newGrid
t += 1
displayGrid( grid)
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KaW1wb3J0IGNvcHkKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QKCkZBTEwgPSAnfCcKUklWRVIgPSAnficKUE9PTCA9ICdOJwoKU09VUkNFID0gJ3gnClNPVVJDRV9BTkRfRkFMTCA9ICcqJwpTT1VSQ0VfQU5EX1JJVkVSID0gJ1gnClNPVVJDRV9BTkRfUE9PTCA9ICclJwoKQkxPQ0sgPSAnIycKTFJBTVAgPSAnLycKUlJBTVAgPSAnXFwnClNQQUNFID0gJyAnCgpMUkFNUF9BTkRfRkFMTCA9ICdkJwpSUkFNUF9BTkRfRkFMTCA9ICdiJwpMUkFNUF9BTkRfUklWRVIgPSAnfScKUlJBTVBfQU5EX1JJVkVSID0gJ3snCkxSQU1QX0FORF9QT09MID0gJ10nClJSQU1QX0FORF9QT09MID0gJ1snCgpkZWYgaXNTb3VyY2UoY2VsbCk6CiAgICByZXR1cm4gY2VsbCBpbiBbU09VUkNFLCBTT1VSQ0VfQU5EX0ZBTEwsIFNPVVJDRV9BTkRfUklWRVIsIFNPVVJDRV9BTkRfUE9PTF0KCmRlZiBpc0xSYW1wKGNlbGwpOgogICAgcmV0dXJuIGNlbGwgaW4gW0xSQU1QLCBMUkFNUF9BTkRfRkFMTCwgTFJBTVBfQU5EX1JJVkVSLCBMUkFNUF9BTkRfUE9PTF0KZGVmIGlzUlJhbXAoY2VsbCk6CiAgICByZXR1cm4gY2VsbCBpbiBbUlJBTVAsIFJSQU1QX0FORF9GQUxMLCBSUkFNUF9BTkRfUklWRVIsIFJSQU1QX0FORF9QT09MXQpkZWYgaXNSYW1wKGNlbGwpOgogICAgcmV0dXJuIGlzTFJhbXAoY2VsbCkgb3IgaXNSUmFtcChjZWxsKQoKZGVmIGlzRmFsbChjZWxsKToKICAgIHJldHVybiBjZWxsIGluIFtGQUxMLCBTT1VSQ0VfQU5EX0ZBTEwsIExSQU1QX0FORF9GQUxMLCBSUkFNUF9BTkRfRkFMTF0KZGVmIGlzUml2ZXIoY2VsbCk6CiAgICByZXR1cm4gY2VsbCBpbiBbUklWRVIsIExSQU1QX0FORF9SSVZFUiwgUlJBTVBfQU5EX1JJVkVSLCBTT1VSQ0VfQU5EX1JJVkVSXQpkZWYgaXNQb29sKGNlbGwpOgogICAgcmV0dXJuIGNlbGwgaW4gW1BPT0wsIExSQU1QX0FORF9QT09MLCBSUkFNUF9BTkRfUE9PTCwgU09VUkNFX0FORF9QT09MXQpkZWYgaXNTcGFjZShjZWxsKToKICAgIHJldHVybiBjZWxsIGluIFtTUEFDRSwgU09VUkNFLCBMUkFNUCwgUlJBTVBdCgpkZWYgaXNXZXRBbmRMZWFreShjZWxsKToKICAgIHJldHVybiBpc0ZhbGwoY2VsbCkgb3IgaXNSaXZlcihjZWxsKSBvciBpc1Bvb2woY2VsbCkjIG9yIGlzU291cmNlKGNlbGwpICNUT0RPIFNob3VsZCB3ZSBpbmNsdWRlIHNvdXJjZSBoZXJlPwpkZWYgc3VwcG9ydHNSaXZlcihjZWxsKToKICAgIHJldHVybiBjZWxsID09IEJMT0NLIG9yIGlzUG9vbChjZWxsKQpkZWYgaXNPcGVuQXRCb3R0b20oY2VsbCk6CiAgICByZXR1cm4gbm90IChpc1JhbXAoY2VsbCkgb3IgY2VsbCA9PSBCTE9DSykKCmRlZiB3YXRlckNhbkZsb3dJbihncmlkLCBpLCBqKToKICAgICMgQ2FuIHdhdGVyIGZsb3cgaW4gZnJvbSBsZWZ0CiAgICBpZiBub3QgaXNSUmFtcChncmlkWyhpLGopXSkgYW5kIGdyaWRbKGksIGotMSldIGluIFtSSVZFUiwgUE9PTCwgU09VUkNFX0FORF9SSVZFUiwgU09VUkNFX0FORF9QT09MLCBSUkFNUF9BTkRfUklWRVIsIFJSQU1QX0FORF9QT09MXToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgIyBDYW4gd2F0ZXIgZmxvdyBpbiBmcm9tIGxlZnQKICAgIHJldHVybiBub3QgaXNMUmFtcChncmlkWyhpLGopXSkgYW5kIGdyaWRbKGksIGorMSldIGluIFtSSVZFUiwgUE9PTCwgU09VUkNFX0FORF9SSVZFUiwgU09VUkNFX0FORF9QT09MLCBMUkFNUF9BTkRfUklWRVIsIExSQU1QX0FORF9QT09MXQoKZGVmIGZpbmRCYWNrZ3JvdW5kKGNlbGwpOgogICAgaWYgY2VsbCBpbiBbU1BBQ0UsIEZBTEwsIFJJVkVSLCBQT09MXToKICAgICAgICByZXR1cm4gU1BBQ0UKICAgIGVsaWYgY2VsbCBpbiBbQkxPQ0tdOgogICAgICAgIHJldHVybiBCTE9DSwogICAgZWxpZiBpc1NvdXJjZShjZWxsKToKICAgICAgICByZXR1cm4gU09VUkNFCiAgICBlbGlmIGlzTFJhbXAoY2VsbCk6CiAgICAgICAgcmV0dXJuIExSQU1QCiAgICBlbGlmIGlzUlJhbXAoY2VsbCk6CiAgICAgICAgcmV0dXJuIFJSQU1QCiAgICByYWlzZSBFeGNlcHRpb24KCmRlZiBtYWtlU3BhY2UoY2VsbCk6CiAgICBiYWNrZ3JvdW5kID0gZmluZEJhY2tncm91bmQoY2VsbCkKICAgIGlmIGJhY2tncm91bmQgPT0gU1BBQ0U6CiAgICAgICAgcmV0dXJuIFNQQUNFCiAgICBlbGlmIGJhY2tncm91bmQgPT0gU09VUkNFOgogICAgICAgIHJldHVybiBTT1VSQ0UKICAgIGVsaWYgYmFja2dyb3VuZCA9PSBMUkFNUDoKICAgICAgICByZXR1cm4gTFJBTVAKICAgIGVsaWYgYmFja2dyb3VuZCA9PSBSUkFNUDoKICAgICAgICByZXR1cm4gUlJBTVAKICAgIHJhaXNlIEV4Y2VwdGlvbgpkZWYgbWFrZUZhbGwoY2VsbCk6CiAgICBiYWNrZ3JvdW5kID0gZmluZEJhY2tncm91bmQoY2VsbCkKICAgIGlmIGJhY2tncm91bmQgPT0gU1BBQ0U6CiAgICAgICAgcmV0dXJuIEZBTEwKICAgIGVsaWYgYmFja2dyb3VuZCA9PSBTT1VSQ0U6CiAgICAgICAgcmV0dXJuIFNPVVJDRV9BTkRfRkFMTAogICAgZWxpZiBiYWNrZ3JvdW5kID09IExSQU1QOgogICAgICAgIHJldHVybiBMUkFNUF9BTkRfUklWRVIKICAgIGVsaWYgYmFja2dyb3VuZCA9PSBSUkFNUDoKICAgICAgICByZXR1cm4gUlJBTVBfQU5EX1JJVkVSCiAgICByYWlzZSBFeGNlcHRpb24KZGVmIG1ha2VSaXZlcihjZWxsKToKICAgIGJhY2tncm91bmQgPSBmaW5kQmFja2dyb3VuZChjZWxsKQogICAgaWYgYmFja2dyb3VuZCA9PSBTUEFDRToKICAgICAgICByZXR1cm4gUklWRVIKICAgIGVsaWYgYmFja2dyb3VuZCA9PSBTT1VSQ0U6CiAgICAgICAgcmV0dXJuIFNPVVJDRV9BTkRfUklWRVIKICAgIGVsaWYgYmFja2dyb3VuZCA9PSBMUkFNUDoKICAgICAgICByZXR1cm4gTFJBTVBfQU5EX1JJVkVSCiAgICBlbGlmIGJhY2tncm91bmQgPT0gUlJBTVA6CiAgICAgICAgcmV0dXJuIFJSQU1QX0FORF9SSVZFUgogICAgcmFpc2UgRXhjZXB0aW9uCmRlZiBtYWtlUG9vbChjZWxsKToKICAgIGJhY2tncm91bmQgPSBmaW5kQmFja2dyb3VuZChjZWxsKQogICAgaWYgYmFja2dyb3VuZCA9PSBTUEFDRToKICAgICAgICByZXR1cm4gUE9PTAogICAgZWxpZiBiYWNrZ3JvdW5kID09IFNPVVJDRToKICAgICAgICByZXR1cm4gU09VUkNFX0FORF9QT09MCiAgICBlbGlmIGJhY2tncm91bmQgPT0gTFJBTVA6CiAgICAgICAgcmV0dXJuIExSQU1QX0FORF9QT09MCiAgICBlbGlmIGJhY2tncm91bmQgPT0gUlJBTVA6CiAgICAgICAgcmV0dXJuIFJSQU1QX0FORF9QT09MCiAgICByYWlzZSBFeGNlcHRpb24KCmRlZiBpc1JpdmVyQ29tcGxldGUoZ3JpZCwgaSwgaik6CiAgICAjIENoZWNrIHRvIGxlZnQKICAgIGlmIG5vdCBpc1JSYW1wKGdyaWRbaSxqXSk6CiAgICAgICAgYSA9IGotMQogICAgICAgIHdoaWxlIChpc1JpdmVyKGdyaWRbaSwgYV0pIG9yIGlzUG9vbChncmlkW2ksIGFdKSkgYW5kIG5vdCBpc1JhbXAoZ3JpZFtpLCBhXSk6CiAgICAgICAgICAgIGEgLT0gMQogICAgICAgIGlmIGlzU3BhY2UoZ3JpZFtpLCBhXSkgYW5kIG5vdCBpc0xSYW1wKGdyaWRbaSwgYV0pOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgQ2hlY2sgdG8gcmlnaHQKICAgIGlmIG5vdCBpc0xSYW1wKGdyaWRbaSxqXSk6CiAgICAgICAgYSA9IGorMQogICAgICAgIHdoaWxlIChpc1JpdmVyKGdyaWRbaSwgYV0pIG9yIGlzUG9vbChncmlkW2ksIGFdKSkgYW5kIG5vdCBpc1JhbXAoZ3JpZFtpLCBhXSk6CiAgICAgICAgICAgIGEgKz0gMQogICAgICAgIGlmIGlzU3BhY2UoZ3JpZFtpLCBhXSkgYW5kIG5vdCBpc1JSYW1wKGdyaWRbaSwgYV0pOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgpncmlkU3RyID0gIiIiXAogIHggICAKIyAgIC8gCiMjIyMjIAojICAgIyAKIyAjICAvCiMjI1xcLyMiIiIKZ3JpZENlbGxzID0gbWFwKGxhbWJkYSB4OiBsaXN0KHgpLCBncmlkU3RyLnNwbGl0KCdcbicpKQpoZWlnaHQgPSBsZW4oZ3JpZENlbGxzKQp3aWR0aCA9IGxlbihncmlkQ2VsbHNbMF0pCmdyaWQgPSBkZWZhdWx0ZGljdChsYW1iZGEgOiBTUEFDRSkKZm9yIGkgaW4gcmFuZ2UoaGVpZ2h0KToKICAgIGZvciBqIGluIHJhbmdlKHdpZHRoKToKICAgICAgICBncmlkWyhpLGopXSA9IGdyaWRDZWxsc1tpXVtqXQoKZGVmIGRpc3BsYXlHcmlkKGdyaWQpOgogICAgcHJpbnQKICAgIGZvciBpIGluIHJhbmdlKGhlaWdodCk6CiAgICAgICAgcm93ID0gJycKICAgICAgICBmb3IgaiBpbiByYW5nZSh3aWR0aCk6CiAgICAgICAgICAgIHJvdyA9IHJvdytncmlkWyhpLGopXQogICAgICAgIHByaW50IHJvdwoKdCA9IDAKd2hpbGUgdCA8IDI2OgogICAgZGlzcGxheUdyaWQoZ3JpZCkKICAgIG5ld0dyaWQgPSBkZWZhdWx0ZGljdChsYW1iZGEgOiBTUEFDRSkKICAgIGZvciBpLCBqIGluIHByb2R1Y3QocmFuZ2UoaGVpZ2h0KSwgcmFuZ2Uod2lkdGgpKToKICAgICAgICBjZWxsID0gZ3JpZFsoaSxqKV0KICAgICAgICBpZiBjZWxsID09IEZBTEwgYW5kIHN1cHBvcnRzUml2ZXIoZ3JpZFsoaSsxLCBqKV0pOgogICAgICAgICAgICAjQSB3YXRlciBmYWxsIHdpdGggZ3JvdW5kIG9yIHBvb2wgdW5kZXIgaXQgYmVjb21lcyBhIHJpdmVyLgogICAgICAgICAgICBuZXdHcmlkWyhpLGopXSA9IG1ha2VSaXZlcihjZWxsKQogICAgICAgIGVsaWYgaXNTcGFjZShjZWxsKSBhbmQgc3VwcG9ydHNSaXZlcihncmlkWyhpKzEsIGopXSkgYW5kIHdhdGVyQ2FuRmxvd0luKGdyaWQsIGksIGopOgogICAgICAgICAgICAjQSBzcGFjZSB3aXRoIGdyb3VuZCBvciBwb29sIHVuZGVyIGl0IGFuZCByaXZlciBuZXh0IHRvIGl0IGJlY29tZXMgYSByaXZlci4KICAgICAgICAgICAgbmV3R3JpZFsoaSxqKV0gPSBtYWtlUml2ZXIoY2VsbCkKICAgICAgICBlbGlmIGlzU3BhY2UoY2VsbCkgYW5kIGlzV2V0QW5kTGVha3koZ3JpZFsoaS0xLGopXSk6CiAgICAgICAgICAgICNBIHNwYWNlIHdpdGggYSB3YXRlciBmYWxsLCBzcHJpbmcgb3Igcml2ZXIgYWJvdmUgaXQgYmVjb21lcyBhIHdhdGVyIGZhbGwuCiAgICAgICAgICAgIG5ld0dyaWRbKGksaildID0gbWFrZUZhbGwoY2VsbCkKICAgICAgICBlbGlmIGlzU3BhY2UoY2VsbCkgYW5kIHdhdGVyQ2FuRmxvd0luKGdyaWQsIGksIGopOgogICAgICAgICAgICAjQSBzcGFjZSB3aXRoIGEgcml2ZXIgb3IgcG9vbCBuZXh0IHRvIGl0LCBhbmQgbm8gc3VwcG9ydCBiZWxvdyBiZWNvbWVzIGEgd2F0ZXIgZmFsbC4KICAgICAgICAgICAgbmV3R3JpZFsoaSxqKV0gPSBtYWtlRmFsbChjZWxsKQogICAgICAgIGVsaWYgaXNSaXZlcihjZWxsKSBhbmQgaXNSaXZlckNvbXBsZXRlKGdyaWQsIGksIGopOgogICAgICAgICAgICAjQSBob3Jpem9udGFsIHJvdyBvZiByaXZlcnMgc3F1YXJlcyBib3VuZGVkIGF0IGJvdGggZW5kcyBieSB3YWxscy9yYW1wcyBiZWNvbWVzIGEgaG9yaXpvbnRhbCByb3cgb2YgcG9vbCBzcXVhcmVzLgogICAgICAgICAgICBuZXdHcmlkWyhpLGopXSA9IG1ha2VQb29sKGNlbGwpCiAgICAgICAgZWxpZiBpc09wZW5BdEJvdHRvbShjZWxsKSBhbmQgaXNQb29sKGdyaWRbKGkrMSwgaildKSBhbmQgbm90IGlzUG9vbChjZWxsKToKICAgICAgICAgICAgI0Egc3BhY2UgYWJvdmUgYSBwb29sIGJlY29tZXMgYSByaXZlcgogICAgICAgICAgICBuZXdHcmlkWyhpLGopXSA9IG1ha2VSaXZlcihjZWxsKQogICAgICAgIGVsaWYgaXNTb3VyY2UoY2VsbCk6CiAgICAgICAgICAgICNBIGRyeSBzb3VyY2UgYmVjb21lcyB3ZXQKICAgICAgICAgICAgbmV3R3JpZFsoaSxqKV0gPSBtYWtlRmFsbChjZWxsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICNFbHNlIGJ5IGRlZmF1bHQgdGhpbmdzIHN0YXkgdGhlIHNhbWUKICAgICAgICAgICAgbmV3R3JpZFsoaSxqKV0gPSBjZWxsCgojIFRPRE8gRHJ5aW5nIHVwIHJ1bGVzICAgICAgICAgICAgCiNBIHBvb2wgb3Igcml2ZXIgd2l0aG91dCBncm91bmQgdW5kZXIgaXQgYmVjb21lcyBhIHdhdGVyIGZhbGwgKGUuZy4gY291bGQgYmUgY2F1c2VkIGJ5IGJhc2hpbmcpLgojQSBwb29sIHdpdGggd2F0ZXIgZmFsbCBuZXh0IHRvIGl0IGJlY29tZXMgYSByaXZlci4KI0EgaG9yaXpvbnRhbCBjb2xsZWN0aW9uIG9mIHJpdmVyIHRpbGVzIHdpdGhvdXQgYSB3YXRlciBmYWxsIG9yIHNwcmluZyBhYm92ZSB0aGVtIGRyaWVzIHVwIChJIHRoaW5rIHRoaXMgcnVsZSBpbiBwYXJ0aWN1bGFyIG5lZWRzIHNvbWUgdGhpbmtpbmcgYWJvdXQpLgogICAgICAgICAgICAKICAgIGdyaWQgPSBuZXdHcmlkCiAgICB0ICs9IDEKCmRpc3BsYXlHcmlkKGdyaWQp