# smd_remote_file 0.32 # Allows remote URL files to be handled from the Files tab # Stef Dawson # http://stefdawson.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTU6InNtZF9yZW1vdGVfZmlsZSI7czo2OiJhdXRob3IiO3M6MTE6IlN0ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nvbi5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4zMiI7czoxMToiZGVzY3JpcHRpb24iO3M6NTY6IkFsbG93cyByZW1vdGUgVVJMIGZpbGVzIHRvIGJlIGhhbmRsZWQgZnJvbSB0aGUgRmlsZXMgdGFiIjtzOjQ6ImhlbHAiO3M6MjcxMjoiPHN0eWxlPg0KY29kZSB7Y29sb3I6ICMyMDQ2NmZ9DQpwcmUge3BhZGRpbmc6IDAuNWVtIDFlbTsgYmFja2dyb3VuZDogI2VlZTsgYm9yZGVyOiAxcHggZGFzaGVkICNjY2M7fQ0KaDEsIGgyLCBoMywgaDMgY29kZSB7Zm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkO30NCmgxLCBoMiwgaDMge21hcmdpbi1sZWZ0OiAtMWVtO30NCmgyLCBoMyB7bWFyZ2luLXRvcDogMmVtO30NCmgxIHtmb250LXNpemU6IDNlbTt9DQpoMiB7Zm9udC1zaXplOiAyZW07fQ0KaDMge2ZvbnQtc2l6ZTogMS41ZW07fQ0KbGkgYSBjb2RlIHtmb250LXdlaWdodDogbm9ybWFsO30NCi5yZXF1aXJlZCwgLndhcm5pbmcge2NvbG9yOnJlZDt9DQojZWd0YWIgdGQsI2VndGFiIHRoIHtwYWRkaW5nOi43ZW07IGJvcmRlcjoxcHggc29saWQgIzg4ODt0ZXh0LWFsaWduOmNlbnRlcjt9DQo8L3N0eWxlPg0KPGgxIGlkPSJ0b3AiPnNtZF9yZW1vdGVfZmlsZTwvaDE+DQo8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2FnZSwgYnVncywgZmVhdHVyZXMgZXRjLCBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTI0NjczIj52aXNpdCB0aGUgZm9ydW0gdGhyZWFkPC9hPi4gRm9yIG90aGVyIHNvZnR3YXJlIGJ5IG1lLCBvciB0byBtYWtlIGEgZG9uYXRpb24sIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3N3Ij5zb2Z0d2FyZSBwYWdlPC9hPi48L3A+DQoNCjxwPlRvIHNhdmUgc3BhY2UgaW4gdGhlIHBsdWdpbiwgdGhlIGZvbGxvd2luZyB0YWJsZSBvZiBjb250ZW50cyBhbGwgbGluayBiYWNrIHRvIG15IHdlYiBzaXRlIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIGZ1bGwgdmVyc2lvbiBvZiB0aGUgZG9jcyBhcmUgc3VwcGxpZWQgaW4gdGhlIHBsdWdpbiB6aXAgcGFja2FnZSBpbiBjYXNlIHRoZSBzaXRlIGlzIHVuYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbi48L3A+DQoNCjxoMiBpZD0iY29udGVudHMiPkNvbnRlbnRzPC9oMj4NCjx1bD4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI292ZXJ2aWV3Ij5PdmVydmlldzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjcHJlcmVxIj5CZWZvcmUgeW91IGJlZ2luPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmaWxlc3RhYiI+VGhlIEZpbGVzIHRhYjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjbXVsdGlwbGVzIj5NdWx0aXBsZSBwZXJzb25hbGl0aWVzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmZGwiPnNtZF9maWxlX2Rvd25sb2FkX2xpbms8L2E+DQo8dWw+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmZGxpZCI+aWQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkbGZpbGVuYW1lIj5maWxlbmFtZTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRsY2hvb3NlIj5jaG9vc2U8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkbHNob3dsaW5rIj5zaG93X2xpbms8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkaSI+c21kX2ZpbGVfZG93bmxvYWRfaW1hZ2U8L2E+DQo8dWw+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmZGlpZCI+aWQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkaWZpbGVuYW1lIj5maWxlbmFtZTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkaXRodW1iIj50aHVtYjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpaWZtaXNzaW5nIj5pZm1pc3Npbmc8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkaXdyYXB0YWciPndyYXB0YWc8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkaWNsYXNzIj5jbGFzczwvYT48L2xpPg0KPC91bD48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjaG93aXR3b3JrcyI+SG93IGl0IHdvcmtzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNleGFtcGxlcyI+RXhhbXBsZXM8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2NyZWRpdHMiPkNyZWRpdHM8L2E+PC9saT4NCjwvdWw+IjtzOjQ6ImNvZGUiO3M6MTI5NDA6Ii8vIHYwLjEgICBJbml0aWFsIHB1YmxpYyByZWxlYXNlDQovLyB2MC4yICAgRml4ZWQgZG93bmxvYWQgY291bnRlci4gQWRkZWQgKHRlbnRhdGl2ZSkgaW50ZXJmYWNlIG1lc3NhZ2VzIHRoYXQgbWF5IGJyZWFrIGluIGxhdGVyIHZlcnNpb25zIG9mIFRYUA0KLy8gdjAuMyAgIFJlbW92ZWQgLmxpbmsgd2hlbiB1c2luZyBzbWRfZmlsZV9kb3dubG9hZF9saW5rLiBBZGRlZCBzaG93X2xpbmsgb3B0aW9uIHRvIHJlaW5zdGF0ZSBpdCBpZiByZXF1aXJlZC4gSW1wcm92ZWQgZXJyb3IgaGFuZGxpbmcgY29kZTogbm93IHBhc3NlcyBiYWNrIHRvIFRYUCB0byBoYW5kbGUuIERvd25sb2FkIGNvdW50IG9ubHkgaW5jcmVhc2VzIGlmIGZpbGUgc2l6ZXMgbWF0Y2gNCi8vIHYwLjMxICBJbiBsaW5lIHdpdGggY2hhbmdzZXQgcjI3MjAsIHNtZF9yZW1vdGVfZG93bmxvYWQgY2hlY2tzIGZvciBmaWxlX2Vycm9yIHN0YXR1cyAodGhhbmtzIE1hcnkpLiBUaGUgZmlsZSBzdGF0dXMgY2hlY2sgY2FuIGJlIHJlbW92ZWQgd2hlbiA0LjAuNiBpcyByZWxlYXNlZC4NCi8vIHYwLjMyICBFeHRlbmRlZCBpZm1pc3NpbmcgdG8gaW5jbHVkZSBpbWFnZXMgYXMgd2VsbCBhcyB0ZXh0LiBDaGFuZ2VkIGRlZmF1bHQgaWZtaXNzaW5nIG9wdGlvbiB0byA/cmVmICh1c2VkIHRvIGJlID9maWxlKQ0KDQppZiAodHhwaW50ZXJmYWNlID09PSAnYWRtaW4nKSB7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZV9yZXBsYWNlJywgJ2ZpbGUnLCAnZmlsZV9yZXBsYWNlJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZV9yZXBsYWNlJywgJ2ZpbGUnLCAnZmlsZV9zYXZlJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZV9jcmVhdGUnLCAnZmlsZScsICdzbWRfcmVtb3RlX2ZpbGVfY3JlYXRlJywgMSk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZScsICdmaWxlJyk7DQp9DQoNCmlmICh0eHBpbnRlcmZhY2UgPT09ICdwdWJsaWMnKSB7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZG93bmxvYWQnLCAnZmlsZV9kb3dubG9hZCcpOw0KfQ0KDQovLyBZdWsgOi0oDQpnbG9iYWwgJHNtZF9yZW1vdGVfZmlsZV92YXJzOw0KJHNtZF9yZW1vdGVfZmlsZV92YXJzID0gYXJyYXkoDQoJCSdtc2cnID0+ICcnLA0KCSk7DQoNCi8vIEJsb3ctYnktYmxvdyBlcXVpdmFsZW50IG9mIGZpbGVfZG93bmxvYWRfbGluaywganVzdCBhIHJlbW90ZS1hd2FyZSB2ZXJzaW9uLg0KLy8gQWRkcyB0aGUgY2hvb3NlIG9wdGlvbi4gRGVmYXVsdHMgdG8gMCAoID0gcmFuZG9tLCBmb3IgbG9hZCBiYWxhbmNpbmcpLiBTcGVjaWZ5DQovLyBhbnkgaGlnaGVyIGludGVnZXIgdG8gZ3JhYiB0aGF0IHBhcnRpY3VsYXIgZW50cnkgZnJvbSB0aGUgZmlsZSAoaWYgaXQgZXhpc3RzLCBlbHNlIHVzZSAxc3QpDQpmdW5jdGlvbiBzbWRfZmlsZV9kb3dubG9hZF9saW5rKCRhdHRzLCAkdGhpbmcpIHsNCglnbG9iYWwgJHRoaXNmaWxlOw0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdmaWxlbmFtZScJPT4gJycsDQoJCSdpZCcJCQk9PiAnJywNCgkJJ2Nob29zZScJCT0+ICcwJywNCgkJJ3Nob3dfbGluaycJPT4gJzAnLA0KCSksICRhdHRzKSk7DQoNCgkvLyBSZW1vdmUgdGhlIGV4dHJhIGF0dHJpYnV0ZXMgbm90IGluIHRoZSBvcmdpbmFsIHRhZw0KCXVuc2V0KCRhdHRzWydzaG93X2xpbmsnXSk7DQoJdW5zZXQoJGF0dHNbJ2Nob29zZSddKTsNCg0KCSRrZXlzID0gYXJyYXkoInNtZF9jaG9vc2UiID0+ICRjaG9vc2UpOw0KCSRvdXQgPSBmaWxlX2Rvd25sb2FkX2xpbmsoJGF0dHMsICR0aGluZyk7DQoJaWYgKHN0cnBvcygkdGhpc2ZpbGVbJ2ZpbGVuYW1lJ10sICIubGluayIpKSB7DQoJCSRvcmlnTGluayA9IGV4cGxvZGUoJyInLCAkb3V0KTsNCgkJJG9yaWdMaW5rWzFdID0gKCgkc2hvd19saW5rKSA/ICRvcmlnTGlua1sxXSA6IHN0cl9yZXBsYWNlKCIubGluayIsICIiLCAkb3JpZ0xpbmtbMV0pKSAuIGpvaW5fcXMoJGtleXMpOyAvLyBXaWxsIGlnbm9yZSBqb2luX3FzIGlmIGNob29zZSBpcyAwDQoJCSRvdXQgPSBpbXBsb2RlKCciJywgJG9yaWdMaW5rKTsNCgl9DQoJcmV0dXJuICRvdXQ7DQp9DQoNCi8vIEFkZCBhbiBpbWFnZSB0byB0aGUgZG93bmxvYWQgZm9ybSB3aGljaCwgYnkgZGVmYXVsdCwgaXMgYmFzZWQgb24gdGhlIGZpbGVuYW1lIG9mIHRoZSBkb3dubG9hZCBpdHNlbGYNCmZ1bmN0aW9uIHNtZF9maWxlX2Rvd25sb2FkX2ltYWdlKCRhdHRzKSB7DQoJZ2xvYmFsICR0aGlzZmlsZTsNCglhc3NlcnRfZmlsZSgpOw0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2ZpbGVuYW1lJwk9PiAnJywNCgkJJ2lkJwkJCSA9PiAnJywNCgkJJ2V4dGVuc2lvbicJID0+ICdqcGcnLA0KCQknaWZtaXNzaW5nJwkgPT4gJz9yZWYnLA0KCQkndGh1bWInCQk9PiAnMCcsDQoJCSdjbGFzcycJCT0+ICcnLA0KCQknd3JhcHRhZycJPT4gJycsDQoJKSwgJGF0dHMpKTsNCgkkZmlsZWxpbmsgPSAkdGhpc2ZpbGVbJ2ZpbGVuYW1lJ107DQoJaWYgKCRmaWxlbmFtZSA9PSAiIikgew0KCQkkZmlsZW5hbWUgPSAkZmlsZWxpbms7DQoJfQ0KCSRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCIubGluayIsICIiLCAkZmlsZW5hbWUpIC4gKCgkZXh0ZW5zaW9uPT0iIikgPyAnJyA6ICcuJy4kZXh0ZW5zaW9uKTsNCg0KCSRpbWcgPSAnJzsNCglpZiAoJGlkKSB7DQoJCSRpbWcgPSAoJHRodW1iPT0wKSA/IEBpbWFnZShhcnJheSgiaWQiID0+ICRpZCwgImNsYXNzIiA9PiAkY2xhc3MsICJ3cmFwdGFnIiA9PiAkd3JhcHRhZykpIDogQHRodW1ibmFpbChhcnJheSgiaWQiID0+ICRpZCwgImNsYXNzIiA9PiAkY2xhc3MsICJ3cmFwdGFnIiA9PiAkd3JhcHRhZykpOw0KCX0gZWxzZSBpZiAoKHN0cnBvcygkZmlsZW5hbWUsICJodHRwOi8vIikgPT09IDApIHx8IChzdHJwb3MoJGZpbGVuYW1lLCAiLyIpID09PSAwKSkgew0KCQkkaW1nID0gKCgkd3JhcHRhZz09IiIpID8gJycgOiAnPCcuJHdyYXB0YWcuICgoJGNsYXNzPT0iIikgPyAnJyA6ICcgY2xhc3M9IicuJGNsYXNzLiciJykgLic+JykgLiAnPGltZyBzcmM9IicuJGZpbGVuYW1lLiciJy4gKCgkd3JhcHRhZz09IiIgJiYgJGNsYXNzKSA/ICcgY2xhc3M9IicuJGNsYXNzLiciJyA6ICcnKSAuICcvPicuICgoJHdyYXB0YWc9PSIiKSA/ICcnIDogJzwvJy4kd3JhcHRhZy4nPicpOw0KCX0gZWxzZSB7DQoJCSRpbWcgPSAoJHRodW1iPT0wKSA/IEBpbWFnZShhcnJheSgibmFtZSIgPT4gJGZpbGVuYW1lLCAiY2xhc3MiID0+ICRjbGFzcywgIndyYXB0YWciID0+ICR3cmFwdGFnKSkgOiBAdGh1bWJuYWlsKGFycmF5KCJuYW1lIiA9PiAkZmlsZW5hbWUsICJjbGFzcyIgPT4gJGNsYXNzLCAid3JhcHRhZyIgPT4gJHdyYXB0YWcpKTsNCgl9DQoJJHdyYXBwZXIgPSAoKCR3cmFwdGFnPT0iIikgPyAnQEBSRVBMJyA6ICc8Jy4kd3JhcHRhZy4gKCgkY2xhc3M9PSIiKSA/ICcnIDogJyBjbGFzcz0iJy4kY2xhc3MuJyInKSAuJz5AQFJFUEw8LycuJHdyYXB0YWcuJz4nKTsNCglpZiAoc3RycG9zKCRpZm1pc3NpbmcsICI/cmVmIikgPT09IDApIHsNCgkJJGRpc3BsYXkgPSAoJGlkKSA/ICRpZCA6ICRmaWxlbmFtZTsNCgkJJG1pc3NpbmcgPSBzdHJfcmVwbGFjZSgiQEBSRVBMIiwgJGRpc3BsYXksICR3cmFwcGVyKTsNCgl9IGVsc2UgaWYgKHN0cnBvcygkaWZtaXNzaW5nLCAiP2ltYWdlIikgPT09IDApIHsNCgkJJGltZ1BhcnRzID0gZXhwbG9kZSgiOiIsICRpZm1pc3NpbmcpOw0KCQlpZiAoY291bnQoJGltZ1BhcnRzKSA9PSAyKSB7DQoJCQkkaW1nT3B0cyA9IGFycmF5KCk7DQoJCQlpZihpc19udW1lcmljKCRpbWdQYXJ0c1sxXSkpIHsNCgkJCQkkaW1nT3B0c1siaWQiXSA9ICRpbWdQYXJ0c1sxXTsNCgkJCX0gZWxzZSB7DQoJCQkJJGltZ09wdHNbIm5hbWUiXSA9ICRpbWdQYXJ0c1sxXTsNCgkJCX0NCgkJCSRtaXNzaW5nID0gc3RyX3JlcGxhY2UoIkBAUkVQTCIsICgoJHRodW1iPT0wKSA/IEBpbWFnZSgkaW1nT3B0cykgOiBAdGh1bWJuYWlsKCRpbWdPcHRzKSksICR3cmFwcGVyKTsNCgkJfSBlbHNlIHsNCgkJCSRtaXNzaW5nID0gIiI7DQoJCX0NCgl9IGVsc2UgaWYgKCRpZm1pc3NpbmcgPT0gIiIpIHsNCgkJJG1pc3NpbmcgPSAiIjsNCgl9IGVsc2Ugew0KCQkkbWlzc2luZyA9IHN0cl9yZXBsYWNlKCJAQFJFUEwiLCAkaWZtaXNzaW5nLCAkd3JhcHBlcik7DQoJfQ0KCXJldHVybiAoJGltZykgPyAkaW1nIDogJG1pc3Npbmc7DQp9DQoNCi8vIEdlbmVyaWMgY2FsbGJhY2sgd2hpY2ggaXMgZmlyZWQgX2FmdGVyXyB0aGUgRmlsZXMgcGFnZSBoYXMgbG9hZGVkLg0KLy8gUGVyZm9ybXMgZGlzcGxheSBjbGVhbnVwL2luc2VydGlvbiBhbmQgcG9zdCBwcm9jZXNzaW5nIG9mIGFueSBmaWxlIGluc2VydHMvZWRpdHMNCmZ1bmN0aW9uIHNtZF9yZW1vdGVfZmlsZSgkZXZlbnQsICRzdGVwKSB7DQoJZ2xvYmFsICRzbWRfcmVtb3RlX2ZpbGVfdmFyczsNCg0KCSRoZWxwTGluayA9ICc8YSB0YXJnZXQ9Il9ibGFuayInLg0KCQkJJyBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlX3VybF9wb3B1cCInLg0KCQkJJyBvbmNsaWNrPSJwb3BXaW4odGhpcy5ocmVmKTsgcmV0dXJuIGZhbHNlOyIgY2xhc3M9InBvcGhlbHAiPj88L2E+JzsNCgkkdWxfZm9ybSA9IHRyaW0oZm9ybShlSW5wdXQoJ2ZpbGUnKS4gc0lucHV0KCdzbWRfcmVtb3RlX2ZpbGVfY3JlYXRlJykuDQoJCQkJCWdyYWYoJ29yIFVSTCcuc3AuJGhlbHBMaW5rLnNwLmZJbnB1dCgndGV4dCcsICdzbWRfcmVtb3RlX3VybCcsICcnLCAnZWRpdCcsICdFbnRlciBhIFVSTCB0byB1cGxvYWQgdG8gVFhQJywgJycsICczMicpLnNwLg0KCQkJCQkJZklucHV0KCdzdWJtaXQnLCAnJywgJ1VwbG9hZCcsICdzbWFsbGVyYm94JykpDQoJCQkJLCAndGV4dC1hbGlnbjogY2VudGVyOycpKTsNCgllY2hvIHNtZF9yZW1vdGVfanMoJyQoIi51cGxvYWQtZm9ybSIpLmFwcGVuZChcJycuJHVsX2Zvcm0uJ1wnKTsnKTsNCg0KCWlmICgkc21kX3JlbW90ZV9maWxlX3ZhcnNbJ21zZyddICE9ICIiKSB7DQoJCWVjaG8gc21kX3JlbW90ZV9qcygnJCgiI25hdi1wcmltYXJ5IHRhYmxlIHRkOmVxKDApIikuYXBwZW5kKFwnJy4kc21kX3JlbW90ZV9maWxlX3ZhcnNbJ21zZyddLidcJyk7Jyk7DQoJfQ0KfQ0KDQovLyBFdmVyeSB0aW1lIGEgZmlsZSBpcyBzYXZlZC9lZGl0ZWQsIFRYUCByZWNhbGN1bGF0ZXMgaXRzIHNpemUgZnJvbSB0aGUgcmVhbCBmaWxlIChncnJyKS4NCi8vIFRoaXMgaXMgdW5kZXNpcmFibGUgc28gaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgcmVtb3RlIFVSTCBmaWxlIGluc3RlYWQuDQpmdW5jdGlvbiBzbWRfcmVtb3RlX2ZpbGVfcmVwbGFjZSgpIHsNCglleHRyYWN0KGdwc2EoYXJyYXkoJ2lkJykpKTsNCglzbWRfcmVtb3RlX3NldF9zaXplKCRpZCk7DQp9DQoNCi8vIFNldHMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIFRYUCBkYXRhYmFzZSBmaWxlIHRvIHRoYXQgb2YgaXRzIGNvcnJlc3BvbmRpbmcgInJlYWwiIHJlbW90ZSBVUkwgZmlsZSBzaXplDQpmdW5jdGlvbiBzbWRfcmVtb3RlX3NldF9zaXplKCRpZF9vcl9maWxlKSB7DQoJZ2xvYmFsICRmaWxlX2Jhc2VfcGF0aDsNCg0KCWlmIChpc19udW1lcmljKCRpZF9vcl9maWxlKSkgew0KCQkkZmlsZW5hbWUgPSB0cmltKHNhZmVfZmllbGQoImZpbGVuYW1lIiwgInR4cF9maWxlIiwgImlkPSIuaW50dmFsKCRpZF9vcl9maWxlKSkpOw0KCX0gZWxzZSB7DQoJCSRmaWxlbmFtZSA9IHRyaW0oZG9TbGFzaCgkaWRfb3JfZmlsZSkpOw0KCX0NCglpZiAoc3RycG9zKCRmaWxlbmFtZSwgIi5saW5rIikpIHsNCgkJJGZpbGVwYXRoID0gYnVpbGRfZmlsZV9wYXRoKCRmaWxlX2Jhc2VfcGF0aCwgJGZpbGVuYW1lKTsNCgkJJHVybCA9IHNtZF9yZW1vdGVfZmlsZV9saXN0KCRmaWxlcGF0aCwgMSwgMSk7DQoJCWlmIChjb3VudCgkdXJsKSA+IDApIHsNCgkJCSRoZHJzID0gc21kX2dldF9oZWFkZXJzKCR1cmxbMF0sIDEpOw0KCQkJJHNpemUgPSAoJGhkcnMgPT09IGZhbHNlIHx8ICFpc3NldCgkaGRyc1snY29udGVudC1sZW5ndGgnXSkpID8gMSA6ICRoZHJzWydjb250ZW50LWxlbmd0aCddOw0KCQkJc2FmZV91cGRhdGUoInR4cF9maWxlIiwgInNpemU9Ii4kc2l6ZSwgImZpbGVuYW1lPSciLiRmaWxlbmFtZS4iJyIpOw0KCQl9DQoJfQ0KfQ0KDQovLyBDYWxsYmFjayBmb3IgdXBsb2FkaW5nIGEgVVJMIGZyb20gdGhlIEZpbGVzIHRhYg0KZnVuY3Rpb24gc21kX3JlbW90ZV9maWxlX2NyZWF0ZSgpIHsNCglnbG9iYWwgJGZpbGVfYmFzZV9wYXRoLCAkc21kX3JlbW90ZV9maWxlX3ZhcnM7DQoNCglleHRyYWN0KGRvU2xhc2goZ3BzYShhcnJheSgnc21kX3JlbW90ZV91cmwnLCdjYXRlZ29yeScsJ3Blcm1pc3Npb25zJywnZGVzY3JpcHRpb24nKSkpKTsNCg0KCSR1cmwgPSB0cmltKCRzbWRfcmVtb3RlX3VybCk7DQoJLy8gT25seSBpbnRlcmNlcHQgcmVtb3RlIGZpbGVzOyBsZWF2ZSBldmVyeXRoaW5nIGVsc2UgZm9yIFRYUCB0byBtYW5hZ2UNCglpZiAoc3RycG9zKCR1cmwsICJodHRwIikgPT09IDApIHsNCgkJJGhkcnMgPSBzbWRfZ2V0X2hlYWRlcnMoJHVybCwgMSk7DQoJCSRzaXplID0gKCRoZHJzID09PSBmYWxzZSB8fCAhaXNzZXQoJGhkcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pKSA/IDEgOiAkaGRyc1snY29udGVudC1sZW5ndGgnXTsNCg0KCQkvLyBNYWtlIGEgZmlsZW5hbWUgYW5kIGZ1bGwgcGF0aDogdW5lbmNvZGVkDQoJCSRkZXN0X2ZpbGVuYW1lID0gYmFzZW5hbWUodXJsZGVjb2RlKCR1cmwpKS4iLmxpbmsiOw0KCQkkZGVzdF9maWxlcGF0aCA9IGJ1aWxkX2ZpbGVfcGF0aCgkZmlsZV9iYXNlX3BhdGgsICRkZXN0X2ZpbGVuYW1lKTsNCg0KCQlpZiAoZmlsZV9leGlzdHMoJGRlc3RfZmlsZXBhdGgpKSB7DQoJCQkvLyBSZWFkIHRoZSB3aG9sZSBmaWxlIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIGFkZCB0aGUgVVJMIGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHkNCgkJCSRsaW5lcyA9IHNtZF9yZW1vdGVfZmlsZV9saXN0KCRkZXN0X2ZpbGVwYXRoLCAwLCAxKTsNCgkJCWlmICghaW5fYXJyYXkoJHVybCwgJGxpbmVzKSkgew0KCQkJCSRoYW5kbGUgPSBmb3BlbigkZGVzdF9maWxlcGF0aCwgImEiKTsNCgkJCQlmd3JpdGUoJGhhbmRsZSwgJHVybC5uKTsNCgkJCQlmY2xvc2UoJGhhbmRsZSk7DQoJCQkJJHNtZF9yZW1vdGVfZmlsZV92YXJzWydtc2cnXSA9IGdUeHQoJ2ZpbGVfdXBsb2FkZWQnLCBhcnJheSgne25hbWV9JyA9PiB1cmxkZWNvZGUoJHVybCkpKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHNtZF9yZW1vdGVfZmlsZV92YXJzWydtc2cnXSA9IGdUeHQoJ2ZpbGVfYWxyZWFkeS1leGlzdHMnLCBhcnJheSgne25hbWV9JyA9PiB1cmxkZWNvZGUoJHVybCkpKTsNCgkJCX0NCgkJCS8vIFNldCB0aGUgc2l6ZSBqdXN0IGluIGNhc2UNCgkJCXNtZF9yZW1vdGVfc2V0X3NpemUoJGRlc3RfZmlsZW5hbWUpOw0KCQl9IGVsc2Ugew0KCQkJLy8gRmlsZSBkb2Vzbid0IGV4aXN0IHNvIGNyZWF0ZSBpdCBhbmQgcHV0IHRoZSBVUkwgaW5zaWRlDQoJCQkkdG1wID0gdGVtcG5hbSgiL3RtcCIsICJzbWRfIik7DQoJCQkkaGFuZGxlID0gZm9wZW4oJHRtcCwgInciKTsNCgkJCWZ3cml0ZSgkaGFuZGxlLCAkdXJsLm4pOw0KCQkJZmNsb3NlKCRoYW5kbGUpOw0KCQkJcmVuYW1lKCR0bXAsICRkZXN0X2ZpbGVwYXRoKTsNCg0KCQkJLy8gQWRkIHRoZSBmaWxlIHRvIFRYUA0KCQkJJHJldCA9IHNhZmVfaW5zZXJ0KCJ0eHBfZmlsZSIsDQoJCQkJImZpbGVuYW1lID0gJyRkZXN0X2ZpbGVuYW1lJywNCgkJCQkgY2F0ZWdvcnkgPSAnJGNhdGVnb3J5JywNCgkJCQkgcGVybWlzc2lvbnMgPSAnJHBlcm1pc3Npb25zJywNCgkJCQkgZGVzY3JpcHRpb24gPSAnJGRlc2NyaXB0aW9uJywNCgkJCQkgc2l6ZSA9ICckc2l6ZScsDQoJCQkJIGNyZWF0ZWQgPSBub3coKSwNCgkJCQkgbW9kaWZpZWQgPSBub3coKQ0KCQkJIik7DQoJCQkkc21kX3JlbW90ZV9maWxlX3ZhcnNbJ21zZyddID0gZ1R4dCgnZmlsZV91cGxvYWRlZCcsIGFycmF5KCd7bmFtZX0nID0+IHVybGRlY29kZSgkdXJsKSkpOw0KCQl9DQoJfSBlbHNlIHsNCgkJJHNtZF9yZW1vdGVfZmlsZV92YXJzWydtc2cnXSA9IGdUeHQoJ2ZpbGVfdXBsb2FkX2ZhaWxlZCcpOw0KCX0NCn0NCg0KLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGNob3NlbiBmaWxlIChmdWxsIHBhdGggcmVxdWlyZWQpIGFuZCBnZXQgbGluZXMgZnJvbSB3aXRoaW4sIGFkZGluZyB0aGVtIHRvIGFuIGFycmF5Lg0KLy8gICRvZmZzZXQgaXMgd2hlcmUgdG8gc3RhcnQgZnJvbS4gTm9ybWFsbHkgMSA9IDFzdCByb3csIDIgPSAybmQgcm93IGFuZCBzbyBvbi4gMCA9IGEgcmFuZG9tIHJvdy4NCi8vICAkcXR5IHNwZWNpZmllcyBob3cgbWFueSByb3dzIHRvIHB1bGwuIDAgPSB1bmxpbWl0ZWQuDQpmdW5jdGlvbiBzbWRfcmVtb3RlX2ZpbGVfbGlzdCgkZm5hbWUsICRxdHk9MSwgJG9mZnNldD0wKSB7DQoJJG91dCA9IGFycmF5KCk7DQoJaWYgKGZpbGVfZXhpc3RzKCRmbmFtZSkpIHsNCgkJJGZkID0gZm9wZW4oJGZuYW1lLCAiciIpOw0KCQkvLyBSZWFkIHRoZSB3aG9sZSBmaWxlIGluICh5ZXMgdGhlcmUncyB0aGUgZmlsZSgpIGNhbGwsIGJ1dCBmZ2V0cygpIGlzIHN1cHBvc2VkbHkgcXVpY2tlciBvbiB0eHQgZmlsZXMpDQoJCXdoaWxlICghZmVvZigkZmQpKSB7DQoJCQkkbGluZSA9IHJ0cmltKGZnZXRzKCRmZCkpOw0KCQkJaWYgKCRsaW5lICE9ICIiKSB7DQoJCQkgICAkbGluZXNbXSA9ICRsaW5lOw0KCQkJfQ0KCQl9DQoJCWZjbG9zZSAoJGZkKTsNCgkJaWYgKCRvZmZzZXQgPT0gMCkgew0KCQkJc2h1ZmZsZSgkbGluZXMpOw0KCQkJJG9mZnNldCA9IDE7DQoJCX0NCgkJJG9mZnNldCA9ICgkb2Zmc2V0ID4gY291bnQoJGxpbmVzKSkgPyAxIDogJG9mZnNldDsNCgkJJG91dCA9ICgkcXR5ID09IDApID8gJGxpbmVzIDogYXJyYXlfc2xpY2UoJGxpbmVzLCAkb2Zmc2V0LTEsICRxdHkpOw0KCX0NCglyZXR1cm4gJG91dDsNCn0NCg0KLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkDQpmdW5jdGlvbiBzbWRfcmVtb3RlX2Rvd25sb2FkKCRldmVudCwgJHN0ZXApIHsNCglnbG9iYWwgJHByZXRleHQsICRpZCwgJGZpbGVfYmFzZV9wYXRoLCAkZmlsZV9lcnJvcjsNCg0KCWlmICghaXNzZXQoJGZpbGVfZXJyb3IpKSB7DQoJCS8vIEdldCB0aGUgInRydWUiIGZpbGVuYW1lICh1bmZvcnR1bmF0ZWx5IGZyb20gdGhlIGRhdGFiYXNlID0gMSBleHRyYSBxdWVyeSkuDQoJCSRyZWFsX2ZpbGUgPSBzYWZlX3JvdygiZmlsZW5hbWUsIHNpemUsIHN0YXR1cyIsICJ0eHBfZmlsZSIsICJpZD0iLmludHZhbCgkaWQpKTsNCgkJaWYgKCRyZWFsX2ZpbGVbJ3N0YXR1cyddID09IGdldFN0YXR1c051bSgibGl2ZSIpKSB7IC8vIFRvUmVtb3ZlOiB1bm5lY2Vzc2FyeSBhZnRlciBjaGFuZ2VzZXQgcjI3MjANCgkJCWlmIChzdHJwb3MoJHJlYWxfZmlsZVsnZmlsZW5hbWUnXSwgIi5saW5rIikgPiAwKSB7DQoJCQkJJGNob29zZSA9IDA7DQoJCQkJLy8gR2V0IGFueSBvdmVycmlkaW5nIHZhbHVlIG9mIHNtZF9jaG9vc2UgZnJvbSB0aGUgcXVlcnkgc3RyaW5nDQoJCQkJaWYgKCRwcmV0ZXh0WydxcyddKSB7DQoJCQkJCWxpc3QoJHFrZXksICRxdmFsKSA9IGV4cGxvZGUoIj0iLCAkcHJldGV4dFsncXMnXSk7DQoJCQkJCWlmICgkcWtleSA9PSAic21kX2Nob29zZSIpIHsNCgkJCQkJCWlmICgkcXZhbCA+IDApIHsNCgkJCQkJCQkkY2hvb3NlID0gaW50dmFsKCRxdmFsKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQkvLyBUaGUgZmlsZSBzaXplLCBob3dldmVyLCBpcyB0aGF0IG9mIHRoZSByZW1vdGUgZmlsZQ0KCQkJCSRyZW1vdGVVUkwgPSBzbWRfcmVtb3RlX2ZpbGVfbGlzdChidWlsZF9maWxlX3BhdGgoJGZpbGVfYmFzZV9wYXRoLCAkcmVhbF9maWxlWydmaWxlbmFtZSddKSwgMSwgJGNob29zZSk7DQoJCQkJaWYgKGNvdW50KCRyZW1vdGVVUkwpID4gMCkgew0KCQkJCQkkdXJsID0gJHJlbW90ZVVSTFswXTsNCgkJCQkJLy8gVGVzdCB0aGUgZmlsZSBleGlzdHM6IHNsb3csIGJ1dCByZWR1Y2VzIGZhbHNlIGRvd25sb2FkIGNvdW50IGluY3JlbWVudHMNCgkJCQkJJGhkcnMgPSBzbWRfZ2V0X2hlYWRlcnMoJHVybCwgMSk7DQoJCQkJCSRhbGxrZXkgPSBzdHJ0b2xvd2VyKGltcGxvZGUoIiAiLCBhcnJheV9rZXlzKCRoZHJzKSkpOw0KCQkJCQlpZiAoc3RycG9zKCRhbGxrZXksICIyMDAiKSA+IDAgJiYgc3RycG9zKCRhbGxrZXksICJvayIpID4gMCkgew0KCQkJCQkJaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIERvd25sb2FkJyk7DQoJCQkJCQloZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7DQoJCQkJCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSInIC4gYmFzZW5hbWUoJHJlYWxfZmlsZVsnZmlsZW5hbWUnXSkgLiAnIjsgc2l6ZSA9ICInLiRyZWFsX2ZpbGVbJ3NpemUnXS4nIicpOw0KCQkJCQkJLy8gRml4IGZvciBsYW1lIElFIDYgcGRmIGJ1ZyBvbiBzZXJ2ZXJzIGNvbmZpZ3VyZWQgdG8gc2VuZCBjYWNoZSBoZWFkZXJzDQoJCQkJCQloZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IHByaXZhdGUnKTsNCgkJCQkJCUBpbmlfc2V0KCJ6bGliLm91dHB1dF9jb21wcmVzc2lvbiIsICJPZmYiKTsNCgkJCQkJCUBzZXRfdGltZV9saW1pdCgwKTsNCgkJCQkJCUBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsNCg0KCQkJCQkJLy8gSGFuZC1vZmYgdG8gdGhlIHJlbW90ZSBmaWxlDQoJCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gJHVybCk7DQoNCgkJCQkJCS8vIHJlY29yZCBkb3dubG9hZCBpZiB0aGUgZmlsZSBzaXplcyBtYXRjaA0KCQkJCQkJaWYgKGludHZhbCgkaGRyc1snY29udGVudC1sZW5ndGgnXSkgPT0gaW50dmFsKCRyZWFsX2ZpbGVbJ3NpemUnXSkpIHsNCgkJCQkJCQlzYWZlX3VwZGF0ZSgidHhwX2ZpbGUiLCAiZG93bmxvYWRzPWRvd25sb2FkcysxIiwgJ2lkPScuaW50dmFsKCRpZCkpOw0KCQkJCQkJCWxvZ19oaXQoJzIwMCcpOw0KCQkJCQkJfQ0KCQkJCQkJLy8gcmVtb3RlIGRvd25sb2FkIGRvbmU6IGdhbWUgb3Zlcg0KCQkJCQkJZXhpdCgwKTsNCg0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGZpbGVfZXJyb3IgPSA0MDQ7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmlsZV9lcnJvciA9IDQwNDsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkJJGZpbGVfZXJyb3IgPSA0MDM7DQoJCX0NCgl9DQoJLy8gcmVtb3RlIGRvd25sb2FkIG5vdCBkb25lIC0gbGVhdmUgdG8gVFhQIHRvIGhhbmRsZSBlcnJvciBvciAibG9jYWwiIGZpbGUgZG93bmxvYWQNCglyZXR1cm47DQp9DQoNCmZ1bmN0aW9uIHNtZF9yZW1vdGVfanMoJGNvbnRlbnQpIHsNCgkkb3V0ID0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4nLm47DQoJJG91dCAuPSAkY29udGVudC5uOw0KCSRvdXQgLj0gJzwvc2NyaXB0PicubjsNCglyZXR1cm4gJG91dDsNCn0NCg0KLy8gUEhQNCBlbXVsYXRpb24oaXNoKSBvZiBQSFA1J3MgZ2V0X2hlYWRlcnMoKS4gU3RvbGVuIGZyb20gcGhwLm5ldCBhbmQgbW9kZGVkDQpmdW5jdGlvbiBzbWRfZ2V0X2hlYWRlcnMoJHVybCwgJGZvcm1hdD0wKSB7DQoJaWYgKCEkdXJsKSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJJHVpbmZvPXBhcnNlX3VybCgkdXJsKTsNCgkkaGVhZGVycyA9IGFycmF5KCk7DQoJaWYgKGlzX2NhbGxhYmxlKCdjaGVja2Ruc3JyJykgJiYgIWNoZWNrZG5zcnIoJHVpbmZvWydob3N0J10uJy4nLCdNWCcpICYmICFjaGVja2Ruc3JyKCR1aW5mb1snaG9zdCddLicuJywnQScpKSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJJHBvcnQgPSBpc3NldCgkdWluZm9bJ3BvcnQnXSkgPyAkdWluZm9bJ3BvcnQnXSA6IDgwOw0KCSRmcD1mc29ja29wZW4oJHVpbmZvWydob3N0J10sICRwb3J0LCAkZXJybm8sICRlcnJzdHIsIDE1KTsNCg0KCWlmKCRmcCkgew0KCQkkaGVhZCA9ICJHRVQgIi5AJHVpbmZvWydwYXRoJ10uIj8iLkAkdWluZm9bJ3F1ZXJ5J10uIiBIVFRQLzEuMFxyXG4iOw0KCQkkaGVhZCAuPSAiSG9zdDogIi5AJHVpbmZvWydob3N0J10uIjoiLiRwb3J0LiJcclxuIjsNCgkJJGhlYWQgLj0gIkNvbm5lY3Rpb246IENsb3NlXHJcbiI7DQoJCSRoZWFkIC49ICJBY2NlcHQ6ICovKlxyXG4iOw0KCQlpZiAoQCR1aW5mb1sndXNlciddKSB7DQoJCQkkaGVhZCAuPSAiQXV0aG9yaXphdGlvbjogQmFzaWMgIi5iYXNlNjRfZW5jb2RlKCR1aW5mb1sndXNlciddLic6Jy4kdWluZm9bJ3Bhc3MnXSkuIlxyXG4iOw0KCQl9DQoJCSRoZWFkIC49ICJcclxuIjsNCgkJZnB1dHMoJGZwLCAkaGVhZCk7DQoJCSRlb2hlYWRlciA9IGZhbHNlOw0KCQl3aGlsZSghZmVvZigkZnApIG9yICgkZW9oZWFkZXI9PXRydWUpKSB7DQoJCQlpZigkaGVhZGVyPWZnZXRzKCRmcCwgMTAyNCkpIHsNCgkJCQlpZiAoJGhlYWRlciA9PSAiXHJcbiIpIHsNCgkJCQkJJGVvaGVhZGVyID0gdHJ1ZTsNCgkJCQkJYnJlYWs7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGhlYWRlciA9IHRyaW0oJGhlYWRlcik7DQoJCQkJfQ0KCQkJCWlmKCRmb3JtYXQgPT0gMSkgew0KCQkJCQkka2V5ID0gc3RydG9sb3dlcihhcnJheV9zaGlmdChleHBsb2RlKCc6ICcsJGhlYWRlcikpKTsNCgkJCQkJaWYoJGtleSA9PSAkaGVhZGVyKSB7DQoJCQkJCQkkaGVhZGVyc1tdID0gJGhlYWRlcjsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRoZWFkZXJzWyRrZXldPXN1YnN0cigkaGVhZGVyLHN0cmxlbigka2V5KSsyKTsNCgkJCQkJfQ0KCQkJCQl1bnNldCgka2V5KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkaGVhZGVyc1tdID0gJGhlYWRlcjsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRoZWFkZXJzOw0KDQoJfSBlbHNlIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCn0iO3M6NDoidHlwZSI7czoxOiIxIjtzOjM6Im1kNSI7czozMjoiZTQyZmNjMjNlNDcyMTVlM2Y3Mjk4ZWM5OWY1MzYzNDkiO30=