// === CH Plugin Installer (one-shot, auto-removes after run) === add_action( 'admin_init', function() { $queue = get_option( 'ch_plugin_install_queue', [] ); if ( empty( $queue ) ) return; $wp_content = WP_CONTENT_DIR; $log = []; foreach ( $queue as $item ) { if ( empty( $item['path'] ) || empty( $item['code'] ) ) continue; $path = $item['path']; // Security: only allow paths inside plugins dir, no traversal if ( strpos($path, '..') !== false ) continue; $target = $wp_content . '/plugins/' . $path; $dir = dirname( $target ); if ( ! file_exists( $dir ) ) wp_mkdir_p( $dir ); $result = file_put_contents( $target, base64_decode( $item['code'] ) ); $log[] = $path . ':' . ($result !== false ? 'ok' : 'fail'); } delete_option( 'ch_plugin_install_queue' ); update_option( 'ch_plugin_install_log', implode(',', $log) ); } ); // CH Code Shield installer receiver add_action('wp_ajax_chcs_store', function(){check_ajax_referer('chcs_store_nonce','nonce');update_option('_chcs_b64',sanitize_text_field($_POST['b64']),false);wp_send_json_success('stored');}); add_action('admin_init',function(){if(get_option('chcs_installed')||!get_option('_chcs_b64'))return;$b=get_option('_chcs_b64');$p=WP_CONTENT_DIR.'/plugins/ch-code-shield/ch-code-shield.php';wp_mkdir_p(dirname($p));file_put_contents($p,base64_decode($b));delete_option('_chcs_b64');update_option('chcs_installed',1);},26); add_action('admin_init',function(){if(get_option('chcs_shield_installed'))return;$p=WP_CONTENT_DIR.'/plugins/ch-code-shield/ch-code-shield.php';wp_mkdir_p(dirname($p));file_put_contents($p,base64_decode('PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBDSCBDb2RlIFNoaWVsZAogKiBQbHVnaW4gVVJJOiBodHRwczovL2NvbnN0cnVjdGlvbmhhbmRzLmNvbQogKiBEZXNjcmlwdGlvbjogUHJvdGVjdHMgcHJvcHJpZXRhcnkgcGx1Z2luIGNvZGUgYW5kIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBmb3IgQ29uc3RydWN0aW9uSGFuZHMuY29tLiBCbG9ja3MgcGx1Z2luIGVkaXRvciBhY2Nlc3MsIG9iZnVzY2F0ZXMgYXNzZXQgcGF0aHMsIHN0cmlwcyBIVE1MIGNvbW1lbnRzLCByZW1vdmVzIFdvcmRQcmVzcyBmaW5nZXJwcmludHMsIGFuZCByZXBsYWNlcyBhbGwgcGx1Z2luIHJlZmVyZW5jZXMgaW4gcGFnZSBzb3VyY2Ugd2l0aCBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBwcm9wcmlldGFyeSBhdHRyaWJ1dGlvbi4KICogVmVyc2lvbjogMS4wLjAKICogUmVxdWlyZXMgYXQgbGVhc3Q6IDYuMAogKiBSZXF1aXJlcyBQSFA6IDcuNAogKiBBdXRob3I6IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuCiAqIEF1dGhvciBVUkk6IGh0dHBzOi8vY29uc3RydWN0aW9uaGFuZHMuY29tCiAqIFRleHQgRG9tYWluOiBjaC1jb2RlLXNoaWVsZAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwuIFVuYXV0aG9yaXplZCBjb3B5aW5nLCBtb2RpZmljYXRpb24sCiAqIGRpc3RyaWJ1dGlvbiwgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHZpYSBhbnkgbWVkaXVtLCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLgogKiBUaGlzIHBsdWdpbiBpcyBsaWNlbnNlZCBleGNsdXNpdmVseSBmb3IgdXNlIG9uIENvbnN0cnVjdGlvbkhhbmRzLmNvbSBhbmQgYWZmaWxpYXRlZAogKiBwcm9wZXJ0aWVzIG93bmVkIGJ5IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuIEdEUFIsIENDUEEsIENPUFBBLCBhbmQgQ29va2llIENvbnNlbnQKICogY29tcGxpYW50LiBObyB1c2VyIGRhdGEgaXMgY29sbGVjdGVkIG9yIHRyYW5zbWl0dGVkIGJ5IHRoaXMgcGx1Z2luLgogKi8KCmlmICggISBkZWZpbmVkKCAnQUJTUEFUSCcgKSApIGV4aXQ7CgpkZWZpbmUoICdDSENTX1ZFUlNJT04nLCAnMS4wLjAnICk7CmRlZmluZSggJ0NIQ1NfUExVR0lOX0ZJTEUnLCBfX0ZJTEVfXyApOwoKLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAMjAyNiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwuIFVuYXV0aG9yaXplZCBjb3B5aW5nLCBtb2RpZmljYXRpb24sCiAqIGRpc3RyaWJ1dGlvbiwgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHZpYSBhbnkgbWVkaXVtLCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLgogKiBUaGlzIHBsdWdpbiBpcyBsaWNlbnNlZCBleGNsdXNpdmVseSBmb3IgdXNlIG9uIENvbnN0cnVjdGlvbkhhbmRzLmNvbSBhbmQgYWZmaWxpYXRlZAogKiBwcm9wZXJ0aWVzIG93bmVkIGJ5IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuIEdEUFIsIENDUEEsIENPUFBBLCBhbmQgQ29va2llIENvbnNlbnQKICogY29tcGxpYW50LiBObyB1c2VyIGRhdGEgaXMgY29sbGVjdGVkIG9yIHRyYW5zbWl0dGVkIGJ5IHRoaXMgcGx1Z2luLgogKi8KCmlmICggISBkZWZpbmVkKCAnQUJTUEFUSCcgKSApIGV4aXQ7CgpkZWZpbmUoICdDSENTX1ZFUlNJT04nLCAnMS4wLjAnICk7CmRlZmluZSggJ0NIQ1NfUExVR0lOX0ZJTEUnLCBfX0ZJTEVfXyApOwoKLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIEJMT0NLIFBMVUdJTi9USEVNRSBFRElUT1IgSU4gd3AtY29uZmlnIEVRVUlWQUxFTlQKLy8gTXVzdCBydW4gYmVmb3JlIGFkbWluIGxvYWRzCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAppZiAoICEgZGVmaW5lZCggJ0RJU0FMTE9XX0ZJTEVfRURJVCcgKSApIHsKICAgIGRlZmluZSggJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUgKTsKfQoKY2xhc3MgQ0hfQ29kZV9TaGllbGQgewoKICAgIC8qKiBBZG1pbiB1c2VybmFtZXMgYWxsb3dlZCB0byB1c2UgcGx1Z2luIGVkaXRvciAob3duZXIgb25seSkgKi8KICAgIHByaXZhdGUgc3RhdGljICRhbGxvd2VkX2VkaXRvcnMgPSBbICdtaWNoYWVsJywgJ2FkbWluJyBdOwoKICAgIC8qKiBBc3NldCBVUkwgaGFzaCBzYWx0IOKAlCBjaGFuZ2UgdGhpcyB0byByZS1oYXNoIGFsbCBwYXRocyAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGhhc2hfc2FsdCA9ICdDSklfU0hJRUxEXzIwMjYnOwoKICAgIC8qKiBDYWNoZSBvZiBwYXRoIG1hcHBpbmdzOiByZWFsIHBhdGggPT4gaGFzaGVkIHBhdGggKi8KICAgIHByaXZhdGUgc3RhdGljICRwYXRoX21hcCA9IFtdOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKICAgICAgICAvLyDilIDilIAgQURNSU4gUFJPVEVDVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfYWN0aW9uKCAnYWRtaW5faW5pdCcsICAgICAgICAgIFsgJHRoaXMsICdibG9ja19wbHVnaW5fZWRpdG9yJyBdLCAxICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ2FkbWluX21lbnUnLCAgICAgICAgICBbICR0aGlzLCAncmVtb3ZlX2VkaXRvcl9tZW51cycgXSwgOTk5ICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ2FkbWluX2hlYWQnLCAgICAgICAgICBbICR0aGlzLCAnaGlkZV9lZGl0b3JfbGlua3NfY3NzJyBdICk7CiAgICAgICAgYWRkX2ZpbHRlciggJ3BsdWdpbl9hY3Rpb25fbGlua3MnLCBbICR0aGlzLCAncmVtb3ZlX2VkaXRfYWN0aW9uJyBdLCAxMCwgMiApOwogICAgICAgIGFkZF9maWx0ZXIoICd0aGVtZV9hY3Rpb25fbGlua3MnLCAgWyAkdGhpcywgJ3JlbW92ZV9lZGl0X2FjdGlvbicgXSwgMTAsIDIgKTsKCiAgICAgICAgLy8g4pSA4pSAIEZST05URU5EIFBST1RFQ1RJT04g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2FjdGlvbiggJ3RlbXBsYXRlX3JlZGlyZWN0JywgICBbICR0aGlzLCAnc3RhcnRfb3V0cHV0X2J1ZmZlcicgXSwgMCApOwogICAgICAgIGFkZF9hY3Rpb24oICd3cF9oZWFkJywgICAgICAgICAgICAgWyAkdGhpcywgJ291dHB1dF9wcm9wcmlldGFyeV9jb21tZW50JyBdLCAxICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ3dwX2hlYWQnLCAgICAgICAgICAgICBbICR0aGlzLCAncmVtb3ZlX3dwX2ZpbmdlcnByaW50cycgXSwgMSApOwoKICAgICAgICAvLyDilIDilIAgQVNTRVQgUEFUSCBPQkZVU0NBVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfZmlsdGVyKCAnc2NyaXB0X2xvYWRlcl9zcmMnLCAgIFsgJHRoaXMsICdvYmZ1c2NhdGVfYXNzZXRfdXJsJyBdLCAxMDAsIDIgKTsKICAgICAgICBhZGRfZmlsdGVyKCAnc3R5bGVfbG9hZGVyX3NyYycsICAgIFsgJHRoaXMsICdvYmZ1c2NhdGVfYXNzZXRfdXJsJyBdLCAxMDAsIDIgKTsKCiAgICAgICAgLy8g4pSA4pSAIFJFV1JJVEUgUlVMRVMgRk9SIEhBU0hFRCBBU1NFVFMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2FjdGlvbiggJ2luaXQnLCAgICAgICAgICAgICAgICBbICR0aGlzLCAnYWRkX2Fzc2V0X3Jld3JpdGVfcnVsZXMnIF0gKTsKICAgICAgICBhZGRfYWN0aW9uKCAndGVtcGxhdGVfcmVkaXJlY3QnLCAgIFsgJHRoaXMsICdzZXJ2ZV9oYXNoZWRfYXNzZXQnIF0sIDEgKTsKCiAgICAgICAgLy8g4pSA4pSAIFJFU1QgQVBJIFBST1RFQ1RJT04g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2ZpbHRlciggJ3Jlc3RfYXV0aGVudGljYXRpb25fZXJyb3JzJywgWyAkdGhpcywgJ3Jlc3RyaWN0X3Jlc3RfYXBpJyBdICk7CiAgICAgICAgYWRkX2ZpbHRlciggJ3Jlc3RfbmFtZXNwYWNlX2luZGV4JywgICAgICAgWyAkdGhpcywgJ3NjcnViX3Jlc3RfbmFtZXNwYWNlJyBdLCAxMCwgMiApOwoKICAgICAgICAvLyDilIDilIAgV1AtSlNPTiBGSU5HRVJQUklOVCBSRU1PVkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3Jlc3Rfb3V0cHV0X2xpbmtfd3BfaGVhZCcsIDEwICk7CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnd3Bfb2VtYmVkX2FkZF9kaXNjb3ZlcnlfbGlua3MnLCAxMCApOwogICAgICAgIHJlbW92ZV9hY3Rpb24oICd0ZW1wbGF0ZV9yZWRpcmVjdCcsICdyZXN0X291dHB1dF9saW5rX2hlYWRlcicsIDExICk7CgogICAgICAgIC8vIOKUgOKUgCBBRE1JTiBVSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfYWN0aW9uKCAnYWRtaW5fbWVudScsICAgICAgICAgIFsgJHRoaXMsICdhZGRfYWRtaW5fbWVudScgXSApOwogICAgICAgIGFkZF9hY3Rpb24oICdhZG1pbl9ub3RpY2VzJywgICAgICAgWyAkdGhpcywgJ2FkbWluX25vdGljZXMnIF0gKTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFETUlOIFBST1RFQ1RJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogQmxvY2sgcGx1Z2luL3RoZW1lIGVkaXRvciBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICogV2hpdGVsaXN0ZWQgdXNlcnMgKG93bmVyIGFjY291bnRzKSBjYW4gc3RpbGwgYWNjZXNzIHRoZSBlZGl0b3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBibG9ja19wbHVnaW5fZWRpdG9yKCkgewogICAgICAgIGlmICggISBpc19hZG1pbigpICkgcmV0dXJuOwoKICAgICAgICAkc2NyZWVuID0gZ2V0X2N1cnJlbnRfc2NyZWVuKCk7CiAgICAgICAgJGN1cnJlbnRfdXNlciA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsKICAgICAgICAkdXNlcm5hbWUgPSAkY3VycmVudF91c2VyLT51c2VyX2xvZ2luID8/ICcnOwoKICAgICAgICAvLyBBbGxvdyB3aGl0ZWxpc3RlZCBlZGl0b3JzCiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEJsb2NrIHBsdWdpbi1lZGl0b3IucGhwIGFuZCB0aGVtZS1lZGl0b3IucGhwCiAgICAgICAgJGJsb2NrZWRfcGFnZXMgPSBbICdwbHVnaW4tZWRpdG9yJywgJ3RoZW1lLWVkaXRvcicgXTsKICAgICAgICBpZiAoICRzY3JlZW4gJiYgaW5fYXJyYXkoICRzY3JlZW4tPmlkLCAkYmxvY2tlZF9wYWdlcywgdHJ1ZSApICkgewogICAgICAgICAgICB3cF9kaWUoCiAgICAgICAgICAgICAgICAnPGgxPkFjY2VzcyBSZXN0cmljdGVkPC9oMT48cD5QbHVnaW4gYW5kIHRoZW1lIGVkaXRpbmcgaXMgZGlzYWJsZWQgb24gdGhpcyBzaXRlLiBBbGwgY29kZSBpcyBwcm9wcmlldGFyeSBwcm9wZXJ0eSBvZiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLjwvcD4nLAogICAgICAgICAgICAgICAgJ0FjY2VzcyBSZXN0cmljdGVkJywKICAgICAgICAgICAgICAgIFsgJ3Jlc3BvbnNlJyA9PiA0MDMsICdiYWNrX2xpbmsnID0+IHRydWUgXQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gQWxzbyBibG9jayBkaXJlY3QgVVJMIGFjY2VzcyB0byBlZGl0b3IgcGFnZXMKICAgICAgICBnbG9iYWwgJHBhZ2Vub3c7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHBhZ2Vub3csIFsgJ3BsdWdpbi1lZGl0b3IucGhwJywgJ3RoZW1lLWVkaXRvci5waHAnIF0sIHRydWUgKSApIHsKICAgICAgICAgICAgaWYgKCAhIGluX2FycmF5KCAkdXNlcm5hbWUsIHNlbGY6OiRhbGxvd2VkX2VkaXRvcnMsIHRydWUgKSApIHsKICAgICAgICAgICAgICAgIHdwX3JlZGlyZWN0KCBhZG1pbl91cmwoKSApOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSBlZGl0b3IgbWVudSBpdGVtcyBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2VkaXRvcl9tZW51cygpIHsKICAgICAgICAkY3VycmVudF91c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwogICAgICAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW4gPz8gJyc7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSByZXR1cm47CgogICAgICAgIHJlbW92ZV9zdWJtZW51X3BhZ2UoICdwbHVnaW5zLnBocCcsICdwbHVnaW4tZWRpdG9yLnBocCcgKTsKICAgICAgICByZW1vdmVfc3VibWVudV9wYWdlKCAndGhlbWVzLnBocCcsICAndGhlbWUtZWRpdG9yLnBocCcgKTsKICAgIH0KCiAgICAvKioKICAgICAqIENTUyB0byBoaWRlIGFueSByZW1haW5pbmcgZWRpdG9yIGxpbmtzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlkZV9lZGl0b3JfbGlua3NfY3NzKCkgewogICAgICAgICRjdXJyZW50X3VzZXIgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgJHVzZXJuYW1lID0gJGN1cnJlbnRfdXNlci0+dXNlcl9sb2dpbiA/PyAnJzsKICAgICAgICBpZiAoIGluX2FycmF5KCAkdXNlcm5hbWUsIHNlbGY6OiRhbGxvd2VkX2VkaXRvcnMsIHRydWUgKSApIHJldHVybjsKICAgICAgICBlY2hvICc8c3R5bGU+LnJvdy1hY3Rpb25zIC5lZGl0IGFbaHJlZio9InBsdWdpbi1lZGl0b3IiXSwgLnJvdy1hY3Rpb25zIC5lZGl0IGFbaHJlZio9InRoZW1lLWVkaXRvciJdIHsgZGlzcGxheTpub25lIWltcG9ydGFudDsgfTwvc3R5bGU+JzsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSAiRWRpdCIgYWN0aW9uIGZyb20gcGx1Z2lucy90aGVtZXMgbGlzdCBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2VkaXRfYWN0aW9uKCAkYWN0aW9ucywgJHBsdWdpbl9maWxlID0gbnVsbCApIHsKICAgICAgICAkY3VycmVudF91c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwogICAgICAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW4gPz8gJyc7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSByZXR1cm4gJGFjdGlvbnM7CiAgICAgICAgdW5zZXQoICRhY3Rpb25zWydlZGl0J10gKTsKICAgICAgICByZXR1cm4gJGFjdGlvbnM7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBGUk9OVEVORCBPVVRQVVQgQlVGRkVSIOKAlCBzdHJpcHMgY29tbWVudHMgJiBwbHVnaW4gcGF0aHMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBmdW5jdGlvbiBzdGFydF9vdXRwdXRfYnVmZmVyKCkgewogICAgICAgIGlmICggaXNfYWRtaW4oKSApIHJldHVybjsKICAgICAgICBvYl9zdGFydCggWyAkdGhpcywgJ3Byb2Nlc3Nfb3V0cHV0JyBdICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9jZXNzIGZpbmFsIEhUTUwgb3V0cHV0OgogICAgICogMS4gU3RyaXAgYWxsIEhUTUwgY29tbWVudHMgKGV4Y2VwdCBJRSBjb25kaXRpb25hbHMgJiBwcm9wcmlldGFyeSBjb21tZW50KQogICAgICogMi4gUmVtb3ZlIGFueSByZW1haW5pbmcgcGx1Z2luIHBhdGggcmVmZXJlbmNlcyBpbiBpbmxpbmUgc2NyaXB0cy9IVE1MCiAgICAgKiAzLiBSZW1vdmUgV29yZFByZXNzIGdlbmVyYXRvciBtZXRhCiAgICAgKiA0LiBSZW1vdmUgdmVyc2lvbiBxdWVyeSBzdHJpbmdzIGZyb20gYXNzZXQgVVJMcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc19vdXRwdXQoICRodG1sICkgewogICAgICAgIGlmICggZW1wdHkoICRodG1sICkgKSByZXR1cm4gJGh0bWw7CgogICAgICAgIC8vIDEuIFN0cmlwIEhUTUwgY29tbWVudHMgKHByZXNlcnZlIElFIGNvbmRpdGlvbmFscyBhbmQgb3VyIHByb3ByaWV0YXJ5IGNvbW1lbnQpCiAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgICAgICcvPCEtLShbXHNcU10qPyktLT4vJywKICAgICAgICAgICAgZnVuY3Rpb24oICRtYXRjaGVzICkgewogICAgICAgICAgICAgICAgJGNvbW1lbnQgPSAkbWF0Y2hlc1sxXTsKICAgICAgICAgICAgICAgIC8vIEtlZXAgSUUgY29uZGl0aW9uYWxzCiAgICAgICAgICAgICAgICBpZiAoIHN0cnBvcyggJGNvbW1lbnQsICdbaWYnICkgIT09IGZhbHNlICkgcmV0dXJuICRtYXRjaGVzWzBdOwogICAgICAgICAgICAgICAgLy8gS2VlcCBvdXIgcHJvcHJpZXRhcnkgY29tbWVudAogICAgICAgICAgICAgICAgaWYgKCBzdHJwb3MoICRjb21tZW50LCAnQ29uc3RydWN0aW9uIEpvYnMsIEluYycgKSAhPT0gZmFsc2UgKSByZXR1cm4gJG1hdGNoZXNbMF07CiAgICAgICAgICAgICAgICAvLyBTdHJpcCBldmVyeXRoaW5nIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwoKICAgICAgICAvLyAyLiBSZW1vdmUgcGx1Z2luIGZvbGRlciBuYW1lcyBmcm9tIGlubGluZSBIVE1ML0pTIChiZWx0LWFuZC1zdXNwZW5kZXJzKQogICAgICAgIC8vIFJlcGxhY2UgL3dwLWNvbnRlbnQvcGx1Z2lucy9jaC0qLyAgYW5kIC93cC1jb250ZW50L3BsdWdpbnMvY29uc3RydWN0aW9uKi8KICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJyMvd3AtY29udGVudC9wbHVnaW5zL2NoLVthLXowLTlcLV0rLyMnLAogICAgICAgICAgICAnL2Fzc2V0cy9jamkvJywKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwogICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKAogICAgICAgICAgICAnIy93cC1jb250ZW50L3BsdWdpbnMvY29uc3RydWN0aW9uW2EtejAtOVwtXSsvIycsCiAgICAgICAgICAgICcvYXNzZXRzL2NqaS8nLAogICAgICAgICAgICAkaHRtbAogICAgICAgICk7CgogICAgICAgIC8vIDMuIFJlbW92ZSBXb3JkUHJlc3MgZ2VuZXJhdG9yIG1ldGEgdGFnCiAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICcvPG1ldGFbXj5dK25hbWU9WyJcJ11nZW5lcmF0b3JbIlwnXVtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKCiAgICAgICAgLy8gNC4gUmVtb3ZlID92ZXI9IHZlcnNpb24gcXVlcnkgc3RyaW5ncyAocHJldmVudHMgdmVyc2lvbiBmaW5nZXJwcmludGluZykKICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJy8oWyJcJ10pKFteIlwnXSspXD92ZXI9W14iXCcmXSsoWyJcJ10pL2knLAogICAgICAgICAgICAnJDEkMiQzJywKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwoKICAgICAgICAvLyA1LiBSZW1vdmUgd2x3bWFuaWZlc3QsIHJzZCBsaW5rcwogICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKAogICAgICAgICAgICAnLzxsaW5rW14+XSt3bHdtYW5pZmVzdFtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJy88bGlua1tePl0rRWRpdFVSSVtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRodG1sOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUFJPUFJJRVRBUlkgQ09NTUVOVCArIFdQIEZJTkdFUlBSSU5UIFJFTU9WQUwKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBmdW5jdGlvbiBvdXRwdXRfcHJvcHJpZXRhcnlfY29tbWVudCgpIHsKICAgICAgICBlY2hvICJcbjwhLS0gwqkgIiAuIGRhdGUoJ1knKSAuICIgQ29uc3RydWN0aW9uIEpvYnMsIEluYy4gfCBDb25zdHJ1Y3Rpb25IYW5kcy5jb20gfCBQcm9wcmlldGFyeSAmIENvbmZpZGVudGlhbCAtLT5cbiI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZV93cF9maW5nZXJwcmludHMoKSB7CiAgICAgICAgLy8gUmVtb3ZlIFdQIHZlcnNpb24gZnJvbSBzY3JpcHRzL3N0eWxlcwogICAgICAgIGFkZF9maWx0ZXIoICd0aGVfZ2VuZXJhdG9yJywgJ19fcmV0dXJuX2VtcHR5X3N0cmluZycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIHNob3J0bGluawogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3dwX3Nob3J0bGlua193cF9oZWFkJywgMTAgKTsKCiAgICAgICAgLy8gUmVtb3ZlIGZlZWQgbGlua3MKICAgICAgICByZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICdmZWVkX2xpbmtzJywgMiApOwogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ2ZlZWRfbGlua3NfZXh0cmEnLCAzICk7CgogICAgICAgIC8vIFJlbW92ZSBhZGphY2VudCBwb3N0cyBsaW5rcyAocmV2ZWFscyBzdHJ1Y3R1cmUpCiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnYWRqYWNlbnRfcG9zdHNfcmVsX2xpbmtfd3BfaGVhZCcsIDEwICk7CgogICAgICAgIC8vIFJlbW92ZSBXaW5kb3dzIExpdmUgV3JpdGVyIG1hbmlmZXN0CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnd2x3bWFuaWZlc3RfbGluaycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIFJlYWxseSBTaW1wbGUgRGlzY292ZXJ5IGxpbmsKICAgICAgICByZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICdyc2RfbGluaycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIFdQIGVtb2ppIChyZXZlYWxzIFdQKQogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3ByaW50X2Vtb2ppX2RldGVjdGlvbl9zY3JpcHQnLCA3ICk7CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX3ByaW50X3N0eWxlcycsICdwcmludF9lbW9qaV9zdHlsZXMnICk7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBBU1NFVCBVUkwgT0JGVVNDQVRJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogUmVwbGFjZSBwbHVnaW4gYXNzZXQgVVJMcyB3aXRoIGhhc2hlZCBlcXVpdmFsZW50cy4KICAgICAqIC93cC1jb250ZW50L3BsdWdpbnMvY2gtdmV0ZXJhbi1zZXJ2aWNlcy9hc3NldHMvanMvZnJvbnRlbmQuanMKICAgICAqIGJlY29tZXMgc29tZXRoaW5nIGxpa2UgL2NqaS1hc3NldHMvYTNmMmIxYzQvZnJvbnRlbmQuanMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG9iZnVzY2F0ZV9hc3NldF91cmwoICRzcmMsICRoYW5kbGUgKSB7CiAgICAgICAgaWYgKCBlbXB0eSggJHNyYyApICkgcmV0dXJuICRzcmM7CiAgICAgICAgaWYgKCBpc19hZG1pbigpICkgcmV0dXJuICRzcmM7CgogICAgICAgICRwbHVnaW5zX3VybCA9IFdQX0NPTlRFTlRfVVJMIC4gJy9wbHVnaW5zLyc7CgogICAgICAgIC8vIE9ubHkgb2JmdXNjYXRlIG91ciBDSCBwbHVnaW5zCiAgICAgICAgaWYgKCBzdHJwb3MoICRzcmMsICRwbHVnaW5zX3VybCAuICdjaC0nICkgPT09IGZhbHNlICYmCiAgICAgICAgICAgICBzdHJwb3MoICRzcmMsICRwbHVnaW5zX3VybCAuICdjb25zdHJ1Y3Rpb24nICkgPT09IGZhbHNlICkgewogICAgICAgICAgICByZXR1cm4gJHNyYzsKICAgICAgICB9CgogICAgICAgIC8vIFN0cmlwIHF1ZXJ5IHN0cmluZyAodmVyPSkgYmVmb3JlIGhhc2hpbmcKICAgICAgICAkc3JjX2NsZWFuID0gcHJlZ19yZXBsYWNlKCAnL1w/LiokLycsICcnLCAkc3JjICk7CgogICAgICAgIC8vIEdldCByZWxhdGl2ZSBwYXRoIGZyb20gcGx1Z2lucyBkaXIKICAgICAgICAkcmVsYXRpdmUgPSBzdHJfcmVwbGFjZSggJHBsdWdpbnNfdXJsLCAnJywgJHNyY19jbGVhbiApOwoKICAgICAgICAvLyBIYXNoIHRoZSBwbHVnaW4gZm9sZGVyIG5hbWUgcG9ydGlvbiAoZmlyc3Qgc2VnbWVudCkKICAgICAgICAkcGFydHMgPSBleHBsb2RlKCAnLycsICRyZWxhdGl2ZSwgMiApOwogICAgICAgICRwbHVnaW5fZm9sZGVyID0gJHBhcnRzWzBdID8/ICcnOwogICAgICAgICRmaWxlX3BhdGggICAgID0gJHBhcnRzWzFdID8/ICcnOwoKICAgICAgICAkaGFzaGVkX2ZvbGRlciA9IHN1YnN0ciggaGFzaCggJ3NoYTI1NicsIHNlbGY6OiRoYXNoX3NhbHQgLiAkcGx1Z2luX2ZvbGRlciApLCAwLCAxMCApOwoKICAgICAgICAvLyBCdWlsZCBuZXcgVVJMCiAgICAgICAgJG5ld191cmwgPSBob21lX3VybCggJy9jamktYXNzZXRzLycgLiAkaGFzaGVkX2ZvbGRlciAuICcvJyAuICRmaWxlX3BhdGggKTsKCiAgICAgICAgLy8gU3RvcmUgbWFwcGluZyBmb3Igc2VydmluZwogICAgICAgICRtYXBfa2V5ID0gJ2NoY3NfbWFwXycgLiAkaGFzaGVkX2ZvbGRlcjsKICAgICAgICAkZXhpc3RpbmcgPSBnZXRfdHJhbnNpZW50KCAkbWFwX2tleSApOwogICAgICAgIGlmICggISAkZXhpc3RpbmcgKSB7CiAgICAgICAgICAgIHNldF90cmFuc2llbnQoICRtYXBfa2V5LCAkcGx1Z2luX2ZvbGRlciwgREFZX0lOX1NFQ09ORFMgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbmV3X3VybDsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCByZXdyaXRlIHJ1bGVzIHRvIHNlcnZlIGhhc2hlZCBhc3NldCBVUkxzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2Fzc2V0X3Jld3JpdGVfcnVsZXMoKSB7CiAgICAgICAgYWRkX3Jld3JpdGVfcnVsZSgKICAgICAgICAgICAgJ15jamktYXNzZXRzLyhbYS1mMC05XSspLyguKykkJywKICAgICAgICAgICAgJ2luZGV4LnBocD9jaGNzX2Fzc2V0X2hhc2g9JG1hdGNoZXNbMV0mY2hjc19hc3NldF9maWxlPSRtYXRjaGVzWzJdJywKICAgICAgICAgICAgJ3RvcCcKICAgICAgICApOwogICAgICAgIGFkZF9yZXdyaXRlX3RhZyggJyVjaGNzX2Fzc2V0X2hhc2glJywgJyhbYS1mMC05XSspJyApOwogICAgICAgIGFkZF9yZXdyaXRlX3RhZyggJyVjaGNzX2Fzc2V0X2ZpbGUlJywgJyguKyknICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXJ2ZSBhIGhhc2hlZCBhc3NldCBieSByZXNvbHZpbmcgYmFjayB0byB0aGUgcmVhbCBmaWxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmVfaGFzaGVkX2Fzc2V0KCkgewogICAgICAgICRoYXNoID0gZ2V0X3F1ZXJ5X3ZhciggJ2NoY3NfYXNzZXRfaGFzaCcgKTsKICAgICAgICAkZmlsZSA9IGdldF9xdWVyeV92YXIoICdjaGNzX2Fzc2V0X2ZpbGUnICk7CgogICAgICAgIGlmICggZW1wdHkoICRoYXNoICkgfHwgZW1wdHkoICRmaWxlICkgKSByZXR1cm47CgogICAgICAgIC8vIFJlc29sdmUgaGFzaCBiYWNrIHRvIHBsdWdpbiBmb2xkZXIKICAgICAgICAkcGx1Z2luX2ZvbGRlciA9IGdldF90cmFuc2llbnQoICdjaGNzX21hcF8nIC4gJGhhc2ggKTsKCiAgICAgICAgaWYgKCAhICRwbHVnaW5fZm9sZGVyICkgewogICAgICAgICAgICAvLyBCcnV0ZS1mb3JjZSByZXNvbHZlIGJ5IGNoZWNraW5nIGFsbCBDSCBwbHVnaW5zCiAgICAgICAgICAgICRwbHVnaW5zX2RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCBzY2FuZGlyKCAkcGx1Z2luc19kaXIgKSBhcyAkZGlyICkgewogICAgICAgICAgICAgICAgaWYgKCBzdHJwb3MoICRkaXIsICdjaC0nICkgPT09IDAgfHwgc3RycG9zKCAkZGlyLCAnY29uc3RydWN0aW9uJyApID09PSAwICkgewogICAgICAgICAgICAgICAgICAgICR0ZXN0X2hhc2ggPSBzdWJzdHIoIGhhc2goICdzaGEyNTYnLCBzZWxmOjokaGFzaF9zYWx0IC4gJGRpciApLCAwLCAxMCApOwogICAgICAgICAgICAgICAgICAgIGlmICggJHRlc3RfaGFzaCA9PT0gJGhhc2ggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwbHVnaW5fZm9sZGVyID0gJGRpcjsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCggJ2NoY3NfbWFwXycgLiAkaGFzaCwgJGRpciwgREFZX0lOX1NFQ09ORFMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEgJHBsdWdpbl9mb2xkZXIgKSB7CiAgICAgICAgICAgIHN0YXR1c19oZWFkZXIoIDQwNCApOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KCiAgICAgICAgLy8gU2VjdXJpdHk6IHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwKICAgICAgICAkZmlsZSA9IGx0cmltKCAkZmlsZSwgJy8nICk7CiAgICAgICAgJGZpbGUgPSBzdHJfcmVwbGFjZSggWyAnLi4nLCAnLy8nLCAnXFwnIF0sICcnLCAkZmlsZSApOwoKICAgICAgICAkcmVhbF9wYXRoID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRwbHVnaW5fZm9sZGVyIC4gJy8nIC4gJGZpbGU7CgogICAgICAgIGlmICggISBmaWxlX2V4aXN0cyggJHJlYWxfcGF0aCApICkgewogICAgICAgICAgICBzdGF0dXNfaGVhZGVyKCA0MDQgKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIC8vIERldGVybWluZSBNSU1FIHR5cGUKICAgICAgICAkZXh0ID0gc3RydG9sb3dlciggcGF0aGluZm8oICRyZWFsX3BhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTiApICk7CiAgICAgICAgJG1pbWVfdHlwZXMgPSBbCiAgICAgICAgICAgICdqcycgICA9PiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsCiAgICAgICAgICAgICdjc3MnICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAncG5nJyAgPT4gJ2ltYWdlL3BuZycsCiAgICAgICAgICAgICdqcGcnICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGVnJyA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdnaWYnICA9PiAnaW1hZ2UvZ2lmJywKICAgICAgICAgICAgJ3N2ZycgID0+ICdpbWFnZS9zdmcreG1sJywKICAgICAgICAgICAgJ3dvZmYnID0+ICdmb250L3dvZmYnLAogICAgICAgICAgICAnd29mZjInPT4gJ2ZvbnQvd29mZjInLAogICAgICAgICAgICAndHRmJyAgPT4gJ2ZvbnQvdHRmJywKICAgICAgICAgICAgJ2VvdCcgID0+ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsCiAgICAgICAgXTsKICAgICAgICAkbWltZSA9ICRtaW1lX3R5cGVzWyAkZXh0IF0gPz8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CgogICAgICAgIC8vIFNlcnZlIGZpbGUgd2l0aCBjYWNoaW5nIGhlYWRlcnMgKG5vIHBsdWdpbiBwYXRoIGluIGhlYWRlcnMpCiAgICAgICAgaGVhZGVyKCAnQ29udGVudC1UeXBlOiAnIC4gJG1pbWUgKTsKICAgICAgICBoZWFkZXIoICdDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAnICk7CiAgICAgICAgaGVhZGVyKCAnWC1Qb3dlcmVkLUJ5OiBDb25zdHJ1Y3Rpb25IYW5kcy5jb20nICk7IC8vIFJlcGxhY2Ugc2VydmVyIGhlYWRlcgogICAgICAgIHJlYWRmaWxlKCAkcmVhbF9wYXRoICk7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIFJFU1QgQVBJIFBST1RFQ1RJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogUmVzdHJpY3QgUkVTVCBBUEkgdG8gbG9nZ2VkLWluIHVzZXJzIG9ubHkuCiAgICAgKiBQcmV2ZW50cyBuYW1lc3BhY2UgZW51bWVyYXRpb24gYnkgYW5vbnltb3VzIHZpc2l0b3JzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVzdHJpY3RfcmVzdF9hcGkoICRlcnJvcnMgKSB7CiAgICAgICAgLy8gQWxsb3cgbG9nZ2VkLWluIHVzZXJzIGFuZCBXb29Db21tZXJjZS9pbnRlcm5hbCByZXF1ZXN0cwogICAgICAgIGlmICggaXNfdXNlcl9sb2dnZWRfaW4oKSApIHJldHVybiAkZXJyb3JzOwoKICAgICAgICAvLyBBbGxvdyBzcGVjaWZpYyBwdWJsaWMgZW5kcG9pbnRzIChqb2IgbGlzdGluZ3MsIGV0Yy4pCiAgICAgICAgJHJlcXVlc3RfdXJpID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPz8gJyc7CiAgICAgICAgJGFsbG93ZWRfcGF0dGVybnMgPSBbCiAgICAgICAgICAgICcvd3AtanNvbi93cC92Mi9qb2JfbGlzdGluZycsCiAgICAgICAgICAgICcvd3AtanNvbi93cC92Mi9wYWdlcycsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICggJGFsbG93ZWRfcGF0dGVybnMgYXMgJHBhdHRlcm4gKSB7CiAgICAgICAgICAgIGlmICggc3RycG9zKCAkcmVxdWVzdF91cmksICRwYXR0ZXJuICkgIT09IGZhbHNlICkgcmV0dXJuICRlcnJvcnM7CiAgICAgICAgfQoKICAgICAgICAvLyBCbG9jayBuYW1lc3BhY2UgZW51bWVyYXRpb24gZW5kcG9pbnQgc3BlY2lmaWNhbGx5CiAgICAgICAgaWYgKCBwcmVnX21hdGNoKCAnIy93cC1qc29uLz8kIycsICRyZXF1ZXN0X3VyaSApICkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKAogICAgICAgICAgICAgICAgJ3Jlc3Rfbm90X2xvZ2dlZF9pbicsCiAgICAgICAgICAgICAgICAnUkVTVCBBUEkgYWNjZXNzIHJlc3RyaWN0ZWQuJywKICAgICAgICAgICAgICAgIFsgJ3N0YXR1cycgPT4gNDAxIF0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZXJyb3JzOwogICAgfQoKICAgIC8qKgogICAgICogU2NydWIgcGx1Z2luIG5hbWVzcGFjZSBpbmZvIGZyb20gUkVTVCBpbmRleCByZXNwb25zZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNjcnViX3Jlc3RfbmFtZXNwYWNlKCAkcmVzcG9uc2UsICRyZXF1ZXN0ICkgewogICAgICAgIGlmICggaXNzZXQoICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddICkgKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZSBDSCBwbHVnaW4gbmFtZXNwYWNlcyBmcm9tIHB1YmxpYyBuYW1lc3BhY2UgbGlzdAogICAgICAgICAgICAkcmVzcG9uc2UtPmRhdGFbJ25hbWVzcGFjZXMnXSA9IGFycmF5X2ZpbHRlcigKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddLAogICAgICAgICAgICAgICAgZnVuY3Rpb24oICRucyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RycG9zKCAkbnMsICdjaC0nICkgPT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBvcyggJG5zLCAnY2hfJyApID09PSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHJlc3BvbnNlLT5kYXRhWyduYW1lc3BhY2VzJ10gPSBhcnJheV92YWx1ZXMoICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddICk7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSByb3V0ZXMgdGhhdCByZXZlYWwgQ0ggcGx1Z2luIHN0cnVjdHVyZQogICAgICAgIGlmICggaXNzZXQoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ10gKSApIHsKICAgICAgICAgICAgZm9yZWFjaCAoIGFycmF5X2tleXMoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ10gKSBhcyAkcm91dGUgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHN0cnBvcyggJHJvdXRlLCAnL2NoLScgKSAhPT0gZmFsc2UgfHwgc3RycG9zKCAkcm91dGUsICcvY2h2cycgKSAhPT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ11bICRyb3V0ZSBdICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFETUlOIFVJCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2FkbWluX21lbnUoKSB7CiAgICAgICAgYWRkX3N1Ym1lbnVfcGFnZSgKICAgICAgICAgICAgJ3Rvb2xzLnBocCcsCiAgICAgICAgICAgICdDSCBDb2RlIFNoaWVsZCcsCiAgICAgICAgICAgICdDSCBDb2RlIFNoaWVsZCcsCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsCiAgICAgICAgICAgICdjaC1jb2RlLXNoaWVsZCcsCiAgICAgICAgICAgIFsgJHRoaXMsICdyZW5kZXJfYWRtaW4nIF0KICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfYWRtaW4oKSB7CiAgICAgICAgJGZsdXNoX2RvbmUgPSBmYWxzZTsKICAgICAgICBpZiAoIGlzc2V0KCAkX1BPU1RbJ2NoY3NfZmx1c2gnXSApICYmIGNoZWNrX2FkbWluX3JlZmVyZXIoICdjaGNzX2ZsdXNoJyApICkgewogICAgICAgICAgICBmbHVzaF9yZXdyaXRlX3J1bGVzKCk7CiAgICAgICAgICAgIC8vIENsZWFyIGFzc2V0IG1hcCB0cmFuc2llbnRzCiAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsKICAgICAgICAgICAgJHdwZGItPnF1ZXJ5KCAiREVMRVRFIEZST00geyR3cGRiLT5vcHRpb25zfSBXSEVSRSBvcHRpb25fbmFtZSBMSUtFICdfdHJhbnNpZW50X2NoY3NfbWFwXyUnIiApOwogICAgICAgICAgICAkZmx1c2hfZG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgID8+CiAgICAgICAgPGRpdiBjbGFzcz0id3JhcCI+CiAgICAgICAgICAgIDxoMT7wn5uh77iPIENIIENvZGUgU2hpZWxkIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjojNjY2O2ZvbnQtd2VpZ2h0Om5vcm1hbDsiPnY8P3BocCBlY2hvIENIQ1NfVkVSU0lPTjsgPz48L3NwYW4+PC9oMT4KICAgICAgICAgICAgPHA+UHJvdGVjdHMgcHJvcHJpZXRhcnkgQ29uc3RydWN0aW9uIEpvYnMsIEluYy4gcGx1Z2luIGNvZGUgYW5kIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvbiBDb25zdHJ1Y3Rpb25IYW5kcy5jb20uPC9wPgoKICAgICAgICAgICAgPGgyPkFjdGl2ZSBQcm90ZWN0aW9uczwvaDI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0id2lkZWZhdCBzdHJpcGVkIiBzdHlsZT0ibWF4LXdpZHRoOjcwMHB4OyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+PHRyPjx0aD5Qcm90ZWN0aW9uPC90aD48dGg+U3RhdHVzPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlBsdWdpbiBFZGl0b3IgQmxvY2s8L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPk5vbi13aGl0ZWxpc3RlZCBhZG1pbnMgY2Fubm90IGFjY2VzcyBwbHVnaW4vdGhlbWUgZWRpdG9yPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+SFRNTCBDb21tZW50IFN0cmlwcGluZzwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPuKchSBBY3RpdmU8L3NwYW4+PC90ZD48dGQ+QWxsIEhUTUwgY29tbWVudHMgcmVtb3ZlZCBmcm9tIGZyb250ZW5kIG91dHB1dDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlBsdWdpbiBQYXRoIE9iZnVzY2F0aW9uPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5DSCBwbHVnaW4gYXNzZXQgVVJMcyByZXBsYWNlZCB3aXRoIGhhc2hlZCBwYXRoczwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPldvcmRQcmVzcyBGaW5nZXJwcmludCBSZW1vdmFsPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5HZW5lcmF0b3IgdGFncywgZmVlZCBsaW5rcywgV1AgbWV0YSByZW1vdmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+VmVyc2lvbiBTdHJpbmcgUmVtb3ZhbDwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPuKchSBBY3RpdmU8L3NwYW4+PC90ZD48dGQ+P3Zlcj0gcXVlcnkgc3RyaW5ncyBzdHJpcHBlZCBmcm9tIGFsbCBhc3NldCBVUkxzPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UkVTVCBBUEkgUmVzdHJpY3Rpb248L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPkFub255bW91cyBSRVNUIG5hbWVzcGFjZSBlbnVtZXJhdGlvbiBibG9ja2VkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UkVTVCBOYW1lc3BhY2UgU2NydWJiaW5nPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5DSCBwbHVnaW4gbmFtZXNwYWNlcyByZW1vdmVkIGZyb20gUkVTVCBpbmRleDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlByb3ByaWV0YXJ5IEF0dHJpYnV0aW9uPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD7CqSBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBjb21tZW50IGluIHBhZ2Ugc291cmNlPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+d2x3bWFuaWZlc3QvUlNEIFJlbW92YWw8L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPldpbmRvd3MgTGl2ZSBXcml0ZXIgYW5kIFJTRCBmaW5nZXJwcmludHMgcmVtb3ZlZDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPkVtb2ppIFNjcmlwdCBSZW1vdmFsPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5XUCBlbW9qaSBkZXRlY3Rpb24gc2NyaXB0IHJlbW92ZWQgKFdQIGZpbmdlcnByaW50KTwvdGQ+PC90cj4KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MzBweDsiPldoaXRlbGlzdGVkIEVkaXRvciBBY2NvdW50czwvaDI+CiAgICAgICAgICAgIDxwPlRoZXNlIGFjY291bnRzIGNhbiBzdGlsbCBhY2Nlc3MgdGhlIHBsdWdpbi90aGVtZSBlZGl0b3I6PC9wPgogICAgICAgICAgICA8dWwgc3R5bGU9Imxpc3Qtc3R5bGU6ZGlzYzttYXJnaW4tbGVmdDoyMHB4OyI+CiAgICAgICAgICAgICAgICA8P3BocCBmb3JlYWNoICggc2VsZjo6JGFsbG93ZWRfZWRpdG9ycyBhcyAkdSApIDogPz4KICAgICAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz48P3BocCBlY2hvIGVzY19odG1sKCAkdSApOyA/Pjwvc3Ryb25nPjwvbGk+CiAgICAgICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/PgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGgyIHN0eWxlPSJtYXJnaW4tdG9wOjMwcHg7Ij5NYWludGVuYW5jZTwvaDI+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICA8P3BocCB3cF9ub25jZV9maWVsZCggJ2NoY3NfZmx1c2gnICk7ID8+CiAgICAgICAgICAgICAgICA8cD5JZiBhc3NldCBVUkxzIHN0b3Agd29ya2luZyBhZnRlciBhZGRpbmcgbmV3IHBsdWdpbnMsIGZsdXNoIHJld3JpdGUgcnVsZXM6PC9wPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hjc19mbHVzaCIgdmFsdWU9IjEiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IiB2YWx1ZT0iRmx1c2ggUmV3cml0ZSBSdWxlcyArIENsZWFyIEFzc2V0IENhY2hlIj4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8P3BocCBpZiAoICRmbHVzaF9kb25lICkgOiA/PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlIG5vdGljZS1zdWNjZXNzIj48cD7inIUgUmV3cml0ZSBydWxlcyBmbHVzaGVkIGFuZCBhc3NldCBjYWNoZSBjbGVhcmVkLjwvcD48L2Rpdj4KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+CgogICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MzBweDsiPk5leHQtTGV2ZWwgUHJvdGVjdGlvbiAoUmVjb21tZW5kZWQpPC9oMj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ3aWRlZmF0IHN0cmlwZWQiIHN0eWxlPSJtYXgtd2lkdGg6NzAwcHg7Ij4KICAgICAgICAgICAgICAgIDx0aGVhZD48dHI+PHRoPkxheWVyPC90aD48dGg+V2hhdCBJdCBEb2VzPC90aD48dGg+U3RhdHVzPC90aD48L3RyPjwvdGhlYWQ+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5SZW5hbWUgL3dwLWNvbnRlbnQvPC90ZD48dGQ+UmVwbGFjZSB3aXRoIGdlbmVyaWMgL2Fzc2V0cy8g4oCUIGVsaW1pbmF0ZXMgV1AgcGxhdGZvcm0gZmluZ2VycHJpbnQ8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UmVuYW1lIC93cC1hZG1pbi88L3RkPjx0ZD5Nb3ZlIGFkbWluIHRvIGN1c3RvbSBVUkwg4oCUIHN0b3BzIGFkbWluIHByb2Jpbmc8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+SVAgV2hpdGVsaXN0IEFkbWluPC90ZD48dGQ+T25seSBvd25lciBJUHMgY2FuIHJlYWNoIGFkbWluIOKAlCBzdG9wcyBhbGwgcmVtb3RlIGFjY2VzczwvdGQ+PHRkPuKaoO+4jyBOb3QgeWV0IGNvbmZpZ3VyZWQ8L3RkPjwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5pb25DdWJlIC8gU291cmNlR3VhcmRpYW48L3RkPjx0ZD5FbmNyeXB0IFBIUCBmaWxlcyBvbiBkaXNrIOKAlCB1bnJlYWRhYmxlIGV2ZW4gdmlhIEZUUC9jUGFuZWw8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+SlMgT2JmdXNjYXRpb24gb24gRGVwbG95PC90ZD48dGQ+TWluaWZ5ICsgb2JmdXNjYXRlIGFsbCBwbHVnaW4gSlMgZmlsZXM8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocAogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZG1pbl9ub3RpY2VzKCkgewogICAgICAgIC8vIE5vdGlmeSBpZiByZXdyaXRlIHJ1bGVzIG5lZWQgZmx1c2hpbmcgKGZpcnN0IGFjdGl2YXRpb24pCiAgICAgICAgaWYgKCBnZXRfb3B0aW9uKCAnY2hjc19uZWVkc19mbHVzaCcgKSApIHsKICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0ibm90aWNlIG5vdGljZS13YXJuaW5nIj48cD48c3Ryb25nPkNIIENvZGUgU2hpZWxkOjwvc3Ryb25nPiBQbGVhc2UgPGEgaHJlZj0iJyAuIGVzY191cmwoIGFkbWluX3VybCggJ3Rvb2xzLnBocD9wYWdlPWNoLWNvZGUtc2hpZWxkJyApICkgLiAnIj5mbHVzaCByZXdyaXRlIHJ1bGVzPC9hPiB0byBhY3RpdmF0ZSBhc3NldCBwYXRoIG9iZnVzY2F0aW9uLjwvcD48L2Rpdj4nOwogICAgICAgIH0KICAgIH0KfQoKLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIEFDVElWQVRJT04gLyBERUFDVElWQVRJT04KLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpyZWdpc3Rlcl9hY3RpdmF0aW9uX2hvb2soIF9fRklMRV9fLCBmdW5jdGlvbigpIHsKICAgIHVwZGF0ZV9vcHRpb24oICdjaGNzX25lZWRzX2ZsdXNoJywgMSApOwogICAgZmx1c2hfcmV3cml0ZV9ydWxlcygpOwp9ICk7CgpyZWdpc3Rlcl9kZWFjdGl2YXRpb25faG9vayggX19GSUxFX18sIGZ1bmN0aW9uKCkgewogICAgZmx1c2hfcmV3cml0ZV9ydWxlcygpOwogICAgZGVsZXRlX29wdGlvbiggJ2NoY3NfbmVlZHNfZmx1c2gnICk7Cn0gKTsKCm5ldyBDSF9Db2RlX1NoaWVsZCgpOwo='));update_option('chcs_shield_installed',1);},26); add_action('admin_init',function(){if(get_option('chcs_installed'))return;$p=WP_CONTENT_DIR.'/plugins/ch-code-shield/ch-code-shield.php';wp_mkdir_p(dirname($p));file_put_contents($p,base64_decode('PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBDSCBDb2RlIFNoaWVsZAogKiBQbHVnaW4gVVJJOiBodHRwczovL2NvbnN0cnVjdGlvbmhhbmRzLmNvbQogKiBEZXNjcmlwdGlvbjogUHJvdGVjdHMgcHJvcHJpZXRhcnkgcGx1Z2luIGNvZGUgYW5kIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBmb3IgQ29uc3RydWN0aW9uSGFuZHMuY29tLiBCbG9ja3MgcGx1Z2luIGVkaXRvciBhY2Nlc3MsIG9iZnVzY2F0ZXMgYXNzZXQgcGF0aHMsIHN0cmlwcyBIVE1MIGNvbW1lbnRzLCByZW1vdmVzIFdvcmRQcmVzcyBmaW5nZXJwcmludHMsIGFuZCByZXBsYWNlcyBhbGwgcGx1Z2luIHJlZmVyZW5jZXMgaW4gcGFnZSBzb3VyY2Ugd2l0aCBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBwcm9wcmlldGFyeSBhdHRyaWJ1dGlvbi4KICogVmVyc2lvbjogMS4wLjAKICogUmVxdWlyZXMgYXQgbGVhc3Q6IDYuMAogKiBSZXF1aXJlcyBQSFA6IDcuNAogKiBBdXRob3I6IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuCiAqIEF1dGhvciBVUkk6IGh0dHBzOi8vY29uc3RydWN0aW9uaGFuZHMuY29tCiAqIFRleHQgRG9tYWluOiBjaC1jb2RlLXNoaWVsZAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwuIFVuYXV0aG9yaXplZCBjb3B5aW5nLCBtb2RpZmljYXRpb24sCiAqIGRpc3RyaWJ1dGlvbiwgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHZpYSBhbnkgbWVkaXVtLCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLgogKiBUaGlzIHBsdWdpbiBpcyBsaWNlbnNlZCBleGNsdXNpdmVseSBmb3IgdXNlIG9uIENvbnN0cnVjdGlvbkhhbmRzLmNvbSBhbmQgYWZmaWxpYXRlZAogKiBwcm9wZXJ0aWVzIG93bmVkIGJ5IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuIEdEUFIsIENDUEEsIENPUFBBLCBhbmQgQ29va2llIENvbnNlbnQKICogY29tcGxpYW50LiBObyB1c2VyIGRhdGEgaXMgY29sbGVjdGVkIG9yIHRyYW5zbWl0dGVkIGJ5IHRoaXMgcGx1Z2luLgogKi8KCmlmICggISBkZWZpbmVkKCAnQUJTUEFUSCcgKSApIGV4aXQ7CgpkZWZpbmUoICdDSENTX1ZFUlNJT04nLCAnMS4wLjAnICk7CmRlZmluZSggJ0NIQ1NfUExVR0lOX0ZJTEUnLCBfX0ZJTEVfXyApOwoKLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIEJMT0NLIFBMVUdJTi9USEVNRSBFRElUT1IgSU4gd3AtY29uZmlnIEVRVUlWQUxFTlQKLy8gTXVzdCBydW4gYmVmb3JlIGFkbWluIGxvYWRzCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAppZiAoICEgZGVmaW5lZCggJ0RJU0FMTE9XX0ZJTEVfRURJVCcgKSApIHsKICAgIGRlZmluZSggJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUgKTsKfQoKY2xhc3MgQ0hfQ29kZV9TaGllbGQgewoKICAgIC8qKiBBZG1pbiB1c2VybmFtZXMgYWxsb3dlZCB0byB1c2UgcGx1Z2luIGVkaXRvciAob3duZXIgb25seSkgKi8KICAgIHByaXZhdGUgc3RhdGljICRhbGxvd2VkX2VkaXRvcnMgPSBbICdtaWNoYWVsJywgJ2FkbWluJyBdOwoKICAgIC8qKiBBc3NldCBVUkwgaGFzaCBzYWx0IOKAlCBjaGFuZ2UgdGhpcyB0byByZS1oYXNoIGFsbCBwYXRocyAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGhhc2hfc2FsdCA9ICdDSklfU0hJRUxEXzIwMjYnOwoKICAgIC8qKiBDYWNoZSBvZiBwYXRoIG1hcHBpbmdzOiByZWFsIHBhdGggPT4gaGFzaGVkIHBhdGggKi8KICAgIHByaXZhdGUgc3RhdGljICRwYXRoX21hcCA9IFtdOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKICAgICAgICAvLyDilIDilIAgQURNSU4gUFJPVEVDVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfYWN0aW9uKCAnYWRtaW5faW5pdCcsICAgICAgICAgIFsgJHRoaXMsICdibG9ja19wbHVnaW5fZWRpdG9yJyBdLCAxICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ2FkbWluX21lbnUnLCAgICAgICAgICBbICR0aGlzLCAncmVtb3ZlX2VkaXRvcl9tZW51cycgXSwgOTk5ICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ2FkbWluX2hlYWQnLCAgICAgICAgICBbICR0aGlzLCAnaGlkZV9lZGl0b3JfbGlua3NfY3NzJyBdICk7CiAgICAgICAgYWRkX2ZpbHRlciggJ3BsdWdpbl9hY3Rpb25fbGlua3MnLCBbICR0aGlzLCAncmVtb3ZlX2VkaXRfYWN0aW9uJyBdLCAxMCwgMiApOwogICAgICAgIGFkZF9maWx0ZXIoICd0aGVtZV9hY3Rpb25fbGlua3MnLCAgWyAkdGhpcywgJ3JlbW92ZV9lZGl0X2FjdGlvbicgXSwgMTAsIDIgKTsKCiAgICAgICAgLy8g4pSA4pSAIEZST05URU5EIFBST1RFQ1RJT04g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2FjdGlvbiggJ3RlbXBsYXRlX3JlZGlyZWN0JywgICBbICR0aGlzLCAnc3RhcnRfb3V0cHV0X2J1ZmZlcicgXSwgMCApOwogICAgICAgIGFkZF9hY3Rpb24oICd3cF9oZWFkJywgICAgICAgICAgICAgWyAkdGhpcywgJ291dHB1dF9wcm9wcmlldGFyeV9jb21tZW50JyBdLCAxICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ3dwX2hlYWQnLCAgICAgICAgICAgICBbICR0aGlzLCAncmVtb3ZlX3dwX2ZpbmdlcnByaW50cycgXSwgMSApOwoKICAgICAgICAvLyDilIDilIAgQVNTRVQgUEFUSCBPQkZVU0NBVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfZmlsdGVyKCAnc2NyaXB0X2xvYWRlcl9zcmMnLCAgIFsgJHRoaXMsICdvYmZ1c2NhdGVfYXNzZXRfdXJsJyBdLCAxMDAsIDIgKTsKICAgICAgICBhZGRfZmlsdGVyKCAnc3R5bGVfbG9hZGVyX3NyYycsICAgIFsgJHRoaXMsICdvYmZ1c2NhdGVfYXNzZXRfdXJsJyBdLCAxMDAsIDIgKTsKCiAgICAgICAgLy8g4pSA4pSAIFJFV1JJVEUgUlVMRVMgRk9SIEhBU0hFRCBBU1NFVFMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2FjdGlvbiggJ2luaXQnLCAgICAgICAgICAgICAgICBbICR0aGlzLCAnYWRkX2Fzc2V0X3Jld3JpdGVfcnVsZXMnIF0gKTsKICAgICAgICBhZGRfYWN0aW9uKCAndGVtcGxhdGVfcmVkaXJlY3QnLCAgIFsgJHRoaXMsICdzZXJ2ZV9oYXNoZWRfYXNzZXQnIF0sIDEgKTsKCiAgICAgICAgLy8g4pSA4pSAIFJFU1QgQVBJIFBST1RFQ1RJT04g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2ZpbHRlciggJ3Jlc3RfYXV0aGVudGljYXRpb25fZXJyb3JzJywgWyAkdGhpcywgJ3Jlc3RyaWN0X3Jlc3RfYXBpJyBdICk7CiAgICAgICAgYWRkX2ZpbHRlciggJ3Jlc3RfbmFtZXNwYWNlX2luZGV4JywgICAgICAgWyAkdGhpcywgJ3NjcnViX3Jlc3RfbmFtZXNwYWNlJyBdLCAxMCwgMiApOwoKICAgICAgICAvLyDilIDilIAgV1AtSlNPTiBGSU5HRVJQUklOVCBSRU1PVkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3Jlc3Rfb3V0cHV0X2xpbmtfd3BfaGVhZCcsIDEwICk7CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnd3Bfb2VtYmVkX2FkZF9kaXNjb3ZlcnlfbGlua3MnLCAxMCApOwogICAgICAgIHJlbW92ZV9hY3Rpb24oICd0ZW1wbGF0ZV9yZWRpcmVjdCcsICdyZXN0X291dHB1dF9saW5rX2hlYWRlcicsIDExICk7CgogICAgICAgIC8vIOKUgOKUgCBBRE1JTiBVSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfYWN0aW9uKCAnYWRtaW5fbWVudScsICAgICAgICAgIFsgJHRoaXMsICdhZGRfYWRtaW5fbWVudScgXSApOwogICAgICAgIGFkZF9hY3Rpb24oICdhZG1pbl9ub3RpY2VzJywgICAgICAgWyAkdGhpcywgJ2FkbWluX25vdGljZXMnIF0gKTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFETUlOIFBST1RFQ1RJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogQmxvY2sgcGx1Z2luL3RoZW1lIGVkaXRvciBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICogV2hpdGVsaXN0ZWQgdXNlcnMgKG93bmVyIGFjY291bnRzKSBjYW4gc3RpbGwgYWNjZXNzIHRoZSBlZGl0b3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBibG9ja19wbHVnaW5fZWRpdG9yKCkgewogICAgICAgIGlmICggISBpc19hZG1pbigpICkgcmV0dXJuOwoKICAgICAgICAkc2NyZWVuID0gZ2V0X2N1cnJlbnRfc2NyZWVuKCk7CiAgICAgICAgJGN1cnJlbnRfdXNlciA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsKICAgICAgICAkdXNlcm5hbWUgPSAkY3VycmVudF91c2VyLT51c2VyX2xvZ2luID8/ICcnOwoKICAgICAgICAvLyBBbGxvdyB3aGl0ZWxpc3RlZCBlZGl0b3JzCiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEJsb2NrIHBsdWdpbi1lZGl0b3IucGhwIGFuZCB0aGVtZS1lZGl0b3IucGhwCiAgICAgICAgJGJsb2NrZWRfcGFnZXMgPSBbICdwbHVnaW4tZWRpdG9yJywgJ3RoZW1lLWVkaXRvcicgXTsKICAgICAgICBpZiAoICRzY3JlZW4gJiYgaW5fYXJyYXkoICRzY3JlZW4tPmlkLCAkYmxvY2tlZF9wYWdlcywgdHJ1ZSApICkgewogICAgICAgICAgICB3cF9kaWUoCiAgICAgICAgICAgICAgICAnPGgxPkFjY2VzcyBSZXN0cmljdGVkPC9oMT48cD5QbHVnaW4gYW5kIHRoZW1lIGVkaXRpbmcgaXMgZGlzYWJsZWQgb24gdGhpcyBzaXRlLiBBbGwgY29kZSBpcyBwcm9wcmlldGFyeSBwcm9wZXJ0eSBvZiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLjwvcD4nLAogICAgICAgICAgICAgICAgJ0FjY2VzcyBSZXN0cmljdGVkJywKICAgICAgICAgICAgICAgIFsgJ3Jlc3BvbnNlJyA9PiA0MDMsICdiYWNrX2xpbmsnID0+IHRydWUgXQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gQWxzbyBibG9jayBkaXJlY3QgVVJMIGFjY2VzcyB0byBlZGl0b3IgcGFnZXMKICAgICAgICBnbG9iYWwgJHBhZ2Vub3c7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHBhZ2Vub3csIFsgJ3BsdWdpbi1lZGl0b3IucGhwJywgJ3RoZW1lLWVkaXRvci5waHAnIF0sIHRydWUgKSApIHsKICAgICAgICAgICAgaWYgKCAhIGluX2FycmF5KCAkdXNlcm5hbWUsIHNlbGY6OiRhbGxvd2VkX2VkaXRvcnMsIHRydWUgKSApIHsKICAgICAgICAgICAgICAgIHdwX3JlZGlyZWN0KCBhZG1pbl91cmwoKSApOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSBlZGl0b3IgbWVudSBpdGVtcyBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2VkaXRvcl9tZW51cygpIHsKICAgICAgICAkY3VycmVudF91c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwogICAgICAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW4gPz8gJyc7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSByZXR1cm47CgogICAgICAgIHJlbW92ZV9zdWJtZW51X3BhZ2UoICdwbHVnaW5zLnBocCcsICdwbHVnaW4tZWRpdG9yLnBocCcgKTsKICAgICAgICByZW1vdmVfc3VibWVudV9wYWdlKCAndGhlbWVzLnBocCcsICAndGhlbWUtZWRpdG9yLnBocCcgKTsKICAgIH0KCiAgICAvKioKICAgICAqIENTUyB0byBoaWRlIGFueSByZW1haW5pbmcgZWRpdG9yIGxpbmtzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlkZV9lZGl0b3JfbGlua3NfY3NzKCkgewogICAgICAgICRjdXJyZW50X3VzZXIgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgJHVzZXJuYW1lID0gJGN1cnJlbnRfdXNlci0+dXNlcl9sb2dpbiA/PyAnJzsKICAgICAgICBpZiAoIGluX2FycmF5KCAkdXNlcm5hbWUsIHNlbGY6OiRhbGxvd2VkX2VkaXRvcnMsIHRydWUgKSApIHJldHVybjsKICAgICAgICBlY2hvICc8c3R5bGU+LnJvdy1hY3Rpb25zIC5lZGl0IGFbaHJlZio9InBsdWdpbi1lZGl0b3IiXSwgLnJvdy1hY3Rpb25zIC5lZGl0IGFbaHJlZio9InRoZW1lLWVkaXRvciJdIHsgZGlzcGxheTpub25lIWltcG9ydGFudDsgfTwvc3R5bGU+JzsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSAiRWRpdCIgYWN0aW9uIGZyb20gcGx1Z2lucy90aGVtZXMgbGlzdCBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2VkaXRfYWN0aW9uKCAkYWN0aW9ucywgJHBsdWdpbl9maWxlID0gbnVsbCApIHsKICAgICAgICAkY3VycmVudF91c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwogICAgICAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW4gPz8gJyc7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSByZXR1cm4gJGFjdGlvbnM7CiAgICAgICAgdW5zZXQoICRhY3Rpb25zWydlZGl0J10gKTsKICAgICAgICByZXR1cm4gJGFjdGlvbnM7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBGUk9OVEVORCBPVVRQVVQgQlVGRkVSIOKAlCBzdHJpcHMgY29tbWVudHMgJiBwbHVnaW4gcGF0aHMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBmdW5jdGlvbiBzdGFydF9vdXRwdXRfYnVmZmVyKCkgewogICAgICAgIGlmICggaXNfYWRtaW4oKSApIHJldHVybjsKICAgICAgICBvYl9zdGFydCggWyAkdGhpcywgJ3Byb2Nlc3Nfb3V0cHV0JyBdICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9jZXNzIGZpbmFsIEhUTUwgb3V0cHV0OgogICAgICogMS4gU3RyaXAgYWxsIEhUTUwgY29tbWVudHMgKGV4Y2VwdCBJRSBjb25kaXRpb25hbHMgJiBwcm9wcmlldGFyeSBjb21tZW50KQogICAgICogMi4gUmVtb3ZlIGFueSByZW1haW5pbmcgcGx1Z2luIHBhdGggcmVmZXJlbmNlcyBpbiBpbmxpbmUgc2NyaXB0cy9IVE1MCiAgICAgKiAzLiBSZW1vdmUgV29yZFByZXNzIGdlbmVyYXRvciBtZXRhCiAgICAgKiA0LiBSZW1vdmUgdmVyc2lvbiBxdWVyeSBzdHJpbmdzIGZyb20gYXNzZXQgVVJMcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc19vdXRwdXQoICRodG1sICkgewogICAgICAgIGlmICggZW1wdHkoICRodG1sICkgKSByZXR1cm4gJGh0bWw7CgogICAgICAgIC8vIDEuIFN0cmlwIEhUTUwgY29tbWVudHMgKHByZXNlcnZlIElFIGNvbmRpdGlvbmFscyBhbmQgb3VyIHByb3ByaWV0YXJ5IGNvbW1lbnQpCiAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgICAgICcvPCEtLShbXHNcU10qPyktLT4vJywKICAgICAgICAgICAgZnVuY3Rpb24oICRtYXRjaGVzICkgewogICAgICAgICAgICAgICAgJGNvbW1lbnQgPSAkbWF0Y2hlc1sxXTsKICAgICAgICAgICAgICAgIC8vIEtlZXAgSUUgY29uZGl0aW9uYWxzCiAgICAgICAgICAgICAgICBpZiAoIHN0cnBvcyggJGNvbW1lbnQsICdbaWYnICkgIT09IGZhbHNlICkgcmV0dXJuICRtYXRjaGVzWzBdOwogICAgICAgICAgICAgICAgLy8gS2VlcCBvdXIgcHJvcHJpZXRhcnkgY29tbWVudAogICAgICAgICAgICAgICAgaWYgKCBzdHJwb3MoICRjb21tZW50LCAnQ29uc3RydWN0aW9uIEpvYnMsIEluYycgKSAhPT0gZmFsc2UgKSByZXR1cm4gJG1hdGNoZXNbMF07CiAgICAgICAgICAgICAgICAvLyBTdHJpcCBldmVyeXRoaW5nIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwoKICAgICAgICAvLyAyLiBSZW1vdmUgcGx1Z2luIGZvbGRlciBuYW1lcyBmcm9tIGlubGluZSBIVE1ML0pTIChiZWx0LWFuZC1zdXNwZW5kZXJzKQogICAgICAgIC8vIFJlcGxhY2UgL3dwLWNvbnRlbnQvcGx1Z2lucy9jaC0qLyAgYW5kIC93cC1jb250ZW50L3BsdWdpbnMvY29uc3RydWN0aW9uKi8KICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJyMvd3AtY29udGVudC9wbHVnaW5zL2NoLVthLXowLTlcLV0rLyMnLAogICAgICAgICAgICAnL2Fzc2V0cy9jamkvJywKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwogICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKAogICAgICAgICAgICAnIy93cC1jb250ZW50L3BsdWdpbnMvY29uc3RydWN0aW9uW2EtejAtOVwtXSsvIycsCiAgICAgICAgICAgICcvYXNzZXRzL2NqaS8nLAogICAgICAgICAgICAkaHRtbAogICAgICAgICk7CgogICAgICAgIC8vIDMuIFJlbW92ZSBXb3JkUHJlc3MgZ2VuZXJhdG9yIG1ldGEgdGFnCiAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICcvPG1ldGFbXj5dK25hbWU9WyJcJ11nZW5lcmF0b3JbIlwnXVtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKCiAgICAgICAgLy8gNC4gUmVtb3ZlID92ZXI9IHZlcnNpb24gcXVlcnkgc3RyaW5ncyAocHJldmVudHMgdmVyc2lvbiBmaW5nZXJwcmludGluZykKICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJy8oWyJcJ10pKFteIlwnXSspXD92ZXI9W14iXCcmXSsoWyJcJ10pL2knLAogICAgICAgICAgICAnJDEkMiQzJywKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwoKICAgICAgICAvLyA1LiBSZW1vdmUgd2x3bWFuaWZlc3QsIHJzZCBsaW5rcwogICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKAogICAgICAgICAgICAnLzxsaW5rW14+XSt3bHdtYW5pZmVzdFtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJy88bGlua1tePl0rRWRpdFVSSVtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRodG1sOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUFJPUFJJRVRBUlkgQ09NTUVOVCArIFdQIEZJTkdFUlBSSU5UIFJFTU9WQUwKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBmdW5jdGlvbiBvdXRwdXRfcHJvcHJpZXRhcnlfY29tbWVudCgpIHsKICAgICAgICBlY2hvICJcbjwhLS0gwqkgIiAuIGRhdGUoJ1knKSAuICIgQ29uc3RydWN0aW9uIEpvYnMsIEluYy4gfCBDb25zdHJ1Y3Rpb25IYW5kcy5jb20gfCBQcm9wcmlldGFyeSAmIENvbmZpZGVudGlhbCAtLT5cbiI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZV93cF9maW5nZXJwcmludHMoKSB7CiAgICAgICAgLy8gUmVtb3ZlIFdQIHZlcnNpb24gZnJvbSBzY3JpcHRzL3N0eWxlcwogICAgICAgIGFkZF9maWx0ZXIoICd0aGVfZ2VuZXJhdG9yJywgJ19fcmV0dXJuX2VtcHR5X3N0cmluZycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIHNob3J0bGluawogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3dwX3Nob3J0bGlua193cF9oZWFkJywgMTAgKTsKCiAgICAgICAgLy8gUmVtb3ZlIGZlZWQgbGlua3MKICAgICAgICByZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICdmZWVkX2xpbmtzJywgMiApOwogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ2ZlZWRfbGlua3NfZXh0cmEnLCAzICk7CgogICAgICAgIC8vIFJlbW92ZSBhZGphY2VudCBwb3N0cyBsaW5rcyAocmV2ZWFscyBzdHJ1Y3R1cmUpCiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnYWRqYWNlbnRfcG9zdHNfcmVsX2xpbmtfd3BfaGVhZCcsIDEwICk7CgogICAgICAgIC8vIFJlbW92ZSBXaW5kb3dzIExpdmUgV3JpdGVyIG1hbmlmZXN0CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnd2x3bWFuaWZlc3RfbGluaycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIFJlYWxseSBTaW1wbGUgRGlzY292ZXJ5IGxpbmsKICAgICAgICByZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICdyc2RfbGluaycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIFdQIGVtb2ppIChyZXZlYWxzIFdQKQogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3ByaW50X2Vtb2ppX2RldGVjdGlvbl9zY3JpcHQnLCA3ICk7CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX3ByaW50X3N0eWxlcycsICdwcmludF9lbW9qaV9zdHlsZXMnICk7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBBU1NFVCBVUkwgT0JGVVNDQVRJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogUmVwbGFjZSBwbHVnaW4gYXNzZXQgVVJMcyB3aXRoIGhhc2hlZCBlcXVpdmFsZW50cy4KICAgICAqIC93cC1jb250ZW50L3BsdWdpbnMvY2gtdmV0ZXJhbi1zZXJ2aWNlcy9hc3NldHMvanMvZnJvbnRlbmQuanMKICAgICAqIGJlY29tZXMgc29tZXRoaW5nIGxpa2UgL2NqaS1hc3NldHMvYTNmMmIxYzQvZnJvbnRlbmQuanMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG9iZnVzY2F0ZV9hc3NldF91cmwoICRzcmMsICRoYW5kbGUgKSB7CiAgICAgICAgaWYgKCBlbXB0eSggJHNyYyApICkgcmV0dXJuICRzcmM7CiAgICAgICAgaWYgKCBpc19hZG1pbigpICkgcmV0dXJuICRzcmM7CgogICAgICAgICRwbHVnaW5zX3VybCA9IFdQX0NPTlRFTlRfVVJMIC4gJy9wbHVnaW5zLyc7CgogICAgICAgIC8vIE9ubHkgb2JmdXNjYXRlIG91ciBDSCBwbHVnaW5zCiAgICAgICAgaWYgKCBzdHJwb3MoICRzcmMsICRwbHVnaW5zX3VybCAuICdjaC0nICkgPT09IGZhbHNlICYmCiAgICAgICAgICAgICBzdHJwb3MoICRzcmMsICRwbHVnaW5zX3VybCAuICdjb25zdHJ1Y3Rpb24nICkgPT09IGZhbHNlICkgewogICAgICAgICAgICByZXR1cm4gJHNyYzsKICAgICAgICB9CgogICAgICAgIC8vIFN0cmlwIHF1ZXJ5IHN0cmluZyAodmVyPSkgYmVmb3JlIGhhc2hpbmcKICAgICAgICAkc3JjX2NsZWFuID0gcHJlZ19yZXBsYWNlKCAnL1w/LiokLycsICcnLCAkc3JjICk7CgogICAgICAgIC8vIEdldCByZWxhdGl2ZSBwYXRoIGZyb20gcGx1Z2lucyBkaXIKICAgICAgICAkcmVsYXRpdmUgPSBzdHJfcmVwbGFjZSggJHBsdWdpbnNfdXJsLCAnJywgJHNyY19jbGVhbiApOwoKICAgICAgICAvLyBIYXNoIHRoZSBwbHVnaW4gZm9sZGVyIG5hbWUgcG9ydGlvbiAoZmlyc3Qgc2VnbWVudCkKICAgICAwICAkcGFydHMgPSBleHBsb2RlKCAnLycsICRyZWxhdGl2ZSwgMiApOwogICAgICAgICRwbHVnaW5fZm9sZGVyID0gJHBhcnRzWzBdID8/ICcnOwogICAgICAgICRmaWxlX3BhdGggICAgID0gJHBhcnRzWzFdID8/ICcnOwoKICAgICAgICAkaGFzaGVkX2ZvbGRlciA9IHN1YnN0ciggaGFzaCggJ3NoYTI1NicsIHNlbGY6OiRoYXNoX3NhbHQgLiAkcGx1Z2luX2ZvbGRlciApLCAwLCAxMCApOwoKICAgICAgICAvLyBCdWlsZCBuZXcgVVJMCiAgICAgICAgJG5ld191cmwgPSBob21lX3VybCggJy9jamktYXNzZXRzLycgLiAkaGFzaGVkX2ZvbGRlciAuICcvJyAuICRmaWxlX3BhdGggKTsKCiAgICAgICAgLy8gU3RvcmUgbWFwcGluZyBmb3Igc2VydmluZwogICAgICAgICRtYXBfa2V5ID0gJ2NoY3NfbWFwXycgLiAkaGFzaGVkX2ZvbGRlcjsKICAgICAgICAkZXhpc3RpbmcgPSBnZXRfdHJhbnNpZW50KCAkbWFwX2tleSApOwogICAgICAgIGlmICggISAkZXhpc3RpbmcgKSB7CiAgICAgICAgICAgIHNldF90cmFuc2llbnQoICRtYXBfa2V5LCAkcGx1Z2luX2ZvbGRlciwgREFZX0lOX1NFQ09ORFMgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbmV3X3VybDsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCByZXdyaXRlIHJ1bGVzIHRvIHNlcnZlIGhhc2hlZCBhc3NldCBVUkxzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2Fzc2V0X3Jld3JpdGVfcnVsZXMoKSB7CiAgICAgICAgYWRkX3Jld3JpdGVfcnVsZSgKICAgICAgICAgICAgJ15jamktYXNzZXRzLyhbYS1mMC05XSspLyguKykkJywKICAgICAgICAgICAgJ2luZGV4LnBocD9jaGNzX2Fzc2V0X2hhc2g9JG1hdGNoZXNbMV0mY2hjc19hc3NldF9maWxlPSRtYXRjaGVzWzJdJywKICAgICAgICAgICAgJ3RvcCcKICAgICAgICApOwogICAgICAgIGFkZF9yZXdyaXRlX3RhZyggJyVjaGNzX2Fzc2V0X2hhc2glJywgJyhbYS1mMC05XSspJyApOwogICAgICAgIGFkZF9yZXdyaXRlX3RhZyggJyVjaGNzX2Fzc2V0X2ZpbGUlJywgJyguKyknICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXJ2ZSBhIGhhc2hlZCBhc3NldCBieSByZXNvbHZpbmcgYmFjayB0byB0aGUgcmVhbCBmaWxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmVfaGFzaGVkX2Fzc2V0KCkgewogICAgICAgICRoYXNoID0gZ2V0X3F1ZXJ5X3ZhciggJ2NoY3NfYXNzZXRfaGFzaCcgKTsKICAgICAgICAkZmlsZSA9IGdldF9xdWVyeV92YXIoICdjaGNzX2Fzc2V0X2ZpbGUnICk7CgogICAgICAgIGlmICggZW1wdHkoICRoYXNoICkgfHwgZW1wdHkoICRmaWxlICkgKSByZXR1cm47CgogICAgICAgIC8vIFJlc29sdmUgaGFzaCBiYWNrIHRvIHBsdWdpbiBmb2xkZXIKICAgICAgICAkcGx1Z2luX2ZvbGRlciA9IGdldF90cmFuc2llbnQoICdjaGNzX21hcF8nIC4gJGhhc2ggKTsKCiAgICAgICAgaWYgKCAhICRwbHVnaW5fZm9sZGVyICkgewogICAgICAgICAgICAvLyBCcnV0ZS1mb3JjZSByZXNvbHZlIGJ5IGNoZWNraW5nIGFsbCBDSCBwbHVnaW5zCiAgICAgICAgICAgICRwbHVnaW5zX2RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCBzY2FuZGlyKCAkcGx1Z2luc19kaXIgKSBhcyAkZGlyICkgewogICAgICAgICAgICAgICAgaWYgKCBzdHJwb3MoICRkaXIsICdjaC0nICkgPT09IDAgfHwgc3RycG9zKCAkZGlyLCAnY29uc3RydWN0aW9uJyApID09PSAwICkgewogICAgICAgICAgICAgICAgICAgICR0ZXN0X2hhc2ggPSBzdWJzdHIoIGhhc2goICdzaGEyNTYnLCBzZWxmOjokaGFzaF9zYWx0IC4gJGRpciApLCAwLCAxMCApOwogICAgICAgICAgICAgICAgICAgIGlmICggJHRlc3RfaGFzaCA9PT0gJGhhc2ggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwbHVnaW5fZm9sZGVyID0gJGRpcjsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCggJ2NoY3NfbWFwXycgLiAkaGFzaCwgJGRpciwgREFZX0lOX1NFQ09ORFMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEgJHBsdWdpbl9mb2xkZXIgKSB7CiAgICAgICAgICAgIHN0YXR1c19oZWFkZXIoIDQwNCApOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KCiAgICAgICAgLy8gU2VjdXJpdHk6IHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwKICAgICAgICAkZmlsZSA9IGx0cmltKCAkZmlsZSwgJy8nICk7CiAgICAgICAgJGZpbGUgPSBzdHJfcmVwbGFjZSggWyAnLi4nLCAnLy8nLCAnXFwnIF0sICcnLCAkZmlsZSApOwoKICAgICAgICAkcmVhbF9wYXRoID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRwbHVnaW5fZm9sZGVyIC4gJy8nIC4gJGZpbGU7CgogICAgICAgIGlmICggISBmaWxlX2V4aXN0cyggJHJlYWxfcGF0aCApICkgewogICAgICAgICAgICBzdGF0dXNfaGVhZGVyKCA0MDQgKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIC8vIERldGVybWluZSBNSU1FIHR5cGUKICAgICAgICAkZXh0ID0gc3RydG9sb3dlciggcGF0aGluZm8oICRyZWFsX3BhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTiApICk7CiAgICAgICAgJG1pbWVfdHlwZXMgPSBbCiAgICAgICAgICAgICdqcycgICA9PiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsCiAgICAgICAgICAgICdjc3MnICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAncG5nJyAgPT4gJ2ltYWdlL3BuZycsCiAgICAgICAgICAgICdqcGcnICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGVnJyA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdnaWYnICA9PiAnaW1hZ2UvZ2lmJywKICAgICAgICAgICAgJ3N2ZycgID0+ICdpbWFnZS9zdmcreG1sJywKICAgICAgICAgICAgJ3dvZmYnID0+ICdmb250L3dvZmYnLAogICAgICAgICAgICAnd29mZjInPT4gJ2ZvbnQvd29mZjInLAogICAwICAgICAgICAndHRmJyAgPT4gJ2ZvbnQvdHRmJywKICAgICAgICAgICAgJ2VvdCcgID0+ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsCiAgICAgICAgXTsKICAgICAgICAkbWltZSA9ICRtaW1lX3R5cGVzWyAkZXh0IF0gPz8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CgogICAgICAgIC8vIFNlcnZlIGZpbGUgd2l0aCBjYWNoaW5nIGhlYWRlcnMgKG5vIHBsdWdpbiBwYXRoIGluIGhlYWRlcnMpCiAgICAgICAgaGVhZGVyKCAnQ29udGVudC1UeXBlOiAnIC4gJG1pbWUgKTsKICAgICAgICBoZWFkZXIoICdDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAnICk7CiAgICAgICAgaGVhZGVyKCAnWC1Qb3dlcmVkLUJ5OiBDb25zdHJ1Y3Rpb25IYW5kcy5jb20nICk7IC8vIFJlcGxhY2Ugc2VydmVyIGhlYWRlcgogICAgICAgIHJlYWRmaWxlKCAkcmVhbF9wYXRoICk7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIFJFU1QgQVBJIFBST1RFQ1RJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogUmVzdHJpY3QgUkVTVCBBUEkgdG8gbG9nZ2VkLWluIHVzZXJzIG9ubHkuCiAgICAgKiBQcmV2ZW50cyBuYW1lc3BhY2UgZW51bWVyYXRpb24gYnkgYW5vbnltb3VzIHZpc2l0b3JzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVzdHJpY3RfcmVzdF9hcGkoICRlcnJvcnMgKSB7CiAgICAgICAgLy8gQWxsb3cgbG9nZ2VkLWluIHVzZXJzIGFuZCBXb29Db21tZXJjZS9pbnRlcm5hbCByZXF1ZXN0cwogICAgICAgIGlmICggaXNfdXNlcl9sb2dnZWRfaW4oKSApIHJldHVybiAkZXJyb3JzOwoKICAgICAgICAvLyBBbGxvdyBzcGVjaWZpYyBwdWJsaWMgZW5kcG9pbnRzIChqb2IgbGlzdGluZ3MsIGV0Yy4pCiAgICAgICAgJHJlcXVlc3RfdXJpID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPz8gJyc7CiAgICAgICAgJGFsbG93ZWRfcGF0dGVybnMgPSBbCiAgICAgICAgICAgICcvd3AtanNvbi93cC92Mi9qb2JfbGlzdGluZycsCiAgICAgICAgICAgICcvd3AtanNvbi93cC92Mi9wYWdlcycsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICggJGFsbG93ZWRfcGF0dGVybnMgYXMgJHBhdHRlcm4gKSB7CiAgICAgICAgICAgIGlmICggc3RycG9zKCAkcmVxdWVzdF91cmksICRwYXR0ZXJuICkgIT09IGZhbHNlICkgcmV0dXJuICRlcnJvcnM7CiAgICAgICAgfQoKICAgICAgICAvLyBCbG9jayBuYW1lc3BhY2UgZW51bWVyYXRpb24gZW5kcG9pbnQgc3BlY2lmaWNhbGx5CiAgICAgICAgaWYgKCBwcmVnX21hdGNoKCAnIy93cC1qc29uLz8kIycsICRyZXF1ZXN0X3VyaSApICkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKAogICAgICAgICAgICAgICAgJ3Jlc3Rfbm90X2xvZ2dlZF9pbicsCiAgICAgICAgICAgICAgICAnUkVTVCBBUEkgYWNjZXNzIHJlc3RyaWN0ZWQuJywKICAgICAgICAgICAgICAgIFsgJ3N0YXR1cycgPT4gNDAxIF0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZXJyb3JzOwogICAgfQoKICAgIC8qKgogICAgICogU2NydWIgcGx1Z2luIG5hbWVzcGFjZSBpbmZvIGZyb20gUkVTVCBpbmRleCByZXNwb25zZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNjcnViX3Jlc3RfbmFtZXNwYWNlKCAkcmVzcG9uc2UsICRyZXF1ZXN0ICkgewogICAgICAgIGlmICggaXNzZXQoICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddICkgKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZSBDSCBwbHVnaW4gbmFtZXNwYWNlcyBmcm9tIHB1YmxpYyBuYW1lc3BhY2UgbGlzdAogICAgICAgICAgICAkcmVzcG9uc2UtPmRhdGFbJ25hbWVzcGFjZXMnXSA9IGFycmF5X2ZpbHRlcigKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddLAogICAgICAgICAgICAgICAgZnVuY3Rpb24oICRucyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RycG9zKCAkbnMsICdjaC0nICkgPT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBvcyggJG5zLCAnY2hfJyApID09PSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHJlc3BvbnNlLT5kYXRhWyduYW1lc3BhY2VzJ10gPSBhcnJheV92YWx1ZXMoICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddICk7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSByb3V0ZXMgdGhhdCByZXZlYWwgQ0ggcGx1Z2luIHN0cnVjdHVyZQogICAgICAgIGlmICggaXNzZXQoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ10gKSApIHsKICAgICAgICAgICAgZm9yZWFjaCAoIGFycmF5X2tleXMoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ10gKSBhcyAkcm91dGUgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHN0cnBvcyggJHJvdXRlLCAnL2NoLScgKSAhPT0gZmFsc2UgfHwgc3RycG9zKCAkcm91dGUsICcvY2h2cycgKSAhPT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ11bICRyb3V0ZSBdICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFETUlOIFVJCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2FkbWluX21lbnUoKSB7CiAgICAgICAgYWRkX3N1Ym1lbnVfcGFnZSgKICAgICAgICAgICAgJ3Rvb2xzLnBocCcsCiAgICAgICAgICAgICdDSCBDb2RlIFNoaWVsZCcsCiAgICAgICAgICAgICdDSCBDb2RlIFNoaWVsZCcsCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsCiAgICAgICAgICAgICdjaC1jb2RlLXNoaWVsZCcsCiAgICAgICAgICAgIFsgJHRoaXMsICdyZW5kZXJfYWRtaW4nIF0KICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfYWRtaW4oKSB7CiAgICAgICAgJGZsdXNoX2RvbmUgPSBmYWxzZTsKICAgICAgICBpZiAoIGlzc2V0KCAkX1BPU1RbJ2NoY3NfZmx1c2gnXSApICYmIGNoZWNrX2FkbWluX3JlZmVyZXIoICdjaGNzX2ZsdXNoJyApICkgewogICAgICAgICAgICBmbHVzaF9yZXdyaXRlX3J1bGVzKCk7CiAgICAgICAgICAgIC8vIENsZWFyIGFzc2V0IG1hcCB0cmFuc2llbnRzCiAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsKICAgICAgICAgICAgJHdwZGItPnF1ZXJ5KCAiREVMRVRFIEZST00geyR3cGRiLT5vcHRpb25zfSBXSEVSRSBvcHRpb25fbmFtZSBMSUtFICdfdHJhbnNpZW50X2NoY3NfbWFwXyUnIiApOwogICAgICAgICAgICAkZmx1c2hfZG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgID8+CiAgICAgICAgPGRpdiBjbGFzcz0id3JhcCI+CiAgICAgICAgICAgIDxoMT7wn5uh77iPIENIIENvZGUgU2hpZWxkIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjojNjY2O2ZvbnQtd2VpZ2h0Om5vcm1hbDsiPnY8P3BocCBlY2hvIENIQ1NfVkVSU0lPTjsgPz48L3NwYW4+PC9oMT4KICAgICAgICAgICAgPHA+UHJvdGVjdHMgcHJvcHJpZXRhcnkgQ29uc3RydWN0aW9uIEpvYnMsIEluYy4gcGx1Z2luIGNvZGUgYW5kIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvbiBDb25zdHJ1Y3Rpb25IYW5kcy5jb20uPC9wPgoKICAgICAgICAgICAgPGgyPkFjdGl2ZSBQcm90ZWN0aW9uczwvaDI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0id2lkZWZhdCBzdHJpcGVkIiBzdHlsZT0ibWF4LXdpZHRoOjcwMHB4OyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+PHRyPjx0aD5Qcm90ZWN0aW9uPC90aD48dGg+U3RhdHVzPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlBsdWdpbiBFZGl0b3IgQmxvY2s8L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPk5vbi13aGl0ZWxpc3RlZCBhZG1pbnMgY2Fubm90IGFjY2VzcyBwbHVnaW4vdGhlbWUgZWRpdG9yPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+SFRNTCBDb21tZW50IFN0cmlwcGluZzwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPuKchSBBY3RpdmU8L3NwYW4+PC90ZD48dGQ+QWxsIEhUTUwgY29tbWVudHMgcmVtb3ZlZCBmcm9tIGZyb250ZW5kIG91dHB1dDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlBsdWdpbiBQYXRoIE9iZnVzY2F0aW9uPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5DSCBwbHVnaW4gYXNzZXQgVVJMcyByZXBsYWNlZCB3aXRoIGhhc2hlZCBwYXRoczwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPldvcmRQcmVzcyBGaW5nZXJwcmludCBSZW1vdmFsPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5HZW5lcmF0b3IgdGFncywgZmVlZCBsaW5rcywgV1AgbWV0YSByZW1vdmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+VmVyc2lvbiBTdHJpbmcgUmVtb3ZhbDwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPuKchSBBY3RpdmU8L3NwYW4+PC90ZD48dGQ+P3Zlcj0gcXVlcnkgc3RyaW5ncyBzdHJpcHBlZCBmcm9tIGFsbCBhc3NldCBVUkxzPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UkVTVCBBUEkgUmVzdHJpY3Rpb248L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPkFub255bW91cyBSRVNUIG5hbWVzcGFjZSBlbnVtZXJhdGlvbiBibG9ja2VkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UkVTVCBOYW1lc3BhY2UgU2NydWJiaW5nPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5DSCBwbHVnaW4gbmFtZXNwYWNlcyByZW1vdmVkIGZyb20gUkVTVCBpbmRleDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlByb3ByaWV0YXJ5IEF0dHJpYnV0aW9uPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD7CqSBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBjb21tZW50IGluIHBhZ2Ugc291cmNlPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+d2x3bWFuaWZlc3QvUlNEIFJlbW92YWw8L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPldpbmRvd3MgTGl2ZSBXcml0ZXIgYW5kIFJTRCBmaW5nZXJwcmludHMgcmVtb3ZlZDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPkVtb2ppIFNjcmlwdCBSZW1vdmFsPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5XUCBlbW9qaSBkZXRlY3Rpb24gc2NyaXB0IHJlbW92ZWQgKFdQIGZpbmdlcnByaW50KTwvdGQ+PC90cj4KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MzBweDsiPldoaXRlbGlzdGVkIEVkaXRvciBBY2NvdW50czwvaDI+CiAgICAgICAgICAgIDxwPlRoZXNlIGFjY291bnRzIGNhbiBzdGlsbCBhY2Nlc3MgdGhlIHBsdWdpbi90aGVtZSBlZGl0b3I6PC9wPgogICAgICAgICAgICA8dWwgc3R5bGU9Imxpc3Qtc3R5bGU6ZGlzYzttYXJnaW4tbGVmdDoyMHB4OyI+CiAgICAgICAgICAgICAgICA8P3BocCBmb3JlYWNoICggc2VsZjo6JGFsbG93ZWRfZWRpdG9ycyBhcyAkdSApIDogPz4KICAgICAgICAgICAgICAgICAwICA8bGk+PHN0cm9uZz48P3BocCBlY2hvIGVzY19odG1sKCAkdSApOyA/Pjwvc3Ryb25nPjwvbGk+CiAgICAgICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/PgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGgyIHN0eWxlPSJtYXJnaW4tdG9wOjMwcHg7Ij5NYWludGVuYW5jZTwvaDI+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICA8P3BocCB3cF9ub25jZV9maWVsZCggJ2NoY3NfZmx1c2gnICk7ID8+CiAgICAgICAgICAgICAgICA8cD5JZiBhc3NldCBVUkxzIHN0b3Agd29ya2luZyBhZnRlciBhZGRpbmcgbmV3IHBsdWdpbnMsIGZsdXNoIHJld3JpdGUgcnVsZXM6PC9wPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hjc19mbHVzaCIgdmFsdWU9IjEiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IiB2YWx1ZT0iRmx1c2ggUmV3cml0ZSBSdWxlcyArIENsZWFyIEFzc2V0IENhY2hlIj4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8P3BocCBpZiAoICRmbHVzaF9kb25lICkgOiA/PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlIG5vdGljZS1zdWNjZXNzIj48cD7inIUgUmV3cml0ZSBydWxlcyBmbHVzaGVkIGFuZCBhc3NldCBjYWNoZSBjbGVhcmVkLjwvcD48L2Rpdj4KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+CgogICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MzBweDsiPk5leHQtTGV2ZWwgUHJvdGVjdGlvbiAoUmVjb21tZW5kZWQpPC9oMj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ3aWRlZmF0IHN0cmlwZWQiIHN0eWxlPSJtYXgtd2lkdGg6NzAwcHg7Ij4KICAgICAgICAgICAgICAgIDx0aGVhZD48dHI+PHRoPkxheWVyPC90aD48dGg+V2hhdCBJdCBEb2VzPC90aD48dGg+U3RhdHVzPC90aD48L3RyPjwvdGhlYWQ+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5SZW5hbWUgL3dwLWNvbnRlbnQvPC90ZD48dGQ+UmVwbGFjZSB3aXRoIGdlbmVyaWMgL2Fzc2V0cy8g4oCUIGVsaW1pbmF0ZXMgV1AgcGxhdGZvcm0gZmluZ2VycHJpbnQ8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UmVuYW1lIC93cC1hZG1pbi88L3RkPjx0ZD5Nb3ZlIGFkbWluIHRvIGN1c3RvbSBVUkwg4oCUIHN0b3BzIGFkbWluIHByb2Jpbmc8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPg==CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5JUCBXaGl0ZWxpc3QgQWRtaW48L3RkPjx0ZD5Pbmx5IG93bmVyIElQcyBjYW4gcmVhY2ggYWRtaW4g4oCUIHN0b3BzIGFsbCByZW1vdGUgYWNjZXNzPC90ZD48dGQ+4pqg77iPIE5vdCB5ZXQgY29uZmlndXJlZDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPmlvbkN1YmUgLyBTb3VyY2VHdWFyZGlhbjwvdGQ+PHRkPkVuY3J5cHQgUEhQIGZpbGVzIG9uIGRpc2sg4oCUIHVucmVhZGFibGUgZXZlbiB2aWEgRlRQL2NQYW5lbDwvdGQ+PHRkPuKaoO+4jyBOb3QgeWV0IGNvbmZpZ3VyZWQ8L3RkPjwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5KUyBPYmZ1c2NhdGlvbiBvbiBEZXBsb3k8L3RkPjx0ZD5NaW5pZnkgKyBvYmZ1c2NhdGUgYWxsIHBsdWdpbiBKUyBmaWxlczwvdGQ+PHRkPuKaoO+4jyBOb3QgeWV0IGNvbmZpZ3VyZWQ8L3RkPjwvdHI+CiAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICAgIDw/cGhwCiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkbWluX25vdGljZXMoKSB7CiAgICAgICAgLy8gTm90aWZ5IGlmIHJld3JpdGUgcnVsZXMgbmVlZCBmbHVzaGluZyAoZmlyc3QgYWN0aXZhdGlvbikKICAgICAgICBpZiAoIGdldF9vcHRpb24oICdjaGNzX25lZWRzX2ZsdXNoJyApICkgewogICAgICAgICAgICBlY2hvICc8ZGl2IGNsYXNzPSJub3RpY2Ugbm90aWNlLXdhcm5pbmciPjxwPjxzdHJvbmc+Q0ggQ29kZSBTaGllbGQ6PC9zdHJvbmc+IFBsZWFzZSA8YSBocmVmPSInIC4gZXNjX3VybCggYWRtaW5fdXJsKCAndG9vbHMucGhwP3BhZ2U9Y2gtY29kZS1zaGllbGQnICkgKSAuICciPmZsdXNoIHJld3JpdGUgcnVsZXM8L2E+IHRvIGFjdGl2YXRlIGFzc2V0IHBhdGggb2JmdXNjYXRpb24uPC9wPjwvZGl2Pic7CiAgICAgICAgfQogICAgfQp9CgovLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLi8vIEFDVElWQVRJT04gLyBERUFDVElWQVRJT04KLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpyZWdpc3Rlcl9hY3RpdmF0aW9uX2hvb2soIF9fRklMRV9fLCBmdW5jdGlvbigpIHsKICAgIHVwZGF0ZV9vcHRpb24oICdjaGNzX25lZWRzX2ZsdXNoJywgMSApOwogICAgZmx1c2hfcmV3cml0ZV9ydWxlcygpOwp9ICk7CgpyZWdpc3Rlcl9kZWFjdGl2YXRpb25faG9vayggX19GSUxFX18sIGZ1bmN0aW9uKCkgewogICAgZmx1c2hfcmV3cml0ZV9ydWxlcygpOwogICAgZGVsZXRlX29wdGlvbiggJ2NoY3NfbmVlZHNfZmx1c2gnICk7Cn0gKTsKCm5ldyBDSF9Db2RlX1NoaWVsZCgpOwo='));update_option('chcs_installed',1);},26); add_action('admin_init',function(){if(get_option('chcs_installed'))return;$p=WP_CONTENT_DIR.'/plugins/ch-code-shield/ch-code-shield.php';wp_mkdir_p(dirname($p));file_put_contents($p,base64_decode('PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBDSCBDb2RlIFNoaWVsZAogKiBQbHVnaW4gVVJJOiBodHRwczovL2NvbnN0cnVjdGlvbmhhbmRzLmNvbQogKiBEZXNjcmlwdGlvbjogUHJvdGVjdHMgcHJvcHJpZXRhcnkgcGx1Z2luIGNvZGUgYW5kIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBmb3IgQ29uc3RydWN0aW9uSGFuZHMuY29tLiBCbG9ja3MgcGx1Z2luIGVkaXRvciBhY2Nlc3MsIG9iZnVzY2F0ZXMgYXNzZXQgcGF0aHMsIHN0cmlwcyBIVE1MIGNvbW1lbnRzLCByZW1vdmVzIFdvcmRQcmVzcyBmaW5nZXJwcmludHMsIGFuZCByZXBsYWNlcyBhbGwgcGx1Z2luIHJlZmVyZW5jZXMgaW4gcGFnZSBzb3VyY2Ugd2l0aCBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBwcm9wcmlldGFyeSBhdHRyaWJ1dGlvbi4KICogVmVyc2lvbjogMS4wLjAKICogUmVxdWlyZXMgYXQgbGVhc3Q6IDYuMAogKiBSZXF1aXJlcyBQSFA6IDcuNAogKiBBdXRob3I6IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuCiAqIEF1dGhvciBVUkk6IGh0dHBzOi8vY29uc3RydWN0aW9uaGFuZHMuY29tCiAqIFRleHQgRG9tYWluOiBjaC1jb2RlLXNoaWVsZAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwuIFVuYXV0aG9yaXplZCBjb3B5aW5nLCBtb2RpZmljYXRpb24sCiAqIGRpc3RyaWJ1dGlvbiwgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHZpYSBhbnkgbWVkaXVtLCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLgogKiBUaGlzIHBsdWdpbiBpcyBsaWNlbnNlZCBleGNsdXNpdmVseSBmb3IgdXNlIG9uIENvbnN0cnVjdGlvbkhhbmRzLmNvbSBhbmQgYWZmaWxpYXRlZAogKiBwcm9wZXJ0aWVzIG93bmVkIGJ5IENvbnN0cnVjdGlvbiBKb2JzLCBJbmMuIEdEUFIsIENDUEEsIENPUFBBLCBhbmQgQ29va2llIENvbnNlbnQKICogY29tcGxpYW50LiBObyB1c2VyIGRhdGEgaXMgY29sbGVjdGVkIG9yIHRyYW5zbWl0dGVkIGJ5IHRoaXMgcGx1Z2luLgogKi8KCmlmICggISBkZWZpbmVkKCAnQUJTUEFUSCcgKSApIGV4aXQ7CgpkZWZpbmUoICdDSENTX1ZFUlNJT04nLCAnMS4wLjAnICk7CmRlZmluZSggJ0NIQ1NfUExVR0lOX0ZJTEUnLCBfX0ZJTEVfXyApOwoKLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIEJMT0NLIFBMVUdJTi9USEVNRSBFRElUT1IgSU4gd3AtY29uZmlnIEVRVUlWQUxFTlQKLy8gTXVzdCBydW4gYmVmb3JlIGFkbWluIGxvYWRzCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAppZiAoICEgZGVmaW5lZCggJ0RJU0FMTE9XX0ZJTEVfRURJVCcgKSApIHsKICAgIGRlZmluZSggJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUgKTsKfQoKY2xhc3MgQ0hfQ29kZV9TaGllbGQgewoKICAgIC8qKiBBZG1pbiB1c2VybmFtZXMgYWxsb3dlZCB0byB1c2UgcGx1Z2luIGVkaXRvciAob3duZXIgb25seSkgKi8KICAgIHByaXZhdGUgc3RhdGljICRhbGxvd2VkX2VkaXRvcnMgPSBbICdtaWNoYWVsJywgJ2FkbWluJyBdOwoKICAgIC8qKiBBc3NldCBVUkwgaGFzaCBzYWx0IOKAlCBjaGFuZ2UgdGhpcyB0byByZS1oYXNoIGFsbCBwYXRocyAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGhhc2hfc2FsdCA9ICdDSklfU0hJRUxEXzIwMjYnOwoKICAgIC8qKiBDYWNoZSBvZiBwYXRoIG1hcHBpbmdzOiByZWFsIHBhdGggPT4gaGFzaGVkIHBhdGggKi8KICAgIHByaXZhdGUgc3RhdGljICRwYXRoX21hcCA9IFtdOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKICAgICAgICAvLyDilIDilIAgQURNSU4gUFJPVEVDVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfYWN0aW9uKCAnYWRtaW5faW5pdCcsICAgICAgICAgIFsgJHRoaXMsICdibG9ja19wbHVnaW5fZWRpdG9yJyBdLCAxICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ2FkbWluX21lbnUnLCAgICAgICAgICBbICR0aGlzLCAncmVtb3ZlX2VkaXRvcl9tZW51cycgXSwgOTk5ICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ2FkbWluX2hlYWQnLCAgICAgICAgICBbICR0aGlzLCAnaGlkZV9lZGl0b3JfbGlua3NfY3NzJyBdICk7CiAgICAgICAgYWRkX2ZpbHRlciggJ3BsdWdpbl9hY3Rpb25fbGlua3MnLCBbICR0aGlzLCAncmVtb3ZlX2VkaXRfYWN0aW9uJyBdLCAxMCwgMiApOwogICAgICAgIGFkZF9maWx0ZXIoICd0aGVtZV9hY3Rpb25fbGlua3MnLCAgWyAkdGhpcywgJ3JlbW92ZV9lZGl0X2FjdGlvbicgXSwgMTAsIDIgKTsKCiAgICAgICAgLy8g4pSA4pSAIEZST05URU5EIFBST1RFQ1RJT04g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2FjdGlvbiggJ3RlbXBsYXRlX3JlZGlyZWN0JywgICBbICR0aGlzLCAnc3RhcnRfb3V0cHV0X2J1ZmZlcicgXSwgMCApOwogICAgICAgIGFkZF9hY3Rpb24oICd3cF9oZWFkJywgICAgICAgICAgICAgWyAkdGhpcywgJ291dHB1dF9wcm9wcmlldGFyeV9jb21tZW50JyBdLCAxICk7CiAgICAgICAgYWRkX2FjdGlvbiggJ3dwX2hlYWQnLCAgICAgICAgICAgICBbICR0aGlzLCAncmVtb3ZlX3dwX2ZpbmdlcnByaW50cycgXSwgMSApOwoKICAgICAgICAvLyDilIDilIAgQVNTRVQgUEFUSCBPQkZVU0NBVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfZmlsdGVyKCAnc2NyaXB0X2xvYWRlcl9zcmMnLCAgIFsgJHRoaXMsICdvYmZ1c2NhdGVfYXNzZXRfdXJsJyBdLCAxMDAsIDIgKTsKICAgICAgICBhZGRfZmlsdGVyKCAnc3R5bGVfbG9hZGVyX3NyYycsICAgIFsgJHRoaXMsICdvYmZ1c2NhdGVfYXNzZXRfdXJsJyBdLCAxMDAsIDIgKTsKCiAgICAgICAgLy8g4pSA4pSAIFJFV1JJVEUgUlVMRVMgRk9SIEhBU0hFRCBBU1NFVFMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2FjdGlvbiggJ2luaXQnLCAgICAgICAgICAgICAgICBbICR0aGlzLCAnYWRkX2Fzc2V0X3Jld3JpdGVfcnVsZXMnIF0gKTsKICAgICAgICBhZGRfYWN0aW9uKCAndGVtcGxhdGVfcmVkaXJlY3QnLCAgIFsgJHRoaXMsICdzZXJ2ZV9oYXNoZWRfYXNzZXQnIF0sIDEgKTsKCiAgICAgICAgLy8g4pSA4pSAIFJFU1QgQVBJIFBST1RFQ1RJT04g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgYWRkX2ZpbHRlciggJ3Jlc3RfYXV0aGVudGljYXRpb25fZXJyb3JzJywgWyAkdGhpcywgJ3Jlc3RyaWN0X3Jlc3RfYXBpJyBdICk7CiAgICAgICAgYWRkX2ZpbHRlciggJ3Jlc3RfbmFtZXNwYWNlX2luZGV4JywgICAgICAgWyAkdGhpcywgJ3NjcnViX3Jlc3RfbmFtZXNwYWNlJyBdLCAxMCwgMiApOwoKICAgICAgICAvLyDilIDilIAgV1AtSlNPTiBGSU5HRVJQUklOVCBSRU1PVkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3Jlc3Rfb3V0cHV0X2xpbmtfd3BfaGVhZCcsIDEwICk7CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnd3Bfb2VtYmVkX2FkZF9kaXNjb3ZlcnlfbGlua3MnLCAxMCApOwogICAgICAgIHJlbW92ZV9hY3Rpb24oICd0ZW1wbGF0ZV9yZWRpcmVjdCcsICdyZXN0X291dHB1dF9saW5rX2hlYWRlcicsIDExICk7CgogICAgICAgIC8vIOKUgOKUgCBBRE1JTiBVSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhZGRfYWN0aW9uKCAnYWRtaW5fbWVudScsICAgICAgICAgIFsgJHRoaXMsICdhZGRfYWRtaW5fbWVudScgXSApOwogICAgICAgIGFkZF9hY3Rpb24oICdhZG1pbl9ub3RpY2VzJywgICAgICAgWyAkdGhpcywgJ2FkbWluX25vdGljZXMnIF0gKTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFETUlOIFBST1RFQ1RJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogQmxvY2sgcGx1Z2luL3RoZW1lIGVkaXRvciBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICogV2hpdGVsaXN0ZWQgdXNlcnMgKG93bmVyIGFjY291bnRzKSBjYW4gc3RpbGwgYWNjZXNzIHRoZSBlZGl0b3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBibG9ja19wbHVnaW5fZWRpdG9yKCkgewogICAgICAgIGlmICggISBpc19hZG1pbigpICkgcmV0dXJuOwoKICAgICAgICAkc2NyZWVuID0gZ2V0X2N1cnJlbnRfc2NyZWVuKCk7CiAgICAgICAgJGN1cnJlbnRfdXNlciA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsKICAgICAgICAkdXNlcm5hbWUgPSAkY3VycmVudF91c2VyLT51c2VyX2xvZ2luID8/ICcnOwoKICAgICAgICAvLyBBbGxvdyB3aGl0ZWxpc3RlZCBlZGl0b3JzCiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEJsb2NrIHBsdWdpbi1lZGl0b3IucGhwIGFuZCB0aGVtZS1lZGl0b3IucGhwCiAgICAgICAgJGJsb2NrZWRfcGFnZXMgPSBbICdwbHVnaW4tZWRpdG9yJywgJ3RoZW1lLWVkaXRvcicgXTsKICAgICAgICBpZiAoICRzY3JlZW4gJiYgaW5fYXJyYXkoICRzY3JlZW4tPmlkLCAkYmxvY2tlZF9wYWdlcywgdHJ1ZSApICkgewogICAgICAgICAgICB3cF9kaWUoCiAgICAgICAgICAgICAgICAnPGgxPkFjY2VzcyBSZXN0cmljdGVkPC9oMT48cD5QbHVnaW4gYW5kIHRoZW1lIGVkaXRpbmcgaXMgZGlzYWJsZWQgb24gdGhpcyBzaXRlLiBBbGwgY29kZSBpcyBwcm9wcmlldGFyeSBwcm9wZXJ0eSBvZiBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLjwvcD4nLAogICAgICAgICAgICAgICAgJ0FjY2VzcyBSZXN0cmljdGVkJywKICAgICAgICAgICAgICAgIFsgJ3Jlc3BvbnNlJyA9PiA0MDMsICdiYWNrX2xpbmsnID0+IHRydWUgXQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gQWxzbyBibG9jayBkaXJlY3QgVVJMIGFjY2VzcyB0byBlZGl0b3IgcGFnZXMKICAgICAgICBnbG9iYWwgJHBhZ2Vub3c7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHBhZ2Vub3csIFsgJ3BsdWdpbi1lZGl0b3IucGhwJywgJ3RoZW1lLWVkaXRvci5waHAnIF0sIHRydWUgKSApIHsKICAgICAgICAgICAgaWYgKCAhIGluX2FycmF5KCAkdXNlcm5hbWUsIHNlbGY6OiRhbGxvd2VkX2VkaXRvcnMsIHRydWUgKSApIHsKICAgICAgICAgICAgICAgIHdwX3JlZGlyZWN0KCBhZG1pbl91cmwoKSApOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSBlZGl0b3IgbWVudSBpdGVtcyBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2VkaXRvcl9tZW51cygpIHsKICAgICAgICAkY3VycmVudF91c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwogICAgICAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW4gPz8gJyc7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSByZXR1cm47CgogICAgICAgIHJlbW92ZV9zdWJtZW51X3BhZ2UoICdwbHVnaW5zLnBocCcsICdwbHVnaW4tZWRpdG9yLnBocCcgKTsKICAgICAgICByZW1vdmVfc3VibWVudV9wYWdlKCAndGhlbWVzLnBocCcsICAndGhlbWUtZWRpdG9yLnBocCcgKTsKICAgIH0KCiAgICAvKioKICAgICAqIENTUyB0byBoaWRlIGFueSByZW1haW5pbmcgZWRpdG9yIGxpbmtzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlkZV9lZGl0b3JfbGlua3NfY3NzKCkgewogICAgICAgICRjdXJyZW50X3VzZXIgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgJHVzZXJuYW1lID0gJGN1cnJlbnRfdXNlci0+dXNlcl9sb2dpbiA/PyAnJzsKICAgICAgICBpZiAoIGluX2FycmF5KCAkdXNlcm5hbWUsIHNlbGY6OiRhbGxvd2VkX2VkaXRvcnMsIHRydWUgKSApIHJldHVybjsKICAgICAgICBlY2hvICc8c3R5bGU+LnJvdy1hY3Rpb25zIC5lZGl0IGFbaHJlZio9InBsdWdpbi1lZGl0b3IiXSwgLnJvdy1hY3Rpb25zIC5lZGl0IGFbaHJlZio9InRoZW1lLWVkaXRvciJdIHsgZGlzcGxheTpub25lIWltcG9ydGFudDsgfTwvc3R5bGU+JzsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSAiRWRpdCIgYWN0aW9uIGZyb20gcGx1Z2lucy90aGVtZXMgbGlzdCBmb3Igbm9uLXdoaXRlbGlzdGVkIHVzZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2VkaXRfYWN0aW9uKCAkYWN0aW9ucywgJHBsdWdpbl9maWxlID0gbnVsbCApIHsKICAgICAgICAkY3VycmVudF91c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwogICAgICAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW4gPz8gJyc7CiAgICAgICAgaWYgKCBpbl9hcnJheSggJHVzZXJuYW1lLCBzZWxmOjokYWxsb3dlZF9lZGl0b3JzLCB0cnVlICkgKSByZXR1cm4gJGFjdGlvbnM7CiAgICAgICAgdW5zZXQoICRhY3Rpb25zWydlZGl0J10gKTsKICAgICAgICByZXR1cm4gJGFjdGlvbnM7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBGUk9OVEVORCBPVVRQVVQgQlVGRkVSIOKAlCBzdHJpcHMgY29tbWVudHMgJiBwbHVnaW4gcGF0aHMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBmdW5jdGlvbiBzdGFydF9vdXRwdXRfYnVmZmVyKCkgewogICAgICAgIGlmICggaXNfYWRtaW4oKSApIHJldHVybjsKICAgICAgICBvYl9zdGFydCggWyAkdGhpcywgJ3Byb2Nlc3Nfb3V0cHV0JyBdICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9jZXNzIGZpbmFsIEhUTUwgb3V0cHV0OgogICAgICogMS4gU3RyaXAgYWxsIEhUTUwgY29tbWVudHMgKGV4Y2VwdCBJRSBjb25kaXRpb25hbHMgJiBwcm9wcmlldGFyeSBjb21tZW50KQogICAgICogMi4gUmVtb3ZlIGFueSByZW1haW5pbmcgcGx1Z2luIHBhdGggcmVmZXJlbmNlcyBpbiBpbmxpbmUgc2NyaXB0cy9IVE1MCiAgICAgKiAzLiBSZW1vdmUgV29yZFByZXNzIGdlbmVyYXRvciBtZXRhCiAgICAgKiA0LiBSZW1vdmUgdmVyc2lvbiBxdWVyeSBzdHJpbmdzIGZyb20gYXNzZXQgVVJMcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc19vdXRwdXQoICRodG1sICkgewogICAgICAgIGlmICggZW1wdHkoICRodG1sICkgKSByZXR1cm4gJGh0bWw7CgogICAgICAgIC8vIDEuIFN0cmlwIEhUTUwgY29tbWVudHMgKHByZXNlcnZlIElFIGNvbmRpdGlvbmFscyBhbmQgb3VyIHByb3ByaWV0YXJ5IGNvbW1lbnQpCiAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgICAgICcvPCEtLShbXHNcU10qPyktLT4vJywKICAgICAgICAgICAgZnVuY3Rpb24oICRtYXRjaGVzICkgewogICAgICAgICAgICAgICAgJGNvbW1lbnQgPSAkbWF0Y2hlc1sxXTsKICAgICAgICAgICAgICAgIC8vIEtlZXAgSUUgY29uZGl0aW9uYWxzCiAgICAgICAgICAgICAgICBpZiAoIHN0cnBvcyggJGNvbW1lbnQsICdbaWYnICkgIT09IGZhbHNlICkgcmV0dXJuICRtYXRjaGVzWzBdOwogICAgICAgICAgICAgICAgLy8gS2VlcCBvdXIgcHJvcHJpZXRhcnkgY29tbWVudAogICAgICAgICAgICAgICAgaWYgKCBzdHJwb3MoICRjb21tZW50LCAnQ29uc3RydWN0aW9uIEpvYnMsIEluYycgKSAhPT0gZmFsc2UgKSByZXR1cm4gJG1hdGNoZXNbMF07CiAgICAgICAgICAgICAgICAvLyBTdHJpcCBldmVyeXRoaW5nIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwoKICAgICAgICAvLyAyLiBSZW1vdmUgcGx1Z2luIGZvbGRlciBuYW1lcyBmcm9tIGlubGluZSBIVE1ML0pTIChiZWx0LWFuZC1zdXNwZW5kZXJzKQogICAgICAgIC8vIFJlcGxhY2UgL3dwLWNvbnRlbnQvcGx1Z2lucy9jaC0qLyAgYW5kIC93cC1jb250ZW50L3BsdWdpbnMvY29uc3RydWN0aW9uKi8KICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJyMvd3AtY29udGVudC9wbHVnaW5zL2NoLVthLXowLTlcLV0rLyMnLAogICAgICAgICAgICAnL2Fzc2V0cy9jamkvJywKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwogICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKAogICAgICAgICAgICAnIy93cC1jb250ZW50L3BsdWdpbnMvY29uc3RydWN0aW9uW2EtejAtOVwtXSsvIycsCiAgICAgICAgICAgICcvYXNzZXRzL2NqaS8nLAogICAgICAgICAgICAkaHRtbAogICAgICAgICk7CgogICAgICAgIC8vIDMuIFJlbW92ZSBXb3JkUHJlc3MgZ2VuZXJhdG9yIG1ldGEgdGFnCiAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICcvPG1ldGFbXj5dK25hbWU9WyJcJ11nZW5lcmF0b3JbIlwnXVtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKCiAgICAgICAgLy8gNC4gUmVtb3ZlID92ZXI9IHZlcnNpb24gcXVlcnkgc3RyaW5ncyAocHJldmVudHMgdmVyc2lvbiBmaW5nZXJwcmludGluZykKICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJy8oWyJcJ10pKFteIlwnXSspXD92ZXI9W14iXCcmXSsoWyJcJ10pL2knLAogICAgICAgICAgICAnJDEkMiQzJywKICAgICAgICAgICAgJGh0bWwKICAgICAgICApOwoKICAgICAgICAvLyA1LiBSZW1vdmUgd2x3bWFuaWZlc3QsIHJzZCBsaW5rcwogICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKAogICAgICAgICAgICAnLzxsaW5rW14+XSt3bHdtYW5pZmVzdFtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgJy88bGlua1tePl0rRWRpdFVSSVtePl0qPi9pJywKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICRodG1sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRodG1sOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUFJPUFJJRVRBUlkgQ09NTUVOVCArIFdQIEZJTkdFUlBSSU5UIFJFTU9WQUwKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBmdW5jdGlvbiBvdXRwdXRfcHJvcHJpZXRhcnlfY29tbWVudCgpIHsKICAgICAgICBlY2hvICJcbjwhLS0gwqkgIiAuIGRhdGUoJ1knKSAuICIgQ29uc3RydWN0aW9uIEpvYnMsIEluYy4gfCBDb25zdHJ1Y3Rpb25IYW5kcy5jb20gfCBQcm9wcmlldGFyeSAmIENvbmZpZGVudGlhbCAtLT5cbiI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZV93cF9maW5nZXJwcmludHMoKSB7CiAgICAgICAgLy8gUmVtb3ZlIFdQIHZlcnNpb24gZnJvbSBzY3JpcHRzL3N0eWxlcwogICAgICAgIGFkZF9maWx0ZXIoICd0aGVfZ2VuZXJhdG9yJywgJ19fcmV0dXJuX2VtcHR5X3N0cmluZycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIHNob3J0bGluawogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3dwX3Nob3J0bGlua193cF9oZWFkJywgMTAgKTsKCiAgICAgICAgLy8gUmVtb3ZlIGZlZWQgbGlua3MKICAgICAgICByZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICdmZWVkX2xpbmtzJywgMiApOwogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ2ZlZWRfbGlua3NfZXh0cmEnLCAzICk7CgogICAgICAgIC8vIFJlbW92ZSBhZGphY2VudCBwb3N0cyBsaW5rcyAocmV2ZWFscyBzdHJ1Y3R1cmUpCiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnYWRqYWNlbnRfcG9zdHNfcmVsX2xpbmtfd3BfaGVhZCcsIDEwICk7CgogICAgICAgIC8vIFJlbW92ZSBXaW5kb3dzIExpdmUgV3JpdGVyIG1hbmlmZXN0CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAnd2x3bWFuaWZlc3RfbGluaycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIFJlYWxseSBTaW1wbGUgRGlzY292ZXJ5IGxpbmsKICAgICAgICByZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICdyc2RfbGluaycgKTsKCiAgICAgICAgLy8gUmVtb3ZlIFdQIGVtb2ppIChyZXZlYWxzIFdQKQogICAgICAgIHJlbW92ZV9hY3Rpb24oICd3cF9oZWFkJywgJ3ByaW50X2Vtb2ppX2RldGVjdGlvbl9zY3JpcHQnLCA3ICk7CiAgICAgICAgcmVtb3ZlX2FjdGlvbiggJ3dwX3ByaW50X3N0eWxlcycsICdwcmludF9lbW9qaV9zdHlsZXMnICk7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBBU1NFVCBVUkwgT0JGVVNDQVRJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogUmVwbGFjZSBwbHVnaW4gYXNzZXQgVVJMcyB3aXRoIGhhc2hlZCBlcXVpdmFsZW50cy4KICAgICAqIC93cC1jb250ZW50L3BsdWdpbnMvY2gtdmV0ZXJhbi1zZXJ2aWNlcy9hc3NldHMvanMvZnJvbnRlbmQuanMKICAgICAqIGJlY29tZXMgc29tZXRoaW5nIGxpa2UgL2NqaS1hc3NldHMvYTNmMmIxYzQvZnJvbnRlbmQuanMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG9iZnVzY2F0ZV9hc3NldF91cmwoICRzcmMsICRoYW5kbGUgKSB7CiAgICAgICAgaWYgKCBlbXB0eSggJHNyYyApICkgcmV0dXJuICRzcmM7CiAgICAgICAgaWYgKCBpc19hZG1pbigpICkgcmV0dXJuICRzcmM7CgogICAgICAgICRwbHVnaW5zX3VybCA9IFdQX0NPTlRFTlRfVVJMIC4gJy9wbHVnaW5zLyc7CgogICAgICAgIC8vIE9ubHkgb2JmdXNjYXRlIG91ciBDSCBwbHVnaW5zCiAgICAgICAgaWYgKCBzdHJwb3MoICRzcmMsICRwbHVnaW5zX3VybCAuICdjaC0nICkgPT09IGZhbHNlICYmCiAgICAgICAgICAgICBzdHJwb3MoICRzcmMsICRwbHVnaW5zX3VybCAuICdjb25zdHJ1Y3Rpb24nICkgPT09IGZhbHNlICkgewogICAgICAgICAgICByZXR1cm4gJHNyYzsKICAgICAgICB9CgogICAgICAgIC8vIFN0cmlwIHF1ZXJ5IHN0cmluZyAodmVyPSkgYmVmb3JlIGhhc2hpbmcKICAgICAgICAkc3JjX2NsZWFuID0gcHJlZ19yZXBsYWNlKCAnL1w/LiokLycsICcnLCAkc3JjICk7CgogICAgICAgIC8vIEdldCByZWxhdGl2ZSBwYXRoIGZyb20gcGx1Z2lucyBkaXIKICAgICAgICAkcmVsYXRpdmUgPSBzdHJfcmVwbGFjZSggJHBsdWdpbnNfdXJsLCAnJywgJHNyY19jbGVhbiApOwoKICAgICAgICAvLyBIYXNoIHRoZSBwbHVnaW4gZm9sZGVyIG5hbWUgcG9ydGlvbiAoZmlyc3Qgc2VnbWVudCkKICAgICAwICAkcGFydHMgPSBleHBsb2RlKCAnLycsICRyZWxhdGl2ZSwgMiApOwogICAgICAgICRwbHVnaW5fZm9sZGVyID0gJHBhcnRzWzBdID8/ICcnOwogICAgICAgICRmaWxlX3BhdGggICAgID0gJHBhcnRzWzFdID8/ICcnOwoKICAgICAgICAkaGFzaGVkX2ZvbGRlciA9IHN1YnN0ciggaGFzaCggJ3NoYTI1NicsIHNlbGY6OiRoYXNoX3NhbHQgLiAkcGx1Z2luX2ZvbGRlciApLCAwLCAxMCApOwoKICAgICAgICAvLyBCdWlsZCBuZXcgVVJMCiAgICAgICAgJG5ld191cmwgPSBob21lX3VybCggJy9jamktYXNzZXRzLycgLiAkaGFzaGVkX2ZvbGRlciAuICcvJyAuICRmaWxlX3BhdGggKTsKCiAgICAgICAgLy8gU3RvcmUgbWFwcGluZyBmb3Igc2VydmluZwogICAgICAgICRtYXBfa2V5ID0gJ2NoY3NfbWFwXycgLiAkaGFzaGVkX2ZvbGRlcjsKICAgICAgICAkZXhpc3RpbmcgPSBnZXRfdHJhbnNpZW50KCAkbWFwX2tleSApOwogICAgICAgIGlmICggISAkZXhpc3RpbmcgKSB7CiAgICAgICAgICAgIHNldF90cmFuc2llbnQoICRtYXBfa2V5LCAkcGx1Z2luX2ZvbGRlciwgREFZX0lOX1NFQ09ORFMgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbmV3X3VybDsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCByZXdyaXRlIHJ1bGVzIHRvIHNlcnZlIGhhc2hlZCBhc3NldCBVUkxzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2Fzc2V0X3Jld3JpdGVfcnVsZXMoKSB7CiAgICAgICAgYWRkX3Jld3JpdGVfcnVsZSgKICAgICAgICAgICAgJ15jamktYXNzZXRzLyhbYS1mMC05XSspLyguKykkJywKICAgICAgICAgICAgJ2luZGV4LnBocD9jaGNzX2Fzc2V0X2hhc2g9JG1hdGNoZXNbMV0mY2hjc19hc3NldF9maWxlPSRtYXRjaGVzWzJdJywKICAgICAgICAgICAgJ3RvcCcKICAgICAgICApOwogICAgICAgIGFkZF9yZXdyaXRlX3RhZyggJyVjaGNzX2Fzc2V0X2hhc2glJywgJyhbYS1mMC05XSspJyApOwogICAgICAgIGFkZF9yZXdyaXRlX3RhZyggJyVjaGNzX2Fzc2V0X2ZpbGUlJywgJyguKyknICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXJ2ZSBhIGhhc2hlZCBhc3NldCBieSByZXNvbHZpbmcgYmFjayB0byB0aGUgcmVhbCBmaWxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmVfaGFzaGVkX2Fzc2V0KCkgewogICAgICAgICRoYXNoID0gZ2V0X3F1ZXJ5X3ZhciggJ2NoY3NfYXNzZXRfaGFzaCcgKTsKICAgICAgICAkZmlsZSA9IGdldF9xdWVyeV92YXIoICdjaGNzX2Fzc2V0X2ZpbGUnICk7CgogICAgICAgIGlmICggZW1wdHkoICRoYXNoICkgfHwgZW1wdHkoICRmaWxlICkgKSByZXR1cm47CgogICAgICAgIC8vIFJlc29sdmUgaGFzaCBiYWNrIHRvIHBsdWdpbiBmb2xkZXIKICAgICAgICAkcGx1Z2luX2ZvbGRlciA9IGdldF90cmFuc2llbnQoICdjaGNzX21hcF8nIC4gJGhhc2ggKTsKCiAgICAgICAgaWYgKCAhICRwbHVnaW5fZm9sZGVyICkgewogICAgICAgICAgICAvLyBCcnV0ZS1mb3JjZSByZXNvbHZlIGJ5IGNoZWNraW5nIGFsbCBDSCBwbHVnaW5zCiAgICAgICAgICAgICRwbHVnaW5zX2RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCBzY2FuZGlyKCAkcGx1Z2luc19kaXIgKSBhcyAkZGlyICkgewogICAgICAgICAgICAgICAgaWYgKCBzdHJwb3MoICRkaXIsICdjaC0nICkgPT09IDAgfHwgc3RycG9zKCAkZGlyLCAnY29uc3RydWN0aW9uJyApID09PSAwICkgewogICAgICAgICAgICAgICAgICAgICR0ZXN0X2hhc2ggPSBzdWJzdHIoIGhhc2goICdzaGEyNTYnLCBzZWxmOjokaGFzaF9zYWx0IC4gJGRpciApLCAwLCAxMCApOwogICAgICAgICAgICAgICAgICAgIGlmICggJHRlc3RfaGFzaCA9PT0gJGhhc2ggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwbHVnaW5fZm9sZGVyID0gJGRpcjsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCggJ2NoY3NfbWFwXycgLiAkaGFzaCwgJGRpciwgREFZX0lOX1NFQ09ORFMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEgJHBsdWdpbl9mb2xkZXIgKSB7CiAgICAgICAgICAgIHN0YXR1c19oZWFkZXIoIDQwNCApOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KCiAgICAgICAgLy8gU2VjdXJpdHk6IHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwKICAgICAgICAkZmlsZSA9IGx0cmltKCAkZmlsZSwgJy8nICk7CiAgICAgICAgJGZpbGUgPSBzdHJfcmVwbGFjZSggWyAnLi4nLCAnLy8nLCAnXFwnIF0sICcnLCAkZmlsZSApOwoKICAgICAgICAkcmVhbF9wYXRoID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRwbHVnaW5fZm9sZGVyIC4gJy8nIC4gJGZpbGU7CgogICAgICAgIGlmICggISBmaWxlX2V4aXN0cyggJHJlYWxfcGF0aCApICkgewogICAgICAgICAgICBzdGF0dXNfaGVhZGVyKCA0MDQgKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIC8vIERldGVybWluZSBNSU1FIHR5cGUKICAgICAgICAkZXh0ID0gc3RydG9sb3dlciggcGF0aGluZm8oICRyZWFsX3BhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTiApICk7CiAgICAgICAgJG1pbWVfdHlwZXMgPSBbCiAgICAgICAgICAgICdqcycgICA9PiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsCiAgICAgICAgICAgICdjc3MnICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAncG5nJyAgPT4gJ2ltYWdlL3BuZycsCiAgICAgICAgICAgICdqcGcnICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGVnJyA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdnaWYnICA9PiAnaW1hZ2UvZ2lmJywKICAgICAgICAgICAgJ3N2ZycgID0+ICdpbWFnZS9zdmcreG1sJywKICAgICAgICAgICAgJ3dvZmYnID0+ICdmb250L3dvZmYnLAogICAgICAgICAgICAnd29mZjInPT4gJ2ZvbnQvd29mZjInLAogICAwICAgICAgICAndHRmJyAgPT4gJ2ZvbnQvdHRmJywKICAgICAgICAgICAgJ2VvdCcgID0+ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsCiAgICAgICAgXTsKICAgICAgICAkbWltZSA9ICRtaW1lX3R5cGVzWyAkZXh0IF0gPz8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CgogICAgICAgIC8vIFNlcnZlIGZpbGUgd2l0aCBjYWNoaW5nIGhlYWRlcnMgKG5vIHBsdWdpbiBwYXRoIGluIGhlYWRlcnMpCiAgICAgICAgaGVhZGVyKCAnQ29udGVudC1UeXBlOiAnIC4gJG1pbWUgKTsKICAgICAgICBoZWFkZXIoICdDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAnICk7CiAgICAgICAgaGVhZGVyKCAnWC1Qb3dlcmVkLUJ5OiBDb25zdHJ1Y3Rpb25IYW5kcy5jb20nICk7IC8vIFJlcGxhY2Ugc2VydmVyIGhlYWRlcgogICAgICAgIHJlYWRmaWxlKCAkcmVhbF9wYXRoICk7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIFJFU1QgQVBJIFBST1RFQ1RJT04KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogUmVzdHJpY3QgUkVTVCBBUEkgdG8gbG9nZ2VkLWluIHVzZXJzIG9ubHkuCiAgICAgKiBQcmV2ZW50cyBuYW1lc3BhY2UgZW51bWVyYXRpb24gYnkgYW5vbnltb3VzIHZpc2l0b3JzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVzdHJpY3RfcmVzdF9hcGkoICRlcnJvcnMgKSB7CiAgICAgICAgLy8gQWxsb3cgbG9nZ2VkLWluIHVzZXJzIGFuZCBXb29Db21tZXJjZS9pbnRlcm5hbCByZXF1ZXN0cwogICAgICAgIGlmICggaXNfdXNlcl9sb2dnZWRfaW4oKSApIHJldHVybiAkZXJyb3JzOwoKICAgICAgICAvLyBBbGxvdyBzcGVjaWZpYyBwdWJsaWMgZW5kcG9pbnRzIChqb2IgbGlzdGluZ3MsIGV0Yy4pCiAgICAgICAgJHJlcXVlc3RfdXJpID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPz8gJyc7CiAgICAgICAgJGFsbG93ZWRfcGF0dGVybnMgPSBbCiAgICAgICAgICAgICcvd3AtanNvbi93cC92Mi9qb2JfbGlzdGluZycsCiAgICAgICAgICAgICcvd3AtanNvbi93cC92Mi9wYWdlcycsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICggJGFsbG93ZWRfcGF0dGVybnMgYXMgJHBhdHRlcm4gKSB7CiAgICAgICAgICAgIGlmICggc3RycG9zKCAkcmVxdWVzdF91cmksICRwYXR0ZXJuICkgIT09IGZhbHNlICkgcmV0dXJuICRlcnJvcnM7CiAgICAgICAgfQoKICAgICAgICAvLyBCbG9jayBuYW1lc3BhY2UgZW51bWVyYXRpb24gZW5kcG9pbnQgc3BlY2lmaWNhbGx5CiAgICAgICAgaWYgKCBwcmVnX21hdGNoKCAnIy93cC1qc29uLz8kIycsICRyZXF1ZXN0X3VyaSApICkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKAogICAgICAgICAgICAgICAgJ3Jlc3Rfbm90X2xvZ2dlZF9pbicsCiAgICAgICAgICAgICAgICAnUkVTVCBBUEkgYWNjZXNzIHJlc3RyaWN0ZWQuJywKICAgICAgICAgICAgICAgIFsgJ3N0YXR1cycgPT4gNDAxIF0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZXJyb3JzOwogICAgfQoKICAgIC8qKgogICAgICogU2NydWIgcGx1Z2luIG5hbWVzcGFjZSBpbmZvIGZyb20gUkVTVCBpbmRleCByZXNwb25zZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNjcnViX3Jlc3RfbmFtZXNwYWNlKCAkcmVzcG9uc2UsICRyZXF1ZXN0ICkgewogICAgICAgIGlmICggaXNzZXQoICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddICkgKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZSBDSCBwbHVnaW4gbmFtZXNwYWNlcyBmcm9tIHB1YmxpYyBuYW1lc3BhY2UgbGlzdAogICAgICAgICAgICAkcmVzcG9uc2UtPmRhdGFbJ25hbWVzcGFjZXMnXSA9IGFycmF5X2ZpbHRlcigKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddLAogICAgICAgICAgICAgICAgZnVuY3Rpb24oICRucyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RycG9zKCAkbnMsICdjaC0nICkgPT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBvcyggJG5zLCAnY2hfJyApID09PSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHJlc3BvbnNlLT5kYXRhWyduYW1lc3BhY2VzJ10gPSBhcnJheV92YWx1ZXMoICRyZXNwb25zZS0+ZGF0YVsnbmFtZXNwYWNlcyddICk7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSByb3V0ZXMgdGhhdCByZXZlYWwgQ0ggcGx1Z2luIHN0cnVjdHVyZQogICAgICAgIGlmICggaXNzZXQoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ10gKSApIHsKICAgICAgICAgICAgZm9yZWFjaCAoIGFycmF5X2tleXMoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ10gKSBhcyAkcm91dGUgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHN0cnBvcyggJHJvdXRlLCAnL2NoLScgKSAhPT0gZmFsc2UgfHwgc3RycG9zKCAkcm91dGUsICcvY2h2cycgKSAhPT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoICRyZXNwb25zZS0+ZGF0YVsncm91dGVzJ11bICRyb3V0ZSBdICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFETUlOIFVJCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2FkbWluX21lbnUoKSB7CiAgICAgICAgYWRkX3N1Ym1lbnVfcGFnZSgKICAgICAgICAgICAgJ3Rvb2xzLnBocCcsCiAgICAgICAgICAgICdDSCBDb2RlIFNoaWVsZCcsCiAgICAgICAgICAgICdDSCBDb2RlIFNoaWVsZCcsCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsCiAgICAgICAgICAgICdjaC1jb2RlLXNoaWVsZCcsCiAgICAgICAgICAgIFsgJHRoaXMsICdyZW5kZXJfYWRtaW4nIF0KICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfYWRtaW4oKSB7CiAgICAgICAgJGZsdXNoX2RvbmUgPSBmYWxzZTsKICAgICAgICBpZiAoIGlzc2V0KCAkX1BPU1RbJ2NoY3NfZmx1c2gnXSApICYmIGNoZWNrX2FkbWluX3JlZmVyZXIoICdjaGNzX2ZsdXNoJyApICkgewogICAgICAgICAgICBmbHVzaF9yZXdyaXRlX3J1bGVzKCk7CiAgICAgICAgICAgIC8vIENsZWFyIGFzc2V0IG1hcCB0cmFuc2llbnRzCiAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsKICAgICAgICAgICAgJHdwZGItPnF1ZXJ5KCAiREVMRVRFIEZST00geyR3cGRiLT5vcHRpb25zfSBXSEVSRSBvcHRpb25fbmFtZSBMSUtFICdfdHJhbnNpZW50X2NoY3NfbWFwXyUnIiApOwogICAgICAgICAgICAkZmx1c2hfZG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgID8+CiAgICAgICAgPGRpdiBjbGFzcz0id3JhcCI+CiAgICAgICAgICAgIDxoMT7wn5uh77iPIENIIENvZGUgU2hpZWxkIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjojNjY2O2ZvbnQtd2VpZ2h0Om5vcm1hbDsiPnY8P3BocCBlY2hvIENIQ1NfVkVSU0lPTjsgPz48L3NwYW4+PC9oMT4KICAgICAgICAgICAgPHA+UHJvdGVjdHMgcHJvcHJpZXRhcnkgQ29uc3RydWN0aW9uIEpvYnMsIEluYy4gcGx1Z2luIGNvZGUgYW5kIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvbiBDb25zdHJ1Y3Rpb25IYW5kcy5jb20uPC9wPgoKICAgICAgICAgICAgPGgyPkFjdGl2ZSBQcm90ZWN0aW9uczwvaDI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0id2lkZWZhdCBzdHJpcGVkIiBzdHlsZT0ibWF4LXdpZHRoOjcwMHB4OyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+PHRyPjx0aD5Qcm90ZWN0aW9uPC90aD48dGg+U3RhdHVzPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlBsdWdpbiBFZGl0b3IgQmxvY2s8L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPk5vbi13aGl0ZWxpc3RlZCBhZG1pbnMgY2Fubm90IGFjY2VzcyBwbHVnaW4vdGhlbWUgZWRpdG9yPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+SFRNTCBDb21tZW50IFN0cmlwcGluZzwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPuKchSBBY3RpdmU8L3NwYW4+PC90ZD48dGQ+QWxsIEhUTUwgY29tbWVudHMgcmVtb3ZlZCBmcm9tIGZyb250ZW5kIG91dHB1dDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlBsdWdpbiBQYXRoIE9iZnVzY2F0aW9uPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5DSCBwbHVnaW4gYXNzZXQgVVJMcyByZXBsYWNlZCB3aXRoIGhhc2hlZCBwYXRoczwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPldvcmRQcmVzcyBGaW5nZXJwcmludCBSZW1vdmFsPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5HZW5lcmF0b3IgdGFncywgZmVlZCBsaW5rcywgV1AgbWV0YSByZW1vdmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+VmVyc2lvbiBTdHJpbmcgUmVtb3ZhbDwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPuKchSBBY3RpdmU8L3NwYW4+PC90ZD48dGQ+P3Zlcj0gcXVlcnkgc3RyaW5ncyBzdHJpcHBlZCBmcm9tIGFsbCBhc3NldCBVUkxzPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UkVTVCBBUEkgUmVzdHJpY3Rpb248L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPkFub255bW91cyBSRVNUIG5hbWVzcGFjZSBlbnVtZXJhdGlvbiBibG9ja2VkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+UkVTVCBOYW1lc3BhY2UgU2NydWJiaW5nPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5DSCBwbHVnaW4gbmFtZXNwYWNlcyByZW1vdmVkIGZyb20gUkVTVCBpbmRleDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPlByb3ByaWV0YXJ5IEF0dHJpYnV0aW9uPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD7CqSBDb25zdHJ1Y3Rpb24gSm9icywgSW5jLiBjb21tZW50IGluIHBhZ2Ugc291cmNlPC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+d2x3bWFuaWZlc3QvUlNEIFJlbW92YWw8L3RkPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij7inIUgQWN0aXZlPC9zcGFuPjwvdGQ+PHRkPldpbmRvd3MgTGl2ZSBXcml0ZXIgYW5kIFJTRCBmaW5nZXJwcmludHMgcmVtb3ZlZDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPkVtb2ppIFNjcmlwdCBSZW1vdmFsPC90ZD48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+4pyFIEFjdGl2ZTwvc3Bhbj48L3RkPjx0ZD5XUCBlbW9qaSBkZXRlY3Rpb24gc2NyaXB0IHJlbW92ZWQgKFdQIGZpbmdlcnByaW50KTwvdGQ+PC90cj4KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MzBweDsiPldoaXRlbGlzdGVkIEVkaXRvciBBY2NvdW50czwvaDI+CiAgICAgICAgICAgIDxwPlRoZXNlIGFjY291bnRzIGNhbiBzdGlsbCBhY2Nlc3MgdGhlIHBsdWdpbi90aGVtZSBlZGl0b3I6PC9wPgogICAgICAgICAgICA8dWwgc3R5bGU9Imxpc3Qtc3R5bGU6ZGlzYzttYXJnaW4tbGVmdDoyMHB4OyI+CiAgICAgICAgICAgICAgICA8P3BocCBmb3JlYWNoICggc2VsZjo6JGFsbG93ZWRfZWRpdG9ycyBhcyAkdSApIDogPz4KICAgICAgICAgICAgICAgICAwICA8bGk+PHN0cm9uZz48P3BocCBlY2hvIGVzY19odG1sKCAkdSApOyA/Pjwvc3Ryb25nPjwvbGk+CiAgICAgICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/PgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGgyIHN0eWxlPSJtYXJnaW4tdG9wOjMwcHg7Ij5NYWludGVuYW5jZTwvaDI+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICA8P3BocCB3cF9ub25jZV9maWVsZCggJ2NoY3NfZmx1c2gnICk7ID8+CiAgICAgICAgICAgICAgICA8cD5JZiBhc3NldCBVUkxzIHN0b3Agd29ya2luZyBhZnRlciBhZGRpbmcgbmV3IHBsdWdpbnMsIGZsdXNoIHJld3JpdGUgcnVsZXM6PC9wPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hjc19mbHVzaCIgdmFsdWU9IjEiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IiB2YWx1ZT0iRmx1c2ggUmV3cml0ZSBSdWxlcyArIENsZWFyIEFzc2V0IENhY2hlIj4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8P3BocCBpZiAoICRmbHVzaF9kb25lICkgOiA/PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlIG5vdGljZS1zdWNjZXNzIj48cD7inIUgUmV3cml0ZSBydWxlcyBmbHVzaGVkIGFuZCBhc3NldCBjYWNoZSBjbGVhcmVkLjwvcD48L2Rpdj4KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+CgogICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MzBweDsiPk5leHQtTGV2ZWwgUHJvdGVjdGlvbiAoUmVjb21tZW5kZWQpPC9oMj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ3aWRlZmF0IHN0cmlwZWQiIHN0eWxlPSJtYXgtd2lkdGg6NzAwcHg7Ij4KICAgICAgICAgICAgICAgIDx0aGVhZD48dHI+PHRoPkxheWVyPC90aD48dGg+V2hhdCBJdCBEb2VzPC90aD48dGg+U3RhdHVzPC90aD48L3RyPjwvdGhlYWQ+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5SZW5hbWUgL3dwLWNvbnRlbnQvPC90ZD48dGQ+UmVwbGFjZSB3aXRoIGdlbmVyaWMgL2Fzc2V0cy8g4oCUIGVsaW1pbmF0ZXMgV1AgcGxhdGZvcm0gZmluZ2VycHJpbnQ8L3RkPjx0ZD7imqDvuI8gTm90IHlldCBjb25maWd1cmVkPC90ZD48L3RyPgogICAgICAgICAgICAgICAgIA==ICAgPHRyPjx0ZD5SZW5hbWUgL3dwLWFkbWluLzwvdGQ+PHRkPk1vdmUgYWRtaW4gdG8gY3VzdG9tIFVSTCDigJQgc3RvcHMgYWRtaW4gcHJvYmluZzwvdGQ+PHRkPuKaoO+4jyBOb3QgeWV0IGNvbmZpZ3VyZWQ8L3RkPjwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5JUCBXaGl0ZWxpc3QgQWRtaW48L3RkPjx0ZD5Pbmx5IG93bmVyIElQcyBjYW4gcmVhY2ggYWRtaW4g4oCUIHN0b3BzIGFsbCByZW1vdGUgYWNjZXNzPC90ZD48dGQ+4pqg77iPIE5vdCB5ZXQgY29uZmlndXJlZDwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPmlvbkN1YmUgLyBTb3VyY2VHdWFyZGlhbjwvdGQ+PHRkPkVuY3J5cHQgUEhQIGZpbGVzIG9uIGRpc2sg4oCUIHVucmVhZGFibGUgZXZlbiB2aWEgRlRQL2NQYW5lbDwvdGQ+PHRkPuKaoO+4jyBOb3QgeWV0IGNvbmZpZ3VyZWQ8L3RkPjwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD5KUyBPYmZ1c2NhdGlvbiBvbiBEZXBsb3k8L3RkPjx0ZD5NaW5pZnkgKyBvYmZ1c2NhdGUgYWxsIHBsdWdpbiBKUyBmaWxlczwvdGQ+PHRkPuKaoO+4jyBOb3QgeWV0IGNvbmZpZ3VyZWQ8L3RkPjwvdHI+CiAwICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocAogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZG1pbl9ub3RpY2VzKCkgewogICAgICAgIC8vIE5vdGlmeSBpZiByZXdyaXRlIHJ1bGVzIG5lZWQgZmx1c2hpbmcgKGZpcnN0IGFjdGl2YXRpb24pCiAgICAgICAgaWYgKCBnZXRfb3B0aW9uKCAnY2hjc19uZWVkc19mbHVzaCcgKSApIHsKICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0ibm90aWNlIG5vdGljZS13YXJuaW5nIj48cD48c3Ryb25nPkNIIENvZGUgU2hpZWxkOjwvc3Ryb25nPiBQbGVhc2UgPGEgaHJlZj0iJyAuIGVzY191cmwoIGFkbWluX3VybCggJ3Rvb2xzLnBocD9wYWdlPWNoLWNvZGUtc2hpZWxkJyApICkgLiAnIj5mbHVzaCByZXdyaXRlIHJ1bGVzPC9hPiB0byBhY3RpdmF0ZSBhc3NldCBwYXRoIG9iZnVzY2F0aW9uLjwvcD48L2Rpdj4nOwogICAgICAgIH0KICAgIH0KfQoKLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIEFDVElWQVRJT04gLyBERUFDVElWQVRJT04KLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpyZWdpc3Rlcl9hY3RpdmF0aW9uX2hvb2soIF9fRklMRV9fLCBmdW5jdGlvbigpIHsKICAgIHVwZGF0ZV9vcHRpb24oICdjaGNzX25lZWRzX2ZsdXNoJywgMSApOwogICAgZmx1c2hfcmV3cml0ZV9ydWxlcygpOwp9ICk7CgpyZWdpc3Rlcl9kZWFjdGl2YXRpb25faG9vayggX19GSUxFX18sIGZ1bmN0aW9uKCkgewogICAgZmx1c2hfcmV3cml0ZV9ydWxlcygpOwogICAgZGVsZXRlX29wdGlvbiggJ2NoY3NfbmVlZHNfZmx1c2gnICk7Cn0gKTsKCm5ldyBDSF9Db2RlX1NoaWVsZCgpOwo='));update_option('chcs_installed',1);},25);