# smd_lib v0.21e # Shared function library used by smd_ plugins and others. # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NToiMC4yMWUiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3N0ZWZkYXdzb24uY29t LyI7czoxMToiZGVzY3JpcHRpb24iO3M6NTY6IlNoYXJlZCBmdW5jdGlvbiBsaWJyYXJ5IHVz ZWQgYnkgc21kXyBwbHVnaW5zIGFuZCBvdGhlcnMuIjtzOjQ6InR5cGUiO2k6MjtzOjQ6Im5h bWUiO3M6Nzoic21kX2xpYiI7czo0OiJoZWxwIjtzOjgxMzoiCTxoMT5zbWRfIHBsdWdpbiBs aWJyYXJ5PC9oMT4KCgk8cD5PZmZlcnMgbm8gcHVibGljIHRleHRwYXR0ZXJuIHRhZ3MuIEl0 IGlzIHNpbXBseSBhIHNoYXJlZCBsaWJyYXJ5IG9mIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBi eSBzbWRfIHBsdWdpbnMuPC9wPgoKCTxoMj5DaGFuZ2Vsb2c8L2gyPgoKCTx1bD4KCQk8bGk+ djAuMSAgIDA3LTAyLTI1IEluaXRpYWwgcHVibGljIHJlbGVhc2U8L2xpPgoJCTxsaT52MC4y ICAgMDctMDMtMDMgQWRkZWQgPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4gKE11bHRp LUxpbmd1YWwgUGFjaykgbGlicmFyeSBzdXBwb3J0PC9saT4KCQk8bGk+djAuMjEgIDA3LTAz LTA2IEFkZGVkIGludGVnZXIgcmFuZ2UgZnVuY3Rpb25hbGl0eS4gZ2V0QXR0cyBub3cgdGFr ZXMgYSByZWdleHAgYXJnLjwvbGk+CgkJPGxpPnYwLjIxYSAwNy0wMy0yMSBGaXhlZDogQ2hh cmFjdGVyIHJhbmdlcyBpZ25vcmVkICh0aGFua3MgbXJkYWxlKTwvbGk+CgkJPGxpPnYwLjIx YiAwNy0wNC0wMiBGaXhlZDogU3RpY2t5IGFydGljbGUgc3VwcG9ydCBpbiBnZXRBdHRzICh0 aGFua3MgcGllbWFuKTwvbGk+CgkJPGxpPnYwLjIxYyAwNy0wNy0yOSBGaXhlZDogTnVtZXJp YyByYW5nZXMgaW4gY2F0ZWdvcmllcyAodGhhbmtzIHdvbGxlKTwvbGk+CgkJPGxpPnYwLjIx ZCAwNy0wOC0wMyBGaXhlZDogTmVnYXRpb24gd2l0aCBtdWx0aXBsZSBlbGVtZW50czwvbGk+ CgkJPGxpPnYwLjIxZSAwNy0wOS0xNCBGaXhlZDogQWJpbGl0eSB0byBsZWF2ZSBlbXB0eSBz cGxpdFJhbmdlIHBhcmFtZXRlcnMgaW50YWN0PC9saT4KCTwvdWw+IjtzOjQ6ImNvZGUiO3M6 NzY2OToiCmdsb2JhbCAkc21kTUxQOwokc21kTUxQID0gYXJyYXkoCgkJJ3NtZF9zbGltYm94 JyA9PiAnc21kX3Nib3gnLAoJCSdzbWRfc2xpbWJveF9pbmMnID0+ICdzbWRfc2JveCcsCgkJ J3NtZF9yYW5kb21fYmFubmVyJyA9PiAnc21kX3JiYW4nLAoJKTsKZnVuY3Rpb24gc21kX2Fk ZFFTVmFyKCR1cmwsICRrZXksICR2YWx1ZSkgewoJJHVybCA9IHNtZF9yZW1vdmVRU1Zhcigk dXJsLCAka2V5KTsKCWlmIChzdHJwb3MoJHVybCwgJz8nKSA9PT0gZmFsc2UpIHsKCQlyZXR1 cm4gKCR1cmwgLiAnPycgLiAka2V5IC4gJz0nIC4gJHZhbHVlKTsKCX0gZWxzZSB7CgkJcmV0 dXJuICgkdXJsIC4gJyYnIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9Cn0KZnVuY3Rpb24g c21kX3JlbW92ZVFTVmFyKCR1cmwsICRrZXkpIHsKCSR1cmwgPSBwcmVnX3JlcGxhY2UoJy8o LiopKFw/fCYpJyAuICRrZXkgLiAnPVteJl0rPygmKSguKikvaScsICckMSQyJDQnLCAkdXJs IC4gJyYnKTsKCSR1cmwgPSBzdWJzdHIoJHVybCwgMCwgLTEpOwoJcmV0dXJuICgkdXJsKTsK fQovLyByZXR1cm4gYSBsaXN0IG9mIGNhdGVnb3JpZXMgdW5kZXIgKGFuZCBpbmNsdWRpbmcp IHRoZSBnaXZlbiBwYXJlbnQgY2F0ZWdvcnkKZnVuY3Rpb24gc21kX2dldFN1YkNhdHMoJHBh cmVudCwkY2F0dHlwZSkgewoJJHBhcmVudCA9IGRvU2xhc2goJHBhcmVudCk7CgkkbGV4dHJl bSA9IDE7ICRyZXh0cmVtID0gMTsKCWV4dHJhY3Qoc2FmZV9yb3coImxmdCBhcyBsZXh0cmVt LCByZ3QgYXMgcmV4dHJlbSIsICJ0eHBfY2F0ZWdvcnkiLCAibmFtZT0nJHBhcmVudCcgYW5k IHR5cGUgPSAnJGNhdHR5cGUnIikpOwoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCJpZCxuYW1l LHRpdGxlIiwidHhwX2NhdGVnb3J5IiwgImxmdCBiZXR3ZWVuICRsZXh0cmVtIGFuZCAkcmV4 dHJlbSBhbmQgdHlwZSA9ICckY2F0dHlwZScgb3JkZXIgYnkgbGZ0IGFzYyIpOwoJJGNhdHMg PSBhcnJheSgpOwoKCXdoaWxlICgkcm93ID0gbmV4dFJvdygkcnMpKSB7CgkJJGNhdHNbXSA9 IGFycmF5KAoJCQknaWQnID0+ICRyb3dbJ2lkJ10sCgkJCSduYW1lJyA9PiAkcm93WyduYW1l J10sCgkJCSd0aXRsZScgPT4gJHJvd1sndGl0bGUnXQoJCSk7Cgl9CglyZXR1cm4gJGNhdHM7 Cn0KLy8gU2VhcmNoZXMgdGhlIHBhc3NlZCAkc3RyIGZvciBwcmVkZXRlcm1pbmVkIHNlcXVl bmNlcyBvZiBjaGFyYWN0ZXJzCi8vIGFuZCwgaWYgdGhhdCBzZXF1ZW5jZSBpcyBpbiAkYWxs b3dlZCwgcmVwbGFjZXMgaXQgYXMgZm9sbG93czoKLy8gID9jID0gY3VycmVudCBnbG9iYWwg Y2F0ZWdvcnkgKCFjID0gbm90IGN1cnJlbnQgY2F0ZWdvcnkpCi8vICA/cyA9IGN1cnJlbnQg c2VjdGlvbiAoIXMgPSBub3QgY3VycmVudCBzZWN0aW9uKQovLyAgP3QgPSBjdXJyZW50IGFy dGljbGUgdGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0bGUpCi8vICA/aWQgPSBjdXJyZW50 IGFydGljbGUgSUQsIHByZXBlbmRlZCB3aXRoICRpZHByZWZpeCAoIWlkID0gbm90IGN1cnJl bnQgSUQpCi8vICA/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3Mg ZmllbGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpCi8vICAhZmllbGQgPSBu b3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFydGljbGUncyBmaWVsZCAoY291bGQg YmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCkKLy8gUmFuZ2VzIChlLmcuIDEtNSBvciBhLXop IHdpbGwgYmUgZXhwYW5kZWQgaW50byB0aGVpciBpbmRpdmlkdWFsIHZhbHVlcyAoUEhQPjQu MS4wIGZvciBjaGFycykuCi8vIEFueXRoaW5nIGVsc2UgaXMgcmV0dXJuZWQgdmVyYmF0aW0u Ci8vIE91dHB1dHMgdHdvIGFycmF5czsgdGhlIDFzdCBjb250YWluaW5nIGl0ZW1zIGZvciBp bmNsdXNpb24sIHRoZSAybmQgZm9yIGV4Y2x1c2lvbi4KZnVuY3Rpb24gc21kX2dldEF0dHMo JHN0ciwgJGFsbG93ZWQsICRpZHByZWZpeD0iIiwgJHNwbGl0YXQ9IixccyIsICRwcmVnb3B0 ID0gUFJFR19TUExJVF9OT19FTVBUWSkgewoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGlj bGU7CgoJJG91dCA9IGFycmF5KCk7Cgkkc3Vib3V0ID0gYXJyYXkoKTsKCSRub3RvdXQgPSBh cnJheSgpOwoJJG1hdGNoZXMgPSBzbWRfc3BsaXRSYW5nZSgkc3RyLCAkc3BsaXRhdCwgJHBy ZWdvcHQpOwoKCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbWF0Y2hlcyk7ICRpZHgr KykgewoJCSR0aGlzbWF0Y2ggPSAkbWF0Y2hlc1skaWR4XTsKCQlpZiAoKCR0aGlzbWF0Y2gg PT09ICI/YyIpICYmIGluX2FycmF5KCI/YyIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSBnbG9i YWwgYXJ0aWNsZSBjYXRlZ29yeSwgaWYgaXQgZXhpc3RzCgkJCWlmICgkcHJldGV4dFsnYydd ICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCRwcmV0ZXh0WydjJ10sICRvdXQpKSB7CgkJ CQkJJG91dFtdID0gJHByZXRleHRbJ2MnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0 aGlzbWF0Y2ggPT09ICIhYyIpICYmIGluX2FycmF5KCIhYyIsJGFsbG93ZWQpKSB7CgkJCS8v IERvbid0IHVzZSBnbG9iYWwgYXJ0aWNsZSBjYXRlZ29yeQoJCQlpZiAoJHByZXRleHRbJ2Mn XSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsnYyddLCAkbm90b3V0KSkg ewoJCQkJCSRub3RvdXRbXSA9ICRwcmV0ZXh0WydjJ107CgkJCQl9CgkJCX0KCQl9IGVsc2Ug aWYgKCgkdGhpc21hdGNoID09PSAiP3MiKSAmJiBpbl9hcnJheSgiP3MiLCRhbGxvd2VkKSkg ewoJCQkvLyBVc2UgYXJ0aWNsZSBzZWN0aW9uCgkJCWlmICgkcHJldGV4dFsncyddICE9ICIi KSB7CgkJCQlpZiAoIWluX2FycmF5KCRwcmV0ZXh0WydzJ10sICRvdXQpKSB7CgkJCQkJJG91 dFtdID0gJHByZXRleHRbJ3MnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0 Y2ggPT09ICIhcyIpICYmIGluX2FycmF5KCIhcyIsJGFsbG93ZWQpKSB7CgkJCS8vIERvbid0 IHVzZSBhcnRpY2xlIHNlY3Rpb24KCQkJaWYgKCRwcmV0ZXh0WydzJ10gIT0gIiIpIHsKCQkJ CWlmICghaW5fYXJyYXkoJHByZXRleHRbJ3MnXSwgJG5vdG91dCkpIHsKCQkJCQkkbm90b3V0 W10gPSAkcHJldGV4dFsncyddOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRj aCA9PT0gIj90IikgJiYgaW5fYXJyYXkoIj90IiwkYWxsb3dlZCkpIHsKCQkJLy8gVXNlIGFy dGljbGUgVVJMIHRpdGxlIGlmIHRoaXMgaXMgYW4gYXJ0aWNsZS4KCQkJaWYgKCR0aGlzYXJ0 aWNsZSAhPSBOVUxMICYmICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10gIT0gIiIpIHsKCQkJ CWlmICghaW5fYXJyYXkoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJG91dCkpIHsKCQkJ CQkkb3V0W10gPSAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddOwoJCQkJfQoJCQl9CgkJfSBl bHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiF0IikgJiYgaW5fYXJyYXkoIiF0IiwkYWxsb3dl ZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGFydGljbGUgVVJMIHRpdGxlCgkJCWlmICgkdGhpc2Fy dGljbGUgIT0gTlVMTCAmJiAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddICE9ICIiKSB7CgkJ CQlpZiAoIWluX2FycmF5KCR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10sICRub3RvdXQpKSB7 CgkJCQkJJG5vdG91dFtdID0gJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXTsKCQkJCX0KCQkJ fQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICI/aWQiKSAmJiBpbl9hcnJheSgiP2lk IiwkYWxsb3dlZCkpIHsKCQkJLy8gVXNlIGFydGljbGUgSUQsIHByZXBlbmRlZCB3aXRoICRp ZHByZWZpeAoJCQlpZiAoJHRoaXNhcnRpY2xlICE9IE5VTEwpIHsKCQkJCWlmICghaW5fYXJy YXkoJGlkcHJlZml4IC4gJHByZXRleHRbJ2lkJ10sICRvdXQpKSB7CgkJCQkJJG91dFtdID0g JGlkcHJlZml4IC4gJHByZXRleHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgk dGhpc21hdGNoID09PSAiIWlkIikgJiYgaW5fYXJyYXkoIiFpZCIsJGFsbG93ZWQpKSB7CgkJ CS8vIERvbid0IHVzZSBhcnRpY2xlIElECgkJCWlmICgkdGhpc2FydGljbGUgIT0gTlVMTCkg ewoJCQkJaWYgKCFpbl9hcnJheSgkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXSwgJG5vdG91 dCkpIHsKCQkJCQkkbm90b3V0W10gPSAkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXTsKCQkJ CX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2hbMF0gPT09ICI/IikgJiYgaW5fYXJy YXkoIj9maWVsZCIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSB0aGUgZ2l2ZW4gZmllbGQgbmFt ZTsgd2hpY2ggbWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIHN1Ymxpc3QuCgkJCS8vIFNwbGl0 IG9mZiB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrCgkJCSRmaWVsZG5h bWUgPSBzdWJzdHIoJHRoaXNtYXRjaCwxKTsKCQkJaWYgKCgkdGhpc2FydGljbGUgIT0gTlVM TCkgJiYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpKSB7CgkJCQkkZmllbGRD b250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJfSBlbHNlIHsKCQkJCSRm aWVsZENvbnRlbnRzID0gJGZpZWxkbmFtZTsKCQkJfQoJCQlpZiAoIWVtcHR5KCRmaWVsZENv bnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHNtZF9zcGxpdFJhbmdlKHN0cmlwX3RhZ3MoJGZp ZWxkQ29udGVudHMpLCAkc3BsaXRhdCk7CgkJCQlmb3JlYWNoICgkc3Vib3V0IGFzICRzdWJu YW1lKSB7CgkJCQkJaWYgKCFpbl9hcnJheSgkc3VibmFtZSwgJG91dCkpIHsKCQkJCQkJJG91 dFtdID0gJHN1Ym5hbWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNt YXRjaFswXSA9PT0gIiEiKSAmJiBpbl9hcnJheSgiIWZpZWxkIiwkYWxsb3dlZCkpIHsKCQkJ Ly8gTmVnYXRpb24uIE1heSBlaXRoZXIgYmUgYSBmaWVsZCBuYW1lIChhbmQgbWF5YmUgYW5v dGhlciBDU0wpIG9yIGEgZml4ZWQgdGVybS4KCQkJLy8gU3BsaXQgb2ZmIHRoZSBuYW1lIGZy b20gdGhlIGV4Y2xhbWF0aW9uIG1hcmsKCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkdGhpc21h dGNoLDEpOwoJCQlpZiAoKCR0aGlzYXJ0aWNsZSAhPSBOVUxMKSAmJiAoaXNzZXQoJHRoaXNh cnRpY2xlWyRmaWVsZG5hbWVdKSkpIHsKCQkJCSRmaWVsZENvbnRlbnRzID0gJHRoaXNhcnRp Y2xlWyRmaWVsZG5hbWVdOwoJCQl9IGVsc2UgewoJCQkJJGZpZWxkQ29udGVudHMgPSAkZmll bGRuYW1lOwoJCQl9CgkJCWlmICghZW1wdHkoJGZpZWxkQ29udGVudHMpKSB7CgkJCQkkc3Vi b3V0ID0gc21kX3NwbGl0UmFuZ2Uoc3RyaXBfdGFncygkZmllbGRDb250ZW50cyksICRzcGxp dGF0KTsKCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlpZiAoIWlu X2FycmF5KCRzdWJuYW1lLCAkbm90b3V0KSkgewoJCQkJCQkkbm90b3V0W10gPSAkc3VibmFt ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIWluX2FycmF5KCR0aGlz bWF0Y2gsICRvdXQpKSB7CgkJCQkkb3V0W10gPSAkdGhpc21hdGNoOwoJCQl9CgkJfQoJfQoJ cmV0dXJuIGFycmF5KCRvdXQsJG5vdG91dCk7Cn0KLy8gUmV0dXJuIGFuIGFycmF5IG9mIGl0 ZW1zIGZyb20gYSBzdHJpbmcgb2YgKHVzdWFsbHkpIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMu Ci8vIFNvbWUgdmFsdWVzIG1heSBjb250YWluIHJhbmdlcyBvZiBudW1iZXJzIGxpa2UgMS01 IHRoYXQgbmVlZCAnZXhwYW5kaW5nJyBmaXJzdApmdW5jdGlvbiBzbWRfc3BsaXRSYW5nZSgk c3RyLCAkc3BsaXRhdD0iLFxzIiwgJHByZWdPcHQgPSBQUkVHX1NQTElUX05PX0VNUFRZKSB7 CgkkcmV0YXJyID0gYXJyYXkoKTsKCSRlbGVtcyA9IHByZWdfc3BsaXQoJy9bJy4kc3BsaXRh dC4nXSsvJywgJHN0ciwgLTEsICRwcmVnT3B0KTsKCWZvcmVhY2ggKCRlbGVtcyBhcyAkaXRl bSkgewoJCSRuZWdhdGUgPSBmYWxzZTsKCQkvLyBEb2VzIHRoZSBpdGVtIHN0YXJ0IHdpdGgg YSBuZWdhdGlvbiBjaGFyYWN0ZXIKCQlpZiAoJGl0ZW1bMF0gPT09ICIhIikgewoJCQkkbmVn YXRlID0gdHJ1ZTsKCQkJJGl0ZW0gPSBzdWJzdHIoJGl0ZW0sMSk7CgkJfQoJCS8vIElzIHRo ZSBpdGVtIGFuIGludGVnZXIgbGlzdCByYW5nZQoJCWlmIChwcmVnX21hdGNoKCcvXihcZCsp XC0oXGQrKSQvJywgJGl0ZW0pKSB7CgkJCWxpc3QoJGxvLCAkaGkpID0gZXhwbG9kZSgiLSIs ICRpdGVtLCAyKTsKCQkJJHJuZyA9IHJhbmdlKCRsbywgJGhpKTsKCQkJLy8gUmVhcHBseSB0 aGUgbmVnYXRpb24gaWYgbmVjZXNzYXJ5CgkJCWZvcigkaWR4ID0gMDsgJGlkeCA8IGNvdW50 KCRybmcpOyAkaWR4KyspIHsKCQkJCSRybmdbJGlkeF0gPSAoKCRuZWdhdGUpID8gIiEiIDog IiIpIC4gJHJuZ1skaWR4XTsKCQkJfQoJCQkkcmV0YXJyID0gYXJyYXlfbWVyZ2UoJHJldGFy ciwgJHJuZyk7CgkJfSBlbHNlIHsKCQkJJHJldGFycltdID0gKCgkbmVnYXRlKSA/ICIhIiA6 ICIiKSAuICRpdGVtOwoJCX0KCX0KCXJldHVybiAkcmV0YXJyOwp9Ci8vIEdlbmVyaWMgbG9v a3VwIGZ1bmN0aW9uIGZvciBpbnRlcmZhY2luZyB3aXRoIE1MUCB0byBsb2NhbGlzZSBzdHJp bmdzLgovLyAgJHN0cmF5ID0gYXJyYXkgb2YgZGVmYXVsdCBzdHJpbmdzCi8vICAkd2hhdCA9 IGtleSB0byBsb29rIHVwCi8vICAkYXJncyA9IGFueSBhcmd1bWVudHMgdGhlIGtleSBpcyBl eHBlY3RpbmcgZm9yIHJlcGxhY2VtZW50CmZ1bmN0aW9uIHNtZF9nVHh0KCRzdHJheSwgJHdo YXQsICRhcmdzID0gYXJyYXkoKSkgewoJZ2xvYmFsICR0ZXh0YXJyYXksICRzbWRNTFA7Cgkk Zm4gPSBzbWRfZ2V0Q2FsbGVyKCk7CgoJLy8gRHJvcCBvdXQgaWYgdGhlIGlkIGlzbid0IGRl ZmluZWQuCgkvLyBXb3VsZCBiZSBuaWNlIHRvIHVzZSByZWZsZWN0aW9uIHRvIGZpbmQgdGhl IG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGFuZCBwYXNzIHRoYXQsCgkvLyBidXQgdGhhdCdzIFBI UDUgdGVycml0b3J5IG9ubHkKCWlmIChlbXB0eSgkZm4pKSB7CgkJJHN0ciA9ICR3aGF0OwoJ fSBlbHNlIHsKCQkvLyBQcmVwYXJlIHRoZSBwcmVmaXhlZCBrZXkgZm9yIHVzZQoJCSRrZXkg PSAkc21kTUxQWyRmbl0gLiAnLScgLiAkd2hhdDsKCQkka2V5ID0gc3RydG9sb3dlcigka2V5 KTsKCgkJLy8gR3JhYiBmcm9tIHRoZSBnbG9iYWwgdGV4dGFycmF5IChwb3NzaWJseSBlZGl0 ZWQgYnkgTUxQKSBpZiB3ZSBjYW4KCQlpZihpc3NldCgkdGV4dGFycmF5WyRrZXldKSkgewoJ CQkkc3RyID0gJHRleHRhcnJheVska2V5XTsKCQl9IGVsc2UgewoJCQkvLyBUaGUgc3RyaW5n IGlzbid0IGluIHRoZSBsb2NhbGlzZWQgJHRleHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2lu ZwoJCQkvLyB0aGUgKG5vbiBwcmVmaXhlZCkgc3RyaW5nIGFycmF5IGluIHRoZSBwbHVnaW4K CQkJJGtleSA9IHN0cnRvbG93ZXIoJHdoYXQpOwoJCQkkc3RyID0gKGlzc2V0KCRzdHJheVsk a2V5XSkpID8gJHN0cmF5WyRrZXldIDogJHdoYXQ7CgkJfQoJfQoJLy8gUGVyZm9ybSBzdWJz dGl0dXRpb25zCglpZighZW1wdHkoJGFyZ3MpKSB7CgkJJHN0ciA9IHN0cnRyKCRzdHIsICRh cmdzKTsKCX0KCXJldHVybiAkc3RyOwp9Ci8vIENoZWF0aW5nIHdheSBvZiBmaW5kaW5nIGEg ZnVuY3Rpb24ncyBjYWxsZXIKZnVuY3Rpb24gc21kX2dldENhbGxlcigpIHsKCSRiYWNrdHJh Y2UgPSBkZWJ1Z19iYWNrdHJhY2UoKTsKCXJldHVybiAkYmFja3RyYWNlWzJdWydmdW5jdGlv biddOwp9CiI7czozOiJtZDUiO3M6MzI6ImU5YjM5YWNkNTFlNWFiZTQ4MGRjMGIxNjRkYzYz MGUxIjt9