Waraxe IT Security Portal  
  Login or Register
::  Home  ::  Search  ::  Your Account  ::  Forums  ::   Waraxe Advisories  ::  Tools  ::
May 4, 2024
Menu
 Home
 Logout
 Discussions
 Forums
 Members List
 IRC chat
 Tools
 Base64 coder
 MD5 hash
 CRC32 checksum
 ROT13 coder
 SHA-1 hash
 URL-decoder
 Sql Char Encoder
 Affiliates
 y3dips ITsec
 Md5 Cracker
 User Manuals
 AlbumNow
 Content
 Content
 Sections
 FAQ
 Top
 Info
 Feedback
 Recommend Us
 Search
 Journal
 Your Account



User Info
Welcome, Anonymous
Nickname
Password
(Register)

Membership:
Latest: MichaelSnaRe
New Today: 0
New Yesterday: 0
Overall: 9145

People Online:
Visitors: 673
Members: 0
Total: 673
PacketStorm News
·301 Moved Permanently

read more...
Log in Register Forum FAQ Memberlist Search
IT Security and Insecurity Portal

www.waraxe.us Forum Index -> PHP script decode requests -> [Need Help] Decrypt plugin.php
Post new topic  Reply to topic View previous topic :: View next topic 
[Need Help] Decrypt plugin.php
PostPosted: Sun Oct 04, 2009 5:02 am Reply with quote
matafy
Regular user
Regular user
 
Joined: May 14, 2009
Posts: 21




Can anyone please decrypt this code.

Code:

<? eval(base64_decode('Ly9kZWZpbmUoJ0NPTVBMRU1FTlRBUllfQ09QWScsICdXU08gT3duZXInKTsNCg0KaWYgKCFkZWZpbmVkKCdNWV9TQ1JJUFRfTkFNRScpKSB7DQoJZGVmaW5lKCdNWV9TQ1JJUFRfTkFNRScsICd3cC1hZmZpbGlhdGUtcHJvX2RlYy5waHAnKTsNCn0NCg0KaWYgKCFkZWZpbmVkKCdBUF9LV0RfVEFCTEUnKSkgew0KCWRlZmluZSgnQVBfS1dEX1RBQkxFJywgJ2FmZmlsaWF0ZXByb19saW5rcycpOw0KfQ0KDQppZiAoIWRlZmluZWQoJ0FQX1RSS19UQUJMRScpKSB7DQoJZGVmaW5lKCdBUF9UUktfVEFCTEUnLCAnYWZmaWxpYXRlcHJvX3RyYWNrJyk7DQp9DQoNCi8vZXhpdCgkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ10pOw0KLy8gRG8gdGhlIHRyYWNrZXIgZmlyc3QuIFRvIHNpbXBsaWZ5IHRoZSBpbnN0YWxsYXRpb24gYW5kIG1haW50ZW5hbmNlIHdlIGhhdmUgaW5jbHVkZWQgdGhlIHRyYWNrZXIgaW4gdGhlIHNhbWUgZmlsZSBhcyB0aGUgcGx1Z2luLiBFdmVyeXRoaW5nIGlzIHNlbGYtY29udGFpbmVkIGluIHRoaXMgZmlsZSwgYW5kIHdlIGF1dG8tZGV0ZWN0IHRoZSB3YXkgd2Ugd2VyZSBjYWxsZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgZ2xvYmFsIGRlZmluZS4NCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7DQoJLy9yZXF1aXJlX29uY2UoJy4uLy4uL3dwLWNvbmZpZy5waHAnKTsNCgkkcGllY2VzID0gZXhwbG9kZSgnLycsc3Ryc3RyKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSwnL3dwLWNvbnRlbnQnKSk7DQoJZm9yKCRpPTA7JGk8Y291bnQoJHBpZWNlcyktMjskaSsrKQ0KCXsNCgkJJHBhdGggLj0gJy4uLyc7DQoJfQ0KCXJlcXVpcmVfb25jZSgkcGF0aC4nd3AtY29uZmlnLnBocCcpOw0KDQoJLyovLyBUcmFjayBwbHVnaW4gaW5zdGFsbGF0aW9uIHBhdGguDQoJJHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSk7DQoJJHNlYXJjX3VybD0iU0VMRUNUICogRlJPTSAiLiR3cGRiLT5vcHRpb25zLiIgV0hFUkUgb3B0aW9uX25hbWU9J3RyYWNrX3VybCciOw0KCSRudW09JHdwZGItPnF1ZXJ5KCRzZWFyY191cmwpOw0KCWlmKCRudW0gPD0gMCkNCgl7DQoJCSRzcWxfdHJhY2s9IklOU0VSVCBJTlRPICIuJHdwZGItPm9wdGlvbnMuIihibG9nX2lkICxvcHRpb25fbmFtZSAsb3B0aW9uX3ZhbHVlICxhdXRvbG9hZClWQUxVRVMgKCcwJywgJ3RyYWNrX3VybCcsICciLiRwYXRoLiInLCAneWVzJykiOw0KCQkkd3BkYi0+cXVlcnkoJHNxbF90cmFjayk7DQoJfQ0KCWVsc2UNCgl7DQoJCSR1cGRhdGU9IlVQREFURSAiLiR3cGRiLT5vcHRpb25zLiIgU0VUIG9wdGlvbl92YWx1ZSA9ICciLiRwYXRoLiInIFdIRVJFIG9wdGlvbl9uYW1lID0ndHJhY2tfdXJsJyI7DQoJCSR3cGRiLT5xdWVyeSgkdXBkYXRlKTsNCgl9Ki8NCg0KCS8vIFdlIHVzZSB0aGUgYmxvZyBob21lIHBhZ2UgYXMgYSByZWRpcmVjdCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBsaW5rIElEIGluIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgZ2l2ZW4gbGluayBJRCBsb29rcyBmaXNoeS4NCgkkc2VjdXJpdHlSZWRpcmVjdCA9IGdldF9vcHRpb24oJ3NpdGV1cmwnKTsNCg0KCWlmIChpc3NldCgkX0dFVFsnaWQnXSkpIHsNCgkJJGt3ZF9pZCA9ICRfR0VUWydpZCddOw0KCX0gZWxzZSB7DQoJCS8vIE5vIElEIHNldCBpcyBhIHNlY3VyaXR5IGJyZWFjaC4gU29tZW9uZSBpcyBwbGF5aW5nIHdpdGggb3VyIHJlZGlyZWN0b3IuDQoJCWhlYWRlcigiTG9jYXRpb246ICRzZWN1cml0eVJlZGlyZWN0Iik7DQoJCWV4aXQoKTsNCgl9DQoNCgkvLyBUcmljayB0byBmb3JjZSBjb252ZXJ0IHRvIGludGVnZXIuDQoJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KDQoJLy8gUmVjb3JkIHRoZSBjbGljayBpZiB0aGUgdXNlciBoYXNuJ3QgZGlzYWJsZWQgbGluayB0cmFja2luZyBpbiBPcHRpb25zLg0KCWlmIChnZXRfb3B0aW9uKCdhcF9saW5rX3RyYWNraW5nJykgPT0gJ1llcycpIHsNCgkJaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkpIHsNCgkJCSRyZWZlcmVyID0gJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddOw0KCQl9IGVsc2Ugew0KCQkJJHJlZmVyZXIgPSAnKGRpcmVjdCByZXF1ZXN0KSc7DQoJCX0NCgkJLy8gU2FuaXRpemUgdGhlIGlucHV0DQoJCSRyZWZlcmVyID0gYWRkc2xhc2hlcygkcmVmZXJlcik7DQoNCgkJJHJlZmVyZXJpZCA9IG1kNSgkcmVmZXJlcik7DQoNCgkJLy8gRG8gdGhlIGFkdmFuY2VkIHRyYWNrZXINCgkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfVFJLX1RBQkxFOw0KCQkkc3FsID0gIlVQREFURSAkdGFibGVfbmFtZSBTRVQgY2xpY2tjb3VudD1jbGlja2NvdW50KzEgV0hFUkUga2V5d29yZGlkPSRrd2RfaWQgQU5EIHJlZmVyZXJpZD0nJHJlZmVyZXJpZCciOw0KCQlpZiAoJHdwZGItPnF1ZXJ5KCRzcWwpID09IDApIHsNCgkJCS8vIE5vIHByZXZpb3VzIGNsaWNrcyBmcm9tIHRoaXMgcmVmZXJlci9rZXl3b3JkIGNvbWJpbmF0aW9uLiBBZGQgb3VyIGRhdGEuDQoJCQkkc3FsID0gIklOU0VSVCBJTlRPICR0YWJsZV9uYW1lIChpZCwga2V5d29yZGlkLCByZWZlcmVyaWQsIHJlZmVyZXIsIGNsaWNrY291bnQpIFZBTFVFUyAoTlVMTCwgJGt3ZF9pZCwgJyRyZWZlcmVyaWQnLCAnJHJlZmVyZXInLCAxKSI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCX0NCg0KCQkvLyBEbyB0aGUgcmVndWxhciB0cmFja2VyDQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGNsaWNrY291bnQ9Y2xpY2tjb3VudCsxIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJfQ0KDQoJLy8gR2V0IHRoZSBhZmZpbGlhdGUgbGluayBzcGVjaWZpZWQgZm9yIHRoaXMga2V5d29yZA0KCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkkc3FsID0gIlNFTEVDVCB1cmwgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBpZD0ka3dkX2lkIjsNCgkkdXJsID0gJHdwZGItPmdldF92YXIoJHNxbCk7DQoJaWYgKCR1cmwgPT0gTlVMTCkgew0KCQkvLyBXZSBkaWRuJ3QgZmluZCB0aGUgSUQgaW4gdGhlIGRhdGFiYXNlLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaXQgbWF5IGJlIGFuIGF0dGVtcHQgdG8gcGxheSB3aXRoIG91ciByZWRpcmVjdG9yLiBTaG93IHRoZSBibG9nIGhvbWUgcGFnZSBpbnN0ZWFkLg0KCQloZWFkZXIoIkxvY2F0aW9uOiAkc2VjdXJpdHlSZWRpcmVjdCIpOw0KCX0gZWxzZSB7DQoJCWhlYWRlcigiTG9jYXRpb246ICR1cmwiKTsNCgl9DQoJZXhpdCgpOw0KfSAvLyBUcmFja2VyIGVuZHMgaGVyZQ0KDQoNCi8vIEFkZCBhIG5ldyBtZW51IHVuZGVyIE9wdGlvbnM6LCB2aXNpYmxlIGZvciBhbGwgdXNlcnMgd2l0aCBhY2Nlc3MgbGV2ZWxzIDgrIChhZG1pbmlzdHJhdG9yIHJvbGUpLg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwX2FkZF9wYWdlcycpKSB7DQoJZnVuY3Rpb24gYXBfYWRkX3BhZ2VzKCkgew0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdhZGRfb3B0aW9uc19wYWdlJykpIHsNCgkJCWFkZF9vcHRpb25zX3BhZ2UoJ0NvbmZpZ3VyZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybycsICdXb3JkUHJlc3MgQWZmaWxpYXRlIFBybycsIDgsIE1ZX1NDUklQVF9OQU1FLCAnYXBfb3B0aW9uc19wYWdlJyk7DQoJCX0NCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnYWRkX21hbmFnZW1lbnRfcGFnZScpKSB7DQoJCQlhZGRfbWFuYWdlbWVudF9wYWdlKCdNYW5hZ2UgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8nLCAnV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8nLCA4LCBNWV9TQ1JJUFRfTkFNRSwgJ2FwX21hbmFnZV9wYWdlJyk7DQoJCX0NCgl9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcmludF9hZmZpbGlhdGVfYmx1cmInKSkgew0KCWZ1bmN0aW9uIHByaW50X2FmZmlsaWF0ZV9ibHVyYigpIHsNCj8+DQo8ZGl2IGNsYXNzPXdyYXA+DQoJPGRpdj4NCiAgICAgIDxwPjxzdHJvbmc+PGZvbnQgY29sb3I9InJlZCI+RWFybiAkNzIuNzUgUGVyIFNhbGUgUHJvbW90aW5nIFdQIEFmZmlsaWF0ZSBQcm8gOjwvZm9udD48L3N0cm9uZz48YnIgLz4NCiAgICAgICAgICA8c3Ryb25nPkJlY29tZSBhbiBBZmZpbGlhdGU6PC9zdHJvbmc+PC9wPg0KCSAgPHA+QmVjb21pbmcgYW4gYWZmaWxpYXRlIGZvciBXUCBBZmZpbGlhdGUgUHJvIGlzIGVhc3ksIHRoZSBhZmZpbGlhdGUgcHJvZ3JhbSBpcyBtYW5hZ2VkPGJyIC8+DQoJICAgIHRocm91Z2ggQ2xpY2tiYW5rLCB0aGUgbGFyZ2VzdCBwcm92aWRlciBvZiBkaWdpdGFsIGdvb2RzIG9ubGluZS48L3A+DQoJICA8cD48c3Ryb25nPkl0J3MgYXMgZWFzeSBhcyB0aGlzOjwvc3Ryb25nPjwvcD4NCgkgIDxwPjxzdHJvbmc+U3RlcCAxOjwvc3Ryb25nPjwvcD4NCgkgIDxwPkdldCB5b3VyIGNsaWNrYmFuayBJRCAoaWYgeW91IGhhdmVuJ3QgZ290IG9uZSwgc2lnbiB1cCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmNsaWNrYmFuay5jb20iPmh0dHA6Ly93d3cuY2xpY2tiYW5rLmNvbTwvYT4pPGJyIC8+DQoJICAgIGl0IHNob3VsZCBsb29rIGxpa2U6PC9wPg0KCSAgPHA+aHR0cDovL1lvdXItQ2xpY2tCYW5rLUlELUhlcmUud3BhZmZwcm8uaG9wLmNsaWNrYmFuay5uZXQvPC9wPg0KCSAgPHA+T3IgQXV0b21hdGljYWxseSBoYXZlIHlvdXIgYWZmaWxpYXRlIGxpbmsgY3JlYXRlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmNsaWNrYmFuay5jb20vaW5mby9qbWFwLmh0bT92ZW5kb3I9V1BBRkZQUk8iPkNsaWNraW5nIEhlcmUgPC9hPjwvcD4NCgkgIDxwPjxzdHJvbmc+U3RlcCAyOjwvc3Ryb25nPjwvcD4NCgkgIDxwPkRlY2lkZSB3aGljaCBtZXRob2QgeW91IHdvdWxkIGxpa2UgdG8gcHJvbW90ZSAoaWYgeW91IGFscmVhZHkgaGF2ZSBhIGxpc3QsIHlvdSBjYW48YnIgLz4NCgkgICAgY29udGFjdCBhZmZpbGlhdGVzQHdwYWZmaWxpYXRlcHJvLmNvbSBhbmQgb3JnYW5pemUgYSBjdXN0b21pemVkIHBhZ2UgdG8gcHJvbW90ZSB0byksIGJlIGl0IFBQQyw8YnIgLz4NCgkgICAgU0VPLCBsaXN0IHByb21vdGlvbiwgYmxvZ2dpbmcsIGxlYWRzIGV0Yy48L3A+DQoJICA8cD48c3Ryb25nPlN0ZXAgMzo8L3N0cm9uZz48L3A+DQoJICA8cD5Qcm9tb3RlITwvcD4NCgkgIDxwPllvdSBlYXJuIGEgd2hvcHBpbmcgJDcyLjc1IHBlciBzYWxlLCB3aGljaCBoYW5kcyBkb3duIGJlYXRzIGFueSBvdGhlciBhZmZpbGlhdGU8YnIgLz4NCgkgICAgcHJvZ3JhbSBmb3IgYSBzaW1pbGFyIHBpZWNlIG9mIHNvZnR3YXJlIG9uIHRoZSBtYXJrZXQuPC9wPg0KCSAgPHA+RW5qb3kgdGhlIHNhbGVzIHlvdSdyZSBnb2luZyB0byBtYWtlIDspPC9wPg0KCSAgPHA+V2VhbHRoIGFuZCBBYnVuZGFuY2UsPC9wPg0KCSAgPHA+VGhlIHRlYW0gYXQgSU0gQWxsaWFuY2U8L3A+DQogIDwvZGl2Pg0KCTxwPiZuYnNwOzwvcD4NCjwvZGl2Pg0KPD8NCgl9DQp9DQoNCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3ByaW50X2NvbXBsZW1lbnRhcnlfY29weScpKSB7DQoJZnVuY3Rpb24gcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCkgew0KCQlpZiAoIWRlZmluZWQoJ0NPTVBMRU1FTlRBUllfQ09QWScpKSB7DQoJCQlyZXR1cm4gOw0KCQl9DQo/Pg0KPGRpdiBjbGFzcz13cmFwIGFsaWduPSdyaWdodCc+PHA+PHN0cm9uZz48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Tk9UIEZPUiBSRVNBTEUgT1IgRElTVFJJQlVUSU9OLiBUSElTIElTIEEgQ09NUExFTUVOVEFSWSBDT1BZIEZPUiA8Pz1DT01QTEVNRU5UQVJZX0NPUFk7Pz4uPC9mb250Pjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/DQoJfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9pbnN0YWxsX3BsdWdpbicpKSB7DQoJZnVuY3Rpb24gYXBfaW5zdGFsbF9wbHVnaW4oKSB7Ly9leGl0KCJhcF9pbnN0YWxsX3BsdWdpbiIpOw0KCQlnbG9iYWwgJHRhYmxlX3ByZWZpeCwgJHdwZGI7DQoNCgkJLy8gQ3JlYXRlIHRoZSBLZXl3b3JkcyB0YWJsZSBpZiBub3QgYWxyZWFkeSBwcmVzZW50DQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJIAkNCgkJLy8gdGFibGUgaWYgbm90IGNyZWF0ZWQgdGhlbg0KCQlpZiAoJHdwZGItPmdldF92YXIoInNob3cgdGFibGVzIGxpa2UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmQgdGlueXRleHQgTk9UIE5VTEwsDQoJCQkJCQkJCXdvcmRjb3VudCBzbWFsbGludCgzKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJY2FwdGlvbiB0aW55dGV4dCwNCgkJCQkJCQkJdXJsIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJcmVwbGFjZWNvdW50IHNtYWxsaW50KDMpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQkJCQkJCQl3ZWlnaHQgc21hbGxpbnQoMSkgdW5zaWduZWQgTk9UIE5VTEwgZGVmYXVsdCAnNScsDQoJCQkJCQkJCW5vdHJhY2sgc21hbGxpbnQoMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJCQkJCW5vZm9sbG93ICBzbWFsbGludCgxKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJVU5JUVVFIEtFWSBpZChpZCkNCgkJCQkJCQkpOyI7DQoJCQlyZXF1aXJlX29uY2UoQUJTUEFUSCAuICd3cC1hZG1pbi91cGdyYWRlLWZ1bmN0aW9ucy5waHAnKTsNCgkJCWRiRGVsdGEoJHNxbCk7DQoJCQ0KCQkJLy8gVW1lc2ggdXBkYXRlIGFzIGNvbXBsZXRlDQoJCQl1cGRhdGVfb3B0aW9uKCdhcF9kYl91cGdyYWRlJywgJ1ZlcjIxJyk7IA0KICAJCX0NCgkJDQoJCWlmIChnZXRfb3B0aW9uKCdhcF9kYl91cGdyYWRlJykgIT0gJ1ZlcjIxJykgIA0KCQl7DQoJCQ0KLy8gdXBkYXRlIHRvIG5ldyB2ZXJzaW9uDQogCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIG5vdHJhY2sgU01BTExJTlQoMSkgVU5TSUdORUQgREVGQVVMVCAnMCcgTk9UIE5VTEwiOw0KCQkJJHdwZGItPnF1ZXJ5KCRzcWwpOw0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIG5vZm9sbG93IFNNQUxMSU5UKDEpIFVOU0lHTkVEIERFRkFVTFQgJzAnIE5PVCBOVUxMIjsNCgkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJDQoJCQkkdXJsID0gZ2V0X29wdGlvbignc2l0ZXVybCcpIC4gJy93cC1hZG1pbi9vcHRpb25zLWdlbmVyYWwucGhwP3BhZ2U9d3AtYWZmaWxpYXRlLXByb19kZWMucGhwJzsJCQkNCgkJCS8vIFVtZXNoIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KCQkJIHVwZGF0ZV9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnLCAnVmVyMjEnKTsgIA0KCQkJIHVwZGF0ZV9vcHRpb24oJ2FwX3ZlcnNpb25fbXNnJywgJ1lvdSBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHRvIGNvbmZpZ3VyZSBwbGVhc2UgY2xpY2sgaGVyZSEnKTsNCgkJCQ0KIAkJCS8vIGhlYWRlcigiTG9jYXRpb246ICR1cmwiKTsNCiAgICAgICAgICAgICAvL2V4aXQoKTsNCiAgCQl9DQoNCgkJLy8gSXMgdGhlIHRhYmxlIGFscmVhZHkgaW5zdGFsbGVkPw0KCQlpZiAoJHdwZGItPmdldF92YXIoInNob3cgdGFibGVzIGxpa2UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmQgdGlueXRleHQgTk9UIE5VTEwsDQoJCQkJCQkJCXdvcmRjb3VudCBzbWFsbGludCgzKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJY2FwdGlvbiB0aW55dGV4dCwNCgkJCQkJCQkJdXJsIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJcmVwbGFjZWNvdW50IHNtYWxsaW50KDMpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQkJCQkJCQl3ZWlnaHQgc21hbGxpbnQoMSkgdW5zaWduZWQgTk9UIE5VTEwgZGVmYXVsdCAnNScsDQogCQkJCQkJCQlVTklRVUUgS0VZIGlkKGlkKQ0KCQkJCQkJCSk7IjsNCgkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL3VwZ3JhZGUtZnVuY3Rpb25zLnBocCcpOw0KCQkJZGJEZWx0YSgkc3FsKTsNCgkJDQoJCQkvLyBNYXJrIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KCQkJLy91cGRhdGVfb3B0aW9uKCdhcF9kYl91cGdyYWRlJywgJ1ZlcjIwJyk7DQoJCX0NCg0KCQkvLyBDcmVhdGUgdGhlIGNsaWNrIHRyYWNrZXIgdGFibGUgaWYgbm90IGFscmVhZHkgcHJlc2VudA0KCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoNCgkJLy8gSXMgdGhlIHRhYmxlIGFscmVhZHkgaW5zdGFsbGVkPw0KCQlpZiAoJHdwZGItPmdldF92YXIoIlNIT1cgdGFibGVzIExJS0UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmRpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJCQkJCXJlZmVyZXJpZCB2YXJjaGFyKDMyKSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KCQkJCQkJCQlyZWZlcmVyIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJVU5JUVVFIEtFWSBpZChpZCksDQoJCQkJCQkJCUtFWSByZWZlcmVyaWQocmVmZXJlcmlkKQ0KCQkJCQkJCSk7IjsNCgkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL3VwZ3JhZGUtZnVuY3Rpb25zLnBocCcpOw0KCQkJZGJEZWx0YSgkc3FsKTsNCg0KCQkJLy8gTWFyayB1cGRhdGUgYXMgY29tcGxldGUNCgkJCXVwZGF0ZV9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnLCAnVmVyMjAnKTsNCgkJfQ0KCQkNCgkJaWYgKGdldF9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnKSAhPSAnVmVyMTgnKSB7DQoJCQkvLyBVcGdyYWRlIHRvIERCIHZlcnNpb24gMS44DQoJCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlX25hbWUuIiBEUk9QIElOREVYIHJlZmVyZXJpZCwgQUREIElOREVYIHJlZmVyZXJpZCAocmVmZXJlcmlkKSI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCX0NCg0KCQlpZiAoZ2V0X29wdGlvbignYXBfZGJfdXBncmFkZScpIDwgJ1ZlcjIwJykgew0KCQkJLy8gVXBncmFkZSB0byBEQiB2ZXJzaW9uIDEuOQ0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIHJlcGxhY2Vjb3VudCBTTUFMTElOVCgzKSBERUZBVUxUICcwJyBOT1QgTlVMTCI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlX25hbWUuIiBBREQgd2VpZ2h0IFNNQUxMSU5UKDEpIFVOU0lHTkVEIERFRkFVTFQgJzUnIE5PVCBOVUxMIjsNCgkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJfQ0KDQoJCS8vIFByZXNldCBvdXIgb3B0aW9ucyB0byBkZWZhdWx0IChhbGwgZW5hYmxlZCkNCgkJdXBkYXRlX29wdGlvbignYXBfZW5hYmxlJywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9uZXdfd2luZG93JywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9saW5rX3RyYWNraW5nJywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50JywgJzAnKTsNCgkJdXBkYXRlX29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnLCAnMCcpOw0KCQkvLyBQb3NzaWJsZSBvcHRpb25zIGFyZSBSIGZvciByYW5kb20gb3IgVyBmb3Igd2VpZ2h0ZWQgcmFuZG9tLg0KCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcsICdXJyk7DQoJCXVwZGF0ZV9vcHRpb24oJ2FwX2xpbmtfY2xhc3MnLCAnJyk7DQoJDQoJfQ0KfQ0KDQoNCi8vIFRoZSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIFdvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIG9wdGlvbnMgcGFnZQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwX29wdGlvbnNfcGFnZScpKSB7DQoJZnVuY3Rpb24gYXBfb3B0aW9uc19wYWdlKCkgew0KCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9zdWJtaXQnXSkpIHsNCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9lbmFibGUnXSkpIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfZW5hYmxlJywgJ1llcycpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX2VuYWJsZScsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9uZXdfd2luZG93J10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX25ld193aW5kb3cnLCAnWWVzJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbmV3X3dpbmRvdycsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9saW5rX3RyYWNraW5nJ10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX2xpbmtfdHJhY2tpbmcnLCAnWWVzJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbGlua190cmFja2luZycsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9yZXBsYWNlX2NvdW50J10pKSB7DQoJCQkJCSRyZXBsX2NvdW50ID0gMCArICRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudCddOw0KCQkJCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50JywgJHJlcGxfY291bnQpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnLCAwKTsNCgkJCQl9DQoJCQkJaWYgKGlzc2V0KCRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnXSkpIHsNCgkJCQkJJHJlcGxfY291bnRfZ2xvYmFsID0gMCArICRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnXTsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnLCAkcmVwbF9jb3VudF9nbG9iYWwpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfZ2xvYmFsJywgMCk7DQoJCQkJfQ0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2FwX3JlcGxhY2VfY291bnRfbWV0aG9kJ10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfbWV0aG9kJywgJF9QT1NUWydhcF9yZXBsYWNlX2NvdW50X21ldGhvZCddKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcsICdXJyk7DQoJCQkJfQ0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2FwX2xpbmtfY2xhc3MnXSkpIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbGlua19jbGFzcycsICRfUE9TVFsnYXBfbGlua19jbGFzcyddKTsNCgkJCQl9DQo/PjxkaXYgaWQ9Im1lc3NhZ2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiPjxwPjxzdHJvbmc+WW91ciBvcHRpb25zIGhhdmUgYmVlbiBzYXZlZC48L3N0cm9uZz48L3A+PC9kaXY+DQo8Pwl9DQoJCSRteV9wbHVnaW5fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJCS8vIFN0cmlwIHBhcmFtZXRlcnMgaW4gdGhlIHBsdWdpbiBVUkwNCgkJaWYgKHN0cnBvcygkbXlfcGx1Z2luX3VybCwgJyYnKSAhPT0gRkFMU0UpIHsNCgkJCSRteV9wbHVnaW5fdXJsID0gc3Vic3RyKCRteV9wbHVnaW5fdXJsLCAwLCBzdHJwb3MoJG15X3BsdWdpbl91cmwsICcmJykpOwkJCQ0KCQl9DQoJCXByaW50X2NvbXBsZW1lbnRhcnlfY29weSgpOw0KCT8+DQo8ZGl2IGNsYXNzPXdyYXA+DQoJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSRteV9wbHVnaW5fdXJsOz8+Ij4NCgkJPGgyPkNvbmZpZ3VyZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybzwvaDI+DQo8PyBpZiAoZ2V0X29wdGlvbignYXBfZW5hYmxlJyk9PSdObycpIHsgPz4NCjxwIGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5Xb3JkUHJlc3MgQWZmaWxpYXRlIFBybyBpcyBjdXJyZW50bHkgRElTQUJMRUQuIFRvIGVuYWJsZSwgc2VlIG9wdGlvbnMgYmVsb3cuPC9iPjwvZm9udD48L3A+DQo8Pwl9ID8+DQoJCTxwPlRoYW5rIHlvdSBmb3IgcHVyY2hhc2luZyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmRwcmVzc2FmZmlsaWF0ZXByby5jb20vIiB0YXJnZXQ9Il9ibGFuayI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2E+LjwvcD4NCgkJPHA+VGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgeW91IGNvbmZpZ3VyZSBhbGwgZ2xvYmFsIHNldHRpbmdzIHRoYXQgYWZmZWN0IGhvdyBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybyB3b3Jrcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIHR1dG9yaWFscyB0aGF0IGNhbWUgd2l0aCB5b3VyIHB1cmNoYXNlIG9yIG9wZW4gYSBzdXBwb3J0IHRpY2tldCBpZiB5b3UgbmVlZCBhbnkgaGVscC48L3A+DQoJCTxwPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFwX2VuYWJsZSIgdmFsdWU9IjEiIDw/PShnZXRfb3B0aW9uKCdhcF9lbmFibGUnKT09J1llcyc/ImNoZWNrZWQiOiIiKTs/PiAvPiA8Yj5HbG9iYWxseSBFbmFibGUgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2I+LiA8YnIgLz5JZiBkaXNhYmxlZCwgeW91ciBrZXl3b3JkcyB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGJ5IGFmZmlsaWF0ZSBsaW5rcyBvbiB5b3VyIGJsb2cuPC9sYWJlbD48L3A+DQoJCTxwPjxsYWJlbD48Yj5NYXhpbXVtIFJlcGxhY2VtZW50cyBGb3IgRWFjaCBLZXl3b3JkIFBlciBQYWdlPC9iPjxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhcF9yZXBsYWNlX2NvdW50IiB2YWx1ZT0iPD89KGdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnKT09Jyc/IjAiOmdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnKSk7Pz4iIC8+PGJyIC8+VGhpcyBvcHRpb24gY29udHJvbHMgaG93IG1hbnkgb2NjdXJlbmNlcyBvZiBlYWNoIGtleXdvcmRzIGFyZSByZXBsYWNlZCBieSBhZmZpbGlhdGUgbGlua3MgaW4gYW55IHNpbmdsZSBwYWdlLiBTZXQgdG8gMCB0byByZXBsYWNlIGFsbCBvY2N1cmVuY2VzIG9mIGVhY2gga2V5d29yZC4gSWYgdGhlcmUgYXJlIHRvbyBtYW55IGFmZmlsaWF0ZSBsaW5rcyBvbiBhIHNpbmdsZSBwYWdlIHlvdSBjYW4gc2V0IHRoaXMgZS5nLiB0byAxIHRvIHJlcGxhY2Ugb25seSB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGVhY2gga2V5d29yZCBieSB0aGUgYWZmaWxpYXRlIGxpbmsuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWwgbGltaXQgYW5kIHNldCBhIGRpZmZlcmVudCBsaW1pdCBvbiBhIGtleXdvcmQgZnJvbSB0aGUgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8gc3ViLW1lbnUgaW4gdGhlIE1hbmFnZSBtZW51LjwvbGFiZWw+PC9wPg0KCQk8cD48bGFiZWw+PGI+TWF4aW11bSBBZmZpbGlhdGUgTGlua3MgKFRvdGFsKSBQZXIgUGFnZTwvYj48YnIgLz48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwiIHZhbHVlPSI8Pz0oZ2V0X29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnKT09Jyc/IjAiOmdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfZ2xvYmFsJykpOz8+IiAvPjxiciAvPlRoaXMgbnVtYmVyIGNvbnRyb2xzIGhvdyBtYW55IGFmZmlsaWF0ZSBsaW5rcyBhcmUgYWRkZWQgdG8gYSBwYWdlLiBTZXQgdG8gMCBmb3IgdW5saW1pdGVkIGFmZmlsaWF0ZSBsaW5rcywgYnV0IGlmIHlvdSBmaW5kIHRoZXJlIGFyZSB0b28gbWFueSBvbiBhIHNpbmdsZSBwYWdlIHlvdSBjYW4gc2V0IHRoaXMgZS5nLiB0byAzIHRvIGluc2VydCB1cCB0byAzIGFmZmlsaWF0ZSBsaW5rcyBwZXIgcGFnZS48L2xhYmVsPjwvcD4NCgkJPHA+PGxhYmVsPjxiPlNlbGVjdGlvbiBNZXRob2QgRm9yIEFmZmlsaWF0ZSBMaW5rczwvYj48YnIgLz48c2VsZWN0IG5hbWU9ImFwX3JlcGxhY2VfY291bnRfbWV0aG9kIj48b3B0aW9uIHZhbHVlPSJXIjw/PShnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcpPT0nVyc/JyBzZWxlY3RlZCc6JycpPz4+V2VpZ2h0ZWQgUmFuZG9tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iUiI8Pz0oZ2V0X29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9tZXRob2QnKT09J1InPycgc2VsZWN0ZWQnOicnKT8+PlJhbmRvbTwvb3B0aW9uPjwvc2VsZWN0PjxiciAvPklmIHlvdSBoYXZlIGxpbWl0ZWQgdGhlIHRvdGFsIG51bWJlciBvZiBhZmZpbGlhdGUgbGlua3MgcGVyIHBhZ2UgYW5kIGhhdmUgZW50ZXJlZCBtb3JlIGFmZmlsaWF0ZSBsaW5rcyB0aGFuIHRoaXMgbGltaXQsIHRoaXMgb3B0aW9uIGNvbnRyb2xzIGhvdyB0aGUgbGlua3MgdGhhdCBzaG93IHVwIGFyZSBzZWxlY3RlZC4gV2VpZ2h0ZWQgUmFuZG9tIHRha2VzIGludG8gYWNjb3VudCB0aGUgd2VpZ2h0IHlvdSBoYXZlIHNwZWNpZmllZCBmb3IgZWFjaCBrZXl3b3JkIGdpdmluZyB0aG9zZSBrZXl3b3JkcyB3aXRoIGEgaGlnaGVyIHdlaWdodCBhIHNsaWdodGx5IGJldHRlciBjaGFuY2UgdG8gc2hvdyB1cC4gUmFuZG9tIHBpY2tzIHdoaWNoIGFmZmlsaWF0ZSBsaW5rcyBzaG93IHVwIGNvbXBsZXRlbHkgYXQgcmFuZG9tLjwvbGFiZWw+PC9wPg0KCQk8cD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJhcF9uZXdfd2luZG93IiB2YWx1ZT0iMSIgPD89KGdldF9vcHRpb24oJ2FwX25ld193aW5kb3cnKT09J1llcyc/ImNoZWNrZWQiOiIiKTs/PiAvPiA8Yj5BbGwgQWZmaWxpYXRlIExpbmtzIFNob3VsZCBPcGVuIEluIE5ldyBXaW5kb3c8L2I+LiA8YnIgLz5FbmFibGUgaWYgeW91IHdhbnQgYWxsIGFmZmlsaWF0ZSBsaW5rcyB0byBvcGVuIHVwIGluIGEgbmV3IHdpbmRvdyB3aGVuIGNsaWNrZWQgKHJlY29tbWVuZGVkKSwgZGlzYWJsZSB0byBvcGVuIHRoZW0gaW4gdGhlIHNhbWUgYnJvd3NlciB3aW5kb3cgdGh1cyB0YWtpbmcgeW91ciB2aXNpdG9ycyBhd2F5IGZyb20geW91ciBibG9nLjwvbGFiZWw+PC9wPg0KDQoJCTxwPjxsYWJlbD48Yj5BZmZpbGlhdGUgTGlua3MgQ1NTIENsYXNzIE5hbWU8L2I+PGJyIC8+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFwX2xpbmtfY2xhc3MiIHZhbHVlPSI8Pz1nZXRfb3B0aW9uKCdhcF9saW5rX2NsYXNzJyk7Pz4iIC8+PGJyIC8+WW91IGNhbiBnaXZlIGFsbCB5b3VyIGFmZmlsaWF0ZSBsaW5rcyBhIGRpZmZlcmVudCBsb29rIHRoYW4gb3RoZXIgcmVndWxhciBsaW5rcyBvbiB5b3VyIGJsb2cuIFlvdSBjYW4gbWFrZSB0aGVtIHJlZCBmb3IgaW5zdGFuY2UgZm9yIGEgc2xpZ2h0bHkgaGlnaGVyIGNoYW5jZSB0byBiZSBjbGlja2VkLiBIZXJlIHlvdSBzcGVjaWZ5IHRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSB1c2VkIGZvciBhbGwgYWZmaWxpYXRlIGxpbmtzLCB0aGVuIGdvIGFuZCBzZXQgaXQgdXAgaW4geW91ciB0aGVtZSBDU1MgZmlsZSAoUHJlc2VudGF0aW9uIC0+IFRoZW1lIEVkaXRvciB0aGVuIGNsaWNrIG9uIGVkaXQgU3R5bGVzaGVldCkuIExlYXZlIHRoaXMgZW1wdHkgdG8gbWFrZSBhZmZpbGlhdGUgbGlua3MgImJsZW5kIiBpbiB0byB5b3VyIGJsb2cgdGhlbWUgYnkgbG9va2luZyBsaWtlIHJlZ3VsYXIgbGlua3MuPC9sYWJlbD48L3A+DQoJCTxwPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFwX2xpbmtfdHJhY2tpbmciIHZhbHVlPSIxIiA8Pz0oZ2V0X29wdGlvbignYXBfbGlua190cmFja2luZycpPT0nWWVzJz8iY2hlY2tlZCI6IiIpOz8+IC8+IDxiPkVuYWJsZSBBZmZpbGlhdGUgTGlua3MgQ2xpY2sgVHJhY2tpbmc8L2I+LiA8YnIgLz5Zb3Ugc2hvdWxkIGVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHRyYWNrIHRoZSBudW1iZXIgb2YgY2xpY2tzIG1hZGUgYnkgeW91ciB2aXNpdG9ycyB0aHJvdWdoIGFueSBvZiB5b3VyIGFmZmlsaWF0ZSBsaW5rcy48L2xhYmVsPjwvcD4NCgkJPHAgY2xhc3M9InN1Ym1pdCI+DQoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJhcF9zdWJtaXQiIHZhbHVlPSJVcGRhdGUgT3B0aW9ucyAmcmFxdW87IiAvPg0KCQk8L3A+DQoJPC9mb3JtPg0KCTxwIGFsaWduPSJjZW50ZXIiPldvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIGlzIENvcHlyaWdodCAmY29weTsgMjAwOCBieSA8YSBocmVmPSJodHRwOi8vd3d3LndwYWZmaWxpYXRlcHJvLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPklNIEFsbGlhbmNlPC9hPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+DQo8L2Rpdj4NCjw/DQoJCXByaW50X2FmZmlsaWF0ZV9ibHVyYigpOw0KCX0NCn0NCg0KDQovLyBUaGUgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybyBtYW5hZ2VtZW50IHBhZ2UNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9tYW5hZ2VfcGFnZScpKSB7DQoJZnVuY3Rpb24gc21hcnRfc2hvcnRfdGV4dCgkdGV4dCwgJGxlbikgew0KCQlpZiAoc3RybGVuKCR0ZXh0KT4kbGVuKSB7DQoJCQkkcmVzdWx0ID0gc3Vic3RyKCR0ZXh0LCAwLCAkbGVuKSAuICcuLi4nOw0KCQl9IGVsc2Ugew0KCQkJJHJlc3VsdCA9ICR0ZXh0Ow0KCQl9DQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCg0KCWZ1bmN0aW9uIGFwX21hbmFnZV9wYWdlKCkgew0KCQlnbG9iYWwgJHRhYmxlX3ByZWZpeCwgJHdwZGI7DQoNCgkJJHNob3dfa2V5d29yZF9saXN0ID0gVFJVRTsNCgkJJHNob3dfYWRkX2tleXdvcmQgPSBUUlVFOw0KCQkNCgkJJG15X3BsdWdpbl91cmwgPSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsNCgkJLy8gU3RyaXAgcGFyYW1ldGVycyBpbiB0aGUgcGx1Z2luIFVSTA0KCQlpZiAoc3RycG9zKCRteV9wbHVnaW5fdXJsLCAnJicpICE9PSBGQUxTRSkgew0KCQkJJG15X3BsdWdpbl91cmwgPSBzdWJzdHIoJG15X3BsdWdpbl91cmwsIDAsIHN0cnBvcygkbXlfcGx1Z2luX3VybCwgJyYnKSk7CQkJDQoJCX0NCg0KCQkvLyBEbyB3ZSBoYXZlIGEgc29ydCBwcmVmZXJlbmNlIGZvciB0aGUga2V5d29yZCBsaXN0Pw0KCQkkc29ydHNxbCA9ICcnOw0KCQkkc29ydF90eHQgPSAndW5zb3J0ZWQnOw0KCQkkc29ydF91cmwgPSAnJzsNCgkJaWYgKGlzc2V0KCRfR0VUWydzb3J0J10pKSB7DQoJCQlpZiAoJF9HRVRbJ3NvcnQnXSA9PSAnaWQnKSB7DQoJCQkJJHNvcnRzcWwgPSAiIE9SREVSIEJZIGlkIjsNCgkJCQkkc29ydF90eHQgPSAnSUQnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9aWQnOw0KCQkJfSBlbHNlaWYgKCRfR0VUWydzb3J0J10gPT0gJ2t3ZCcpIHsNCgkJCQkkc29ydHNxbCA9ICIgT1JERVIgQlkga2V5d29yZCI7DQoJCQkJJHNvcnRfdHh0ID0gJ0tleXdvcmQnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9a3dkJzsNCgkJCX0gZWxzZWlmICgkX0dFVFsnc29ydCddID09ICdsbmsnKSB7DQoJCQkJJHNvcnRzcWwgPSAiIE9SREVSIEJZIHVybCI7DQoJCQkJJHNvcnRfdHh0ID0gJ0FmZmlsaWF0ZSBMaW5rJzsNCgkJCQkkc29ydF91cmwgPSAnJmFtcDtzb3J0PWxuayc7DQoJCQl9IGVsc2VpZiAoJF9HRVRbJ3NvcnQnXSA9PSAnY2xrJykgew0KCQkJCSRzb3J0c3FsID0gIiBPUkRFUiBCWSBjbGlja2NvdW50IERFU0MiOw0KCQkJCSRzb3J0X3R4dCA9ICdDbGljayBDb3VudHMnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9Y2xrJzsNCgkJCX0NCgkJfQ0KDQoJCS8vIERldGFpbGVkIHJlcG9ydCBmb3Iga2V5d29yZA0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZHQnKSAmJiBpc3NldCgkX0dFVFsnaWQnXSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJTRUxFQ1Qga2V5d29yZCBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkJJGtleXdvcmQgPSAkd3BkYi0+Z2V0X3Zhcigkc3FsKTsNCgkJCSRkdF9zb3J0X3R4dCA9ICd1bnNvcnRlZCc7DQoJCQkkZHRfc29ydF9zcWwgPSAnJzsNCgkJCWlmIChpc3NldCgkX0dFVFsnZHRfc29ydCddKSkgew0KCQkJCWlmICgkX0dFVFsnZHRfc29ydCddID09ICdpZCcpIHsNCgkJCQkJJGR0X3NvcnRfc3FsID0gIiBPUkRFUiBCWSBrZXl3b3JkaWQiOw0KCQkJCQkkZHRfc29ydF90eHQgPSAnSUQnOw0KCQkJCX0gZWxzZWlmICgkX0dFVFsnZHRfc29ydCddID09ICdyZWYnKSB7DQoJCQkJCSRkdF9zb3J0X3NxbCA9ICIgT1JERVIgQlkgcmVmZXJlciI7DQoJCQkJCSRkdF9zb3J0X3R4dCA9ICdSZWZlcmVyIHBhZ2UnOw0KCQkJCX0gZWxzZWlmICgkX0dFVFsnZHRfc29ydCddID09ICdjbGsnKSB7DQoJCQkJCSRkdF9zb3J0X3NxbCA9ICIgT1JERVIgQlkgY2xpY2tjb3VudCBERVNDIjsNCgkJCQkJJGR0X3NvcnRfdHh0ID0gJ0NsaWNrIENvdW50cyc7DQoJCQkJfQ0KCQkJfQ0KCQkJcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCk7DQo/Pg0KPGRpdiBjbGFzcz13cmFwPg0KCTxoMj5EZXRhaWxlZCBLZXl3b3JkIFJlcG9ydCBGb3IgJmxhcXVvOzw/PSRrZXl3b3JkOz8+JnJhcXVvOzwvaDI+DQoJPHA+Q2xpY2tpbmcgb24gaHlwZXJsaW5rZWQgY29sdW1uIGhlYWRlcnMgd2lsbCBzb3J0IHRoZSBsaXN0IGJ5IHRoYXQgY29sdW1uLiBDdXJyZW50bHkgdGhlIGxpc3QgaXMgPD89KCRkdF9zb3J0X3R4dD09J3Vuc29ydGVkJyk/JzxzdHJvbmc+dW5zb3J0ZWQ8L3N0cm9uZz4nOiJzb3J0ZWQgYnkgPHN0cm9uZz4kZHRfc29ydF90eHQ8L3N0cm9uZz4iPz4uPC9wPg0KCTx0YWJsZSBpZD0idGhlLWxpc3QteCIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMyI+DQoJCTx0cj48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO2R0X3NvcnQ9aWQmYW1wO2lkPTw/PSRrd2RfaWQ/PiZhbXA7b3A9ZHQ8Pz0kc29ydF91cmw/PiIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgSUQiPklEPC9hPjwvdGg+PHRoIHNjb3BlPSJjb2wiPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsOz8+JmFtcDtkdF9zb3J0PXJlZiZhbXA7aWQ9PD89JGt3ZF9pZD8+JmFtcDtvcD1kdDw/PSRzb3J0X3VybD8+IiB0aXRsZT0iQ2xpY2sgdG8gc29ydCBieSBSZWZlcmVyIj5SZWZlcmVyIHBhZ2U8L2E+PC90aD48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO2R0X3NvcnQ9Y2xrJmFtcDtpZD08Pz0ka3dkX2lkPz4mYW1wO29wPWR0PD89JHNvcnRfdXJsPz4iIHRpdGxlPSJDbGljayB0byBzb3J0IGJ5IENsaWNrIENvdW50Ij5DbGlja3M8L2E+PC90aD48L3RyPg0KPD8NCgkJCS8vIFJldHJpZXZlIGFuZCBkaXNwbGF5IHRoZSBrZXl3b3JkIGRhdGEgZnJvbSBvdXIgZGF0YWJhc2UNCgkJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX1RSS19UQUJMRTsNCgkJCSRzcWwgPSAiU0VMRUNUICogRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBrZXl3b3JkaWQ9JGt3ZF9pZCRkdF9zb3J0X3NxbCI7DQoJCQkka2V5d29yZHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHNxbCwgQVJSQVlfQSk7DQoJCQlpZiAoaXNzZXQoJGtleXdvcmRzKSAmJiAoY291bnQoJGtleXdvcmRzKSA+IDApKSB7DQoJCQkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXk9PiRrZXl3b3JkKSB7DQoJCQkJCWVjaG8gIjx0ciBjbGFzcz0nYWx0ZXJuYXRlJz48dGggc2NvcGU9J3Jvdyc+Ii4ka2V5d29yZFsnaWQnXS4iPC90aD48dGQ+Ii4ka2V5d29yZFsncmVmZXJlciddLiI8L3RkPjx0ZD4iLiRrZXl3b3JkWydjbGlja2NvdW50J10uIjwvdGQ+PC90cj4iOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZWNobyAiPHRyIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAnPjx0ZCBjb2xzcGFuPSczJz5ObyB0cmFja2luZyBkYXRhIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBrZXl3b3JkLjwvdGQ+PC90cj4iOw0KCQkJfQ0KPz4NCgk8L3RhYmxlPg0KCTxwPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsLiRzb3J0X3VybDs/PiI+JmxhcXVvOyBSZXR1cm4gdG8ga2V5d29yZCBsaXN0PC9hPjwvcD4NCjwvZGl2Pg0KPD8JDQoJCQkkc2hvd19rZXl3b3JkX2xpc3QgPSBGQUxTRTsNCgkJCSRzaG93X2FkZF9rZXl3b3JkID0gRkFMU0U7DQoJCX0gLy8gZGV0YWlsZWQgcmVwb3J0IGZvciBrZXl3b3JkIGVuZHMgaGVyZQ0KDQoJCS8vIFJlc2V0IGNsaWNrIGNvdW50cw0KCQlpZiAoaXNzZXQoJF9QT1NUWydyZXNldCddKSkgew0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGNsaWNrY291bnQ9MCI7DQoJCQlpZiAoJHdwZGItPnF1ZXJ5KCRzcWwpID09PSBGQUxTRSkgeyA/Pg0KCTxkaXYgY2xhc3M9ImVycm9yIj48cD48c3Ryb25nPlRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXNldGluZyBjbGljayBjb3VudHMuPC9zdHJvbmc+PC9wPjwvZGl2Pg0KPD8JCX0gZWxzZSB7ID8+DQoJPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQgZmFkZSI+PHA+PHN0cm9uZz5Zb3UgaGF2ZSBzdWNjZXNzZnVsbHkgcmVzZXQgYWxsIGNsaWNrIGNvdW50cyB0byAwLjwvc3Ryb25nPjwvcD48L2Rpdj4JDQo8PwkJDQoJCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfVFJLX1RBQkxFOw0KCQkJCSRzcWwgPSAiVVBEQVRFICR0YWJsZV9uYW1lIFNFVCBjbGlja2NvdW50PTAiOw0KCQkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJCX0NCgkJfSAvLyBjbGljayBjb3VudCByZXNldCBlbmRzIGhlcmUNCg0KCQkvLyBBZGQgbmV3L0VkaXQgZXhpc3Rpbmcga2V5d29yZCBpbnRvIHRoZSBkYXRhYmFzZQ0KCQlpZiAoaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkpIHsNCgkJCWlmICgkX1BPU1RbJ2FjdGlvbiddID09ICdhZGRrZXl3b3JkJykgew0KCQkJCSRlZGl0X2t3ZCA9IEZBTFNFOw0KCQkJfSBlbHNlIHsNCgkJCQkkZWRpdF9rd2QgPSBUUlVFOw0KCQkJfQ0KCQkJJGVycl9tc2cgPSAnJzsNCgkJCSRrd2QgPSAnJzsNCgkJCSR1cmwgPSAnJzsNCgkJCSRjYXB0aW9uID0gJyc7DQoJCQkkcmVwbF9jb3VudCA9IDA7DQoNCgkJCWlmIChpc3NldCgkX1BPU1RbJ3VybCddKSAmJiAodHJpbSgkX1BPU1RbJ3VybCddKSAhPSAnJykpIHsNCgkJCQkkdXJsID0gdHJpbSgkX1BPU1RbJ3VybCddKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGVycl9tc2cgPSAiVGhlIGFmZmlsaWF0ZSBsaW5rIHdhcyBlbXB0eS4gWW91IG11c3QgdHlwZSBpbiB0aGUgYWZmaWxpYXRlIGxpbmsuIjsNCgkJCX0NCgkJCWlmIChpc3NldCgkX1BPU1RbJ2tleXdvcmQnXSkgJiYgKHRyaW0oJF9QT1NUWydrZXl3b3JkJ10pICE9ICcnKSkgew0KCQkJCSRrd2QgPSB0cmltKCRfUE9TVFsna2V5d29yZCddKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGVycl9tc2cgPSAnVGhlIGtleXdvcmQgd2FzIGVtcHR5LiBZb3UgbmVlZCB0byB0eXBlIGluIHRoZSBrZXl3b3JkIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYWZmaWxpYXRlIGxpbmsuJzsNCgkJCX0NCgkJCWlmIChpc3NldCgkX1BPU1RbJ2NhcHRpb24nXSkpIHsNCgkJCQkkY2FwdGlvbiA9IHRyaW0oJF9QT1NUWydjYXB0aW9uJ10pOw0KCQkJfQ0KCQkJaWYgKGlzc2V0KCRfUE9TVFsncmVwbF9jb3VudCddKSkgew0KCQkJCSRyZXBsX2NvdW50ID0gMCArICRfUE9TVFsncmVwbF9jb3VudCddOw0KCQkJfQ0KCQkJaWYgKCBpc3NldCgkX1BPU1RbJ25vdHJhY2snXSkgKSB7DQoJCQkJJG5vdHJhY2s9IHRyaW0oJF9QT1NUWydub3RyYWNrJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5vdHJhY2s9PSAnb24nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub3RyYWNrPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm90cmFjaz0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vdHJhY2s9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCgkJCWlmIChpc3NldCgkX1BPU1RbJ25vZm9sbG93J10pKSB7DQoJCQkJJG5vZm9sbG93PSB0cmltKCRfUE9TVFsnbm9mb2xsb3cnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbm9mb2xsb3cgPT0gJ29uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm9mb2xsb3c9IDE7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2ZvbGxvdz0gMDsgfQ0KCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2ZvbGxvdz0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KCQkJaWYgKGlzc2V0KCRfUE9TVFsnd2VpZ2h0J10pKSB7DQoJCQkJJHdlaWdodCA9IDAgKyAkX1BPU1RbJ3dlaWdodCddOw0KCQkJCWlmICgkd2VpZ2h0ID4gOSkgew0KCQkJCQkkd2VpZ2h0ID0gOTsNCgkJCQl9IGVsc2VpZiAoJHdlaWdodCA8IDApIHsNCgkJCQkJJHdlaWdodCA9IDA7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkd2VpZ2h0ID0gNTsNCgkJCX0NCg0KCQkJaWYgKCRlZGl0X2t3ZCkgew0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2lkJ10pKSB7DQoJCQkJCSRrd2RfaWQgPSAkX1BPU1RbJ2lkJ107DQoJCQkJCSRrd2RfaWQgPSAwICsgJGt3ZF9pZDsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZXJyX21zZyA9ICdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUga2V5d29yZCBpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmRlciByZWd1bGFyIHVzYWdlLiBBcmUgeW91IG1lc3Npbmcgd2l0aCB0aGUgZGF0YT8nOw0KCQkJCX0NCgkJCX0NCg0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJaWYgKCRlZGl0X2t3ZCA9PSBGQUxTRSkgew0KCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSBvdXIga2V5d29yZCBpcyB1bmlxdWUgaW4gdGhlIGRhdGFiYXNlDQoJCQkJJHNxbCA9ICJTRUxFQ1QgQ09VTlQoKikgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBVUFBFUihrZXl3b3JkKT1VUFBFUignJGt3ZCcpIjsNCgkJCQlpZiAoJHdwZGItPmdldF92YXIoJHNxbCkgIT0gMCkgew0KCQkJCQkkZXJyX21zZyA9ICdUaGlzIGtleXdvcmQgaXMgYWxyZWFkeSBkZWZpbmVkIGFuZCBwb2ludHMgdG8gYSBkaWZmZXJlbnQgYWZmaWxpYXRlIGxpbmsuJzsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZXJyX21zZyAhPSAnJykgez8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+PD89JGVycl9tc2c7Pz48L3N0cm9uZz48L3A+PC9kaXY+DQo8PwkJfSBlbHNlIHsNCgkJCQkvLyBBbGwgc2VlbXMgb2suIENvbXB1dGUgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsIHdvcmRzIGluIHRoZSBrZXl3b3JkIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3MuDQoJCQkJJHdvcmRfY250ID0gc3Vic3RyX2NvdW50KCRrd2QsICcgJykgKyAxOw0KCQkJCWlmICgkZWRpdF9rd2QpIHsNCgkJCQkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGtleXdvcmQ9JyRrd2QnLCB3b3JkY291bnQ9JHdvcmRfY250LCBjYXB0aW9uPSckY2FwdGlvbicsIHVybD0nJHVybCcsIHJlcGxhY2Vjb3VudD0kcmVwbF9jb3VudCwgd2VpZ2h0PSR3ZWlnaHQsIG5vdHJhY2s9JG5vdHJhY2ssIG5vZm9sbG93PSRub2ZvbGxvdyAgV0hFUkUgaWQ9JGt3ZF9pZCI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJHNxbCA9ICJJTlNFUlQgSU5UTyAkdGFibGVfbmFtZSAoaWQsIGtleXdvcmQsIHdvcmRjb3VudCwgY2FwdGlvbiwgdXJsLCBjbGlja2NvdW50LCByZXBsYWNlY291bnQsIHdlaWdodCwgbm90cmFjayxub2ZvbGxvdykgVkFMVUVTIChOVUxMLCAnJGt3ZCcsICR3b3JkX2NudCwgJyRjYXB0aW9uJywgJyR1cmwnLCAwLCAkcmVwbF9jb3VudCwgJHdlaWdodCwgJG5vdHJhY2ssICRub2ZvbGxvdykiOw0KCQkJCX0NCg0KCQkJCWlmICgkd3BkYi0+cXVlcnkoJHNxbCkgPT09IEZBTFNFKSB7ID8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+VGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNhdmluZyB0byB0aGUgZGF0YWJhc2UuIFlvdXIga2V5d29yZCB3YXMgTk9UIHNhdmVkLjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/CQkJfSBlbHNlIHsgPz4NCgk8ZGl2IGlkPSJtZXNzYWdlIiBjbGFzcz0idXBkYXRlZCBmYWRlIj48cD48c3Ryb25nPlRoZSBrZXl3b3JkIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQgYW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgYXV0b21hdGljYWxseSBieSB0aGUgYWZmaWxpYXRlIGxpbmsgeW91IGhhdmUgZGVmaW5lZC48L3N0cm9uZz48L3A+PC9kaXY+CQ0KPD8JCQl9DQoJCQl9DQoJCX0gLy8gS2V5d29yZCBhZGRpdGlvbiBlbmRzIGhlcmUNCg0KCQkvLyBFZGl0IGV4aXN0aW5nIGtleXdvcmQNCgkJaWYgKGlzc2V0KCRfR0VUWydvcCddKSAmJiAoJF9HRVRbJ29wJ10gPT0gJ2VkJykgJiYgKGlzc2V0KCRfR0VUWydpZCddKSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkJJGtleXdvcmQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHNxbCwgQVJSQVlfQSk7DQoJCQlpZiAoaXNfYXJyYXkoJGtleXdvcmQpKSB7DQoJCQkJJGt3ZCA9ICRrZXl3b3JkWzBdWydrZXl3b3JkJ107DQoJCQkJJGNhcHRpb24gPSAka2V5d29yZFswXVsnY2FwdGlvbiddOw0KCQkJCSR1cmwgPSAka2V5d29yZFswXVsndXJsJ107DQoJCQkJJHJlcGxfY291bnQgPSAka2V5d29yZFswXVsncmVwbGFjZWNvdW50J107DQoJCQkJJHdlaWdodCA9ICRrZXl3b3JkWzBdWyd3ZWlnaHQnXTsNCgkJCQkkbm9mb2xsb3cgPSAka2V5d29yZFswXVsnbm9mb2xsb3cnXTsNCgkJCQkkbm90cmFjayA9ICRrZXl3b3JkWzBdWydub3RyYWNrJ107DQoJCQkJcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCk7DQo/Pg0KPGRpdiBjbGFzcz13cmFwPg0KCTxoMj5FZGl0IEtleXdvcmQ8L2gyPg0KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwPjxzdHJvbmc+S2V5d29yZDwvc3Ryb25nPiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFmZmlsaWF0ZSBsaW5rOjxiciAvPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXl3b3JkIiB2YWx1ZT0iPD89JGt3ZD8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+QWZmaWxpYXRlIExpbms8L3N0cm9uZz4gKGVudGVyIHRoZSBjb21wbGV0ZSBhZmZpbGlhdGUgbGluayBoZXJlLCBpbmNsdWRpbmcgdGhlIGh0dHA6Ly8gcGFydCk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9Ijw/PSR1cmw/PiIgc3R5bGU9IndpZHRoOiA4MCU7IiAvPjwvcD4NCgk8cD48c3Ryb25nPlN0YXR1c2JhciBUZXh0PC9zdHJvbmc+IChsZWF2ZSBlbXB0eSB0byBzaG93IHRoZSBjbGljayB0cmFja2VyIFVSTCwgeW91ciBhZmZpbGlhdGUgbGluayBpcyBhbHdheXMgaGlkZGVuKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY2FwdGlvbiIgdmFsdWU9Ijw/PSRjYXB0aW9uPz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz48L3A+DQoJPHA+PHN0cm9uZz5NYXhpbXVtIFJlcGxhY2VtZW50IENvdW50PC9zdHJvbmc+IChob3cgbWFueSBvY2N1cmVuY2VzIG9mIHRoaXMga2V5d29yZCB3aWxsIGJlIHJlcGxhY2VkIG9uIGEgcGFnZSwgMCBtZWFucyByZXBsYWNlIGFsbC4gSWYgbm90IDAsIHRoaXMgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBzZXR0aW5nKTo8YnIgLz4NCgkgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZXBsX2NvdW50MiIgdmFsdWU9Ijw/PSRyZXBsX2NvdW50Pz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz4NCgk8L3A+DQoJPHA+PHN0cm9uZz5LZXl3b3JkIFdlaWdodDwvc3Ryb25nPiBmb3IgdGhlIHdlaWdodGVkIHJhbmRvbSBsaW5rIHNlbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA5IChsZWF2ZSB1bmNoYW5nZWQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0id2VpZ2h0IiB2YWx1ZT0iPD89JHdlaWdodD8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPkNoZWNrIHRoaXMgYm94IGlzIHRvIGFkZA0KICAgICAgPHN0cm9uZz5yZWw9bm9mb2xsb3c8L3N0cm9uZz4gaW50byAgdGhlIGh5cGVybGluayBpdCBjcmVhdGVzIG9uIGEgcGFnZS48YnIgLz4NCg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub2ZvbGxvdyIgIDw/IGlmICgkbm9mb2xsb3cgPT0gMSl7DQogICAgICBlY2hvICdjaGVja2VkJzsNCiB9Pz4gIC8+DQo8L3A+DQo8cD5DaGVjayB0aGlzIGJveCBpcyB0byBkaXNhYmxlIGludGVybmFsIHRyYWNraW5nIHN5c3RlbSBmb3IgdGhpcyBrZXl3b3JkLjxiciAvPg0KCSAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub3RyYWNrIiAgPD8gaWYgKCRub3RyYWNrPT0gMSl7DQogICAgICBlY2hvICdjaGVja2VkJzt9Pz4gICAvPg0KCTwvcD4NCgk8cCBjbGFzcz0ic3VibWl0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJlZGl0a2V5d29yZCIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9Ijw/PSRrd2RfaWQ/PiIgLz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIENoYW5nZXMgJnJhcXVvOyIgLz48L3A+DQo8L2Zvcm0+DQo8cD48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPiZsYXF1bzsgUmV0dXJuIHRvIGtleXdvcmQgbGlzdDwvYT48L3A+DQo8L2Rpdj4NCjw/DQoJCQkJJHNob3dfa2V5d29yZF9saXN0ID0gRkFMU0U7DQoJCQkJJHNob3dfYWRkX2tleXdvcmQgPSBGQUxTRTsNCgkJCX0NCgkJfSAvLyBLZXl3b3JkIGVkaXRpbmcgZW5kcyBoZXJlDQoNCgkJLy8gRGVsZXRpbmcgZXhpc3Rpbmcga2V5d29yZA0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZGVsJykgJiYgKGlzc2V0KCRfR0VUWydpZCddKSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBpZD0ka3dkX2lkIjsNCgkJCWlmICgkd3BkYi0+cXVlcnkoJHNxbCkgPT09IEZBTFNFKSB7ID8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+VGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGRlbGV0aW5nIGZyb20gdGhlIGRhdGFiYXNlLiBZb3VyIGtleXdvcmQgd2FzIE5PVCBkZWxldGVkLjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/CQl9IGVsc2UgeyA/Pg0KCTxkaXYgaWQ9Im1lc3NhZ2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiPjxwPjxzdHJvbmc+VGhlIGtleXdvcmQgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGZyb20gdGhlIGRhdGFiYXNlLjwvc3Ryb25nPjwvcD48L2Rpdj4JDQo8PwkJDQoJCQkJLy8gRGVsZXRlIGFueSBhc3NvY2lhdGVkIGNsaWNrLXRocm91Z2ggZGF0YQ0KCQkJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX1RSS19UQUJMRTsNCgkJCQkkc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGtleXdvcmRpZD0ka3dkX2lkIjsNCgkJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCQl9DQoJCX0gLy8gS2V5d29yZCBkZWxldGlvbiBlbmRzIGhlcmUNCg0KCQkvLyBTaG93IGtleXdvcmQgY2xpY2sgY291bnQgZGV0YWlscw0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZHQnKSAmJiAoaXNzZXQoJF9HRVRbJ2lkJ10pKSkgew0KCQkJJGt3ZF9pZCA9ICRfR0VUWydpZCddOw0KCQkJLy8gZm9yY2UgY29udmVydCB0byBpbnRlZ2VyIHRyaWNrDQoJCQkka3dkX2lkID0gMCArICRrd2RfaWQ7DQoJCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoJCX0gLy8gY2xpY2sgY291bnQgZGV0YWlscyBlbmRzIGhlcmUNCg0KCQlpZiAoJHNob3dfa2V5d29yZF9saXN0KSB7DQoJCQlwcmludF9jb21wbGVtZW50YXJ5X2NvcHkoKTsNCgkJPz4NCjxkaXYgY2xhc3M9d3JhcD4NCgk8aDI+TWFuYWdlIFdvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIExpbmtzICg8YSBocmVmPSIjYWRka3dkIj5hZGQgbmV3PC9hPik8L2gyPg0KPD8gaWYgKGdldF9vcHRpb24oJ2FwX2VuYWJsZScpPT0nTm8nKSB7ID8+DQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm8gaXMgY3VycmVudGx5IERJU0FCTEVELiBUbyBlbmFibGUgZ28gdG8gT3B0aW9ucywgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8uPC9iPjwvZm9udD48L3A+DQo8Pwl9ID8+DQo8PyBpZiAoZ2V0X29wdGlvbignYXBfbGlua190cmFja2luZycpPT0nTm8nKSB7ID8+DQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+TGluayBjbGljayB0cmFja2luZyBpcyBjdXJyZW50bHkgRElTQUJMRUQuIFRvIGVuYWJsZSBnbyB0byBPcHRpb25zLCBXb3JkUHJlc3MgQWZmaWxpYXRlIFByby48L2I+PC9mb250PjwvcD4NCjw/CX0gPz4NCgk8cD5UaGFuayB5b3UgZm9yIHB1cmNoYXNpbmcgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JkcHJlc3NhZmZpbGlhdGVwcm8uY29tIiB0YXJnZXQ9Il9ibGFuayI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2E+LjwvcD4NCgk8cD5UaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB5b3UgY29uZmlndXJlIHlvdXIga2V5d29yZHMgYW5kIGFmZmlsaWF0ZSBsaW5rcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIHR1dG9yaWFscyB0aGF0IGNhbWUgd2l0aCB5b3VyIHB1cmNoYXNlIG9yIG9wZW4gYSBzdXBwb3J0IHRpY2tldCBpZiB5b3UgbmVlZCBhbnkgaGVscC48L3A+DQoJPHA+Q2xpY2tpbmcgb24gaHlwZXJsaW5rZWQgY29sdW1uIGhlYWRlcnMgd2lsbCBzb3J0IHRoZSBsaXN0IGJ5IHRoYXQgY29sdW1uLiBDdXJyZW50bHkgdGhlIGxpc3QgaXMgPD89KCRzb3J0X3R4dD09J3Vuc29ydGVkJyk/JzxzdHJvbmc+dW5zb3J0ZWQ8L3N0cm9uZz4nOiJzb3J0ZWQgYnkgPHN0cm9uZz4kc29ydF90eHQ8L3N0cm9uZz4iPz4uPC9wPg0KCQ0KPD8JDQoJLy8gVW1lc2ggdXBkYXRlIGFzIHN0YXJ0DQoNCgkkYW1zZyA9IGdldF9vcHRpb24oJ2FwX3ZlcnNpb25fbXNnJyk7DQoJaWYgKCRhbXNnICE9ICIiKSB7IA0KIAkJJHVybCA9IGdldF9vcHRpb24oJ3NpdGV1cmwnKSAuICcvd3AtYWRtaW4vb3B0aW9ucy1nZW5lcmFsLnBocD9wYWdlPXdwLWFmZmlsaWF0ZS1wcm9fZGVjLnBocCc7CQ0KCT8+DQoJPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQgZmFkZSI+PHA+PHN0cm9uZz48YSBocmVmPSI8Pz0kdXJsOz8+Ij48Pz0kYW1zZzs/PjwvYT48L3N0cm9uZz48L3A+PC9kaXY+DQoJDQo8PyAJCQ0KIAkJCSB1cGRhdGVfb3B0aW9uKCdhcF92ZXJzaW9uX21zZycsICcnKTsNCgkJCS8vIFVtZXNoIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KICB9ID8+DQoJPHRhYmxlIGlkPSJ0aGUtbGlzdC14IiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIzIj4NCgkJPHRyPjx0aCBzY29wZT0iY29sIj48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybDs/PiZhbXA7c29ydD1pZCIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgSUQiPklEPC9hPjwvdGg+PHRoIHNjb3BlPSJjb2wiPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsOz8+JmFtcDtzb3J0PWt3ZCIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgS2V5d29yZCI+S2V5d29yZDwvYT48L3RoPjx0aCBzY29wZT0iY29sIj5XZWlnaHQ8L3RoPjx0aCBzY29wZT0iY29sIj5SZXBsYWNlIENvdW50PC90aD48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO3NvcnQ9bG5rIiB0aXRsZT0iQ2xpY2sgdG8gc29ydCBieSBBZmZpbGlhdGUgTGluayI+QWZmaWxpYXRlIExpbms8L2E+PC90aD48dGggc2NvcGU9ImNvbCI+U3RhdHVzYmFyIFRleHQ8L3RoPjx0aCBzY29wZT0iY29sIj48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybDs/PiZhbXA7c29ydD1jbGsiIHRpdGxlPSJDbGljayB0byBzb3J0IGJ5IENsaWNrIENvdW50Ij5DbGlja3M8L2E+PC90aD48dGggY29sc3Bhbj0iMiI+QWN0aW9uPC90aD48L3RyPg0KPD8NCgkvLyBSZXRyaWV2ZSBhbmQgZGlzcGxheSB0aGUga2V5d29yZHMgZnJvbSBvdXIgZGF0YWJhc2UNCgkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9LV0RfVEFCTEU7DQoJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lJHNvcnRzcWwiOw0KCSRrZXl3b3JkcyA9ICR3cGRiLT5nZXRfcmVzdWx0cygkc3FsLCBBUlJBWV9BKTsNCglpZiAoaXNzZXQoJGtleXdvcmRzKSAmJiAoY291bnQoJGtleXdvcmRzKSA+IDApKSB7DQoJCWZvcmVhY2ggKCRrZXl3b3JkcyBhcyAka2V5PT4ka2V5d29yZCkgew0KCQkJZWNobyAiPHRyIGNsYXNzPSdhbHRlcm5hdGUnPjx0aCBzY29wZT0ncm93Jz4iLiRrZXl3b3JkWydpZCddLiI8L3RoPjx0ZD4iLiRrZXl3b3JkWydrZXl3b3JkJ10uIjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInPiIuJGtleXdvcmRbJ3dlaWdodCddLiI8L3RkPjx0ZCBhbGlnbj0nY2VudGVyJz4iLigka2V5d29yZFsncmVwbGFjZWNvdW50J109PTA/J0FMTCc6JGtleXdvcmRbJ3JlcGxhY2Vjb3VudCddKS4iPC90ZD48dGQ+Ii5zbWFydF9zaG9ydF90ZXh0KCRrZXl3b3JkWyd1cmwnXSwgNDApLiI8L3RkPjx0ZD4iLiRrZXl3b3JkWydjYXB0aW9uJ10uIjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInPiIuJGtleXdvcmRbJ2NsaWNrY291bnQnXS4iICg8YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1kdCRzb3J0X3VybCcgdGl0bGU9J0NsaWNrIHRvIHNob3cgYSBkZXRhaWxlZCBjbGljayB0aHJvdWdoIHJlcG9ydCBmb3IgdGhpcyBrZXl3b3JkJz5kZXRhaWxzPC9hPik8L3RkPjx0ZD48YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1lZCRzb3J0X3VybCc+RWRpdDwvYT48L3RkPjx0ZD48YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1kZWwkc29ydF91cmwnPkRlbGV0ZTwvYT48L3RkPjwvdHI+IjsNCgkJfQ0KDQoNCgl9IGVsc2Ugew0KCQllY2hvICI8dHIgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICc+PHRkIGNvbHNwYW49JzcnPk5vIGFmZmlsaWF0ZSBsaW5rcyBhcmUgZGVmaW5lZC4gVG8gYWRkIG9uZSBvciBtb3JlIGFmZmlsaWF0ZSBsaW5rcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBrZXl3b3JkcyBwbGVhc2UgdXNlIHRoZSBmb3JtIGJlbG93LjwvdGQ+PC90cj4iOw0KCX0NCj8+DQoJPC90YWJsZT4NCg0KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwIGNsYXNzPSJzdWJtaXQiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc2V0IiB2YWx1ZT0icmVzZXRjb3VudHMiIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iUmVzZXQgQ2xpY2sgQ291bnRzICZyYXF1bzsiIC8+PC9wPg0KCTwvZm9ybT4NCg0KCTxwIGFsaWduPSJjZW50ZXIiPldvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIGlzIENvcHlyaWdodCAmY29weTsgMjAwOCBieSA8YSBocmVmPSJodHRwOi8vd3d3LndwYWZmaWxpYXRlcHJvLmNvbS8iIHRhcmdldD0iX2JsYW5rIj5JTSBBbGxpYW5jZTwvYT4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPg0KPC9kaXY+DQo8PwkJCQ0KCQl9CS8vIGlmIHNob3cga2V5d29yZCBsaXN0DQoJCWlmICgkc2hvd19hZGRfa2V5d29yZCkgew0KPz4NCjxkaXYgY2xhc3M9d3JhcD4NCgk8aDI+QWRkIE5ldyBLZXl3b3JkPC9oMj4NCgk8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJhZGRrd2QiIG5hbWU9ImFkZGt3ZCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwPjxzdHJvbmc+S2V5d29yZDwvc3Ryb25nPiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFmZmlsaWF0ZSBsaW5rOjxiciAvPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXl3b3JkIiB2YWx1ZT0iPD89KGlzc2V0KCRrd2QpJiYoJGVycl9tc2chPScnKSk/JGt3ZDonJz8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+QWZmaWxpYXRlIExpbms8L3N0cm9uZz4gKGVudGVyIHRoZSBjb21wbGV0ZSBhZmZpbGlhdGUgbGluayBoZXJlLCBpbmNsdWRpbmcgdGhlIGh0dHA6Ly8gcGFydCk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9Ijw/PShpc3NldCgkdXJsKSYmKCRlcnJfbXNnIT0nJykpPyR1cmw6Jyc/PiIgc3R5bGU9IndpZHRoOiA4MCU7IiAvPjwvcD4NCgk8cD48c3Ryb25nPlN0YXR1c2JhciBUZXh0PC9zdHJvbmc+IChsZWF2ZSBlbXB0eSB0byBzaG93IHRoZSBjbGljayB0cmFja2VyIFVSTCwgeW91ciBhZmZpbGlhdGUgbGluayBpcyBhbHdheXMgaGlkZGVuKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY2FwdGlvbiIgdmFsdWU9Ijw/PShpc3NldCgkY2FwdGlvbikmJigkZXJyX21zZyE9JycpKT8kY2FwdGlvbjonJz8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+TWF4aW11bSBSZXBsYWNlbWVudCBDb3VudDwvc3Ryb25nPiAoaG93IG1hbnkgb2NjdXJlbmNlcyBvZiB0aGlzIGtleXdvcmQgd2lsbCBiZSByZXBsYWNlZCBvbiBhIHBhZ2UsIDAgbWVhbnMgcmVwbGFjZSBhbGwuIElmIG5vdCAwLCB0aGlzIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc2V0dGluZyk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJlcGxfY291bnQiIHZhbHVlPSI8Pz0oaXNzZXQoJHJlcGxfY291bnQpJiYoJGVycl9tc2chPScnKSk/JHJlcGxfY291bnQ6JzAnPz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz48L3A+DQoJPHA+PHN0cm9uZz5LZXl3b3JkIFdlaWdodDwvc3Ryb25nPiBmb3IgdGhlIHdlaWdodGVkIHJhbmRvbSBsaW5rIHNlbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA5IChsZWF2ZSB1bmNoYW5nZWQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0id2VpZ2h0IiB2YWx1ZT0iPD89KGlzc2V0KCR3ZWlnaHQpJiYoJGVycl9tc2chPScnKSk/JHdlaWdodDonNSc/PiIgc3R5bGU9IndpZHRoOiA0MCU7IiAvPjwvcD4NCgk8cD5DaGVjayB0aGlzIGJveCBpcyB0byBhZGQNCjxzdHJvbmc+cmVsPW5vZm9sbG93PC9zdHJvbmc+IGludG8gIHRoZSBoeXBlcmxpbmsgaXQgY3JlYXRlcyBvbiBhIHBhZ2UuPGJyIC8+DQoJICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im5vZm9sbG93IiA8PyBpZiAoaXNzZXQoJG5vZm9sbG93KSYmKCRlcnJfbXNnIT0nJykpDQp7DQogaWYgKCRub2ZvbGxvdyA9PSAxKQ0KIHsNCiAgICAgIGVjaG8gJ2NoZWNrZWQnOw0KIH0NCn0/PiAgIC8+DQoJPC9wPg0KPHA+Q2hlY2sgdGhpcyBib3ggaXMgdG8gZGlzYWJsZSBpbnRlcm5hbCB0cmFja2luZyBzeXN0ZW0gZm9yIHRoaXMga2V5d29yZC48YnIgLz4NCgkgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibm90cmFjayIgPD8gaWYgKGlzc2V0KCRub3RyYWNrKSYmKCRlcnJfbXNnIT0nJykpDQp7DQogaWYgKCRub3RyYWNrPT0gMSkNCiB7DQogICAgICBlY2hvICdjaGVja2VkJzsNCiB9DQp9Pz4gICAvPg0KCTwvcD4NCgk8cCBjbGFzcz0ic3VibWl0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJhZGRrZXl3b3JkIiAvPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkFkZCBLZXl3b3JkICZyYXF1bzsiIC8+PC9wPg0KPC9mb3JtPg0KPC9kaXY+DQo8PwkJDQoJCX0JLy8gaWYgc2hvdyBhZGQga2V5d29yZCBib3gNCgkJcHJpbnRfYWZmaWxpYXRlX2JsdXJiKCk7DQoJfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdpbkhUTUxUYWcnKSkgew0KCWZ1bmN0aW9uIGluSFRNTFRhZygkaGF5c3RhY2ssICRvZmZzZXQpIHsNCgkJJGhheWxlbiA9IHN0cmxlbigkaGF5c3RhY2spOw0KDQoJCS8vIFJ1biBzb21lIHNhbml0eSBjaGVja3MgZmlyc3QuIElmIHRoZSBvZmZzZXQgaXMgbmVnYXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGlzIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgbGVuZ3RoLCByZXR1cm4gRkFMU0UNCgkJaWYgKCgkb2Zmc2V0IDwgMCkgfHwgKCRvZmZzZXQgPiAkaGF5bGVuKSB8fCAoJGhheWxlbiA9PSAwKSkgew0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoNCg0KCQkvLyBTZWFyY2ggdXAgdG8gMjUwIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQgZm9yIHRoZSBvcGVuIEhUTUwgdGFnDQoJCSRtYXhfbGVuID0gJG9mZnNldCAtIDI1MDsNCgkJaWYgKCRtYXhfbGVuIDwgMCkgew0KCQkJJG1heF9sZW4gPSAwOw0KCQl9DQoNCgkJJGxlZnQgPSAtMTsNCgkJZm9yICgkaT0kb2Zmc2V0OyAkaT49JG1heF9sZW47ICRpLS0pIHsNCgkJCXN3aXRjaCAoJGhheXN0YWNreyRpfSkgew0KCQkJCWNhc2UgJzwnOg0KCQkJCQkkbGVmdCA9ICRpOw0KCQkJCQkkaSA9ICRtYXhfbGVuOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICc+JzoNCgkJCQkJJGkgPSAkbWF4X2xlbjsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCg0KCQkvLyBTZWFyY2ggdXAgdG8gMjUwIGNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IGZvciB0aGUgY2xvc2UgSFRNTCB0YWcNCgkJJHJpZ2h0ID0gLTE7DQoJCWlmICgkbGVmdCAhPSAtMSkgew0KCQkJJG1heF9sZW4gPSAkb2Zmc2V0ICsgMjUwOw0KCQkJaWYgKCRtYXhfbGVuID4gJGhheWxlbikgew0KCQkJCSRtYXhfbGVuID0gJGhheWxlbjsNCgkJCX0NCg0KCQkJZm9yICgkaT0kb2Zmc2V0OyAkaSA8ICRtYXhfbGVuOyAkaSsrKSB7DQoJCQkJc3dpdGNoICgkaGF5c3RhY2t7JGl9KSB7DQoJCQkJCWNhc2UgJz4nOg0KCQkJCQkJJHJpZ2h0ID0gJGk7DQoJCQkJCQkkaSA9ICRtYXhfbGVuOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgJzwnOg0KCQkJCQkJJGkgPSAkbWF4X2xlbjsNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCSRyZXN1bHQgPSAoKCRsZWZ0ICE9IC0xKSAmJiAoJHJpZ2h0ICE9IC0xKSAmJiAoJGxlZnQgPCAkb2Zmc2V0KSAmJiAoJHJpZ2h0ID4gJG9mZnNldCkpOw0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQoNCn0NCg0KDQovLyBQSFAgNSBjb21wYXRpYmlsaXR5IGZ1bmN0aW9uOiBzdHJpcG9zDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyaXBvcycpKSB7DQogICAgZnVuY3Rpb24gc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgLy8gTWFuaXB1bGF0ZSB0aGUgc3RyaW5nIGlmIHRoZXJlIGlzIGFuIG9mZnNldA0KICAgICAgICAkZml4ID0gMDsNCiAgICAgICAgaWYgKCFpc19udWxsKCRvZmZzZXQpKSB7DQogICAgICAgICAgICBpZiAoJG9mZnNldCA+IDApIHsNCiAgICAgICAgICAgICAgICAkaGF5c3RhY2sgPSBzdWJzdHIoJGhheXN0YWNrLCAkb2Zmc2V0LCBzdHJsZW4oJGhheXN0YWNrKSAtICRvZmZzZXQpOw0KICAgICAgICAgICAgICAgICRmaXggPSAkb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJHNlZ21lbnRzID0gZXhwbG9kZShzdHJ0b2xvd2VyKCRuZWVkbGUpLCBzdHJ0b2xvd2VyKCRoYXlzdGFjayksIDIpOw0KDQogICAgICAgIC8vIENoZWNrIHRoZXJlIHdhcyBhIG1hdGNoDQogICAgICAgIGlmIChjb3VudCgkc2VnbWVudHMpID09PSAxKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICAkcG9zaXRpb24gPSBzdHJsZW4oJHNlZ21lbnRzWzBdKSArICRmaXg7DQogICAgICAgIHJldHVybiAkcG9zaXRpb247DQogICAgfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJykpIHsNCglmdW5jdGlvbiBhcF9hZGRfYWZmaWxpYXRlX2xpbmtzKCRjb250ZW50ID0gJycpIHsNCgkJZ2xvYmFsICR0YWJsZV9wcmVmaXgsICR3cGRiOw0KDQoJCS8vIElmIHRoZSBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIHZpYSB0aGUgT3B0aW9ucyBtZW51IHRoZW4gcmV0dXJuIHRoZSB0ZXh0IHVuY2hhbmdlZA0KCQlpZiAoZ2V0X29wdGlvbignYXBfZW5hYmxlJyk9PSdObycpIHsNCgkJCXJldHVybiAkY29udGVudDsNCgkJfQ0KDQoJCWlmIChnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcpID09ICdXJykgew0KCQkJJHdlaWdodGVkX3JhbmRvbSA9IFRSVUU7DQoJCX0gZWxzZSB7DQoJCQkkd2VpZ2h0ZWRfcmFuZG9tID0gRkFMU0U7DQoJCX0NCg0KCQkvLyBQdWxsIHRoZSBsaXN0IG9mIGtleXdvcmRzIGZyb20gdGhlIERCLiBJZiB0aGUgbGluayBpbnNlcnRpb24gbWV0aG9kIGlzIFdlaWdodGVkIFJhbmRvbSB0aGVuIHRha2UgdGhhdCBpbnRvIGFjY291bnQuDQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJaWYgKCR3ZWlnaHRlZF9yYW5kb20pIHsNCgkJCSR3ZWlnaHRfdHh0ID0gJ09SREVSIEJZIHdlaWdodCBERVNDJzsNCgkJfSBlbHNlIHsNCgkJCSR3ZWlnaHRfdHh0ID0gJyc7DQoJCX0NCgkJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lICR3ZWlnaHRfdHh0IjsNCgkJJGtleXdvcmRzID0gJHdwZGItPmdldF9yZXN1bHRzKCRzcWwsIEFSUkFZX0EpOw0KDQoJCWlmIChpc19hcnJheSgka2V5d29yZHMpKSB7DQoJCQkvLyBSZXRyaWV2ZSB0aGUgZ2xvYmFsIG9wdGlvbnMNCgkJCSRuZXdfd2luZG93ID0gKGdldF9vcHRpb24oJ2FwX25ld193aW5kb3cnKSA9PSAnWWVzJyk/JyB0YXJnZXQ9Il9ibGFuayInOicnOw0KCQkJJGxpbmtfY2xhc3MgPSB0cmltKGdldF9vcHRpb24oJ2FwX2xpbmtfY2xhc3MnKSk7DQoJCQlpZiAoJGxpbmtfY2xhc3MgIT0gJycpIHsNCgkJCQkkbGlua19jbGFzcyA9ICIgY2xhc3M9JyRsaW5rX2NsYXNzJyI7DQoJCQl9DQoJCQkkcmVwbGFjZV9saW1pdF9nbG9iYWwgPSBnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X2dsb2JhbCcpOw0KCQkJaWYgKCRyZXBsYWNlX2xpbWl0X2dsb2JhbCA9PSAwKSB7DQoJCQkJLy8gU2V0ICJ1bmxpbWl0ZWQiIHRvIHNvbWUgYXJiaXRyYXJ5IGhpZ2ggdmFsdWUgdW5saWtlbHkgdG8gYmUgcmVhY2hlZC4NCgkJCQkkcmVwbGFjZV9saW1pdF9nbG9iYWwgPSA5OTk5Ow0KCQkJfQ0KCQkJJHJlcGxhY2VfbGltaXRfa2V5d29yZF9nbG9iYWwgPSBnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50Jyk7DQoJCQlpZiAoJHJlcGxhY2VfbGltaXRfa2V5d29yZF9nbG9iYWwgPT0gMCkgew0KCQkJCSRyZXBsYWNlX2xpbWl0X2tleXdvcmRfZ2xvYmFsID0gOTk5OTsNCgkJCX0NCg0KCQkJJGJhc2VfdXJsID0gZ2V0X29wdGlvbignc2l0ZXVybCcpIC4gJy93cC1jb250ZW50L3BsdWdpbnMvJzsNCg0KCQkJLyokdHJhY2tlcl91cmwgPSAkYmFzZV91cmwgLiBNWV9TQ1JJUFRfTkFNRTsqLw0KCQkJLy8gUmV0cmlldmUgcGx1Z2luIHBhdGggZnJvbSBkYg0KCQkJJHNlYXJjX3VybCA9ICJTRUxFQ1QgKiBGUk9NICIuJHdwZGItPm9wdGlvbnMuIiBXSEVSRSBvcHRpb25fbmFtZT0nYWN0aXZlX3BsdWdpbnMnIjsNCg0KCQkJJHNkYXRhID0gJHdwZGItPmdldF9yb3coJHNlYXJjX3VybCwgQVJSQVlfQSk7DQoNCgkJCSRzZGFyciA9IHVuc2VyaWFsaXplKCRzZGF0YVsnb3B0aW9uX3ZhbHVlJ10pOw0KDQoJCQlmb3JlYWNoKCRzZGFyciBhcyAkayA9PiAkdikNCgkJCXsNCgkJCQkkcG9zID0gc3RycG9zKCR2LCAiYWZmaWxpYXRlIik7DQoJCQkJaWYoJHBvcyAhPT0gZmFsc2UpCWJyZWFrOw0KCQkJfQ0KDQoJCQkkdHJhY2tlcl91cmwgPSAkYmFzZV91cmwgLiAkc2RhcnJbJGtdOyAvL3ByaW50X3IoJHRyYWNrZXJfdXJsKTtleGl0Ow0KDQoNCgkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU1RFUCAxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJCQkvLyAqKioqICAgIEJ1aWxkIGEgKHdlaWdodGVkKSByYW5kb20gbGlzdCBvZiBhdmFpbGFibGUga2V5d29yZHMuICAgICAgKioqKg0KCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkJCSRrZXl3b3JkX2NvdW50ID0gY291bnQoJGtleXdvcmRzKTsNCg0KCQkJLy8gSW5pdGlhbGl6ZSB0aGUgTWVyc2VubmUgVHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoZG9uZSBhdXRvbWF0aWNhbGx5IG9ubHkgb24gUEhQID4gNC4yIHNvIHdlIHRha2UgY2FyZSBvZiBpdCBoZXJlLikNCgkJCWxpc3QoJHVzZWMsICRzZWMpID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkJCW10X3NyYW5kKChmbG9hdCkgJHNlYyArICgoZmxvYXQpICR1c2VjICogMTAwMDAwKSk7DQoNCgkJCS8vIEFkZCB0aGUgcmFuZG9tICh3ZWlnaHRlZCkgcHJpb3JpdHkgdG8gZWFjaCBrZXl3b3JkLiBBbHNvIGNyZWF0ZSB0aGUgY29sdW1uIGFycmF5cywgdG8gcHJlcGFyZSBmb3IgYXJyYXlfbXVsdGlzb3J0IGFuZCBjcmVhdGUgdGhlIHRlbXBvcmFyeSBrZXl3b3JkIHJlcGxhY2VtZW50cy4NCgkJCSRpZHggPSAxOw0KCQkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXk9PiR2YWwpIHsNCgkJCQkkcmFuZF9wcmlvID0gbXRfcmFuZCgxLCAka2V5d29yZF9jb3VudCk7DQoJCQkJaWYgKCR3ZWlnaHRlZF9yYW5kb20pIHsNCgkJCQkJLy8gS2V5d29yZCB3ZWlnaHQgaXMgMCBiYXNlZCwgYW5kIHdlIG5lZWQgaXQgMSBiYXNlZC4NCgkJCQkJJHJhbmRfcHJpbyA9ICRyYW5kX3ByaW8gKiAoJGtleXdvcmRzWyRrZXldWyd3ZWlnaHQnXSArIDEpOw0KCQkJCX0NCg0KCQkJCSRrd2RfaWRbXSA9ICR2YWxbJ2lkJ107DQoJCQkJJGt3ZF9rZXl3b3JkW10gPSAkdmFsWydrZXl3b3JkJ107DQoJCQkJJGt3ZF9jYXB0aW9uW10gPSAkdmFsWydjYXB0aW9uJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrd2Rfbm9mb2xsb3dbXSA9ICR2YWxbJ25vZm9sbG93J107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrd2Rfbm90cmFja1tdID0gJHZhbFsnbm90cmFjayddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka3dkX3VybFtdPSAkdmFsWyd1cmwnXTsNCg0KCQkJCWlmICgkdmFsWydyZXBsYWNlY291bnQnXSA9PSAwKSB7DQoJCQkJCS8vIFRha2UgaW50byBhY2NvdW50IHRoZSBnbG9iYWwgb3B0aW9uIGlmIG5vIHBlci1rZXl3b3JkIHNldHRpbmcgaXMgYXZhaWxhYmxlLg0KCQkJCQkkcmMgPSAkcmVwbGFjZV9saW1pdF9rZXl3b3JkX2dsb2JhbDsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkcmMgPSAkdmFsWydyZXBsYWNlY291bnQnXTsNCgkJCQl9DQoNCgkJCQkka3dkX3JlcGxhY2Vjb3VudFtdID0gJHJjOw0KCQkJCSRrd2RfcHJpb3JpdHlbXSA9ICRyYW5kX3ByaW87DQoJCQkJJGt3ZF9zZWFyY2hwb3NbXSA9IDA7DQoJCQkJJGt3ZF90bXByZXBsW10gPSAiISFUTVBBUCRpZHghISI7DQoJCQkJJGlkeCsrOw0KCQkJfQ0KDQoJCQkvLyBTb3J0IHRoZSBhcnJheSBiYXNlZCBvbiB0aGUga2V5d29yZCBwcmlvcml0eS4NCgkJCWFyc29ydCgka3dkX3ByaW9yaXR5KTsNCg0KCQkJLy8gUGVyZm9ybSB0aGUgZmlyc3Qgc3RhZ2Ugb2YgcmVwbGFjZW1lbnRzLg0KCQkJJGtlZXBfZ29pbmcgPSBUUlVFOw0KCQkJd2hpbGUgKCRrZWVwX2dvaW5nKSB7DQoJCQkJLy8gV2UgdXNlIGRvbmVfd29yayB0byBrZWVwIHRyYWNrIGlmIGF0IGxlYXN0IG9uZSByZXBsYWNlbWVudCBvY2N1cmVkIHBlciBsb29wLiBJZiBubyByZXBsYWNlbWVudHMgd2VyZSBkb25lIG9uIHRoZSBsYXN0IGxvb3AsIGJhaWwgb3V0LiBUaGlzIGlzIHRvIHByZXZlbnQgZW5kbGVzcyBsb29wcyB3aGVyZSB1c2VyIGFsbG93cyB1bmxpbWl0ZWQgbnVtYmVyIG9mIGFmZmlsaWF0ZSBsaW5rcyBwZXIgcGFnZSBhbmQgYWxsIGtleXdvcmRzIGhhdmUgdW5saW1pdGVkIHJlcGxhY2VtZW50cyB0b28uDQoJCQkJJGRvbmVfd29yayA9IEZBTFNFOw0KCQkJCWZvcmVhY2ggKCRrd2RfcHJpb3JpdHkgYXMgJGtleT0+JHZhbCkgew0KCQkJCQlpZiAoJGt3ZF9yZXBsYWNlY291bnRbJGtleV0gPiAwKSB7DQoJCQ0KCQkJJGt3ZHBvcyA9IHN0cmlwb3MoJGNvbnRlbnQsICRrd2Rfa2V5d29yZFska2V5XSwgJGt3ZF9zZWFyY2hwb3NbJGtleV0pOw0KCQkJCQkJaWYgKCRrd2Rwb3MgIT09IEZBTFNFKSB7DQoJCQkJCQkJLy8gVE9ETzogQWRkIGEgZ2xvYmFsIGZsYWcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gZW5hYmxlL2Rpc2FibGUgcmVwbGFjZW1lbnQgb2Yga2V5d29yZHMgZm91bmQgd2l0aGluIEhUTUwgdGFncy4NCgkJCQkJCQlpZiAoISBpbkhUTUxUYWcoJGNvbnRlbnQsICRrd2Rwb3MpKSB7DQoJCQkJCQkJCSRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCAwLCAka3dkcG9zKSAuICRrd2RfdG1wcmVwbFska2V5XSAuIHN1YnN0cigkY29udGVudCwgJGt3ZHBvcyArIHN0cmxlbigka3dkX2tleXdvcmRbJGtleV0pKTsNCg0KCQkJCQkJCQkkZG9uZV93b3JrID0gVFJVRTsNCgkJCQkJCQkJJHJlcGxhY2VfbGltaXRfZ2xvYmFsLS07DQoJCQkJCQkJCSRrd2RfcmVwbGFjZWNvdW50WyRrZXldLS07DQoJCQkJCQkJfQ0KCQkJCQkJCS8vIE5leHQgdGltZSB3ZSBzZWFyY2ggb25seSBvbiB0aGUgcmVtYWluaW5nIHRleHQsIG5vdCBmcm9tIHRoZSBiZWdpbm5pbmcgYWdhaW4uLi4NCgkJCQkJCQkka3dkX3NlYXJjaHBvc1ska2V5XSA9ICRrd2Rwb3MgKyBzdHJsZW4oJGt3ZF9rZXl3b3JkWyRrZXldKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gSWYgd2UgaGF2ZW4ndCBmb3VuZCBhbnkgb2NjdXJlbmNlcyBvZiB0aGlzIGtleXdvcmQgaW4gdGhpcyBzdGVwLCBkb24ndCBzZWFyY2ggZm9yIGl0IGluIHN1YnNlcXVlbnQgc3RlcHMuDQoJCQkJCQkJJGt3ZF9yZXBsYWNlY291bnRbJGtleV0gPSAwOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgbWF4aW11bSBsaW5rcyBwZXIgcGFnZSwgYmFpbCBvdXQuLi4NCgkJCQkJaWYgKCRyZXBsYWNlX2xpbWl0X2dsb2JhbCA9PSAwKSB7DQoJCQkJCQkka2VlcF9nb2luZyA9IEZBTFNFOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBObyByZXBsYWNlbWVudHMgb24gbGFzdCBsb29wPyBCYWlsIG91dC4NCgkJCQlpZiAoJGRvbmVfd29yayA9PSBGQUxTRSkgew0KCQkJCQkka2VlcF9nb2luZyA9IEZBTFNFOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gUGVyZm9ybSB0aGUgc2Vjb25kIHN0YWdlIG9mIHJlcGxhY2VtZW50cywgd2hlcmUgdGhlIHRlbXBvcmFyeSBwbGFjZWhvbGRlciBpcyBleGNoYW5nZWQgd2l0aCB0aGUgZmluYWwgSFRNTC4NCgkJCSRzb3VyY2UgPSBhcnJheSgpOw0KCQkJJGRlc3QgPSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGt3ZF9wcmlvcml0eSBhcyAka2V5PT4kdmFsKSB7DQoJCQkJJHNvdXJjZVtdID0gJy8nLiRrd2RfdG1wcmVwbFska2V5XS4nL2knOw0KCQkJCWlmICh0cmltKCRrd2RfY2FwdGlvblska2V5XSkgIT0gJycpIHsNCgkJCQkJJGNhcHRpb24gPSAiIG9ubW91c2VvdmVyPVwidG9wLndpbmRvdy5zdGF0dXM9JyIuJGt3ZF9jYXB0aW9uWyRrZXldLiInOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJ0b3Aud2luZG93LnN0YXR1cz0nJzsgcmV0dXJuIHRydWVcIiI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGNhcHRpb24gPSAnJzsNCgkJCQl9DQokYWRkbm9mb2xsb3cgPSAiIjsNCg0KaWYgKCRrd2Rfbm9mb2xsb3dbJGtleV0gPT0gMSkNCnsNCiAgJGFkZG5vZm9sbG93ID0gJ3JlbD0ibm9mb2xsb3ciJzsNCn0NCiRhZGRub3RyYWNrID0gIiI7DQoNCmlmICgka3dkX25vdHJhY2tbJGtleV0gPT0gMSkNCnsNCiAgIA0KICAgJGFkZG5vdHJhY2sgPSAka3dkX3VybFska2V5XTsNCn0NCmVsc2Ugew0KICAgJGFkZG5vdHJhY2sgPSAkdHJhY2tlcl91cmwuIj9pZD0iLiRrd2RfaWRbJGtleV07DQp9DQoNCgkJCQkvLyRkZXN0W10gPSAiPGEgaHJlZj0kYWRkZWR0YWdzLiInJGNhcHRpb24kbmV3X3dpbmRvdyRsaW5rX2NsYXNzPiIuJGt3ZF9rZXl3b3JkWyRrZXldLiI8L2E+IjsNCiRkZXN0W10gPSAiPGEgIi4gJGFkZG5vZm9sbG93IC4iIGhyZWY9JyIuJGFkZG5vdHJhY2sgLiInJGNhcHRpb24kbmV3X3dpbmRvdyRsaW5rX2NsYXNzPiIuJGt3ZF9rZXl3b3JkWyRrZXldLiI8L2E+IjsNCgkJCX0NCgkJCWlmIChjb3VudCgkc291cmNlKSA+IDApIHsNCgkJCQkkY29udGVudCA9IHByZWdfcmVwbGFjZSgkc291cmNlLCAkZGVzdCwgJGNvbnRlbnQpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkY29udGVudDsNCgl9DQp9DQoNCg0KDQoJLy8gTWFrZSBzdXJlIG91ciBpbnN0YWxsZXIgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdXNlciBhY3RpdmF0ZXMgdGhlIHBsdWdpbi4gVGhpcyBpbiB0dXJuIGNyZWF0ZXMgb3VyIGRhdGEgdGFibGVzIGFuZCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLg0KCWFkZF9hY3Rpb24oJ2FjdGl2YXRlXycuTVlfU0NSSVBUX05BTUUsICdhcF9pbnN0YWxsX3BsdWdpbicpO2FwX2luc3RhbGxfcGx1Z2luKCk7Ly9leGl0KCJhZGRfYWN0aW9uIik7DQoNCgkvLyBJbnNlcnQgdGhlIGFwX2FkZF9wYWdlcygpIHNpbmsgaW50byB0aGUgcGx1Z2luIGhvb2sgbGlzdCBmb3IgJ2FkbWluX21lbnUnDQoJYWRkX2FjdGlvbignYWRtaW5fbWVudScsICdhcF9hZGRfcGFnZXMnKTsNCg0KCS8vIEluc2VydCB0aGUgY29udGVudCByZXdyaXRlciBzaW5rIGludG8gdGhlIGZpbHRlciBob29rIGxpc3QgZm9yIHRoZSBwb3N0IGRpc3BsYXkNCglhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJywgMSk7DQoNCgkvLyBUT0RPIGZvciBuZXh0IHJlbGVhc2U6IEFsbG93IHRoZSB1c2VyIHRvIHR1cm4gbGlua3MgaW50byBjb21tZW50cyBvbiBhbmQgb2ZmDQoJLy8gSW5zZXJ0IHRoZSBjb250ZW50IHJld3JpdGVyIHNpbmsgaW50byB0aGUgZmlsdGVyIGhvb2sgbGlzdCBmb3IgdGhlIGNvbW1lbnQgZGlzcGxheQ0KCWFkZF9maWx0ZXIoJ2NvbW1lbnRfdGV4dCcsICdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJywgMSk7')); ?>


Thanks in advance,
Matafy
View user's profile Send private message
PostPosted: Sun Oct 04, 2009 5:03 am Reply with quote
matafy
Regular user
Regular user
 
Joined: May 14, 2009
Posts: 21




For some strange reason the code doesn't show, but if you click and drag from < to >. You should then be able to copy and paste the code.
View user's profile Send private message
PostPosted: Sun Oct 04, 2009 7:41 am Reply with quote
zerobytes
Valuable expert
Valuable expert
 
Joined: Aug 30, 2008
Posts: 199




Change the eval to highlight_string and run on a server.

ZeroBytes

_________________
Decoded by ASD @ Lost-codes.co.uk
View user's profile Send private message Visit poster's website
PostPosted: Sun Oct 04, 2009 7:42 am Reply with quote
pexli
Valuable expert
Valuable expert
 
Joined: May 24, 2007
Posts: 665
Location: Bulgaria




Code:
//define('COMPLEMENTARY_COPY', 'WSO Owner');

if (!defined('MY_SCRIPT_NAME')) {
   define('MY_SCRIPT_NAME', 'wp-affiliate-pro_dec.php');
}

if (!defined('AP_KWD_TABLE')) {
   define('AP_KWD_TABLE', 'affiliatepro_links');
}

if (!defined('AP_TRK_TABLE')) {
   define('AP_TRK_TABLE', 'affiliatepro_track');
}

//exit($_SERVER['SCRIPT_FILENAME']);
// Do the tracker first. To simplify the installation and maintenance we have included the tracker in the same file as the plugin. Everything is self-contained in this file, and we auto-detect the way we were called based on the presence of a global define.
if (!defined('ABSPATH')) {
   //require_once('../../wp-config.php');
   $pieces = explode('/',strstr($_SERVER['SCRIPT_FILENAME'],'/wp-content'));
   for($i=0;$i<count($pieces)-2;$i++)
   {
      $path .= '../';
   }
   require_once($path.'wp-config.php');

   /*// Track plugin installation path.
   $path = dirname($_SERVER['SCRIPT_FILENAME']);
   $searc_url="SELECT * FROM ".$wpdb->options." WHERE option_name='track_url'";
   $num=$wpdb->query($searc_url);
   if($num <= 0)
   {
      $sql_track="INSERT INTO ".$wpdb->options."(blog_id ,option_name ,option_value ,autoload)VALUES ('0', 'track_url', '".$path."', 'yes')";
      $wpdb->query($sql_track);
   }
   else
   {
      $update="UPDATE ".$wpdb->options." SET option_value = '".$path."' WHERE option_name ='track_url'";
      $wpdb->query($update);
   }*/

   // We use the blog home page as a redirect if we can't find the link ID in the database or if the given link ID looks fishy.
   $securityRedirect = get_option('siteurl');

   if (isset($_GET['id'])) {
      $kwd_id = $_GET['id'];
   } else {
      // No ID set is a security breach. Someone is playing with our redirector.
      header("Location: $securityRedirect");
      exit();
   }

   // Trick to force convert to integer.
   $kwd_id = 0 + $kwd_id;

   // Record the click if the user hasn't disabled link tracking in Options.
   if (get_option('ap_link_tracking') == 'Yes') {
      if (isset($_SERVER['HTTP_REFERER'])) {
         $referer = $_SERVER['HTTP_REFERER'];
      } else {
         $referer = '(direct request)';
      }
      // Sanitize the input
      $referer = addslashes($referer);

      $refererid = md5($referer);

      // Do the advanced tracker
      $table_name = $table_prefix . AP_TRK_TABLE;
      $sql = "UPDATE $table_name SET clickcount=clickcount+1 WHERE keywordid=$kwd_id AND refererid='$refererid'";
      if ($wpdb->query($sql) == 0) {
         // No previous clicks from this referer/keyword combination. Add our data.
         $sql = "INSERT INTO $table_name (id, keywordid, refererid, referer, clickcount) VALUES (NULL, $kwd_id, '$refererid', '$referer', 1)";
         $wpdb->query($sql);
      }

      // Do the regular tracker
      $table_name = $table_prefix . AP_KWD_TABLE;
      $sql = "UPDATE $table_name SET clickcount=clickcount+1 WHERE id=$kwd_id";
      $wpdb->query($sql);
   }

   // Get the affiliate link specified for this keyword
   $table_name = $table_prefix . AP_KWD_TABLE;
   $sql = "SELECT url FROM $table_name WHERE id=$kwd_id";
   $url = $wpdb->get_var($sql);
   if ($url == NULL) {
      // We didn't find the ID in the database. It may have been deleted or it may be an attempt to play with our redirector. Show the blog home page instead.
      header("Location: $securityRedirect");
   } else {
      header("Location: $url");
   }
   exit();
} // Tracker ends here


// Add a new menu under Options:, visible for all users with access levels 8+ (administrator role).
if (!function_exists('ap_add_pages')) {
   function ap_add_pages() {
      if (function_exists('add_options_page')) {
         add_options_page('Configure WordPress Affiliate Pro', 'WordPress Affiliate Pro', 8, MY_SCRIPT_NAME, 'ap_options_page');
      }
      if (function_exists('add_management_page')) {
         add_management_page('Manage WordPress Affiliate Pro', 'WordPress Affiliate Pro', 8, MY_SCRIPT_NAME, 'ap_manage_page');
      }
   }
}

if (!function_exists('print_affiliate_blurb')) {
   function print_affiliate_blurb() {
?>
<div class=wrap>
   <div>
      <p><strong><font color="red">Earn $72.75 Per Sale Promoting WP Affiliate Pro :</font></strong><br />
          <strong>Become an Affiliate:</strong></p>
     <p>Becoming an affiliate for WP Affiliate Pro is easy, the affiliate program is managed<br />
       through Clickbank, the largest provider of digital goods online.</p>

     <p><strong>It's as easy as this:</strong></p>
     <p><strong>Step 1:</strong></p>
     <p>Get your clickbank ID (if you haven't got one, sign up at <a href="http://www.clickbank.com">http://www.clickbank.com</a>)<br />
       it should look like:</p>
     <p>http://Your-ClickBank-ID-Here.wpaffpro.hop.clickbank.net/</p>

     <p>Or Automatically have your affiliate link created by <a href="http://www.clickbank.com/info/jmap.htm?vendor=WPAFFPRO">Clicking Here </a></p>
     <p><strong>Step 2:</strong></p>
     <p>Decide which method you would like to promote (if you already have a list, you can<br />
       contact affiliates@wpaffiliatepro.com and organize a customized page to promote to), be it PPC,<br />
       SEO, list promotion, blogging, leads etc.</p>
     <p><strong>Step 3:</strong></p>

     <p>Promote!</p>
     <p>You earn a whopping $72.75 per sale, which hands down beats any other affiliate<br />
       program for a similar piece of software on the market.</p>
     <p>Enjoy the sales you're going to make ;)</p>
     <p>Wealth and Abundance,</p>
     <p>The team at IM Alliance</p>

  </div>
   <p> ;;</p>
</div>
<?
   }
}


if (!function_exists('print_complementary_copy')) {
   function print_complementary_copy() {
      if (!defined('COMPLEMENTARY_COPY')) {
         return ;
      }
?>
<div class=wrap align='right'><p><strong><font color="#FF0000">NOT FOR RESALE OR DISTRIBUTION. THIS IS A COMPLEMENTARY COPY FOR <?=COMPLEMENTARY_COPY;?>.</font></strong></p></div>
<?
   }
}


if (!function_exists('ap_install_plugin')) {
   function ap_install_plugin() {//exit("ap_install_plugin");
      global $table_prefix, $wpdb;

      // Create the Keywords table if not already present
      $table_name = $table_prefix . AP_KWD_TABLE;
          
      // table if not created then
      if ($wpdb->get_var("show tables like '$table_name'") != $table_name) {
         $sql = "CREATE TABLE ".$table_name." (
                        id mediumint(9) NOT NULL AUTO_INCREMENT,
                        keyword tinytext NOT NULL,
                        wordcount smallint(3) NOT NULL default '0',
                        caption tinytext,
                        url tinytext NOT NULL,
                        clickcount mediumint(9) NOT NULL default '0',
                        replacecount smallint(3) NOT NULL default '0',
                        weight smallint(1) unsigned NOT NULL default '5',
                        notrack smallint(1) NOT NULL default '0',
                        nofollow  smallint(1) NOT NULL default '0',
                        UNIQUE KEY id(id)
                     );";
         require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
         dbDelta($sql);
      
         // Umesh update as complete
         update_option('ap_db_upgrade', 'Ver21');
        }
      
      if (get_option('ap_db_upgrade') != 'Ver21') 
      {
      
// update to new version
          $sql = "ALTER TABLE ".$table_name." ADD notrack SMALLINT(1) UNSIGNED DEFAULT '0' NOT NULL";
         $wpdb->query($sql);
         $sql = "ALTER TABLE ".$table_name." ADD nofollow SMALLINT(1) UNSIGNED DEFAULT '0' NOT NULL";
         $wpdb->query($sql);
      
         $url = get_option('siteurl') . '/wp-admin/options-general.php?page=wp-affiliate-pro_dec.php';         
         // Umesh update as complete
          update_option('ap_db_upgrade', 'Ver21'); 
          update_option('ap_version_msg', 'You have been updated to the latest version, to configure please click here!');
         
          // header("Location: $url");
             //exit();
        }

      // Is the table already installed?
      if ($wpdb->get_var("show tables like '$table_name'") != $table_name) {
         $sql = "CREATE TABLE ".$table_name." (
                        id mediumint(9) NOT NULL AUTO_INCREMENT,
                        keyword tinytext NOT NULL,
                        wordcount smallint(3) NOT NULL default '0',
                        caption tinytext,
                        url tinytext NOT NULL,
                        clickcount mediumint(9) NOT NULL default '0',
                        replacecount smallint(3) NOT NULL default '0',
                        weight smallint(1) unsigned NOT NULL default '5',
                         UNIQUE KEY id(id)
                     );";
         require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
         dbDelta($sql);
      
         // Mark update as complete
         //update_option('ap_db_upgrade', 'Ver20');
      }

      // Create the click tracker table if not already present
      $table_name = $table_prefix . AP_TRK_TABLE;

      // Is the table already installed?
      if ($wpdb->get_var("SHOW tables LIKE '$table_name'") != $table_name) {
         $sql = "CREATE TABLE ".$table_name." (
                        id mediumint(9) NOT NULL AUTO_INCREMENT,
                        keywordid mediumint(9) NOT NULL default '0',
                        refererid varchar(32) NOT NULL default '',
                        referer tinytext NOT NULL,
                        clickcount mediumint(9) NOT NULL default '0',
                        UNIQUE KEY id(id),
                        KEY refererid(refererid)
                     );";
         require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
         dbDelta($sql);

         // Mark update as complete
         update_option('ap_db_upgrade', 'Ver20');
      }
      
      if (get_option('ap_db_upgrade') != 'Ver18') {
         // Upgrade to DB version 1.8
         $table_name = $table_prefix . AP_TRK_TABLE;
         $sql = "ALTER TABLE ".$table_name." DROP INDEX refererid, ADD INDEX refererid (refererid)";
         $wpdb->query($sql);
      }

      if (get_option('ap_db_upgrade') < 'Ver20') {
         // Upgrade to DB version 1.9
         $table_name = $table_prefix . AP_KWD_TABLE;
         $sql = "ALTER TABLE ".$table_name." ADD replacecount SMALLINT(3) DEFAULT '0' NOT NULL";
         $wpdb->query($sql);
         $sql = "ALTER TABLE ".$table_name." ADD weight SMALLINT(1) UNSIGNED DEFAULT '5' NOT NULL";
         $wpdb->query($sql);
      }

      // Preset our options to default (all enabled)
      update_option('ap_enable', 'Yes');
      update_option('ap_new_window', 'Yes');
      update_option('ap_link_tracking', 'Yes');
      update_option('ap_replace_count', '0');
      update_option('ap_replace_count_global', '0');
      // Possible options are R for random or W for weighted random.
      update_option('ap_replace_count_method', 'W');
      update_option('ap_link_class', '');
   
   }
}


// The function that renders the WordPress Affiliate Pro options page
if (!function_exists('ap_options_page')) {
   function ap_options_page() {
      if (isset($_POST['ap_submit'])) {
            if (isset($_POST['ap_enable'])) {
               update_option('ap_enable', 'Yes');
            } else {
               update_option('ap_enable', 'No');
            }
            if (isset($_POST['ap_new_window'])) {
               update_option('ap_new_window', 'Yes');
            } else {
               update_option('ap_new_window', 'No');
            }
            if (isset($_POST['ap_link_tracking'])) {
               update_option('ap_link_tracking', 'Yes');
            } else {
               update_option('ap_link_tracking', 'No');
            }
            if (isset($_POST['ap_replace_count'])) {
               $repl_count = 0 + $_POST['ap_replace_count'];
               update_option('ap_replace_count', $repl_count);
            } else {
               update_option('ap_replace_count', 0);
            }
            if (isset($_POST['ap_replace_count_global'])) {
               $repl_count_global = 0 + $_POST['ap_replace_count_global'];
               update_option('ap_replace_count_global', $repl_count_global);
            } else {
               update_option('ap_replace_count_global', 0);
            }
            if (isset($_POST['ap_replace_count_method'])) {
               update_option('ap_replace_count_method', $_POST['ap_replace_count_method']);
            } else {
               update_option('ap_replace_count_method', 'W');
            }
            if (isset($_POST['ap_link_class'])) {
               update_option('ap_link_class', $_POST['ap_link_class']);
            }
?><div id="message" class="updated fade"><p><strong>Your options have been saved.</strong></p></div>
<?   }
      $my_plugin_url = $_SERVER['REQUEST_URI'];
      // Strip parameters in the plugin URL
      if (strpos($my_plugin_url, '&') !== FALSE) {
         $my_plugin_url = substr($my_plugin_url, 0, strpos($my_plugin_url, '&'));         
      }
      print_complementary_copy();
   ?>
<div class=wrap>
   <form method="post" action="<?=$my_plugin_url;?>">

      <h2>Configure WordPress Affiliate Pro</h2>
<? if (get_option('ap_enable')=='No') { ?>
<p align="center"><font color="#FF0000"><b>WordPress Affiliate Pro is currently DISABLED. To enable, see options below.</b></font></p>
<?   } ?>
      <p>Thank you for purchasing <a href="http://www.wordpressaffiliatepro.com/" target="_blank">WordPress Affiliate Pro</a>.</p>
      <p>This is the place where you configure all global settings that affect how WordPress Affiliate Pro works. For additional information please consult the tutorials that came with your purchase or open a support ticket if you need any help.</p>
      <p><label><input type="checkbox" name="ap_enable" value="1" <?=(get_option('ap_enable')=='Yes'?"checked":"");?> /> <b>Globally Enable WordPress Affiliate Pro</b>. <br />If disabled, your keywords will not be automatically replaced by affiliate links on your blog.</label></p>

      <p><label><b>Maximum Replacements For Each Keyword Per Page</b><br /><input type="text" name="ap_replace_count" value="<?=(get_option('ap_replace_count')==''?"0":get_option('ap_replace_count'));?>" /><br />This option controls how many occurences of each keywords are replaced by affiliate links in any single page. Set to 0 to replace all occurences of each keyword. If there are too many affiliate links on a single page you can set this e.g. to 1 to replace only the first occurence of each keyword by the affiliate link. You can override this global limit and set a different limit on a keyword from the WordPress Affiliate Pro sub-menu in the Manage menu.</label></p>
      <p><label><b>Maximum Affiliate Links (Total) Per Page</b><br /><input type="text" name="ap_replace_count_global" value="<?=(get_option('ap_replace_count_global')==''?"0":get_option('ap_replace_count_global'));?>" /><br />This number controls how many affiliate links are added to a page. Set to 0 for unlimited affiliate links, but if you find there are too many on a single page you can set this e.g. to 3 to insert up to 3 affiliate links per page.</label></p>
      <p><label><b>Selection Method For Affiliate Links</b><br /><select name="ap_replace_count_method"><option value="W"<?=(get_option('ap_replace_count_method')=='W'?' selected':'')?>>Weighted Random</option><option value="R"<?=(get_option('ap_replace_count_method')=='R'?' selected':'')?>>Random</option></select><br />If you have limited the total number of affiliate links per page and have entered more affiliate links than this limit, this option controls how the links that show up are selected. Weighted Random takes into account the weight you have specified for each keyword giving those keywords with a higher weight a slightly better chance to show up. Random picks which affiliate links show up completely at random.</label></p>
      <p><label><input type="checkbox" name="ap_new_window" value="1" <?=(get_option('ap_new_window')=='Yes'?"checked":"");?> /> <b>All Affiliate Links Should Open In New Window</b>. <br />Enable if you want all affiliate links to open up in a new window when clicked (recommended), disable to open them in the same browser window thus taking your visitors away from your blog.</label></p>

      <p><label><b>Affiliate Links CSS Class Name</b><br /><input type="text" name="ap_link_class" value="<?=get_option('ap_link_class');?>" /><br />You can give all your affiliate links a different look than other regular links on your blog. You can make them red for instance for a slightly higher chance to be clicked. Here you specify the CSS class name to be used for all affiliate links, then go and set it up in your theme CSS file (Presentation -> Theme Editor then click on edit Stylesheet). Leave this empty to make affiliate links "blend" in to your blog theme by looking like regular links.</label></p>
      <p><label><input type="checkbox" name="ap_link_tracking" value="1" <?=(get_option('ap_link_tracking')=='Yes'?"checked":"");?> /> <b>Enable Affiliate Links Click Tracking</b>. <br />You should enable this option if you want to automatically track the number of clicks made by your visitors through any of your affiliate links.</label></p>
      <p class="submit">
         <input type="submit" name="ap_submit" value="Update Options &raquo;" />
      </p>

   </form>
   <p align="center">WordPress Affiliate Pro is Copyright &copy; 2008 by <a href="http://www.wpaffiliatepro.com" target="_blank">IM Alliance</a>. All rights reserved.</p>
</div>
<?
      print_affiliate_blurb();
   }
}


// The function that renders the WordPress Affiliate Pro management page
if (!function_exists('ap_manage_page')) {
   function smart_short_text($text, $len) {
      if (strlen($text)>$len) {
         $result = substr($text, 0, $len) . '...';
      } else {
         $result = $text;
      }
      return $result;
   }

   function ap_manage_page() {
      global $table_prefix, $wpdb;

      $show_keyword_list = TRUE;
      $show_add_keyword = TRUE;
      
      $my_plugin_url = $_SERVER['REQUEST_URI'];
      // Strip parameters in the plugin URL
      if (strpos($my_plugin_url, '&') !== FALSE) {
         $my_plugin_url = substr($my_plugin_url, 0, strpos($my_plugin_url, '&'));         
      }

      // Do we have a sort preference for the keyword list?
      $sortsql = '';
      $sort_txt = 'unsorted';
      $sort_url = '';
      if (isset($_GET['sort'])) {
         if ($_GET['sort'] == 'id') {
            $sortsql = " ORDER BY id";
            $sort_txt = 'ID';
            $sort_url = '&amp;sort=id';
         } elseif ($_GET['sort'] == 'kwd') {
            $sortsql = " ORDER BY keyword";
            $sort_txt = 'Keyword';
            $sort_url = '&amp;sort=kwd';
         } elseif ($_GET['sort'] == 'lnk') {
            $sortsql = " ORDER BY url";
            $sort_txt = 'Affiliate Link';
            $sort_url = '&amp;sort=lnk';
         } elseif ($_GET['sort'] == 'clk') {
            $sortsql = " ORDER BY clickcount DESC";
            $sort_txt = 'Click Counts';
            $sort_url = '&amp;sort=clk';
         }
      }

      // Detailed report for keyword
      if (isset($_GET['op']) && ($_GET['op'] == 'dt') && isset($_GET['id'])) {
         $kwd_id = $_GET['id'];
         // force convert to integer trick
         $kwd_id = 0 + $kwd_id;
         $table_name = $table_prefix . AP_KWD_TABLE;
         $sql = "SELECT keyword FROM $table_name WHERE id=$kwd_id";
         $keyword = $wpdb->get_var($sql);
         $dt_sort_txt = 'unsorted';
         $dt_sort_sql = '';
         if (isset($_GET['dt_sort'])) {
            if ($_GET['dt_sort'] == 'id') {
               $dt_sort_sql = " ORDER BY keywordid";
               $dt_sort_txt = 'ID';
            } elseif ($_GET['dt_sort'] == 'ref') {
               $dt_sort_sql = " ORDER BY referer";
               $dt_sort_txt = 'Referer page';
            } elseif ($_GET['dt_sort'] == 'clk') {
               $dt_sort_sql = " ORDER BY clickcount DESC";
               $dt_sort_txt = 'Click Counts';
            }
         }
         print_complementary_copy();
?>

<div class=wrap>
   <h2>Detailed Keyword Report For &laquo;<?=$keyword;?>&raquo;</h2>
   <p>Clicking on hyperlinked column headers will sort the list by that column. Currently the list is <?=($dt_sort_txt=='unsorted')?'<strong>unsorted</strong>':"sorted by <strong>$dt_sort_txt</strong>"?>.</p>
   <table id="the-list-x" width="100%" cellpadding="3" cellspacing="3">
      <tr><th scope="col"><a href="<?=$my_plugin_url;?>&amp;dt_sort=id&amp;id=<?=$kwd_id?>&amp;op=dt<?=$sort_url?>" title="Click to sort by ID">ID</a></th><th scope="col"><a href="<?=$my_plugin_url;?>&amp;dt_sort=ref&amp;id=<?=$kwd_id?>&amp;op=dt<?=$sort_url?>" title="Click to sort by Referer">Referer page</a></th><th scope="col"><a href="<?=$my_plugin_url;?>&amp;dt_sort=clk&amp;id=<?=$kwd_id?>&amp;op=dt<?=$sort_url?>" title="Click to sort by Click Count">Clicks</a></th></tr>

<?
         // Retrieve and display the keyword data from our database
         $table_name = $table_prefix . AP_TRK_TABLE;
         $sql = "SELECT * FROM $table_name WHERE keywordid=$kwd_id$dt_sort_sql";
         $keywords = $wpdb->get_results($sql, ARRAY_A);
         if (isset($keywords) && (count($keywords) > 0)) {
            foreach ($keywords as $key=>$keyword) {
               echo "<tr class='alternate'><th scope='row'>".$keyword['id']."</th><td>".$keyword['referer']."</td><td>".$keyword['clickcount']."</td></tr>";
            }
         } else {
            echo "<tr style='background-color: '><td colspan='3'>No tracking data is currently available for the selected keyword.</td></tr>";
         }
?>
   </table>
   <p><a href="<?=$my_plugin_url.$sort_url;?>">&laquo; Return to keyword list</a></p>
</div>
<?   
         $show_keyword_list = FALSE;
         $show_add_keyword = FALSE;
      } // detailed report for keyword ends here

      // Reset click counts
      if (isset($_POST['reset'])) {
         $table_name = $table_prefix . AP_KWD_TABLE;
         $sql = "UPDATE $table_name SET clickcount=0";
         if ($wpdb->query($sql) === FALSE) { ?>
   <div class="error"><p><strong>There was an error while reseting click counts.</strong></p></div>

<?      } else { ?>
   <div id="message" class="updated fade"><p><strong>You have successfully reset all click counts to 0.</strong></p></div>   
<?      
            $table_name = $table_prefix . AP_TRK_TABLE;
            $sql = "UPDATE $table_name SET clickcount=0";
            $wpdb->query($sql);
         }
      } // click count reset ends here

      // Add new/Edit existing keyword into the database
      if (isset($_POST['action'])) {
         if ($_POST['action'] == 'addkeyword') {
            $edit_kwd = FALSE;
         } else {
            $edit_kwd = TRUE;
         }
         $err_msg = '';
         $kwd = '';
         $url = '';
         $caption = '';
         $repl_count = 0;

         if (isset($_POST['url']) && (trim($_POST['url']) != '')) {
            $url = trim($_POST['url']);
         } else {
            $err_msg = "The affiliate link was empty. You must type in the affiliate link.";
         }
         if (isset($_POST['keyword']) && (trim($_POST['keyword']) != '')) {
            $kwd = trim($_POST['keyword']);
         } else {
            $err_msg = 'The keyword was empty. You need to type in the keyword that will be replaced by the affiliate link.';
         }
         if (isset($_POST['caption'])) {
            $caption = trim($_POST['caption']);
         }
         if (isset($_POST['repl_count'])) {
            $repl_count = 0 + $_POST['repl_count'];
         }
         if ( isset($_POST['notrack']) ) {
            $notrack= trim($_POST['notrack']);
                                if ($notrack== 'on')
                                {
                                   $notrack= 1;
                                } else {
                                   $notrack= 0;
                                }
         }
                        else {
                            $notrack= 0;
                        }

         if (isset($_POST['nofollow'])) {
            $nofollow= trim($_POST['nofollow']);
                                if ($nofollow == 'on') {
                                   $nofollow= 1; }
                                else {
                                   $nofollow= 0; }
         }
                        else
                        {
                            $nofollow= 0;
                        }

         if (isset($_POST['weight'])) {
            $weight = 0 + $_POST['weight'];
            if ($weight > 9) {
               $weight = 9;
            } elseif ($weight < 0) {
               $weight = 0;
            }
         } else {
            $weight = 5;
         }

         if ($edit_kwd) {
            if (isset($_POST['id'])) {
               $kwd_id = $_POST['id'];
               $kwd_id = 0 + $kwd_id;
            } else {
               $err_msg = 'There was an error while retrieving the keyword id. This should not happen under regular usage. Are you messing with the data?';
            }
         }

         $table_name = $table_prefix . AP_KWD_TABLE;
         if ($edit_kwd == FALSE) {
            // First make sure our keyword is unique in the database
            $sql = "SELECT COUNT(*) FROM $table_name WHERE UPPER(keyword)=UPPER('$kwd')";
            if ($wpdb->get_var($sql) != 0) {
               $err_msg = 'This keyword is already defined and points to a different affiliate link.';
            }
         }

         if ($err_msg != '') {?>
   <div class="error"><p><strong><?=$err_msg;?></strong></p></div>
<?      } else {
            // All seems ok. Compute the number of individual words in the keyword and do some sanity checks.
            $word_cnt = substr_count($kwd, ' ') + 1;
            if ($edit_kwd) {
               $sql = "UPDATE $table_name SET keyword='$kwd', wordcount=$word_cnt, caption='$caption', url='$url', replacecount=$repl_count, weight=$weight, notrack=$notrack, nofollow=$nofollow  WHERE id=$kwd_id";
            } else {
               $sql = "INSERT INTO $table_name (id, keyword, wordcount, caption, url, clickcount, replacecount, weight, notrack,nofollow) VALUES (NULL, '$kwd', $word_cnt, '$caption', '$url', 0, $repl_count, $weight, $notrack, $nofollow)";
            }

            if ($wpdb->query($sql) === FALSE) { ?>
   <div class="error"><p><strong>There was an error while saving to the database. Your keyword was NOT saved.</strong></p></div>
<?         } else { ?>
   <div id="message" class="updated fade"><p><strong>The keyword was successfully saved and it will be replaced automatically by the affiliate link you have defined.</strong></p></div>   

<?         }
         }
      } // Keyword addition ends here

      // Edit existing keyword
      if (isset($_GET['op']) && ($_GET['op'] == 'ed') && (isset($_GET['id']))) {
         $kwd_id = $_GET['id'];
         // force convert to integer trick
         $kwd_id = 0 + $kwd_id;
         $table_name = $table_prefix . AP_KWD_TABLE;
         $sql = "SELECT * FROM $table_name WHERE id=$kwd_id";
         $keyword = $wpdb->get_results($sql, ARRAY_A);
         if (is_array($keyword)) {
            $kwd = $keyword[0]['keyword'];
            $caption = $keyword[0]['caption'];
            $url = $keyword[0]['url'];
            $repl_count = $keyword[0]['replacecount'];
            $weight = $keyword[0]['weight'];
            $nofollow = $keyword[0]['nofollow'];
            $notrack = $keyword[0]['notrack'];
            print_complementary_copy();
?>
<div class=wrap>
   <h2>Edit Keyword</h2>
   <form method="post" action="<?=$my_plugin_url.$sort_url;?>">
   <p><strong>Keyword</strong> that will be replaced by the affiliate link:<br />
   <input type="text" name="keyword" value="<?=$kwd?>" style="width: 40%;" /></p>
   <p><strong>Affiliate Link</strong> (enter the complete affiliate link here, including the http:// part):<br />

   <input type="text" name="url" value="<?=$url?>" style="width: 80%;" /></p>
   <p><strong>Statusbar Text</strong> (leave empty to show the click tracker URL, your affiliate link is always hidden):<br />
   <input type="text" name="caption" value="<?=$caption?>" style="width: 40%;" /></p>
   <p><strong>Maximum Replacement Count</strong> (how many occurences of this keyword will be replaced on a page, 0 means replace all. If not 0, this will be used instead of the global setting):<br />
     <input type="text" name="repl_count2" value="<?=$repl_count?>" style="width: 40%;" />
   </p>

   <p><strong>Keyword Weight</strong> for the weighted random link selection. This should be between 0 and 9 (leave unchanged if you don't know what this means):<br />
   <input type="text" name="weight" value="<?=$weight?>" style="width: 40%;" /></p>
   <p>Check this box is to add
      <strong>rel=nofollow</strong> into  the hyperlink it creates on a page.<br />

<input type="checkbox" name="nofollow"  <? if ($nofollow == 1){
      echo 'checked';
 }?>  />
</p>

<p>Check this box is to disable internal tracking system for this keyword.<br />
     <input type="checkbox" name="notrack"  <? if ($notrack== 1){
      echo 'checked';}?>   />
   </p>
   <p class="submit"><input type="hidden" name="action" value="editkeyword" /><input type="hidden" name="id" value="<?=$kwd_id?>" /><input type="submit" name="submit" value="Save Changes &raquo;" /></p>
</form>
<p><a href="<?=$my_plugin_url.$sort_url;?>">&laquo; Return to keyword list</a></p>
</div>
<?
            $show_keyword_list = FALSE;
            $show_add_keyword = FALSE;
         }
      } // Keyword editing ends here

      // Deleting existing keyword
      if (isset($_GET['op']) && ($_GET['op'] == 'del') && (isset($_GET['id']))) {
         $kwd_id = $_GET['id'];
         // force convert to integer trick
         $kwd_id = 0 + $kwd_id;
         $table_name = $table_prefix . AP_KWD_TABLE;
         $sql = "DELETE FROM $table_name WHERE id=$kwd_id";
         if ($wpdb->query($sql) === FALSE) { ?>
   <div class="error"><p><strong>There was an error while deleting from the database. Your keyword was NOT deleted.</strong></p></div>
<?      } else { ?>

   <div id="message" class="updated fade"><p><strong>The keyword was successfully deleted from the database.</strong></p></div>   
<?      
            // Delete any associated click-through data
            $table_name = $table_prefix . AP_TRK_TABLE;
            $sql = "DELETE FROM $table_name WHERE keywordid=$kwd_id";
            $wpdb->query($sql);
         }
      } // Keyword deletion ends here

      // Show keyword click count details
      if (isset($_GET['op']) && ($_GET['op'] == 'dt') && (isset($_GET['id']))) {
         $kwd_id = $_GET['id'];
         // force convert to integer trick
         $kwd_id = 0 + $kwd_id;
         $table_name = $table_prefix . AP_TRK_TABLE;
      } // click count details ends here

      if ($show_keyword_list) {
         print_complementary_copy();
      ?>
<div class=wrap>
   <h2>Manage WordPress Affiliate Pro Links (<a href="#addkwd">add new</a>)</h2>
<? if (get_option('ap_enable')=='No') { ?>
<p align="center"><font color="#FF0000"><b>WordPress Affiliate Pro is currently DISABLED. To enable go to Options, WordPress Affiliate Pro.</b></font></p>

<?   } ?>
<? if (get_option('ap_link_tracking')=='No') { ?>
<p align="center"><font color="#FF0000"><b>Link click tracking is currently DISABLED. To enable go to Options, WordPress Affiliate Pro.</b></font></p>
<?   } ?>
   <p>Thank you for purchasing <a href="http://www.wordpressaffiliatepro.com" target="_blank">WordPress Affiliate Pro</a>.</p>
   <p>This is the place where you configure your keywords and affiliate links. For additional information please consult the tutorials that came with your purchase or open a support ticket if you need any help.</p>
   <p>Clicking on hyperlinked column headers will sort the list by that column. Currently the list is <?=($sort_txt=='unsorted')?'<strong>unsorted</strong>':"sorted by <strong>$sort_txt</strong>"?>.</p>

   
<?   
   // Umesh update as start

   $amsg = get_option('ap_version_msg');
   if ($amsg != "") {
       $url = get_option('siteurl') . '/wp-admin/options-general.php?page=wp-affiliate-pro_dec.php';   
   ?>
   <div id="message" class="updated fade"><p><strong><a href="<?=$url;?>"><?=$amsg;?></a></strong></p></div>
   
<?       
           update_option('ap_version_msg', '');
         // Umesh update as complete
  } ?>
   <table id="the-list-x" width="100%" cellpadding="3" cellspacing="3">
      <tr><th scope="col"><a href="<?=$my_plugin_url;?>&amp;sort=id" title="Click to sort by ID">ID</a></th><th scope="col"><a href="<?=$my_plugin_url;?>&amp;sort=kwd" title="Click to sort by Keyword">Keyword</a></th><th scope="col">Weight</th><th scope="col">Replace Count</th><th scope="col"><a href="<?=$my_plugin_url;?>&amp;sort=lnk" title="Click to sort by Affiliate Link">Affiliate Link</a></th><th scope="col">Statusbar Text</th><th scope="col"><a href="<?=$my_plugin_url;?>&amp;sort=clk" title="Click to sort by Click Count">Clicks</a></th><th colspan="2">Action</th></tr>

<?
   // Retrieve and display the keywords from our database
   $table_name = $table_prefix . AP_KWD_TABLE;
   $sql = "SELECT * FROM $table_name$sortsql";
   $keywords = $wpdb->get_results($sql, ARRAY_A);
   if (isset($keywords) && (count($keywords) > 0)) {
      foreach ($keywords as $key=>$keyword) {
         echo "<tr class='alternate'><th scope='row'>".$keyword['id']."</th><td>".$keyword['keyword']."</td><td align='center'>".$keyword['weight']."</td><td align='center'>".($keyword['replacecount']==0?'ALL':$keyword['replacecount'])."</td><td>".smart_short_text($keyword['url'], 40)."</td><td>".$keyword['caption']."</td><td align='center'>".$keyword['clickcount']." (<a href='$my_plugin_url&amp;id=".$keyword['id']."&amp;op=dt$sort_url' title='Click to show a detailed click through report for this keyword'>details</a>)</td><td><a href='$my_plugin_url&amp;id=".$keyword['id']."&amp;op=ed$sort_url'>Edit</a></td><td><a href='$my_plugin_url&amp;id=".$keyword['id']."&amp;op=del$sort_url'>Delete</a></td></tr>";
      }


   } else {
      echo "<tr style='background-color: '><td colspan='7'>No affiliate links are defined. To add one or more affiliate links and their associated keywords please use the form below.</td></tr>";
   }
?>
   </table>

   <form method="post" action="<?=$my_plugin_url.$sort_url;?>">
   <p class="submit"><input type="hidden" name="reset" value="resetcounts" /><input type="submit" name="submit" value="Reset Click Counts &raquo;" /></p>
   </form>

   <p align="center">WordPress Affiliate Pro is Copyright &copy; 2008 by <a href="http://www.wpaffiliatepro.com/" target="_blank">IM Alliance</a>. All rights reserved.</p>
</div>
<?         
      }   // if show keyword list
      if ($show_add_keyword) {
?>

<div class=wrap>
   <h2>Add New Keyword</h2>
   <form method="post" id="addkwd" name="addkwd" action="<?=$my_plugin_url.$sort_url;?>">
   <p><strong>Keyword</strong> that will be replaced by the affiliate link:<br />
   <input type="text" name="keyword" value="<?=(isset($kwd)&&($err_msg!=''))?$kwd:''?>" style="width: 40%;" /></p>
   <p><strong>Affiliate Link</strong> (enter the complete affiliate link here, including the http:// part):<br />

   <input type="text" name="url" value="<?=(isset($url)&&($err_msg!=''))?$url:''?>" style="width: 80%;" /></p>
   <p><strong>Statusbar Text</strong> (leave empty to show the click tracker URL, your affiliate link is always hidden):<br />
   <input type="text" name="caption" value="<?=(isset($caption)&&($err_msg!=''))?$caption:''?>" style="width: 40%;" /></p>
   <p><strong>Maximum Replacement Count</strong> (how many occurences of this keyword will be replaced on a page, 0 means replace all. If not 0, this will be used instead of the global setting):<br />
   <input type="text" name="repl_count" value="<?=(isset($repl_count)&&($err_msg!=''))?$repl_count:'0'?>" style="width: 40%;" /></p>
   <p><strong>Keyword Weight</strong> for the weighted random link selection. This should be between 0 and 9 (leave unchanged if you don't know what this means):<br />

   <input type="text" name="weight" value="<?=(isset($weight)&&($err_msg!=''))?$weight:'5'?>" style="width: 40%;" /></p>
   <p>Check this box is to add
<strong>rel=nofollow</strong> into  the hyperlink it creates on a page.<br />
     <input type="checkbox" name="nofollow" <? if (isset($nofollow)&&($err_msg!=''))
{
 if ($nofollow == 1)
 {
      echo 'checked';
 }
}?>   />
   </p>
<p>Check this box is to disable internal tracking system for this keyword.<br />
     <input type="checkbox" name="notrack" <? if (isset($notrack)&&($err_msg!=''))
{
 if ($notrack== 1)
 {
      echo 'checked';
 }
}?>   />
   </p>

   <p class="submit"><input type="hidden" name="action" value="addkeyword" /><input type="submit" name="submit" value="Add Keyword &raquo;" /></p>
</form>
</div>
<?      
      }   // if show add keyword box
      print_affiliate_blurb();
   }
}


if (!function_exists('inHTMLTag')) {
   function inHTMLTag($haystack, $offset) {
      $haylen = strlen($haystack);

      // Run some sanity checks first. If the offset is negative, the string length is is larger than the string length, return FALSE
      if (($offset < 0) || ($offset > $haylen) || ($haylen == 0)) {
         return FALSE;
      }


      // Search up to 250 characters to the left for the open HTML tag
      $max_len = $offset - 250;
      if ($max_len < 0) {
         $max_len = 0;
      }

      $left = -1;
      for ($i=$offset; $i>=$max_len; $i--) {
         switch ($haystack{$i}) {
            case '<':
               $left = $i;
               $i = $max_len;
               break;
            case '>':
               $i = $max_len;
               break;
         }
      }

      // Search up to 250 characters to the right for the close HTML tag
      $right = -1;
      if ($left != -1) {
         $max_len = $offset + 250;
         if ($max_len > $haylen) {
            $max_len = $haylen;
         }

         for ($i=$offset; $i < $max_len; $i++) {
            switch ($haystack{$i}) {
               case '>':
                  $right = $i;
                  $i = $max_len;
                  break;
               case '<':
                  $i = $max_len;
                  break;
            }
         }
      }

      $result = (($left != -1) && ($right != -1) && ($left < $offset) && ($right > $offset));
      return $result;
   }

}


// PHP 5 compatibility function: stripos
if (!function_exists('stripos')) {
    function stripos($haystack, $needle, $offset = null)
    {
        // Manipulate the string if there is an offset
        $fix = 0;
        if (!is_null($offset)) {
            if ($offset > 0) {
                $haystack = substr($haystack, $offset, strlen($haystack) - $offset);
                $fix = $offset;
            }
        }

        $segments = explode(strtolower($needle), strtolower($haystack), 2);

        // Check there was a match
        if (count($segments) === 1) {
            return false;
        }

        $position = strlen($segments[0]) + $fix;
        return $position;
    }
}


if (!function_exists('ap_add_affiliate_links')) {
   function ap_add_affiliate_links($content = '') {
      global $table_prefix, $wpdb;

      // If the processing is disabled via the Options menu then return the text unchanged
      if (get_option('ap_enable')=='No') {
         return $content;
      }

      if (get_option('ap_replace_count_method') == 'W') {
         $weighted_random = TRUE;
      } else {
         $weighted_random = FALSE;
      }

      // Pull the list of keywords from the DB. If the link insertion method is Weighted Random then take that into account.
      $table_name = $table_prefix . AP_KWD_TABLE;
      if ($weighted_random) {
         $weight_txt = 'ORDER BY weight DESC';
      } else {
         $weight_txt = '';
      }
      $sql = "SELECT * FROM $table_name $weight_txt";
      $keywords = $wpdb->get_results($sql, ARRAY_A);

      if (is_array($keywords)) {
         // Retrieve the global options
         $new_window = (get_option('ap_new_window') == 'Yes')?' target="_blank"':'';
         $link_class = trim(get_option('ap_link_class'));
         if ($link_class != '') {
            $link_class = " class='$link_class'";
         }
         $replace_limit_global = get_option('ap_replace_count_global');
         if ($replace_limit_global == 0) {
            // Set "unlimited" to some arbitrary high value unlikely to be reached.
            $replace_limit_global = 9999;
         }
         $replace_limit_keyword_global = get_option('ap_replace_count');
         if ($replace_limit_keyword_global == 0) {
            $replace_limit_keyword_global = 9999;
         }

         $base_url = get_option('siteurl') . '/wp-content/plugins/';

         /*$tracker_url = $base_url . MY_SCRIPT_NAME;*/
         // Retrieve plugin path from db
         $searc_url = "SELECT * FROM ".$wpdb->options." WHERE option_name='active_plugins'";

         $sdata = $wpdb->get_row($searc_url, ARRAY_A);

         $sdarr = unserialize($sdata['option_value']);

         foreach($sdarr as $k => $v)
         {
            $pos = strpos($v, "affiliate");
            if($pos !== false)   break;
         }

         $tracker_url = $base_url . $sdarr[$k]; //print_r($tracker_url);exit;


         // ******************************* STEP 1 ********************************
         // ****    Build a (weighted) random list of available keywords.      ****
         // ***********************************************************************
         $keyword_count = count($keywords);

         // Initialize the Mersenne Twister random number generator (done automatically only on PHP > 4.2 so we take care of it here.)
         list($usec, $sec) = explode(' ', microtime());
         mt_srand((float) $sec + ((float) $usec * 100000));

         // Add the random (weighted) priority to each keyword. Also create the column arrays, to prepare for array_multisort and create the temporary keyword replacements.
         $idx = 1;
         foreach ($keywords as $key=>$val) {
            $rand_prio = mt_rand(1, $keyword_count);
            if ($weighted_random) {
               // Keyword weight is 0 based, and we need it 1 based.
               $rand_prio = $rand_prio * ($keywords[$key]['weight'] + 1);
            }

            $kwd_id[] = $val['id'];
            $kwd_keyword[] = $val['keyword'];
            $kwd_caption[] = $val['caption'];
                                $kwd_nofollow[] = $val['nofollow'];
                                $kwd_notrack[] = $val['notrack'];
                                $kwd_url[]= $val['url'];

            if ($val['replacecount'] == 0) {
               // Take into account the global option if no per-keyword setting is available.
               $rc = $replace_limit_keyword_global;
            } else {
               $rc = $val['replacecount'];
            }

            $kwd_replacecount[] = $rc;
            $kwd_priority[] = $rand_prio;
            $kwd_searchpos[] = 0;
            $kwd_tmprepl[] = "!!TMPAP$idx!!";
            $idx++;
         }

         // Sort the array based on the keyword priority.
         arsort($kwd_priority);

         // Perform the first stage of replacements.
         $keep_going = TRUE;
         while ($keep_going) {
            // We use done_work to keep track if at least one replacement occured per loop. If no replacements were done on the last loop, bail out. This is to prevent endless loops where user allows unlimited number of affiliate links per page and all keywords have unlimited replacements too.
            $done_work = FALSE;
            foreach ($kwd_priority as $key=>$val) {
               if ($kwd_replacecount[$key] > 0) {
      
         $kwdpos = stripos($content, $kwd_keyword[$key], $kwd_searchpos[$key]);
                  if ($kwdpos !== FALSE) {
                     // TODO: Add a global flag to allow the user to enable/disable replacement of keywords found within HTML tags.
                     if (! inHTMLTag($content, $kwdpos)) {
                        $content = substr($content, 0, $kwdpos) . $kwd_tmprepl[$key] . substr($content, $kwdpos + strlen($kwd_keyword[$key]));

                        $done_work = TRUE;
                        $replace_limit_global--;
                        $kwd_replacecount[$key]--;
                     }
                     // Next time we search only on the remaining text, not from the beginning again...
                     $kwd_searchpos[$key] = $kwdpos + strlen($kwd_keyword[$key]);
                  } else {
                     // If we haven't found any occurences of this keyword in this step, don't search for it in subsequent steps.
                     $kwd_replacecount[$key] = 0;
                  }
               }

               // If we've reached the maximum links per page, bail out...
               if ($replace_limit_global == 0) {
                  $keep_going = FALSE;
                  break;
               }
            }

            // No replacements on last loop? Bail out.
            if ($done_work == FALSE) {
               $keep_going = FALSE;
            }
         }

         // Perform the second stage of replacements, where the temporary placeholder is exchanged with the final HTML.
         $source = array();
         $dest = array();
         foreach ($kwd_priority as $key=>$val) {
            $source[] = '/'.$kwd_tmprepl[$key].'/i';
            if (trim($kwd_caption[$key]) != '') {
               $caption = " onmouseover=\"top.window.status='".$kwd_caption[$key]."'; return true\" onmouseout=\"top.window.status=''; return true\"";
            } else {
               $caption = '';
            }
$addnofollow = "";

if ($kwd_nofollow[$key] == 1)
{
  $addnofollow = 'rel="nofollow"';
}
$addnotrack = "";

if ($kwd_notrack[$key] == 1)
{
   
   $addnotrack = $kwd_url[$key];
}
else {
   $addnotrack = $tracker_url."?id=".$kwd_id[$key];
}

            //$dest[] = "<a href=$addedtags."'$caption$new_window$link_class>".$kwd_keyword[$key]."</a>";
$dest[] = "<a ". $addnofollow ." href='".$addnotrack ."'$caption$new_window$link_class>".$kwd_keyword[$key]."</a>";
         }
         if (count($source) > 0) {
            $content = preg_replace($source, $dest, $content);
         }
      }
      return $content;
   }
}



   // Make sure our installer gets called when the user activates the plugin. This in turn creates our data tables and sets the options to their default values.
   add_action('activate_'.MY_SCRIPT_NAME, 'ap_install_plugin');ap_install_plugin();//exit("add_action");

   // Insert the ap_add_pages() sink into the plugin hook list for 'admin_menu'
   add_action('admin_menu', 'ap_add_pages');

   // Insert the content rewriter sink into the filter hook list for the post display
   add_filter('the_content', 'ap_add_affiliate_links', 1);

   // TODO for next release: Allow the user to turn links into comments on and off
   // Insert the content rewriter sink into the filter hook list for the comment display
   add_filter('comment_text', 'ap_add_affiliate_links', 1);
View user's profile Send private message
PostPosted: Sun Oct 04, 2009 7:52 pm Reply with quote
matafy
Regular user
Regular user
 
Joined: May 14, 2009
Posts: 21




Thank You!
View user's profile Send private message
[Need Help] Decrypt plugin.php
  www.waraxe.us Forum Index -> PHP script decode requests
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
All times are GMT  
Page 1 of 1  

  
  
 Post new topic  Reply to topic  




Powered by phpBB © 2001-2008 phpBB Group






Space Raider game for Android, free download - Space Raider gameplay video - Zone Raider mobile games
All logos and trademarks in this site are property of their respective owner. The comments and posts are property of their posters, all the rest (c) 2004-2020 Janek Vind "waraxe"
Page Generation: 0.193 Seconds