# TokigunStudio Whitespace Implementation
# explaination version (korean)

# Âü°í:
# - ÀÌ ÄÚµå¿¡¼­´Â ³»ºÎÀûÀ¸·Î °ø¹é, ÅÇ, °³Çà¹®ÀÚ¸¦ ´ÙÀ½°ú °°Àº ¼ýÀÚ·Î ÇØ¼®ÇÑ´Ù.
#   °ø¹é = 0, ÅÇ = 1, °³Çà¹®ÀÚ = 2
# - ¸¹ÀÌ ¾²ÀÌ´Â ³»ºÎ ÇÔ¼ö/º¯¼öµé:
#   N: ¼ýÀÚ ÀÎ¼ö ¹ÝÈ¯ / L: ·¹ÀÌºí id ¹ÝÈ¯ / M: ·¹ÀÌºíÀ» ¹®ÀÚ¿­·Î ¹ÝÈ¯
#   r: ½ºÆ®¸²¿¡¼­ ÇÑ ¹®ÀÚ¸¦ ÀÐ¾î ¼ýÀÚ(0,1,2)·Î ¹ÝÈ¯ / j: ''.join -_-; / x: exit
#   U: ½ºÅÃ¿¡¼­ pop (ºó ½ºÅÃÀÌ¶ó¸é 0) / u: ½ºÅÃ¿¡ ¼ýÀÚ¸¦ push
#   W: ½ºÆ®¸²¿¡¼­ ÇöÀç À§Ä¡¿¡ ÁÖ¾îÁø ÀÎÀÚ°¡ ³ªÅ¸³ª¸é ½ºÆ®¸² Æ÷ÀÎÅÍ¸¦ ÀÎÀÚ µÚ·Î ¿Å±â°í Âü ¹ÝÈ¯
#      ¾È ³ªÅ¸³ª¸é ½ºÆ®¸² Æ÷ÀÎÅÍ¸¦ ³ÀµÎ°í None ¹ÝÈ¯ -_-;

# N: StringIO ÇüÅÂÀÇ ½ºÆ®¸²¿¡¼­ whitespace ¼ýÀÚ ÀÎ¼ö¸¦ ÀÐ¾î¼­ ¹ÝÈ¯ÇÑ´Ù.
def N():
 # ÃÊ±âÈ­
 p=[0]
 # 2°¡ ³ª¿Ã ¶§±îÁö p¿¡ °è¼Ó µ¡ºÙÀÎ´Ù.
 while p[-1]<2:p+=[r()]
 # °á°ú ¹ÝÈ¯
 return (
   ((p[1]-1)%3-1)*     # p[1](Ã¹ ¹®ÀÚ)°¡ 0ÀÌ¸é ¾ç¼ö, 1ÀÌ¸é À½¼ö, 2ÀÌ¸é ¼ýÀÚ ³¡³­ °Å´Ï±î 0
   reduce(lambda x,y:x*2+y,p[2:-1],0))
                       # p[2]ºÎÅÍ p[-2]±îÁö(p[-1]==2)´Â ÀÌÁø¼ö·Î ±×´ë·Î º¯È¯ÇÏ¸é µÊ.
                       # °ø¹éÀÌ 0ÀÌ°í ÅÇÀÌ 1ÀÌ¹Ç·Î ÀÖ´Â ±×´ë·Î ¼ýÀÚ¸¦ º¯È¯ÇÒ ¼ö ÀÖ´Ù.

# L: StringIO ÇüÅÂÀÇ ½ºÆ®¸²¿¡¼­ whitespace ·¹ÀÌºíÀ» ÀÐ¾î¼­ tuple ÇüÅÂ·Î ¹ÝÈ¯ÇÑ´Ù.
def L():
 # ÃÊ±âÈ­
 p=(0,)
 # 2°¡ ³ª¿Ã ¶§±îÁö p¿¡ °è¼Ó µ¡ºÙÀÎ´Ù.
 while p[-1]<2:p=p+(r(),)
 # °á°ú ¹ÝÈ¯ (p[0]==0, p[-1]==2ÀÌ¹Ç·Î µÑÀº »«´Ù)
 return p[1:-1]

# M: L¿¡¼­ ¹ÝÈ¯ÇÏ´Â ·¹ÀÌºí tupleÀ» "ÀÎ°£ÀÌ ÀÐÀ» ¸¸ÇÑ ÇüÅÂÀÇ" ¹®ÀÚ¿­·Î º¯È¯ÇÑ´Ù.
# [±ÔÄ¢] ±æÀÌ°¡ 8ÀÇ ¹è¼ö¸é ±×´ë·Î ¹®ÀÚ¿­·Î Ãë±ÞÇÏ°í ¾Æ´Ï¸é ±×³É label_17FF °°ÀÌ 16Áø¼ö µ¡ºÙÀÓ
def M(l):
 # ÀÏ´Ü l¿¡ ÇØ´çÇÏ´Â 2Áø¼ö¸¦ ±¸ÇÑ´Ù
 v=reduce(lambda a,b:a*2+b,l,0L)
 # ±æÀÌ°¡ 8ÀÇ ¹è¼ö°Å³ª ¼ýÀÚ°¡ 0ÀÌ¶ó¸é (¼ýÀÚ°¡ 0ÀÏ °æ¿ì ºó ¹®ÀÚ¿­ÀÌ ³ª¿Í¼­...)
 if 7&len(l)or v==0:
  # ·¹ÀÌºí °ªÀ» ¹ÝÈ¯ÇÑ´Ù.
  # len(l)&3À» ¾²´Â ÀÌÀ¯´Â °°Àº v °ªÀ» °®Áö¸¸ ±æÀÌ°¡ ´Ù¸¥ ·¹ÀÌºíÀÌ ÀÖÀ» ¼ö ÀÖ±â ¶§¹®¿¡...
  # (¿¹¸¦ µé¸é 101012¿Í 00101012¶ó´Â ·¹ÀÌºíÀº °°Àº v °ª 19¸¦ °®´Â´Ù)
  return'label%d_%s'%(len(l)&3,hex(v)[2:-1])
 # ¾Æ´Ï¸é ¹®ÀÚ¿­·Î Ãâ·Â
 else:
  return j([
    `chr(v>>k&255)`[1:-1]            # (v>>k)&255´Â µÚ¿¡¼­ºÎÅÍ k¹ø ¹®ÀÚÀÇ ¾Æ½ºÅ° ÄÚµå¿¡ ÇØ´çÇÑ´Ù.
    for k in range(len(l)-8,-1,-8)   # k = len(l)-8, len(l)-16, ..., 16, 8, 0
  ])

# ¸ðµâ µé¿© ¿À±â
from sys import*
from StringIO import*

# »ç¿ëÇÏ´Â ¹®ÀÚ¿­µé ÃÊ±âÈ­ (X: ¸í·ÉÀÌ¸§, Y: ÇØ´çÇÏ´Â ¹®ÀÚµé, Z: parameter Á¾·ù)
# parameter Á¾·ù -- 0: ÀÎÀÚ ¾øÀ½, 1: ¼ýÀÚ ÀÎÀÚ, 2: ·¹ÀÌºí ÀÎÀÚ
X='push,dup,copy,swap,pop,slide,add,sub,mul,div,mod,store,retrieve,call,jmp,jz,jn,ret,halt,putchar,putint,getchar,getint'.split(',')
Y='00,020,010,021,022,012,1000,1001,1002,1010,1011,110,111,201,202,210,211,212,222,1200,1201,1210,1211'.split(',')
Z='10100000000002222000000'

# v¿¡ ÇöÀç ÆÄÀÏ ÀÌ¸§(argv[0]) »« ³ª¸ÓÁö ÀÎÀÚµéÀ» ³ÖÀ½
v=argv[1:]

# ½ÇÇàÇÒ µ¿ÀÛÀÇ Á¾·ù °áÁ¤ (ÄÚµå ½ÇÇà 0, ÄÄÆÄÀÏ 1, µðÄÄÆÄÀÏ 2, µµ¿ò¸» 3)
n,=(len(v)and          # ÀÎÀÚ°¡ ÇÏ³ª ÀÌ»ó ÀÖÀ¸¸é
  [v[0][0]=='-'        # Ã¹ ÀÎÀÚ°¡ -·Î ½ÃÀÛÇÏ¸é
    and{'-c':1,'-d':2,'--':0}.get(v.pop(0),3)
                       # -c/-d/--¸¸ Ã³¸®ÇÏ°í ³ª¸ÓÁö´Â µµ¿ò¸»·Î µ¹¸²
                       # ±×·¯¸é¼­ Ã¹ ÀÎÀÚ¸¦ »© ³»±â ¶§¹®¿¡ °á±¹ Ã¹ ÀÎÀÚ´Â Ç×»ó ÀÔ·Â ÆÄÀÏÀÌ µÈ´Ù.
   or 0]               # Ã¹ ÀÎÀÚ°¡ -·Î ½ÃÀÛÇÏÁö ¾ÊÀ¸¸é ÄÚµå ½ÇÇà ¸ðµå
  or[3])               # ÀÎÀÚ°¡ ¾È µé¾î ¿À¸é µµ¿ò¸» Ãâ·Â

# ¸¹ÀÌ ¾²´Â ÇÔ¼ö¸¦ Âª°Ô ÁÙÀÓ
j=''.join
x=exit

# n>2(Áï, n==3; µµ¿ò¸»)ÀÌ°Å³ª, ³ª¸ÓÁö modeÀÎµ¥µµ ÀÎÀÚ °¹¼ö°¡ ¾È ¸ÂÀ¸¸é µµ¿ò¸» Ãâ·Â
if n>2 or[1,2,2][n]!=len(v):
  # ¸Þ½ÃÁö Ãâ·Â (v¿¡¼­´Â ÇÁ·Î±×·¥ ÀÌ¸§ÀÌ »ç¶óÁ³À¸³ª argv¿£ ³²¾Æ ÀÖÀ¸¹Ç·Î ±×°É ±×´ë·Î »ç¿ë)
  print'TokigunStudio Whitespace 0.3 Implementation\n'\
       'by Kang Seonghoon <tokigun@gmail.com>\n\n'\
       'Usage: python %s <file>\n'\
       '   or: python %s [-c|-d] <infile> <outfile>\n\n'\
       'no arg\texecute whitespace code.\n'\
       '-c\tcompile whitespace assembly code.\n'\
       '-d\tdecompile whitespace assembly code.\n'%(argv[0],argv[0])
  x(0) # ±×¸®°í Á¾·á

try:
  # s: ÀÔ·Â ÆÄÀÏ ³»¿ë
  s=file(v[0],'r').read()
  # f: (½ÇÇà ¸ðµå°¡ ¾Æ´Ï¸é) Ãâ·Â ÆÄÀÏ °´Ã¼
  f=n and file(v[1],'w')
  # v´Â n==1,2ÀÏ ¶§ ¸Þ½ÃÁö Ãâ·ÂÇÏ·Á ¾²´Â ¸®½ºÆ®ÀÎµ¥ ±×³É ³ÖÀ¸¸é ¿¡·¯ ³ª¹Ç·Î Æ©ÇÃ·Î º¯È¯
  v=tuple(v)
except:print'cannot open file.';x(1) # ¿¡·¯ ³ª¸é ¸Þ½ÃÁö Ãâ·ÂÇÏ°í Á×À½

# n==1(ÄÄÆÄÀÏ) ¸ðµåÀÌ¸é...
if n==1:
 # ¸Þ½ÃÁö Ãâ·Â
 print'compile %s to %s...'%v,
 # N: ¼ýÀÚ¸¦ ¹Þ¾Æ¼­ °Å±â¿¡ ÇØ´çÇÏ´Â whitespace ¼ýÀÚ ÇüÅÂ¸¦ ¹ÝÈ¯
 N=lambda n:(
   n and                        # ¼ýÀÚ°¡ 0ÀÌ ¾Æ´Ï¶ó¸é:
     ('\t '[n>0]+               # ºÎÈ£¸¦ ³ªÅ¸³»´Â Ã¹ ¹®ÀÚ
      N(abs(n)/2)[1:-1]+        # ¿©±â¼­ whitespace ¹®ÀÚÀÇ ±¸¼ºÀº ´ÙÀ½°ú °°À½.
                                #   (ºÎÈ£ ¹®ÀÚ) (³ª¸ÓÁö ÀÚ¸®µé) (ÀÌÁø¼ö ¸¶Áö¸· ÀÚ¸®) (°³Çà¹®ÀÚ)
                                # ¿©±â¼­ ³ª¸ÓÁö ÀÚ¸®µé(Áï, abs(n/2))ÀÇ whitespace Ç¥ÇöÀº
                                #   (ºÎÈ£ ¹®ÀÚ) (³ª¸ÓÁö ÀÚ¸®µé) (°³Çà¹®ÀÚ)
                                # ¿¡ ÇØ´çÇÏ¹Ç·Î ¾ÕµÚ ¹®ÀÚ¸¸ ¶¼¾î ÁÖ¸é ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.
      ' \t'[n%2]+               # ÇöÀç ¼ýÀÚÀÇ ÀÌÁø¼ö ¸¶Áö¸· ÀÚ¸®¸¦ ³ªÅ¸³»´Â ¹®ÀÚ
      '\n')                     # ±×¸®°í ¸¶Áö¸· °³Çà ¹®ÀÚ
   or'\n')                      # ¼ýÀÚ°¡ 0ÀÏ °æ¿ì À§ ÄÚµå°¡ ¿Àµ¿ÀÛÇÏ¹Ç·Î ±×³É °³Çà¹®ÀÚ ¹ÝÈ¯
 # L: ¹®ÀÚ¿­À» ¹Þ¾Æ¼­ °Å±â¿¡ ÇØ´çÇÏ´Â whitespace ·¹ÀÌºí ÇüÅÂ¸¦ ¹ÝÈ¯
 L=lambda l:(
   j([
     j([
       ' \t'[ord(v)>>k&1]        # ÀÌÁø¼ö ÀÚ¸®¿¡ ¸ÂÃç¼­ ¹®ÀÚ Ã¤¿ò
       for k in range(7,-1,-1)]) # ÀÚ¸®°ªÀÌ °¡Àå Å« ÀÚ¸®ºÎÅÍ...
     for v in l])+               # l ¾ÈÀÇ ¸ðµç ¹®ÀÚ v¿¡ ´ëÇØ¼­ ¹Ýº¹
   '\n')                         # ¸¶Áö¸· ¹®ÀÚ´Â °³Çà ¹®ÀÚ
 # ÀÔ·Â¹ÞÀº ÆÄÀÏÀ» ÁÙ·Î ³ª´²¼­ Ã³¸®
 for l in s.splitlines():
  l=((';'in l              # ÁÙ ¾È¿¡ ; ¹®ÀÚ°¡ ÀÖÀ¸¸é
      and l[:l.find(';')]  # ±× ¹®ÀÚ ´ÙÀ½ºÎÅÍ ¸ðµÎ »èÁ¦ÇÔ (; µÚ´Â ¸ðµÎ ÁÖ¼®)
      or l)                # ¾Æ´Ï¸é ³ÀµÐ´Ù.
    .split())              # ÁÖ¼®À» Áö¿î ÈÄ °ø¹é ´ÜÀ§ÀÇ tokenÀ¸·Î ³ª´«´Ù.
  (len(l)and':'==l[0][-1]and     # lÀÌ ºó ÁÙÀÌ ¾Æ´Ï°í Ã¹ tokenÀÌ :·Î ³¡³ª¸é (·¹ÀÌºí)
    f.write('\n  '+              # ·¹ÀÌºí ¸í·ÉÀ» ¾²°í
      L(l.pop(0)[:-1])))         # ·¹ÀÌºí ºÎºÐ¸¸ °¡Á® ¿Í¼­(ÀÌ ¶§ Ã¹ tokenÀº popµÈ´Ù)
                                 # ¸Ç ¸¶Áö¸· ¹®ÀÚ¸¦ ¹ö¸®°í L ÇÔ¼ö¿¡ ³Ñ°Ü¼­ whitespace Ç¥ÇöÀ¸·Î ¹Ù²ã Ãâ·Â
  # ·¹ÀÌºíÀ» »« tokenÀÌ ¾ÆÁ÷µµ ³²¾Æ ÀÖ´Ù¸é;
  if len(l):
    # Ã¹ tokenÀÌ ¸í·É¾îÀÌ¹Ç·Î ÇØ´çÇÏ´Â ¸í·ÉÀÇ ¹øÈ£¸¦ ±¸ÇÑ´Ù.
    p=X.index(l[0].lower())
    (p+1 and                       # p!=-1(¸í·É¾î°¡ Á¸ÀçÇÒ °æ¿ì)ÀÌ°í
     len(l)>(Z[p]>'0')and          # ÀÎÀÚ°¡ ÀÖÀ» °æ¿ì token ¼ö°¡ 2°³ ÀÌ»ó, ¾øÀ¸¸é 1°³ ÀÌ»óÀÌ¾î¾ß ÇÔ
                                   # (ÀÎÀÚ°¡ ÀÖÀ¸¸é int(Z[p]>'0')==1, ¾øÀ¸¸é 0ÀÓ)
     f.write(
       j([' \t\n'[int(k)]for k in Y[p]])+
                                   # 0/1/2·Î ±¸¼ºµÈ ¸í·É¾î¸¦ °ø¹é ¹®ÀÚ·Î ¹Ù²ã¼­ Ãâ·Â
       (Z[p]>'0'and                # ÀÎÀÚ°¡ ÀÖÀ» °æ¿ì
         (0,lambda a:N(int(a)),L)  # 1: ¼ýÀÚ ÀÎÀÚ, 2: ·¹ÀÌºí ÀÎÀÚ. ÇØ´çÇÏ´Â ÇÔ¼ö¸¦ Å×ÀÌºí·Î ¸¸µë
           [int(Z[p])]             # Å×ÀÌºí¿¡¼­ ÇÊ¿äÇÑ ÇÔ¼ö¸¦ »Ì¾Æ ¿Í¼­
           (l[1])                  # È£Ãâ °á°ú¸¦ Ãâ·Â
        or'')))                    # ¾Æ´Ï¸é ´õ ÀÌ»ó Ãâ·ÂÇÒ °Ô ¾øÀ¸´Ï ºó ¹®ÀÚ¿­·Î...
 # ´Ù ³¡³µÀ¸¸é ÆÄÀÏ ÇÚµé ´Ý°í ¸Þ½ÃÁö Ãâ·Â ÈÄ Á¾·á
 f.close()
 print'done.'
 x(0)

# ÀÌ °æ¿ì´Â n==2(µðÄÄÆÄÀÏ)
# µðÄÄÆÄÀÏ°ú ½ÇÇàÀº ÄÚµå ÆÄ½Ì ºÎºÐÀÌ °°±â ¶§¹®¿¡ ÀÏ´Ü Á¾·áÇÏÁö ¾Ê´Â´Ù.
elif n:
  # ¸Þ½ÃÁö Ãâ·Â
  print'decompile %s to %s...'%v,

# ½ºÆ®¸²À» ¿¬´Ù.
s=StringIO(                                # À§Ä¡ °ü¸® °°Àº °É ÇÏ±â ±ÍÂú¾Æ¼­ ±×³É StringIO·Î...
  j([
    {32:'0',9:'1',10:'2'}.get(ord(c),'')   # °ø¹é ¹®ÀÚ¸¸ µû·Î 0/1/2·Î ÀúÀåÇÏ°í ³ª¸ÓÁö´Â ¹«½Ã
    for c in s])                           # ÀÔ·Â ÆÄÀÏ ¾ÈÀÇ ¸ðµç ¹®ÀÚ¿¡ ´ëÇØ¼­ ÀÌ ÁþÀ» ¹Ýº¹
)

# r: ÇöÀç À§Ä¡¿¡¼­ ¹®ÀÚ¸¦ ÇÏ³ª ÀÐ¾î¼­ ±×°É ¼ýÀÚ·Î º¯È¯.
#    ¿¹¸¦ µé¾î¼­ r()==1ÀÌ¸é ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ°¡ ÅÇ ¹®ÀÚ¶ó´Â °É ÀÇ¹ÌÇÑ´Ù.
r=lambda:int(s.read(1))
# W: ½ºÆ®¸²¿¡¼­ ¹®ÀÚ¿­À» ÀÐ¾î¼­ ÁÖ¾îÁø ¹®ÀÚ¿­°ú °°´Ù¸é ÂüÀ» ¹ÝÈ¯ÇÏ°í
#    ¾Æ´Ï¸é ¿ø·¡ À§Ä¡(W°¡ »ç¿ëµÉ ¶§´Â Ç×»ó ÃÊ±â À§Ä¡¸¦ i¿¡ ÀúÀåÇÑ´Ù)·Î µ¹¾Æ °¡°í NoneÀ» ¹ÝÈ¯ÇÑ´Ù
W=lambda h:h==s.read(len(h))or s.seek(i,0)
# c: ÆÄ½Ì °á°ú. (¸í·É ¹øÈ£, ÀÎÀÚ) Æ©ÇÃµéÀÇ ¸®½ºÆ®
c=[]
# p: ·¹ÀÌºí ÀÌ¸§(½ÇÁ¦·Î´Â Æ©ÇÃ)ÀÌ Å°, ±×°Ô °¡¸®Å°´Â ½ÇÁ¦ c¿¡¼­ÀÇ À§Ä¡¸¦ °ªÀ¸·Î °¡Áö´Â »çÀü
p={}

# ÀÌ °úÁ¤ÀÌ ³¡³¯ ¶§´Â ¸®½ºÆ® ¸¶Áö¸· ³»¿ëÀÌ NoneÀÌ¹Ç·Î ±×°É Ã¼Å©ÇÑ´Ù.
while[None]!=c[-1:]:
 # ÀÏ´Ü ÇöÀç À§Ä¡ ÀúÀå (W ÇÔ¼ö¿¡¼­ »ç¿ë)
 i=s.tell()
 # 200('\n\40\40')À¸·Î ½ÃÀÛÇÒ °æ¿ì´Â ·¹ÀÌºíÀÌ¹Ç·Î µû·Î Ã³¸®
 # (½ÇÁ¦·Î ·¹ÀÌºí ¸í·ÉÀº X/Y/Z¿¡ µû·Î µé¾î ÀÖÁö ¾ÊÀ½)
 if W('200'):
   l=L()                       # ·¹ÀÌºíÀ» ÀÐ´Â´Ù
   p[l]=len(c)                 # ·¹ÀÌºí »çÀü¿¡´Ù°¡ ÇöÀç À§Ä¡¸¦ ÀúÀåÇÑ´Ù.
   n and f.write(M(l)+':\n')   # µðÄÄÆÄÀÏ ¸ðµåÀÏ °æ¿ì ·¹ÀÌºíÀ» ¹®ÀÚ¿­·Î ¹Ù²ã¼­ Ãâ·ÂÇÑ´Ù.
 else: # ¾Æ´Ï¸é X/Y/Z¿¡ µû¶ó¼­ Ã³¸®ÇÑ´Ù.
   # ½ÇÁ¦ ¸í·É°ú ºñ±³ÇØ¼­ ¸í·É¾î ¹øÈ£¿Í ±× ÀÎÀÚ¸¦ È®ÀÎÇÑ´Ù.
   # v°¡ None°¡ µÉ °æ¿ì´Â ´ÙÀ½°ú °°Àº °æ¿ìÀÌ´Ù: (¸ðµç ¸í·É¿¡ ´ëÇØ¼­ W ÇÔ¼öÀÇ °á°ú°ªÀÌ NoneÀÌ µÊ)
   #   - ÇöÀç À§Ä¡¿¡ ÀÖ´Â ¸í·ÉÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ¸í·ÉÀÏ °æ¿ì
   #   - ÆÄÀÏÀÇ ³¡¿¡ µµ´ÞÇßÀ» °æ¿ì
   v=reduce(
     lambda a,b:             # a: ¿¹Àü °á°ú, b: Å×½ºÆ®ÇÒ ¸í·É¾î ¹øÈ£
       a or                  # ÀÌ¹Ì Ã£¾ÒÀ» °æ¿ì(¸ø Ã£À¸¸é 0 ¶Ç´Â None) ±×³É ±×´ë·Î ¹ÝÈ¯
         W(Y[b]) and         # ¾ÆÁ÷ ¸ø Ã£¾Ò´Âµ¥ Áö±Ý È®ÀÎÇÏ´Â ¸í·ÉÀÌ ³ªÅ¸³µ´Ù¸é
                             # (¾Æ´Ò °æ¿ì¿¡´Â None and ...°¡ µÇ¾î¼­ NoneÀÌ ¹ÝÈ¯µÊ)
           (b,               # ¸í·É¾î ¹øÈ£¸¦ ³Ö°í
             (int,N,L)       # ¸í·É¾î¿¡ µû¶ó ºÙ´Â ÀÎÀÚµéÀ» Ã³¸®ÇÒ ÇÔ¼öµéÀÇ Å×ÀÌºí
               [int(Z[b])]   # ¸í·É¾î¿¡ ÇØ´çÇÏ´Â ÀÎÀÚ ÀÐ´Â ÇÔ¼ö¸¦ °¡Á® ¿Í¼­
               ()            # È£Ãâ (ÀÎÀÚ°¡ ¾ø´Â ¸í·É¾îµéÀº int() == 0ÀÌ¶ó´Â °É ¾Ç¿ëÇßÀ½ :)
           ),
     range(23),              # ÀÌ Áþ°Å¸®¸¦ 23°³ÀÇ ¸ðµç ¸í·É¿¡ ´ëÇØ¼­ ¹Ýº¹
     0)                      # Ã³À½¿¡´Â °ÅÁþÀ¸·Î ÀÎ½ÄÇÒ ¼ö ÀÖ´Â °ªÀÌ ÀÖÀ¸¸é µÇ´Ï±î... °£´ÜÇÏ°Ô 0À¸·Î;
   # ±× °á°ú¸¦ ÄÚµå ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. (µû¶ó¼­ ÆÄ½ÌÀÌ ³¡³¯ ¶§´Â NoneÀÌ Ç×»ó ³¡¿¡ µé¾î ÀÖ´Ù)
   c+=[v]
   # Ãâ·Â
   (n and v and                 # µðÄÄÆÄÀÏ ¸ðµåÀÌ¸é¼­ ÀÌ ¸í·ÉÀ» Ã£¾Ò´Ù¸é
    f.write(
      '  '+X[v[0]]+             # ¸í·ÉÀ» Ãâ·ÂÇÏ°í (indent´Â ·¹ÀÌºí°ú ±¸º°ÇÏ·Á°í ³Ö¾î ÁáÀ½)
      (Z[v[0]]>'0'and           # ¸í·É¿¡ µû¶ó ºÙ´Â ÀÎÀÚ°¡ ÀÖ´Ù¸é ÀÎÀÚµµ Ãâ·Â
       (' '+                    # ÀÏ´Ü ¸í·É°ú ÀÎÀÚ¸¦ ±¸º°ÇØ¾ß ÇÏ´Ï °ø¹é Ãâ·Â
        (0,str,M)               # »ç¿ëÇÒ ÇÔ¼ö Å×ÀÌºí (¼ýÀÚ´Â ±×³É ¹®ÀÚ¿­·Î, ·¹ÀÌºíÀº Æ©ÇÃÀÌ¹Ç·Î º°µµ Ã³¸®)
          [int(Z[v[0]])]        # ÀÎÀÚ Á¾·ù¿¡ ¸Â´Â ÇÔ¼ö¸¦ °¡Á® ¿Í¼­
          (v[1]))               # È£ÃâÇÏ°í Ãâ·Â
       or'')+                   # ¾Æ´Ï¸é »ó°ü ¾øÀ¸´Ï ºó ¹®ÀÚ¿­ Ãâ·Â
      '\n'))                    # ¸¶Áö¸· °³Çà ¹®ÀÚ

# µðÄÄÆÄÀÏ ¸ðµåÀÏ °æ¿ì ÀÌ¹Ì ¾Õ¿¡¼­ Ãâ·ÂÀÌ ³¡³µÀ¸¹Ç·Î Á¾·á
if n:
  # ÆÄÀÏ ÇÚµé ´Ý°í, ¸Þ½ÃÁö Ãâ·ÂÇÏ°í Á¾·á
  f.close()
  print'done.'
  x(0)

# s: ½ºÅÃ ´ë¿ë ¸®½ºÆ® (µÞÂÊ¿¡ ÀÖÀ» ¼ö·Ï ½ºÅÃ ²À´ë±â¿¡ °¡±î¿ò)
s=[]
# h: Èü ¿µ¿ª
h={}
# q: call/ret ¸í·ÉÀÌ »ç¿ëÇÏ´Â ÇÔ¼ö È£Ãâ ½ºÅÃ-_-; ÀÌ ¿ª½Ã µÞÂÊÀÏ ¼ö·Ï ²À´ë±â
q=[]
# u: ½ºÅÃ push ÇÔ¼ö
u=s.append
# U: ½ºÅÃ pop ÇÔ¼ö (½ºÅÃÀÌ ºñ¾î ÀÖÀ¸¸é 0 ¹ÝÈ¯)
U=lambda:len(s)and s.pop()
# i: ÇöÀç ½ÇÇàÁßÀÎ c À§¿¡¼­ÀÇ À§Ä¡ (instruction pointer), k: ÀÌÀü ¸í·É ¹øÈ£
i=k=0

# ÄÚµåÀÇ ¸¶Áö¸·Àº NoneÀÌ¹Ç·Î Á¦°ÅÇØ ÁØ´Ù.
c.pop()
# ¸í·É Æ÷ÀÎÅÍ°¡ ÄÚµå ³¡¿¡ ¿ÀÁö ¾Ê°í, ÀÌÀü ¸í·É(k)ÀÌ exit(18)°¡ ¾Æ´Ï¶ó¸é...
while i<len(c)and k-18:
 # ¸í·É Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ÇöÀç ¸í·ÉÀÇ Á¾·ù¿Í ÀÎÀÚ¸¦ ¹Þ¾Æ ¿Â ÈÄ
 k,v=c[i]
 # Æ÷ÀÎÅÍ¸¦ µÚ·Î ¿Å±ä´Ù.
 i+=1

 # ½ÇÁ¦ ¸í·É ½ÇÇà
 if k==0:          # push N -- ¼ýÀÚ NÀ» ½ºÅÃ¿¡ Áý¾î ³Ö´Â´Ù
   u(v)
 elif k==1:        # dup -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â ¼ýÀÚ¸¦ º¹»çÇØ¼­ ´Ù½Ã ³Ö´Â´Ù.
   n=U()             # popÇÑ °á°ú¸¦ ÀúÀåÇÏ°í
   u(n);u(n)         # ±×°É µÎ ¹ø push
 elif(k==2)&(v>0): # copy N -- ½ºÅÃÀÇ N¹øÂ°(N=1ÀÌ¶ó¸é ²À´ë±â) ¼ýÀÚ¸¦ º¹»çÇØ¼­ ½ºÅÃ¿¡ ³Ö´Â´Ù.
   u(s[-v])          # N=1ÀÏ ¶§°¡ ²À´ë±â(-1)ÀÌ°í N=2´Â ±× ¾Æ·¡(-2)ÀÌ°í... ¾Æ¹«Æ° °¡Á® ¿Í¼­ push
 elif k==3:        # swap -- ½ºÅÃ ²À´ë±âÀÇ µÎ ¼ýÀÚ¸¦ ±³È¯ÇÑ´Ù.
   n=U();m=U()       # µÎ °³¸¦ ¼ø¼­´ë·Î popÇØ¼­
   u(n);u(m)         # °Å²Ù·Î push
 elif k==4:        # pop -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â ¼ýÀÚ¸¦ ²¨³»¼­ ¹ö¸°´Ù.
   U()               # ±×³É pop ÇØ ÁÖ¸é ±× °á°ú´Â ¹ö·ÁÁø´Ù.
 elif k==5:        # slide N -- ½ºÅÃ ²À´ë±â ¹Ù·Î ¾Æ·¡ºÎÅÍ N°³ÀÇ ¼ýÀÚ¸¦ ¹ö¸°´Ù.
   s[-v-1:-1]=[]     # ½ºÅÃ ²À´ë±â ¹Ù·Î ¾Æ·¡(-2)ºÎÅÍ N°³(¸¶Áö¸·ÀÌ -N-1)¿¡ ÇØ´çÇÏ´Â ¿µ¿ªÀ»
                     # ºó ¸®½ºÆ®·Î Ã¤¿ì¸é »ç¶óÁø´Ù.
 elif k==6:        # add -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â µÎ ¼ýÀÚ¸¦ ´õÇÑ´Ù.
   u(U()+U())
 elif k==7:        # sub -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â µÎ ¼ýÀÚ¸¦ »«´Ù.
                   #        a, b ¼ø¼­´ë·Î popÇßÀ» °æ¿ì b-a°¡ pushµÈ´Ù. (´Ù¸¥ »ê¼ú ¿¬»êµµ µ¿ÀÏ)
   u(-U()+U())       # ÆÄÀÌ½ãÀÇ ¿¬»êÀÚ Ã³¸® ¼ø¼­°¡ ¿ÞÂÊºÎÅÍÀÌ¹Ç·Î µû·Î Ã³¸®ÇÏÁö ¾Ê°í ÀÌ·¸°Ô ÇßÀ½.
 elif k==8:        # mul -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â µÎ ¼ýÀÚ¸¦ °öÇÑ´Ù.
   u(U()*U())
 elif k==9:        # div -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â µÎ ¼ýÀÚ¸¦ ³ª´«´Ù. (¼ø¼­´Â sub¿Í ¸¶Âù°¡Áö)
   n=U();u(U()//n)   # ÀÌ °æ¿ì ¿ÀÂ÷°¡ ¹ß»ýÇÒ ¼ö ÀÖ±â ¶§¹®¿¡ sub¿Í °°Àº ¹æ¹ýÀ» ¾µ ¼ö ¾ø´Ù.
 elif k==10:       # mod -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â µÎ ¼ýÀÚ¸¦ ³ª´²¼­ ³ª¸ÓÁö¸¦ pushÇÑ´Ù.
   n=U();u(U()%n)    # ÀÌ °æ¿ì´Â ¾Æ¿¹ µÎ ÀÎÀÚ¸¦ °Å²Ù·Î ¾µ ¼ö°¡ ¾ø´Ù;
 elif k==11:       # store -- µÎ °³ÀÇ ¼ýÀÚ a,b¸¦ ¼ø¼­´ë·Î popÇÏ°í, Èü ¿µ¿ªÀÇ b À§Ä¡¿¡ a¸¦ ÀúÀåÇÑ´Ù.
   n=U()             # ³ÖÀ» °ªÀ» ¸ÕÀú popÇÏ°í
   h[U()]=n          # ÁÖ¼Ò¸¦ popÇÑ ÈÄ Èü ¿µ¿ª(½ÇÁ¦·Î´Â »çÀü)¿¡ Áý¾î ³Ö´Â´Ù.
 elif k==12:       # retrieve -- ½ºÅÃ ²À´ë±â¿¡ ÀÖ´Â ÁÖ¼Ò¸¦ ²¨³»¼­ Èü ¿µ¿ª¿¡¼­ ±× ÁÖ¼Ò¿¡ ÀÖ´Â ¼ýÀÚ¸¦ pushÇÑ´Ù.
   u(h.get(U(),0))   # »çÀü¿¡ ¾ø´Â(Áï storeÇÏÁö ¾ÊÀº) °ªÀº 0À¸·Î °¡Á¤ÇÑ´Ù.
 elif k==13:       # call -- ¼­ºê ·çÆ¾À» È£ÃâÇÑ´Ù.
   q+=[i]            # µ¹¾Æ ¿Ã À§Ä¡¸¦ ½ºÅÃ¿¡ ³Ö°í (¾Õ¿¡¼­ i+=1À» Çß±â ¶§¹®¿¡ ÀÌ À§Ä¡´Â call ¸í·É ´ÙÀ½ÀÌ´Ù)
   i=p[v]            # ·¹ÀÌºíÀÌ °¡¸®Å°´Â ½ÇÁ¦ ÄÚµå À§Ä¡·Î ÄÚµå Æ÷ÀÎÅÍ¸¦ ¿Å±ä´Ù.
 elif k==14:       # jmp -- ¹«Á¶°Ç ·¹ÀÌºíÀÌ °¡¸®Å°´Â À§Ä¡·Î ÀÌµ¿ÇÑ´Ù.
   i=p[v]
 elif k==15 and U()==0:
                   # jz -- ½ºÅÃ¿¡¼­ ¼ýÀÚ¸¦ ²¨³»¼­ 0ÀÌ¸é ·¹ÀÌºíÀÌ °¡¸®Å°´Â À§Ä¡·Î ÀÌµ¿ÇÑ´Ù.
                   # ¿©±â¼­´Â ±×³É if ¹®¿¡ Á¶°ÇÀ» ´Ù´Â °É·Î ÇØ°áÇß´Ù-_-;
   i=p[v]
 elif k==16 and U()<0:
                   # jn -- ½ºÅÃ¿¡¼­ ¼ýÀÚ¸¦ ²¨³»¼­ À½¼öÀÌ¸é ·¹ÀÌºíÀÌ °¡¸®Å°´Â À§Ä¡·Î ÀÌµ¿ÇÑ´Ù.
   i=p[v]
 elif k==17 and len(q):
                   # ret -- ¼­ºê ·çÆ¾À» ³¡³»°í ¿ø·¡ À§Ä¡·Î µ¹¾Æ ¿Â´Ù.
   i=q.pop()         # (À§¿¡¼­ Ã¼Å©ÇßµíÀÌ, È£Ãâ ½ºÅÃ¿¡ ¼ýÀÚ°¡ ÀÖÀ¸¸é) µ¹¾Æ ¿Ã À§Ä¡·Î ¸í·É Æ÷ÀÎÅÍ¸¦ ÀÌµ¿ÇÑ´Ù.
                   # (halt) -- ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. (À§¿¡¼­ Ã³¸®ÇÔ)
 elif k==19:       # putchar -- ½ºÅÃ¿¡¼­ ¼ýÀÚ¸¦ ²¨³»¼­ °Å±â¿¡ ÇØ´çÇÏ´Â(ASCII ¹®ÀÚ ¹øÈ£) ¹®ÀÚ¸¦ Ãâ·ÂÇÑ´Ù.
   stdout.write(chr(U()))
 elif k==20:       # putint -- ½ºÅÃ¿¡¼­ ¼ýÀÚ¸¦ ²¨³»¼­ ±×´ë·Î Ãâ·ÂÇÑ´Ù.
   stdout.write(str(U()))
 elif k==21:       # getchar -- ¹®ÀÚ¸¦ ÀÔ·Â¹Þ¾Æ¼­, Èü ¿µ¿ª¿¡ ½ºÅÃ ²À´ë±â°¡ °¡¸®Å°´Â ÁÖ¼Ò¿¡
                   #            ÇØ´çÇÏ´Â ¼ýÀÚ¸¦ ÀúÀåÇÑ´Ù.
   h[U()]=ord(stdin.read(1))
 elif k==22:       # getint -- ¼ýÀÚ¸¦ ÀÔ·Â¹Þ¾Æ¼­... ±× ´ÙÀ½Àº getchar¿Í °°À½ -_-;
  v=''               # Ã³À½ ¹®ÀÚ¿­Àº ºó ¹®ÀÚ¿­.
  while(
    '0'+             # (ÀÌ°É ´õÇÏ´Â ÀÌÀ¯´Â ''.isdigit()°¡ FalseÀÌ±â ¶§¹®¿¡ -_-;)
    v[v[0:1]=='-':]  # v¿¡¼­ ºÎÈ£(Ã¹ ¹®ÀÚ°¡ -ÀÏ °æ¿ì)¸¦ »« ºÎºÐ
  ).isdigit():       # ÀÌ ¼ýÀÚ·Î¸¸ ±¸¼ºµÇ¾î ÀÖÀ» ¶§±îÁö ¹Ýº¹ÇÑ´Ù.
    v+=stdin.read(1) # ¹¹ °è¼Ó ÀÐ¾î¼­ v¿¡ Ãß°¡ÇÏ°í °Ë»çÇÏ°í Ãß°¡ÇÏ°í °Ë»çÇÏ°í ÇÔ -_-
  h[U()]=int(v[:-1]+'0')/10
                     # ¸¶Áö¸· ¹®ÀÚ´Â ¼ýÀÚ°¡ ¾Æ´Ï¹Ç·Î Á¦°ÅÇÏ°í ¼ýÀÚ·Î º¯È¯ÇØ¼­ Èü ¿µ¿ª¿¡ ³Ö´Â´Ù.
                     # '0'À» µ¡ºÙÀÌ´Â ÀÌÀ¯´Â ¾Æ¿¹ ¼ýÀÚ°¡ ¾È ÀÔ·ÂµÇ¾úÀ» °æ¿ì ±×³É int È£ÃâÇÏ¸é ¿¡·¯ ³ª±â ¶§¹®.
                     # (¾Õ¿¡ ºÙÀÌ¸é ºÎÈ£°¡ ÀÖ´Â °æ¿ì Ã³¸®°¡ ¾È µÇ¾î¼­ °á±¹ µÚ¿¡ ºÙ¿´À½ -_-;;;;)


# ´ý:
# ½ÇÁ¦·Î ¸¸µé ¶§´Â À§ÀÇ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ ÈÄ ºÒÇÊ¿äÇÑ °ø¹éÀ» ¾ø¾Ø ´ÙÀ½ compressÇß´Ù.
# compressÇÏ´Â °úÁ¤Àº °£´ÜÇÏ´Ù: ¸ÕÀú ¾î¶² Çü½ÄÀ¸·Î ÄÚµå¸¦ Â© °ÇÁö ÅÛÇÃ¸´À» ¸¸µé°í, °Å±â¿¡ ¸ÂÃç¼­ ¾ÐÃàÇÑ´Ù.
# Ã³À½¿¡ °èÈ¹Çß´ø ÄÚµå´Â ÀÌ·¨´Ù.
#   from string import*;d=replace;exec d(d(d(...(d('string','from','to'),'from','to'),...)
# ±×·¯³ª ´Ù ¸¸µé°íµµ °ø°£ÀÌ ³²´Â ´öºÐ¿¡-_- ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ º¯°æµÇ¾ú´Ù.
#   from string import*;d=replace;R=d(d(d(...(d('string','from','to'),'from','to'),...);exec'additional_code'
# ÀÌ·¸°Ô ¸¸µé°í ³ª¼­ ¼ö½ÄÀ¸·Î ¾î¶² °ÍµéÀ» ¾ÐÃàÇØ¾ß ÄÚµå¸¦ ÁÙÀÏ ¼ö ÀÖ´Â Áö °è»êÇØ º¼ ¼ö ÀÖ´Ù.
# ¾î¶² ¹®ÀÚ¿­ 'text'¿¡ ¾î¶² keyword°¡ n°³ µé¾î ÀÖ´Ù Ä¡ÀÚ. ÀÌ°É ÇÑ ¹®ÀÚ X·Î ÁÙÀÏ ¼ö ÀÖ´Ù¸é,
#  'text' == d('compressed_text','X','keyword')
# ¿Í °°Àº °ü°è°¡ ¼º¸³ÇÑ´Ù. µû¶ó¼­ len(keyword)Â¥¸® ¹®ÀÚ¿­ÀÌ ¸ðµÎ 1 ±æÀÌÀÇ ¹®ÀÚ¿­·Î ´ëÃ¼µÈ´Ù.
# ÀÌ »ç½ÇÀ» °¡Áö°í ½ÄÀ» ¼¼¿ì¸é (len(keyword)-1)*n-(10+len(keyword)) byte¸¦ Àý¾àÇÒ ¼ö ÀÖ´Ù.
# ÄÚµå ¾çÀÌ ²Ï ¸¹¾Ò±â ¶§¹®¿¡ (cÃ³·³ freeformÀ¸·Î Â© ¼ö ÀÖ´Â °Íµµ ¾Æ´Ï°í-_-;) compressor, Áï
# Àú·± Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ºÎºÐ ¹®ÀÚ¿­ Áß °¡Àå È¿À²ÀûÀÎ °ÍµéÀ» ¼øÂ÷ÀûÀ¸·Î ¼±ÅÃÇØ¼­ »ç¿ëÇÏ°Ô Çß´Ù.
# ±×·¸°Ô ÇÏ°í ³ª¼­ ÄÚµå¸¦ ¹è¿­ÇÑ ÈÄ, ³²´Â °ø°£Àº Ãß°¡ÀûÀÎ ÄÚµå·Î Ã¤¿ü´Ù. ÀÌ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
#   from sys import*
#   if['--source']==argv[1:2]:print'# TokigunStudio Whitespace Implementation\n\n'+R
#   else:exec R
# ¹¹ ¾î·Á¿î °Ç ¾Æ´Ï±â ¶§¹®¿¡ ¼³¸íÀº »ý·«ÇÏ±â·Î ÇÑ´Ù. :)
# ¾Æ¹«Æ° ÅÛÇÃ¸´¿¡ ÀÌ·± ³»¿ëµéÀ» ³¢¿ö ¸ÂÃß°í ¾Õ¿¡ (¾µµ¥¾ø´Â) docstringÀ» ³Ö¾î¼­ indentationÀ» ÇØ°áÇß´Ù.
# ¸î °¡Áö ¹æ¹ýÀ» »ý°¢ÇØ ºÃÁö¸¸ ½ÇÁ¦·Î ¾µ ¼ö ÀÖ´Â ¹æ¹ýÀº ÀÌ·± °Í ¹Û¿¡ ¾ø´õ¶õ´Ù. -_-;;;
# 
# ÀüÃ¼ÀûÀ¸·Î´Â ÆÄÀÌ½ã¿¡ ÀÖ´Â ¹®ÀÚ¿­ ÀÌ¾î ºÙÀÌ±â ±â´É(Áï, "ab" "cd" == "abcd")À» ¸¹ÀÌ »ç¿ëÇß´Ù.
# ÇÊ¿ä¿¡ µû¶ó¼­ \³ª +¸¦ ÀûÀýÈ÷ »ç¿ëÇÏ±âµµ ÇßÀ¸¸ç, Áß°£¿¡´Â raw-stringÀ» ¾²±âµµ ÇÑ´Ù. -_-;
# ¿Ü°û¼±À» ""·Î Ã³¸®ÇÑ °ÍÀº ÀÇµµÀûÀÎ °ÍÀÌ¶ó »ý°¢ÇÏ¸é µÇ°Ú´Ù.
# °ø°³ ÈÄ ¼öµµ ¾øÀÌ ¶â¾î °íÃÆÁö¸¸ ¾ÆÁ÷µµ ¸¾¿¡ ¾È µå´Â ºÎºÐÀº ÄÚÀÌ´Ù.
# ÄÚ ºÎºÐÀ» Á» Àß µå·¯³ª°Ô ÇÏ°í ½ÍÀºµ¥ ±×°Ô Àß ¾È µÈ´Ù. -_-;;; ¿ª½Ã ³­ ¹Ì¼ú¿¡ ¼ÒÁú °°Àº °Ç ¾ø´Â °Í °°´Ù;
# ¾Æ¹«Æ°... Âü Àç¹Õ´Â ÁþÀÌ¾ú´Ù. ¼ÕÀÌ ³Ê¹« ¸¹ÀÌ °¡¼­ Á×´Â ÁÙ ¾Ë¾Ò´Ù. -_-
# ÀÌ ÄÚµå¸¦ º¸¸é¼­ ¿©·¯ »ç¶÷µéÀÌ Áñ°Å¿ö ÇßÀ¸¸é ÇÏ´Â ¸¶À½ÀÌ´Ù. ´©±¸³ª ±×·¯Áö ¾Ê´Â°¡ ;)

