# Name: smd_thumbnail v0.10 # Type: Admin/Public side plugin # Multiple image thumbnails of arbitrary dimensions # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjEzOiJzbWRfdGh1bWJuYWlsIjtzOjY6ImF1dGhvciI7czox MToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVmZGF3 c29uLmNvbS8iO3M6NzoidmVyc2lvbiI7czo0OiIwLjEwIjtzOjExOiJkZXNjcmlwdGlvbiI7 czo0OToiTXVsdGlwbGUgaW1hZ2UgdGh1bWJuYWlscyBvZiBhcmJpdHJhcnkgZGltZW5zaW9u cyI7czo0OiJjb2RlIjtzOjM0MDI0OiJpZiAoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSB7 DQoJZ2xvYmFsICRzbWRfdGh1bWJfZXZlbnQ7DQoNCgkkc21kX3RodW1iX2V2ZW50ID0gJ3Nt ZF90aHVtYm5haWwnOw0KCSRzbWRfdGh1bWJfcHJpdnMgPSAnMSwyLDMnOw0KDQoJYWRkX3By aXZzKCRzbWRfdGh1bWJfZXZlbnQsICRzbWRfdGh1bWJfcHJpdnMpOw0KCWFkZF9wcml2cygn c21kX3RodW1iX3Byb2ZpbGVzJywgJHNtZF90aHVtYl9wcml2cyk7DQoJYWRkX3ByaXZzKCdw bHVnaW5fcHJlZnMuJy4kc21kX3RodW1iX2V2ZW50LCAkc21kX3RodW1iX3ByaXZzKTsNCgly ZWdpc3Rlcl9jYWxsYmFjaygnc21kX3RodW1iX3dlbGNvbWUnLCAncGx1Z2luX2xpZmVjeWNs ZS4nLiRzbWRfdGh1bWJfZXZlbnQpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJf cHJvZmlsZXMnLCAnaW1hZ2VfdWknLCAnZXh0ZW5kX2NvbnRyb2xzJyk7DQoJcmVnaXN0ZXJf Y2FsbGJhY2soJ3NtZF90aHVtYnMnLCAnaW1hZ2VfdWknLCAndGh1bWJuYWlsJyk7DQoJcmVn aXN0ZXJfY2FsbGJhY2soJ3NtZF90aHVtYl9lZGl0JywgJ2ltYWdlX3VpJywgJ3RodW1ibmFp bF9lZGl0Jyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF90aHVtYl9jcmVhdGUnLCAnaW1h Z2VfdWknLCAndGh1bWJuYWlsX2NyZWF0ZScpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRf dGh1bWJfZ2VuZXJhdGUnLCAnaW1hZ2UnLCAnaW1hZ2VfZGF0YScpOw0KCXJlZ2lzdGVyX2Nh bGxiYWNrKCdzbWRfdGh1bWJfZGVsZXRlJywgJ2ltYWdlJywgJ2ltYWdlX2RlbGV0ZScpOw0K CXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJfY3JlYXRlX29uZScsICdpbWFnZScsICdz bWRfdGh1bWJfY3JlYXRlX29uZScpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJf c3dpdGNoX2FjdGl2ZScsICdpbWFnZScsICdzbWRfdGh1bWJfc3dpdGNoX2FjdGl2ZScpOw0K CXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJfaW5zZXJ0JywgJ2ltYWdlJywgJ3NtZF90 aHVtYm5haWxfaW5zZXJ0JywgMSk7DQoNCn0gZWxzZSB7DQoJZ2xvYmFsICRwYXRoX3RvX3Np dGUsICRpbWdfZGlyOw0KCWlmICghZGVmaW5lZCgnSU1QQVRIJykpIHsNCgkJZGVmaW5lKCJJ TVBBVEgiLCRwYXRoX3RvX3NpdGUuRFMuJGltZ19kaXIuRFMpOw0KCX0NCn0NCg0KaWYgKCFk ZWZpbmVkKCdTTURfVEhVTUInKSkgew0KCWRlZmluZSgiU01EX1RIVU1CIiwgJ3NtZF90aHVt Ym5haWwnKTsNCn0NCmlmICghZGVmaW5lZCgnU01EX1RIVU1CX0FDVElWRScpKSB7DQoJZGVm aW5lKCJTTURfVEhVTUJfQUNUSVZFIiwgMSk7DQp9DQppZiAoIWRlZmluZWQoJ1NNRF9USFVN Ql9DUk9QJykpIHsNCglkZWZpbmUoIlNNRF9USFVNQl9DUk9QIiwgMik7DQp9DQppZiAoIWRl ZmluZWQoJ1NNRF9USFVNQl9TSEFSUCcpKSB7DQoJZGVmaW5lKCJTTURfVEhVTUJfU0hBUlAi LCA0KTsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gc21kX3RodW1iX3dlbGNvbWUoJGV2 dCwgJHN0cCkgew0KCXN3aXRjaCAoJHN0cCkgew0KCQljYXNlICdpbnN0YWxsZWQnOg0KCQkJ c21kX3RodW1iX3RhYmxlX2luc3RhbGwoKTsNCgkJCWJyZWFrOw0KCQljYXNlICdkZWxldGVk JzoNCgkJCXNtZF90aHVtYl90YWJsZV9yZW1vdmUoKTsNCgkJCWJyZWFrOw0KCX0NCglyZXR1 cm47DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRGlzcGxheSB0aGUg ZGVzaWduYXRlZCBkZWZhdWx0IHRodW1ibmFpbCBvbiB0aGUgbGlzdCBwYWdlDQpmdW5jdGlv biBzbWRfdGh1bWJzKCRldnQsICRzdHAsICRkZmx0LCAkY3VycmltZykgew0KCWV4dHJhY3Qo Z3BzYShhcnJheSgncGFnZScsICdzb3J0JywgJ2RpcicsICdjcml0JywgJ3NlYXJjaF9tZXRo b2QnKSkpOw0KDQoJaWYgKHNtZF90aHVtYl90YWJsZV9leGlzdCgpKSB7DQoJCSRkZWZhdWx0 ID0gc2FmZV9maWVsZCgndmFsJywgJ3R4cF9wcmVmcycsICJuYW1lPSdzbWRfdGh1bWJfZGVm YXVsdF9wcm9maWxlJyIpOw0KCQlpZiAoJGRlZmF1bHQpIHsNCgkJCSRyb3cgPSBzYWZlX3Jv dygnKicsIFNNRF9USFVNQiwgIm5hbWU9JyIuc2FuaXRpemVGb3JVcmwoJGRlZmF1bHQpLiIn Iik7DQoJCQlpZiAoJHJvdykgew0KCQkJCSRlZGl0X3VybCA9ICc/ZXZlbnQ9aW1hZ2UnLmEu J3N0ZXA9aW1hZ2VfZWRpdCcuYS4naWQ9Jy4kY3VycmltZ1snaWQnXS5hLidzb3J0PScuJHNv cnQuDQoJCQkJCQlhLidkaXI9Jy4kZGlyLmEuJ3BhZ2U9Jy4kcGFnZS5hLidzZWFyY2hfbWV0 aG9kPScuJHNlYXJjaF9tZXRob2QuYS4nY3JpdD0nLiRjcml0Ow0KCQkJCSRvdXQgPSBzbWRf dGh1bWJfaW1nKCRyb3csICRjdXJyaW1nKTsNCgkJCQlyZXR1cm4gKCRvdXQpID8gaHJlZigk b3V0LCAkZWRpdF91cmwpIDogZ1R4dCgnbm8nKTsNCgkJCX0gZWxzZSB7DQoJCQkJcmV0dXJu IGdUeHQoJ25vJyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gZ1R4dCgnbm8nKTsN CgkJfQ0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBEb24ndCB3 YW50IHRoZSAnY3JlYXRlJyBjb250cm9scyBhcyB0aGV5J3JlIGhhbmRsZWQgaW4gdGhlIGVk aXQgcG9ydGlvbiBvZiB0aGUgc2NyZWVuDQpmdW5jdGlvbiBzbWRfdGh1bWJfY3JlYXRlKCRl dnQsICRzdHAsICRkZmx0LCAkY3VycmltZykgew0KCXJldHVybiAnICc7DQp9DQoNCi8vIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gV2l0aCBhIGxvdCBvZiBpbWFnZXMgaW4gdGhl IGRhdGFiYXNlLCBkb2luZyBpdCBhbGwgaW4gb25lIGhpdCB3b3VsZCB0aW1lIG91dC4NCi8v IFNvIGl0J3MgZG9uZSB2aWEgYWpheDsgb25lIHJlcXVlc3QgcGVyIGltYWdlDQpmdW5jdGlv biBzbWRfdGh1bWJfY3JlYXRlX2FsbCgpIHsNCgkkaW1hZ2VzID0gc2FmZV9jb2x1bW4oJ2lk JywgJ3R4cF9pbWFnZScsICcxPTEnKTsNCgkkY291bnQgPSBjb3VudCgkaW1hZ2VzKTsNCg0K CWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4nOw0KCWVjaG8gInZhciBi Y3RyID0gMDsgdmFyIGJ0b3QgPSB7JGNvdW50fTsiOw0KCWVjaG8gJ2pRdWVyeShmdW5jdGlv bigpIHsnOw0KCWVjaG8gJ2pRdWVyeSgiI3NtZF90aHVtYl9idG90IikudGV4dCgiLycuJGNv dW50LiciKTsnOw0KCWZvcmVhY2ggKCRpbWFnZXMgYXMgJGltZykgew0KCQllY2hvIDw8PEVP SlMNCgkJc2VuZEFzeW5jRXZlbnQoDQoJCXsNCgkJCWV2ZW50OiB0ZXh0cGF0dGVybi5ldmVu dCwNCgkJCXN0ZXA6ICdzbWRfdGh1bWJfY3JlYXRlX29uZScsDQoJCQlzbWRfdGh1bWJfaW1n aWQ6IHskaW1nfQ0KCQl9LCBzbWRfY3JlYXRlX2FsbF9mZWVkYmFjayk7DQpFT0pTOw0KCX0N CgllY2hvICd9KTsnOw0KCWVjaG8gPDw8RU9KUw0KCWZ1bmN0aW9uIHNtZF9jcmVhdGVfYWxs X2ZlZWRiYWNrKCkgew0KCQliY3RyKys7DQoJCWpRdWVyeSgnI3NtZF90aHVtYl9iY3Vycicp LnRleHQoYmN0cik7DQoJCWlmIChiY3RyID49IGJ0b3QpIHsNCgkJCWpRdWVyeSgnI3NtZF90 aHVtYl9iY3Vyciwjc21kX3RodW1iX2J0b3QnKS5lbXB0eSgpOw0KCQl9DQoJfQ0KRU9KUzsN CgllY2hvICc8L3NjcmlwdD4nOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N CmZ1bmN0aW9uIHNtZF90aHVtYl9jcmVhdGVfb25lKCkgew0KCSRjdXJyaW1nID0gZ3BzKCdz bWRfdGh1bWJfaW1naWQnKTsNCglhc3NlcnRfaW50KCRjdXJyaW1nKTsNCg0KCSRycyA9IHNh ZmVfcm93cygnKicsIFNNRF9USFVNQiwgJzE9MSBBTkQgZmxhZ3MgJiAnLlNNRF9USFVNQl9B Q1RJVkUpOw0KCSRjdXJyID0gc2FmZV9yb3coJyonLCAndHhwX2ltYWdlJywgImlkPSIuZG9T bGFzaCgkY3VycmltZykpOw0KCWlmICgkcnMpIHsNCgkJc21kX3RodW1iX21ha2UoJHJzLCAk Y3Vycik7DQoJCXNlbmRfeG1sX3Jlc3BvbnNlKCk7DQoJfQ0KfQ0KDQovLyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF90aHVtYl9zd2l0Y2hfYWN0aXZlKCkgew0K CSRuYW1lID0gZG9TbGFzaChncHMoJ3NtZF90aHVtYl9wcm9maWxlJykpOw0KCWlmICgkbmFt ZSkgew0KCQlzYWZlX3VwZGF0ZShTTURfVEhVTUIsICdmbGFncyA9IGZsYWdzIF4gJy5TTURf VEhVTUJfQUNUSVZFLCAibmFtZT0nJG5hbWUnIik7DQoJCXNlbmRfeG1sX3Jlc3BvbnNlKGFy cmF5KCdzbWRfdGh1bWJfcHJvZmlsZScgPT4gJG5hbWUpKTsNCgl9DQp9DQoNCi8vIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gc21kX3RodW1iX2dlbmVyYXRlKCRldnQs ICRzdHApIHsNCgkkaWQgPSBkb1NsYXNoKGdwcygnaWQnKSk7DQoNCgkkaWQgPSAoJGlkKSA/ ICRpZCA6ICRHTE9CQUxTWydJRCddOw0KCSRycyA9IHNhZmVfcm93cygnKicsIFNNRF9USFVN QiwgJzE9MSBBTkQgZmxhZ3MgJiAnLlNNRF9USFVNQl9BQ1RJVkUpOw0KDQoJc21kX3RodW1i X21ha2UoJHJzLCAkaWQpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1 bmN0aW9uIHNtZF90aHVtYl9kZWxldGUoJGV2dCwgJHN0cCkgew0KCSRpZHMgPSBncHMoJ3Nl bGVjdGVkJyk7DQoJJHJzID0gc2FmZV9yb3dzKCcqJywgU01EX1RIVU1CLCAnMT0xJyk7DQoN CgkkaW1hZ2VzID0gc2FmZV9yb3dzKCcqJywgJ3R4cF9pbWFnZScsICdpZCBJTiAoJyAuIGpv aW4oJywnLHF1b3RlX2xpc3QoJGlkcykpIC4gJyknKTsNCglmb3JlYWNoICgkaW1hZ2VzIGFz ICRpbWcpIHsNCgkJc21kX3RodW1iX3VubWFrZSgkcnMsICRpbWcpOw0KCX0NCn0NCg0KLy8g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfbWFrZSgkcnMs ICRjdXJyaW1nKSB7DQoJLy8gV3JhcHBlciBmb3Igd2V0X3RodW1iIHRvIGFsbG93IG11bHRp cGxlIHRodW1ibmFpbHMNCgkkbXNnID0gJyc7DQoJaWYgKCFjbGFzc19leGlzdHMoJ3NtZF90 aHVtYicpKSB7DQoJCWNsYXNzIHNtZF90aHVtYiBleHRlbmRzIHdldF90aHVtYiB7DQoJCQl2 YXIgJG1fZXh0Ow0KCQkJdmFyICRtX2lkOw0KCQkJdmFyICRtX2RpcjsNCg0KCQkJLy8gQ29u c3RydWN0b3INCgkJCWZ1bmN0aW9uIHNtZF90aHVtYiAoJGlkLCAkZGlyLCAkcnMpIHsNCgkJ CQkkaWQgPSBhc3NlcnRfaW50KCRpZCk7DQoJCQkJaWYgKCRycykgew0KCQkJCQlleHRyYWN0 KCRycyk7DQoJCQkJCSR0aGlzLT5tX2V4dCA9ICRleHQ7DQoJCQkJCSR0aGlzLT5tX2lkID0g JGlkOw0KCQkJCQkkdGhpcy0+bV9kaXIgPSAkZGlyOw0KCQkJCX0NCgkJCQkkdGhpcy0+d2V0 X3RodW1iKCk7IC8vIGNvbnN0cnVjdCBiYXNlIGNsYXNzIGluc3RhbmNlDQoJCQl9DQoNCgkJ CWZ1bmN0aW9uIHdyaXRlKCApIHsNCgkJCQlpZiAoICFpc3NldCgkdGhpcy0+bV9leHQpICkg cmV0dXJuIGZhbHNlOw0KCQkJCSRvdXRmaWxlID0gSU1QQVRILiR0aGlzLT5tX2Rpci5EUy4k dGhpcy0+bV9pZC4kdGhpcy0+bV9leHQ7DQoJCQkJaWYgKCBwYXJlbnQ6OndyaXRlICggSU1Q QVRILiR0aGlzLT5tX2lkLiR0aGlzLT5tX2V4dCwgJG91dGZpbGUgKSApIHsNCgkJCQkJY2ht b2QoJG91dGZpbGUsIDA2NDQpOw0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQl9DQoJCQkJcmV0 dXJuIGZhbHNlOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gSWYgcGFzc2VkIG9ubHkgYW4gSUQs IGxvb2sgdXAgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIGRhdGENCglpZiAoIWlzX2FycmF5KCRj dXJyaW1nKSkgew0KCQlhc3NlcnRfaW50KCRjdXJyaW1nKTsNCgkJJGN1cnJpbWcgPSBzYWZl X3JvdygnKicsICd0eHBfaW1hZ2UnLCAnaWQ9Jy4kY3VycmltZyk7DQoJfQ0KDQoJLy8gQ3Jl YXRlIGVhY2ggdGh1bWJuYWlsDQoJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsNCgkJLy8gU2Fu aXRpemUgYSBsaXR0bGUNCgkJJHdpZHRoID0gKGludCkgJHJvd1snd2lkdGgnXTsNCgkJJGhl aWdodCA9IChpbnQpICRyb3dbJ2hlaWdodCddOw0KCQlpZiAoJHdpZHRoID09IDApICR3aWR0 aCA9ICcnOw0KCQlpZiAoJGhlaWdodCA9PSAwKSAkaGVpZ2h0ID0gJyc7DQoJCWlmICgkd2lk dGggPT09ICcnICYmICRoZWlnaHQgPT09ICcnKSBjb250aW51ZTsNCgkJJGFjdGl2ZSA9ICgk cm93WydmbGFncyddICYgU01EX1RIVU1CX0FDVElWRSkgPyAxIDogMDsNCgkJJGNyb3AgPSAo JHJvd1snZmxhZ3MnXSAmIFNNRF9USFVNQl9DUk9QKSA/IDEgOiAwOw0KCQkkc2hhcnBlbiA9 ICgkcm93WydmbGFncyddICYgU01EX1RIVU1CX1NIQVJQKSA/IDEgOiAwOw0KCQkkaWQgPSAk Y3VycmltZ1snaWQnXTsNCg0KCQkkdCA9IG5ldyBzbWRfdGh1bWIoJGlkLCBzYW5pdGl6ZUZv clVybCgkcm93WyduYW1lJ10pLCAkY3VycmltZyk7DQoJCSR0LT5jcm9wID0gKCRjcm9wID09 ICcxJyk7DQoJCSR0LT5zaGFycGVuID0gKCRzaGFycGVuID09ICcxJyk7DQoJCSR0LT5oaW50 ID0gJzAnOw0KCQkkdC0+d2lkdGggPSAkd2lkdGg7DQoJCSR0LT5oZWlnaHQgPSAkaGVpZ2h0 Ow0KCQkkdC0+cXVhbGl0eSA9ICRyb3dbJ3F1YWxpdHknXTsNCgkJaWYgKCR0LT53cml0ZSgp KSB7DQoJCQkkbXNnID0gZ1R4dCgndGh1bWJuYWlsX3NhdmVkJywgYXJyYXkoJ3tpZH0nID0+ ICRpZCkpOw0KCQl9IGVsc2Ugew0KCQkJJG1zZyA9IGFycmF5KGdUeHQoJ3RodW1ibmFpbF9u b3Rfc2F2ZWQnLCBhcnJheSgne2lkfScgPT4gJGlkKSksIEVfRVJST1IpOw0KCQl9DQoJfQ0K CXJldHVybiAkbXNnOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0 aW9uIHNtZF90aHVtYl91bm1ha2UoJHJzLCAkY3VycmltZykgew0KCSRpZCA9ICRjdXJyaW1n WydpZCddOw0KCSRleHQgPSAkY3VycmltZ1snZXh0J107DQoJZm9yZWFjaCAoJHJzIGFzICRy b3cpIHsNCgkJJHBhdGggPSBJTVBBVEguc2FuaXRpemVGb3JVcmwoJHJvd1snbmFtZSddKS5E Uy4kaWQuJGV4dDsNCgkJaWYgKGZpbGVfZXhpc3RzKCRwYXRoKSkgew0KCQkJdW5saW5rKCRw YXRoKTsNCgkJfQ0KCX0NCglyZXR1cm4gJyc7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KZnVuY3Rpb24gc21kX3RodW1iX2luc2VydCgpIHsNCglnbG9iYWwgJHR4cGNm ZywkdHhwX3VzZXIsJGltZ19kaXIsJHBhdGhfdG9fc2l0ZSwgJHBhZ2UsICRzb3J0LCAkZGly LCAkY3JpdCwgJHNlYXJjaF9tZXRob2Q7DQoNCglpZiAoIWRlZmluZWQoJ0lNUEFUSCcpKSB7 DQoJCWRlZmluZSgnSU1QQVRIJywkcGF0aF90b19zaXRlLkRTLiRpbWdfZGlyLkRTKTsNCgl9 DQoNCglleHRyYWN0KGdwc2EoYXJyYXkoJ3BhZ2UnLCAnc29ydCcsICdkaXInLCAnY3JpdCcs ICdzZWFyY2hfbWV0aG9kJykpKTsNCg0KCWluY2x1ZGVfb25jZSB0eHBhdGguJy9saWIvdHhw bGliX21pc2MucGhwJzsNCg0KCWV4dHJhY3QoJHR4cGNmZyk7DQoJJGlkID0gYXNzZXJ0X2lu dChncHMoJ2lkJykpOw0KCSRwcm9maWxlID0gZ3BzKCdzbWRfdGh1bWJfcHJvZmlsZScpOw0K CSR0aHVtYl9leHQgPSBncHMoJ3NtZF90aHVtYl9leHQnKTsNCg0KCSRhdXRob3IgPSBmZXRj aCgnYXV0aG9yJywgJ3R4cF9pbWFnZScsICdpZCcsICRpZCk7DQoJaWYgKCFoYXNfcHJpdnMo J2ltYWdlLmVkaXQnKSAmJiAhKCRhdXRob3IgPT0gJHR4cF91c2VyICYmIGhhc19wcml2cygn aW1hZ2UuZWRpdC5vd24nKSkpIHsNCgkJcmV0dXJuOw0KCX0NCg0KCSRmaWxlID0gJF9GSUxF U1sndGhlZmlsZSddWyd0bXBfbmFtZSddOw0KCSRuYW1lID0gJF9GSUxFU1sndGhlZmlsZSdd WyduYW1lJ107DQoNCgkkZmlsZSA9IGdldF91cGxvYWRlZF9maWxlKCRmaWxlKTsNCg0KCWlm IChlbXB0eSgkZmlsZSkpDQoJew0KCQlyZXR1cm47DQoJfQ0KDQoJbGlzdCgkdywgJGgsICRl eHRlbnNpb24pID0gZ2V0aW1hZ2VzaXplKCRmaWxlKTsNCgkkdmFsaWRfZXh0cyA9IGFycmF5 KA0KCQlJTUFHRVRZUEVfR0lGICA9PiAnLmdpZicsDQoJCUlNQUdFVFlQRV9KUEVHID0+ICcu anBnJywNCgkJSU1BR0VUWVBFX1BORyAgPT4gJy5wbmcnLA0KCQlJTUFHRVRZUEVfU1dGICA9 PiAnLnN3ZicsDQoJKTsNCgkkZXh0ID0gaXNzZXQoJHZhbGlkX2V4dHNbJGV4dGVuc2lvbl0p ID8gJHZhbGlkX2V4dHNbJGV4dGVuc2lvbl0gOiAnJzsNCg0KCWlmICgoJGZpbGUgIT09IGZh bHNlKSAmJiAkcHJvZmlsZSAmJiAkZXh0KSB7DQoJCSRuZXdwYXRoID0gSU1QQVRILnNhbml0 aXplRm9yVXJsKCRwcm9maWxlKS5EUy4kaWQuJGV4dDsNCgkJaWYgKHNoaWZ0X3VwbG9hZGVk X2ZpbGUoJGZpbGUsICRuZXdwYXRoKSA9PSBmYWxzZSkgew0KCQl9IGVsc2Ugew0KCQkJY2ht b2QoJG5ld3BhdGgsIDA2NDQpOw0KCQkJJG1lc3NhZ2UgPSBnVHh0KCdpbWFnZV91cGxvYWRl ZCcsIGFycmF5KCd7bmFtZX0nID0+ICRuYW1lKSk7DQoJCX0NCgl9DQoNCgkvLyBTaW5jZSB0 aGUgaGVhZGVycyBoYXZlIGJlZW4gc2VudCwgcmVzb3J0IHRvIGpzIHRvIHJlZnJlc2ggdGhl IHBhZ2UNCgkkdXJsID0gJz9ldmVudD1pbWFnZSZzdGVwPWltYWdlX2VkaXQmaWQ9Jy4kaWQu JyZzb3J0PScuJHNvcnQuJyZkaXI9Jy4kZGlyLicmcGFnZT0nLiRwYWdlLicmc2VhcmNoX21l dGhvZD0nLiRzZWFyY2hfbWV0aG9kLicmY3JpdD0nLiRjcml0Ow0KCWVjaG8gPDw8RU9TDQo8 c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQp3aW5kb3cubG9jYXRpb24uaHJlZj0i eyR1cmx9IjsNCjwvc2NyaXB0Pg0KPG5vc2NyaXB0Pg0KPG1ldGEgaHR0cC1lcXVpdj0icmVm cmVzaCIgY29udGVudD0iMDt1cmw9eyR1cmx9IiAvPg0KPC9ub3NjcmlwdD4NCkVPUzsNCgll eGl0Ow0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF90 aHVtYl9lZGl0KCRldnQsICRzdHAsICRkZmx0LCAkY3VycmltZykgew0KCWdsb2JhbCAkc3Rl cCwgJGZpbGVfbWF4X3VwbG9hZF9zaXplLCAkdHhwX3VzZXI7DQoNCglleHRyYWN0KGdwc2Eo YXJyYXkoJ2lkJywgJ3BhZ2UnLCAnc29ydCcsICdkaXInLCAnY3JpdCcsICdzZWFyY2hfbWV0 aG9kJywgJ3NtZF90aHVtYm5haWxfc2l6ZScsICdzbWRfdGh1bWJuYWlsX2Nob3Nlbl9zaXpl JywgJ3NtZF90aHVtYm5haWxfZGVsZXRlJywgJ3NtZF9zdGVwJykpKTsNCg0KCSRpZCA9ICgk aWQpID8gJGlkIDogJEdMT0JBTFNbJ0lEJ107DQoNCgkvLyBUb2dnbGUgcHJvZmlsZSBwYW5l bA0KCWlmICgkc3RlcCA9PSAnc2F2ZV9wYW5lX3N0YXRlJykgew0KCQlzbWRfdGh1bWJuYWls X3NhdmVfcGFuZV9zdGF0ZSgpOw0KCQlyZXR1cm47DQoJfQ0KDQoJLy8gQ3JlYXRlL2RlbGV0 ZSB0aGUgc2VsZWN0ZWQgdGh1bWJzIGRlcGVuZGluZyBvbiB0aGUgYnV0dG9uIHByZXNzZWQN CglpZiAoJHNtZF9zdGVwID09ICdzbWRfdGh1bWJuYWlsX21hbmFnZScpIHsNCgkJLy8gVmFs aWRhdGUgdXNlcg0KCQkkYXV0aG9yID0gZmV0Y2goJ2F1dGhvcicsICd0eHBfaW1hZ2UnLCAn aWQnLCAkaWQpOw0KCQlpZiAoIWhhc19wcml2cygnaW1hZ2UuZWRpdCcpICYmICEoJGF1dGhv ciA9PSAkdHhwX3VzZXIgJiYgaGFzX3ByaXZzKCdpbWFnZS5lZGl0Lm93bicpKSkNCgkJew0K CQkJaW1hZ2VfbGlzdChnVHh0KCdyZXN0cmljdGVkX2FyZWEnKSk7DQoJCQlyZXR1cm47DQoJ CX0NCg0KCQkvLyBHcmFiIHRoZSB0aHVtYm5haWxzIHRvIHdvcmsgb24NCgkJJHdoZXJlID0g KCRzbWRfdGh1bWJuYWlsX3NpemU9PSdhbGwnKSA/ICcxPTEgQU5EIGZsYWdzICYgJy5TTURf VEhVTUJfQUNUSVZFIDogIm5hbWU9JyIuZG9TbGFzaCgkc21kX3RodW1ibmFpbF9jaG9zZW5f c2l6ZSkuIiciOw0KCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCBTTURfVEhVTUIsICR3aGVyZSk7 DQoNCgkJLy8gRG8gaXQNCgkJaWYoJHNtZF90aHVtYm5haWxfZGVsZXRlKSB7DQoJCQkkbXNn ID0gc21kX3RodW1iX3VubWFrZSgkcnMsICRjdXJyaW1nKTsNCgkJfSBlbHNlIHsNCgkJCSRt c2cgPSBzbWRfdGh1bWJfbWFrZSgkcnMsICRjdXJyaW1nKTsNCgkJfQ0KCX0NCg0KCSRleHQg PSAkY3VycmltZ1snZXh0J107DQoJZWNobyA8PDxFT0MNCjxzY3JpcHQgdHlwZT0idGV4dC9q YXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIHNtZF90aHVtYl9zZWxlY3RvcihzZWwpIHsNCgl2YXIg aWR4ID0gMDsNCglqUXVlcnkoIiNzbWRfdGh1bWJzIGltZyIpLmVhY2goZnVuY3Rpb24oKSB7 DQoJCWlmIChqUXVlcnkodGhpcykuaGFzQ2xhc3Moc2VsKSkgew0KCQkJalF1ZXJ5KHRoaXMp LnRvZ2dsZUNsYXNzKCdzbWRfc2VsZWN0ZWQnKTsNCgkJCWlmIChqUXVlcnkodGhpcykuaGFz Q2xhc3MoJ3NtZF9zZWxlY3RlZCcpKSB7DQoJCQkJalF1ZXJ5KCIjc21kX3VwbG9hZF90aHVt Ym5haWwiKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTsNCgkJCQlqUXVlcnkoIiNzbWRfdGh1 bWJfcHJvZmlsZSIpLnZhbChzZWwpOw0KCQkJCWlkeCA9IGpRdWVyeSgiI3NtZF90aHVtYm5h aWxfc2l6ZSBvcHRpb25bdmFsdWU9JyIrc2VsKyInXSIpLmluZGV4KCk7DQoJCQkJalF1ZXJ5 KCIjc21kX3RodW1ibmFpbF9jaG9zZW5fc2l6ZSIpLnZhbChzZWwpOw0KCQkJfSBlbHNlIHsN CgkJCQlqUXVlcnkoIiNzbWRfdXBsb2FkX3RodW1ibmFpbCIpLmF0dHIoJ2Rpc2FibGVkJywg dHJ1ZSk7DQoJCQkJalF1ZXJ5KCIjc21kX3RodW1iX3Byb2ZpbGUiKS52YWwoJycpOw0KCQkJ CWpRdWVyeSgiI3NtZF90aHVtYm5haWxfY2hvc2VuX3NpemUiKS52YWwoJycpOw0KCQkJfQ0K CQl9IGVsc2Ugew0KCQkJalF1ZXJ5KHRoaXMpLnJlbW92ZUNsYXNzKCdzbWRfc2VsZWN0ZWQn KTsNCgkJfQ0KCX0pOw0KCWpRdWVyeSgiI3NtZF90aHVtYm5haWxfc2l6ZSIpLmF0dHIoInNl bGVjdGVkSW5kZXgiLCBpZHgpOw0KfQ0KZnVuY3Rpb24gc21kX3RodW1iX3NlbGVjdF9jaGFu Z2VkKCkgew0KCW9iaiA9IGpRdWVyeSgiI3NtZF90aHVtYm5haWxfc2l6ZSIpOw0KCWlmIChv YmouYXR0cigic2VsZWN0ZWRJbmRleCIpID09IDApIHsNCgkJalF1ZXJ5KCIjc21kX3VwbG9h ZF90aHVtYm5haWwiKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOw0KCQlqUXVlcnkoIiNzbWRf dGh1bWJfcHJvZmlsZSIpLnZhbCgnJyk7DQoJCWpRdWVyeSgiI3NtZF90aHVtYm5haWxfY2hv c2VuX3NpemUiKS52YWwoJycpOw0KCX0gZWxzZSB7DQoJCWpRdWVyeSgiI3NtZF91cGxvYWRf dGh1bWJuYWlsIikuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7DQoJCWpRdWVyeSgiI3NtZF90 aHVtYl9wcm9maWxlIikudmFsKG9iai52YWwoKSk7DQoJCWpRdWVyeSgiI3NtZF90aHVtYm5h aWxfY2hvc2VuX3NpemUiKS52YWwob2JqLnZhbCgpKTsNCgl9DQoJalF1ZXJ5KCIjc21kX3Ro dW1icyBpbWciKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQlpZiAoalF1ZXJ5KHRoaXMpLmhhc0Ns YXNzKG9iai52YWwoKSkpIHsNCgkJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcygnc21kX3NlbGVj dGVkJyk7DQoJCX0gZWxzZSB7DQoJCQlqUXVlcnkodGhpcykucmVtb3ZlQ2xhc3MoJ3NtZF9z ZWxlY3RlZCcpOw0KCQl9DQoJfSk7DQp9DQpqUXVlcnkoZnVuY3Rpb24oKSB7DQoJalF1ZXJ5 KCIjc21kX3RodW1icyBpbWciKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQl2YXIgY2xzID0galF1 ZXJ5KHRoaXMpLmF0dHIoJ2NsYXNzJyk7DQoJCWpRdWVyeSh0aGlzKS5jbGljayhmdW5jdGlv bigpIHsNCgkJCXNtZF90aHVtYl9zZWxlY3RvcihjbHMpOw0KCQl9KTsNCgl9KTsNCglqUXVl cnkoIiNzbWRfdXBsb2FkX3RodW1ibmFpbCIpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7DQoJ alF1ZXJ5KCIudGh1bWJuYWlsLXVwbG9hZCIpLnByZXBlbmQoJzxpbnB1dCB0eXBlPSJoaWRk ZW4iIG5hbWU9InNtZF90aHVtYl9pbWdpZCIgdmFsdWU9InskaWR9IiAvPjxpbnB1dCB0eXBl PSJoaWRkZW4iIGlkPSJzbWRfdGh1bWJfcHJvZmlsZSIgbmFtZT0ic21kX3RodW1iX3Byb2Zp bGUiIHZhbHVlPSIiIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9InNtZF90aHVtYl9leHQi IG5hbWU9InNtZF90aHVtYl9leHQiIHZhbHVlPSJ7JGV4dH0iIC8+Jyk7DQp9KTsNCjwvc2Ny aXB0Pg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi5zbWRfc2VsZWN0ZWQgew0KCWJvcmRl cjoxcHggc29saWQgcmVkOw0KCWJhY2tncm91bmQ6cmVkOw0KfQ0KI3NtZF90aHVtYnMgaW1n IHsNCglwYWRkaW5nOjJweDsNCgltYXJnaW46MXB4Ow0KCWJvcmRlcjoxcHggc29saWQgYmxh Y2s7DQp9DQoudGh1bWJuYWlsLWFsdGVyIHsNCglkaXNwbGF5Om5vbmU7DQp9DQo8L3N0eWxl Pg0KRU9DOw0KDQoJLy8gQWRkIHRodW1ibmFpbHMgYW5kIGNyZWF0aW9uIGNvbnRyb2xzDQoJ aWYgKHNtZF90aHVtYl90YWJsZV9leGlzdCgpKSB7DQoJCSRycyA9IHNhZmVfcm93cygnKics IFNNRF9USFVNQiwgJzE9MSBPUkRFUiBCWSBuYW1lJyk7DQoJCWlmICgkcnMpIHsNCgkJCSRk Zmx0ID0gZ2V0X3ByZWYoJ3NtZF90aHVtYl9kZWZhdWx0X3Byb2ZpbGUnKTsNCgkJCSRwcm9m aWxlcyA9IGFycmF5KCdhbGwnID0+IHNtZF90aHVtYl9nVHh0KCdhbGxfc2l6ZXMnKSk7DQoJ CQkkdGh1bWJzW10gPSAnPGRpdiBpZD0ic21kX3RodW1icyI+JzsNCgkJCWZvcmVhY2ggKCRy cyBhcyAkcm93KSB7DQoJCQkJaWYgKCRyb3dbJ2ZsYWdzJ10gJiBTTURfVEhVTUJfQUNUSVZF KSB7DQoJCQkJCSRwcm9maWxlc1skcm93WyduYW1lJ11dID0gJHJvd1snbmFtZSddOw0KCQkJ CX0NCgkJCQkkdGh1bWJzW10gPSBzbWRfdGh1bWJfaW1nKCRyb3csICRjdXJyaW1nKTsNCgkJ CX0NCgkJCSR0aHVtYnNbXSA9ICc8L2Rpdj4nOw0KCQkJJHFzID0gYXJyYXkoDQoJCQkJImV2 ZW50IiA9PiAnaW1hZ2UnLA0KCQkJCSJzdGVwIiA9PiAnaW1hZ2VfZWRpdCcsDQoJCQkJImlk IiA9PiAkaWQsDQoJCQkJInBhZ2UiID0+ICRwYWdlLA0KCQkJCSJzb3J0IiA9PiAkc29ydCwN CgkJCQkiZGlyIiA9PiAkZGlyLA0KCQkJCSJjcml0IiA9PiAkY3JpdCwNCgkJCQkic2VhcmNo X21ldGhvZCIgPT4gJHNlYXJjaF9tZXRob2QsDQoJCQkpOw0KDQoJCQkkb3V0W10gPSAnPGRp diBpZD0ic21kX3RodW1ibmFpbF9jb250cm9sIj48c3BhbiBjbGFzcz0icGxhaW4gbGV2ZXIn LihnZXRfcHJlZigncGFuZV9zbWRfdGh1bWJuYWlsc192aXNpYmxlJykgPyAnIGV4cGFuZGVk JyA6ICcnKS4nIj48YSBocmVmPSIjc21kX3RodW1ibmFpbHMiPicuc21kX3RodW1iX2dUeHQo J3RodW1ibmFpbF9oZWFkaW5nJykuJzwvYT48L3NwYW4+PGRpdiBpZD0ic21kX3RodW1ibmFp bHMiIGNsYXNzPSJ0b2dnbGUiIHN0eWxlPSJkaXNwbGF5OicuKGdldF9wcmVmKCdwYW5lX3Nt ZF90aHVtYm5haWxzX3Zpc2libGUnKSA/ICdibG9jaycgOiAnbm9uZScpLiciPic7DQoJCQkk b3V0W10gPSAnPGZvcm0gbmFtZT0ic21kX3RodW1ibmFpbF9jcmVhdGUiIG1ldGhvZD0icG9z dCIgYWN0aW9uPSInLmpvaW5fcXMoJHFzKS4nIj4nOw0KCQkJJG91dFtdID0gZklucHV0KCdo aWRkZW4nLCAnc21kX3N0ZXAnLCAnc21kX3RodW1ibmFpbF9tYW5hZ2UnKTsNCgkJCSRvdXRb XSA9IGZJbnB1dCgnaGlkZGVuJywgJ3NtZF90aHVtYm5haWxfY2hvc2VuX3NpemUnLCAnJywg JycsICcnLCAnJywgJycsICcnLCAnc21kX3RodW1ibmFpbF9jaG9zZW5fc2l6ZScpOw0KCQkJ JG91dFtdID0gc2VsZWN0SW5wdXQoJ3NtZF90aHVtYm5haWxfc2l6ZScsICRwcm9maWxlcywg JycsICcnLCAnb25jaGFuZ2U9InJldHVybiBzbWRfdGh1bWJfc2VsZWN0X2NoYW5nZWQoKSI7 JywgJ3NtZF90aHVtYm5haWxfc2l6ZScpOw0KCQkJJG91dFtdID0gZklucHV0KCdzdWJtaXQn LCAnJywgZ1R4dCgnY3JlYXRlJyksICdzbWFsbGVyYm94Jyk7DQoJCQkkb3V0W10gPSBmSW5w dXQoJ3N1Ym1pdCcsICdzbWRfdGh1bWJuYWlsX2RlbGV0ZScsIGdUeHQoJ2RlbGV0ZScpLCAn c21hbGxlcmJveCcpOw0KCQkJJG91dFtdID0gam9pbignJywgJHRodW1icyk7DQoJCQkkb3V0 W10gPSAnPC9mb3JtPic7DQoJCQkkb3V0W10gPSB1cGxvYWRfZm9ybShnVHh0KCd1cGxvYWRf dGh1bWJuYWlsJyksICd1cGxvYWRfdGh1bWJuYWlsJywgJ3NtZF90aHVtYm5haWxfaW5zZXJ0 JywgJ2ltYWdlJywgJGlkLCAkZmlsZV9tYXhfdXBsb2FkX3NpemUsICdzbWRfdXBsb2FkX3Ro dW1ibmFpbCcsICd0aHVtYm5haWwtdXBsb2FkJyk7DQoJCQkkb3V0W10gPSAnPC9kaXY+JzsN CgkJCXJldHVybiBqb2luKCcnLCAkb3V0KTsNCgkJfQ0KCX0NCglyZXR1cm4gJyAnOw0KfQ0K DQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF90aHVtYl9pbWco JHJvdywgJGN1cnJpbWcsICRtZXRhPWFycmF5KCkpIHsNCglnbG9iYWwgJGltZ19kaXI7DQoN CgkkZGlyID0gc2FuaXRpemVGb3JVcmwoJHJvd1snbmFtZSddKTsNCgkkaWQgPSAkY3Vycmlt Z1snaWQnXTsNCgkkZXh0ID0gJGN1cnJpbWdbJ2V4dCddOw0KDQoJJHBhdGggPSBJTVBBVEgu JGRpci5EUy4kaWQuJGV4dDsNCg0KCWlmIChmaWxlX2V4aXN0cygkcGF0aCkpIHsNCgkJJHVE YXRlID0gZmlsZW10aW1lKCRwYXRoKTsNCgkJJGV4dHJhcyA9ICcnOw0KCQkkdyA9ICgkcm93 Wyd3aWR0aCddKSA/ICcgd2lkdGg9IicuJHJvd1snd2lkdGgnXS4nIic6ICcnOw0KCQkkaCA9 ICgkcm93WydoZWlnaHQnXSkgPyAnIGhlaWdodD0iJy4kcm93WydoZWlnaHQnXS4nIic6ICcn Ow0KDQoJCWlmICghaXNzZXQoJG1ldGFbJ2NsYXNzJ10pKSB7DQoJCQkkbWV0YVsnY2xhc3Mn XSA9ICRkaXI7DQoJCX0NCg0KCQlmb3JlYWNoICgkbWV0YSBhcyAka2V5ID0+ICR2YWwpIHsN CgkJCSRleHRyYXMgLj0gJyAnLiRrZXkuJz0iJy4kdmFsLiciJzsNCgkJfQ0KCQlyZXR1cm4g JzxpbWcgc3JjPSInLmlodS4kaW1nX2Rpci4nLycuJGRpci4nLycuJGlkLiRleHQuJz8nLiR1 RGF0ZS4nIicuJHcuJGguJGV4dHJhcy4nIC8+JzsNCgl9DQoNCglyZXR1cm4gJyc7DQp9DQoN Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gc21kX3RodW1iX3Byb2Zp bGVzKCRldnQsICRzdHAsICRkZmx0LCAkaW1nbGlzdCkgew0KCWdsb2JhbCAkc21kX3RodW1i X2V2ZW50LCAkcHJlZnMsICRzdGVwOw0KDQoJaWYgKCFoYXNfcHJpdnMoX19GVU5DVElPTl9f KSkgew0KCQlyZXR1cm47DQoJfQ0KDQoJZXh0cmFjdChncHNhKGFycmF5KA0KCQkncGFnZScs DQoJCSdzb3J0JywNCgkJJ2RpcicsDQoJCSdjcml0JywNCgkJJ3NlYXJjaF9tZXRob2QnLA0K CQknc21kX3RodW1iX2FkZCcsDQoJCSdzbWRfdGh1bWJfY2FuY2VsJywNCgkJJ3NtZF90aHVt Yl9zYXZlJywNCgkJJ3NtZF90aHVtYl9uYW1lJywNCgkJJ3NtZF90aHVtYl9uZXduYW1lJywN CgkJJ3NtZF90aHVtYl93aWR0aCcsDQoJCSdzbWRfdGh1bWJfaGVpZ2h0JywNCgkJJ3NtZF90 aHVtYl9xdWFsaXR5JywNCgkJJ3NtZF90aHVtYl9hY3RpdmUnLA0KCQknc21kX3RodW1iX2Fj dGl2ZV9uZXcnLA0KCQknc21kX3RodW1iX2Nyb3AnLA0KCQknc21kX3RodW1iX3NoYXJwZW4n LA0KCQknc21kX3RodW1iX2RlZmF1bHQnKSkpOw0KDQoJLy8gU2FuaXRpemUNCgkkcXVhbGl0 eSA9IChpc19udW1lcmljKCRzbWRfdGh1bWJfcXVhbGl0eSkpID8gKCgkc21kX3RodW1iX3F1 YWxpdHk8MCkgPyA3NSA6ICgoJHNtZF90aHVtYl9xdWFsaXR5PjEwMCkgPyA3NSA6ICRzbWRf dGh1bWJfcXVhbGl0eSkgKSA6IDc1Ow0KCSR3aWR0aCA9IChpc19udW1lcmljKCRzbWRfdGh1 bWJfd2lkdGgpKSA/ICRzbWRfdGh1bWJfd2lkdGggOiAwOw0KCSRoZWlnaHQgPSAoaXNfbnVt ZXJpYygkc21kX3RodW1iX2hlaWdodCkpID8gJHNtZF90aHVtYl9oZWlnaHQgOiAwOw0KCSRu ZXduYW1lID0gc2FuaXRpemVGb3JVcmwoJHNtZF90aHVtYl9uZXduYW1lKTsNCgkkbXNnID0g Jyc7DQoNCgkvLyBUYWJsZSBjb250cm9sDQoJaWYgKGdwcygncmVtb3ZlJykpIHsNCgkJc21k X3RodW1iX3RhYmxlX3JlbW92ZSgpOw0KCX0gZWxzZSB7DQoJCWlmICghc21kX3RodW1iX3Rh YmxlX2V4aXN0KCkpIHsNCgkJCXNtZF90aHVtYl90YWJsZV9pbnN0YWxsKCk7DQoJCX0NCgl9 DQoNCgkvLyBUb2dnbGUgcHJvZmlsZSBwYW5lbA0KCWlmICgkc3RlcCA9PSAnc2F2ZV9wYW5l X3N0YXRlJykgew0KCQlzbWRfdGh1bWJuYWlsX3NhdmVfcGFuZV9zdGF0ZSgpOw0KCQlyZXR1 cm47DQoJfQ0KDQoJaWYgKCRzdGVwID09ICdzbWRfdGh1bWJfY3JlYXRlX2FsbCcpIHsNCgkJ c21kX3RodW1iX2NyZWF0ZV9hbGwoKTsNCgl9DQoNCgkvLyBTYXZlIHByb2ZpbGUNCglpZiAo JHN0ZXAgPT0gJ3NtZF90aHVtYl9wcm9maWxlX3NhdmUnKSB7DQoJCWlmIChzbWRfdGh1bWJf dGFibGVfZXhpc3QoKSkgew0KCQkJaWYgKCRzbWRfdGh1bWJfY2FuY2VsKSB7DQoJCQkJLy8g RG8gbm90aGluZw0KCQkJfSBlbHNlIGlmICgkc21kX3RodW1iX2FkZCkgew0KCQkJCS8vIENy ZWF0ZSBuZXcgcHJvZmlsZQ0KCQkJCSRleGlzdHMgPSBzYWZlX3JvdygnKicsIFNNRF9USFVN QiwgIm5hbWU9JyIuZG9TbGFzaCgkbmV3bmFtZSkuIiciKTsNCgkJCQlpZiAoJGV4aXN0cykg ew0KCQkJCQkkbXNnID0gc21kX3RodW1iX2dUeHQoJ3Byb2ZpbGVfZXhpc3RzJywgYXJyYXko J3tuYW1lfScgPT4gZG9TbGFzaCgkbmV3bmFtZSkpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlp ZiAoJG5ld25hbWUpIHsNCgkJCQkJCSRmbGFncyA9IDA7DQoJCQkJCQkkZmxhZ3MgPSAoJHNt ZF90aHVtYl9hY3RpdmVfbmV3KSA/ICRmbGFncyB8IFNNRF9USFVNQl9BQ1RJVkUgOiAkZmxh Z3M7DQoJCQkJCQkkZmxhZ3MgPSAoJHNtZF90aHVtYl9jcm9wKSA/ICRmbGFncyB8IFNNRF9U SFVNQl9DUk9QIDogJGZsYWdzOw0KCQkJCQkJJGZsYWdzID0gKCRzbWRfdGh1bWJfc2hhcnBl bikgPyAkZmxhZ3MgfCBTTURfVEhVTUJfU0hBUlAgOiAkZmxhZ3M7DQoNCgkJCQkJCXNhZmVf aW5zZXJ0KFNNRF9USFVNQiwNCgkJCQkJCQkibmFtZT0nIi5kb1NsYXNoKCRuZXduYW1lKS4i JyIuDQoJCQkJCQkJIiwgd2lkdGg9JyIuZG9TbGFzaCgkd2lkdGgpLiInIi4NCgkJCQkJCQki LCBoZWlnaHQ9JyIuZG9TbGFzaCgkaGVpZ2h0KS4iJyIuDQoJCQkJCQkJIiwgcXVhbGl0eT0n Ii5kb1NsYXNoKCRxdWFsaXR5KS4iJyIuDQoJCQkJCQkJIiwgZmxhZ3M9JyIuZG9TbGFzaCgk ZmxhZ3MpLiInIg0KCQkJCQkJKTsNCg0KCQkJCQkJLy8gQWx0ZXIgdGhlIGRlZmF1bHQgdGh1 bWJuYWlsDQoJCQkJCQlpZiAoJHNtZF90aHVtYl9kZWZhdWx0KSB7DQoJCQkJCQkJc2V0X3By ZWYoJ3NtZF90aHVtYl9kZWZhdWx0X3Byb2ZpbGUnLCAkbmV3bmFtZSwgJ3NtZF90aHVtYics IFBSRUZfSElEREVOKTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gQ3JlYXRlIHRoZSB0aHVtYm5h aWwgZGlyZWN0b3J5DQoJCQkJCQlAbWtkaXIoSU1QQVRILiRuZXduYW1lKTsNCgkJCQkJfQ0K CQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gVXBkYXRlIGV4aXN0aW5nIHByb2ZpbGUNCgkJ CQkkbmFtZSA9IHNhbml0aXplRm9yVXJsKCRzbWRfdGh1bWJfbmFtZSk7DQoJCQkJJGV4aXN0 cyA9IHNhZmVfcm93KCcqJywgU01EX1RIVU1CLCAibmFtZT0nIi5kb1NsYXNoKCRuZXduYW1l KS4iJyIpOw0KCQkJCWlmICgkZXhpc3RzICYmIHN0cnRvbG93ZXIoJG5ld25hbWUpICE9IHN0 cnRvbG93ZXIoJG5hbWUpKSB7DQoJCQkJCSRtc2cgPSBzbWRfdGh1bWJfZ1R4dCgncHJvZmls ZV9leGlzdHMnLCBhcnJheSgne25hbWV9JyA9PiBkb1NsYXNoKCRuZXduYW1lKSkpOw0KCQkJ CX0gZWxzZSB7DQoJCQkJCWlmICgkbmV3bmFtZSkgew0KCQkJCQkJJGZsYWdzID0gMDsNCgkJ CQkJCSRmbGFncyA9ICgkc21kX3RodW1iX2FjdGl2ZSkgPyAkZmxhZ3MgfCBTTURfVEhVTUJf QUNUSVZFIDogJGZsYWdzOw0KCQkJCQkJJGZsYWdzID0gKCRzbWRfdGh1bWJfY3JvcCkgPyAk ZmxhZ3MgfCBTTURfVEhVTUJfQ1JPUCA6ICRmbGFnczsNCgkJCQkJCSRmbGFncyA9ICgkc21k X3RodW1iX3NoYXJwZW4pID8gJGZsYWdzIHwgU01EX1RIVU1CX1NIQVJQIDogJGZsYWdzOw0K DQoJCQkJCQlzYWZlX3VwZGF0ZSgNCgkJCQkJCQlTTURfVEhVTUIsDQoJCQkJCQkJIm5hbWU9 JyIuZG9TbGFzaCgkbmV3bmFtZSkuIiciDQoJCQkJCQkJCS4iLCB3aWR0aD0nIi5kb1NsYXNo KCR3aWR0aCkuIiciDQoJCQkJCQkJCS4iLCBoZWlnaHQ9JyIuZG9TbGFzaCgkaGVpZ2h0KS4i JyINCgkJCQkJCQkJLiIsIHF1YWxpdHk9JyIuZG9TbGFzaCgkcXVhbGl0eSkuIiciDQoJCQkJ CQkJCS4iLCBmbGFncz0nIi5kb1NsYXNoKCRmbGFncykuIiciDQoJCQkJCQkJLCAibmFtZT0n Ii5kb1NsYXNoKCRuYW1lKS4iJyINCgkJCQkJCSk7DQoNCgkJCQkJCS8vIEFsdGVyIHRoZSBk ZWZhdWx0IHRodW1ibmFpbA0KCQkJCQkJaWYgKCRzbWRfdGh1bWJfZGVmYXVsdCkgew0KCQkJ CQkJCXNldF9wcmVmKCdzbWRfdGh1bWJfZGVmYXVsdF9wcm9maWxlJywgJG5ld25hbWUsICdz bWRfdGh1bWInLCBQUkVGX0hJRERFTik7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCS8vIFJl bW92ZSB0aGUgZGVmYXVsdCBmbGFnIGlmIHRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdA0K CQkJCQkJCWlmIChnZXRfcHJlZignc21kX3RodW1iX2RlZmF1bHRfcHJvZmlsZScpID09IGRv U2xhc2goJG5hbWUpKSB7DQoJCQkJCQkJCXNldF9wcmVmKCdzbWRfdGh1bWJfZGVmYXVsdF9w cm9maWxlJywgJycsICdzbWRfdGh1bWInLCBQUkVGX0hJRERFTik7DQoJCQkJCQkJfQ0KCQkJ CQkJfQ0KDQoJCQkJCQkvLyBBZGp1c3QgdGhlIHRodW1ibmFpbCBkaXJlY3RvcnkgaWYgdGhl IG5hbWUgaGFzIGNoYW5nZWQNCgkJCQkJCWlmICgkbmV3bmFtZSAhPSAkbmFtZSkgew0KCQkJ CQkJCXJlbmFtZShJTVBBVEguJG5hbWUsIElNUEFUSC4kbmV3bmFtZSk7DQoJCQkJCQl9DQoJ CQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkbXNnID0gc21kX3RodW1iX2dU eHQoJ3RhYmxlc19ub3RfaW5zdGFsbGVkJyk7DQoJCX0NCgl9DQoNCgkvLyBEZWxldGUgcHJv ZmlsZQ0KCWlmICgkc3RlcCA9PSAnc21kX3RodW1iX3Byb2ZpbGVfZGVsZXRlJykgew0KCQlp ZiAoc21kX3RodW1iX3RhYmxlX2V4aXN0KCkpIHsNCgkJCWlmICghZW1wdHkoJHNtZF90aHVt Yl9uYW1lKSkgew0KCQkJCSRuYW1lID0gc2FuaXRpemVGb3JVcmwoJHNtZF90aHVtYl9uYW1l KTsNCgkJCQkkcmV0ID0gc2FmZV9kZWxldGUoU01EX1RIVU1CLCAibmFtZT0nIi5kb1NsYXNo KCRuYW1lKS4iJyIpOw0KCQkJCWlmICgkcmV0KSB7DQoJCQkJCXNtZF90aHVtYl9ybWRpcihJ TVBBVEguJG5hbWUpOw0KDQoJCQkJCS8vIFJlbW92ZSB0aGUgZGVmYXVsdCBmbGFnIGlmIHRo aXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdA0KCQkJCQlpZiAoZ2V0X3ByZWYoJ3NtZF90aHVt Yl9kZWZhdWx0X3Byb2ZpbGUnKSA9PSBkb1NsYXNoKCRuYW1lKSkgew0KCQkJCQkJc2V0X3By ZWYoJ3NtZF90aHVtYl9kZWZhdWx0X3Byb2ZpbGUnLCAnJywgJ3NtZF90aHVtYicsIFBSRUZf SElEREVOKTsNCgkJCQkJfQ0KDQoJCQkJCSRtc2cgPSBzbWRfdGh1bWJfZ1R4dCgncHJvZmls ZV9kZWxldGVkJywgYXJyYXkoJ3tuYW1lfScgPT4gZG9TbGFzaCgkbmFtZSkpKTsNCgkJCQl9 DQoJCQl9DQoJCX0NCgl9DQoNCgkkcXMgPSBhcnJheSgNCgkJImV2ZW50IiA9PiAnaW1hZ2Un LA0KCQkicGFnZSIgPT4gJHBhZ2UsDQoJCSJzb3J0IiA9PiAkc29ydCwNCgkJImRpciIgPT4g JGRpciwNCgkJImNyaXQiID0+ICRjcml0LA0KCQkic2VhcmNoX21ldGhvZCIgPT4gJHNlYXJj aF9tZXRob2QsDQoJKTsNCg0KCSRlZGl0Rm9jdXMgPSAoJHN0ZXAgPT0gJ3NtZF90aHVtYl9w cm9maWxlX2VkaXQnKSA/ICdqUXVlcnkoIiNzbWRfdGh1bWJfcHJvZmlsZV9lZGl0ZWQgaW5w dXRbbmFtZT1cJ3NtZF90aHVtYl9uZXduYW1lXCddIikuZm9jdXMoKTsnIDogJyc7DQoNCgll Y2hvIDw8PEVPQw0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24g c21kX3RodW1iX3RvZ2dsZW5ldygpIHsNCglib3ggPSBqUXVlcnkoIiNzbWRfdGh1bWJfcHJv ZmlsZV9jcmVhdGUiKTsNCglpZiAoYm94LmNzcygiZGlzcGxheSIpID09ICJub25lIikgew0K CQlib3guc2hvdygpOw0KCX0gZWxzZSB7DQoJCWJveC5oaWRlKCk7DQoJfQ0KCWpRdWVyeSgi aW5wdXQuc21kX2ZvY3VzIikuZm9jdXMoKTsNCglyZXR1cm4gZmFsc2U7DQp9DQpmdW5jdGlv biBzbWRfdGh1bWJfc3dpdGNoX2FjdGl2ZShuYW1lKSB7DQoJc2VuZEFzeW5jRXZlbnQoDQoJ ew0KCQlldmVudDogdGV4dHBhdHRlcm4uZXZlbnQsDQoJCXN0ZXA6ICdzbWRfdGh1bWJfc3dp dGNoX2FjdGl2ZScsDQoJCXNtZF90aHVtYl9wcm9maWxlOiBuYW1lDQoJfSwgc21kX3RodW1i X3N3aXRjaF9hY3RpdmVfZG9uZSk7DQp9DQpmdW5jdGlvbiBzbWRfdGh1bWJfc3dpdGNoX2Fj dGl2ZV9kb25lKGRhdGEpIHsNCgl2YXIgc21kX3RodW1iX3Byb2ZpbGUgPSBqUXVlcnkoJyNz bWRfdGh1bWJfcHJvZmlsZV8nK2pRdWVyeShkYXRhKS5maW5kKCdzbWRfdGh1bWJfcHJvZmls ZScpLmF0dHIoJ3ZhbHVlJykpOw0KCXNtZF90aHVtYl9wcm9maWxlLnRvZ2dsZUNsYXNzKCdz bWRfaW5hY3RpdmUnKTsNCglpZiAoc21kX3RodW1iX3Byb2ZpbGUuaGFzQ2xhc3MoJ3NtZF9p bmFjdGl2ZScpKSB7DQoJCXNtZF90aHVtYl9wcm9maWxlLmZpbmQoJ2lucHV0OmNoZWNrYm94 JykucmVtb3ZlQXR0cignY2hlY2tlZCcpOw0KCX0gZWxzZSB7DQoJCXNtZF90aHVtYl9wcm9m aWxlLmZpbmQoJ2lucHV0OmNoZWNrYm94JykuYXR0cignY2hlY2tlZCcsICdjaGVja2VkJyk7 DQoJfQ0KfQ0KDQpqUXVlcnkoZnVuY3Rpb24oKSB7DQoJalF1ZXJ5KCcuc21kX3RodW1iX2hl YWRpbmdfYWN0aXZlJykuY2xpY2soZnVuY3Rpb24oKSB7DQoJCWpRdWVyeSgnLnNtZF90aHVt Yl9yb3cgaW5wdXQ6Y2hlY2tib3gnKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJc21kX3RodW1i X3N3aXRjaF9hY3RpdmUoalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmF0dHIoJ2NsYXNzJykpOw0K CQl9KTsNCgl9KTsNCgl7JGVkaXRGb2N1c30NCn0pOw0KPC9zY3JpcHQ+DQo8c3R5bGUgdHlw ZT0idGV4dC9jc3MiPg0KLnNtZF9oaWRkZW4gew0KCWRpc3BsYXk6bm9uZTsNCn0NCiNzbWRf dGh1bWJfcHJvZmlsZXMgew0KCXdpZHRoOjcwMHB4Ow0KCW1hcmdpbjowIGF1dG8gMThweDsN Cglwb3NpdGlvbjpyZWxhdGl2ZTsNCn0NCiNzbWRfdGh1bWJfYmF0Y2ggew0KCWZsb2F0OnJp Z2h0Ow0KfQ0KLnNtZF9pbmFjdGl2ZSB7DQoJYmFja2dyb3VuZDojZTZlNmU2Ow0KCWNvbG9y OiM5OTk7DQp9DQouc21kX3RodW1iX2hlYWRpbmdfYWN0aXZlIHsNCgljdXJzb3I6cG9pbnRl cjsNCn0NCiNzbWRfdGh1bWJfcHJvZmlsZV9mb3JtIHsNCglwYWRkaW5nLXRvcDo4cHg7DQp9 DQpmb3JtI3NtZF90aHVtYl9wcm9maWxlX2Zvcm0gdGQgew0KCWJvcmRlcjogMDsNCn0NCi5z bWRfdGh1bWJfZXJyb3Igew0KCXBvc2l0aW9uOmFic29sdXRlOw0KCXJpZ2h0OjEwMHB4Ow0K CXRleHQtYWxpZ246Y2VudGVyOw0KCWJvcmRlcjoxcHggc29saWQgcmVkOw0KCWJhY2tncm91 bmQ6I2ZmYzsNCglwYWRkaW5nOjNweDsNCn0NCjwvc3R5bGU+DQpFT0M7DQoNCgkkbmV3YnRu ID0gJzxhIHN0eWxlPSJtYXJnaW4tbGVmdDotNXB4OyIgY2xhc3M9Im5hdmxpbmsiIGhyZWY9 IiMiIG9uY2xpY2s9InJldHVybiBzbWRfdGh1bWJfdG9nZ2xlbmV3KCk7Ij4nLnNtZF90aHVt Yl9nVHh0KCduZXcnKS4nPC9hPiZuYnNwOyc7DQoJJGFsbGJ0biA9ICc8YSBjbGFzcz0ibmF2 bGluayIgaHJlZj0iJy5qb2luX3FzKCRxcykuJyYjMzg7c3RlcD1zbWRfdGh1bWJfY3JlYXRl X2FsbCI+Jy5zbWRfdGh1bWJfZ1R4dCgnYWxsX3RodW1icycpLic8L2E+JzsNCg0KCSRoZWFk aW5ncyA9IG4udHIoDQoJCW4uY29sdW1uX2hlYWQoJ25hbWUnLCAnbmFtZScsICdpbWFnZScs IGZhbHNlLCAnYXNjJykuDQoJCWNvbHVtbl9oZWFkKCd0aHVtYl93aWR0aCcsICd3aWR0aCcs ICdpbWFnZScsIGZhbHNlKS4NCgkJY29sdW1uX2hlYWQoJ3RodW1iX2hlaWdodCcsICdoZWln aHQnLCAnaW1hZ2UnLCBmYWxzZSkuDQoJCWNvbHVtbl9oZWFkKHNtZF90aHVtYl9nVHh0KCdx dWFsaXR5JyksICdxdWFsaXR5JywgJ2ltYWdlJywgZmFsc2UpLg0KCQljb2x1bW5faGVhZCgn a2VlcF9zcXVhcmVfcGl4ZWxzJywgJ2Nyb3AnLCAnaW1hZ2UnLCBmYWxzZSkuDQoJCWNvbHVt bl9oZWFkKHNtZF90aHVtYl9nVHh0KCdzaGFycGVuJyksICdzaGFycGVuJywgJ2ltYWdlJywg ZmFsc2UpLg0KCQljb2x1bW5faGVhZCgnYWN0aXZlJywgJ2FjdGl2ZScsICdpbWFnZScsIGZh bHNlLCAnJywgJycsICcnLCAnc21kX3RodW1iX2hlYWRpbmdfYWN0aXZlJykuDQoJCWNvbHVt bl9oZWFkKCdkZWZhdWx0JywgJ2RlZmF1bHQnLCAnaW1hZ2UnLCBmYWxzZSkuDQoJCWNvbHVt bl9oZWFkKHNtZF90aHVtYl9nVHh0KCdhY3Rpb25zJyksICdhY3Rpb25zJywgJ2ltYWdlJywg ZmFsc2UpDQoJKTsNCg0KCSRvdXRbXSA9ICc8ZmllbGRzZXQgaWQ9InNtZF90aHVtYl9wcm9m aWxlcyI+PGxlZ2VuZCBjbGFzcz0icGxhaW4gbGV2ZXInLihnZXRfcHJlZigncGFuZV9zbWRf dGh1bWJuYWlsX3Byb2ZpbGVzX3Zpc2libGUnKSA/ICcgZXhwYW5kZWQnIDogJycpLiciPjxh IGhyZWY9IiNzbWRfdGh1bWJuYWlsX3Byb2ZpbGVzIj4nLnNtZF90aHVtYl9nVHh0KCdwcm9m aWxlX2hlYWRpbmcnKS4nPC9hPjwvbGVnZW5kPjxkaXYgaWQ9InNtZF90aHVtYl9iYXRjaCI+ PHNwYW4gaWQ9InNtZF90aHVtYl9iY3VyciI+PC9zcGFuPjxzcGFuIGlkPSJzbWRfdGh1bWJf YnRvdCI+PC9zcGFuPjwvZGl2PjxkaXYgaWQ9InNtZF90aHVtYm5haWxfcHJvZmlsZXMiIGNs YXNzPSJ0b2dnbGUiIHN0eWxlPSJkaXNwbGF5OicuKGdldF9wcmVmKCdwYW5lX3NtZF90aHVt Ym5haWxfcHJvZmlsZXNfdmlzaWJsZScpID8gJ2Jsb2NrJyA6ICdub25lJykuJyI+JzsNCgkk b3V0W10gPSAkbXNnID8gJzxkaXYgY2xhc3M9InNtZF90aHVtYl9lcnJvciI+Jy4kbXNnLic8 L2Rpdj4nIDogJyc7DQoNCgkvLyBNYWluIGxpc3Qgb2YgcHJvZmlsZXMNCgkkb3V0W10gPSAn PGZvcm0gbWV0aG9kPSJwb3N0IiBuYW1lPSJzbWRfdGh1bWJfcHJvZmlsZV9mb3JtIiBpZD0i c21kX3RodW1iX3Byb2ZpbGVfZm9ybSIgYWN0aW9uPSInLmpvaW5fcXMoJHFzKS4nIj4nOw0K CSRvdXRbXSA9IHN0YXJ0VGFibGUoJ2xpc3QnKTsNCgkkb3V0W10gPSB0cih0ZGEoJG5ld2J0 bi4kYWxsYnRuLCAnIGNvbHNwYW49IjgiJykpOw0KCSRvdXRbXSA9ICRoZWFkaW5nczsNCg0K CWlmIChzbWRfdGh1bWJfdGFibGVfZXhpc3QoKSkgew0KCQkkcnMgPSBzYWZlX3Jvd3MoJyon LCBTTURfVEhVTUIsICcxPTEgT1JERVIgQlkgbmFtZScpOw0KCQkkZGZsdCA9IHNhZmVfZmll bGQoJ3ZhbCcsICd0eHBfcHJlZnMnLCAibmFtZT0nc21kX3RodW1iX2RlZmF1bHRfcHJvZmls ZSciKTsNCg0KCQkvLyBOZXcgUHJvZmlsZSByb3cNCgkJJG91dFtdPSAnPHRyIGlkPSJzbWRf dGh1bWJfcHJvZmlsZV9jcmVhdGUiIGNsYXNzPSJzbWRfaGlkZGVuIj4nOw0KCQkkb3V0W10g PSB0ZChzSW5wdXQoJ3NtZF90aHVtYl9wcm9maWxlX3NhdmUnKS5mSW5wdXQoJ3RleHQnLCAn c21kX3RodW1iX25ld25hbWUnLCAoKCRzdGVwPT0nc21kX3RodW1iX3Byb2ZpbGVfc2F2ZScp ID8gJHNtZF90aHVtYl9uYW1lIDogJycpLCAnc21kX2ZvY3VzJykpDQoJCQkudGQoZklucHV0 KCd0ZXh0JywgJ3NtZF90aHVtYl93aWR0aCcsICgoJHN0ZXA9PSdzbWRfdGh1bWJfcHJvZmls ZV9zYXZlJykgPyAkd2lkdGggOiAnJyksICcnLCAnJywgJycsICc0JykpDQoJCQkudGQoZklu cHV0KCd0ZXh0JywgJ3NtZF90aHVtYl9oZWlnaHQnLCAoKCRzdGVwPT0nc21kX3RodW1iX3By b2ZpbGVfc2F2ZScpID8gJGhlaWdodCA6ICcnKSwgJycsICcnLCAnJywgJzQnKSkNCgkJCS50 ZChmSW5wdXQoJ3RleHQnLCAnc21kX3RodW1iX3F1YWxpdHknLCAoKCRzdGVwPT0nc21kX3Ro dW1iX3Byb2ZpbGVfc2F2ZScpID8gJHF1YWxpdHkgOiAnJyksICcnLCAnJywgJycsICc0Jykp DQoJCQkudGQoY2hlY2tib3goJ3NtZF90aHVtYl9jcm9wJywgJzEnLCAoKCRzdGVwPT0nc21k X3RodW1iX3Byb2ZpbGVfc2F2ZScpID8gJHNtZF90aHVtYl9jcm9wIDogMCkpKQ0KCQkJLnRk KGNoZWNrYm94KCdzbWRfdGh1bWJfc2hhcnBlbicsICcxJywgKCgkc3RlcD09J3NtZF90aHVt Yl9wcm9maWxlX3NhdmUnKSA/ICRzbWRfdGh1bWJfc2hhcnBlbiA6IDApKSkNCgkJCS50ZChj aGVja2JveCgnc21kX3RodW1iX2FjdGl2ZV9uZXcnLCAnMScsIDEpKQ0KCQkJLnRkKGNoZWNr Ym94KCdzbWRfdGh1bWJfZGVmYXVsdCcsICcxJywgMCkpDQoJCQkudGQoZklucHV0KCdzdWJt aXQnLCAnc21kX3RodW1iX2FkZCcsIGdUeHQoJ2FkZCcpLCAnc21hbGxlcmJveCcpKTsNCgkJ JG91dFtdPSAnPC90cj4nOw0KDQoJCS8vIFJlbWFpbmluZyByb3dzDQoJCWZvcmVhY2ggKCRy cyBhcyAkcm93KSB7DQoJCQkkbGlua19lZHQgPSBqb2luX3FzKCRxcykuJyYjMzg7c3RlcD1z bWRfdGh1bWJfcHJvZmlsZV9lZGl0JiMzODtzbWRfdGh1bWJfbmFtZT0nLiRyb3dbJ25hbWUn XTsNCgkJCSRsaW5rX2RlbCA9IGpvaW5fcXMoJHFzKS4nJiMzODtzdGVwPXNtZF90aHVtYl9w cm9maWxlX2RlbGV0ZSYjMzg7c21kX3RodW1iX25hbWU9Jy4kcm93WyduYW1lJ107DQoJCQkk YnRuRWR0ID0gJzxhIGhyZWY9IicuJGxpbmtfZWR0LiciPlsnIC4gZ1R4dCgnZWRpdCcpIC4g J108L2E+JzsNCgkJCSRidG5EZWwgPSAnPGEgaHJlZj0iJy4kbGlua19kZWwuJyIgb25jbGlj az0icmV0dXJuIGNvbmZpcm0oXCcnLnNtZF90aHVtYl9nVHh0KCdkZWxldGVfY29uZmlybScs IGFycmF5KCJ7bmFtZX0iID0+ICRyb3dbJ25hbWUnXSkpLidcJyk7Ij5bJyAuIGdUeHQoJ2Rl bGV0ZScpIC4gJ108L2E+JzsNCgkJCSRhY3RpdmUgPSAoJHJvd1snZmxhZ3MnXSAmIFNNRF9U SFVNQl9BQ1RJVkUpID8gMSA6IDA7DQoJCQkkY3JvcCA9ICgkcm93WydmbGFncyddICYgU01E X1RIVU1CX0NST1ApID8gMSA6IDA7DQoJCQkkc2hhcnBlbiA9ICgkcm93WydmbGFncyddICYg U01EX1RIVU1CX1NIQVJQKSA/IDEgOiAwOw0KDQoJCQlpZiAoJHN0ZXAgPT0gJ3NtZF90aHVt Yl9wcm9maWxlX2VkaXQnICYmICRyb3dbJ25hbWUnXSA9PSAkc21kX3RodW1iX25hbWUpIHsN CgkJCQkkYnRuU2F2ZSA9IGZJbnB1dCgnc3VibWl0JywgJ3NtZF90aHVtYl9zYXZlJywgZ1R4 dCgnU2F2ZScpLCAnc21hbGxlcmJveCcpOw0KCQkJCSRidG5DYW5jZWwgPSBmSW5wdXQoJ3N1 Ym1pdCcsICdzbWRfdGh1bWJfY2FuY2VsJywgZ1R4dCgnQ2FuY2VsJyksICdzbWFsbGVyYm94 Jyk7DQoJCQkJJG91dFtdID0gdHIoDQoJCQkJCXRkKGhJbnB1dCgnc21kX3RodW1iX25hbWUn LCAkcm93WyduYW1lJ10pLmZJbnB1dCgndGV4dCcsICdzbWRfdGh1bWJfbmV3bmFtZScsICRy b3dbJ25hbWUnXSkpDQoJCQkJCS50ZChmSW5wdXQoJ3RleHQnLCAnc21kX3RodW1iX3dpZHRo JywgJHJvd1snd2lkdGgnXSwgJycsICcnLCAnJywgJzQnKSkNCgkJCQkJLnRkKGZJbnB1dCgn dGV4dCcsICdzbWRfdGh1bWJfaGVpZ2h0JywgJHJvd1snaGVpZ2h0J10sICcnLCAnJywgJycs ICc0JykpDQoJCQkJCS50ZChmSW5wdXQoJ3RleHQnLCAnc21kX3RodW1iX3F1YWxpdHknLCAk cm93WydxdWFsaXR5J10sICcnLCAnJywgJycsICc0JykpDQoJCQkJCS50ZChjaGVja2JveCgn c21kX3RodW1iX2Nyb3AnLCAnMScsICRjcm9wKSkNCgkJCQkJLnRkKGNoZWNrYm94KCdzbWRf dGh1bWJfc2hhcnBlbicsICcxJywgJHNoYXJwZW4pKQ0KCQkJCQkudGQoY2hlY2tib3goJ3Nt ZF90aHVtYl9hY3RpdmUnLCAnMScsICRhY3RpdmUpLCAnJywgJHJvd1snbmFtZSddKQ0KCQkJ CQkudGQoY2hlY2tib3goJ3NtZF90aHVtYl9kZWZhdWx0JywgJzEnLCAoKCRyb3dbJ25hbWUn XSA9PSAkZGZsdCkgPyAxIDogMCkpKQ0KCQkJCQkudGQoJGJ0blNhdmUuJGJ0bkNhbmNlbCkN CgkJCQksICcgaWQ9InNtZF90aHVtYl9wcm9maWxlX2VkaXRlZCInKTsNCgkJCX0gZWxzZSB7 DQoJCQkJJG91dFtdID0gdHIoDQoJCQkJCXRkKGhyZWYoJHJvd1snbmFtZSddLCAkbGlua19l ZHQpKS4NCgkJCQkJdGQoJHJvd1snd2lkdGgnXSkuDQoJCQkJCXRkKCRyb3dbJ2hlaWdodCdd KS4NCgkJCQkJdGQoJHJvd1sncXVhbGl0eSddKS4NCgkJCQkJdGQoKCRjcm9wKSA/IGdUeHQo J3llcycpIDogZ1R4dCgnbm8nKSkuDQoJCQkJCXRkKCgkc2hhcnBlbikgPyBnVHh0KCd5ZXMn KSA6IGdUeHQoJ25vJykpLg0KCQkJCQl0ZCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1l PSJzbWRfdGh1bWJfYWN0aXZlXycuJHJvd1snbmFtZSddLiciIHZhbHVlPSIxIicuKCgkYWN0 aXZlKSA/ICciIGNoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnKS4gJyBjbGFzcz0iY2hlY2tib3gi IG9uY2hhbmdlPSJzbWRfdGh1bWJfc3dpdGNoX2FjdGl2ZShcJycuJHJvd1snbmFtZSddLidc Jyk7IiAvPicsICcnLCAkcm93WyduYW1lJ10pLg0KCQkJCQl0ZCgoJHJvd1snbmFtZSddID09 ICRkZmx0KSA/IGdUeHQoJ3llcycpIDogZ1R4dCgnbm8nKSkuDQoJCQkJCXRkKCRidG5EZWwp DQoJCQkJLCAnIGlkPSJzbWRfdGh1bWJfcHJvZmlsZV8nLiRyb3dbJ25hbWUnXS4nIiBjbGFz cz0ic21kX3RodW1iX3JvdycgLiAoKCRhY3RpdmUpID8gJycgOiAnIHNtZF9pbmFjdGl2ZScp LiciJyk7DQoJCQl9DQoJCX0NCgl9DQoNCgkkb3V0W10gPSBlbmRUYWJsZSgnJyk7DQoJJG91 dFtdID0gJzwvZGl2PjwvZm9ybT48L2ZpZWxkc2V0Pic7DQoNCglyZXR1cm4gam9pbignJywg JG91dCk7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRGVsZXRlIGEg dGh1bWJuYWlsIGRpcmVjdG9yeSBhbmQgaXRzIGNvbnRlbnRzDQpmdW5jdGlvbiBzbWRfdGh1 bWJfcm1kaXIoJGRpcikgew0KCWlmIChpc19kaXIoJGRpcikpIHsNCgkJJG9iamVjdHMgPSBz Y2FuZGlyKCRkaXIpOw0KCQlmb3JlYWNoICgkb2JqZWN0cyBhcyAkb2JqZWN0KSB7DQoJCQlp ZiAoJG9iamVjdCAhPSAiLiIgJiYgJG9iamVjdCAhPSAiLi4iKSB7DQoJCQkJaWYgKGZpbGV0 eXBlKCRkaXIuRFMuJG9iamVjdCkgPT0gImRpciIpIHNtZF90aHVtYl9ybWRpcigkZGlyLkRT LiRvYmplY3QpOyBlbHNlIHVubGluaygkZGlyLkRTLiRvYmplY3QpOw0KCQkJfQ0KCQl9DQoJ CXJlc2V0KCRvYmplY3RzKTsNCgkJcm1kaXIoJGRpcik7DQoJfQ0KfQ0KDQovLyAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0NCi8vIEFkZCB0aHVtYm5haWwgdGFibGUgaWYgbm90IGFscmVh ZHkgaW5zdGFsbGVkDQovLyBGbGFnczogQml0IDA9QWN0aXZlIC8gMT1Dcm9wIC8gMiA9IFNo YXJwZW4NCmZ1bmN0aW9uIHNtZF90aHVtYl90YWJsZV9pbnN0YWxsKCkgew0KCSRHTE9CQUxT Wyd0eHBfZXJyX2NvdW50J10gPSAwOw0KCSRyZXQgPSAnJzsNCgkkc3FsID0gYXJyYXkoKTsN Cgkkc3FsW10gPSAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYCIuUEZYLlNNRF9USFVN Qi4iYCAoDQoJCWBuYW1lYCB2YXJjaGFyKDMyKSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KCQlg d2lkdGhgIGludCg0KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJYGhlaWdodGAgaW50KDQp IE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQlgcXVhbGl0eWAgdGlueWludCgyKSBOVUxMIGRl ZmF1bHQgJzc1JywNCgkJYGZsYWdzYCB0aW55aW50KDIpIE5PVCBOVUxMIGRlZmF1bHQgJzAn LA0KCQlQUklNQVJZIEtFWSAoYG5hbWVgKQ0KCSkgRU5HSU5FPU15SVNBTSI7DQoNCglpZihn cHMoJ2RlYnVnJykpIHsNCgkJZG1wKCRzcWwpOw0KCX0NCglmb3JlYWNoICgkc3FsIGFzICRx cnkpIHsNCgkJJHJldCA9IHNhZmVfcXVlcnkoJHFyeSk7DQoJCWlmICgkcmV0PT09ZmFsc2Up IHsNCgkJCSRHTE9CQUxTWyd0eHBfZXJyX2NvdW50J10rKzsNCgkJCWVjaG8gIjxiPiIuJEdM T0JBTFNbJ3R4cF9lcnJfY291bnQnXS4iLjwvYj4gIi5teXNxbF9lcnJvcigpLiI8YnIgLz5c biI7DQoJCQllY2hvICI8IS0tXG4gJHFyeSBcbi0tPlxuIjsNCgkJfQ0KCX0NCg0KCS8vIEJh Y2t1cCB0aGUgY3VycmVudCB0aHVtYiBwcmVmcw0KCSRleGlzdHMgPSBzYWZlX3JvdygnKics ICd0eHBfcHJlZnMnLCAibmFtZT0nc21kX3RodW1iX2JhY2t1cF93JyIpOw0KCWlmICghJGV4 aXN0cykgew0KCQlzZXRfcHJlZignc21kX3RodW1iX2JhY2t1cF93JywgZ2V0X3ByZWYoJ3Ro dW1iX3cnKSwgJ3NtZF90aHVtYicsIFBSRUZfSElEREVOLCAndGV4dF9pbnB1dCcsIDApOw0K CQlzZXRfcHJlZignc21kX3RodW1iX2JhY2t1cF9oJywgZ2V0X3ByZWYoJ3RodW1iX2gnKSwg J3NtZF90aHVtYicsIFBSRUZfSElEREVOLCAndGV4dF9pbnB1dCcsIDEpOw0KCQlzZXRfcHJl Zignc21kX3RodW1iX2JhY2t1cF9jJywgZ2V0X3ByZWYoJ3RodW1iX2Nyb3AnKSwgJ3NtZF90 aHVtYicsIFBSRUZfSElEREVOLCAndGV4dF9pbnB1dCcsIDIpOw0KDQoJCS8vIEVyYXNlIHRo ZSBjdXJyZW50IHRodW1iIHByZWZzDQoJCXNldF9wcmVmKCd0aHVtYl93JywgJycsICdpbWFn ZScsIFBSRUZfSElEREVOKTsNCgkJc2V0X3ByZWYoJ3RodW1iX2gnLCAnJywgJ2ltYWdlJywg UFJFRl9ISURERU4pOw0KCQlzZXRfcHJlZigndGh1bWJfY3JvcCcsICcnLCAnaW1hZ2UnLCBQ UkVGX0hJRERFTik7DQoJfQ0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8v IERyb3AgdGFibGUgaWYgaW4gZGF0YWJhc2UNCmZ1bmN0aW9uIHNtZF90aHVtYl90YWJsZV9y ZW1vdmUoKSB7DQoJJHJldCA9ICcnOw0KCSRzcWwgPSBhcnJheSgpOw0KCSRHTE9CQUxTWyd0 eHBfZXJyX2NvdW50J10gPSAwOw0KCWlmIChzbWRfdGh1bWJfdGFibGVfZXhpc3QoKSkgew0K CQkkc3FsW10gPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiAuUEZYLlNNRF9USFVNQi4gIjsg IjsNCgkJaWYoZ3BzKCdkZWJ1ZycpKSB7DQoJCQlkbXAoJHNxbCk7DQoJCX0NCgkJZm9yZWFj aCAoJHNxbCBhcyAkcXJ5KSB7DQoJCQkkcmV0ID0gc2FmZV9xdWVyeSgkcXJ5KTsNCgkJCWlm ICgkcmV0PT09ZmFsc2UpIHsNCgkJCQkkR0xPQkFMU1sndHhwX2Vycl9jb3VudCddKys7DQoJ CQkJZWNobyAiPGI+Ii4kR0xPQkFMU1sndHhwX2Vycl9jb3VudCddLiIuPC9iPiAiLm15c3Fs X2Vycm9yKCkuIjxiciAvPlxuIjsNCgkJCQllY2hvICI8IS0tXG4gJHFyeSBcbi0tPlxuIjsN CgkJCX0NCgkJfQ0KCX0NCg0KCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRodW1iIHByZWZz DQoJJGV4aXN0cyA9IHNhZmVfcm93KCcqJywgJ3R4cF9wcmVmcycsICJuYW1lPSdzbWRfdGh1 bWJfYmFja3VwX3cnIik7DQoJaWYgKCRleGlzdHMpIHsNCgkJc2V0X3ByZWYoJ3RodW1iX3cn LCBnZXRfcHJlZignc21kX3RodW1iX2JhY2t1cF93JyksICdpbWFnZScsIFBSRUZfSElEREVO KTsNCgkJc2V0X3ByZWYoJ3RodW1iX2gnLCBnZXRfcHJlZignc21kX3RodW1iX2JhY2t1cF9o JyksICdpbWFnZScsIFBSRUZfSElEREVOKTsNCgkJc2V0X3ByZWYoJ3RodW1iX2Nyb3AnLCBn ZXRfcHJlZignc21kX3RodW1iX2JhY2t1cF9jJyksICdpbWFnZScsIFBSRUZfSElEREVOKTsN Cg0KCX0NCgkvLyBFcmFzZSB0aGUgYmFja3VwIHRodW1iIHByZWZzDQoJc2FmZV9kZWxldGUo J3R4cF9wcmVmcycsICJuYW1lIElOKCdzbWRfdGh1bWJfYmFja3VwX3cnLCAnc21kX3RodW1i X2JhY2t1cF9oJywgJ3NtZF90aHVtYl9iYWNrdXBfYycsICdzbWRfdGh1bWJfZGVmYXVsdF9w cm9maWxlJywgJ3BhbmVfc21kX3RodW1ibmFpbF9wcm9maWxlc192aXNpYmxlJywgJ3BhbmVf c21kX3RodW1ibmFpbHNfdmlzaWJsZScpIik7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KZnVuY3Rpb24gc21kX3RodW1iX3RhYmxlX2V4aXN0KCRhbGw9JycpIHsNCglp ZiAoJGFsbCkgew0KCQkkdGJscyA9IGFycmF5KFNNRF9USFVNQiA9PiA1KTsNCgkJJG91dCA9 IGNvdW50KCR0YmxzKTsNCgkJZm9yZWFjaCAoJHRibHMgYXMgJHRibCA9PiAkY29scykgew0K CQkJaWYgKGdwcygnZGVidWcnKSkgew0KCQkJCWVjaG8gIisrIFRBQkxFICIuJHRibC4iIEhB UyAiLmNvdW50KEBzYWZlX3Nob3coJ2NvbHVtbnMnLCAkdGJsKSkuIiBDT0xVTU5TOyBSRVFV SVJFUyAiLiRjb2xzLiIgKysiLmJyOw0KCQkJfQ0KCQkJaWYgKGNvdW50KEBzYWZlX3Nob3co J2NvbHVtbnMnLCAkdGJsKSkgPT0gJGNvbHMpIHsNCgkJCQkkb3V0LS07DQoJCQl9DQoJCX0N CgkJcmV0dXJuICgkb3V0PT09MCkgPyAxIDogMDsNCgl9IGVsc2Ugew0KCQlpZiAoZ3BzKCdk ZWJ1ZycpKSB7DQoJCQllY2hvICIrKyBUQUJMRSAiLlNNRF9USFVNQi4iIEhBUyAiLmNvdW50 KEBzYWZlX3Nob3coJ2NvbHVtbnMnLCBTTURfVEhVTUIpKS4iIENPTFVNTlM7IjsNCgkJfQ0K CQlyZXR1cm4oQHNhZmVfc2hvdygnY29sdW1ucycsIFNNRF9USFVNQikpOw0KCX0NCn0NCg0K Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KZnVuY3Rpb24gc21kX3RodW1ibmFpbF9zYXZlX3BhbmVfc3RhdGUoKSB7 DQoJJHBhbmVzID0gYXJyYXkoJ3NtZF90aHVtYm5haWxfcHJvZmlsZXMnLCAnc21kX3RodW1i bmFpbHMnKTsNCgkkcGFuZSA9IGdwcygncGFuZScpOw0KCWlmIChpbl9hcnJheSgkcGFuZSwg JHBhbmVzKSkNCgl7DQoJCXNldF9wcmVmKCJwYW5lX3skcGFuZX1fdmlzaWJsZSIsIChncHMo J3Zpc2libGUnKSA9PSAndHJ1ZScgPyAnMScgOiAnMCcpLCAnc21kX3RodW1iJywgUFJFRl9I SURERU4sICd5ZXNub3JhZGlvJywgMCwgUFJFRl9QUklWQVRFKTsNCgkJc2VuZF94bWxfcmVz cG9uc2UoKTsNCgl9IGVsc2Ugew0KCQlzZW5kX3htbF9yZXNwb25zZShhcnJheSgnaHR0cC1z dGF0dXMnID0+ICc0MDAgQmFkIFJlcXVlc3QnKSk7DQoJfQ0KfQ0KDQovLyoqKioqKioqKioq KioqKioqDQovLyBQVUJMSUMgU0lERSBUQUdTDQovLyoqKioqKioqKioqKioqKioqDQovLyAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF90aHVtYm5haWwoJGF0dHMp IHsNCglnbG9iYWwgJHRoaXNpbWFnZTsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSd0 eXBlJyAgICAgPT4gQGdldF9wcmVmKCdzbWRfdGh1bWJfZGVmYXVsdF9wcm9maWxlJyksDQoJ CSdpZCcgICAgICAgPT4gJycsDQoJCSduYW1lJyAgICAgPT4gJycsDQoJCSdlc2NhcGUnICAg PT4gJ2h0bWwnLA0KCQknd3JhcHRhZycgID0+ICcnLA0KCQknY2xhc3MnICAgID0+ICcnLA0K CQknaHRtbF9pZCcgID0+ICcnLA0KCQknc3R5bGUnICAgID0+ICcnLA0KCQknbGluaycgICAg ID0+ICcnLA0KCQknbGlua19yZWwnID0+ICcnLA0KCQkncG9wbGluaycgICA9PiAwLA0KCSks JGF0dHMpKTsNCg0KCWlmICgkbmFtZSkgew0KCQkkbmFtZSA9IGRvU2xhc2goJG5hbWUpOw0K CQkkcnMgPSBzYWZlX3JvdygnKicsICd0eHBfaW1hZ2UnLCAibmFtZSA9ICckbmFtZScgbGlt aXQgMSIpOw0KCX0gZWxzZWlmICgkaWQpIHsNCgkJJGlkID0gKGludCkgJGlkOw0KCQkkcnMg PSBzYWZlX3JvdygnKicsICd0eHBfaW1hZ2UnLCAiaWQgPSAkaWQgbGltaXQgMSIpOw0KCX0g ZWxzZWlmICgkdGhpc2ltYWdlKSB7DQoJCSRpZCA9IChpbnQpICR0aGlzaW1hZ2VbJ2lkJ107 DQoJCSRycyA9IHNhZmVfcm93KCcqJywgJ3R4cF9pbWFnZScsICJpZCA9ICRpZCBsaW1pdCAx Iik7DQoJfSBlbHNlIHsNCgkJdHJpZ2dlcl9lcnJvcihnVHh0KCd1bmtub3duX2ltYWdlJykp Ow0KCQlyZXR1cm47DQoJfQ0KDQoJaWYgKCRycykgew0KCQlleHRyYWN0KCRycyk7DQoJCSR0 aHVtYmluZm8gPSBzYWZlX3JvdygnKicsIFNNRF9USFVNQiwgIm5hbWU9JyIuZG9TbGFzaCgk dHlwZSkuIiciKTsNCgkJaWYgKCR0aHVtYmluZm8pIHsNCgkJCSRwYXRoID0gSU1QQVRILnNh bml0aXplRm9yVXJsKCR0aHVtYmluZm9bJ25hbWUnXSkuRFMuJGlkLiRleHQ7DQoJCQlpZiAo ZmlsZV9leGlzdHMoJHBhdGgpKSB7DQoJCQkJaWYgKCRlc2NhcGUgPT0gJ2h0bWwnKSB7DQoJ CQkJCSRhbHQgPSBodG1sc3BlY2lhbGNoYXJzKCRhbHQpOw0KCQkJCQkkY2FwdGlvbiA9IGh0 bWxzcGVjaWFsY2hhcnMoJGNhcHRpb24pOw0KCQkJCX0NCg0KCQkJCSRtZXRhWydhbHQnXSA9 ICRhbHQ7DQoJCQkJaWYgKCRjYXB0aW9uKSB7ICRtZXRhWyd0aXRsZSddID0gJGNhcHRpb247 IH0NCgkJCQlpZiAoJGh0bWxfaWQgJiYgISR3cmFwdGFnKSB7ICRtZXRhWydpZCddID0gJGh0 bWxfaWQ7IH0NCgkJCQlpZiAoJGNsYXNzICYmICEkd3JhcHRhZykgeyAkbWV0YVsnY2xhc3Mn XSA9ICRjbGFzczsgfSBlbHNlIHsgJGNsYXNzPSR0eXBlOyB9DQoJCQkJaWYgKCRzdHlsZSkg eyAkbWV0YVsnc3R5bGUnXSA9ICRzdHlsZTsgfQ0KDQoJCQkJJG91dCA9IHNtZF90aHVtYl9p bWcoJHRodW1iaW5mbywgJHJzLCAkbWV0YSk7DQoNCgkJCQlpZiAoJGxpbmspIHsNCgkJCQkJ JG91dCA9IGhyZWYoJG91dCwgaW1hZ2VzcmN1cmwoJGlkLCAkZXh0KSwgKCFlbXB0eSgkbGlu a19yZWwpID8gJyByZWw9IicuJGxpbmtfcmVsLiciJyA6ICcnKS4nIHRpdGxlPSInLiRjYXB0 aW9uLiciJyk7DQoJCQkJfSBlbHNlaWYgKCRwb3BsaW5rKSB7DQoJCQkJCSRvdXQgPSAnPGEg aHJlZj0iJy5pbWFnZXNyY3VybCgkaWQsICRleHQpLiciJy4NCgkJCQkJCScgb25jbGljaz0i d2luZG93Lm9wZW4odGhpcy5ocmVmLCBcJ3BvcHVwd2luZG93XCcsICcuDQoJCQkJCQknXCd3 aWR0aD0nLiR3LicsIGhlaWdodD0nLiRoLicsIHNjcm9sbGJhcnMsIHJlc2l6YWJsZVwnKTsg cmV0dXJuIGZhbHNlOyI+Jy4kb3V0Lic8L2E+JzsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gKCR3 cmFwdGFnKSA/IGRvVGFnKCRvdXQsICR3cmFwdGFnLCAkY2xhc3MsICcnLCAkaHRtbF9pZCkg OiAkb3V0Ow0KCQkJfQ0KCQl9DQoJfQ0KDQoJdHJpZ2dlcl9lcnJvcihnVHh0KCd1bmtub3du X2ltYWdlJykpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9u IHNtZF9pZl90aHVtYm5haWwoJGF0dHMsICR0aGluZykgew0KCWdsb2JhbCAkdGhpc2ltYWdl Ow0KCWFzc2VydF9pbWFnZSgpOw0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ3R5cGUn ID0+IEBnZXRfcHJlZignc21kX3RodW1iX2RlZmF1bHRfcHJvZmlsZScpLA0KCSksJGF0dHMp KTsNCg0KCSR0aHVtYmluZm8gPSBzYWZlX3JvdygnKicsIFNNRF9USFVNQiwgIm5hbWU9JyIu ZG9TbGFzaCgkdHlwZSkuIiciKTsNCgkkcmV0ID0gZmFsc2U7DQoJaWYgKCR0aHVtYmluZm8p IHsNCgkJJHBhdGggPSBJTVBBVEguc2FuaXRpemVGb3JVcmwoJHRodW1iaW5mb1snbmFtZSdd KS5EUy4kdGhpc2ltYWdlWydpZCddLiR0aGlzaW1hZ2VbJ2V4dCddOw0KCQkkcmV0ID0gZmls ZV9leGlzdHMoJHBhdGgpOw0KCX0NCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAk cmV0KSk7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gUGx1Z2luLXNw ZWNpZmljIHJlcGxhY2VtZW50IHN0cmluZ3MgLSBsb2NhbGlzZSBhcyByZXF1aXJlZA0KLy8g VE9ETzogbWFrZSB0aGVzZSBpbnRvIGEgdGV4dHBhY2sgd2hlbiBwbHVnaW4gY29tcG9zZXIg c3VwcG9ydHMgdGhlbQ0KZnVuY3Rpb24gc21kX3RodW1iX2dUeHQoJHdoYXQsICRhdHRzID0g YXJyYXkoKSkgew0KCSRsYW5nID0gYXJyYXkoDQoJCSdhY3Rpb25zJyA9PiAnQWN0aW9ucycs DQoJCSdhbGxfc2l6ZXMnID0+ICdBbGwgc2l6ZXMnLA0KCQknYWxsX3RodW1icycgPT4gJ0Ny ZWF0ZSBhbGwnLA0KCQknZGVsZXRlX2NvbmZpcm0nID0+ICdSZWFsbHkgZGVsZXRlIHByb2Zp bGUge25hbWV9PyBJdCB3aWxsIGRlbGV0ZSBBTEwgdGh1bWJuYWlscyBvZiB0aGlzIHR5cGUu JywNCgkJJ25ldycgPT4gJ05ldyBwcm9maWxlJywNCgkJJ3ByZWZzX2luc3RhbGxlZCcgPT4g J1ByZWZlcmVuY2VzIGluc3RhbGxlZCcsDQoJCSdwcm9maWxlX2RlbGV0ZWQnID0+ICdQcm9m aWxlICJ7bmFtZX0iIGRlbGV0ZWQnLA0KCQkncHJvZmlsZV9leGlzdHMnID0+ICdQcm9maWxl ICJ7bmFtZX0iIGFscmVhZHkgZXhpc3RzJywNCgkJJ3Byb2ZpbGVfaGVhZGluZycgPT4gJ1Ro dW1ibmFpbCBwcm9maWxlcycsDQoJCSdxdWFsaXR5JyA9PiAnUXVhbGl0eSAoJSknLA0KCQkn c2hhcnBlbicgPT4gJ1NoYXJwZW4nLA0KCQkndGFibGVzX25vdF9pbnN0YWxsZWQnID0+ICdU YWJsZXMgbm90IGluc3RhbGxlZDogdHJ5IHJlaW5zdGFsbGluZyB0aGUgcGx1Z2luJywNCgkJ J3RodW1ibmFpbF9oZWFkaW5nJyA9PiAnVGh1bWJuYWlscycsDQoJKTsNCglyZXR1cm4gc3Ry dHIoJGxhbmdbJHdoYXRdLCAkYXR0cyk7DQp9IjtzOjQ6InR5cGUiO3M6MToiMSI7czo1OiJv cmRlciI7czoxOiI1IjtzOjU6ImZsYWdzIjtzOjE6IjIiO3M6NDoiaGVscCI7czoxMTAzODoi PGRpdiBpZD0ic21kX2hlbHAiPgoKCTxoMT5zbWRfdGh1bWJuYWlsPC9oMT4KCgk8aDI+RmVh dHVyZXM8L2gyPgoKCTx1bD4KCQk8bGk+QXNzaWduIGFueSBudW1iZXIgb2YgdGh1bWJuYWls cyB0byA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiYjODIxNztzIGltYWdlczwvbGk+ CgkJPGxpPkJhdGNoIGFzc2lnbiB0aHVtYm5haWxzIHRvIGFsbCBleGlzdGluZyBpbWFnZXM8 L2xpPgoJCTxsaT5TZXQgb25lIHRodW1ibmFpbCBzaXplIGFzIGRlZmF1bHQ8L2xpPgoJCTxs aT5EaXNwbGF5IGFueSBvZiB0aGUgdGh1bWJuYWlsIHNpemVzIG9uIHlvdXIgc2l0ZTwvbGk+ CgkJPGxpPkNvbmRpdGlvbmFsIHRodW1ibmFpbCBjaGVjayBhdmFpbGFibGU8L2xpPgoJPC91 bD4KCgk8aDI+QXV0aG9yIC8gY3JlZGl0czwvaDI+CgoJPHA+V3JpdHRlbiBieSA8YSBocmVm PSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vY29udGFjdCI+U3RlZiBEYXdzb248L2E+LiBNYW55 IHRoYW5rcyB0byB0aGUgYmV0YSB0ZXN0IGNyZXcgd2hvIG9mZmVyZWQgZmVhdHVyZSBhbmQg d29ya2Zsb3cgYWR2aWNlLCBlc3BlY2lhbGx5IHRoZWJvbWJzaXRlLCBqYWtvYiBhbmQganN0 dWJicy48L3A+CgoJPGgyPkluc3RhbGxhdGlvbiAvIHVuaW5zdGFsbGF0aW9uPC9oMj4KCgk8 cCBjbGFzcz0iaW1wb3J0YW50Ij5SZXF1aXJlcyBQSFA1KyBhbmQgPHNwYW4gY2xhc3M9ImNh cHMiPlRYUDwvc3Bhbj4gNC4zLjArPC9wPgoKCTxwPkRvd25sb2FkIHRoZSBwbHVnaW4gZnJv bSBlaXRoZXIgPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm9yZy9wbHVnaW5zLzExODYv c21kX3RodW1ibmFpbCI+dGV4dHBhdHRlcm4ub3JnPC9hPiwgb3IgdGhlIDxhIGhyZWY9Imh0 dHA6Ly9zdGVmZGF3c29uLmNvbS9zdyI+c29mdHdhcmUgcGFnZTwvYT4sIHBhc3RlIHRoZSBj b2RlIGludG8gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IEFkbWluIC0mZ3Q7 IFBsdWdpbnMgcGFuZSwgaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBwbHVnaW4uIFZpc2l0IHRo ZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/ aWQ9MzQzNjciPmZvcnVtIHRocmVhZDwvYT4gZm9yIG1vcmUgaW5mbyBvciB0byByZXBvcnQg b24gdGhlIHN1Y2Nlc3Mgb3Igb3RoZXJ3aXNlIG9mIHRoZSBwbHVnaW4uPC9wPgoKCTxwPlRv IHVuaW5zdGFsbCwgZGVsZXRlIGZyb20gdGhlIEFkbWluIC0mZ3Q7IFBsdWdpbnMgcGFnZS4g Tm9uZSBvZiB5b3VyIGV4aXN0aW5nIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+LXN0 eWxlIHRodW1ibmFpbHMgd2lsbCBiZSB0b3VjaGVkLjwvcD4KCgk8aDI+VXNhZ2UgJiM4MjEy OyBhZG1pbiBzaWRlPC9oMj4KCgk8cD5WaXNpdCB0aGUgQ29udGVudC0mZ3Q7SW1hZ2VzIHRh Yi4gQWJvdmUgdGhlIGxpc3Qgb2YgaW1hZ2VzIGlzIGFuIGFyZWEgbGFiZWxsZWQgPGVtPlRo dW1ibmFpbCBQcm9maWxlczwvZW0+LiBDbGljayBpdCB0byByZXZlYWwgdGhlIGNvbnRyb2wg cGFuZWwuIFlvdSBjYW4gdG9nZ2xlIHRoaXMgcGFuZWwgb24gYW5kIG9mZiBieSBjbGlja2lu ZyB0aGUgaGVhZGluZy48L3A+CgoJPHA+WW91IG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBw cm9maWxlIHRvIGJlZ2luIHdpdGgsIHNvIGNsaWNrIHRoZSA8ZW0+TmV3IHByb2ZpbGU8L2Vt PiBidXR0b24uIFRoaXMgd2lsbCByZXZlYWwgZWRpdCBib3hlcyB3aGVyZSB5b3UgY2FuIGVu dGVyOjwvcD4KCgk8dWw+CgkJPGxpPjxzdHJvbmc+TmFtZTwvc3Ryb25nPjogc29tZSBkZXNj cmlwdGl2ZSBuYW1lIGZvciB0aGlzIHRodW1ibmFpbCBkaW1lbnNpb24uIFlvdSBhcmUgbGlt aXRlZCB0byB1c3VhbCBub24td2VpcmQgY2hhcmFjdGVycyBpbiB0aGUgbmFtZTwvbGk+CgkJ PGxpPjxzdHJvbmc+V2lkdGg8L3N0cm9uZz46IHRodW1ibmFpbCB3aWR0aCwgaW4gcGl4ZWxz LiBJZiBsZWZ0IGJsYW5rIChvciBzZXQgdG8gMCkgYW5kIGhlaWdodCBpcyBzcGVjaWZpZWQs IHRoZSB3aWR0aCB3aWxsIGJlIGNvbXB1dGVkIGluIHByb3BvcnRpb24gdG8gdGhlIGhlaWdo dDwvbGk+CgkJPGxpPjxzdHJvbmc+SGVpZ2h0PC9zdHJvbmc+OiB0aHVtYm5haWwgaGVpZ2h0 LCBpbiBwaXhlbHMuIElmIGxlZnQgYmxhbmsgKG9yIHNldCB0byAwKSBhbmQgd2lkdGggaXMg c3BlY2lmaWVkLCB0aGUgaGVpZ2h0IHdpbGwgYmUgY29tcHV0ZWQgaW4gcHJvcG9ydGlvbiB0 byB0aGUgd2lkdGg8L2xpPgoJCTxsaT48c3Ryb25nPlF1YWxpdHkgKCUpPC9zdHJvbmc+OiBU aGUgcXVhbGl0eSBvZiB0aGUgcmVzdWx0aW5nIHRodW1ibmFpbC4gR2VuZXJhbGx5IG9ubHkg b2YgdXNlIGZvciBqcGcgb3IgcG5nKDI0KSBpbWFnZXMuIFRoZSBoaWdoZXIgdGhlIHZhbHVl IHRoZSBiZXR0ZXIgdGhlIHF1YWxpdHkgYW5kIHRoZSBiaWdnZXIgdGhlIGZpbGUgc2l6ZS4g RGVmYXVsdDogNzU8L2xpPgoJCTxsaT48c3Ryb25nPkNyb3A8L3N0cm9uZz46IHdoZXRoZXIg dG8gY3JvcCB0aGUgaW1hZ2Ugd2hlbiB0aGUgdGh1bWJuYWlsIGlzIGNyZWF0ZWQsIG9yIHNj YWxlIGl0IHRvIGZpdDwvbGk+CgkJPGxpPjxzdHJvbmc+U2hhcnBlbjwvc3Ryb25nPjogd2hl dGhlciB0byBhcHBseSBhIHNoYXJwZW5pbmcgZmlsdGVyIHRvIHRoZSB0aHVtYm5haWwgd2hl biBpdCBpcyBjcmVhdGVkLiBVc2VmdWwgZm9yIHZlcnkgc21hbGwgaW1hZ2VzPC9saT4KCQk8 bGk+PHN0cm9uZz5BY3RpdmU8L3N0cm9uZz46IEVuYWJsZS9kaXNhYmxlIHRoaXMgdGh1bWJu YWlsIHNpemUgc28gaXQgd2lsbC93b24mIzgyMTc7dCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVy YXRlZCB3aGVuIHRoZSBuZXh0IGltYWdlIGlzIHVwbG9hZGVkLiBDbGljayB0aGUgY2hlY2ti b3ggdG8gaW5zdGFudGx5IHN3aXRjaCB0aGUgcHJvZmlsZSBvbi9vZmYuIENsaWNrIHRoZSAm IzgyMTY7QWN0aXZlJiM4MjE3OyB3b3JkIGluIHRoZSBoZWFkaW5nIHJvdyB0byB0b2dnbGUg dGhlIHN0YXR1cyBvZiBhbGwgcHJvZmlsZXMuIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgZ292 ZXJucyBob3cgdGhlIDxhIGhyZWY9IiNjcmVhdGUiPkFsbCBzaXplczwvYT4gZHJvcGRvd24g ZW50cnkgaW50ZXJhY3RzIHdpdGggdGhlIDxlbT5DcmVhdGU8L2VtPiBhbmQgPGVtPkRlbGV0 ZTwvZW0+IGJ1dHRvbnM8L2xpPgoJCTxsaT48c3Ryb25nPkRlZmF1bHQ8L3N0cm9uZz46IHNl dCB0aGlzIHRodW1ibmFpbCBwcm9maWxlIGFzIHRoZSBkZWZhdWx0LiBUaGUgZGVmYXVsdCBp bWFnZSB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgSW1hZ2VzIGxpc3QgYW5kIHdpbGwgYWxz byBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHNpemUgdG8gYmUgZGlzcGxheWVkIHVzaW5nIDxj b2RlPiZsdDt0eHA6c21kX3RodW1ibmFpbC8mZ3Q7PC9jb2RlPjwvbGk+Cgk8L3VsPgoKCTxw Pk9uY2UgeW91JiM4MjE3O3ZlIGNvbmZpZ3VyZWQgeW91ciBwcm9maWxlLCBjbGljayBTYXZl IHRvIHN0b3JlIGl0LiBZb3UgY2FuIGFsd2F5cyBlZGl0IGl0IGFnYWluIGJ5IGNsaWNraW5n IGl0cyBuYW1lLiBHbyBhaGVhZCBhbmQgY3JlYXRlIHNvbWUgbW9yZSBwcm9maWxlcyBmb3Ig dGh1bWJuYWlscyBvZiBkaWZmZXJlbnQgc2l6ZXMvcGFyYW1ldGVycy4gSWYgeW91IHdpc2gg dG8gZGVsZXRlIGEgcHJvZmlsZSwgaGl0IHRoZSA8ZW0+W0RlbGV0ZV08L2VtPiBidXR0b24g YW5kIGNvbmZpcm0uIDxzdHJvbmc+QWxsIHRodW1ibmFpbHMgYXNzb2NpYXRlZCB3aXRoIHRo YXQgcHJvZmlsZSB3aWxsIGJlIGRlbGV0ZWQ8L3N0cm9uZz4uPC9wPgoKCTxwPkF0IHRoaXMg cG9pbnQsIG5vIHRodW1ibmFpbHMgaGF2ZSBiZWVuIGNyZWF0ZWQuIExldCYjODIxNztzIHJl Y3RpZnkgdGhhdC48L3A+CgoJPGgzIGlkPSJjcmVhdGUiPkNyZWF0aW5nIHRodW1ibmFpbHM8 L2gzPgoKCTxwPlBpY2sgb25lIG9mIHlvdXIgaW1hZ2VzIGFuZCBjbGljayB0byBlZGl0IGl0 LjwvcD4KCgk8cD5CZW5lYXRoIHRoZSBtYWluIHBpY3R1cmUgeW91IHdpbGwgc2VlIGFuIGFy ZWEgbGFiZWxsZWQgPGVtPlRodW1ibmFpbHM8L2VtPi4gWW91IGNhbiB0b2dnbGUgdGhpcyBw YW5lbCBvbiBhbmQgb2ZmIGJ5IGNsaWNraW5nIHRoZSBoZWFkaW5nLjwvcD4KCgk8cD5JbnNp ZGUgdGhlIHBhbmVsIGlzIGEgc2ltcGxlIHNlbGVjdCBsaXN0IGNvbnRhaW5pbmcgb25lIGVu dHJ5IGZvciBlYWNoIHRodW1ibmFpbCBwcm9maWxlIHlvdSBoYXZlIGNvbmZpZ3VyZWQsIHBs dXMgdGhlIHNwZWNpYWwgZW50cnkgPGVtPkFsbCBzaXplczwvZW0+LiBZb3UgY2FuIHNlbGVj dCBvbmUgb2YgdGhlc2UgZW50cmllcyBhbmQgY2xpY2sgPGVtPkNyZWF0ZTwvZW0+IHRvIGNy ZWF0ZSB0aHVtYm5haWwocykgaW4gdGhlIHNlbGVjdGVkIHNpemUgb3IgaGl0IDxlbT5EZWxl dGU8L2VtPiB0byByZW1vdmUgdGhlIHNlbGVjdGVkIHRodW1ibmFpbChzKS48L3A+CgoJPHA+ T25jZSBjcmVhdGVkLCB0aGUgdGh1bWJuYWlscyBhcHBlYXIgaW4gdGhlIHBhbmVsOyByZW1l bWJlciB0aGV5IGNhbiBiZSB0dWNrZWQgYXdheSBpZiB5b3UgZG9uJiM4MjE3O3Qgd2FudCB0 byBsb29rIGF0IHRoZW0uPC9wPgoKCTxwPklmIHlvdSBzZWxlY3QgPGVtPkFsbCBzaXplczwv ZW0+IGFuZCBoaXQgPGVtPkNyZWF0ZTwvZW0+LCB5b3Ugd2lsbCBnZXQgb25lIHRodW1ibmFp bCBmb3IgZWFjaCBhY3RpdmUgcHJvZmlsZS4gU2ltaWxhcmx5LCBpZiB5b3UgaGl0IDxlbT5E ZWxldGU8L2VtPiBhbnkgdGh1bWJuYWlscyBzdG9yZWQgYWdhaW5zdCBhbiBhY3RpdmUgcHJv ZmlsZSBmb3IgdGhlIGN1cnJlbnQgaW1hZ2Ugd2lsbCBiZSByZW1vdmVkLiBCeSB0b2dnbGlu ZyBjZXJ0YWluIHRodW1ibmFpbCBwcm9maWxlcyBvbi9vZmYgeW91IGNhbiBjb250cm9sIHdo aWNoIG9uZXMgYXJlIGNyZWF0ZWQgb3IgZGVsZXRlZC48L3A+CgoJPHA+V2hlbiB5b3UgdXBs b2FkIGEgbmV3IGltYWdlIG9yIHJlcGxhY2UgYW4gZXhpc3RpbmcgaW1hZ2UsIHRodW1ibmFp bHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIGFueSBhY3RpdmUgcHJvZmls ZXMuIE5vdGUgdGhhdCBpZiB5b3UgdXNlIHRoZSBtdWx0aS1lZGl0IHRvb2wgdG8gZGVsZXRl IGltYWdlcywgPHN0cm9uZz5hbGw8L3N0cm9uZz4gY29ycmVzcG9uZGluZyB0aHVtYm5haWxz IGZvciB0aGUgc2VsZWN0ZWQgaW1hZ2VzIChpbmNsdWRpbmcgaW5hY3RpdmUgb25lcykgd2ls bCBiZSByZW1vdmVkLjwvcD4KCgk8aDMgaWQ9ImN1c3RvbSI+Q3VzdG9tIHRodW1ibmFpbHM8 L2gzPgoKCTxwPklmIHlvdSBwcmVmZXIgdG8gbWFrZSB5b3VyIG93biB0aHVtYnMgaW4gYW4g ZXh0ZXJuYWwgcHJvZ3JhbSwgeW91IGNhbiBzdGlsbCBzZXQgdXAgdGhlIHByb2ZpbGVzIGFz IG5vcm1hbCBidXQgaW5zdGVhZCBvZiBjbGlja2luZyA8ZW0+Q3JlYXRlPC9lbT4gaW4gdGhl IEltYWdlIEVkaXQgc2NyZWVuLCB5b3UgY2FuIHNlbGVjdCBhIHByb2ZpbGUgc2l6ZSBmcm9t IHRoZSBkcm9wZG93biBhbmQgdXNlIHRoZSBCcm93c2UmIzgyMzA7IGZhY2lsaXR5IHRvIGNo b29zZSBhIHRodW1ibmFpbCBmcm9tIHlvdXIgaGFyZCBkcml2ZS4gV2hlbiB5b3UgY2xpY2sg PGVtPlVwbG9hZDwvZW0+IHRoZSBpbWFnZSB3aWxsIGJlIGluc2VydGVkIGFnYWluc3QgdGhl IHNlbGVjdGVkIHByb2ZpbGUuPC9wPgoKCTxwPkF0IGFueSB0aW1lIHlvdSBjYW4gY2xpY2sg b25lIG9mIHRoZSB0aHVtYm5haWxzIChvciBzZWxlY3QgYSBzaXplIGZyb20gdGhlIGRyb3Bk b3duKSBhbmQgQnJvd3NlJiM4MjMwOyBmb3IgYW5vdGhlciBpbWFnZSB0byByZXBsYWNlIHRo ZSBleGlzdGluZyB0aHVtYm5haWwgJiM4MjEyOyBldmVuIG9uZXMgdGhhdCBoYXZlIGJlZW4g YXV0by1jcmVhdGVkLiBTb21lIHRoaW5ncyB0byBub3RlIGFib3V0IHRoaXMgZmVhdHVyZTo8 L3A+CgoJPHVsPgoJCTxsaT50aGUgdGh1bWJuYWlsIG11c3QgYmUgb2YgdGhlIHNhbWUgZmls ZSB0eXBlIGFzIHRoZSBvcmlnaW5hbCBpbWFnZSBvciB0aGUgdXBsb2FkIHdpbGwgYmUgaWdu b3JlZDwvbGk+CgkJPGxpPnRodW1icyBjYW5ub3QgaGF2ZSBkaW1lbnNpb25zIGdyZWF0ZXIg dGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2Ugb3IgdGhlIHVwbG9hZCB3aWxsIGJlIGlnbm9yZWQ8 L2xpPgoJCTxsaT55b3UgY2FuIGNsaWNrIGEgaGlnaGxpZ2h0ZWQgaW1hZ2UgdG8gZGVzZWxl Y3QgaXQ8L2xpPgoJCTxsaT55b3UgY2Fubm90IEJyb3dzZSBmb3IgYW4gaW1hZ2UgdW5sZXNz IHlvdSBoYXZlIGNob3NlbiBvbmUgcHJvZmlsZTwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0iYmF0 Y2giPkJhdGNoIHRodW1ibmFpbCBjcmVhdGlvbjwvaDM+CgoJPHA+WW91IGNhbiBhbHNvIGNy ZWF0ZSB0aHVtYm5haWxzIGVuLW1hc3NlLiBGcm9tIHRoZSBtYWluIDxlbT5UaHVtYm5haWwg cHJvZmlsZXM8L2VtPiBwYW5lbCwgaWYgeW91IGhpdCA8ZW0+Q3JlYXRlIGFsbDwvZW0+IHRo ZSBwbHVnaW4gd2lsbCBnbyBhd2F5IGFuZCBjcmVhdGUgdGh1bWJuYWlscyBmb3IgZXZlcnkg YWN0aXZlIHByb2ZpbGUgZm9yIGFsbCBjdXJyZW50bHkgaW5zdGFsbGVkIGltYWdlcy4gVGhp cyBpcyBhIHF1aWNrIHdheSB0byBnZW5lcmF0ZSB0aHVtYnMgZm9yIHlvdXIgZXhpc3Rpbmcg aW1hZ2VzLjwvcD4KCgk8cD5CZWNhdXNlIG9mIHRoZSBuYXR1cmUgb2YgdGhpcyB0b29sICYj ODIxMjsgZXNwZWNpYWxseSB3aXRoIGxhcmdlIGltYWdlIHBvb2xzICYjODIxMjsgdGhlIHBy b2Nlc3MgaXMgZG9uZSBhcyBhIGJhY2tncm91bmQgdGFzayB2aWEgPHNwYW4gY2xhc3M9ImNh cHMiPkFKQVg8L3NwYW4+LiBBZnRlciBjbGlja2luZyB0aGUgPGVtPkNyZWF0ZSBhbGw8L2Vt PiBidXR0b24gYSBjb3VudGVyIHdpbGwgYXBwZWFyIGluIHRoZSB0b3AtcmlnaHQgb2YgdGhl IGNvbnRyb2wgcGFuZWwgc2hvd2luZyBob3cgbWFueSBpbWFnZXMgaXQgaGFzIHByb2Nlc3Nl ZCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBpbWFnZXMgaW5zdGFsbGVkLiBXaGVuIGl0JiM4 MjE3O3MgZG9uZSwgdGhlIG51bWJlcnMgd2lsbCBkaXNhcHBlYXIuIElmIHlvdSB0aGVuIHJl ZnJlc2ggeW91ciBJbWFnZXMgdGFiIHlvdSB3aWxsIHNlZSB5b3VyIGNob3NlbiBkZWZhdWx0 IHRodW1ibmFpbHMgaW4gdGhlIGxpc3QgKGFzc3VtaW5nIHlvdSYjODIxNzt2ZSBzZXQgb25l IGFzIGRlZmF1bHQhKTwvcD4KCgk8aDIgaWQ9InVzYWdlIj5Vc2FnZSAmIzgyMTI7IHB1Ymxp YyBzaWRlPC9oMj4KCgk8cD5Ud28gbmV3IHRhZ3MgYXJlIGF2YWlsYWJsZSB0byBkaXNwbGF5 IHlvdXIgdGh1bWJuYWlscy48L3A+CgoJPGgzIGlkPSJzbWRfdGh1bWIiPjxjb2RlPiZsdDt0 eHA6c21kX3RodW1ibmFpbC8mZ3Q7PC9jb2RlPjwvaDM+CgoJPHA+QSBkaXJlY3QgcmVwbGFj ZW1lbnQgZm9yIHRoZSBidWlsdCBpbiA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4ubmV0 L3dpa2kvaW5kZXgucGhwP3RpdGxlPXRodW1ibmFpbCI+dHhwOnRodW1ibmFpbDwvYT4gdGFn IHdpdGggZXhhY3RseSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFuZCBhdHRyaWJ1dGVzIGFw YXJ0IGZyb20gdGhlc2UgZXhjZXB0aW9uczo8L3A+CgoJPHVsPgoJCTxsaT48c3BhbiBjbGFz cz0iYXRubSI+dHlwZTwvc3Bhbj4gOiB1c2UgdGhpcyBhdHRyaWJ1dGUgdG8gZGlzcGxheSB0 aHVtYm5haWxzIG9mIHRoZSBnaXZlbiBwcm9maWxlIG5hbWUuIGUuZy4gPGNvZGU+dHlwZT0m cXVvdDtsYXJnZSZxdW90OzwvY29kZT4uIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIGF0 dHJpYnV0ZSwgdGhlIGRlZmF1bHQgcHJvZmlsZSB3aWxsIGJlIHVzZWQuIElmIHRoZXJlIGlz IG5vIGRlZmF1bHQgcHJvZmlsZSB5b3UmIzgyMTc7bGwgc2VlIHdhcm5pbmcgbWVzc2FnZXM8 L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+Y2xhc3M8L3NwYW4+IDogaWYgb21pdHRl ZCwgdGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgd2lsbCBiZSB1c2VkIGFzIGEgY2xhc3MgbmFt ZSBmb3IgdGhlIGltZyB0YWcuIElmIHlvdSBzcGVjaWZ5IGEgd3JhcHRhZyBhbmQgb21pdCB0 aGUgY2xhc3MsIHRoZSBwcm9maWxlIG5hbWUgd2lsbCBiZSB1c2VkIGFzIGEgY2xhc3Mgb24g Ym90aCB0aGUgY29udGFpbmVyIGFuZCB0aGUgaW1nIHRhZzwvbGk+CgkJPGxpPjxzcGFuIGNs YXNzPSJhdG5tIj5hbGlnbjwvc3Bhbj4gOiB0aGlzIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1v dmVkPC9saT4KCTwvdWw+CgoJPHA+VGhlIHRhZyB3b3JrcyBpbnNpZGUgPGNvZGU+Jmx0O3R4 cDppbWFnZV9saXN0Jmd0OzwvY29kZT4gb3IgY2FuIGJlIHVzZWQgc3RhbmRhbG9uZSBieSBz cGVjaWZ5aW5nIHRoZSA8Y29kZT5pZDwvY29kZT4gb3IgPGNvZGU+bmFtZTwvY29kZT4gYXR0 cmlidXRlLjwvcD4KCgk8aDMgaWQ9InNtZF9pZl90aHVtYiI+PGNvZGU+Jmx0O3R4cDpzbWRf aWZfdGh1bWJuYWlsLyZndDs8L2NvZGU+PC9oMz4KCgk8cD5BIGRpcmVjdCByZXBsYWNlbWVu dCBmb3IgdGhlIGJ1aWx0IGluIDxjb2RlPiZsdDt0eHA6aWZfdGh1bWJuYWlsIC8mZ3Q7PC9j b2RlPiB0YWcgd2l0aCBleGFjdGx5IHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuIEl0IGhhcyBv bmUgYXR0cmlidXRlOjwvcD4KCgk8dWw+CgkJPGxpPjxzcGFuIGNsYXNzPSJhdG5tIj50eXBl PC9zcGFuPiA6IHVzZSB0aGlzIGF0dHJpYnV0ZSB0byBjaGVjayBmb3IgdGh1bWJuYWlscyBv ZiB0aGUgZ2l2ZW4gcHJvZmlsZSBuYW1lLiBlLmcuIDxjb2RlPnR5cGU9JnF1b3Q7TWVkaXVt JnF1b3Q7PC9jb2RlPi4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoaXMgYXR0cmlidXRlLCB0 aGUgZGVmYXVsdCBwcm9maWxlIHdpbGwgYmUgdGVzdGVkLiBJZiB0aGVyZSBpcyBubyBkZWZh dWx0IHByb2ZpbGUgdGhlIHRhZyB3aWxsIGFsd2F5cyByZW5kZXIgdGhlIDxjb2RlPiZsdDt0 eHA6ZWxzZSAvJmd0OzwvY29kZT4gcG9ydGlvbjwvbGk+Cgk8L3VsPgoKCTxoMiBpZD0iaG93 X2l0X3dvcmtzIj5Ib3cgaXQgd29ya3M8L2gyPgoKCTxwPkZvciByZWZlcmVuY2UsIHdoZW4g eW91IGNyZWF0ZSBhIHByb2ZpbGUgYSBkaXJlY3RvcnkgaXMgY3JlYXRlZCB3aXRoIHRoYXQg bmFtZSBpbnNpZGUgeW91ciA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiA8Y29kZT5p bWFnZXM8L2NvZGU+IGZvbGRlci4gSW5zaWRlIHRoaXMgZm9sZGVyIHlvdSB3aWxsIGZpbmQg aW1hZ2VzIG9mIHRoZSBmb3JtYXQgPGNvZGU+aWQuZXh0PC9jb2RlPjogd2hlcmUgPGNvZGU+ aWQ8L2NvZGU+IGFuZCA8Y29kZT5leHQ8L2NvZGU+IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5n IGltYWdlIElEcyBpbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gZGF0YWJh c2UuIFRoYXQmIzgyMTc7cyBwcmV0dHkgbXVjaCBpdC48L3A+CgoJPHA+WW91IGNhbiBkZWxl dGUgdGh1bWJuYWlsIGZpbGVzIG1hbnVhbGx5IGZyb20gYW55IG9mIHRoZXNlIGRpcmVjdG9y aWVzIGFuZCB0aGUgcGx1Z2luIHdpbGwgZmlndXJlIGV2ZXJ5dGhpbmcgb3V0LiBCdXQgaXQm IzgyMTc7cyBwcm9iYWJseSBub3QgYWR2aXNhYmxlIHRvIGRlbGV0ZSB0aGUgZGlyZWN0b3Jp ZXMgdGhlbXNlbHZlcyAmIzgyMTI7IHVzZSB0aGUgPGVtPltEZWxldGVdPC9lbT4gYnV0dG9u cyBpbiB0aGUgY29udHJvbCBwYW5lbCBmb3IgdGhhdC48L3A+CgoJPGgyIGlkPSJjaGFuZ2Vs b2ciPkNoYW5nZWxvZzwvaDI+CgoJPHVsPgoJCTxsaT4wNiBBdWcgMTAgfCAwLjEwYmV0YSB8 IEluaXRpYWwgYmV0YSByZWxlYXNlPC9saT4KCQk8bGk+MDQgT2N0IDEwIHwgMC4xMCB8IE9m ZmljaWFsIHB1YmxpYyByZWxlYXNlPC9saT4KCTwvdWw+Cgo8L2Rpdj4KPCEtLSAqKiogQkVH SU4gUExVR0lOIENTUyAqKiogLS0+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiNzbWRfaGVs cCB7IGxpbmUtaGVpZ2h0OjEuNSA7fQojc21kX2hlbHAgY29kZSB7IGZvbnQtd2VpZ2h0OmJv bGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBjb3VyaWVyLCBtb25vc3BhY2U7 IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQojc21kX2hlbHAgY29kZS5ibG9jayB7IGZv bnQtd2VpZ2h0Om5vcm1hbDsgYm9yZGVyOjFweCBkb3R0ZWQgIzk5OTsgYmFja2dyb3VuZC1j b2xvcjogI2YwZTY4YzsgZGlzcGxheTpibG9jazsgbWFyZ2luOjEwcHggMTBweCAyMHB4OyBw YWRkaW5nOjEwcHg7IH0KI3NtZF9oZWxwIGgxIHsgY29sb3I6ICMzNjk7IGZvbnQ6IDIwcHgg R2VvcmdpYSwgc2Fucy1zZXJpZjsgbWFyZ2luOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0K I3NtZF9oZWxwIGgyIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5n OjEwcHggMCAwOyBjb2xvcjogIzM2OTsgZm9udDogMTdweCBHZW9yZ2lhLCBzYW5zLXNlcmlm OyB9CiNzbWRfaGVscCBoMyB7IGNvbG9yOiAjMjc1Njg1OyBmb250OiBib2xkIDEycHggQXJp YWwsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAwIDA7 dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9 CiNzbWRfaGVscCBoNCB7IGZvbnQ6IGJvbGQgMTFweCBBcmlhbCwgc2Fucy1zZXJpZjsgbGV0 dGVyLXNwYWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAgMCA7dGV4dC10cmFuc2Zvcm06IHVw cGVyY2FzZTsgfQojc21kX2hlbHAgLmF0bm0geyBmb250LXdlaWdodDpib2xkOyBjb2xvcjoj MzNkOyB9CiNzbWRfaGVscCAubWFuZCB7IGJhY2tncm91bmQ6I2VlZTsgYm9yZGVyOjFweCBk b3R0ZWQgIzk5OTsgfQojc21kX2hlbHAgdGFibGUge3dpZHRoOjkwJTsgdGV4dC1hbGlnbjpj ZW50ZXI7IHBhZGRpbmctYm90dG9tOjFlbTt9CiNzbWRfaGVscCB0ZCwgI3NtZF9oZWxwIHRo IHtib3JkZXI6MXB4IHNvbGlkICM5OTk7IHBhZGRpbmc6LjVlbSAwO30KI3NtZF9oZWxwIHVs IHsgbGlzdC1zdHlsZS10eXBlOnNxdWFyZTsgfQojc21kX2hlbHAgLmltcG9ydGFudCB7Y29s b3I6cmVkO30KI3NtZF9oZWxwIGxpIHsgbWFyZ2luOjVweCAyMHB4IDVweCAzMHB4OyB9CiNz bWRfaGVscCAuYnJlYWsgeyBtYXJnaW4tdG9wOjVweDsgfQo8L3N0eWxlPgo8IS0tICoqKiBF TkQgUExVR0lOIENTUyAqKiogLS0+CiI7czozOiJtZDUiO3M6MzI6ImExYWUzZGJhM2JmNDI3 MmU1MGE5MzdiMTYxY2M2MzM4Ijt9