refactoring: created a 'plotter' subdirectory and put everything related to GPIB/HPGL plotting under it

Fri, 25 Jan 2008 21:00:34 +0100

author
David Douard <david.douard@logilab.fr>
date
Fri, 25 Jan 2008 21:00:34 +0100
changeset 32
59da528bc470
parent 31
c869766e25ff
child 33
61809bb871bf

refactoring: created a 'plotter' subdirectory and put everything related to GPIB/HPGL plotting under it

bin/qgpibplotter file | annotate | diff | comparison | revisions
gpib.py file | annotate | diff | comparison | revisions
gpib_plotter.py file | annotate | diff | comparison | revisions
gpib_plotter_mockup.py file | annotate | diff | comparison | revisions
hpgl_mpl.py file | annotate | diff | comparison | revisions
hpgl_parser.py file | annotate | diff | comparison | revisions
hpgl_plotter.qrc file | annotate | diff | comparison | revisions
hpgl_plotter_rc.py file | annotate | diff | comparison | revisions
hpgl_qt.py file | annotate | diff | comparison | revisions
plotter/__init__.py file | annotate | diff | comparison | revisions
plotter/gpib.py file | annotate | diff | comparison | revisions
plotter/gpib_plotter.py file | annotate | diff | comparison | revisions
plotter/gpib_plotter_mockup.py file | annotate | diff | comparison | revisions
plotter/hpgl_mpl.py file | annotate | diff | comparison | revisions
plotter/hpgl_parser.py file | annotate | diff | comparison | revisions
plotter/hpgl_plotter.qrc file | annotate | diff | comparison | revisions
plotter/hpgl_plotter_rc.py file | annotate | diff | comparison | revisions
plotter/hpgl_qt.py file | annotate | diff | comparison | revisions
plotter/qgpib_plotter.py file | annotate | diff | comparison | revisions
plotter/qhpgl_plotter.ui file | annotate | diff | comparison | revisions
plotter/qpreferences.py file | annotate | diff | comparison | revisions
plotter/qpreferences_dialog.ui file | annotate | diff | comparison | revisions
qgpib_plotter.py file | annotate | diff | comparison | revisions
qhpgl_plotter.ui file | annotate | diff | comparison | revisions
qpreferences.py file | annotate | diff | comparison | revisions
qpreferences_dialog.ui file | annotate | diff | comparison | revisions
--- a/bin/qgpibplotter	Fri Jan 25 20:51:56 2008 +0100
+++ b/bin/qgpibplotter	Fri Jan 25 21:00:34 2008 +0100
@@ -1,4 +1,4 @@
 #!/usr/bin/python
 
-from qgpib_plotter import main
+from plotter.qgpib_plotter import main
 main()
--- a/gpib.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-"""
-gpib: create serial connection to GPIB-USB device (ProLogix is the
-only supported device for now).
-"""
-import serial
-from serial.serialutil import SerialException
-import time
-
-class ConnectionError(Exception):
-    pass
-
-class Constants(object):
-    def __init__(self):
-        self.constants = {}
-        self.descriptions = {}
-        self.rev_constants = {}
-        for v, k, m in self._constants:
-            self.k = v
-            self.constants[v] = k
-            self.rev_constants[k] = v
-            self.descriptions[v] = m
-            
-    def __getitem__(self, k):
-        if isinstance(k, basestring):
-            return self.rev_constants[k]
-        else:
-            return self.constants[k]
-
-    def get_description(self, k):
-        if isinstance(k, basestring):
-            k = self.rev_constants[k]
-        return self.descriptions[k]
-    
-
-class MODE(Constants):    
-    _constants = [(1, "CONTROLLER", "Set device as Controller in Charge"),
-                  (0, "DEVICE", "Set device as simple listener"),
-                  ]
-# TODO
-# class STATUS_BYTE(Constants):
-#     # IEEE 488.2 Status Byte constants
-#     MAV = 0x10 # Message AVailable: bit 4 of the Status Byte
-#     ESB = 0x20 # Event Status Bit: bit 5 of the Status Byte
-#     MSS = 0x40 # Master Summary Status bit: bit 6 of the Status Byte (NOT
-#                # sent in response to a serial poll)
-#     RQS = 0x40 # Request Service: bit 6 of the Status Byte (when sent in
-#                # response to a serial poll)
-# class SESR(Constants):
-#     # SESR constants (Standard Event Status Register)
-#     PON = 0x80 # Power On: Power has been turned On since last register
-#                # read access
-#     URQ = 0x40 # User Request: the user has activated some device control
-#                # (whatever the Remote Local state is)
-#     CME = 0x20 # Command Error
-#     EXE = 0x10 # Execution Error
-#     DDE = 0x08 # Device Dependant Error
-#     QYE = 0x04 # QuerY Error (attempt to read data while Output Queue is
-#                # empty, or data in the OQ was lost)
-#     RQC = 0x02 # Request Control: tell the CiC that the device wants to
-#                # become the CiC
-#     OPC = 0x01 # Operation Complete: device has completed any pending
-#                # operation (ready to accept new commands). This bit is
-#                # generated in response to a OPC command.
-    
--- a/gpib_plotter.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-import sys, os
-import time
-import gpib
-
-import gpib
-from prologix import GPIB
-class GPIBplotter(GPIB):
-    _replies={
-        "OE": "0",
-        "OH": "0,0,10000,7500",
-        "OI": "7470A",
-        "OP": "0,0,10000,7500",
-        "OO": "0,1,0,0,0,0,0,0",
-        "OF": "40,40",
-        "OS": "24",
-        }
-    def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
-                 address=5):
-        super(GPIBplotter, self).__init__(device, baudrate, timeout, address, mode=0)
-
-    def plotStarted(self):
-        pass
-
-    def load_plot(self, wait_timeout=0):
-        """
-        Make a full plot process.
-
-        'wait_timeout' is the first timeout. Same semantic as the
-        'timeout' property of a serial connection (if set to None, it
-        will block until the GPIB device actually perform a plot
-        command.)
-        """
-        res = ""
-        i=0
-        replies = self._replies.copy()
-        if wait_timeout is not None and not isinstance(wait_timeout, (float, int)):
-            raise TypeError, "wait_timeout (%s:%s) has wrong type"%(repr(wait_timeout), type(wait_timeout))
-        if wait_timeout<0:
-            raise ValueError
-        
-        self._cnx.timeout = wait_timeout
-        firstloop = True
-        newdata = False
-        while i<self._retries:
-            l = self._cnx.readline().strip()
-            if firstloop:
-                self._cnx.timeout = self._timeout
-                firstloop = False
-                self.plotStarted()
-            if l == "":
-                if i == 0:# > (self._retries/2):
-                    # ie. we just received new stuffs (i is reset in the else block)
-                    for k, v in replies.items():
-                        # check wether we should reply smthg
-                        eres = res.replace('\n', '').strip()
-                        if eres.endswith(k) or eres.endswith(k+';') or eres.endswith(k+';OE'):
-                            self._cnx.write("%s"%v)
-                            if k == "OS":
-                                replies[k] = "16"
-                            break
-                    self._cnx.write('\r')
-                    #time.sleep(0.1)
-                i += 1
-            else:
-                if not res:
-                    print "Plotting..."
-                res += l + '\n'
-                i = 0
-                #time.sleep(0.1)
-        if res:
-            print "DONE (received %d characters)"%len(res)
-        return res
-
-if __name__ == '__main__':
-    import optparse
-    opt = optparse.OptionParser('A simple HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
-    opt.add_option('-f', '--filename', default=None,
-                   dest='filename',
-                   help='Output filename. If not set, write to stdout')
-    opt.add_option('-d', '--device', default='/dev/ttyUSB0',
-                   dest='device',
-                   help='Device of the RS232 connection (default: /dev/ttyUSB0)',
-                   )
-    opt.add_option('-a', '--address', default=0,
-                   dest='address',
-                   help='GPIB address of the device',
-                   )
-    opt.add_option('-l', '--loop', default=False,
-                   action="store_true",
-                   dest="loop",
-                   help="Continuously wait for new plots. If set, filename must be set and files will be created with _n at the end")
-    opt.add_option('-v', '--verbose', default=False,
-                   action="store_true",
-                   dest="verbose",
-                   help="Verbose mode",)
-    
-    options, argv = opt.parse_args(sys.argv)
-
-    if options.loop and not options.filename:
-        opt.error('If loop is set, you *must* provide a filename')
-
-    if options.filename:        
-        outf = open(options.filename, "w")
-    else:
-        outf = sys.stdout
-
-
-    try:
-        plotter = GPIBplotter(device=options.device, address=int(options.address),
-                              timeout=0.06)
-    except (gpib.SerialException, gpib.ConnectionError), e:
-        sys.stderr.write('Connection error:\n\t' + '\n\t'.join([str(x) for x in e.args]) + '\n')
-        sys.stderr.write('Check your parameters\n')
-        sys.exit(1)
-    if options.verbose:
-        sys.stderr.write('connection established\n')
-
-    loop = True
-    nloop = 0
-    while loop:
-        plot = plotter.load_plot(wait_timeout=0.1)
-        if options.verbose:
-            sys.stderr.write('.')
-        if plot:
-            outf.write(plot)
-            if options.verbose:
-                sys.stderr.write('\n')
-            sys.stderr.write('Received a new plot (written to %s)\n'%outf.name) 
-            if not options.loop:
-                loop = False
-            else:
-                nloop += 1
-                fname, ext = os.path.splitext(options.filename)
-                outf = open(fname + "_%d"%nloop + ext, 'w')
-                
-        
-    
-
-
--- a/gpib_plotter_mockup.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-import glob
-import os
-import time
-import random
-
-class GPIBplotter:#(GPIB):
-    """
-    A mockup thet will find in a directory some HPGL files and feed them randomly
-    """
-    def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
-                 address=5):
-        self._timeout = timeout
-        self.filenames = glob.glob('examples/*.plt')
-        self._next = random.randint(10,50)
-        self._num = 0
-
-    def plotStarted(self):
-        pass
-        
-    def load_plot(self, wait_timeout=0):
-        if wait_timeout:
-            time.sleep(wait_timeout)
-        self._num += 1
-        if self._num > self._next:
-            ret = open(random.choice(self.filenames)).read()
-            if len(ret)>0:
-                self.plotStarted()
-                self._num = 0
-                self._next = random.randint(10,100)
-                time.sleep(random.randint(1,3))
-                return ret
-            return None
-        return None
-    
-        
--- a/hpgl_mpl.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-# -*- coding: utf-8 -*-
-import numpy
-import pylab
-
-from hpgl_parser import HPGLParser
-
-class HPGLmplPlotter(HPGLParser):
-    pens = "krbgcmyw"
-    lines = ['-', ':', '--', '-.', '.', '-', '-', '-']
-    def __init__(self, data):        
-        super(HPGLmplPlotter, self).__init__(data)
-        pylab.show()
-        
-    def plot_symbols(self, points):
-        x, y = points.T
-        pylab.plot(x, y, 'o')
-
-    def plot_lines(self, points):
-        x, y = points.T
-        pylab.plot(x, y, self.pens[self.pen]+self.lines[self.line_type])
-        
-if __name__ == "__main__":
-    import sys
-    data = open(sys.argv[1]).read()
-    HPGLmplPlotter(data)
-    
--- a/hpgl_parser.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,451 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import re
-import numpy
-
-vsplitter = re.compile('[ ,]')
-vextractor = re.compile('(?P<value>[^;\n\r\aA-DF-Za-df-z]*?)(?P<terminator>[;\n\r\a]+)', re.S+re.M) 
-
-class HPGLParser(object):
-    def __init__(self, data=None):
-        self.str_terminator = chr(0x03)
-        self.IN()
-        if data:
-            self.parse(data)
-
-    def parse(self, data):
-        self.data = data
-        self.idx = 0
-        self.IN()        
-        while self.idx<len(data):
-            while data[self.idx] in [';','\n','\r', '\a', ' ']:
-                self.idx += 1
-            if data[self.idx] == chr(0x03):
-                self.ESC()
-            else:
-                cmd = data[self.idx: self.idx+2]
-                self.idx += 2
-                getattr(self, cmd)()
-            while self.idx<len(data) and data[self.idx] in [';','\n','\r', '\a', ' ']:
-                self.idx += 1
-
-    def user_to_abs(self, pos):
-        """
-        converts a position (x, y) given in user units to absolute
-        units
-        """
-        return pos #TODO
-        
-    def extract_value(self, raw=False):
-        m = vextractor.match(self.data[self.idx:])
-        if m:
-            val = m.group("value")
-            self.idx = self.idx + len(val) + len(m.group("terminator"))
-            val = vsplitter.split(val)
-            if not raw:
-                val = [eval(x) for x in val if x.strip()]
-            return val
-        return []
-
-    def extract_string(self):
-        idx2 = self.data.find(self.str_terminator, self.idx)
-        val = self.data[self.idx: idx2]
-        self.idx = idx2+1
-        return val
-
-    def polyline(self, values):
-        if (len(values)%2) == 1:
-            # this is a syntax error in the HPGL data
-            values = values[:-1]
-        values = numpy.array(values).reshape(-1, 2)
-        # TODO use scaling            
-        # do plots 
-        values = numpy.r_[[self.pos], values] #add self.pos as 1st value
-        if self.plot_mode == 'relative':
-            values = values.cumsum(axis=0)
-        if self.symbol_mode:
-            self.plot_symbols(values[1:])
-        if self.pen_state == "down":
-            self.plot_lines(values)
-        self.pos = values[-1]
-
-    def plot_string(self, s):
-        pass
-    
-    def get_window_for_paper(self):
-        return 0,100,0,100
-    def get_scaling_points_for_paper(self):
-        return 0,100,0,100
-        
-    # effective plot methods; to be defined in subclasses (backends)
-    def plot_symbols(self, points):
-        pass
-    def plot_lines(self, points):
-        pass
-        
-    # HPGL-related methods
-    def ESC(self):
-        #print "ESC"
-        self.idx += 1
-
-    def OE(self):
-        """ Output Error """
-        pass
-        
-    def EC(self):
-        """? what's this """
-        values = self.extract_value()
-
-    def OO(self):
-        """idem"""
-        pass
-
-    def OP(self):
-        """idem"""
-        pass
-
-    def VS(self):
-        """idem"""
-        pass
-        
-        
-    def DF(self):
-        """ Default """
-        self.pen = 0
-        self.pen_width = 1 # 1/300 inch
-        self.pos = 0,0
-        self.char_set = "std"
-        self.plot_mode = 'absolute'
-        self.char_direction = 1,0
-        self.line_type = 0 # 'solid'
-        self.pattern_len = 4 #percentage
-        self.window = self.get_window_for_paper()
-        self.char_size = 0.75, 1.5 #percentages
-        self.symbol_mode = False
-        self.tick_len = 0.5, 0.5 # %
-        self.std_char_set = 0
-        self.alt_char_set = 0
-        self.selected_char_set = 0
-        self.char_slant = 0 # degrees
-        self.scale = None
-        self.str_terminator = chr(0x03)
-        self.chord_ang = 5 #degrees
-        self.fill_type = 'bidirectionnal', 1
-        self.fill_distance = 1 # %
-        self.fill_slant = 0 # degrees
-        self.pen_thickness = 0.3 # mm
-
-    def IN(self):
-        """ Initialize """
-        self.DF()
-        self.pen_state = "up"
-        self.rotation = 0 #degrees
-        self.scaling_points = self.get_scaling_points_for_paper()
-
-    def IP(self):
-        """ Input Scale Point"""
-        values = self.extract_value()
-        if len(values) == 0:
-            self.scaling_points = self.get_scaling_points_for_paper()
-        elif len(values) == 2:
-            p1x, p1y, p2x, p2y = self.scaling_points
-            dx, dy = p2x-p1x, p2y-p1y
-            x, y = values
-            self.scaling = (x, y, x+dx, y+dy)
-        elif len(values) == 4:
-            self.values = tuple(values)
-            
-    def SC(self):
-        """ Scale """
-        values = self.extract_value()
-        if len(values) == 4:
-            self.scale = tuple(values)
-        else:
-            self.scale = None
-
-    def IW(self):
-        values = self.extract_value()
-        if len(values) == 0:
-            self.window = self.get_window_for_paper()
-        elif len(value) == 4:            
-            self.window = tuple(values)
-
-    def RO(self):
-        values = self.extract_value()
-        if len(values) == 0:
-            self.rotation = 0
-        elif len(values) == 1:
-            self.rotation = values[0]
-
-    def PG(self):
-        pass
-
-    def PU(self):
-        """ Pen Up"""
-        self.pen_state = "up"        
-        values = self.extract_value()
-        self.polyline(values)
-
-    def PD(self):
-        """ Pen Down """
-        self.pen_state = "down"        
-        values = self.extract_value()
-        self.polyline(values)
-
-    def PA(self):
-        """ Plot Absolute """
-        self.plot_mode = "absolute"        
-        values = self.extract_value()
-        self.polyline(values)
-
-    def PR(self):
-        """ Plot Relative """
-        self.plot_mode = "relative"        
-        values = self.extract_value()
-        self.polyline(values)
-
-    def AA(self):
-        """ Arc Absolute """
-        values = self.extract_value()
-        if len(values) in [3, 4]:
-            x, y, qc = values[:3]
-            if len(values)==4:
-                qd = values[-1]
-            else:
-                qd = self.chord_ang
-            # TODO : plot arc
-            print "plotting an arc"
-    def AR(self):
-        """ Arc Relative """
-        values = self.extract_value()
-        # TODO
-
-    def CI(self):
-        """ Circle Plot"""
-        values = self.extract_value()
-        # TODO
-
-    def EA(self):
-        """Edge Rectangle Absolute"""
-        values = self.extract_value()
-        # TODO
-
-    def ER(self):
-        """Edge Rectangle Relative"""
-        values = self.extract_value()
-        # TODO
-
-    def EW(self):
-        """ Edge Wedge """
-        values = self.extract_value()
-        # TODO
-
-    def RA(self):
-        """ Fill Rectangle Absolute """
-        values = self.extract_value()
-        # TODO
-
-    def RR(self):
-        """ Fill Rectangle Relative """
-        values = self.extract_value()
-        # TODO
-
-    def WG(self):
-        """ Fill Wedge """
-        values = self.extract_value()
-        # TODO
-
-    def FT(self):
-        """ Fill Type """
-        values = self.extract_value()
-        # TODO
-
-    def LT(self):
-        """ Line Type """
-        values = self.extract_value()
-
-        if len(values)==0:
-            self.line_type = 0 #'solid'
-        else:
-            self.line_type = values[0]
-            if len(values)>1:
-                self.pattern_len = values[1]
-
-    def PW(self):
-        """ Pen Width """
-        values = self.extract_value()
-        if len(values) == 1:
-            self.pen_thickness = values[0]
-
-    def SM(self):
-        """ Symbol Mode """
-        values = self.extract_value()
-        if len(values) == 0:
-            self.symbol_mode = False
-        elif len(values) == 1:
-            self.symbol_mode = values[0]
-
-    def SP(self):
-        """ Select Pen """
-        values = self.extract_value()
-        if len(values) == 1:
-            self.pen = values[0]
-
-    def TL(self):
-        """ Tick Len """
-        values = self.extract_value()
-        # TODO
-
-    def XT(self):
-        """ X-axis Tick """
-        # TODO
-        print "X ticks"
-
-    def YT(self):
-        """ X-axis Tick """
-        # TODO
-        print "Y ticks"
-
-    def PT(self):
-        """ Pen Thickness Select """
-        values = self.extract_value()
-        if len(values) == 0:
-            self.pen_thickness = 0.3
-        elif len(values) == 1:
-            self.pen_thickness = values[0]
-
-    def CS(self):
-        """ Standard Character Set """
-        values = self.extract_value()
-        if len(values) == 0:
-            self.std_char_set = 0
-        elif len(values) == 1:
-            self.std_char_set = values[0]
-
-    def CA(self):
-        """ Alternate Character Set """
-        values = self.extract_value()
-        if len(values) == 0:
-            self.alt_char_set = 0
-        elif len(values) == 1:
-            self.alt_char_set = values[0]
-        
-    def SS(self):
-        """ Select Standard Character Set """
-        self.char_set = "std"
-
-    def SA(self):
-        """ Select Alternate Character Set """
-        self.char_set = "alt"
-
-    def DT(self):
-        """ Define Label Terminator """
-        values = self.extract_value(raw=True)
-        if len(values) == 0:
-            self.str_terminator = chr(0x03)
-        elif len(values) == 1:
-            self.str_terminator = values[0]
-
-    def LB(self):
-        """ Character Plot """
-        values = self.extract_string()
-        self.plot_string(values)
-        x, y = self.pos
-        values = values.split('\n')
-        if self.char_size == "absolute":
-            x += len(values[-1]) * self.char_width *1016/2.54
-            y += (len(values)-1) * self.char_height *1016/2.54
-        else:
-            x0, x1, y0, y1 = self.scale
-            dx = x1-x0
-            dy = y1-y0
-            x += len(values[-1]) * self.char_width / 100.0 * dx
-            y += (len(values)-1) * self.char_height / 100.0 * dy
-            
-        #print "LB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y))
-        self.pos = [x, y]
-
-    def get_char_size(self):
-        if self.char_size == "absolute":
-            x = self.char_width *1016/2.54
-            y = self.char_height *1016/2.54
-        else:
-            x0, x1, y0, y1 = self.scale
-            dx = x1-x0
-            dy = y1-y0
-            x = self.char_width / 100.0 * dx
-            y = self.char_height / 100.0 * dy
-        return x, y
-    
-    def DI(self):
-        """ Absolute Direction """
-        values = self.extract_value()
-        if len(values) == 0:
-            self.char_direction = 1.0, 0.0
-        elif len(values) == 2:
-            self.char_direction = values
-
-    def DR(self):
-        """ Relative Direction """
-        values = self.extract_value()
-        if len(values) == 0:
-            self.char_direction = 1.0, 0.0
-        elif len(values) == 2:
-            # TODO : compute as percentages
-            self.char_direction = values
-
-    def CP(self):
-        """ Character Plot """
-        values = self.extract_value()
-        # TODO
-        if len(values) == 0:
-            values = 0, 1
-        x, y = self.pos
-        if self.char_size == "absolute":
-            x += values[0] * self.char_width *1016/2.54
-            y += values[1] * self.char_height *1016/2.54
-        else:
-            x0, x1, y0, y1 = self.scale
-            dx = x1-x0
-            dy = y1-y0
-            x += values[0] * self.char_width / 100.0 * dx
-            y += values[1] * self.char_height / 100.0 * dy
-        #print "CB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y))
-        self.pos = [x, y]
-
-    def SI(self):
-        """ Set Absolute Character Size """
-        values = self.extract_value()
-        self.char_size = "absolute"
-        if len(values) == 0:
-            self.char_width = 0.1879 # cm
-            self.char_height = 0.2690 # cm
-        elif len(values) == 2:
-            self.char_width, self.char_height = values
-
-    def SR(self):
-        """ Set Relative Character Size """
-        values = self.extract_value()
-        self.char_size = "relative"
-        if len(values) == 0:
-            self.char_width = 0.75 # percentage
-            self.char_height = 1.5 # id
-        elif len(values) == 2:
-            self.char_width, self.char_height = values
-        
-    def SL(self):
-        """ Character Slant """        
-        values = self.extract_value()
-        # TODO
-
-    def UC(self):
-        """ User Defined Character """
-        values = self.extract_value()
-        # TODO
-        
-if __name__ == '__main__':
-    import sys
-    data = open(sys.argv[1]).read()
-    
-    p = HPGLParser(data)
-    
--- a/hpgl_plotter.qrc	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-<RCC>
-    <qresource prefix="/" >
-        <file>icons/led_green.svg</file>
-        <file>icons/led_green_off.svg</file>
-        <file>icons/led_red.svg</file>
-        <file>icons/led_red_off.svg</file>
-    </qresource>
-</RCC>
--- a/hpgl_plotter_rc.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1318 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Resource object code
-#
-# Created: ven. janv. 25 20:50:25 2008
-#      by: The Resource Compiler for PyQt (Qt v4.3.2)
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore
-
-qt_resource_data = "\
-\x00\x00\x14\x97\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
-\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
-\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
-\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
-\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
-\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
-\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
-\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
-\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
-\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
-\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
-\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
-\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
-\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
-\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
-\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
-\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
-\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x35\
-\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\x38\
-\x2e\x32\x35\x32\x35\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\x76\
-\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\x0a\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\x20\x73\
-\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\x65\x3d\
-\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\x6c\x65\
-\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\x2f\x69\
-\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
-\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\x5f\x72\
-\x65\x64\x5f\x6f\x66\x66\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\x75\x74\x5f\x65\
-\x78\x74\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\x67\x2e\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\x74\x2e\x73\x76\
-\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\
-\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x20\
-\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\
-\x65\x66\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\
-\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\
-\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\
-\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\x20\x20\x20\
-\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
-\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
-\x70\x34\x31\x31\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\
-\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
-\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\
-\x31\x32\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\
-\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\
-\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
-\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\
-\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
-\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
-\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\
-\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\
-\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x64\x3d\x22\x73\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\
-\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
-\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x61\x61\x30\x30\x30\x30\x3b\x73\
-\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
-\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
-\x22\x73\x74\x6f\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\
-\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\
-\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\
-\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\
-\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\
-\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x61\x64\x69\
-\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x34\x32\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x33\x32\x37\x2e\x34\
-\x31\x39\x32\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\
-\x22\x33\x34\x2e\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x66\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\x32\x35\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x66\x79\x3d\x22\x33\x34\x2e\
-\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\
-\x3d\x22\x31\x33\x30\x2e\x31\x33\x32\x34\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
-\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
-\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
-\x69\x78\x28\x32\x2e\x35\x36\x39\x35\x37\x30\x37\x65\x2d\x37\x2c\
-\x2d\x33\x2e\x32\x34\x36\x39\x38\x35\x38\x2c\x32\x2e\x32\x39\x36\
-\x32\x34\x35\x2c\x36\x2e\x38\x37\x30\x38\x39\x36\x39\x65\x2d\x36\
-\x2c\x33\x36\x36\x2e\x39\x31\x30\x34\x39\x2c\x31\x35\x30\x34\x2e\
-\x31\x38\x33\x29\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\
-\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\
-\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\
-\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
-\x34\x31\x31\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
-\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\
-\x31\x32\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\
-\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\
-\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\
-\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\
-\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\
-\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\
-\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\
-\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\
-\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\
-\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\
-\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
-\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\
-\x65\x4f\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
-\x31\x3d\x22\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\
-\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\
-\x38\x38\x2e\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x79\x32\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\
-\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
-\x28\x31\x2e\x32\x34\x35\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\
-\x2e\x32\x36\x31\x35\x38\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\
-\x36\x38\x2c\x2d\x39\x30\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\
-\x2f\x3e\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\
-\x65\x77\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\
-\x22\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
-\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\
-\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\
-\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\
-\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
-\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
-\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
-\x30\x2e\x39\x36\x31\x36\x34\x36\x31\x31\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x32\
-\x36\x2e\x33\x38\x33\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x36\x39\x2e\x37\x31\
-\x35\x34\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
-\x70\x65\x3a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\
-\x73\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\
-\x65\x72\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
-\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
-\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
-\x64\x6f\x77\x2d\x78\x3d\x22\x31\x31\x22\x0a\x20\x20\x20\x20\x20\
-\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
-\x79\x3d\x22\x31\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\
-\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\
-\x65\x74\x61\x64\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\
-\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\
-\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\
-\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\
-\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\
-\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
-\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\
-\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\
-\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\
-\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\
-\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\
-\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
-\x65\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\
-\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
-\x3a\x67\x72\x6f\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\
-\x72\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\
-\x72\x31\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\
-\x37\x35\x2e\x39\x35\x38\x34\x37\x2c\x2d\x31\x37\x31\x2e\x37\x39\
-\x38\x39\x34\x29\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\
-\x33\x39\x37\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\
-\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\
-\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x33\x31\x33\
-\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
-\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\
-\x75\x72\x6c\x28\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\
-\x65\x6e\x74\x33\x31\x34\x32\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
-\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\
-\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x77\x69\x64\x74\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\
-\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
-\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\
-\x30\x36\x36\x36\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\
-\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\
-\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\
-\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
-\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\
-\x3a\x23\x61\x32\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
-\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\
-\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x77\x69\x64\x74\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\
-\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
-\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\
-\x30\x36\x36\x36\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\
-\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\
-\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\
-\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x30\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\
-\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\
-\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\
-\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\
-\x30\x2e\x39\x33\x39\x37\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
-\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\
-\x31\x37\x36\x2e\x33\x38\x37\x34\x34\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x78\x3d\x22\x31\x38\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\
-\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x77\x69\x64\x74\x68\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\
-\x32\x31\x36\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
-\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\
-\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\
-\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\
-\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\
-\x23\x39\x35\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\
-\x69\x64\x74\x68\x3a\x39\x2e\x31\x37\x37\x30\x30\x30\x30\x35\x3b\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\
-\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\
-\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\
-\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\
-\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\
-\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\
-\x69\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\
-\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\
-\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\
-\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\
-\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\
-\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\
-\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\
-\x22\x4d\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\
-\x2e\x39\x33\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\
-\x35\x2c\x33\x35\x32\x2e\x35\x36\x32\x35\x20\x43\x20\x31\x39\x30\
-\x2e\x39\x33\x37\x35\x32\x2c\x33\x35\x32\x2e\x37\x39\x39\x38\x32\
-\x20\x31\x39\x36\x2e\x38\x33\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\
-\x33\x37\x35\x20\x32\x30\x32\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\
-\x32\x2e\x39\x33\x37\x35\x20\x43\x20\x33\x31\x32\x2e\x38\x30\x30\
-\x31\x34\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\x34\x30\x36\x2e\
-\x39\x35\x30\x34\x39\x2c\x33\x31\x31\x2e\x36\x31\x30\x34\x34\x20\
-\x34\x34\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\
-\x4c\x20\x34\x34\x35\x2e\x30\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\
-\x33\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\
-\x31\x38\x30\x2e\x39\x33\x37\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x34\
-\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\
-\x79\x70\x65\x3d\x22\x61\x72\x63\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\
-\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\
-\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\
-\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\
-\x6f\x6b\x65\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\
-\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\
-\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\
-\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\
-\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\
-\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\
-\x34\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\
-\x6f\x64\x69\x3a\x63\x78\x3d\x22\x33\x30\x33\x2e\x36\x34\x36\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\
-\x3a\x63\x79\x3d\x22\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x72\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\
-\x64\x69\x70\x6f\x64\x69\x3a\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\
-\x31\x38\x35\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\
-\x4d\x20\x33\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\
-\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\
-\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\
-\x2c\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\x20\x37\
-\x2e\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\x20\x20\
-\x33\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\
-\x34\x20\x7a\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\
-\x2f\x73\x76\x67\x3e\x0a\
-\x00\x00\x14\x96\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
-\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
-\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
-\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
-\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
-\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
-\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
-\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
-\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
-\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
-\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
-\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
-\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
-\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
-\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
-\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
-\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
-\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x34\
-\x31\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\
-\x38\x2e\x32\x35\x32\x34\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
-\x73\x76\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
-\x69\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\
-\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\
-\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\
-\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\
-\x65\x3d\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\
-\x6c\x65\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\
-\x2f\x69\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\
-\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\
-\x5f\x67\x72\x65\x65\x6e\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\x75\x74\x5f\x65\
-\x78\x74\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\x67\x2e\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\x74\x2e\x73\x76\
-\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\
-\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x20\
-\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\
-\x65\x66\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\
-\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\
-\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\
-\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\x20\x20\x20\
-\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
-\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
-\x70\x34\x31\x31\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\
-\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
-\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\
-\x31\x32\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\
-\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\
-\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
-\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\
-\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
-\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
-\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\
-\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\
-\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x64\x3d\x22\x73\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\
-\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
-\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x30\x30\x66\x66\x30\x30\x3b\x73\
-\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
-\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
-\x22\x73\x74\x6f\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\
-\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\
-\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\
-\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\
-\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\
-\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x61\x64\x69\
-\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x34\x32\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x33\x32\x37\x2e\x34\
-\x31\x39\x32\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\
-\x22\x33\x34\x2e\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x66\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\x32\x35\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x66\x79\x3d\x22\x33\x34\x2e\
-\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\
-\x3d\x22\x31\x33\x30\x2e\x31\x33\x32\x34\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
-\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
-\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
-\x69\x78\x28\x32\x2e\x35\x36\x39\x35\x37\x30\x37\x65\x2d\x37\x2c\
-\x2d\x33\x2e\x32\x34\x36\x39\x38\x35\x38\x2c\x32\x2e\x32\x39\x36\
-\x32\x34\x35\x2c\x36\x2e\x38\x37\x30\x38\x39\x36\x39\x65\x2d\x36\
-\x2c\x33\x36\x36\x2e\x39\x31\x30\x34\x39\x2c\x31\x35\x30\x34\x2e\
-\x31\x38\x33\x29\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\
-\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\
-\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\
-\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
-\x34\x31\x31\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
-\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\
-\x31\x32\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\
-\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\
-\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\
-\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\
-\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\
-\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\
-\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\
-\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\
-\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\
-\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\
-\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
-\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\
-\x65\x4f\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
-\x31\x3d\x22\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\
-\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\
-\x38\x38\x2e\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x79\x32\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\
-\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
-\x28\x31\x2e\x32\x34\x35\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\
-\x2e\x32\x36\x31\x35\x38\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\
-\x36\x38\x2c\x2d\x39\x30\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\
-\x2f\x3e\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\
-\x65\x77\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\
-\x22\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
-\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\
-\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\
-\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\
-\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
-\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
-\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
-\x30\x2e\x34\x38\x30\x38\x32\x33\x30\x36\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x37\
-\x32\x2e\x30\x34\x37\x32\x34\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x32\x30\x37\x2e\x31\
-\x32\x31\x33\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
-\x70\x65\x3a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\
-\x73\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\
-\x65\x72\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
-\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
-\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
-\x64\x6f\x77\x2d\x78\x3d\x22\x32\x35\x22\x0a\x20\x20\x20\x20\x20\
-\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
-\x79\x3d\x22\x34\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\
-\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\
-\x74\x61\x64\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\
-\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\
-\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
-\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\
-\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\
-\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\
-\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\
-\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\
-\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\
-\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\
-\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\
-\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
-\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\x31\
-\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
-\x67\x72\x6f\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\x72\
-\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\
-\x31\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\
-\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\x37\
-\x35\x2e\x39\x35\x38\x35\x32\x2c\x2d\x31\x37\x31\x2e\x37\x39\x38\
-\x39\x39\x29\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\
-\x66\x66\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
-\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
-\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\
-\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
-\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
-\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
-\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
-\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\
-\x63\x74\x32\x31\x36\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\
-\x69\x64\x74\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
-\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\
-\x39\x37\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\
-\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x37\x36\x2e\
-\x33\x38\x37\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\
-\x22\x31\x38\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\x30\
-\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x32\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\
-\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
-\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\
-\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\x63\
-\x34\x30\x62\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
-\x3a\x39\x2e\x31\x37\x36\x38\x39\x38\x39\x36\x3b\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\
-\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\
-\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\
-\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\x39\x37\x34\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\
-\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\
-\x69\x67\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x32\
-\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x33\x31\x33\x34\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\
-\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\x72\x6c\x28\
-\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x33\
-\x31\x34\x32\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
-\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
-\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\
-\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
-\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
-\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
-\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
-\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\
-\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\
-\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\x6c\
-\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\
-\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\
-\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\
-\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\
-\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\
-\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\
-\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\
-\x4d\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\
-\x39\x33\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\
-\x2c\x33\x35\x32\x2e\x35\x36\x32\x35\x20\x43\x20\x31\x39\x30\x2e\
-\x39\x33\x37\x35\x32\x2c\x33\x35\x32\x2e\x37\x39\x39\x38\x32\x20\
-\x31\x39\x36\x2e\x38\x33\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\x33\
-\x37\x35\x20\x32\x30\x32\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\x32\
-\x2e\x39\x33\x37\x35\x20\x43\x20\x33\x31\x32\x2e\x38\x30\x30\x31\
-\x34\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\x34\x30\x36\x2e\x39\
-\x35\x30\x34\x39\x2c\x33\x31\x31\x2e\x36\x31\x30\x34\x34\x20\x34\
-\x34\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\x4c\
-\x20\x34\x34\x35\x2e\x30\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\x33\
-\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\
-\x38\x30\x2e\x39\x33\x37\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x34\x22\
-\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\x79\
-\x70\x65\x3d\x22\x61\x72\x63\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\
-\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\
-\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\
-\x6b\x65\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\
-\x65\x2d\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\
-\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\
-\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\
-\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\
-\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
-\x64\x69\x3a\x63\x78\x3d\x22\x33\x30\x33\x2e\x36\x34\x36\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x63\x79\x3d\x22\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\
-\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\
-\x69\x70\x6f\x64\x69\x3a\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\x31\
-\x38\x35\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\
-\x20\x33\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\
-\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\x33\
-\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\x2c\
-\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\
-\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\
-\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\
-\x20\x7a\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0a\
-\x00\x00\x10\xa0\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
-\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
-\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
-\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
-\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
-\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
-\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
-\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
-\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
-\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
-\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
-\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
-\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
-\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
-\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
-\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
-\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
-\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x34\
-\x31\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\
-\x38\x2e\x32\x35\x32\x34\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
-\x73\x76\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
-\x69\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\
-\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\
-\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\
-\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\
-\x65\x3d\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\
-\x6c\x65\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\
-\x2f\x69\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\
-\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\
-\x5f\x67\x72\x65\x65\x6e\x5f\x6f\x66\x66\x2e\x73\x76\x67\x22\x0a\
-\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\
-\x75\x74\x5f\x65\x78\x74\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\
-\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\
-\x74\x2e\x73\x76\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\
-\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\
-\x3e\x0a\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\
-\x64\x3d\x22\x64\x65\x66\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\
-\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\
-\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\
-\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\
-\x63\x6f\x6c\x6f\x72\x3a\x23\x61\x63\x61\x63\x61\x63\x3b\x73\x74\
-\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x2e\x36\x38\x37\
-\x38\x33\x30\x36\x39\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\x31\x31\
-\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\
-\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
-\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\
-\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\
-\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\
-\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\x31\x32\x31\x22\
-\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\
-\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x6c\
-\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\
-\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\x3e\x0a\x20\x20\
-\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\
-\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\
-\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\
-\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
-\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
-\x6f\x72\x3a\x23\x30\x30\x66\x66\x30\x30\x3b\x73\x74\x6f\x70\x2d\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
-\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\
-\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\
-\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
-\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
-\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\
-\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\
-\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\
-\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\
-\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
-\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\x32\x36\x30\
-\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\
-\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\x36\x35\x39\
-\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\x3d\x22\x33\
-\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x32\x34\x35\
-\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\x2e\x32\x36\x31\x35\x38\
-\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\x36\x38\x2c\x2d\x39\x30\
-\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\x2f\x3e\x0a\x20\x20\x3c\
-\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\x73\x6f\x64\x69\x70\x6f\
-\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\x20\
-\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\x22\x0a\x20\x20\x20\x20\
-\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\x66\x66\
-\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\
-\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\x22\x0a\
-\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\x69\
-\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\
-\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\
-\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
-\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x30\x2e\x34\x38\x30\x38\
-\x32\x33\x30\x36\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
-\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x37\x32\x2e\x30\x34\x37\x32\
-\x34\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
-\x3a\x63\x79\x3d\x22\x2d\x36\x34\x2e\x37\x39\x33\x36\x39\x36\x22\
-\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x64\
-\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\x73\x3d\x22\x70\
-\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
-\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\
-\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\
-\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\
-\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\x20\x20\x20\x20\
-\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
-\x78\x3d\x22\x32\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x32\
-\x31\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\
-\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\
-\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\
-\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\x57\
-\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\
-\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\
-\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\
-\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
-\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\
-\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\
-\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\x20\
-\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x3c\
-\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\x3c\x67\x0a\
-\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6c\x61\
-\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\x31\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x67\x72\x6f\
-\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\x72\x22\x0a\x20\
-\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\
-\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\
-\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\x37\x35\x2e\x39\
-\x35\x38\x35\x32\x2c\x2d\x31\x37\x31\x2e\x37\x39\x38\x39\x39\x29\
-\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\
-\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x39\x39\x30\
-\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\
-\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\
-\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\x66\x66\x66\
-\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\
-\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\
-\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\
-\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x2c\x20\x30\
-\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\
-\x31\x36\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x39\
-\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
-\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\x39\x37\x34\
-\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x37\x36\x2e\x33\x38\x37\
-\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\
-\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
-\x32\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x32\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\
-\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\
-\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
-\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\
-\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\x38\x33\x30\x34\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x39\x2e\
-\x31\x37\x36\x38\x39\x38\x39\x36\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\
-\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\
-\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\
-\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\
-\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x75\x72\x6c\
-\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
-\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
-\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\
-\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\
-\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\
-\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
-\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\
-\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x31\x38\x35\x2e\
-\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\x35\x20\x4c\
-\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x33\x35\x32\x2e\x35\
-\x36\x32\x35\x20\x43\x20\x31\x39\x30\x2e\x39\x33\x37\x35\x32\x2c\
-\x33\x35\x32\x2e\x37\x39\x39\x38\x32\x20\x31\x39\x36\x2e\x38\x33\
-\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\x32\x30\x32\
-\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\
-\x43\x20\x33\x31\x32\x2e\x38\x30\x30\x31\x34\x2c\x33\x35\x32\x2e\
-\x39\x33\x37\x35\x20\x34\x30\x36\x2e\x39\x35\x30\x34\x39\x2c\x33\
-\x31\x31\x2e\x36\x31\x30\x34\x34\x20\x34\x34\x35\x2e\x30\x36\x32\
-\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\x4c\x20\x34\x34\x35\x2e\x30\
-\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\x35\x20\x4c\x20\x31\
-\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\
-\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
-\x22\x70\x61\x74\x68\x33\x31\x34\x34\x22\x20\x2f\x3e\x0a\x20\x20\
-\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x73\
-\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\x79\x70\x65\x3d\x22\x61\x72\
-\x63\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
-\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\
-\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
-\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
-\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\
-\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
-\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\
-\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
-\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\
-\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\
-\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\
-\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\
-\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
-\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x36\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x63\x78\x3d\
-\x22\x33\x30\x33\x2e\x36\x34\x36\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x63\x79\x3d\x22\x31\x32\
-\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x78\x3d\x22\x30\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\x31\x38\x35\x33\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x33\x30\x33\x2e\x36\
-\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\
-\x20\x37\x2e\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\
-\x20\x20\x33\x30\x33\x2e\x36\x34\x36\x2c\x31\x32\x39\x2e\x39\x38\
-\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\
-\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\
-\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x7a\x22\x20\x2f\x3e\
-\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
-\x00\x00\x14\x96\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
-\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
-\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
-\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
-\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
-\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
-\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
-\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
-\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
-\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
-\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
-\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
-\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
-\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
-\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
-\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
-\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
-\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
-\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x34\
-\x31\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\
-\x38\x2e\x32\x35\x32\x34\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
-\x73\x76\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
-\x69\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\
-\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\
-\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\
-\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\
-\x65\x3d\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\
-\x6c\x65\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\
-\x2f\x69\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\
-\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\
-\x5f\x72\x65\x64\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\x75\x74\x5f\x65\x78\x74\
-\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\x67\x2e\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\x74\x2e\x73\x76\x67\x2e\
-\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\
-\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x20\x3c\x64\
-\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\
-\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\
-\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\
-\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
-\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\
-\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
-\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\
-\x31\x31\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\
-\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
-\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\
-\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\
-\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\x31\x32\
-\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\x6e\x65\
-\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\x20\x20\
-\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\
-\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\x3e\x0a\
-\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
-\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\
-\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
-\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
-\x22\x73\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\x20\x20\
-\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\
-\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x30\x30\x30\x30\x3b\x73\x74\x6f\
-\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\
-\x74\x6f\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
-\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
-\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
-\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\
-\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\
-\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x6c\
-\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\
-\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x61\x64\x69\x61\x6c\
-\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x34\x32\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\
-\x32\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\x22\x33\
-\x34\x2e\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x66\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\x32\x35\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x66\x79\x3d\x22\x33\x34\x2e\x31\x30\
-\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x3d\x22\
-\x31\x33\x30\x2e\x31\x33\x32\x34\x22\x0a\x20\x20\x20\x20\x20\x20\
-\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\
-\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\
-\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
-\x28\x32\x2e\x35\x36\x39\x35\x37\x30\x37\x65\x2d\x37\x2c\x2d\x33\
-\x2e\x32\x34\x36\x39\x38\x35\x38\x2c\x32\x2e\x32\x39\x36\x32\x34\
-\x35\x2c\x36\x2e\x38\x37\x30\x38\x39\x36\x39\x65\x2d\x36\x2c\x33\
-\x36\x36\x2e\x39\x31\x30\x34\x39\x2c\x31\x35\x30\x34\x2e\x31\x38\
-\x33\x29\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\
-\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\
-\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\
-\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\
-\x31\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\
-\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\
-\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\x32\x36\
-\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\x0a\x20\
-\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\x36\x35\
-\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\x3d\x22\
-\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
-\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
-\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\
-\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\
-\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\
-\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\
-\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\
-\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\
-\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\
-\x22\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\
-\x2e\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\
-\x32\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\
-\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\
-\x2e\x32\x34\x35\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\x2e\x32\
-\x36\x31\x35\x38\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\x36\x38\
-\x2c\x2d\x39\x30\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\x2f\x3e\
-\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\x73\x6f\
-\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\
-\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\x22\x0a\
-\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\
-\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\
-\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\
-\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\
-\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\
-\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\x20\x20\
-\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\
-\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x30\x2e\
-\x39\x36\x31\x36\x34\x36\x31\x31\x22\x0a\x20\x20\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x32\x36\x2e\
-\x33\x38\x33\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x38\x39\x2e\x38\x36\x32\x38\
-\x36\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
-\x65\x3a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\x73\
-\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
-\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\
-\x72\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\x20\
-\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
-\x77\x69\x64\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\x20\
-\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
-\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\x20\
-\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
-\x6f\x77\x2d\x78\x3d\x22\x31\x31\x22\x0a\x20\x20\x20\x20\x20\x69\
-\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\
-\x3d\x22\x31\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\
-\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\
-\x74\x61\x64\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\
-\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\
-\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
-\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\
-\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\
-\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\
-\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\
-\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\
-\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\
-\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\
-\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\
-\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
-\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\x31\
-\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
-\x67\x72\x6f\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\x72\
-\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\
-\x31\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\
-\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\x37\
-\x35\x2e\x39\x35\x38\x35\x32\x2c\x2d\x31\x37\x31\x2e\x37\x39\x38\
-\x39\x39\x29\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x66\
-\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
-\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
-\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\
-\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
-\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
-\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
-\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
-\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
-\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\
-\x63\x74\x32\x31\x36\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\
-\x69\x64\x74\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\
-\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
-\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\
-\x39\x37\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\
-\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x37\x36\x2e\
-\x33\x38\x37\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\
-\x22\x31\x38\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\x30\
-\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x32\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\
-\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
-\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\
-\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\x30\
-\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
-\x3a\x39\x2e\x31\x37\x36\x38\x39\x38\x39\x36\x3b\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\
-\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\
-\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\
-\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\
-\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\
-\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
-\x65\x6e\x74\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
-\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\
-\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
-\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\
-\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\
-\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
-\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
-\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x31\
-\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\
-\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x33\x35\
-\x32\x2e\x35\x36\x32\x35\x20\x43\x20\x31\x39\x30\x2e\x39\x33\x37\
-\x35\x32\x2c\x33\x35\x32\x2e\x37\x39\x39\x38\x32\x20\x31\x39\x36\
-\x2e\x38\x33\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\
-\x32\x30\x32\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\x32\x2e\x39\x33\
-\x37\x35\x20\x43\x20\x33\x31\x32\x2e\x38\x30\x30\x31\x34\x2c\x33\
-\x35\x32\x2e\x39\x33\x37\x35\x20\x34\x30\x36\x2e\x39\x35\x30\x34\
-\x39\x2c\x33\x31\x31\x2e\x36\x31\x30\x34\x34\x20\x34\x34\x35\x2e\
-\x30\x36\x32\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\x4c\x20\x34\x34\
-\x35\x2e\x30\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\x35\x20\
-\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\
-\x39\x33\x37\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
-\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x34\x22\x20\x2f\x3e\
-\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\x79\x70\x65\x3d\
-\x22\x61\x72\x63\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
-\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\
-\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\
-\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\
-\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\
-\x23\x30\x30\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\
-\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
-\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\
-\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\
-\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\
-\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
-\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x36\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x63\x78\x3d\x22\x33\x30\x33\x2e\x36\x34\x36\x22\x0a\x20\x20\x20\
-\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x63\x79\x3d\
-\x22\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\x20\x20\x20\x20\
-\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x78\x3d\x22\
-\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
-\x64\x69\x3a\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\x31\x38\x35\x33\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x33\x30\
-\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\
-\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\
-\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\x2c\x31\x32\x39\
-\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\
-\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\
-\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x7a\x22\
-\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\
-\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\x39\x37\
-\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\x35\
-\x2e\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\
-\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\
-\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
-\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x33\x31\x33\x34\x22\x0a\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\
-\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\x72\x6c\
-\x28\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\
-\x33\x31\x34\x32\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
-\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\
-\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\
-\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
-\x74\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\
-\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\
-\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\
-\x68\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\
-\x36\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\
-\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\
-\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\
-\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0a\
-"
-
-qt_resource_name = "\
-\x00\x05\
-\x00\x6f\xa6\x53\
-\x00\x69\
-\x00\x63\x00\x6f\x00\x6e\x00\x73\
-\x00\x0f\
-\x01\x19\xe4\x67\
-\x00\x6c\
-\x00\x65\x00\x64\x00\x5f\x00\x72\x00\x65\x00\x64\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0d\
-\x0e\xf5\xe6\x07\
-\x00\x6c\
-\x00\x65\x00\x64\x00\x5f\x00\x67\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x11\
-\x09\x14\xa8\xe7\
-\x00\x6c\
-\x00\x65\x00\x64\x00\x5f\x00\x67\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
-\
-\x00\x0b\
-\x08\x52\x2e\x07\
-\x00\x6c\
-\x00\x65\x00\x64\x00\x5f\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-"
-
-qt_resource_struct = "\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x02\
-\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x39\xd9\
-\x00\x00\x00\x54\x00\x00\x00\x00\x00\x01\x00\x00\x29\x35\
-\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x14\x9b\
-"
-
-def qInitResources():
-    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
-    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
--- a/hpgl_qt.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-# -*- coding: utf-8 -*-
-import numpy
-import pylab
-import math
-import new # monkey patching...
-
-from PyQt4 import QtGui, QtCore
-from PyQt4.QtCore import Qt, SIGNAL
-
-from hpgl_parser import HPGLParser
-
-class QHPGLPlotterWidget(HPGLParser, QtGui.QWidget):
-    pen_styles = {2: [0.4, 0.6],
-                  3: [0.6, 0.4],
-                  4: [0.7, 0.1, 0.1, 0.1],
-                  5: [0.6, 0.1, 0.2, 0.1],
-                  6: [0.45, 0.1, 0.1, 0.2, 0.1, 0.05],
-                  }
-    pen_colors = ["black", "green", "red", "blue", "yellow", "cyan", "magenta",
-                  "darkred", "darkblue"]
-    
-    def __init__(self, parent=None):
-        QtGui.QWidget.__init__(self, parent)
-        l = QtGui.QVBoxLayout(self)
-        l.setMargin(1)
-        self.qview = QtGui.QGraphicsView(self)
-        self.qview.scale(0.5,-0.5)
-        l = self.layout()
-        l.addWidget(self.qview)
-        self.setBackgroundRole(QtGui.QPalette.Base)
-        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
-                           QtGui.QSizePolicy.Expanding)
-        self.clear()
-        HPGLParser.__init__(self)
-
-    def parse(self, data):
-        HPGLParser.parse(self, data)
-        self.resize(self.size())
-        
-    def clear(self):
-        self.qpen = QtGui.QPen(QtCore.Qt.blue)
-        self.qbrush = QtGui.QBrush(QtCore.Qt.blue)
-        self.qfont = QtGui.QFont('Courier') 
-        self.qantialiased = False
-        self.qtransformed = False
-        self.qscene = QtGui.QGraphicsScene()
-        self.qview.setScene(self.qscene)
-        
-    def _get_PW(self):
-        return self._pen_width
-    def _set_PW(self, value):
-        value = float(value)
-        #print "set pen width", value, value*300.0/75.0
-        #self.qpen.setWidthF(value*300.0/75.0)
-        self._pen_width = value
-    pen_width = property(_get_PW, _set_PW)
-        
-    def LT(self):
-        HPGLParser.LT(self)
-        if self.line_type == 0:
-            self.qpen.setStyle(Qt.SolidLine)
-        elif self.line_type == 1:
-            self.qpen.setStyle(Qt.DotLine)
-        else:
-            pattern = numpy.array(self.pen_styles[self.line_type])
-            x0, x1, y0, y1 = self.scale
-            dist = math.sqrt((x1-x0)**2 + (y1-y0)**2)
-            pattern = self.pattern_len*dist/100.0 * pattern
-            if self.qpen.widthF()>0:
-                pattern = pattern/self.qpen.widthF()
-            self.qpen.setDashPattern(pattern.tolist())
-            
-    def SP(self):
-        HPGLParser.SP(self)
-        self.qpen.setColor(QtGui.QColor(self.pen_colors[self.pen]))
-        
-    def parse(self, data):
-        HPGLParser.parse(self, data)
-        self.update()
-        self.qview.fitInView(self.qscene.sceneRect(), Qt.KeepAspectRatio)
-        
-    def minimumSizeHint(self):
-        return QtCore.QSize(100, 100)
-
-    def sizeHint(self):
-        return QtCore.QSize(400, 400)
-
-    def resizeEvent(self, event):
-        self.qview.fitInView(self.qscene.sceneRect(), Qt.KeepAspectRatio)
-        QtGui.QWidget.resizeEvent(self, event)
-
-    def plot_lines(self, points):
-        if len(points) == 1:
-            return
-        pa = QtGui.QPainterPath()
-        pa.addPolygon(QtGui.QPolygonF([QtCore.QPointF(*p) for p in points]))
-        self.qscene.addPath(pa, self.qpen)
-        
-    def plot_symbols(self, points):
-        pass
-    
-    def plot_string(self, s):
-        cw, ch = self.get_char_size()
-        # this is very ugly and so, but I don't understand haw is
-        # computed string positionning in HPGL...
-        t0 = self.qscene.addSimpleText(" ", self.qfont) 
-        br = t0.boundingRect()
-        mw = br.width()
-        mh = br.height()
-        self.qscene.removeItem(t0)
-        # don't ask me why theses constants are here, they seem OK, that's all
-        t = self.qscene.addSimpleText(s, self.qfont)
-        t.scale(1.5 * cw/mw, -2.0 * ch/mh)
-        x, y = self.pos
-        t.moveBy(x,y)
-        br = t.boundingRect()
-        t.moveBy(-0.5*cw, math.sqrt(2)*ch)
-
-        
-if __name__=='__main__':
-    import sys
-    a = QtGui.QApplication(sys.argv)
-    mw = QtGui.QMainWindow()
-    w = QtGui.QWidget(mw)
-    mw.setCentralWidget(w)
-
-    l = QtGui.QVBoxLayout(w)
-    p = QHPGLPlotterWidget(w)
-    l.addWidget(p, 1)
-    b = QtGui.QPushButton("Replot", w)
-    l.addWidget(b)
-    def plot():
-        p.parse(open(sys.argv[1]).read())
-    b.connect(b, SIGNAL('pressed()'), plot)
-    mw.show()
-    plot()
-    a.exec_()
-    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/gpib.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,64 @@
+"""
+gpib: create serial connection to GPIB-USB device (ProLogix is the
+only supported device for now).
+"""
+import serial
+from serial.serialutil import SerialException
+import time
+
+class ConnectionError(Exception):
+    pass
+
+class Constants(object):
+    def __init__(self):
+        self.constants = {}
+        self.descriptions = {}
+        self.rev_constants = {}
+        for v, k, m in self._constants:
+            self.k = v
+            self.constants[v] = k
+            self.rev_constants[k] = v
+            self.descriptions[v] = m
+            
+    def __getitem__(self, k):
+        if isinstance(k, basestring):
+            return self.rev_constants[k]
+        else:
+            return self.constants[k]
+
+    def get_description(self, k):
+        if isinstance(k, basestring):
+            k = self.rev_constants[k]
+        return self.descriptions[k]
+    
+
+class MODE(Constants):    
+    _constants = [(1, "CONTROLLER", "Set device as Controller in Charge"),
+                  (0, "DEVICE", "Set device as simple listener"),
+                  ]
+# TODO
+# class STATUS_BYTE(Constants):
+#     # IEEE 488.2 Status Byte constants
+#     MAV = 0x10 # Message AVailable: bit 4 of the Status Byte
+#     ESB = 0x20 # Event Status Bit: bit 5 of the Status Byte
+#     MSS = 0x40 # Master Summary Status bit: bit 6 of the Status Byte (NOT
+#                # sent in response to a serial poll)
+#     RQS = 0x40 # Request Service: bit 6 of the Status Byte (when sent in
+#                # response to a serial poll)
+# class SESR(Constants):
+#     # SESR constants (Standard Event Status Register)
+#     PON = 0x80 # Power On: Power has been turned On since last register
+#                # read access
+#     URQ = 0x40 # User Request: the user has activated some device control
+#                # (whatever the Remote Local state is)
+#     CME = 0x20 # Command Error
+#     EXE = 0x10 # Execution Error
+#     DDE = 0x08 # Device Dependant Error
+#     QYE = 0x04 # QuerY Error (attempt to read data while Output Queue is
+#                # empty, or data in the OQ was lost)
+#     RQC = 0x02 # Request Control: tell the CiC that the device wants to
+#                # become the CiC
+#     OPC = 0x01 # Operation Complete: device has completed any pending
+#                # operation (ready to accept new commands). This bit is
+#                # generated in response to a OPC command.
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/gpib_plotter.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,139 @@
+import sys, os
+import time
+import gpib
+
+import gpib
+from prologix import GPIB
+class GPIBplotter(GPIB):
+    _replies={
+        "OE": "0",
+        "OH": "0,0,10000,7500",
+        "OI": "7470A",
+        "OP": "0,0,10000,7500",
+        "OO": "0,1,0,0,0,0,0,0",
+        "OF": "40,40",
+        "OS": "24",
+        }
+    def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
+                 address=5):
+        super(GPIBplotter, self).__init__(device, baudrate, timeout, address, mode=0)
+
+    def plotStarted(self):
+        pass
+
+    def load_plot(self, wait_timeout=0):
+        """
+        Make a full plot process.
+
+        'wait_timeout' is the first timeout. Same semantic as the
+        'timeout' property of a serial connection (if set to None, it
+        will block until the GPIB device actually perform a plot
+        command.)
+        """
+        res = ""
+        i=0
+        replies = self._replies.copy()
+        if wait_timeout is not None and not isinstance(wait_timeout, (float, int)):
+            raise TypeError, "wait_timeout (%s:%s) has wrong type"%(repr(wait_timeout), type(wait_timeout))
+        if wait_timeout<0:
+            raise ValueError
+        
+        self._cnx.timeout = wait_timeout
+        firstloop = True
+        newdata = False
+        while i<self._retries:
+            l = self._cnx.readline().strip()
+            if firstloop:
+                self._cnx.timeout = self._timeout
+                firstloop = False
+                self.plotStarted()
+            if l == "":
+                if i == 0:# > (self._retries/2):
+                    # ie. we just received new stuffs (i is reset in the else block)
+                    for k, v in replies.items():
+                        # check wether we should reply smthg
+                        eres = res.replace('\n', '').strip()
+                        if eres.endswith(k) or eres.endswith(k+';') or eres.endswith(k+';OE'):
+                            self._cnx.write("%s"%v)
+                            if k == "OS":
+                                replies[k] = "16"
+                            break
+                    self._cnx.write('\r')
+                    #time.sleep(0.1)
+                i += 1
+            else:
+                if not res:
+                    print "Plotting..."
+                res += l + '\n'
+                i = 0
+                #time.sleep(0.1)
+        if res:
+            print "DONE (received %d characters)"%len(res)
+        return res
+
+if __name__ == '__main__':
+    import optparse
+    opt = optparse.OptionParser('A simple HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
+    opt.add_option('-f', '--filename', default=None,
+                   dest='filename',
+                   help='Output filename. If not set, write to stdout')
+    opt.add_option('-d', '--device', default='/dev/ttyUSB0',
+                   dest='device',
+                   help='Device of the RS232 connection (default: /dev/ttyUSB0)',
+                   )
+    opt.add_option('-a', '--address', default=0,
+                   dest='address',
+                   help='GPIB address of the device',
+                   )
+    opt.add_option('-l', '--loop', default=False,
+                   action="store_true",
+                   dest="loop",
+                   help="Continuously wait for new plots. If set, filename must be set and files will be created with _n at the end")
+    opt.add_option('-v', '--verbose', default=False,
+                   action="store_true",
+                   dest="verbose",
+                   help="Verbose mode",)
+    
+    options, argv = opt.parse_args(sys.argv)
+
+    if options.loop and not options.filename:
+        opt.error('If loop is set, you *must* provide a filename')
+
+    if options.filename:        
+        outf = open(options.filename, "w")
+    else:
+        outf = sys.stdout
+
+
+    try:
+        plotter = GPIBplotter(device=options.device, address=int(options.address),
+                              timeout=0.06)
+    except (gpib.SerialException, gpib.ConnectionError), e:
+        sys.stderr.write('Connection error:\n\t' + '\n\t'.join([str(x) for x in e.args]) + '\n')
+        sys.stderr.write('Check your parameters\n')
+        sys.exit(1)
+    if options.verbose:
+        sys.stderr.write('connection established\n')
+
+    loop = True
+    nloop = 0
+    while loop:
+        plot = plotter.load_plot(wait_timeout=0.1)
+        if options.verbose:
+            sys.stderr.write('.')
+        if plot:
+            outf.write(plot)
+            if options.verbose:
+                sys.stderr.write('\n')
+            sys.stderr.write('Received a new plot (written to %s)\n'%outf.name) 
+            if not options.loop:
+                loop = False
+            else:
+                nloop += 1
+                fname, ext = os.path.splitext(options.filename)
+                outf = open(fname + "_%d"%nloop + ext, 'w')
+                
+        
+    
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/gpib_plotter_mockup.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,35 @@
+import glob
+import os
+import time
+import random
+
+class GPIBplotter:#(GPIB):
+    """
+    A mockup thet will find in a directory some HPGL files and feed them randomly
+    """
+    def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
+                 address=5):
+        self._timeout = timeout
+        self.filenames = glob.glob('examples/*.plt')
+        self._next = random.randint(10,50)
+        self._num = 0
+
+    def plotStarted(self):
+        pass
+        
+    def load_plot(self, wait_timeout=0):
+        if wait_timeout:
+            time.sleep(wait_timeout)
+        self._num += 1
+        if self._num > self._next:
+            ret = open(random.choice(self.filenames)).read()
+            if len(ret)>0:
+                self.plotStarted()
+                self._num = 0
+                self._next = random.randint(10,100)
+                time.sleep(random.randint(1,3))
+                return ret
+            return None
+        return None
+    
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/hpgl_mpl.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+import numpy
+import pylab
+
+from hpgl_parser import HPGLParser
+
+class HPGLmplPlotter(HPGLParser):
+    pens = "krbgcmyw"
+    lines = ['-', ':', '--', '-.', '.', '-', '-', '-']
+    def __init__(self, data):        
+        super(HPGLmplPlotter, self).__init__(data)
+        pylab.show()
+        
+    def plot_symbols(self, points):
+        x, y = points.T
+        pylab.plot(x, y, 'o')
+
+    def plot_lines(self, points):
+        x, y = points.T
+        pylab.plot(x, y, self.pens[self.pen]+self.lines[self.line_type])
+        
+if __name__ == "__main__":
+    import sys
+    data = open(sys.argv[1]).read()
+    HPGLmplPlotter(data)
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/hpgl_parser.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,451 @@
+# -*- coding: utf-8 -*-
+
+import re
+import numpy
+
+vsplitter = re.compile('[ ,]')
+vextractor = re.compile('(?P<value>[^;\n\r\aA-DF-Za-df-z]*?)(?P<terminator>[;\n\r\a]+)', re.S+re.M) 
+
+class HPGLParser(object):
+    def __init__(self, data=None):
+        self.str_terminator = chr(0x03)
+        self.IN()
+        if data:
+            self.parse(data)
+
+    def parse(self, data):
+        self.data = data
+        self.idx = 0
+        self.IN()        
+        while self.idx<len(data):
+            while data[self.idx] in [';','\n','\r', '\a', ' ']:
+                self.idx += 1
+            if data[self.idx] == chr(0x03):
+                self.ESC()
+            else:
+                cmd = data[self.idx: self.idx+2]
+                self.idx += 2
+                getattr(self, cmd)()
+            while self.idx<len(data) and data[self.idx] in [';','\n','\r', '\a', ' ']:
+                self.idx += 1
+
+    def user_to_abs(self, pos):
+        """
+        converts a position (x, y) given in user units to absolute
+        units
+        """
+        return pos #TODO
+        
+    def extract_value(self, raw=False):
+        m = vextractor.match(self.data[self.idx:])
+        if m:
+            val = m.group("value")
+            self.idx = self.idx + len(val) + len(m.group("terminator"))
+            val = vsplitter.split(val)
+            if not raw:
+                val = [eval(x) for x in val if x.strip()]
+            return val
+        return []
+
+    def extract_string(self):
+        idx2 = self.data.find(self.str_terminator, self.idx)
+        val = self.data[self.idx: idx2]
+        self.idx = idx2+1
+        return val
+
+    def polyline(self, values):
+        if (len(values)%2) == 1:
+            # this is a syntax error in the HPGL data
+            values = values[:-1]
+        values = numpy.array(values).reshape(-1, 2)
+        # TODO use scaling            
+        # do plots 
+        values = numpy.r_[[self.pos], values] #add self.pos as 1st value
+        if self.plot_mode == 'relative':
+            values = values.cumsum(axis=0)
+        if self.symbol_mode:
+            self.plot_symbols(values[1:])
+        if self.pen_state == "down":
+            self.plot_lines(values)
+        self.pos = values[-1]
+
+    def plot_string(self, s):
+        pass
+    
+    def get_window_for_paper(self):
+        return 0,100,0,100
+    def get_scaling_points_for_paper(self):
+        return 0,100,0,100
+        
+    # effective plot methods; to be defined in subclasses (backends)
+    def plot_symbols(self, points):
+        pass
+    def plot_lines(self, points):
+        pass
+        
+    # HPGL-related methods
+    def ESC(self):
+        #print "ESC"
+        self.idx += 1
+
+    def OE(self):
+        """ Output Error """
+        pass
+        
+    def EC(self):
+        """? what's this """
+        values = self.extract_value()
+
+    def OO(self):
+        """idem"""
+        pass
+
+    def OP(self):
+        """idem"""
+        pass
+
+    def VS(self):
+        """idem"""
+        pass
+        
+        
+    def DF(self):
+        """ Default """
+        self.pen = 0
+        self.pen_width = 1 # 1/300 inch
+        self.pos = 0,0
+        self.char_set = "std"
+        self.plot_mode = 'absolute'
+        self.char_direction = 1,0
+        self.line_type = 0 # 'solid'
+        self.pattern_len = 4 #percentage
+        self.window = self.get_window_for_paper()
+        self.char_size = 0.75, 1.5 #percentages
+        self.symbol_mode = False
+        self.tick_len = 0.5, 0.5 # %
+        self.std_char_set = 0
+        self.alt_char_set = 0
+        self.selected_char_set = 0
+        self.char_slant = 0 # degrees
+        self.scale = None
+        self.str_terminator = chr(0x03)
+        self.chord_ang = 5 #degrees
+        self.fill_type = 'bidirectionnal', 1
+        self.fill_distance = 1 # %
+        self.fill_slant = 0 # degrees
+        self.pen_thickness = 0.3 # mm
+
+    def IN(self):
+        """ Initialize """
+        self.DF()
+        self.pen_state = "up"
+        self.rotation = 0 #degrees
+        self.scaling_points = self.get_scaling_points_for_paper()
+
+    def IP(self):
+        """ Input Scale Point"""
+        values = self.extract_value()
+        if len(values) == 0:
+            self.scaling_points = self.get_scaling_points_for_paper()
+        elif len(values) == 2:
+            p1x, p1y, p2x, p2y = self.scaling_points
+            dx, dy = p2x-p1x, p2y-p1y
+            x, y = values
+            self.scaling = (x, y, x+dx, y+dy)
+        elif len(values) == 4:
+            self.values = tuple(values)
+            
+    def SC(self):
+        """ Scale """
+        values = self.extract_value()
+        if len(values) == 4:
+            self.scale = tuple(values)
+        else:
+            self.scale = None
+
+    def IW(self):
+        values = self.extract_value()
+        if len(values) == 0:
+            self.window = self.get_window_for_paper()
+        elif len(value) == 4:            
+            self.window = tuple(values)
+
+    def RO(self):
+        values = self.extract_value()
+        if len(values) == 0:
+            self.rotation = 0
+        elif len(values) == 1:
+            self.rotation = values[0]
+
+    def PG(self):
+        pass
+
+    def PU(self):
+        """ Pen Up"""
+        self.pen_state = "up"        
+        values = self.extract_value()
+        self.polyline(values)
+
+    def PD(self):
+        """ Pen Down """
+        self.pen_state = "down"        
+        values = self.extract_value()
+        self.polyline(values)
+
+    def PA(self):
+        """ Plot Absolute """
+        self.plot_mode = "absolute"        
+        values = self.extract_value()
+        self.polyline(values)
+
+    def PR(self):
+        """ Plot Relative """
+        self.plot_mode = "relative"        
+        values = self.extract_value()
+        self.polyline(values)
+
+    def AA(self):
+        """ Arc Absolute """
+        values = self.extract_value()
+        if len(values) in [3, 4]:
+            x, y, qc = values[:3]
+            if len(values)==4:
+                qd = values[-1]
+            else:
+                qd = self.chord_ang
+            # TODO : plot arc
+            print "plotting an arc"
+    def AR(self):
+        """ Arc Relative """
+        values = self.extract_value()
+        # TODO
+
+    def CI(self):
+        """ Circle Plot"""
+        values = self.extract_value()
+        # TODO
+
+    def EA(self):
+        """Edge Rectangle Absolute"""
+        values = self.extract_value()
+        # TODO
+
+    def ER(self):
+        """Edge Rectangle Relative"""
+        values = self.extract_value()
+        # TODO
+
+    def EW(self):
+        """ Edge Wedge """
+        values = self.extract_value()
+        # TODO
+
+    def RA(self):
+        """ Fill Rectangle Absolute """
+        values = self.extract_value()
+        # TODO
+
+    def RR(self):
+        """ Fill Rectangle Relative """
+        values = self.extract_value()
+        # TODO
+
+    def WG(self):
+        """ Fill Wedge """
+        values = self.extract_value()
+        # TODO
+
+    def FT(self):
+        """ Fill Type """
+        values = self.extract_value()
+        # TODO
+
+    def LT(self):
+        """ Line Type """
+        values = self.extract_value()
+
+        if len(values)==0:
+            self.line_type = 0 #'solid'
+        else:
+            self.line_type = values[0]
+            if len(values)>1:
+                self.pattern_len = values[1]
+
+    def PW(self):
+        """ Pen Width """
+        values = self.extract_value()
+        if len(values) == 1:
+            self.pen_thickness = values[0]
+
+    def SM(self):
+        """ Symbol Mode """
+        values = self.extract_value()
+        if len(values) == 0:
+            self.symbol_mode = False
+        elif len(values) == 1:
+            self.symbol_mode = values[0]
+
+    def SP(self):
+        """ Select Pen """
+        values = self.extract_value()
+        if len(values) == 1:
+            self.pen = values[0]
+
+    def TL(self):
+        """ Tick Len """
+        values = self.extract_value()
+        # TODO
+
+    def XT(self):
+        """ X-axis Tick """
+        # TODO
+        print "X ticks"
+
+    def YT(self):
+        """ X-axis Tick """
+        # TODO
+        print "Y ticks"
+
+    def PT(self):
+        """ Pen Thickness Select """
+        values = self.extract_value()
+        if len(values) == 0:
+            self.pen_thickness = 0.3
+        elif len(values) == 1:
+            self.pen_thickness = values[0]
+
+    def CS(self):
+        """ Standard Character Set """
+        values = self.extract_value()
+        if len(values) == 0:
+            self.std_char_set = 0
+        elif len(values) == 1:
+            self.std_char_set = values[0]
+
+    def CA(self):
+        """ Alternate Character Set """
+        values = self.extract_value()
+        if len(values) == 0:
+            self.alt_char_set = 0
+        elif len(values) == 1:
+            self.alt_char_set = values[0]
+        
+    def SS(self):
+        """ Select Standard Character Set """
+        self.char_set = "std"
+
+    def SA(self):
+        """ Select Alternate Character Set """
+        self.char_set = "alt"
+
+    def DT(self):
+        """ Define Label Terminator """
+        values = self.extract_value(raw=True)
+        if len(values) == 0:
+            self.str_terminator = chr(0x03)
+        elif len(values) == 1:
+            self.str_terminator = values[0]
+
+    def LB(self):
+        """ Character Plot """
+        values = self.extract_string()
+        self.plot_string(values)
+        x, y = self.pos
+        values = values.split('\n')
+        if self.char_size == "absolute":
+            x += len(values[-1]) * self.char_width *1016/2.54
+            y += (len(values)-1) * self.char_height *1016/2.54
+        else:
+            x0, x1, y0, y1 = self.scale
+            dx = x1-x0
+            dy = y1-y0
+            x += len(values[-1]) * self.char_width / 100.0 * dx
+            y += (len(values)-1) * self.char_height / 100.0 * dy
+            
+        #print "LB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y))
+        self.pos = [x, y]
+
+    def get_char_size(self):
+        if self.char_size == "absolute":
+            x = self.char_width *1016/2.54
+            y = self.char_height *1016/2.54
+        else:
+            x0, x1, y0, y1 = self.scale
+            dx = x1-x0
+            dy = y1-y0
+            x = self.char_width / 100.0 * dx
+            y = self.char_height / 100.0 * dy
+        return x, y
+    
+    def DI(self):
+        """ Absolute Direction """
+        values = self.extract_value()
+        if len(values) == 0:
+            self.char_direction = 1.0, 0.0
+        elif len(values) == 2:
+            self.char_direction = values
+
+    def DR(self):
+        """ Relative Direction """
+        values = self.extract_value()
+        if len(values) == 0:
+            self.char_direction = 1.0, 0.0
+        elif len(values) == 2:
+            # TODO : compute as percentages
+            self.char_direction = values
+
+    def CP(self):
+        """ Character Plot """
+        values = self.extract_value()
+        # TODO
+        if len(values) == 0:
+            values = 0, 1
+        x, y = self.pos
+        if self.char_size == "absolute":
+            x += values[0] * self.char_width *1016/2.54
+            y += values[1] * self.char_height *1016/2.54
+        else:
+            x0, x1, y0, y1 = self.scale
+            dx = x1-x0
+            dy = y1-y0
+            x += values[0] * self.char_width / 100.0 * dx
+            y += values[1] * self.char_height / 100.0 * dy
+        #print "CB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y))
+        self.pos = [x, y]
+
+    def SI(self):
+        """ Set Absolute Character Size """
+        values = self.extract_value()
+        self.char_size = "absolute"
+        if len(values) == 0:
+            self.char_width = 0.1879 # cm
+            self.char_height = 0.2690 # cm
+        elif len(values) == 2:
+            self.char_width, self.char_height = values
+
+    def SR(self):
+        """ Set Relative Character Size """
+        values = self.extract_value()
+        self.char_size = "relative"
+        if len(values) == 0:
+            self.char_width = 0.75 # percentage
+            self.char_height = 1.5 # id
+        elif len(values) == 2:
+            self.char_width, self.char_height = values
+        
+    def SL(self):
+        """ Character Slant """        
+        values = self.extract_value()
+        # TODO
+
+    def UC(self):
+        """ User Defined Character """
+        values = self.extract_value()
+        # TODO
+        
+if __name__ == '__main__':
+    import sys
+    data = open(sys.argv[1]).read()
+    
+    p = HPGLParser(data)
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/hpgl_plotter.qrc	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,8 @@
+<RCC>
+    <qresource prefix="/" >
+        <file>icons/led_green.svg</file>
+        <file>icons/led_green_off.svg</file>
+        <file>icons/led_red.svg</file>
+        <file>icons/led_red_off.svg</file>
+    </qresource>
+</RCC>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/hpgl_plotter_rc.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,1318 @@
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created: ven. janv. 25 20:50:25 2008
+#      by: The Resource Compiler for PyQt (Qt v4.3.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = "\
+\x00\x00\x14\x97\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
+\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
+\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
+\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
+\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
+\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
+\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
+\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
+\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x35\
+\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\x38\
+\x2e\x32\x35\x32\x35\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\x76\
+\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\
+\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\x20\x73\
+\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\x65\x3d\
+\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\x6c\x65\
+\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\x2f\x69\
+\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\x5f\x72\
+\x65\x64\x5f\x6f\x66\x66\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\x75\x74\x5f\x65\
+\x78\x74\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\x67\x2e\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\x74\x2e\x73\x76\
+\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\
+\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x20\
+\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\
+\x65\x66\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\
+\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
+\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
+\x70\x34\x31\x31\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\
+\x31\x32\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\
+\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\
+\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x73\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x61\x61\x30\x30\x30\x30\x3b\x73\
+\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
+\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x6f\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\
+\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\
+\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x61\x64\x69\
+\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x34\x32\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x33\x32\x37\x2e\x34\
+\x31\x39\x32\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\
+\x22\x33\x34\x2e\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x66\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\x32\x35\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x66\x79\x3d\x22\x33\x34\x2e\
+\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\
+\x3d\x22\x31\x33\x30\x2e\x31\x33\x32\x34\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x32\x2e\x35\x36\x39\x35\x37\x30\x37\x65\x2d\x37\x2c\
+\x2d\x33\x2e\x32\x34\x36\x39\x38\x35\x38\x2c\x32\x2e\x32\x39\x36\
+\x32\x34\x35\x2c\x36\x2e\x38\x37\x30\x38\x39\x36\x39\x65\x2d\x36\
+\x2c\x33\x36\x36\x2e\x39\x31\x30\x34\x39\x2c\x31\x35\x30\x34\x2e\
+\x31\x38\x33\x29\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\
+\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\
+\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x34\x31\x31\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\
+\x31\x32\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\
+\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\
+\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\
+\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\
+\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\
+\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\
+\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\
+\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\
+\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\
+\x65\x4f\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
+\x31\x3d\x22\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\
+\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\
+\x38\x38\x2e\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x79\x32\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
+\x28\x31\x2e\x32\x34\x35\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\
+\x2e\x32\x36\x31\x35\x38\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\
+\x36\x38\x2c\x2d\x39\x30\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\
+\x2f\x3e\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\
+\x65\x77\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\
+\x22\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
+\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\
+\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\
+\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\
+\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
+\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
+\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
+\x30\x2e\x39\x36\x31\x36\x34\x36\x31\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x32\
+\x36\x2e\x33\x38\x33\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x36\x39\x2e\x37\x31\
+\x35\x34\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\
+\x73\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\
+\x65\x72\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
+\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
+\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x78\x3d\x22\x31\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x79\x3d\x22\x31\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\
+\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\
+\x65\x74\x61\x64\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\
+\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\
+\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\
+\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\
+\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
+\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\
+\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\
+\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\
+\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\
+\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\
+\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x67\x72\x6f\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\
+\x72\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\
+\x72\x31\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\
+\x37\x35\x2e\x39\x35\x38\x34\x37\x2c\x2d\x31\x37\x31\x2e\x37\x39\
+\x38\x39\x34\x29\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\
+\x33\x39\x37\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\
+\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x33\x31\x33\
+\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\
+\x75\x72\x6c\x28\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x33\x31\x34\x32\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
+\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\
+\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x77\x69\x64\x74\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\
+\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
+\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\
+\x30\x36\x36\x36\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\
+\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\
+\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\
+\x3a\x23\x61\x32\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
+\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\
+\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x77\x69\x64\x74\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\
+\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
+\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\
+\x30\x36\x36\x36\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\
+\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\
+\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\
+\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\
+\x30\x2e\x39\x33\x39\x37\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\
+\x31\x37\x36\x2e\x33\x38\x37\x34\x34\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x78\x3d\x22\x31\x38\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\
+\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x77\x69\x64\x74\x68\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\
+\x32\x31\x36\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\
+\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\
+\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\
+\x23\x39\x35\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\
+\x69\x64\x74\x68\x3a\x39\x2e\x31\x37\x37\x30\x30\x30\x30\x35\x3b\
+\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\
+\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\
+\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\
+\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\
+\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\
+\x69\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\
+\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\
+\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\
+\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\
+\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\
+\x22\x4d\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\
+\x2e\x39\x33\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\
+\x35\x2c\x33\x35\x32\x2e\x35\x36\x32\x35\x20\x43\x20\x31\x39\x30\
+\x2e\x39\x33\x37\x35\x32\x2c\x33\x35\x32\x2e\x37\x39\x39\x38\x32\
+\x20\x31\x39\x36\x2e\x38\x33\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\
+\x33\x37\x35\x20\x32\x30\x32\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\
+\x32\x2e\x39\x33\x37\x35\x20\x43\x20\x33\x31\x32\x2e\x38\x30\x30\
+\x31\x34\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\x34\x30\x36\x2e\
+\x39\x35\x30\x34\x39\x2c\x33\x31\x31\x2e\x36\x31\x30\x34\x34\x20\
+\x34\x34\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\
+\x4c\x20\x34\x34\x35\x2e\x30\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\
+\x33\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\
+\x31\x38\x30\x2e\x39\x33\x37\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x34\
+\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\
+\x79\x70\x65\x3d\x22\x61\x72\x63\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\
+\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\
+\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\
+\x6f\x6b\x65\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\
+\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\
+\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\
+\x34\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x63\x78\x3d\x22\x33\x30\x33\x2e\x36\x34\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\
+\x3a\x63\x79\x3d\x22\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x72\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x3a\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\
+\x31\x38\x35\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\
+\x4d\x20\x33\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\
+\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\
+\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\
+\x2c\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\x20\x37\
+\x2e\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\x20\x20\
+\x33\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\
+\x34\x20\x7a\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\
+\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x14\x96\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
+\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
+\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
+\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
+\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
+\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
+\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
+\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
+\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x34\
+\x31\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\
+\x38\x2e\x32\x35\x32\x34\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x73\x76\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\
+\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\
+\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\
+\x65\x3d\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\
+\x6c\x65\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\
+\x2f\x69\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\
+\x5f\x67\x72\x65\x65\x6e\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\x75\x74\x5f\x65\
+\x78\x74\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\x67\x2e\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\x74\x2e\x73\x76\
+\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\
+\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x20\
+\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\
+\x65\x66\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\
+\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
+\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
+\x70\x34\x31\x31\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\
+\x31\x32\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\
+\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\
+\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x73\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x30\x30\x66\x66\x30\x30\x3b\x73\
+\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
+\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x6f\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\
+\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\
+\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x61\x64\x69\
+\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x34\x32\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x33\x32\x37\x2e\x34\
+\x31\x39\x32\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\
+\x22\x33\x34\x2e\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x66\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\x32\x35\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x66\x79\x3d\x22\x33\x34\x2e\
+\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\
+\x3d\x22\x31\x33\x30\x2e\x31\x33\x32\x34\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x32\x2e\x35\x36\x39\x35\x37\x30\x37\x65\x2d\x37\x2c\
+\x2d\x33\x2e\x32\x34\x36\x39\x38\x35\x38\x2c\x32\x2e\x32\x39\x36\
+\x32\x34\x35\x2c\x36\x2e\x38\x37\x30\x38\x39\x36\x39\x65\x2d\x36\
+\x2c\x33\x36\x36\x2e\x39\x31\x30\x34\x39\x2c\x31\x35\x30\x34\x2e\
+\x31\x38\x33\x29\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\
+\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\
+\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x34\x31\x31\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\
+\x31\x32\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\
+\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\
+\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\
+\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\
+\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\
+\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\
+\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\
+\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\
+\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\
+\x65\x4f\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
+\x31\x3d\x22\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\
+\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\
+\x38\x38\x2e\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x79\x32\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
+\x28\x31\x2e\x32\x34\x35\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\
+\x2e\x32\x36\x31\x35\x38\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\
+\x36\x38\x2c\x2d\x39\x30\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\
+\x2f\x3e\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\
+\x65\x77\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\
+\x22\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
+\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\
+\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\
+\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\
+\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
+\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
+\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
+\x30\x2e\x34\x38\x30\x38\x32\x33\x30\x36\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x37\
+\x32\x2e\x30\x34\x37\x32\x34\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x32\x30\x37\x2e\x31\
+\x32\x31\x33\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\
+\x73\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\
+\x65\x72\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
+\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
+\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x78\x3d\x22\x32\x35\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x79\x3d\x22\x34\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\
+\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\
+\x74\x61\x64\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\
+\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\
+\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
+\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\
+\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\
+\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\
+\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\
+\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\
+\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\
+\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\
+\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\x31\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x67\x72\x6f\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\x72\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\
+\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\x37\
+\x35\x2e\x39\x35\x38\x35\x32\x2c\x2d\x31\x37\x31\x2e\x37\x39\x38\
+\x39\x39\x29\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\
+\x66\x66\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
+\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\
+\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
+\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
+\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
+\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\
+\x63\x74\x32\x31\x36\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\
+\x69\x64\x74\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\
+\x39\x37\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\
+\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x37\x36\x2e\
+\x33\x38\x37\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\
+\x22\x31\x38\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\x30\
+\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\
+\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\
+\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\x63\
+\x34\x30\x62\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3a\x39\x2e\x31\x37\x36\x38\x39\x38\x39\x36\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\
+\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\
+\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\
+\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\
+\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\x39\x37\x34\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\
+\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\
+\x69\x67\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x32\
+\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x33\x31\x33\x34\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\x72\x6c\x28\
+\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x33\
+\x31\x34\x32\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
+\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\
+\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
+\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
+\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
+\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\
+\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\x6c\
+\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\
+\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\
+\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\
+\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\
+\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\
+\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\
+\x4d\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\
+\x39\x33\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\
+\x2c\x33\x35\x32\x2e\x35\x36\x32\x35\x20\x43\x20\x31\x39\x30\x2e\
+\x39\x33\x37\x35\x32\x2c\x33\x35\x32\x2e\x37\x39\x39\x38\x32\x20\
+\x31\x39\x36\x2e\x38\x33\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\x33\
+\x37\x35\x20\x32\x30\x32\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\x32\
+\x2e\x39\x33\x37\x35\x20\x43\x20\x33\x31\x32\x2e\x38\x30\x30\x31\
+\x34\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\x34\x30\x36\x2e\x39\
+\x35\x30\x34\x39\x2c\x33\x31\x31\x2e\x36\x31\x30\x34\x34\x20\x34\
+\x34\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\x4c\
+\x20\x34\x34\x35\x2e\x30\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\x33\
+\x37\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\
+\x38\x30\x2e\x39\x33\x37\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x34\x22\
+\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\x79\
+\x70\x65\x3d\x22\x61\x72\x63\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\
+\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\
+\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\
+\x6b\x65\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\
+\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\
+\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\
+\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\
+\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x63\x78\x3d\x22\x33\x30\x33\x2e\x36\x34\x36\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x63\x79\x3d\x22\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\
+\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\
+\x69\x70\x6f\x64\x69\x3a\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\x31\
+\x38\x35\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\
+\x20\x33\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\
+\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\x33\
+\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\x2c\
+\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\
+\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\
+\x30\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\
+\x20\x7a\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0a\
+\x00\x00\x10\xa0\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
+\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
+\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
+\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
+\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
+\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
+\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
+\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
+\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x34\
+\x31\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\
+\x38\x2e\x32\x35\x32\x34\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x73\x76\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\
+\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\
+\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\
+\x65\x3d\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\
+\x6c\x65\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\
+\x2f\x69\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\
+\x5f\x67\x72\x65\x65\x6e\x5f\x6f\x66\x66\x2e\x73\x76\x67\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\
+\x75\x74\x5f\x65\x78\x74\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\
+\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\
+\x74\x2e\x73\x76\x67\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\
+\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\
+\x3e\x0a\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x64\x65\x66\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\
+\x63\x6f\x6c\x6f\x72\x3a\x23\x61\x63\x61\x63\x61\x63\x3b\x73\x74\
+\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x2e\x36\x38\x37\
+\x38\x33\x30\x36\x39\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\x31\x31\
+\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\
+\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\
+\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\
+\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\x31\x32\x31\x22\
+\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x6c\
+\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\
+\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\
+\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\
+\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
+\x6f\x72\x3a\x23\x30\x30\x66\x66\x30\x30\x3b\x73\x74\x6f\x70\x2d\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
+\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\
+\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\
+\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\
+\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\
+\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\x32\x36\x30\
+\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\
+\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\x36\x35\x39\
+\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\x3d\x22\x33\
+\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x32\x34\x35\
+\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\x2e\x32\x36\x31\x35\x38\
+\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\x36\x38\x2c\x2d\x39\x30\
+\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\x2f\x3e\x0a\x20\x20\x3c\
+\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\x22\x0a\x20\x20\x20\x20\
+\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\x66\x66\
+\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\
+\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\x22\x0a\
+\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\x69\
+\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\
+\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\
+\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x30\x2e\x34\x38\x30\x38\
+\x32\x33\x30\x36\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x37\x32\x2e\x30\x34\x37\x32\
+\x34\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x79\x3d\x22\x2d\x36\x34\x2e\x37\x39\x33\x36\x39\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x64\
+\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\x73\x3d\x22\x70\
+\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\
+\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\
+\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\
+\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x78\x3d\x22\x32\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x32\
+\x31\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\
+\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\
+\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\
+\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\x57\
+\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\
+\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\
+\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\
+\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
+\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\
+\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\x20\
+\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x3c\
+\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\x3c\x67\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6c\x61\
+\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\x31\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x67\x72\x6f\
+\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\x72\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\
+\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\
+\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\x37\x35\x2e\x39\
+\x35\x38\x35\x32\x2c\x2d\x31\x37\x31\x2e\x37\x39\x38\x39\x39\x29\
+\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x39\x39\x30\
+\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\
+\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\
+\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\x66\x66\x66\
+\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\
+\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\
+\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\
+\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x2c\x20\x30\
+\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\
+\x31\x36\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x39\
+\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
+\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\x39\x37\x34\
+\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x37\x36\x2e\x33\x38\x37\
+\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\
+\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x32\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\
+\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
+\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\
+\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\x38\x33\x30\x34\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x39\x2e\
+\x31\x37\x36\x38\x39\x38\x39\x36\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\
+\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\
+\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x75\x72\x6c\
+\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\
+\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\
+\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\
+\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
+\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\
+\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x31\x38\x35\x2e\
+\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\x35\x20\x4c\
+\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x33\x35\x32\x2e\x35\
+\x36\x32\x35\x20\x43\x20\x31\x39\x30\x2e\x39\x33\x37\x35\x32\x2c\
+\x33\x35\x32\x2e\x37\x39\x39\x38\x32\x20\x31\x39\x36\x2e\x38\x33\
+\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\x32\x30\x32\
+\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\
+\x43\x20\x33\x31\x32\x2e\x38\x30\x30\x31\x34\x2c\x33\x35\x32\x2e\
+\x39\x33\x37\x35\x20\x34\x30\x36\x2e\x39\x35\x30\x34\x39\x2c\x33\
+\x31\x31\x2e\x36\x31\x30\x34\x34\x20\x34\x34\x35\x2e\x30\x36\x32\
+\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\x4c\x20\x34\x34\x35\x2e\x30\
+\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\x35\x20\x4c\x20\x31\
+\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\
+\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x70\x61\x74\x68\x33\x31\x34\x34\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x73\
+\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\x79\x70\x65\x3d\x22\x61\x72\
+\x63\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\
+\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
+\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\
+\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
+\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\
+\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
+\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\
+\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\
+\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x36\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x63\x78\x3d\
+\x22\x33\x30\x33\x2e\x36\x34\x36\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x63\x79\x3d\x22\x31\x32\
+\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x78\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\x31\x38\x35\x33\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x33\x30\x33\x2e\x36\
+\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\
+\x20\x37\x2e\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\
+\x20\x20\x33\x30\x33\x2e\x36\x34\x36\x2c\x31\x32\x39\x2e\x39\x38\
+\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\
+\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\
+\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x7a\x22\x20\x2f\x3e\
+\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x14\x96\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\
+\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\
+\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x65\x62\x2e\x72\x65\x73\x6f\
+\x75\x72\x63\x65\x2e\x6f\x72\x67\x2f\x63\x63\x2f\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
+\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\
+\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\
+\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\
+\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\
+\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x37\x38\x2e\x32\x35\x32\x34\
+\x31\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\
+\x38\x2e\x32\x35\x32\x34\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x73\x76\x67\x32\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x33\x32\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\
+\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x34\x35\x2e\x31\x22\x0a\x20\x20\
+\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x62\x61\x73\
+\x65\x3d\x22\x2f\x68\x6f\x6d\x65\x2f\x64\x61\x76\x69\x64\x2f\x45\
+\x6c\x65\x63\x74\x72\x6f\x6e\x69\x63\x2f\x48\x50\x33\x35\x36\x32\
+\x2f\x69\x63\x6f\x6e\x73\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x6c\x65\x64\
+\x5f\x72\x65\x64\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x6f\x75\x74\x70\x75\x74\x5f\x65\x78\x74\
+\x65\x6e\x73\x69\x6f\x6e\x3d\x22\x6f\x72\x67\x2e\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x2e\x6f\x75\x74\x70\x75\x74\x2e\x73\x76\x67\x2e\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\
+\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x20\x3c\x64\
+\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\
+\x73\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\
+\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x34\x31\x31\x37\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\
+\x31\x31\x39\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\
+\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\
+\x66\x66\x66\x66\x66\x66\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x34\x31\x32\
+\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\x20\x20\
+\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x73\
+\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x6f\x70\x33\x31\x33\x38\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\
+\x6f\x6c\x6f\x72\x3a\x23\x66\x66\x30\x30\x30\x30\x3b\x73\x74\x6f\
+\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x3b\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\
+\x74\x6f\x70\x33\x31\x34\x30\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\
+\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x6c\
+\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x33\x36\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x61\x64\x69\x61\x6c\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x31\x34\x32\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\
+\x32\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\x22\x33\
+\x34\x2e\x31\x30\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x66\x78\x3d\x22\x33\x32\x37\x2e\x34\x31\x39\x32\x35\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x66\x79\x3d\x22\x33\x34\x2e\x31\x30\
+\x31\x39\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x3d\x22\
+\x31\x33\x30\x2e\x31\x33\x32\x34\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\
+\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
+\x28\x32\x2e\x35\x36\x39\x35\x37\x30\x37\x65\x2d\x37\x2c\x2d\x33\
+\x2e\x32\x34\x36\x39\x38\x35\x38\x2c\x32\x2e\x32\x39\x36\x32\x34\
+\x35\x2c\x36\x2e\x38\x37\x30\x38\x39\x36\x39\x65\x2d\x36\x2c\x33\
+\x36\x36\x2e\x39\x31\x30\x34\x39\x2c\x31\x35\x30\x34\x2e\x31\x38\
+\x33\x29\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\
+\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\
+\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\
+\x31\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\
+\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\
+\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\x32\x36\
+\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\x2e\x36\x35\
+\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\x3d\x22\
+\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
+\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
+\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\
+\x22\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x31\x37\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x34\x31\x32\x39\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\
+\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\
+\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\
+\x22\x32\x36\x30\x2e\x39\x35\x32\x34\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x79\x31\x3d\x22\x31\x32\x31\x2e\x31\x38\x38\x34\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x34\x38\x38\
+\x2e\x36\x35\x39\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\
+\x32\x3d\x22\x33\x35\x31\x2e\x34\x38\x30\x36\x35\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\
+\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\
+\x2e\x32\x34\x35\x37\x32\x32\x36\x2c\x30\x2c\x30\x2c\x31\x2e\x32\
+\x36\x31\x35\x38\x35\x34\x2c\x2d\x31\x37\x36\x2e\x37\x37\x36\x38\
+\x2c\x2d\x39\x30\x2e\x34\x39\x36\x35\x30\x38\x29\x22\x20\x2f\x3e\
+\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\
+\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x61\x73\x65\x22\x0a\
+\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\
+\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\
+\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\
+\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\
+\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x2e\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\
+\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\
+\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x30\x2e\
+\x39\x36\x31\x36\x34\x36\x31\x31\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x33\x32\x36\x2e\
+\x33\x38\x33\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x38\x39\x2e\x38\x36\x32\x38\
+\x36\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x75\x6e\x69\x74\x73\
+\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\
+\x72\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x77\x69\x64\x74\x68\x3d\x22\x39\x39\x36\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
+\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x31\x34\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x78\x3d\x22\x31\x31\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\
+\x3d\x22\x31\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\
+\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\
+\x74\x61\x64\x61\x74\x61\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\
+\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\
+\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
+\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\
+\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\
+\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\
+\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\
+\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\
+\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\
+\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\
+\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x43\x61\x6c\x71\x75\x65\x20\x31\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x67\x72\x6f\x75\x70\x6d\x6f\x64\x65\x3d\x22\x6c\x61\x79\x65\x72\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\
+\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x31\x37\
+\x35\x2e\x39\x35\x38\x35\x32\x2c\x2d\x31\x37\x31\x2e\x37\x39\x38\
+\x39\x39\x29\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x66\
+\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\
+\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\
+\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
+\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
+\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
+\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\
+\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\
+\x63\x74\x32\x31\x36\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\
+\x69\x64\x74\x68\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x78\x3d\x22\x31\x38\x35\x2e\x30\x39\x39\x32\x37\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\
+\x39\x37\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\
+\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x37\x36\x2e\
+\x33\x38\x37\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\
+\x22\x31\x38\x30\x2e\x35\x34\x36\x39\x37\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\x30\
+\x37\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x36\x39\x2e\x30\x37\x35\x35\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x32\x31\x36\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x6e\
+\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\
+\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\x30\
+\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3a\x39\x2e\x31\x37\x36\x38\x39\x38\x39\x36\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\
+\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\
+\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\
+\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\
+\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\
+\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x34\x31\x32\x39\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
+\x65\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\
+\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\
+\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\x30\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x31\
+\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\
+\x35\x20\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x33\x35\
+\x32\x2e\x35\x36\x32\x35\x20\x43\x20\x31\x39\x30\x2e\x39\x33\x37\
+\x35\x32\x2c\x33\x35\x32\x2e\x37\x39\x39\x38\x32\x20\x31\x39\x36\
+\x2e\x38\x33\x38\x35\x36\x2c\x33\x35\x32\x2e\x39\x33\x37\x35\x20\
+\x32\x30\x32\x2e\x37\x38\x31\x32\x35\x2c\x33\x35\x32\x2e\x39\x33\
+\x37\x35\x20\x43\x20\x33\x31\x32\x2e\x38\x30\x30\x31\x34\x2c\x33\
+\x35\x32\x2e\x39\x33\x37\x35\x20\x34\x30\x36\x2e\x39\x35\x30\x34\
+\x39\x2c\x33\x31\x31\x2e\x36\x31\x30\x34\x34\x20\x34\x34\x35\x2e\
+\x30\x36\x32\x35\x2c\x32\x35\x33\x2e\x32\x35\x20\x4c\x20\x34\x34\
+\x35\x2e\x30\x36\x32\x35\x2c\x31\x38\x30\x2e\x39\x33\x37\x35\x20\
+\x4c\x20\x31\x38\x35\x2e\x30\x39\x33\x37\x35\x2c\x31\x38\x30\x2e\
+\x39\x33\x37\x35\x20\x7a\x20\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x34\x22\x20\x2f\x3e\
+\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x74\x79\x70\x65\x3d\
+\x22\x61\x72\x63\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\
+\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\
+\x3a\x6e\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\
+\x23\x30\x30\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\
+\x69\x64\x74\x68\x3a\x35\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
+\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\x74\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\
+\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
+\x6f\x66\x66\x73\x65\x74\x3a\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x31\x34\x36\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x63\x78\x3d\x22\x33\x30\x33\x2e\x36\x34\x36\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x63\x79\x3d\
+\x22\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x78\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x72\x79\x3d\x22\x37\x2e\x32\x37\x39\x31\x38\x35\x33\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x33\x30\
+\x33\x2e\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\
+\x41\x20\x30\x20\x37\x2e\x32\x37\x39\x31\x38\x35\x33\x20\x30\x20\
+\x31\x20\x31\x20\x20\x33\x30\x33\x2e\x36\x34\x36\x2c\x31\x32\x39\
+\x2e\x39\x38\x35\x34\x34\x20\x41\x20\x30\x20\x37\x2e\x32\x37\x39\
+\x31\x38\x35\x33\x20\x30\x20\x31\x20\x31\x20\x20\x33\x30\x33\x2e\
+\x36\x34\x36\x20\x31\x32\x39\x2e\x39\x38\x35\x34\x34\x20\x7a\x22\
+\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x38\x30\x2e\x39\x33\x39\x37\
+\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x38\x35\
+\x2e\x30\x39\x39\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\
+\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x39\x2e\x39\x37\x30\x38\x39\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x32\x35\x39\x2e\x39\x37\x30\x38\x39\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x72\x65\x63\x74\x33\x31\x33\x34\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\x72\x6c\
+\x28\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x33\x31\x34\x32\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\
+\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\
+\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x62\x75\x74\
+\x74\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\
+\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\
+\x68\x61\x72\x72\x61\x79\x3a\x30\x2e\x32\x39\x33\x39\x30\x36\x36\
+\x36\x2c\x20\x30\x2e\x32\x39\x33\x39\x30\x36\x36\x36\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x6f\x66\x66\x73\x65\x74\x3a\
+\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0a\
+"
+
+qt_resource_name = "\
+\x00\x05\
+\x00\x6f\xa6\x53\
+\x00\x69\
+\x00\x63\x00\x6f\x00\x6e\x00\x73\
+\x00\x0f\
+\x01\x19\xe4\x67\
+\x00\x6c\
+\x00\x65\x00\x64\x00\x5f\x00\x72\x00\x65\x00\x64\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0d\
+\x0e\xf5\xe6\x07\
+\x00\x6c\
+\x00\x65\x00\x64\x00\x5f\x00\x67\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x11\
+\x09\x14\xa8\xe7\
+\x00\x6c\
+\x00\x65\x00\x64\x00\x5f\x00\x67\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x0b\
+\x08\x52\x2e\x07\
+\x00\x6c\
+\x00\x65\x00\x64\x00\x5f\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+"
+
+qt_resource_struct = "\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x02\
+\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x39\xd9\
+\x00\x00\x00\x54\x00\x00\x00\x00\x00\x01\x00\x00\x29\x35\
+\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x14\x9b\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/hpgl_qt.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+import numpy
+import pylab
+import math
+import new # monkey patching...
+
+from PyQt4 import QtGui, QtCore
+from PyQt4.QtCore import Qt, SIGNAL
+
+from hpgl_parser import HPGLParser
+
+class QHPGLPlotterWidget(HPGLParser, QtGui.QWidget):
+    pen_styles = {2: [0.4, 0.6],
+                  3: [0.6, 0.4],
+                  4: [0.7, 0.1, 0.1, 0.1],
+                  5: [0.6, 0.1, 0.2, 0.1],
+                  6: [0.45, 0.1, 0.1, 0.2, 0.1, 0.05],
+                  }
+    pen_colors = ["black", "green", "red", "blue", "yellow", "cyan", "magenta",
+                  "darkred", "darkblue"]
+    
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        l = QtGui.QVBoxLayout(self)
+        l.setMargin(1)
+        self.qview = QtGui.QGraphicsView(self)
+        self.qview.scale(0.5,-0.5)
+        l = self.layout()
+        l.addWidget(self.qview)
+        self.setBackgroundRole(QtGui.QPalette.Base)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        self.clear()
+        HPGLParser.__init__(self)
+
+    def parse(self, data):
+        HPGLParser.parse(self, data)
+        self.resize(self.size())
+        
+    def clear(self):
+        self.qpen = QtGui.QPen(QtCore.Qt.blue)
+        self.qbrush = QtGui.QBrush(QtCore.Qt.blue)
+        self.qfont = QtGui.QFont('Courier') 
+        self.qantialiased = False
+        self.qtransformed = False
+        self.qscene = QtGui.QGraphicsScene()
+        self.qview.setScene(self.qscene)
+        
+    def _get_PW(self):
+        return self._pen_width
+    def _set_PW(self, value):
+        value = float(value)
+        #print "set pen width", value, value*300.0/75.0
+        #self.qpen.setWidthF(value*300.0/75.0)
+        self._pen_width = value
+    pen_width = property(_get_PW, _set_PW)
+        
+    def LT(self):
+        HPGLParser.LT(self)
+        if self.line_type == 0:
+            self.qpen.setStyle(Qt.SolidLine)
+        elif self.line_type == 1:
+            self.qpen.setStyle(Qt.DotLine)
+        else:
+            pattern = numpy.array(self.pen_styles[self.line_type])
+            x0, x1, y0, y1 = self.scale
+            dist = math.sqrt((x1-x0)**2 + (y1-y0)**2)
+            pattern = self.pattern_len*dist/100.0 * pattern
+            if self.qpen.widthF()>0:
+                pattern = pattern/self.qpen.widthF()
+            self.qpen.setDashPattern(pattern.tolist())
+            
+    def SP(self):
+        HPGLParser.SP(self)
+        self.qpen.setColor(QtGui.QColor(self.pen_colors[self.pen]))
+        
+    def parse(self, data):
+        HPGLParser.parse(self, data)
+        self.update()
+        self.qview.fitInView(self.qscene.sceneRect(), Qt.KeepAspectRatio)
+        
+    def minimumSizeHint(self):
+        return QtCore.QSize(100, 100)
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 400)
+
+    def resizeEvent(self, event):
+        self.qview.fitInView(self.qscene.sceneRect(), Qt.KeepAspectRatio)
+        QtGui.QWidget.resizeEvent(self, event)
+
+    def plot_lines(self, points):
+        if len(points) == 1:
+            return
+        pa = QtGui.QPainterPath()
+        pa.addPolygon(QtGui.QPolygonF([QtCore.QPointF(*p) for p in points]))
+        self.qscene.addPath(pa, self.qpen)
+        
+    def plot_symbols(self, points):
+        pass
+    
+    def plot_string(self, s):
+        cw, ch = self.get_char_size()
+        # this is very ugly and so, but I don't understand haw is
+        # computed string positionning in HPGL...
+        t0 = self.qscene.addSimpleText(" ", self.qfont) 
+        br = t0.boundingRect()
+        mw = br.width()
+        mh = br.height()
+        self.qscene.removeItem(t0)
+        # don't ask me why theses constants are here, they seem OK, that's all
+        t = self.qscene.addSimpleText(s, self.qfont)
+        t.scale(1.5 * cw/mw, -2.0 * ch/mh)
+        x, y = self.pos
+        t.moveBy(x,y)
+        br = t.boundingRect()
+        t.moveBy(-0.5*cw, math.sqrt(2)*ch)
+
+        
+if __name__=='__main__':
+    import sys
+    a = QtGui.QApplication(sys.argv)
+    mw = QtGui.QMainWindow()
+    w = QtGui.QWidget(mw)
+    mw.setCentralWidget(w)
+
+    l = QtGui.QVBoxLayout(w)
+    p = QHPGLPlotterWidget(w)
+    l.addWidget(p, 1)
+    b = QtGui.QPushButton("Replot", w)
+    l.addWidget(b)
+    def plot():
+        p.parse(open(sys.argv[1]).read())
+    b.connect(b, SIGNAL('pressed()'), plot)
+    mw.show()
+    plot()
+    a.exec_()
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/qgpib_plotter.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,278 @@
+#
+
+import os, sys
+import time
+
+from PyQt4 import QtGui, QtCore, uic
+from PyQt4.QtCore import SIGNAL, Qt
+
+if "-m" in sys.argv:
+    from gpib_plotter_mockup import GPIBplotter
+else:
+    from gpib_plotter import GPIBplotter
+from hpgl_qt import QHPGLPlotterWidget
+
+form_class, base_class = uic.loadUiType(os.path.join(os.path.dirname(__file__), "qhpgl_plotter.ui"))
+
+from qpreferences import PreferenceItem, AbstractPreferences, PreferencesEditor
+
+class Preferences(AbstractPreferences):
+    ORGANISATION="Logilab"
+    APPLICATION="qgpib_plotter"
+
+    device = PreferenceItem('/dev/ttyUSB0', name=u'device', description=u'GPIB device')
+    address = PreferenceItem(5, name=u'GPIB address')
+    _pos = PreferenceItem(basetype=QtCore.QPoint)
+    _size = PreferenceItem(basetype=QtCore.QSize)
+    _appState = PreferenceItem(basetype=QtCore.QByteArray)
+
+    
+class QtHPGLPlotter(QtGui.QMainWindow, form_class):
+    def __init__(self, parent=None):
+        QtGui.QMainWindow.__init__(self, parent)
+        self._plots = {}        
+        self._prefs = Preferences()
+        self.setupUi()
+        self.initializeGPIB()
+        if self._prefs._pos:
+            self.move(self._prefs._pos)
+        if self._prefs._size:
+            self.resize(self._prefs._size)
+        if self._prefs._appState:
+            self.restoreState(self._prefs._appState)
+
+    def setupUi(self):
+        form_class.setupUi(self, self) # call qtdesigner generated form creation        
+        # actions defined in designer
+        self.connect(self.actionPreferences, SIGNAL('triggered(bool)'),
+                     self.preferencesTriggered)
+        self.connect(self.actionQuit, SIGNAL('triggered(bool)'),
+                     self.quitTriggered)
+        self.actionQuit.setShortcut(QtGui.QKeySequence(u'Ctrl+Q'))
+        self.connect(self.actionOpen, SIGNAL('triggered(bool)'),
+                     self.openTriggered)
+        self.actionOpen.setShortcut(QtGui.QKeySequence(u'Ctrl+O'))
+        self.connect(self.actionSave, SIGNAL('triggered(bool)'),
+                     self.saveTriggered)
+        self.actionSave.setShortcut(QtGui.QKeySequence(u'Ctrl+S'))
+        self.connect(self.actionSaveAs, SIGNAL('triggered(bool)'),
+                     self.saveAsTriggered)
+
+        self.plotterWidget = QHPGLPlotterWidget(self)
+        self.setCentralWidget(self.plotterWidget)
+
+        self.connect(self.captureButton, SIGNAL("toggled(bool)"),
+                     self.captureToggled)
+
+        self._plots_list = QtGui.QStringListModel()
+        self.plotsView.setModel(self._plots_list)
+        self.connect(self.plotsView, SIGNAL('activated(const QModelIndex&)'),
+                     self.currentPlotChanged)
+        self.connect(self.plotsView.selectionModel(),
+                     SIGNAL('currentChanged(const QModelIndex&, const QModelIndex&)'),
+                     self.currentPlotChanged)
+
+    def currentPlotChanged(self, index, old_index=None):
+        if index.isValid():
+            value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString())
+            
+            self.plotterWidget.clear()
+            self.plotterWidget.parse(self._plots[value])
+            
+    def preferencesTriggered(self, checked=False):
+        PreferencesEditor(self._prefs, self).exec_()
+
+    def quitTriggered(self, checked=False):
+        self.close()
+
+    def closeEvent(self, event):
+        if 1:
+        #if self.promptForSave():
+            self._prefs._pos = self.pos()
+            self._prefs._size = self.size()
+            self._prefs._appState = self.saveState()
+            event.accept()
+        else:
+            event.ignore()
+        
+    def openTriggered(self, checked=False):
+        filenames = QtGui.QFileDialog.getOpenFileNames(self, "Open a HPGL file to display", '.', 'HPGL files (*.plt)\nAll files (*)')
+        for filename in filenames:
+            filename = str(filename)
+            if os.path.exists(filename):
+                data = open(filename).read()
+                name = os.path.basename(filename)
+                name = os.path.splitext(name)[0]
+                lst = self.plotsView.model().stringList()
+                lst.append(name)            
+                self._plots[name] = data
+                self.plotsView.model().setStringList(lst)
+
+        if not self.plotsView.currentIndex().isValid():
+            self.plotsView.setCurrentIndex(self.plotsView.model().index(0, 0))
+
+    def plotReceived(self, num):
+        self._receiving = False
+        self.setReceivingLed()
+        plot, timestamp = self.captureThread.getPlot(num)
+        name = "plot_%s"%(num)
+        lst = self.plotsView.model().stringList()
+        lst.append(name)            
+        self._plots[name] = plot
+        self.plotsView.model().setStringList(lst)
+
+    def plotStarted(self):
+        self._receiving = True
+        self.setReceivingLed()
+        
+    def saveTriggered(self, checked=False):
+        print "save"
+    def saveAsTriggered(self, checked=False):
+        print "saveAs"
+        
+    def initializeGPIB(self):
+        self._online = False
+        try:
+            self.gpib_plotter = QGPIBplotter(device=self._prefs.device,
+                                            address=self._prefs.address,
+                                            )
+            self.captureThread = GPIBReceiver(self.gpib_plotter)
+            self.connect(self.captureThread, SIGNAL('plotReceived(int)'),
+                         self.plotReceived)
+            self.connect(self.captureThread, SIGNAL('plotStarted()'),
+                         self.plotStarted)
+            self.captureThread.start()
+        except Exception, e:
+            #print e
+            self.gpib_plotter = None
+        self.setCaptureLed()
+
+    def captureToggled(self, state):
+        if state:
+            if self.gpib_plotter is None:
+                self.initializeGPIB()
+                if self.gpib_plotter is None:
+                    QtGui.QMessageBox.critical(self, self.tr("GPIB error"),
+                                               self.tr("<b>Unable to initialize GPIB connection</b>.<br>Please check your GPIB dongle and settings."))
+                    self._online = False
+                    self.setCaptureLed()
+                    return
+            self._online = True
+            self.captureThread.startCapture()
+        else:
+            if self.captureThread:
+                self.captureThread.stopCapture()
+            self._online = False
+        self.setCaptureLed()
+        
+    def setCaptureLed(self):
+        if self._online:
+            icn = QtGui.QIcon(':/icons/led_green.svg')
+        else:
+            icn = QtGui.QIcon(':/icons/led_green_off.svg')
+        self.captureButton.setIcon(icn)
+        self.captureButton.setChecked(self._online)
+
+    def setReceivingLed(self):
+        if self._receiving:
+            icn = QtGui.QIcon(':/icons/led_red.svg')
+        else:
+            icn = QtGui.QIcon(':/icons/led_red_off.svg')
+        self.receivingButton.setIcon(icn)
+
+class QGPIBplotter(GPIBplotter):
+    def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
+                 address=5):
+        GPIBplotter.__init__(self, device, baudrate, timeout, address)        
+        self.emitter = None
+
+    def plotStarted(self):
+        if self.emitter:
+            self.emitter.emit(SIGNAL('plotStarted()'))
+            #self.emitter.msleep(1)
+        
+class GPIBReceiver(QtCore.QThread):
+    def __init__(self, cnx):
+        QtCore.QThread.__init__(self)
+        self.gpibplotter = cnx
+        self.gpibplotter.emitter = self
+        
+        self._cancelmutex = QtCore.QMutex()
+        self._cancel = False
+        #self._nreceived = 0
+        self._plotsmutex = QtCore.QMutex()
+        self._plots = []
+        self._startstopmutex = QtCore.QMutex()
+        self._startstop = QtCore.QWaitCondition()
+        self._capturing = False
+        
+    def cancel(self):
+        self._cancelmutex.lock()
+        self._cancel = True
+        self._cancelmutex.unlock()
+
+    def startCapture(self):
+        self._startstop.wakeOne()
+
+    def stopCapture(self):
+        self._startstopmutex.lock()
+        self._capturing = False
+        self._startstopmutex.unlock()
+
+    def run(self):
+        while 1:
+            self._cancelmutex.lock()
+            if self._cancel:
+                return
+            self._cancelmutex.unlock()
+            self._startstopmutex.lock()
+            if not self._capturing:
+                self._startstop.wait(self._startstopmutex)
+                self._capturing = True
+            self._startstopmutex.unlock()
+        
+            plot = self.gpibplotter.load_plot(wait_timeout=0.1)
+            timestamp = time.time()
+            if plot:
+                self._plotsmutex.lock()
+                self._plots.append((plot, timestamp))
+                n = len(self._plots)
+                self._plotsmutex.unlock()
+                self.emit(SIGNAL('plotReceived(int)'), n-1)
+            self.msleep(10)
+            
+    def getPlot(self, num):
+        self._plotsmutex.lock()
+        try:
+            return self._plots[num]
+        finally:
+            self._plotsmutex.unlock()
+            
+        
+            
+
+def main():
+    import optparse
+    opt = optparse.OptionParser('A simple PyQt4 HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
+    opt.add_option('-m', '--mockup', default=False,
+                   action="store_true",
+                   dest='mockup',
+                   help='Use a pseudo GPIB connection (for test purpose)',
+                   )
+    opt.add_option('-v', '--verbose', default=False,
+                   action="store_true",
+                   dest="verbose",
+                   help="Verbose mode",)
+    
+    options, argv = opt.parse_args(sys.argv)
+
+    if options.verbose:
+        sys.stderr.write('connection established\n')
+
+    a = QtGui.QApplication(argv)
+    w = QtHPGLPlotter()
+    w.show()
+    a.exec_()
+        
+if __name__ == '__main__':
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/qhpgl_plotter.ui	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,166 @@
+<ui version="4.0" >
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>507</width>
+    <height>492</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget" />
+  <widget class="QMenuBar" name="menubar" >
+   <property name="geometry" >
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>507</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menu_File" >
+    <property name="title" >
+     <string>&amp;File</string>
+    </property>
+    <addaction name="actionOpen" />
+    <addaction name="actionSave" />
+    <addaction name="actionSaveAs" />
+    <addaction name="separator" />
+    <addaction name="actionQuit" />
+   </widget>
+   <widget class="QMenu" name="menuEdit" >
+    <property name="title" >
+     <string>Edit</string>
+    </property>
+    <addaction name="actionPreferences" />
+   </widget>
+   <addaction name="menu_File" />
+   <addaction name="menuEdit" />
+  </widget>
+  <widget class="QStatusBar" name="statusbar" />
+  <widget class="QDockWidget" name="plotsDock" >
+   <attribute name="dockWidgetArea" >
+    <number>1</number>
+   </attribute>
+   <widget class="QWidget" name="dockWidgetContents" >
+    <layout class="QVBoxLayout" >
+     <property name="spacing" >
+      <number>4</number>
+     </property>
+     <property name="leftMargin" >
+      <number>1</number>
+     </property>
+     <property name="topMargin" >
+      <number>4</number>
+     </property>
+     <property name="rightMargin" >
+      <number>1</number>
+     </property>
+     <property name="bottomMargin" >
+      <number>1</number>
+     </property>
+     <item>
+      <layout class="QHBoxLayout" >
+       <item>
+        <widget class="QToolButton" name="captureButton" >
+         <property name="minimumSize" >
+          <size>
+           <width>0</width>
+           <height>29</height>
+          </size>
+         </property>
+         <property name="text" >
+          <string>on line</string>
+         </property>
+         <property name="icon" >
+          <iconset resource="hpgl_plotter.qrc" >:/icons/led_green.svg</iconset>
+         </property>
+         <property name="iconSize" >
+          <size>
+           <width>16</width>
+           <height>16</height>
+          </size>
+         </property>
+         <property name="checkable" >
+          <bool>true</bool>
+         </property>
+         <property name="toolButtonStyle" >
+          <enum>Qt::ToolButtonTextBesideIcon</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer>
+         <property name="orientation" >
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" >
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="receivingButton" >
+         <property name="text" >
+          <string/>
+         </property>
+         <property name="icon" >
+          <iconset resource="hpgl_plotter.qrc" >:/icons/led_red_off.svg</iconset>
+         </property>
+         <property name="iconSize" >
+          <size>
+           <width>16</width>
+           <height>16</height>
+          </size>
+         </property>
+         <property name="flat" >
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QListView" name="plotsView" />
+     </item>
+    </layout>
+   </widget>
+  </widget>
+  <action name="actionOpen" >
+   <property name="text" >
+    <string>&amp;Open</string>
+   </property>
+  </action>
+  <action name="actionSave" >
+   <property name="text" >
+    <string>&amp;Save</string>
+   </property>
+  </action>
+  <action name="actionSaveAs" >
+   <property name="text" >
+    <string>Save as...</string>
+   </property>
+  </action>
+  <action name="actionQuit" >
+   <property name="text" >
+    <string>&amp;Quit</string>
+   </property>
+  </action>
+  <action name="actionPreferences" >
+   <property name="text" >
+    <string>Preferences</string>
+   </property>
+  </action>
+ </widget>
+ <resources>
+  <include location="hpgl_plotter.qrc" />
+ </resources>
+ <connections/>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/qpreferences.py	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,141 @@
+import os
+from PyQt4 import QtCore, QtGui, uic
+
+def fromVariant(v):
+    _cvrts = {0: lambda x:None,
+              1: lambda x:x.toBool(),
+              2: lambda x:x.toInt()[0],
+              6: lambda x:x.toDouble()[0],
+              10: lambda x:unicode(x.toString()),
+              12: lambda x:x.toByteArray(),
+              21: lambda x:x.toSize(),
+              22: lambda x:x.toSizeF(),
+              25: lambda x:x.toPoint(),
+              26: lambda x:x.toPointF(),
+              
+              }
+    t = v.userType()
+    return _cvrts[t](v)
+    
+class PreferenceItem(object):
+    _id = 0
+    def __init__(self, default=None, basetype=None, name=None, description=None):
+        self._default = default
+        self._basetype = basetype
+        if self._basetype is None:
+            self._basetype = self._default.__class__
+        self._id = "_pref%X"%self.__class__._id
+        self._name = name
+        self._description = description
+        self.__class__._id += 1
+
+    def __get__(self, obj, cls):
+        if obj is None:
+            return self
+        try:
+            return obj.getPref(self._id)
+        except Exception, e:
+            #print "humm", e
+            return None
+
+    def __set__(self, obj, value):
+        obj.setPref(self._id, value)
+        
+class AbstractPreferences(QtCore.QObject):
+    def __init__(self):
+        QtCore.QObject.__init__(self)
+        self._settings = QtCore.QSettings(QtCore.QSettings.UserScope,
+                                          self.ORGANISATION, self.APPLICATION)
+        self._prefs = {}
+        for k in dir(self.__class__):
+            item = getattr(self.__class__, k)
+            if isinstance(item, PreferenceItem):
+                self._prefs[item._id] = k            
+        
+    def getPref(self, key):
+        key = self._prefs.get(key, key)
+        default = getattr(self.__class__, key)._default
+        if default is not None:
+            default = QtCore.QVariant(default)
+        else:
+            default = QtCore.QVariant()
+        val = self._settings.value(key, default)
+        return fromVariant(val)
+    
+    def setPref(self, key, value):
+        key = self._prefs.get(key, key)
+        self._settings.setValue(key, QtCore.QVariant(value))
+
+    def keys(self):
+        return [k for k in self._prefs.values() if not k.startswith('_')]
+
+    def getName(self, key):
+        item = getattr(self.__class__, key)
+        return item._name
+
+    def getDescription(self, key):
+        item = getattr(self.__class__, key)
+        return item._description
+    
+form_class, base_class = uic.loadUiType(os.path.join(os.path.dirname(__file__), "qpreferences_dialog.ui"))
+
+class PreferencesEditor(QtGui.QDialog, form_class):
+    def __init__(self, preferences, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        self.setupUi(self)
+        self._prefs = preferences
+        self.buildUI()
+
+    def buildUI(self):
+        w = self.centralFrame
+        g = QtGui.QGridLayout(w)
+        p = self._prefs
+        eds = {}
+        self._editors = eds
+        for i, k in enumerate(p.keys()):
+            name = p.getName(k)
+            if not name:
+                name = k
+            l = QtGui.QLabel(name, w)
+            g.addWidget(l, i, 0)
+            if p.getDescription(k):
+                l.setToolTip(p.getDescription(k))
+            
+            e = QtGui.QLineEdit(w)
+            eds[k] = e
+            g.addWidget(e, i, 1)
+            val = p.getPref(k)
+            if val is None:
+                val = ''
+            if not isinstance(val, basestring):
+                val = unicode(val)
+            e.setText(val)
+            
+        g.addWidget(QtGui.QWidget(w), i+1, 0)
+        g.setRowStretch(i+1,1)
+        g.setColumnStretch(1,1)
+
+    def accept(self):
+        p=self._prefs
+        for k in p.keys():
+            newval = unicode(self._editors[k].text())
+            p.setPref(k, newval)            
+        return QtGui.QDialog.accept(self)
+            
+if __name__ == '__main__':
+    class TestPreferences(AbstractPreferences):
+        ORGANISATION="Logilab"
+        APPLICATION="test_qpref_editor"
+
+        device = PreferenceItem('/dev/ttyUSB0', name="the device")
+        address = PreferenceItem(5, description="GPIB address of the plotter")
+        _pos = PreferenceItem(None)
+        _size = PreferenceItem(None)
+        _appState = PreferenceItem(None)
+        
+    a = QtGui.QApplication([])
+
+    prefs = TestPreferences()
+    w = PreferencesEditor(prefs)
+    w.show()
+    a.exec_()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plotter/qpreferences_dialog.ui	Fri Jan 25 21:00:34 2008 +0100
@@ -0,0 +1,73 @@
+<ui version="4.0" >
+ <class>PreferencesDialog</class>
+ <widget class="QDialog" name="PreferencesDialog" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" >
+   <item>
+    <widget class="QFrame" name="centralFrame" >
+     <property name="frameShape" >
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow" >
+      <enum>QFrame::Raised</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox" >
+     <property name="orientation" >
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons" >
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PreferencesDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>PreferencesDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- a/qgpib_plotter.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-#
-
-import os, sys
-import time
-
-from PyQt4 import QtGui, QtCore, uic
-from PyQt4.QtCore import SIGNAL, Qt
-
-if "-m" in sys.argv:
-    from gpib_plotter_mockup import GPIBplotter
-else:
-    from gpib_plotter import GPIBplotter
-from hpgl_qt import QHPGLPlotterWidget
-
-form_class, base_class = uic.loadUiType(os.path.join(os.path.dirname(__file__), "qhpgl_plotter.ui"))
-
-from qpreferences import PreferenceItem, AbstractPreferences, PreferencesEditor
-
-class Preferences(AbstractPreferences):
-    ORGANISATION="Logilab"
-    APPLICATION="qgpib_plotter"
-
-    device = PreferenceItem('/dev/ttyUSB0', name=u'device', description=u'GPIB device')
-    address = PreferenceItem(5, name=u'GPIB address')
-    _pos = PreferenceItem(basetype=QtCore.QPoint)
-    _size = PreferenceItem(basetype=QtCore.QSize)
-    _appState = PreferenceItem(basetype=QtCore.QByteArray)
-
-    
-class QtHPGLPlotter(QtGui.QMainWindow, form_class):
-    def __init__(self, parent=None):
-        QtGui.QMainWindow.__init__(self, parent)
-        self._plots = {}        
-        self._prefs = Preferences()
-        self.setupUi()
-        self.initializeGPIB()
-        if self._prefs._pos:
-            self.move(self._prefs._pos)
-        if self._prefs._size:
-            self.resize(self._prefs._size)
-        if self._prefs._appState:
-            self.restoreState(self._prefs._appState)
-
-    def setupUi(self):
-        form_class.setupUi(self, self) # call qtdesigner generated form creation        
-        # actions defined in designer
-        self.connect(self.actionPreferences, SIGNAL('triggered(bool)'),
-                     self.preferencesTriggered)
-        self.connect(self.actionQuit, SIGNAL('triggered(bool)'),
-                     self.quitTriggered)
-        self.actionQuit.setShortcut(QtGui.QKeySequence(u'Ctrl+Q'))
-        self.connect(self.actionOpen, SIGNAL('triggered(bool)'),
-                     self.openTriggered)
-        self.actionOpen.setShortcut(QtGui.QKeySequence(u'Ctrl+O'))
-        self.connect(self.actionSave, SIGNAL('triggered(bool)'),
-                     self.saveTriggered)
-        self.actionSave.setShortcut(QtGui.QKeySequence(u'Ctrl+S'))
-        self.connect(self.actionSaveAs, SIGNAL('triggered(bool)'),
-                     self.saveAsTriggered)
-
-        self.plotterWidget = QHPGLPlotterWidget(self)
-        self.setCentralWidget(self.plotterWidget)
-
-        self.connect(self.captureButton, SIGNAL("toggled(bool)"),
-                     self.captureToggled)
-
-        self._plots_list = QtGui.QStringListModel()
-        self.plotsView.setModel(self._plots_list)
-        self.connect(self.plotsView, SIGNAL('activated(const QModelIndex&)'),
-                     self.currentPlotChanged)
-        self.connect(self.plotsView.selectionModel(),
-                     SIGNAL('currentChanged(const QModelIndex&, const QModelIndex&)'),
-                     self.currentPlotChanged)
-
-    def currentPlotChanged(self, index, old_index=None):
-        if index.isValid():
-            value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString())
-            
-            self.plotterWidget.clear()
-            self.plotterWidget.parse(self._plots[value])
-            
-    def preferencesTriggered(self, checked=False):
-        PreferencesEditor(self._prefs, self).exec_()
-
-    def quitTriggered(self, checked=False):
-        self.close()
-
-    def closeEvent(self, event):
-        if 1:
-        #if self.promptForSave():
-            self._prefs._pos = self.pos()
-            self._prefs._size = self.size()
-            self._prefs._appState = self.saveState()
-            event.accept()
-        else:
-            event.ignore()
-        
-    def openTriggered(self, checked=False):
-        filenames = QtGui.QFileDialog.getOpenFileNames(self, "Open a HPGL file to display", '.', 'HPGL files (*.plt)\nAll files (*)')
-        for filename in filenames:
-            filename = str(filename)
-            if os.path.exists(filename):
-                data = open(filename).read()
-                name = os.path.basename(filename)
-                name = os.path.splitext(name)[0]
-                lst = self.plotsView.model().stringList()
-                lst.append(name)            
-                self._plots[name] = data
-                self.plotsView.model().setStringList(lst)
-
-        if not self.plotsView.currentIndex().isValid():
-            self.plotsView.setCurrentIndex(self.plotsView.model().index(0, 0))
-
-    def plotReceived(self, num):
-        self._receiving = False
-        self.setReceivingLed()
-        plot, timestamp = self.captureThread.getPlot(num)
-        name = "plot_%s"%(num)
-        lst = self.plotsView.model().stringList()
-        lst.append(name)            
-        self._plots[name] = plot
-        self.plotsView.model().setStringList(lst)
-
-    def plotStarted(self):
-        self._receiving = True
-        self.setReceivingLed()
-        
-    def saveTriggered(self, checked=False):
-        print "save"
-    def saveAsTriggered(self, checked=False):
-        print "saveAs"
-        
-    def initializeGPIB(self):
-        self._online = False
-        try:
-            self.gpib_plotter = QGPIBplotter(device=self._prefs.device,
-                                            address=self._prefs.address,
-                                            )
-            self.captureThread = GPIBReceiver(self.gpib_plotter)
-            self.connect(self.captureThread, SIGNAL('plotReceived(int)'),
-                         self.plotReceived)
-            self.connect(self.captureThread, SIGNAL('plotStarted()'),
-                         self.plotStarted)
-            self.captureThread.start()
-        except Exception, e:
-            #print e
-            self.gpib_plotter = None
-        self.setCaptureLed()
-
-    def captureToggled(self, state):
-        if state:
-            if self.gpib_plotter is None:
-                self.initializeGPIB()
-                if self.gpib_plotter is None:
-                    QtGui.QMessageBox.critical(self, self.tr("GPIB error"),
-                                               self.tr("<b>Unable to initialize GPIB connection</b>.<br>Please check your GPIB dongle and settings."))
-                    self._online = False
-                    self.setCaptureLed()
-                    return
-            self._online = True
-            self.captureThread.startCapture()
-        else:
-            if self.captureThread:
-                self.captureThread.stopCapture()
-            self._online = False
-        self.setCaptureLed()
-        
-    def setCaptureLed(self):
-        if self._online:
-            icn = QtGui.QIcon(':/icons/led_green.svg')
-        else:
-            icn = QtGui.QIcon(':/icons/led_green_off.svg')
-        self.captureButton.setIcon(icn)
-        self.captureButton.setChecked(self._online)
-
-    def setReceivingLed(self):
-        if self._receiving:
-            icn = QtGui.QIcon(':/icons/led_red.svg')
-        else:
-            icn = QtGui.QIcon(':/icons/led_red_off.svg')
-        self.receivingButton.setIcon(icn)
-
-class QGPIBplotter(GPIBplotter):
-    def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
-                 address=5):
-        GPIBplotter.__init__(self, device, baudrate, timeout, address)        
-        self.emitter = None
-
-    def plotStarted(self):
-        if self.emitter:
-            self.emitter.emit(SIGNAL('plotStarted()'))
-            #self.emitter.msleep(1)
-        
-class GPIBReceiver(QtCore.QThread):
-    def __init__(self, cnx):
-        QtCore.QThread.__init__(self)
-        self.gpibplotter = cnx
-        self.gpibplotter.emitter = self
-        
-        self._cancelmutex = QtCore.QMutex()
-        self._cancel = False
-        #self._nreceived = 0
-        self._plotsmutex = QtCore.QMutex()
-        self._plots = []
-        self._startstopmutex = QtCore.QMutex()
-        self._startstop = QtCore.QWaitCondition()
-        self._capturing = False
-        
-    def cancel(self):
-        self._cancelmutex.lock()
-        self._cancel = True
-        self._cancelmutex.unlock()
-
-    def startCapture(self):
-        self._startstop.wakeOne()
-
-    def stopCapture(self):
-        self._startstopmutex.lock()
-        self._capturing = False
-        self._startstopmutex.unlock()
-
-    def run(self):
-        while 1:
-            self._cancelmutex.lock()
-            if self._cancel:
-                return
-            self._cancelmutex.unlock()
-            self._startstopmutex.lock()
-            if not self._capturing:
-                self._startstop.wait(self._startstopmutex)
-                self._capturing = True
-            self._startstopmutex.unlock()
-        
-            plot = self.gpibplotter.load_plot(wait_timeout=0.1)
-            timestamp = time.time()
-            if plot:
-                self._plotsmutex.lock()
-                self._plots.append((plot, timestamp))
-                n = len(self._plots)
-                self._plotsmutex.unlock()
-                self.emit(SIGNAL('plotReceived(int)'), n-1)
-            self.msleep(10)
-            
-    def getPlot(self, num):
-        self._plotsmutex.lock()
-        try:
-            return self._plots[num]
-        finally:
-            self._plotsmutex.unlock()
-            
-        
-            
-
-def main():
-    import optparse
-    opt = optparse.OptionParser('A simple PyQt4 HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
-    opt.add_option('-m', '--mockup', default=False,
-                   action="store_true",
-                   dest='mockup',
-                   help='Use a pseudo GPIB connection (for test purpose)',
-                   )
-    opt.add_option('-v', '--verbose', default=False,
-                   action="store_true",
-                   dest="verbose",
-                   help="Verbose mode",)
-    
-    options, argv = opt.parse_args(sys.argv)
-
-    if options.verbose:
-        sys.stderr.write('connection established\n')
-
-    a = QtGui.QApplication(argv)
-    w = QtHPGLPlotter()
-    w.show()
-    a.exec_()
-        
-if __name__ == '__main__':
-    main()
--- a/qhpgl_plotter.ui	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-<ui version="4.0" >
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>507</width>
-    <height>492</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>MainWindow</string>
-  </property>
-  <widget class="QWidget" name="centralwidget" />
-  <widget class="QMenuBar" name="menubar" >
-   <property name="geometry" >
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>507</width>
-     <height>25</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menu_File" >
-    <property name="title" >
-     <string>&amp;File</string>
-    </property>
-    <addaction name="actionOpen" />
-    <addaction name="actionSave" />
-    <addaction name="actionSaveAs" />
-    <addaction name="separator" />
-    <addaction name="actionQuit" />
-   </widget>
-   <widget class="QMenu" name="menuEdit" >
-    <property name="title" >
-     <string>Edit</string>
-    </property>
-    <addaction name="actionPreferences" />
-   </widget>
-   <addaction name="menu_File" />
-   <addaction name="menuEdit" />
-  </widget>
-  <widget class="QStatusBar" name="statusbar" />
-  <widget class="QDockWidget" name="plotsDock" >
-   <attribute name="dockWidgetArea" >
-    <number>1</number>
-   </attribute>
-   <widget class="QWidget" name="dockWidgetContents" >
-    <layout class="QVBoxLayout" >
-     <property name="spacing" >
-      <number>4</number>
-     </property>
-     <property name="leftMargin" >
-      <number>1</number>
-     </property>
-     <property name="topMargin" >
-      <number>4</number>
-     </property>
-     <property name="rightMargin" >
-      <number>1</number>
-     </property>
-     <property name="bottomMargin" >
-      <number>1</number>
-     </property>
-     <item>
-      <layout class="QHBoxLayout" >
-       <item>
-        <widget class="QToolButton" name="captureButton" >
-         <property name="minimumSize" >
-          <size>
-           <width>0</width>
-           <height>29</height>
-          </size>
-         </property>
-         <property name="text" >
-          <string>on line</string>
-         </property>
-         <property name="icon" >
-          <iconset resource="hpgl_plotter.qrc" >:/icons/led_green.svg</iconset>
-         </property>
-         <property name="iconSize" >
-          <size>
-           <width>16</width>
-           <height>16</height>
-          </size>
-         </property>
-         <property name="checkable" >
-          <bool>true</bool>
-         </property>
-         <property name="toolButtonStyle" >
-          <enum>Qt::ToolButtonTextBesideIcon</enum>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer>
-         <property name="orientation" >
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeHint" >
-          <size>
-           <width>40</width>
-           <height>20</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item>
-        <widget class="QPushButton" name="receivingButton" >
-         <property name="text" >
-          <string/>
-         </property>
-         <property name="icon" >
-          <iconset resource="hpgl_plotter.qrc" >:/icons/led_red_off.svg</iconset>
-         </property>
-         <property name="iconSize" >
-          <size>
-           <width>16</width>
-           <height>16</height>
-          </size>
-         </property>
-         <property name="flat" >
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </item>
-     <item>
-      <widget class="QListView" name="plotsView" />
-     </item>
-    </layout>
-   </widget>
-  </widget>
-  <action name="actionOpen" >
-   <property name="text" >
-    <string>&amp;Open</string>
-   </property>
-  </action>
-  <action name="actionSave" >
-   <property name="text" >
-    <string>&amp;Save</string>
-   </property>
-  </action>
-  <action name="actionSaveAs" >
-   <property name="text" >
-    <string>Save as...</string>
-   </property>
-  </action>
-  <action name="actionQuit" >
-   <property name="text" >
-    <string>&amp;Quit</string>
-   </property>
-  </action>
-  <action name="actionPreferences" >
-   <property name="text" >
-    <string>Preferences</string>
-   </property>
-  </action>
- </widget>
- <resources>
-  <include location="hpgl_plotter.qrc" />
- </resources>
- <connections/>
-</ui>
--- a/qpreferences.py	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-import os
-from PyQt4 import QtCore, QtGui, uic
-
-def fromVariant(v):
-    _cvrts = {0: lambda x:None,
-              1: lambda x:x.toBool(),
-              2: lambda x:x.toInt()[0],
-              6: lambda x:x.toDouble()[0],
-              10: lambda x:unicode(x.toString()),
-              12: lambda x:x.toByteArray(),
-              21: lambda x:x.toSize(),
-              22: lambda x:x.toSizeF(),
-              25: lambda x:x.toPoint(),
-              26: lambda x:x.toPointF(),
-              
-              }
-    t = v.userType()
-    return _cvrts[t](v)
-    
-class PreferenceItem(object):
-    _id = 0
-    def __init__(self, default=None, basetype=None, name=None, description=None):
-        self._default = default
-        self._basetype = basetype
-        if self._basetype is None:
-            self._basetype = self._default.__class__
-        self._id = "_pref%X"%self.__class__._id
-        self._name = name
-        self._description = description
-        self.__class__._id += 1
-
-    def __get__(self, obj, cls):
-        if obj is None:
-            return self
-        try:
-            return obj.getPref(self._id)
-        except Exception, e:
-            #print "humm", e
-            return None
-
-    def __set__(self, obj, value):
-        obj.setPref(self._id, value)
-        
-class AbstractPreferences(QtCore.QObject):
-    def __init__(self):
-        QtCore.QObject.__init__(self)
-        self._settings = QtCore.QSettings(QtCore.QSettings.UserScope,
-                                          self.ORGANISATION, self.APPLICATION)
-        self._prefs = {}
-        for k in dir(self.__class__):
-            item = getattr(self.__class__, k)
-            if isinstance(item, PreferenceItem):
-                self._prefs[item._id] = k            
-        
-    def getPref(self, key):
-        key = self._prefs.get(key, key)
-        default = getattr(self.__class__, key)._default
-        if default is not None:
-            default = QtCore.QVariant(default)
-        else:
-            default = QtCore.QVariant()
-        val = self._settings.value(key, default)
-        return fromVariant(val)
-    
-    def setPref(self, key, value):
-        key = self._prefs.get(key, key)
-        self._settings.setValue(key, QtCore.QVariant(value))
-
-    def keys(self):
-        return [k for k in self._prefs.values() if not k.startswith('_')]
-
-    def getName(self, key):
-        item = getattr(self.__class__, key)
-        return item._name
-
-    def getDescription(self, key):
-        item = getattr(self.__class__, key)
-        return item._description
-    
-form_class, base_class = uic.loadUiType(os.path.join(os.path.dirname(__file__), "qpreferences_dialog.ui"))
-
-class PreferencesEditor(QtGui.QDialog, form_class):
-    def __init__(self, preferences, parent=None):
-        QtGui.QDialog.__init__(self, parent)
-        self.setupUi(self)
-        self._prefs = preferences
-        self.buildUI()
-
-    def buildUI(self):
-        w = self.centralFrame
-        g = QtGui.QGridLayout(w)
-        p = self._prefs
-        eds = {}
-        self._editors = eds
-        for i, k in enumerate(p.keys()):
-            name = p.getName(k)
-            if not name:
-                name = k
-            l = QtGui.QLabel(name, w)
-            g.addWidget(l, i, 0)
-            if p.getDescription(k):
-                l.setToolTip(p.getDescription(k))
-            
-            e = QtGui.QLineEdit(w)
-            eds[k] = e
-            g.addWidget(e, i, 1)
-            val = p.getPref(k)
-            if val is None:
-                val = ''
-            if not isinstance(val, basestring):
-                val = unicode(val)
-            e.setText(val)
-            
-        g.addWidget(QtGui.QWidget(w), i+1, 0)
-        g.setRowStretch(i+1,1)
-        g.setColumnStretch(1,1)
-
-    def accept(self):
-        p=self._prefs
-        for k in p.keys():
-            newval = unicode(self._editors[k].text())
-            p.setPref(k, newval)            
-        return QtGui.QDialog.accept(self)
-            
-if __name__ == '__main__':
-    class TestPreferences(AbstractPreferences):
-        ORGANISATION="Logilab"
-        APPLICATION="test_qpref_editor"
-
-        device = PreferenceItem('/dev/ttyUSB0', name="the device")
-        address = PreferenceItem(5, description="GPIB address of the plotter")
-        _pos = PreferenceItem(None)
-        _size = PreferenceItem(None)
-        _appState = PreferenceItem(None)
-        
-    a = QtGui.QApplication([])
-
-    prefs = TestPreferences()
-    w = PreferencesEditor(prefs)
-    w.show()
-    a.exec_()
--- a/qpreferences_dialog.ui	Fri Jan 25 20:51:56 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-<ui version="4.0" >
- <class>PreferencesDialog</class>
- <widget class="QDialog" name="PreferencesDialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>300</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Dialog</string>
-  </property>
-  <layout class="QVBoxLayout" >
-   <item>
-    <widget class="QFrame" name="centralFrame" >
-     <property name="frameShape" >
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow" >
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>PreferencesDialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>PreferencesDialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>

mercurial