import time
start = time.time()
algs = ["",
"R' U R' U' R' U' R' U R U R2",
"R U' R U R U R U' R' U' R2",
"R2 U2 R U2 R2 U2 R2 U2 R U2 R2",
"R2 U R2 U' R2 F2 R2 U' F2 U R2 F2",
"R U' R F2 R' U R' U' R2 F2 R2",
"R2 F2 R2 U R U' R F2 R' U R'",
"R U R' U R' U' R F' R U R' U' R' F R2 U' R2 U R",
"F' U2 R' U F U' F' U' R U' F",
"R U R' F' R U R' U' R' F R2 U' R'",
"R' U2 R U2 R' F R U R' U' R' F' R2",
"F' R' U' R F' R' U F' U' F' U F R F2",
"F2 R2 U' R' U' R F2 R' U R F2 U R2 F2",
"F2 R2 U' F2 R' U' R F2 R' U R U R2 F2",
"R' U' R2 U' R2 U' R U2 R2 F U R' U' R F' R",
"R' F R' U R U' F' R2 U2 R' U R2 U R2 U R",
"F' R U R' U' R' F R2 F U' R' U' R U F' R'",
"R' U R' F R F' R U' R' F' U F R U R' U' R",
"R U R' U' R' F R2 U' R' U' R U R' F'",
"F R U' R' U' R U R' F' R U R' U' R' F R F'",
"F' U2 F' U' R' F' R2 U' R' U R' F R U' F",
"R U' R U F R F2 U F U' F R' F' R'"]
##################################################
class MyCube:
"""A virtual 3x3x3 matrix"""
def __init__(self):
self.uSide = ['U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'] #URF, UF, etc
self.fSide = ['F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'] #FRD, FD, etc
self.lSide = ['L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'] #LFD, LD, etc
self.bSide = ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'] #BRD, BD, etc
self.rSide = ['R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'] #RBD, RD, etc
self.dSide = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D'] #DBR, DR, etc
def doU(self):
self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7] = self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5]
self.fSide[5], self.lSide[5], self.bSide[1], self.rSide[5] = self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[1]
self.fSide[6], self.lSide[6], self.bSide[2], self.rSide[6] = self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[2]
self.fSide[7], self.lSide[7], self.bSide[3], self.rSide[7] = self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[3]
def doUp(self):
self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5] = self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7]
self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[1] = self.fSide[5], self.lSide[5], self.bSide[1], self.rSide[5]
self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[2] = self.fSide[6], self.lSide[6], self.bSide[2], self.rSide[6]
self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[3] = self.fSide[7], self.lSide[7], self.bSide[3], self.rSide[7]
def doR(self):
self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7] = self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5]
self.fSide[7], self.uSide[7], self.bSide[7], self.dSide[7] = self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[7]
self.fSide[0], self.uSide[0], self.bSide[0], self.dSide[0] = self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[0]
self.fSide[1], self.uSide[1], self.bSide[1], self.dSide[1] = self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[1]
def doRp(self):
self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5] = self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7]
self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[7] = self.fSide[7], self.uSide[7], self.bSide[7], self.dSide[7]
self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[0] = self.fSide[0], self.uSide[0], self.bSide[0], self.dSide[0]
self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[1] = self.fSide[1], self.uSide[1], self.bSide[1], self.dSide[1]
def doF(self):
self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7] = self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5]
self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7] = self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5]
self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0] = self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6]
self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1] = self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7]
def doFp(self):
self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5] = self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7]
self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5] = self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7]
self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6] = self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0]
self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7] = self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1]
def doAlg(self, algString):
ialg = algString.replace('(', '') #get rid of unwanted
ialg = ialg.replace(')', '') # or otherwise unneeded characters
ialg = ialg.replace("2'", '2') # incl. whitespace, paren., 2's
ialg = ialg.replace(' ', ' ')
parts = ialg.split(' ') #Divide the alg up into individual moves
for part in parts:
if part == 'U': self.doU()
elif part == 'U2': self.doU(); self.doU()
elif part == "U'": self.doUp()
elif part == 'F': self.doF()
elif part == 'F2': self.doF(); self.doF()
elif part == "F'": self.doFp()
elif part == 'R': self.doR()
elif part == 'R2': self.doR(); self.doR()
elif part == "R'": self.doRp()
def checkSolved(self):
if self.uSide[0] == self.uSide[1] == self.uSide[2] == self.uSide[3] == self.uSide[4] == self.uSide[5] == self.uSide[6] == self.uSide[7]:
if self.fSide[5] == self.fSide[6] == self.fSide[7]:
if self.lSide[5] == self.lSide[6] == self.lSide[7]:
if self.rSide[5] == self.rSide[6] == self.rSide[7]:
if self.bSide[3] == self.bSide[2] == self.bSide[1]:
return True
return False
##################################################
def tryAll(a, b, c, this):
aCube = MyCube(); aCube.doAlg(this)
if aCube.checkSolved():
#print '1',
return True
for w in range(4):
aCube.doU(); aCub = aCube
for x in [a, b, c]:
tCube = aCub
tCube.doAlg(x)
if tCube.checkSolved():
#print '2',
return True
for y in range(4):
tCube.doU(); tCub = tCube
for z in [a, b, c]:
tCu = tCub; tCu.doAlg(z)
if tCube.checkSolved():
#print '3',
return True
return False
def tryCombo(a, b, c, listNow):
for alg in range(0, len(algs)):
if listNow[alg] == False:
if tryAll(a, b, c, algs[alg]):
listNow[alg] = True; continue
else: return listNow
return listNow
##################################################
## Memo 3 algs? ##
listTimes = []
megaList = []
highest = 0
count = 0; counta = 0
for l1 in range(7,len(algs)):
print "L1: ", l1, counta
counta = 0
for l2 in range(l1+1,len(algs)):
for l3 in range(l2+1,len(algs)):
count+=1; counta+=1
algsDone = [False]*len(algs)
s = time.time()
algsDone = tryCombo(algs[l1], algs[l2], algs[l3], algsDone)
listTimes.append(time.time()-s)
if sum(algsDone) == len(algs):
print "\t\tAlgs used: ", l1, l2, l3
megaList.append([l1, l2, l3])
#print "\t\tCases solved: " + str(sum(algsDone)) + " out of " + str(len(algs))
#print "\t\t", algsDone; print
highest = sum(algsDone)
print '\n\n'
print count
print; print time.time()-start; print
k = 0; l = 0
for t in listTimes:
k+=1; l+=t
print l/k, l
print megaList
aW1wb3J0IHRpbWUKc3RhcnQgPSB0aW1lLnRpbWUoKQoKYWxncyA9IFsiIiwKIlInIFUgUicgVScgUicgVScgUicgVSBSIFUgUjIiLAoiUiBVJyBSIFUgUiBVIFIgVScgUicgVScgUjIiLAoiUjIgVTIgUiBVMiBSMiBVMiBSMiBVMiBSIFUyIFIyIiwKIlIyIFUgUjIgVScgUjIgRjIgUjIgVScgRjIgVSBSMiBGMiIsCiJSIFUnIFIgRjIgUicgVSBSJyBVJyBSMiBGMiBSMiIsCiJSMiBGMiBSMiBVIFIgVScgUiBGMiBSJyBVIFInIiwKIlIgVSBSJyBVIFInIFUnIFIgRicgUiBVIFInIFUnIFInIEYgUjIgVScgUjIgVSBSIiwKIkYnIFUyIFInIFUgRiBVJyBGJyBVJyBSIFUnIEYiLAoiUiBVIFInIEYnIFIgVSBSJyBVJyBSJyBGIFIyIFUnIFInIiwKIlInIFUyIFIgVTIgUicgRiBSIFUgUicgVScgUicgRicgUjIiLAoiRicgUicgVScgUiBGJyBSJyBVIEYnIFUnIEYnIFUgRiBSIEYyIiwKIkYyIFIyIFUnIFInIFUnIFIgRjIgUicgVSBSIEYyIFUgUjIgRjIiLAoiRjIgUjIgVScgRjIgUicgVScgUiBGMiBSJyBVIFIgVSBSMiBGMiIsCiJSJyBVJyBSMiBVJyBSMiBVJyBSIFUyIFIyIEYgVSBSJyBVJyBSIEYnIFIiLAoiUicgRiBSJyBVIFIgVScgRicgUjIgVTIgUicgVSBSMiBVIFIyIFUgUiIsCiJGJyBSIFUgUicgVScgUicgRiBSMiBGIFUnIFInIFUnIFIgVSBGJyBSJyIsCiJSJyBVIFInIEYgUiBGJyBSIFUnIFInIEYnIFUgRiBSIFUgUicgVScgUiIsCiJSIFUgUicgVScgUicgRiBSMiBVJyBSJyBVJyBSIFUgUicgRiciLAoiRiBSIFUnIFInIFUnIFIgVSBSJyBGJyBSIFUgUicgVScgUicgRiBSIEYnIiwKIkYnIFUyIEYnIFUnIFInIEYnIFIyIFUnIFInIFUgUicgRiBSIFUnIEYiLAoiUiBVJyBSIFUgRiBSIEYyIFUgRiBVJyBGIFInIEYnIFInIl0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKY2xhc3MgTXlDdWJlOgogICIiIkEgdmlydHVhbCAzeDN4MyBtYXRyaXgiIiIKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLnVTaWRlID0gWydVJywgJ1UnLCAnVScsICdVJywgJ1UnLCAnVScsICdVJywgJ1UnXSAjVVJGLCBVRiwgZXRjCiAgICBzZWxmLmZTaWRlID0gWydGJywgJ0YnLCAnRicsICdGJywgJ0YnLCAnRicsICdGJywgJ0YnXSAjRlJELCBGRCwgZXRjCiAgICBzZWxmLmxTaWRlID0gWydMJywgJ0wnLCAnTCcsICdMJywgJ0wnLCAnTCcsICdMJywgJ0wnXSAjTEZELCBMRCwgZXRjCiAgICBzZWxmLmJTaWRlID0gWydCJywgJ0InLCAnQicsICdCJywgJ0InLCAnQicsICdCJywgJ0InXSAjQlJELCBCRCwgZXRjCiAgICBzZWxmLnJTaWRlID0gWydSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InXSAjUkJELCBSRCwgZXRjCiAgICBzZWxmLmRTaWRlID0gWydEJywgJ0QnLCAnRCcsICdEJywgJ0QnLCAnRCcsICdEJywgJ0QnXSAjREJSLCBEUiwgZXRjCgoKICBkZWYgZG9VKHNlbGYpOgoKICAgIHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0sIHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10gPSBzZWxmLnVTaWRlWzZdLCBzZWxmLnVTaWRlWzddLCBzZWxmLnVTaWRlWzBdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnVTaWRlWzJdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnVTaWRlWzRdLCBzZWxmLnVTaWRlWzVdCgogICAgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXSwgc2VsZi5yU2lkZVs1XSA9IHNlbGYuclNpZGVbNV0sIHNlbGYuZlNpZGVbNV0sIHNlbGYubFNpZGVbNV0sIHNlbGYuYlNpZGVbMV0KICAgIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0sIHNlbGYuclNpZGVbNl0gPSBzZWxmLnJTaWRlWzZdLCBzZWxmLmZTaWRlWzZdLCBzZWxmLmxTaWRlWzZdLCBzZWxmLmJTaWRlWzJdCiAgICBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdLCBzZWxmLnJTaWRlWzddID0gc2VsZi5yU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5sU2lkZVs3XSwgc2VsZi5iU2lkZVszXQoKICBkZWYgZG9VcChzZWxmKToKICAgIHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10sIHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0gPSBzZWxmLnVTaWRlWzBdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnVTaWRlWzJdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnVTaWRlWzRdLCBzZWxmLnVTaWRlWzVdLCBzZWxmLnVTaWRlWzZdLCBzZWxmLnVTaWRlWzddCgogICAgc2VsZi5yU2lkZVs1XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXSA9IHNlbGYuZlNpZGVbNV0sIHNlbGYubFNpZGVbNV0sIHNlbGYuYlNpZGVbMV0sIHNlbGYuclNpZGVbNV0KICAgIHNlbGYuclNpZGVbNl0sIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0gPSBzZWxmLmZTaWRlWzZdLCBzZWxmLmxTaWRlWzZdLCBzZWxmLmJTaWRlWzJdLCBzZWxmLnJTaWRlWzZdCiAgICBzZWxmLnJTaWRlWzddLCBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdID0gc2VsZi5mU2lkZVs3XSwgc2VsZi5sU2lkZVs3XSwgc2VsZi5iU2lkZVszXSwgc2VsZi5yU2lkZVs3XQoKICBkZWYgZG9SKHNlbGYpOgoKICAgIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0sIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10gPSBzZWxmLnJTaWRlWzZdLCBzZWxmLnJTaWRlWzddLCBzZWxmLnJTaWRlWzBdLCBzZWxmLnJTaWRlWzFdLCBzZWxmLnJTaWRlWzJdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLnJTaWRlWzVdCiAgICAgIAogICAgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XSwgc2VsZi5kU2lkZVs3XSA9IHNlbGYuZFNpZGVbN10sIHNlbGYuZlNpZGVbN10sIHNlbGYudVNpZGVbN10sIHNlbGYuYlNpZGVbN10KICAgIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0sIHNlbGYuZFNpZGVbMF0gPSBzZWxmLmRTaWRlWzBdLCBzZWxmLmZTaWRlWzBdLCBzZWxmLnVTaWRlWzBdLCBzZWxmLmJTaWRlWzBdCiAgICBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdLCBzZWxmLmRTaWRlWzFdID0gc2VsZi5kU2lkZVsxXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi51U2lkZVsxXSwgc2VsZi5iU2lkZVsxXQoKICBkZWYgZG9ScChzZWxmKToKICAgIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10sIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0gPSBzZWxmLnJTaWRlWzBdLCBzZWxmLnJTaWRlWzFdLCBzZWxmLnJTaWRlWzJdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLnJTaWRlWzZdLCBzZWxmLnJTaWRlWzddCgogICAgc2VsZi5kU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XSA9IHNlbGYuZlNpZGVbN10sIHNlbGYudVNpZGVbN10sIHNlbGYuYlNpZGVbN10sIHNlbGYuZFNpZGVbN10KICAgIHNlbGYuZFNpZGVbMF0sIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0gPSBzZWxmLmZTaWRlWzBdLCBzZWxmLnVTaWRlWzBdLCBzZWxmLmJTaWRlWzBdLCBzZWxmLmRTaWRlWzBdCiAgICBzZWxmLmRTaWRlWzFdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdID0gc2VsZi5mU2lkZVsxXSwgc2VsZi51U2lkZVsxXSwgc2VsZi5iU2lkZVsxXSwgc2VsZi5kU2lkZVsxXQoKICBkZWYgZG9GKHNlbGYpOgogICAgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSA9IHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10sIHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0KCiAgICBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdLCBzZWxmLmxTaWRlWzddID0gc2VsZi5sU2lkZVs3XSwgc2VsZi51U2lkZVsxXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5kU2lkZVs1XQogICAgc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XSwgc2VsZi5sU2lkZVswXSA9IHNlbGYubFNpZGVbMF0sIHNlbGYudVNpZGVbMl0sIHNlbGYuclNpZGVbNF0sIHNlbGYuZFNpZGVbNl0KICAgIHNlbGYudVNpZGVbM10sIHNlbGYuclNpZGVbNV0sIHNlbGYuZFNpZGVbN10sIHNlbGYubFNpZGVbMV0gPSBzZWxmLmxTaWRlWzFdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLmRTaWRlWzddCiAgICAKICBkZWYgZG9GcChzZWxmKToKICAgIHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10sIHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0gPSBzZWxmLmZTaWRlWzBdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLmZTaWRlWzJdLCBzZWxmLmZTaWRlWzNdLCBzZWxmLmZTaWRlWzRdLCBzZWxmLmZTaWRlWzVdLCBzZWxmLmZTaWRlWzZdLCBzZWxmLmZTaWRlWzddCiAKICAgIHNlbGYubFNpZGVbN10sIHNlbGYudVNpZGVbMV0sIHNlbGYuclNpZGVbM10sIHNlbGYuZFNpZGVbNV0gPSBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdLCBzZWxmLmxTaWRlWzddCiAgICBzZWxmLmxTaWRlWzBdLCBzZWxmLnVTaWRlWzJdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLmRTaWRlWzZdID0gc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XSwgc2VsZi5sU2lkZVswXQogICAgc2VsZi5sU2lkZVsxXSwgc2VsZi51U2lkZVszXSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5kU2lkZVs3XSA9IHNlbGYudVNpZGVbM10sIHNlbGYuclNpZGVbNV0sIHNlbGYuZFNpZGVbN10sIHNlbGYubFNpZGVbMV0KCgogICAgCiAgZGVmIGRvQWxnKHNlbGYsIGFsZ1N0cmluZyk6CiAgICBpYWxnID0gYWxnU3RyaW5nLnJlcGxhY2UoJygnLCAnJykgICAgICNnZXQgcmlkIG9mIHVud2FudGVkCiAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCcpJywgJycpICAgICAgICAgICMgb3Igb3RoZXJ3aXNlIHVubmVlZGVkIGNoYXJhY3RlcnMKICAgIGlhbGcgPSBpYWxnLnJlcGxhY2UoIjInIiwgJzInKSAgICAgICAgIyBpbmNsLiB3aGl0ZXNwYWNlLCBwYXJlbi4sIDIncwogICAgaWFsZyA9IGlhbGcucmVwbGFjZSgnICAnLCAnICcpCiAgICBwYXJ0cyA9IGlhbGcuc3BsaXQoJyAnKSAgICAgICAgICAgICAgICNEaXZpZGUgdGhlIGFsZyB1cCBpbnRvIGluZGl2aWR1YWwgbW92ZXMKICAgIAogICAgZm9yIHBhcnQgaW4gcGFydHM6CiAgICAgIGlmIHBhcnQgPT0gICAnVSc6ICBzZWxmLmRvVSgpCiAgICAgIGVsaWYgcGFydCA9PSAnVTInOiBzZWxmLmRvVSgpOyBzZWxmLmRvVSgpCiAgICAgIGVsaWYgcGFydCA9PSAiVSciOiBzZWxmLmRvVXAoKQogICAgICAgICAgICAKICAgICAgZWxpZiBwYXJ0ID09ICdGJzogIHNlbGYuZG9GKCkKICAgICAgZWxpZiBwYXJ0ID09ICdGMic6IHNlbGYuZG9GKCk7IHNlbGYuZG9GKCkKICAgICAgZWxpZiBwYXJ0ID09ICJGJyI6IHNlbGYuZG9GcCgpCiAgICAgIAogICAgICBlbGlmIHBhcnQgPT0gJ1InOiAgc2VsZi5kb1IoKQogICAgICBlbGlmIHBhcnQgPT0gJ1IyJzogc2VsZi5kb1IoKTsgc2VsZi5kb1IoKQogICAgICBlbGlmIHBhcnQgPT0gIlInIjogc2VsZi5kb1JwKCkKICAgICAgICAgICAgCiAgZGVmIGNoZWNrU29sdmVkKHNlbGYpOgogICAgaWYgc2VsZi51U2lkZVswXSA9PSBzZWxmLnVTaWRlWzFdID09IHNlbGYudVNpZGVbMl0gPT0gc2VsZi51U2lkZVszXSA9PSBzZWxmLnVTaWRlWzRdID09IHNlbGYudVNpZGVbNV0gPT0gc2VsZi51U2lkZVs2XSA9PSBzZWxmLnVTaWRlWzddOgogICAgICBpZiBzZWxmLmZTaWRlWzVdID09IHNlbGYuZlNpZGVbNl0gPT0gc2VsZi5mU2lkZVs3XToKICAgICAgICBpZiBzZWxmLmxTaWRlWzVdID09IHNlbGYubFNpZGVbNl0gPT0gc2VsZi5sU2lkZVs3XToKICAgICAgICAgIGlmIHNlbGYuclNpZGVbNV0gPT0gc2VsZi5yU2lkZVs2XSA9PSBzZWxmLnJTaWRlWzddOgogICAgICAgICAgICBpZiBzZWxmLmJTaWRlWzNdID09IHNlbGYuYlNpZGVbMl0gPT0gc2VsZi5iU2lkZVsxXToKICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRlZiB0cnlBbGwoYSwgYiwgYywgdGhpcyk6CiAgICBhQ3ViZSA9IE15Q3ViZSgpOyBhQ3ViZS5kb0FsZyh0aGlzKQogICAgaWYgYUN1YmUuY2hlY2tTb2x2ZWQoKToKICAgICAgICAjcHJpbnQgJzEnLAogICAgICAgIHJldHVybiBUcnVlCiAgICAKICAgIGZvciB3IGluIHJhbmdlKDQpOgogICAgICAgIGFDdWJlLmRvVSgpOyBhQ3ViID0gYUN1YmUKICAgICAgICAKICAgICAgICBmb3IgeCBpbiBbYSwgYiwgY106CiAgICAgICAgICAgIHRDdWJlID0gYUN1YgogICAgICAgICAgICB0Q3ViZS5kb0FsZyh4KQogICAgICAgICAgICBpZiB0Q3ViZS5jaGVja1NvbHZlZCgpOgogICAgICAgICAgICAgICAgI3ByaW50ICcyJywKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgeSBpbiByYW5nZSg0KToKICAgICAgICAgICAgICAgIHRDdWJlLmRvVSgpOyB0Q3ViID0gdEN1YmUKCiAgICAgICAgICAgICAgICBmb3IgeiBpbiBbYSwgYiwgY106CiAgICAgICAgICAgICAgICAgICAgdEN1ID0gdEN1YjsgdEN1LmRvQWxnKHopCiAgICAgICAgICAgICAgICAgICAgaWYgdEN1YmUuY2hlY2tTb2x2ZWQoKToKICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50ICczJywKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAKCmRlZiB0cnlDb21ibyhhLCBiLCBjLCBsaXN0Tm93KToKICAgIGZvciBhbGcgaW4gcmFuZ2UoMCwgbGVuKGFsZ3MpKToKICAgICAgICBpZiBsaXN0Tm93W2FsZ10gPT0gRmFsc2U6CiAgICAgICAgICAgIGlmIHRyeUFsbChhLCBiLCBjLCBhbGdzW2FsZ10pOgogICAgICAgICAgICAgICAgbGlzdE5vd1thbGddID0gVHJ1ZTsgY29udGludWUKICAgICAgICAgICAgCiAgICAgICAgICAgIGVsc2U6IHJldHVybiBsaXN0Tm93CgogICAgcmV0dXJuIGxpc3ROb3cKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMgTWVtbyAzIGFsZ3M/ICMjCgpsaXN0VGltZXMgPSBbXQptZWdhTGlzdCA9IFtdCmhpZ2hlc3QgPSAwCmNvdW50ID0gMDsgY291bnRhID0gMApmb3IgbDEgaW4gcmFuZ2UoNyxsZW4oYWxncykpOgogICAgcHJpbnQgIkwxOiAiLCBsMSwgY291bnRhCiAgICBjb3VudGEgPSAwCiAgICBmb3IgbDIgaW4gcmFuZ2UobDErMSxsZW4oYWxncykpOgogICAgICAgIGZvciBsMyBpbiByYW5nZShsMisxLGxlbihhbGdzKSk6CiAgICAgICAgICAgIAogICAgICAgICAgICBjb3VudCs9MTsgY291bnRhKz0xCiAgICAgICAgICAgIGFsZ3NEb25lID0gW0ZhbHNlXSpsZW4oYWxncykKICAgICAgICAgICAgcyA9IHRpbWUudGltZSgpCiAgICAgICAgICAgIGFsZ3NEb25lID0gdHJ5Q29tYm8oYWxnc1tsMV0sIGFsZ3NbbDJdLCBhbGdzW2wzXSwgYWxnc0RvbmUpCiAgICAgICAgICAgIGxpc3RUaW1lcy5hcHBlbmQodGltZS50aW1lKCktcykKICAgICAgICAgICAgaWYgc3VtKGFsZ3NEb25lKSA9PSBsZW4oYWxncyk6CiAgICAgICAgICAgICAgICBwcmludCAiXHRcdEFsZ3MgdXNlZDogIiwgbDEsIGwyLCBsMwogICAgICAgICAgICAgICAgbWVnYUxpc3QuYXBwZW5kKFtsMSwgbDIsIGwzXSkKICAgICAgICAgICAgICAgICNwcmludCAiXHRcdENhc2VzIHNvbHZlZDogIiArIHN0cihzdW0oYWxnc0RvbmUpKSArICIgb3V0IG9mICIgKyBzdHIobGVuKGFsZ3MpKQogICAgICAgICAgICAgICAgI3ByaW50ICJcdFx0IiwgYWxnc0RvbmU7IHByaW50CiAgICAgICAgICAgICAgICBoaWdoZXN0ID0gc3VtKGFsZ3NEb25lKQogICAgcHJpbnQgJ1xuXG4nCgpwcmludCBjb3VudApwcmludDsgcHJpbnQgIHRpbWUudGltZSgpLXN0YXJ0OyBwcmludAprID0gMDsgbCA9IDAKZm9yIHQgaW4gbGlzdFRpbWVzOgogICAgays9MTsgbCs9dApwcmludCBsL2ssIGwKcHJpbnQgbWVnYUxpc3QK