# Name: smd_lib v0.33 # Type: Library plugin # Shared function library used by smd_ plugins and others. # 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: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjc6InNtZF9saWIiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3N0ZWZkYXdzb24uY29t LyI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMzMiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJT aGFyZWQgZnVuY3Rpb24gbGlicmFyeSB1c2VkIGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJz LiI7czo0OiJjb2RlIjtzOjEwOTEzOiIvLyBTb2Z0d2FyZSBlbmdpbmVlcnMgbG9vayBhd2F5 IG5vdyB1bmxlc3MgeW91IHdpc2ggdG8gYmUgaG9ycmlmaWVkIGJ5IHRoZSBhbW91bnQNCi8v IG9mIGNvdXBsaW5nIGFuZCBjb2hlc2lvbiBpbiB0aGVzZSBmdW5jdGlvbnMuIEknbSB3YXJu aW5nIHlvdS4uLiBpdCdzIG5vdCBwcmV0dHkNCmlmICghY2xhc3NfZXhpc3RzKCdzbWRfTUxQ JykpIHsNCmNsYXNzIHNtZF9NTFAgew0KCXZhciAkc21kX3N0cmluZ3M7DQoJdmFyICRzbWRf b3duZXI7DQoJdmFyICRzbWRfcHJlZml4Ow0KCXZhciAkc21kX2xhbmc7DQoJdmFyICRzbWRf ZXZlbnQ7DQoJZnVuY3Rpb24gc21kX01MUCgkcGx1ZywgJHByZWZ4LCAkc3RyYXJyYXksICRs bmc9J2VuLWdiJywgJGV2PSdwdWJsaWMnKSB7DQoJCSR0aGlzLT5zbWRfb3duZXIgPSAkcGx1 ZzsNCgkJJHRoaXMtPnNtZF9wcmVmaXggPSAkcHJlZng7DQoJCSR0aGlzLT5zbWRfc3RyaW5n cyA9ICRzdHJhcnJheTsNCgkJJHRoaXMtPnNtZF9sYW5nID0gJGxuZzsNCgkJJHRoaXMtPnNt ZF9ldmVudCA9ICRldjsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soYXJyYXkoJiR0aGlzLCAnc21k X0NhbGxiYWNrJyksICdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJyk7DQoJfQ0KCWZ1bmN0aW9u IHNtZF9DYWxsYmFjaygkZXZlbnQ9J2wxMG4uZW51bWVyYXRlX3N0cmluZ3MnLCAkc3RlcD0n JywgJHByZT0wKSB7DQoJCSRyID0gYXJyYXkoDQoJCQknb3duZXInID0+ICR0aGlzLT5zbWRf b3duZXIsDQoJCQkncHJlZml4JyA9PiAkdGhpcy0+c21kX3ByZWZpeCwNCgkJCSdsYW5nJyA9 PiAkdGhpcy0+c21kX2xhbmcsDQoJCQknZXZlbnQnID0+ICR0aGlzLT5zbWRfZXZlbnQsDQoJ CQknc3RyaW5ncycgPT4gJHRoaXMtPnNtZF9zdHJpbmdzLA0KCQkpOw0KCQlyZXR1cm4gJHI7 DQoJfQ0KCS8vIEdlbmVyaWMgbG9va3VwDQoJLy8gICR3aGF0ID0ga2V5IHRvIGxvb2sgdXAN CgkvLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRzIHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZvciBy ZXBsYWNlbWVudA0KCWZ1bmN0aW9uIGdUeHQoJHdoYXQsICRhcmdzID0gYXJyYXkoKSkgew0K CQlnbG9iYWwgJHRleHRhcnJheTsNCg0KCQkvLyBQcmVwYXJlIHRoZSBwcmVmaXhlZCBrZXkg Zm9yIHVzZQ0KCQkka2V5ID0gJHRoaXMtPnNtZF9wcmVmaXggLiAnLScgLiAkd2hhdDsNCgkJ JGtleSA9IHN0cnRvbG93ZXIoJGtleSk7DQoNCgkJLy8gR3JhYiBmcm9tIHRoZSBnbG9iYWwg dGV4dGFycmF5IChwb3NzaWJseSBlZGl0ZWQgYnkgTUxQKSBpZiB3ZSBjYW4NCgkJaWYoaXNz ZXQoJHRleHRhcnJheVska2V5XSkpIHsNCgkJCSRzdHIgPSAkdGV4dGFycmF5WyRrZXldOw0K CQl9IGVsc2Ugew0KCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0aGUgbG9jYWxpc2VkIHRl eHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2luZw0KCQkJLy8gdGhlIChub24gcHJlZml4ZWQp IHN0cmluZyBhcnJheSBpbiB0aGUgcGx1Z2luDQoJCQkka2V5ID0gc3RydG9sb3dlcigkd2hh dCk7DQoJCQkkc3RyID0gKGlzc2V0KCR0aGlzLT5zbWRfc3RyaW5nc1ska2V5XSkpID8gJHRo aXMtPnNtZF9zdHJpbmdzWyRrZXldIDogJHdoYXQ7DQoJCX0NCgkJLy8gUGVyZm9ybSBzdWJz dGl0dXRpb25zDQoJCWlmKCFlbXB0eSgkYXJncykpIHsNCgkJCSRzdHIgPSBzdHJ0cigkc3Ry LCAkYXJncyk7DQoJCX0NCg0KCQlyZXR1cm4gJHN0cjsNCgl9DQp9DQp9DQoNCmlmICghZnVu Y3Rpb25fZXhpc3RzKCJzbWRfZG9MaXN0IikpIHsNCmZ1bmN0aW9uIHNtZF9kb0xpc3QoJGxz dCwgJHJuZz10cnVlLCAkc3ViPSIiLCAkcXRlPXRydWUsICRkbG09IiwiLCAkc3BjPXRydWUp IHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdGhpc2ltYWdlLCAkdGhpc2ZpbGUsICR0aGlz bGluaywgJHByZXRleHQsICR2YXJpYWJsZTsNCg0KCSRpbmMgPSAkZXhjID0gYXJyYXkoKTsN CgkkbHN0ID0gZG9fbGlzdCgkbHN0LCAkZGxtKTsNCgkkbW9kUkUgPSAoJHNwYykgPyAnLyhc P3xcISkoW0EtWmEtejAtOV9cLSBdKykvJyA6ICcvKFw/fFwhKShbQS1aYS16MC05X1wtXSsp LycgOw0KCWZvcmVhY2ggKCRsc3QgYXMgJGl0ZW0pIHsNCgkJJG1vZCA9IDA7IC8vIDAgPSBp bmNsdWRlLCAxID0gZXhjbHVkZQ0KCQkkbnVtTW9kcyA9IHByZWdfbWF0Y2hfYWxsKCRtb2RS RSwgJGl0ZW0sICRtb2RzKTsNCg0KCQlmb3IgKCRtb2RDdHIgPSAwOyAkbW9kQ3RyIDwgJG51 bU1vZHM7ICRtb2RDdHIrKykgew0KCQkJLy8gbW9kICJ0eXBlIiBpcyBnb3Zlcm5lZCBieSB0 aGUgZmlyc3Qgb25lIGZvdW5kIG9ubHkuIGkuZS4gaWYgImFydGljbGUtP2MhcyIgd2FzIHVz ZWQgaW4gb25lIGZpZWxkDQoJCQkvLyBpdCB3b3VsZCBiZSBhbiAiaW5jbHVkZSIgb2YgdGhl IHdvcmQgImFydGljbGUtIiBwbHVzIHRoZSBjYXRlZ29yeSBhbmQgc2VjdGlvbiBjb25jYXRl bmF0ZWQNCgkJCSRtb2QgPSAoJG1vZHNbMV1bMF0gPT09ICIhIikgPyAxIDogMDsNCgkJCSRt b2RDaGFyID0gJG1vZHNbMV1bJG1vZEN0cl07DQoJCQkkbW9kSXRlbSA9IHRyaW0oJG1vZHNb Ml1bJG1vZEN0cl0pOw0KCQkJJGxvd2l0ZW0gPSBzdHJ0b2xvd2VyKCRtb2RJdGVtKTsNCgkJ CWlmIChpc3NldCgkdmFyaWFibGVbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3RyX3Jl cGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICR2YXJpYWJsZVskbG93aXRlbV0sICRpdGVtKTsN CgkJCX0gZWxzZSBpZiAoaXNzZXQoJHRoaXNpbWFnZVskbG93aXRlbV0pKSB7DQoJCQkJJGl0 ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNpbWFnZVskbG93aXRl bV0sICRpdGVtKTsNCgkJCX0gZWxzZSBpZiAoaXNzZXQoJHRoaXNmaWxlWyRsb3dpdGVtXSkp IHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkdGhpc2Zp bGVbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCR0aGlzbGlua1sk bG93aXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRl bSwgJHRoaXNsaW5rWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChhcnJheV9r ZXlfZXhpc3RzKCRsb3dpdGVtLCAkcHJldGV4dCkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBs YWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkcHJldGV4dFskbG93aXRlbV0sICRpdGVtKTsNCgkJ CX0gZWxzZSBpZiAoaXNzZXQoJF9QT1NUWyRtb2RJdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0 cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkX1BPU1RbJG1vZEl0ZW1dLCAkaXRlbSk7 DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRfR0VUWyRtb2RJdGVtXSkpIHsNCgkJCQkkaXRlbSA9 IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkX0dFVFskbW9kSXRlbV0sICRpdGVt KTsNCgkJCX0gZWxzZSBpZiAoaXNzZXQoJF9TRVJWRVJbJG1vZEl0ZW1dKSkgew0KCQkJCSRp dGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICRfU0VSVkVSWyRtb2RJdGVt XSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChpc3NldCgkdGhpc2FydGljbGVbJGxvd2l0ZW1d KSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICR0aGlz YXJ0aWNsZVskbG93aXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGl0ZW0gPSBz dHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJG1vZEl0ZW0sICRpdGVtKTsNCgkJCX0N CgkJfQ0KDQoJCS8vIEhhbmRsZSByYW5nZXMgb2YgdmFsdWVzDQoJCWlmICgkcm5nICYmIHBy ZWdfbWF0Y2goJy9eKFxkKylcLShcZCspJC8nLCAkaXRlbSkpIHsNCgkJCWxpc3QoJGxvLCAk aGkpID0gZXhwbG9kZSgiLSIsICRpdGVtLCAyKTsNCgkJCSRpdGVtID0gaW1wbG9kZSgkZGxt LCByYW5nZSgkbG8sICRoaSkpOw0KCQl9DQoNCgkJLy8gSXRlbSBtYXkgYmUgZW1wdHk7IGln bm9yZSBpdCBpZiBzbw0KCQlpZiAoJGl0ZW0pIHsNCgkJCSRpdGVtID0gZG9fbGlzdCgkaXRl bSwgJGRsbSk7DQoNCgkJCS8vIEhhbmRsZSBzdWItY2F0ZWdvcmllcw0KCQkJaWYgKCRzdWIp IHsNCgkJCQlsaXN0KCRzdWJ0eXBlLCAkbGV2ZWwpID0gZXhwbG9kZSgiOiIsICRzdWIpOw0K CQkJCSRsZXZlbCA9IChlbXB0eSgkbGV2ZWwpKSA/IDAgOiAkbGV2ZWw7DQoJCQkJJGxldmVs ID0gKHN0cnRvbG93ZXIoJGxldmVsKT09ImFsbCIpID8gOTk5OTkgOiAkbGV2ZWw7DQoJCQkJ JG91dGl0ZW1zID0gYXJyYXkoKTsNCgkJCQlmb3JlYWNoICgkaXRlbSBhcyAkY2F0KSB7DQoJ CQkJCSRjYXRzID0gZ2V0VHJlZShkb3NsYXNoKCRjYXQpLCAkc3VidHlwZSk7DQoJCQkJCWZv cmVhY2ggKCRjYXRzIGFzICRqZHggPT4gJHZhbCkgew0KCQkJCQkJaWYgKCRjYXRzWyRqZHhd WydsZXZlbCddIDw9ICRsZXZlbCkgew0KCQkJCQkJCSRvdXRpdGVtc1tdID0gJGNhdHNbJGpk eF1bJ25hbWUnXTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQkkaXRlbSA9ICRvdXRp dGVtczsNCgkJCX0NCg0KCQkJLy8gUXVvdGUgaWYgYXNrZWQNCgkJCSRpdGVtID0gKCRxdGUp ID8gZG9BcnJheSgkaXRlbSwgJ2RvUXVvdGUnKSA6ICRpdGVtOw0KCQkJaWYgKCRtb2QgPT09 IDApIHsNCgkJCQkkaW5jID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRpbmMsICRpdGVt KSk7DQoJCQl9IGVsc2Ugew0KCQkJCSRleGMgPSBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2Uo JGV4YywgJGl0ZW0pKTsNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gYXJyYXkoJGluYywgJGV4 Yyk7DQp9DQp9DQoNCi8vIFNwbGl0IGEgc3RyaW5nIG9uIGEgcGF0dGVybiBhbmQgYWxsb3cg aW50ZWdlciByYW5nZXMgdG8gYmUgZXhwYW5kZWQNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJz bWRfc3BsaXQiKSkgew0KZnVuY3Rpb24gc21kX3NwbGl0KCRzdHIsICRhbGxvd1JhbmdlPXRy dWUsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVHX1NQTElUX05PX0VN UFRZKSB7DQoJJHJldGFyciA9IGFycmF5KCk7DQoJaWYgKChzdWJzdHIoJHNwbGl0YXQsMCwx KSA9PSAiLyIpICYmIChzdWJzdHIoJHNwbGl0YXQsIHN0cmxlbigkc3BsaXRhdCktMSwgMSkg PT0gIi8iKSkgew0KCQkkcGF0ID0gJHNwbGl0YXQ7DQoJfSBlbHNlIHsNCgkJJHBhdCA9ICcv WycuJHNwbGl0YXQuJ10rLyc7DQoJfQ0KCSRlbGVtcyA9IHByZWdfc3BsaXQoJHBhdCwgJHN0 ciwgLTEsICRwcmVnb3B0KTsNCglmb3JlYWNoICgkZWxlbXMgYXMgJGl0ZW0pIHsNCgkJJGl0 ZW0gPSB0cmltKCRpdGVtKTsNCgkJJG5lZ2F0ZSA9IGZhbHNlOw0KCQkvLyBEb2VzIHRoZSBp dGVtIHN0YXJ0IHdpdGggYSBuZWdhdGlvbiBjaGFyYWN0ZXINCgkJaWYgKHN1YnN0cigkaXRl bSwwLDEpID09PSAiISIpIHsNCgkJCSRuZWdhdGUgPSB0cnVlOw0KCQkJJGl0ZW0gPSBzdWJz dHIoJGl0ZW0sMSk7DQoJCX0NCgkJLy8gSXMgdGhlIGl0ZW0gYW4gaW50ZWdlciBsaXN0IHJh bmdlDQoJCWlmICgkYWxsb3dSYW5nZSAmJiBwcmVnX21hdGNoKCcvXihcZCspXC0oXGQrKSQv JywgJGl0ZW0pKSB7DQoJCQlsaXN0KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0iLCAkaXRlbSwg Mik7DQoJCQkkcm5nID0gcmFuZ2UoJGxvLCAkaGkpOw0KCQkJLy8gUmVhcHBseSB0aGUgbmVn YXRpb24gaWYgbmVjZXNzYXJ5DQoJCQlmb3IoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkcm5n KTsgJGlkeCsrKSB7DQoJCQkJJHJuZ1skaWR4XSA9ICgoJG5lZ2F0ZSkgPyAiISIgOiAiIikg LiAkcm5nWyRpZHhdOw0KCQkJfQ0KCQkJJHJldGFyciA9IGFycmF5X21lcmdlKCRyZXRhcnIs ICRybmcpOw0KCQl9IGVsc2Ugew0KCQkJJHJldGFycltdID0gKCgkbmVnYXRlKSA/ICIhIiA6 ICIiKSAuICRpdGVtOw0KCQl9DQoJfQ0KCXJldHVybiAkcmV0YXJyOw0KfQ0KfQ0KDQppZiAo IWZ1bmN0aW9uX2V4aXN0cygic21kX2RvRGJsUXVvdGUiKSkgew0KZnVuY3Rpb24gc21kX2Rv RGJsUXVvdGUoJHZhbCkgew0KCXJldHVybiAnIicuJHZhbC4nIic7DQp9DQp9DQoNCmlmICgh ZnVuY3Rpb25fZXhpc3RzKCJzbWRfcmVtb3ZlUVNWYXIiKSkgew0KZnVuY3Rpb24gc21kX3Jl bW92ZVFTVmFyKCR1cmwsICRrZXkpIHsNCgkkdXJsID0gcHJlZ19yZXBsYWNlKCcvKC4qKShc P3wmKScgLiAka2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0JywgJHVybCAuICcm Jyk7DQoJJHVybCA9IHN1YnN0cigkdXJsLCAwLCAtMSk7DQoJcmV0dXJuICgkdXJsKTsNCn0N Cn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9hZGRRU1ZhciIpKSB7DQpmdW5jdGlv biBzbWRfYWRkUVNWYXIoJHVybCwgJGtleSwgJHZhbHVlKSB7DQoJJHVybCA9IHNtZF9yZW1v dmVRU1ZhcigkdXJsLCAka2V5KTsNCglpZiAoc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNl KSB7DQoJCXJldHVybiAoJHVybCAuICc/JyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOw0KCX0g ZWxzZSB7DQoJCXJldHVybiAoJHVybCAuICcmJyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOw0K CX0NCn0NCn0NCg0KLy8gREVQUkVDQVRFRDogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5 IG9ubHkNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfZ2V0U3ViQ2F0cyIpKSB7DQpmdW5j dGlvbiBzbWRfZ2V0U3ViQ2F0cygkcGFyZW50LCRjYXR0eXBlKSB7DQoJcmV0dXJuIGdldFRy ZWUoJHBhcmVudCwkY2F0dHlwZSk7IC8vZ2V0VHJlZSgpIG9yIGdldFRyZWVQYXRoKCk/Pw0K fQ0KfQ0KDQovLyBERVBSRUNBVEVEOiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25s eQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9nZXRPcHRzIikpIHsNCmZ1bmN0aW9uIHNt ZF9nZXRPcHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXg9IiIsICRhbGxvd1JhbmdlPXRy dWUsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVHX1NQTElUX05PX0VN UFRZKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGljbGU7DQoNCgkkb3V0ID0gYXJy YXkoKTsNCgkkbm90b3V0ID0gYXJyYXkoKTsNCgkkbWF0Y2hlcyA9IHNtZF9zcGxpdCgkc3Ry LCAkYWxsb3dSYW5nZSwgJHNwbGl0YXQsICRwcmVnb3B0KTsNCgkvLyBBbiBhcnJheSB0aGF0 IHRlbGxzIHRoZSBsb29wIHdoYXQgdG8gZG8gd2l0aCBlYWNoIG9mIHRoZSB2YWxpZCBzdHJp bmdzDQoJLy8gIGFyZzE6IHR5cGUgKDE9ZXhhY3QgbWF0Y2gsIDI9YW55d2hlcmUgd2l0aGlu IHN0cmluZywgMz1jdXN0b20gZmllbGQpDQoJLy8gIGFyZzI6IHByZWZpeCwgaWYgYW55DQoJ Ly8gIGFyZzM6IHZhcmlhYmxlIHRvIHN1YnN0aXR1dGUNCgkvLyAgYXJnNDogZXh0cmEgY2hl Y2ssIGlmIGFwcGxpY2FibGUNCgkvLyAgYXJnNTogc3RvcmUgaW4gdGhlIGluL2V4Y2x1ZGUg bGlzdCAoMT1pbmNsdWRlOyAyPWV4Y2x1ZGUpDQoJJG9wdCA9IGFycmF5KA0KCQkiP2MiID0+ IGFycmF5KDIsICIiLCAkcHJldGV4dFsnYyddLCAiMSIsIDEpLA0KCQkiIWMiID0+IGFycmF5 KDIsICIiLCAkcHJldGV4dFsnYyddLCAiMSIsIDIpLA0KCQkiP3MiID0+IGFycmF5KDIsICIi LCAkcHJldGV4dFsncyddLCAiMSIsIDEpLA0KCQkiIXMiID0+IGFycmF5KDIsICIiLCAkcHJl dGV4dFsncyddLCAiMSIsIDIpLA0KCQkiP3EiID0+IGFycmF5KDIsICIiLCAkcHJldGV4dFsn cSddLCAiMSIsIDEpLA0KCQkiIXEiID0+IGFycmF5KDIsICIiLCAkcHJldGV4dFsncSddLCAi MSIsIDIpLA0KCQkiP3QiID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGljbGVbJ3VybF90aXRs ZSddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMSksDQoJCSIhdCIgPT4gYXJyYXkoMiwgIiIs ICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10sICckdGhpc2FydGljbGUhPU5VTEwnLCAyKSwN CgkJIj9pZCIgPT4gYXJyYXkoMSwgJGlkcHJlZml4LCAkcHJldGV4dFsnaWQnXSwgJyR0aGlz YXJ0aWNsZSE9TlVMTCcsIDEpLA0KCQkiIWlkIiA9PiBhcnJheSgxLCAkaWRwcmVmaXgsICRw cmV0ZXh0WydpZCddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMiksDQoJCSI/IiA9PiBhcnJh eSgzLCAiIiwgIiIsICckdGhpc2FydGljbGUhPU5VTEwnLCAxKSwNCgkJIiEiID0+IGFycmF5 KDMsICIiLCAiIiwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDIpLA0KCSk7DQoNCglmb3IgKCRp ZHggPSAwOyAkaWR4IDwgY291bnQoJG1hdGNoZXMpOyAkaWR4KyspIHsNCgkJJG1hdGNoZWQg PSBmYWxzZTsNCgkJJHRoaXNtYXRjaCA9ICRtYXRjaGVzWyRpZHhdOw0KCQlmb3JlYWNoICgk b3B0IGFzICR2YXIgPT4gJGFyZ3MpIHsNCgkJCSRvcHZhciA9ICgkYXJnc1s0XSA9PSAxKSA/ ICJvdXQiIDogIm5vdG91dCI7DQoJCQlzd2l0Y2ggKCRhcmdzWzBdKSB7DQoJCQkJY2FzZSAx Og0KCQkJCQlpZiAoKCR0aGlzbWF0Y2ggPT09ICR2YXIpICYmIGluX2FycmF5KCR2YXIsJGFs bG93ZWQpKSB7DQoJCQkJCQkkbWF0Y2hlZCA9IHRydWU7DQoJCQkJCQlpZiAoJGFyZ3NbMl0g IT0gIiIgJiYgJGFyZ3NbM10pIHsNCgkJCQkJCQkkcmVwID0gc3RyX3JlcGxhY2UoJHZhciwg JGFyZ3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOw0KCQkJCQkJCWlmICghaW5fYXJyYXko JHJlcCwgJHskb3B2YXJ9KSkgew0KCQkJCQkJCQkkeyRvcHZhcn1bXSA9ICRyZXA7DQoJCQkJ CQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgMjoNCgkJCQkJ JHBhdCA9ICcvXFwnLiR2YXIuJyR8XFwnLiR2YXIuJ1teQS1aYS16MC05XS8nOw0KCQkJCQlp ZiAoKGlzX2ludChzbWRfcHJlZ1BvcygkcGF0LCAkdGhpc21hdGNoLCAkZm5kKSkpICYmIGlu X2FycmF5KCR2YXIsJGFsbG93ZWQpKSB7DQoJCQkJCQkkbWF0Y2hlZCA9IHRydWU7DQoJCQkJ CQlpZiAoJGFyZ3NbMl0gIT0gIiIgJiYgJGFyZ3NbM10pIHsNCgkJCQkJCQkkcmVwID0gc3Ry X3JlcGxhY2UoJHZhciwgJGFyZ3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOw0KCQkJCQkJ CWlmICghaW5fYXJyYXkoJHJlcCwgJHskb3B2YXJ9KSkgew0KCQkJCQkJCQkkeyRvcHZhcn1b XSA9ICRyZXA7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJ CWNhc2UgMzoNCgkJCQkJJGxlbiA9IHN0cmxlbigkdmFyKTsNCgkJCQkJaWYgKChzdWJzdHIo JHRoaXNtYXRjaCwwLCRsZW4pID09PSAkdmFyKSAmJiBpbl9hcnJheSgkdmFyLiJmaWVsZCIs JGFsbG93ZWQpKSB7DQoJCQkJCQkkbWF0Y2hlZCA9IHRydWU7DQoJCQkJCQkvLyBVc2UgdGhl IGdpdmVuIGZpZWxkIG5hbWU7IHdoaWNoIG1heSBiZSBhIGNvbW1hLXNlcGFyYXRlZCBzdWJs aXN0Lg0KCQkJCQkJLy8gU3BsaXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0 aW9uIG1hcmsNCgkJCQkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJHRoaXNtYXRjaCwkbGVuKTsN CgkJCQkJCWlmICgoJGFyZ3NbM10pICYmIChpc3NldCgkdGhpc2FydGljbGVbc3RydG9sb3dl cigkZmllbGRuYW1lKV0pKSkgew0KCQkJCQkJCSRmaWVsZENvbnRlbnRzID0gJHRoaXNhcnRp Y2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkk ZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7DQoJCQkJCQl9DQoJCQkJCQlpZiAoIWVtcHR5 KCRmaWVsZENvbnRlbnRzKSkgew0KCQkJCQkJCSRzdWJvdXQgPSBzbWRfc3BsaXQoc3RyaXBf dGFncygkZmllbGRDb250ZW50cyksICRhbGxvd1JhbmdlLCAkc3BsaXRhdCwgJHByZWdvcHQp Ow0KCQkJCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsNCgkJCQkJCQkJaWYg KCFpbl9hcnJheSgkc3VibmFtZSwgJHskb3B2YXJ9KSkgew0KCQkJCQkJCQkJJHskb3B2YXJ9 W10gPSAkc3VibmFtZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0K CQkJCQlicmVhazsNCgkJCX0NCgkJCWlmICgkbWF0Y2hlZCkgew0KCQkJCWJyZWFrOw0KCQkJ fQ0KCQl9DQoJCWlmICghJG1hdGNoZWQpIHsNCgkJCS8vIEFzc2lnbiB0aGUgdmFyaWFibGUg dmVyYmF0aW0NCgkJCWlmICghaW5fYXJyYXkoJHRoaXNtYXRjaCwgJG91dCkpIHsNCgkJCQkk b3V0W10gPSAkdGhpc21hdGNoOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBhcnJheSgkb3V0 LCRub3RvdXQpOw0KfQ0KfQ0KDQovLyBTdG9sZW4gZnJvbSBwaHAubmV0OiBzdHJwb3MgcGFn ZSBjb21tZW50cy4uLg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9wcmVnUG9zIikpIHsN CmZ1bmN0aW9uIHNtZF9wcmVnUG9zKCRzUGF0dGVybiwgJHNTdWJqZWN0LCAmJEZvdW5kU3Ry aW5nLCAkaU9mZnNldCA9IDApIHsNCgkkRm91bmRTdHJpbmcgPSBudWxsOw0KCWlmIChwcmVn X21hdGNoKCRzUGF0dGVybiwgJHNTdWJqZWN0LCAkYU1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NB UFRVUkUsICRpT2Zmc2V0KSA+IDApIHsNCgkJJEZvdW5kU3RyaW5nID0gJGFNYXRjaGVzWzBd WzBdOw0KCQlyZXR1cm4gJGFNYXRjaGVzWzBdWzFdOw0KCX0gZWxzZSB7DQoJCXJldHVybiBm YWxzZTsNCgl9DQp9DQp9DQovLy4uLiBhbmQgYXJyYXlfY29tYmluZS4uLg0KaWYgKCFmdW5j dGlvbl9leGlzdHMoImFycmF5X2NvbWJpbmUiKSkgew0KCWZ1bmN0aW9uIGFycmF5X2NvbWJp bmUoJGFycjEsJGFycjIpIHsNCgkJJG91dCA9IGFycmF5KCk7DQoJCWZvcmVhY2goJGFycjEg YXMgJGtleTEgPT4gJHZhbHVlMSkgew0KCQkJJG91dFskdmFsdWUxXSA9ICRhcnIyWyRrZXkx XTsNCgkJfQ0KICAgCXJldHVybiAkb3V0Ow0KCX0NCn0NCi8vLi4uIGFuZCBodG1sc3BlY2lh bGNoYXJzX2RlY29kZQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNf ZGVjb2RlIikpIHsNCglmdW5jdGlvbiBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgkc3RyaW5n LCAkcXVvdGVfc3R5bGUgPSBFTlRfQ09NUEFUKSB7DQoJCXJldHVybiBzdHJ0cigkc3RyaW5n LCBhcnJheV9mbGlwKGdldF9odG1sX3RyYW5zbGF0aW9uX3RhYmxlKEhUTUxfU1BFQ0lBTENI QVJTLCAkcXVvdGVfc3R5bGUpKSk7DQoJfQ0KfSI7czo0OiJ0eXBlIjtzOjE6IjIiO3M6NToi b3JkZXIiO3M6MToiNSI7czo0OiJoZWxwIjtzOjEwNTExOiIJPHA+PGRpdiBpZD0ic21kX2hl bHAiPjwvcD4KCgk8aDE+c21kXyBwbHVnaW4gbGlicmFyeTwvaDE+CgoJPHA+T2ZmZXJzIG5v IHB1YmxpYyB0ZXh0cGF0dGVybiB0YWdzLiBJdCBpcyBzaW1wbHkgYSBzaGFyZWQgbGlicmFy eSBvZiBjb21tb24gZnVuY3Rpb25zIHVzZWQgYnkgc21kXyBwbHVnaW5zLjwvcD4KCgk8aDI+ Q2hhbmdlbG9nPC9oMj4KCgk8dWw+CgkJPGxpPnYwLjEgICAwNy0wMi0yNSBJbml0aWFsIHB1 YmxpYyByZWxlYXNlPC9saT4KCQk8bGk+djAuMiAgIDA3LTAzLTAzIEFkZGVkOiA8c3BhbiBj bGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L3NwYW4+IChNdWx0 aS1MaW5ndWFsIFBhY2spIGxpYnJhcnkgc3VwcG9ydDwvbGk+CgkJPGxpPnYwLjIxICAwNy0w My0wNiBBZGRlZDogaW50ZWdlciByYW5nZSBmdW5jdGlvbmFsaXR5LiA8Y29kZT5zbWRfZ2V0 QXR0czwvY29kZT4gbm93IHRha2VzIGEgUmVnRXggYXJnPC9saT4KCQk8bGk+djAuMjFhIDA3 LTAzLTIxIEZpeGVkOiBDaGFyYWN0ZXIgcmFuZ2VzIGlnbm9yZWQgKHRoYW5rcyBtcmRhbGUp PC9saT4KCQk8bGk+djAuMjFiIDA3LTA0LTAyIEZpeGVkOiBTdGlja3kgYXJ0aWNsZSBzdXBw b3J0IGluIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiAodGhhbmtzIHBpZW1hbik8L2xpPgoJ CTxsaT52MC4yMWMgMDctMDctMjkgRml4ZWQ6IE51bWVyaWMgcmFuZ2VzIGluIGNhdGVnb3Jp ZXMgKHRoYW5rcyB3b2xsZSk8L2xpPgoJCTxsaT52MC4yMWQgMDctMDgtMDMgRml4ZWQ6IE5l Z2F0aW9uIHdpdGggbXVsdGlwbGUgZWxlbWVudHM8L2xpPgoJCTxsaT52MC4yMWUgMDctMDkt MTQgRml4ZWQ6IEFiaWxpdHkgdG8gbGVhdmUgZW1wdHkgc3BsaXRSYW5nZSBwYXJhbWV0ZXJz IGludGFjdDwvbGk+CgkJPGxpPnYwLjIyICAwNy0wOS0yMCBGaXhlZDogVW5kZWZpbmVkIGlu ZGV4IHdhcm5pbmdzICh0aGFua3MgQW1iaXRpb3VzbGVtb24pLiBFbmhhbmNlZCBtYXRjaGVz IHNvIHNwYWNlcyBhcmUgYWxsb3dlZCBpbiBzdHJpbmdzICh0aGFua3MgRHJSb2dnKTwvbGk+ CgkJPGxpPnYwLjIzICAwNy0wNC0wOSA8c3BhbiBjbGFzcz0iY2FwcyI+QkVUQTwvc3Bhbj4g OiBBZGRlZCB0aGUgRnV6enlGaW5kIGNsYXNzIGFuZCBnZXRXb3JkIGZ1bmN0aW9uLiBnZXRB dHRzKCkgbm93IGFsbG93cyA8Y29kZT4/cTwvY29kZT48L2xpPgoJCTxsaT52MC4zICAgMDct MTAtMjkgUmV3cm90ZSA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4gYXMgPGNvZGU+c21kX2dl dE9wdHM8L2NvZGU+IHRvIGFsbG93IHJlcGxhY2VkIHZhcnMgd2l0aGluIHRleHQuIERlcHJl Y2F0ZWQgPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+LCBhZGRlZCA8Y29kZT5zbWRfcHJlZ1Bv czwvY29kZT4uIENoYW5nZWQgPGNvZGU+c21kX3NwbGl0UmFuZ2U8L2NvZGU+IGFzIDxjb2Rl PnNtZF9zcGxpdDwvY29kZT4gdG8gYWxsb3cgcmFuZ2VzIHRvIGJlIHN3aXRjaGVkIG9uIG9y IG9mZi4gRGVwcmVjYXRlZCA8Y29kZT5zbWRfc3BsaXRSYW5nZTwvY29kZT4uIEFkZGVkIGdl bmVyaWMgPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4gY2xhc3Mgc3VwcG9ydCAoPGNv ZGU+c21kX01MUDwvY29kZT4pLiBEZXByZWNhdGVkIDxjb2RlPnNtZE1MUDwvY29kZT4gYXJy YXksIDxjb2RlPnNtZF9nVHh0PC9jb2RlPiBhbmQgPGNvZGU+c21kX2dldENhbGxlcjwvY29k ZT4uIE1hZGUgPGNvZGU+c21kX0Z1enp5RmluZDwvY29kZT4gYW5kIDxjb2RlPnNtZF9nZXRX b3JkPC9jb2RlPiBvZmZpY2lhbDwvbGk+CgkJPGxpPnYwLjMxICAwNy0xMS0yNyBSZW1vdmVk IDxjb2RlPnNtZE1MUDwvY29kZT4gYXJyYXksIDxjb2RlPnNtZF9nVHh0PC9jb2RlPiBhbmQg PGNvZGU+c21kX2dldENhbGxlcjwvY29kZT4uIERlcHJlY2F0ZWQgPGNvZGU+c21kX2dldFN1 YkNhdHM8L2NvZGU+LiBBZGRlZCBhIGZldyBQSFA0IGhlbHBlciBmdW5jdGlvbnM8L2xpPgoJ CTxsaT52MC4zMiAgMDgtMDMtMjkgUmVtb3ZlZCA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4g YW5kIDxjb2RlPnNtZF9nZXRTdWJDYXRzPC9jb2RlPi4gRGVwcmVjYXRlZCA8Y29kZT5zbWRf Z2V0T3B0czwvY29kZT4gYW5kIDxjb2RlPnNtZF9zcGxpdDwvY29kZT4uIEFkZGVkIDxjb2Rl PnNtZF9kb0xpc3Q8L2NvZGU+LiBNb3ZlZCB0aGUgPGNvZGU+c21kX0Z1enp5RmluZDwvY29k ZT4gY2xhc3MgYW5kIDxjb2RlPnNtZF9nZXRXb3JkPC9jb2RlPiBpbnRvIHRoZSBzbWRfZnV6 enlfZmluZCBwbHVnaW4gd2hlcmUgdGhleSBzaG91bGQgaGF2ZSBiZWVuIGFsbCBhbG9uZzwv bGk+CgkJPGxpPnYwLjMzICAwOC0xMi0wMiBVbmRlcHJlY2F0ZWQoISkgPGNvZGU+c21kX3Nw bGl0PC9jb2RlPiBzaW5jZSBpdCYjODIxNztzIGFjdHVhbGx5IHF1aXRlIHVzZWZ1bCA7IGV4 dGVuZGVkIDxjb2RlPnNtZF9kb0xpc3Q8L2NvZGU+IHRvIGVuY29tcGFzcyA8Y29kZT4kdGhp c2ltYWdlPC9jb2RlPiAoZm9yIGZ1dHVyZSkgYW5kIDxjb2RlPiR2YXJpYWJsZTwvY29kZT4g OyBmaXhlZCBidWcgaW4gPGNvZGU+c21kX2RvTGlzdDwvY29kZT4gd2hlbiB1c2luZyBzdWJj YXRzPC9saT4KCTwvdWw+CgoJPGgyPkZ1bmN0aW9uIFJlZmVyZW5jZTwvaDI+CgoJPHA+PHN0 cm9uZz5zbWRfYWRkUVNWYXI8L3N0cm9uZz48YnIgLz4KPHN0cm9uZz5zbWRfcmVtb3ZlUVNW YXI8L3N0cm9uZz48L3A+CgoJPHA+QWRkIG9yIHJlbW92ZSBhIHF1ZXJ5IHN0cmluZyB2YXJp YWJsZSB0byB0aGUgZ2l2ZW4gPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4sIHRha2lu ZyBpbnRvIGFjY291bnQgYW55IGV4aXN0aW5nIHZhcmlhYmxlcyB0aGF0IG1heSBiZSBpbiB0 aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4gYWxyZWFkeS4gJiM4MjE2O0FkZCYj ODIxNzsgdGFrZXMgdGhyZWUgYXJndW1lbnRzLCAmIzgyMTY7UmVtb3ZlJiM4MjE3OyBqdXN0 IHRha2VzIHRoZSBmaXJzdCB0d286PC9wPgoKCTxvbD4KCQk8bGk+VGhlIDxzcGFuIGNsYXNz PSJjYXBzIj5VUkw8L3NwYW4+IHN0cmluZyB0byBhZGQgdG8vcmVtb3ZlIGZyb208L2xpPgoJ CTxsaT5UaGUgaWQgb2YgdGhlIHF1ZXJ5c3RyaW5nICh0aGUgYml0IGJlZm9yZSB0aGUgPSBz aWduKTwvbGk+CgkJPGxpPlRoZSB2YWx1ZSBvZiB0aGUgbmV3IHF1ZXJ5c3RyaW5nICh0aGUg Yml0IGFmdGVyIHRoZSA9IHNpZ24pPC9saT4KCTwvb2w+CgoJPHA+ZS5nLiA8Y29kZT5zbWRf YWRkUVNWYXIoJHRoaXNhcnRpY2xlWyYjMzk7dXJsX3RpdGxlJiMzOTtdLCAmIzM5O3RwZyYj Mzk7LCAxNSk7PC9jb2RlPiB3b3VsZCBhZGQgPGNvZGU+dHBnPTE1PC9jb2RlPiB0byB0aGUg Y3VycmVudCBhcnRpY2xlJiM4MjE3O3MgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4u IElmIHRoZXJlIGFyZSBubyBvdGhlciB2YXJpYWJsZXMgY3VycmVudGx5IGluIHRoZSA8c3Bh biBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPiwgaXQgaXMgYWRkZWQgd2l0aCBhIHF1ZXN0aW9u IG1hcmssIG90aGVyd2lzZSBpdCBpcyBhcHBlbmRlZCB3aXRoIGFuIGFtcGVyc2FuZC48L3A+ CgoJPHA+PHN0cm9uZz5zbWRfZG9MaXN0PC9zdHJvbmc+PC9wPgoKCTxwPlJldHVybiBhbiBl eHBhbmRlZCBsaXN0IG9mIGl0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOjwv cD4KCgk8b2w+CgkJPGxpPkFueXRoaW5nIGNvbnRhaW5pbmcgJiM4MjE2Oz8mIzgyMTc7IG9y ICYjODIxNjshJiM4MjE3OyBpcyBjaGVja2VkIGZvciBhIG1hdGNoIHdpdGggYSA8c3BhbiBj bGFzcz0iY2FwcyI+VFhQPC9zcGFuPiBmaWVsZCAoPGNvZGU+Jmx0O3R4cDp2YXJpYWJsZSAv Jmd0OzwvY29kZT4sIGltYWdlLCBmaWxlLCBsaW5rLCBnbG9iYWwgYXJ0aWNsZSwgdXJsIDxz cGFuIGNsYXNzPSJjYXBzIj5QT1NUPC9zcGFuPi9HRVQvU0VSVkVSLCBvciBpbmRpdmlkdWFs IGFydGljbGUsIGluIHRoYXQgb3JkZXIpPC9saT4KCQk8bGk+QW55IHJhbmdlcyBvZiBpdGVt cyBhcmUgZXhwYW5kZWQgKGUuZy4gNC03ID0mZ3Q7IDQsNSw2LDcpIGlmIHRoZSA8Y29kZT5y bmc8L2NvZGU+IG9wdGlvbiBwZXJtaXRzIGl0PC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImNh cHMiPlRYUDwvc3Bhbj4gZmllbGRzIG1heSB0aGVtc2VsdmVzIGJlIGxpc3RzIG9yIHJhbmdl czwvbGk+CgkJPGxpPkFueXRoaW5nIHRoYXQgaXMgbm90IGEgPHNwYW4gY2xhc3M9ImNhcHMi PlRYUDwvc3Bhbj4gZmllbGQgaXMgdXNlZCB2ZXJiYXRpbTwvbGk+CgkJPGxpPlRoZSBpdGVt cyBhcmUgcmV0dXJuZWQgYXMgMiBsaXN0czsgaW5jbHVzaW9uIGFuZCBleGNsdXNpb248L2xp PgoJPC9vbD4KCgk8cD5BcmdzICggWypdID0gbWFuZGF0b3J5ICkgOgoJPG9sPgoJCTxsaT5b Kl0gbHN0ID0gdGhlIGxpc3QgYXMgYSBkZWxpbWl0ZWQgc3RyaW5nPC9saT4KCQk8bGk+cm5n ID0gd2hldGhlciB0byBhbGxvdyByYW5nZXMgb3Igbm90IChib29sKS4gRGVmYXVsdCA9IHRy dWU8L2xpPgoJCTxsaT5zdWIgPSB0aGUgdHlwZSBvZiBzdWJjYXRlZ29yeSB0byB0cmF2ZXJz ZSAoaW1hZ2UsIGZpbGUsIGxpbmssIGFydGljbGUsIG5vbmU9JiM4MjIxOyYjODIyMDspIGFu ZCBob3cgbWFueSBsZXZlbHMgdG8gZ28gZG93biAoZS5nLiBpbWFnZToyKS4gRGVmYXVsdCA9 ICYjODIxNjsmIzgyMTc7PC9saT4KCQk8bGk+cXRlID0gd2hldGhlciB0byBxdW90ZSBlYWNo IGl0ZW0gaW4gdGhlIGFycmF5IG9yIG5vdCAoYm9vbCkuIERlZmF1bHQgPSB0cnVlPC9saT4K CQk8bGk+ZGxtID0gdGhlIGRlbGltaXRlciAoc3RyaW5nKS4gRGVmYXVsdCA9ICYjODIyMDss JiM4MjIxOzwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ryb25nPnNtZF9nZXRPcHRzPC9zdHJv bmc+PC9wPgoKCTxwPkRlcHJlY2F0ZWQgYXMgaXQgaXMgbW9zdGx5IHN1cGVyc2VkZWQgYnkg c21kX2RvTGlzdDsgdGhpcyBvbmUgaXMgY2x1bmtpZXIgYnV0IGhhcyAkaWRwcmVmaXggc28g aXQgcmVtYWlucyBmb3Igbm93LiBJdCBzZWFyY2hlcyB0aGUgcGFzc2VkIHN0cmluZyBmb3Ig cHJlZGV0ZXJtaW5lZCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyBhbmQsIGlmIHRoYXQgc2Vx dWVuY2UgaXMgaW4gdGhlIGdpdmVuICRhbGxvd2VkIGFycmF5LCByZXBsYWNlcyBpdCBhcyBm b2xsb3dzOjwvcD4KCgk8dWw+CgkJPGxpPj9jID0gY3VycmVudCBnbG9iYWwgY2F0ZWdvcnkg KCFjID0gbm90IGN1cnJlbnQgY2F0ZWdvcnkpPC9saT4KCQk8bGk+P3MgPSBjdXJyZW50IHNl Y3Rpb24gKCFzID0gbm90IGN1cnJlbnQgc2VjdGlvbik8L2xpPgoJCTxsaT4/dCA9IGN1cnJl bnQgYXJ0aWNsZSB0aXRsZSAoIXQgPSBub3QgY3VycmVudCB0aXRsZSk8L2xpPgoJCTxsaT4/ aWQgPSBjdXJyZW50IGFydGljbGUgSUQsIHByZXBlbmRlZCB3aXRoICRpZHByZWZpeCAoIWlk ID0gbm90IGN1cnJlbnQgSUQpPC9saT4KCQk8bGk+P3EgPSBjdXJyZW50IHF1ZXJ5IHRlcm0g KCFxID0gbm90IGN1cnJlbnQgcXVlcnkgdGVybSk8L2xpPgoJCTxsaT4/ZmllbGQgPSBjb250 ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJiM4MjE3O3MgZmllbGQgKGNvdWxkIGJlIGEg Y29tbWEtc2VwYXJhdGVkIGxpc3QpPC9saT4KCQk8bGk+IWZpZWxkID0gbm90IHRoZSBjb250 ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJiM4MjE3O3MgZmllbGQgKGNvdWxkIGJlIGEg Y29tbWEtc2VwYXJhdGVkIGxpc3QpPC9saT4KCTwvdWw+CgoJPHA+SW50ZWdlciByYW5nZXMg KGUuZy4gMS01KSB3aWxsIGJlIGV4cGFuZGVkIGludG8gdGhlaXIgaW5kaXZpZHVhbCB2YWx1 ZXMgaWYgdGhlICRhbGxvd1JhbmdlIG9wdGlvbiBpcyB0cnVlOyBhbnl0aGluZyBlbHNlIGlz IHJldHVybmVkIHZlcmJhdGltLiBJdCBvdXRwdXRzIHR3byBhcnJheXM6IHRoZSAxc3QgY29u dGFpbnMgaXRlbXMgZm9yIGluY2x1c2lvbiwgdGhlIDJuZCBjb250YWlucyBpdGVtcyBmb3Ig ZXhjbHVzaW9uLjwvcD4KCgk8cD5BcmdzICggWypdID0gbWFuZGF0b3J5ICkgOgoJPG9sPgoJ CTxsaT5bKl0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yIG1hdGNoZXM8L2xpPgoJCTxsaT5b Kl0gQW4gYXJyYXkgY29udGFpbmluZyBzaG9ydGN1dHMgdGhhdCBhcmUgJiM4MjIwO2FsbG93 ZWQmIzgyMjE7IHRvIGJlIGZvdW5kIGluIHRoZSBzdHJpbmcgKD9jLCA/cywgP3QsID9maWVs ZCBldGMpPC9saT4KCQk8bGk+VGhlIHByZWZpeCBmb3IgP2lkIHN0cmluZ3M8L2xpPgoJCTxs aT5Cb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBhbGxvdyByYW5nZSBleHBhbnNpb24g b3Igbm90PC9saT4KCQk8bGk+UmVnRXggc3RyaW5nIHRvIHNwbGl0IG9wdGlvbnMgYXQgKHNl ZSBzbWRfc3BsaXQpPC9saT4KCQk8bGk+cHJlZ19zcGxpdCBvcHRpb24gKHNlZSBzbWRfc3Bs aXQpPC9saT4KCTwvb2w+PC9wPgoKCTxwPjxzdHJvbmc+c21kX3NwbGl0PC9zdHJvbmc+PC9w PgoKCTxwPlJldHVybnMgYW4gYXJyYXkgb2YgaXRlbXMgZnJvbSBhIHN0cmluZyBvZiAodXN1 YWxseSkgY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4gSWYgYW55IHZhbHVlcyBjb250YWluIHJh bmdlcyBvZiBudW1iZXJzIGxpa2UgMS01IHRoYXQgbmVlZCAmIzgyMTY7ZXhwYW5kaW5nJiM4 MjE3OyBmaXJzdCAoYW5kICRhbGxvd1JhbmdlIGlzIHRydWUpLCB0aGV5IGFyZSBkZWFsdCB3 aXRoLiBUYWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyAoIFsqXSA9IG1hbmRhdG9yeSBh cmdzKSA6PC9wPgoKCTxvbD4KCQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc3BsaXQ8L2xpPgoJ CTxsaT5Cb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBhbGxvdyByYW5nZSBleHBhbnNp b24gb3Igbm90IChpLmUuIDEtNSBiZWNvbWVzIDEsMiwzLDQsNSk8L2xpPgoJCTxsaT5UaGUg cmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlciBjbGFzc2VzIHRvIG1hdGNoLiBJZiBhIGZ1 bGwgUmVnRXggc3RhcnRpbmcgYW5kIGVuZGluZyB3aXRoICYjODIxNjsvJiM4MjE3OyBjaGFy YWN0ZXJzIGlzIHN1cHBsaWVkLCB0aGUgZXhwcmVzc2lvbiBpcyB1c2VkIHZlcmJhdGltLiBX aXRob3V0IHRoZSAmIzgyMTY7LyYjODIxNzsgY2hhcmFjdGVycywgdGhlIGV4cHJlc3Npb24g aXMgdHJlYXRlZCBhcyBhIGxpc3Qgb2YgY2hhcmFjdGVyIGNsYXNzZXMgdG8gZmluZC4gRGVm YXVsdHMgdG8gJiM4MjIwOy8oLHwsXHMpKy8mIzgyMjE7IHdoaWNoIGlzIGEgY29tbWEsIG9y IGNvbW1hIGFuZCBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLjwvbGk+CgkJPGxpPnByZWdfc3Bs aXQgb3B0aW9uIGNvbnN0YW50IGFzIGRlZmluZWQgaW4gdGhlIHBocCBtYW51YWw8L2xpPgoJ PC9vbD4KCgk8cD48c3Ryb25nPnNtZF9NTFA8L3N0cm9uZz48YnIgLz4KSW5zdGFudGlhdGUg b25lIG9mIHRoZXNlIHRvIGhhbmRsZSA8YWNyb255bSB0aXRsZT0iTXVsdGktTGluZ3VhbCBQ YWNrIj48c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPjwvYWNyb255bT4gaW4geW91ciBw bHVnaW4gbGlrZSB0aGlzOjwvcD4KCgk8cD4xKSBEZWNsYXJlIGEgdW5pcXVlIGdsb2JhbCB2 YXJpYWJsZSwgZS5nLiBnbG9iYWwgJG15UGx1ZzxiciAvPgoyKSBEZWZpbmUgeW91ciBkZWZh dWx0IHN0cmluZyByZXBsYWNlbWVudCBhcnJheSAoZG9lc24mIzgyMTc7dCBuZWVkIHRvIGJl IGdsb2JhbCksIGUuZzo8L3A+CgoJPHA+CSRteVN0cmluZ3MgPSBhcnJheSAoJiM4MjIwO21z ZzEmIzgyMjE7ID0mZ3Q7ICYjODIyMDtUaGlzIGlzIG1lc3NhZ2UgMSYjODIyMTssICYjODIy MDttc2cyJiM4MjIxOyA9Jmd0OyAmIzgyMjA7VGhpcyBpcyBtZXNzYWdlIDImIzgyMjE7KTs8 L3A+CgoJPHA+MykgQ3JlYXRlIGFuIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IGhh bmRsZXI6PC9wPgoKCTxwPgkkbXlQbHVnID0gbmV3IHNtZF9NTFAoJiM4MjIwO3BsdWdpbl9u YW1lJiM4MjIxOywgJiM4MjIwO3BsdWdpbl9wcmVmaXgmIzgyMjE7LCAkbXlTdHJpbmdzKTs8 L3A+CgoJPHA+NCkgVGhhdCYjODIxNztzIGl0ISBUaGVyZSBhcmUgdHdvIG9wdGlvbmFsIGFy Z3MgdG8gc21kX01MUDoKCWEpIHRoZSBkZWZhdWx0IChmdWxsKSBsYW5ndWFnZSB0byB1c2Us IGUuZyAmIzgyMjA7ZGEtZGsmIzgyMjE7LiBEZWZhdWx0cyB0byAmIzgyMjA7ZW4tZ2ImIzgy MjE7LgoJYikgdGhlIGludGVyZmFjZSB0aGUgc3RyaW5ncyBhcmUgZm9yLiBDaG9vc2UgZnJv bSAmIzgyMjA7cHVibGljJiM4MjIxOyAodGhlIGRlZmF1bHQpLCAmIzgyMjA7YWRtaW4mIzgy MjE7IG9yICYjODIyMDtjb21tb24mIzgyMjE7PC9wPgoKCTxwPjUpIFRvIHVzZSBhIHJlcGxh Y2VtZW50IHN0cmluZyBpbiB5b3VyIGNvZGU6CglhKSBNYWtlIHN1cmUgdG8gaW1wb3J0IHRo ZSB1bmlxdWUgZ2xvYmFsIHZhcmlhYmxlOiBlLmcuIGdsb2JhbCAkbXlQbHVnOwoJYikgQ2Fs bCAkbXlQbHVnLSZndDtnVHh0KCYjODIyMDttZXNzYWdlSUQmIzgyMjE7KTsgWyBlLmcuICRt eVBsdWctJmd0O2dUeHQoJiM4MjIwO21zZzEmIzgyMjE7KSBdCgljKSBJZiB5b3Ugd2FudCB0 byByZXBsYWNlIGFueSBhcmdzIGluIHlvdXIgbWVzc2FnZSBzdHJpbmcsIHBhc3MgYW4gYXNz b2NpYXRpdmUgYXJyYXkgYXMgdGhlIDJuZCBhcmcgdG8gZ1R4dCgpPC9wPgoKCTxwPjxzdHJv bmc+c21kX2RvRGJsUXVvdGU8L3N0cm9uZz48L3A+CgoJPHA+QWx0ZXJuYXRpdmUgdG8gdGhl IGNvcmUmIzgyMTc7cyBkb1F1b3RlKCkuIFRoaXMgb25lIGRibC1xdW90ZXMgaW5zdGVhZCBv ZiBzZ2wtcXVvdGVzPC9wPgoKCTxwPjxzdHJvbmc+c21kX3ByZWdQb3M8L3N0cm9uZz48L3A+ CgoJPHA+TGlmdGVkIGZyb20gb25lIG9mIHRoZSBjb21tZW50cyBpbiB0aGUgPHNwYW4gY2xh c3M9ImNhcHMiPlBIUDwvc3Bhbj4gbWFudWFsLCB0aGlzIGp1c3QgbG9va3MgZm9yIGEgUmVn RXggc3RyaW5nIHdpdGhpbiBhbm90aGVyLCByZXR1cm5pbmcgdGhlIG1hdGNoZXMgaXQgZmlu ZHMgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgbWF0Y2guPC9wPgoKCTxwPjxzdHJv bmc+YXJyYXlfY29tYmluZTwvc3Ryb25nPjwvcD4KCgk8cD5QSFA0IGVxdWl2YWxlbnQgb2Yg dGhlIHN0YW5kYXJkIFBIUDUgZnVuY3Rpb24sIGxpZnRlZCBmcm9tIHBocC5uZXQ8L3A+CgoJ PHA+PHN0cm9uZz5odG1sc3BlY2lhbGNoYXJzX2RlY29kZTwvc3Ryb25nPjwvcD4KCgk8cD5Q SFA0IGVxdWl2YWxlbnQgb2YgdGhlIHN0YW5kYXJkIFBIUDUgZnVuY3Rpb24sIGxpZnRlZCBm cm9tIHBocC5uZXQ8L3A+CgogIDwvZGl2Pgo8IS0tIC0tLSBCRUdJTiBQTFVHSU4gQ1NTIC0t LSAtLT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KI3NtZF9oZWxwIHsgbGluZS1oZWlnaHQ6 MS4zIDt9CiNzbWRfaGVscCBjb2RlIHsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udDogMTA1JS8x MzAlICJDb3VyaWVyIE5ldyIsIGNvdXJpZXIsIG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xv cjogI0ZGRkZDQzt9CiNzbWRfaGVscCBjb2RlLmJsb2NrIHsgZm9udC13ZWlnaHQ6bm9ybWFs OyBib3JkZXI6MXB4IGRvdHRlZCAjOTk5OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBlNjhjOyBk aXNwbGF5OmJsb2NrOyBtYXJnaW46MTBweCAxMHB4IDIwcHg7IHBhZGRpbmc6MTBweDsgfQoj c21kX2hlbHAgYTpsaW5rLCAjc21kX2hlbHAgYTp2aXNpdGVkIHsgY29sb3I6IGJsdWU7IHRl eHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsdWU7IHBh ZGRpbmctYm90dG9tOjFweDt9CiNzbWRfaGVscCBhOmhvdmVyLCAjc21kX2hlbHAgYTphY3Rp dmUgeyBjb2xvcjogYmx1ZTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBib3JkZXItYm90dG9t OiAycHggc29saWQgYmx1ZTsgcGFkZGluZy1ib3R0b206MXB4O30KI3NtZF9oZWxwIGgxIHsg Y29sb3I6ICMzNjk7IGZvbnQ6IDIwcHggR2VvcmdpYSwgc2Fucy1zZXJpZjsgbWFyZ2luOiAw OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KI3NtZF9oZWxwIGgyIHsgYm9yZGVyLWJvdHRvbTog MXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOjEwcHggMCAwOyBjb2xvcjogIzM2OTsgZm9udDog MTdweCBHZW9yZ2lhLCBzYW5zLXNlcmlmOyB9CiNzbWRfaGVscCBoMyB7IGNvbG9yOiAjNjkz OyBmb250OiBib2xkIDEycHggQXJpYWwsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAx cHg7IG1hcmdpbjogMTBweCAwIDA7dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTt9CiNzbWRf aGVscCBoNCB7IGZvbnQ6IGJvbGQgMTFweCBBcmlhbCwgc2Fucy1zZXJpZjsgbGV0dGVyLXNw YWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAgMCA7dGV4dC10cmFuc2Zvcm06IHVwcGVyY2Fz ZTsgfQojc21kX2hlbHAgLmF0dC1uYW1lIHsgZm9udC13ZWlnaHQ6Ym9sZDsgfQojc21kX2hl bHAgLm1hbmQgeyBiYWNrZ3JvdW5kOiNlZWU7IGJvcmRlcjoxcHggZG90dGVkICM5OTk7IH0K I3NtZF9oZWxwIHRhYmxlIHt3aWR0aDoxMDAlOyB0ZXh0LWFsaWduOmNlbnRlcjsgcGFkZGlu Zy1ib3R0b206MWVtO30KI3NtZF9oZWxwIHRkLCAjc21kX2hlbHAgdGgge2JvcmRlcjoxcHgg c29saWQgIzk5OTsgcGFkZGluZzouNWVtIDA7fQo8L3N0eWxlPgo8IS0tIC0tLSBFTkQgUExV R0lOIENTUyAtLS0gLS0+CiI7czozOiJtZDUiO3M6MzI6ImM1NTdhYjc4N2U3MzNiY2M3NDJi YThkZDA2NDUxMWEwIjt9