# smd_lib v0.2 # Shared function library used by smd_ plugins. # Stef Dawson # http://www.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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4yIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBE YXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5j b20vIjtzOjExOiJkZXNjcmlwdGlvbiI7czo0NToiU2hhcmVkIGZ1bmN0aW9uIGxpYnJhcnkg dXNlZCBieSBzbWRfIHBsdWdpbnMuIjtzOjQ6InR5cGUiO2k6MjtzOjQ6Im5hbWUiO3M6Nzoi c21kX2xpYiI7czo0OiJoZWxwIjtzOjMzMDoiCTxoMT5zbWRfIHBsdWdpbiBsaWJyYXJ5PC9o MT4KCgk8cD5PZmZlcnMgbm8gcHVibGljIHRleHRwYXR0ZXJuIHRhZ3MuIEl0IGlzIHNpbXBs eSBhIHNoYXJlZCBsaWJyYXJ5IG9mIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBieSBzbWRfIHBs dWdpbnMuPC9wPgoKCTxoMj5DaGFuZ2Vsb2c8L2gyPgoKCTx1bD4KCQk8bGk+djAuMSAgIDA3 LTAyLTI1IEluaXRpYWwgcHVibGljIHJlbGVhc2U8L2xpPgoJCTxsaT52MC4yICAgMDctMDMt MDMgQWRkZWQgPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4gKE11bHRpLUxpbmd1YWwg UGFjaykgbGlicmFyeSBzdXBwb3J0PC9saT4KCTwvdWw+IjtzOjQ6ImNvZGUiO3M6NzAxNjoi Cmdsb2JhbCAkc21kTUxQOwokc21kTUxQID0gYXJyYXkoCgkJJ3NtZF9zbGltYm94JyA9PiAn c21kX3Nib3gnLAoJCSdzbWRfc2xpbWJveF9pbmMnID0+ICdzbWRfc2JveCcsCgkJJ3NtZF9y YW5kb21fYmFubmVyJyA9PiAnc21kX3JiYW4nLAoJKTsKCmZ1bmN0aW9uIHNtZF9hZGRRU1Zh cigkdXJsLCAka2V5LCAkdmFsdWUpIHsKCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwg JGtleSk7CglpZiAoc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNlKSB7CgkJcmV0dXJuICgk dXJsIC4gJz8nIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAo JHVybCAuICcmJyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOwoJfQp9CmZ1bmN0aW9uIHNtZF9y ZW1vdmVRU1ZhcigkdXJsLCAka2V5KSB7CgkkdXJsID0gcHJlZ19yZXBsYWNlKCcvKC4qKShc P3wmKScgLiAka2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0JywgJHVybCAuICcm Jyk7CgkkdXJsID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsKCXJldHVybiAoJHVybCk7Cn0KCi8v IHJldHVybiBhIGxpc3Qgb2YgY2F0ZWdvcmllcyB1bmRlciAoYW5kIGluY2x1ZGluZykgdGhl IGdpdmVuIHBhcmVudCBjYXRlZ29yeQpmdW5jdGlvbiBzbWRfZ2V0U3ViQ2F0cygkcGFyZW50 LCRjYXR0eXBlKSB7CgkkcGFyZW50ID0gZG9TbGFzaCgkcGFyZW50KTsKCSRsZXh0cmVtID0g MTsgJHJleHRyZW0gPSAxOwoJZXh0cmFjdChzYWZlX3JvdygibGZ0IGFzIGxleHRyZW0sIHJn dCBhcyByZXh0cmVtIiwgInR4cF9jYXRlZ29yeSIsICJuYW1lPSckcGFyZW50JyBhbmQgdHlw ZSA9ICckY2F0dHlwZSciKSk7CgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoImlkLG5hbWUsdGl0 bGUiLCJ0eHBfY2F0ZWdvcnkiLCAibGZ0IGJldHdlZW4gJGxleHRyZW0gYW5kICRyZXh0cmVt IGFuZCB0eXBlID0gJyRjYXR0eXBlJyBvcmRlciBieSBsZnQgYXNjIik7CgkkY2F0cyA9IGFy cmF5KCk7CgoJd2hpbGUgKCRyb3cgPSBuZXh0Um93KCRycykpIHsKCQkkY2F0c1tdID0gYXJy YXkoCgkJCSdpZCcgPT4gJHJvd1snaWQnXSwKCQkJJ25hbWUnID0+ICRyb3dbJ25hbWUnXSwK CQkJJ3RpdGxlJyA9PiAkcm93Wyd0aXRsZSddCgkJKTsKCX0KCXJldHVybiAkY2F0czsKfQoK Ly8gU2VhcmNoZXMgdGhlIHBhc3NlZCAkc3RyIGZvciBwcmVkZXRlcm1pbmVkIHNlcXVlbmNl cyBvZiBjaGFyYWN0ZXJzCi8vIGFuZCwgaWYgdGhhdCBzZXF1ZW5jZSBpcyBpbiAkYWxsb3dl ZCwgcmVwbGFjZXMgaXQgYXMgZm9sbG93czoKLy8gID9jID0gY3VycmVudCBnbG9iYWwgY2F0 ZWdvcnkgKCFjID0gbm90IGN1cnJlbnQgY2F0ZWdvcnkpCi8vICA/cyA9IGN1cnJlbnQgc2Vj dGlvbiAoIXMgPSBub3QgY3VycmVudCBzZWN0aW9uKQovLyAgP3QgPSBjdXJyZW50IGFydGlj bGUgdGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0bGUpCi8vICA/aWQgPSBjdXJyZW50IGFy dGljbGUgSUQsIHByZXBlbmRlZCB3aXRoICRpZHByZWZpeCAoIWlkID0gbm90IGN1cnJlbnQg SUQpCi8vICA/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3MgZmll bGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpCi8vICAhZmllbGQgPSBub3Qg dGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFydGljbGUncyBmaWVsZCAoY291bGQgYmUg YSBjb21tYS1zZXBhcmF0ZWQgbGlzdCkKLy8gQW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCB2 ZXJiYXRpbS4KLy8gT3V0cHV0cyB0d28gYXJyYXlzOyB0aGUgMXN0IGNvbnRhaW5pbmcgaXRl bXMgZm9yIGluY2x1c2lvbiwgdGhlIDJuZCBmb3IgZXhjbHVzaW9uCmZ1bmN0aW9uIHNtZF9n ZXRBdHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXg9IiIpIHsKCWdsb2JhbCAkcHJldGV4 dCwgJHRoaXNhcnRpY2xlOwoKCSRvdXQgPSBhcnJheSgpOwoJJHN1Ym91dCA9IGFycmF5KCk7 Cgkkbm90b3V0ID0gYXJyYXkoKTsKCSRtYXRjaGVzID0gcHJlZ19zcGxpdCgnL1ssXHNdKy8n LCRzdHIsLTEsUFJFR19TUExJVF9OT19FTVBUWSk7CgoJZm9yICgkaWR4ID0gMDsgJGlkeCA8 IGNvdW50KCRtYXRjaGVzKTsgJGlkeCsrKSB7CgkJJHRoaXNtYXRjaCA9ICRtYXRjaGVzWyRp ZHhdOwoJCWlmICgoJHRoaXNtYXRjaCA9PT0gIj9jIikgJiYgaW5fYXJyYXkoIj9jIiwkYWxs b3dlZCkpIHsKCQkJLy8gVXNlIGdsb2JhbCBhcnRpY2xlIGNhdGVnb3J5LCBpZiBpdCBleGlz dHMKCQkJaWYgKCRwcmV0ZXh0WydjJ10gIT0gIiIpIHsKCQkJCWlmICghaW5fYXJyYXkoJHBy ZXRleHRbJ2MnXSwgJG91dCkpIHsKCQkJCQkkb3V0W10gPSAkcHJldGV4dFsnYyddOwoJCQkJ fQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiFjIikgJiYgaW5fYXJyYXko IiFjIiwkYWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGdsb2JhbCBhcnRpY2xlIGNhdGVn b3J5CgkJCWlmICgkcHJldGV4dFsnYyddICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCRw cmV0ZXh0WydjJ10sICRub3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJHByZXRleHRbJ2Mn XTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICI/cyIpICYmIGlu X2FycmF5KCI/cyIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSBhcnRpY2xlIHNlY3Rpb24KCQkJ aWYgKCRwcmV0ZXh0WydzJ10gIT0gIiIpIHsKCQkJCWlmICghaW5fYXJyYXkoJHByZXRleHRb J3MnXSwgJG91dCkpIHsKCQkJCQkkb3V0W10gPSAkcHJldGV4dFsncyddOwoJCQkJfQoJCQl9 CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiFzIikgJiYgaW5fYXJyYXkoIiFzIiwk YWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGFydGljbGUgc2VjdGlvbgoJCQlpZiAoJHBy ZXRleHRbJ3MnXSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsncyddLCAk bm90b3V0KSkgewoJCQkJCSRub3RvdXRbXSA9ICRwcmV0ZXh0WydzJ107CgkJCQl9CgkJCX0K CQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiP3QiKSAmJiBpbl9hcnJheSgiP3QiLCRh bGxvd2VkKSkgewoJCQkvLyBVc2UgYXJ0aWNsZSBVUkwgdGl0bGUgaWYgdGhpcyBpcyBhbiBh cnRpY2xlLgoJCQkvLyBJdCdzIGFuIGFydGljbGUgaWYgdGhlIG5leHRfaWQgYXR0cmlidXRl IGV4aXN0cwoJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnbmV4dF9pZCcsJHByZXRleHQpKSB7 CgkJCQlpZiAoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSAhPSAiIikgewoJCQkJCWlmICgh aW5fYXJyYXkoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJG91dCkpIHsKCQkJCQkJJG91 dFtdID0gJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9 IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiIXQiKSAmJiBpbl9hcnJheSgiIXQiLCRhbGxv d2VkKSkgewoJCQkvLyBEb24ndCB1c2UgYXJ0aWNsZSBVUkwgdGl0bGUKCQkJaWYgKGFycmF5 X2tleV9leGlzdHMoJ25leHRfaWQnLCRwcmV0ZXh0KSkgewoJCQkJaWYgKCR0aGlzYXJ0aWNs ZVsndXJsX3RpdGxlJ10gIT0gIiIpIHsKCQkJCQlpZiAoIWluX2FycmF5KCR0aGlzYXJ0aWNs ZVsndXJsX3RpdGxlJ10sICRub3RvdXQpKSB7CgkJCQkJCSRub3RvdXRbXSA9ICR0aGlzYXJ0 aWNsZVsndXJsX3RpdGxlJ107CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRo aXNtYXRjaCA9PT0gIj9pZCIpICYmIGluX2FycmF5KCI/aWQiLCRhbGxvd2VkKSkgewoJCQkv LyBVc2UgYXJ0aWNsZSBJRCwgcHJlcGVuZGVkIHdpdGggJGlkcHJlZml4CgkJCWlmIChhcnJh eV9rZXlfZXhpc3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsKCQkJCWlmICghaW5fYXJyYXko JGlkcHJlZml4IC4gJHByZXRleHRbJ2lkJ10sICRvdXQpKSB7CgkJCQkJJG91dFtdID0gJGlk cHJlZml4IC4gJHByZXRleHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhp c21hdGNoID09PSAiIWlkIikgJiYgaW5fYXJyYXkoIiFpZCIsJGFsbG93ZWQpKSB7CgkJCS8v IERvbid0IHVzZSBhcnRpY2xlIElECgkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCduZXh0X2lk JywkcHJldGV4dCkpIHsKCQkJCWlmICghaW5fYXJyYXkoJGlkcHJlZml4IC4gJHByZXRleHRb J2lkJ10sICRub3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJGlkcHJlZml4IC4gJHByZXRl eHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoWzBdID09PSAi PyIpICYmIGluX2FycmF5KCI/ZmllbGQiLCRhbGxvd2VkKSkgewoJCQkvLyBVc2UgdGhlIGdp dmVuIGZpZWxkIG5hbWU7IHdoaWNoIG1heSBiZSBhIGNvbW1hLXNlcGFyYXRlZCBzdWJsaXN0 LgoJCQkvLyBTcGxpdCBvZmYgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgcXVlc3Rpb24gbWFy awoJCQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsMSk7CgkJCWlmIChhcnJheV9r ZXlfZXhpc3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsgIC8vIENoZWNrIHRoaXMgaXMgYW4g YXJ0aWNsZQoJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsKCQkJ CQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJCX0gZWxz ZSB7CgkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQkJfQoJCQl9IGVsc2Ug ewoJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQl9CgoJCQlpZiAoIWVtcHR5 KCRmaWVsZENvbnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHByZWdfc3BsaXQoJy9bLFxzXSsv Jywgc3RyaXBfdGFncygkZmllbGRDb250ZW50cyksIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZ KTsKCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlpZiAoIWluX2Fy cmF5KCRzdWJuYW1lLCAkb3V0KSkgewoJCQkJCQkkb3V0W10gPSAkc3VibmFtZTsKCQkJCQl9 CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoWzBdID09PSAiISIpICYmIGlu X2FycmF5KCIhZmllbGQiLCRhbGxvd2VkKSkgewoJCQkvLyBOZWdhdGlvbi4gTWF5IGVpdGhl ciBiZSBhIGZpZWxkIG5hbWUgKGFuZCBtYXliZSBhbm90aGVyIENTTCkgb3IgYSBmaXhlZCB0 ZXJtLgoJCQkvLyBTcGxpdCBvZmYgdGhlIG5hbWUgZnJvbSB0aGUgZXhjbGFtYXRpb24gbWFy awoJCQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsMSk7CgkJCWlmIChhcnJheV9r ZXlfZXhpc3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsgIC8vIENoZWNrIHRoaXMgaXMgYW4g YXJ0aWNsZQoJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsKCQkJ CQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJCX0gZWxz ZSB7CgkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQkJfQoJCQl9IGVsc2Ug ewoJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQl9CgoJCQlpZiAoIWVtcHR5 KCRmaWVsZENvbnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHByZWdfc3BsaXQoJy9bLFxzXSsv Jywgc3RyaXBfdGFncygkZmllbGRDb250ZW50cyksIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZ KTsKCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlpZiAoIWluX2Fy cmF5KCRzdWJuYW1lLCAkbm90b3V0KSkgewoJCQkJCQkkbm90b3V0W10gPSAkc3VibmFtZTsK CQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIWluX2FycmF5KCR0aGlzbWF0 Y2gsICRvdXQpKSB7CgkJCQkkb3V0W10gPSAkdGhpc21hdGNoOwoJCQl9CgkJfQoJfQoKCXJl dHVybiBhcnJheSgkb3V0LCRub3RvdXQpOwp9CgovLyBHZW5lcmljIGxvb2t1cCBmdW5jdGlv biBmb3IgaW50ZXJmYWNpbmcgd2l0aCBNTFAgdG8gbG9jYWxpc2Ugc3RyaW5ncy4KLy8gICRz dHJheSA9IGFycmF5IG9mIGRlZmF1bHQgc3RyaW5ncwovLyAgJHdoYXQgPSBrZXkgdG8gbG9v ayB1cAovLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRzIHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZv ciByZXBsYWNlbWVudApmdW5jdGlvbiBzbWRfZ1R4dCgkc3RyYXksICR3aGF0LCAkYXJncyA9 IGFycmF5KCkpIHsKCWdsb2JhbCAkdGV4dGFycmF5LCAkc21kTUxQOwoJJGZuID0gc21kX2dl dENhbGxlcigpOwoKCS8vIERyb3Agb3V0IGlmIHRoZSBpZCBpc24ndCBkZWZpbmVkLgoJLy8g V291bGQgYmUgbmljZSB0byB1c2UgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSBuYW1lIG9mIHRo ZSBmdW5jdGlvbiBhbmQgcGFzcyB0aGF0LAoJLy8gYnV0IHRoYXQncyBQSFA1IHRlcnJpdG9y eSBvbmx5CglpZiAoZW1wdHkoJGZuKSkgewoJCSRzdHIgPSAkd2hhdDsKCX0gZWxzZSB7CgkJ Ly8gUHJlcGFyZSB0aGUgcHJlZml4ZWQga2V5IGZvciB1c2UKCQkka2V5ID0gJHNtZE1MUFsk Zm5dIC4gJy0nIC4gJHdoYXQ7CgkJJGtleSA9IHN0cnRvbG93ZXIoJGtleSk7CgoJCS8vIEdy YWIgZnJvbSB0aGUgZ2xvYmFsIHRleHRhcnJheSAocG9zc2libHkgZWRpdGVkIGJ5IE1MUCkg aWYgd2UgY2FuCgkJaWYoaXNzZXQoJHRleHRhcnJheVska2V5XSkpIHsKCQkJJHN0ciA9ICR0 ZXh0YXJyYXlbJGtleV07CgkJfSBlbHNlIHsKCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0 aGUgbG9jYWxpc2VkICR0ZXh0YXJyYXkgc28gZmFsbGJhY2sgdG8gdXNpbmcKCQkJLy8gdGhl IChub24gcHJlZml4ZWQpIHN0cmluZyBhcnJheSBpbiB0aGUgcGx1Z2luCgkJCSRrZXkgPSBz dHJ0b2xvd2VyKCR3aGF0KTsKCQkJJHN0ciA9IChpc3NldCgkc3RyYXlbJGtleV0pKSA/ICRz dHJheVska2V5XSA6ICR3aGF0OwoJCX0KCX0KCS8vIFBlcmZvcm0gc3Vic3RpdHV0aW9ucwoJ aWYoIWVtcHR5KCRhcmdzKSkgewoJCSRzdHIgPSBzdHJ0cigkc3RyLCAkYXJncyk7Cgl9Cgly ZXR1cm4gJHN0cjsKfQovLyBDaGVhdGluZyB3YXkgb2YgZmluZGluZyBhIGZ1bmN0aW9uJ3Mg Y2FsbGVyCmZ1bmN0aW9uIHNtZF9nZXRDYWxsZXIoKSB7CgkkYmFja3RyYWNlID0gZGVidWdf YmFja3RyYWNlKCk7CglyZXR1cm4gJGJhY2t0cmFjZVsyXVsnZnVuY3Rpb24nXTsKfQoiO3M6 MzoibWQ1IjtzOjMyOiJlNTY3NzE3YTYwNTJjMTU3MDU2ZGY5NjUzM2JhY2FlYiI7fQ==