Fri, 25 Jan 2008 21:00:34 +0100
refactoring: created a 'plotter' subdirectory and put everything related to GPIB/HPGL plotting under it
--- 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>&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>&Open</string> + </property> + </action> + <action name="actionSave" > + <property name="text" > + <string>&Save</string> + </property> + </action> + <action name="actionSaveAs" > + <property name="text" > + <string>Save as...</string> + </property> + </action> + <action name="actionQuit" > + <property name="text" > + <string>&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>&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>&Open</string> - </property> - </action> - <action name="actionSave" > - <property name="text" > - <string>&Save</string> - </property> - </action> - <action name="actionSaveAs" > - <property name="text" > - <string>Save as...</string> - </property> - </action> - <action name="actionQuit" > - <property name="text" > - <string>&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>