From 2448157c041eb252441c556029ad09e05391088b Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 6 Sep 2011 19:32:10 -0700 Subject: [PATCH 01/18] Config to limit the disk cache size --- python/pyphantomjs/config.py | 1 + python/pyphantomjs/networkaccessmanager.py | 4 +++- python/pyphantomjs/phantom.py | 2 +- python/pyphantomjs/pyphantomjs.py | 1 + python/pyphantomjs/utils.py | 3 +++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/python/pyphantomjs/config.py b/python/pyphantomjs/config.py index 8d688e9c58..c3e3379073 100644 --- a/python/pyphantomjs/config.py +++ b/python/pyphantomjs/config.py @@ -39,6 +39,7 @@ def __init__(self, parent, jsonFile): 'loadImages': { 'mapping': 'load_images', 'default': True }, 'loadPlugins': { 'mapping': 'load_plugins', 'default': False }, 'localAccessRemote': { 'mapping': 'local_access_remote', 'default': False }, + 'maxDiskCacheSize': { 'mapping': 'max_disk_cache_size', 'default': -1 }, 'outputEncoding': { 'mapping': 'output_encoding', 'default': 'System' }, 'proxy': { 'mapping': 'proxy', 'default': None }, 'scriptEncoding': { 'mapping': 'script_encoding', 'default': 'utf-8' }, diff --git a/python/pyphantomjs/networkaccessmanager.py b/python/pyphantomjs/networkaccessmanager.py index 7b67552a65..04bd98ff89 100644 --- a/python/pyphantomjs/networkaccessmanager.py +++ b/python/pyphantomjs/networkaccessmanager.py @@ -31,7 +31,7 @@ class NetworkAccessManager(QNetworkAccessManager): resourceReceived = pyqtSignal('QVariantMap') resourceRequested = pyqtSignal('QVariantMap') - def __init__(self, parent, auth, cookieFile, diskCacheEnabled, ignoreSslErrors): + def __init__(self, parent, auth, cookieFile, diskCacheEnabled, ignoreSslErrors, maxDiskCacheSize): QNetworkAccessManager.__init__(self, parent) self.m_ignoreSslErrors = ignoreSslErrors @@ -52,6 +52,8 @@ def __init__(self, parent, auth, cookieFile, diskCacheEnabled, ignoreSslErrors): if diskCacheEnabled: m_networkDiskCache = QNetworkDiskCache() m_networkDiskCache.setCacheDirectory(QDesktopServices.storageLocation(QDesktopServices.CacheLocation)) + if maxDiskCacheSize > 0: + m_networkDiskCache.setMaximumCacheSize(maxDiskCacheSize * 1024) self.setCache(m_networkDiskCache) do_action('NetworkAccessManagerInit') diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 49ed99ea1b..23748bbe3a 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -65,7 +65,7 @@ def __init__(self, parent, args): QNetworkProxy.setApplicationProxy(proxy) # Provide WebPage with a non-standard Network Access Manager - self.m_netAccessMan = NetworkAccessManager(self, args.auth, args.cookies, args.disk_cache, args.ignore_ssl_errors) + self.m_netAccessMan = NetworkAccessManager(self, args.auth, args.cookies, args.disk_cache, args.ignore_ssl_errors, args.max_disk_cache_size) self.m_page.setNetworkAccessManager(self.m_netAccessMan) self.m_page.javaScriptConsoleMessageSent.connect(self.printConsoleMessage) diff --git a/python/pyphantomjs/pyphantomjs.py b/python/pyphantomjs/pyphantomjs.py index 287cc02ddf..51f1787d90 100644 --- a/python/pyphantomjs/pyphantomjs.py +++ b/python/pyphantomjs/pyphantomjs.py @@ -64,6 +64,7 @@ def parseArgs(app, args): args.load_images = True if args.load_images == 'yes' else False args.load_plugins = False if args.load_plugins == 'no' else True args.local_access_remote = False if args.local_access_remote == 'no' else True + args.max_disk_cache_size = int(args.max_disk_cache_size) # register an alternative Message Handler messageHandler = MessageHandler(args.verbose) diff --git a/python/pyphantomjs/utils.py b/python/pyphantomjs/utils.py index 3062cee550..d3f2daf39a 100644 --- a/python/pyphantomjs/utils.py +++ b/python/pyphantomjs/utils.py @@ -90,6 +90,9 @@ def argParser(): choices=['yes', 'no'], help='Local content can access remote URL (default: %(default)s)' ) + parser.add_argument('--max-disk-cache-size', default=-1, metavar='size', + help='Limits the size of disk cache (in KB)' + ) parser.add_argument('--output-encoding', default='System', metavar='encoding', help='Sets the encoding used for terminal output (default: %(default)s)' ) From bd67351ab0c6238bf4b0dce2ad82322f623b702a Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 6 Sep 2011 22:40:33 -0700 Subject: [PATCH 02/18] Fix import of version in build_binary --- python/pyphantomjs/tools/build_binary.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/pyphantomjs/tools/build_binary.py b/python/pyphantomjs/tools/build_binary.py index 308a38e7f8..7510151aff 100644 --- a/python/pyphantomjs/tools/build_binary.py +++ b/python/pyphantomjs/tools/build_binary.py @@ -20,11 +20,12 @@ import os import sys + # hack to import parent module(s) parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -sys.path = sys.path + [parent_dir] +sys.path = [parent_dir] + sys.path -from utils import version +from __init__ import __version__ try: from cx_Freeze import setup, Executable @@ -84,7 +85,7 @@ def qt4_plugins_dir(): setup( name = 'PyPhantomJS', - version = version, + version = __version__, description = 'Minimalistic, headless, WebKit-based, JavaScript-driven tool', options = {'build_exe': {'includes': includes, 'include_files': include_files}}, executables = [exe] From 70fe7a4777caf595dba547427754de3e14cdc5b9 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 6 Sep 2011 22:43:19 -0700 Subject: [PATCH 03/18] Don't check for multiple examples paths in build_binary anymore --- python/pyphantomjs/tools/build_binary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyphantomjs/tools/build_binary.py b/python/pyphantomjs/tools/build_binary.py index 7510151aff..e3cfe8bce3 100644 --- a/python/pyphantomjs/tools/build_binary.py +++ b/python/pyphantomjs/tools/build_binary.py @@ -71,7 +71,7 @@ def qt4_plugins_dir(): # to make sure images are supported; jpeg, gif, svg, etc. (os.path.join(qt4_plugin_dir, 'imageformats'), 'imageformats'), (os.path.join(parent_dir, 'plugins'), 'plugins'), - (os.path.join(parent_dir, '../examples' if os.path.exists('../examples') else '../../examples'), 'examples'), + (os.path.join(parent_dir, '../../examples'), 'examples'), (os.path.join(parent_dir, '../LICENSE'), 'LICENSE.txt'), (os.path.join(parent_dir, '../README.md'), 'README.txt') ] From 8a2b9e77df2c53663411a47562244c161d7ef74d Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 6 Sep 2011 22:45:39 -0700 Subject: [PATCH 04/18] Include ChangeLog in build_binary --- python/pyphantomjs/tools/build_binary.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/pyphantomjs/tools/build_binary.py b/python/pyphantomjs/tools/build_binary.py index e3cfe8bce3..6e29ddaf54 100644 --- a/python/pyphantomjs/tools/build_binary.py +++ b/python/pyphantomjs/tools/build_binary.py @@ -73,7 +73,8 @@ def qt4_plugins_dir(): (os.path.join(parent_dir, 'plugins'), 'plugins'), (os.path.join(parent_dir, '../../examples'), 'examples'), (os.path.join(parent_dir, '../LICENSE'), 'LICENSE.txt'), - (os.path.join(parent_dir, '../README.md'), 'README.txt') + (os.path.join(parent_dir, '../README.md'), 'README.txt'), + (os.path.join(parent_dir, '../../ChangeLog'), 'ChangeLog.txt') ] From de2dc7b8618a58489176532e5cb158751d4c7f6a Mon Sep 17 00:00:00 2001 From: IceArmy Date: Wed, 7 Sep 2011 05:00:26 -0700 Subject: [PATCH 05/18] Stop unsafe QByteArray conversions using str() --- python/pyphantomjs/config.py | 2 +- python/pyphantomjs/csconverter.py | 2 +- python/pyphantomjs/networkaccessmanager.py | 12 ++++++------ python/pyphantomjs/networkreplyproxy.py | 2 +- python/pyphantomjs/phantom.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/python/pyphantomjs/config.py b/python/pyphantomjs/config.py index c3e3379073..934d6c2d06 100644 --- a/python/pyphantomjs/config.py +++ b/python/pyphantomjs/config.py @@ -58,7 +58,7 @@ def __init__(self, parent, jsonFile): file_ = QFile(':/configurator.js') if not file_.open(QFile.ReadOnly): sys.exit('Unable to load JSON configurator!') - configurator = str(file_.readAll()) + configurator = file_.readAll().data() file_.close() if not configurator: sys.exit('Unable to set-up JSON configurator!') diff --git a/python/pyphantomjs/csconverter.py b/python/pyphantomjs/csconverter.py index 8e85ff1c2e..df460ff470 100644 --- a/python/pyphantomjs/csconverter.py +++ b/python/pyphantomjs/csconverter.py @@ -38,7 +38,7 @@ def __init__(self): converter = QFile(':/resources/coffee-script.js') if not converter.open(QFile.ReadOnly): sys.exit('CoffeeScript compiler is not available!') - script = str(converter.readAll()) + script = converter.readAll().data() converter.close() self.m_webPage.mainFrame().evaluateJavaScript(script) diff --git a/python/pyphantomjs/networkaccessmanager.py b/python/pyphantomjs/networkaccessmanager.py index 04bd98ff89..62b978d9b2 100644 --- a/python/pyphantomjs/networkaccessmanager.py +++ b/python/pyphantomjs/networkaccessmanager.py @@ -69,8 +69,8 @@ def createRequest(self, op, req, outgoingData): headers = [] for header in req.rawHeaderList(): header = { - 'name': str(header), - 'value': str(req.rawHeader(header)) + 'name': header.data(), + 'value': req.rawHeader(header).data() } headers.append(header) @@ -96,8 +96,8 @@ def handleFinished(self, reply): headers = [] for header in reply.rawHeaderList(): header = { - 'name': str(header), - 'value': str(reply.rawHeader(header)) + 'name': header.data(), + 'value': reply.rawHeader(header).data() } headers.append(header) @@ -134,8 +134,8 @@ def handleStarted(self): headers = [] for header in reply.rawHeaderList(): header = { - 'name': str(header), - 'value': str(reply.rawHeader(header)) + 'name': header.data(), + 'value': reply.rawHeader(header).data() } headers.append(header) diff --git a/python/pyphantomjs/networkreplyproxy.py b/python/pyphantomjs/networkreplyproxy.py index 088d211015..dfb5f6a6a4 100644 --- a/python/pyphantomjs/networkreplyproxy.py +++ b/python/pyphantomjs/networkreplyproxy.py @@ -98,7 +98,7 @@ def isSequential(self): def readData(self, maxlen): size = min(maxlen, len(self.m_buffer)) data, self.m_buffer = self.m_buffer[:size], self.m_buffer[size:] - return str(data) + return data.data() def readInternal(self): data = self.m_reply.readAll() diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 23748bbe3a..242b31a258 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -93,7 +93,7 @@ def __init__(self, parent, args): if not f.open(QFile.ReadOnly): sys.exit("Failed to load shim '%s'" % shim) - f = str(f.readAll()) + f = f.readAll().data() if not f: sys.exit("Failed to load shim '%s'" % shim) self.m_page.mainFrame().evaluateJavaScript(f) From 5821a60db1769eaa3ad8697ee4e2ac1c6257b999 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Wed, 7 Sep 2011 20:52:22 -0700 Subject: [PATCH 06/18] Rename option/config to localToRemoteUrlAccess(Enabled). --- python/pyphantomjs/config.py | 2 +- python/pyphantomjs/phantom.py | 2 +- python/pyphantomjs/pyphantomjs.py | 2 +- python/pyphantomjs/utils.py | 2 +- python/pyphantomjs/webpage.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/pyphantomjs/config.py b/python/pyphantomjs/config.py index 934d6c2d06..d8c9d39354 100644 --- a/python/pyphantomjs/config.py +++ b/python/pyphantomjs/config.py @@ -38,7 +38,7 @@ def __init__(self, parent, jsonFile): 'ignoreSslErrors': { 'mapping': 'ignore_ssl_errors', 'default': False }, 'loadImages': { 'mapping': 'load_images', 'default': True }, 'loadPlugins': { 'mapping': 'load_plugins', 'default': False }, - 'localAccessRemote': { 'mapping': 'local_access_remote', 'default': False }, + 'localToRemoteUrlAccessEnabled': { 'mapping': 'local_to_remote_url_access', 'default': False }, 'maxDiskCacheSize': { 'mapping': 'max_disk_cache_size', 'default': -1 }, 'outputEncoding': { 'mapping': 'output_encoding', 'default': 'System' }, 'proxy': { 'mapping': 'proxy', 'default': None }, diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 242b31a258..28f712a743 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -75,7 +75,7 @@ def __init__(self, parent, args): self.m_defaultPageSettings['javascriptEnabled'] = True self.m_defaultPageSettings['XSSAuditingEnabled'] = False self.m_defaultPageSettings['userAgent'] = self.m_page.userAgent() - self.m_defaultPageSettings['localAccessRemote'] = args.local_access_remote + self.m_defaultPageSettings['localToRemoteUrlAccessEnabled'] = args.local_to_remote_url_access self.m_page.applySettings(self.m_defaultPageSettings) self.libraryPath = os.path.dirname(os.path.abspath(self.m_scriptFile)) diff --git a/python/pyphantomjs/pyphantomjs.py b/python/pyphantomjs/pyphantomjs.py index 51f1787d90..85c2eafbe3 100644 --- a/python/pyphantomjs/pyphantomjs.py +++ b/python/pyphantomjs/pyphantomjs.py @@ -63,7 +63,7 @@ def parseArgs(app, args): args.ignore_ssl_errors = False if args.ignore_ssl_errors == 'no' else True args.load_images = True if args.load_images == 'yes' else False args.load_plugins = False if args.load_plugins == 'no' else True - args.local_access_remote = False if args.local_access_remote == 'no' else True + args.local_to_remote_url_access = False if args.local_to_remote_url_access == 'no' else True args.max_disk_cache_size = int(args.max_disk_cache_size) # register an alternative Message Handler diff --git a/python/pyphantomjs/utils.py b/python/pyphantomjs/utils.py index d3f2daf39a..9ef6bcc876 100644 --- a/python/pyphantomjs/utils.py +++ b/python/pyphantomjs/utils.py @@ -86,7 +86,7 @@ def argParser(): choices=['yes', 'no'], help='Load all plugins (i.e. Flash, Silverlight, ...) (default: %(default)s)' ) - parser.add_argument('--local-access-remote', default='no', + parser.add_argument('--local-to-remote-url-access', default='no', choices=['yes', 'no'], help='Local content can access remote URL (default: %(default)s)' ) diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index 5f9d2eedb1..3137687081 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -125,7 +125,7 @@ def applySettings(self, defaults): opt.setAttribute(QWebSettings.PluginsEnabled, defaults['loadPlugins']) opt.setAttribute(QWebSettings.JavascriptEnabled, defaults['javascriptEnabled']) opt.setAttribute(QWebSettings.XSSAuditingEnabled, defaults['XSSAuditingEnabled']) - opt.setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, defaults['localAccessRemote']) + opt.setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, defaults['localToRemoteUrlAccessEnabled']) if 'userAgent' in defaults: self.m_webPage.m_userAgent = defaults['userAgent'] From f51b5144f08d34413e4aefcdb1b7a47a2a3d1819 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Thu, 8 Sep 2011 00:25:51 -0700 Subject: [PATCH 07/18] Fix issue 225: netsniff.coffee produces invalid HAR --- examples/netsniff.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/netsniff.coffee b/examples/netsniff.coffee index 396a7fd337..0f43a57913 100644 --- a/examples/netsniff.coffee +++ b/examples/netsniff.coffee @@ -70,7 +70,7 @@ createHAR = (address, title, startTime, resources) -> id: address title: title pageTimings: {} - ] + ] entries: entries page = new WebPage() From ad390acd9605d2d6a804cc14d410805cf352d9c1 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Thu, 8 Sep 2011 15:24:50 -0700 Subject: [PATCH 08/18] Implement require('fs') http://code.google.com/p/phantomjs/issues/detail?id=47 --- python/pyphantomjs/bootstrap.js | 180 +++++++++++++++++++++++++++++++ python/pyphantomjs/phantom.py | 7 +- python/pyphantomjs/resources.qrc | 2 +- 3 files changed, 186 insertions(+), 3 deletions(-) create mode 100644 python/pyphantomjs/bootstrap.js diff --git a/python/pyphantomjs/bootstrap.js b/python/pyphantomjs/bootstrap.js new file mode 100644 index 0000000000..c85a09824b --- /dev/null +++ b/python/pyphantomjs/bootstrap.js @@ -0,0 +1,180 @@ +/*jslint sloppy: true, nomen: true */ +/*global window:true,phantom:true,fs:true */ + +/* + This file is part of the PhantomJS project from Ofi Labs. + + Copyright (C) 2011 Ivan De Marino + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +function require (name) { + + var exports; + + if (name === 'fs') { + + exports = phantom.createFilesystem(); + + // JavaScript "shim" to throw exceptions in case a critical operation fails. + + /** Open and return a "file" object. + * It will throw exception if it fails. + * + * @param path Path of the file to open + * @param mode Open Mode. A string made of 'r', 'w', 'a/+' characters. + * @return "file" object + */ + exports.open = function (path, mode) { + var file = exports._open(path, mode); + if (file) { + return file; + } + throw "Unable to open file '" + path + "'"; + }; + + /** Open, read and return content of a file. + * It will throw an exception if it fails. + * + * @param path Path of the file to read from + * @return file content + */ + exports.read = function (path) { + var f = fs.open(path, 'r'), + content = f.read(); + + f.close(); + return content; + }; + + /** Open and write content to a file + * It will throw an exception if it fails. + * + * @param path Path of the file to read from + * @param content Content to write to the file + * @param mode Open Mode. A string made of 'w' or 'a / +' characters. + */ + exports.write = function (path, content, mode) { + var f = fs.open(path, mode); + + f.write(content); + f.close(); + }; + + /** Return the size of a file, in bytes. + * It will throw an exception if it fails. + * + * @param path Path of the file to read the size of + * @return File size in bytes + */ + exports.size = function (path) { + var size = fs._size(path); + if (size !== -1) { + return size; + } + throw "Unable to read file '" + path + "' size"; + }; + + /** Copy a file. + * It will throw an exception if it fails. + * + * @param source Path of the source file + * @param destination Path of the destination file + */ + exports.copy = function (source, destination) { + if (!fs._copy(source, destination)) { + throw "Unable to copy file '" + source + "' at '" + destination + "'"; + } + }; + + /** Copy a directory tree. + * It will throw an exception if it fails. + * + * @param source Path of the source directory tree + * @param destination Path of the destination directory tree + */ + exports.copyTree = function (source, destination) { + if (!fs._copyTree(source, destination)) { + throw "Unable to copy directory tree '" + source + "' at '" + destination + "'"; + } + }; + + /** Move a file. + * It will throw an exception if it fails. + * + * @param source Path of the source file + * @param destination Path of the destination file + */ + exports.move = function (source, destination) { + fs.copy(source, destination); + fs.remove(source); + }; + + /** Removes a file. + * It will throw an exception if it fails. + * + * @param path Path of the file to remove + */ + exports.remove = function (path) { + if (!fs._remove(path)) { + throw "Unable to remove file '" + path + "'"; + } + }; + + /** Removes a directory. + * It will throw an exception if it fails. + * + * @param path Path of the directory to remove + */ + exports.removeDirectory = function (path) { + if (!fs._removeDirectory(path)) { + throw "Unable to remove directory '" + path + "'"; + } + }; + + /** Removes a directory tree. + * It will throw an exception if it fails. + * + * @param path Path of the directory tree to remove + */ + exports.removeTree = function (path) { + if (!fs._removeTree(path)) { + throw "Unable to remove directory tree '" + path + "'"; + } + }; + + exports.touch = function (path) { + fs.write(path, "", 'a'); + }; + + } + + if (typeof exports === 'undefined') { + throw 'Unknown module ' + name + ' for require()'; + } + + return exports; +} + diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 28f712a743..0822427ee2 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -82,10 +82,9 @@ def __init__(self, parent, args): # inject our properties and slots into javascript self.m_page.mainFrame().addToJavaScriptWindowObject('phantom', self) - self.m_page.mainFrame().addToJavaScriptWindowObject('fs', self.m_filesystem) jsShims = ( - ':/filesystem-shim.js', + ':/bootstrap.js', ':/webpage-shim.js' ) for shim in jsShims: @@ -120,6 +119,10 @@ def returnValue(self): def args(self): return self.m_args + @pyqtSlot(result=FileSystem) + def createFilesystem(self): + return self.m_filesystem + @pyqtSlot(result=WebPage) def createWebPage(self): page = WebPage(self) diff --git a/python/pyphantomjs/resources.qrc b/python/pyphantomjs/resources.qrc index 410e4247c4..71e32e42f3 100644 --- a/python/pyphantomjs/resources.qrc +++ b/python/pyphantomjs/resources.qrc @@ -1,7 +1,7 @@ + bootstrap.js configurator.js - filesystem-shim.js webpage-shim.js resources/coffee-script.js resources/pyphantomjs-icon.png From dab9b24983df81520850246cfacf6e1c5700ff2a Mon Sep 17 00:00:00 2001 From: IceArmy Date: Thu, 8 Sep 2011 15:53:20 -0700 Subject: [PATCH 09/18] Regenerate resources --- python/pyphantomjs/resources.py | 732 ++++++++++++++++++-------------- 1 file changed, 407 insertions(+), 325 deletions(-) diff --git a/python/pyphantomjs/resources.py b/python/pyphantomjs/resources.py index b84bedca56..1320fa0d1b 100644 --- a/python/pyphantomjs/resources.py +++ b/python/pyphantomjs/resources.py @@ -2,7 +2,7 @@ # Resource object code # -# Created: Sun Sep 4 22:07:57 2011 +# Created: Thu Sep 8 15:53:15 2011 # by: The Resource Compiler for PyQt (Qt v4.7.2) # # WARNING! All changes made in this file will be lost! @@ -10,6 +10,403 @@ from PyQt4 import QtCore qt_resource_data = "\ +\x00\x00\x18\xa3\ +\x2f\ +\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ +\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ +\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x77\x69\ +\x6e\x64\x6f\x77\x3a\x74\x72\x75\x65\x2c\x70\x68\x61\x6e\x74\x6f\ +\x6d\x3a\x74\x72\x75\x65\x2c\x66\x73\x3a\x74\x72\x75\x65\x20\x2a\ +\x2f\x0a\x0a\x2f\x2a\x0a\x20\x20\x54\x68\x69\x73\x20\x66\x69\x6c\ +\x65\x20\x69\x73\x20\x70\x61\x72\x74\x20\x6f\x66\x20\x74\x68\x65\ +\x20\x50\x68\x61\x6e\x74\x6f\x6d\x4a\x53\x20\x70\x72\x6f\x6a\x65\ +\x63\x74\x20\x66\x72\x6f\x6d\x20\x4f\x66\x69\x20\x4c\x61\x62\x73\ +\x2e\x0a\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\ +\x43\x29\x20\x32\x30\x31\x31\x20\x49\x76\x61\x6e\x20\x44\x65\x20\ +\x4d\x61\x72\x69\x6e\x6f\x20\x3c\x69\x76\x61\x6e\x2e\x64\x65\x2e\ +\x6d\x61\x72\x69\x6e\x6f\x40\x67\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\ +\x3e\x0a\x0a\x20\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\ +\x69\x6f\x6e\x20\x61\x6e\x64\x20\x75\x73\x65\x20\x69\x6e\x20\x73\ +\x6f\x75\x72\x63\x65\x20\x61\x6e\x64\x20\x62\x69\x6e\x61\x72\x79\ +\x20\x66\x6f\x72\x6d\x73\x2c\x20\x77\x69\x74\x68\x20\x6f\x72\x20\ +\x77\x69\x74\x68\x6f\x75\x74\x0a\x20\x20\x6d\x6f\x64\x69\x66\x69\ +\x63\x61\x74\x69\x6f\x6e\x2c\x20\x61\x72\x65\x20\x70\x65\x72\x6d\ +\x69\x74\x74\x65\x64\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\x74\ +\x68\x61\x74\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\ +\x67\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x72\x65\ +\x20\x6d\x65\x74\x3a\x0a\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\x64\ +\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\x6f\x66\x20\ +\x73\x6f\x75\x72\x63\x65\x20\x63\x6f\x64\x65\x20\x6d\x75\x73\x74\ +\x20\x72\x65\x74\x61\x69\x6e\x20\x74\x68\x65\x20\x61\x62\x6f\x76\ +\x65\x20\x63\x6f\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\ +\x20\x20\x6e\x6f\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\ +\x69\x73\x74\x20\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\ +\x73\x20\x61\x6e\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\ +\x69\x6e\x67\x20\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x2e\x0a\ +\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\ +\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x62\x69\x6e\x61\x72\x79\x20\ +\x66\x6f\x72\x6d\x20\x6d\x75\x73\x74\x20\x72\x65\x70\x72\x6f\x64\ +\x75\x63\x65\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\ +\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\ +\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\ +\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\ +\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\ +\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x20\x69\x6e\x20\x74\x68\ +\x65\x0a\x20\x20\x20\x20\x20\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\ +\x61\x74\x69\x6f\x6e\x20\x61\x6e\x64\x2f\x6f\x72\x20\x6f\x74\x68\ +\x65\x72\x20\x6d\x61\x74\x65\x72\x69\x61\x6c\x73\x20\x70\x72\x6f\ +\x76\x69\x64\x65\x64\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x64\ +\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x2e\x0a\x20\x20\x20\ +\x20\x2a\x20\x4e\x65\x69\x74\x68\x65\x72\x20\x74\x68\x65\x20\x6e\ +\x61\x6d\x65\x20\x6f\x66\x20\x74\x68\x65\x20\x3c\x6f\x72\x67\x61\ +\x6e\x69\x7a\x61\x74\x69\x6f\x6e\x3e\x20\x6e\x6f\x72\x20\x74\x68\ +\x65\x0a\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x73\x20\x6f\x66\ +\x20\x69\x74\x73\x20\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\x6f\x72\ +\x73\x20\x6d\x61\x79\x20\x62\x65\x20\x75\x73\x65\x64\x20\x74\x6f\ +\x20\x65\x6e\x64\x6f\x72\x73\x65\x20\x6f\x72\x20\x70\x72\x6f\x6d\ +\x6f\x74\x65\x20\x70\x72\x6f\x64\x75\x63\x74\x73\x0a\x20\x20\x20\ +\x20\x20\x20\x64\x65\x72\x69\x76\x65\x64\x20\x66\x72\x6f\x6d\x20\ +\x74\x68\x69\x73\x20\x73\x6f\x66\x74\x77\x61\x72\x65\x20\x77\x69\ +\x74\x68\x6f\x75\x74\x20\x73\x70\x65\x63\x69\x66\x69\x63\x20\x70\ +\x72\x69\x6f\x72\x20\x77\x72\x69\x74\x74\x65\x6e\x20\x70\x65\x72\ +\x6d\x69\x73\x73\x69\x6f\x6e\x2e\x0a\x0a\x20\x20\x54\x48\x49\x53\ +\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x20\x49\x53\x20\x50\x52\x4f\ +\x56\x49\x44\x45\x44\x20\x42\x59\x20\x54\x48\x45\x20\x43\x4f\x50\ +\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\x53\x20\x41\ +\x4e\x44\x20\x43\x4f\x4e\x54\x52\x49\x42\x55\x54\x4f\x52\x53\x20\ +\x22\x41\x53\x20\x49\x53\x22\x0a\x20\x20\x41\x4e\x44\x20\x41\x4e\ +\x59\x20\x45\x58\x50\x52\x45\x53\x53\x20\x4f\x52\x20\x49\x4d\x50\ +\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\x54\x49\x45\x53\x2c\ +\x20\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\ +\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\ +\x54\x48\x45\x0a\x20\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\ +\x52\x52\x41\x4e\x54\x49\x45\x53\x20\x4f\x46\x20\x4d\x45\x52\x43\ +\x48\x41\x4e\x54\x41\x42\x49\x4c\x49\x54\x59\x20\x41\x4e\x44\x20\ +\x46\x49\x54\x4e\x45\x53\x53\x20\x46\x4f\x52\x20\x41\x20\x50\x41\ +\x52\x54\x49\x43\x55\x4c\x41\x52\x20\x50\x55\x52\x50\x4f\x53\x45\ +\x0a\x20\x20\x41\x52\x45\x20\x44\x49\x53\x43\x4c\x41\x49\x4d\x45\ +\x44\x2e\x20\x49\x4e\x20\x4e\x4f\x20\x45\x56\x45\x4e\x54\x20\x53\ +\x48\x41\x4c\x4c\x20\x3c\x43\x4f\x50\x59\x52\x49\x47\x48\x54\x20\ +\x48\x4f\x4c\x44\x45\x52\x3e\x20\x42\x45\x20\x4c\x49\x41\x42\x4c\ +\x45\x20\x46\x4f\x52\x20\x41\x4e\x59\x0a\x20\x20\x44\x49\x52\x45\ +\x43\x54\x2c\x20\x49\x4e\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\ +\x43\x49\x44\x45\x4e\x54\x41\x4c\x2c\x20\x53\x50\x45\x43\x49\x41\ +\x4c\x2c\x20\x45\x58\x45\x4d\x50\x4c\x41\x52\x59\x2c\x20\x4f\x52\ +\x20\x43\x4f\x4e\x53\x45\x51\x55\x45\x4e\x54\x49\x41\x4c\x20\x44\ +\x41\x4d\x41\x47\x45\x53\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\ +\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\ +\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x50\x52\x4f\x43\x55\x52\x45\ +\x4d\x45\x4e\x54\x20\x4f\x46\x20\x53\x55\x42\x53\x54\x49\x54\x55\ +\x54\x45\x20\x47\x4f\x4f\x44\x53\x20\x4f\x52\x20\x53\x45\x52\x56\ +\x49\x43\x45\x53\x3b\x0a\x20\x20\x4c\x4f\x53\x53\x20\x4f\x46\x20\ +\x55\x53\x45\x2c\x20\x44\x41\x54\x41\x2c\x20\x4f\x52\x20\x50\x52\ +\x4f\x46\x49\x54\x53\x3b\x20\x4f\x52\x20\x42\x55\x53\x49\x4e\x45\ +\x53\x53\x20\x49\x4e\x54\x45\x52\x52\x55\x50\x54\x49\x4f\x4e\x29\ +\x20\x48\x4f\x57\x45\x56\x45\x52\x20\x43\x41\x55\x53\x45\x44\x20\ +\x41\x4e\x44\x0a\x20\x20\x4f\x4e\x20\x41\x4e\x59\x20\x54\x48\x45\ +\x4f\x52\x59\x20\x4f\x46\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\ +\x2c\x20\x57\x48\x45\x54\x48\x45\x52\x20\x49\x4e\x20\x43\x4f\x4e\ +\x54\x52\x41\x43\x54\x2c\x20\x53\x54\x52\x49\x43\x54\x20\x4c\x49\ +\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x4f\x52\x20\x54\x4f\x52\x54\ +\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x20\x4e\x45\ +\x47\x4c\x49\x47\x45\x4e\x43\x45\x20\x4f\x52\x20\x4f\x54\x48\x45\ +\x52\x57\x49\x53\x45\x29\x20\x41\x52\x49\x53\x49\x4e\x47\x20\x49\ +\x4e\x20\x41\x4e\x59\x20\x57\x41\x59\x20\x4f\x55\x54\x20\x4f\x46\ +\x20\x54\x48\x45\x20\x55\x53\x45\x20\x4f\x46\x0a\x20\x20\x54\x48\ +\x49\x53\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x2c\x20\x45\x56\x45\ +\x4e\x20\x49\x46\x20\x41\x44\x56\x49\x53\x45\x44\x20\x4f\x46\x20\ +\x54\x48\x45\x20\x50\x4f\x53\x53\x49\x42\x49\x4c\x49\x54\x59\x20\ +\x4f\x46\x20\x53\x55\x43\x48\x20\x44\x41\x4d\x41\x47\x45\x2e\x0a\ +\x2a\x2f\x0a\x0a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x65\x71\ +\x75\x69\x72\x65\x20\x28\x6e\x61\x6d\x65\x29\x20\x7b\x0a\x0a\x20\ +\x20\x20\x20\x76\x61\x72\x20\x65\x78\x70\x6f\x72\x74\x73\x3b\x0a\ +\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x6e\x61\x6d\x65\x20\x3d\x3d\ +\x3d\x20\x27\x66\x73\x27\x29\x20\x7b\x0a\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x20\x3d\x20\x70\x68\x61\ +\x6e\x74\x6f\x6d\x2e\x63\x72\x65\x61\x74\x65\x46\x69\x6c\x65\x73\ +\x79\x73\x74\x65\x6d\x28\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x2f\x2f\x20\x4a\x61\x76\x61\x53\x63\x72\x69\x70\x74\x20\ +\x22\x73\x68\x69\x6d\x22\x20\x74\x6f\x20\x74\x68\x72\x6f\x77\x20\ +\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x63\x61\ +\x73\x65\x20\x61\x20\x63\x72\x69\x74\x69\x63\x61\x6c\x20\x6f\x70\ +\x65\x72\x61\x74\x69\x6f\x6e\x20\x66\x61\x69\x6c\x73\x2e\x0a\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x4f\x70\x65\x6e\ +\x20\x61\x6e\x64\x20\x72\x65\x74\x75\x72\x6e\x20\x61\x20\x22\x66\ +\x69\x6c\x65\x22\x20\x6f\x62\x6a\x65\x63\x74\x2e\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\ +\x74\x68\x72\x6f\x77\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\ +\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\ +\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\ +\x74\x6f\x20\x6f\x70\x65\x6e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x6d\x6f\x64\x65\x20\x4f\ +\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\x20\x41\x20\x73\x74\x72\x69\ +\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\x66\x20\x27\x72\x27\x2c\x20\ +\x27\x77\x27\x2c\x20\x27\x61\x2f\x2b\x27\x20\x63\x68\x61\x72\x61\ +\x63\x74\x65\x72\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x2a\x20\x40\x72\x65\x74\x75\x72\x6e\x20\x22\x66\x69\x6c\x65\x22\ +\x20\x6f\x62\x6a\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\ +\x72\x74\x73\x2e\x6f\x70\x65\x6e\x20\x3d\x20\x66\x75\x6e\x63\x74\ +\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\x64\x65\x29\ +\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\ +\x61\x72\x20\x66\x69\x6c\x65\x20\x3d\x20\x65\x78\x70\x6f\x72\x74\ +\x73\x2e\x5f\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\ +\x64\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x69\x66\x20\x28\x66\x69\x6c\x65\x29\x20\x7b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\ +\x75\x72\x6e\x20\x66\x69\x6c\x65\x3b\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\ +\x65\x20\x74\x6f\x20\x6f\x70\x65\x6e\x20\x66\x69\x6c\x65\x20\x27\ +\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x2f\x2a\x2a\x20\x4f\x70\x65\x6e\x2c\x20\x72\x65\ +\x61\x64\x20\x61\x6e\x64\x20\x72\x65\x74\x75\x72\x6e\x20\x63\x6f\ +\x6e\x74\x65\x6e\x74\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2e\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\ +\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\ +\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\ +\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\ +\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\ +\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\x66\ +\x72\x6f\x6d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\ +\x72\x65\x74\x75\x72\x6e\x20\x66\x69\x6c\x65\x20\x63\x6f\x6e\x74\ +\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\ +\x72\x65\x61\x64\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\ +\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x76\x61\x72\x20\x66\x20\x3d\x20\x66\x73\x2e\ +\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\x27\x72\x27\x29\x2c\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x3d\x20\x66\x2e\x72\x65\x61\ +\x64\x28\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\ +\x63\x6f\x6e\x74\x65\x6e\x74\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\ +\x20\x4f\x70\x65\x6e\x20\x61\x6e\x64\x20\x77\x72\x69\x74\x65\x20\ +\x63\x6f\x6e\x74\x65\x6e\x74\x20\x74\x6f\x20\x61\x20\x66\x69\x6c\ +\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\ +\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\ +\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\ +\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\ +\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\ +\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\ +\x66\x72\x6f\x6d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ +\x40\x70\x61\x72\x61\x6d\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x43\ +\x6f\x6e\x74\x65\x6e\x74\x20\x74\x6f\x20\x77\x72\x69\x74\x65\x20\ +\x74\x6f\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x6d\x6f\ +\x64\x65\x20\x4f\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\x20\x41\x20\ +\x73\x74\x72\x69\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\x66\x20\x27\ +\x77\x27\x20\x6f\x72\x20\x27\x61\x20\x2f\x20\x2b\x27\x20\x63\x68\ +\x61\x72\x61\x63\x74\x65\x72\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\ +\x70\x6f\x72\x74\x73\x2e\x77\x72\x69\x74\x65\x20\x3d\x20\x66\x75\ +\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x2c\x20\x63\x6f\ +\x6e\x74\x65\x6e\x74\x2c\x20\x6d\x6f\x64\x65\x29\x20\x7b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\x61\x72\x20\x66\ +\x20\x3d\x20\x66\x73\x2e\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\ +\x20\x6d\x6f\x64\x65\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x66\x2e\x77\x72\x69\x74\x65\x28\x63\x6f\x6e\ +\x74\x65\x6e\x74\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x2f\x2a\x2a\x20\x52\x65\x74\x75\x72\x6e\x20\x74\x68\x65\ +\x20\x73\x69\x7a\x65\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2c\ +\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x2e\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\ +\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\ +\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\ +\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\ +\x20\x74\x6f\x20\x72\x65\x61\x64\x20\x74\x68\x65\x20\x73\x69\x7a\ +\x65\x20\x6f\x66\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ +\x40\x72\x65\x74\x75\x72\x6e\x20\x46\x69\x6c\x65\x20\x73\x69\x7a\ +\x65\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\ +\x78\x70\x6f\x72\x74\x73\x2e\x73\x69\x7a\x65\x20\x3d\x20\x66\x75\ +\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\x61\x72\x20\ +\x73\x69\x7a\x65\x20\x3d\x20\x66\x73\x2e\x5f\x73\x69\x7a\x65\x28\ +\x70\x61\x74\x68\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x69\x66\x20\x28\x73\x69\x7a\x65\x20\x21\x3d\x3d\x20\ +\x2d\x31\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x73\x69\x7a\ +\x65\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x72\ +\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\ +\x61\x64\x20\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\ +\x68\x20\x2b\x20\x22\x27\x20\x73\x69\x7a\x65\x22\x3b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x2f\x2a\x2a\x20\x43\x6f\x70\x79\x20\x61\x20\x66\x69\x6c\ +\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\ +\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\ +\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\ +\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\ +\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\x74\x68\x20\x6f\ +\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\x20\x66\x69\x6c\ +\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\ +\x72\x61\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\ +\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x65\x73\x74\ +\x69\x6e\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x63\x6f\x70\x79\x20\x3d\x20\ +\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\ +\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x69\x66\x20\x28\x21\x66\x73\x2e\x5f\x63\x6f\x70\x79\x28\x73\ +\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\ +\x6f\x6e\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ +\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\ +\x63\x6f\x70\x79\x20\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x73\ +\x6f\x75\x72\x63\x65\x20\x2b\x20\x22\x27\x20\x61\x74\x20\x27\x22\ +\x20\x2b\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x2b\ +\x20\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\ +\x43\x6f\x70\x79\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\ +\x20\x74\x72\x65\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\ +\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\ +\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ +\x40\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\ +\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\ +\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\ +\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\ +\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\ +\x61\x74\x69\x6f\x6e\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\ +\x74\x72\x65\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\ +\x2e\x63\x6f\x70\x79\x54\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\ +\x74\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\ +\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\ +\x28\x21\x66\x73\x2e\x5f\x63\x6f\x70\x79\x54\x72\x65\x65\x28\x73\ +\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\ +\x6f\x6e\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ +\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\ +\x63\x6f\x70\x79\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\ +\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x73\x6f\x75\x72\x63\x65\x20\ +\x2b\x20\x22\x27\x20\x61\x74\x20\x27\x22\x20\x2b\x20\x64\x65\x73\ +\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x2b\x20\x22\x27\x22\x3b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x4d\x6f\x76\x65\x20\x61\ +\x20\x66\x69\x6c\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\ +\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\ +\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ +\x40\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\ +\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\ +\x20\x66\x69\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\ +\x20\x40\x70\x61\x72\x61\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\x74\ +\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\ +\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x6d\x6f\x76\ +\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x73\x6f\ +\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\ +\x6e\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x66\x73\x2e\x63\x6f\x70\x79\x28\x73\x6f\x75\ +\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\ +\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x66\x73\x2e\x72\x65\x6d\x6f\x76\x65\x28\x73\x6f\x75\ +\x72\x63\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\ +\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x52\x65\ +\x6d\x6f\x76\x65\x73\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\ +\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\ +\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\ +\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\ +\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\x65\ +\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\ +\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x66\x73\x2e\x5f\x72\x65\ +\x6d\x6f\x76\x65\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\ +\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x66\x69\ +\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\ +\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\ +\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x52\x65\ +\x6d\x6f\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\x72\ +\x79\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\ +\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\ +\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\ +\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\ +\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\ +\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x6f\ +\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\ +\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\x65\x44\x69\x72\x65\x63\x74\ +\x6f\x72\x79\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\ +\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x66\x73\x2e\ +\x5f\x72\x65\x6d\x6f\x76\x65\x44\x69\x72\x65\x63\x74\x6f\x72\x79\ +\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\ +\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\x69\x72\x65\x63\x74\ +\x6f\x72\x79\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\ +\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ +\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x52\ +\x65\x6d\x6f\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\ +\x72\x79\x20\x74\x72\x65\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\ +\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\ +\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\ +\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\ +\x6f\x72\x79\x20\x74\x72\x65\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\ +\x76\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\ +\x65\x6d\x6f\x76\x65\x54\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\ +\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\ +\x20\x28\x21\x66\x73\x2e\x5f\x72\x65\x6d\x6f\x76\x65\x54\x72\x65\ +\x65\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\ +\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\x69\x72\x65\x63\ +\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x70\ +\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x74\x6f\x75\x63\x68\x20\x3d\ +\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\ +\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x66\x73\x2e\x77\x72\x69\x74\x65\x28\x70\x61\x74\x68\ +\x2c\x20\x22\x22\x2c\x20\x27\x61\x27\x29\x3b\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\ +\x20\x20\x20\x69\x66\x20\x28\x74\x79\x70\x65\x6f\x66\x20\x65\x78\ +\x70\x6f\x72\x74\x73\x20\x3d\x3d\x3d\x20\x27\x75\x6e\x64\x65\x66\ +\x69\x6e\x65\x64\x27\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x74\x68\x72\x6f\x77\x20\x27\x55\x6e\x6b\x6e\x6f\x77\x6e\x20\ +\x6d\x6f\x64\x75\x6c\x65\x20\x27\x20\x2b\x20\x6e\x61\x6d\x65\x20\ +\x2b\x20\x27\x20\x66\x6f\x72\x20\x72\x65\x71\x75\x69\x72\x65\x28\ +\x29\x27\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x72\ +\x65\x74\x75\x72\x6e\x20\x65\x78\x70\x6f\x72\x74\x73\x3b\x0a\x7d\ +\x0a\x0a\ \x00\x00\x01\x1a\ \x28\ \x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x6f\x70\x74\x73\x29\x20\ @@ -432,320 +829,6 @@ \x20\x6f\x70\x74\x73\x29\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\ \x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x70\x61\x67\x65\x3b\x0a\ \x7d\x3b\x0a\ -\x00\x00\x13\x7d\ -\x2f\ -\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ -\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ -\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x77\x69\ -\x6e\x64\x6f\x77\x3a\x74\x72\x75\x65\x2c\x70\x68\x61\x6e\x74\x6f\ -\x6d\x3a\x74\x72\x75\x65\x2c\x66\x73\x3a\x74\x72\x75\x65\x20\x2a\ -\x2f\x0a\x0a\x2f\x2a\x0a\x20\x20\x54\x68\x69\x73\x20\x66\x69\x6c\ -\x65\x20\x69\x73\x20\x70\x61\x72\x74\x20\x6f\x66\x20\x74\x68\x65\ -\x20\x50\x68\x61\x6e\x74\x6f\x6d\x4a\x53\x20\x70\x72\x6f\x6a\x65\ -\x63\x74\x20\x66\x72\x6f\x6d\x20\x4f\x66\x69\x20\x4c\x61\x62\x73\ -\x2e\x0a\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\ -\x43\x29\x20\x32\x30\x31\x31\x20\x49\x76\x61\x6e\x20\x44\x65\x20\ -\x4d\x61\x72\x69\x6e\x6f\x20\x3c\x69\x76\x61\x6e\x2e\x64\x65\x2e\ -\x6d\x61\x72\x69\x6e\x6f\x40\x67\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\ -\x3e\x0a\x0a\x20\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\ -\x69\x6f\x6e\x20\x61\x6e\x64\x20\x75\x73\x65\x20\x69\x6e\x20\x73\ -\x6f\x75\x72\x63\x65\x20\x61\x6e\x64\x20\x62\x69\x6e\x61\x72\x79\ -\x20\x66\x6f\x72\x6d\x73\x2c\x20\x77\x69\x74\x68\x20\x6f\x72\x20\ -\x77\x69\x74\x68\x6f\x75\x74\x0a\x20\x20\x6d\x6f\x64\x69\x66\x69\ -\x63\x61\x74\x69\x6f\x6e\x2c\x20\x61\x72\x65\x20\x70\x65\x72\x6d\ -\x69\x74\x74\x65\x64\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\x74\ -\x68\x61\x74\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\ -\x67\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x72\x65\ -\x20\x6d\x65\x74\x3a\x0a\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\x64\ -\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\x6f\x66\x20\ -\x73\x6f\x75\x72\x63\x65\x20\x63\x6f\x64\x65\x20\x6d\x75\x73\x74\ -\x20\x72\x65\x74\x61\x69\x6e\x20\x74\x68\x65\x20\x61\x62\x6f\x76\ -\x65\x20\x63\x6f\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\ -\x20\x20\x6e\x6f\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\ -\x69\x73\x74\x20\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\ -\x73\x20\x61\x6e\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\ -\x69\x6e\x67\x20\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x2e\x0a\ -\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\ -\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x62\x69\x6e\x61\x72\x79\x20\ -\x66\x6f\x72\x6d\x20\x6d\x75\x73\x74\x20\x72\x65\x70\x72\x6f\x64\ -\x75\x63\x65\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\ -\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\ -\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\ -\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\ -\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\ -\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x20\x69\x6e\x20\x74\x68\ -\x65\x0a\x20\x20\x20\x20\x20\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\ -\x61\x74\x69\x6f\x6e\x20\x61\x6e\x64\x2f\x6f\x72\x20\x6f\x74\x68\ -\x65\x72\x20\x6d\x61\x74\x65\x72\x69\x61\x6c\x73\x20\x70\x72\x6f\ -\x76\x69\x64\x65\x64\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x64\ -\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x2e\x0a\x20\x20\x20\ -\x20\x2a\x20\x4e\x65\x69\x74\x68\x65\x72\x20\x74\x68\x65\x20\x6e\ -\x61\x6d\x65\x20\x6f\x66\x20\x74\x68\x65\x20\x3c\x6f\x72\x67\x61\ -\x6e\x69\x7a\x61\x74\x69\x6f\x6e\x3e\x20\x6e\x6f\x72\x20\x74\x68\ -\x65\x0a\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x73\x20\x6f\x66\ -\x20\x69\x74\x73\x20\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\x6f\x72\ -\x73\x20\x6d\x61\x79\x20\x62\x65\x20\x75\x73\x65\x64\x20\x74\x6f\ -\x20\x65\x6e\x64\x6f\x72\x73\x65\x20\x6f\x72\x20\x70\x72\x6f\x6d\ -\x6f\x74\x65\x20\x70\x72\x6f\x64\x75\x63\x74\x73\x0a\x20\x20\x20\ -\x20\x20\x20\x64\x65\x72\x69\x76\x65\x64\x20\x66\x72\x6f\x6d\x20\ -\x74\x68\x69\x73\x20\x73\x6f\x66\x74\x77\x61\x72\x65\x20\x77\x69\ -\x74\x68\x6f\x75\x74\x20\x73\x70\x65\x63\x69\x66\x69\x63\x20\x70\ -\x72\x69\x6f\x72\x20\x77\x72\x69\x74\x74\x65\x6e\x20\x70\x65\x72\ -\x6d\x69\x73\x73\x69\x6f\x6e\x2e\x0a\x0a\x20\x20\x54\x48\x49\x53\ -\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x20\x49\x53\x20\x50\x52\x4f\ -\x56\x49\x44\x45\x44\x20\x42\x59\x20\x54\x48\x45\x20\x43\x4f\x50\ -\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\x53\x20\x41\ -\x4e\x44\x20\x43\x4f\x4e\x54\x52\x49\x42\x55\x54\x4f\x52\x53\x20\ -\x22\x41\x53\x20\x49\x53\x22\x0a\x20\x20\x41\x4e\x44\x20\x41\x4e\ -\x59\x20\x45\x58\x50\x52\x45\x53\x53\x20\x4f\x52\x20\x49\x4d\x50\ -\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\x54\x49\x45\x53\x2c\ -\x20\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\ -\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\ -\x54\x48\x45\x0a\x20\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\ -\x52\x52\x41\x4e\x54\x49\x45\x53\x20\x4f\x46\x20\x4d\x45\x52\x43\ -\x48\x41\x4e\x54\x41\x42\x49\x4c\x49\x54\x59\x20\x41\x4e\x44\x20\ -\x46\x49\x54\x4e\x45\x53\x53\x20\x46\x4f\x52\x20\x41\x20\x50\x41\ -\x52\x54\x49\x43\x55\x4c\x41\x52\x20\x50\x55\x52\x50\x4f\x53\x45\ -\x0a\x20\x20\x41\x52\x45\x20\x44\x49\x53\x43\x4c\x41\x49\x4d\x45\ -\x44\x2e\x20\x49\x4e\x20\x4e\x4f\x20\x45\x56\x45\x4e\x54\x20\x53\ -\x48\x41\x4c\x4c\x20\x3c\x43\x4f\x50\x59\x52\x49\x47\x48\x54\x20\ -\x48\x4f\x4c\x44\x45\x52\x3e\x20\x42\x45\x20\x4c\x49\x41\x42\x4c\ -\x45\x20\x46\x4f\x52\x20\x41\x4e\x59\x0a\x20\x20\x44\x49\x52\x45\ -\x43\x54\x2c\x20\x49\x4e\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\ -\x43\x49\x44\x45\x4e\x54\x41\x4c\x2c\x20\x53\x50\x45\x43\x49\x41\ -\x4c\x2c\x20\x45\x58\x45\x4d\x50\x4c\x41\x52\x59\x2c\x20\x4f\x52\ -\x20\x43\x4f\x4e\x53\x45\x51\x55\x45\x4e\x54\x49\x41\x4c\x20\x44\ -\x41\x4d\x41\x47\x45\x53\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\ -\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\ -\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x50\x52\x4f\x43\x55\x52\x45\ -\x4d\x45\x4e\x54\x20\x4f\x46\x20\x53\x55\x42\x53\x54\x49\x54\x55\ -\x54\x45\x20\x47\x4f\x4f\x44\x53\x20\x4f\x52\x20\x53\x45\x52\x56\ -\x49\x43\x45\x53\x3b\x0a\x20\x20\x4c\x4f\x53\x53\x20\x4f\x46\x20\ -\x55\x53\x45\x2c\x20\x44\x41\x54\x41\x2c\x20\x4f\x52\x20\x50\x52\ -\x4f\x46\x49\x54\x53\x3b\x20\x4f\x52\x20\x42\x55\x53\x49\x4e\x45\ -\x53\x53\x20\x49\x4e\x54\x45\x52\x52\x55\x50\x54\x49\x4f\x4e\x29\ -\x20\x48\x4f\x57\x45\x56\x45\x52\x20\x43\x41\x55\x53\x45\x44\x20\ -\x41\x4e\x44\x0a\x20\x20\x4f\x4e\x20\x41\x4e\x59\x20\x54\x48\x45\ -\x4f\x52\x59\x20\x4f\x46\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\ -\x2c\x20\x57\x48\x45\x54\x48\x45\x52\x20\x49\x4e\x20\x43\x4f\x4e\ -\x54\x52\x41\x43\x54\x2c\x20\x53\x54\x52\x49\x43\x54\x20\x4c\x49\ -\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x4f\x52\x20\x54\x4f\x52\x54\ -\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x20\x4e\x45\ -\x47\x4c\x49\x47\x45\x4e\x43\x45\x20\x4f\x52\x20\x4f\x54\x48\x45\ -\x52\x57\x49\x53\x45\x29\x20\x41\x52\x49\x53\x49\x4e\x47\x20\x49\ -\x4e\x20\x41\x4e\x59\x20\x57\x41\x59\x20\x4f\x55\x54\x20\x4f\x46\ -\x20\x54\x48\x45\x20\x55\x53\x45\x20\x4f\x46\x0a\x20\x20\x54\x48\ -\x49\x53\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x2c\x20\x45\x56\x45\ -\x4e\x20\x49\x46\x20\x41\x44\x56\x49\x53\x45\x44\x20\x4f\x46\x20\ -\x54\x48\x45\x20\x50\x4f\x53\x53\x49\x42\x49\x4c\x49\x54\x59\x20\ -\x4f\x46\x20\x53\x55\x43\x48\x20\x44\x41\x4d\x41\x47\x45\x2e\x0a\ -\x2a\x2f\x0a\x0a\x2f\x2f\x20\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\ -\x0a\x2f\x2f\x20\x4a\x61\x76\x61\x53\x63\x72\x69\x70\x74\x20\x22\ -\x73\x68\x69\x6d\x22\x20\x74\x6f\x20\x74\x68\x72\x6f\x77\x20\x65\ -\x78\x63\x65\x70\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x63\x61\x73\ -\x65\x20\x61\x20\x63\x72\x69\x74\x69\x63\x61\x6c\x20\x6f\x70\x65\ -\x72\x61\x74\x69\x6f\x6e\x20\x66\x61\x69\x6c\x73\x2e\x0a\x0a\x2f\ -\x2a\x2a\x20\x4f\x70\x65\x6e\x20\x61\x6e\x64\x20\x72\x65\x74\x75\ -\x72\x6e\x20\x61\x20\x22\x66\x69\x6c\x65\x22\x20\x6f\x62\x6a\x65\ -\x63\x74\x2e\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\ -\x68\x72\x6f\x77\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\ -\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\ -\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\ -\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\x74\ -\x6f\x20\x6f\x70\x65\x6e\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\ -\x20\x6d\x6f\x64\x65\x20\x4f\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\ -\x20\x41\x20\x73\x74\x72\x69\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\ -\x66\x20\x27\x72\x27\x2c\x20\x27\x77\x27\x2c\x20\x27\x61\x2f\x2b\ -\x27\x20\x63\x68\x61\x72\x61\x63\x74\x65\x72\x73\x2e\x0a\x20\x2a\ -\x20\x40\x72\x65\x74\x75\x72\x6e\x20\x22\x66\x69\x6c\x65\x22\x20\ -\x6f\x62\x6a\x65\x63\x74\x0a\x20\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\ -\x77\x2e\x66\x73\x2e\x6f\x70\x65\x6e\x20\x3d\x20\x66\x75\x6e\x63\ -\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\x64\x65\ -\x29\x20\x7b\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x66\x69\x6c\x65\ -\x20\x3d\x20\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x5f\x6f\x70\ -\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\x64\x65\x29\x3b\x0a\ -\x20\x20\x20\x20\x69\x66\x20\x28\x66\x69\x6c\x65\x29\x20\x7b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x66\ -\x69\x6c\x65\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x74\ -\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\ -\x6f\x70\x65\x6e\x20\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\ -\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\x7d\x3b\x0a\x0a\x2f\ -\x2a\x2a\x20\x4f\x70\x65\x6e\x2c\x20\x72\x65\x61\x64\x20\x61\x6e\ -\x64\x20\x72\x65\x74\x75\x72\x6e\x20\x63\x6f\x6e\x74\x65\x6e\x74\ -\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\x20\x49\ -\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\ -\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\ -\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\ -\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\ -\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\ -\x64\x20\x66\x72\x6f\x6d\x0a\x20\x2a\x20\x40\x72\x65\x74\x75\x72\ -\x6e\x20\x66\x69\x6c\x65\x20\x63\x6f\x6e\x74\x65\x6e\x74\x0a\x20\ -\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x72\x65\x61\ -\x64\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\ -\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x66\x20\ -\x3d\x20\x66\x73\x2e\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\ -\x27\x72\x27\x29\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\ -\x6e\x74\x65\x6e\x74\x20\x3d\x20\x66\x2e\x72\x65\x61\x64\x28\x29\ -\x3b\x0a\x0a\x20\x20\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\ -\x3b\x0a\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x63\x6f\x6e\ -\x74\x65\x6e\x74\x3b\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x4f\x70\ -\x65\x6e\x20\x61\x6e\x64\x20\x77\x72\x69\x74\x65\x20\x63\x6f\x6e\ -\x74\x65\x6e\x74\x20\x74\x6f\x20\x61\x20\x66\x69\x6c\x65\x0a\x20\ -\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\ -\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\ -\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\ -\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\ -\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\ -\x72\x65\x61\x64\x20\x66\x72\x6f\x6d\x0a\x20\x2a\x20\x40\x70\x61\ -\x72\x61\x6d\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x43\x6f\x6e\x74\ -\x65\x6e\x74\x20\x74\x6f\x20\x77\x72\x69\x74\x65\x20\x74\x6f\x20\ -\x74\x68\x65\x20\x66\x69\x6c\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\ -\x61\x6d\x20\x6d\x6f\x64\x65\x20\x4f\x70\x65\x6e\x20\x4d\x6f\x64\ -\x65\x2e\x20\x41\x20\x73\x74\x72\x69\x6e\x67\x20\x6d\x61\x64\x65\ -\x20\x6f\x66\x20\x27\x77\x27\x20\x6f\x72\x20\x27\x61\x20\x2f\x20\ -\x2b\x27\x20\x63\x68\x61\x72\x61\x63\x74\x65\x72\x73\x2e\x0a\x20\ -\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x77\x72\x69\ -\x74\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\ -\x61\x74\x68\x2c\x20\x63\x6f\x6e\x74\x65\x6e\x74\x2c\x20\x6d\x6f\ -\x64\x65\x29\x20\x7b\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x66\x20\ -\x3d\x20\x66\x73\x2e\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\ -\x6d\x6f\x64\x65\x29\x3b\x0a\x0a\x20\x20\x20\x20\x66\x2e\x77\x72\ -\x69\x74\x65\x28\x63\x6f\x6e\x74\x65\x6e\x74\x29\x3b\x0a\x20\x20\ -\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\x7d\x3b\x0a\ -\x0a\x2f\x2a\x2a\x20\x52\x65\x74\x75\x72\x6e\x20\x74\x68\x65\x20\ -\x73\x69\x7a\x65\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2c\x20\ -\x69\x6e\x20\x62\x79\x74\x65\x73\x2e\x0a\x20\x2a\x20\x49\x74\x20\ -\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\ -\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\ -\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\ -\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\ -\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\ -\x74\x68\x65\x20\x73\x69\x7a\x65\x20\x6f\x66\x0a\x20\x2a\x20\x40\ -\x72\x65\x74\x75\x72\x6e\x20\x46\x69\x6c\x65\x20\x73\x69\x7a\x65\ -\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x0a\x20\x2a\x2f\x0a\x77\x69\ -\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x73\x69\x7a\x65\x20\x3d\x20\x66\ -\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\ -\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x73\x69\x7a\x65\x20\x3d\x20\ -\x66\x73\x2e\x5f\x73\x69\x7a\x65\x28\x70\x61\x74\x68\x29\x3b\x0a\ -\x20\x20\x20\x20\x69\x66\x20\x28\x73\x69\x7a\x65\x20\x21\x3d\x3d\ -\x20\x2d\x31\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\ -\x65\x74\x75\x72\x6e\x20\x73\x69\x7a\x65\x3b\x0a\x20\x20\x20\x20\ -\x7d\x0a\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\ -\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\x66\x69\x6c\x65\ -\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\x27\x20\ -\x73\x69\x7a\x65\x22\x3b\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x43\ -\x6f\x70\x79\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\x20\x49\ -\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\ -\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\ -\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\ -\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\x74\x68\x20\ -\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\x20\x66\x69\ -\x6c\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x64\x65\x73\ -\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\x6f\x66\ -\x20\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\ -\x20\x66\x69\x6c\x65\x0a\x20\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\ -\x2e\x66\x73\x2e\x63\x6f\x70\x79\x20\x3d\x20\x66\x75\x6e\x63\x74\ -\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\ -\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\x0a\x09\x69\x66\x20\ -\x28\x21\x66\x73\x2e\x5f\x63\x6f\x70\x79\x28\x73\x6f\x75\x72\x63\ -\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x29\ -\x20\x7b\x0a\x09\x09\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\ -\x6c\x65\x20\x74\x6f\x20\x63\x6f\x70\x79\x20\x66\x69\x6c\x65\x20\ -\x27\x22\x20\x2b\x20\x73\x6f\x75\x72\x63\x65\x20\x2b\x20\x22\x27\ -\x20\x61\x74\x20\x27\x22\x20\x2b\x20\x64\x65\x73\x74\x69\x6e\x61\ -\x74\x69\x6f\x6e\x20\x2b\x20\x22\x27\x22\x3b\x0a\x09\x7d\x0a\x7d\ -\x3b\x0a\x0a\x2f\x2a\x2a\x20\x43\x6f\x70\x79\x20\x61\x20\x64\x69\ -\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x2e\x0a\x20\x2a\ -\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\ -\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\ -\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\ -\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\x74\ -\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\x20\ -\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x0a\x20\ -\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\ -\x74\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\ -\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x64\x69\x72\ -\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x0a\x20\x2a\x2f\x0a\ -\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x63\x6f\x70\x79\x54\x72\ -\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x73\ -\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\ -\x6f\x6e\x29\x20\x7b\x0a\x09\x69\x66\x20\x28\x21\x66\x73\x2e\x5f\ -\x63\x6f\x70\x79\x54\x72\x65\x65\x28\x73\x6f\x75\x72\x63\x65\x2c\ -\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x29\x20\x7b\ -\x0a\x09\x09\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\ -\x20\x74\x6f\x20\x63\x6f\x70\x79\x20\x64\x69\x72\x65\x63\x74\x6f\ -\x72\x79\x20\x74\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x73\x6f\x75\ -\x72\x63\x65\x20\x2b\x20\x22\x27\x20\x61\x74\x20\x27\x22\x20\x2b\ -\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x2b\x20\x22\ -\x27\x22\x3b\x0a\x09\x7d\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x4d\ -\x6f\x76\x65\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\x20\x49\ -\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\ -\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\ -\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\ -\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\x74\x68\x20\ -\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\x20\x66\x69\ -\x6c\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x64\x65\x73\ -\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\x6f\x66\ -\x20\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\ -\x20\x66\x69\x6c\x65\x0a\x20\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\ -\x2e\x66\x73\x2e\x6d\x6f\x76\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\ -\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\ -\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\x0a\x09\x66\x73\x2e\ -\x63\x6f\x70\x79\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\ -\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x3b\x0a\x09\x66\x73\x2e\x72\ -\x65\x6d\x6f\x76\x65\x28\x73\x6f\x75\x72\x63\x65\x29\x3b\x0a\x7d\ -\x3b\x0a\x0a\x2f\x2a\x2a\x20\x52\x65\x6d\x6f\x76\x65\x73\x20\x61\ -\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\ -\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\ -\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\ -\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\ -\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\ -\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\ -\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x72\x65\x6d\ -\x6f\x76\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\ -\x70\x61\x74\x68\x29\x20\x7b\x0a\x09\x69\x66\x20\x28\x21\x66\x73\ -\x2e\x5f\x72\x65\x6d\x6f\x76\x65\x28\x70\x61\x74\x68\x29\x29\x20\ -\x7b\x0a\x09\x09\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\ -\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x66\x69\x6c\x65\ -\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\x27\x22\ -\x3b\x0a\x09\x7d\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x52\x65\x6d\ -\x6f\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\ -\x2e\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\ -\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\ -\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\ -\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\ -\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x69\x72\x65\x63\ -\x74\x6f\x72\x79\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\ -\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x72\x65\x6d\ -\x6f\x76\x65\x44\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x3d\x20\x66\ -\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\ -\x0a\x09\x69\x66\x20\x28\x21\x66\x73\x2e\x5f\x72\x65\x6d\x6f\x76\ -\x65\x44\x69\x72\x65\x63\x74\x6f\x72\x79\x28\x70\x61\x74\x68\x29\ -\x29\x20\x7b\x0a\x09\x09\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\ -\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\x69\ -\x72\x65\x63\x74\x6f\x72\x79\x20\x27\x22\x20\x2b\x20\x70\x61\x74\ -\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\x09\x7d\x0a\x7d\x3b\x0a\x0a\ -\x2f\x2a\x2a\x20\x52\x65\x6d\x6f\x76\x65\x73\x20\x61\x20\x64\x69\ -\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x2e\x0a\x20\x2a\ -\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\ -\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\ -\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\ -\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\ -\x6f\x66\x20\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\ -\x20\x74\x72\x65\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\ -\x20\x2a\x2f\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x66\x73\x2e\x72\x65\ -\x6d\x6f\x76\x65\x54\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\ -\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x09\x69\x66\ -\x20\x28\x21\x66\x73\x2e\x5f\x72\x65\x6d\x6f\x76\x65\x54\x72\x65\ -\x65\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x09\x09\x74\x68\x72\ -\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\ -\x6d\x6f\x76\x65\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\ -\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\ -\x22\x27\x22\x3b\x0a\x09\x7d\x0a\x7d\x3b\x0a\x0a\x77\x69\x6e\x64\ -\x6f\x77\x2e\x66\x73\x2e\x74\x6f\x75\x63\x68\x20\x3d\x20\x66\x75\ -\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\ -\x09\x66\x73\x2e\x77\x72\x69\x74\x65\x28\x70\x61\x74\x68\x2c\x20\ -\x22\x22\x2c\x20\x27\x61\x27\x29\x3b\x0a\x7d\x3b\ \x00\x00\x56\x27\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -4922,6 +5005,10 @@ " qt_resource_name = "\ +\x00\x0c\ +\x06\xa4\xe2\x53\ +\x00\x62\ +\x00\x6f\x00\x6f\x00\x74\x00\x73\x00\x74\x00\x72\x00\x61\x00\x70\x00\x2e\x00\x6a\x00\x73\ \x00\x0f\ \x01\x28\x25\x93\ \x00\x63\ @@ -4930,11 +5017,6 @@ \x0b\x21\xdb\x73\ \x00\x77\ \x00\x65\x00\x62\x00\x70\x00\x61\x00\x67\x00\x65\x00\x2d\x00\x73\x00\x68\x00\x69\x00\x6d\x00\x2e\x00\x6a\x00\x73\ -\x00\x12\ -\x03\xfa\x57\x73\ -\x00\x66\ -\x00\x69\x00\x6c\x00\x65\x00\x73\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x73\x00\x68\x00\x69\x00\x6d\x00\x2e\x00\x6a\ -\x00\x73\ \x00\x09\ \x0a\x6c\x78\x43\ \x00\x72\ @@ -4952,12 +5034,12 @@ qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x01\ +\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x18\xa7\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x16\ -\x00\x00\x00\x72\x00\x02\x00\x00\x00\x02\x00\x00\x00\x05\ -\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x01\x1e\ -\x00\x00\x00\xb8\x00\x01\x00\x00\x00\x01\x00\x00\x83\xc2\ -\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x2d\x97\ +\x00\x00\x00\x66\x00\x02\x00\x00\x00\x02\x00\x00\x00\x05\ +\x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x19\xc5\ +\x00\x00\x00\xac\x00\x01\x00\x00\x00\x01\x00\x00\x88\xe8\ +\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x32\xbd\ " def qInitResources(): From 0a25130e5710453947ca2fda430e4d08adb1ab2c Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 9 Sep 2011 00:48:10 -0700 Subject: [PATCH 10/18] Implement require('webpage'). window.WebPage still works, it is not recommended and will be deprecated. http://code.google.com/p/phantomjs/issues/detail?id=47 --- python/pyphantomjs/bootstrap.js | 192 ++++++++++++++++++++++++++--- python/pyphantomjs/phantom.py | 1 - python/pyphantomjs/resources.qrc | 1 - python/pyphantomjs/webpage-shim.js | 147 ---------------------- 4 files changed, 173 insertions(+), 168 deletions(-) diff --git a/python/pyphantomjs/bootstrap.js b/python/pyphantomjs/bootstrap.js index c85a09824b..1de4c5b54a 100644 --- a/python/pyphantomjs/bootstrap.js +++ b/python/pyphantomjs/bootstrap.js @@ -4,7 +4,10 @@ /* This file is part of the PhantomJS project from Ofi Labs. + Copyright (C) 2011 Ariya Hidayat Copyright (C) 2011 Ivan De Marino + Copyright (C) 2011 James Roe + Copyright (C) 2011 execjosh, http://execjosh.blogspot.com Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -30,10 +33,159 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -function require (name) { +function require(name) { var exports; + if (name === 'webpage') { + + exports = function (opts) { + var page = phantom.createWebPage(), + handlers = {}; + + function checkType(o, type) { + return typeof o === type; + } + + function isObject(o) { + return checkType(o, 'object'); + } + + function isUndefined(o) { + return checkType(o, 'undefined'); + } + + function isUndefinedOrNull(o) { + return isUndefined(o) || null === o; + } + + function copyInto(target, source) { + if (target === source || isUndefinedOrNull(source)) { + return target; + } + + target = target || {}; + + // Copy into objects only + if (isObject(target)) { + // Make sure source exists + source = source || {}; + + if (isObject(source)) { + var i, newTarget, newSource; + for (i in source) { + if (source.hasOwnProperty(i)) { + newTarget = target[i]; + newSource = source[i]; + + if (newTarget && isObject(newSource)) { + // Deep copy + newTarget = copyInto(target[i], newSource); + } else { + newTarget = newSource; + } + + if (!isUndefined(newTarget)) { + target[i] = newTarget; + } + } + } + } else { + target = source; + } + } + + return target; + } + + function defineSetter(handlerName, signalName) { + page.__defineSetter__(handlerName, function (f) { + if (handlers && typeof handlers[signalName] === 'function') { + try { + this[signalName].disconnect(handlers[signalName]); + } catch (e) {} + } + handlers[signalName] = f; + this[signalName].connect(handlers[signalName]); + }); + } + + // deep copy + page.settings = JSON.parse(JSON.stringify(phantom.defaultPageSettings)); + + defineSetter("onInitialized", "initialized"); + + defineSetter("onLoadStarted", "loadStarted"); + + defineSetter("onLoadFinished", "loadFinished"); + + defineSetter("onResourceRequested", "resourceRequested"); + + defineSetter("onResourceReceived", "resourceReceived"); + + defineSetter("onAlert", "javaScriptAlertSent"); + + defineSetter("onConsoleMessage", "javaScriptConsoleMessageSent"); + + page.open = function (url, arg1, arg2, arg3, arg4) { + if (arguments.length === 1) { + this.openUrl(url, 'get', this.settings); + return; + } + if (arguments.length === 2 && typeof arg1 === 'function') { + this.onLoadFinished = arg1; + this.openUrl(url, 'get', this.settings); + return; + } else if (arguments.length === 2) { + this.openUrl(url, arg1, this.settings); + return; + } else if (arguments.length === 3 && typeof arg2 === 'function') { + this.onLoadFinished = arg2; + this.openUrl(url, arg1, this.settings); + return; + } else if (arguments.length === 3) { + this.openUrl(url, { + operation: arg1, + data: arg2 + }, this.settings); + return; + } else if (arguments.length === 4) { + this.onLoadFinished = arg3; + this.openUrl(url, { + operation: arg1, + data: arg2 + }, this.settings); + return; + } + throw "Wrong use of WebPage#open"; + }; + + page.includeJs = function (scriptUrl, onScriptLoaded) { + // Register temporary signal handler for 'alert()' + this.javaScriptAlertSent.connect(function (msgFromAlert) { + if (msgFromAlert === scriptUrl) { + // Resource loaded, time to fire the callback + onScriptLoaded(scriptUrl); + // And disconnect the signal handler + try { + this.javaScriptAlertSent.disconnect(arguments.callee); + } catch (e) {} + } + }); + + // Append the script tag to the body + this._appendScriptElement(scriptUrl); + }; + + // Copy options into page + if (opts) { + page = copyInto(page, opts); + } + + return page; + }; + } + if (name === 'fs') { exports = phantom.createFilesystem(); @@ -104,9 +256,9 @@ function require (name) { * @param destination Path of the destination file */ exports.copy = function (source, destination) { - if (!fs._copy(source, destination)) { - throw "Unable to copy file '" + source + "' at '" + destination + "'"; - } + if (!fs._copy(source, destination)) { + throw "Unable to copy file '" + source + "' at '" + destination + "'"; + } }; /** Copy a directory tree. @@ -116,9 +268,9 @@ function require (name) { * @param destination Path of the destination directory tree */ exports.copyTree = function (source, destination) { - if (!fs._copyTree(source, destination)) { - throw "Unable to copy directory tree '" + source + "' at '" + destination + "'"; - } + if (!fs._copyTree(source, destination)) { + throw "Unable to copy directory tree '" + source + "' at '" + destination + "'"; + } }; /** Move a file. @@ -128,8 +280,8 @@ function require (name) { * @param destination Path of the destination file */ exports.move = function (source, destination) { - fs.copy(source, destination); - fs.remove(source); + fs.copy(source, destination); + fs.remove(source); }; /** Removes a file. @@ -138,9 +290,9 @@ function require (name) { * @param path Path of the file to remove */ exports.remove = function (path) { - if (!fs._remove(path)) { - throw "Unable to remove file '" + path + "'"; - } + if (!fs._remove(path)) { + throw "Unable to remove file '" + path + "'"; + } }; /** Removes a directory. @@ -149,9 +301,9 @@ function require (name) { * @param path Path of the directory to remove */ exports.removeDirectory = function (path) { - if (!fs._removeDirectory(path)) { - throw "Unable to remove directory '" + path + "'"; - } + if (!fs._removeDirectory(path)) { + throw "Unable to remove directory '" + path + "'"; + } }; /** Removes a directory tree. @@ -160,13 +312,13 @@ function require (name) { * @param path Path of the directory tree to remove */ exports.removeTree = function (path) { - if (!fs._removeTree(path)) { - throw "Unable to remove directory tree '" + path + "'"; - } + if (!fs._removeTree(path)) { + throw "Unable to remove directory tree '" + path + "'"; + } }; exports.touch = function (path) { - fs.write(path, "", 'a'); + fs.write(path, "", 'a'); }; } @@ -178,3 +330,5 @@ function require (name) { return exports; } +// Legacy way to use WebPage +window.WebPage = require('webpage'); diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 0822427ee2..1608228a49 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -85,7 +85,6 @@ def __init__(self, parent, args): jsShims = ( ':/bootstrap.js', - ':/webpage-shim.js' ) for shim in jsShims: f = QFile(shim) diff --git a/python/pyphantomjs/resources.qrc b/python/pyphantomjs/resources.qrc index 71e32e42f3..1f048f48fc 100644 --- a/python/pyphantomjs/resources.qrc +++ b/python/pyphantomjs/resources.qrc @@ -2,7 +2,6 @@ bootstrap.js configurator.js - webpage-shim.js resources/coffee-script.js resources/pyphantomjs-icon.png diff --git a/python/pyphantomjs/webpage-shim.js b/python/pyphantomjs/webpage-shim.js index d8a5fd266e..c426997479 100644 --- a/python/pyphantomjs/webpage-shim.js +++ b/python/pyphantomjs/webpage-shim.js @@ -33,150 +33,3 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// This allows creating a new web page using the construct "new WebPage", -// which feels more natural than "phantom.createWebPage()". -window.WebPage = function (opts) { - var page = phantom.createWebPage(), - handlers = {}; - - function checkType(o, type) { - return typeof o === type; - } - - function isObject(o) { - return checkType(o, 'object'); - } - - function isUndefined(o) { - return checkType(o, 'undefined'); - } - - function isUndefinedOrNull(o) { - return isUndefined(o) || null === o; - } - - function copyInto(target, source) { - if (target === source || isUndefinedOrNull(source)) { - return target; - } - - target = target || {}; - - // Copy into objects only - if (isObject(target)) { - // Make sure source exists - source = source || {}; - - if (isObject(source)) { - var i, newTarget, newSource; - for (i in source) { - if (source.hasOwnProperty(i)) { - newTarget = target[i]; - newSource = source[i]; - - if (newTarget && isObject(newSource)) { - // Deep copy - newTarget = copyInto(target[i], newSource); - } else { - newTarget = newSource; - } - - if (!isUndefined(newTarget)) { - target[i] = newTarget; - } - } - } - } else { - target = source; - } - } - - return target; - } - - function defineSetter(handlerName, signalName) { - page.__defineSetter__(handlerName, function (f) { - if (handlers && typeof handlers[signalName] === 'function') { - try { - this[signalName].disconnect(handlers[signalName]); - } catch (e) {} - } - handlers[signalName] = f; - this[signalName].connect(handlers[signalName]); - }); - } - - // deep copy - page.settings = JSON.parse(JSON.stringify(phantom.defaultPageSettings)); - - defineSetter("onInitialized", "initialized"); - - defineSetter("onLoadStarted", "loadStarted"); - - defineSetter("onLoadFinished", "loadFinished"); - - defineSetter("onResourceRequested", "resourceRequested"); - - defineSetter("onResourceReceived", "resourceReceived"); - - defineSetter("onAlert", "javaScriptAlertSent"); - - defineSetter("onConsoleMessage", "javaScriptConsoleMessageSent"); - - page.open = function (url, arg1, arg2, arg3, arg4) { - if (arguments.length === 1) { - this.openUrl(url, 'get', this.settings); - return; - } - if (arguments.length === 2 && typeof arg1 === 'function') { - this.onLoadFinished = arg1; - this.openUrl(url, 'get', this.settings); - return; - } else if (arguments.length === 2) { - this.openUrl(url, arg1, this.settings); - return; - } else if (arguments.length === 3 && typeof arg2 === 'function') { - this.onLoadFinished = arg2; - this.openUrl(url, arg1, this.settings); - return; - } else if (arguments.length === 3) { - this.openUrl(url, { - operation: arg1, - data: arg2 - }, this.settings); - return; - } else if (arguments.length === 4) { - this.onLoadFinished = arg3; - this.openUrl(url, { - operation: arg1, - data: arg2 - }, this.settings); - return; - } - throw "Wrong use of WebPage#open"; - }; - - page.includeJs = function (scriptUrl, onScriptLoaded) { - // Register temporary signal handler for 'alert()' - this.javaScriptAlertSent.connect(function (msgFromAlert) { - if (msgFromAlert === scriptUrl) { - // Resource loaded, time to fire the callback - onScriptLoaded(scriptUrl); - // And disconnect the signal handler - try { - this.javaScriptAlertSent.disconnect(arguments.callee); - } catch (e) {} - } - }); - - // Append the script tag to the body - this._appendScriptElement(scriptUrl); - }; - - // Copy options into page - if (opts) { - page = copyInto(page, opts); - } - - return page; -}; From 6bba1715df5cc44409b11e0256f78f4f15f99ab3 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 9 Sep 2011 00:49:11 -0700 Subject: [PATCH 11/18] Regenerate resources --- python/pyphantomjs/resources.py | 1021 +++++++------------------------ 1 file changed, 210 insertions(+), 811 deletions(-) diff --git a/python/pyphantomjs/resources.py b/python/pyphantomjs/resources.py index 1320fa0d1b..0183b793ae 100644 --- a/python/pyphantomjs/resources.py +++ b/python/pyphantomjs/resources.py @@ -2,7 +2,7 @@ # Resource object code # -# Created: Thu Sep 8 15:53:15 2011 +# Created: Fri Sep 9 00:49:08 2011 # by: The Resource Compiler for PyQt (Qt v4.7.2) # # WARNING! All changes made in this file will be lost! @@ -10,403 +10,209 @@ from PyQt4 import QtCore qt_resource_data = "\ -\x00\x00\x18\xa3\ -\x2f\ -\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ -\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ -\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x77\x69\ -\x6e\x64\x6f\x77\x3a\x74\x72\x75\x65\x2c\x70\x68\x61\x6e\x74\x6f\ -\x6d\x3a\x74\x72\x75\x65\x2c\x66\x73\x3a\x74\x72\x75\x65\x20\x2a\ -\x2f\x0a\x0a\x2f\x2a\x0a\x20\x20\x54\x68\x69\x73\x20\x66\x69\x6c\ -\x65\x20\x69\x73\x20\x70\x61\x72\x74\x20\x6f\x66\x20\x74\x68\x65\ -\x20\x50\x68\x61\x6e\x74\x6f\x6d\x4a\x53\x20\x70\x72\x6f\x6a\x65\ -\x63\x74\x20\x66\x72\x6f\x6d\x20\x4f\x66\x69\x20\x4c\x61\x62\x73\ -\x2e\x0a\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\ -\x43\x29\x20\x32\x30\x31\x31\x20\x49\x76\x61\x6e\x20\x44\x65\x20\ -\x4d\x61\x72\x69\x6e\x6f\x20\x3c\x69\x76\x61\x6e\x2e\x64\x65\x2e\ -\x6d\x61\x72\x69\x6e\x6f\x40\x67\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\ -\x3e\x0a\x0a\x20\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\ -\x69\x6f\x6e\x20\x61\x6e\x64\x20\x75\x73\x65\x20\x69\x6e\x20\x73\ -\x6f\x75\x72\x63\x65\x20\x61\x6e\x64\x20\x62\x69\x6e\x61\x72\x79\ -\x20\x66\x6f\x72\x6d\x73\x2c\x20\x77\x69\x74\x68\x20\x6f\x72\x20\ -\x77\x69\x74\x68\x6f\x75\x74\x0a\x20\x20\x6d\x6f\x64\x69\x66\x69\ -\x63\x61\x74\x69\x6f\x6e\x2c\x20\x61\x72\x65\x20\x70\x65\x72\x6d\ -\x69\x74\x74\x65\x64\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\x74\ -\x68\x61\x74\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\ -\x67\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x72\x65\ -\x20\x6d\x65\x74\x3a\x0a\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\x64\ -\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\x6f\x66\x20\ -\x73\x6f\x75\x72\x63\x65\x20\x63\x6f\x64\x65\x20\x6d\x75\x73\x74\ -\x20\x72\x65\x74\x61\x69\x6e\x20\x74\x68\x65\x20\x61\x62\x6f\x76\ -\x65\x20\x63\x6f\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\ -\x20\x20\x6e\x6f\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\ -\x69\x73\x74\x20\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\ -\x73\x20\x61\x6e\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\ -\x69\x6e\x67\x20\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x2e\x0a\ -\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\ -\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x62\x69\x6e\x61\x72\x79\x20\ -\x66\x6f\x72\x6d\x20\x6d\x75\x73\x74\x20\x72\x65\x70\x72\x6f\x64\ -\x75\x63\x65\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\ -\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\ -\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\ -\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\ -\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\ -\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x20\x69\x6e\x20\x74\x68\ -\x65\x0a\x20\x20\x20\x20\x20\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\ -\x61\x74\x69\x6f\x6e\x20\x61\x6e\x64\x2f\x6f\x72\x20\x6f\x74\x68\ -\x65\x72\x20\x6d\x61\x74\x65\x72\x69\x61\x6c\x73\x20\x70\x72\x6f\ -\x76\x69\x64\x65\x64\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x64\ -\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x2e\x0a\x20\x20\x20\ -\x20\x2a\x20\x4e\x65\x69\x74\x68\x65\x72\x20\x74\x68\x65\x20\x6e\ -\x61\x6d\x65\x20\x6f\x66\x20\x74\x68\x65\x20\x3c\x6f\x72\x67\x61\ -\x6e\x69\x7a\x61\x74\x69\x6f\x6e\x3e\x20\x6e\x6f\x72\x20\x74\x68\ -\x65\x0a\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x73\x20\x6f\x66\ -\x20\x69\x74\x73\x20\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\x6f\x72\ -\x73\x20\x6d\x61\x79\x20\x62\x65\x20\x75\x73\x65\x64\x20\x74\x6f\ -\x20\x65\x6e\x64\x6f\x72\x73\x65\x20\x6f\x72\x20\x70\x72\x6f\x6d\ -\x6f\x74\x65\x20\x70\x72\x6f\x64\x75\x63\x74\x73\x0a\x20\x20\x20\ -\x20\x20\x20\x64\x65\x72\x69\x76\x65\x64\x20\x66\x72\x6f\x6d\x20\ -\x74\x68\x69\x73\x20\x73\x6f\x66\x74\x77\x61\x72\x65\x20\x77\x69\ -\x74\x68\x6f\x75\x74\x20\x73\x70\x65\x63\x69\x66\x69\x63\x20\x70\ -\x72\x69\x6f\x72\x20\x77\x72\x69\x74\x74\x65\x6e\x20\x70\x65\x72\ -\x6d\x69\x73\x73\x69\x6f\x6e\x2e\x0a\x0a\x20\x20\x54\x48\x49\x53\ -\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x20\x49\x53\x20\x50\x52\x4f\ -\x56\x49\x44\x45\x44\x20\x42\x59\x20\x54\x48\x45\x20\x43\x4f\x50\ -\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\x53\x20\x41\ -\x4e\x44\x20\x43\x4f\x4e\x54\x52\x49\x42\x55\x54\x4f\x52\x53\x20\ -\x22\x41\x53\x20\x49\x53\x22\x0a\x20\x20\x41\x4e\x44\x20\x41\x4e\ -\x59\x20\x45\x58\x50\x52\x45\x53\x53\x20\x4f\x52\x20\x49\x4d\x50\ -\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\x54\x49\x45\x53\x2c\ -\x20\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\ -\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\ -\x54\x48\x45\x0a\x20\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\ -\x52\x52\x41\x4e\x54\x49\x45\x53\x20\x4f\x46\x20\x4d\x45\x52\x43\ -\x48\x41\x4e\x54\x41\x42\x49\x4c\x49\x54\x59\x20\x41\x4e\x44\x20\ -\x46\x49\x54\x4e\x45\x53\x53\x20\x46\x4f\x52\x20\x41\x20\x50\x41\ -\x52\x54\x49\x43\x55\x4c\x41\x52\x20\x50\x55\x52\x50\x4f\x53\x45\ -\x0a\x20\x20\x41\x52\x45\x20\x44\x49\x53\x43\x4c\x41\x49\x4d\x45\ -\x44\x2e\x20\x49\x4e\x20\x4e\x4f\x20\x45\x56\x45\x4e\x54\x20\x53\ -\x48\x41\x4c\x4c\x20\x3c\x43\x4f\x50\x59\x52\x49\x47\x48\x54\x20\ -\x48\x4f\x4c\x44\x45\x52\x3e\x20\x42\x45\x20\x4c\x49\x41\x42\x4c\ -\x45\x20\x46\x4f\x52\x20\x41\x4e\x59\x0a\x20\x20\x44\x49\x52\x45\ -\x43\x54\x2c\x20\x49\x4e\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\ -\x43\x49\x44\x45\x4e\x54\x41\x4c\x2c\x20\x53\x50\x45\x43\x49\x41\ -\x4c\x2c\x20\x45\x58\x45\x4d\x50\x4c\x41\x52\x59\x2c\x20\x4f\x52\ -\x20\x43\x4f\x4e\x53\x45\x51\x55\x45\x4e\x54\x49\x41\x4c\x20\x44\ -\x41\x4d\x41\x47\x45\x53\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\ -\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\ -\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x50\x52\x4f\x43\x55\x52\x45\ -\x4d\x45\x4e\x54\x20\x4f\x46\x20\x53\x55\x42\x53\x54\x49\x54\x55\ -\x54\x45\x20\x47\x4f\x4f\x44\x53\x20\x4f\x52\x20\x53\x45\x52\x56\ -\x49\x43\x45\x53\x3b\x0a\x20\x20\x4c\x4f\x53\x53\x20\x4f\x46\x20\ -\x55\x53\x45\x2c\x20\x44\x41\x54\x41\x2c\x20\x4f\x52\x20\x50\x52\ -\x4f\x46\x49\x54\x53\x3b\x20\x4f\x52\x20\x42\x55\x53\x49\x4e\x45\ -\x53\x53\x20\x49\x4e\x54\x45\x52\x52\x55\x50\x54\x49\x4f\x4e\x29\ -\x20\x48\x4f\x57\x45\x56\x45\x52\x20\x43\x41\x55\x53\x45\x44\x20\ -\x41\x4e\x44\x0a\x20\x20\x4f\x4e\x20\x41\x4e\x59\x20\x54\x48\x45\ -\x4f\x52\x59\x20\x4f\x46\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\ -\x2c\x20\x57\x48\x45\x54\x48\x45\x52\x20\x49\x4e\x20\x43\x4f\x4e\ -\x54\x52\x41\x43\x54\x2c\x20\x53\x54\x52\x49\x43\x54\x20\x4c\x49\ -\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x4f\x52\x20\x54\x4f\x52\x54\ -\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x20\x4e\x45\ -\x47\x4c\x49\x47\x45\x4e\x43\x45\x20\x4f\x52\x20\x4f\x54\x48\x45\ -\x52\x57\x49\x53\x45\x29\x20\x41\x52\x49\x53\x49\x4e\x47\x20\x49\ -\x4e\x20\x41\x4e\x59\x20\x57\x41\x59\x20\x4f\x55\x54\x20\x4f\x46\ -\x20\x54\x48\x45\x20\x55\x53\x45\x20\x4f\x46\x0a\x20\x20\x54\x48\ -\x49\x53\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x2c\x20\x45\x56\x45\ -\x4e\x20\x49\x46\x20\x41\x44\x56\x49\x53\x45\x44\x20\x4f\x46\x20\ -\x54\x48\x45\x20\x50\x4f\x53\x53\x49\x42\x49\x4c\x49\x54\x59\x20\ -\x4f\x46\x20\x53\x55\x43\x48\x20\x44\x41\x4d\x41\x47\x45\x2e\x0a\ -\x2a\x2f\x0a\x0a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x65\x71\ -\x75\x69\x72\x65\x20\x28\x6e\x61\x6d\x65\x29\x20\x7b\x0a\x0a\x20\ -\x20\x20\x20\x76\x61\x72\x20\x65\x78\x70\x6f\x72\x74\x73\x3b\x0a\ -\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x6e\x61\x6d\x65\x20\x3d\x3d\ -\x3d\x20\x27\x66\x73\x27\x29\x20\x7b\x0a\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x20\x3d\x20\x70\x68\x61\ -\x6e\x74\x6f\x6d\x2e\x63\x72\x65\x61\x74\x65\x46\x69\x6c\x65\x73\ -\x79\x73\x74\x65\x6d\x28\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x2f\x2f\x20\x4a\x61\x76\x61\x53\x63\x72\x69\x70\x74\x20\ -\x22\x73\x68\x69\x6d\x22\x20\x74\x6f\x20\x74\x68\x72\x6f\x77\x20\ -\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x63\x61\ -\x73\x65\x20\x61\x20\x63\x72\x69\x74\x69\x63\x61\x6c\x20\x6f\x70\ -\x65\x72\x61\x74\x69\x6f\x6e\x20\x66\x61\x69\x6c\x73\x2e\x0a\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x4f\x70\x65\x6e\ -\x20\x61\x6e\x64\x20\x72\x65\x74\x75\x72\x6e\x20\x61\x20\x22\x66\ -\x69\x6c\x65\x22\x20\x6f\x62\x6a\x65\x63\x74\x2e\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\ -\x74\x68\x72\x6f\x77\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\ -\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\ -\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\ -\x74\x6f\x20\x6f\x70\x65\x6e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x6d\x6f\x64\x65\x20\x4f\ -\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\x20\x41\x20\x73\x74\x72\x69\ -\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\x66\x20\x27\x72\x27\x2c\x20\ -\x27\x77\x27\x2c\x20\x27\x61\x2f\x2b\x27\x20\x63\x68\x61\x72\x61\ -\x63\x74\x65\x72\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x2a\x20\x40\x72\x65\x74\x75\x72\x6e\x20\x22\x66\x69\x6c\x65\x22\ -\x20\x6f\x62\x6a\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\ -\x72\x74\x73\x2e\x6f\x70\x65\x6e\x20\x3d\x20\x66\x75\x6e\x63\x74\ -\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\x64\x65\x29\ -\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\ -\x61\x72\x20\x66\x69\x6c\x65\x20\x3d\x20\x65\x78\x70\x6f\x72\x74\ -\x73\x2e\x5f\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\ -\x64\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x69\x66\x20\x28\x66\x69\x6c\x65\x29\x20\x7b\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\ -\x75\x72\x6e\x20\x66\x69\x6c\x65\x3b\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\ -\x65\x20\x74\x6f\x20\x6f\x70\x65\x6e\x20\x66\x69\x6c\x65\x20\x27\ -\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x2f\x2a\x2a\x20\x4f\x70\x65\x6e\x2c\x20\x72\x65\ -\x61\x64\x20\x61\x6e\x64\x20\x72\x65\x74\x75\x72\x6e\x20\x63\x6f\ -\x6e\x74\x65\x6e\x74\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2e\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\ -\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\ -\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\ -\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\ -\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\ -\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\x66\ -\x72\x6f\x6d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\ -\x72\x65\x74\x75\x72\x6e\x20\x66\x69\x6c\x65\x20\x63\x6f\x6e\x74\ -\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\ -\x72\x65\x61\x64\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\ -\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x76\x61\x72\x20\x66\x20\x3d\x20\x66\x73\x2e\ -\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\x27\x72\x27\x29\x2c\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x3d\x20\x66\x2e\x72\x65\x61\ -\x64\x28\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\ -\x63\x6f\x6e\x74\x65\x6e\x74\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\ -\x20\x4f\x70\x65\x6e\x20\x61\x6e\x64\x20\x77\x72\x69\x74\x65\x20\ -\x63\x6f\x6e\x74\x65\x6e\x74\x20\x74\x6f\x20\x61\x20\x66\x69\x6c\ -\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\ -\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\ -\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\ -\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\ -\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\ -\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\ -\x66\x72\x6f\x6d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ -\x40\x70\x61\x72\x61\x6d\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x43\ -\x6f\x6e\x74\x65\x6e\x74\x20\x74\x6f\x20\x77\x72\x69\x74\x65\x20\ -\x74\x6f\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x6d\x6f\ -\x64\x65\x20\x4f\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\x20\x41\x20\ -\x73\x74\x72\x69\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\x66\x20\x27\ -\x77\x27\x20\x6f\x72\x20\x27\x61\x20\x2f\x20\x2b\x27\x20\x63\x68\ -\x61\x72\x61\x63\x74\x65\x72\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\ -\x70\x6f\x72\x74\x73\x2e\x77\x72\x69\x74\x65\x20\x3d\x20\x66\x75\ -\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x2c\x20\x63\x6f\ -\x6e\x74\x65\x6e\x74\x2c\x20\x6d\x6f\x64\x65\x29\x20\x7b\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\x61\x72\x20\x66\ -\x20\x3d\x20\x66\x73\x2e\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\ -\x20\x6d\x6f\x64\x65\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x66\x2e\x77\x72\x69\x74\x65\x28\x63\x6f\x6e\ -\x74\x65\x6e\x74\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x2f\x2a\x2a\x20\x52\x65\x74\x75\x72\x6e\x20\x74\x68\x65\ -\x20\x73\x69\x7a\x65\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2c\ -\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x2e\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\ -\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\ -\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\ -\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\ -\x20\x74\x6f\x20\x72\x65\x61\x64\x20\x74\x68\x65\x20\x73\x69\x7a\ -\x65\x20\x6f\x66\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ -\x40\x72\x65\x74\x75\x72\x6e\x20\x46\x69\x6c\x65\x20\x73\x69\x7a\ -\x65\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\ -\x78\x70\x6f\x72\x74\x73\x2e\x73\x69\x7a\x65\x20\x3d\x20\x66\x75\ -\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\x61\x72\x20\ -\x73\x69\x7a\x65\x20\x3d\x20\x66\x73\x2e\x5f\x73\x69\x7a\x65\x28\ -\x70\x61\x74\x68\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x69\x66\x20\x28\x73\x69\x7a\x65\x20\x21\x3d\x3d\x20\ -\x2d\x31\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x73\x69\x7a\ -\x65\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x72\ -\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\ -\x61\x64\x20\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\ -\x68\x20\x2b\x20\x22\x27\x20\x73\x69\x7a\x65\x22\x3b\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x2f\x2a\x2a\x20\x43\x6f\x70\x79\x20\x61\x20\x66\x69\x6c\ -\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\ -\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\ -\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\ -\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\ -\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\x74\x68\x20\x6f\ -\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\x20\x66\x69\x6c\ -\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\ -\x72\x61\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\ -\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x65\x73\x74\ -\x69\x6e\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x63\x6f\x70\x79\x20\x3d\x20\ -\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\ -\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x69\x66\x20\x28\x21\x66\x73\x2e\x5f\x63\x6f\x70\x79\x28\x73\ -\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\ -\x6f\x6e\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ -\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\ -\x63\x6f\x70\x79\x20\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x73\ -\x6f\x75\x72\x63\x65\x20\x2b\x20\x22\x27\x20\x61\x74\x20\x27\x22\ -\x20\x2b\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x2b\ -\x20\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\ -\x43\x6f\x70\x79\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\ -\x20\x74\x72\x65\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\ -\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\ -\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ -\x40\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\ -\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\ -\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\ -\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\ -\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\ -\x61\x74\x69\x6f\x6e\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\ -\x74\x72\x65\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\ -\x2e\x63\x6f\x70\x79\x54\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\ -\x74\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\ -\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\ -\x28\x21\x66\x73\x2e\x5f\x63\x6f\x70\x79\x54\x72\x65\x65\x28\x73\ -\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\ -\x6f\x6e\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ -\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\ -\x63\x6f\x70\x79\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\ -\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x73\x6f\x75\x72\x63\x65\x20\ -\x2b\x20\x22\x27\x20\x61\x74\x20\x27\x22\x20\x2b\x20\x64\x65\x73\ -\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x2b\x20\x22\x27\x22\x3b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x4d\x6f\x76\x65\x20\x61\ -\x20\x66\x69\x6c\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\ -\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\ -\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\ -\x40\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\ -\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\ -\x20\x66\x69\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\ -\x20\x40\x70\x61\x72\x61\x6d\x20\x64\x65\x73\x74\x69\x6e\x61\x74\ -\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\ -\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x6d\x6f\x76\ -\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x73\x6f\ -\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\ -\x6e\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x66\x73\x2e\x63\x6f\x70\x79\x28\x73\x6f\x75\ -\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\ -\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x73\x2e\x72\x65\x6d\x6f\x76\x65\x28\x73\x6f\x75\ -\x72\x63\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\ -\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x52\x65\ -\x6d\x6f\x76\x65\x73\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\ -\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\ -\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\ -\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\ -\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\x65\ -\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\ -\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x66\x73\x2e\x5f\x72\x65\ -\x6d\x6f\x76\x65\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\ -\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x66\x69\ -\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\ -\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x3b\ -\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x52\x65\ -\x6d\x6f\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\x72\ -\x79\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x49\x74\ -\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\ -\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\ -\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x20\x40\x70\x61\x72\ -\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\ -\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x6f\ -\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x2a\x2f\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\ -\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\x65\x44\x69\x72\x65\x63\x74\ -\x6f\x72\x79\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\ -\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x66\x73\x2e\ -\x5f\x72\x65\x6d\x6f\x76\x65\x44\x69\x72\x65\x63\x74\x6f\x72\x79\ -\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\ -\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\x69\x72\x65\x63\x74\ -\x6f\x72\x79\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\ -\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ -\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2a\x2a\x20\x52\ -\x65\x6d\x6f\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\ -\x72\x79\x20\x74\x72\x65\x65\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\ -\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\ -\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x2a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\ -\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\ -\x6f\x72\x79\x20\x74\x72\x65\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\ -\x76\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2a\x2f\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\ -\x65\x6d\x6f\x76\x65\x54\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\ -\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\ -\x20\x28\x21\x66\x73\x2e\x5f\x72\x65\x6d\x6f\x76\x65\x54\x72\x65\ -\x65\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\ -\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\x69\x72\x65\x63\ -\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x70\ -\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x74\x6f\x75\x63\x68\x20\x3d\ -\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\ -\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x73\x2e\x77\x72\x69\x74\x65\x28\x70\x61\x74\x68\ -\x2c\x20\x22\x22\x2c\x20\x27\x61\x27\x29\x3b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\ -\x20\x20\x20\x69\x66\x20\x28\x74\x79\x70\x65\x6f\x66\x20\x65\x78\ -\x70\x6f\x72\x74\x73\x20\x3d\x3d\x3d\x20\x27\x75\x6e\x64\x65\x66\ -\x69\x6e\x65\x64\x27\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x68\x72\x6f\x77\x20\x27\x55\x6e\x6b\x6e\x6f\x77\x6e\x20\ -\x6d\x6f\x64\x75\x6c\x65\x20\x27\x20\x2b\x20\x6e\x61\x6d\x65\x20\ -\x2b\x20\x27\x20\x66\x6f\x72\x20\x72\x65\x71\x75\x69\x72\x65\x28\ -\x29\x27\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x72\ -\x65\x74\x75\x72\x6e\x20\x65\x78\x70\x6f\x72\x74\x73\x3b\x0a\x7d\ -\x0a\x0a\ +\x00\x00\x0c\x89\ +\x00\ +\x00\x2e\x40\x78\x5e\xdd\x5a\x5b\x73\xda\x48\x16\x7e\xcf\xaf\xe8\ +\x61\xab\x06\xec\xb0\x78\xe3\xd9\xa7\xdc\x2a\x18\x64\x5b\x29\x0c\ +\xac\x04\xf1\xb8\xa6\xa6\x5c\x42\x6a\x40\x89\x50\xb3\x92\x88\xc3\ +\xcc\xf8\xbf\xef\x77\xba\x5b\x42\x12\xe2\xe2\x64\x93\xda\x5a\x3f\ +\x60\x5d\xfa\xdc\xaf\x7d\x5a\x67\xa7\x1f\xe3\xc0\x0f\x13\x16\x07\ +\x62\xb9\x5c\xbf\x64\x49\xb4\xe2\x4d\x16\x8a\x05\x0f\xd5\x0d\x3b\ +\x3d\x7b\x76\x76\x3a\x0b\xc4\xc4\x09\xd8\x83\x1f\x7a\xe2\xe1\xa5\ +\x5c\xb4\x9c\x3b\x61\x22\x16\xea\x66\x1a\xcb\xff\xb4\x18\xab\x9f\ +\x31\x36\x9a\xfb\x31\x9b\xfa\x01\x67\xf8\xbf\x74\xa2\x84\x89\x29\ +\x4b\xe6\x9c\x0d\x15\xd8\x7b\x9b\x2d\x23\xf1\x91\xbb\x09\x9b\x46\ +\x62\xc1\x06\x53\x9f\xf5\x9c\x49\xdc\x7a\x06\xe0\x8e\x58\xae\x23\ +\x7f\x36\x4f\x58\xa3\x73\xc2\xce\xff\xf1\xe2\x05\x6b\x47\xfe\xda\ +\x61\xd7\xbe\xe7\xac\x9d\x84\xbd\x76\xe8\xb6\x35\x57\xb7\xef\x66\ +\x0b\xc7\x0f\x5a\xae\x58\xbc\xad\x06\x36\x3f\x3b\x21\xeb\x72\x76\ +\x03\xb0\x50\xb0\xd7\x3e\xee\x5b\x1e\x6f\x2d\xe4\xfd\x41\xf0\xf7\ +\xce\x82\xc7\xcc\x12\x9c\xbd\x8e\x04\xff\x48\x77\x2f\xce\xdf\xcd\ +\x45\x72\x80\x2c\xff\xc2\xdd\x8f\x22\x9e\x37\xd9\x3c\x49\x96\x2f\ +\xcf\xce\xd2\x07\xad\x49\x20\x66\xf1\x52\x24\xc4\x33\x09\x6c\x71\ +\xcf\x8f\x93\xc8\x9f\xac\x12\x5f\x84\xcc\x09\x3d\xb6\x8a\xa1\xba\ +\x90\xc5\x62\x15\xb9\x5c\x3e\x99\xf8\xa1\x13\xad\xd9\x54\x44\x8b\ +\xb8\x09\x53\x24\x73\x26\x22\xf9\x5f\xac\x12\x20\x59\x08\xcf\x9f\ +\xfa\xae\x43\x28\x9a\xcc\x89\x38\x5b\xf2\x68\xe1\x27\x09\xf7\x48\ +\xd7\x9f\x7d\x0f\x17\xc9\x1c\xea\x23\x3b\x4c\x45\x10\x08\xd8\x73\ +\xc6\x5c\x11\x7a\x3e\x01\xc5\x12\x68\xc1\x93\x97\xc4\x13\x63\xa7\ +\x25\xbe\x62\xb2\xa1\x66\xc8\x15\x1e\x96\xae\xe2\x84\x45\x3c\x71\ +\xc0\x28\xe1\x74\x26\xe2\x33\x07\x3e\x6d\x3d\x89\x84\xc1\x99\x12\ +\xdf\x85\x53\x25\xe4\x12\x01\xe4\x24\x34\x79\xa2\x90\xad\xc8\x11\ +\x94\xe1\x06\x8e\xbf\xe0\x51\x6b\x07\x23\x20\x98\x53\x47\xca\x08\ +\xa4\xf4\x56\xd0\xd6\xf7\xe1\x85\xcc\x01\xcc\x5a\x2a\x4f\xb8\x2b\ +\x04\x49\x22\xd5\x4d\xf6\x39\x83\x31\x04\xde\x47\x6c\xe1\x24\x3c\ +\xf2\x9d\x00\x8e\x9f\xaa\x5d\x5a\x8b\xd8\xca\xdb\x39\x15\xae\xcf\ +\xf1\x16\x70\xf4\x3e\x84\x77\xa5\xa1\xf2\x5a\x44\x33\x27\xf4\xff\ +\x90\x24\xde\x42\x8f\x72\x49\xaa\x55\xe9\x94\xd0\xa4\x9f\xc4\xa4\ +\x4d\xe5\x3d\x22\x8a\x41\x7e\xcd\x26\x9c\x1c\x08\x7a\x15\x8c\x23\ +\x64\x23\x38\x13\xa0\xc1\xce\x42\x24\xf0\x0b\xa9\xa7\x24\x4e\x45\ +\x01\xb7\x9f\xb1\x58\x06\xa2\xb4\x52\x2c\xa6\xc9\x03\x39\x83\xf6\ +\x2e\x16\x2f\xb9\x4b\xce\x05\x50\x9f\x9c\x2e\x22\xb7\x0a\x95\x83\ +\xc5\x31\xd8\x93\x71\x3b\xba\x36\x6d\x66\x0f\x2e\x47\xb7\x6d\xcb\ +\x60\xb8\x1e\x5a\x83\x0f\x66\xd7\xe8\xb2\x8b\x3b\xbc\x34\x58\x67\ +\x30\xbc\xb3\xcc\xab\xeb\x11\xbb\x1e\xf4\xba\x86\x65\xb3\x76\xbf\ +\x8b\xa7\xfd\x91\x65\x5e\x8c\x47\x03\x3c\xa8\xb5\x6d\x40\xd6\x80\ +\x8d\x5e\xb5\xfb\x77\xcc\xf8\x75\x68\x19\xb6\xcd\x06\x16\x33\x6f\ +\x86\x3d\x13\xe8\x80\xdf\x6a\xf7\x47\xa6\x61\x37\x99\xd9\xef\xf4\ +\xc6\x5d\xb3\x7f\xd5\x64\x40\xc1\xfa\x83\x11\xeb\x99\x37\xe6\x08\ +\xcb\x46\x83\x26\x91\x05\xae\x6d\x40\x36\xb8\x64\x37\x86\xd5\xb9\ +\x06\x9e\xf6\x85\xd9\x33\x47\x77\x92\xe2\xa5\x39\xea\x13\xb5\x4b\ +\x90\x6b\xb3\x61\xdb\x1a\x99\x9d\x71\xaf\x6d\xb1\xe1\xd8\x1a\x0e\ +\x6c\x42\x46\xc2\x75\x4d\xbb\xd3\x6b\x9b\x37\x46\xb7\x05\x0e\x40\ +\x95\x19\x1f\x8c\xfe\x88\xd9\xd7\xed\x5e\x8f\xbd\x2e\x0b\xfa\x96\ +\x5d\x18\x60\xab\x7d\xd1\x33\x14\xe6\xfe\x1d\x10\x75\x4d\xcb\xe8\ +\x8c\x48\x84\xcd\x55\x07\xfa\x02\x47\xbd\x26\xb3\x87\x46\xc7\xa4\ +\x0b\xe3\x57\x03\x72\xb7\xad\xbb\x26\xe9\x00\xda\xb2\x8d\x7f\x8d\ +\xb1\x08\x2f\x59\xb7\x7d\xd3\xbe\x32\x6c\x20\x6b\x1c\x50\x04\x6c\ +\xd1\x19\x5b\xc6\x0d\x71\x09\xd9\xed\xf1\x85\x3d\x32\x47\xe3\x91\ +\xc1\xae\x06\x83\xae\x54\xaf\x6d\x58\x1f\xcc\x8e\x61\xbf\x02\xba\ +\xde\x80\x54\x7e\xc9\xc6\xb6\xd1\x04\x95\x51\x5b\x12\x07\x12\x28\ +\xc8\x7e\x45\xd7\x17\x63\xdb\x94\xaa\x32\xfb\x23\xc3\xb2\xc6\xc3\ +\x91\x39\xe8\x9f\xc0\xb2\xb7\x50\x05\xf8\x6c\x03\x94\x2c\xd8\x05\ +\xb6\x41\x5f\x9a\x12\xc6\x18\x58\x77\x84\x96\x74\x21\x95\xde\x64\ +\xb7\xd7\x06\x9e\xc3\xb8\x7d\xe5\x09\x6d\x52\x89\x0d\x8f\xe8\x90\ +\x25\xb3\x65\xa0\x08\x07\x19\x15\x24\x65\x7d\xe3\xaa\x67\x5e\x19\ +\xfd\x8e\x41\x1c\x0d\x08\xcf\xad\x69\x1b\x27\xb0\x91\x09\xee\xae\ +\x08\x29\x11\xbe\x6d\x83\x2a\xbc\x03\x94\xc9\x0f\xc1\x19\x2e\x81\ +\xaa\xe0\xb1\xd0\x34\x6c\xc8\xcc\x4b\xd6\xee\x7e\x00\x96\x6e\xba\ +\x1c\x76\xb7\x4d\xed\x23\x52\x75\x9d\x6b\xad\xf8\xd6\x33\xaa\x78\ +\xd3\x55\xe8\xca\x34\x10\xf1\x7f\xaf\xfc\x88\x37\x28\x8a\x4f\xd8\ +\x9f\x2a\x8d\x7e\x76\x22\xc6\xbf\x2c\x45\x94\xc4\xaf\xd4\x13\x7f\ +\xca\xe4\x12\xf6\xe6\xcd\x1b\x56\x7f\xe0\x93\xa5\x33\xe3\xf5\x0c\ +\x80\x92\xa6\x06\x60\x6f\x58\x86\xbc\x21\x96\x49\x4c\x8b\x54\x5a\ +\x55\xbf\x84\x9c\xa0\xb1\x50\x17\xe4\x96\x1b\x71\x24\xa0\x5b\x3e\ +\x19\xe2\x79\xe3\xa4\x59\x58\x4f\x50\xa8\xc0\x5e\xc0\x91\x29\xde\ +\xb0\x3f\x1f\x35\x4b\x29\xce\x8c\x9a\x3b\xe7\xee\xa7\xd1\x7a\xc9\ +\x1b\x02\xa9\x1b\xff\xcb\x94\x09\x02\xb9\x7f\x15\x21\x2b\xe2\x35\ +\x32\x91\x90\xf2\xd0\x0d\x39\xd0\xe6\xef\x51\x49\xbd\x45\xc2\x8f\ +\x07\x13\xea\x00\x1a\x62\x0f\xee\x02\x1f\x75\x21\x01\xea\x27\xc7\ +\x12\x18\x87\x1e\x9f\xfa\x21\xf7\x9e\x40\x63\x95\xc2\x7c\x05\x99\ +\x41\xd4\x5f\x05\xc1\x5e\x62\x7e\x5c\x60\xea\xaf\xbf\x58\x08\x10\ +\xa9\x3a\x71\x9c\x58\x54\x60\x4d\xf4\x5e\x8d\xc4\x89\x66\x3c\x69\ +\xea\x9a\x5c\xa5\x44\xf2\x34\xb5\x4a\x12\xd0\xc5\x1b\x34\x73\x5c\ +\x68\x9e\xd5\xbb\x93\x2a\x2c\x79\x53\x4b\x92\x45\x3e\xe9\x75\xc9\ +\xc6\xf4\x28\xa5\x9b\x5e\x80\xea\x96\xbb\xd1\xba\xb3\x33\xd9\xf0\ +\xa1\xbc\xa2\x5a\x29\x03\xa3\xb0\x85\xc1\x7a\xcb\x71\x49\x9a\xcc\ +\x69\x14\xfa\x9d\xfc\x02\xeb\x8d\xf3\x89\xb3\x78\x85\x32\xa6\xe5\ +\xe6\x5f\xd0\x7d\xa4\x55\x2f\x75\x47\xf5\x5f\xaf\xc8\xab\xa8\x92\ +\x59\x5a\x5d\x60\xe3\x80\xda\x68\x3d\xc5\xa8\x8f\xa6\x9a\x3f\x8c\ +\xb4\xc1\x70\x69\xcb\xc6\x6e\x5b\x91\x29\x5b\x68\xf3\x20\xec\xa6\ +\x05\xdc\x65\x97\x74\x3d\x31\xa5\x78\x69\xcd\x9d\x78\xf0\x10\x0e\ +\x23\x81\xfe\x2f\x59\x37\xfc\x9d\x3a\xca\xab\x20\xe3\x0e\x59\x41\ +\xa9\xf6\x37\xff\xf7\xdd\xec\xa5\xa0\x99\x24\x00\x53\xe4\x25\xd8\ +\x96\xe9\xf2\xa4\xe8\x5a\xa6\xc0\x54\x21\xec\xe7\x9f\xe1\x90\x3a\ +\x19\x64\x18\x8f\x62\x9b\x70\xc1\xd4\x5d\xce\x97\xb2\xf1\x3c\x48\ +\x98\x00\xf2\xb2\x96\x82\x09\xdc\x4b\x4b\x29\xf3\x94\xf2\x4c\x59\ +\x08\xba\x7f\x64\x3c\x40\x77\x55\xcc\xca\x55\x0b\xcb\x84\x8f\xf0\ +\x81\x14\x4d\x45\x70\x95\x29\x90\x3e\x7f\xca\xa7\x96\x4c\xc6\xa3\ +\xd5\x98\x59\x1d\xa6\xcc\xa0\x0f\x7b\xc0\xe3\x5e\x95\xef\x7e\x5b\ +\xfd\xe6\xa0\x3a\xb3\xac\xa2\xbc\xad\x9a\xbf\x6d\xdc\x15\x2a\x4c\ +\x8b\x57\x45\x46\xdb\x55\xb1\x54\x31\xb1\x39\x9a\xdf\xa8\xa1\xcb\ +\x68\x1f\x85\x1c\x29\xd8\x9f\x85\x4e\x40\xd7\x55\x81\x4a\x15\xba\ +\x75\x7f\x9f\x07\xbf\xbf\x2f\x22\xd8\x94\xf9\x69\x15\x06\xb2\x37\ +\xd9\x38\xab\xdd\x08\x19\x5d\x76\xd3\x47\xbf\x6d\x78\xf8\x5d\x75\ +\x16\x29\x4e\xd9\x5a\x94\x3d\x26\xbd\x4f\xb0\xa7\xdc\xfd\x96\x56\ +\xd1\x96\x20\x8f\xbc\x45\xfb\x33\x11\x86\x54\xba\xab\x88\xef\x89\ +\x9a\x47\x86\xfd\xa9\x3b\x67\x0d\x52\xd3\xb6\x95\x88\x5a\xf5\xd3\ +\x2a\x3a\xd4\x1c\x55\xdb\x7f\x8b\xe3\x27\xb2\xfb\xb8\xbf\xc1\x40\ +\xc2\xf1\x2a\x13\x8e\xb4\x73\x0c\xf7\xc0\xbe\x9a\xda\xab\xf7\xf6\ +\xa0\xdf\xc2\xf4\x23\xe6\x0d\x79\x49\x7b\xfc\x70\xe6\x4f\xd7\x8d\ +\xb4\x59\x83\x4b\x38\xab\x20\xa1\x56\x8d\xdc\x8a\xe0\x4e\x40\xbc\ +\x60\xad\x82\xd7\xd5\x44\x68\x86\xd8\xae\x3b\x81\xff\x07\xf7\x6a\ +\x4d\x56\xf3\x73\xb7\x87\x40\x7b\xc2\xf1\x6c\x84\x10\x66\x02\x04\ +\x1a\xe4\x6e\x8f\x01\xbd\x04\xad\x78\xbe\x81\xcd\xee\x0f\x01\x5b\ +\x5c\x85\xab\x85\x06\x99\xc7\x9a\x7a\xb4\xf5\xf0\x78\x34\x2e\xa7\ +\x2d\x2b\xc9\xb0\xc1\xa2\x9f\x1d\x42\xd2\x46\xef\x9b\x10\xe4\x47\ +\xe7\xb3\x63\xbb\x91\xbf\x4c\xe4\x23\x1b\xbb\xf9\xda\x21\xe0\x0e\ +\xc6\x24\x22\xe0\x37\x3c\x8e\x61\xb2\x22\x96\xe2\xbb\x4a\x74\xd2\ +\x41\x50\x97\xc3\x42\x63\xbf\x8a\x02\x1a\xd8\xcc\x5e\xc8\xdf\x73\ +\xf9\xfb\x8b\xfc\xfd\x67\x55\xe4\x52\x1e\xc0\x3b\x39\x7e\x88\x5b\ +\x01\x0f\x67\x18\x2e\x50\x7b\xf7\xa2\x6a\x75\x1a\xc1\x92\xec\x38\ +\x0a\x1a\x92\x5a\x1d\x5d\x5c\x5d\xcd\x64\x32\x87\x2d\x39\x7d\x9a\ +\x20\x54\x9e\xdc\x0e\xb4\xed\x40\xdd\xc9\xd8\x39\x55\x78\x9d\xae\ +\x48\xce\x23\xd3\x13\x85\x71\x4b\x84\xe4\xb4\xa9\xa7\x41\x6f\x84\ +\x60\x9b\x9b\xef\x27\xa6\x2a\xf0\xbb\x65\x3b\x5e\xe9\xca\xc4\x52\ +\xaa\x34\x49\x3c\x55\xe7\x07\x98\xf9\xa5\xa8\xe8\xf3\x6f\x55\xf4\ +\xf9\xb1\x8a\xfe\x01\xa2\x1d\xaf\xe7\xdd\xe5\x8c\x5a\x62\x39\x4e\ +\x7b\xa9\xe2\x6d\x67\x55\xf4\x9c\xc4\x91\x6b\xce\x2b\x97\x3c\x7e\ +\x63\xe8\x1c\x30\x63\x65\xd8\x6f\x3c\xbc\x22\x22\x7e\x39\xd6\x50\ +\xff\xfb\xba\xd9\x52\x78\x32\x8f\xc4\x03\xab\xdd\x46\x02\xd3\x6a\ +\x9a\x8b\x63\xd6\xa0\xc7\x1b\x7f\xa3\xa4\x56\x2b\xca\x5e\x1e\x69\ +\xc8\x9c\xeb\x87\x6e\xb0\xf2\xf8\x7b\xaa\xca\x9b\x56\x2b\x96\xd9\ +\x1f\x49\xb1\x89\x0d\xa7\x2a\x05\x94\x6c\xb8\x57\xe5\x6b\xa8\xfa\ +\x16\x9f\x61\x07\x49\xa3\x5a\xbe\xc0\x40\x87\xc6\xf1\xaa\xe9\x4a\ +\x67\x2a\x34\x9d\x67\x75\x87\xca\x49\xe3\xa4\x5e\x21\x09\x42\xbf\ +\xa2\xec\xe0\x1c\x40\xb5\x53\x1b\xd6\x16\xf1\xec\x12\xf3\x58\x59\ +\x99\xaa\xb8\x21\x6f\xa0\x9c\x94\x5f\xa7\xf6\xf8\xa9\x4c\xbb\xa0\ +\x08\x52\xca\xa2\xf7\xbc\xd4\x04\x70\x0f\x0e\x8d\x81\x3b\x0d\x8c\ +\xa7\x98\x60\xc9\x59\xb4\xeb\x04\xc1\xc4\x71\x3f\x6d\x89\x91\x56\ +\x86\xa2\xce\x1a\x99\x36\x77\x24\x35\x4d\xb8\x8d\x79\xff\xa6\x83\ +\x94\x94\x8a\x4a\xdc\x49\xef\xb8\x56\xb5\x52\xc1\xb9\x96\x75\x53\ +\x3a\x49\x40\xce\xf7\x70\xfb\x55\xed\x2a\x35\x8f\x5b\x22\x40\xe1\ +\xed\x25\x7c\x55\x1d\x75\x28\x4d\x61\x9f\x3d\x23\x85\x93\x06\x26\ +\xc2\xdb\xde\xbb\xca\x4a\x71\xef\x48\x38\xe5\x9d\x46\xc0\xa9\xea\ +\xef\x54\x75\xd9\xf7\xd3\xd9\x0a\x46\x87\xf2\x80\x47\xce\x58\x28\ +\x20\x0a\x0c\x92\x1f\x55\x0d\x17\xc9\x60\x7a\xb8\x98\x6d\x93\xe9\ +\x1e\xd1\x42\xa3\xc8\x52\xd8\x15\x85\xd6\xbb\x2b\x5a\xbe\x59\x07\ +\xf6\x08\xa7\xde\x5e\xc9\x19\x40\x36\x06\x9d\xc6\xbb\x26\xa0\xc5\ +\xc1\xe6\x25\x0e\x15\xe3\x35\xa2\x70\xd1\xc8\x2b\x1a\x92\xbe\xcf\ +\xfa\x39\x56\x8b\xe7\xfe\xa2\xa6\x94\x4b\xc9\x83\x7f\x71\x79\xa6\ +\x02\x38\x36\x92\x88\xc3\x10\x28\x38\x99\xc2\xb1\x66\x56\x15\xd8\ +\x14\x07\x89\xea\x0c\x52\xf9\xf8\xd9\xe9\x29\x1b\x50\xbb\x46\x07\ +\x70\x5a\x24\x87\xd5\xe8\x60\xb3\xa6\x67\x55\xea\x14\x47\x2e\x3f\ +\x65\x66\x82\x23\x13\x4c\xf3\x54\xca\xca\xa8\x52\xa4\xfa\x38\xe9\ +\x54\xd8\x15\x6a\x5a\xbf\xb1\xc2\x29\x7b\x87\x7d\x82\xb3\x80\xbe\ +\xd1\xcc\x0d\xe9\x47\x1f\x98\xca\x43\x54\x9a\x8c\x81\x8d\x8a\xf5\ +\x38\xf5\xe3\x8a\xc5\x1b\x5c\xb5\x70\x66\xa1\x36\x19\x38\x06\xc2\ +\x0b\xe0\xa8\x47\xe8\xf3\xea\x0f\xf4\xe3\x9c\x3d\xaf\x33\x77\x0e\ +\x3a\x2e\x92\x18\xe4\xdc\x70\xc2\xde\x69\xe9\x0a\xb2\xe5\x16\x9c\ +\x65\xd7\x7a\x34\xbd\xdd\xc6\x12\xeb\x4d\x3a\x86\xdc\xda\x03\xd3\ +\x04\x4c\xca\xf1\x26\x1d\x6c\xb7\xee\x49\x9e\x46\x0e\xa4\xe8\x4d\ +\xe4\x1b\x04\x51\x95\xc4\x34\xa7\xf4\xba\xec\x82\x99\x40\xb8\xd0\ +\x65\x63\x1c\x3a\x93\x8d\x06\x15\x1b\xf5\x1a\x7b\xae\x34\xfd\x9c\ +\xd5\xea\xb9\xfa\x91\x8f\x9f\xd4\xf6\x4d\x18\xde\xf1\xf2\x1e\x40\ +\xc7\x6d\x88\x42\xd2\xae\x23\x11\xee\xf1\x01\x9c\x3c\xff\x57\xdd\ +\x40\xf2\x42\x27\x75\x55\xc6\x93\x3a\xd6\xdc\xed\xb5\x9d\xc4\x92\ +\xaf\x84\x64\x88\xb2\xae\xa5\xd5\x68\x15\x9a\xf0\x8d\xb1\xe0\x4f\ +\x15\x67\x0a\xa9\x4a\xb0\xba\x45\xc8\x0b\xb1\x49\x56\x99\xb6\xdc\ +\x40\x60\x1f\x5c\xca\x1a\xda\x96\x1a\xbc\x90\x29\x32\x01\x0a\x41\ +\x48\x47\x8f\x99\x8c\x14\x17\xca\x02\x79\x6d\x14\x83\xf0\xc7\x18\ +\x40\x05\x6f\xaa\x05\xec\x04\xa5\x83\x80\x3d\xc5\xaf\xce\xf2\x64\ +\x9f\xaf\x8a\xe1\x87\x3a\x9d\xdf\xd6\x1d\x76\xc6\x76\x86\xf0\x76\ +\x84\x2a\xda\x65\x33\x37\x53\x0f\xd9\x13\xab\x5b\x56\x97\x51\x5d\ +\x3e\x2b\x6a\x49\x02\x0d\x2d\x75\xc9\xb2\x15\x06\x2f\x47\x97\xa5\ +\x8f\x8f\x64\x07\xf0\x87\xcc\x56\xca\x9a\x4d\x9a\x7b\x4f\xd6\x09\ +\x2f\xe6\xa8\x1f\x60\x58\xd5\x8d\x48\x5e\xaa\x02\xec\x92\x02\x4c\ +\xf2\x9a\x32\xb8\x37\xcc\xe4\xca\xb2\xfe\xab\xc2\x2c\x5d\x88\x72\ +\x4f\x97\x32\x2f\x96\xf4\x49\x19\x51\x2e\xfb\x09\x3b\xfd\xbf\x57\ +\x6e\xf5\x75\x30\xd1\xaa\x27\x25\x46\x95\x53\x48\xb4\x62\x62\x94\ +\x92\xee\xc9\x8e\xf2\xd8\xe6\x7b\x65\x40\xdd\x9d\xe6\x4b\xa1\x7e\ +\xb4\x23\x8a\x3c\x0c\x96\xf0\x89\x8c\x3c\x88\xcd\x43\xe5\x9f\x97\ +\x40\xb7\x43\x86\xfa\x9c\xe2\x16\x41\x9e\xd3\x34\x31\xf0\xcb\xb0\ +\x97\x0d\x48\x96\xf9\x09\x49\xf2\x9e\x80\xf5\x21\x4c\x11\xa0\x0c\ +\x41\x09\x71\xab\x3c\x49\xd2\x32\x83\x4b\x2b\x68\x61\xa9\x40\x31\ +\x7c\xb3\x23\x9f\xe5\x45\x29\x55\x2e\x42\xb9\x99\xc8\x94\x23\x4d\ +\x5b\xca\x43\x6b\xef\x26\x02\xdb\x96\x24\xe2\xdf\xa1\x6a\xed\xb6\ +\x59\x91\x72\x45\x0e\x3c\xc6\x7a\x3b\x91\x54\xdb\x71\x04\x19\xbf\ +\xc9\x96\x84\xe0\x1b\xed\x59\x64\xf9\x3b\x58\xf6\x86\x3e\xb9\xfa\ +\xff\x8a\xc1\x05\x89\x54\xd8\xa6\x1f\x8e\x41\x84\xdf\xce\xe8\x2b\ +\xe6\x42\xac\x8c\x38\x91\xd0\x96\xcd\xa5\xd9\x72\xd4\x58\x72\x1d\ +\x3e\x8b\xfb\xf1\x4d\x1e\x11\xde\x5b\x5a\x94\x0c\x07\x8b\x4b\x96\ +\x9b\xb4\xcc\xb2\xb0\x1c\x95\x8e\x34\x81\x4d\x42\x22\x50\xe4\xa0\ +\x42\xbf\xbc\x3f\xeb\x6c\xf4\x97\x85\xc1\x0f\xe8\x94\x73\x21\x27\ +\xd0\xba\x1f\xa9\xc9\x6e\x96\x1a\x0f\xd5\xeb\x92\x4a\x33\x40\x55\ +\xb4\x9f\xa2\xdb\x0d\xa7\x3b\x37\x24\x4f\x56\xf0\x77\xca\xec\xd2\ +\xf8\x85\xaa\x5a\x28\x25\xd4\xe9\x1e\xad\xea\xad\xbc\x5c\xb5\xf9\ +\x28\x69\x59\xa6\xe2\x27\x3b\x6f\x55\xf6\x7d\x9a\x1b\xa7\x9b\xdd\ +\x44\xac\x70\x6c\x79\xc8\x35\x90\x5b\x54\x4b\x4c\x44\x70\xc2\x84\ +\xf3\xa1\xba\x93\xff\x8c\x28\xcd\x30\xb9\x09\x88\x3e\x16\xc9\x3e\ +\xf8\xa2\x4f\xc2\x72\x9f\x20\xe5\xce\x66\x55\xc7\x50\x1f\x87\x9f\ +\x42\xf1\x10\xd2\x46\x7b\x45\xcd\x02\x62\x52\x4e\x51\x9e\xe3\x92\ +\xc6\x8f\xe9\x47\x68\x27\xf5\xc2\xb4\x45\x37\x87\xd9\x97\x68\x60\ +\x01\x33\x93\x1e\x9f\x39\xee\x9a\x3d\xe0\x9b\x51\x98\x90\x86\xab\ +\x7a\xb2\xfa\x4c\x7d\xeb\xdd\xd2\xb7\x10\x3d\xc5\xbb\xf9\x60\xed\ +\xd5\xb3\xff\x00\xb6\x81\x7e\xc1\ \x00\x00\x01\x1a\ \x28\ \x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x6f\x70\x74\x73\x29\x20\ @@ -427,408 +233,6 @@ \x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x7d\x0a\ \x0a\x09\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3b\x0a\x7d\ \x29\x28\x28\x25\x31\x29\x29\x3b\x0a\ -\x00\x00\x18\xf4\ -\x2f\ -\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ -\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ -\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x77\x69\ -\x6e\x64\x6f\x77\x3a\x74\x72\x75\x65\x2c\x70\x68\x61\x6e\x74\x6f\ -\x6d\x3a\x74\x72\x75\x65\x2c\x66\x73\x3a\x74\x72\x75\x65\x20\x2a\ -\x2f\x0a\x0a\x2f\x2a\x0a\x20\x20\x54\x68\x69\x73\x20\x66\x69\x6c\ -\x65\x20\x69\x73\x20\x70\x61\x72\x74\x20\x6f\x66\x20\x74\x68\x65\ -\x20\x50\x68\x61\x6e\x74\x6f\x6d\x4a\x53\x20\x70\x72\x6f\x6a\x65\ -\x63\x74\x20\x66\x72\x6f\x6d\x20\x4f\x66\x69\x20\x4c\x61\x62\x73\ -\x2e\x0a\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\ -\x43\x29\x20\x32\x30\x31\x31\x20\x41\x72\x69\x79\x61\x20\x48\x69\ -\x64\x61\x79\x61\x74\x20\x3c\x61\x72\x69\x79\x61\x2e\x68\x69\x64\ -\x61\x79\x61\x74\x40\x67\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\ -\x20\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\ -\x32\x30\x31\x31\x20\x49\x76\x61\x6e\x20\x44\x65\x20\x4d\x61\x72\ -\x69\x6e\x6f\x20\x3c\x69\x76\x61\x6e\x2e\x64\x65\x2e\x6d\x61\x72\ -\x69\x6e\x6f\x40\x67\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\ -\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\ -\x30\x31\x31\x20\x4a\x61\x6d\x65\x73\x20\x52\x6f\x65\x20\x3c\x72\ -\x6f\x65\x6a\x61\x6d\x65\x73\x31\x32\x40\x68\x6f\x74\x6d\x61\x69\ -\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\x67\ -\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x20\x65\x78\x65\x63\ -\x6a\x6f\x73\x68\x2c\x20\x68\x74\x74\x70\x3a\x2f\x2f\x65\x78\x65\ -\x63\x6a\x6f\x73\x68\x2e\x62\x6c\x6f\x67\x73\x70\x6f\x74\x2e\x63\ -\x6f\x6d\x0a\x0a\x20\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\ -\x74\x69\x6f\x6e\x20\x61\x6e\x64\x20\x75\x73\x65\x20\x69\x6e\x20\ -\x73\x6f\x75\x72\x63\x65\x20\x61\x6e\x64\x20\x62\x69\x6e\x61\x72\ -\x79\x20\x66\x6f\x72\x6d\x73\x2c\x20\x77\x69\x74\x68\x20\x6f\x72\ -\x20\x77\x69\x74\x68\x6f\x75\x74\x0a\x20\x20\x6d\x6f\x64\x69\x66\ -\x69\x63\x61\x74\x69\x6f\x6e\x2c\x20\x61\x72\x65\x20\x70\x65\x72\ -\x6d\x69\x74\x74\x65\x64\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\ -\x74\x68\x61\x74\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\ -\x6e\x67\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x72\ -\x65\x20\x6d\x65\x74\x3a\x0a\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\ -\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\x6f\x66\ -\x20\x73\x6f\x75\x72\x63\x65\x20\x63\x6f\x64\x65\x20\x6d\x75\x73\ -\x74\x20\x72\x65\x74\x61\x69\x6e\x20\x74\x68\x65\x20\x61\x62\x6f\ -\x76\x65\x20\x63\x6f\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\ -\x20\x20\x20\x6e\x6f\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\ -\x6c\x69\x73\x74\x20\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\ -\x6e\x73\x20\x61\x6e\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\ -\x77\x69\x6e\x67\x20\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x2e\ -\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\ -\x75\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x62\x69\x6e\x61\x72\x79\ -\x20\x66\x6f\x72\x6d\x20\x6d\x75\x73\x74\x20\x72\x65\x70\x72\x6f\ -\x64\x75\x63\x65\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\ -\x6f\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\ -\x6f\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\ -\x20\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\ -\x6e\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\ -\x20\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x20\x69\x6e\x20\x74\ -\x68\x65\x0a\x20\x20\x20\x20\x20\x20\x64\x6f\x63\x75\x6d\x65\x6e\ -\x74\x61\x74\x69\x6f\x6e\x20\x61\x6e\x64\x2f\x6f\x72\x20\x6f\x74\ -\x68\x65\x72\x20\x6d\x61\x74\x65\x72\x69\x61\x6c\x73\x20\x70\x72\ -\x6f\x76\x69\x64\x65\x64\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\ -\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x2e\x0a\x20\x20\ -\x20\x20\x2a\x20\x4e\x65\x69\x74\x68\x65\x72\x20\x74\x68\x65\x20\ -\x6e\x61\x6d\x65\x20\x6f\x66\x20\x74\x68\x65\x20\x3c\x6f\x72\x67\ -\x61\x6e\x69\x7a\x61\x74\x69\x6f\x6e\x3e\x20\x6e\x6f\x72\x20\x74\ -\x68\x65\x0a\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x73\x20\x6f\ -\x66\x20\x69\x74\x73\x20\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\x6f\ -\x72\x73\x20\x6d\x61\x79\x20\x62\x65\x20\x75\x73\x65\x64\x20\x74\ -\x6f\x20\x65\x6e\x64\x6f\x72\x73\x65\x20\x6f\x72\x20\x70\x72\x6f\ -\x6d\x6f\x74\x65\x20\x70\x72\x6f\x64\x75\x63\x74\x73\x0a\x20\x20\ -\x20\x20\x20\x20\x64\x65\x72\x69\x76\x65\x64\x20\x66\x72\x6f\x6d\ -\x20\x74\x68\x69\x73\x20\x73\x6f\x66\x74\x77\x61\x72\x65\x20\x77\ -\x69\x74\x68\x6f\x75\x74\x20\x73\x70\x65\x63\x69\x66\x69\x63\x20\ -\x70\x72\x69\x6f\x72\x20\x77\x72\x69\x74\x74\x65\x6e\x20\x70\x65\ -\x72\x6d\x69\x73\x73\x69\x6f\x6e\x2e\x0a\x0a\x20\x20\x54\x48\x49\ -\x53\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x20\x49\x53\x20\x50\x52\ -\x4f\x56\x49\x44\x45\x44\x20\x42\x59\x20\x54\x48\x45\x20\x43\x4f\ -\x50\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\x53\x20\ -\x41\x4e\x44\x20\x43\x4f\x4e\x54\x52\x49\x42\x55\x54\x4f\x52\x53\ -\x20\x22\x41\x53\x20\x49\x53\x22\x0a\x20\x20\x41\x4e\x44\x20\x41\ -\x4e\x59\x20\x45\x58\x50\x52\x45\x53\x53\x20\x4f\x52\x20\x49\x4d\ -\x50\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\x54\x49\x45\x53\ -\x2c\x20\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\ -\x20\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\ -\x20\x54\x48\x45\x0a\x20\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\ -\x41\x52\x52\x41\x4e\x54\x49\x45\x53\x20\x4f\x46\x20\x4d\x45\x52\ -\x43\x48\x41\x4e\x54\x41\x42\x49\x4c\x49\x54\x59\x20\x41\x4e\x44\ -\x20\x46\x49\x54\x4e\x45\x53\x53\x20\x46\x4f\x52\x20\x41\x20\x50\ -\x41\x52\x54\x49\x43\x55\x4c\x41\x52\x20\x50\x55\x52\x50\x4f\x53\ -\x45\x0a\x20\x20\x41\x52\x45\x20\x44\x49\x53\x43\x4c\x41\x49\x4d\ -\x45\x44\x2e\x20\x49\x4e\x20\x4e\x4f\x20\x45\x56\x45\x4e\x54\x20\ -\x53\x48\x41\x4c\x4c\x20\x3c\x43\x4f\x50\x59\x52\x49\x47\x48\x54\ -\x20\x48\x4f\x4c\x44\x45\x52\x3e\x20\x42\x45\x20\x4c\x49\x41\x42\ -\x4c\x45\x20\x46\x4f\x52\x20\x41\x4e\x59\x0a\x20\x20\x44\x49\x52\ -\x45\x43\x54\x2c\x20\x49\x4e\x44\x49\x52\x45\x43\x54\x2c\x20\x49\ -\x4e\x43\x49\x44\x45\x4e\x54\x41\x4c\x2c\x20\x53\x50\x45\x43\x49\ -\x41\x4c\x2c\x20\x45\x58\x45\x4d\x50\x4c\x41\x52\x59\x2c\x20\x4f\ -\x52\x20\x43\x4f\x4e\x53\x45\x51\x55\x45\x4e\x54\x49\x41\x4c\x20\ -\x44\x41\x4d\x41\x47\x45\x53\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\ -\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\ -\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x50\x52\x4f\x43\x55\x52\ -\x45\x4d\x45\x4e\x54\x20\x4f\x46\x20\x53\x55\x42\x53\x54\x49\x54\ -\x55\x54\x45\x20\x47\x4f\x4f\x44\x53\x20\x4f\x52\x20\x53\x45\x52\ -\x56\x49\x43\x45\x53\x3b\x0a\x20\x20\x4c\x4f\x53\x53\x20\x4f\x46\ -\x20\x55\x53\x45\x2c\x20\x44\x41\x54\x41\x2c\x20\x4f\x52\x20\x50\ -\x52\x4f\x46\x49\x54\x53\x3b\x20\x4f\x52\x20\x42\x55\x53\x49\x4e\ -\x45\x53\x53\x20\x49\x4e\x54\x45\x52\x52\x55\x50\x54\x49\x4f\x4e\ -\x29\x20\x48\x4f\x57\x45\x56\x45\x52\x20\x43\x41\x55\x53\x45\x44\ -\x20\x41\x4e\x44\x0a\x20\x20\x4f\x4e\x20\x41\x4e\x59\x20\x54\x48\ -\x45\x4f\x52\x59\x20\x4f\x46\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\ -\x59\x2c\x20\x57\x48\x45\x54\x48\x45\x52\x20\x49\x4e\x20\x43\x4f\ -\x4e\x54\x52\x41\x43\x54\x2c\x20\x53\x54\x52\x49\x43\x54\x20\x4c\ -\x49\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x4f\x52\x20\x54\x4f\x52\ -\x54\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x20\x4e\ -\x45\x47\x4c\x49\x47\x45\x4e\x43\x45\x20\x4f\x52\x20\x4f\x54\x48\ -\x45\x52\x57\x49\x53\x45\x29\x20\x41\x52\x49\x53\x49\x4e\x47\x20\ -\x49\x4e\x20\x41\x4e\x59\x20\x57\x41\x59\x20\x4f\x55\x54\x20\x4f\ -\x46\x20\x54\x48\x45\x20\x55\x53\x45\x20\x4f\x46\x0a\x20\x20\x54\ -\x48\x49\x53\x20\x53\x4f\x46\x54\x57\x41\x52\x45\x2c\x20\x45\x56\ -\x45\x4e\x20\x49\x46\x20\x41\x44\x56\x49\x53\x45\x44\x20\x4f\x46\ -\x20\x54\x48\x45\x20\x50\x4f\x53\x53\x49\x42\x49\x4c\x49\x54\x59\ -\x20\x4f\x46\x20\x53\x55\x43\x48\x20\x44\x41\x4d\x41\x47\x45\x2e\ -\x0a\x2a\x2f\x0a\x0a\x2f\x2f\x20\x54\x68\x69\x73\x20\x61\x6c\x6c\ -\x6f\x77\x73\x20\x63\x72\x65\x61\x74\x69\x6e\x67\x20\x61\x20\x6e\ -\x65\x77\x20\x77\x65\x62\x20\x70\x61\x67\x65\x20\x75\x73\x69\x6e\ -\x67\x20\x74\x68\x65\x20\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x20\ -\x22\x6e\x65\x77\x20\x57\x65\x62\x50\x61\x67\x65\x22\x2c\x0a\x2f\ -\x2f\x20\x77\x68\x69\x63\x68\x20\x66\x65\x65\x6c\x73\x20\x6d\x6f\ -\x72\x65\x20\x6e\x61\x74\x75\x72\x61\x6c\x20\x74\x68\x61\x6e\x20\ -\x22\x70\x68\x61\x6e\x74\x6f\x6d\x2e\x63\x72\x65\x61\x74\x65\x57\ -\x65\x62\x50\x61\x67\x65\x28\x29\x22\x2e\x0a\x77\x69\x6e\x64\x6f\ -\x77\x2e\x57\x65\x62\x50\x61\x67\x65\x20\x3d\x20\x66\x75\x6e\x63\ -\x74\x69\x6f\x6e\x20\x28\x6f\x70\x74\x73\x29\x20\x7b\x0a\x20\x20\ -\x20\x20\x76\x61\x72\x20\x70\x61\x67\x65\x20\x3d\x20\x70\x68\x61\ -\x6e\x74\x6f\x6d\x2e\x63\x72\x65\x61\x74\x65\x57\x65\x62\x50\x61\ -\x67\x65\x28\x29\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x68\x61\ -\x6e\x64\x6c\x65\x72\x73\x20\x3d\x20\x7b\x7d\x3b\x0a\x0a\x20\x20\ -\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x68\x65\x63\x6b\ -\x54\x79\x70\x65\x28\x6f\x2c\x20\x74\x79\x70\x65\x29\x20\x7b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x74\ -\x79\x70\x65\x6f\x66\x20\x6f\x20\x3d\x3d\x3d\x20\x74\x79\x70\x65\ -\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\ -\x63\x74\x69\x6f\x6e\x20\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x6f\ -\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\ -\x72\x6e\x20\x63\x68\x65\x63\x6b\x54\x79\x70\x65\x28\x6f\x2c\x20\ -\x27\x6f\x62\x6a\x65\x63\x74\x27\x29\x3b\x0a\x20\x20\x20\x20\x7d\ -\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\ -\x73\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\x28\x6f\x29\x20\x7b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x63\ -\x68\x65\x63\x6b\x54\x79\x70\x65\x28\x6f\x2c\x20\x27\x75\x6e\x64\ -\x65\x66\x69\x6e\x65\x64\x27\x29\x3b\x0a\x20\x20\x20\x20\x7d\x0a\ -\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x73\ -\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\x4f\x72\x4e\x75\x6c\x6c\x28\ -\x6f\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\ -\x75\x72\x6e\x20\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\x28\ -\x6f\x29\x20\x7c\x7c\x20\x6e\x75\x6c\x6c\x20\x3d\x3d\x3d\x20\x6f\ -\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\ -\x63\x74\x69\x6f\x6e\x20\x63\x6f\x70\x79\x49\x6e\x74\x6f\x28\x74\ -\x61\x72\x67\x65\x74\x2c\x20\x73\x6f\x75\x72\x63\x65\x29\x20\x7b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x74\x61\x72\ -\x67\x65\x74\x20\x3d\x3d\x3d\x20\x73\x6f\x75\x72\x63\x65\x20\x7c\ -\x7c\x20\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\x4f\x72\x4e\ -\x75\x6c\x6c\x28\x73\x6f\x75\x72\x63\x65\x29\x29\x20\x7b\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\ -\x6e\x20\x74\x61\x72\x67\x65\x74\x3b\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\ -\x67\x65\x74\x20\x3d\x20\x74\x61\x72\x67\x65\x74\x20\x7c\x7c\x20\ -\x7b\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\ -\x43\x6f\x70\x79\x20\x69\x6e\x74\x6f\x20\x6f\x62\x6a\x65\x63\x74\ -\x73\x20\x6f\x6e\x6c\x79\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x69\ -\x66\x20\x28\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x74\x61\x72\x67\ -\x65\x74\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x2f\x2f\x20\x4d\x61\x6b\x65\x20\x73\x75\x72\x65\x20\ -\x73\x6f\x75\x72\x63\x65\x20\x65\x78\x69\x73\x74\x73\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x75\x72\x63\x65\ -\x20\x3d\x20\x73\x6f\x75\x72\x63\x65\x20\x7c\x7c\x20\x7b\x7d\x3b\ -\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\ -\x20\x28\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x73\x6f\x75\x72\x63\ -\x65\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x76\x61\x72\x20\x69\x2c\x20\x6e\x65\x77\ -\x54\x61\x72\x67\x65\x74\x2c\x20\x6e\x65\x77\x53\x6f\x75\x72\x63\ -\x65\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x6f\x72\x20\x28\x69\x20\x69\x6e\x20\x73\x6f\x75\ -\x72\x63\x65\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x73\ -\x6f\x75\x72\x63\x65\x2e\x68\x61\x73\x4f\x77\x6e\x50\x72\x6f\x70\ -\x65\x72\x74\x79\x28\x69\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x20\x3d\x20\x74\ -\x61\x72\x67\x65\x74\x5b\x69\x5d\x3b\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x6e\x65\x77\x53\x6f\x75\x72\x63\x65\x20\x3d\x20\x73\x6f\ -\x75\x72\x63\x65\x5b\x69\x5d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x69\x66\x20\x28\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x20\ -\x26\x26\x20\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x6e\x65\x77\x53\ -\x6f\x75\x72\x63\x65\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x44\x65\x65\x70\x20\x63\x6f\ -\x70\x79\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\ -\x65\x77\x54\x61\x72\x67\x65\x74\x20\x3d\x20\x63\x6f\x70\x79\x49\ -\x6e\x74\x6f\x28\x74\x61\x72\x67\x65\x74\x5b\x69\x5d\x2c\x20\x6e\ -\x65\x77\x53\x6f\x75\x72\x63\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x7d\x20\x65\x6c\x73\x65\x20\x7b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x65\x77\x54\x61\x72\x67\x65\ -\x74\x20\x3d\x20\x6e\x65\x77\x53\x6f\x75\x72\x63\x65\x3b\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x69\x66\x20\x28\x21\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\ -\x65\x64\x28\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x29\x29\x20\x7b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\ -\x67\x65\x74\x5b\x69\x5d\x20\x3d\x20\x6e\x65\x77\x54\x61\x72\x67\ -\x65\x74\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x7d\x20\x65\x6c\x73\x65\x20\x7b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\ -\x74\x20\x3d\x20\x73\x6f\x75\x72\x63\x65\x3b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\ -\x75\x72\x6e\x20\x74\x61\x72\x67\x65\x74\x3b\x0a\x20\x20\x20\x20\ -\x7d\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\ -\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\x28\x68\x61\x6e\ -\x64\x6c\x65\x72\x4e\x61\x6d\x65\x2c\x20\x73\x69\x67\x6e\x61\x6c\ -\x4e\x61\x6d\x65\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x70\x61\x67\x65\x2e\x5f\x5f\x64\x65\x66\x69\x6e\x65\x53\x65\x74\ -\x74\x65\x72\x5f\x5f\x28\x68\x61\x6e\x64\x6c\x65\x72\x4e\x61\x6d\ -\x65\x2c\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x66\x29\x20\ -\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\ -\x20\x28\x68\x61\x6e\x64\x6c\x65\x72\x73\x20\x26\x26\x20\x74\x79\ -\x70\x65\x6f\x66\x20\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\ -\x67\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x20\x3d\x3d\x3d\x20\x27\x66\ -\x75\x6e\x63\x74\x69\x6f\x6e\x27\x29\x20\x7b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x72\x79\x20\ -\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x5b\x73\x69\x67\x6e\x61\ -\x6c\x4e\x61\x6d\x65\x5d\x2e\x64\x69\x73\x63\x6f\x6e\x6e\x65\x63\ -\x74\x28\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\x67\x6e\x61\ -\x6c\x4e\x61\x6d\x65\x5d\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x63\x61\x74\x63\x68\ -\x20\x28\x65\x29\x20\x7b\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\x67\x6e\x61\ -\x6c\x4e\x61\x6d\x65\x5d\x20\x3d\x20\x66\x3b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x5b\x73\x69\x67\ -\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x2e\x63\x6f\x6e\x6e\x65\x63\x74\ -\x28\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\x67\x6e\x61\x6c\ -\x4e\x61\x6d\x65\x5d\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x7d\x29\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x2f\ -\x2f\x20\x64\x65\x65\x70\x20\x63\x6f\x70\x79\x0a\x20\x20\x20\x20\ -\x70\x61\x67\x65\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x20\x3d\x20\ -\x4a\x53\x4f\x4e\x2e\x70\x61\x72\x73\x65\x28\x4a\x53\x4f\x4e\x2e\ -\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x70\x68\x61\x6e\x74\x6f\ -\x6d\x2e\x64\x65\x66\x61\x75\x6c\x74\x50\x61\x67\x65\x53\x65\x74\ -\x74\x69\x6e\x67\x73\x29\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\ -\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\x28\x22\x6f\x6e\x49\x6e\ -\x69\x74\x69\x61\x6c\x69\x7a\x65\x64\x22\x2c\x20\x22\x69\x6e\x69\ -\x74\x69\x61\x6c\x69\x7a\x65\x64\x22\x29\x3b\x0a\x0a\x20\x20\x20\ -\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\x28\x22\x6f\ -\x6e\x4c\x6f\x61\x64\x53\x74\x61\x72\x74\x65\x64\x22\x2c\x20\x22\ -\x6c\x6f\x61\x64\x53\x74\x61\x72\x74\x65\x64\x22\x29\x3b\x0a\x0a\ -\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\ -\x28\x22\x6f\x6e\x4c\x6f\x61\x64\x46\x69\x6e\x69\x73\x68\x65\x64\ -\x22\x2c\x20\x22\x6c\x6f\x61\x64\x46\x69\x6e\x69\x73\x68\x65\x64\ -\x22\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\ -\x65\x74\x74\x65\x72\x28\x22\x6f\x6e\x52\x65\x73\x6f\x75\x72\x63\ -\x65\x52\x65\x71\x75\x65\x73\x74\x65\x64\x22\x2c\x20\x22\x72\x65\ -\x73\x6f\x75\x72\x63\x65\x52\x65\x71\x75\x65\x73\x74\x65\x64\x22\ -\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\x65\ -\x74\x74\x65\x72\x28\x22\x6f\x6e\x52\x65\x73\x6f\x75\x72\x63\x65\ -\x52\x65\x63\x65\x69\x76\x65\x64\x22\x2c\x20\x22\x72\x65\x73\x6f\ -\x75\x72\x63\x65\x52\x65\x63\x65\x69\x76\x65\x64\x22\x29\x3b\x0a\ -\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\ -\x72\x28\x22\x6f\x6e\x41\x6c\x65\x72\x74\x22\x2c\x20\x22\x6a\x61\ -\x76\x61\x53\x63\x72\x69\x70\x74\x41\x6c\x65\x72\x74\x53\x65\x6e\ -\x74\x22\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\ -\x53\x65\x74\x74\x65\x72\x28\x22\x6f\x6e\x43\x6f\x6e\x73\x6f\x6c\ -\x65\x4d\x65\x73\x73\x61\x67\x65\x22\x2c\x20\x22\x6a\x61\x76\x61\ -\x53\x63\x72\x69\x70\x74\x43\x6f\x6e\x73\x6f\x6c\x65\x4d\x65\x73\ -\x73\x61\x67\x65\x53\x65\x6e\x74\x22\x29\x3b\x0a\x0a\x20\x20\x20\ -\x20\x70\x61\x67\x65\x2e\x6f\x70\x65\x6e\x20\x3d\x20\x66\x75\x6e\ -\x63\x74\x69\x6f\x6e\x20\x28\x75\x72\x6c\x2c\x20\x61\x72\x67\x31\ -\x2c\x20\x61\x72\x67\x32\x2c\x20\x61\x72\x67\x33\x2c\x20\x61\x72\ -\x67\x34\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\ -\x20\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\ -\x74\x68\x20\x3d\x3d\x3d\x20\x31\x29\x20\x7b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\x70\x65\ -\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x27\x67\x65\x74\x27\x2c\ -\x20\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x29\x3b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\ -\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\ -\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\ -\x32\x20\x26\x26\x20\x74\x79\x70\x65\x6f\x66\x20\x61\x72\x67\x31\ -\x20\x3d\x3d\x3d\x20\x27\x66\x75\x6e\x63\x74\x69\x6f\x6e\x27\x29\ -\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ -\x68\x69\x73\x2e\x6f\x6e\x4c\x6f\x61\x64\x46\x69\x6e\x69\x73\x68\ -\x65\x64\x20\x3d\x20\x61\x72\x67\x31\x3b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\x70\x65\x6e\ -\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x27\x67\x65\x74\x27\x2c\x20\ -\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x29\x3b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\ -\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x65\x6c\ -\x73\x65\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\ -\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\x32\x29\x20\x7b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\ -\x73\x2e\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x61\ -\x72\x67\x31\x2c\x20\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\ -\x67\x73\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x72\x65\x74\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x7d\x20\x65\x6c\x73\x65\x20\x69\x66\x20\x28\x61\x72\x67\x75\ -\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\ -\x20\x33\x20\x26\x26\x20\x74\x79\x70\x65\x6f\x66\x20\x61\x72\x67\ -\x32\x20\x3d\x3d\x3d\x20\x27\x66\x75\x6e\x63\x74\x69\x6f\x6e\x27\ -\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x74\x68\x69\x73\x2e\x6f\x6e\x4c\x6f\x61\x64\x46\x69\x6e\x69\x73\ -\x68\x65\x64\x20\x3d\x20\x61\x72\x67\x32\x3b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\x70\x65\ -\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x61\x72\x67\x31\x2c\x20\ -\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x29\x3b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\ -\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x65\x6c\ -\x73\x65\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\ -\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\x33\x29\x20\x7b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\ -\x73\x2e\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x7b\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x6f\x70\x65\x72\x61\x74\x69\x6f\x6e\x3a\x20\x61\x72\x67\x31\ -\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x64\x61\x74\x61\x3a\x20\x61\x72\x67\x32\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x2c\x20\x74\x68\x69\x73\ -\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x29\x3b\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x3b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x65\x6c\x73\x65\x20\x69\ -\x66\x20\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\ -\x67\x74\x68\x20\x3d\x3d\x3d\x20\x34\x29\x20\x7b\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\x6e\ -\x4c\x6f\x61\x64\x46\x69\x6e\x69\x73\x68\x65\x64\x20\x3d\x20\x61\ -\x72\x67\x33\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x68\x69\x73\x2e\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\ -\x6c\x2c\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x6f\x70\x65\x72\x61\x74\x69\x6f\x6e\x3a\x20\ -\x61\x72\x67\x31\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x64\x61\x74\x61\x3a\x20\x61\x72\x67\x32\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x2c\x20\ -\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x29\x3b\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\ -\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x57\x72\x6f\ -\x6e\x67\x20\x75\x73\x65\x20\x6f\x66\x20\x57\x65\x62\x50\x61\x67\ -\x65\x23\x6f\x70\x65\x6e\x22\x3b\x0a\x20\x20\x20\x20\x7d\x3b\x0a\ -\x0a\x20\x20\x20\x20\x70\x61\x67\x65\x2e\x69\x6e\x63\x6c\x75\x64\ -\x65\x4a\x73\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\ -\x73\x63\x72\x69\x70\x74\x55\x72\x6c\x2c\x20\x6f\x6e\x53\x63\x72\ -\x69\x70\x74\x4c\x6f\x61\x64\x65\x64\x29\x20\x7b\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x2f\x2f\x20\x52\x65\x67\x69\x73\x74\x65\x72\ -\x20\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x20\x73\x69\x67\x6e\x61\ -\x6c\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x66\x6f\x72\x20\x27\x61\ -\x6c\x65\x72\x74\x28\x29\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x74\x68\x69\x73\x2e\x6a\x61\x76\x61\x53\x63\x72\x69\x70\x74\x41\ -\x6c\x65\x72\x74\x53\x65\x6e\x74\x2e\x63\x6f\x6e\x6e\x65\x63\x74\ -\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x6d\x73\x67\x46\x72\ -\x6f\x6d\x41\x6c\x65\x72\x74\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x6d\x73\x67\x46\x72\ -\x6f\x6d\x41\x6c\x65\x72\x74\x20\x3d\x3d\x3d\x20\x73\x63\x72\x69\ -\x70\x74\x55\x72\x6c\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x52\x65\x73\x6f\ -\x75\x72\x63\x65\x20\x6c\x6f\x61\x64\x65\x64\x2c\x20\x74\x69\x6d\ -\x65\x20\x74\x6f\x20\x66\x69\x72\x65\x20\x74\x68\x65\x20\x63\x61\ -\x6c\x6c\x62\x61\x63\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x6f\x6e\x53\x63\x72\x69\x70\x74\x4c\ -\x6f\x61\x64\x65\x64\x28\x73\x63\x72\x69\x70\x74\x55\x72\x6c\x29\ -\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x2f\x2f\x20\x41\x6e\x64\x20\x64\x69\x73\x63\x6f\x6e\x6e\ -\x65\x63\x74\x20\x74\x68\x65\x20\x73\x69\x67\x6e\x61\x6c\x20\x68\ -\x61\x6e\x64\x6c\x65\x72\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x74\x72\x79\x20\x7b\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x68\x69\x73\x2e\x6a\x61\x76\x61\x53\x63\x72\x69\x70\x74\ -\x41\x6c\x65\x72\x74\x53\x65\x6e\x74\x2e\x64\x69\x73\x63\x6f\x6e\ -\x6e\x65\x63\x74\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x63\ -\x61\x6c\x6c\x65\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x63\x61\x74\x63\x68\x20\ -\x28\x65\x29\x20\x7b\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x29\x3b\ -\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x41\x70\x70\ -\x65\x6e\x64\x20\x74\x68\x65\x20\x73\x63\x72\x69\x70\x74\x20\x74\ -\x61\x67\x20\x74\x6f\x20\x74\x68\x65\x20\x62\x6f\x64\x79\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x5f\x61\x70\x70\ -\x65\x6e\x64\x53\x63\x72\x69\x70\x74\x45\x6c\x65\x6d\x65\x6e\x74\ -\x28\x73\x63\x72\x69\x70\x74\x55\x72\x6c\x29\x3b\x0a\x20\x20\x20\ -\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x2f\x2f\x20\x43\x6f\x70\x79\ -\x20\x6f\x70\x74\x69\x6f\x6e\x73\x20\x69\x6e\x74\x6f\x20\x70\x61\ -\x67\x65\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x6f\x70\x74\x73\x29\ -\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x70\x61\x67\x65\x20\ -\x3d\x20\x63\x6f\x70\x79\x49\x6e\x74\x6f\x28\x70\x61\x67\x65\x2c\ -\x20\x6f\x70\x74\x73\x29\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\ -\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x70\x61\x67\x65\x3b\x0a\ -\x7d\x3b\x0a\ \x00\x00\x56\x27\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -5013,10 +4417,6 @@ \x01\x28\x25\x93\ \x00\x63\ \x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x67\x00\x75\x00\x72\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x6a\x00\x73\ -\x00\x0f\ -\x0b\x21\xdb\x73\ -\x00\x77\ -\x00\x65\x00\x62\x00\x70\x00\x61\x00\x67\x00\x65\x00\x2d\x00\x73\x00\x68\x00\x69\x00\x6d\x00\x2e\x00\x6a\x00\x73\ \x00\x09\ \x0a\x6c\x78\x43\ \x00\x72\ @@ -5033,13 +4433,12 @@ " qt_resource_struct = "\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x01\ -\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x18\xa7\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x66\x00\x02\x00\x00\x00\x02\x00\x00\x00\x05\ -\x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x19\xc5\ -\x00\x00\x00\xac\x00\x01\x00\x00\x00\x01\x00\x00\x88\xe8\ -\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x32\xbd\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\ +\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x8d\ +\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\x42\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\ +\x00\x00\x00\x88\x00\x01\x00\x00\x00\x01\x00\x00\x63\xd6\ +\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xab\ " def qInitResources(): From 7bb97fb0dad9841e9d3a274096bd2cbc41b3efbf Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 9 Sep 2011 00:52:49 -0700 Subject: [PATCH 12/18] Create FileSystem instance only when needed. Also made FileSystem a singleton. --- python/pyphantomjs/filesystem.py | 6 ++++++ python/pyphantomjs/phantom.py | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/python/pyphantomjs/filesystem.py b/python/pyphantomjs/filesystem.py index 376ac458e8..4703c22224 100644 --- a/python/pyphantomjs/filesystem.py +++ b/python/pyphantomjs/filesystem.py @@ -111,6 +111,12 @@ def writeLine(self, data): class FileSystem(QObject): + _instance = None + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super(CSConverter, cls).__new__(cls, *args, **kwargs) + return cls._instance + def __init__(self, parent): QObject.__init__(self, parent) diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 1608228a49..bd5fd200e7 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -52,8 +52,6 @@ def __init__(self, parent, args): self.m_scriptEncoding = Encode(args.script_encoding, 'utf-8') self.m_outputEncoding = Encode(args.output_encoding, sys.stdout.encoding_sys) - self.m_filesystem = FileSystem(self) - self.m_pages.append(self.m_page) do_action('PhantomInitPre') @@ -120,7 +118,7 @@ def args(self): @pyqtSlot(result=FileSystem) def createFilesystem(self): - return self.m_filesystem + return FileSystem(self) @pyqtSlot(result=WebPage) def createWebPage(self): From c7dafc8dcb388b35c3cdce55a384e9027dfe2967 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 9 Sep 2011 01:11:05 -0700 Subject: [PATCH 13/18] Fix wrong viewport size due to commits 983518d9 and 7641e4e1. http://code.google.com/p/phantomjs/issues/detail?id=217 --- python/pyphantomjs/webpage.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index 3137687081..957797cacd 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -40,7 +40,6 @@ def __init__(self, parent): self.m_parent = parent self.m_userAgent = QWebPage.userAgentForUrl(self, QUrl()) - self.m_scrollPosition = QPoint() self.m_uploadFile = '' @@ -83,7 +82,7 @@ def __init__(self, parent): self.m_paperSize = {} self.m_clipRect = QRect() self.m_libraryPath = '' - self.m_mousePos = QPoint() + self.m_mousePos = self.m_scrollPosition = QPoint() self.setObjectName('WebPage') self.m_webPage = CustomPage(self) @@ -137,15 +136,14 @@ def mainFrame(self): return self.m_mainFrame def renderImage(self): - viewportSize = self.m_webPage.viewportSize() - frameRect = QRect(QPoint(0, 0), viewportSize) + contentsSize = self.m_mainFrame.contentsSize() + contentsSize -= QSize(self.m_scrollPosition.x(), self.m_scrollPosition.y()) + frameRect = QRect(QPoint(0, 0), contentsSize) if not self.m_clipRect.isEmpty(): frameRect = self.m_clipRect - if self.m_webPage.m_scrollPosition: - self.m_webPage.mainFrame().\ - setScrollPosition(QPoint(self.m_webPage.m_scrollPosition.x(), - self.m_webPage.m_scrollPosition.y() )) + viewportSize = self.m_webPage.viewportSize() + self.m_webPage.setViewportSize(contentsSize) image = QImage(frameRect.size(), QImage.Format_ARGB32) image.fill(qRgba(255, 255, 255, 0)) @@ -431,7 +429,7 @@ def libraryPath(self, dirPath): @pyqtProperty('QVariantMap') def scrollPosition(self): - scroll = self.m_webPage.m_scrollPosition + scroll = self.m_scrollPosition result = { 'left': scroll.x(), 'top': scroll.y() @@ -448,7 +446,8 @@ def scrollPosition(self, size): positions[item] = 0 except (KeyError, ValueError): positions[item] = self.scrollPosition[item] - self.m_webPage.m_scrollPosition = QPoint(positions['left'], positions['top']) + self.m_scrollPosition = QPoint(positions['left'], positions['top']) + self.m_mainFrame.setScrollPosition(self.m_scrollPosition) @pyqtSlot(str, str) def uploadFile(self, selector, fileName): From febf9a14f6fcbab5925e711130aaa149171fdb2e Mon Sep 17 00:00:00 2001 From: IceArmy Date: Mon, 12 Sep 2011 22:27:04 -0700 Subject: [PATCH 14/18] Use super() for all class initializers instead --- python/pyphantomjs/config.py | 2 +- python/pyphantomjs/cookiejar.py | 2 +- python/pyphantomjs/csconverter.py | 3 ++- python/pyphantomjs/filesystem.py | 4 ++-- python/pyphantomjs/networkaccessmanager.py | 2 +- python/pyphantomjs/networkreplyproxy.py | 2 +- python/pyphantomjs/phantom.py | 2 +- python/pyphantomjs/webpage.py | 4 ++-- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/python/pyphantomjs/config.py b/python/pyphantomjs/config.py index d8c9d39354..278d3ea7a0 100644 --- a/python/pyphantomjs/config.py +++ b/python/pyphantomjs/config.py @@ -26,7 +26,7 @@ class Config(QObject): def __init__(self, parent, jsonFile): - QObject.__init__(self, parent) + super(Config, self).__init__(parent) with codecs.open(jsonFile, encoding='utf-8') as fd: json = fd.read() diff --git a/python/pyphantomjs/cookiejar.py b/python/pyphantomjs/cookiejar.py index 39e33b158e..449fba19db 100644 --- a/python/pyphantomjs/cookiejar.py +++ b/python/pyphantomjs/cookiejar.py @@ -23,7 +23,7 @@ class CookieJar(QNetworkCookieJar): def __init__(self, parent, cookieFile): - QNetworkCookieJar.__init__(self, parent) + super(CookieJar, self).__init__(parent) self.m_cookieFile = cookieFile diff --git a/python/pyphantomjs/csconverter.py b/python/pyphantomjs/csconverter.py index df460ff470..159393fe59 100644 --- a/python/pyphantomjs/csconverter.py +++ b/python/pyphantomjs/csconverter.py @@ -32,7 +32,8 @@ def __new__(cls, *args, **kwargs): return cls._instance def __init__(self): - QObject.__init__(self, QApplication.instance()) + super(CSConverter, self).__init__(QApplication.instance()) + self.m_webPage = QWebPage(self) converter = QFile(':/resources/coffee-script.js') diff --git a/python/pyphantomjs/filesystem.py b/python/pyphantomjs/filesystem.py index 4703c22224..fc4d88bb2f 100644 --- a/python/pyphantomjs/filesystem.py +++ b/python/pyphantomjs/filesystem.py @@ -35,7 +35,7 @@ class File(QObject): def __init__(self, parent, openfile): - QObject.__init__(self, parent) + super(File, self).__init__(parent) self.m_file = openfile @@ -118,7 +118,7 @@ def __new__(cls, *args, **kwargs): return cls._instance def __init__(self, parent): - QObject.__init__(self, parent) + super(FileSystem, self).__init__(parent) do_action('FileSystemInit') diff --git a/python/pyphantomjs/networkaccessmanager.py b/python/pyphantomjs/networkaccessmanager.py index 62b978d9b2..043bbd7e9b 100644 --- a/python/pyphantomjs/networkaccessmanager.py +++ b/python/pyphantomjs/networkaccessmanager.py @@ -32,7 +32,7 @@ class NetworkAccessManager(QNetworkAccessManager): resourceRequested = pyqtSignal('QVariantMap') def __init__(self, parent, auth, cookieFile, diskCacheEnabled, ignoreSslErrors, maxDiskCacheSize): - QNetworkAccessManager.__init__(self, parent) + super(NetworkAccessManager, self).__init__(parent) self.m_ignoreSslErrors = ignoreSslErrors self.m_idCounter = 0 diff --git a/python/pyphantomjs/networkreplyproxy.py b/python/pyphantomjs/networkreplyproxy.py index dfb5f6a6a4..2ef3fd7e9c 100644 --- a/python/pyphantomjs/networkreplyproxy.py +++ b/python/pyphantomjs/networkreplyproxy.py @@ -22,7 +22,7 @@ class NetworkReplyProxy(QNetworkReply): def __init__(self, parent, reply): - QNetworkReply.__init__(self, parent) + super(NetworkReplyProxy, self).__init__(parent) self.m_reply = reply self.m_buffer = self.m_data = '' diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index bd5fd200e7..11a407364a 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -37,7 +37,7 @@ class Phantom(QObject): def __init__(self, parent, args): - QObject.__init__(self, parent) + super(Phantom, self).__init__(parent) # variable declarations self.m_defaultPageSettings = {} diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index 957797cacd..5d8fcb1cc4 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -35,7 +35,7 @@ class CustomPage(QWebPage): def __init__(self, parent): - QWebPage.__init__(self, parent) + super(CustomPage, self).__init__(parent) self.m_parent = parent @@ -74,7 +74,7 @@ class WebPage(QObject): resourceRequested = pyqtSignal('QVariantMap') def __init__(self, parent): - QObject.__init__(self, parent) + super(WebPage, self).__init__(parent) self.m_parent = parent From 826ab347e41ec0c68301d8037f812e48433e3efa Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 13 Sep 2011 14:45:28 -0700 Subject: [PATCH 15/18] Refactoring on the module implementation. Also implemented a new QPyFile class which is a wrapper over QFile, supporting context managers. It greatly improves code readability and reusability. http://code.google.com/p/phantomjs/issues/detail?id=47 --- python/pyphantomjs/bootstrap.js | 303 ++------------------------ python/pyphantomjs/config.py | 13 +- python/pyphantomjs/csconverter.py | 11 +- python/pyphantomjs/modules/fs.js | 162 ++++++++++++++ python/pyphantomjs/modules/webpage.js | 180 +++++++++++++++ python/pyphantomjs/phantom.py | 29 ++- python/pyphantomjs/resources.qrc | 2 + python/pyphantomjs/utils.py | 18 +- python/pyphantomjs/webpage.py | 2 +- 9 files changed, 398 insertions(+), 322 deletions(-) create mode 100644 python/pyphantomjs/modules/fs.js create mode 100644 python/pyphantomjs/modules/webpage.js diff --git a/python/pyphantomjs/bootstrap.js b/python/pyphantomjs/bootstrap.js index 1de4c5b54a..5c7328e52d 100644 --- a/python/pyphantomjs/bootstrap.js +++ b/python/pyphantomjs/bootstrap.js @@ -1,5 +1,5 @@ /*jslint sloppy: true, nomen: true */ -/*global window:true,phantom:true,fs:true */ +/*global window:true,phantom:true */ /* This file is part of the PhantomJS project from Ofi Labs. @@ -35,300 +35,23 @@ function require(name) { - var exports; - - if (name === 'webpage') { - - exports = function (opts) { - var page = phantom.createWebPage(), - handlers = {}; - - function checkType(o, type) { - return typeof o === type; - } - - function isObject(o) { - return checkType(o, 'object'); - } - - function isUndefined(o) { - return checkType(o, 'undefined'); - } - - function isUndefinedOrNull(o) { - return isUndefined(o) || null === o; - } - - function copyInto(target, source) { - if (target === source || isUndefinedOrNull(source)) { - return target; - } - - target = target || {}; - - // Copy into objects only - if (isObject(target)) { - // Make sure source exists - source = source || {}; - - if (isObject(source)) { - var i, newTarget, newSource; - for (i in source) { - if (source.hasOwnProperty(i)) { - newTarget = target[i]; - newSource = source[i]; - - if (newTarget && isObject(newSource)) { - // Deep copy - newTarget = copyInto(target[i], newSource); - } else { - newTarget = newSource; - } - - if (!isUndefined(newTarget)) { - target[i] = newTarget; - } - } - } - } else { - target = source; - } - } - - return target; - } - - function defineSetter(handlerName, signalName) { - page.__defineSetter__(handlerName, function (f) { - if (handlers && typeof handlers[signalName] === 'function') { - try { - this[signalName].disconnect(handlers[signalName]); - } catch (e) {} - } - handlers[signalName] = f; - this[signalName].connect(handlers[signalName]); - }); - } - - // deep copy - page.settings = JSON.parse(JSON.stringify(phantom.defaultPageSettings)); - - defineSetter("onInitialized", "initialized"); - - defineSetter("onLoadStarted", "loadStarted"); - - defineSetter("onLoadFinished", "loadFinished"); - - defineSetter("onResourceRequested", "resourceRequested"); - - defineSetter("onResourceReceived", "resourceReceived"); - - defineSetter("onAlert", "javaScriptAlertSent"); - - defineSetter("onConsoleMessage", "javaScriptConsoleMessageSent"); - - page.open = function (url, arg1, arg2, arg3, arg4) { - if (arguments.length === 1) { - this.openUrl(url, 'get', this.settings); - return; - } - if (arguments.length === 2 && typeof arg1 === 'function') { - this.onLoadFinished = arg1; - this.openUrl(url, 'get', this.settings); - return; - } else if (arguments.length === 2) { - this.openUrl(url, arg1, this.settings); - return; - } else if (arguments.length === 3 && typeof arg2 === 'function') { - this.onLoadFinished = arg2; - this.openUrl(url, arg1, this.settings); - return; - } else if (arguments.length === 3) { - this.openUrl(url, { - operation: arg1, - data: arg2 - }, this.settings); - return; - } else if (arguments.length === 4) { - this.onLoadFinished = arg3; - this.openUrl(url, { - operation: arg1, - data: arg2 - }, this.settings); - return; - } - throw "Wrong use of WebPage#open"; - }; - - page.includeJs = function (scriptUrl, onScriptLoaded) { - // Register temporary signal handler for 'alert()' - this.javaScriptAlertSent.connect(function (msgFromAlert) { - if (msgFromAlert === scriptUrl) { - // Resource loaded, time to fire the callback - onScriptLoaded(scriptUrl); - // And disconnect the signal handler - try { - this.javaScriptAlertSent.disconnect(arguments.callee); - } catch (e) {} - } - }); - - // Append the script tag to the body - this._appendScriptElement(scriptUrl); - }; - - // Copy options into page - if (opts) { - page = copyInto(page, opts); - } - - return page; - }; - } - - if (name === 'fs') { - - exports = phantom.createFilesystem(); - - // JavaScript "shim" to throw exceptions in case a critical operation fails. - - /** Open and return a "file" object. - * It will throw exception if it fails. - * - * @param path Path of the file to open - * @param mode Open Mode. A string made of 'r', 'w', 'a/+' characters. - * @return "file" object - */ - exports.open = function (path, mode) { - var file = exports._open(path, mode); - if (file) { - return file; - } - throw "Unable to open file '" + path + "'"; - }; - - /** Open, read and return content of a file. - * It will throw an exception if it fails. - * - * @param path Path of the file to read from - * @return file content - */ - exports.read = function (path) { - var f = fs.open(path, 'r'), - content = f.read(); - - f.close(); - return content; - }; - - /** Open and write content to a file - * It will throw an exception if it fails. - * - * @param path Path of the file to read from - * @param content Content to write to the file - * @param mode Open Mode. A string made of 'w' or 'a / +' characters. - */ - exports.write = function (path, content, mode) { - var f = fs.open(path, mode); - - f.write(content); - f.close(); - }; - - /** Return the size of a file, in bytes. - * It will throw an exception if it fails. - * - * @param path Path of the file to read the size of - * @return File size in bytes - */ - exports.size = function (path) { - var size = fs._size(path); - if (size !== -1) { - return size; - } - throw "Unable to read file '" + path + "' size"; - }; - - /** Copy a file. - * It will throw an exception if it fails. - * - * @param source Path of the source file - * @param destination Path of the destination file - */ - exports.copy = function (source, destination) { - if (!fs._copy(source, destination)) { - throw "Unable to copy file '" + source + "' at '" + destination + "'"; - } - }; - - /** Copy a directory tree. - * It will throw an exception if it fails. - * - * @param source Path of the source directory tree - * @param destination Path of the destination directory tree - */ - exports.copyTree = function (source, destination) { - if (!fs._copyTree(source, destination)) { - throw "Unable to copy directory tree '" + source + "' at '" + destination + "'"; - } - }; - - /** Move a file. - * It will throw an exception if it fails. - * - * @param source Path of the source file - * @param destination Path of the destination file - */ - exports.move = function (source, destination) { - fs.copy(source, destination); - fs.remove(source); - }; - - /** Removes a file. - * It will throw an exception if it fails. - * - * @param path Path of the file to remove - */ - exports.remove = function (path) { - if (!fs._remove(path)) { - throw "Unable to remove file '" + path + "'"; - } - }; - - /** Removes a directory. - * It will throw an exception if it fails. - * - * @param path Path of the directory to remove - */ - exports.removeDirectory = function (path) { - if (!fs._removeDirectory(path)) { - throw "Unable to remove directory '" + path + "'"; - } - }; - - /** Removes a directory tree. - * It will throw an exception if it fails. - * - * @param path Path of the directory tree to remove - */ - exports.removeTree = function (path) { - if (!fs._removeTree(path)) { - throw "Unable to remove directory tree '" + path + "'"; - } - }; - - exports.touch = function (path) { - fs.write(path, "", 'a'); - }; - + var code, func, exports; + + if (name === 'webpage' || name === 'fs') { + code = phantom.loadModuleSource(name); + func = new Function("exports", "window", code); + exports = {}; + if (name === 'fs') { + exports = phantom.createFilesystem(); + } + func.call({}, exports, {}); + return exports; } if (typeof exports === 'undefined') { throw 'Unknown module ' + name + ' for require()'; } - - return exports; } // Legacy way to use WebPage -window.WebPage = require('webpage'); +window.WebPage = require('webpage').create; diff --git a/python/pyphantomjs/config.py b/python/pyphantomjs/config.py index 278d3ea7a0..62015db05b 100644 --- a/python/pyphantomjs/config.py +++ b/python/pyphantomjs/config.py @@ -20,9 +20,11 @@ import sys import codecs -from PyQt4.QtCore import QObject, QFile, qWarning +from PyQt4.QtCore import QObject, qWarning from PyQt4.QtWebKit import QWebPage +from utils import QPyFile + class Config(QObject): def __init__(self, parent, jsonFile): @@ -55,13 +57,8 @@ def __init__(self, parent, jsonFile): qWarning('Config file MUST be in JSON format!') return - file_ = QFile(':/configurator.js') - if not file_.open(QFile.ReadOnly): - sys.exit('Unable to load JSON configurator!') - configurator = file_.readAll().data() - file_.close() - if not configurator: - sys.exit('Unable to set-up JSON configurator!') + with QPyFile(':/configurator.js') as f: + configurator = f.readAll().data() webPage = QWebPage(self) diff --git a/python/pyphantomjs/csconverter.py b/python/pyphantomjs/csconverter.py index 159393fe59..80184ea206 100644 --- a/python/pyphantomjs/csconverter.py +++ b/python/pyphantomjs/csconverter.py @@ -19,10 +19,12 @@ import sys -from PyQt4.QtCore import QObject, QFile +from PyQt4.QtCore import QObject from PyQt4.QtGui import QApplication from PyQt4.QtWebKit import QWebPage +from utils import QPyFile + class CSConverter(QObject): _instance = None @@ -36,11 +38,8 @@ def __init__(self): self.m_webPage = QWebPage(self) - converter = QFile(':/resources/coffee-script.js') - if not converter.open(QFile.ReadOnly): - sys.exit('CoffeeScript compiler is not available!') - script = converter.readAll().data() - converter.close() + with QPyFile(':/resources/coffee-script.js') as f: + script = f.readAll().data() self.m_webPage.mainFrame().evaluateJavaScript(script) self.m_webPage.mainFrame().addToJavaScriptWindowObject('converter', self) diff --git a/python/pyphantomjs/modules/fs.js b/python/pyphantomjs/modules/fs.js new file mode 100644 index 0000000000..8aa0c49693 --- /dev/null +++ b/python/pyphantomjs/modules/fs.js @@ -0,0 +1,162 @@ +/*jslint sloppy: true, nomen: true */ +/*global exports:true */ + +/* + This file is part of the PhantomJS project from Ofi Labs. + + Copyright (C) 2011 Ivan De Marino + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +// JavaScript "shim" to throw exceptions in case a critical operation fails. + +/** Open and return a "file" object. + * It will throw exception if it fails. + * + * @param path Path of the file to open + * @param mode Open Mode. A string made of 'r', 'w', 'a/+' characters. + * @return "file" object + */ +exports.open = function (path, mode) { + var file = exports._open(path, mode); + if (file) { + return file; + } + throw "Unable to open file '" + path + "'"; +}; + +/** Open, read and return content of a file. + * It will throw an exception if it fails. + * + * @param path Path of the file to read from + * @return file content + */ +exports.read = function (path) { + var f = exports.open(path, 'r'), + content = f.read(); + + f.close(); + return content; +}; + +/** Open and write content to a file + * It will throw an exception if it fails. + * + * @param path Path of the file to read from + * @param content Content to write to the file + * @param mode Open Mode. A string made of 'w' or 'a / +' characters. + */ +exports.write = function (path, content, mode) { + var f = exports.open(path, mode); + + f.write(content); + f.close(); +}; + +/** Return the size of a file, in bytes. + * It will throw an exception if it fails. + * + * @param path Path of the file to read the size of + * @return File size in bytes + */ +exports.size = function (path) { + var size = exports._size(path); + if (size !== -1) { + return size; + } + throw "Unable to read file '" + path + "' size"; +}; + +/** Copy a file. + * It will throw an exception if it fails. + * + * @param source Path of the source file + * @param destination Path of the destination file + */ +exports.copy = function (source, destination) { + if (!exports._copy(source, destination)) { + throw "Unable to copy file '" + source + "' at '" + destination + "'"; + } +}; + +/** Copy a directory tree. + * It will throw an exception if it fails. + * + * @param source Path of the source directory tree + * @param destination Path of the destination directory tree + */ +exports.copyTree = function (source, destination) { + if (!exports._copyTree(source, destination)) { + throw "Unable to copy directory tree '" + source + "' at '" + destination + "'"; + } +}; + +/** Move a file. + * It will throw an exception if it fails. + * + * @param source Path of the source file + * @param destination Path of the destination file + */ +exports.move = function (source, destination) { + exports.copy(source, destination); + exports.remove(source); +}; + +/** Removes a file. + * It will throw an exception if it fails. + * + * @param path Path of the file to remove + */ +exports.remove = function (path) { + if (!exports._remove(path)) { + throw "Unable to remove file '" + path + "'"; + } +}; + +/** Removes a directory. + * It will throw an exception if it fails. + * + * @param path Path of the directory to remove + */ +exports.removeDirectory = function (path) { + if (!exports._removeDirectory(path)) { + throw "Unable to remove directory '" + path + "'"; + } +}; + +/** Removes a directory tree. + * It will throw an exception if it fails. + * + * @param path Path of the directory tree to remove + */ +exports.removeTree = function (path) { + if (!exports._removeTree(path)) { + throw "Unable to remove directory tree '" + path + "'"; + } +}; + +exports.touch = function (path) { + exports.write(path, "", 'a'); +}; diff --git a/python/pyphantomjs/modules/webpage.js b/python/pyphantomjs/modules/webpage.js new file mode 100644 index 0000000000..07c3786bf6 --- /dev/null +++ b/python/pyphantomjs/modules/webpage.js @@ -0,0 +1,180 @@ +/*jslint sloppy: true, nomen: true */ +/*global exports:true,phantom:true */ + +/* + This file is part of the PhantomJS project from Ofi Labs. + + Copyright (C) 2011 Ariya Hidayat + Copyright (C) 2011 Ivan De Marino + Copyright (C) 2011 James Roe + Copyright (C) 2011 execjosh, http://execjosh.blogspot.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +exports.create = function (opts) { + var page = phantom.createWebPage(), + handlers = {}; + + function checkType(o, type) { + return typeof o === type; + } + + function isObject(o) { + return checkType(o, 'object'); + } + + function isUndefined(o) { + return checkType(o, 'undefined'); + } + + function isUndefinedOrNull(o) { + return isUndefined(o) || null === o; + } + + function copyInto(target, source) { + if (target === source || isUndefinedOrNull(source)) { + return target; + } + + target = target || {}; + + // Copy into objects only + if (isObject(target)) { + // Make sure source exists + source = source || {}; + + if (isObject(source)) { + var i, newTarget, newSource; + for (i in source) { + if (source.hasOwnProperty(i)) { + newTarget = target[i]; + newSource = source[i]; + + if (newTarget && isObject(newSource)) { + // Deep copy + newTarget = copyInto(target[i], newSource); + } else { + newTarget = newSource; + } + + if (!isUndefined(newTarget)) { + target[i] = newTarget; + } + } + } + } else { + target = source; + } + } + + return target; + } + + function defineSetter(handlerName, signalName) { + page.__defineSetter__(handlerName, function (f) { + if (handlers && typeof handlers[signalName] === 'function') { + try { + this[signalName].disconnect(handlers[signalName]); + } catch (e) {} + } + handlers[signalName] = f; + this[signalName].connect(handlers[signalName]); + }); + } + + // deep copy + page.settings = JSON.parse(JSON.stringify(phantom.defaultPageSettings)); + + defineSetter("onInitialized", "initialized"); + + defineSetter("onLoadStarted", "loadStarted"); + + defineSetter("onLoadFinished", "loadFinished"); + + defineSetter("onResourceRequested", "resourceRequested"); + + defineSetter("onResourceReceived", "resourceReceived"); + + defineSetter("onAlert", "javaScriptAlertSent"); + + defineSetter("onConsoleMessage", "javaScriptConsoleMessageSent"); + + page.open = function (url, arg1, arg2, arg3, arg4) { + if (arguments.length === 1) { + this.openUrl(url, 'get', this.settings); + return; + } + if (arguments.length === 2 && typeof arg1 === 'function') { + this.onLoadFinished = arg1; + this.openUrl(url, 'get', this.settings); + return; + } else if (arguments.length === 2) { + this.openUrl(url, arg1, this.settings); + return; + } else if (arguments.length === 3 && typeof arg2 === 'function') { + this.onLoadFinished = arg2; + this.openUrl(url, arg1, this.settings); + return; + } else if (arguments.length === 3) { + this.openUrl(url, { + operation: arg1, + data: arg2 + }, this.settings); + return; + } else if (arguments.length === 4) { + this.onLoadFinished = arg3; + this.openUrl(url, { + operation: arg1, + data: arg2 + }, this.settings); + return; + } + throw "Wrong use of WebPage#open"; + }; + + page.includeJs = function (scriptUrl, onScriptLoaded) { + // Register temporary signal handler for 'alert()' + this.javaScriptAlertSent.connect(function (msgFromAlert) { + if (msgFromAlert === scriptUrl) { + // Resource loaded, time to fire the callback + onScriptLoaded(scriptUrl); + // And disconnect the signal handler + try { + this.javaScriptAlertSent.disconnect(arguments.callee); + } catch (e) {} + } + }); + + // Append the script tag to the body + this._appendScriptElement(scriptUrl); + }; + + // Copy options into page + if (opts) { + page = copyInto(page, opts); + } + + return page; +}; diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 11a407364a..9e12104ba7 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -21,13 +21,12 @@ import sys import sip -from PyQt4.QtCore import (pyqtProperty, pyqtSlot, QObject, - QFile) +from PyQt4.QtCore import pyqtProperty, pyqtSlot, QObject from PyQt4.QtGui import QApplication from PyQt4.QtNetwork import QNetworkProxy, QNetworkProxyFactory from __init__ import __version_info__ -from utils import injectJsInFrame +from utils import injectJsInFrame, QPyFile from plugincontroller import do_action from webpage import WebPage from networkaccessmanager import NetworkAccessManager @@ -81,18 +80,9 @@ def __init__(self, parent, args): # inject our properties and slots into javascript self.m_page.mainFrame().addToJavaScriptWindowObject('phantom', self) - jsShims = ( - ':/bootstrap.js', - ) - for shim in jsShims: - f = QFile(shim) - if not f.open(QFile.ReadOnly): - sys.exit("Failed to load shim '%s'" % shim) - - f = f.readAll().data() - if not f: - sys.exit("Failed to load shim '%s'" % shim) - self.m_page.mainFrame().evaluateJavaScript(f) + with QPyFile(':/bootstrap.js') as f: + bootstrap = f.readAll().data() + self.m_page.mainFrame().evaluateJavaScript(bootstrap) do_action('PhantomInitPost') @@ -153,6 +143,15 @@ def exit(self, code=0): def injectJs(self, filePath): return injectJsInFrame(filePath, self.m_scriptEncoding.encoding, self.libraryPath, self.m_page.mainFrame()) + @pyqtSlot(str, result=str) + def loadModuleSource(self, name): + moduleSourceFilePath = ':/modules/%s.js' % name + + with QPyFile(moduleSourceFilePath) as f: + moduleSource = f.readAll().data() + + return moduleSource + @pyqtProperty(str) def libraryPath(self): return self.m_page.libraryPath diff --git a/python/pyphantomjs/resources.qrc b/python/pyphantomjs/resources.qrc index 1f048f48fc..0e23785111 100644 --- a/python/pyphantomjs/resources.qrc +++ b/python/pyphantomjs/resources.qrc @@ -2,6 +2,8 @@ bootstrap.js configurator.js + modules/fs.js + modules/webpage.js resources/coffee-script.js resources/pyphantomjs-icon.png diff --git a/python/pyphantomjs/utils.py b/python/pyphantomjs/utils.py index 9ef6bcc876..5e9db315c8 100644 --- a/python/pyphantomjs/utils.py +++ b/python/pyphantomjs/utils.py @@ -22,11 +22,10 @@ import codecs import argparse -from PyQt4.QtCore import (QDateTime, Qt, QtDebugMsg, QtWarningMsg, +from PyQt4.QtCore import (QDateTime, QFile, Qt, QtDebugMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, qDebug) from __init__ import __version__ -from csconverter import CSConverter from plugincontroller import do_action @@ -115,7 +114,11 @@ def argParser(): return parser +CSConverter = None def coffee2js(script): + global CSConverter + if not CSConverter: + from csconverter import CSConverter return CSConverter().convert(script) @@ -186,3 +189,14 @@ def flush(self): def encode(self, s): return s.encode(self.encode_to, self.errors) + + +class QPyFile(QFile): + '''Simple subclass of QFile which supports the context manager''' + def __enter__(self): + if not self.open(QFile.ReadOnly): + raise IOError("Failed to open file '%s'" % self.fileName()) + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index 5d8fcb1cc4..ed489448ce 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -22,7 +22,7 @@ import sip from PyQt4.QtCore import (pyqtProperty, pyqtSlot, pyqtSignal, Qt, QObject, QRect, QPoint, QUrl, QFileInfo, QDir, QSize, - QSizeF, QByteArray, QEventLoop, QEvent, QFile) + QSizeF, QByteArray, QEventLoop, QEvent) from PyQt4.QtGui import (QPalette, QDesktopServices, QPrinter, QImage, QPainter, QRegion, QApplication, QMouseEvent, qRgba) From 373f28da1761845037d35d7c095b6bed88a4a7e1 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 13 Sep 2011 14:48:41 -0700 Subject: [PATCH 16/18] Regenerate resources --- python/pyphantomjs/resources.py | 1098 +++++++++++++++++++++++++------ 1 file changed, 888 insertions(+), 210 deletions(-) diff --git a/python/pyphantomjs/resources.py b/python/pyphantomjs/resources.py index 0183b793ae..5fc15ed85c 100644 --- a/python/pyphantomjs/resources.py +++ b/python/pyphantomjs/resources.py @@ -2,7 +2,7 @@ # Resource object code # -# Created: Fri Sep 9 00:49:08 2011 +# Created: Tue Sep 13 14:48:39 2011 # by: The Resource Compiler for PyQt (Qt v4.7.2) # # WARNING! All changes made in this file will be lost! @@ -10,209 +10,160 @@ from PyQt4 import QtCore qt_resource_data = "\ -\x00\x00\x0c\x89\ -\x00\ -\x00\x2e\x40\x78\x5e\xdd\x5a\x5b\x73\xda\x48\x16\x7e\xcf\xaf\xe8\ -\x61\xab\x06\xec\xb0\x78\xe3\xd9\xa7\xdc\x2a\x18\x64\x5b\x29\x0c\ -\xac\x04\xf1\xb8\xa6\xa6\x5c\x42\x6a\x40\x89\x50\xb3\x92\x88\xc3\ -\xcc\xf8\xbf\xef\x77\xba\x5b\x42\x12\xe2\xe2\x64\x93\xda\x5a\x3f\ -\x60\x5d\xfa\xdc\xaf\x7d\x5a\x67\xa7\x1f\xe3\xc0\x0f\x13\x16\x07\ -\x62\xb9\x5c\xbf\x64\x49\xb4\xe2\x4d\x16\x8a\x05\x0f\xd5\x0d\x3b\ -\x3d\x7b\x76\x76\x3a\x0b\xc4\xc4\x09\xd8\x83\x1f\x7a\xe2\xe1\xa5\ -\x5c\xb4\x9c\x3b\x61\x22\x16\xea\x66\x1a\xcb\xff\xb4\x18\xab\x9f\ -\x31\x36\x9a\xfb\x31\x9b\xfa\x01\x67\xf8\xbf\x74\xa2\x84\x89\x29\ -\x4b\xe6\x9c\x0d\x15\xd8\x7b\x9b\x2d\x23\xf1\x91\xbb\x09\x9b\x46\ -\x62\xc1\x06\x53\x9f\xf5\x9c\x49\xdc\x7a\x06\xe0\x8e\x58\xae\x23\ -\x7f\x36\x4f\x58\xa3\x73\xc2\xce\xff\xf1\xe2\x05\x6b\x47\xfe\xda\ -\x61\xd7\xbe\xe7\xac\x9d\x84\xbd\x76\xe8\xb6\x35\x57\xb7\xef\x66\ -\x0b\xc7\x0f\x5a\xae\x58\xbc\xad\x06\x36\x3f\x3b\x21\xeb\x72\x76\ -\x03\xb0\x50\xb0\xd7\x3e\xee\x5b\x1e\x6f\x2d\xe4\xfd\x41\xf0\xf7\ -\xce\x82\xc7\xcc\x12\x9c\xbd\x8e\x04\xff\x48\x77\x2f\xce\xdf\xcd\ -\x45\x72\x80\x2c\xff\xc2\xdd\x8f\x22\x9e\x37\xd9\x3c\x49\x96\x2f\ -\xcf\xce\xd2\x07\xad\x49\x20\x66\xf1\x52\x24\xc4\x33\x09\x6c\x71\ -\xcf\x8f\x93\xc8\x9f\xac\x12\x5f\x84\xcc\x09\x3d\xb6\x8a\xa1\xba\ -\x90\xc5\x62\x15\xb9\x5c\x3e\x99\xf8\xa1\x13\xad\xd9\x54\x44\x8b\ -\xb8\x09\x53\x24\x73\x26\x22\xf9\x5f\xac\x12\x20\x59\x08\xcf\x9f\ -\xfa\xae\x43\x28\x9a\xcc\x89\x38\x5b\xf2\x68\xe1\x27\x09\xf7\x48\ -\xd7\x9f\x7d\x0f\x17\xc9\x1c\xea\x23\x3b\x4c\x45\x10\x08\xd8\x73\ -\xc6\x5c\x11\x7a\x3e\x01\xc5\x12\x68\xc1\x93\x97\xc4\x13\x63\xa7\ -\x25\xbe\x62\xb2\xa1\x66\xc8\x15\x1e\x96\xae\xe2\x84\x45\x3c\x71\ -\xc0\x28\xe1\x74\x26\xe2\x33\x07\x3e\x6d\x3d\x89\x84\xc1\x99\x12\ -\xdf\x85\x53\x25\xe4\x12\x01\xe4\x24\x34\x79\xa2\x90\xad\xc8\x11\ -\x94\xe1\x06\x8e\xbf\xe0\x51\x6b\x07\x23\x20\x98\x53\x47\xca\x08\ -\xa4\xf4\x56\xd0\xd6\xf7\xe1\x85\xcc\x01\xcc\x5a\x2a\x4f\xb8\x2b\ -\x04\x49\x22\xd5\x4d\xf6\x39\x83\x31\x04\xde\x47\x6c\xe1\x24\x3c\ -\xf2\x9d\x00\x8e\x9f\xaa\x5d\x5a\x8b\xd8\xca\xdb\x39\x15\xae\xcf\ -\xf1\x16\x70\xf4\x3e\x84\x77\xa5\xa1\xf2\x5a\x44\x33\x27\xf4\xff\ -\x90\x24\xde\x42\x8f\x72\x49\xaa\x55\xe9\x94\xd0\xa4\x9f\xc4\xa4\ -\x4d\xe5\x3d\x22\x8a\x41\x7e\xcd\x26\x9c\x1c\x08\x7a\x15\x8c\x23\ -\x64\x23\x38\x13\xa0\xc1\xce\x42\x24\xf0\x0b\xa9\xa7\x24\x4e\x45\ -\x01\xb7\x9f\xb1\x58\x06\xa2\xb4\x52\x2c\xa6\xc9\x03\x39\x83\xf6\ -\x2e\x16\x2f\xb9\x4b\xce\x05\x50\x9f\x9c\x2e\x22\xb7\x0a\x95\x83\ -\xc5\x31\xd8\x93\x71\x3b\xba\x36\x6d\x66\x0f\x2e\x47\xb7\x6d\xcb\ -\x60\xb8\x1e\x5a\x83\x0f\x66\xd7\xe8\xb2\x8b\x3b\xbc\x34\x58\x67\ -\x30\xbc\xb3\xcc\xab\xeb\x11\xbb\x1e\xf4\xba\x86\x65\xb3\x76\xbf\ -\x8b\xa7\xfd\x91\x65\x5e\x8c\x47\x03\x3c\xa8\xb5\x6d\x40\xd6\x80\ -\x8d\x5e\xb5\xfb\x77\xcc\xf8\x75\x68\x19\xb6\xcd\x06\x16\x33\x6f\ -\x86\x3d\x13\xe8\x80\xdf\x6a\xf7\x47\xa6\x61\x37\x99\xd9\xef\xf4\ -\xc6\x5d\xb3\x7f\xd5\x64\x40\xc1\xfa\x83\x11\xeb\x99\x37\xe6\x08\ -\xcb\x46\x83\x26\x91\x05\xae\x6d\x40\x36\xb8\x64\x37\x86\xd5\xb9\ -\x06\x9e\xf6\x85\xd9\x33\x47\x77\x92\xe2\xa5\x39\xea\x13\xb5\x4b\ -\x90\x6b\xb3\x61\xdb\x1a\x99\x9d\x71\xaf\x6d\xb1\xe1\xd8\x1a\x0e\ -\x6c\x42\x46\xc2\x75\x4d\xbb\xd3\x6b\x9b\x37\x46\xb7\x05\x0e\x40\ -\x95\x19\x1f\x8c\xfe\x88\xd9\xd7\xed\x5e\x8f\xbd\x2e\x0b\xfa\x96\ -\x5d\x18\x60\xab\x7d\xd1\x33\x14\xe6\xfe\x1d\x10\x75\x4d\xcb\xe8\ -\x8c\x48\x84\xcd\x55\x07\xfa\x02\x47\xbd\x26\xb3\x87\x46\xc7\xa4\ -\x0b\xe3\x57\x03\x72\xb7\xad\xbb\x26\xe9\x00\xda\xb2\x8d\x7f\x8d\ -\xb1\x08\x2f\x59\xb7\x7d\xd3\xbe\x32\x6c\x20\x6b\x1c\x50\x04\x6c\ -\xd1\x19\x5b\xc6\x0d\x71\x09\xd9\xed\xf1\x85\x3d\x32\x47\xe3\x91\ -\xc1\xae\x06\x83\xae\x54\xaf\x6d\x58\x1f\xcc\x8e\x61\xbf\x02\xba\ -\xde\x80\x54\x7e\xc9\xc6\xb6\xd1\x04\x95\x51\x5b\x12\x07\x12\x28\ -\xc8\x7e\x45\xd7\x17\x63\xdb\x94\xaa\x32\xfb\x23\xc3\xb2\xc6\xc3\ -\x91\x39\xe8\x9f\xc0\xb2\xb7\x50\x05\xf8\x6c\x03\x94\x2c\xd8\x05\ -\xb6\x41\x5f\x9a\x12\xc6\x18\x58\x77\x84\x96\x74\x21\x95\xde\x64\ -\xb7\xd7\x06\x9e\xc3\xb8\x7d\xe5\x09\x6d\x52\x89\x0d\x8f\xe8\x90\ -\x25\xb3\x65\xa0\x08\x07\x19\x15\x24\x65\x7d\xe3\xaa\x67\x5e\x19\ -\xfd\x8e\x41\x1c\x0d\x08\xcf\xad\x69\x1b\x27\xb0\x91\x09\xee\xae\ -\x08\x29\x11\xbe\x6d\x83\x2a\xbc\x03\x94\xc9\x0f\xc1\x19\x2e\x81\ -\xaa\xe0\xb1\xd0\x34\x6c\xc8\xcc\x4b\xd6\xee\x7e\x00\x96\x6e\xba\ -\x1c\x76\xb7\x4d\xed\x23\x52\x75\x9d\x6b\xad\xf8\xd6\x33\xaa\x78\ -\xd3\x55\xe8\xca\x34\x10\xf1\x7f\xaf\xfc\x88\x37\x28\x8a\x4f\xd8\ -\x9f\x2a\x8d\x7e\x76\x22\xc6\xbf\x2c\x45\x94\xc4\xaf\xd4\x13\x7f\ -\xca\xe4\x12\xf6\xe6\xcd\x1b\x56\x7f\xe0\x93\xa5\x33\xe3\xf5\x0c\ -\x80\x92\xa6\x06\x60\x6f\x58\x86\xbc\x21\x96\x49\x4c\x8b\x54\x5a\ -\x55\xbf\x84\x9c\xa0\xb1\x50\x17\xe4\x96\x1b\x71\x24\xa0\x5b\x3e\ -\x19\xe2\x79\xe3\xa4\x59\x58\x4f\x50\xa8\xc0\x5e\xc0\x91\x29\xde\ -\xb0\x3f\x1f\x35\x4b\x29\xce\x8c\x9a\x3b\xe7\xee\xa7\xd1\x7a\xc9\ -\x1b\x02\xa9\x1b\xff\xcb\x94\x09\x02\xb9\x7f\x15\x21\x2b\xe2\x35\ -\x32\x91\x90\xf2\xd0\x0d\x39\xd0\xe6\xef\x51\x49\xbd\x45\xc2\x8f\ -\x07\x13\xea\x00\x1a\x62\x0f\xee\x02\x1f\x75\x21\x01\xea\x27\xc7\ -\x12\x18\x87\x1e\x9f\xfa\x21\xf7\x9e\x40\x63\x95\xc2\x7c\x05\x99\ -\x41\xd4\x5f\x05\xc1\x5e\x62\x7e\x5c\x60\xea\xaf\xbf\x58\x08\x10\ -\xa9\x3a\x71\x9c\x58\x54\x60\x4d\xf4\x5e\x8d\xc4\x89\x66\x3c\x69\ -\xea\x9a\x5c\xa5\x44\xf2\x34\xb5\x4a\x12\xd0\xc5\x1b\x34\x73\x5c\ -\x68\x9e\xd5\xbb\x93\x2a\x2c\x79\x53\x4b\x92\x45\x3e\xe9\x75\xc9\ -\xc6\xf4\x28\xa5\x9b\x5e\x80\xea\x96\xbb\xd1\xba\xb3\x33\xd9\xf0\ -\xa1\xbc\xa2\x5a\x29\x03\xa3\xb0\x85\xc1\x7a\xcb\x71\x49\x9a\xcc\ -\x69\x14\xfa\x9d\xfc\x02\xeb\x8d\xf3\x89\xb3\x78\x85\x32\xa6\xe5\ -\xe6\x5f\xd0\x7d\xa4\x55\x2f\x75\x47\xf5\x5f\xaf\xc8\xab\xa8\x92\ -\x59\x5a\x5d\x60\xe3\x80\xda\x68\x3d\xc5\xa8\x8f\xa6\x9a\x3f\x8c\ -\xb4\xc1\x70\x69\xcb\xc6\x6e\x5b\x91\x29\x5b\x68\xf3\x20\xec\xa6\ -\x05\xdc\x65\x97\x74\x3d\x31\xa5\x78\x69\xcd\x9d\x78\xf0\x10\x0e\ -\x23\x81\xfe\x2f\x59\x37\xfc\x9d\x3a\xca\xab\x20\xe3\x0e\x59\x41\ -\xa9\xf6\x37\xff\xf7\xdd\xec\xa5\xa0\x99\x24\x00\x53\xe4\x25\xd8\ -\x96\xe9\xf2\xa4\xe8\x5a\xa6\xc0\x54\x21\xec\xe7\x9f\xe1\x90\x3a\ -\x19\x64\x18\x8f\x62\x9b\x70\xc1\xd4\x5d\xce\x97\xb2\xf1\x3c\x48\ -\x98\x00\xf2\xb2\x96\x82\x09\xdc\x4b\x4b\x29\xf3\x94\xf2\x4c\x59\ -\x08\xba\x7f\x64\x3c\x40\x77\x55\xcc\xca\x55\x0b\xcb\x84\x8f\xf0\ -\x81\x14\x4d\x45\x70\x95\x29\x90\x3e\x7f\xca\xa7\x96\x4c\xc6\xa3\ -\xd5\x98\x59\x1d\xa6\xcc\xa0\x0f\x7b\xc0\xe3\x5e\x95\xef\x7e\x5b\ -\xfd\xe6\xa0\x3a\xb3\xac\xa2\xbc\xad\x9a\xbf\x6d\xdc\x15\x2a\x4c\ -\x8b\x57\x45\x46\xdb\x55\xb1\x54\x31\xb1\x39\x9a\xdf\xa8\xa1\xcb\ -\x68\x1f\x85\x1c\x29\xd8\x9f\x85\x4e\x40\xd7\x55\x81\x4a\x15\xba\ -\x75\x7f\x9f\x07\xbf\xbf\x2f\x22\xd8\x94\xf9\x69\x15\x06\xb2\x37\ -\xd9\x38\xab\xdd\x08\x19\x5d\x76\xd3\x47\xbf\x6d\x78\xf8\x5d\x75\ -\x16\x29\x4e\xd9\x5a\x94\x3d\x26\xbd\x4f\xb0\xa7\xdc\xfd\x96\x56\ -\xd1\x96\x20\x8f\xbc\x45\xfb\x33\x11\x86\x54\xba\xab\x88\xef\x89\ -\x9a\x47\x86\xfd\xa9\x3b\x67\x0d\x52\xd3\xb6\x95\x88\x5a\xf5\xd3\ -\x2a\x3a\xd4\x1c\x55\xdb\x7f\x8b\xe3\x27\xb2\xfb\xb8\xbf\xc1\x40\ -\xc2\xf1\x2a\x13\x8e\xb4\x73\x0c\xf7\xc0\xbe\x9a\xda\xab\xf7\xf6\ -\xa0\xdf\xc2\xf4\x23\xe6\x0d\x79\x49\x7b\xfc\x70\xe6\x4f\xd7\x8d\ -\xb4\x59\x83\x4b\x38\xab\x20\xa1\x56\x8d\xdc\x8a\xe0\x4e\x40\xbc\ -\x60\xad\x82\xd7\xd5\x44\x68\x86\xd8\xae\x3b\x81\xff\x07\xf7\x6a\ -\x4d\x56\xf3\x73\xb7\x87\x40\x7b\xc2\xf1\x6c\x84\x10\x66\x02\x04\ -\x1a\xe4\x6e\x8f\x01\xbd\x04\xad\x78\xbe\x81\xcd\xee\x0f\x01\x5b\ -\x5c\x85\xab\x85\x06\x99\xc7\x9a\x7a\xb4\xf5\xf0\x78\x34\x2e\xa7\ -\x2d\x2b\xc9\xb0\xc1\xa2\x9f\x1d\x42\xd2\x46\xef\x9b\x10\xe4\x47\ -\xe7\xb3\x63\xbb\x91\xbf\x4c\xe4\x23\x1b\xbb\xf9\xda\x21\xe0\x0e\ -\xc6\x24\x22\xe0\x37\x3c\x8e\x61\xb2\x22\x96\xe2\xbb\x4a\x74\xd2\ -\x41\x50\x97\xc3\x42\x63\xbf\x8a\x02\x1a\xd8\xcc\x5e\xc8\xdf\x73\ -\xf9\xfb\x8b\xfc\xfd\x67\x55\xe4\x52\x1e\xc0\x3b\x39\x7e\x88\x5b\ -\x01\x0f\x67\x18\x2e\x50\x7b\xf7\xa2\x6a\x75\x1a\xc1\x92\xec\x38\ -\x0a\x1a\x92\x5a\x1d\x5d\x5c\x5d\xcd\x64\x32\x87\x2d\x39\x7d\x9a\ -\x20\x54\x9e\xdc\x0e\xb4\xed\x40\xdd\xc9\xd8\x39\x55\x78\x9d\xae\ -\x48\xce\x23\xd3\x13\x85\x71\x4b\x84\xe4\xb4\xa9\xa7\x41\x6f\x84\ -\x60\x9b\x9b\xef\x27\xa6\x2a\xf0\xbb\x65\x3b\x5e\xe9\xca\xc4\x52\ -\xaa\x34\x49\x3c\x55\xe7\x07\x98\xf9\xa5\xa8\xe8\xf3\x6f\x55\xf4\ -\xf9\xb1\x8a\xfe\x01\xa2\x1d\xaf\xe7\xdd\xe5\x8c\x5a\x62\x39\x4e\ -\x7b\xa9\xe2\x6d\x67\x55\xf4\x9c\xc4\x91\x6b\xce\x2b\x97\x3c\x7e\ -\x63\xe8\x1c\x30\x63\x65\xd8\x6f\x3c\xbc\x22\x22\x7e\x39\xd6\x50\ -\xff\xfb\xba\xd9\x52\x78\x32\x8f\xc4\x03\xab\xdd\x46\x02\xd3\x6a\ -\x9a\x8b\x63\xd6\xa0\xc7\x1b\x7f\xa3\xa4\x56\x2b\xca\x5e\x1e\x69\ -\xc8\x9c\xeb\x87\x6e\xb0\xf2\xf8\x7b\xaa\xca\x9b\x56\x2b\x96\xd9\ -\x1f\x49\xb1\x89\x0d\xa7\x2a\x05\x94\x6c\xb8\x57\xe5\x6b\xa8\xfa\ -\x16\x9f\x61\x07\x49\xa3\x5a\xbe\xc0\x40\x87\xc6\xf1\xaa\xe9\x4a\ -\x67\x2a\x34\x9d\x67\x75\x87\xca\x49\xe3\xa4\x5e\x21\x09\x42\xbf\ -\xa2\xec\xe0\x1c\x40\xb5\x53\x1b\xd6\x16\xf1\xec\x12\xf3\x58\x59\ -\x99\xaa\xb8\x21\x6f\xa0\x9c\x94\x5f\xa7\xf6\xf8\xa9\x4c\xbb\xa0\ -\x08\x52\xca\xa2\xf7\xbc\xd4\x04\x70\x0f\x0e\x8d\x81\x3b\x0d\x8c\ -\xa7\x98\x60\xc9\x59\xb4\xeb\x04\xc1\xc4\x71\x3f\x6d\x89\x91\x56\ -\x86\xa2\xce\x1a\x99\x36\x77\x24\x35\x4d\xb8\x8d\x79\xff\xa6\x83\ -\x94\x94\x8a\x4a\xdc\x49\xef\xb8\x56\xb5\x52\xc1\xb9\x96\x75\x53\ -\x3a\x49\x40\xce\xf7\x70\xfb\x55\xed\x2a\x35\x8f\x5b\x22\x40\xe1\ -\xed\x25\x7c\x55\x1d\x75\x28\x4d\x61\x9f\x3d\x23\x85\x93\x06\x26\ -\xc2\xdb\xde\xbb\xca\x4a\x71\xef\x48\x38\xe5\x9d\x46\xc0\xa9\xea\ -\xef\x54\x75\xd9\xf7\xd3\xd9\x0a\x46\x87\xf2\x80\x47\xce\x58\x28\ -\x20\x0a\x0c\x92\x1f\x55\x0d\x17\xc9\x60\x7a\xb8\x98\x6d\x93\xe9\ -\x1e\xd1\x42\xa3\xc8\x52\xd8\x15\x85\xd6\xbb\x2b\x5a\xbe\x59\x07\ -\xf6\x08\xa7\xde\x5e\xc9\x19\x40\x36\x06\x9d\xc6\xbb\x26\xa0\xc5\ -\xc1\xe6\x25\x0e\x15\xe3\x35\xa2\x70\xd1\xc8\x2b\x1a\x92\xbe\xcf\ -\xfa\x39\x56\x8b\xe7\xfe\xa2\xa6\x94\x4b\xc9\x83\x7f\x71\x79\xa6\ -\x02\x38\x36\x92\x88\xc3\x10\x28\x38\x99\xc2\xb1\x66\x56\x15\xd8\ -\x14\x07\x89\xea\x0c\x52\xf9\xf8\xd9\xe9\x29\x1b\x50\xbb\x46\x07\ -\x70\x5a\x24\x87\xd5\xe8\x60\xb3\xa6\x67\x55\xea\x14\x47\x2e\x3f\ -\x65\x66\x82\x23\x13\x4c\xf3\x54\xca\xca\xa8\x52\xa4\xfa\x38\xe9\ -\x54\xd8\x15\x6a\x5a\xbf\xb1\xc2\x29\x7b\x87\x7d\x82\xb3\x80\xbe\ -\xd1\xcc\x0d\xe9\x47\x1f\x98\xca\x43\x54\x9a\x8c\x81\x8d\x8a\xf5\ -\x38\xf5\xe3\x8a\xc5\x1b\x5c\xb5\x70\x66\xa1\x36\x19\x38\x06\xc2\ -\x0b\xe0\xa8\x47\xe8\xf3\xea\x0f\xf4\xe3\x9c\x3d\xaf\x33\x77\x0e\ -\x3a\x2e\x92\x18\xe4\xdc\x70\xc2\xde\x69\xe9\x0a\xb2\xe5\x16\x9c\ -\x65\xd7\x7a\x34\xbd\xdd\xc6\x12\xeb\x4d\x3a\x86\xdc\xda\x03\xd3\ -\x04\x4c\xca\xf1\x26\x1d\x6c\xb7\xee\x49\x9e\x46\x0e\xa4\xe8\x4d\ -\xe4\x1b\x04\x51\x95\xc4\x34\xa7\xf4\xba\xec\x82\x99\x40\xb8\xd0\ -\x65\x63\x1c\x3a\x93\x8d\x06\x15\x1b\xf5\x1a\x7b\xae\x34\xfd\x9c\ -\xd5\xea\xb9\xfa\x91\x8f\x9f\xd4\xf6\x4d\x18\xde\xf1\xf2\x1e\x40\ -\xc7\x6d\x88\x42\xd2\xae\x23\x11\xee\xf1\x01\x9c\x3c\xff\x57\xdd\ -\x40\xf2\x42\x27\x75\x55\xc6\x93\x3a\xd6\xdc\xed\xb5\x9d\xc4\x92\ -\xaf\x84\x64\x88\xb2\xae\xa5\xd5\x68\x15\x9a\xf0\x8d\xb1\xe0\x4f\ -\x15\x67\x0a\xa9\x4a\xb0\xba\x45\xc8\x0b\xb1\x49\x56\x99\xb6\xdc\ -\x40\x60\x1f\x5c\xca\x1a\xda\x96\x1a\xbc\x90\x29\x32\x01\x0a\x41\ -\x48\x47\x8f\x99\x8c\x14\x17\xca\x02\x79\x6d\x14\x83\xf0\xc7\x18\ -\x40\x05\x6f\xaa\x05\xec\x04\xa5\x83\x80\x3d\xc5\xaf\xce\xf2\x64\ -\x9f\xaf\x8a\xe1\x87\x3a\x9d\xdf\xd6\x1d\x76\xc6\x76\x86\xf0\x76\ -\x84\x2a\xda\x65\x33\x37\x53\x0f\xd9\x13\xab\x5b\x56\x97\x51\x5d\ -\x3e\x2b\x6a\x49\x02\x0d\x2d\x75\xc9\xb2\x15\x06\x2f\x47\x97\xa5\ -\x8f\x8f\x64\x07\xf0\x87\xcc\x56\xca\x9a\x4d\x9a\x7b\x4f\xd6\x09\ -\x2f\xe6\xa8\x1f\x60\x58\xd5\x8d\x48\x5e\xaa\x02\xec\x92\x02\x4c\ -\xf2\x9a\x32\xb8\x37\xcc\xe4\xca\xb2\xfe\xab\xc2\x2c\x5d\x88\x72\ -\x4f\x97\x32\x2f\x96\xf4\x49\x19\x51\x2e\xfb\x09\x3b\xfd\xbf\x57\ -\x6e\xf5\x75\x30\xd1\xaa\x27\x25\x46\x95\x53\x48\xb4\x62\x62\x94\ -\x92\xee\xc9\x8e\xf2\xd8\xe6\x7b\x65\x40\xdd\x9d\xe6\x4b\xa1\x7e\ -\xb4\x23\x8a\x3c\x0c\x96\xf0\x89\x8c\x3c\x88\xcd\x43\xe5\x9f\x97\ -\x40\xb7\x43\x86\xfa\x9c\xe2\x16\x41\x9e\xd3\x34\x31\xf0\xcb\xb0\ -\x97\x0d\x48\x96\xf9\x09\x49\xf2\x9e\x80\xf5\x21\x4c\x11\xa0\x0c\ -\x41\x09\x71\xab\x3c\x49\xd2\x32\x83\x4b\x2b\x68\x61\xa9\x40\x31\ -\x7c\xb3\x23\x9f\xe5\x45\x29\x55\x2e\x42\xb9\x99\xc8\x94\x23\x4d\ -\x5b\xca\x43\x6b\xef\x26\x02\xdb\x96\x24\xe2\xdf\xa1\x6a\xed\xb6\ -\x59\x91\x72\x45\x0e\x3c\xc6\x7a\x3b\x91\x54\xdb\x71\x04\x19\xbf\ -\xc9\x96\x84\xe0\x1b\xed\x59\x64\xf9\x3b\x58\xf6\x86\x3e\xb9\xfa\ -\xff\x8a\xc1\x05\x89\x54\xd8\xa6\x1f\x8e\x41\x84\xdf\xce\xe8\x2b\ -\xe6\x42\xac\x8c\x38\x91\xd0\x96\xcd\xa5\xd9\x72\xd4\x58\x72\x1d\ -\x3e\x8b\xfb\xf1\x4d\x1e\x11\xde\x5b\x5a\x94\x0c\x07\x8b\x4b\x96\ -\x9b\xb4\xcc\xb2\xb0\x1c\x95\x8e\x34\x81\x4d\x42\x22\x50\xe4\xa0\ -\x42\xbf\xbc\x3f\xeb\x6c\xf4\x97\x85\xc1\x0f\xe8\x94\x73\x21\x27\ -\xd0\xba\x1f\xa9\xc9\x6e\x96\x1a\x0f\xd5\xeb\x92\x4a\x33\x40\x55\ -\xb4\x9f\xa2\xdb\x0d\xa7\x3b\x37\x24\x4f\x56\xf0\x77\xca\xec\xd2\ -\xf8\x85\xaa\x5a\x28\x25\xd4\xe9\x1e\xad\xea\xad\xbc\x5c\xb5\xf9\ -\x28\x69\x59\xa6\xe2\x27\x3b\x6f\x55\xf6\x7d\x9a\x1b\xa7\x9b\xdd\ -\x44\xac\x70\x6c\x79\xc8\x35\x90\x5b\x54\x4b\x4c\x44\x70\xc2\x84\ -\xf3\xa1\xba\x93\xff\x8c\x28\xcd\x30\xb9\x09\x88\x3e\x16\xc9\x3e\ -\xf8\xa2\x4f\xc2\x72\x9f\x20\xe5\xce\x66\x55\xc7\x50\x1f\x87\x9f\ -\x42\xf1\x10\xd2\x46\x7b\x45\xcd\x02\x62\x52\x4e\x51\x9e\xe3\x92\ -\xc6\x8f\xe9\x47\x68\x27\xf5\xc2\xb4\x45\x37\x87\xd9\x97\x68\x60\ -\x01\x33\x93\x1e\x9f\x39\xee\x9a\x3d\xe0\x9b\x51\x98\x90\x86\xab\ -\x7a\xb2\xfa\x4c\x7d\xeb\xdd\xd2\xb7\x10\x3d\xc5\xbb\xf9\x60\xed\ -\xd5\xb3\xff\x00\xb6\x81\x7e\xc1\ +\x00\x00\x09\x75\ +\x2f\ +\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ +\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ +\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x77\x69\ +\x6e\x64\x6f\x77\x3a\x74\x72\x75\x65\x2c\x70\x68\x61\x6e\x74\x6f\ +\x6d\x3a\x74\x72\x75\x65\x20\x2a\x2f\x0a\x0a\x2f\x2a\x0a\x20\x20\ +\x54\x68\x69\x73\x20\x66\x69\x6c\x65\x20\x69\x73\x20\x70\x61\x72\ +\x74\x20\x6f\x66\x20\x74\x68\x65\x20\x50\x68\x61\x6e\x74\x6f\x6d\ +\x4a\x53\x20\x70\x72\x6f\x6a\x65\x63\x74\x20\x66\x72\x6f\x6d\x20\ +\x4f\x66\x69\x20\x4c\x61\x62\x73\x2e\x0a\x0a\x20\x20\x43\x6f\x70\ +\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x20\ +\x41\x72\x69\x79\x61\x20\x48\x69\x64\x61\x79\x61\x74\x20\x3c\x61\ +\x72\x69\x79\x61\x2e\x68\x69\x64\x61\x79\x61\x74\x40\x67\x6d\x61\ +\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\ +\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x20\x49\x76\x61\ +\x6e\x20\x44\x65\x20\x4d\x61\x72\x69\x6e\x6f\x20\x3c\x69\x76\x61\ +\x6e\x2e\x64\x65\x2e\x6d\x61\x72\x69\x6e\x6f\x40\x67\x6d\x61\x69\ +\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\x67\ +\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x20\x4a\x61\x6d\x65\ +\x73\x20\x52\x6f\x65\x20\x3c\x72\x6f\x65\x6a\x61\x6d\x65\x73\x31\ +\x32\x40\x68\x6f\x74\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\ +\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\ +\x30\x31\x31\x20\x65\x78\x65\x63\x6a\x6f\x73\x68\x2c\x20\x68\x74\ +\x74\x70\x3a\x2f\x2f\x65\x78\x65\x63\x6a\x6f\x73\x68\x2e\x62\x6c\ +\x6f\x67\x73\x70\x6f\x74\x2e\x63\x6f\x6d\x0a\x0a\x20\x20\x52\x65\ +\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x20\x61\x6e\x64\ +\x20\x75\x73\x65\x20\x69\x6e\x20\x73\x6f\x75\x72\x63\x65\x20\x61\ +\x6e\x64\x20\x62\x69\x6e\x61\x72\x79\x20\x66\x6f\x72\x6d\x73\x2c\ +\x20\x77\x69\x74\x68\x20\x6f\x72\x20\x77\x69\x74\x68\x6f\x75\x74\ +\x0a\x20\x20\x6d\x6f\x64\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x2c\ +\x20\x61\x72\x65\x20\x70\x65\x72\x6d\x69\x74\x74\x65\x64\x20\x70\ +\x72\x6f\x76\x69\x64\x65\x64\x20\x74\x68\x61\x74\x20\x74\x68\x65\ +\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x63\x6f\x6e\x64\x69\ +\x74\x69\x6f\x6e\x73\x20\x61\x72\x65\x20\x6d\x65\x74\x3a\x0a\x0a\ +\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\ +\x74\x69\x6f\x6e\x73\x20\x6f\x66\x20\x73\x6f\x75\x72\x63\x65\x20\ +\x63\x6f\x64\x65\x20\x6d\x75\x73\x74\x20\x72\x65\x74\x61\x69\x6e\ +\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\x70\x79\x72\ +\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\x74\x69\x63\ +\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\x6f\x66\x20\ +\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\x64\x20\x74\ +\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x64\x69\x73\ +\x63\x6c\x61\x69\x6d\x65\x72\x2e\x0a\x20\x20\x20\x20\x2a\x20\x52\ +\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\x69\ +\x6e\x20\x62\x69\x6e\x61\x72\x79\x20\x66\x6f\x72\x6d\x20\x6d\x75\ +\x73\x74\x20\x72\x65\x70\x72\x6f\x64\x75\x63\x65\x20\x74\x68\x65\ +\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\x70\x79\x72\x69\x67\x68\x74\ +\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\x74\x69\x63\x65\x2c\x20\x74\ +\x68\x69\x73\x20\x6c\x69\x73\x74\x20\x6f\x66\x20\x63\x6f\x6e\x64\ +\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\x64\x20\x74\x68\x65\x20\x66\ +\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x64\x69\x73\x63\x6c\x61\x69\ +\x6d\x65\x72\x20\x69\x6e\x20\x74\x68\x65\x0a\x20\x20\x20\x20\x20\ +\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x61\x74\x69\x6f\x6e\x20\x61\ +\x6e\x64\x2f\x6f\x72\x20\x6f\x74\x68\x65\x72\x20\x6d\x61\x74\x65\ +\x72\x69\x61\x6c\x73\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\x77\ +\x69\x74\x68\x20\x74\x68\x65\x20\x64\x69\x73\x74\x72\x69\x62\x75\ +\x74\x69\x6f\x6e\x2e\x0a\x20\x20\x20\x20\x2a\x20\x4e\x65\x69\x74\ +\x68\x65\x72\x20\x74\x68\x65\x20\x6e\x61\x6d\x65\x20\x6f\x66\x20\ +\x74\x68\x65\x20\x3c\x6f\x72\x67\x61\x6e\x69\x7a\x61\x74\x69\x6f\ +\x6e\x3e\x20\x6e\x6f\x72\x20\x74\x68\x65\x0a\x20\x20\x20\x20\x20\ +\x20\x6e\x61\x6d\x65\x73\x20\x6f\x66\x20\x69\x74\x73\x20\x63\x6f\ +\x6e\x74\x72\x69\x62\x75\x74\x6f\x72\x73\x20\x6d\x61\x79\x20\x62\ +\x65\x20\x75\x73\x65\x64\x20\x74\x6f\x20\x65\x6e\x64\x6f\x72\x73\ +\x65\x20\x6f\x72\x20\x70\x72\x6f\x6d\x6f\x74\x65\x20\x70\x72\x6f\ +\x64\x75\x63\x74\x73\x0a\x20\x20\x20\x20\x20\x20\x64\x65\x72\x69\ +\x76\x65\x64\x20\x66\x72\x6f\x6d\x20\x74\x68\x69\x73\x20\x73\x6f\ +\x66\x74\x77\x61\x72\x65\x20\x77\x69\x74\x68\x6f\x75\x74\x20\x73\ +\x70\x65\x63\x69\x66\x69\x63\x20\x70\x72\x69\x6f\x72\x20\x77\x72\ +\x69\x74\x74\x65\x6e\x20\x70\x65\x72\x6d\x69\x73\x73\x69\x6f\x6e\ +\x2e\x0a\x0a\x20\x20\x54\x48\x49\x53\x20\x53\x4f\x46\x54\x57\x41\ +\x52\x45\x20\x49\x53\x20\x50\x52\x4f\x56\x49\x44\x45\x44\x20\x42\ +\x59\x20\x54\x48\x45\x20\x43\x4f\x50\x59\x52\x49\x47\x48\x54\x20\ +\x48\x4f\x4c\x44\x45\x52\x53\x20\x41\x4e\x44\x20\x43\x4f\x4e\x54\ +\x52\x49\x42\x55\x54\x4f\x52\x53\x20\x22\x41\x53\x20\x49\x53\x22\ +\x0a\x20\x20\x41\x4e\x44\x20\x41\x4e\x59\x20\x45\x58\x50\x52\x45\ +\x53\x53\x20\x4f\x52\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\ +\x52\x52\x41\x4e\x54\x49\x45\x53\x2c\x20\x49\x4e\x43\x4c\x55\x44\ +\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\ +\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x54\x48\x45\x0a\x20\x20\x49\ +\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\x54\x49\x45\ +\x53\x20\x4f\x46\x20\x4d\x45\x52\x43\x48\x41\x4e\x54\x41\x42\x49\ +\x4c\x49\x54\x59\x20\x41\x4e\x44\x20\x46\x49\x54\x4e\x45\x53\x53\ +\x20\x46\x4f\x52\x20\x41\x20\x50\x41\x52\x54\x49\x43\x55\x4c\x41\ +\x52\x20\x50\x55\x52\x50\x4f\x53\x45\x0a\x20\x20\x41\x52\x45\x20\ +\x44\x49\x53\x43\x4c\x41\x49\x4d\x45\x44\x2e\x20\x49\x4e\x20\x4e\ +\x4f\x20\x45\x56\x45\x4e\x54\x20\x53\x48\x41\x4c\x4c\x20\x3c\x43\ +\x4f\x50\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\x3e\ +\x20\x42\x45\x20\x4c\x49\x41\x42\x4c\x45\x20\x46\x4f\x52\x20\x41\ +\x4e\x59\x0a\x20\x20\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\x44\ +\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\x43\x49\x44\x45\x4e\x54\x41\ +\x4c\x2c\x20\x53\x50\x45\x43\x49\x41\x4c\x2c\x20\x45\x58\x45\x4d\ +\x50\x4c\x41\x52\x59\x2c\x20\x4f\x52\x20\x43\x4f\x4e\x53\x45\x51\ +\x55\x45\x4e\x54\x49\x41\x4c\x20\x44\x41\x4d\x41\x47\x45\x53\x0a\ +\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\x55\ +\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\x4f\ +\x2c\x20\x50\x52\x4f\x43\x55\x52\x45\x4d\x45\x4e\x54\x20\x4f\x46\ +\x20\x53\x55\x42\x53\x54\x49\x54\x55\x54\x45\x20\x47\x4f\x4f\x44\ +\x53\x20\x4f\x52\x20\x53\x45\x52\x56\x49\x43\x45\x53\x3b\x0a\x20\ +\x20\x4c\x4f\x53\x53\x20\x4f\x46\x20\x55\x53\x45\x2c\x20\x44\x41\ +\x54\x41\x2c\x20\x4f\x52\x20\x50\x52\x4f\x46\x49\x54\x53\x3b\x20\ +\x4f\x52\x20\x42\x55\x53\x49\x4e\x45\x53\x53\x20\x49\x4e\x54\x45\ +\x52\x52\x55\x50\x54\x49\x4f\x4e\x29\x20\x48\x4f\x57\x45\x56\x45\ +\x52\x20\x43\x41\x55\x53\x45\x44\x20\x41\x4e\x44\x0a\x20\x20\x4f\ +\x4e\x20\x41\x4e\x59\x20\x54\x48\x45\x4f\x52\x59\x20\x4f\x46\x20\ +\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x57\x48\x45\x54\x48\ +\x45\x52\x20\x49\x4e\x20\x43\x4f\x4e\x54\x52\x41\x43\x54\x2c\x20\ +\x53\x54\x52\x49\x43\x54\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\ +\x2c\x20\x4f\x52\x20\x54\x4f\x52\x54\x0a\x20\x20\x28\x49\x4e\x43\ +\x4c\x55\x44\x49\x4e\x47\x20\x4e\x45\x47\x4c\x49\x47\x45\x4e\x43\ +\x45\x20\x4f\x52\x20\x4f\x54\x48\x45\x52\x57\x49\x53\x45\x29\x20\ +\x41\x52\x49\x53\x49\x4e\x47\x20\x49\x4e\x20\x41\x4e\x59\x20\x57\ +\x41\x59\x20\x4f\x55\x54\x20\x4f\x46\x20\x54\x48\x45\x20\x55\x53\ +\x45\x20\x4f\x46\x0a\x20\x20\x54\x48\x49\x53\x20\x53\x4f\x46\x54\ +\x57\x41\x52\x45\x2c\x20\x45\x56\x45\x4e\x20\x49\x46\x20\x41\x44\ +\x56\x49\x53\x45\x44\x20\x4f\x46\x20\x54\x48\x45\x20\x50\x4f\x53\ +\x53\x49\x42\x49\x4c\x49\x54\x59\x20\x4f\x46\x20\x53\x55\x43\x48\ +\x20\x44\x41\x4d\x41\x47\x45\x2e\x0a\x2a\x2f\x0a\x0a\x66\x75\x6e\ +\x63\x74\x69\x6f\x6e\x20\x72\x65\x71\x75\x69\x72\x65\x28\x6e\x61\ +\x6d\x65\x29\x20\x7b\x0a\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x63\ +\x6f\x64\x65\x2c\x20\x66\x75\x6e\x63\x2c\x20\x65\x78\x70\x6f\x72\ +\x74\x73\x3b\x0a\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x6e\x61\x6d\ +\x65\x20\x3d\x3d\x3d\x20\x27\x77\x65\x62\x70\x61\x67\x65\x27\x20\ +\x7c\x7c\x20\x6e\x61\x6d\x65\x20\x3d\x3d\x3d\x20\x27\x66\x73\x27\ +\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x64\x65\ +\x20\x3d\x20\x70\x68\x61\x6e\x74\x6f\x6d\x2e\x6c\x6f\x61\x64\x4d\ +\x6f\x64\x75\x6c\x65\x53\x6f\x75\x72\x63\x65\x28\x6e\x61\x6d\x65\ +\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x66\x75\x6e\x63\x20\ +\x3d\x20\x6e\x65\x77\x20\x46\x75\x6e\x63\x74\x69\x6f\x6e\x28\x22\ +\x65\x78\x70\x6f\x72\x74\x73\x22\x2c\x20\x22\x77\x69\x6e\x64\x6f\ +\x77\x22\x2c\x20\x63\x6f\x64\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x20\x3d\x20\x7b\x7d\x3b\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x6e\x61\x6d\ +\x65\x20\x3d\x3d\x3d\x20\x27\x66\x73\x27\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\ +\x73\x20\x3d\x20\x70\x68\x61\x6e\x74\x6f\x6d\x2e\x63\x72\x65\x61\ +\x74\x65\x46\x69\x6c\x65\x73\x79\x73\x74\x65\x6d\x28\x29\x3b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x66\x75\x6e\x63\x2e\x63\x61\x6c\x6c\x28\x7b\x7d\x2c\x20\ +\x65\x78\x70\x6f\x72\x74\x73\x2c\x20\x7b\x7d\x29\x3b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x65\x78\x70\ +\x6f\x72\x74\x73\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\ +\x20\x69\x66\x20\x28\x74\x79\x70\x65\x6f\x66\x20\x65\x78\x70\x6f\ +\x72\x74\x73\x20\x3d\x3d\x3d\x20\x27\x75\x6e\x64\x65\x66\x69\x6e\ +\x65\x64\x27\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\ +\x68\x72\x6f\x77\x20\x27\x55\x6e\x6b\x6e\x6f\x77\x6e\x20\x6d\x6f\ +\x64\x75\x6c\x65\x20\x27\x20\x2b\x20\x6e\x61\x6d\x65\x20\x2b\x20\ +\x27\x20\x66\x6f\x72\x20\x72\x65\x71\x75\x69\x72\x65\x28\x29\x27\ +\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x7d\x0a\x0a\x2f\x2f\x20\x4c\x65\ +\x67\x61\x63\x79\x20\x77\x61\x79\x20\x74\x6f\x20\x75\x73\x65\x20\ +\x57\x65\x62\x50\x61\x67\x65\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x57\ +\x65\x62\x50\x61\x67\x65\x20\x3d\x20\x72\x65\x71\x75\x69\x72\x65\ +\x28\x27\x77\x65\x62\x70\x61\x67\x65\x27\x29\x2e\x63\x72\x65\x61\ +\x74\x65\x3b\x0a\ \x00\x00\x01\x1a\ \x28\ \x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x6f\x70\x74\x73\x29\x20\ @@ -4406,9 +4357,725 @@ \x40\x1a\x41\xe2\x10\xf1\xb9\x99\x34\x59\x2e\x08\x20\xc2\x77\x60\ \xad\x8e\x88\xa1\x8d\x43\x29\x4f\x8b\x89\x01\x6b\xfc\xff\x01\x4e\ \x6c\xf6\xa7\ +\x00\x00\x18\x67\ +\x2f\ +\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ +\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ +\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x65\x78\ +\x70\x6f\x72\x74\x73\x3a\x74\x72\x75\x65\x2c\x70\x68\x61\x6e\x74\ +\x6f\x6d\x3a\x74\x72\x75\x65\x20\x2a\x2f\x0a\x0a\x2f\x2a\x0a\x20\ +\x20\x54\x68\x69\x73\x20\x66\x69\x6c\x65\x20\x69\x73\x20\x70\x61\ +\x72\x74\x20\x6f\x66\x20\x74\x68\x65\x20\x50\x68\x61\x6e\x74\x6f\ +\x6d\x4a\x53\x20\x70\x72\x6f\x6a\x65\x63\x74\x20\x66\x72\x6f\x6d\ +\x20\x4f\x66\x69\x20\x4c\x61\x62\x73\x2e\x0a\x0a\x20\x20\x43\x6f\ +\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\ +\x20\x41\x72\x69\x79\x61\x20\x48\x69\x64\x61\x79\x61\x74\x20\x3c\ +\x61\x72\x69\x79\x61\x2e\x68\x69\x64\x61\x79\x61\x74\x40\x67\x6d\ +\x61\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\x20\x43\x6f\x70\x79\x72\ +\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x20\x49\x76\ +\x61\x6e\x20\x44\x65\x20\x4d\x61\x72\x69\x6e\x6f\x20\x3c\x69\x76\ +\x61\x6e\x2e\x64\x65\x2e\x6d\x61\x72\x69\x6e\x6f\x40\x67\x6d\x61\ +\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\x20\x20\x43\x6f\x70\x79\x72\x69\ +\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x20\x4a\x61\x6d\ +\x65\x73\x20\x52\x6f\x65\x20\x3c\x72\x6f\x65\x6a\x61\x6d\x65\x73\ +\x31\x32\x40\x68\x6f\x74\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\ +\x20\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\ +\x32\x30\x31\x31\x20\x65\x78\x65\x63\x6a\x6f\x73\x68\x2c\x20\x68\ +\x74\x74\x70\x3a\x2f\x2f\x65\x78\x65\x63\x6a\x6f\x73\x68\x2e\x62\ +\x6c\x6f\x67\x73\x70\x6f\x74\x2e\x63\x6f\x6d\x0a\x0a\x20\x20\x52\ +\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x20\x61\x6e\ +\x64\x20\x75\x73\x65\x20\x69\x6e\x20\x73\x6f\x75\x72\x63\x65\x20\ +\x61\x6e\x64\x20\x62\x69\x6e\x61\x72\x79\x20\x66\x6f\x72\x6d\x73\ +\x2c\x20\x77\x69\x74\x68\x20\x6f\x72\x20\x77\x69\x74\x68\x6f\x75\ +\x74\x0a\x20\x20\x6d\x6f\x64\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\ +\x2c\x20\x61\x72\x65\x20\x70\x65\x72\x6d\x69\x74\x74\x65\x64\x20\ +\x70\x72\x6f\x76\x69\x64\x65\x64\x20\x74\x68\x61\x74\x20\x74\x68\ +\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x63\x6f\x6e\x64\ +\x69\x74\x69\x6f\x6e\x73\x20\x61\x72\x65\x20\x6d\x65\x74\x3a\x0a\ +\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\ +\x75\x74\x69\x6f\x6e\x73\x20\x6f\x66\x20\x73\x6f\x75\x72\x63\x65\ +\x20\x63\x6f\x64\x65\x20\x6d\x75\x73\x74\x20\x72\x65\x74\x61\x69\ +\x6e\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\x70\x79\ +\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\x74\x69\ +\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\x6f\x66\ +\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\x64\x20\ +\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x64\x69\ +\x73\x63\x6c\x61\x69\x6d\x65\x72\x2e\x0a\x20\x20\x20\x20\x2a\x20\ +\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\ +\x69\x6e\x20\x62\x69\x6e\x61\x72\x79\x20\x66\x6f\x72\x6d\x20\x6d\ +\x75\x73\x74\x20\x72\x65\x70\x72\x6f\x64\x75\x63\x65\x20\x74\x68\ +\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\x70\x79\x72\x69\x67\x68\ +\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\x74\x69\x63\x65\x2c\x20\ +\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\x6f\x66\x20\x63\x6f\x6e\ +\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\x64\x20\x74\x68\x65\x20\ +\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x64\x69\x73\x63\x6c\x61\ +\x69\x6d\x65\x72\x20\x69\x6e\x20\x74\x68\x65\x0a\x20\x20\x20\x20\ +\x20\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x61\x74\x69\x6f\x6e\x20\ +\x61\x6e\x64\x2f\x6f\x72\x20\x6f\x74\x68\x65\x72\x20\x6d\x61\x74\ +\x65\x72\x69\x61\x6c\x73\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\ +\x77\x69\x74\x68\x20\x74\x68\x65\x20\x64\x69\x73\x74\x72\x69\x62\ +\x75\x74\x69\x6f\x6e\x2e\x0a\x20\x20\x20\x20\x2a\x20\x4e\x65\x69\ +\x74\x68\x65\x72\x20\x74\x68\x65\x20\x6e\x61\x6d\x65\x20\x6f\x66\ +\x20\x74\x68\x65\x20\x3c\x6f\x72\x67\x61\x6e\x69\x7a\x61\x74\x69\ +\x6f\x6e\x3e\x20\x6e\x6f\x72\x20\x74\x68\x65\x0a\x20\x20\x20\x20\ +\x20\x20\x6e\x61\x6d\x65\x73\x20\x6f\x66\x20\x69\x74\x73\x20\x63\ +\x6f\x6e\x74\x72\x69\x62\x75\x74\x6f\x72\x73\x20\x6d\x61\x79\x20\ +\x62\x65\x20\x75\x73\x65\x64\x20\x74\x6f\x20\x65\x6e\x64\x6f\x72\ +\x73\x65\x20\x6f\x72\x20\x70\x72\x6f\x6d\x6f\x74\x65\x20\x70\x72\ +\x6f\x64\x75\x63\x74\x73\x0a\x20\x20\x20\x20\x20\x20\x64\x65\x72\ +\x69\x76\x65\x64\x20\x66\x72\x6f\x6d\x20\x74\x68\x69\x73\x20\x73\ +\x6f\x66\x74\x77\x61\x72\x65\x20\x77\x69\x74\x68\x6f\x75\x74\x20\ +\x73\x70\x65\x63\x69\x66\x69\x63\x20\x70\x72\x69\x6f\x72\x20\x77\ +\x72\x69\x74\x74\x65\x6e\x20\x70\x65\x72\x6d\x69\x73\x73\x69\x6f\ +\x6e\x2e\x0a\x0a\x20\x20\x54\x48\x49\x53\x20\x53\x4f\x46\x54\x57\ +\x41\x52\x45\x20\x49\x53\x20\x50\x52\x4f\x56\x49\x44\x45\x44\x20\ +\x42\x59\x20\x54\x48\x45\x20\x43\x4f\x50\x59\x52\x49\x47\x48\x54\ +\x20\x48\x4f\x4c\x44\x45\x52\x53\x20\x41\x4e\x44\x20\x43\x4f\x4e\ +\x54\x52\x49\x42\x55\x54\x4f\x52\x53\x20\x22\x41\x53\x20\x49\x53\ +\x22\x0a\x20\x20\x41\x4e\x44\x20\x41\x4e\x59\x20\x45\x58\x50\x52\ +\x45\x53\x53\x20\x4f\x52\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\ +\x41\x52\x52\x41\x4e\x54\x49\x45\x53\x2c\x20\x49\x4e\x43\x4c\x55\ +\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\ +\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x54\x48\x45\x0a\x20\x20\ +\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\x54\x49\ +\x45\x53\x20\x4f\x46\x20\x4d\x45\x52\x43\x48\x41\x4e\x54\x41\x42\ +\x49\x4c\x49\x54\x59\x20\x41\x4e\x44\x20\x46\x49\x54\x4e\x45\x53\ +\x53\x20\x46\x4f\x52\x20\x41\x20\x50\x41\x52\x54\x49\x43\x55\x4c\ +\x41\x52\x20\x50\x55\x52\x50\x4f\x53\x45\x0a\x20\x20\x41\x52\x45\ +\x20\x44\x49\x53\x43\x4c\x41\x49\x4d\x45\x44\x2e\x20\x49\x4e\x20\ +\x4e\x4f\x20\x45\x56\x45\x4e\x54\x20\x53\x48\x41\x4c\x4c\x20\x3c\ +\x43\x4f\x50\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\ +\x3e\x20\x42\x45\x20\x4c\x49\x41\x42\x4c\x45\x20\x46\x4f\x52\x20\ +\x41\x4e\x59\x0a\x20\x20\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\ +\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\x43\x49\x44\x45\x4e\x54\ +\x41\x4c\x2c\x20\x53\x50\x45\x43\x49\x41\x4c\x2c\x20\x45\x58\x45\ +\x4d\x50\x4c\x41\x52\x59\x2c\x20\x4f\x52\x20\x43\x4f\x4e\x53\x45\ +\x51\x55\x45\x4e\x54\x49\x41\x4c\x20\x44\x41\x4d\x41\x47\x45\x53\ +\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\ +\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\ +\x4f\x2c\x20\x50\x52\x4f\x43\x55\x52\x45\x4d\x45\x4e\x54\x20\x4f\ +\x46\x20\x53\x55\x42\x53\x54\x49\x54\x55\x54\x45\x20\x47\x4f\x4f\ +\x44\x53\x20\x4f\x52\x20\x53\x45\x52\x56\x49\x43\x45\x53\x3b\x0a\ +\x20\x20\x4c\x4f\x53\x53\x20\x4f\x46\x20\x55\x53\x45\x2c\x20\x44\ +\x41\x54\x41\x2c\x20\x4f\x52\x20\x50\x52\x4f\x46\x49\x54\x53\x3b\ +\x20\x4f\x52\x20\x42\x55\x53\x49\x4e\x45\x53\x53\x20\x49\x4e\x54\ +\x45\x52\x52\x55\x50\x54\x49\x4f\x4e\x29\x20\x48\x4f\x57\x45\x56\ +\x45\x52\x20\x43\x41\x55\x53\x45\x44\x20\x41\x4e\x44\x0a\x20\x20\ +\x4f\x4e\x20\x41\x4e\x59\x20\x54\x48\x45\x4f\x52\x59\x20\x4f\x46\ +\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x57\x48\x45\x54\ +\x48\x45\x52\x20\x49\x4e\x20\x43\x4f\x4e\x54\x52\x41\x43\x54\x2c\ +\x20\x53\x54\x52\x49\x43\x54\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\ +\x59\x2c\x20\x4f\x52\x20\x54\x4f\x52\x54\x0a\x20\x20\x28\x49\x4e\ +\x43\x4c\x55\x44\x49\x4e\x47\x20\x4e\x45\x47\x4c\x49\x47\x45\x4e\ +\x43\x45\x20\x4f\x52\x20\x4f\x54\x48\x45\x52\x57\x49\x53\x45\x29\ +\x20\x41\x52\x49\x53\x49\x4e\x47\x20\x49\x4e\x20\x41\x4e\x59\x20\ +\x57\x41\x59\x20\x4f\x55\x54\x20\x4f\x46\x20\x54\x48\x45\x20\x55\ +\x53\x45\x20\x4f\x46\x0a\x20\x20\x54\x48\x49\x53\x20\x53\x4f\x46\ +\x54\x57\x41\x52\x45\x2c\x20\x45\x56\x45\x4e\x20\x49\x46\x20\x41\ +\x44\x56\x49\x53\x45\x44\x20\x4f\x46\x20\x54\x48\x45\x20\x50\x4f\ +\x53\x53\x49\x42\x49\x4c\x49\x54\x59\x20\x4f\x46\x20\x53\x55\x43\ +\x48\x20\x44\x41\x4d\x41\x47\x45\x2e\x0a\x2a\x2f\x0a\x0a\x65\x78\ +\x70\x6f\x72\x74\x73\x2e\x63\x72\x65\x61\x74\x65\x20\x3d\x20\x66\ +\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x6f\x70\x74\x73\x29\x20\x7b\ +\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x70\x61\x67\x65\x20\x3d\x20\ +\x70\x68\x61\x6e\x74\x6f\x6d\x2e\x63\x72\x65\x61\x74\x65\x57\x65\ +\x62\x50\x61\x67\x65\x28\x29\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x68\x61\x6e\x64\x6c\x65\x72\x73\x20\x3d\x20\x7b\x7d\x3b\x0a\ +\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x68\ +\x65\x63\x6b\x54\x79\x70\x65\x28\x6f\x2c\x20\x74\x79\x70\x65\x29\ +\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\ +\x6e\x20\x74\x79\x70\x65\x6f\x66\x20\x6f\x20\x3d\x3d\x3d\x20\x74\ +\x79\x70\x65\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\ +\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x73\x4f\x62\x6a\x65\x63\ +\x74\x28\x6f\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\ +\x65\x74\x75\x72\x6e\x20\x63\x68\x65\x63\x6b\x54\x79\x70\x65\x28\ +\x6f\x2c\x20\x27\x6f\x62\x6a\x65\x63\x74\x27\x29\x3b\x0a\x20\x20\ +\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\ +\x6e\x20\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\x28\x6f\x29\ +\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\ +\x6e\x20\x63\x68\x65\x63\x6b\x54\x79\x70\x65\x28\x6f\x2c\x20\x27\ +\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x27\x29\x3b\x0a\x20\x20\x20\ +\x20\x7d\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\ +\x20\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\x4f\x72\x4e\x75\ +\x6c\x6c\x28\x6f\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x72\x65\x74\x75\x72\x6e\x20\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\ +\x65\x64\x28\x6f\x29\x20\x7c\x7c\x20\x6e\x75\x6c\x6c\x20\x3d\x3d\ +\x3d\x20\x6f\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\ +\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x6f\x70\x79\x49\x6e\x74\ +\x6f\x28\x74\x61\x72\x67\x65\x74\x2c\x20\x73\x6f\x75\x72\x63\x65\ +\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\ +\x74\x61\x72\x67\x65\x74\x20\x3d\x3d\x3d\x20\x73\x6f\x75\x72\x63\ +\x65\x20\x7c\x7c\x20\x69\x73\x55\x6e\x64\x65\x66\x69\x6e\x65\x64\ +\x4f\x72\x4e\x75\x6c\x6c\x28\x73\x6f\x75\x72\x63\x65\x29\x29\x20\ +\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\ +\x74\x75\x72\x6e\x20\x74\x61\x72\x67\x65\x74\x3b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x74\x61\x72\x67\x65\x74\x20\x3d\x20\x74\x61\x72\x67\x65\x74\x20\ +\x7c\x7c\x20\x7b\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x2f\x2f\x20\x43\x6f\x70\x79\x20\x69\x6e\x74\x6f\x20\x6f\x62\x6a\ +\x65\x63\x74\x73\x20\x6f\x6e\x6c\x79\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x69\x66\x20\x28\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x74\ +\x61\x72\x67\x65\x74\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x4d\x61\x6b\x65\x20\x73\x75\ +\x72\x65\x20\x73\x6f\x75\x72\x63\x65\x20\x65\x78\x69\x73\x74\x73\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x6f\x75\ +\x72\x63\x65\x20\x3d\x20\x73\x6f\x75\x72\x63\x65\x20\x7c\x7c\x20\ +\x7b\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x69\x66\x20\x28\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x73\x6f\ +\x75\x72\x63\x65\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x76\x61\x72\x20\x69\x2c\x20\ +\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x2c\x20\x6e\x65\x77\x53\x6f\ +\x75\x72\x63\x65\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x66\x6f\x72\x20\x28\x69\x20\x69\x6e\x20\ +\x73\x6f\x75\x72\x63\x65\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\ +\x20\x28\x73\x6f\x75\x72\x63\x65\x2e\x68\x61\x73\x4f\x77\x6e\x50\ +\x72\x6f\x70\x65\x72\x74\x79\x28\x69\x29\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x20\ +\x3d\x20\x74\x61\x72\x67\x65\x74\x5b\x69\x5d\x3b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x6e\x65\x77\x53\x6f\x75\x72\x63\x65\x20\x3d\ +\x20\x73\x6f\x75\x72\x63\x65\x5b\x69\x5d\x3b\x0a\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x69\x66\x20\x28\x6e\x65\x77\x54\x61\x72\x67\ +\x65\x74\x20\x26\x26\x20\x69\x73\x4f\x62\x6a\x65\x63\x74\x28\x6e\ +\x65\x77\x53\x6f\x75\x72\x63\x65\x29\x29\x20\x7b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x44\x65\x65\x70\ +\x20\x63\x6f\x70\x79\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x20\x3d\x20\x63\x6f\ +\x70\x79\x49\x6e\x74\x6f\x28\x74\x61\x72\x67\x65\x74\x5b\x69\x5d\ +\x2c\x20\x6e\x65\x77\x53\x6f\x75\x72\x63\x65\x29\x3b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x7d\x20\x65\x6c\x73\x65\x20\x7b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x65\x77\x54\x61\ +\x72\x67\x65\x74\x20\x3d\x20\x6e\x65\x77\x53\x6f\x75\x72\x63\x65\ +\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x69\x73\x55\x6e\x64\x65\ +\x66\x69\x6e\x65\x64\x28\x6e\x65\x77\x54\x61\x72\x67\x65\x74\x29\ +\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x74\x61\x72\x67\x65\x74\x5b\x69\x5d\x20\x3d\x20\x6e\x65\x77\x54\ +\x61\x72\x67\x65\x74\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x7d\x20\x65\x6c\x73\x65\x20\x7b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\ +\x72\x67\x65\x74\x20\x3d\x20\x73\x6f\x75\x72\x63\x65\x3b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x72\x65\x74\x75\x72\x6e\x20\x74\x61\x72\x67\x65\x74\x3b\x0a\x20\ +\x20\x20\x20\x7d\x0a\x0a\x20\x20\x20\x20\x66\x75\x6e\x63\x74\x69\ +\x6f\x6e\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\x28\ +\x68\x61\x6e\x64\x6c\x65\x72\x4e\x61\x6d\x65\x2c\x20\x73\x69\x67\ +\x6e\x61\x6c\x4e\x61\x6d\x65\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x70\x61\x67\x65\x2e\x5f\x5f\x64\x65\x66\x69\x6e\x65\ +\x53\x65\x74\x74\x65\x72\x5f\x5f\x28\x68\x61\x6e\x64\x6c\x65\x72\ +\x4e\x61\x6d\x65\x2c\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\ +\x66\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x69\x66\x20\x28\x68\x61\x6e\x64\x6c\x65\x72\x73\x20\x26\x26\ +\x20\x74\x79\x70\x65\x6f\x66\x20\x68\x61\x6e\x64\x6c\x65\x72\x73\ +\x5b\x73\x69\x67\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x20\x3d\x3d\x3d\ +\x20\x27\x66\x75\x6e\x63\x74\x69\x6f\x6e\x27\x29\x20\x7b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ +\x72\x79\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x5b\x73\x69\ +\x67\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x2e\x64\x69\x73\x63\x6f\x6e\ +\x6e\x65\x63\x74\x28\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\ +\x67\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x29\x3b\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x63\x61\ +\x74\x63\x68\x20\x28\x65\x29\x20\x7b\x7d\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\ +\x67\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x20\x3d\x20\x66\x3b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x5b\ +\x73\x69\x67\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x2e\x63\x6f\x6e\x6e\ +\x65\x63\x74\x28\x68\x61\x6e\x64\x6c\x65\x72\x73\x5b\x73\x69\x67\ +\x6e\x61\x6c\x4e\x61\x6d\x65\x5d\x29\x3b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x7d\x29\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x0a\x20\x20\ +\x20\x20\x2f\x2f\x20\x64\x65\x65\x70\x20\x63\x6f\x70\x79\x0a\x20\ +\x20\x20\x20\x70\x61\x67\x65\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\ +\x20\x3d\x20\x4a\x53\x4f\x4e\x2e\x70\x61\x72\x73\x65\x28\x4a\x53\ +\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x70\x68\x61\ +\x6e\x74\x6f\x6d\x2e\x64\x65\x66\x61\x75\x6c\x74\x50\x61\x67\x65\ +\x53\x65\x74\x74\x69\x6e\x67\x73\x29\x29\x3b\x0a\x0a\x20\x20\x20\ +\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\x28\x22\x6f\ +\x6e\x49\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x64\x22\x2c\x20\x22\ +\x69\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x64\x22\x29\x3b\x0a\x0a\ +\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\x74\x65\x72\ +\x28\x22\x6f\x6e\x4c\x6f\x61\x64\x53\x74\x61\x72\x74\x65\x64\x22\ +\x2c\x20\x22\x6c\x6f\x61\x64\x53\x74\x61\x72\x74\x65\x64\x22\x29\ +\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\x65\x74\ +\x74\x65\x72\x28\x22\x6f\x6e\x4c\x6f\x61\x64\x46\x69\x6e\x69\x73\ +\x68\x65\x64\x22\x2c\x20\x22\x6c\x6f\x61\x64\x46\x69\x6e\x69\x73\ +\x68\x65\x64\x22\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\ +\x6e\x65\x53\x65\x74\x74\x65\x72\x28\x22\x6f\x6e\x52\x65\x73\x6f\ +\x75\x72\x63\x65\x52\x65\x71\x75\x65\x73\x74\x65\x64\x22\x2c\x20\ +\x22\x72\x65\x73\x6f\x75\x72\x63\x65\x52\x65\x71\x75\x65\x73\x74\ +\x65\x64\x22\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\ +\x65\x53\x65\x74\x74\x65\x72\x28\x22\x6f\x6e\x52\x65\x73\x6f\x75\ +\x72\x63\x65\x52\x65\x63\x65\x69\x76\x65\x64\x22\x2c\x20\x22\x72\ +\x65\x73\x6f\x75\x72\x63\x65\x52\x65\x63\x65\x69\x76\x65\x64\x22\ +\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\x69\x6e\x65\x53\x65\ +\x74\x74\x65\x72\x28\x22\x6f\x6e\x41\x6c\x65\x72\x74\x22\x2c\x20\ +\x22\x6a\x61\x76\x61\x53\x63\x72\x69\x70\x74\x41\x6c\x65\x72\x74\ +\x53\x65\x6e\x74\x22\x29\x3b\x0a\x0a\x20\x20\x20\x20\x64\x65\x66\ +\x69\x6e\x65\x53\x65\x74\x74\x65\x72\x28\x22\x6f\x6e\x43\x6f\x6e\ +\x73\x6f\x6c\x65\x4d\x65\x73\x73\x61\x67\x65\x22\x2c\x20\x22\x6a\ +\x61\x76\x61\x53\x63\x72\x69\x70\x74\x43\x6f\x6e\x73\x6f\x6c\x65\ +\x4d\x65\x73\x73\x61\x67\x65\x53\x65\x6e\x74\x22\x29\x3b\x0a\x0a\ +\x20\x20\x20\x20\x70\x61\x67\x65\x2e\x6f\x70\x65\x6e\x20\x3d\x20\ +\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x75\x72\x6c\x2c\x20\x61\ +\x72\x67\x31\x2c\x20\x61\x72\x67\x32\x2c\x20\x61\x72\x67\x33\x2c\ +\x20\x61\x72\x67\x34\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\ +\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\x31\x29\x20\x7b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\ +\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x27\x67\x65\ +\x74\x27\x2c\x20\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\ +\x73\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x72\x65\x74\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x61\x72\ +\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\ +\x3d\x3d\x20\x32\x20\x26\x26\x20\x74\x79\x70\x65\x6f\x66\x20\x61\ +\x72\x67\x31\x20\x3d\x3d\x3d\x20\x27\x66\x75\x6e\x63\x74\x69\x6f\ +\x6e\x27\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x74\x68\x69\x73\x2e\x6f\x6e\x4c\x6f\x61\x64\x46\x69\x6e\ +\x69\x73\x68\x65\x64\x20\x3d\x20\x61\x72\x67\x31\x3b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\ +\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x27\x67\x65\x74\ +\x27\x2c\x20\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\ +\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\ +\x65\x74\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ +\x20\x65\x6c\x73\x65\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\x65\ +\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\x32\ +\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x74\x68\x69\x73\x2e\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\ +\x2c\x20\x61\x72\x67\x31\x2c\x20\x74\x68\x69\x73\x2e\x73\x65\x74\ +\x74\x69\x6e\x67\x73\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x7d\x20\x65\x6c\x73\x65\x20\x69\x66\x20\x28\x61\ +\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x20\ +\x3d\x3d\x3d\x20\x33\x20\x26\x26\x20\x74\x79\x70\x65\x6f\x66\x20\ +\x61\x72\x67\x32\x20\x3d\x3d\x3d\x20\x27\x66\x75\x6e\x63\x74\x69\ +\x6f\x6e\x27\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\x6e\x4c\x6f\x61\x64\x46\x69\ +\x6e\x69\x73\x68\x65\x64\x20\x3d\x20\x61\x72\x67\x32\x3b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\ +\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\x2c\x20\x61\x72\x67\ +\x31\x2c\x20\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\ +\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\ +\x65\x74\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ +\x20\x65\x6c\x73\x65\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\x65\ +\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\x33\ +\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x74\x68\x69\x73\x2e\x6f\x70\x65\x6e\x55\x72\x6c\x28\x75\x72\x6c\ +\x2c\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x6f\x70\x65\x72\x61\x74\x69\x6f\x6e\x3a\x20\x61\ +\x72\x67\x31\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x64\x61\x74\x61\x3a\x20\x61\x72\x67\x32\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x2c\x20\x74\ +\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\x29\x3b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\ +\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x65\x6c\x73\ +\x65\x20\x69\x66\x20\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\ +\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x3d\x20\x34\x29\x20\x7b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\ +\x2e\x6f\x6e\x4c\x6f\x61\x64\x46\x69\x6e\x69\x73\x68\x65\x64\x20\ +\x3d\x20\x61\x72\x67\x33\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6f\x70\x65\x6e\x55\x72\x6c\ +\x28\x75\x72\x6c\x2c\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x70\x65\x72\x61\x74\x69\x6f\ +\x6e\x3a\x20\x61\x72\x67\x31\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x64\x61\x74\x61\x3a\x20\x61\ +\x72\x67\x32\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x7d\x2c\x20\x74\x68\x69\x73\x2e\x73\x65\x74\x74\x69\x6e\x67\x73\ +\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\ +\x65\x74\x75\x72\x6e\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x7d\ +\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\ +\x57\x72\x6f\x6e\x67\x20\x75\x73\x65\x20\x6f\x66\x20\x57\x65\x62\ +\x50\x61\x67\x65\x23\x6f\x70\x65\x6e\x22\x3b\x0a\x20\x20\x20\x20\ +\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x70\x61\x67\x65\x2e\x69\x6e\x63\ +\x6c\x75\x64\x65\x4a\x73\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\ +\x6e\x20\x28\x73\x63\x72\x69\x70\x74\x55\x72\x6c\x2c\x20\x6f\x6e\ +\x53\x63\x72\x69\x70\x74\x4c\x6f\x61\x64\x65\x64\x29\x20\x7b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x52\x65\x67\x69\x73\ +\x74\x65\x72\x20\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x20\x73\x69\ +\x67\x6e\x61\x6c\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x66\x6f\x72\ +\x20\x27\x61\x6c\x65\x72\x74\x28\x29\x27\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x74\x68\x69\x73\x2e\x6a\x61\x76\x61\x53\x63\x72\x69\ +\x70\x74\x41\x6c\x65\x72\x74\x53\x65\x6e\x74\x2e\x63\x6f\x6e\x6e\ +\x65\x63\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x6d\x73\ +\x67\x46\x72\x6f\x6d\x41\x6c\x65\x72\x74\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x6d\x73\ +\x67\x46\x72\x6f\x6d\x41\x6c\x65\x72\x74\x20\x3d\x3d\x3d\x20\x73\ +\x63\x72\x69\x70\x74\x55\x72\x6c\x29\x20\x7b\x0a\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\x52\ +\x65\x73\x6f\x75\x72\x63\x65\x20\x6c\x6f\x61\x64\x65\x64\x2c\x20\ +\x74\x69\x6d\x65\x20\x74\x6f\x20\x66\x69\x72\x65\x20\x74\x68\x65\ +\x20\x63\x61\x6c\x6c\x62\x61\x63\x6b\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x6e\x53\x63\x72\x69\ +\x70\x74\x4c\x6f\x61\x64\x65\x64\x28\x73\x63\x72\x69\x70\x74\x55\ +\x72\x6c\x29\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x2f\x2f\x20\x41\x6e\x64\x20\x64\x69\x73\x63\ +\x6f\x6e\x6e\x65\x63\x74\x20\x74\x68\x65\x20\x73\x69\x67\x6e\x61\ +\x6c\x20\x68\x61\x6e\x64\x6c\x65\x72\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x72\x79\x20\x7b\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x6a\x61\x76\x61\x53\x63\x72\ +\x69\x70\x74\x41\x6c\x65\x72\x74\x53\x65\x6e\x74\x2e\x64\x69\x73\ +\x63\x6f\x6e\x6e\x65\x63\x74\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\ +\x73\x2e\x63\x61\x6c\x6c\x65\x65\x29\x3b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x20\x63\x61\x74\ +\x63\x68\x20\x28\x65\x29\x20\x7b\x7d\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x7d\x29\x3b\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\ +\x41\x70\x70\x65\x6e\x64\x20\x74\x68\x65\x20\x73\x63\x72\x69\x70\ +\x74\x20\x74\x61\x67\x20\x74\x6f\x20\x74\x68\x65\x20\x62\x6f\x64\ +\x79\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x69\x73\x2e\x5f\ +\x61\x70\x70\x65\x6e\x64\x53\x63\x72\x69\x70\x74\x45\x6c\x65\x6d\ +\x65\x6e\x74\x28\x73\x63\x72\x69\x70\x74\x55\x72\x6c\x29\x3b\x0a\ +\x20\x20\x20\x20\x7d\x3b\x0a\x0a\x20\x20\x20\x20\x2f\x2f\x20\x43\ +\x6f\x70\x79\x20\x6f\x70\x74\x69\x6f\x6e\x73\x20\x69\x6e\x74\x6f\ +\x20\x70\x61\x67\x65\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x6f\x70\ +\x74\x73\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x70\x61\ +\x67\x65\x20\x3d\x20\x63\x6f\x70\x79\x49\x6e\x74\x6f\x28\x70\x61\ +\x67\x65\x2c\x20\x6f\x70\x74\x73\x29\x3b\x0a\x20\x20\x20\x20\x7d\ +\x0a\x0a\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x70\x61\x67\ +\x65\x3b\x0a\x7d\x3b\x0a\ +\x00\x00\x13\xc1\ +\x2f\ +\x2a\x6a\x73\x6c\x69\x6e\x74\x20\x73\x6c\x6f\x70\x70\x79\x3a\x20\ +\x74\x72\x75\x65\x2c\x20\x6e\x6f\x6d\x65\x6e\x3a\x20\x74\x72\x75\ +\x65\x20\x2a\x2f\x0a\x2f\x2a\x67\x6c\x6f\x62\x61\x6c\x20\x65\x78\ +\x70\x6f\x72\x74\x73\x3a\x74\x72\x75\x65\x20\x2a\x2f\x0a\x0a\x2f\ +\x2a\x0a\x20\x20\x54\x68\x69\x73\x20\x66\x69\x6c\x65\x20\x69\x73\ +\x20\x70\x61\x72\x74\x20\x6f\x66\x20\x74\x68\x65\x20\x50\x68\x61\ +\x6e\x74\x6f\x6d\x4a\x53\x20\x70\x72\x6f\x6a\x65\x63\x74\x20\x66\ +\x72\x6f\x6d\x20\x4f\x66\x69\x20\x4c\x61\x62\x73\x2e\x0a\x0a\x20\ +\x20\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\ +\x30\x31\x31\x20\x49\x76\x61\x6e\x20\x44\x65\x20\x4d\x61\x72\x69\ +\x6e\x6f\x20\x3c\x69\x76\x61\x6e\x2e\x64\x65\x2e\x6d\x61\x72\x69\ +\x6e\x6f\x40\x67\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x3e\x0a\x0a\x20\ +\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x20\ +\x61\x6e\x64\x20\x75\x73\x65\x20\x69\x6e\x20\x73\x6f\x75\x72\x63\ +\x65\x20\x61\x6e\x64\x20\x62\x69\x6e\x61\x72\x79\x20\x66\x6f\x72\ +\x6d\x73\x2c\x20\x77\x69\x74\x68\x20\x6f\x72\x20\x77\x69\x74\x68\ +\x6f\x75\x74\x0a\x20\x20\x6d\x6f\x64\x69\x66\x69\x63\x61\x74\x69\ +\x6f\x6e\x2c\x20\x61\x72\x65\x20\x70\x65\x72\x6d\x69\x74\x74\x65\ +\x64\x20\x70\x72\x6f\x76\x69\x64\x65\x64\x20\x74\x68\x61\x74\x20\ +\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x63\x6f\ +\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x72\x65\x20\x6d\x65\x74\ +\x3a\x0a\x0a\x20\x20\x20\x20\x2a\x20\x52\x65\x64\x69\x73\x74\x72\ +\x69\x62\x75\x74\x69\x6f\x6e\x73\x20\x6f\x66\x20\x73\x6f\x75\x72\ +\x63\x65\x20\x63\x6f\x64\x65\x20\x6d\x75\x73\x74\x20\x72\x65\x74\ +\x61\x69\x6e\x20\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\ +\x70\x79\x72\x69\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\ +\x74\x69\x63\x65\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\ +\x6f\x66\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\ +\x64\x20\x74\x68\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\ +\x64\x69\x73\x63\x6c\x61\x69\x6d\x65\x72\x2e\x0a\x20\x20\x20\x20\ +\x2a\x20\x52\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\ +\x73\x20\x69\x6e\x20\x62\x69\x6e\x61\x72\x79\x20\x66\x6f\x72\x6d\ +\x20\x6d\x75\x73\x74\x20\x72\x65\x70\x72\x6f\x64\x75\x63\x65\x20\ +\x74\x68\x65\x20\x61\x62\x6f\x76\x65\x20\x63\x6f\x70\x79\x72\x69\ +\x67\x68\x74\x0a\x20\x20\x20\x20\x20\x20\x6e\x6f\x74\x69\x63\x65\ +\x2c\x20\x74\x68\x69\x73\x20\x6c\x69\x73\x74\x20\x6f\x66\x20\x63\ +\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x20\x61\x6e\x64\x20\x74\x68\ +\x65\x20\x66\x6f\x6c\x6c\x6f\x77\x69\x6e\x67\x20\x64\x69\x73\x63\ +\x6c\x61\x69\x6d\x65\x72\x20\x69\x6e\x20\x74\x68\x65\x0a\x20\x20\ +\x20\x20\x20\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x61\x74\x69\x6f\ +\x6e\x20\x61\x6e\x64\x2f\x6f\x72\x20\x6f\x74\x68\x65\x72\x20\x6d\ +\x61\x74\x65\x72\x69\x61\x6c\x73\x20\x70\x72\x6f\x76\x69\x64\x65\ +\x64\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x64\x69\x73\x74\x72\ +\x69\x62\x75\x74\x69\x6f\x6e\x2e\x0a\x20\x20\x20\x20\x2a\x20\x4e\ +\x65\x69\x74\x68\x65\x72\x20\x74\x68\x65\x20\x6e\x61\x6d\x65\x20\ +\x6f\x66\x20\x74\x68\x65\x20\x3c\x6f\x72\x67\x61\x6e\x69\x7a\x61\ +\x74\x69\x6f\x6e\x3e\x20\x6e\x6f\x72\x20\x74\x68\x65\x0a\x20\x20\ +\x20\x20\x20\x20\x6e\x61\x6d\x65\x73\x20\x6f\x66\x20\x69\x74\x73\ +\x20\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\x6f\x72\x73\x20\x6d\x61\ +\x79\x20\x62\x65\x20\x75\x73\x65\x64\x20\x74\x6f\x20\x65\x6e\x64\ +\x6f\x72\x73\x65\x20\x6f\x72\x20\x70\x72\x6f\x6d\x6f\x74\x65\x20\ +\x70\x72\x6f\x64\x75\x63\x74\x73\x0a\x20\x20\x20\x20\x20\x20\x64\ +\x65\x72\x69\x76\x65\x64\x20\x66\x72\x6f\x6d\x20\x74\x68\x69\x73\ +\x20\x73\x6f\x66\x74\x77\x61\x72\x65\x20\x77\x69\x74\x68\x6f\x75\ +\x74\x20\x73\x70\x65\x63\x69\x66\x69\x63\x20\x70\x72\x69\x6f\x72\ +\x20\x77\x72\x69\x74\x74\x65\x6e\x20\x70\x65\x72\x6d\x69\x73\x73\ +\x69\x6f\x6e\x2e\x0a\x0a\x20\x20\x54\x48\x49\x53\x20\x53\x4f\x46\ +\x54\x57\x41\x52\x45\x20\x49\x53\x20\x50\x52\x4f\x56\x49\x44\x45\ +\x44\x20\x42\x59\x20\x54\x48\x45\x20\x43\x4f\x50\x59\x52\x49\x47\ +\x48\x54\x20\x48\x4f\x4c\x44\x45\x52\x53\x20\x41\x4e\x44\x20\x43\ +\x4f\x4e\x54\x52\x49\x42\x55\x54\x4f\x52\x53\x20\x22\x41\x53\x20\ +\x49\x53\x22\x0a\x20\x20\x41\x4e\x44\x20\x41\x4e\x59\x20\x45\x58\ +\x50\x52\x45\x53\x53\x20\x4f\x52\x20\x49\x4d\x50\x4c\x49\x45\x44\ +\x20\x57\x41\x52\x52\x41\x4e\x54\x49\x45\x53\x2c\x20\x49\x4e\x43\ +\x4c\x55\x44\x49\x4e\x47\x2c\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\ +\x4c\x49\x4d\x49\x54\x45\x44\x20\x54\x4f\x2c\x20\x54\x48\x45\x0a\ +\x20\x20\x49\x4d\x50\x4c\x49\x45\x44\x20\x57\x41\x52\x52\x41\x4e\ +\x54\x49\x45\x53\x20\x4f\x46\x20\x4d\x45\x52\x43\x48\x41\x4e\x54\ +\x41\x42\x49\x4c\x49\x54\x59\x20\x41\x4e\x44\x20\x46\x49\x54\x4e\ +\x45\x53\x53\x20\x46\x4f\x52\x20\x41\x20\x50\x41\x52\x54\x49\x43\ +\x55\x4c\x41\x52\x20\x50\x55\x52\x50\x4f\x53\x45\x0a\x20\x20\x41\ +\x52\x45\x20\x44\x49\x53\x43\x4c\x41\x49\x4d\x45\x44\x2e\x20\x49\ +\x4e\x20\x4e\x4f\x20\x45\x56\x45\x4e\x54\x20\x53\x48\x41\x4c\x4c\ +\x20\x3c\x43\x4f\x50\x59\x52\x49\x47\x48\x54\x20\x48\x4f\x4c\x44\ +\x45\x52\x3e\x20\x42\x45\x20\x4c\x49\x41\x42\x4c\x45\x20\x46\x4f\ +\x52\x20\x41\x4e\x59\x0a\x20\x20\x44\x49\x52\x45\x43\x54\x2c\x20\ +\x49\x4e\x44\x49\x52\x45\x43\x54\x2c\x20\x49\x4e\x43\x49\x44\x45\ +\x4e\x54\x41\x4c\x2c\x20\x53\x50\x45\x43\x49\x41\x4c\x2c\x20\x45\ +\x58\x45\x4d\x50\x4c\x41\x52\x59\x2c\x20\x4f\x52\x20\x43\x4f\x4e\ +\x53\x45\x51\x55\x45\x4e\x54\x49\x41\x4c\x20\x44\x41\x4d\x41\x47\ +\x45\x53\x0a\x20\x20\x28\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x2c\ +\x20\x42\x55\x54\x20\x4e\x4f\x54\x20\x4c\x49\x4d\x49\x54\x45\x44\ +\x20\x54\x4f\x2c\x20\x50\x52\x4f\x43\x55\x52\x45\x4d\x45\x4e\x54\ +\x20\x4f\x46\x20\x53\x55\x42\x53\x54\x49\x54\x55\x54\x45\x20\x47\ +\x4f\x4f\x44\x53\x20\x4f\x52\x20\x53\x45\x52\x56\x49\x43\x45\x53\ +\x3b\x0a\x20\x20\x4c\x4f\x53\x53\x20\x4f\x46\x20\x55\x53\x45\x2c\ +\x20\x44\x41\x54\x41\x2c\x20\x4f\x52\x20\x50\x52\x4f\x46\x49\x54\ +\x53\x3b\x20\x4f\x52\x20\x42\x55\x53\x49\x4e\x45\x53\x53\x20\x49\ +\x4e\x54\x45\x52\x52\x55\x50\x54\x49\x4f\x4e\x29\x20\x48\x4f\x57\ +\x45\x56\x45\x52\x20\x43\x41\x55\x53\x45\x44\x20\x41\x4e\x44\x0a\ +\x20\x20\x4f\x4e\x20\x41\x4e\x59\x20\x54\x48\x45\x4f\x52\x59\x20\ +\x4f\x46\x20\x4c\x49\x41\x42\x49\x4c\x49\x54\x59\x2c\x20\x57\x48\ +\x45\x54\x48\x45\x52\x20\x49\x4e\x20\x43\x4f\x4e\x54\x52\x41\x43\ +\x54\x2c\x20\x53\x54\x52\x49\x43\x54\x20\x4c\x49\x41\x42\x49\x4c\ +\x49\x54\x59\x2c\x20\x4f\x52\x20\x54\x4f\x52\x54\x0a\x20\x20\x28\ +\x49\x4e\x43\x4c\x55\x44\x49\x4e\x47\x20\x4e\x45\x47\x4c\x49\x47\ +\x45\x4e\x43\x45\x20\x4f\x52\x20\x4f\x54\x48\x45\x52\x57\x49\x53\ +\x45\x29\x20\x41\x52\x49\x53\x49\x4e\x47\x20\x49\x4e\x20\x41\x4e\ +\x59\x20\x57\x41\x59\x20\x4f\x55\x54\x20\x4f\x46\x20\x54\x48\x45\ +\x20\x55\x53\x45\x20\x4f\x46\x0a\x20\x20\x54\x48\x49\x53\x20\x53\ +\x4f\x46\x54\x57\x41\x52\x45\x2c\x20\x45\x56\x45\x4e\x20\x49\x46\ +\x20\x41\x44\x56\x49\x53\x45\x44\x20\x4f\x46\x20\x54\x48\x45\x20\ +\x50\x4f\x53\x53\x49\x42\x49\x4c\x49\x54\x59\x20\x4f\x46\x20\x53\ +\x55\x43\x48\x20\x44\x41\x4d\x41\x47\x45\x2e\x0a\x2a\x2f\x0a\x0a\ +\x2f\x2f\x20\x4a\x61\x76\x61\x53\x63\x72\x69\x70\x74\x20\x22\x73\ +\x68\x69\x6d\x22\x20\x74\x6f\x20\x74\x68\x72\x6f\x77\x20\x65\x78\ +\x63\x65\x70\x74\x69\x6f\x6e\x73\x20\x69\x6e\x20\x63\x61\x73\x65\ +\x20\x61\x20\x63\x72\x69\x74\x69\x63\x61\x6c\x20\x6f\x70\x65\x72\ +\x61\x74\x69\x6f\x6e\x20\x66\x61\x69\x6c\x73\x2e\x0a\x0a\x2f\x2a\ +\x2a\x20\x4f\x70\x65\x6e\x20\x61\x6e\x64\x20\x72\x65\x74\x75\x72\ +\x6e\x20\x61\x20\x22\x66\x69\x6c\x65\x22\x20\x6f\x62\x6a\x65\x63\ +\x74\x2e\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\ +\x72\x6f\x77\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\ +\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\ +\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\ +\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\ +\x20\x6f\x70\x65\x6e\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\ +\x6d\x6f\x64\x65\x20\x4f\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\x20\ +\x41\x20\x73\x74\x72\x69\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\x66\ +\x20\x27\x72\x27\x2c\x20\x27\x77\x27\x2c\x20\x27\x61\x2f\x2b\x27\ +\x20\x63\x68\x61\x72\x61\x63\x74\x65\x72\x73\x2e\x0a\x20\x2a\x20\ +\x40\x72\x65\x74\x75\x72\x6e\x20\x22\x66\x69\x6c\x65\x22\x20\x6f\ +\x62\x6a\x65\x63\x74\x0a\x20\x2a\x2f\x0a\x65\x78\x70\x6f\x72\x74\ +\x73\x2e\x6f\x70\x65\x6e\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\ +\x6e\x20\x28\x70\x61\x74\x68\x2c\x20\x6d\x6f\x64\x65\x29\x20\x7b\ +\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x66\x69\x6c\x65\x20\x3d\x20\ +\x65\x78\x70\x6f\x72\x74\x73\x2e\x5f\x6f\x70\x65\x6e\x28\x70\x61\ +\x74\x68\x2c\x20\x6d\x6f\x64\x65\x29\x3b\x0a\x20\x20\x20\x20\x69\ +\x66\x20\x28\x66\x69\x6c\x65\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x66\x69\x6c\x65\x3b\x0a\ +\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\ +\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x6f\x70\x65\x6e\x20\ +\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\ +\x20\x22\x27\x22\x3b\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x4f\x70\ +\x65\x6e\x2c\x20\x72\x65\x61\x64\x20\x61\x6e\x64\x20\x72\x65\x74\ +\x75\x72\x6e\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x6f\x66\x20\x61\ +\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\ +\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\ +\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\ +\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\ +\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\ +\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\x66\x72\x6f\ +\x6d\x0a\x20\x2a\x20\x40\x72\x65\x74\x75\x72\x6e\x20\x66\x69\x6c\ +\x65\x20\x63\x6f\x6e\x74\x65\x6e\x74\x0a\x20\x2a\x2f\x0a\x65\x78\ +\x70\x6f\x72\x74\x73\x2e\x72\x65\x61\x64\x20\x3d\x20\x66\x75\x6e\ +\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\ +\x20\x20\x20\x76\x61\x72\x20\x66\x20\x3d\x20\x65\x78\x70\x6f\x72\ +\x74\x73\x2e\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\x20\x27\x72\ +\x27\x29\x2c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x74\ +\x65\x6e\x74\x20\x3d\x20\x66\x2e\x72\x65\x61\x64\x28\x29\x3b\x0a\ +\x0a\x20\x20\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\ +\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x63\x6f\x6e\x74\x65\ +\x6e\x74\x3b\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x4f\x70\x65\x6e\ +\x20\x61\x6e\x64\x20\x77\x72\x69\x74\x65\x20\x63\x6f\x6e\x74\x65\ +\x6e\x74\x20\x74\x6f\x20\x61\x20\x66\x69\x6c\x65\x0a\x20\x2a\x20\ +\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\ +\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\ +\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\ +\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\ +\x66\x20\x74\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\ +\x61\x64\x20\x66\x72\x6f\x6d\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\ +\x6d\x20\x63\x6f\x6e\x74\x65\x6e\x74\x20\x43\x6f\x6e\x74\x65\x6e\ +\x74\x20\x74\x6f\x20\x77\x72\x69\x74\x65\x20\x74\x6f\x20\x74\x68\ +\x65\x20\x66\x69\x6c\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\ +\x20\x6d\x6f\x64\x65\x20\x4f\x70\x65\x6e\x20\x4d\x6f\x64\x65\x2e\ +\x20\x41\x20\x73\x74\x72\x69\x6e\x67\x20\x6d\x61\x64\x65\x20\x6f\ +\x66\x20\x27\x77\x27\x20\x6f\x72\x20\x27\x61\x20\x2f\x20\x2b\x27\ +\x20\x63\x68\x61\x72\x61\x63\x74\x65\x72\x73\x2e\x0a\x20\x2a\x2f\ +\x0a\x65\x78\x70\x6f\x72\x74\x73\x2e\x77\x72\x69\x74\x65\x20\x3d\ +\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x2c\ +\x20\x63\x6f\x6e\x74\x65\x6e\x74\x2c\x20\x6d\x6f\x64\x65\x29\x20\ +\x7b\x0a\x20\x20\x20\x20\x76\x61\x72\x20\x66\x20\x3d\x20\x65\x78\ +\x70\x6f\x72\x74\x73\x2e\x6f\x70\x65\x6e\x28\x70\x61\x74\x68\x2c\ +\x20\x6d\x6f\x64\x65\x29\x3b\x0a\x0a\x20\x20\x20\x20\x66\x2e\x77\ +\x72\x69\x74\x65\x28\x63\x6f\x6e\x74\x65\x6e\x74\x29\x3b\x0a\x20\ +\x20\x20\x20\x66\x2e\x63\x6c\x6f\x73\x65\x28\x29\x3b\x0a\x7d\x3b\ +\x0a\x0a\x2f\x2a\x2a\x20\x52\x65\x74\x75\x72\x6e\x20\x74\x68\x65\ +\x20\x73\x69\x7a\x65\x20\x6f\x66\x20\x61\x20\x66\x69\x6c\x65\x2c\ +\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x2e\x0a\x20\x2a\x20\x49\x74\ +\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\ +\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\ +\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\x72\ +\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\ +\x74\x68\x65\x20\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\ +\x20\x74\x68\x65\x20\x73\x69\x7a\x65\x20\x6f\x66\x0a\x20\x2a\x20\ +\x40\x72\x65\x74\x75\x72\x6e\x20\x46\x69\x6c\x65\x20\x73\x69\x7a\ +\x65\x20\x69\x6e\x20\x62\x79\x74\x65\x73\x0a\x20\x2a\x2f\x0a\x65\ +\x78\x70\x6f\x72\x74\x73\x2e\x73\x69\x7a\x65\x20\x3d\x20\x66\x75\ +\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\ +\x20\x20\x20\x20\x76\x61\x72\x20\x73\x69\x7a\x65\x20\x3d\x20\x65\ +\x78\x70\x6f\x72\x74\x73\x2e\x5f\x73\x69\x7a\x65\x28\x70\x61\x74\ +\x68\x29\x3b\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x73\x69\x7a\x65\ +\x20\x21\x3d\x3d\x20\x2d\x31\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\ +\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x73\x69\x7a\x65\x3b\x0a\ +\x20\x20\x20\x20\x7d\x0a\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\ +\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\x61\x64\x20\ +\x66\x69\x6c\x65\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\ +\x20\x22\x27\x20\x73\x69\x7a\x65\x22\x3b\x0a\x7d\x3b\x0a\x0a\x2f\ +\x2a\x2a\x20\x43\x6f\x70\x79\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\ +\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\ +\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\ +\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\ +\x20\x40\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\ +\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\ +\x65\x20\x66\x69\x6c\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\ +\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\x74\ +\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\x61\ +\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\x0a\x20\x2a\x2f\x0a\x65\x78\ +\x70\x6f\x72\x74\x73\x2e\x63\x6f\x70\x79\x20\x3d\x20\x66\x75\x6e\ +\x63\x74\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\ +\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x69\x66\x20\x28\x21\x65\x78\x70\x6f\x72\x74\x73\x2e\x5f\ +\x63\x6f\x70\x79\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\ +\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x29\x20\x7b\x0a\x20\x20\x20\ +\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\ +\x6c\x65\x20\x74\x6f\x20\x63\x6f\x70\x79\x20\x66\x69\x6c\x65\x20\ +\x27\x22\x20\x2b\x20\x73\x6f\x75\x72\x63\x65\x20\x2b\x20\x22\x27\ +\x20\x61\x74\x20\x27\x22\x20\x2b\x20\x64\x65\x73\x74\x69\x6e\x61\ +\x74\x69\x6f\x6e\x20\x2b\x20\x22\x27\x22\x3b\x0a\x20\x20\x20\x20\ +\x7d\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x43\x6f\x70\x79\x20\x61\ +\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x2e\ +\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\ +\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\ +\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\ +\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\ +\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\ +\x63\x65\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\ +\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x64\x65\x73\x74\ +\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\x6f\x66\x20\ +\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\ +\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x0a\x20\ +\x2a\x2f\x0a\x65\x78\x70\x6f\x72\x74\x73\x2e\x63\x6f\x70\x79\x54\ +\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\ +\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\ +\x69\x6f\x6e\x29\x20\x7b\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x21\ +\x65\x78\x70\x6f\x72\x74\x73\x2e\x5f\x63\x6f\x70\x79\x54\x72\x65\ +\x65\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\ +\x61\x74\x69\x6f\x6e\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\ +\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\ +\x74\x6f\x20\x63\x6f\x70\x79\x20\x64\x69\x72\x65\x63\x74\x6f\x72\ +\x79\x20\x74\x72\x65\x65\x20\x27\x22\x20\x2b\x20\x73\x6f\x75\x72\ +\x63\x65\x20\x2b\x20\x22\x27\x20\x61\x74\x20\x27\x22\x20\x2b\x20\ +\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x2b\x20\x22\x27\ +\x22\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\ +\x20\x4d\x6f\x76\x65\x20\x61\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\ +\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\ +\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\ +\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\ +\x70\x61\x72\x61\x6d\x20\x73\x6f\x75\x72\x63\x65\x20\x50\x61\x74\ +\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x6f\x75\x72\x63\x65\x20\ +\x66\x69\x6c\x65\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x64\ +\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\x20\x50\x61\x74\x68\x20\ +\x6f\x66\x20\x74\x68\x65\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\ +\x6f\x6e\x20\x66\x69\x6c\x65\x0a\x20\x2a\x2f\x0a\x65\x78\x70\x6f\ +\x72\x74\x73\x2e\x6d\x6f\x76\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\ +\x69\x6f\x6e\x20\x28\x73\x6f\x75\x72\x63\x65\x2c\x20\x64\x65\x73\ +\x74\x69\x6e\x61\x74\x69\x6f\x6e\x29\x20\x7b\x0a\x20\x20\x20\x20\ +\x65\x78\x70\x6f\x72\x74\x73\x2e\x63\x6f\x70\x79\x28\x73\x6f\x75\ +\x72\x63\x65\x2c\x20\x64\x65\x73\x74\x69\x6e\x61\x74\x69\x6f\x6e\ +\x29\x3b\x0a\x20\x20\x20\x20\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\ +\x65\x6d\x6f\x76\x65\x28\x73\x6f\x75\x72\x63\x65\x29\x3b\x0a\x7d\ +\x3b\x0a\x0a\x2f\x2a\x2a\x20\x52\x65\x6d\x6f\x76\x65\x73\x20\x61\ +\x20\x66\x69\x6c\x65\x2e\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\ +\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\ +\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\ +\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\ +\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\ +\x66\x69\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\ +\x2a\x2f\x0a\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\ +\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x70\x61\ +\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x69\x66\x20\x28\x21\x65\ +\x78\x70\x6f\x72\x74\x73\x2e\x5f\x72\x65\x6d\x6f\x76\x65\x28\x70\ +\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\ +\x20\x72\x65\x6d\x6f\x76\x65\x20\x66\x69\x6c\x65\x20\x27\x22\x20\ +\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\x20\x20\ +\x20\x20\x7d\x0a\x7d\x3b\x0a\x0a\x2f\x2a\x2a\x20\x52\x65\x6d\x6f\ +\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x2e\ +\x0a\x20\x2a\x20\x49\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\ +\x77\x20\x61\x6e\x20\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\ +\x66\x20\x69\x74\x20\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\ +\x2a\x20\x40\x70\x61\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\ +\x74\x68\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\ +\x6f\x72\x79\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\x2a\ +\x2f\x0a\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\x65\ +\x44\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x3d\x20\x66\x75\x6e\x63\ +\x74\x69\x6f\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\ +\x20\x20\x69\x66\x20\x28\x21\x65\x78\x70\x6f\x72\x74\x73\x2e\x5f\ +\x72\x65\x6d\x6f\x76\x65\x44\x69\x72\x65\x63\x74\x6f\x72\x79\x28\ +\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\x20\x20\x20\x20\x20\x20\ +\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\x61\x62\x6c\x65\x20\x74\ +\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\x69\x72\x65\x63\x74\x6f\ +\x72\x79\x20\x27\x22\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\ +\x27\x22\x3b\x0a\x20\x20\x20\x20\x7d\x0a\x7d\x3b\x0a\x0a\x2f\x2a\ +\x2a\x20\x52\x65\x6d\x6f\x76\x65\x73\x20\x61\x20\x64\x69\x72\x65\ +\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x2e\x0a\x20\x2a\x20\x49\ +\x74\x20\x77\x69\x6c\x6c\x20\x74\x68\x72\x6f\x77\x20\x61\x6e\x20\ +\x65\x78\x63\x65\x70\x74\x69\x6f\x6e\x20\x69\x66\x20\x69\x74\x20\ +\x66\x61\x69\x6c\x73\x2e\x0a\x20\x2a\x0a\x20\x2a\x20\x40\x70\x61\ +\x72\x61\x6d\x20\x70\x61\x74\x68\x20\x50\x61\x74\x68\x20\x6f\x66\ +\x20\x74\x68\x65\x20\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\ +\x72\x65\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x0a\x20\x2a\ +\x2f\x0a\x65\x78\x70\x6f\x72\x74\x73\x2e\x72\x65\x6d\x6f\x76\x65\ +\x54\x72\x65\x65\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\ +\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x69\x66\x20\ +\x28\x21\x65\x78\x70\x6f\x72\x74\x73\x2e\x5f\x72\x65\x6d\x6f\x76\ +\x65\x54\x72\x65\x65\x28\x70\x61\x74\x68\x29\x29\x20\x7b\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x22\x55\x6e\ +\x61\x62\x6c\x65\x20\x74\x6f\x20\x72\x65\x6d\x6f\x76\x65\x20\x64\ +\x69\x72\x65\x63\x74\x6f\x72\x79\x20\x74\x72\x65\x65\x20\x27\x22\ +\x20\x2b\x20\x70\x61\x74\x68\x20\x2b\x20\x22\x27\x22\x3b\x0a\x20\ +\x20\x20\x20\x7d\x0a\x7d\x3b\x0a\x0a\x65\x78\x70\x6f\x72\x74\x73\ +\x2e\x74\x6f\x75\x63\x68\x20\x3d\x20\x66\x75\x6e\x63\x74\x69\x6f\ +\x6e\x20\x28\x70\x61\x74\x68\x29\x20\x7b\x0a\x20\x20\x20\x20\x65\ +\x78\x70\x6f\x72\x74\x73\x2e\x77\x72\x69\x74\x65\x28\x70\x61\x74\ +\x68\x2c\x20\x22\x22\x2c\x20\x27\x61\x27\x29\x3b\x0a\x7d\x3b\x0a\ +\ " qt_resource_name = "\ +\x00\x07\ +\x04\x5b\xc2\x23\ +\x00\x6d\ +\x00\x6f\x00\x64\x00\x75\x00\x6c\x00\x65\x00\x73\ \x00\x0c\ \x06\xa4\xe2\x53\ \x00\x62\ @@ -4430,15 +5097,26 @@ \x00\x7d\x71\x73\ \x00\x63\ \x00\x6f\x00\x66\x00\x66\x00\x65\x00\x65\x00\x2d\x00\x73\x00\x63\x00\x72\x00\x69\x00\x70\x00\x74\x00\x2e\x00\x6a\x00\x73\ +\x00\x0a\ +\x06\x72\xf2\x33\ +\x00\x77\ +\x00\x65\x00\x62\x00\x70\x00\x61\x00\x67\x00\x65\x00\x2e\x00\x6a\x00\x73\ +\x00\x05\ +\x00\x6d\x65\x13\ +\x00\x66\ +\x00\x73\x00\x2e\x00\x6a\x00\x73\ " qt_resource_struct = "\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\ -\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x8d\ -\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x42\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\ -\x00\x00\x00\x88\x00\x01\x00\x00\x00\x01\x00\x00\x63\xd6\ -\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xab\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x01\ +\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x09\x79\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x07\ +\x00\x00\x00\x14\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\x56\x00\x02\x00\x00\x00\x02\x00\x00\x00\x05\ +\x00\x00\x00\x9c\x00\x01\x00\x00\x00\x01\x00\x00\x60\xc2\ +\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x97\ +\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x01\x00\x01\x27\x85\ +\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x0f\x1a\ " def qInitResources(): From 5b24d2417a8d55ab7625fe0e8848ed175c1ed056 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 13 Sep 2011 14:50:12 -0700 Subject: [PATCH 17/18] Fix injectme.coffee example which was injecting 'injectme.js' instead of itself --- examples/injectme.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/injectme.coffee b/examples/injectme.coffee index c74508753e..2efb81d095 100644 --- a/examples/injectme.coffee +++ b/examples/injectme.coffee @@ -13,7 +13,7 @@ if phantom? console.log "* Script will 'inject' itself in a page..." page.open "about:blank", (status) -> if status is "success" - if page.injectJs("injectme.js") + if page.injectJs("injectme.coffee") console.log "... done injecting itself!" else console.log "... fail! Check the $PWD?!" From 26e49cc4c160a6c67534e837282e2ee1519cd56d Mon Sep 17 00:00:00 2001 From: IceArmy Date: Tue, 13 Sep 2011 14:59:59 -0700 Subject: [PATCH 18/18] Fix bug on FileSystem() where super() in __new__() was calling the CSConverter class, instead of FileSystem. Whoops!! --- python/pyphantomjs/filesystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyphantomjs/filesystem.py b/python/pyphantomjs/filesystem.py index fc4d88bb2f..0faa1ef5c5 100644 --- a/python/pyphantomjs/filesystem.py +++ b/python/pyphantomjs/filesystem.py @@ -114,7 +114,7 @@ class FileSystem(QObject): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: - cls._instance = super(CSConverter, cls).__new__(cls, *args, **kwargs) + cls._instance = super(FileSystem, cls).__new__(cls, *args, **kwargs) return cls._instance def __init__(self, parent):