[pLog-svn] r3705 - in plog/trunk/class/test: PHPUnit helpers tests tests/data/validator tests/extra tests/file/unpacker tests/mail tests/mail/phpmailer tests/net tests/net/http

oscar at devel.lifetype.net oscar at devel.lifetype.net
Thu Jul 6 14:33:19 GMT 2006


Author: oscar
Date: 2006-07-06 14:33:18 +0000 (Thu, 06 Jul 2006)
New Revision: 3705

Added:
   plog/trunk/class/test/helpers/lifetypetestcase.class.php
   plog/trunk/class/test/tests/extra/
   plog/trunk/class/test/tests/extra/sqlinjection_test.class.php
   plog/trunk/class/test/tests/net/http/
   plog/trunk/class/test/tests/net/http/httpclient_test.class.php
Modified:
   plog/trunk/class/test/PHPUnit/TestCase.php
   plog/trunk/class/test/tests/data/validator/integervalidator_test.class.php
   plog/trunk/class/test/tests/file/unpacker/zipunpacker_test.class.php
   plog/trunk/class/test/tests/mail/emailservice_test.class.php
   plog/trunk/class/test/tests/mail/phpmailer/message.txt
   plog/trunk/class/test/tests/mail/phpmailer/phpmailer_test.class.php
   plog/trunk/class/test/tests/net/url_test.class.php
Log:
added a new class, LifeTypeTestCase with support for HTTP asserts (so that we can check response codes, find certain strings in pages) for those test cases that need it. The first set of these cases is a test case to make sure that the SQL injection issues reported so far do not happen again. All the other test cases have been modified to inherit this class.


Modified: plog/trunk/class/test/PHPUnit/TestCase.php
===================================================================
--- plog/trunk/class/test/PHPUnit/TestCase.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/PHPUnit/TestCase.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -48,6 +48,7 @@
 
 require_once PHPUNIT_CLASS_PATH.'PHPUnit/Assert.php';
 require_once PHPUNIT_CLASS_PATH.'PHPUnit/TestResult.php';
+//include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypeassert.class.php" );
 
 /**
  * A TestCase defines the fixture to run multiple tests.

Added: plog/trunk/class/test/helpers/lifetypetestcase.class.php
===================================================================
--- plog/trunk/class/test/helpers/lifetypetestcase.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/helpers/lifetypetestcase.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -0,0 +1,61 @@
+<?php
+
+	include_once( PLOG_CLASS_PATH."class/test/PHPUnit/TestCase.php");
+	include_once( PLOG_CLASS_PATH."class/net/http/httpclient.class.php" );
+	
+	/**
+	 * \ingroup Tests
+	 *
+	 * Extends the PHPUnit's TestCase class to provide support for using asserts
+	 * with HTTP requests.
+	 */
+	class LifeTypeTestCase extends PHPUnit_TestCase
+	{
+		/**
+		 * makes the given HTTP request and checks that the HTTP response code
+		 * matches with the expected once
+		 *
+		 * @param url
+		 * @param expected
+		 * @param message
+		 */
+		function assertHTTPResponseCodeEquals( $url, $expected, $message = '' )
+		{
+			$c = new HTTPClient();
+			$result = $c->fetch( $url );
+			
+			// check i page loaded correctly
+			$this->assertTrue( $result, "Could not fetch $url" );
+			
+			// get the code from the response and see if the expected one
+			// is even there			
+			if( !strpos( $c->response_code, $expected )) {
+				$message = $message." expected $expected, actual '".$c->response_code."'";
+				$this->fail( $message );
+			}
+		}
+		
+		/**
+		 * Finds the expected string in the content of the response after fetching the given
+		 * url, and raises an error if not there. 
+		 *
+		 * @param url
+		 * @param expected
+		 * @param message
+		 */
+		function assertHTTPResponseContains( $url, $expected, $message = '' )
+		{
+			// fetch the url
+			$c = new HTTPClient();
+			$result = $c->fetch( $url );		
+			
+			$this->assertTrue( $result, "Could not fetch $url" );
+			
+			// see if the string we're looking for is in the contents of the page
+			if( !strstr( $c->results, $expected )) {
+				$message = $message." expecting '$expected'";
+				return( $this->fail( $message ));
+			}
+		}		
+	}
+?>
\ No newline at end of file

Modified: plog/trunk/class/test/tests/data/validator/integervalidator_test.class.php
===================================================================
--- plog/trunk/class/test/tests/data/validator/integervalidator_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/data/validator/integervalidator_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -1,6 +1,6 @@
 <?php
 
-	include_once( PLOG_CLASS_PATH."class/test/PHPUnit.php" );
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
 	include_once( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
 
 	/**
@@ -8,7 +8,7 @@
 	 *
 	 * Test case for the IntegerValidator class
 	 */
-	class IntegerValidator_Test extends PHPUnit_TestCase
+	class IntegerValidator_Test extends LifeTypeTestCase
 	{
 		function setUp()
 		{

Added: plog/trunk/class/test/tests/extra/sqlinjection_test.class.php
===================================================================
--- plog/trunk/class/test/tests/extra/sqlinjection_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/extra/sqlinjection_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -0,0 +1,31 @@
+<?php
+
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
+	include_once( PLOG_CLASS_PATH."class/config/config.class.php" );
+
+	/**
+	 * \ingroup Tests
+	 *
+	 * Regression test for the SQL injection vulnerabilities that were fixed
+	 * in LT 1.0.5 and 1.0.6.
+	 */
+	class SQLInjection_Test extends LifeTypeTestCase
+	{
+		var $url;
+		
+		function setUp()
+		{
+			// get the base url of the current installation
+			$config =& Config::getConfig();
+			$this->url = $config->getValue( "base_url" )."/index.php";
+		}
+		
+		function testArticleIdInjection()
+		{
+			// this one should return a page with an error message
+			$url = $this->url."?op=ViewArticle&blogId=1&articleId=".urlencode("9999/**/UNION/**/SELECT/**/password, 1,1,1,1,1,1,1/**/FROM/**/lt_users/**/WHERE/**/id=1/*");
+			
+			$this->assertHTTPResponseContains( $url, "The article you specified could not be found" );
+		}		
+	}	
+?>
\ No newline at end of file

Modified: plog/trunk/class/test/tests/file/unpacker/zipunpacker_test.class.php
===================================================================
--- plog/trunk/class/test/tests/file/unpacker/zipunpacker_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/file/unpacker/zipunpacker_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -1,6 +1,6 @@
 <?php
 
-	include_once( PLOG_CLASS_PATH."class/test/PHPUnit.php" );
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
 	include_once( PLOG_CLASS_PATH."class/file/unpacker/zipunpacker.class.php" );
 	
 	define( "PCLZIP_TEST_FILE", PLOG_CLASS_PATH."class/test/tests/file/unpacker/pclziptest.zip" );
@@ -10,7 +10,7 @@
 	 *
 	 * Test case for the PCLZip library, used by the ZipUnpacker class
 	 */
-	class ZipUnpacker_Test extends PHPUnit_TestCase
+	class ZipUnpacker_Test extends LifeTypeTestCase
 	{
 		function setUp()
 		{

Modified: plog/trunk/class/test/tests/mail/emailservice_test.class.php
===================================================================
--- plog/trunk/class/test/tests/mail/emailservice_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/mail/emailservice_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -1,6 +1,6 @@
 <?php
 
-	include_once( PLOG_CLASS_PATH."class/test/PHPUnit.php" );
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
 	include_once( PLOG_CLASS_PATH."class/mail/emailservice.class.php" );
 
 	/**
@@ -8,7 +8,7 @@
 	 *
 	 * Test LifeType's email sending functionality
 	 */
-	class EmailService_Test extends PHPUnit_TestCase
+	class EmailService_Test extends LifeTypeTestCase
 	{
 		function setUp()
 		{

Modified: plog/trunk/class/test/tests/mail/phpmailer/message.txt
===================================================================
--- plog/trunk/class/test/tests/mail/phpmailer/message.txt	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/mail/phpmailer/message.txt	2006-07-06 14:33:18 UTC (rev 3705)
@@ -1,22 +1,22 @@
-Date: Thu, 6 Jul 2006 14:43:28 +0200
+Date: Thu, 6 Jul 2006 17:04:35 +0200
 Return-Path: unit_test at phpmailer.sf.net
 To: Test User <please_set at please.set>
 From: Unit Tester <unit_test at phpmailer.sf.net>
 Reply-to: Reply Guy <no_reply at phpmailer.sf.net>
 Subject: Unit Test: AltBody + Attachment
-Message-ID: <0ed405d7936eea8849dc41785cd66db2 at caladan.local>
+Message-ID: <da558b7b2173e5637e74b4d5c56e9652 at caladan.local>
 X-Priority: 3
 X-Mailer: PHPMailer [version 1.73]
 MIME-Version: 1.0
 Content-Type: multipart/mixed;
-	boundary="b1_0ed405d7936eea8849dc41785cd66db2"
+	boundary="b1_da558b7b2173e5637e74b4d5c56e9652"
 
 
---b1_0ed405d7936eea8849dc41785cd66db2
+--b1_da558b7b2173e5637e74b4d5c56e9652
 Content-Type: multipart/alternative;
-	boundary="b2_0ed405d7936eea8849dc41785cd66db2"
+	boundary="b2_da558b7b2173e5637e74b4d5c56e9652"
 
---b2_0ed405d7936eea8849dc41785cd66db2
+--b2_da558b7b2173e5637e74b4d5c56e9652
 Content-Type: text/plain; charset = "iso-8859-1"
 Content-Transfer-Encoding: 8bit
 
@@ -24,7 +24,7 @@
 This is the text part of the email.
 
 
---b2_0ed405d7936eea8849dc41785cd66db2
+--b2_da558b7b2173e5637e74b4d5c56e9652
 Content-Type: text/html; charset = "iso-8859-1"
 Content-Transfer-Encoding: 8bit
 
@@ -33,326 +33,327 @@
 
 
 
---b2_0ed405d7936eea8849dc41785cd66db2--
---b1_0ed405d7936eea8849dc41785cd66db2
+--b2_da558b7b2173e5637e74b4d5c56e9652--
+--b1_da558b7b2173e5637e74b4d5c56e9652
 Content-Type: application/octet-stream; name="test_attach.txt"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="test_attach.txt"
 
 PD9waHANCi8qKioqKioqKioqKioqKioqKioqDQogIFVuaXQgVGVzdA0KICBUeXBlOiBwaHBtYWls
 ZXIgY2xhc3MNCioqKioqKioqKioqKioqKioqKioqLw0KDQppbmNsdWRlX29uY2UoIFBMT0dfQ0xB
-U1NfUEFUSC4iY2xhc3MvdGVzdC9QSFBVbml0LnBocCIgKTsNCmluY2x1ZGVfb25jZSggUExPR19D
-TEFTU19QQVRILiJjbGFzcy9tYWlsL3BocG1haWxlci9jbGFzcy5waHBtYWlsZXIucGhwIiApOw0K
-DQovKioNCiAqIHRoZXNlIHdlcmUgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIHRlc3Qgc3VpdGUg
-YnV0IGhhZCB0byBiZSBhZGRlZCB0byBhdm9pZCBwbGVudHkgb2YgaXNzdWVzIHdpdGggZmlsZXMs
-DQogKiBmb2xkZXJzLCBwYXRocyBhbmQgbWFpbCBzZXJ2ZXJzLiBQbGVhc2UgbW9kaWZ5IHRoZW0g
-dG8gc3VpdCB5b3VyIG5lZWRzDQogKi8NCmRlZmluZSggIlRFU1RfTUFJTF9IT1NUIiwgImxvY2Fs
-aG9zdCIgKTsNCmRlZmluZSggIlRFU1RfTUFJTF9VU0VSIiwgInBsZWFzZV9zZXRAcGxlYXNlLnNl
-dCIgKTsNCmRlZmluZSggIlBIUE1BSUxFUl9URVNUX0JBU0VfRk9MREVSIiwgUExPR19DTEFTU19Q
-QVRILiJjbGFzcy90ZXN0L3Rlc3RzL21haWwvcGhwbWFpbGVyLyIgKTsNCg0KLyoqDQogKiBQZXJm
-b3JtcyBhdXRoZW50aWNhdGlvbiB0ZXN0cw0KICovDQpjbGFzcyBwaHBtYWlsZXJfVGVzdCBleHRl
-bmRzIFBIUFVuaXRfVGVzdENhc2UNCnsNCiAgICAvKioNCiAgICAgKiBIb2xkcyB0aGUgZGVmYXVs
-dCBwaHBtYWlsZXIgaW5zdGFuY2UuDQogICAgICogQHByaXZhdGUNCiAgICAgKiBAdHlwZSBvYmpl
-Y3QNCiAgICAgKi8NCiAgICB2YXIgJE1haWwgPSBmYWxzZTsNCg0KICAgIC8qKg0KICAgICAqIEhv
-bGRzIHRoZSBTTVRQIG1haWwgaG9zdC4NCiAgICAgKiBAcHVibGljDQogICAgICogQHR5cGUgc3Ry
-aW5nDQogICAgICovDQogICAgdmFyICRIb3N0ID0gIiI7DQogICAgDQogICAgLyoqDQogICAgICog
-SG9sZHMgdGhlIGNoYW5nZSBsb2cuDQogICAgICogQHByaXZhdGUNCiAgICAgKiBAdHlwZSBzdHJp
-bmcgYXJyYXkNCiAgICAgKi8NCiAgICB2YXIgJENoYW5nZUxvZyA9IGFycmF5KCk7DQogICAgDQog
-ICAgIC8qKg0KICAgICAqIEhvbGRzIHRoZSBub3RlIGxvZy4NCiAgICAgKiBAcHJpdmF0ZQ0KICAg
-ICAqIEB0eXBlIHN0cmluZyBhcnJheQ0KICAgICAqLw0KICAgIHZhciAkTm90ZUxvZyA9IGFycmF5
-KCk7ICAgDQoNCiAgICAvKioNCiAgICAgKiBDbGFzcyBjb25zdHVjdG9yLg0KICAgICAqLw0KICAg
-IGZ1bmN0aW9uIHBocG1haWxlclRlc3QoJG5hbWUpIHsNCiAgICAgICAgLyogbXVzdCBkZWZpbmUg
-dGhpcyBjb25zdHJ1Y3RvciAqLw0KICAgICAgICAkdGhpcy0+VGVzdENhc2UoICRuYW1lICk7DQog
-ICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJ1biBiZWZvcmUgZWFjaCB0ZXN0IGlzIHN0YXJ0
-ZWQuDQogICAgICovDQogICAgZnVuY3Rpb24gc2V0VXAoKSB7DQogICAgICAgIGdsb2JhbCAkZ2xv
-YmFsX3ZhcnM7DQogICAgICAgIGdsb2JhbCAkSU5DTFVERV9ESVI7DQoNCiAgICAgICAgJHRoaXMt
-Pk1haWwgPSBuZXcgUEhQTWFpbGVyKCk7DQoNCiAgICAgICAgJHRoaXMtPk1haWwtPlByaW9yaXR5
-ID0gMzsNCiAgICAgICAgJHRoaXMtPk1haWwtPkVuY29kaW5nID0gIjhiaXQiOw0KICAgICAgICAk
-dGhpcy0+TWFpbC0+Q2hhclNldCA9ICJpc28tODg1OS0xIjsNCiAgICAgICAgJHRoaXMtPk1haWwt
-PkZyb20gPSAidW5pdF90ZXN0QHBocG1haWxlci5zZi5uZXQiOw0KICAgICAgICAkdGhpcy0+TWFp
-bC0+RnJvbU5hbWUgPSAiVW5pdCBUZXN0ZXIiOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U2VuZGVy
-ID0gIiI7DQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0ID0gIlVuaXQgVGVzdCI7DQogICAg
-ICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIiI7DQogICAgICAgICR0aGlzLT5NYWlsLT5BbHRCb2R5
-ID0gIiI7DQogICAgICAgICR0aGlzLT5NYWlsLT5Xb3JkV3JhcCA9IDA7DQogICAgICAgICR0aGlz
-LT5NYWlsLT5Ib3N0ID0gVEVTVF9NQUlMX0hPU1Q7DQogICAgICAgICR0aGlzLT5NYWlsLT5Qb3J0
-ID0gMjU7DQogICAgICAgICR0aGlzLT5NYWlsLT5IZWxvID0gImxvY2FsaG9zdC5sb2NhbGRvbWFp
-biI7DQogICAgICAgICR0aGlzLT5NYWlsLT5TTVRQQXV0aCA9IGZhbHNlOw0KICAgICAgICAkdGhp
-cy0+TWFpbC0+VXNlcm5hbWUgPSAiIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPlBhc3N3b3JkID0g
-IiI7DQogICAgICAgICR0aGlzLT5NYWlsLT5QbHVnaW5EaXIgPSAkSU5DTFVERV9ESVI7DQoJCSR0
-aGlzLT5NYWlsLT5BZGRSZXBseVRvKCJub19yZXBseUBwaHBtYWlsZXIuc2YubmV0IiwgIlJlcGx5
-IEd1eSIpOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U2VuZGVyID0gInVuaXRfdGVzdEBwaHBtYWls
-ZXIuc2YubmV0IjsNCgkJLy8gc2V0IHRoZSBsYW5ndWFnZSBvciBlbHNlIHdlJ2xsIGdldCBzaWxs
-eSBlcnJvcnMNCgkJJHRoaXMtPk1haWwtPlNldExhbmd1YWdlKCAnZW4nLCBQTE9HX0NMQVNTX1BB
-VEguImNsYXNzL21haWwvcGhwbWFpbGVyL2xhbmd1YWdlLyIgKTsNCg0KICAgICAgICBpZihzdHJs
-ZW4oJHRoaXMtPk1haWwtPkhvc3QpID4gMCkNCiAgICAgICAgICAgICR0aGlzLT5NYWlsLT5NYWls
-ZXIgPSAic210cCI7DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgJHRoaXMt
-Pk1haWwtPk1haWxlciA9ICJtYWlsIjsNCiAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAidW5p
-dF90ZXN0QHBocG1haWxlci5zZi5uZXQiOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAk
-dGhpcy0+U2V0QWRkcmVzcyhURVNUX01BSUxfVVNFUiwgIlRlc3QgVXNlciIpOw0KICAgICAgICAv
-KmlmKHN0cmxlbigkZ2xvYmFsX3ZhcnNbIm1haWxfY2MiXSkgPiAwKQ0KICAgICAgICAgICAgJHRo
-aXMtPlNldEFkZHJlc3MoJGdsb2JhbF92YXJzWyJtYWlsX2NjIl0sICJDYXJib24gVXNlciIsICJj
-YyIpOyovDQogICAgfSAgICAgDQoNCiAgICAvKioNCiAgICAgKiBSdW4gYWZ0ZXIgZWFjaCB0ZXN0
-IGlzIGNvbXBsZXRlZC4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiB0ZWFyRG93bigpIHsNCiAgICAg
-ICAgLy8gQ2xlYW4gZ2xvYmFsIHZhcmlhYmxlcw0KICAgICAgICAkdGhpcy0+TWFpbCA9IE5VTEw7
-DQogICAgICAgICR0aGlzLT5DaGFuZ2VMb2cgPSBhcnJheSgpOw0KICAgICAgICAkdGhpcy0+Tm90
-ZUxvZyA9IGFycmF5KCk7DQogICAgfQ0KDQoNCiAgICAvKioNCiAgICAgKiBCdWlsZCB0aGUgYm9k
-eSBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0Lg0KICAgICAqIEBwcml2
-YXRlDQogICAgICogQHJldHVybnMgdm9pZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIEJ1aWxkQm9k
-eSgpIHsNCiAgICAgICAgJHRoaXMtPkNoZWNrQ2hhbmdlcygpOw0KICAgICAgICANCiAgICAgICAg
-Ly8gRGV0ZXJtaW5lIGxpbmUgZW5kaW5ncyBmb3IgbWVzc2FnZSAgICAgICAgDQogICAgICAgIGlm
-KCR0aGlzLT5NYWlsLT5Db250ZW50VHlwZSA9PSAidGV4dC9odG1sIiB8fCBzdHJsZW4oJHRoaXMt
-Pk1haWwtPkFsdEJvZHkpID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgJGVvbCA9ICI8YnIv
-PiI7DQogICAgICAgICAgICAkYnVsbGV0ID0gIjxsaT4iOw0KICAgICAgICAgICAgJGJ1bGxldF9z
-dGFydCA9ICI8dWw+IjsNCiAgICAgICAgICAgICRidWxsZXRfZW5kID0gIjwvdWw+IjsNCiAgICAg
-ICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgICRlb2wgPSAiXG4iOw0K
-ICAgICAgICAgICAgJGJ1bGxldCA9ICIgLSAiOw0KICAgICAgICAgICAgJGJ1bGxldF9zdGFydCA9
-ICIiOw0KICAgICAgICAgICAgJGJ1bGxldF9lbmQgPSAiIjsNCiAgICAgICAgfQ0KICAgICAgICAN
-CiAgICAgICAgJFJlcG9ydEJvZHkgPSAiIjsNCiAgICAgICAgDQogICAgICAgICRSZXBvcnRCb2R5
-IC49ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0iIC4gJGVvbDsNCiAgICAgICAgJFJlcG9ydEJvZHkg
-Lj0gIlVuaXQgVGVzdCBJbmZvcm1hdGlvbiIgLiAkZW9sOw0KICAgICAgICAkUmVwb3J0Qm9keSAu
-PSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAuICRlb2w7DQogICAgICAgICRSZXBvcnRCb2R5IC49
-ICJwaHBtYWlsZXIgdmVyc2lvbjogIiAuICR0aGlzLT5NYWlsLT5WZXJzaW9uIC4gJGVvbDsNCiAg
-ICAgICAgJFJlcG9ydEJvZHkgLj0gIkNvbnRlbnQgVHlwZTogIiAuICR0aGlzLT5NYWlsLT5Db250
-ZW50VHlwZSAuICRlb2w7DQogICAgICAgIA0KICAgICAgICBpZihzdHJsZW4oJHRoaXMtPk1haWwt
-Pkhvc3QpID4gMCkNCiAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICJIb3N0OiAiIC4gJHRoaXMt
-Pk1haWwtPkhvc3QgLiAkZW9sOw0KICAgICAgICANCiAgICAgICAgLy8gSWYgYXR0YWNobWVudHMg
-dGhlbiBjcmVhdGUgYW4gYXR0YWNobWVudCBsaXN0DQogICAgICAgIGlmKGNvdW50KCR0aGlzLT5N
-YWlsLT5hdHRhY2htZW50KSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgICRSZXBvcnRCb2R5
-IC49ICJBdHRhY2htZW50czoiIC4gJGVvbDsNCiAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICRi
-dWxsZXRfc3RhcnQ7DQogICAgICAgICAgICBmb3IoJGkgPSAwOyAkaSA8IGNvdW50KCR0aGlzLT5N
-YWlsLT5hdHRhY2htZW50KTsgJGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAk
-UmVwb3J0Qm9keSAuPSAkYnVsbGV0IC4gIk5hbWU6ICIgLiAkdGhpcy0+TWFpbC0+YXR0YWNobWVu
-dFskaV1bMV0gLiAiLCAiOw0KICAgICAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICJFbmNvZGlu
-ZzogIiAuICR0aGlzLT5NYWlsLT5hdHRhY2htZW50WyRpXVszXSAuICIsICI7DQogICAgICAgICAg
-ICAgICAgJFJlcG9ydEJvZHkgLj0gIlR5cGU6ICIgLiAkdGhpcy0+TWFpbC0+YXR0YWNobWVudFsk
-aV1bNF0gLiAkZW9sOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJFJlcG9ydEJvZHkgLj0g
-JGJ1bGxldF9lbmQgLiAkZW9sOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBJZiB0
-aGVyZSBhcmUgY2hhbmdlcyB0aGVuIGxpc3QgdGhlbQ0KICAgICAgICBpZihjb3VudCgkdGhpcy0+
-Q2hhbmdlTG9nKSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICJD
-aGFuZ2VzIiAuICRlb2w7DQogICAgICAgICAgICAkUmVwb3J0Qm9keSAuPSAiLS0tLS0tLSIgLiAk
-ZW9sOw0KDQogICAgICAgICAgICAkUmVwb3J0Qm9keSAuPSAkYnVsbGV0X3N0YXJ0Ow0KICAgICAg
-ICAgICAgZm9yKCRpID0gMDsgJGkgPCBjb3VudCgkdGhpcy0+Q2hhbmdlTG9nKTsgJGkrKykNCiAg
-ICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkUmVwb3J0Qm9keSAuPSAkYnVsbGV0IC4gJHRo
-aXMtPkNoYW5nZUxvZ1skaV1bMF0gLiAiIHdhcyBjaGFuZ2VkIHRvIFsiIC4gDQogICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkNoYW5nZUxvZ1skaV1bMV0gLiAiXSIgLiAkZW9s
-Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJFJlcG9ydEJvZHkgLj0gJGJ1bGxldF9lbmQg
-LiAkZW9sIC4gJGVvbDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gSWYgdGhlcmUg
-YXJlIG5vdGVzIHRoZW4gbGlzdCB0aGVtDQogICAgICAgIGlmKGNvdW50KCR0aGlzLT5Ob3RlTG9n
-KSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICJOb3RlcyIgLiAk
-ZW9sOw0KICAgICAgICAgICAgJFJlcG9ydEJvZHkgLj0gIi0tLS0tIiAuICRlb2w7DQoNCiAgICAg
-ICAgICAgICRSZXBvcnRCb2R5IC49ICRidWxsZXRfc3RhcnQ7DQogICAgICAgICAgICBmb3IoJGkg
-PSAwOyAkaSA8IGNvdW50KCR0aGlzLT5Ob3RlTG9nKTsgJGkrKykNCiAgICAgICAgICAgIHsNCiAg
-ICAgICAgICAgICAgICAkUmVwb3J0Qm9keSAuPSAkYnVsbGV0IC4gJHRoaXMtPk5vdGVMb2dbJGld
-IC4gJGVvbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICRidWxs
-ZXRfZW5kOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBSZS1hdHRhY2ggdGhlIG9y
-aWdpbmFsIGJvZHkNCiAgICAgICAgJHRoaXMtPk1haWwtPkJvZHkgLj0gJGVvbCAuICRlb2wgLiAk
-UmVwb3J0Qm9keTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQ2hlY2sgd2hpY2ggZGVm
-YXVsdCBzZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhlIHJlcG9ydC4NCiAgICAgKiBA
-cHJpdmF0ZQ0KICAgICAqIEByZXR1cm5zIHZvaWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBDaGVj
-a0NoYW5nZXMoKSB7DQogICAgICAgIGlmKCR0aGlzLT5NYWlsLT5Qcmlvcml0eSAhPSAzKQ0KICAg
-ICAgICAgICAgJHRoaXMtPkFkZENoYW5nZSgiUHJpb3JpdHkiLCAkdGhpcy0+TWFpbC0+UHJpb3Jp
-dHkpOw0KICAgICAgICBpZigkdGhpcy0+TWFpbC0+RW5jb2RpbmcgIT0gIjhiaXQiKQ0KICAgICAg
-ICAgICAgJHRoaXMtPkFkZENoYW5nZSgiRW5jb2RpbmciLCAkdGhpcy0+TWFpbC0+RW5jb2Rpbmcp
-Ow0KICAgICAgICBpZigkdGhpcy0+TWFpbC0+Q2hhclNldCAhPSAiaXNvLTg4NTktMSIpDQogICAg
-ICAgICAgICAkdGhpcy0+QWRkQ2hhbmdlKCJDaGFyU2V0IiwgJHRoaXMtPk1haWwtPkNoYXJTZXQp
-Ow0KICAgICAgICBpZigkdGhpcy0+TWFpbC0+U2VuZGVyICE9ICIiKQ0KICAgICAgICAgICAgJHRo
-aXMtPkFkZENoYW5nZSgiU2VuZGVyIiwgJHRoaXMtPk1haWwtPlNlbmRlcik7DQogICAgICAgIGlm
-KCR0aGlzLT5NYWlsLT5Xb3JkV3JhcCAhPSAwKQ0KICAgICAgICAgICAgJHRoaXMtPkFkZENoYW5n
-ZSgiV29yZFdyYXAiLCAkdGhpcy0+TWFpbC0+V29yZFdyYXApOw0KICAgICAgICBpZigkdGhpcy0+
-TWFpbC0+TWFpbGVyICE9ICJtYWlsIikNCiAgICAgICAgICAgICR0aGlzLT5BZGRDaGFuZ2UoIk1h
-aWxlciIsICR0aGlzLT5NYWlsLT5NYWlsZXIpOw0KICAgICAgICBpZigkdGhpcy0+TWFpbC0+UG9y
-dCAhPSAyNSkNCiAgICAgICAgICAgICR0aGlzLT5BZGRDaGFuZ2UoIlBvcnQiLCAkdGhpcy0+TWFp
-bC0+UG9ydCk7DQogICAgICAgIGlmKCR0aGlzLT5NYWlsLT5IZWxvICE9ICJsb2NhbGhvc3QubG9j
-YWxkb21haW4iKQ0KICAgICAgICAgICAgJHRoaXMtPkFkZENoYW5nZSgiSGVsbyIsICR0aGlzLT5N
-YWlsLT5IZWxvKTsNCiAgICAgICAgaWYoJHRoaXMtPk1haWwtPlNNVFBBdXRoKQ0KICAgICAgICAg
-ICAgJHRoaXMtPkFkZENoYW5nZSgiU01UUEF1dGgiLCAidHJ1ZSIpOw0KICAgIH0NCiAgICANCiAg
-ICAvKioNCiAgICAgKiBBZGRzIGEgY2hhbmdlIGVudHJ5Lg0KICAgICAqIEBwcml2YXRlDQogICAg
-ICogQHJldHVybnMgdm9pZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIEFkZENoYW5nZSgkc05hbWUs
-ICRzTmV3VmFsdWUpIHsNCiAgICAgICAgJGN1ciA9IGNvdW50KCR0aGlzLT5DaGFuZ2VMb2cpOw0K
-ICAgICAgICAkdGhpcy0+Q2hhbmdlTG9nWyRjdXJdWzBdID0gJHNOYW1lOw0KICAgICAgICAkdGhp
-cy0+Q2hhbmdlTG9nWyRjdXJdWzFdID0gJHNOZXdWYWx1ZTsNCiAgICB9DQogICAgDQogICAgLyoq
-DQogICAgICogQWRkcyBhIHNpbXBsZSBub3RlIHRvIHRoZSBtZXNzYWdlLg0KICAgICAqIEBwdWJs
-aWMNCiAgICAgKiBAcmV0dXJucyB2b2lkDQogICAgICovDQogICAgZnVuY3Rpb24gQWRkTm90ZSgk
-c1ZhbHVlKSB7DQogICAgICAgICR0aGlzLT5Ob3RlTG9nW10gPSAkc1ZhbHVlOw0KICAgIH0NCg0K
-ICAgIC8qKg0KICAgICAqIEFkZHMgYWxsIG9mIHRoZSBhZGRyZXNzZXMNCiAgICAgKiBAcHVibGlj
-DQogICAgICogQHJldHVybnMgdm9pZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIFNldEFkZHJlc3Mo
-JHNBZGRyZXNzLCAkc05hbWUgPSAiIiwgJHNUeXBlID0gInRvIikgew0KICAgICAgICBzd2l0Y2go
-JHNUeXBlKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICJ0byI6DQogICAgICAgICAgICAg
-ICAgJHRoaXMtPk1haWwtPkFkZEFkZHJlc3MoJHNBZGRyZXNzLCAkc05hbWUpOw0KICAgICAgICAg
-ICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiY2MiOg0KICAgICAgICAgICAgICAgICR0
-aGlzLT5NYWlsLT5BZGRDQygkc0FkZHJlc3MsICRzTmFtZSk7DQogICAgICAgICAgICAgICAgYnJl
-YWs7DQogICAgICAgICAgICBjYXNlICJiY2MiOg0KICAgICAgICAgICAgICAgICR0aGlzLT5NYWls
-LT5BZGRCQ0MoJHNBZGRyZXNzLCAkc05hbWUpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAg
-ICAgICB9DQogICAgfQ0KDQogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
-Ly8vLy8vLy8vLy8vLw0KICAgIC8vIFVOSVQgVEVTVFMNCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8v
-Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQoNCiAgICAvKioNCiAgICAgKiBUcnkgYSBw
-bGFpbiBtZXNzYWdlLg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3RfV29yZFdyYXAoKSB7DQoN
-CiAgICAgICAgJHRoaXMtPk1haWwtPldvcmRXcmFwID0gNDA7DQogICAgICAgICRteV9ib2R5ID0g
-IkhlcmUgaXMgdGhlIG1haW4gYm9keSBvZiB0aGlzIG1lc3NhZ2UuICBJdCBzaG91bGQgIiAuDQog
-ICAgICAgICAgICAgICAgICAgImJlIHF1aXRlIGEgZmV3IGxpbmVzLiAgSXQgc2hvdWxkIGJlIHdy
-YXBwZWQgYXQgdGhlICIgLg0KICAgICAgICAgICAgICAgICAgICI0MCBjaGFyYWN0ZXJzLiAgTWFr
-ZSBzdXJlIHRoYXQgaXQgaXMuIjsNCiAgICAgICAgJG5Cb2R5TGVuID0gc3RybGVuKCRteV9ib2R5
-KTsNCiAgICAgICAgJG15X2JvZHkgLj0gIlxuXG5UaGlzIGlzIHRoZSBhYm92ZSBib2R5IGxlbmd0
-aDogIiAuICRuQm9keUxlbjsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICRteV9ib2R5
-Ow0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBXb3Jkd3JhcCI7DQoNCiAgICAg
-ICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+
-TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAgICB9DQoNCiAgICAvKioN
-CiAgICAgKiBUcnkgYSBwbGFpbiBtZXNzYWdlLg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3Rf
-TG93X1ByaW9yaXR5KCkgew0KICAgIA0KICAgICAgICAkdGhpcy0+TWFpbC0+UHJpb3JpdHkgPSA1
-Ow0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJIZXJlIGlzIHRoZSBtYWluIGJvZHkuICBU
-aGVyZSBzaG91bGQgYmUgIiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgcmVwbHkg
-dG8gYWRkcmVzcyBpbiB0aGlzIG1lc3NhZ2UuIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPlN1Ympl
-Y3QgLj0gIjogTG93IFByaW9yaXR5IjsNCiAgICAgICAgJHRoaXMtPk1haWwtPkFkZFJlcGx5VG8o
-Im5vYm9keUBub2JvZHkuY29tIiwgIk5vYm9keSAoVW5pdCBUZXN0KSIpOw0KDQogICAgICAgICR0
-aGlzLT5CdWlsZEJvZHkoKTsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1haWwt
-PlNlbmQoKSwgJHRoaXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgfQ0KDQogICAgLyoqDQogICAg
-ICogU2ltcGxlIHBsYWluIGZpbGUgYXR0YWNobWVudCB0ZXN0Lg0KICAgICAqLw0KICAgIGZ1bmN0
-aW9uIHRlc3RfTXVsdGlwbGVfUGxhaW5fRmlsZUF0dGFjaG1lbnQoKSB7DQoNCiAgICAgICAgJHRo
-aXMtPk1haWwtPkJvZHkgPSAiSGVyZSBpcyB0aGUgdGV4dCBib2R5IjsNCiAgICAgICAgJHRoaXMt
-Pk1haWwtPlN1YmplY3QgLj0gIjogUGxhaW4gKyBNdWx0aXBsZSBGaWxlQXR0YWNobWVudHMiOw0K
-DQogICAgICAgIGlmKCEkdGhpcy0+TWFpbC0+QWRkQXR0YWNobWVudCggUEhQTUFJTEVSX1RFU1Rf
-QkFTRV9GT0xERVIuInRlc3QucG5nIikpDQogICAgICAgIHsNCiAgICAgICAgICAgICR0aGlzLT5h
-c3NlcnRUcnVlKGZhbHNlLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAgICAgICAgICAgIHJl
-dHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKCEkdGhpcy0+TWFpbC0+QWRkQXR0YWNobWVu
-dCggUEhQTUFJTEVSX1RFU1RfQkFTRV9GT0xERVIuInBocG1haWxlcl90ZXN0LmNsYXNzLnBocCIs
-ICJ0ZXN0LnR4dCIpKQ0KICAgICAgICB7DQogICAgICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZShm
-YWxzZSwgJHRoaXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgICAgICAgICByZXR1cm47DQogICAg
-ICAgIH0NCg0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5hc3Nl
-cnRUcnVlKCR0aGlzLT5NYWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAg
-IH0NCg0KICAgIC8qKg0KICAgICAqIFNpbXBsZSBwbGFpbiBzdHJpbmcgYXR0YWNobWVudCB0ZXN0
-Lg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3RfUGxhaW5fU3RyaW5nQXR0YWNobWVudCgpIHsN
-Cg0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJIZXJlIGlzIHRoZSB0ZXh0IGJvZHkiOw0K
-ICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBQbGFpbiArIFN0cmluZ0F0dGFjaG1l
-bnQiOw0KICAgICAgICANCiAgICAgICAgJHNBdHRhY2htZW50ID0gIlRoZXNlIGNoYXJhY3RlcnMg
-YXJlIHRoZSBjb250ZW50IG9mIHRoZSAiIC4NCiAgICAgICAgICAgICAgICAgICAgICAgInN0cmlu
-ZyBhdHRhY2htZW50LlxuVGhpcyBtaWdodCBiZSB0YWtlbiBmcm9tIGEgIi4NCiAgICAgICAgICAg
-ICAgICAgICAgICAgImRhdGFiYXNlIG9yIHNvbWUgb3RoZXIgc3VjaCB0aGluZy4gIjsNCiAgICAg
-ICAgDQogICAgICAgICR0aGlzLT5NYWlsLT5BZGRTdHJpbmdBdHRhY2htZW50KCRzQXR0YWNobWVu
-dCwgInN0cmluZ19hdHRhY2gudHh0Iik7DQoNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0K
-ICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFp
-bC0+RXJyb3JJbmZvKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQbGFpbiBxdW90ZWQtcHJp
-bnRhYmxlIG1lc3NhZ2UuDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9RdW90ZWRfUHJpbnRh
-YmxlKCkgew0KDQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIkhlcmUgaXMgdGhlIG1haW4g
-Ym9keSI7DQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0IC49ICI6IFBsYWluICsgUXVvdGVk
-LXByaW50YWJsZSI7DQogICAgICAgICR0aGlzLT5NYWlsLT5FbmNvZGluZyA9ICJxdW90ZWQtcHJp
-bnRhYmxlIjsNCg0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5h
-c3NlcnRUcnVlKCR0aGlzLT5NYWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0K
-ICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFRyeSBhIHBsYWluIG1lc3NhZ2UuDQogICAgICovDQog
-ICAgZnVuY3Rpb24gdGVzdF9IdG1sKCkgew0KICAgIA0KICAgICAgICAkdGhpcy0+TWFpbC0+SXNI
-VE1MKHRydWUpOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBIVE1MIG9ubHki
-Ow0KICAgICAgICANCiAgICAgICAgJHRoaXMtPk1haWwtPkJvZHkgPSAiVGhpcyBpcyBhIDxiPnRl
-c3QgbWVzc2FnZTwvYj4gd3JpdHRlbiBpbiBIVE1MLiA8L2JyPiIgLg0KICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICJHbyB0byA8YSBocmVmPVwiaHR0cDovL3BocG1haWxlci5zb3VyY2Vmb3Jn
-ZS5uZXQvXCI+IiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9waHBtYWls
-ZXIuc291cmNlZm9yZ2UubmV0LzwvYT4gZm9yIG5ldyB2ZXJzaW9ucyBvZiAiIC4NCiAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAicGhwbWFpbGVyLiAgPHAvPiBUaGFuayB5b3UhIjsNCg0KICAg
-ICAgICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlz
-LT5NYWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCg0KICAgIC8q
-Kg0KICAgICAqIFNpbXBsZSBIVE1MIGFuZCBhdHRhY2htZW50IHRlc3QNCiAgICAgKi8NCiAgICBm
-dW5jdGlvbiB0ZXN0X0hUTUxfQXR0YWNobWVudCgpIHsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+
-Qm9keSA9ICJUaGlzIGlzIHRoZSA8Yj5IVE1MPC9iPiBwYXJ0IG9mIHRoZSBlbWFpbC4iOw0KICAg
-ICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBIVE1MICsgQXR0YWNobWVudCI7DQogICAg
-ICAgICR0aGlzLT5NYWlsLT5Jc0hUTUwodHJ1ZSk7DQogICAgICAgIA0KICAgICAgICBpZighJHRo
-aXMtPk1haWwtPkFkZEF0dGFjaG1lbnQoUEhQTUFJTEVSX1RFU1RfQkFTRV9GT0xERVIuInBocG1h
-aWxlcl90ZXN0LmNsYXNzLnBocCIsICJ0ZXN0X2F0dGFjaC50eHQiKSkNCiAgICAgICAgew0KICAg
-ICAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoZmFsc2UsICR0aGlzLT5NYWlsLT5FcnJvckluZm8p
-Ow0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgJHRoaXMtPkJ1aWxk
-Qm9keSgpOw0KICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAk
-dGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBbiBlbWJl
-ZGRlZCBhdHRhY2htZW50IHRlc3QuDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9FbWJlZGRl
-ZF9JbWFnZSgpIHsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJFbWJlZGRlZCBJbWFn
-ZTogPGltZyBhbHQ9XCJwaHBtYWlsZXJcIiBzcmM9XCJjaWQ6bXktYXR0YWNoXCI+IiAuDQogICAg
-ICAgICAgICAgICAgICAgICAiSGVyZSBpcyBhbiBpbWFnZSE8L2E+IjsNCiAgICAgICAgJHRoaXMt
-Pk1haWwtPlN1YmplY3QgLj0gIjogRW1iZWRkZWQgSW1hZ2UiOw0KICAgICAgICAkdGhpcy0+TWFp
-bC0+SXNIVE1MKHRydWUpOw0KICAgICAgICANCiAgICAgICAgaWYoISR0aGlzLT5NYWlsLT5BZGRF
-bWJlZGRlZEltYWdlKFBIUE1BSUxFUl9URVNUX0JBU0VfRk9MREVSLiJ0ZXN0LnBuZyIsICJteS1h
-dHRhY2giLCAidGVzdC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgImJhc2U2NCIsICJpbWFnZS9wbmciKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJHRo
-aXMtPmFzc2VydFRydWUoZmFsc2UsICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgICAgICAg
-ICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAg
-ICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+
-RXJyb3JJbmZvKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBbiBlbWJlZGRlZCBhdHRhY2ht
-ZW50IHRlc3QuDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9NdWx0aV9FbWJlZGRlZF9JbWFn
-ZSgpIHsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJFbWJlZGRlZCBJbWFnZTogPGlt
-ZyBhbHQ9XCJwaHBtYWlsZXJcIiBzcmM9XCJjaWQ6bXktYXR0YWNoXCI+IiAuDQogICAgICAgICAg
-ICAgICAgICAgICAiSGVyZSBpcyBhbiBpbWFnZSE8L2E+IjsNCiAgICAgICAgJHRoaXMtPk1haWwt
-PlN1YmplY3QgLj0gIjogRW1iZWRkZWQgSW1hZ2UgKyBBdHRhY2htZW50IjsNCiAgICAgICAgJHRo
-aXMtPk1haWwtPklzSFRNTCh0cnVlKTsNCiAgICAgICAgDQogICAgICAgIGlmKCEkdGhpcy0+TWFp
-bC0+QWRkRW1iZWRkZWRJbWFnZShQSFBNQUlMRVJfVEVTVF9CQVNFX0ZPTERFUi4idGVzdC5wbmci
-LCAibXktYXR0YWNoIiwgInRlc3QucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICJiYXNlNjQiLCAiaW1hZ2UvcG5nIikpDQogICAgICAgIHsNCiAgICAgICAg
+U1NfUEFUSC4iY2xhc3MvdGVzdC9oZWxwZXJzL2xpZmV0eXBldGVzdGNhc2UuY2xhc3MucGhwIiAp
+Ow0KaW5jbHVkZV9vbmNlKCBQTE9HX0NMQVNTX1BBVEguImNsYXNzL21haWwvcGhwbWFpbGVyL2Ns
+YXNzLnBocG1haWxlci5waHAiICk7DQoNCi8qKg0KICogdGhlc2Ugd2VyZSBub3QgcGFydCBvZiB0
+aGUgb3JpZ2luYWwgdGVzdCBzdWl0ZSBidXQgaGFkIHRvIGJlIGFkZGVkIHRvIGF2b2lkIHBsZW50
+eSBvZiBpc3N1ZXMgd2l0aCBmaWxlcywNCiAqIGZvbGRlcnMsIHBhdGhzIGFuZCBtYWlsIHNlcnZl
+cnMuIFBsZWFzZSBtb2RpZnkgdGhlbSB0byBzdWl0IHlvdXIgbmVlZHMNCiAqLw0KZGVmaW5lKCAi
+VEVTVF9NQUlMX0hPU1QiLCAibG9jYWxob3N0IiApOw0KZGVmaW5lKCAiVEVTVF9NQUlMX1VTRVIi
+LCAicGxlYXNlX3NldEBwbGVhc2Uuc2V0IiApOw0KZGVmaW5lKCAiUEhQTUFJTEVSX1RFU1RfQkFT
+RV9GT0xERVIiLCBQTE9HX0NMQVNTX1BBVEguImNsYXNzL3Rlc3QvdGVzdHMvbWFpbC9waHBtYWls
+ZXIvIiApOw0KDQovKioNCiAqIFBlcmZvcm1zIGF1dGhlbnRpY2F0aW9uIHRlc3RzDQogKi8NCmNs
+YXNzIHBocG1haWxlcl9UZXN0IGV4dGVuZHMgTGlmZVR5cGVUZXN0Q2FzZQ0Kew0KICAgIC8qKg0K
+ICAgICAqIEhvbGRzIHRoZSBkZWZhdWx0IHBocG1haWxlciBpbnN0YW5jZS4NCiAgICAgKiBAcHJp
+dmF0ZQ0KICAgICAqIEB0eXBlIG9iamVjdA0KICAgICAqLw0KICAgIHZhciAkTWFpbCA9IGZhbHNl
+Ow0KDQogICAgLyoqDQogICAgICogSG9sZHMgdGhlIFNNVFAgbWFpbCBob3N0Lg0KICAgICAqIEBw
+dWJsaWMNCiAgICAgKiBAdHlwZSBzdHJpbmcNCiAgICAgKi8NCiAgICB2YXIgJEhvc3QgPSAiIjsN
+CiAgICANCiAgICAvKioNCiAgICAgKiBIb2xkcyB0aGUgY2hhbmdlIGxvZy4NCiAgICAgKiBAcHJp
+dmF0ZQ0KICAgICAqIEB0eXBlIHN0cmluZyBhcnJheQ0KICAgICAqLw0KICAgIHZhciAkQ2hhbmdl
+TG9nID0gYXJyYXkoKTsNCiAgICANCiAgICAgLyoqDQogICAgICogSG9sZHMgdGhlIG5vdGUgbG9n
+Lg0KICAgICAqIEBwcml2YXRlDQogICAgICogQHR5cGUgc3RyaW5nIGFycmF5DQogICAgICovDQog
+ICAgdmFyICROb3RlTG9nID0gYXJyYXkoKTsgICANCg0KICAgIC8qKg0KICAgICAqIENsYXNzIGNv
+bnN0dWN0b3IuDQogICAgICovDQogICAgZnVuY3Rpb24gcGhwbWFpbGVyVGVzdCgkbmFtZSkgew0K
+ICAgICAgICAvKiBtdXN0IGRlZmluZSB0aGlzIGNvbnN0cnVjdG9yICovDQogICAgICAgICR0aGlz
+LT5UZXN0Q2FzZSggJG5hbWUgKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUnVuIGJl
+Zm9yZSBlYWNoIHRlc3QgaXMgc3RhcnRlZC4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBzZXRVcCgp
+IHsNCiAgICAgICAgZ2xvYmFsICRnbG9iYWxfdmFyczsNCiAgICAgICAgZ2xvYmFsICRJTkNMVURF
+X0RJUjsNCg0KICAgICAgICAkdGhpcy0+TWFpbCA9IG5ldyBQSFBNYWlsZXIoKTsNCg0KICAgICAg
+ICAkdGhpcy0+TWFpbC0+UHJpb3JpdHkgPSAzOw0KICAgICAgICAkdGhpcy0+TWFpbC0+RW5jb2Rp
+bmcgPSAiOGJpdCI7DQogICAgICAgICR0aGlzLT5NYWlsLT5DaGFyU2V0ID0gImlzby04ODU5LTEi
+Ow0KICAgICAgICAkdGhpcy0+TWFpbC0+RnJvbSA9ICJ1bml0X3Rlc3RAcGhwbWFpbGVyLnNmLm5l
+dCI7DQogICAgICAgICR0aGlzLT5NYWlsLT5Gcm9tTmFtZSA9ICJVbml0IFRlc3RlciI7DQogICAg
+ICAgICR0aGlzLT5NYWlsLT5TZW5kZXIgPSAiIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPlN1Ympl
+Y3QgPSAiVW5pdCBUZXN0IjsNCiAgICAgICAgJHRoaXMtPk1haWwtPkJvZHkgPSAiIjsNCiAgICAg
+ICAgJHRoaXMtPk1haWwtPkFsdEJvZHkgPSAiIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPldvcmRX
+cmFwID0gMDsNCiAgICAgICAgJHRoaXMtPk1haWwtPkhvc3QgPSBURVNUX01BSUxfSE9TVDsNCiAg
+ICAgICAgJHRoaXMtPk1haWwtPlBvcnQgPSAyNTsNCiAgICAgICAgJHRoaXMtPk1haWwtPkhlbG8g
+PSAibG9jYWxob3N0LmxvY2FsZG9tYWluIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPlNNVFBBdXRo
+ID0gZmFsc2U7DQogICAgICAgICR0aGlzLT5NYWlsLT5Vc2VybmFtZSA9ICIiOw0KICAgICAgICAk
+dGhpcy0+TWFpbC0+UGFzc3dvcmQgPSAiIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPlBsdWdpbkRp
+ciA9ICRJTkNMVURFX0RJUjsNCgkJJHRoaXMtPk1haWwtPkFkZFJlcGx5VG8oIm5vX3JlcGx5QHBo
+cG1haWxlci5zZi5uZXQiLCAiUmVwbHkgR3V5Iik7DQogICAgICAgICR0aGlzLT5NYWlsLT5TZW5k
+ZXIgPSAidW5pdF90ZXN0QHBocG1haWxlci5zZi5uZXQiOw0KCQkvLyBzZXQgdGhlIGxhbmd1YWdl
+IG9yIGVsc2Ugd2UnbGwgZ2V0IHNpbGx5IGVycm9ycw0KCQkkdGhpcy0+TWFpbC0+U2V0TGFuZ3Vh
+Z2UoICdlbicsIFBMT0dfQ0xBU1NfUEFUSC4iY2xhc3MvbWFpbC9waHBtYWlsZXIvbGFuZ3VhZ2Uv
+IiApOw0KDQogICAgICAgIGlmKHN0cmxlbigkdGhpcy0+TWFpbC0+SG9zdCkgPiAwKQ0KICAgICAg
+ICAgICAgJHRoaXMtPk1haWwtPk1haWxlciA9ICJzbXRwIjsNCiAgICAgICAgZWxzZQ0KICAgICAg
+ICB7DQogICAgICAgICAgICAkdGhpcy0+TWFpbC0+TWFpbGVyID0gIm1haWwiOw0KICAgICAgICAg
+ICAgJHRoaXMtPlNlbmRlciA9ICJ1bml0X3Rlc3RAcGhwbWFpbGVyLnNmLm5ldCI7DQogICAgICAg
+IH0NCiAgICAgICAgDQogICAgICAgICR0aGlzLT5TZXRBZGRyZXNzKFRFU1RfTUFJTF9VU0VSLCAi
+VGVzdCBVc2VyIik7DQogICAgICAgIC8qaWYoc3RybGVuKCRnbG9iYWxfdmFyc1sibWFpbF9jYyJd
+KSA+IDApDQogICAgICAgICAgICAkdGhpcy0+U2V0QWRkcmVzcygkZ2xvYmFsX3ZhcnNbIm1haWxf
+Y2MiXSwgIkNhcmJvbiBVc2VyIiwgImNjIik7Ki8NCiAgICB9ICAgICANCg0KICAgIC8qKg0KICAg
+ICAqIFJ1biBhZnRlciBlYWNoIHRlc3QgaXMgY29tcGxldGVkLg0KICAgICAqLw0KICAgIGZ1bmN0
+aW9uIHRlYXJEb3duKCkgew0KICAgICAgICAvLyBDbGVhbiBnbG9iYWwgdmFyaWFibGVzDQogICAg
+ICAgICR0aGlzLT5NYWlsID0gTlVMTDsNCiAgICAgICAgJHRoaXMtPkNoYW5nZUxvZyA9IGFycmF5
+KCk7DQogICAgICAgICR0aGlzLT5Ob3RlTG9nID0gYXJyYXkoKTsNCiAgICB9DQoNCg0KICAgIC8q
+Kg0KICAgICAqIEJ1aWxkIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIGluIHRoZSBhcHByb3ByaWF0
+ZSBmb3JtYXQuDQogICAgICogQHByaXZhdGUNCiAgICAgKiBAcmV0dXJucyB2b2lkDQogICAgICov
+DQogICAgZnVuY3Rpb24gQnVpbGRCb2R5KCkgew0KICAgICAgICAkdGhpcy0+Q2hlY2tDaGFuZ2Vz
+KCk7DQogICAgICAgIA0KICAgICAgICAvLyBEZXRlcm1pbmUgbGluZSBlbmRpbmdzIGZvciBtZXNz
+YWdlICAgICAgICANCiAgICAgICAgaWYoJHRoaXMtPk1haWwtPkNvbnRlbnRUeXBlID09ICJ0ZXh0
+L2h0bWwiIHx8IHN0cmxlbigkdGhpcy0+TWFpbC0+QWx0Qm9keSkgPiAwKQ0KICAgICAgICB7DQog
+ICAgICAgICAgICAkZW9sID0gIjxici8+IjsNCiAgICAgICAgICAgICRidWxsZXQgPSAiPGxpPiI7
+DQogICAgICAgICAgICAkYnVsbGV0X3N0YXJ0ID0gIjx1bD4iOw0KICAgICAgICAgICAgJGJ1bGxl
+dF9lbmQgPSAiPC91bD4iOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAg
+ICAgICAgICAgJGVvbCA9ICJcbiI7DQogICAgICAgICAgICAkYnVsbGV0ID0gIiAtICI7DQogICAg
+ICAgICAgICAkYnVsbGV0X3N0YXJ0ID0gIiI7DQogICAgICAgICAgICAkYnVsbGV0X2VuZCA9ICIi
+Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkUmVwb3J0Qm9keSA9ICIiOw0KICAgICAg
+ICANCiAgICAgICAgJFJlcG9ydEJvZHkgLj0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgLiAkZW9s
+Ow0KICAgICAgICAkUmVwb3J0Qm9keSAuPSAiVW5pdCBUZXN0IEluZm9ybWF0aW9uIiAuICRlb2w7
+DQogICAgICAgICRSZXBvcnRCb2R5IC49ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0iIC4gJGVvbDsN
+CiAgICAgICAgJFJlcG9ydEJvZHkgLj0gInBocG1haWxlciB2ZXJzaW9uOiAiIC4gJHRoaXMtPk1h
+aWwtPlZlcnNpb24gLiAkZW9sOw0KICAgICAgICAkUmVwb3J0Qm9keSAuPSAiQ29udGVudCBUeXBl
+OiAiIC4gJHRoaXMtPk1haWwtPkNvbnRlbnRUeXBlIC4gJGVvbDsNCiAgICAgICAgDQogICAgICAg
+IGlmKHN0cmxlbigkdGhpcy0+TWFpbC0+SG9zdCkgPiAwKQ0KICAgICAgICAgICAgJFJlcG9ydEJv
+ZHkgLj0gIkhvc3Q6ICIgLiAkdGhpcy0+TWFpbC0+SG9zdCAuICRlb2w7DQogICAgICAgIA0KICAg
+ICAgICAvLyBJZiBhdHRhY2htZW50cyB0aGVuIGNyZWF0ZSBhbiBhdHRhY2htZW50IGxpc3QNCiAg
+ICAgICAgaWYoY291bnQoJHRoaXMtPk1haWwtPmF0dGFjaG1lbnQpID4gMCkNCiAgICAgICAgew0K
+ICAgICAgICAgICAgJFJlcG9ydEJvZHkgLj0gIkF0dGFjaG1lbnRzOiIgLiAkZW9sOw0KICAgICAg
+ICAgICAgJFJlcG9ydEJvZHkgLj0gJGJ1bGxldF9zdGFydDsNCiAgICAgICAgICAgIGZvcigkaSA9
+IDA7ICRpIDwgY291bnQoJHRoaXMtPk1haWwtPmF0dGFjaG1lbnQpOyAkaSsrKQ0KICAgICAgICAg
+ICAgew0KICAgICAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICRidWxsZXQgLiAiTmFtZTogIiAu
+ICR0aGlzLT5NYWlsLT5hdHRhY2htZW50WyRpXVsxXSAuICIsICI7DQogICAgICAgICAgICAgICAg
+JFJlcG9ydEJvZHkgLj0gIkVuY29kaW5nOiAiIC4gJHRoaXMtPk1haWwtPmF0dGFjaG1lbnRbJGld
+WzNdIC4gIiwgIjsNCiAgICAgICAgICAgICAgICAkUmVwb3J0Qm9keSAuPSAiVHlwZTogIiAuICR0
+aGlzLT5NYWlsLT5hdHRhY2htZW50WyRpXVs0XSAuICRlb2w7DQogICAgICAgICAgICB9DQogICAg
+ICAgICAgICAkUmVwb3J0Qm9keSAuPSAkYnVsbGV0X2VuZCAuICRlb2w7DQogICAgICAgIH0NCiAg
+ICAgICAgDQogICAgICAgIC8vIElmIHRoZXJlIGFyZSBjaGFuZ2VzIHRoZW4gbGlzdCB0aGVtDQog
+ICAgICAgIGlmKGNvdW50KCR0aGlzLT5DaGFuZ2VMb2cpID4gMCkNCiAgICAgICAgew0KICAgICAg
+ICAgICAgJFJlcG9ydEJvZHkgLj0gIkNoYW5nZXMiIC4gJGVvbDsNCiAgICAgICAgICAgICRSZXBv
+cnRCb2R5IC49ICItLS0tLS0tIiAuICRlb2w7DQoNCiAgICAgICAgICAgICRSZXBvcnRCb2R5IC49
+ICRidWxsZXRfc3RhcnQ7DQogICAgICAgICAgICBmb3IoJGkgPSAwOyAkaSA8IGNvdW50KCR0aGlz
+LT5DaGFuZ2VMb2cpOyAkaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRSZXBv
+cnRCb2R5IC49ICRidWxsZXQgLiAkdGhpcy0+Q2hhbmdlTG9nWyRpXVswXSAuICIgd2FzIGNoYW5n
+ZWQgdG8gWyIgLiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Q2hhbmdl
+TG9nWyRpXVsxXSAuICJdIiAuICRlb2w7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkUmVw
+b3J0Qm9keSAuPSAkYnVsbGV0X2VuZCAuICRlb2wgLiAkZW9sOw0KICAgICAgICB9DQogICAgICAg
+IA0KICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm90ZXMgdGhlbiBsaXN0IHRoZW0NCiAgICAgICAg
+aWYoY291bnQoJHRoaXMtPk5vdGVMb2cpID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgJFJl
+cG9ydEJvZHkgLj0gIk5vdGVzIiAuICRlb2w7DQogICAgICAgICAgICAkUmVwb3J0Qm9keSAuPSAi
+LS0tLS0iIC4gJGVvbDsNCg0KICAgICAgICAgICAgJFJlcG9ydEJvZHkgLj0gJGJ1bGxldF9zdGFy
+dDsNCiAgICAgICAgICAgIGZvcigkaSA9IDA7ICRpIDwgY291bnQoJHRoaXMtPk5vdGVMb2cpOyAk
+aSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRSZXBvcnRCb2R5IC49ICRidWxs
+ZXQgLiAkdGhpcy0+Tm90ZUxvZ1skaV0gLiAkZW9sOw0KICAgICAgICAgICAgfQ0KICAgICAgICAg
+ICAgJFJlcG9ydEJvZHkgLj0gJGJ1bGxldF9lbmQ7DQogICAgICAgIH0NCiAgICAgICAgDQogICAg
+ICAgIC8vIFJlLWF0dGFjaCB0aGUgb3JpZ2luYWwgYm9keQ0KICAgICAgICAkdGhpcy0+TWFpbC0+
+Qm9keSAuPSAkZW9sIC4gJGVvbCAuICRSZXBvcnRCb2R5Ow0KICAgIH0NCiAgICANCiAgICAvKioN
+CiAgICAgKiBDaGVjayB3aGljaCBkZWZhdWx0IHNldHRpbmdzIGhhdmUgYmVlbiBjaGFuZ2VkIGZv
+ciB0aGUgcmVwb3J0Lg0KICAgICAqIEBwcml2YXRlDQogICAgICogQHJldHVybnMgdm9pZA0KICAg
+ICAqLw0KICAgIGZ1bmN0aW9uIENoZWNrQ2hhbmdlcygpIHsNCiAgICAgICAgaWYoJHRoaXMtPk1h
+aWwtPlByaW9yaXR5ICE9IDMpDQogICAgICAgICAgICAkdGhpcy0+QWRkQ2hhbmdlKCJQcmlvcml0
+eSIsICR0aGlzLT5NYWlsLT5Qcmlvcml0eSk7DQogICAgICAgIGlmKCR0aGlzLT5NYWlsLT5FbmNv
+ZGluZyAhPSAiOGJpdCIpDQogICAgICAgICAgICAkdGhpcy0+QWRkQ2hhbmdlKCJFbmNvZGluZyIs
+ICR0aGlzLT5NYWlsLT5FbmNvZGluZyk7DQogICAgICAgIGlmKCR0aGlzLT5NYWlsLT5DaGFyU2V0
+ICE9ICJpc28tODg1OS0xIikNCiAgICAgICAgICAgICR0aGlzLT5BZGRDaGFuZ2UoIkNoYXJTZXQi
+LCAkdGhpcy0+TWFpbC0+Q2hhclNldCk7DQogICAgICAgIGlmKCR0aGlzLT5NYWlsLT5TZW5kZXIg
+IT0gIiIpDQogICAgICAgICAgICAkdGhpcy0+QWRkQ2hhbmdlKCJTZW5kZXIiLCAkdGhpcy0+TWFp
+bC0+U2VuZGVyKTsNCiAgICAgICAgaWYoJHRoaXMtPk1haWwtPldvcmRXcmFwICE9IDApDQogICAg
+ICAgICAgICAkdGhpcy0+QWRkQ2hhbmdlKCJXb3JkV3JhcCIsICR0aGlzLT5NYWlsLT5Xb3JkV3Jh
+cCk7DQogICAgICAgIGlmKCR0aGlzLT5NYWlsLT5NYWlsZXIgIT0gIm1haWwiKQ0KICAgICAgICAg
+ICAgJHRoaXMtPkFkZENoYW5nZSgiTWFpbGVyIiwgJHRoaXMtPk1haWwtPk1haWxlcik7DQogICAg
+ICAgIGlmKCR0aGlzLT5NYWlsLT5Qb3J0ICE9IDI1KQ0KICAgICAgICAgICAgJHRoaXMtPkFkZENo
+YW5nZSgiUG9ydCIsICR0aGlzLT5NYWlsLT5Qb3J0KTsNCiAgICAgICAgaWYoJHRoaXMtPk1haWwt
+PkhlbG8gIT0gImxvY2FsaG9zdC5sb2NhbGRvbWFpbiIpDQogICAgICAgICAgICAkdGhpcy0+QWRk
+Q2hhbmdlKCJIZWxvIiwgJHRoaXMtPk1haWwtPkhlbG8pOw0KICAgICAgICBpZigkdGhpcy0+TWFp
+bC0+U01UUEF1dGgpDQogICAgICAgICAgICAkdGhpcy0+QWRkQ2hhbmdlKCJTTVRQQXV0aCIsICJ0
+cnVlIik7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEFkZHMgYSBjaGFuZ2UgZW50cnku
+DQogICAgICogQHByaXZhdGUNCiAgICAgKiBAcmV0dXJucyB2b2lkDQogICAgICovDQogICAgZnVu
+Y3Rpb24gQWRkQ2hhbmdlKCRzTmFtZSwgJHNOZXdWYWx1ZSkgew0KICAgICAgICAkY3VyID0gY291
+bnQoJHRoaXMtPkNoYW5nZUxvZyk7DQogICAgICAgICR0aGlzLT5DaGFuZ2VMb2dbJGN1cl1bMF0g
+PSAkc05hbWU7DQogICAgICAgICR0aGlzLT5DaGFuZ2VMb2dbJGN1cl1bMV0gPSAkc05ld1ZhbHVl
+Ow0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBBZGRzIGEgc2ltcGxlIG5vdGUgdG8gdGhl
+IG1lc3NhZ2UuDQogICAgICogQHB1YmxpYw0KICAgICAqIEByZXR1cm5zIHZvaWQNCiAgICAgKi8N
+CiAgICBmdW5jdGlvbiBBZGROb3RlKCRzVmFsdWUpIHsNCiAgICAgICAgJHRoaXMtPk5vdGVMb2db
+XSA9ICRzVmFsdWU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkcyBhbGwgb2YgdGhlIGFk
+ZHJlc3Nlcw0KICAgICAqIEBwdWJsaWMNCiAgICAgKiBAcmV0dXJucyB2b2lkDQogICAgICovDQog
+ICAgZnVuY3Rpb24gU2V0QWRkcmVzcygkc0FkZHJlc3MsICRzTmFtZSA9ICIiLCAkc1R5cGUgPSAi
+dG8iKSB7DQogICAgICAgIHN3aXRjaCgkc1R5cGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNh
+c2UgInRvIjoNCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbC0+QWRkQWRkcmVzcygkc0FkZHJl
+c3MsICRzTmFtZSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJj
+YyI6DQogICAgICAgICAgICAgICAgJHRoaXMtPk1haWwtPkFkZENDKCRzQWRkcmVzcywgJHNOYW1l
+KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgImJjYyI6DQogICAg
+ICAgICAgICAgICAgJHRoaXMtPk1haWwtPkFkZEJDQygkc0FkZHJlc3MsICRzTmFtZSk7DQogICAg
+ICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLy8vLy8vLy8vLy8v
+Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogICAgLy8gVU5JVCBURVNUUw0K
+ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0K
+ICAgIC8qKg0KICAgICAqIFRyeSBhIHBsYWluIG1lc3NhZ2UuDQogICAgICovDQogICAgZnVuY3Rp
+b24gdGVzdF9Xb3JkV3JhcCgpIHsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+V29yZFdyYXAgPSA0
+MDsNCiAgICAgICAgJG15X2JvZHkgPSAiSGVyZSBpcyB0aGUgbWFpbiBib2R5IG9mIHRoaXMgbWVz
+c2FnZS4gIEl0IHNob3VsZCAiIC4NCiAgICAgICAgICAgICAgICAgICAiYmUgcXVpdGUgYSBmZXcg
+bGluZXMuICBJdCBzaG91bGQgYmUgd3JhcHBlZCBhdCB0aGUgIiAuDQogICAgICAgICAgICAgICAg
+ICAgIjQwIGNoYXJhY3RlcnMuICBNYWtlIHN1cmUgdGhhdCBpdCBpcy4iOw0KICAgICAgICAkbkJv
+ZHlMZW4gPSBzdHJsZW4oJG15X2JvZHkpOw0KICAgICAgICAkbXlfYm9keSAuPSAiXG5cblRoaXMg
+aXMgdGhlIGFib3ZlIGJvZHkgbGVuZ3RoOiAiIC4gJG5Cb2R5TGVuOw0KDQogICAgICAgICR0aGlz
+LT5NYWlsLT5Cb2R5ID0gJG15X2JvZHk7DQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0IC49
+ICI6IFdvcmR3cmFwIjsNCg0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0
+aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5NYWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvcklu
+Zm8pOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFRyeSBhIHBsYWluIG1lc3NhZ2UuDQogICAg
+ICovDQogICAgZnVuY3Rpb24gdGVzdF9Mb3dfUHJpb3JpdHkoKSB7DQogICAgDQogICAgICAgICR0
+aGlzLT5NYWlsLT5Qcmlvcml0eSA9IDU7DQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIkhl
+cmUgaXMgdGhlIG1haW4gYm9keS4gIFRoZXJlIHNob3VsZCBiZSAiIC4NCiAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAiYSByZXBseSB0byBhZGRyZXNzIGluIHRoaXMgbWVzc2FnZS4iOw0KICAg
+ICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBMb3cgUHJpb3JpdHkiOw0KICAgICAgICAk
+dGhpcy0+TWFpbC0+QWRkUmVwbHlUbygibm9ib2R5QG5vYm9keS5jb20iLCAiTm9ib2R5IChVbml0
+IFRlc3QpIik7DQoNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAgICAgICAkdGhpcy0+
+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsN
+CiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTaW1wbGUgcGxhaW4gZmlsZSBhdHRhY2htZW50IHRl
+c3QuDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9NdWx0aXBsZV9QbGFpbl9GaWxlQXR0YWNo
+bWVudCgpIHsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJIZXJlIGlzIHRoZSB0ZXh0
+IGJvZHkiOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBQbGFpbiArIE11bHRp
+cGxlIEZpbGVBdHRhY2htZW50cyI7DQoNCiAgICAgICAgaWYoISR0aGlzLT5NYWlsLT5BZGRBdHRh
+Y2htZW50KCBQSFBNQUlMRVJfVEVTVF9CQVNFX0ZPTERFUi4idGVzdC5wbmciKSkNCiAgICAgICAg
+ew0KICAgICAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoZmFsc2UsICR0aGlzLT5NYWlsLT5FcnJv
+ckluZm8pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYoISR0
+aGlzLT5NYWlsLT5BZGRBdHRhY2htZW50KCBQSFBNQUlMRVJfVEVTVF9CQVNFX0ZPTERFUi4icGhw
+bWFpbGVyX3Rlc3QuY2xhc3MucGhwIiwgInRlc3QudHh0IikpDQogICAgICAgIHsNCiAgICAgICAg
 ICAgICR0aGlzLT5hc3NlcnRUcnVlKGZhbHNlLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAg
-ICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKCEkdGhpcy0+TWFpbC0+
-QWRkQXR0YWNobWVudChQSFBNQUlMRVJfVEVTVF9CQVNFX0ZPTERFUi4icGhwbWFpbGVyX3Rlc3Qu
-Y2xhc3MucGhwIiwgInRlc3QudHh0IikpDQogICAgICAgIHsNCiAgICAgICAgICAgICR0aGlzLT5h
-c3NlcnRUcnVlKGZhbHNlLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAgICAgICAgICAgIHJl
-dHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0K
-ICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFp
-bC0+RXJyb3JJbmZvKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTaW1wbGUgbXVsdGlwYXJ0
-L2FsdGVybmF0aXZlIHRlc3QuDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9BbHRCb2R5KCkg
-ew0KDQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIlRoaXMgaXMgdGhlIDxiPkhUTUw8L2I+
-IHBhcnQgb2YgdGhlIGVtYWlsLiI7DQogICAgICAgICR0aGlzLT5NYWlsLT5BbHRCb2R5ID0gIkhl
-cmUgaXMgdGhlIHRleHQgYm9keSBvZiB0aGlzIG1lc3NhZ2UuICAiIC4NCiAgICAgICAgICAgICAg
-ICAgICAiSXQgc2hvdWxkIGJlIHF1aXRlIGEgZmV3IGxpbmVzLiAgSXQgc2hvdWxkIGJlIHdyYXBw
-ZWQgYXQgdGhlICIgLg0KICAgICAgICAgICAgICAgICAgICI0MCBjaGFyYWN0ZXJzLiAgTWFrZSBz
-dXJlIHRoYXQgaXQgaXMuIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPldvcmRXcmFwID0gNDA7DQog
-ICAgICAgICR0aGlzLT5BZGROb3RlKCJUaGlzIGlzIGEgbXVsaXBhcnQgYWx0ZXJuYXRpdmUgZW1h
-aWwiKTsNCiAgICAgICAgJHRoaXMtPk1haWwtPlN1YmplY3QgLj0gIjogQWx0Qm9keSArIFdvcmQg
-V3JhcCI7DQoNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAgICAgICAkdGhpcy0+YXNz
-ZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAg
-ICB9DQoNCiAgICAvKioNCiAgICAgKiBTaW1wbGUgSFRNTCBhbmQgYXR0YWNobWVudCB0ZXN0DQog
-ICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9BbHRCb2R5X0F0dGFjaG1lbnQoKSB7DQoNCiAgICAg
-ICAgJHRoaXMtPk1haWwtPkJvZHkgPSAiVGhpcyBpcyB0aGUgPGI+SFRNTDwvYj4gcGFydCBvZiB0
-aGUgZW1haWwuIjsNCiAgICAgICAgJHRoaXMtPk1haWwtPkFsdEJvZHkgPSAiVGhpcyBpcyB0aGUg
-dGV4dCBwYXJ0IG9mIHRoZSBlbWFpbC4iOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAu
-PSAiOiBBbHRCb2R5ICsgQXR0YWNobWVudCI7DQogICAgICAgICR0aGlzLT5NYWlsLT5Jc0hUTUwo
-dHJ1ZSk7DQogICAgICAgIA0KICAgICAgICBpZighJHRoaXMtPk1haWwtPkFkZEF0dGFjaG1lbnQo
-UEhQTUFJTEVSX1RFU1RfQkFTRV9GT0xERVIuInBocG1haWxlcl90ZXN0LmNsYXNzLnBocCIsICJ0
-ZXN0X2F0dGFjaC50eHQiKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJHRoaXMtPmFzc2VydFRy
-dWUoZmFsc2UsICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgICAgICAgICAgcmV0dXJuOw0K
-ICAgICAgICB9DQoNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAgICAgICAkdGhpcy0+
-YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsN
-Cg0KICAgICAgICAkZnAgPSBmb3BlbihQSFBNQUlMRVJfVEVTVF9CQVNFX0ZPTERFUi4ibWVzc2Fn
-ZS50eHQiLCAidyIpOw0KICAgICAgICBmd3JpdGUoJGZwLCAkdGhpcy0+TWFpbC0+Q3JlYXRlSGVh
-ZGVyKCkgLiAkdGhpcy0+TWFpbC0+Q3JlYXRlQm9keSgpKTsNCiAgICAgICAgZmNsb3NlKCRmcCk7
-DQogICAgfSAgICANCg0KICAgIGZ1bmN0aW9uIHRlc3RfTXVsdGlwbGVTZW5kKCkgew0KICAgICAg
-ICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJTZW5kaW5nIHR3byBtZXNzYWdlcyB3aXRob3V0IGtlZXBh
-bGl2ZSI7DQogICAgICAgICR0aGlzLT5CdWlsZEJvZHkoKTsNCiAgICAgICAgJHN1YmplY3QgPSAk
-dGhpcy0+TWFpbC0+U3ViamVjdDsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCA9ICRz
-dWJqZWN0IC4gIjogU01UUCAxIjsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1h
-aWwtPlNlbmQoKSwgJHRoaXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgICAgIA0KICAgICAgICAk
-dGhpcy0+TWFpbC0+U3ViamVjdCA9ICRzdWJqZWN0IC4gIjogU01UUCAyIjsNCiAgICAgICAgJHRo
-aXMtPmFzc2VydFRydWUoJHRoaXMtPk1haWwtPlNlbmQoKSwgJHRoaXMtPk1haWwtPkVycm9ySW5m
-byk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdGVzdF9TbXRwS2VlcEFsaXZlKCkgew0KICAgICAg
-ICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJUaGlzIHdhcyBkb25lIHVzaW5nIHRoZSBTTVRQIGtlZXAt
-YWxpdmUuIjsNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAgICAgICAkc3ViamVjdCA9
-ICR0aGlzLT5NYWlsLT5TdWJqZWN0Ow0KDQogICAgICAgICR0aGlzLT5NYWlsLT5TTVRQS2VlcEFs
-aXZlID0gdHJ1ZTsNCiAgICAgICAgJHRoaXMtPk1haWwtPlN1YmplY3QgPSAkc3ViamVjdCAuICI6
-IFNNVFAga2VlcC1hbGl2ZSAxIjsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1h
-aWwtPlNlbmQoKSwgJHRoaXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgICAgIA0KICAgICAgICAk
-dGhpcy0+TWFpbC0+U3ViamVjdCA9ICRzdWJqZWN0IC4gIjogU01UUCBrZWVwLWFsaXZlIDIiOw0K
-ICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFp
-bC0+RXJyb3JJbmZvKTsNCiAgICAgICAgJHRoaXMtPk1haWwtPlNtdHBDbG9zZSgpOw0KICAgIH0N
-CiAgICANCiAgICAvKioNCiAgICAgKiBUZXN0cyB0aGlzIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFj
-azogDQogICAgICogICAgaHR0cDovL3d3dy5jeWJzZWMuY29tL3Z1bG4vUEhQTWFpbGVyLURPUy5w
-ZGYNCiAgICAgKi8NCiAgICBmdW5jdGlvbiB0ZXN0X0RlbmlhbE9mU2VydmljZUF0dGFjaygpIHsN
-CiAgICAgICAgJHRoaXMtPk1haWwtPkJvZHkgPSAiVGhpcyBzaG91bGQgbm8gbG9uZ2VyIGNhdXNl
-IGEgZGVuaWFsIG9mIHNlcnZpY2UuIjsNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgpOw0KICAg
-ICAgIA0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCA9IHN0cl9yZXBlYXQoIkEiLCA5OTgp
-Ow0KICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+
-TWFpbC0+RXJyb3JJbmZvKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gdGVzdF9FcnJvcigp
-IHsNCiAgICAgICAgJHRoaXMtPk1haWwtPlN1YmplY3QgLj0gIjogVGhpcyBzaG91bGQgYmUgc2Vu
-dCI7IA0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5NYWlsLT5D
-bGVhckFsbFJlY2lwaWVudHMoKTsgLy8gbm8gYWRkcmVzc2VzIHNob3VsZCBjYXVzZSBhbiBlcnJv
-cg0KICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+SXNFcnJvcigpID09IGZh
-bHNlLCAiRXJyb3IgZm91bmQiKTsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1h
-aWwtPlNlbmQoKSA9PSBmYWxzZSwgIlNlbmQgc3VjY2VlZGVkIik7DQogICAgICAgICR0aGlzLT5h
-c3NlcnRUcnVlKCR0aGlzLT5NYWlsLT5Jc0Vycm9yKCksICJObyBlcnJvciBmb3VuZCIpOw0KICAg
-ICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSAn
-IC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVjaXBpZW50IGVtYWlsIGFkZHJlc3Mu
-JywgJHRoaXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgICAgICR0aGlzLT5NYWlsLT5BZGRBZGRy
-ZXNzKFRFU1RfTUFJTF9VU0VSKTsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1h
-aWwtPlNlbmQoKSwgIlNlbmQgZmFpbGVkIik7DQogICAgfQ0KfSAg
+ICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5CdWlsZEJvZHko
+KTsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1haWwtPlNlbmQoKSwgJHRoaXMt
+Pk1haWwtPkVycm9ySW5mbyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2ltcGxlIHBsYWlu
+IHN0cmluZyBhdHRhY2htZW50IHRlc3QuDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdF9QbGFp
+bl9TdHJpbmdBdHRhY2htZW50KCkgew0KDQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIkhl
+cmUgaXMgdGhlIHRleHQgYm9keSI7DQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0IC49ICI6
+IFBsYWluICsgU3RyaW5nQXR0YWNobWVudCI7DQogICAgICAgIA0KICAgICAgICAkc0F0dGFjaG1l
+bnQgPSAiVGhlc2UgY2hhcmFjdGVycyBhcmUgdGhlIGNvbnRlbnQgb2YgdGhlICIgLg0KICAgICAg
+ICAgICAgICAgICAgICAgICAic3RyaW5nIGF0dGFjaG1lbnQuXG5UaGlzIG1pZ2h0IGJlIHRha2Vu
+IGZyb20gYSAiLg0KICAgICAgICAgICAgICAgICAgICAgICAiZGF0YWJhc2Ugb3Igc29tZSBvdGhl
+ciBzdWNoIHRoaW5nLiAiOw0KICAgICAgICANCiAgICAgICAgJHRoaXMtPk1haWwtPkFkZFN0cmlu
+Z0F0dGFjaG1lbnQoJHNBdHRhY2htZW50LCAic3RyaW5nX2F0dGFjaC50eHQiKTsNCg0KICAgICAg
+ICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5N
+YWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCg0KICAgIC8qKg0K
+ICAgICAqIFBsYWluIHF1b3RlZC1wcmludGFibGUgbWVzc2FnZS4NCiAgICAgKi8NCiAgICBmdW5j
+dGlvbiB0ZXN0X1F1b3RlZF9QcmludGFibGUoKSB7DQoNCiAgICAgICAgJHRoaXMtPk1haWwtPkJv
+ZHkgPSAiSGVyZSBpcyB0aGUgbWFpbiBib2R5IjsNCiAgICAgICAgJHRoaXMtPk1haWwtPlN1Ympl
+Y3QgLj0gIjogUGxhaW4gKyBRdW90ZWQtcHJpbnRhYmxlIjsNCiAgICAgICAgJHRoaXMtPk1haWwt
+PkVuY29kaW5nID0gInF1b3RlZC1wcmludGFibGUiOw0KDQogICAgICAgICR0aGlzLT5CdWlsZEJv
+ZHkoKTsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1haWwtPlNlbmQoKSwgJHRo
+aXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVHJ5IGEgcGxh
+aW4gbWVzc2FnZS4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiB0ZXN0X0h0bWwoKSB7DQogICAgDQog
+ICAgICAgICR0aGlzLT5NYWlsLT5Jc0hUTUwodHJ1ZSk7DQogICAgICAgICR0aGlzLT5NYWlsLT5T
+dWJqZWN0IC49ICI6IEhUTUwgb25seSI7DQogICAgICAgIA0KICAgICAgICAkdGhpcy0+TWFpbC0+
+Qm9keSA9ICJUaGlzIGlzIGEgPGI+dGVzdCBtZXNzYWdlPC9iPiB3cml0dGVuIGluIEhUTUwuIDwv
+YnI+IiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvIHRvIDxhIGhyZWY9XCJodHRw
+Oi8vcGhwbWFpbGVyLnNvdXJjZWZvcmdlLm5ldC9cIj4iIC4NCiAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAiaHR0cDovL3BocG1haWxlci5zb3VyY2Vmb3JnZS5uZXQvPC9hPiBmb3IgbmV3IHZl
+cnNpb25zIG9mICIgLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaHBtYWlsZXIuICA8
+cC8+IFRoYW5rIHlvdSEiOw0KDQogICAgICAgICR0aGlzLT5CdWlsZEJvZHkoKTsNCiAgICAgICAg
+JHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1haWwtPlNlbmQoKSwgJHRoaXMtPk1haWwtPkVycm9y
+SW5mbyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2ltcGxlIEhUTUwgYW5kIGF0dGFjaG1l
+bnQgdGVzdA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3RfSFRNTF9BdHRhY2htZW50KCkgew0K
+DQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIlRoaXMgaXMgdGhlIDxiPkhUTUw8L2I+IHBh
+cnQgb2YgdGhlIGVtYWlsLiI7DQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0IC49ICI6IEhU
+TUwgKyBBdHRhY2htZW50IjsNCiAgICAgICAgJHRoaXMtPk1haWwtPklzSFRNTCh0cnVlKTsNCiAg
+ICAgICAgDQogICAgICAgIGlmKCEkdGhpcy0+TWFpbC0+QWRkQXR0YWNobWVudChQSFBNQUlMRVJf
+VEVTVF9CQVNFX0ZPTERFUi4icGhwbWFpbGVyX3Rlc3QuY2xhc3MucGhwIiwgInRlc3RfYXR0YWNo
+LnR4dCIpKQ0KICAgICAgICB7DQogICAgICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZShmYWxzZSwg
+JHRoaXMtPk1haWwtPkVycm9ySW5mbyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0N
+Cg0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVl
+KCR0aGlzLT5NYWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCg0K
+ICAgIC8qKg0KICAgICAqIEFuIGVtYmVkZGVkIGF0dGFjaG1lbnQgdGVzdC4NCiAgICAgKi8NCiAg
+ICBmdW5jdGlvbiB0ZXN0X0VtYmVkZGVkX0ltYWdlKCkgew0KDQogICAgICAgICR0aGlzLT5NYWls
+LT5Cb2R5ID0gIkVtYmVkZGVkIEltYWdlOiA8aW1nIGFsdD1cInBocG1haWxlclwiIHNyYz1cImNp
+ZDpteS1hdHRhY2hcIj4iIC4NCiAgICAgICAgICAgICAgICAgICAgICJIZXJlIGlzIGFuIGltYWdl
+ITwvYT4iOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBFbWJlZGRlZCBJbWFn
+ZSI7DQogICAgICAgICR0aGlzLT5NYWlsLT5Jc0hUTUwodHJ1ZSk7DQogICAgICAgIA0KICAgICAg
+ICBpZighJHRoaXMtPk1haWwtPkFkZEVtYmVkZGVkSW1hZ2UoUEhQTUFJTEVSX1RFU1RfQkFTRV9G
+T0xERVIuInRlc3QucG5nIiwgIm15LWF0dGFjaCIsICJ0ZXN0LnBuZyIsDQogICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0IiwgImltYWdlL3BuZyIpKQ0KICAg
+ICAgICB7DQogICAgICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZShmYWxzZSwgJHRoaXMtPk1haWwt
+PkVycm9ySW5mbyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAk
+dGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5NYWls
+LT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCg0KICAgIC8qKg0KICAg
+ICAqIEFuIGVtYmVkZGVkIGF0dGFjaG1lbnQgdGVzdC4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiB0
+ZXN0X011bHRpX0VtYmVkZGVkX0ltYWdlKCkgew0KDQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5
+ID0gIkVtYmVkZGVkIEltYWdlOiA8aW1nIGFsdD1cInBocG1haWxlclwiIHNyYz1cImNpZDpteS1h
+dHRhY2hcIj4iIC4NCiAgICAgICAgICAgICAgICAgICAgICJIZXJlIGlzIGFuIGltYWdlITwvYT4i
+Ow0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAuPSAiOiBFbWJlZGRlZCBJbWFnZSArIEF0
+dGFjaG1lbnQiOw0KICAgICAgICAkdGhpcy0+TWFpbC0+SXNIVE1MKHRydWUpOw0KICAgICAgICAN
+CiAgICAgICAgaWYoISR0aGlzLT5NYWlsLT5BZGRFbWJlZGRlZEltYWdlKFBIUE1BSUxFUl9URVNU
+X0JBU0VfRk9MREVSLiJ0ZXN0LnBuZyIsICJteS1hdHRhY2giLCAidGVzdC5wbmciLA0KICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2U2NCIsICJpbWFnZS9wbmci
+KSkNCiAgICAgICAgew0KICAgICAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoZmFsc2UsICR0aGlz
+LT5NYWlsLT5FcnJvckluZm8pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAg
+ICAgICAgaWYoISR0aGlzLT5NYWlsLT5BZGRBdHRhY2htZW50KFBIUE1BSUxFUl9URVNUX0JBU0Vf
+Rk9MREVSLiJwaHBtYWlsZXJfdGVzdC5jbGFzcy5waHAiLCAidGVzdC50eHQiKSkNCiAgICAgICAg
+ew0KICAgICAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoZmFsc2UsICR0aGlzLT5NYWlsLT5FcnJv
+ckluZm8pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAg
+ICAkdGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5N
+YWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCg0KICAgIC8qKg0K
+ICAgICAqIFNpbXBsZSBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUgdGVzdC4NCiAgICAgKi8NCiAgICBm
+dW5jdGlvbiB0ZXN0X0FsdEJvZHkoKSB7DQoNCiAgICAgICAgJHRoaXMtPk1haWwtPkJvZHkgPSAi
+VGhpcyBpcyB0aGUgPGI+SFRNTDwvYj4gcGFydCBvZiB0aGUgZW1haWwuIjsNCiAgICAgICAgJHRo
+aXMtPk1haWwtPkFsdEJvZHkgPSAiSGVyZSBpcyB0aGUgdGV4dCBib2R5IG9mIHRoaXMgbWVzc2Fn
+ZS4gICIgLg0KICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgYmUgcXVpdGUgYSBmZXcgbGlu
+ZXMuICBJdCBzaG91bGQgYmUgd3JhcHBlZCBhdCB0aGUgIiAuDQogICAgICAgICAgICAgICAgICAg
+IjQwIGNoYXJhY3RlcnMuICBNYWtlIHN1cmUgdGhhdCBpdCBpcy4iOw0KICAgICAgICAkdGhpcy0+
+TWFpbC0+V29yZFdyYXAgPSA0MDsNCiAgICAgICAgJHRoaXMtPkFkZE5vdGUoIlRoaXMgaXMgYSBt
+dWxpcGFydCBhbHRlcm5hdGl2ZSBlbWFpbCIpOw0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVj
+dCAuPSAiOiBBbHRCb2R5ICsgV29yZCBXcmFwIjsNCg0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5
+KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5NYWlsLT5TZW5kKCksICR0aGlz
+LT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNpbXBsZSBIVE1M
+IGFuZCBhdHRhY2htZW50IHRlc3QNCiAgICAgKi8NCiAgICBmdW5jdGlvbiB0ZXN0X0FsdEJvZHlf
+QXR0YWNobWVudCgpIHsNCg0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJUaGlzIGlzIHRo
+ZSA8Yj5IVE1MPC9iPiBwYXJ0IG9mIHRoZSBlbWFpbC4iOw0KICAgICAgICAkdGhpcy0+TWFpbC0+
+QWx0Qm9keSA9ICJUaGlzIGlzIHRoZSB0ZXh0IHBhcnQgb2YgdGhlIGVtYWlsLiI7DQogICAgICAg
+ICR0aGlzLT5NYWlsLT5TdWJqZWN0IC49ICI6IEFsdEJvZHkgKyBBdHRhY2htZW50IjsNCiAgICAg
+ICAgJHRoaXMtPk1haWwtPklzSFRNTCh0cnVlKTsNCiAgICAgICAgDQogICAgICAgIGlmKCEkdGhp
+cy0+TWFpbC0+QWRkQXR0YWNobWVudChQSFBNQUlMRVJfVEVTVF9CQVNFX0ZPTERFUi4icGhwbWFp
+bGVyX3Rlc3QuY2xhc3MucGhwIiwgInRlc3RfYXR0YWNoLnR4dCIpKQ0KICAgICAgICB7DQogICAg
+ICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZShmYWxzZSwgJHRoaXMtPk1haWwtPkVycm9ySW5mbyk7
+DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAkdGhpcy0+QnVpbGRC
+b2R5KCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5NYWlsLT5TZW5kKCksICR0
+aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KDQogICAgICAgICRmcCA9IGZvcGVuKFBIUE1BSUxFUl9U
+RVNUX0JBU0VfRk9MREVSLiJtZXNzYWdlLnR4dCIsICJ3Iik7DQogICAgICAgIGZ3cml0ZSgkZnAs
+ICR0aGlzLT5NYWlsLT5DcmVhdGVIZWFkZXIoKSAuICR0aGlzLT5NYWlsLT5DcmVhdGVCb2R5KCkp
+Ow0KICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICB9ICAgIA0KDQogICAgZnVuY3Rpb24gdGVzdF9N
+dWx0aXBsZVNlbmQoKSB7DQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIlNlbmRpbmcgdHdv
+IG1lc3NhZ2VzIHdpdGhvdXQga2VlcGFsaXZlIjsNCiAgICAgICAgJHRoaXMtPkJ1aWxkQm9keSgp
+Ow0KICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5NYWlsLT5TdWJqZWN0Ow0KDQogICAgICAgICR0
+aGlzLT5NYWlsLT5TdWJqZWN0ID0gJHN1YmplY3QgLiAiOiBTTVRQIDEiOw0KICAgICAgICAkdGhp
+cy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZv
+KTsNCiAgICAgICAgDQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0ID0gJHN1YmplY3QgLiAi
+OiBTTVRQIDIiOw0KICAgICAgICAkdGhpcy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgp
+LCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0ZXN0X1Nt
+dHBLZWVwQWxpdmUoKSB7DQogICAgICAgICR0aGlzLT5NYWlsLT5Cb2R5ID0gIlRoaXMgd2FzIGRv
+bmUgdXNpbmcgdGhlIFNNVFAga2VlcC1hbGl2ZS4iOw0KICAgICAgICAkdGhpcy0+QnVpbGRCb2R5
+KCk7DQogICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPk1haWwtPlN1YmplY3Q7DQoNCiAgICAgICAg
+JHRoaXMtPk1haWwtPlNNVFBLZWVwQWxpdmUgPSB0cnVlOw0KICAgICAgICAkdGhpcy0+TWFpbC0+
+U3ViamVjdCA9ICRzdWJqZWN0IC4gIjogU01UUCBrZWVwLWFsaXZlIDEiOw0KICAgICAgICAkdGhp
+cy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZv
+KTsNCiAgICAgICAgDQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0ID0gJHN1YmplY3QgLiAi
+OiBTTVRQIGtlZXAtYWxpdmUgMiI7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlzLT5N
+YWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgICAgICAkdGhpcy0+TWFp
+bC0+U210cENsb3NlKCk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFRlc3RzIHRoaXMg
+ZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrOiANCiAgICAgKiAgICBodHRwOi8vd3d3LmN5YnNlYy5j
+b20vdnVsbi9QSFBNYWlsZXItRE9TLnBkZg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3RfRGVu
+aWFsT2ZTZXJ2aWNlQXR0YWNrKCkgew0KICAgICAgICAkdGhpcy0+TWFpbC0+Qm9keSA9ICJUaGlz
+IHNob3VsZCBubyBsb25nZXIgY2F1c2UgYSBkZW5pYWwgb2Ygc2VydmljZS4iOw0KICAgICAgICAk
+dGhpcy0+QnVpbGRCb2R5KCk7DQogICAgICAgDQogICAgICAgICR0aGlzLT5NYWlsLT5TdWJqZWN0
+ID0gc3RyX3JlcGVhdCgiQSIsIDk5OCk7DQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlz
+LT5NYWlsLT5TZW5kKCksICR0aGlzLT5NYWlsLT5FcnJvckluZm8pOw0KICAgIH0NCiAgICANCiAg
+ICBmdW5jdGlvbiB0ZXN0X0Vycm9yKCkgew0KICAgICAgICAkdGhpcy0+TWFpbC0+U3ViamVjdCAu
+PSAiOiBUaGlzIHNob3VsZCBiZSBzZW50IjsgDQogICAgICAgICR0aGlzLT5CdWlsZEJvZHkoKTsN
+CiAgICAgICAgJHRoaXMtPk1haWwtPkNsZWFyQWxsUmVjaXBpZW50cygpOyAvLyBubyBhZGRyZXNz
+ZXMgc2hvdWxkIGNhdXNlIGFuIGVycm9yDQogICAgICAgICR0aGlzLT5hc3NlcnRUcnVlKCR0aGlz
+LT5NYWlsLT5Jc0Vycm9yKCkgPT0gZmFsc2UsICJFcnJvciBmb3VuZCIpOw0KICAgICAgICAkdGhp
+cy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpID09IGZhbHNlLCAiU2VuZCBzdWNjZWVk
+ZWQiKTsNCiAgICAgICAgJHRoaXMtPmFzc2VydFRydWUoJHRoaXMtPk1haWwtPklzRXJyb3IoKSwg
+Ik5vIGVycm9yIGZvdW5kIik7DQogICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ1lvdSBtdXN0
+IHByb3ZpZGUgYXQgbGVhc3Qgb25lICcgLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdy
+ZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLCAkdGhpcy0+TWFpbC0+RXJyb3JJbmZvKTsNCiAgICAg
+ICAgJHRoaXMtPk1haWwtPkFkZEFkZHJlc3MoVEVTVF9NQUlMX1VTRVIpOw0KICAgICAgICAkdGhp
+cy0+YXNzZXJ0VHJ1ZSgkdGhpcy0+TWFpbC0+U2VuZCgpLCAiU2VuZCBmYWlsZWQiKTsNCiAgICB9
+DQp9ICA=
 
 
---b1_0ed405d7936eea8849dc41785cd66db2--
+--b1_da558b7b2173e5637e74b4d5c56e9652--

Modified: plog/trunk/class/test/tests/mail/phpmailer/phpmailer_test.class.php
===================================================================
--- plog/trunk/class/test/tests/mail/phpmailer/phpmailer_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/mail/phpmailer/phpmailer_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -4,7 +4,7 @@
   Type: phpmailer class
 ********************/
 
-include_once( PLOG_CLASS_PATH."class/test/PHPUnit.php" );
+include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
 include_once( PLOG_CLASS_PATH."class/mail/phpmailer/class.phpmailer.php" );
 
 /**
@@ -18,7 +18,7 @@
 /**
  * Performs authentication tests
  */
-class phpmailer_Test extends PHPUnit_TestCase
+class phpmailer_Test extends LifeTypeTestCase
 {
     /**
      * Holds the default phpmailer instance.

Added: plog/trunk/class/test/tests/net/http/httpclient_test.class.php
===================================================================
--- plog/trunk/class/test/tests/net/http/httpclient_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/net/http/httpclient_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -0,0 +1,49 @@
+<?php
+
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
+	include_once( PLOG_CLASS_PATH."class/net/http/httpclient.class.php" );
+	include_once( PLOG_CLASS_PATH."class/config/config.class.php" );	
+
+	/**
+	 * \ingroup Tests
+	 *
+	 * Test case for the Snoopy HTTP client library. It could do with a lot more tests
+	 * but we're only testing the features that we really need in LT (namely some basic
+	 * HTTP fetching stuff)
+	 */
+	class HttpClient_Test extends LifeTypeTestCase
+	{
+		var $c;
+		
+		function setUp()
+		{
+			$this->c = new HttpClient();
+		}
+		
+		function testFetch()
+		{
+			// let's fetch our own base URL
+			$config =& Config::getConfig();
+			$url = $config->getValue( "base_url" )."/index.php";
+			
+			$result = $this->c->fetch( $url );
+			
+			// check that it returned true
+			$this->assertTrue( $result );
+			
+			// and that there was content
+			$this->assertTrue(( $this->c->results != "" ));
+		}
+		
+		function testWrongUrl()
+		{
+			$result = $this->c->fetch( "http://www.4523453h42345lhlk.com" );
+			
+			// check that it returned true
+			$this->assertFalse( $result );
+			
+			// and that there was content
+			$this->assertTrue(( $this->c->results == "" ));			
+		}
+	}
+?>
\ No newline at end of file

Modified: plog/trunk/class/test/tests/net/url_test.class.php
===================================================================
--- plog/trunk/class/test/tests/net/url_test.class.php	2006-07-06 13:27:24 UTC (rev 3704)
+++ plog/trunk/class/test/tests/net/url_test.class.php	2006-07-06 14:33:18 UTC (rev 3705)
@@ -1,6 +1,6 @@
 <?php
 
-	include_once( PLOG_CLASS_PATH."class/test/PHPUnit.php" );
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
 	include_once( PLOG_CLASS_PATH."class/net/url.class.php" );
 
 	/**
@@ -8,7 +8,7 @@
 	 *
 	 * Test case for the Url class
 	 */
-	class Url_Test extends PHPUnit_TestCase
+	class Url_Test extends LifeTypeTestCase
 	{
 		var $url;
 			



More information about the pLog-svn mailing list