# -*- mode:Python -*-

import sys
import math
from   helpers import ErrorMessage
from   helpers import WarningMessage


confFile    = '<confFile has not been set>'
patternsLUT = {}


class Pattern ( object ):

    hexaToPatternLUT = { '0':'    '
                       , '1':'   X'
                       , '2':'  X '
                       , '3':'  XX'
                       , '4':' X  '
                       , '5':' X X'
                       , '6':' XX '
                       , '7':' XXX'
                       , '8':'X   '
                       , '9':'X  X'
                       , 'a':'X X '
                       , 'b':'X XX'
                       , 'c':'XX  '
                       , 'd':'XX X'
                       , 'e':'XXX '
                       , 'f':'XXXX'}

    def __init__ ( self, name='noname', bits=[], hexa='' ):
        self._name = name
        self._bits = []
        self._hexa = ''
        self._side = 0
    
        if bits: self._setFromBits(bits)
        if hexa: self._setFromHexa(hexa)
        return

    def empty ( self ):
        if not self._bits and not self._hexa: return True
        return False

    def _setName ( self, name ): self._name = name
    def _getName ( self ): return self._name

    def _toHexa ( self ):
        hexasLSB = []
        for line in self._bits:
            byte = 0
            for i in range(len(line)):
                if i != 0 and i%4 == 0:
                    hexasLSB  += [ hex(byte)[2:] ]
                    byte  = 0
                byte = byte << 1
                if line[i] != ' ': byte += 1
            hexasLSB += [ hex(byte)[2:] ]

       # Convert in MSB mode. Invert the bytes by pairs.
        self._hexa = ''
        for i in range(len(hexasLSB)/2):
            self._hexa += hexasLSB[i*2+1] + hexasLSB[i*2]
        return self._hexa

    def _fromHexa ( self ):
        self._bits = []
    
        side = math.sqrt(4*len(self._hexa))
        if pow(side,2) != 4*len(self._hexa):
            print '[ERROR] The pattern is not square (%d self._bits).' % (4*len(self._hexa))
            return None
    
        side /= 4

       # Convert from MSB mode. Invert the bytes by pairs.
        hexasLSB = ''
        for i in range(len(self._hexa)/2):
            hexasLSB += self._hexa[i*2+1] + self._hexa[i*2]
        
        line = ''
        for i in range(len(hexasLSB)):
            if i != 0 and i%side == 0:
                self._bits += [ line ]
                line = ''
            line += Pattern.hexaToPatternLUT[hexasLSB[i].lower()]
        self._bits += [ line ]
       #self._bits.reverse()
        return self._bits

    def _setFromHexa ( self, hexa ):
        self._hexa = hexa
        self._side = math.sqrt(4*len(self._hexa))

        if pow(self._side,2) != 4*len(self._hexa):
            raise ErrorMessage( 1, 'The pattern is not square (%d bits).'
                                   % (4*len(self._hexa)) )
            return

        self._fromHexa()
        return

    def _setFromBits ( self, bits ):
        self._bits = bits
        self._side = len(bits)

        for line in bits:
            if self._side != len(line):
                raise ErrorMessage( 1, 'The pattern is not square (%dx%d bits).'
                                       % (len(line),len(self._bits)) )

        self._toHexa()
        return

    def _getHexa ( self ): return self._hexa
    def _getBits ( self ): return self._bits

    def printBits ( self ):
        s    = ''
        side = len(self._bits[0])
    
        s += '+%s+\n' % ('-'*side)
        for line in self._bits:
            s += '|%s|\n' % line
        s += '+%s+' % ('-'*side)
        return s

    def printHexa ( self ):
        return self._hexa

    def __str__ ( self ):
        return self._hexa

    hexa = property(_getName,_setName)
    hexa = property(_getHexa,_setFromHexa)
    bits = property(_getBits,_setFromBits)


def loadPatterns ( patternsData, fromFile ):
    global patternsLUT
    global confFile
    confFile = fromFile

    entryNo = 0
    for entry in patternsData:
        entryNo += 1

        try:
            if not isinstance(entry,dict):
                raise ErrorMessage(1,['Malformed entry in <patternsTable>.'
                                     ,'Not a dictionary {\'key1\':\'value1\', ...}.'
                                     ,str(entry)
                                     ])

            if not entry.has_key('name'):
                raise ErrorMessage(1,['Malformed entry in <patternsTable>.'
                                     ,'Pattern has no \'name\' key.'
                                     ,str(entry)
                                     ])
            arguments = { 'name':entry['name'] }

            if entry.has_key('bits'):
                arguments['bits'] = entry['bits']

            if entry.has_key('hexa'):
                if entry.has_key('bits'):
                    w = WarningMessage( 'Pattern <%s> has both bits & hexa, ignoring hexa.' % entry['name'] )
                    print w
                else:
                    arguments['hexa'] = entry['hexa']

            patternsLUT[ entry['name'] ] = Pattern( **arguments ) 


        except Exception, e:
            ErrorMessage.wrapPrint(e,'In %s:<patternsTable> at index %d.' % (confFile,entryNo))
    return


#patternsLUT = { 'slash.8' : Pattern( name='slash.8'
#                                   , bits=[ '   X   X'
#                                          , '  X   X '
#                                          , ' X   X  '
#                                          , 'X   X   '
#                                          , '   X   X'
#                                          , '  X   X '
#                                          , ' X   X  '
#                                          , 'X   X   ' ])
#              , 'hash.8'  : Pattern( name='hash.8'
#                                   , bits=[ 'XXX XXX '
#                                          , 'XX XXX X'
#                                          , 'X XXX XX'
#                                          , ' XXX XXX'
#                                          , 'XXX XXX '
#                                          , 'XX XXX X'
#                                          , 'X XXX XX'
#                                          , ' XXX XXX' ])
#              , 'urgo.8'             : Pattern( name='urgo.8'            , hexa='feffffffefffffff')
#              , 'antihash0.8'        : Pattern( name='antihash0.8'       , hexa='77bbddee77bbddee')
#              , 'antihash1.8'        : Pattern( name='antihash1.8'       , hexa='bbddee77bbddee77')
#              , 'poids2.8'           : Pattern( name='poids2.8'          , hexa='aa55aa55aa55aa55')
#              , 'poids4.8'           : Pattern( name='poids4.8'          , hexa='8800220088002200')
#              , 'antipoids2.8'       : Pattern( name='antipoids2.8'      , hexa='55aa55aa55aa55aa')
#              , 'light_antihash0.8'  : Pattern( name='light_antihash0.8' , hexa='8822882288228822')
#              , 'light_antihash1.8'  : Pattern( name='light_antihash1.8' , hexa='4411441144114411')
#              , 'light_antihash2.8'  : Pattern( name='light_antihash2.8' , hexa='2288228822882288')
#              , 'light_antislash0.8' : Pattern( name='light_antislash0.8', hexa='8844221188442211')
#              , 'urgo.32'            : Pattern( name='urgo.32'
#                                              , bits=[ 'XXXXXXXXXXXXX  XXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXX      XXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXX      XXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXX  XXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXX  XXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX  X'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX  X'
#                                                     , ' XXXXXXXXXXXXXXXXXXXXXXXXXX     '
#                                                     , ' XXXXXXXXXXXXXXXXXXXXXXXXXX     '
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX  X'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX  X'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
#                                                     , 'XXXXXXXXXXXXX  XXXXXXXXXXXXXXXXX' ])
#              , 'slash.32'           : Pattern( name='slash.32'
#                                              , bits=[ '               X               X'
#                                                     , '              X               X '
#                                                     , '             X               X  '
#                                                     , '            X               X   '
#                                                     , '           X               X    '
#                                                     , '          X               X     '
#                                                     , '         X               X      '
#                                                     , '        X               X       '
#                                                     , '       X               X        '
#                                                     , '      X               X         '
#                                                     , '     X               X          '
#                                                     , '    X               X           '
#                                                     , '   X               X            '
#                                                     , '  X               X             '
#                                                     , ' X               X              '
#                                                     , 'X               X               '
#                                                     , '               X               X'
#                                                     , '              X               X '
#                                                     , '             X               X  '
#                                                     , '            X               X   '
#                                                     , '           X               X    '
#                                                     , '          X               X     '
#                                                     , '         X               X      '
#                                                     , '        X               X       '
#                                                     , '       X               X        '
#                                                     , '      X               X         '
#                                                     , '     X               X          '
#                                                     , '    X               X           '
#                                                     , '   X               X            '
#                                                     , '  X               X             '
#                                                     , ' X               X              '
#                                                     , 'X               X               ' ])
#              , 'antihash0.32'       : Pattern( name='antihash0.32'
#                                              , bits=[ ' XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX'
#                                                     , 'X XXXXXXXXXXXXXXX XXXXXXXXXXXXXX'
#                                                     , 'XX XXXXXXXXXXXXXXX XXXXXXXXXXXXX'
#                                                     , 'XXX XXXXXXXXXXXXXXX XXXXXXXXXXXX'
#                                                     , 'XXXX XXXXXXXXXXXXXXX XXXXXXXXXXX'
#                                                     , 'XXXXX XXXXXXXXXXXXXXX XXXXXXXXXX'
#                                                     , 'XXXXXX XXXXXXXXXXXXXXX XXXXXXXXX'
#                                                     , 'XXXXXXX XXXXXXXXXXXXXXX XXXXXXXX'
#                                                     , 'XXXXXXXX XXXXXXXXXXXXXXX XXXXXXX'
#                                                     , 'XXXXXXXXX XXXXXXXXXXXXXXX XXXXXX'
#                                                     , 'XXXXXXXXXX XXXXXXXXXXXXXXX XXXXX'
#                                                     , 'XXXXXXXXXXX XXXXXXXXXXXXXXX XXXX'
#                                                     , 'XXXXXXXXXXXX XXXXXXXXXXXXXXX XXX'
#                                                     , 'XXXXXXXXXXXXX XXXXXXXXXXXXXXX XX'
#                                                     , 'XXXXXXXXXXXXXX XXXXXXXXXXXXXXX X'
#                                                     , 'XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX '
#                                                     , ' XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX'
#                                                     , 'X XXXXXXXXXXXXXXX XXXXXXXXXXXXXX'
#                                                     , 'XX XXXXXXXXXXXXXXX XXXXXXXXXXXXX'
#                                                     , 'XXX XXXXXXXXXXXXXXX XXXXXXXXXXXX'
#                                                     , 'XXXX XXXXXXXXXXXXXXX XXXXXXXXXXX'
#                                                     , 'XXXXX XXXXXXXXXXXXXXX XXXXXXXXXX'
#                                                     , 'XXXXXX XXXXXXXXXXXXXXX XXXXXXXXX'
#                                                     , 'XXXXXXX XXXXXXXXXXXXXXX XXXXXXXX'
#                                                     , 'XXXXXXXX XXXXXXXXXXXXXXX XXXXXXX'
#                                                     , 'XXXXXXXXX XXXXXXXXXXXXXXX XXXXXX'
#                                                     , 'XXXXXXXXXX XXXXXXXXXXXXXXX XXXXX'
#                                                     , 'XXXXXXXXXXX XXXXXXXXXXXXXXX XXXX'
#                                                     , 'XXXXXXXXXXXX XXXXXXXXXXXXXXX XXX'
#                                                     , 'XXXXXXXXXXXXX XXXXXXXXXXXXXXX XX'
#                                                     , 'XXXXXXXXXXXXXX XXXXXXXXXXXXXXX X'
#                                                     , 'XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX ' ])
#              , 'antihash1.32'       : Pattern( name='antihash1.32'
#                                              , bits=[ 'XXXX XXXXXXXXXXXXXXX XXXXXXXXXXX'
#                                                     , 'XXXXX XXXXXXXXXXXXXXX XXXXXXXXXX'
#                                                     , 'XXXXXX XXXXXXXXXXXXXXX XXXXXXXXX'
#                                                     , 'XXXXXXX XXXXXXXXXXXXXXX XXXXXXXX'
#                                                     , 'XXXXXXXX XXXXXXXXXXXXXXX XXXXXXX'
#                                                     , 'XXXXXXXXX XXXXXXXXXXXXXXX XXXXXX'
#                                                     , 'XXXXXXXXXX XXXXXXXXXXXXXXX XXXXX'
#                                                     , 'XXXXXXXXXXX XXXXXXXXXXXXXXX XXXX'
#                                                     , 'XXXXXXXXXXXX XXXXXXXXXXXXXXX XXX'
#                                                     , 'XXXXXXXXXXXXX XXXXXXXXXXXXXXX XX'
#                                                     , 'XXXXXXXXXXXXXX XXXXXXXXXXXXXXX X'
#                                                     , 'XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX '
#                                                     , ' XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX'
#                                                     , 'X XXXXXXXXXXXXXXX XXXXXXXXXXXXXX'
#                                                     , 'XX XXXXXXXXXXXXXXX XXXXXXXXXXXXX'
#                                                     , 'XXX XXXXXXXXXXXXXXX XXXXXXXXXXXX'
#                                                     , 'XXXX XXXXXXXXXXXXXXX XXXXXXXXXXX'
#                                                     , 'XXXXX XXXXXXXXXXXXXXX XXXXXXXXXX'
#                                                     , 'XXXXXX XXXXXXXXXXXXXXX XXXXXXXXX'
#                                                     , 'XXXXXXX XXXXXXXXXXXXXXX XXXXXXXX'
#                                                     , 'XXXXXXXX XXXXXXXXXXXXXXX XXXXXXX'
#                                                     , 'XXXXXXXXX XXXXXXXXXXXXXXX XXXXXX'
#                                                     , 'XXXXXXXXXX XXXXXXXXXXXXXXX XXXXX'
#                                                     , 'XXXXXXXXXXX XXXXXXXXXXXXXXX XXXX'
#                                                     , 'XXXXXXXXXXXX XXXXXXXXXXXXXXX XXX'
#                                                     , 'XXXXXXXXXXXXX XXXXXXXXXXXXXXX XX'
#                                                     , 'XXXXXXXXXXXXXX XXXXXXXXXXXXXXX X'
#                                                     , 'XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX '
#                                                     , ' XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX'
#                                                     , 'X XXXXXXXXXXXXXXX XXXXXXXXXXXXXX'
#                                                     , 'XX XXXXXXXXXXXXXXX XXXXXXXXXXXXX'
#                                                     , 'XXX XXXXXXXXXXXXXXX XXXXXXXXXXXX' ])
#              , 'poids2.32'                   : Pattern( name='poids2.32'
#                                              , bits=[ '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                ' ])
#              , 'poids4.32'                   : Pattern( name='poids2.32'
#                                              , bits=[ '                                '
#                                                     , ' XX              XX             '
#                                                     , ' XX              XX             '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '         XX              XX     '
#                                                     , '         XX              XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX              XX             '
#                                                     , ' XX              XX             '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '         XX              XX     '
#                                                     , '         XX              XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX              XX             '
#                                                     , ' XX              XX             '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '         XX              XX     '
#                                                     , '         XX              XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX              XX             '
#                                                     , ' XX              XX             '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '         XX              XX     '
#                                                     , '         XX              XX     '
#                                                     , '                                ' ])
#              , 'antipoids2.32'               : Pattern( name='antipoids2.32'
#                                              , bits=[ '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '     XX      XX      XX      XX '
#                                                     , '                                '
#                                                     , '                                '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , ' XX      XX      XX      XX     '
#                                                     , '                                ' ])
#              , 'antislash.32'       : Pattern( name='antislash.32'
#                                              , bits=[ 'X               X               '
#                                                     , ' X               X              '
#                                                     , '  X               X             '
#                                                     , '   X               X            '
#                                                     , '    X               X           '
#                                                     , '     X               X          '
#                                                     , '      X               X         '
#                                                     , '       X               X        '
#                                                     , '        X               X       '
#                                                     , '         X               X      '
#                                                     , '          X               X     '
#                                                     , '           X               X    '
#                                                     , '            X               X   '
#                                                     , '             X               X  '
#                                                     , '              X               X '
#                                                     , '               X               X'
#                                                     , 'X               X               '
#                                                     , ' X               X              '
#                                                     , '  X               X             '
#                                                     , '   X               X            '
#                                                     , '    X               X           '
#                                                     , '     X               X          '
#                                                     , '      X               X         '
#                                                     , '       X               X        '
#                                                     , '        X               X       '
#                                                     , '         X               X      '
#                                                     , '          X               X     '
#                                                     , '           X               X    '
#                                                     , '            X               X   '
#                                                     , '             X               X  '
#                                                     , '              X               X '
#                                                     , '               X               X' ])
#              , 'antislash2.32'      : Pattern( name='antislash2.32'
#                                              , bits=[ 'X               X               '
#                                                     , '  X               X             '
#                                                     , '    X               X           '
#                                                     , '      X               X         '
#                                                     , '        X               X       '
#                                                     , '          X               X     '
#                                                     , '            X               X   '
#                                                     , '              X               X '
#                                                     , 'X               X               '
#                                                     , '  X               X             '
#                                                     , '    X               X           '
#                                                     , '      X               X         '
#                                                     , '        X               X       '
#                                                     , '          X               X     '
#                                                     , '            X               X   '
#                                                     , '              X               X '
#                                                     , 'X               X               '
#                                                     , '  X               X             '
#                                                     , '    X               X           '
#                                                     , '      X               X         '
#                                                     , '        X               X       '
#                                                     , '          X               X     '
#                                                     , '            X               X   '
#                                                     , '              X               X '
#                                                     , 'X               X               '
#                                                     , '  X               X             '
#                                                     , '    X               X           '
#                                                     , '      X               X         '
#                                                     , '        X               X       '
#                                                     , '          X               X     '
#                                                     , '            X               X   '
#                                                     , '              X               X ' ])
#              , 'diffusion.32'       : Pattern( name='diffusion.32'
#                                              , bits=[ 'XXXXXXXXXX      XXXXXXXXXX      '
#                                                     , ' XXXXXXXXXX      XXXXXXXXXX     '
#                                                     , '  XXXXXXXXXX      XXXXXXXXXX    '
#                                                     , '   XXXXXXXXXX      XXXXXXXXXX   '
#                                                     , '    XXXXXXXXXX      XXXXXXXXXX  '
#                                                     , '     XXXXXXXXXX      XXXXXXXXXX '
#                                                     , '      XXXXXXXXXX      XXXXXXXXXX'
#                                                     , 'X      XXXXXXXXXX      XXXXXXXXX'
#                                                     , 'XX      XXXXXXXXXX      XXXXXXXX'
#                                                     , 'XXX      XXXXXXXXXX      XXXXXXX'
#                                                     , 'XXXX      XXXXXXXXXX      XXXXXX'
#                                                     , 'XXXXX      XXXXXXXXXX      XXXXX'
#                                                     , 'XXXXXX      XXXXXXXXXX      XXXX'
#                                                     , 'XXXXXXX      XXXXXXXXXX      XXX'
#                                                     , 'XXXXXXXX      XXXXXXXXXX      XX'
#                                                     , 'XXXXXXXXX      XXXXXXXXXX      X'
#                                                     , 'XXXXXXXXXX      XXXXXXXXXX      '
#                                                     , ' XXXXXXXXXX      XXXXXXXXXX     '
#                                                     , '  XXXXXXXXXX      XXXXXXXXXX    '
#                                                     , '   XXXXXXXXXX      XXXXXXXXXX   '
#                                                     , '    XXXXXXXXXX      XXXXXXXXXX  '
#                                                     , '     XXXXXXXXXX      XXXXXXXXXX '
#                                                     , '      XXXXXXXXXX      XXXXXXXXXX'
#                                                     , 'X      XXXXXXXXXX      XXXXXXXXX'
#                                                     , 'XX      XXXXXXXXXX      XXXXXXXX'
#                                                     , 'XXX      XXXXXXXXXX      XXXXXXX'
#                                                     , 'XXXX      XXXXXXXXXX      XXXXXX'
#                                                     , 'XXXXX      XXXXXXXXXX      XXXXX'
#                                                     , 'XXXXXX      XXXXXXXXXX      XXXX'
#                                                     , 'XXXXXXX      XXXXXXXXXX      XXX'
#                                                     , 'XXXXXXXX      XXXXXXXXXX      XX'
#                                                     , 'XXXXXXXXX      XXXXXXXXXX      X' ])
#              , 'active.32'          : Pattern( name='active.32'
#                                              , bits=[ '   XXXXXXXXXXXXX   XXXXXXXXXXXXX'
#                                                     , 'X   XXXXXXXXXXXXX   XXXXXXXXXXXX'
#                                                     , 'XX   XXXXXXXXXXXXX   XXXXXXXXXXX'
#                                                     , 'XXX   XXXXXXXXXXXXX   XXXXXXXXXX'
#                                                     , 'XXXX   XXXXXXXXXXXXX   XXXXXXXXX'
#                                                     , 'XXXXX   XXXXXXXXXXXXX   XXXXXXXX'
#                                                     , 'XXXXXX   XXXXXXXXXXXXX   XXXXXXX'
#                                                     , 'XXXXXXX   XXXXXXXXXXXXX   XXXXXX'
#                                                     , 'XXXXXXXX   XXXXXXXXXXXXX   XXXXX'
#                                                     , 'XXXXXXXXX   XXXXXXXXXXXXX   XXXX'
#                                                     , 'XXXXXXXXXX   XXXXXXXXXXXXX   XXX'
#                                                     , 'XXXXXXXXXXX   XXXXXXXXXXXXX   XX'
#                                                     , 'XXXXXXXXXXXX   XXXXXXXXXXXXX   X'
#                                                     , 'XXXXXXXXXXXXX   XXXXXXXXXXXXX   '
#                                                     , ' XXXXXXXXXXXXX   XXXXXXXXXXXXX  '
#                                                     , '  XXXXXXXXXXXXX   XXXXXXXXXXXXX '
#                                                     , '   XXXXXXXXXXXXX   XXXXXXXXXXXXX'
#                                                     , 'X   XXXXXXXXXXXXX   XXXXXXXXXXXX'
#                                                     , 'XX   XXXXXXXXXXXXX   XXXXXXXXXXX'
#                                                     , 'XXX   XXXXXXXXXXXXX   XXXXXXXXXX'
#                                                     , 'XXXX   XXXXXXXXXXXXX   XXXXXXXXX'
#                                                     , 'XXXXX   XXXXXXXXXXXXX   XXXXXXXX'
#                                                     , 'XXXXXX   XXXXXXXXXXXXX   XXXXXXX'
#                                                     , 'XXXXXXX   XXXXXXXXXXXXX   XXXXXX'
#                                                     , 'XXXXXXXX   XXXXXXXXXXXXX   XXXXX'
#                                                     , 'XXXXXXXXX   XXXXXXXXXXXXX   XXXX'
#                                                     , 'XXXXXXXXXX   XXXXXXXXXXXXX   XXX'
#                                                     , 'XXXXXXXXXXX   XXXXXXXXXXXXX   XX'
#                                                     , 'XXXXXXXXXXXX   XXXXXXXXXXXXX   X'
#                                                     , 'XXXXXXXXXXXXX   XXXXXXXXXXXXX   '
#                                                     , ' XXXXXXXXXXXXX   XXXXXXXXXXXXX  '
#                                                     , '  XXXXXXXXXXXXX   XXXXXXXXXXXXX ' ])
#              }