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 printCube(self):
print
print " ", self.bSide[5] + self.bSide[6] + self.bSide[7]
print " ", self.bSide[4] + "b" + self.bSide[0]
print " ", self.bSide[3] + self.bSide[2] + self.bSide[1] + '\n'
print " ", self.uSide[5] + self.uSide[6] + self.uSide[7]
print " ", self.uSide[4] + "u" + self.uSide[0]
print " ", self.uSide[3] + self.uSide[2] + self.uSide[1] + '\n'
print "" + self.lSide[5] + self.lSide[6] + self.lSide[7], self.fSide[5] + self.fSide[6] + self.fSide[7], self.rSide[5] + self.rSide[6] + self.rSide[7]
print "" + self.lSide[4] + 'l' + self.lSide[0], self.fSide[4] + 'f' + self.fSide[0], self.rSide[4] + 'r' + self.rSide[0]
print "" + self.lSide[3] + self.lSide[2] + self.lSide[1], self.fSide[3] + self.fSide[2] + self.fSide[1], self.rSide[3] + self.rSide[2] + self.rSide[1] + '\n'
print " ", self.dSide[5] + self.dSide[6] + self.dSide[7]
print " ", self.dSide[4] + "d" + self.dSide[0]
print " ", self.dSide[3] + self.dSide[2] + self.dSide[1] + '\n'
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 tryOne(xTemp, this): #string of alg trying, string of alg trying to solve
for bap in range(4):
wtf = MyCube(); wtf.doAlg(this)
for pab in range(bap):
wtf.doU()
wtf.doAlg(algs[xTemp])
if wtf.checkSolved(): return True
return False
def tryTwo(aTemp, bTemp, this):
for bap in range(4):
wtf2 = MyCube(); wtf2.doAlg(this)
for pab in range(bap):
wtf2.doU()
wtf2.doAlg(algs[aTemp])
for bap2 in range(4):
for pab in range(bap):
wtf2.doU()
wtf2.doAlg(algs[bTemp])
if wtf2.checkSolved(): return True
return False
def checkCombo(x, y):
count = 0
for alg in algs:
aCube = MyCube(); aCube.doAlg(alg)
# if aCube.checkSolved(): #basically, check if it's already good (case algs[0])
# count +=1; print 'try000', alg; continue
# if tryOne(x, alg): count += 1; print 'try1 x', alg; continue
# if tryOne(y, alg): count += 1; print 'try1 y', alg; continue
# if tryTwo(x, y, alg): count += 1; print 'try2xy', alg; continue
# if tryTwo(y, x, alg): count += 1; print 'try2yx', alg; continue
#
# if tryTwo(x, x, alg): count += 1; print 'try2xx', alg; continue
# if tryTwo(y, y, alg): count += 1; print 'try2yy', alg; continue
if aCube.checkSolved(): #basically, check if it's already good (case algs[0])
count +=1; print 'try000', alg; continue
if tryOne(x, alg): count += 1; continue
if tryOne(y, alg): count += 1; continue
if tryTwo(x, y, alg): count += 1; continue
if tryTwo(y, x, alg): count += 1; continue
if tryTwo(x, x, alg): count += 1; continue
if tryTwo(y, y, alg): count += 1; continue
print count,
if count == 22: return True
else: return False
TEMP = 8# len(algs)
for a1 in range(TEMP):
for a2 in range(a1+1):
print a1, a2, '\t'
if checkCombo(a1, a2): print "" + algs[a1] + '\t' + algs[a2] + "work!!!"
print; print
YWxncyA9IFsiIiwKIlInIFUgUicgVScgUicgVScgUicgVSBSIFUgUjIiLAoiUiBVJyBSIFUgUiBVIFIgVScgUicgVScgUjIiLAoiUjIgVTIgUiBVMiBSMiBVMiBSMiBVMiBSIFUyIFIyIiwKIlIyIFUgUjIgVScgUjIgRjIgUjIgVScgRjIgVSBSMiBGMiIsCiJSIFUnIFIgRjIgUicgVSBSJyBVJyBSMiBGMiBSMiIsCiJSMiBGMiBSMiBVIFIgVScgUiBGMiBSJyBVIFInIiwKIlIgVSBSJyBVIFInIFUnIFIgRicgUiBVIFInIFUnIFInIEYgUjIgVScgUjIgVSBSIiwKIkYnIFUyIFInIFUgRiBVJyBGJyBVJyBSIFUnIEYiLAoiUiBVIFInIEYnIFIgVSBSJyBVJyBSJyBGIFIyIFUnIFInIiwKIlInIFUyIFIgVTIgUicgRiBSIFUgUicgVScgUicgRicgUjIiLAoiRicgUicgVScgUiBGJyBSJyBVIEYnIFUnIEYnIFUgRiBSIEYyIiwKIkYyIFIyIFUnIFInIFUnIFIgRjIgUicgVSBSIEYyIFUgUjIgRjIiLAoiRjIgUjIgVScgRjIgUicgVScgUiBGMiBSJyBVIFIgVSBSMiBGMiIsCiJSJyBVJyBSMiBVJyBSMiBVJyBSIFUyIFIyIEYgVSBSJyBVJyBSIEYnIFIiLAoiUicgRiBSJyBVIFIgVScgRicgUjIgVTIgUicgVSBSMiBVIFIyIFUgUiIsCiJGJyBSIFUgUicgVScgUicgRiBSMiBGIFUnIFInIFUnIFIgVSBGJyBSIiwKIlInIFUgUicgRiBSIEYnIFIgVScgUicgRicgVSBGIFIgVSBSJyBVJyBSIiwKIlIgVSBSJyBVJyBSJyBGIFIyIFUnIFInIFUnIFIgVSBSJyBGJyIsCiJGIFIgVScgUicgVScgUiBVIFInIEYnIFIgVSBSJyBVJyBSJyBGIFIgRiciLAoiRicgVTIgRicgVScgUicgRicgUjIgVScgUicgVSBSJyBGIFIgVScgRiIsCiJSIFUnIFIgVSBGIFIgRjIgVSBGIFUnIEYgUicgRicgUiciXQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjbGFzcyBNeUN1YmU6CiAgIiIiQSB2aXJ0dWFsIDN4M3gzIG1hdHJpeCIiIgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYudVNpZGUgPSBbJ1UnLCAnVScsICdVJywgJ1UnLCAnVScsICdVJywgJ1UnLCAnVSddICNVUkYsIFVGLCBldGMKICAgIHNlbGYuZlNpZGUgPSBbJ0YnLCAnRicsICdGJywgJ0YnLCAnRicsICdGJywgJ0YnLCAnRiddICNGUkQsIEZELCBldGMKICAgIHNlbGYubFNpZGUgPSBbJ0wnLCAnTCcsICdMJywgJ0wnLCAnTCcsICdMJywgJ0wnLCAnTCddICNMRkQsIExELCBldGMKICAgIHNlbGYuYlNpZGUgPSBbJ0InLCAnQicsICdCJywgJ0InLCAnQicsICdCJywgJ0InLCAnQiddICNCUkQsIEJELCBldGMKICAgIHNlbGYuclNpZGUgPSBbJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUiddICNSQkQsIFJELCBldGMKICAgIHNlbGYuZFNpZGUgPSBbJ0QnLCAnRCcsICdEJywgJ0QnLCAnRCcsICdEJywgJ0QnLCAnRCddICNEQlIsIERSLCBldGMKCgogIGRlZiBkb1Uoc2VsZik6CgogICAgc2VsZi51U2lkZVswXSwgc2VsZi51U2lkZVsxXSwgc2VsZi51U2lkZVsyXSwgc2VsZi51U2lkZVszXSwgc2VsZi51U2lkZVs0XSwgc2VsZi51U2lkZVs1XSwgc2VsZi51U2lkZVs2XSwgc2VsZi51U2lkZVs3XSA9IHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10sIHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0KCiAgICBzZWxmLmZTaWRlWzVdLCBzZWxmLmxTaWRlWzVdLCBzZWxmLmJTaWRlWzFdLCBzZWxmLnJTaWRlWzVdID0gc2VsZi5yU2lkZVs1XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXQogICAgc2VsZi5mU2lkZVs2XSwgc2VsZi5sU2lkZVs2XSwgc2VsZi5iU2lkZVsyXSwgc2VsZi5yU2lkZVs2XSA9IHNlbGYuclNpZGVbNl0sIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0KICAgIHNlbGYuZlNpZGVbN10sIHNlbGYubFNpZGVbN10sIHNlbGYuYlNpZGVbM10sIHNlbGYuclNpZGVbN10gPSBzZWxmLnJTaWRlWzddLCBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdCgogIGRlZiBkb1VwKHNlbGYpOgogICAgc2VsZi51U2lkZVs2XSwgc2VsZi51U2lkZVs3XSwgc2VsZi51U2lkZVswXSwgc2VsZi51U2lkZVsxXSwgc2VsZi51U2lkZVsyXSwgc2VsZi51U2lkZVszXSwgc2VsZi51U2lkZVs0XSwgc2VsZi51U2lkZVs1XSA9IHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0sIHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10KCiAgICBzZWxmLnJTaWRlWzVdLCBzZWxmLmZTaWRlWzVdLCBzZWxmLmxTaWRlWzVdLCBzZWxmLmJTaWRlWzFdID0gc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXSwgc2VsZi5yU2lkZVs1XQogICAgc2VsZi5yU2lkZVs2XSwgc2VsZi5mU2lkZVs2XSwgc2VsZi5sU2lkZVs2XSwgc2VsZi5iU2lkZVsyXSA9IHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0sIHNlbGYuclNpZGVbNl0KICAgIHNlbGYuclNpZGVbN10sIHNlbGYuZlNpZGVbN10sIHNlbGYubFNpZGVbN10sIHNlbGYuYlNpZGVbM10gPSBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdLCBzZWxmLnJTaWRlWzddCgogIGRlZiBkb1Ioc2VsZik6CgogICAgc2VsZi5yU2lkZVswXSwgc2VsZi5yU2lkZVsxXSwgc2VsZi5yU2lkZVsyXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5yU2lkZVs2XSwgc2VsZi5yU2lkZVs3XSA9IHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10sIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0KICAgICAgCiAgICBzZWxmLmZTaWRlWzddLCBzZWxmLnVTaWRlWzddLCBzZWxmLmJTaWRlWzddLCBzZWxmLmRTaWRlWzddID0gc2VsZi5kU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XQogICAgc2VsZi5mU2lkZVswXSwgc2VsZi51U2lkZVswXSwgc2VsZi5iU2lkZVswXSwgc2VsZi5kU2lkZVswXSA9IHNlbGYuZFNpZGVbMF0sIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0KICAgIHNlbGYuZlNpZGVbMV0sIHNlbGYudVNpZGVbMV0sIHNlbGYuYlNpZGVbMV0sIHNlbGYuZFNpZGVbMV0gPSBzZWxmLmRTaWRlWzFdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdCgogIGRlZiBkb1JwKHNlbGYpOgogICAgc2VsZi5yU2lkZVs2XSwgc2VsZi5yU2lkZVs3XSwgc2VsZi5yU2lkZVswXSwgc2VsZi5yU2lkZVsxXSwgc2VsZi5yU2lkZVsyXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5yU2lkZVs1XSA9IHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0sIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10KCiAgICBzZWxmLmRTaWRlWzddLCBzZWxmLmZTaWRlWzddLCBzZWxmLnVTaWRlWzddLCBzZWxmLmJTaWRlWzddID0gc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XSwgc2VsZi5kU2lkZVs3XQogICAgc2VsZi5kU2lkZVswXSwgc2VsZi5mU2lkZVswXSwgc2VsZi51U2lkZVswXSwgc2VsZi5iU2lkZVswXSA9IHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0sIHNlbGYuZFNpZGVbMF0KICAgIHNlbGYuZFNpZGVbMV0sIHNlbGYuZlNpZGVbMV0sIHNlbGYudVNpZGVbMV0sIHNlbGYuYlNpZGVbMV0gPSBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdLCBzZWxmLmRTaWRlWzFdCgogIGRlZiBkb0Yoc2VsZik6CiAgICBzZWxmLmZTaWRlWzBdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLmZTaWRlWzJdLCBzZWxmLmZTaWRlWzNdLCBzZWxmLmZTaWRlWzRdLCBzZWxmLmZTaWRlWzVdLCBzZWxmLmZTaWRlWzZdLCBzZWxmLmZTaWRlWzddID0gc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XQoKICAgIHNlbGYudVNpZGVbMV0sIHNlbGYuclNpZGVbM10sIHNlbGYuZFNpZGVbNV0sIHNlbGYubFNpZGVbN10gPSBzZWxmLmxTaWRlWzddLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdCiAgICBzZWxmLnVTaWRlWzJdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLmRTaWRlWzZdLCBzZWxmLmxTaWRlWzBdID0gc2VsZi5sU2lkZVswXSwgc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XQogICAgc2VsZi51U2lkZVszXSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5kU2lkZVs3XSwgc2VsZi5sU2lkZVsxXSA9IHNlbGYubFNpZGVbMV0sIHNlbGYudVNpZGVbM10sIHNlbGYuclNpZGVbNV0sIHNlbGYuZFNpZGVbN10KICAgIAogIGRlZiBkb0ZwKHNlbGYpOgogICAgc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XSA9IHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0sIHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10KIAogICAgc2VsZi5sU2lkZVs3XSwgc2VsZi51U2lkZVsxXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5kU2lkZVs1XSA9IHNlbGYudVNpZGVbMV0sIHNlbGYuclNpZGVbM10sIHNlbGYuZFNpZGVbNV0sIHNlbGYubFNpZGVbN10KICAgIHNlbGYubFNpZGVbMF0sIHNlbGYudVNpZGVbMl0sIHNlbGYuclNpZGVbNF0sIHNlbGYuZFNpZGVbNl0gPSBzZWxmLnVTaWRlWzJdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLmRTaWRlWzZdLCBzZWxmLmxTaWRlWzBdCiAgICBzZWxmLmxTaWRlWzFdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLmRTaWRlWzddID0gc2VsZi51U2lkZVszXSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5kU2lkZVs3XSwgc2VsZi5sU2lkZVsxXQoKCiAgICAKICBkZWYgZG9BbGcoc2VsZiwgYWxnU3RyaW5nKToKICAgIGlhbGcgPSBhbGdTdHJpbmcucmVwbGFjZSgnKCcsICcnKSAgICAgI2dldCByaWQgb2YgdW53YW50ZWQKICAgIGlhbGcgPSBpYWxnLnJlcGxhY2UoJyknLCAnJykgICAgICAgICAgIyBvciBvdGhlcndpc2UgdW5uZWVkZWQgY2hhcmFjdGVycwogICAgaWFsZyA9IGlhbGcucmVwbGFjZSgiMiciLCAnMicpICAgICAgICAjIGluY2wuIHdoaXRlc3BhY2UsIHBhcmVuLiwgMidzCiAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCcgICcsICcgJykKICAgIHBhcnRzID0gaWFsZy5zcGxpdCgnICcpICAgICAgICAgICAgICAgI0RpdmlkZSB0aGUgYWxnIHVwIGludG8gaW5kaXZpZHVhbCBtb3ZlcwogICAgCiAgICBmb3IgcGFydCBpbiBwYXJ0czoKICAgICAgaWYgcGFydCA9PSAgICdVJzogIHNlbGYuZG9VKCkKICAgICAgZWxpZiBwYXJ0ID09ICdVMic6IHNlbGYuZG9VKCk7IHNlbGYuZG9VKCkKICAgICAgZWxpZiBwYXJ0ID09ICJVJyI6IHNlbGYuZG9VcCgpCiAgICAgICAgICAgIAogICAgICBlbGlmIHBhcnQgPT0gJ0YnOiAgc2VsZi5kb0YoKQogICAgICBlbGlmIHBhcnQgPT0gJ0YyJzogc2VsZi5kb0YoKTsgc2VsZi5kb0YoKQogICAgICBlbGlmIHBhcnQgPT0gIkYnIjogc2VsZi5kb0ZwKCkKICAgICAgCiAgICAgIGVsaWYgcGFydCA9PSAnUic6ICBzZWxmLmRvUigpCiAgICAgIGVsaWYgcGFydCA9PSAnUjInOiBzZWxmLmRvUigpOyBzZWxmLmRvUigpCiAgICAgIGVsaWYgcGFydCA9PSAiUiciOiBzZWxmLmRvUnAoKQogICAgICAgICAgICAKICBkZWYgcHJpbnRDdWJlKHNlbGYpOgogICAgcHJpbnQKICAgIHByaW50ICIgICAiLCBzZWxmLmJTaWRlWzVdICsgc2VsZi5iU2lkZVs2XSArIHNlbGYuYlNpZGVbN10KICAgIHByaW50ICIgICAiLCBzZWxmLmJTaWRlWzRdICsgImIiICsgCSAgc2VsZi5iU2lkZVswXQogICAgcHJpbnQgIiAgICIsIHNlbGYuYlNpZGVbM10gKyBzZWxmLmJTaWRlWzJdICsgc2VsZi5iU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs1XSArIHNlbGYudVNpZGVbNl0gKyBzZWxmLnVTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs0XSArICJ1IiArIAkgIHNlbGYudVNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLnVTaWRlWzNdICsgc2VsZi51U2lkZVsyXSArIHNlbGYudVNpZGVbMV0gKyAnXG4nCgogICAgcHJpbnQgIiIgKyBzZWxmLmxTaWRlWzVdICsgc2VsZi5sU2lkZVs2XSArIHNlbGYubFNpZGVbN10sIHNlbGYuZlNpZGVbNV0gKyBzZWxmLmZTaWRlWzZdICsgc2VsZi5mU2lkZVs3XSwgc2VsZi5yU2lkZVs1XSArIHNlbGYuclNpZGVbNl0gKyBzZWxmLnJTaWRlWzddCiAgICBwcmludCAiIiArIHNlbGYubFNpZGVbNF0gKyAnbCcgKyAgICAgICAgICAgc2VsZi5sU2lkZVswXSwgc2VsZi5mU2lkZVs0XSArICdmJyArICAgICAgICAgICBzZWxmLmZTaWRlWzBdLCBzZWxmLnJTaWRlWzRdICsgJ3InICsgICAgICAgICAgIHNlbGYuclNpZGVbMF0KICAgIHByaW50ICIiICsgc2VsZi5sU2lkZVszXSArIHNlbGYubFNpZGVbMl0gKyBzZWxmLmxTaWRlWzFdLCBzZWxmLmZTaWRlWzNdICsgc2VsZi5mU2lkZVsyXSArIHNlbGYuZlNpZGVbMV0sIHNlbGYuclNpZGVbM10gKyBzZWxmLnJTaWRlWzJdICsgc2VsZi5yU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi5kU2lkZVs1XSArIHNlbGYuZFNpZGVbNl0gKyBzZWxmLmRTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi5kU2lkZVs0XSArICJkIiArIAkgIHNlbGYuZFNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLmRTaWRlWzNdICsgc2VsZi5kU2lkZVsyXSArIHNlbGYuZFNpZGVbMV0gKyAnXG4nCgogIGRlZiBjaGVja1NvbHZlZChzZWxmKToKICAgIGlmIHNlbGYudVNpZGVbMF0gPT0gc2VsZi51U2lkZVsxXSA9PSBzZWxmLnVTaWRlWzJdID09IHNlbGYudVNpZGVbM10gPT0gc2VsZi51U2lkZVs0XSA9PSBzZWxmLnVTaWRlWzVdID09IHNlbGYudVNpZGVbNl0gPT0gc2VsZi51U2lkZVs3XToKICAgICAgaWYgc2VsZi5mU2lkZVs1XSA9PSBzZWxmLmZTaWRlWzZdID09IHNlbGYuZlNpZGVbN106CiAgICAgICAgaWYgc2VsZi5sU2lkZVs1XSA9PSBzZWxmLmxTaWRlWzZdID09IHNlbGYubFNpZGVbN106CiAgICAgICAgICBpZiBzZWxmLnJTaWRlWzVdID09IHNlbGYuclNpZGVbNl0gPT0gc2VsZi5yU2lkZVs3XToKICAgICAgICAgICAgaWYgc2VsZi5iU2lkZVszXSA9PSBzZWxmLmJTaWRlWzJdID09IHNlbGYuYlNpZGVbMV06CiAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGVmIHRyeU9uZSh4VGVtcCwgdGhpcyk6CSNzdHJpbmcgb2YgYWxnIHRyeWluZywgc3RyaW5nIG9mIGFsZyB0cnlpbmcgdG8gc29sdmUKCiAgZm9yIGJhcCBpbiByYW5nZSg0KToKICAgIHd0ZiA9IE15Q3ViZSgpOyB3dGYuZG9BbGcodGhpcykKCiAgICBmb3IgcGFiIGluIHJhbmdlKGJhcCk6CiAgICAgIHd0Zi5kb1UoKQoKICAgIHd0Zi5kb0FsZyhhbGdzW3hUZW1wXSkKCiAgICBpZiB3dGYuY2hlY2tTb2x2ZWQoKTogcmV0dXJuIFRydWUKCiAgcmV0dXJuIEZhbHNlCgoKCmRlZiB0cnlUd28oYVRlbXAsIGJUZW1wLCB0aGlzKToKCiAgZm9yIGJhcCBpbiByYW5nZSg0KToKICAgIHd0ZjIgPSBNeUN1YmUoKTsgd3RmMi5kb0FsZyh0aGlzKQoKICAgIGZvciBwYWIgaW4gcmFuZ2UoYmFwKToKICAgICAgd3RmMi5kb1UoKQoKICAgIHd0ZjIuZG9BbGcoYWxnc1thVGVtcF0pCgogICAgZm9yIGJhcDIgaW4gcmFuZ2UoNCk6CgogICAgICBmb3IgcGFiIGluIHJhbmdlKGJhcCk6CiAgICAgICAgd3RmMi5kb1UoKQoKICAgICAgd3RmMi5kb0FsZyhhbGdzW2JUZW1wXSkKICAgIAoKICAgICAgaWYgd3RmMi5jaGVja1NvbHZlZCgpOiByZXR1cm4gVHJ1ZQoKICByZXR1cm4gRmFsc2UKCgoKZGVmIGNoZWNrQ29tYm8oeCwgeSk6CiAgY291bnQgPSAwCiAgZm9yIGFsZyBpbiBhbGdzOgoKICAgIGFDdWJlID0gTXlDdWJlKCk7IGFDdWJlLmRvQWxnKGFsZykKIyAgICBpZiBhQ3ViZS5jaGVja1NvbHZlZCgpOiAJCSNiYXNpY2FsbHksIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSBnb29kIChjYXNlIGFsZ3NbMF0pCiMgICAgICBjb3VudCArPTE7IHByaW50ICd0cnkwMDAnLCBhbGc7IGNvbnRpbnVlCiAgICAgICAgICAgICAgCiMgICAgaWYgdHJ5T25lKHgsIGFsZyk6ICAgIGNvdW50ICs9IDE7IHByaW50ICd0cnkxIHgnLCBhbGc7ICBjb250aW51ZQojICAgIGlmIHRyeU9uZSh5LCBhbGcpOiAgICBjb3VudCArPSAxOyBwcmludCAndHJ5MSB5JywgYWxnOyAgY29udGludWUKCiMgICAgaWYgdHJ5VHdvKHgsIHksIGFsZyk6IGNvdW50ICs9IDE7IHByaW50ICd0cnkyeHknLCBhbGc7IGNvbnRpbnVlCiMgICAgaWYgdHJ5VHdvKHksIHgsIGFsZyk6IGNvdW50ICs9IDE7IHByaW50ICd0cnkyeXgnLCBhbGc7IGNvbnRpbnVlCiMKIyAgICBpZiB0cnlUd28oeCwgeCwgYWxnKTogY291bnQgKz0gMTsgcHJpbnQgJ3RyeTJ4eCcsIGFsZzsgIGNvbnRpbnVlCiMgICAgaWYgdHJ5VHdvKHksIHksIGFsZyk6IGNvdW50ICs9IDE7IHByaW50ICd0cnkyeXknLCBhbGc7ICBjb250aW51ZQogICAgaWYgYUN1YmUuY2hlY2tTb2x2ZWQoKTogCQkjYmFzaWNhbGx5LCBjaGVjayBpZiBpdCdzIGFscmVhZHkgZ29vZCAoY2FzZSBhbGdzWzBdKQogICAgICBjb3VudCArPTE7IHByaW50ICd0cnkwMDAnLCBhbGc7ICBjb250aW51ZQogICAgICAgICAgICAgIAogICAgaWYgdHJ5T25lKHgsIGFsZyk6ICAgIGNvdW50ICs9IDE7ICBjb250aW51ZQogICAgaWYgdHJ5T25lKHksIGFsZyk6ICAgIGNvdW50ICs9IDE7ICBjb250aW51ZQoKICAgIGlmIHRyeVR3byh4LCB5LCBhbGcpOiBjb3VudCArPSAxOyAgY29udGludWUKICAgIGlmIHRyeVR3byh5LCB4LCBhbGcpOiBjb3VudCArPSAxOyAgY29udGludWUKCiAgICBpZiB0cnlUd28oeCwgeCwgYWxnKTogY291bnQgKz0gMTsgIGNvbnRpbnVlCiAgICBpZiB0cnlUd28oeSwgeSwgYWxnKTogY291bnQgKz0gMTsgIGNvbnRpbnVlCiAgICAKICBwcmludCBjb3VudCwKICBpZiBjb3VudCA9PSAyMjogcmV0dXJuIFRydWUKICBlbHNlOiAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKCgoKVEVNUCA9IDgjIGxlbihhbGdzKQpmb3IgYTEgaW4gcmFuZ2UoVEVNUCk6CiAgZm9yIGEyIGluIHJhbmdlKGExKzEpOgogICAgcHJpbnQgYTEsIGEyLCAnXHQnCiAgICBpZiBjaGVja0NvbWJvKGExLCBhMik6IHByaW50ICIiICsgYWxnc1thMV0gKyAnXHQnICsgYWxnc1thMl0gKyAid29yayEhISIKICAgIHByaW50OyBwcmludAo=