code: def btc_script_deserialize(script):
      
  
      if isinstance(script, str) and re.match('^[0-9a-fA-F]*$', script):
         script = binascii.unhexlify(script)
  
      # output buffer
      out = []
      pos = 0
  
      while pos < len(script):
          # next script op...
          code = encoding.from_byte_to_int(script[pos])
  
          if code == 0:
              # empty (OP_0)
              out.append(None)
              pos += 1
  
          elif code <= 75:
              # literal numeric constant, followed by a slice of data.
              # push the slice of data.
              out.append(script[pos+1:pos+1+code])
              pos += 1 + code
  
          elif code <= 78:
              # OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4, followed by length and data
              # push the data itself
              szsz = pow(2, code - 76)
              sz = encoding.decode(script[pos+szsz: pos:-1], 256)
              out.append(script[pos + 1 + szsz : pos + 1 + szsz + sz])
              pos += 1 + szsz + sz
  
          elif code <= 96:
              # OP_1NEGATE, OP_RESERVED, OP_1 thru OP_16
              # pass -1 for OP_1NEGATE
              # pass 0 for OP_RESERVED (shouldn't be used anyway)
              # pass 1 thru 16 for OP_1 thru OP_16
              out.append(code - 80)
              pos += 1
  
          else:
              # raw opcode
              out.append(code)
              pos += 1
  
      # make sure each string is hex'ed
      out = encoding.json_changebase(out, lambda x: encoding.safe_hexlify(x))
      return out
docs: Given a script (hex or bin), decode it into its list of opcodes and data.
      Return a list of strings and ints.
  
      Based on code in pybitcointools (https://github.com/vbuterin/pybitcointools)
      by Vitalik Buterin