Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t..

Decoded Output download

?><?php


/*-------------------------------------------------------------------------------*/
/* Get Control Panel Options
/*-------------------------------------------------------------------------------*/
function enoty_get_option( $name ){
    $pnp_values = get_option( 'easynotify_opt' );
    if ( is_array( $pnp_values ) && array_key_exists( $name, $pnp_values ) ) return $pnp_values[$name];
    return false;
} 

/*-------------------------------------------------------------------------------*/
/*   Register CSS & JS ( ADMIN AREA )
/*-------------------------------------------------------------------------------*/
function easynotify_reg_script() {
	wp_register_style( 'enoty-ui-themes-redmond', plugins_url( 'css/jquery/jquery-ui/themes/smoothness/jquery-ui-1.10.0.custom.min.css' , dirname('index.php') ), false, ENOTIFY_VERSION );

	wp_register_style( 'enoty-multiselect-css', plugins_url( 'css/jquery/multiselect/jquery.multiselect.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
	
	wp_register_script( 'enoty-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js' , dirname('index.php') ) );	

	wp_register_style( 'enoty-colorpicker', plugins_url( 'css/colorpicker.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
	wp_register_script( 'enoty-colorpickerjs', plugins_url( 'js/colorpicker/colorpicker.js' , dirname('index.php') ), false );	
	wp_register_script( 'enoty-eye', plugins_url( 'js/colorpicker/eye.js' , dirname('index.php') ), false );
	wp_register_script( 'enoty-utils', plugins_url( 'js/colorpicker/utils.js' , dirname('index.php') ), false );		
	wp_register_script( 'enoty-cookie', plugins_url( 'js/jquery/jquery.cookie.js' , dirname('index.php') ), false );	
	
	wp_register_style( 'enoty-cpstyles', plugins_url( 'css/funcstyle.css' , dirname('index.php') ), false, ENOTIFY_VERSION, 'all');
	wp_register_style( 'enoty-sldr', plugins_url( 'css/slider.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
	
	}
		
add_action( 'admin_init', 'easynotify_reg_script' );


/*-------------------------------------------------------------------------------*/
/*   Register CSS & JS ( FRONT END )
/*-------------------------------------------------------------------------------*/
function easynotify_frontend_js() {

		wp_register_script( 'enoty-enotybox-js', ENOTIFY_URL. '/js/enotybox/jquery.enotybox.js' );
		wp_register_script( 'enoty-cookie-front', ENOTIFY_URL. '/js/jquery/jquery.cookie.js' );
		wp_register_script( 'enoty-placeholder', ENOTIFY_URL. '/js/jquery/jquery.placeholder.js' );
		wp_register_script( 'enoty-js', ENOTIFY_URL. '/js/easynotify.js' );
		
}
add_action( 'wp_enqueue_scripts', 'easynotify_frontend_js' );


/*-------------------------------------------------------------------------------*/
/*   Load Control Panel & Metabox
/*-------------------------------------------------------------------------------*/
if ( is_admin() ){
	include_once( ENOTIFY_DIR . '/layouts/enoty-preview.php' );
    include_once( ENOTIFY_DIR . '/inc/enoty-options.php' );
	include_once( ENOTIFY_DIR . '/inc/enoty-settings.php' );
	include_once( ENOTIFY_DIR . '/inc/enoty-metaboxes.php' );
	include_once( ENOTIFY_DIR . '/inc/functions/optin-handler/grab-lists.php' );
	include_once( ENOTIFY_DIR . '/inc/functions/optin-handler/mailman/aweber/aweber_oauth.php' );
 }
 
 
/*-------------------------------------------------------------------------------*/
/*   Load Frontend
/*-------------------------------------------------------------------------------*/
include_once( ENOTIFY_DIR . '/inc/enoty-frontend.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-shortcode.php' );
include_once( ENOTIFY_DIR . '/inc/functions/enoty-loader.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-ribbon-generator.php' );
include_once( ENOTIFY_DIR . '/inc/functions/optin-handler/optin-handler.php' );


/*-------------------------------------------------------------------------------*/
/*   Ajax Init
/*-------------------------------------------------------------------------------*/
add_action('wp_ajax_nopriv_easynotify_ajax_content', 'easynotify_ajax_content');
add_action('wp_ajax_easynotify_ajax_content', 'easynotify_ajax_content');


/*-------------------------------------------------------------------------------*/
/*   CHECK BROWSER VERSION ( IE ONLY )
/*-------------------------------------------------------------------------------*/
function easynotify_check_browser_version_admin( $sid ) {
	
	if ( is_admin() && get_post_type( $sid ) == 'easynotify' ){

		preg_match( '/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches );
		if ( count( $matches )>1 ){
			$version = explode(".", $matches[1]);
			switch(true){
				case ( $version[0] <= '8' ):
				$msg = 'ie8';

			break; 
			  
				case ( $version[0] > '8' ):
		  		$msg = 'gah';
			  
			break; 			  

			  default:
			}
			return $msg;
		} else {
			$msg = 'notie';
			return $msg;
			}
	}
}
 
/*-------------------------------------------------------------------------------*/
/*  RENAME POST BUTTON
/*-------------------------------------------------------------------------------*/
add_filter( 'gettext', 'easynotify_publish_button', 10, 2 );
function easynotify_publish_button( $translation, $text ) {
if ( 'easynotify' == get_post_type())
if ( $text == 'Publish' ) {
    return 'Save Notify'; }
else if ( $text == 'Update' ) {
    return 'Update Notify'; }	

return $translation;
} 

/*-------------------------------------------------------------------------------*/
/*  Get the pattern/layout list 
/*-------------------------------------------------------------------------------*/
function easynotify_get_list( $list ) {
	$lst = array();
	$lst_list = scandir( ENOTIFY_DIR."/css/images/".$list );
	
	foreach( $lst_list as $lst_name ) {
		if ( $lst_name != '.' && $lst_name != '..' ) {
			$lst[] = $lst_name;
		}
	}
	return $lst;	
}

/*-------------------------------------------------------------------------------*/
/*  Strip current shortcode when using default notify
/*-------------------------------------------------------------------------------*/
function easynotify_strip_shortcode($code, $content){
    global $shortcode_tags;

    $stack = $shortcode_tags;
    $shortcode_tags = array($code => 1);

    $content = strip_shortcodes($content);

    $shortcode_tags = $stack;
    return $content;
}	

/*-------------------------------------------------------------------------------*/
/* Generate Notify Script
/*-------------------------------------------------------------------------------*/
function easynotify_ajax_script( $id, $val ) {

	$offect = explode("-", get_post_meta( $id, 'enoty_cp_open_effect', true ));
	$cffect = explode("-", get_post_meta( $id, 'enoty_cp_close_effect', true )); 
	
	ob_start(); ?>
    
	<script type="text/javascript">
	jQuery(document).ready(function($) {
		
		function easynotify_notify_loader() {
				var notydata = {
				action: "easynotify_ajax_content",
				security: "<?php echo wp_create_nonce( "easynotify-nonce"); ?>",	
				notyid: <?php echo $id; ?>
				};
			
				jQuery.post("<?php echo admin_url('admin-ajax.php'); ?>", notydata, function(response) {
					jQuery('#noty-<?php echo $id; ?>').append(response);
					
					var timerId;
					if(timerId != undefined){clearInterval(timerId);}
 					timerId =  setInterval(function (){
					jQuery('#launcher-<?php echo $id; ?>').easynotify({
						type: 'inline',
						maxWidth: '100%',
						width: '<?php echo get_post_meta( $id, 'enoty_cp_thumbsize_tw', true ); ?>',
						height: '<?php echo get_post_meta( $id, 'enoty_cp_thumbsize_th', true ); ?>',
						padding : 0,
						margin: [60, 60, 60, 60],
						modal: false,
						hideLoading	: true,
						openSpeed: 500,
						closeSpeed: 500,
						openEffect: '<?php echo $offect[1]; ?>', 
						closeEffect: '<?php echo $cffect[1]; ?>',
						autoSize: false,
						fitToView: false,
						scrolling: 'no',
						keys : {
							 close  : null
							 },
						helpers: {
							overlay : {
								closeClick : false,
								locked : false
								}
							}, 
						tpl: { /* Use this to change Notify skin*/
							wrap:'<div class="enotybox-wrap"><div class="enotybox-skin enoty-custom-wrapper"><div class="enotybox-outer"><div class="enotybox-inner"></div></div><div class="isribbon enoty-ribbon-<?php echo get_post_meta( $id, 'enoty_cp_ribbon', true ); ?>"><?php switch	( trim( get_post_meta( $id, 'enoty_cp_ribbon_container', true ) ) ) {
							
							case 'socialbutton':
							
								easynotify_share_generator( $id, urlencode( $_SERVER['HTTP_REFERER'] ), $metaval = null );
							
								break;	
							
							case 'optin':
							
								easynotify_optin_generator( $id );		
							
								break;	
							
							case 'button':
							
								easynotify_custom_button_generator( $id );
							
								break;	
							
							default:
								break;	
						} ?></div><?php easynotify_generate_footer_note( $id ); ?></div></div>'
							},
						afterLoad: function(){
							    clearInterval(timerId); // clear interval... it is 
								}
						}).trigger("click");
						}, <?php echo get_post_meta( $id, 'enoty_cp_notify_delay', true ); ?>000);
				});
			}
				
			// COOKIE CONFIG
			var check_cookie = jQuery.cookie('notify-<?php echo $id; ?>');
			var ex_cookie = <?php echo get_post_meta( $id, 'enoty_cp_cookies', true ); ?>;
			if (check_cookie == null || ex_cookie == '-1') {
				easynotify_notify_loader();
					}  <?php $ckonset = get_post_meta( $id, 'enoty_cp_cookies', true ); if ( $ckonset != '-1' || $ckonset != '0' ) { ?>
					jQuery.cookie('notify-<?php echo $id; ?>', 'true', {
					expires: <?php echo get_post_meta( $id, 'enoty_cp_cookies', true ); ?>,
					path: '/' 
					}); <?php } ?>
			});
</script>

<?php

$contnt = ob_get_clean();
echo $contnt;  

}


/*-------------------------------------------------------------------------------*/
/* Check License Status
/*-------------------------------------------------------------------------------*/
function easynotify_front_license_notify() {
	echo '<div class="enoty-wrapper">
				<div class="noty-content-wrap">
				<div class="noty-content-center">
				<div class="noty-popup-content" style="font-size:'.$data['maincontentfont'].' !important; color:'.$data['maincontentcol'].' !important;"><div class="enoty-license-logo-front"><img class="enotylicensekey" src="'.plugins_url( "images/key2-32x32.png" , dirname('index.php') ).'" width="32" height="32" alt="Activate License Key" /><span class="enotyactivatecheck">Please activate <strong>'.ENOTIFY_NAME.'</strong> licence key. You can activate <a href="'.admin_url( 'edit.php?post_type=easynotify&page=enoty-activation' ).'">'.__('here', 'easynotify').'</a></span></div></div>';
				echo '</div></div></div>';
	
}


/*-------------------------------------------------------------------------------*/
/* Generate Notify Content
/*-------------------------------------------------------------------------------*/
function easynotify_ajax_content() {
		
		if ( !isset( $_POST['notyid'] ) || !isset( $_POST['security'] ) ) {
			die;
		}
		
		else {
			
			check_ajax_referer( 'easynotify-nonce', 'security' );
			$lyot = get_post_meta( $_POST['notyid'], 'enoty_cp_layoutmode', true );
			$layout = preg_replace('/\.[^.\s]{3,4}$/', '', $lyot);
			
			if ( $layout ) {
				include_once( ENOTIFY_DIR . '/layouts/'.str_replace('_', '-', $layout ).'.php' );
				$layoutfunc = $layout;
			}

			ob_start();
			
			if ( easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', 'invalid'  ) == 'invalid' ) {

easynotify_front_license_notify();
	} else {
			
			$layoutfunc( $_POST['notyid'] );
	}
			
			$contnt = ob_get_clean();
			echo $contnt; 
			die;		
	
		}

	}


/*-------------------------------------------------------------------------------*/
/*  Get WP Info
/*-------------------------------------------------------------------------------*/
$easymemory = (int) ini_get('memory_limit');
$easymemory = empty($easymemory) ? __('N/A') : $easymemory . __(' MB');

function easynotify_get_wpinfo() {
	
// Get Site URL	
$getwpinfo = array();
$getwpinfo[0] = "- Site URL : " .get_site_url();

// Get Multisite status
if ( is_multisite() ) { $getwpinfo[1] = '- WP Multisite : YES'; } else { $getwpinfo[1] = '- WP Multisite : NO'; }

global $wp_version, $easymemory;		
echo "- WP Version : ".$wp_version."
";	
echo $getwpinfo[0]."
";
echo $getwpinfo[1]."
";
echo "- Memory Limit : ".$easymemory."
";
$theme_name = wp_get_theme();
echo "- Active Theme : ".$theme_name->get('Name')."
";
echo "- Active Plugins : 
";

// Get Active Plugin
if ( is_multisite() ) { 
	$the_plugs = get_site_option('active_sitewide_plugins');
	foreach($the_plugs as $key => $value) {
		$string = explode('/',$key);
		$string[0] = str_replace( "-"," ",$string[0] );
        echo " &nbsp;&nbsp;&nbsp;&nbsp;".ucwords( $string[0] ) ."
";
	}
} else {
	$the_plugs = get_option('active_plugins');
	foreach($the_plugs as $key => $value) {
		$string = explode('/',$value);
		$string[0] = str_replace( "-"," ",$string[0] );
        echo " &nbsp;&nbsp;&nbsp;&nbsp;".ucwords( $string[0] ) ."
";
		}
	}
}


/*-------------------------------------------------------------------------------*/
/*  AJAX RESET SETTINGS
/*-------------------------------------------------------------------------------*/
function easynotify_cp_reset() {
	
	check_ajax_referer( 'easynotify-nonce', 'security' );
	
	if ( !isset( $_POST['cmd'] ) ) {
		echo '0';
		die;
		}
		
		else {
			if ( $_POST['cmd'] == 'reset' ){
				echo '1';
				easynotify_restore_to_default($_POST['cmd']);			
				die;
				}
	}
}
add_action( 'wp_ajax_easynotify_cp_reset', 'easynotify_cp_reset' );


/*-------------------------------------------------------------------------------*/
/*  Clear Cookies from Notify List
/*-------------------------------------------------------------------------------*/
function easynotify_enqueue_script_on_notify_list( ) {
		
		global $post_type;
		
		    if( 'easynotify' == $post_type ) {
				wp_enqueue_script( 'enoty-cookie' );
				wp_enqueue_style( 'enoty-admin-styles', plugins_url('../css/admin.css' , 'index.php' ) );

				
				?>
                <script type="text/javascript">
				jQuery(document).ready(function($) { 
					jQuery('.resetcookie').bind('click', function() {
						jQuery.removeCookie(jQuery(this).attr('id'), { path: '/' }); 
						alert("Successfully cleared this Notify cookies!");						
						});
                
				    });
                    </script>
				<?php
		}
				
}

if (is_admin()) {
	add_action( 'admin_head', 'easynotify_enqueue_script_on_notify_list' );
	}


/*-------------------------------------------------------------------------------*/
/*  Create Preview Metabox
/*-------------------------------------------------------------------------------*/
function easynotify_preview_metabox () {
	$enotyprev = '<div style="text-align:center;">';
	$enotyprev .= '<img id="preview-notify" style="cursor:pointer;" src="'.plugins_url( 'images/preview.png' , dirname('index.php') ).'" width="65" height="65" alt="Preview" >';
	$enotyprev .= '</div>';
echo $enotyprev;	
}


/*-------------------------------------------------------------------------------*/
/*  Create Preview ( AJAX )
/*-------------------------------------------------------------------------------*/
function easynotify_generate_preview () {
	
	if ( !isset( $_POST['post_ID'] ) && !isset( $_GET['noty_id'] )) {
		echo 'Failed to generate Preview! Please try again.';
		die;
		}
		
		$theval = array();
		$allval = array();
		
		if ( isset( $_POST['post_ID'] ) ) {
			
			$thepost = intval( $_POST['post_ID'] );
			
			$_POST['enoty_meta'] = stripslashes_deep( $_POST['enoty_meta'] );
			
			 foreach ((array) $_POST['enoty_meta'] as $k => $v){
				 $allval[$k] = $v;
				 }
					easynotify_preview( $thepost, $allval );
				}
				
			elseif ( isset( $_GET['noty_id'] ) && easynotify_post_exists( intval( $_GET['noty_id'] ) ) ) {
								
				$thepost = intval( $_GET['noty_id'] );

				foreach ( get_post_meta( $_GET['noty_id'] ) as $k => $v){
					$theval[$k] = $v;
					
					foreach ( $theval as $k => $v){
						$tmp = get_post_meta( $_GET['noty_id'], $k, true );
						$allval[$k] = $tmp;
						}
					}

					easynotify_preview( $thepost, $allval );

				} else {
					die('Ooops!');
					}

		die('');
		
}
add_action('wp_ajax_easynotify_generate_preview', 'easynotify_generate_preview');


/*-------------------------------------------------------------------------------*/
/*  If Post/Page Exist
/*-------------------------------------------------------------------------------*/
function easynotify_post_exists( $id ) {
	return is_string( get_post_status( $id ) );
}

	
/*-------------------------------------------------------------------------------*/
/*  Slug to Name
/*-------------------------------------------------------------------------------*/
function easynotify_slug_to_name($slug) {
	$vals = array(
				"optin"=> "Opt-in ( Subscribe Form )",
				"socialbutton"=> "Social Sharing Buttons",
				"button"=> "Custom Text & Button",
				"none"=> "Disabled",
				"" => "None"
		);
	return $vals[$slug];	
}

	
/*-------------------------------------------------------------------------------*/
/*  Generate Notify Footer
/*-------------------------------------------------------------------------------*/	
function easynotify_generate_footer_note( $id, $val = null, $type = null ) {
	
			$getdata = array( 'pnote', 'ribboncnt' );
			$data = easynotify_loader( $getdata, $id, $val, $type );
	
	if ( $data['ribboncnt'] == 'optin' && $data['pnote'] != '' ){ 
		echo'<div class="enoty-footer"><span class="enoty-privacy">'.addslashes( $data['pnote'] ).'</span></div>';
	}
}


/*-------------------------------------------------------------------------------*/
/*  Apply Individual Layout & Styles
/*-------------------------------------------------------------------------------*/	
function easynotify_apply_layout_style( $layout ) {
	wp_enqueue_style( 'enoty_enotybox_layout_'.$layout.'', ENOTIFY_URL .'/css/layouts/'.$layout.'.css' );
}

function easynotify_dynamic_styles( $id, $val = '', $type = '' ) {
	
			$getdata = array( 'pattern', 'overlaycol', 'overlayopct', 'notybgtype', 'notybgfrom', 'notybgto', 'closeicon', 'cusbtnfrom', 'cusbtnto', 'cusbtncol', 'cusbtnsize', 'optbtnfrom', 'optbtnto', 'optbtncol', 'optbtnsize', 'ribboncnt', 'headerback', 'sharepos', 'isgp', 'iseml', 'isfb', 'istwt', 'ispin' );
			$data = easynotify_loader( $getdata, $id, $val, $type );

  			$pattopctymz = $data['overlayopct'] / 100;
			$headertype = explode("-", $data['notybgtype'] );
			

  echo '
       <style type="text/css">
            .enoty-enotybox-overlay {
				background: url('.ENOTIFY_URL.'/css/images/patterns/'.$data['pattern'].') !important; background-repeat: repeat;
				background-color:'.$data['overlaycol'].' !important;
				filter: alpha(opacity='.$data['overlayopct'].');
   				filter: progid:DXImageTransform.Microsoft.Alpha(opacity='.$data['overlayopct'].');
   				opacity:'.$pattopctymz.';
   				-moz-opacity:'.$pattopctymz.'0; 
				}
			.enoty-custom-wrapper {
		  		background: '.$data['notybgto'].';
				'.( $headertype[1] == 'linear' ? '
 				background-image: -webkit-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
 				background-image: -moz-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
  				background-image: -ms-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
  				background-image: -o-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
  				background-image: linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);

				' : '
		  		background-image: -moz-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
		  		background-image: -webkit-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
		  		background-image: -o-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
		 		background-image: -ms-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
		  		background-image: radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
				' ).'
			}
			
			'.( $data['closeicon'] != 'default' ? '.enotybox-close {
    			width: 20px;
    			height: 20px;
    			top: -9px;
    			right: -9px;
    			background: url("'.ENOTIFY_URL.'/css/assets/images/close/'.$data['closeicon'].'") repeat scroll 0% 0% transparent;
				}' : '' ).'

			.noty-text-header {
				background: '.$data['headerback'].'; 
			}
			
			.social-container {
				text-align: '.$data['sharepos'].'; 
			}
			
			.bottom-shadow {
    			width: 100%;
    			box-shadow: 0 3px 8px -2px '.$data['notybgfrom'].';
    			-moz-box-shadow: 0 3px 8px -2px '.$data['notybgfrom'].';
    			-webkit-box-shadow: 0 3px 8px -2px '.$data['notybgfrom'].';
			}
			
			'.( $data['isfb'] !='on' && $data['istwt'] !='on' && $data['ispin'] !='on' && $data['isgp'] !='on' && $data['iseml'] !='on' && $data['ribboncnt'] == 'socialbutton' ? '
			.isribbon {
				display: none;
			}' : '').'
			
			'.( $data['ribboncnt'] == 'button' ? '
			.enoty-custom-button {
				background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['cusbtnfrom'].'), color-stop(1, '.$data['cusbtnto'].') );
				background:-moz-linear-gradient( center top, '.$data['cusbtnfrom'].' 5%, '.$data['cusbtnto'].' 100% );
				filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['cusbtnfrom'].'", endColorstr="'.$data['cusbtnto'].'");
				background-color:'.$data['cusbtnfrom'].';
				border:1px solid '.$data['cusbtnfrom'].';
				color:'.$data['cusbtncol'].';
				font-size:'.$data['cusbtnsize'].';
			}
			
			.enoty-custom-button:hover {
				background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['cusbtnto'].'), color-stop(1, '.$data['cusbtnfrom'].') );
				background:-moz-linear-gradient( center top, '.$data['cusbtnto'].' 5%, '.$data['cusbtnfrom'].' 100% );
				filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['cusbtnto'].'", endColorstr="'.$data['cusbtnfrom'].'");
				background-color:'.$data['cusbtnto'].';
				color: '.$data['cusbtncol'].';
			}' : '').'
			
			'.( $data['ribboncnt'] == 'optin' ? '
			.enoty-optin-button {
				background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['optbtnfrom'].'), color-stop(1, '.$data['optbtnto'].') );
				background:-moz-linear-gradient( center top, '.$data['optbtnfrom'].' 5%, '.$data['optbtnto'].' 100% );
				filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['optbtnfrom'].'", endColorstr="'.$data['optbtnto'].'");
				background-color:'.$data['optbtnfrom'].';
				border:1px solid '.$data['optbtnfrom'].';
				color:'.$data['optbtncol'].';
				font-size:'.$data['optbtnsize'].';
			}
			
			.enoty-optin-button:hover {
				background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['optbtnto'].'), color-stop(1, '.$data['optbtnfrom'].') );
				background:-moz-linear-gradient( center top, '.$data['optbtnto'].' 5%, '.$data['optbtnfrom'].' 100% );
				filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['optbtnto'].'", endColorstr="'.$data['optbtnfrom'].'");
				background-color:'.$data['optbtnto'].';
				color: '.$data['optbtncol'].';
			}' : '').'
			
			a.enoty-optin-button, a.enoty-custom-button {
				color: '.$data['optbtncol'].' !important;
				}
				
			'.( trim( $data['ribboncnt'] ) == 'none' ? '	
			.isribbon {
				display: none !important;
				}' : '').'
				
       </style>
    ';
}


/*-------------------------------------------------------------------------------*/
/*  Get Plugin Version (@return string Plugin version)
/*-------------------------------------------------------------------------------*/
function easynotify_get_plugin_version() {
    $plugin_data = get_plugin_data( ENOTIFY_DIR . '/easy-notify-pro.php' );
    $plugin_version = $plugin_data['Version'];
    return $plugin_version;
}


/*-------------------------------------------------------------------------------*/
/*   Activation Page
/*-------------------------------------------------------------------------------*/
function easynotify_create_activate_page() {
    $easynotify_docs_page = add_submenu_page('edit.php?post_type=easynotify', 'License Manager', __('License Manager', 'easynotify'), 'edit_posts', 'enoty-activation', 'easynotify_easymedia_license');
}

function easynotify_easymedia_license() {
		
	$license = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key', '' );	
	$status = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', 'invalid'  );	
	
	?>
    <div class="wrap">
    <div id="enoty-license-logo">
        	<img style="width:32px;height:32px;vertical-align:middle; margin-right:10px;" src="<?php echo plugins_url( 'images/key2-32x32.png' , dirname('index.php') ) ;?>" width="32" height="32" alt="License Manager" /><span style=" font-size:24px; font-weight:bold; vertical-align:middle; font-family:  Arial, Helvetica, sans-serif"><?php _e('License Manager', 'easynotify'); ?></span>
            </div>
               
	<?php  
				if ( false === $cache = get_transient( 'enoty_admin_notice' ) ) {
						echo '<p>'._e('<div class="error" style="padding:5px;padding-left:15px;">ATTENTION :<br />You can activate the license key on localhost or temporary site if you are really need for development of the website<br /><span style="color: red; font-weight: bold; font-style: italic;">BUT PLEASE DO NOT FORGET TO DEACTIVATE THE LICENSE WHEN YOU\'RE DONE</span> before you activate it in your live site.</div>', 'easynotify').'</p>';
					} else {
						echo $cache;
						}
	
	?>
                
                
		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'Activation Form', 'easynotify' ); ?></h3>
                <div id="easymedia_docsq" style="padding-left:10px !important;">
                
	<div class="wrap">
		<form method="post">
		
			<?php settings_fields('enoty_license_field'); ?>
			
			<table class="form-table enoty-val">
				<tbody>
					<tr valign="top">	
						<th scope="row" valign="top">
							<?php _e('License Key'); ?>
						</th>
						<td>
                        	<?php if( $status !== false ) {
								
								switch ( $status ) {
									case 'valid':
										$inputstts = 'valid-license';
										$an = 'style="display: none;"';
										$ab = '';
										$ac = 'style="display: none;"';
										$aa = 'style="display: none;"';
									
									break;
									
									case 'invalid':
										$inputstts = 'invalid-license';
										$an = ''; 
										$ab = 'style="display:none;"';
										$ac = 'style="display:none;"';
										$aa = 'style="display: none;"';
									
									break;
									
									case 'expired':
										$inputstts = 'expired-license';
										$an = 'style="display:none;"';
										$ab = 'style="display:none;"';
										$ac = '';
										$aa = '';
									
									break;
									
								default:
								break;	
								}		
										?>
							<div class="enotyisleft1"><input <?php //echo $ac; ?> id="enoty_license_key" name="enoty_license_key" type="text" class="enoty-input <?php echo $inputstts ?>" value="<?php esc_attr_e( $license ); ?>" />

                                
   <input type="button" id="btnactvte" <?php echo $an; ?> class="button-secondary enoty-license-caller" name="enoty_license_activate" value="<?php _e('Activate License'); ?>"/>
   <input type="button" id="btndeactvte" <?php echo $ab; ?> class="button-secondary enoty-license-caller" name="enoty_license_deactivate" value="<?php _e('Deactivate License'); ?>"/>
   <input type="button" disabled="disabled" id="btnexpired" <?php echo $ac; ?> class="button-secondary" name="enoty_license_expired" value="<?php _e('Locked ( Expired )'); ?>"/>   
					<?php
                    
					} ?>
                            </div>
                            <div class="enotyisleft2"><label class="enotylicenseinfo"></label></div>
                            <div class="enotyisleft3" <?php echo $aa; ?>><label class="enotylicexinfo"><?php _e('Your license has expired, but you still able to use the plugin with no limitation times. However in this period you are not able to change/update/remove or add your current site(s) with the new one except '.easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_limit', '@' ).' site(s) that have been registered before. The license only work for activation purpose. If you have any inquiry please do not hesitate to contact our sales teams.'); ?></label></div>                       
						</td>
					</tr>
				</tbody>
			</table>
            <br /><br />	
		</form>
    				</div>
    		</div>     
		</div>  
        
  		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'License Information', 'easynotify' ); ?></h3>
        <div id="easymedia_docs2" style="padding-left:10px !important;">
<table class="enoty-bordered">
    <thead>

    <tr>
        <th>#</th>        
        <th>Details</th>
    </tr>
    </thead>
    <tr>
        <td>Owner</td>        
        <td><span id="enoty-lo"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_owner', 'none' ); ?></span></td>
    </tr>        
    <tr>
        <td>Email</td>         
        <td><span id="enoty-leml"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_email', 'none' ); ?></span></td>
    </tr>
    <tr>

        <td>Product Name</td>         
        <td><span id="enoty-pname"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_product', 'none' ); ?></span></td>
    </tr>    
    <tr>
        <td class="enotyliconly">License Key</td> 
        <td class="enotyliconly"><span id="enoty-lkey" style="color:grey; font-weight:bold;"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key', 'none' ); ?></span></td>
    </tr>
    <tr>
        <td>License Status</td> 
        <td><span id="enoty-lsts"><?php echo easynotify_convert_lic_status(easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', '' )); ?></span></td>
    </tr>   
    <tr>
        <td>License Limit</td> 
        <td><span id="enoty-llim"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_limit', 'none' ); ?></span></td>
    </tr>
    <tr>
        <td>Site Count</td> 
        <td><span id="enoty-lusg"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_usage', 'none' ); ?></span><span id="enoty-scountreload" class="enoty-license-caller" <?php echo $ab; ?>>Refresh</span></td>
    </tr>    
    <tr>

        <td>Expires Date</td>
		<?php if (easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_expire', '' ) != '' ) {
			$phpdate = strtotime( easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_expire', '' ) );
			$newate = date( 'M d, Y', $phpdate );
			}
		else {
			$newate = 'none';
			}
		?> 
        <td><span id="enoty-lexpr"><?php echo $newate; ?></span></td>
    </tr>


</table>

    </div>
    </div>    

  </div>       
        
        
        
 </div>  
	<?php 
	
	if (is_admin() && easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status' ) != 'expired' ) {
	add_action('admin_footer', 'enoty_include_js' );
}
}

function easynotify_register_option() {
	// creates our settings in the options table
	register_setting('enoty_license_field', 'enotypro_license_info', 'easynotify_sanitize_license' );
}
add_action('admin_init', 'easynotify_register_option');

function easynotify_sanitize_license( $new ) {
	
	$old = trim( easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key' ), false );	
	
	if( $old && $old != $new ) {
		
			enoty_del_lic_option( 'enotypro_license_info', 'enoty_license_status' );
	}
	return $new;
} 




/*******************************************************
* Illustrates how to activate license via AJAX call
* v.1.3
*******************************************************/
function enoty_include_js() {
?>
<script type="text/javascript">
	jQuery(document).ready(function() {
		var currentclass; var timer;	 	

		jQuery('.enoty-license-caller').bind('click', function() {
			window.clearTimeout(timer);
			currentclass = jQuery('#enoty_license_key').attr("class");
			jQuery('.enotylicenseinfo').text("");
		   if( jQuery('#enoty_license_key').val() == ''){
			   alert('Input can not be left blank');
			   return false;
			   }
			   	jQuery(this).attr('disabled','disabled');
				jQuery('.enotylicenseinfo').removeClass('enotyactinvalid enotyactvalid enotyactvalidex');
				jQuery('#enoty_license_key').removeClass('valid-license invalid-license').addClass('enoty-act-loading');
				
			switch (jQuery(this).attr('id')) {	
					case 'btnactvte':
					var cmd = 'validate';
					easynotify_ajax_validation(cmd);
					break;
					
					case 'btndeactvte':
					var cmd = 'deactivate';
					easynotify_ajax_validation(cmd);
					break;	
					
					case 'enoty-scountreload':
					var cmd = 'reload';
					easynotify_ajax_validation(cmd);
					break;					
									
					default:
			}
	});
	
			function easynotify_ajax_validation(cmd) {
				var data = {
				action: 'easynotify_ajax_validation',
				security: '<?php echo wp_create_nonce( "easymedia-pro-nonce"); ?>',	
				lkey: jQuery('#enoty_license_key').val(),				
				cmd: cmd,
				};
			
				jQuery.post(ajaxurl, data, function(response) {
					var json = jQuery.parseJSON(response);
					console.log(response);
					
					try {
						
						var obj = jQuery.parseJSON(json.ldata);
							jQuery('#enoty-lo').text(obj[0].customer_name);
							jQuery('#enoty-leml').text(obj[0].customer_email);
							jQuery('#enoty-pname').text(obj[0].item_name);
							jQuery('#enoty-lkey').text(jQuery('#enoty_license_key').val());
							jQuery('#enoty-llim').text(obj[0].license_limit);
							jQuery('#enoty-lusg').text(obj[0].site_count);
							jQuery('#enoty-lsts').text(obj[0].license);							
							jQuery('#enoty-lexpr').text(obj[0].expires);
							var infotxt = jQuery(".enotylicexinfo").text();
							jQuery('#enoty-scountreload').text("Refresh");
							infotxt = infotxt.replace("@", obj[0].license_limit);
							jQuery(".enotylicexinfo").text(infotxt);
						}
						catch (err) {
							
							}

					
					switch (json.button_class) {
						
						case 'actode':
						jQuery('#btnactvte').hide();
						jQuery('#btndeactvte').fadeIn('slow');
						//jQuery('#enoty_license_key').attr('readonly','readonly');
						break;
						
						case 'detoact':
						//jQuery('#enoty_license_key').removeAttr('readonly');
						jQuery('#btndeactvte').hide();
						jQuery('#btnactvte').fadeIn('slow');
						jQuery('#enoty_license_key').val("");
						jQuery(".enoty-bordered").find("span").text("none");
						jQuery("#enoty-scountreload").text("");
						break;	
						
						case 'expired':
						//jQuery('#enoty_license_key').removeAttr('readonly');
						jQuery('#btndeactvte, #btnactvte').hide();
						jQuery('#btnexpired').fadeIn('slow');
						break;											
						
						default:
					}											
						jQuery('#btnactvte, #btndeactvte').removeAttr('disabled');
						jQuery('#enoty_license_key').removeClass('enoty-act-loading').addClass(json.textbox_class);
						jQuery('.enotylicenseinfo').addClass(json.message_class).text(json.message).fadeIn('slow', function() {
							timer = window.setTimeout(function() { jQuery('.enotylicenseinfo').fadeOut('slow');
									if (json.button_class == 'expired' ) {
										jQuery('.enotyisleft3').fadeIn('slow');
										}
							 }, 6000);
							});					
					});
			}	
});	


</script>
<?php	
	
	
}

/*
|--------------------------------------------------------------------------
| AJAX VALIDATION
|--------------------------------------------------------------------------
*/
function easynotify_ajax_validation() {
	
	global $enotyapi_params;
	
	check_ajax_referer( 'easymedia-pro-nonce', 'security' );
	
	if ( !isset( $_POST['cmd'] ) || !isset( $_POST['lkey'] )) {
		echo '0';
		die;
		}
		
		else {
			
			switch ( trim( $_POST['cmd'] ) ) {
				
				case 'validate':
								
								$license_data = _enotyFetchmode( $enotyapi_params, true, 'check_license', $_POST['lkey'] );								
				
								switch ( trim($license_data->license) ) {
							
								case 'inactive': // Must activate the license and return to other logic
									
									$license_data = _enotyFetchmode( $enotyapi_params, true, 'activate_license', $_POST['lkey'] );
							
									if (trim($license_data->success) == true) {
									
										easynotify_update_license_option($license_data, false);																			
										
										easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->success), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalid", "valid-license", "actode", true );										
										
										
										}
										else {	
			
										
										if ( trim($license_data->error == 'revoked' ) ) {
											
											easynotify_encode_user_data( "", trim($license_data->success), "Your License has been revoked. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );	
											
											} else {
												
												easynotify_encode_user_data( "", trim($license_data->success), " ".home_url(). " is unauthorized with the license key. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );	
												
												}
																											
											
											}							

								die;
								break;
										
								case 'site_inactive': // This response if license valid but the site is not authorize
									
									$license_data = _enotyFetchmode( $enotyapi_params, true, 'activate_license', $_POST['lkey'] );
									
									if (trim($license_data->success) == true) {
										
										easynotify_update_license_option($license_data, false);
										
										easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->success), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalid", "valid-license", "actode", true );										
										

										}
										else
										{
											
										if ( trim($license_data->error == 'revoked' ) ) {
											
											easynotify_encode_user_data( "", trim($license_data->success), "Your License has been revoked. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );	
											
											} else {
												
												easynotify_encode_user_data( "", trim($license_data->success), " ".home_url(). " is unauthorized with the license key. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );	
												
												}									
											
											}	

								die;
								break;	
		
								case 'valid': // Site is authorize and the license is valid
								
										easynotify_update_license_option($license_data, false);
										
										easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalid", "valid-license", "actode", true );										

								die;
								break;		
	
								case 'invalid': // License is invalid and will bypass all other logic

										easynotify_encode_user_data( "", trim($license_data->license), "The license key ".$_POST['lkey']." is NOT valid.", "enotyactinvalid", "invalid-license", "", true );										
																		
											
					
								die;
								break;	
		
								case 'expired': // License is invalid and will bypass all other logic
								
								if ( trim($license_data->is_listed_site == true )) {
									
										easynotify_update_license_option($license_data, true);
										
										easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalidex", "expired-license", "expired", true );
									
								} else {
									
									easynotify_encode_user_data( "", trim($license_data->license), "The license key ".$_POST['lkey']." has expired. You have to renew it in order to continue receiving updates and support.", "enotyactinvalid", "invalid-license", "", true );										
									
								}									

								//echo implode( ",", array( trim($license_data->license), "", "", "") );	
					
								die;
								break;			
				
								case 'disabled': // License is disabled by server and will bypass all other logic

								//echo implode( ",", array( trim($license_data->license), "", "", "") );	
					
								die;
								break;
							
							
								default:
								die;

								break;
							}

				
					die;
					break;	

			
				case 'activate':
				
				die;
				break;	
				
				case 'reload':
				
					$license_data = _enotyFetchmode( $enotyapi_params, true, 'check_license', $_POST['lkey'] );
				
					switch ( trim($license_data->license) ) {
						
								case 'valid': // Site is authorize and the license is valid
								
										easynotify_update_license_option($license_data, false);
										
										easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "", "enotyactvalid", "valid-license", "actode", true );										

								die;
								break;	
								
								case 'expired':
								
								if ( trim($license_data->is_listed_site == true )) {
									
										easynotify_update_license_option($license_data, true);
										
										easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "enotyactvalidex", "expired-license", "expired", true );
									
								} else {
									
									easynotify_encode_user_data( "", trim($license_data->license), "", "enotyactinvalid", "invalid-license", "", true );									
									
								}
					
								die;
								break;	
																
								case 'site_inactive': // License is invalid and will bypass all other logic

										easynotify_encode_user_data( "", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "enotyactinvalid", "invalid-license", "", true );										
					
								die;
								break;						
								
								default:
								die;
								break;
						}
				
				die;
				break;							
	
				case 'deactivate':
				
				$license_data = _enotyFetchmode( $enotyapi_params, true, 'deactivate_license', $_POST['lkey'] );

				// $license_data->license will be either "deactivated" or "failed"
				if( $license_data->license == 'deactivated' ){
								
					delete_option( 'enotypro_license_info' );	
					
					easynotify_encode_user_data( "", trim($license_data->license), "Your license [ ".$_POST['lkey']." ] successfully ".trim($license_data->license).".", "enotyactinvalid", "invalid-license", "detoact", true );
						
				} 
					else {
						
					easynotify_encode_user_data( "", trim($license_data->license), "Deactivate failed. Please try again and make sure to fill correct license key.", "enotyactinvalid", "invalid-license", "", true );							
		
					}
				die;
				break;
				
				default:
				die;
				break;			

		}
	}
}
add_action( 'wp_ajax_easynotify_ajax_validation', 'easynotify_ajax_validation' );

function easynotify_get_lic_option($option_name, $key, $default = false) {
	$options = get_option( $option_name );

	if ( $options ) {
		return (array_key_exists( $key, $options )) ? $options[$key] : $default;
	}

	return $default;
}

function enoty_del_lic_option($option_name, $key) {
	$options = get_option( $option_name );


}

function easynotify_update_license_option($license_data, $forstatus = false ) {
	
	if ( $forstatus === false ) {
		$finstatus = trim($license_data->license);
		} else {
			$finstatus = 'expired';			
		}
	
	$licval = array(
	"enoty_license_status" => $finstatus,
	"enoty_license_key" => trim($_POST['lkey']),
	"enoty_license_owner" => trim($license_data->customer_name),
	"enoty_license_email" => trim($license_data->customer_email),
	"enoty_license_product" => trim($license_data->item_name),
	"enoty_license_limit" => trim($license_data->license_limit),
	"enoty_license_usage" => trim($license_data->site_count),
	"enoty_license_expire" => trim($license_data->expires)
		);
		
		update_option('enotypro_license_info', $licval);	
			
}


/**********************************************
* this how we activate a license key
***********************************************/

/*
|--------------------------------------------------------------------------
| Check if curl is enabled or disabled
|--------------------------------------------------------------------------
*/
function _enotyFetchmode( $enotyapi_params, $thekey = false, $action, $license ){
	
	$enotyapi_params = array(
	'edd_action'=> $action,
	'license' 	=> $license,
	'item_name' => urlencode( ENP_ITEM_NAME ) // the name of our product in EDD	
		);	
	
	if ( $thekey == true ) {
		$arrurl = array(
		"url" => get_site_url()
		);
		$enotyapi_params = array_merge($enotyapi_params, $arrurl);
	}	
	
    if(function_exists('curl_version')){
		
		$response = wp_remote_get( add_query_arg( $enotyapi_params, ENP_STORE_URLCURL ), array( 'timeout' => 15, 'sslverify' => false ) );
		
		if ( is_wp_error( $response ) )
			return false;

			$cdata = json_decode( wp_remote_retrieve_body( $response ) );
			
			}
  				else {

					$json_url = add_query_arg( $enotyapi_params, ENP_STORE_URL );
					$json = file_get_contents( $json_url );
					
						if ( is_wp_error( $json_url ) )
							return false;

							$cdata = json_decode( $json );		
					}							
						
		return $cdata;	
}

/************************************
* this how we check 
* a license key
*************************************/
function easynotify_check_license() {
global $enotyapi_params;
	$lic = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key', '' );	

	if ( $lic ) {
		$license = $lic;
	} else {
		$license = '1234567890';	
	}
		
	$license_data = _enotyFetchmode( $enotyapi_params, true, 'check_license', $license );		
	
	// Start Check License Here

	switch ( trim($license_data->license) ) {
		
		//This API request use license parameter
		
		
		case 'inactive': // Must activate the license and return to other logic
		
			enotypro_cleanup_license_data('invalid', $license_data->error);
		
		break;
		
		case 'site_inactive': // This response if licensi valid but the site is not authorize
		
			enotypro_cleanup_license_data('invalid', $license_data->error);
		
		break;		
		
		case 'valid': // Site is authorize and the license is valid
			
			$statusnow = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', 'invalid'  );	
			
			if ( $statusnow == 'expired' ) {
				enotypro_cleanup_license_data('valid', $license_data->error);
				}
				
		break;		
	
		case 'invalid': // License is invalid and will bypass all other logic
			
			 enotypro_cleanup_license_data('invalid', $license_data->error);
		
		break;	
		
		case 'expired': // License is invalid and will bypass all other logic

			 //enotypro_cleanup_license_data('invalid', $license_data->error);
			 		
		break;			
				
		case 'disabled': // License is disabled by server and will bypass all other logic
			 enotypro_cleanup_license_data('invalid', $license_data->error);
			 
		break;		
		
		
		
		default:
		break;
		
		
	}

// END	
	return;

}

function enotypro_cleanup_license_data($status, $error) {
			delete_option( 'enotypro_license_info' );
			$enotydat = get_option('enotypro_license_info');
			$enotydat['enoty_license_status'] = trim($status);
			update_option('enotypro_license_info', $enotydat);
			
			// STOP CRON CHECK
			enoty_clear_scheduled_hook();
			
			if ( trim( $error == 'revoked' ) ) {
				
				if ( false === ( $cache = get_transient( 'enoty_admin_notice' ) ) ) {
					
					set_transient( 'enoty_admin_notice', '<div class="error"><p>Your License has been revoked. Please contact us for more info.</p></div>', 60 );
					}
				}
			
			wp_redirect("edit.php?post_type=easynotify&page=enoty-activation");
}

function easynotify_convert_lic_status($licsts) {
	
	switch ($licsts) {
		case 'valid';
		echo '<span =id="enoty-lsts" style=color:green; font-weight:bold;">'.strtoupper($licsts).'</span>';
		
		break;
		
		case 'expired';
		echo '<span =id="enoty-lsts" style=color:red; font-weight:bold;">'.strtoupper($licsts).'</span>';
				
		break;
		
		
	default:
			echo '<span =id="enoty-lsts" style=color:grey; font-weight:bold;">none</span>';
	break;	
	}

	
	return;
	
}

function easynotify_encode_user_data( $ldata, $response, $message, $message_class, $textbox_class, $button_class, $cond = false ) {
	
		if ( $cond == true ) {
			
			$sendtousr = array(
			"ldata" => $ldata,
			"response" =>  $response,
			"message" => $message,
			"message_class" => $message_class,
			"textbox_class" =>  $textbox_class,
			"button_class" => $button_class
				);
				
			if ( $textbox_class != 'invalid-license' ) {
					
				// STOP & START CRON CHECK
				enoty_clear_scheduled_hook();
				enoty_start_schedule_event();
				}
			
			} else {
				
				$sendtousr = array(
				"ldata" => "",
				"response" => "unknow",
				"message" => "Failed",
				"message_class" => "enotyactinvalid",
				"textbox_class" =>  "invalid-license",
				"button_class" => ""
				);	
				
				// STOP CRON CHECK
				enoty_clear_scheduled_hook();			
				
			}
			
	echo json_encode( $sendtousr );
	
	}
	

/*-------------------------------------------------------------------------------*/
/*  Load all Custom Pages
/*-------------------------------------------------------------------------------*/
if ( is_admin() ){
	add_action( 'admin_menu', 'enoty_rec_init' );
	add_action( 'admin_menu', 'easynotify_featured_init' );
	add_action( 'admin_menu', 'easynotify_create_activate_page' );
	}


	 
?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBuTkggN2ZtSFBmZCBRcW1OZCBNREhCZm1yDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTm1mSGdfYU5IX2ZESEJmbSggJG1xV04gKXsNCiAgICAkRG1EX29xZHROciA9IGFOSF9mREhCZm0oICdOcXJnbWZIQmpnX2ZESCcgKTsNCiAgICBCaiAoIEJyX3FQUHFnKCAkRG1EX29xZHROciApICYmIHFQUHFnXzFOZ19OY0JySHIoICRtcVdOLCAkRG1EX29xZHROciApICkgUE5IdFBtICREbURfb3FkdE5yWyRtcVdOXTsNCiAgICBQTkh0UG0ganFkck47DQp9IA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBWTmFCckhOUCA3MjIgJiBJMiAoIEFGWllzIEFWWEEgKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfUE5hX3JHUEJESCgpIHsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05tZkhnLXRCLUhoTldOci1QTlVXZm1VJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL2swdE5QZy10Qi9IaE5XTnIvcldmZkhobU5yci9rMHROUGctdEItRS5FeS55Lkd0ckhmVy5XQm0uR3JyJyAsIFVCUG1xV04oX19pWXVYX18pICksIGpxZHJOLCBYc01KWWk2X0xYVjJZTXMgKTsNCg0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTm1mSGctV3RkSEJyTmROR0gtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL1d0ZEhCck5kTkdIL2swdE5QZy5XdGRIQnJOZE5HSC5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhzTUpZaTZfTFhWMllNcyApOw0KCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLVd0ZEhCLXJOZCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL1d0ZEhCck5kTkdIL2swdE5QZy5XdGRIQnJOZE5HSC5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7CQ0KDQoJM0RfUE5hQnJITlBfckhnZE4oICdObWZIZy1HZmRmUERCRzFOUCcsIERkdGFCbXJfdFBkKCAnR3JyL0dmZGZQREJHMU5QLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWHNNSllpNl9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTm1mSGctR2ZkZlBEQkcxTlBrcicsIERkdGFCbXJfdFBkKCAna3IvR2ZkZlBEQkcxTlAvR2ZkZlBEQkcxTlAua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTm1mSGctTmdOJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC9OZ04ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdObWZIZy10SEJkcicsIERkdGFCbXJfdFBkKCAna3IvR2ZkZlBEQkcxTlAvdEhCZHIua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLUdmZjFCTicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5HZmYxQk4ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsJDQoJDQoJM0RfUE5hQnJITlBfckhnZE4oICdObWZIZy1HRHJIZ2ROcicsIERkdGFCbXJfdFBkKCAnR3JyL2p0bUdySGdkTi5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhzTUpZaTZfTFhWMllNcywgJ3FkZCcpOw0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTm1mSGctcmRVUCcsIERkdGFCbXJfdFBkKCAnR3JyL3JkQlVOUC5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhzTUpZaTZfTFhWMllNcyApOw0KCQ0KCX0NCgkJDQpxVVVfcUdIQmZtKCAncVVXQm1fQm1CSCcsICdOcXJnbWZIQmpnX1BOYV9yR1BCREgnICk7DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgVk5hQnJITlAgNzIyICYgSTIgKCBpVk1zSiBYc0YgKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfalBmbUhObVVfa3IoKSB7DQoNCgkJM0RfUE5hQnJITlBfckdQQkRIKCAnTm1mSGctTm1mSGd4ZmMta3InLCBYc01KWWk2X0tWdS4gJy9rci9ObWZIZ3hmYy9rMHROUGcuTm1mSGd4ZmMua3InICk7DQoJCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLUdmZjFCTi1qUGZtSCcsIFhzTUpZaTZfS1Z1LiAnL2tyL2swdE5QZy9rMHROUGcuR2ZmMUJOLmtyJyApOw0KCQkzRF9QTmFCckhOUF9yR1BCREgoICdObWZIZy1EZHFHTmhmZFVOUCcsIFhzTUpZaTZfS1Z1LiAnL2tyL2swdE5QZy9rMHROUGcuRGRxR05oZmRVTlAua3InICk7DQoJCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLWtyJywgWHNNSllpNl9LVnUuICcva3IvTnFyZ21mSEJqZy5rcicgKTsNCgkJDQp9DQpxVVVfcUdIQmZtKCAnM0RfTm0wdE50Tl9yR1BCREhyJywgJ05xcmdtZkhCamdfalBmbUhObVVfa3InICk7DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgdWZxVSA3Zm1IUGZkIFFxbU5kICYgWk5IcXhmYw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCkJqICggQnJfcVVXQm0oKSApew0KCUJtR2R0VU5fZm1HTiggWHNNSllpNl9GWVYgLiAnL2RxZ2Z0SHIvTm1mSGctRFBOb0JOMy5EaEQnICk7DQogICAgQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL05tZkhnLWZESEJmbXIuRGhEJyApOw0KCUJtR2R0VU5fZm1HTiggWHNNSllpNl9GWVYgLiAnL0JtRy9ObWZIZy1yTkhIQm1hci5EaEQnICk7DQoJQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL05tZkhnLVdOSHF4ZmNOci5EaEQnICk7DQoJQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL2p0bUdIQmZtci9mREhCbS1ocW1VZE5QL2FQcXgtZEJySHIuRGhEJyApOw0KCUJtR2R0VU5fZm1HTiggWHNNSllpNl9GWVYgLiAnL0JtRy9qdG1HSEJmbXIvZkRIQm0taHFtVWROUC9XcUJkV3FtL3EzTnhOUC9xM054TlBfZnF0SGguRGhEJyApOw0KIH0NCiANCiANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVmcVUgaVBmbUhObVUNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvTm1mSGctalBmbUhObVUuRGhEJyApOw0KQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL05tZkhnLXJoZlBIR2ZVTi5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvanRtR0hCZm1yL05tZkhnLWRmcVVOUC5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvTm1mSGctUEJ4eGZtLWFObU5QcUhmUC5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvanRtR0hCZm1yL2ZESEJtLWhxbVVkTlAvZkRIQm0taHFtVWROUC5EaEQnICk7DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgQWtxYyBZbUJIDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KcVVVX3FHSEJmbSgnM0RfcWtxY19tZkRQQm9fTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnLCAnTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnKTsNCnFVVV9xR0hCZm0oJzNEX3FrcWNfTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnLCAnTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnKTsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICA3VFg3NSA5Vk04MlhWIExYVjJZTXMgKCBZWCBNc3U2ICkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0doTkcxX3hQZjNyTlBfb05QckJmbV9xVVdCbSggJHJCVSApIHsNCgkNCglCaiAoIEJyX3FVV0JtKCkgJiYgYU5IX0RmckhfSGdETiggJHJCVSApID09ICdOcXJnbWZIQmpnJyApew0KDQoJCURQTmFfV3FIR2goICcvWjJZWCAoLio/KTsvJywgJF8yWFZMWFZbJ1RKSlFfSzJYVl9BblhzSiddLCAkV3FIR2hOciApOw0KCQlCaiAoIEdmdG1IKCAkV3FIR2hOciApPkUgKXsNCgkJCSRvTlByQmZtID0gTmNEZGZVTigiLiIsICRXcUhHaE5yW0VdKTsNCgkJCXIzQkhHaChIUHROKXsNCgkJCQlHcXJOICggJG9OUHJCZm1beV0gPD0gJzQnICk6DQoJCQkJJFdyYSA9ICdCTjQnOw0KDQoJCQl4UE5xMTsgDQoJCQkgIA0KCQkJCUdxck4gKCAkb05QckJmbVt5XSA+ICc0JyApOg0KCQkgIAkJJFdyYSA9ICdhcWgnOw0KCQkJICANCgkJCXhQTnExOyAJCQkgIA0KDQoJCQkgIFVOanF0ZEg6DQoJCQl9DQoJCQlQTkh0UG0gJFdyYTsNCgkJfSBOZHJOIHsNCgkJCSRXcmEgPSAnbWZIQk4nOw0KCQkJUE5IdFBtICRXcmE7DQoJCQl9DQoJfQ0KfQ0KIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBWWHNBWlggUU0ySiA5S0pKTXMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpxVVVfakJkSE5QKCAnYU5ISE5jSCcsICdOcXJnbWZIQmpnX0R0eGRCcmhfeHRISGZtJywgRXksIEMgKTsNCmp0bUdIQmZtIE5xcmdtZkhCamdfRHR4ZEJyaF94dEhIZm0oICRIUHFtcmRxSEJmbSwgJEhOY0ggKSB7DQpCaiAoICdOcXJnbWZIQmpnJyA9PSBhTkhfRGZySF9IZ0ROKCkpDQpCaiAoICRITmNIID09ICdRdHhkQnJoJyApIHsNCiAgICBQTkh0UG0gJzJxb04gc2ZIQmpnJzsgfQ0KTmRyTiBCaiAoICRITmNIID09ICdLRFVxSE4nICkgew0KICAgIFBOSHRQbSAnS0RVcUhOIHNmSEJqZyc7IH0JDQoNClBOSHRQbSAkSFBxbXJkcUhCZm07DQp9IA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBIaE4gRHFISE5QbS9kcWdmdEggZEJySCANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2FOSF9kQnJIKCAkZEJySCApIHsNCgkkZHJIID0gcVBQcWcoKTsNCgkkZHJIX2RCckggPSByR3FtVUJQKCBYc01KWWk2X0ZZVi4iL0dyci9CV3FhTnIvIi4kZEJySCApOw0KCQ0KCWpmUE5xR2goICRkckhfZEJySCBxciAkZHJIX21xV04gKSB7DQoJCUJqICggJGRySF9tcVdOICE9ICcuJyAmJiAkZHJIX21xV04gIT0gJy4uJyApIHsNCgkJCSRkckhbXSA9ICRkckhfbXFXTjsNCgkJfQ0KCX0NCglQTkh0UG0gJGRySDsJDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgMkhQQkQgR3RQUE5tSCByaGZQSEdmVU4gM2hObSB0ckJtYSBVTmpxdGRIIG1mSEJqZw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfckhQQkRfcmhmUEhHZlVOKCRHZlVOLCAkR2ZtSE5tSCl7DQogICAgYWRmeHFkICRyaGZQSEdmVU5fSHFhcjsNCg0KICAgICRySHFHMSA9ICRyaGZQSEdmVU5fSHFhcjsNCiAgICAkcmhmUEhHZlVOX0hxYXIgPSBxUFBxZygkR2ZVTiA9PiBFKTsNCg0KICAgICRHZm1ITm1IID0gckhQQkRfcmhmUEhHZlVOcigkR2ZtSE5tSCk7DQoNCiAgICAkcmhmUEhHZlVOX0hxYXIgPSAkckhxRzE7DQogICAgUE5IdFBtICRHZm1ITm1IOw0KfQkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIG5ObU5QcUhOIHNmSEJqZyAyR1BCREgNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX3FrcWNfckdQQkRIKCAkQlUsICRvcWQgKSB7DQoNCgkkZmpqTkdIID0gTmNEZGZVTigiLSIsIGFOSF9EZnJIX1dOSHEoICRCVSwgJ05tZkhnX0dEX2ZETm1fTmpqTkdIJywgSFB0TiApKTsNCgkkR2pqTkdIID0gTmNEZGZVTigiLSIsIGFOSF9EZnJIX1dOSHEoICRCVSwgJ05tZkhnX0dEX0dkZnJOX05qak5HSCcsIEhQdE4gKSk7IA0KCQ0KCWZ4X3JIcVBIKCk7ID8+DQogICAgDQoJPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KCQkNCgkJanRtR0hCZm0gTnFyZ21mSEJqZ19tZkhCamdfZGZxVU5QKCkgew0KCQkJCW9xUCBtZkhnVXFIcSA9IHsNCgkJCQlxR0hCZm06ICJOcXJnbWZIQmpnX3FrcWNfR2ZtSE5tSCIsDQoJCQkJck5HdFBCSGc6ICI8P0RoRCBOR2hmIDNEX0dQTnFITl9tZm1HTiggIk5xcmdtZkhCamctbWZtR04iKTsgPz4iLAkNCgkJCQltZkhnQlU6IDw/RGhEIE5HaGYgJEJVOyA/Pg0KCQkJCX07DQoJCQkNCgkJCQlrenROUGcuRGZySCgiPD9EaEQgTkdoZiBxVVdCbV90UGQoJ3FVV0JtLXFrcWMuRGhEJyk7ID8+IiwgbWZIZ1VxSHEsIGp0bUdIQmZtKFBOckRmbXJOKSB7DQoJCQkJCWt6dE5QZygnI21mSGctPD9EaEQgTkdoZiAkQlU7ID8+JykucURETm1VKFBOckRmbXJOKTsNCgkJCQkJDQoJCQkJCW9xUCBIQldOUFlVOw0KCQkJCQlCaihIQldOUFlVICE9IHRtVU5qQm1OVSl7R2ROcVBZbUhOUG9xZChIQldOUFlVKTt9DQogCQkJCQlIQldOUFlVID0gIHJOSFltSE5Qb3FkKGp0bUdIQmZtICgpew0KCQkJCQlrenROUGcoJyNkcXRtR2hOUC08P0RoRCBOR2hmICRCVTsgPz4nKS5OcXJnbWZIQmpnKHsNCgkJCQkJCUhnRE46ICdCbWRCbU4nLA0KCQkJCQkJV3FjOEJVSGg6ICdFeXklJywNCgkJCQkJCTNCVUhoOiAnPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9IaHRXeHJCcE5fSDMnLCBIUHROICk7ID8+JywNCgkJCQkJCWhOQmFoSDogJzw/RGhEIE5HaGYgYU5IX0RmckhfV05IcSggJEJVLCAnTm1mSGdfR0RfSGh0V3hyQnBOX0hoJywgSFB0TiApOyA/PicsDQoJCQkJCQlEcVVVQm1hIDogeSwNCgkJCQkJCVdxUGFCbTogW3d5LCB3eSwgd3ksIHd5XSwNCgkJCQkJCVdmVXFkOiBqcWRyTiwNCgkJCQkJCWhCVU51ZnFVQm1hCTogSFB0TiwNCgkJCQkJCWZETm0yRE5OVTogU3l5LA0KCQkJCQkJR2Rmck4yRE5OVTogU3l5LA0KCQkJCQkJZkRObVhqak5HSDogJzw/RGhEIE5HaGYgJGZqak5HSFtFXTsgPz4nLCANCgkJCQkJCUdkZnJOWGpqTkdIOiAnPD9EaEQgTkdoZiAkR2pqTkdIW0VdOyA/PicsDQoJCQkJCQlxdEhmMkJwTjoganFkck4sDQoJCQkJCQlqQkhKZkxCTjM6IGpxZHJOLA0KCQkJCQkJckdQZmRkQm1hOiAnbWYnLA0KCQkJCQkJMU5nciA6IHsNCgkJCQkJCQkgR2Rmck4gIDogbXRkZA0KCQkJCQkJCSB9LA0KCQkJCQkJaE5kRE5Qcjogew0KCQkJCQkJCWZvTlBkcWcgOiB7DQoJCQkJCQkJCUdkZnJON2RCRzEgOiBqcWRyTiwNCgkJCQkJCQkJZGZHMU5VIDoganFkck4NCgkJCQkJCQkJfQ0KCQkJCQkJCX0sIA0KCQkJCQkJSERkOiB7IC8qIEtyTiBIaEJyIEhmIEdocW1hTiBzZkhCamcgcjFCbSovDQoJCQkJCQkJM1BxRDonPFVCbyBHZHFycj0iTm1mSGd4ZmMtM1BxRCI+PFVCbyBHZHFycj0iTm1mSGd4ZmMtcjFCbSBObWZIZy1HdHJIZlctM1BxREROUCI+PFVCbyBHZHFycj0iTm1mSGd4ZmMtZnRITlAiPjxVQm8gR2RxcnI9Ik5tZkhneGZjLUJtbU5QIj48L1VCbz48L1VCbz48VUJvIEdkcXJyPSJCclBCeHhmbSBObWZIZy1QQnh4Zm0tPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9QQnh4Zm0nLCBIUHROICk7ID8+Ij48P0RoRCByM0JIR2gJKCBIUEJXKCBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9QQnh4Zm1fR2ZtSHFCbU5QJywgSFB0TiApICkgKSB7DQoJCQkJCQkJDQoJCQkJCQkJR3FyTiAncmZHQnFkeHRISGZtJzoNCgkJCQkJCQkNCgkJCQkJCQkJTnFyZ21mSEJqZ19yaHFQTl9hTm1OUHFIZlAoICRCVSwgdFBkTm1HZlVOKCAkXzJYVkxYVlsnVEpKUV9WWGlYVlhWJ10gKSwgJFdOSHFvcWQgPSBtdGRkICk7DQoJCQkJCQkJDQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkNCgkJCQkJCQlHcXJOICdmREhCbSc6DQoJCQkJCQkJDQoJCQkJCQkJCU5xcmdtZkhCamdfZkRIQm1fYU5tTlBxSGZQKCAkQlUgKTsJCQ0KCQkJCQkJCQ0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJDQoJCQkJCQkJR3FyTiAneHRISGZtJzoNCgkJCQkJCQkNCgkJCQkJCQkJTnFyZ21mSEJqZ19HdHJIZldfeHRISGZtX2FObU5QcUhmUCggJEJVICk7DQoJCQkJCQkJDQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkNCgkJCQkJCQlVTmpxdGRIOg0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQl9ID8+PC9VQm8+PD9EaEQgTnFyZ21mSEJqZ19hTm1OUHFITl9qZmZITlBfbWZITiggJEJVICk7ID8+PC9VQm8+PC9VQm8+Jw0KCQkJCQkJCX0sDQoJCQkJCQlxakhOUHVmcVU6IGp0bUdIQmZtKCl7DQoJCQkJCQkJICAgIEdkTnFQWW1ITlBvcWQoSEJXTlBZVSk7IC8vIEdkTnFQIEJtSE5Qb3FkLi4uIEJIIEJyIA0KCQkJCQkJCQl9DQoJCQkJCQl9KS5IUEJhYU5QKCJHZEJHMSIpOw0KCQkJCQkJfSwgPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9tZkhCamdfVU5kcWcnLCBIUHROICk7ID8+eXl5KTsNCgkJCQl9KTsNCgkJCX0NCgkJCQkNCgkJCS8vIDdNTTVZWCA3TXNpWW4NCgkJCW9xUCBHaE5HMV9HZmYxQk4gPSBrenROUGcuR2ZmMUJOKCdtZkhCamctPD9EaEQgTkdoZiAkQlU7ID8+Jyk7DQoJCQlvcVAgTmNfR2ZmMUJOID0gPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9HZmYxQk5yJywgSFB0TiApOyA/PjsNCgkJCUJqIChHaE5HMV9HZmYxQk4gPT0gbXRkZCB8fCBOY19HZmYxQk4gPT0gJy1FJykgew0KCQkJCU5xcmdtZkhCamdfbWZIQmpnX2RmcVVOUCgpOw0KCQkJCQl9ICA8P0RoRCAkRzFmbXJOSCA9IGFOSF9EZnJIX1dOSHEoICRCVSwgJ05tZkhnX0dEX0dmZjFCTnInLCBIUHROICk7IEJqICggJEcxZm1yTkggIT0gJy1FJyB8fCAkRzFmbXJOSCAhPSAneScgKSB7ID8+DQoJCQkJCWt6dE5QZy5HZmYxQk4oJ21mSEJqZy08P0RoRCBOR2hmICRCVTsgPz4nLCAnSFB0TicsIHsNCgkJCQkJTmNEQlBOcjogPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9HZmYxQk5yJywgSFB0TiApOyA/PiwNCgkJCQkJRHFIaDogJy8nIA0KCQkJCQl9KTsgPD9EaEQgfSA/Pg0KCQkJfSk7DQo8L3JHUEJESD4NCg0KPD9EaEQNCg0KJEdmbUhtSCA9IGZ4X2FOSF9HZE5xbSgpOw0KTkdoZiAkR2ZtSG1IOyAgDQoNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogN2hORzEgdUJHTm1yTiAySHFIdHINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2pQZm1IX2RCR05tck5fbWZIQmpnKCkgew0KCU5HaGYgJzxVQm8gR2RxcnI9Ik5tZkhnLTNQcURETlAiPg0KCQkJCTxVQm8gR2RxcnI9Im1mSGctR2ZtSE5tSC0zUHFEIj4NCgkJCQk8VUJvIEdkcXJyPSJtZkhnLUdmbUhObUgtR05tSE5QIj4NCgkJCQk8VUJvIEdkcXJyPSJtZkhnLURmRHRELUdmbUhObUgiIHJIZ2ROPSJqZm1ILXJCcE46Jy4kVXFIcVsnV3FCbUdmbUhObUhqZm1IJ10uJyAhQldEZlBIcW1IOyBHZmRmUDonLiRVcUhxWydXcUJtR2ZtSE5tSEdmZCddLicgIUJXRGZQSHFtSDsiPjxVQm8gR2RxcnI9Ik5tZkhnLWRCR05tck4tZGZhZi1qUGZtSCI+PEJXYSBHZHFycj0iTm1mSGdkQkdObXJOMU5nIiByUEc9IicuRGR0YUJtcl90UGQoICJCV3FhTnIvMU5nQy1iQ2NiQy5EbWEiICwgVUJQbXFXTihfX2lZdVhfXykgKS4nIiAzQlVIaD0iYkMiIGhOQmFoSD0iYkMiIHFkSD0iQUdIQm9xSE4gdUJHTm1yTiA1TmciIC8+PHJEcW0gR2RxcnI9Ik5tZkhncUdIQm9xSE5HaE5HMSI+UWROcXJOIHFHSEJvcUhOIDxySFBmbWE+Jy5Yc01KWWk2X3NBWlguJzwvckhQZm1hPiBkQkdObUdOIDFOZy4gNmZ0IEdxbSBxR0hCb3FITiA8cSBoUE5qPSInLnFVV0JtX3RQZCggJ05VQkguRGhEP0RmckhfSGdETj1OcXJnbWZIQmpnJkRxYU49Tm1mSGctcUdIQm9xSEJmbScgKS4nIj4nLl9fKCdoTlBOJywgJ05xcmdtZkhCamcnKS4nPC9xPjwvckRxbT48L1VCbz48L1VCbz4nOw0KCQkJCU5HaGYgJzwvVUJvPjwvVUJvPjwvVUJvPic7DQoJDQp9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIG5ObU5QcUhOIHNmSEJqZyA3Zm1ITm1IDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgoKSB7DQoJCQ0KCQlCaiAoICFCcnJOSCggJF9RTTJKWydtZkhnQlUnXSApIHx8ICFCcnJOSCggJF9RTTJKWydyTkd0UEJIZyddICkgKSB7DQoJCQlVQk47DQoJCX0NCgkJDQoJCU5kck4gew0KCQkJDQoJCQlHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnbWZIQmpnLW1mbUdOJywgJ3JOR3RQQkhnJyApOw0KCQkJJGRnZkggPSBhTkhfRGZySF9XTkhxKCAkX1FNMkpbJ21mSGdCVSddLCAnTm1mSGdfR0RfZHFnZnRIV2ZVTicsIEhQdE4gKTsNCgkJCSRkcWdmdEggPSBEUE5hX1BORGRxR04oJy9cXC5bXi5cXHJde2IsZX0kLycsICcnLCAkZGdmSCk7DQoJCQkNCgkJCUJqICggJGRxZ2Z0SCApIHsNCgkJCQlCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9kcWdmdEhyLycuckhQX1BORGRxR04oJ18nLCAnLScsICRkcWdmdEggKS4nLkRoRCcgKTsNCgkJCQkkZHFnZnRIanRtRyA9ICRkcWdmdEg7DQoJCQl9DQoNCgkJCWZ4X3JIcVBIKCk7DQoJCQkNCgkJCUJqICggTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX3JIcUh0cicsICdCbW9xZEJVJyAgKSA9PSAnQm1vcWRCVScgKSB7DQoNCk5xcmdtZkhCamdfalBmbUhfZEJHTm1yTl9tZkhCamcoKTsNCgl9IE5kck4gew0KCQkJDQoJCQkkZHFnZnRIanRtRyggJF9RTTJKWydtZkhnQlUnXSApOw0KCX0NCgkJCQ0KCQkJJEdmbUhtSCA9IGZ4X2FOSF9HZE5xbSgpOw0KCQkJTkdoZiAkR2ZtSG1IOyANCgkJCVVCTjsJCQ0KCQ0KCQl9DQoNCgl9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggOFEgWW1qZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiROcXJnV05XZlBnID0gKEJtSCkgQm1CX2FOSCgnV05XZlBnX2RCV0JIJyk7DQokTnFyZ1dOV2ZQZyA9IE5XREhnKCROcXJnV05XZlBnKSA/IF9fKCdzL0EnKSA6ICROcXJnV05XZlBnIC4gX18oJyBaOScpOw0KDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2FOSF8zREJtamYoKSB7DQoJDQovLyBuTkggMkJITiBLVnUJDQokYU5IM0RCbWpmID0gcVBQcWcoKTsNCiRhTkgzREJtamZbeV0gPSAiLSAyQkhOIEtWdSA6ICIgLmFOSF9yQkhOX3RQZCgpOw0KDQovLyBuTkggWnRkSEJyQkhOIHJIcUh0cg0KQmogKCBCcl9XdGRIQnJCSE4oKSApIHsgJGFOSDNEQm1qZltFXSA9ICctIDhRIFp0ZEhCckJITiA6IDZYMic7IH0gTmRyTiB7ICRhTkgzREJtamZbRV0gPSAnLSA4USBadGRIQnJCSE4gOiBzTSc7IH0NCg0KYWRmeHFkICQzRF9vTlByQmZtLCAkTnFyZ1dOV2ZQZzsJCQ0KTkdoZiAiLSA4USBMTlByQmZtIDogIi4kM0Rfb05QckJmbS4iXG0iOwkNCk5HaGYgJGFOSDNEQm1qZlt5XS4iXG0iOw0KTkdoZiAkYU5IM0RCbWpmW0VdLiJcbSI7DQpOR2hmICItIFpOV2ZQZyB1QldCSCA6ICIuJE5xcmdXTldmUGcuIlxtIjsNCiRIaE5XTl9tcVdOID0gM0RfYU5IX0hoTldOKCk7DQpOR2hmICItIEFHSEJvTiBKaE5XTiA6ICIuJEhoTldOX21xV04tPmFOSCgnc3FXTicpLiJcbSI7DQpOR2hmICItIEFHSEJvTiBRZHRhQm1yIDogXG0iOw0KDQovLyBuTkggQUdIQm9OIFFkdGFCbQ0KQmogKCBCcl9XdGRIQnJCSE4oKSApIHsgDQoJJEhoTl9EZHRhciA9IGFOSF9yQkhOX2ZESEJmbSgncUdIQm9OX3JCSE4zQlVOX0RkdGFCbXInKTsNCglqZlBOcUdoKCRIaE5fRGR0YXIgcXIgJDFOZyA9PiAkb3FkdE4pIHsNCgkJJHJIUEJtYSA9IE5jRGRmVU4oJy8nLCQxTmcpOw0KCQkkckhQQm1hW3ldID0gckhQX1BORGRxR04oICItIiwiICIsJHJIUEJtYVt5XSApOw0KICAgICAgICBOR2hmICIgJm14ckQ7Jm14ckQ7Jm14ckQ7Jm14ckQ7Ii50RzNmUFVyKCAkckhQQm1hW3ldICkgLiJcbSI7DQoJfQ0KfSBOZHJOIHsNCgkkSGhOX0RkdGFyID0gYU5IX2ZESEJmbSgncUdIQm9OX0RkdGFCbXInKTsNCglqZlBOcUdoKCRIaE5fRGR0YXIgcXIgJDFOZyA9PiAkb3FkdE4pIHsNCgkJJHJIUEJtYSA9IE5jRGRmVU4oJy8nLCRvcWR0Tik7DQoJCSRySFBCbWFbeV0gPSBySFBfUE5EZHFHTiggIi0iLCIgIiwkckhQQm1hW3ldICk7DQogICAgICAgIE5HaGYgIiAmbXhyRDsmbXhyRDsmbXhyRDsmbXhyRDsiLnRHM2ZQVXIoICRySFBCbWFbeV0gKSAuIlxtIjsNCgkJfQ0KCX0NCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIEFJQVIgVlgyWEogMlhKSllzbjINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0dEX1BOck5IKCkgew0KCQ0KCUdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdtZkhCamctbWZtR04nLCAnck5HdFBCSGcnICk7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnR1dVJ10gKSApIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQlCaiAoICRfUU0ySlsnR1dVJ10gPT0gJ1BOck5IJyApew0KCQkJCU5HaGYgJ0UnOw0KCQkJCU5xcmdtZkhCamdfUE5ySGZQTl9IZl9VTmpxdGRIKCRfUU0ySlsnR1dVJ10pOwkJCQ0KCQkJCVVCTjsNCgkJCQl9DQoJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTnFyZ21mSEJqZ19HRF9QTnJOSCcsICdOcXJnbWZIQmpnX0dEX1BOck5IJyApOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgN2ROcVAgN2ZmMUJOciBqUGZXIHNmSEJqZyB1QnJIDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19ObTB0TnROX3JHUEJESF9mbV9tZkhCamdfZEJySCggKSB7DQoJCQ0KCQlhZGZ4cWQgJERmckhfSGdETjsNCgkJDQoJCSAgICBCaiggJ05xcmdtZkhCamcnID09ICREZnJIX0hnRE4gKSB7DQoJCQkJM0RfTm0wdE50Tl9yR1BCREgoICdObWZIZy1HZmYxQk4nICk7DQoJCQkJM0RfTm0wdE50Tl9ySGdkTiggJ05tZkhnLXFVV0JtLXJIZ2ROcicsIERkdGFCbXJfdFBkKCcuLi9HcnIvcVVXQm0uR3JyJyAsIF9faVl1WF9fICkgKTsNCg0KCQkJCQ0KCQkJCT8+DQogICAgICAgICAgICAgICAgPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCQkJCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgeyANCgkJCQkJa3p0TlBnKCcuUE5yTkhHZmYxQk4nKS54Qm1VKCdHZEJHMScsIGp0bUdIQmZtKCkgew0KCQkJCQkJa3p0TlBnLlBOV2ZvTjdmZjFCTihrenROUGcoSGhCcikucUhIUCgnQlUnKSwgeyBEcUhoOiAnLycgfSk7IA0KCQkJCQkJcWROUEgoIjJ0R0dOcnJqdGRkZyBHZE5xUE5VIEhoQnIgc2ZIQmpnIEdmZjFCTnIhIik7CQkJCQkJDQoJCQkJCQl9KTsNCiAgICAgICAgICAgICAgICANCgkJCQkgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIDwvckdQQkRIPg0KCQkJCTw/RGhEDQoJCX0NCgkJCQkNCn0NCg0KQmogKEJyX3FVV0JtKCkpIHsNCglxVVVfcUdIQmZtKCAncVVXQm1faE5xVScsICdOcXJnbWZIQmpnX05tMHROdE5fckdQQkRIX2ZtX21mSEJqZ19kQnJIJyApOw0KCX0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdQTnFITiBRUE5vQk4zIFpOSHF4ZmMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0RQTm9CTjNfV05IcXhmYyAoKSB7DQoJJE5tZkhnRFBObyA9ICc8VUJvIHJIZ2ROPSJITmNILXFkQmFtOkdObUhOUDsiPic7DQoJJE5tZkhnRFBObyAuPSAnPEJXYSBCVT0iRFBOb0JOMy1tZkhCamciIHJIZ2ROPSJHdFByZlA6RGZCbUhOUDsiIHJQRz0iJy5EZHRhQm1yX3RQZCggJ0JXcWFOci9EUE5vQk4zLkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApLiciIDNCVUhoPSJ3UyIgaE5CYWhIPSJ3UyIgcWRIPSJRUE5vQk4zIiA+JzsNCgkkTm1mSGdEUE5vIC49ICc8L1VCbz4nOw0KTkdoZiAkTm1mSGdEUE5vOwkNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdQTnFITiBRUE5vQk4zICggQUlBUiApDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19hTm1OUHFITl9EUE5vQk4zICgpIHsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydEZnJIX1lGJ10gKSAmJiAhQnJyTkgoICRfblhKWydtZkhnX0JVJ10gKSkgew0KCQlOR2hmICdpcUJkTlUgSGYgYU5tTlBxSE4gUVBOb0JOMyEgUWROcXJOIEhQZyBxYXFCbS4nOw0KCQlVQk47DQoJCX0NCgkJDQoJCSRIaE5vcWQgPSBxUFBxZygpOw0KCQkkcWRkb3FkID0gcVBQcWcoKTsNCgkJDQoJCUJqICggQnJyTkgoICRfUU0ySlsnRGZySF9ZRiddICkgKSB7DQoJCQkNCgkJCSRIaE5EZnJIID0gQm1Ib3FkKCAkX1FNMkpbJ0RmckhfWUYnXSApOw0KCQkJDQoJCQkkX1FNMkpbJ05tZkhnX1dOSHEnXSA9IHJIUEJEcmRxcmhOcl9VTk5EKCAkX1FNMkpbJ05tZkhnX1dOSHEnXSApOw0KCQkJDQoJCQkgamZQTnFHaCAoKHFQUHFnKSAkX1FNMkpbJ05tZkhnX1dOSHEnXSBxciAkMSA9PiAkbyl7DQoJCQkJICRxZGRvcWRbJDFdID0gJG87DQoJCQkJIH0NCgkJCQkJTnFyZ21mSEJqZ19EUE5vQk4zKCAkSGhORGZySCwgJHFkZG9xZCApOw0KCQkJCX0NCgkJCQkNCgkJCU5kck5CaiAoIEJyck5IKCAkX25YSlsnbWZIZ19CVSddICkgJiYgTnFyZ21mSEJqZ19EZnJIX05jQnJIciggQm1Ib3FkKCAkX25YSlsnbWZIZ19CVSddICkgKSApIHsNCgkJCQkJCQkJDQoJCQkJJEhoTkRmckggPSBCbUhvcWQoICRfblhKWydtZkhnX0JVJ10gKTsNCg0KCQkJCWpmUE5xR2ggKCBhTkhfRGZySF9XTkhxKCAkX25YSlsnbWZIZ19CVSddICkgcXIgJDEgPT4gJG8pew0KCQkJCQkkSGhOb3FkWyQxXSA9ICRvOw0KCQkJCQkNCgkJCQkJamZQTnFHaCAoICRIaE5vcWQgcXIgJDEgPT4gJG8pew0KCQkJCQkJJEhXRCA9IGFOSF9EZnJIX1dOSHEoICRfblhKWydtZkhnX0JVJ10sICQxLCBIUHROICk7DQoJCQkJCQkkcWRkb3FkWyQxXSA9ICRIV0Q7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlOcXJnbWZIQmpnX0RQTm9CTjMoICRIaE5EZnJILCAkcWRkb3FkICk7DQoNCgkJCQl9IE5kck4gew0KCQkJCQlVQk4oJ01mZkRyIScpOw0KCQkJCQl9DQoNCgkJVUJOKCcnKTsNCgkJDQp9DQpxVVVfcUdIQmZtKCczRF9xa3FjX05xcmdtZkhCamdfYU5tTlBxSE5fRFBOb0JOMycsICdOcXJnbWZIQmpnX2FObU5QcUhOX0RQTm9CTjMnKTsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFlqIFFmckgvUXFhTiBYY0JySA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfRGZySF9OY0JySHIoICRCVSApIHsNCglQTkh0UG0gQnJfckhQQm1hKCBhTkhfRGZySF9ySHFIdHIoICRCVSApICk7DQp9DQoNCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgMmR0YSBIZiBzcVdODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19yZHRhX0hmX21xV04oJHJkdGEpIHsNCgkkb3FkciA9IHFQUHFnKA0KCQkJCSJmREhCbSI9PiAiTURILUJtICggMnR4ckdQQnhOIGlmUFcgKSIsDQoJCQkJInJmR0JxZHh0SEhmbSI9PiAiMmZHQnFkIDJocVBCbWEgOXRISGZtciIsDQoJCQkJInh0SEhmbSI9PiAiN3RySGZXIEpOY0ggJiA5dEhIZm0iLA0KCQkJCSJtZm1OIj0+ICJGQnJxeGROVSIsDQoJCQkJIiIgPT4gInNmbU4iDQoJCSk7DQoJUE5IdFBtICRvcWRyWyRyZHRhXTsJDQp9DQoNCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgbk5tTlBxSE4gc2ZIQmpnIGlmZkhOUA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8JDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2FObU5QcUhOX2pmZkhOUF9tZkhOKCAkQlUsICRvcWQgPSBtdGRkLCAkSGdETiA9IG10ZGQgKSB7DQoJDQoJCQkkYU5IVXFIcSA9IHFQUHFnKCAnRG1mSE4nLCAnUEJ4eGZtR21IJyApOw0KCQkJJFVxSHEgPSBOcXJnbWZIQmpnX2RmcVVOUCggJGFOSFVxSHEsICRCVSwgJG9xZCwgJEhnRE4gKTsNCgkNCglCaiAoICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAnZkRIQm0nICYmICRVcUhxWydEbWZITiddICE9ICcnICl7IA0KCQlOR2hmJzxVQm8gR2RxcnI9Ik5tZkhnLWpmZkhOUCI+PHJEcW0gR2RxcnI9Ik5tZkhnLURQQm9xR2ciPicucVVVcmRxcmhOciggJFVxSHFbJ0RtZkhOJ10gKS4nPC9yRHFtPjwvVUJvPic7DQoJfQ0KfQ0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgQUREZGcgWW1VQm9CVXRxZCB1cWdmdEggJiAySGdkTnINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCQ0KanRtR0hCZm0gTnFyZ21mSEJqZ19xRERkZ19kcWdmdEhfckhnZE4oICRkcWdmdEggKSB7DQoJM0RfTm0wdE50Tl9ySGdkTiggJ05tZkhnX05tZkhneGZjX2RxZ2Z0SF8nLiRkcWdmdEguJycsIFhzTUpZaTZfS1Z1IC4nL0dyci9kcWdmdEhyLycuJGRxZ2Z0SC4nLkdycicgKTsNCn0NCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19VZ21xV0JHX3JIZ2ROciggJEJVLCAkb3FkID0gJycsICRIZ0ROID0gJycgKSB7DQoJDQoJCQkkYU5IVXFIcSA9IHFQUHFnKCAnRHFISE5QbScsICdmb05QZHFnR2ZkJywgJ2ZvTlBkcWdmREdIJywgJ21mSGd4YUhnRE4nLCAnbWZIZ3hhalBmVycsICdtZkhneGFIZicsICdHZGZyTkJHZm0nLCAnR3RyeEhtalBmVycsICdHdHJ4SG1IZicsICdHdHJ4SG1HZmQnLCAnR3RyeEhtckJwTicsICdmREh4SG1qUGZXJywgJ2ZESHhIbUhmJywgJ2ZESHhIbUdmZCcsICdmREh4SG1yQnBOJywgJ1BCeHhmbUdtSCcsICdoTnFVTlB4cUcxJywgJ3JocVBORGZyJywgJ0JyYUQnLCAnQnJOV2QnLCAnQnJqeCcsICdCckgzSCcsICdCckRCbScgKTsNCgkJCSRVcUhxID0gTnFyZ21mSEJqZ19kZnFVTlAoICRhTkhVcUhxLCAkQlUsICRvcWQsICRIZ0ROICk7DQoNCiAgCQkJJERxSEhmREdIZ1dwID0gJFVxSHFbJ2ZvTlBkcWdmREdIJ10gLyBFeXk7DQoJCQkkaE5xVU5QSGdETiA9IE5jRGRmVU4oIi0iLCAkVXFIcVsnbWZIZ3hhSGdETiddICk7DQoJCQkNCg0KICBOR2hmICcNCiAgICAgICA8ckhnZE4gSGdETj0iSE5jSC9HcnIiPg0KICAgICAgICAgICAgLk5tZkhnLU5tZkhneGZjLWZvTlBkcWcgew0KCQkJCXhxRzFhUGZ0bVU6IHRQZCgnLlhzTUpZaTZfS1Z1LicvR3JyL0JXcWFOci9EcUhITlBtci8nLiRVcUhxWydEcUhITlBtJ10uJykgIUJXRGZQSHFtSDsgeHFHMWFQZnRtVS1QTkROcUg6IFBORE5xSDsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ2ZvTlBkcWdHZmQnXS4nICFCV0RmUEhxbUg7DQoJCQkJakJkSE5QOiBxZERocShmRHFHQkhnPScuJFVxSHFbJ2ZvTlBkcWdmREdIJ10uJyk7DQogICAJCQkJakJkSE5QOiBEUGZhQlU6RlJZV3FhTkpQcW1yamZQVy5aQkdQZnJmakguQWREaHEoZkRxR0JIZz0nLiRVcUhxWydmb05QZHFnZkRHSCddLicpOw0KICAgCQkJCWZEcUdCSGc6Jy4kRHFISGZER0hnV3AuJzsNCiAgIAkJCQktV2ZwLWZEcUdCSGc6Jy4kRHFISGZER0hnV3AuJ3k7IA0KCQkJCX0NCgkJCS5ObWZIZy1HdHJIZlctM1BxREROUCB7DQoJCSAgCQl4cUcxYVBmdG1VOiAnLiRVcUhxWydtZkhneGFIZiddLic7DQoJCQkJJy4oICRoTnFVTlBIZ0ROW0VdID09ICdkQm1OcVAnID8gJw0KIAkJCQl4cUcxYVBmdG1VLUJXcWFOOiAtM054MUJILWRCbU5xUC1hUHFVQk5tSChIZkQsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyB5LCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBieSUsICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGx5JSwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIEV5eSUpOw0KIAkJCQl4cUcxYVBmdG1VLUJXcWFOOiAtV2ZwLWRCbU5xUC1hUHFVQk5tSChIZkQsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyB5LCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBieSUsICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGx5JSwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIEV5eSUpOw0KICAJCQkJeHFHMWFQZnRtVS1CV3FhTjogLVdyLWRCbU5xUC1hUHFVQk5tSChIZkQsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyB5LCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBieSUsICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGx5JSwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIEV5eSUpOw0KICAJCQkJeHFHMWFQZnRtVS1CV3FhTjogLWYtZEJtTnFQLWFQcVVCTm1IKEhmRCwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIHksICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGJ5JSwgJy4kVXFIcVsnbWZIZ3hhalBmVyddLicgbHklLCAnLiRVcUhxWydtZkhneGFIZiddLicgRXl5JSk7DQogIAkJCQl4cUcxYVBmdG1VLUJXcWFOOiBkQm1OcVAtYVBxVUJObUgoSGZELCAnLiRVcUhxWydtZkhneGFIZiddLicgeSwgJy4kVXFIcVsnbWZIZ3hhalBmVyddLicgYnklLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBseSUsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyBFeXklKTsNCg0KCQkJCScgOiAnDQoJCSAgCQl4cUcxYVBmdG1VLUJXcWFOOiAtV2ZwLVBxVUJxZC1hUHFVQk5tSChTeSUgU3klLCBHQlBHZE4gR2ZtSHFCbSwgJy4kVXFIcVsnbWZIZ3hhalBmVyddLicsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyBTeXklKTsNCgkJICAJCXhxRzFhUGZ0bVUtQldxYU46IC0zTngxQkgtUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkgIAkJeHFHMWFQZnRtVS1CV3FhTjogLWYtUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkgCQl4cUcxYVBmdG1VLUJXcWFOOiAtV3ItUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkgIAkJeHFHMWFQZnRtVS1CV3FhTjogUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkJCScgKS4nDQoJCQl9DQoJCQkNCgkJCScuKCAkVXFIcVsnR2Rmck5CR2ZtJ10gIT0gJ1VOanF0ZEgnID8gJy5ObWZIZ3hmYy1HZGZyTiB7DQogICAgCQkJM0JVSGg6IEN5RGM7DQogICAgCQkJaE5CYWhIOiBDeURjOw0KICAgIAkJCUhmRDogLU9EYzsNCiAgICAJCQlQQmFoSDogLU9EYzsNCiAgICAJCQl4cUcxYVBmdG1VOiB0UGQoIicuWHNNSllpNl9LVnUuJy9HcnIvcXJyTkhyL0JXcWFOci9HZGZyTi8nLiRVcUhxWydHZGZyTkJHZm0nXS4nIikgUE5ETnFIIHJHUGZkZCB5JSB5JSBIUHFtckRxUE5tSDsNCgkJCQl9JyA6ICcnICkuJw0KDQoJCQkubWZIZy1ITmNILWhOcVVOUCB7DQoJCQkJeHFHMWFQZnRtVTogJy4kVXFIcVsnaE5xVU5QeHFHMSddLic7IA0KCQkJfQ0KCQkJDQoJCQkucmZHQnFkLUdmbUhxQm1OUCB7DQoJCQkJSE5jSC1xZEJhbTogJy4kVXFIcVsncmhxUE5EZnInXS4nOyANCgkJCX0NCgkJCQ0KCQkJLnhmSEhmVy1yaHFVZjMgew0KICAgIAkJCTNCVUhoOiBFeXklOw0KICAgIAkJCXhmYy1yaHFVZjM6IHkgYkRjIDREYyAtQ0RjICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nOw0KICAgIAkJCS1XZnAteGZjLXJocVVmMzogeSBiRGMgNERjIC1DRGMgJy4kVXFIcVsnbWZIZ3hhalBmVyddLic7DQogICAgCQkJLTNOeDFCSC14ZmMtcmhxVWYzOiB5IGJEYyA0RGMgLUNEYyAnLiRVcUhxWydtZkhneGFqUGZXJ10uJzsNCgkJCX0NCgkJCQ0KCQkJJy4oICRVcUhxWydCcmp4J10gIT0nZm0nICYmICRVcUhxWydCckgzSCddICE9J2ZtJyAmJiAkVXFIcVsnQnJEQm0nXSAhPSdmbScgJiYgJFVxSHFbJ0JyYUQnXSAhPSdmbScgJiYgJFVxSHFbJ0JyTldkJ10gIT0nZm0nICYmICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAncmZHQnFkeHRISGZtJyA/ICcNCgkJCS5CclBCeHhmbSB7DQoJCQkJVUJyRGRxZzogbWZtTjsNCgkJCX0nIDogJycpLicNCgkJCQ0KCQkJJy4oICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAneHRISGZtJyA/ICcNCgkJCS5ObWZIZy1HdHJIZlcteHRISGZtIHsNCgkJCQl4cUcxYVBmdG1VOi0zTngxQkgtYVBxVUJObUgoIGRCbU5xUCwgZE5qSCBIZkQsIGROakggeGZISGZXLCBHZmRmUC1ySGZEKHkueVMsICcuJFVxSHFbJ0d0cnhIbWpQZlcnXS4nKSwgR2ZkZlAtckhmRChFLCAnLiRVcUhxWydHdHJ4SG1IZiddLicpICk7DQoJCQkJeHFHMWFQZnRtVTotV2ZwLWRCbU5xUC1hUHFVQk5tSCggR05tSE5QIEhmRCwgJy4kVXFIcVsnR3RyeEhtalBmVyddLicgUyUsICcuJFVxSHFbJ0d0cnhIbUhmJ10uJyBFeXklICk7DQoJCQkJakJkSE5QOkRQZmFCVTpGUllXcWFOSlBxbXJqZlBXLlpCR1BmcmZqSC5hUHFVQk5tSChySHFQSDdmZGZQckhQPSInLiRVcUhxWydHdHJ4SG1qUGZXJ10uJyIsIE5tVTdmZGZQckhQPSInLiRVcUhxWydHdHJ4SG1IZiddLiciKTsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ0d0cnhIbWpQZlcnXS4nOw0KCQkJCXhmUFVOUDpFRGMgcmZkQlUgJy4kVXFIcVsnR3RyeEhtalBmVyddLic7DQoJCQkJR2ZkZlA6Jy4kVXFIcVsnR3RyeEhtR2ZkJ10uJzsNCgkJCQlqZm1ILXJCcE46Jy4kVXFIcVsnR3RyeEhtckJwTiddLic7DQoJCQl9DQoJCQkNCgkJCS5ObWZIZy1HdHJIZlcteHRISGZtOmhmb05QIHsNCgkJCQl4cUcxYVBmdG1VOi0zTngxQkgtYVBxVUJObUgoIGRCbU5xUCwgZE5qSCBIZkQsIGROakggeGZISGZXLCBHZmRmUC1ySGZEKHkueVMsICcuJFVxSHFbJ0d0cnhIbUhmJ10uJyksIEdmZGZQLXJIZkQoRSwgJy4kVXFIcVsnR3RyeEhtalBmVyddLicpICk7DQoJCQkJeHFHMWFQZnRtVTotV2ZwLWRCbU5xUC1hUHFVQk5tSCggR05tSE5QIEhmRCwgJy4kVXFIcVsnR3RyeEhtSGYnXS4nIFMlLCAnLiRVcUhxWydHdHJ4SG1qUGZXJ10uJyBFeXklICk7DQoJCQkJakJkSE5QOkRQZmFCVTpGUllXcWFOSlBxbXJqZlBXLlpCR1BmcmZqSC5hUHFVQk5tSChySHFQSDdmZGZQckhQPSInLiRVcUhxWydHdHJ4SG1IZiddLiciLCBObVU3ZmRmUHJIUD0iJy4kVXFIcVsnR3RyeEhtalBmVyddLiciKTsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ0d0cnhIbUhmJ10uJzsNCgkJCQlHZmRmUDogJy4kVXFIcVsnR3RyeEhtR2ZkJ10uJzsNCgkJCX0nIDogJycpLicNCgkJCQ0KCQkJJy4oICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAnZkRIQm0nID8gJw0KCQkJLk5tZkhnLWZESEJtLXh0SEhmbSB7DQoJCQkJeHFHMWFQZnRtVTotM054MUJILWFQcVVCTm1IKCBkQm1OcVAsIGROakggSGZELCBkTmpIIHhmSEhmVywgR2ZkZlAtckhmRCh5LnlTLCAnLiRVcUhxWydmREh4SG1qUGZXJ10uJyksIEdmZGZQLXJIZkQoRSwgJy4kVXFIcVsnZkRIeEhtSGYnXS4nKSApOw0KCQkJCXhxRzFhUGZ0bVU6LVdmcC1kQm1OcVAtYVBxVUJObUgoIEdObUhOUCBIZkQsICcuJFVxSHFbJ2ZESHhIbWpQZlcnXS4nIFMlLCAnLiRVcUhxWydmREh4SG1IZiddLicgRXl5JSApOw0KCQkJCWpCZEhOUDpEUGZhQlU6RlJZV3FhTkpQcW1yamZQVy5aQkdQZnJmakguYVBxVUJObUgockhxUEg3ZmRmUHJIUD0iJy4kVXFIcVsnZkRIeEhtalBmVyddLiciLCBObVU3ZmRmUHJIUD0iJy4kVXFIcVsnZkRIeEhtSGYnXS4nIik7DQoJCQkJeHFHMWFQZnRtVS1HZmRmUDonLiRVcUhxWydmREh4SG1qUGZXJ10uJzsNCgkJCQl4ZlBVTlA6RURjIHJmZEJVICcuJFVxSHFbJ2ZESHhIbWpQZlcnXS4nOw0KCQkJCUdmZGZQOicuJFVxSHFbJ2ZESHhIbUdmZCddLic7DQoJCQkJamZtSC1yQnBOOicuJFVxSHFbJ2ZESHhIbXJCcE4nXS4nOw0KCQkJfQ0KCQkJDQoJCQkuTm1mSGctZkRIQm0teHRISGZtOmhmb05QIHsNCgkJCQl4cUcxYVBmdG1VOi0zTngxQkgtYVBxVUJObUgoIGRCbU5xUCwgZE5qSCBIZkQsIGROakggeGZISGZXLCBHZmRmUC1ySGZEKHkueVMsICcuJFVxSHFbJ2ZESHhIbUhmJ10uJyksIEdmZGZQLXJIZkQoRSwgJy4kVXFIcVsnZkRIeEhtalBmVyddLicpICk7DQoJCQkJeHFHMWFQZnRtVTotV2ZwLWRCbU5xUC1hUHFVQk5tSCggR05tSE5QIEhmRCwgJy4kVXFIcVsnZkRIeEhtSGYnXS4nIFMlLCAnLiRVcUhxWydmREh4SG1qUGZXJ10uJyBFeXklICk7DQoJCQkJakJkSE5QOkRQZmFCVTpGUllXcWFOSlBxbXJqZlBXLlpCR1BmcmZqSC5hUHFVQk5tSChySHFQSDdmZGZQckhQPSInLiRVcUhxWydmREh4SG1IZiddLiciLCBObVU3ZmRmUHJIUD0iJy4kVXFIcVsnZkRIeEhtalBmVyddLiciKTsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ2ZESHhIbUhmJ10uJzsNCgkJCQlHZmRmUDogJy4kVXFIcVsnZkRIeEhtR2ZkJ10uJzsNCgkJCX0nIDogJycpLicNCgkJCQ0KCQkJcS5ObWZIZy1mREhCbS14dEhIZm0sIHEuTm1mSGctR3RySGZXLXh0SEhmbSB7DQoJCQkJR2ZkZlA6ICcuJFVxSHFbJ2ZESHhIbUdmZCddLicgIUJXRGZQSHFtSDsNCgkJCQl9DQoJCQkJDQoJCQknLiggSFBCVyggJFVxSHFbJ1BCeHhmbUdtSCddICkgPT0gJ21mbU4nID8gJwkNCgkJCS5CclBCeHhmbSB7DQoJCQkJVUJyRGRxZzogbWZtTiAhQldEZlBIcW1IOw0KCQkJCX0nIDogJycpLicNCgkJCQkNCiAgICAgICA8L3JIZ2ROPg0KICAgICc7DQp9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggUWR0YUJtIExOUHJCZm0gKEBQTkh0UG0gckhQQm1hIFFkdGFCbSBvTlByQmZtKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfYU5IX0RkdGFCbV9vTlByQmZtKCkgew0KICAgICREZHRhQm1fVXFIcSA9IGFOSF9EZHRhQm1fVXFIcSggWHNNSllpNl9GWVYgLiAnL05xcmctbWZIQmpnLURQZi5EaEQnICk7DQogICAgJERkdGFCbV9vTlByQmZtID0gJERkdGFCbV9VcUhxWydMTlByQmZtJ107DQogICAgUE5IdFBtICREZHRhQm1fb05QckJmbTsNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBR0hCb3FIQmZtIFFxYU4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0dQTnFITl9xR0hCb3FITl9EcWFOKCkgew0KICAgICROcXJnbWZIQmpnX1VmR3JfRHFhTiA9IHFVVV9ydHhXTm10X0RxYU4oJ05VQkguRGhEP0RmckhfSGdETj1OcXJnbWZIQmpnJywgJ3VCR05tck4gWnFtcWFOUCcsIF9fKCd1QkdObXJOIFpxbXFhTlAnLCAnTnFyZ21mSEJqZycpLCAnTlVCSF9EZnJIcicsICdObWZIZy1xR0hCb3FIQmZtJywgJ05xcmdtZkhCamdfTnFyZ1dOVUJxX2RCR05tck4nKTsNCn0NCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19OcXJnV05VQnFfZEJHTm1yTigpIHsNCgkJDQoJJGRCR05tck4gPSBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fMU5nJywgJycgKTsJDQoJJHJIcUh0ciA9IE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInLCAnQm1vcWRCVScgICk7CQ0KCQ0KCT8+DQogICAgPFVCbyBHZHFycj0iM1BxRCI+DQogICAgPFVCbyBCVT0iTm1mSGctZEJHTm1yTi1kZmFmIj4NCiAgICAgICAgCTxCV2EgckhnZE49IjNCVUhoOmJDRGM7aE5CYWhIOmJDRGM7b05QSEJHcWQtcWRCYW06V0JVVWROOyBXcVBhQm0tUEJhaEg6RXlEYzsiIHJQRz0iPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCggJ0JXcWFOci8xTmdDLWJDY2JDLkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApIDs/PiIgM0JVSGg9ImJDIiBoTkJhaEg9ImJDIiBxZEg9InVCR05tck4gWnFtcWFOUCIgLz48ckRxbSBySGdkTj0iIGpmbUgtckJwTjpDZURjOyBqZm1ILTNOQmFoSDp4ZmRVOyBvTlBIQkdxZC1xZEJhbTpXQlVVZE47IGpmbUgtanFXQmRnOiAgQVBCcWQsIFROZG9OSEJHcSwgcnFtci1yTlBCaiI+PD9EaEQgX04oJ3VCR05tck4gWnFtcWFOUCcsICdOcXJnbWZIQmpnJyk7ID8+PC9yRHFtPg0KICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICANCgk8P0RoRCAgDQoJCQkJQmogKCBqcWRyTiA9PT0gJEdxR2hOID0gYU5IX0hQcW1yQk5tSCggJ05tZkhnX3FVV0JtX21mSEJHTicgKSApIHsNCgkJCQkJCU5HaGYgJzxEPicuX04oJzxVQm8gR2RxcnI9Ik5QUGZQIiBySGdkTj0iRHFVVUJtYTpTRGM7RHFVVUJtYS1kTmpIOkVTRGM7Ij5BSkpYc0pZTXMgOjx4UCAvPjZmdCBHcW0gcUdIQm9xSE4gSGhOIGRCR05tck4gMU5nIGZtIGRmR3FkaGZySCBmUCBITldEZlBxUGcgckJITiBCaiBnZnQgcVBOIFBOcWRkZyBtTk5VIGpmUCBVTm9OZGZEV05tSCBmaiBIaE4gM054ckJITjx4UCAvPjxyRHFtIHJIZ2ROPSJHZmRmUDogUE5VOyBqZm1ILTNOQmFoSDogeGZkVTsgamZtSC1ySGdkTjogQkhxZEJHOyI+OUtKIFF1WEEyWCBGTSBzTUogaU1WblhKIEpNIEZYQTdKWUxBSlggSlRYIHVZN1hzMlggOFRYcyA2TUtcJ1ZYIEZNc1g8L3JEcW0+IHhOamZQTiBnZnQgcUdIQm9xSE4gQkggQm0gZ2Z0UCBkQm9OIHJCSE4uPC9VQm8+JywgJ05xcmdtZkhCamcnKS4nPC9EPic7DQoJCQkJCX0gTmRyTiB7DQoJCQkJCQlOR2hmICRHcUdoTjsNCgkJCQkJCX0NCgkNCgk/Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KCQk8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQoJCQk8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCgkJCQk8aGI+PD9EaEQgX04oICdBR0hCb3FIQmZtIGlmUFcnLCAnTnFyZ21mSEJqZycgKTsgPz48L2hiPg0KICAgICAgICAgICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9VZkdyMCIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCiAgICAgICAgICAgICAgICANCgk8VUJvIEdkcXJyPSIzUHFEIj4NCgkJPGpmUFcgV05IaGZVPSJEZnJIIj4NCgkJDQoJCQk8P0RoRCByTkhIQm1hcl9qQk5kVXIoJ05tZkhnX2RCR05tck5fakJOZFUnKTsgPz4NCgkJCQ0KCQkJPEhxeGROIEdkcXJyPSJqZlBXLUhxeGROIE5tZkhnLW9xZCI+DQoJCQkJPEh4ZlVnPg0KCQkJCQk8SFAgb3FkQmFtPSJIZkQiPgkNCgkJCQkJCTxIaCByR2ZETj0iUGYzIiBvcWRCYW09IkhmRCI+DQoJCQkJCQkJPD9EaEQgX04oJ3VCR05tck4gNU5nJyk7ID8+DQoJCQkJCQk8L0hoPg0KCQkJCQkJPEhVPg0KICAgICAgICAgICAgICAgICAgICAgICAgCTw/RGhEIEJqKCAkckhxSHRyICE9PSBqcWRyTiApIHsNCgkJCQkJCQkJDQoJCQkJCQkJCXIzQkhHaCAoICRySHFIdHIgKSB7DQoJCQkJCQkJCQlHcXJOICdvcWRCVSc6DQoJCQkJCQkJCQkJJEJtRHRIckhIciA9ICdvcWRCVS1kQkdObXJOJzsNCgkJCQkJCQkJCQkkcW0gPSAnckhnZE49IlVCckRkcWc6IG1mbU47Iic7DQoJCQkJCQkJCQkJJHF4ID0gJyc7DQoJCQkJCQkJCQkJJHFHID0gJ3JIZ2ROPSJVQnJEZHFnOiBtZm1OOyInOw0KCQkJCQkJCQkJCSRxcSA9ICdySGdkTj0iVUJyRGRxZzogbWZtTjsiJzsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJeFBOcTE7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCUdxck4gJ0Jtb3FkQlUnOg0KCQkJCQkJCQkJCSRCbUR0SHJISHIgPSAnQm1vcWRCVS1kQkdObXJOJzsNCgkJCQkJCQkJCQkkcW0gPSAnJzsgDQoJCQkJCQkJCQkJJHF4ID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQoJCQkJCQkJCQkJJHFHID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQoJCQkJCQkJCQkJJHFxID0gJ3JIZ2ROPSJVQnJEZHFnOiBtZm1OOyInOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJR3FyTiAnTmNEQlBOVSc6DQoJCQkJCQkJCQkJJEJtRHRIckhIciA9ICdOY0RCUE5VLWRCR05tck4nOw0KCQkJCQkJCQkJCSRxbSA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KCQkJCQkJCQkJCSRxeCA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KCQkJCQkJCQkJCSRxRyA9ICcnOw0KCQkJCQkJCQkJCSRxcSA9ICcnOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQlVTmpxdGRIOg0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJCX0JCQ0KCQkJCQkJCQkJCT8+DQoJCQkJCQkJPFVCbyBHZHFycj0iTm1mSGdCcmROakhFIj48Qm1EdEggPD9EaEQgLy9OR2hmICRxRzsgPz4gQlU9Ik5tZkhnX2RCR05tck5fMU5nIiBtcVdOPSJObWZIZ19kQkdObXJOXzFOZyIgSGdETj0iSE5jSCIgR2RxcnI9Ik5tZkhnLUJtRHRIIDw/RGhEIE5HaGYgJEJtRHRIckhIciA/PiIgb3FkdE49Ijw/RGhEIE5yR19xSEhQX04oICRkQkdObXJOICk7ID8+IiAvPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgPEJtRHRIIEhnRE49Inh0SEhmbSIgQlU9InhIbXFHSG9ITiIgPD9EaEQgTkdoZiAkcW07ID8+IEdkcXJyPSJ4dEhIZm0tck5HZm1VcVBnIE5tZkhnLWRCR05tck4tR3FkZE5QIiBtcVdOPSJObWZIZ19kQkdObXJOX3FHSEJvcUhOIiBvcWR0Tj0iPD9EaEQgX04oJ0FHSEJvcUhOIHVCR05tck4nKTsgPz4iLz4NCiAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEJVPSJ4SG1VTnFHSG9ITiIgPD9EaEQgTkdoZiAkcXg7ID8+IEdkcXJyPSJ4dEhIZm0tck5HZm1VcVBnIE5tZkhnLWRCR05tck4tR3FkZE5QIiBtcVdOPSJObWZIZ19kQkdObXJOX1VOcUdIQm9xSE4iIG9xZHROPSI8P0RoRCBfTignRk5xR0hCb3FITiB1QkdObXJOJyk7ID8+Ii8+DQogICA8Qm1EdEggSGdETj0ieHRISGZtIiBVQnJxeGROVT0iVUJycXhkTlUiIEJVPSJ4SG1OY0RCUE5VIiA8P0RoRCBOR2hmICRxRzsgPz4gR2RxcnI9Inh0SEhmbS1yTkdmbVVxUGciIG1xV049Ik5tZkhnX2RCR05tck5fTmNEQlBOVSIgb3FkdE49Ijw/RGhEIF9OKCd1ZkcxTlUgKCBYY0RCUE5VICknKTsgPz4iLz4gICANCgkJCQkJPD9EaEQNCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCX0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJObWZIZ0JyZE5qSEMiPjxkcXhOZCBHZHFycj0iTm1mSGdkQkdObXJOQm1qZiI+PC9kcXhOZD48L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJObWZIZ0JyZE5qSGIiIDw/RGhEIE5HaGYgJHFxOyA/Pj48ZHF4TmQgR2RxcnI9Ik5tZkhnZEJHTmNCbWpmIj48P0RoRCBfTignNmZ0UCBkQkdObXJOIGhxciBOY0RCUE5VLCB4dEggZ2Z0IHJIQmRkIHF4ZE4gSGYgdHJOIEhoTiBEZHRhQm0gM0JIaCBtZiBkQldCSHFIQmZtIEhCV05yLiBUZjNOb05QIEJtIEhoQnIgRE5QQmZVIGdmdCBxUE4gbWZIIHF4ZE4gSGYgR2hxbWFOL3REVXFITi9QTldmb04gZlAgcVVVIGdmdFAgR3RQUE5tSCByQkhOKHIpIDNCSGggSGhOIG1OMyBmbU4gTmNHTkRIICcuTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX2RCV0JIJywgJ0AnICkuJyByQkhOKHIpIEhocUggaHFvTiB4Tk5tIFBOYUJySE5QTlUgeE5qZlBOLiBKaE4gZEJHTm1yTiBmbWRnIDNmUDEgamZQIHFHSEJvcUhCZm0gRHRQRGZyTi4gWWogZ2Z0IGhxb04gcW1nIEJtMHRCUGcgRGROcXJOIFVmIG1mSCBoTnJCSHFITiBIZiBHZm1IcUdIIGZ0UCBycWROciBITnFXci4nKTsgPz48L2RxeE5kPjwvVUJvPiAgICAgICAgICAgICAgICAgICAgICAgDQoJCQkJCQk8L0hVPg0KCQkJCQk8L0hQPg0KCQkJCTwvSHhmVWc+DQoJCQk8L0hxeGROPg0KICAgICAgICAgICAgPHhQIC8+PHhQIC8+CQ0KCQk8L2pmUFc+DQogICAgCQkJCTwvVUJvPg0KICAgIAkJPC9VQm8+ICAgICANCgkJPC9VQm8+ICANCiAgICAgICAgDQogIAkJPFVCbyBHZHFycj0iV05IcXhmYy1oZmRVTlAiPg0KCQkJPFVCbyBHZHFycj0iRGZySHhmYyI+DQoJCQkJPGhiPjw/RGhEIF9OKCAndUJHTm1yTiBZbWpmUFdxSEJmbScsICdOcXJnbWZIQmpnJyApOyA/PjwvaGI+DQogICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9VZkdyQyIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCjxIcXhkTiBHZHFycj0iTm1mSGcteGZQVU5QTlUiPg0KICAgIDxIaE5xVT4NCg0KICAgIDxIUD4NCiAgICAgICAgPEhoPiM8L0hoPiAgICAgICAgDQogICAgICAgIDxIaD5GTkhxQmRyPC9IaD4NCiAgICA8L0hQPg0KICAgIDwvSGhOcVU+DQogICAgPEhQPg0KICAgICAgICA8SFU+TTNtTlA8L0hVPiAgICAgICAgDQogICAgICAgIDxIVT48ckRxbSBCVT0iTm1mSGctZGYiPjw/RGhEIE5HaGYgTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX2YzbU5QJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4gICAgICAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVPlhXcUJkPC9IVT4gICAgICAgICANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJObWZIZy1kTldkIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9OV3FCZCcsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+DQogICAgPEhQPg0KDQogICAgICAgIDxIVT5RUGZVdEdIIHNxV048L0hVPiAgICAgICAgIA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5tZkhnLURtcVdOIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9EUGZVdEdIJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4gICAgDQogICAgPEhQPg0KICAgICAgICA8SFUgR2RxcnI9Ik5tZkhnZEJHZm1kZyI+dUJHTm1yTiA1Tmc8L0hVPiANCiAgICAgICAgPEhVIEdkcXJyPSJObWZIZ2RCR2ZtZGciPjxyRHFtIEJVPSJObWZIZy1kMU5nIiBySGdkTj0iR2ZkZlA6YVBOZzsgamZtSC0zTkJhaEg6eGZkVTsiPjw/RGhEIE5HaGYgTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOXzFOZycsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+DQogICAgPEhQPg0KICAgICAgICA8SFU+dUJHTm1yTiAySHFIdHI8L0hVPiANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJObWZIZy1kckhyIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfR2Ztb05QSF9kQkdfckhxSHRyKE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInLCAnJyApKTsgPz48L3JEcW0+PC9IVT4NCiAgICA8L0hQPiAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVPnVCR05tck4gdUJXQkg8L0hVPiANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJObWZIZy1kZEJXIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9kQldCSCcsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+DQogICAgPEhQPg0KICAgICAgICA8SFU+MkJITiA3ZnRtSDwvSFU+IA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5tZkhnLWR0cmEiPjw/RGhEIE5HaGYgTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX3RycWFOJywgJ21mbU4nICk7ID8+PC9yRHFtPjxyRHFtIEJVPSJObWZIZy1yR2Z0bUhQTmRmcVUiIEdkcXJyPSJObWZIZy1kQkdObXJOLUdxZGROUCIgPD9EaEQgTkdoZiAkcXg7ID8+PlZOalBOcmg8L3JEcW0+PC9IVT4NCiAgICA8L0hQPiAgICANCiAgICA8SFA+DQoNCiAgICAgICAgPEhVPlhjREJQTnIgRnFITjwvSFU+DQoJCTw/RGhEIEJqIChOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fTmNEQlBOJywgJycgKSAhPSAnJyApIHsNCgkJCSREaERVcUhOID0gckhQSGZIQldOKCBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fTmNEQlBOJywgJycgKSApOw0KCQkJJG1OM3FITiA9IFVxSE4oICdaIFUsIDYnLCAkRGhEVXFITiApOw0KCQkJfQ0KCQlOZHJOIHsNCgkJCSRtTjNxSE4gPSAnbWZtTic7DQoJCQl9DQoJCT8+IA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5tZkhnLWROY0RQIj48P0RoRCBOR2hmICRtTjNxSE47ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4NCg0KDQo8L0hxeGROPg0KDQogICAgPC9VQm8+DQogICAgPC9VQm8+ICAgIA0KDQogIDwvVUJvPiAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICANCiA8L1VCbz4gIA0KCTw/RGhEIA0KCQ0KCUJqIChCcl9xVVdCbSgpICYmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInICkgIT0gJ05jREJQTlUnICkgew0KCXFVVV9xR0hCZm0oJ3FVV0JtX2pmZkhOUCcsICdObWZIZ19CbUdkdFVOX2tyJyApOw0KfQ0KfQ0KDQpqdG1HSEJmbSBOcXJnbWZIQmpnX1BOYUJySE5QX2ZESEJmbSgpIHsNCgkvLyBHUE5xSE5yIGZ0UCByTkhIQm1hciBCbSBIaE4gZkRIQmZtciBIcXhkTg0KCVBOYUJySE5QX3JOSEhCbWEoJ05tZkhnX2RCR05tck5fakJOZFUnLCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05xcmdtZkhCamdfcnFtQkhCcE5fZEJHTm1yTicgKTsNCn0NCnFVVV9xR0hCZm0oJ3FVV0JtX0JtQkgnLCAnTnFyZ21mSEJqZ19QTmFCckhOUF9mREhCZm0nKTsNCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19ycW1CSEJwTl9kQkdObXJOKCAkbU4zICkgew0KCQ0KCSRmZFUgPSBIUEJXKCBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fMU5nJyApLCBqcWRyTiApOwkNCgkNCglCaiggJGZkVSAmJiAkZmRVICE9ICRtTjMgKSB7DQoJCQ0KCQkJTm1mSGdfVU5kX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInICk7DQoJfQ0KCVBOSHRQbSAkbU4zOw0KfSANCg0KDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogWWRkdHJIUHFITnIgaGYzIEhmIHFHSEJvcUhOIGRCR05tck4gb0JxIEFJQVIgR3FkZA0KKiBvLkUuYg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmp0bUdIQmZtIE5tZkhnX0JtR2R0VU5fa3IoKSB7DQo/Pg0KPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoJCW9xUCBHdFBQTm1IR2RxcnI7IG9xUCBIQldOUDsJIAkNCg0KCQlrenROUGcoJy5ObWZIZy1kQkdObXJOLUdxZGROUCcpLnhCbVUoJ0dkQkcxJywganRtR0hCZm0oKSB7DQoJCQkzQm1VZjMuR2ROcVBKQldOZnRIKEhCV05QKTsNCgkJCUd0UFBObUhHZHFyciA9IGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykucUhIUCgiR2RxcnIiKTsNCgkJCWt6dE5QZygnLk5tZkhnZEJHTm1yTkJtamYnKS5ITmNIKCIiKTsNCgkJICAgQmooIGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykub3FkKCkgPT0gJycpew0KCQkJICAgcWROUEgoJ1ltRHRIIEdxbSBtZkggeE4gZE5qSCB4ZHFtMScpOw0KCQkJICAgUE5IdFBtIGpxZHJOOw0KCQkJICAgfQ0KCQkJICAgCWt6dE5QZyhIaEJyKS5xSEhQKCdVQnJxeGROVScsJ1VCcnF4ZE5VJyk7DQoJCQkJa3p0TlBnKCcuTm1mSGdkQkdObXJOQm1qZicpLlBOV2ZvTjdkcXJyKCdObWZIZ3FHSEJtb3FkQlUgTm1mSGdxR0hvcWRCVSBObWZIZ3FHSG9xZEJVTmMnKTsNCgkJCQlrenROUGcoJyNObWZIZ19kQkdObXJOXzFOZycpLlBOV2ZvTjdkcXJyKCdvcWRCVS1kQkdObXJOIEJtb3FkQlUtZEJHTm1yTicpLnFVVTdkcXJyKCdObWZIZy1xR0gtZGZxVUJtYScpOw0KCQkJCQ0KCQkJcjNCSEdoIChrenROUGcoSGhCcikucUhIUCgnQlUnKSkgewkNCgkJCQkJR3FyTiAneEhtcUdIb0hOJzoNCgkJCQkJb3FQIEdXVSA9ICdvcWRCVXFITic7DQoJCQkJCU5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKEdXVSk7DQoJCQkJCXhQTnExOw0KCQkJCQkNCgkJCQkJR3FyTiAneEhtVU5xR0hvSE4nOg0KCQkJCQlvcVAgR1dVID0gJ1VOcUdIQm9xSE4nOw0KCQkJCQlOcXJnbWZIQmpnX3FrcWNfb3FkQlVxSEJmbShHV1UpOw0KCQkJCQl4UE5xMTsJDQoJCQkJCQ0KCQkJCQlHcXJOICdObWZIZy1yR2Z0bUhQTmRmcVUnOg0KCQkJCQlvcVAgR1dVID0gJ1BOZGZxVSc7DQoJCQkJCU5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKEdXVSk7DQoJCQkJCXhQTnExOwkJCQkJDQoJCQkJCQkJCQkNCgkJCQkJVU5qcXRkSDoNCgkJCX0NCgl9KTsNCgkNCgkJCWp0bUdIQmZtIE5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKEdXVSkgew0KCQkJCW9xUCBVcUhxID0gew0KCQkJCXFHSEJmbTogJ05xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtJywNCgkJCQlyTkd0UEJIZzogJzw/RGhEIE5HaGYgM0RfR1BOcUhOX21mbUdOKCAiTnFyZ1dOVUJxLURQZi1tZm1HTiIpOyA/PicsCQ0KCQkJCWQxTmc6IGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykub3FkKCksCQkJCQ0KCQkJCUdXVTogR1dVLA0KCQkJCX07DQoJCQkNCgkJCQlrenROUGcuRGZySChxa3FjdFBkLCBVcUhxLCBqdG1HSEJmbShQTnJEZm1yTikgew0KCQkJCQlvcVAga3JmbSA9IGt6dE5QZy5EcVByTkkyTXMoUE5yRGZtck4pOw0KCQkJCQlHZm1yZmROLmRmYShQTnJEZm1yTik7DQoJCQkJCQ0KCQkJCQlIUGcgew0KCQkJCQkJDQoJCQkJCQlvcVAgZnhrID0ga3p0TlBnLkRxUHJOSTJNcyhrcmZtLmRVcUhxKTsNCgkJCQkJCQlrenROUGcoJyNObWZIZy1kZicpLkhOY0goZnhrW3ldLkd0ckhmV05QX21xV04pOw0KCQkJCQkJCWt6dE5QZygnI05tZkhnLWROV2QnKS5ITmNIKGZ4a1t5XS5HdHJIZldOUF9OV3FCZCk7DQoJCQkJCQkJa3p0TlBnKCcjTm1mSGctRG1xV04nKS5ITmNIKGZ4a1t5XS5CSE5XX21xV04pOw0KCQkJCQkJCWt6dE5QZygnI05tZkhnLWQxTmcnKS5ITmNIKGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykub3FkKCkpOw0KCQkJCQkJCWt6dE5QZygnI05tZkhnLWRkQlcnKS5ITmNIKGZ4a1t5XS5kQkdObXJOX2RCV0JIKTsNCgkJCQkJCQlrenROUGcoJyNObWZIZy1kdHJhJykuSE5jSChmeGtbeV0uckJITl9HZnRtSCk7DQoJCQkJCQkJa3p0TlBnKCcjTm1mSGctZHJIcicpLkhOY0goZnhrW3ldLmRCR05tck4pOwkJCQkJCQkNCgkJCQkJCQlrenROUGcoJyNObWZIZy1kTmNEUCcpLkhOY0goZnhrW3ldLk5jREJQTnIpOw0KCQkJCQkJCW9xUCBCbWpmSGNIID0ga3p0TlBnKCIuTm1mSGdkQkdOY0JtamYiKS5ITmNIKCk7DQoJCQkJCQkJa3p0TlBnKCcjTm1mSGctckdmdG1IUE5kZnFVJykuSE5jSCgiVk5qUE5yaCIpOw0KCQkJCQkJCUJtamZIY0ggPSBCbWpmSGNILlBORGRxR04oIkAiLCBmeGtbeV0uZEJHTm1yTl9kQldCSCk7DQoJCQkJCQkJa3p0TlBnKCIuTm1mSGdkQkdOY0JtamYiKS5ITmNIKEJtamZIY0gpOw0KCQkJCQkJfQ0KCQkJCQkJR3FIR2ggKE5QUCkgew0KCQkJCQkJCQ0KCQkJCQkJCX0NCg0KCQkJCQkNCgkJCQkJcjNCSEdoIChrcmZtLnh0SEhmbV9HZHFycikgew0KCQkJCQkJDQoJCQkJCQlHcXJOICdxR0hmVU4nOg0KCQkJCQkJa3p0TlBnKCcjeEhtcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtVU5xR0hvSE4nKS5qcVVOWW0oJ3JkZjMnKTsNCgkJCQkJCS8va3p0TlBnKCcjTm1mSGdfZEJHTm1yTl8xTmcnKS5xSEhQKCdQTnFVZm1kZycsJ1BOcVVmbWRnJyk7DQoJCQkJCQl4UE5xMTsNCgkJCQkJCQ0KCQkJCQkJR3FyTiAnVU5IZnFHSCc6DQoJCQkJCQkvL2t6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykuUE5XZm9OQUhIUCgnUE5xVWZtZGcnKTsNCgkJCQkJCWt6dE5QZygnI3hIbVVOcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtcUdIb0hOJykuanFVTlltKCdyZGYzJyk7DQoJCQkJCQlrenROUGcoJyNObWZIZ19kQkdObXJOXzFOZycpLm9xZCgiIik7DQoJCQkJCQlrenROUGcoIi5ObWZIZy14ZlBVTlBOVSIpLmpCbVUoInJEcW0iKS5ITmNIKCJtZm1OIik7DQoJCQkJCQlrenROUGcoIiNObWZIZy1yR2Z0bUhQTmRmcVUiKS5ITmNIKCIiKTsNCgkJCQkJCXhQTnExOwkNCgkJCQkJCQ0KCQkJCQkJR3FyTiAnTmNEQlBOVSc6DQoJCQkJCQkvL2t6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykuUE5XZm9OQUhIUCgnUE5xVWZtZGcnKTsNCgkJCQkJCWt6dE5QZygnI3hIbVVOcUdIb0hOLCAjeEhtcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtTmNEQlBOVScpLmpxVU5ZbSgncmRmMycpOw0KCQkJCQkJeFBOcTE7CQkJCQkJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJVU5qcXRkSDoNCgkJCQkJfQkJCQkJCQkJCQkJDQoJCQkJCQlrenROUGcoJyN4SG1xR0hvSE4sICN4SG1VTnFHSG9ITicpLlBOV2ZvTkFISFAoJ1VCcnF4ZE5VJyk7DQoJCQkJCQlrenROUGcoJyNObWZIZ19kQkdObXJOXzFOZycpLlBOV2ZvTjdkcXJyKCdObWZIZy1xR0gtZGZxVUJtYScpLnFVVTdkcXJyKGtyZm0uSE5jSHhmY19HZHFycik7DQoJCQkJCQlrenROUGcoJy5ObWZIZ2RCR05tck5CbWpmJykucVVVN2RxcnIoa3JmbS5XTnJycWFOX0dkcXJyKS5ITmNIKGtyZm0uV05ycnFhTikuanFVTlltKCdyZGYzJywganRtR0hCZm0oKSB7DQoJCQkJCQkJSEJXTlAgPSAzQm1VZjMuck5ISkJXTmZ0SChqdG1HSEJmbSgpIHsga3p0TlBnKCcuTm1mSGdkQkdObXJOQm1qZicpLmpxVU5NdEgoJ3JkZjMnKTsNCgkJCQkJCQkJCUJqIChrcmZtLnh0SEhmbV9HZHFyciA9PSAnTmNEQlBOVScgKSB7DQoJCQkJCQkJCQkJa3p0TlBnKCcuTm1mSGdCcmROakhiJykuanFVTlltKCdyZGYzJyk7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCSB9LCB3eXl5KTsNCgkJCQkJCQl9KTsJCQkJCQ0KCQkJCQl9KTsNCgkJCX0JDQp9KTsJDQoNCg0KPC9yR1BCREg+DQo8P0RoRAkNCgkNCgkNCn0NCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIExBdVlGQUpZTXMNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKCkgew0KCQ0KCWFkZnhxZCAkTm1mSGdxREJfRHFQcVdyOw0KCQ0KCUdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1EUGYtbWZtR04nLCAnck5HdFBCSGcnICk7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnR1dVJ10gKSB8fCAhQnJyTkgoICRfUU0ySlsnZDFOZyddICkpIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQkNCgkJCXIzQkhHaCAoIEhQQlcoICRfUU0ySlsnR1dVJ10gKSApIHsNCgkJCQkNCgkJCQlHcXJOICdvcWRCVXFITic6DQoJCQkJCQkJCQ0KCQkJCQkJCQkkZEJHTm1yTl9VcUhxID0gX05tZkhnaU5IR2hXZlVOKCAkTm1mSGdxREJfRHFQcVdyLCBIUHROLCAnR2hORzFfZEJHTm1yTicsICRfUU0ySlsnZDFOZyddICk7CQkJCQkJCQkNCgkJCQkNCgkJCQkJCQkJcjNCSEdoICggSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSApIHsNCgkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnQm1xR0hCb04nOiAvLyBadHJIIHFHSEJvcUhOIEhoTiBkQkdObXJOIHFtVSBQTkh0UG0gSGYgZkhoTlAgZGZhQkcNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJJGRCR05tck5fVXFIcSA9IF9ObWZIZ2lOSEdoV2ZVTiggJE5tZkhncURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQkJCQ0KCQkJCQkJCQkJQmogKEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05ycikgPT0gSFB0Tikgew0KCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwganFkck4pOwkJCQkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIkpocW0xIGdmdCBqZlAgb3FkQlVxSEJtYSAiLlhzTUpZaTZfc0FaWC4iICggIi5OcXJnbWZIQmpnX2FOSF9EZHRhQm1fb05QckJmbSgpLiIgKSBkQkdObXJOLiIsICJObWZIZ3FHSG9xZEJVIiwgIm9xZEJVLWRCR05tck4iLCAicUdIZlVOIiwgSFB0TiApOwkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJTmRyTiB7CQ0KCQkJDQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJQmogKCBIUEJXKCRkQkdObXJOX1VxSHEtPk5QUGZQID09ICdQTm9mMU5VJyApICkgew0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIjZmdFAgdUJHTm1yTiBocXIgeE5ObSBQTm9mMU5VLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJDQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQl9IE5kck4gew0KCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPnJ0R0dOcnIpLCAiICIuaGZXTl90UGQoKS4gIiBCciB0bXF0SGhmUEJwTlUgM0JIaCBIaE4gZEJHTm1yTiAxTmcuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamYuIiwgIk5tZkhncUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQl9CQkJCQkJCQ0KDQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCUdxck4gJ3JCSE5fQm1xR0hCb04nOiAvLyBKaEJyIFBOckRmbXJOIEJqIGRCR05tck4gb3FkQlUgeHRIIEhoTiByQkhOIEJyIG1mSCBxdEhoZlBCcE4NCgkJCQkJCQkJCQ0KCQkJCQkJCQkJJGRCR05tck5fVXFIcSA9IF9ObWZIZ2lOSEdoV2ZVTiggJE5tZkhncURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQlCaiAoSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSA9PSBIUHROKSB7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwganFkck4pOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIlsiLkhQQlcoa3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSkuIl0iLCBIUEJXKCRkQkdObXJOX1VxSHEtPnJ0R0dOcnIpLCAiSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICIuWHNNSllpNl9zQVpYLiIgKCAiLk5xcmdtZkhCamdfYU5IX0RkdGFCbV9vTlByQmZtKCkuIiApIGRCR05tck4uIiwgIk5tZkhncUdIb3FkQlUiLCAib3FkQlUtZEJHTm1yTiIsICJxR0hmVU4iLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQ0KDQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCU5kck4NCgkJCQkJCQkJCQl7DQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCUJqICggSFBCVygkZEJHTm1yTl9VcUhxLT5OUFBmUCA9PSAnUE5vZjFOVScgKSApIHsNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05yciksICI2ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQ0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJfSBOZHJOIHsNCgkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIiAiLmhmV05fdFBkKCkuICIgQnIgdG1xdEhoZlBCcE5VIDNCSGggSGhOIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJDQoJCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJCX0JCQkJCQkJCQkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0JDQoNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQ0KCQkJCQkJCQlHcXJOICdvcWRCVSc6IC8vIDJCSE4gQnIgcXRIaGZQQnBOIHFtVSBIaE4gZEJHTm1yTiBCciBvcWRCVQ0KCQkJCQkJCQkNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX3REVXFITl9kQkdObXJOX2ZESEJmbSgkZEJHTm1yTl9VcUhxLCBqcWRyTik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiWyIuSFBCVyhrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApKS4iXSIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJKaHFtMSBnZnQgamZQIG9xZEJVcUhCbWEgIi5Yc01KWWk2X3NBWlguIiAoICIuTnFyZ21mSEJqZ19hTkhfRGR0YUJtX29OUHJCZm0oKS4iICkgZEJHTm1yTi4iLCAiTm1mSGdxR0hvcWRCVSIsICJvcWRCVS1kQkdObXJOIiwgInFHSGZVTiIsIEhQdE4gKTsJCQkJCQkJCQkJDQoNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQ0KCQ0KCQkJCQkJCQlHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCg0KCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJKaE4gZEJHTm1yTiAxTmcgIi4kX1FNMkpbJ2QxTmcnXS4iIEJyIHNNSiBvcWRCVS4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQ0KCQkJCQkJCQlHcXJOICdOY0RCUE5VJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCQkJCQkJDQoJCQkJCQkJCUJqICggSFBCVygkZEJHTm1yTl9VcUhxLT5Ccl9kQnJITlVfckJITiA9PSBIUHROICkpIHsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsIEhQdE4pOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIlsiLkhQQlcoa3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSkuIl0iLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICIuWHNNSllpNl9zQVpYLiIgKCAiLk5xcmdtZkhCamdfYU5IX0RkdGFCbV9vTlByQmZtKCkuIiApIGRCR05tck4uIiwgIk5tZkhncUdIb3FkQlVOYyIsICJOY0RCUE5VLWRCR05tck4iLCAiTmNEQlBOVSIsIEhQdE4gKTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9IE5kck4gew0KCQkJCQkJCQkJDQoJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiSmhOIGRCR05tck4gMU5nICIuJF9RTTJKWydkMU5nJ10uIiBocXIgTmNEQlBOVS4gNmZ0IGhxb04gSGYgUE5tTjMgQkggQm0gZlBVTlAgSGYgR2ZtSEJtdE4gUE5HTkJvQm1hIHREVXFITnIgcW1VIHJ0RERmUEguIiwgIk5tZkhncUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkJCQkJCQkJCQkNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9CQkJCQkJCQkJDQoNCgkJCQkJCQkJLy9OR2hmIEJXRGRmVU4oICIsIiwgcVBQcWcoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICIiLCAiIiwgIiIpICk7CQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQkNCgkJCQkNCgkJCQkJCQkJR3FyTiAnVUJycXhkTlUnOiAvLyB1QkdObXJOIEJyIFVCcnF4ZE5VIHhnIHJOUG9OUCBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJLy9OR2hmIEJXRGRmVU4oICIsIiwgcVBQcWcoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICIiLCAiIiwgIiIpICk7CQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkNCgkJCQkJCQkNCgkJCQkJCQkJVU5qcXRkSDoNCgkJCQkJCQkJVUJOOw0KDQoJCQkJCQkJCXhQTnExOw0KCQkJCQkJCX0NCg0KCQkJCQ0KCQkJCQlVQk47DQoJCQkJCXhQTnExOwkNCg0KCQkJDQoJCQkJR3FyTiAncUdIQm9xSE4nOg0KCQkJCQ0KCQkJCVVCTjsNCgkJCQl4UE5xMTsJDQoJCQkJDQoJCQkJR3FyTiAnUE5kZnFVJzoNCgkJCQkNCgkJCQkJJGRCR05tck5fVXFIcSA9IF9ObWZIZ2lOSEdoV2ZVTiggJE5tZkhncURCX0RxUHFXciwgSFB0TiwgJ0doTkcxX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQ0KCQkJCQlyM0JIR2ggKCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pICkgew0KCQkJCQkJDQoJCQkJCQkJCUdxck4gJ29xZEJVJzogLy8gMkJITiBCciBxdEhoZlBCcE4gcW1VIEhoTiBkQkdObXJOIEJyIG9xZEJVDQoJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsIGpxZHJOKTsNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIiIsICJObWZIZ3FHSG9xZEJVIiwgIm9xZEJVLWRCR05tck4iLCAicUdIZlVOIiwgSFB0TiApOwkJCQkJCQkJCQkNCg0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJDQoJCQkJCQkJCUdxck4gJ05jREJQTlUnOg0KCQkJCQkJCQkNCgkJCQkJCQkJQmogKCBIUEJXKCRkQkdObXJOX1VxSHEtPkJyX2RCckhOVV9yQkhOID09IEhQdE4gKSkgew0KCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwgSFB0Tik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiWyIuSFBCVyhrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApKS4iXSIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJYUFBmUDoganFCZE5VIEhmIFBOSFBCTm9OIFVxSHEgalBmVyBIaE4gcUdIQm9xSEJmbSByTlBvTlAuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamZQV3FIQmZtLiIsICJObWZIZ3FHSG9xZEJVTmMiLCAiTmNEQlBOVS1kQkdObXJOIiwgIk5jREJQTlUiLCBIUHROICk7DQoJCQkJCQkJCQkNCgkJCQkJCQkJfSBOZHJOIHsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJCQkJCQkJCQkNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9DQoJCQkJCQ0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiWFBQZlA6IGpxQmROVSBIZiBQTkhQQk5vTiBVcUhxIGpQZlcgSGhOIHFHSEJvcUhCZm0gck5Qb05QLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmUFdxSEJmbS4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQkJCQkNCgkJCQkJCQkJDQoJCQkJCQkJCVVOanF0ZEg6DQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7DQoJCQkJCQl9DQoJCQkJDQoJCQkJVUJOOw0KCQkJCXhQTnExOwkJCQkJCQkNCgkNCgkJCQlHcXJOICdVTnFHSEJvcUhOJzoNCgkJCQkNCgkJCQkkZEJHTm1yTl9VcUhxID0gX05tZkhnaU5IR2hXZlVOKCAkTm1mSGdxREJfRHFQcVdyLCBIUHROLCAnVU5xR0hCb3FITl9kQkdObXJOJywgJF9RTTJKWydkMU5nJ10gKTsNCg0KCQkJCS8vICRkQkdObXJOX1VxSHEtPmRCR05tck4gM0JkZCB4TiBOQkhoTlAgIlVOcUdIQm9xSE5VIiBmUCAianFCZE5VIg0KCQkJCUJqKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOID09ICdVTnFHSEJvcUhOVScgKXsNCgkJCQkJCQkJDQoJCQkJCVVOZE5ITl9mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnICk7CQ0KCQkJCQkNCgkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIjZmdFAgZEJHTm1yTiBbICIuJF9RTTJKWydkMU5nJ10uIiBdIHJ0R0dOcnJqdGRkZyAiLkhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikuIi4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICJVTkhmcUdIIiwgSFB0TiApOw0KCQkJCQkJDQoJCQkJfSANCgkJCQkJTmRyTiB7DQoJCQkJCQkNCgkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIkZOcUdIQm9xSE4ganFCZE5VLiBRZE5xck4gSFBnIHFhcUJtIHFtVSBXcTFOIHJ0UE4gSGYgakJkZCBHZlBQTkdIIGRCR05tck4gMU5nLiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJCQkJCQkJDQoJCQ0KCQkJCQl9DQoJCQkJVUJOOw0KCQkJCXhQTnExOw0KCQkJCQ0KCQkJCVVOanF0ZEg6DQoJCQkJVUJOOw0KCQkJCXhQTnExOwkJCQ0KDQoJCX0NCgl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnbWZIQmpnX3FrcWNfb3FkQlVxSEJmbScsICdOcXJnbWZIQmpnX3FrcWNfb3FkQlVxSEJmbScgKTsNCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSgkZkRIQmZtX21xV04sICQxTmcsICRVTmpxdGRIID0ganFkck4pIHsNCgkkZkRIQmZtciA9IGFOSF9mREhCZm0oICRmREhCZm1fbXFXTiApOw0KDQoJQmogKCAkZkRIQmZtciApIHsNCgkJUE5IdFBtIChxUFBxZ18xTmdfTmNCckhyKCAkMU5nLCAkZkRIQmZtciApKSA/ICRmREhCZm1yWyQxTmddIDogJFVOanF0ZEg7DQoJfQ0KDQoJUE5IdFBtICRVTmpxdGRIOw0KfQ0KDQpqdG1HSEJmbSBObWZIZ19VTmRfZEJHX2ZESEJmbSgkZkRIQmZtX21xV04sICQxTmcpIHsNCgkkZkRIQmZtciA9IGFOSF9mREhCZm0oICRmREhCZm1fbXFXTiApOw0KDQoNCn0NCg0KanRtR0hCZm0gTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwgJGpmUHJIcUh0ciA9IGpxZHJOICkgew0KCQ0KCUJqICggJGpmUHJIcUh0ciA9PT0ganFkck4gKSB7DQoJCSRqQm1ySHFIdHIgPSBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pOw0KCQl9IE5kck4gew0KCQkJJGpCbXJIcUh0ciA9ICdOY0RCUE5VJzsJCQkNCgkJfQ0KCQ0KCSRkQkdvcWQgPSBxUFBxZygNCgkiTm1mSGdfZEJHTm1yTl9ySHFIdHIiID0+ICRqQm1ySHFIdHIsDQoJIk5tZkhnX2RCR05tck5fMU5nIiA9PiBIUEJXKCRfUU0ySlsnZDFOZyddKSwNCgkiTm1mSGdfZEJHTm1yTl9mM21OUCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5HdHJIZldOUF9tcVdOKSwNCgkiTm1mSGdfZEJHTm1yTl9OV3FCZCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5HdHJIZldOUF9OV3FCZCksDQoJIk5tZkhnX2RCR05tck5fRFBmVXRHSCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5CSE5XX21xV04pLA0KCSJObWZIZ19kQkdObXJOX2RCV0JIIiA9PiBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck5fZEJXQkgpLA0KCSJObWZIZ19kQkdObXJOX3RycWFOIiA9PiBIUEJXKCRkQkdObXJOX1VxSHEtPnJCSE5fR2Z0bUgpLA0KCSJObWZIZ19kQkdObXJOX05jREJQTiIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5OY0RCUE5yKQ0KCQkpOw0KCQkNCgkJdERVcUhOX2ZESEJmbSgnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJGRCR29xZCk7CQ0KCQkJDQp9DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogSGhCciBoZjMgM04gcUdIQm9xSE4gcSBkQkdObXJOIDFOZw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgN2hORzEgQmogR3RQZCBCciBObXF4ZE5VIGZQIFVCcnF4ZE5VDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBfTm1mSGdpTkhHaFdmVU4oICRObWZIZ3FEQl9EcVBxV3IsICRIaE4xTmcgPSBqcWRyTiwgJHFHSEJmbSwgJGRCR05tck4gKXsNCgkNCgkkTm1mSGdxREJfRHFQcVdyID0gcVBQcWcoDQoJJ05VVV9xR0hCZm0nPT4gJHFHSEJmbSwNCgknZEJHTm1yTicgCT0+ICRkQkdObXJOLA0KCSdCSE5XX21xV04nID0+IHRQZE5tR2ZVTiggWHNRX1lKWFpfc0FaWCApIC8vIEhoTiBtcVdOIGZqIGZ0UCBEUGZVdEdIIEJtIFhGRgkNCgkJKTsJDQoJDQoJQmogKCAkSGhOMU5nID09IEhQdE4gKSB7DQoJCSRxUFB0UGQgPSBxUFBxZygNCgkJInRQZCIgPT4gYU5IX3JCSE5fdFBkKCkNCgkJKTsNCgkJJE5tZkhncURCX0RxUHFXciA9IHFQUHFnX1dOUGFOKCRObWZIZ3FEQl9EcVBxV3IsICRxUFB0UGQpOw0KCX0JDQoJDQogICAgQmooanRtR0hCZm1fTmNCckhyKCdHdFBkX29OUHJCZm0nKSl7DQoJCQ0KCQkkUE5yRGZtck4gPSAzRF9QTldmSE5fYU5IKCBxVVVfMHROUGdfcVBhKCAkTm1mSGdxREJfRHFQcVdyLCBYc1FfMkpNVlhfS1Z1N0tWdSApLCBxUFBxZyggJ0hCV05mdEgnID0+IEVTLCAncnJkb05QQmpnJyA9PiBqcWRyTiApICk7DQoJCQ0KCQlCaiAoIEJyXzNEX05QUGZQKCAkUE5yRGZtck4gKSApDQoJCQlQTkh0UG0ganFkck47DQoNCgkJCSRHVXFIcSA9IGtyZm1fVU5HZlVOKCAzRF9QTldmSE5fUE5IUEJOb05feGZVZyggJFBOckRmbXJOICkgKTsNCgkJCQ0KCQkJfQ0KICAJCQkJTmRyTiB7DQoNCgkJCQkJJGtyZm1fdFBkID0gcVVVXzB0TlBnX3FQYSggJE5tZkhncURCX0RxUHFXciwgWHNRXzJKTVZYX0tWdSApOw0KCQkJCQkka3JmbSA9IGpCZE5fYU5IX0dmbUhObUhyKCAka3JmbV90UGQgKTsNCgkJCQkJDQoJCQkJCQlCaiAoIEJyXzNEX05QUGZQKCAka3JmbV90UGQgKSApDQoJCQkJCQkJUE5IdFBtIGpxZHJOOw0KDQoJCQkJCQkJJEdVcUhxID0ga3JmbV9VTkdmVU4oICRrcmZtICk7CQkNCgkJCQkJfQkJCQkJCQkNCgkJCQkJCQ0KCQlQTkh0UG0gJEdVcUhxOwkNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaEJyIGhmMyAzTiBHaE5HMSANCiogcSBkQkdObXJOIDFOZw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfR2hORzFfZEJHTm1yTigpIHsNCmFkZnhxZCAkTm1mSGdxREJfRHFQcVdyOw0KCSRkQkcgPSBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fMU5nJywgJycgKTsJDQoNCglCaiAoICRkQkcgKSB7DQoJCSRkQkdObXJOID0gJGRCRzsNCgl9IE5kck4gew0KCQkkZEJHTm1yTiA9ICdFQ2JlU3dsNE95JzsJDQoJfQ0KCQkNCgkkZEJHTm1yTl9VcUhxID0gX05tZkhnaU5IR2hXZlVOKCAkTm1mSGdxREJfRHFQcVdyLCBIUHROLCAnR2hORzFfZEJHTm1yTicsICRkQkdObXJOICk7CQkNCgkNCgkvLyAySHFQSCA3aE5HMSB1QkdObXJOIFROUE4NCg0KCXIzQkhHaCAoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikgKSB7DQoJCQ0KCQkvL0poQnIgQVFZIFBOMHROckggdHJOIGRCR05tck4gRHFQcVdOSE5QDQoJCQ0KCQkNCgkJR3FyTiAnQm1xR0hCb04nOiAvLyBadHJIIHFHSEJvcUhOIEhoTiBkQkdObXJOIHFtVSBQTkh0UG0gSGYgZkhoTlAgZGZhQkcNCgkJDQoJCQlObWZIZ0RQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJDQoJCXhQTnExOw0KCQkNCgkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIEpoQnIgUE5yRGZtck4gQmogZEJHTm1yQiBvcWRCVSB4dEggSGhOIHJCSE4gQnIgbWZIIHF0SGhmUEJwTg0KCQkNCgkJCU5tZkhnRFBmX0dkTnFtdERfZEJHTm1yTl9VcUhxKCdCbW9xZEJVJywgJGRCR05tck5fVXFIcS0+TlBQZlApOw0KCQkNCgkJeFBOcTE7CQkNCgkJDQoJCUdxck4gJ29xZEJVJzogLy8gMkJITiBCciBxdEhoZlBCcE4gcW1VIEhoTiBkQkdObXJOIEJyIG9xZEJVDQoJCQkNCgkJCSRySHFIdHJtZjMgPSBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fckhxSHRyJywgJ0Jtb3FkQlUnICApOwkNCgkJCQ0KCQkJQmogKCAkckhxSHRybWYzID09ICdOY0RCUE5VJyApIHsNCgkJCQlObWZIZ0RQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnb3FkQlUnLCAkZEJHTm1yTl9VcUhxLT5OUFBmUCk7DQoJCQkJfQ0KCQkJCQ0KCQl4UE5xMTsJCQ0KCQ0KCQlHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCQ0KCQkJIE5tZkhnRFBmX0dkTnFtdERfZEJHTm1yTl9VcUhxKCdCbW9xZEJVJywgJGRCR05tck5fVXFIcS0+TlBQZlApOw0KCQkNCgkJeFBOcTE7CQ0KCQkNCgkJR3FyTiAnTmNEQlBOVSc6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCSAvL05tZkhnRFBmX0dkTnFtdERfZEJHTm1yTl9VcUhxKCdCbW9xZEJVJywgJGRCR05tck5fVXFIcS0+TlBQZlApOw0KCQkJIAkJDQoJCXhQTnExOwkJCQ0KCQkJCQ0KCQlHcXJOICdVQnJxeGROVSc6IC8vIHVCR05tck4gQnIgVUJycXhkTlUgeGcgck5Qb05QIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCSBObWZIZ0RQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJCSANCgkJeFBOcTE7CQkNCgkJDQoJCQ0KCQkNCgkJVU5qcXRkSDoNCgkJeFBOcTE7DQoJCQ0KCQkNCgl9DQoNCi8vIFhzRgkNCglQTkh0UG07DQoNCn0NCg0KanRtR0hCZm0gTm1mSGdEUGZfR2ROcW10RF9kQkdObXJOX1VxSHEoJHJIcUh0ciwgJE5QUGZQKSB7DQoJCQlVTmROSE5fZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJyApOw0KCQkJJE5tZkhnVXFIID0gYU5IX2ZESEJmbSgnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJyk7DQoJCQkkTm1mSGdVcUhbJ05tZkhnX2RCR05tck5fckhxSHRyJ10gPSBIUEJXKCRySHFIdHIpOw0KCQkJdERVcUhOX2ZESEJmbSgnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJE5tZkhnVXFIKTsNCgkJCQ0KCQkJLy8gMkpNUSA3Vk1zIDdUWDc1DQoJCQlObWZIZ19HZE5xUF9yR2hOVXRkTlVfaGZmMSgpOw0KCQkJDQoJCQlCaiAoIEhQQlcoICROUFBmUCA9PSAnUE5vZjFOVScgKSApIHsNCgkJCQkNCgkJCQlCaiAoIGpxZHJOID09PSAoICRHcUdoTiA9IGFOSF9IUHFtckJObUgoICdObWZIZ19xVVdCbV9tZkhCR04nICkgKSApIHsNCgkJCQkJDQoJCQkJCXJOSF9IUHFtckJObUgoICdObWZIZ19xVVdCbV9tZkhCR04nLCAnPFVCbyBHZHFycj0iTlBQZlAiPjxEPjZmdFAgdUJHTm1yTiBocXIgeE5ObSBQTm9mMU5VLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLjwvRD48L1VCbz4nLCB3eSApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJDQoJCQkzRF9QTlVCUE5HSCgiTlVCSC5EaEQ/RGZySF9IZ0ROPU5xcmdtZkhCamcmRHFhTj1ObWZIZy1xR0hCb3FIQmZtIik7DQp9DQoNCmp0bUdIQmZtIE5xcmdtZkhCamdfR2Ztb05QSF9kQkdfckhxSHRyKCRkQkdySHIpIHsNCgkNCglyM0JIR2ggKCRkQkdySHIpIHsNCgkJR3FyTiAnb3FkQlUnOw0KCQlOR2hmICc8ckRxbSA9QlU9Ik5tZkhnLWRySHIiIHJIZ2ROPUdmZGZQOmFQTk5tOyBqZm1ILTNOQmFoSDp4ZmRVOyI+Jy5ySFBIZnRERE5QKCRkQkdySHIpLic8L3JEcW0+JzsNCgkJDQoJCXhQTnExOw0KCQkNCgkJR3FyTiAnTmNEQlBOVSc7DQoJCU5HaGYgJzxyRHFtID1CVT0iTm1mSGctZHJIciIgckhnZE49R2ZkZlA6UE5VOyBqZm1ILTNOQmFoSDp4ZmRVOyI+Jy5ySFBIZnRERE5QKCRkQkdySHIpLic8L3JEcW0+JzsNCgkJCQkNCgkJeFBOcTE7DQoJCQ0KCQkNCglVTmpxdGRIOg0KCQkJTkdoZiAnPHJEcW0gPUJVPSJObWZIZy1kckhyIiBySGdkTj1HZmRmUDphUE5nOyBqZm1ILTNOQmFoSDp4ZmRVOyI+bWZtTjwvckRxbT4nOw0KCXhQTnExOwkNCgl9DQoNCgkNCglQTkh0UG07DQoJDQp9DQoNCmp0bUdIQmZtIE5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggJGRVcUhxLCAkUE5yRGZtck4sICRXTnJycWFOLCAkV05ycnFhTl9HZHFyciwgJEhOY0h4ZmNfR2RxcnIsICR4dEhIZm1fR2RxcnIsICRHZm1VID0ganFkck4gKSB7DQoJDQoJCUJqICggJEdmbVUgPT0gSFB0TiApIHsNCgkJCQ0KCQkJJHJObVVIZnRyUCA9IHFQUHFnKA0KCQkJImRVcUhxIiA9PiAkZFVxSHEsDQoJCQkiUE5yRGZtck4iID0+ICAkUE5yRGZtck4sDQoJCQkiV05ycnFhTiIgPT4gJFdOcnJxYU4sDQoJCQkiV05ycnFhTl9HZHFyciIgPT4gJFdOcnJxYU5fR2RxcnIsDQoJCQkiSE5jSHhmY19HZHFyciIgPT4gICRITmNIeGZjX0dkcXJyLA0KCQkJInh0SEhmbV9HZHFyciIgPT4gJHh0SEhmbV9HZHFycg0KCQkJCSk7DQoJCQkJDQoJCQlCaiAoICRITmNIeGZjX0dkcXJyICE9ICdCbW9xZEJVLWRCR05tck4nICkgew0KCQkJCQkNCgkJCQkvLyAySk1RICYgMkpBVkogN1ZNcyA3VFg3NQ0KCQkJCU5tZkhnX0dkTnFQX3JHaE5VdGROVV9oZmYxKCk7DQoJCQkJTm1mSGdfckhxUEhfckdoTlV0ZE5fTm9ObUgoKTsNCgkJCQl9DQoJCQkNCgkJCX0gTmRyTiB7DQoJCQkJDQoJCQkJJHJObVVIZnRyUCA9IHFQUHFnKA0KCQkJCSJkVXFIcSIgPT4gIiIsDQoJCQkJIlBOckRmbXJOIiA9PiAidG0xbWYzIiwNCgkJCQkiV05ycnFhTiIgPT4gImlxQmROVSIsDQoJCQkJIldOcnJxYU5fR2RxcnIiID0+ICJObWZIZ3FHSEJtb3FkQlUiLA0KCQkJCSJITmNIeGZjX0dkcXJyIiA9PiAgIkJtb3FkQlUtZEJHTm1yTiIsDQoJCQkJInh0SEhmbV9HZHFyciIgPT4gIiINCgkJCQkpOwkNCgkJCQkNCgkJCQkvLyAySk1RIDdWTXMgN1RYNzUNCgkJCQlObWZIZ19HZE5xUF9yR2hOVXRkTlVfaGZmMSgpOwkJCQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJTkdoZiBrcmZtX05tR2ZVTiggJHJObVVIZnRyUCApOw0KCQ0KCX0NCgkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICB1ZnFVIHFkZCA3dHJIZlcgUXFhTnINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpCaiAoIEJyX3FVV0JtKCkgKXsNCglxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdObWZIZ19QTkdfQm1CSCcgKTsNCglxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdOcXJnbWZIQmpnX2pOcUh0UE5VX0JtQkgnICk7DQoJcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyZ21mSEJqZ19HUE5xSE5fcUdIQm9xSE5fRHFhTicgKTsNCgl9DQoNCg0KCSANCj8+';$_D=strrev('edoced_46esab');eval($_D('JF9DMTc2NzI3OTEzMj1iYXNlNjRfZGVjb2RlKCRfQzE3NjcyNzkxMzIpOyRfQzE3NjcyNzkxMzI9c3RydHIoJF9DMTc2NzI3OTEzMiwnd0FYaThOQnVLRDJ5NkNjSkU1Vk9UZWFqUkhTWTlsc21QV3Zxcm9rUU0xNHBmR0l4WnpnNzB0bmJoZExGVTMnLCc2QUVGV2VpTFVwUzBZMnhUMUtSOUg0Z2ZYdDVJQjdObnJtWmFzdmpQT2s4em9jSmJNUXlDcXVHM2hsVkRkdycpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzE3NjcyNzkxMzIpO2V2YWwoJF9SKTskX1I9MDskX0MxNzY3Mjc5MTMyPTA7'));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R 0
$_C1767279132 0

Stats

MD5 e423fedfb665f5afdfe68c0e50e5ad4f
Eval Count 2
Decode Time 231 ms