# rvm_latin1_to_utf8 v0.5 # Alter pre-MySQL 4.1 tables to use UTF-8 charset # # License: GNU GPLv2 or later # # Ruud van Melick # http://vanmelick.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTg6InJ2bV9sYXRpbjFfdG9fdXRmOCI7czo3OiJ2ZXJzaW9u IjtzOjM6IjAuNSI7czo2OiJhdXRob3IiO3M6MTU6IlJ1dWQgdmFuIE1lbGljayI7czoxMDoi YXV0aG9yX3VyaSI7czoyMToiaHR0cDovL3Zhbm1lbGljay5jb20vIjtzOjExOiJkZXNjcmlw dGlvbiI7czo0NzoiQWx0ZXIgcHJlLU15U1FMIDQuMSB0YWJsZXMgdG8gdXNlIFVURi04IGNo YXJzZXQiO3M6NDoidHlwZSI7aToxO3M6NDoiaGVscCI7czoyOTAyOiI8aDE+bGF0aW4xIHRv IHV0Zjg8L2gxPgoKPHA+PHN0cm9uZz48c3BhbiBjbGFzcz0iY2FwcyI+V0FSTklORzwvc3Bh bj46IGNhcmVmdWxseSByZWFkIHRoaXMgZG9jdW1lbnRhdGlvbiBhbmQgPHNwYW4gY2xhc3M9 ImNhcHMiPkJBQ0tVUDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNhcHMiPllPVVI8L3NwYW4+IDxz cGFuIGNsYXNzPSJjYXBzIj5EQVRBQkFTRTwvc3Bhbj4gYmVmb3JlIGFjdGl2YXRpbmcvdXNp bmcgdGhpcyBwbHVnaW4uPC9zdHJvbmc+PC9wPgoKPHA+VGV4dHBhdHRlcm4gYWx3YXlzIHVz ZXMgJiM4MjE2O3V0ZjgmIzgyMTc7IHRvIHN0b3JlIGRhdGEgaW4gdGhlIGRhdGFiYXNlLCBi dXQgZGVwZW5kaW5nIG9uIHdoaWNoIE15U1FMIHZlcnNpb24geW91IHVzZWQgd2hlbiBpbnN0 YWxsaW5nIFRleHRwYXR0ZXJuLCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgdGFibGVzIGFu ZCBjb2x1bW5zIGRpZmZlcnM6PC9wPgoKPG9sPgoJPGxpPk15U1FMIHZlcnNpb25zIG9sZGVy IHRoYW4gNC4xOiB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgdGFibGVzIGNyZWF0ZWQgYnkg VGV4dHBhdHRlcm4gaXMgdHlwaWNhbGx5ICYjODIxNjtsYXRpbjEmIzgyMTc7LjwvbGk+Cgk8 bGk+TXlTUUwgdmVyc2lvbnMgNC4xIGFuZCBoaWdoZXI6IHRoZSB0YWJsZXMgYXJlIHNldCB0 byB1c2UgdGhlICYjODIxNjt1dGY4JiM4MjE3OyBjaGFyYWN0ZXIgc2V0LCB3aGljaCBtYXRj aGVzIHRoZSBhY3R1YWwgY2hhcmFjdGVyIHNldCBvZiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhv c2UgdGFibGVzLjwvbGk+Cjwvb2w+Cgo8cD5IYXZpbmcgdGhlIHRhYmxlcy9jb2x1bW5zIHRo ZW1zZWx2ZXMgdXNlIHRoZSBzYW1lIGNoYXJhY3RlciBzZXQgYXMgdGhlIGRhdGEgc3RvcmVk IGluIHRoZW0gaGFzIHNvbWUgYWR2YW50YWdlcyB3aGVuIHBlcmZvcm1pbmcgc2VhcmNoZXMg b3Igc29ydGluZyBpbiBUZXh0cGF0dGVybiwgZXNwZWNpYWxseSBpZiB5b3UgdXNlIGNoYXJh Y3RlcnMgb3V0c2lkZSBVUy08c3BhbiBjbGFzcz0iY2FwcyI+QVNDSUk8L3NwYW4+LjwvcD4K CjxwPklmIHlvdSB1cGdyYWRlIHlvdXIgTXlTUUwgdmVyc2lvbiBmcm9tIHByZS00LjEgdG8g NC4xIG9yIGhpZ2hlciwgdGhlIHRhYmxlL2NvbHVtbiBjaGFyYWN0ZXIgc2V0cyBhcmUgbm90 IGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvICYjODIxNjt1dGY4JiM4MjE3Oywgc28gdGhl eSBzdGF5ICYjODIxNjtsYXRpbjEmIzgyMTc7IHdoaWxlIHRoZSBkYXRhIHN0b3JlZCBpbiB0 aG9zZSB0YWJsZXMgaXMgc3RpbGwgJiM4MjE2O3V0ZjgmIzgyMTc7LjwvcD4KCjxwPkNoYW5n aW5nIHRoaXMgaXMgdHJpY2t5LCBiZWNhdXNlIGlmIHlvdSBzaW1wbHkgY2hhbmdlIHRoZSBj aGFyYWN0ZXIgc2V0LCBNeVNRTCBhc3N1bWVzIHRoYXQgdGhlIHN0b3JlZCBkYXRhIG11c3Qg YWxzbyBiZSBjb252ZXJ0ZWQgZnJvbSAmIzgyMTY7bGF0aW4xJiM4MjE3OyB0byAmIzgyMTY7 dXRmOCYjODIxNzssIHdoaWNoIGxlYWRzIHRvIGdhcmJhZ2UsIGJlY2F1c2UgdGhlIGRhdGEg aXMgYWxyZWFkeSAmIzgyMTY7dXRmOCYjODIxNzsuPC9wPgoKPHA+VGhpcyBwbHVnaW4gYXZv aWRzIHRoZSB1bndhbnRlZCBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb24gb2YgdGhlIHN0b3Jl ZCBkYXRhIGJ5IHRha2luZyB0aGUgZm9sbG93aW5nIHN0ZXBzIGZvciBlYWNoIFRleHRwYXR0 ZXJuIHRhYmxlOjwvcD4KCjxvbD4KCTxsaT5kcm9wIGluZGV4ZXM8L2xpPgoJPGxpPmNvbnZl cnQgYWxsIGNvbHVtbnMgdGhhdCBjb250YWluIHRleHQgdG8gdXNlIGEgJiM4MjE2O2JpbmFy eSYjODIxNzsgY2hhcnNldCAoaW5zdGVhZCBvZiAmIzgyMTY7bGF0aW4xJiM4MjE3Oyk8L2xp PgoJPGxpPmNvbnZlcnQgdGhvc2UgY29sdW1ucyB5ZXQgYWdhaW4sIHRoaXMgdGltZSB0byAm IzgyMTY7dXRmOCYjODIxNzsgY2hhcnNldCAoaW5zdGVhZCBvZiAmIzgyMTY7YmluYXJ5JiM4 MjE3Oyk8L2xpPgoJPGxpPmFkZCBpbmRleGVzPC9saT4KCTxsaT5vcHRpbWl6ZSB0YWJsZTwv bGk+Cjwvb2w+Cgo8cD5BZnRlcndhcmRzIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1cGRhdGUg dGhlICYjODIxNjtkYmNoYXJzZXQmIzgyMTc7IHNldHRpbmcgaW4gdGhlIDxjb2RlPnRleHRw YXR0ZXJuL2NvbmZpZy5waHA8L2NvZGU+IGZpbGUgdG8gJiM4MjE2O3V0ZjgmIzgyMTc7LiBT aG91bGQgdGhpcyBmYWlsIGR1ZSB0byBsYWNrIG9mIHBlcm1pc3Npb25zLCB5b3Ugd2lsbCBi ZSBhc2tlZCB0byBtYWtlIHRoaXMgY2hhbmdlIHlvdXJzZWxmLiBEbyBub3Qgc2tpcCB0aGlz IHN0ZXAsIG90aGVyd2lzZSB5b3Ugd2lsbCBleHBlcmllbmNlIGlycmVwYXJhYmxlIGRhdGEg Y29ycnVwdGlvbiBzbyBzZXZlcmUgdGhhdCB5b3Ugd2lsbCBjcnkgbGlrZSBhIGJhYnkgKHlv dSBtYWRlIGJhY2t1cHMsIHJpZ2h0PyksIG11Y2ggdG8gdGhlIGFtdXNlbWVudCBvZiBvbmxv b2tlcnMuPC9wPgoKPHA+SG93IHRvIHVzZSB0aGlzIHBsdWdpbjo8L3A+Cgo8b2w+Cgk8bGk+ PHN0cm9uZz48c3BhbiBjbGFzcz0iY2FwcyI+TUFLRTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNh cHMiPkJBQ0tVUFM8L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5GSVJTVDwvc3Bhbj4hPC9z dHJvbmc+IChub3QganVzdCB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gdGFi bGVzLCBidXQgdGhlIGVudGlyZSBkYXRhYmFzZSk8L2xpPgoJPGxpPk1ha2Ugc3VyZSB5b3Ug aGF2ZSBNeVNRTCB2ZXJzaW9uIDQuMSBvciBoaWdoZXIgaW5zdGFsbGVkLjwvbGk+Cgk8bGk+ QWN0aXZhdGUgdGhlIHBsdWdpbi48L2xpPgoJPGxpPjxhIGhyZWY9Ij9ldmVudD1ydm1fbGF0 aW4xX3RvX3V0ZjgiPkNsaWNrIGhlcmU8L2E+IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9u cyBvbiB0aGUgc2NyZWVuLjwvbGk+Cjwvb2w+IjtzOjQ6ImNvZGUiO3M6NjMzNzoiCmlmICh0 eHBpbnRlcmZhY2UgPT0gJ2FkbWluJyBhbmQgZ3BzKCdldmVudCcpID09ICdydm1fbGF0aW4x X3RvX3V0ZjgnKQp7CiAgYWRkX3ByaXZzKCdydm1fbGF0aW4xX3RvX3V0ZjgnLCAnMScpOwog IHJlZ2lzdGVyX3RhYignZXh0ZW5zaW9ucycsICdydm1fbGF0aW4xX3RvX3V0ZjgnLCAnbGF0 aW4xX3RvX3V0ZjgnKTsKICByZWdpc3Rlcl9jYWxsYmFjaygncnZtX2xhdGluMV90b191dGY4 JywgJ3J2bV9sYXRpbjFfdG9fdXRmOCcpOwp9CgpmdW5jdGlvbiBydm1fbGF0aW4xX3RvX3V0 ZjgoKQp7CiAgZ2xvYmFsICR0eHBjZmcsICREQjsKCiAgJGRlYnVnID0gRkFMU0U7CgogIHJl cXVpcmVfcHJpdnMoJ3J2bV9sYXRpbjFfdG9fdXRmOCcpOwoKICBwYWdldG9wKCcnKTsKCiAg ZWNobyAnPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDUwcHgiPic7CgogIGlmICh2ZXJzaW9u X2NvbXBhcmUobXlzcWxpX2dldF9zZXJ2ZXJfaW5mbygkREItPmxpbmspLCAnNC4xLjAnLCAn PCcpKQogIHsKICAgIGVjaG8gZ3JhZignVGhlIHJ2bV9sYXRpbjFfdG9fdXRmOCBwbHVnaW4g aGFzIGJlZW4gcmVtb3ZlZCwgYmVjYXVzZSB5b3VyIE15U1FMIHZlcnNpb24gaXMgbG93ZXIg dGhhbiA0LjEuJyk7CiAgICBzYWZlX2RlbGV0ZSgndHhwX3BsdWdpbicsICJuYW1lID0gJ3J2 bV9sYXRpbjFfdG9fdXRmOCciKTsKICAgIHJ2bV9sYXRpbjFfdG9fdXRmOF9lbmQoKTsKICB9 CgogICMgc3RhbmRhcmQgVFhQIHRhYmxlcwogICR0eHB0YWJsZXMgPSBhcnJheSgKICAgICd0 ZXh0cGF0dGVybicsCiAgICAndHhwX2NhdGVnb3J5JywKICAgICd0eHBfY3NzJywKICAgICd0 eHBfZGlzY3VzcycsCiAgICAndHhwX2Rpc2N1c3NfaXBiYW4nLAogICAgJ3R4cF9kaXNjdXNz X25vbmNlJywKICAgICd0eHBfZmlsZScsCiAgICAndHhwX2Zvcm0nLAogICAgJ3R4cF9pbWFn ZScsCiAgICAndHhwX2xhbmcnLAogICAgJ3R4cF9saW5rJywKICAgICd0eHBfbG9nJywKICAg ICd0eHBfcGFnZScsCiAgICAndHhwX3BsdWdpbicsCiAgICAndHhwX3ByZWZzJywKICAgICd0 eHBfcHJpdicsCiAgICAndHhwX3NlY3Rpb24nLAogICAgJ3R4cF90b2tlbicsCiAgICAndHhw X3VzZXJzJwogICk7CgogICMgZmluZCB0YWJsZXMgdGhhdCBtYXRjaCB0aGUgVFhQIHRhYmxl IHByZWZpeCwgbWFyayBzdGFuZGFyZCBhbmQgc2VsZWN0ZWQgb25lcy4KICAkbXl0YWJsZXMg PSBwcygnbXl0YWJsZXMnLCBhcnJheSgpKSA/IHBzKCdteXRhYmxlcycpIDogYXJyYXkoKTsK ICAkdW5rbm93biAgPSBGQUxTRTsKCiAgaWYgKCRycyA9IHNhZmVfcXVlcnkoIlNIT1cgVEFC TEVTIExJS0UgJyIuYWRkY3NsYXNoZXMoZG9TbGFzaChQRlgpLCAnJV8nKS4iJSciKSkKICB7 CiAgICB3aGlsZSAoJHJvdyA9IG15c3FsaV9mZXRjaF9yb3coJHJzKSkKICAgIHsKICAgICAg JHRhYmxlID0gc3Vic3RyKCRyb3dbMF0sIHN0cmxlbihQRlgpKTsKCiAgICAgIGlmIChpbl9h cnJheSgkdGFibGUsICR0eHB0YWJsZXMpIG9yIGluX2FycmF5KCR0YWJsZSwgJG15dGFibGVz KSkKICAgICAgewogICAgICAgICR0YWJsZXNbXSA9ICR0YWJsZTsKICAgICAgfQogICAgICBl bHNlCiAgICAgIHsKICAgICAgICAkdW5rbm93biA9IFRSVUU7CiAgICAgIH0KCiAgICAgICRp bnB1dHNbXSA9CiAgICAgICAgJzxsYWJlbD4nLgogICAgICAgICAgJzxpbnB1dCB0eXBlPSJj aGVja2JveCIgbmFtZT0ibXl0YWJsZXNbXSIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygk dGFibGUpLiciICcuCiAgICAgICAgICAgIChpbl9hcnJheSgkdGFibGUsICR0eHB0YWJsZXMp ID8gJ2Rpc2FibGVkPSJkaXNhYmxlZCIgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLicgLz4n LgogICAgICAgICAgaHRtbHNwZWNpYWxjaGFycyhQRlguJHRhYmxlKS4KICAgICAgICAnPC9s YWJlbD4nOwogICAgfQogIH0KICBlbHNlCiAgewogICAgZWNobyBncmFmKCdIbW1tLi4uIHN0 cmFuZ2UsIEkgY2Fubm90IGZpbmQgYW55IHRhYmxlcyB0aGF0IG1hdGNoIHlvdXIgVFhQIHRh YmxlIHByZWZpeCcpOwogIH0KCiAgIyBhc2sgdXNlciB3aGF0IHRvIGRvIHdpdGggdGFibGVz IHdlJ3JlIG5vdCBzdXJlIGFib3V0LgogIGlmICgkdW5rbm93biBhbmQgIXBzKCdjb250aW51 ZScpKQogIHsKICAgIGVjaG8KICAgICAgZ3JhZignQmVsb3csIGEgbGlzdCBvZiB0YWJsZXMg aXMgc2hvd24gdGhhdCBtYXkgYmUgcGFydCBvZiB5b3VyIFRleHRwYXR0ZXJuIGluc3RhbGwu JykuCiAgICAgIGdyYWYoJ1NvbWUgb2YgdGhlc2UgdGFibGVzIG1heSBoYXZlIGJlZW4gY3Jl YXRlZCBieSBwbHVnaW5zIHlvdSBoYXZlIGluc3RhbGxlZC48YnIgLz4KICAgICAgICBJbiB0 aGF0IGNhc2UsIGNoZWNrIHRoZSB0YWJsZXMgdGhhdCB0aGVzZSBwbHVnaW5zIGhhdmUgYWRk ZWQuPGJyIC8+CiAgICAgICAgQmUgY2FyZWZ1bCBub3QgdG8gY2hlY2sgdGFibGVzIHRoYXQg YXJlIG5vdCByZWxhdGVkIHRvIHRoaXMgVGV4dHBhdHRlcm4gaW5zdGFsbCEnKS4KICAgICAg Z3JhZignVGhlIHN0YW5kYXJkIFRleHRwYXR0ZXJuIHRhYmxlcyBhcmUgYWxyZWFkeSBjaGVj a2VkLicpLgogICAgICBmb3JtKAogICAgICAgIGpvaW4oJzxiciAvPicsICRpbnB1dHMpLgog ICAgICAgIGdyYWYoCiAgICAgICAgICBlSW5wdXQoJ3J2bV9sYXRpbjFfdG9fdXRmOCcpLic8 YnIgLz4nLgogICAgICAgICAgZklucHV0KCdzdWJtaXQnLCAnY29udGludWUnLCAnQ29udGlu dWUnLCAncHVibGlzaCcpCiAgICAgICAgKQogICAgICApOwoKICAgIHJ2bV9sYXRpbjFfdG9f dXRmOF9lbmQoKTsKICB9CgogIGVjaG8gZ3JhZignVXBkYXRpbmcgVGV4dHBhdHRlcm4gdGFi bGVzLi4uJyk7CgogICMgbG9vcCB0aHJvdWdoIHRhYmxlcwogIGZvcmVhY2ggKCR0YWJsZXMg YXMgJHRhYmxlKQogIHsKICAgICRpbmRleGVzID0gYXJyYXkoKTsKICAgICRkcm9wICAgID0g YXJyYXkoKTsKICAgICRjcmVhdGUgID0gYXJyYXkoKTsKICAgICRiaW4gICAgID0gYXJyYXko KTsKICAgICR1dGY4ICAgID0gYXJyYXkoKTsKICAgICRjb2xzICAgID0gYXJyYXkoKTsKCiAg ICAjIHByZXBhcmUgYWx0ZXIgc3RhdGVtZW50cyBmb3IgY29sdW1ucwogICAgJGNvbHVtbnMg PSBnZXRSb3dzKCdTSE9XIENPTFVNTlMgRlJPTSAnLnNhZmVfcGZ4KCR0YWJsZSkpOwoKICAg IGlmICgkY29sdW1ucykgZm9yZWFjaCAoJGNvbHVtbnMgYXMgJGNvbHVtbikKICAgIHsKICAg ICAgZXh0cmFjdCgkY29sdW1uKTsKCiAgICAgIGlmIChwcmVnX21hdGNoKCcvXihjaGFyfHZh cmNoYXJ8dGlueXRleHR8dGV4dHxtZWRpdW10ZXh0fGxvbmd0ZXh0fGVudW18c2V0KVxiLycs ICRUeXBlKSkKICAgICAgewogICAgICAgICROdWxsID0gKCROdWxsID09ICdZRVMnID8gJyBO VUxMJyA6ICcgTk9UIE5VTEwnKTsKCiAgICAgICAgJGJlZ2luID0gJ01PRElGWSBgJy5kb1Ns YXNoKCRGaWVsZCkuJ2AgJy4kVHlwZS4nIENIQVJBQ1RFUiBTRVQgJzsKICAgICAgICAkZW5k ICAgPSAkTnVsbC4iIERFRkFVTFQgJyIuZG9TbGFzaCgkRGVmYXVsdCkuIiciOwoKICAgICAg ICAkYmluW10gID0gJGJlZ2luLidiaW5hcnknLiRlbmQ7CiAgICAgICAgJHV0ZjhbXSA9ICRi ZWdpbi4ndXRmOCBDT0xMQVRFIHV0ZjhfZ2VuZXJhbF9jaScuJGVuZDsKICAgICAgICAkY29s c1tdID0gJEZpZWxkOwogICAgICB9CiAgICB9CgogICAgIyBhbmFseXNlIGluZGV4IHN0cnVj dHVyZXMKICAgICRyb3dzID0gZ2V0Um93cygnU0hPVyBJTkRFWCBGUk9NICcuc2FmZV9wZngo JHRhYmxlKSk7CgogICAgaWYgKCRyb3dzKSBmb3JlYWNoICgkcm93cyBhcyAkcm93KQogICAg ewogICAgICBleHRyYWN0KCRyb3cpOwoKICAgICAgaWYgKCRLZXlfbmFtZSA9PSAnUFJJTUFS WScgb3IgIWluX2FycmF5KCRDb2x1bW5fbmFtZSwgJGNvbHMpKQogICAgICB7CiAgICAgICAg Y29udGludWU7CiAgICAgIH0KCiAgICAgICRLZXlfbmFtZSA9ICdgJy4kS2V5X25hbWUuJ2An OwoKICAgICAgJGluZGV4ZXNbJEtleV9uYW1lXVsndW5pcXVlJ10gPSAoJE5vbl91bmlxdWUg PyAnJyA6ICcgVU5JUVVFJyk7CiAgICAgICRpbmRleGVzWyRLZXlfbmFtZV1bJ2Z1bGx0ZXh0 J10gPSAoJEluZGV4X3R5cGUgPT0gJ0ZVTExURVhUJyA/ICcgRlVMTFRFWFQnIDogJycpOwog ICAgICAkaW5kZXhlc1skS2V5X25hbWVdWydjb2x1bW5zJ11bJFNlcV9pbl9pbmRleF0gPSAn YCcuJENvbHVtbl9uYW1lLidgJy4oJFN1Yl9wYXJ0ID8gJyAoJy4kU3ViX3BhcnQuJyknIDog JycpOwogICAgfQoKICAgICMgcHJlcGFyZSBpbmRleCBkcm9wL2NyZWF0ZSBzdGF0ZW1lbnRz CiAgICBmb3JlYWNoICgkaW5kZXhlcyBhcyAkaW5kZXggPT4gJHN0cnVjdHVyZSkKICAgIHsK ICAgICAgZXh0cmFjdCgkc3RydWN0dXJlKTsKCiAgICAgICRkcm9wW10gICA9ICdEUk9QIElO REVYICcuJGluZGV4OwogICAgICAkY3JlYXRlW10gPSAnQUREJy4kdW5pcXVlLiRmdWxsdGV4 dC4nIElOREVYICcuJGluZGV4LicgKCcuam9pbignLCAnLCAkY29sdW1ucykuJyknOwogICAg fQoKICAgICRzdWNjZXNzID0gVFJVRTsKCiAgICAjIGFsdGVyIHRoZSB0YWJsZSArIGluZGV4 ZXMKICAgIGlmICgkZHJvcCkKICAgIHsKICAgICAgJHN1Y2Nlc3MgKj0gc2FmZV9hbHRlcigk dGFibGUsIGpvaW4oJywgJywgJGRyb3ApLCAkZGVidWcpOwogICAgfQoKICAgIGlmICgkYmlu IGFuZCAkc3VjY2VzcykKICAgIHsKICAgICAgJHN1Y2Nlc3MgKj0gc2FmZV9hbHRlcigkdGFi bGUsIGpvaW4oJywgJywgJGJpbiksICRkZWJ1Zyk7CgogICAgICBpZiAoJHN1Y2Nlc3MpCiAg ICAgIHsKICAgICAgICAkc3VjY2VzcyAqPSBzYWZlX2FsdGVyKCR0YWJsZSwgam9pbignLCAn LCAkdXRmOCkuJywgREVGQVVMVCBDSEFSQUNURVIgU0VUIHV0ZjggQ09MTEFURSB1dGY4X2dl bmVyYWxfY2knLCAkZGVidWcpOwogICAgICB9CiAgICB9CgogICAgaWYgKCRjcmVhdGUgYW5k ICRzdWNjZXNzKQogICAgewogICAgICAkc3VjY2VzcyAqPSBzYWZlX2FsdGVyKCR0YWJsZSwg am9pbignLCAnLCAkY3JlYXRlKSwgJGRlYnVnKTsKICAgIH0KICB9CgogICMgd2hpbGUgd2Un cmUgaGVyZSwgbWlnaHQgYXMgd2VsbCBvcHRpbWl6ZSB0aGUgdGFibGVzCiAgc2FmZV9xdWVy eSgiT1BUSU1JWkUgVEFCTEUgIi5qb2luKCcsICcsIGFycmF5X21hcCgnc2FmZV9wZngnLCAk dGFibGVzKSksICRkZWJ1Zyk7CgogIGlmICgkc3VjY2VzcykKICB7CiAgICBlY2hvIGdyYWYo J1N1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuJyk7CgogICAgJGZpbGUgICA9IHR4cGF0aC4nL2Nv bmZpZy5waHAnOwogICAgJGNvbmZpZyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAg ICRjb25maWcgPSBzdHJfcmVwbGFjZSgnPz4nLCBuLicjIHJ2bV9sYXRpbjFfdG9fdXRmOCBw bHVnaW4gYWRkZWQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuc3VyZSBhIGNvcnJlY3QgZGJj aGFyc2V0Jy5uLickdHhwY2ZnW1wnZGJjaGFyc2V0XCddID0gXCd1dGY4XCcnLm4uJz8+Jywg JGNvbmZpZyk7CgogICAgaWYgKCR0eHBjZmdbJ2RiY2hhcnNldCddID09ICd1dGY4JwogICAg ICBvciBpc193cml0YWJsZSgkZmlsZSkKICAgICAgYW5kICRoYW5kbGUgPSBmb3BlbigkZmls ZSwgJ3cnKQogICAgICBhbmQgZndyaXRlKCRoYW5kbGUsICRjb25maWcpICE9PSBGQUxTRQog ICAgICBhbmQgZmNsb3NlKCRoYW5kbGUpKQogICAgewogICAgICBlY2hvIGdyYWYoJ1RoZSBy dm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZGUtaW5z dGFsbGVkLicpOwogICAgICBzYWZlX2RlbGV0ZSgndHhwX3BsdWdpbicsICJuYW1lID0gJ3J2 bV9sYXRpbjFfdG9fdXRmOCciKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgZWNobyBn cmFmKCc8Yj5XQVJOSU5HOiB0ZXh0cGF0dGVybi9jb25maWcucGhwIGNvdWxkIG5vdCBiZSB1 cGRhdGVkIGF1dG9tYXRpY2FsbHkuIFBsZWFzZSB1cGRhdGUgeW91ciB0ZXh0cGF0dGVybi9j b25maWcucGhwIGZpbGUgdG8gY29udGFpbiA8Y29kZT4kdHhwY2ZnW1wnZGJjaGFyc2V0XCdd ID0gXCd1dGY4XCc7PC9jb2RlPjwvYj4gYW5kIGRlaW5zdGFsbCB0aGUgcnZtX2xhdGluMV90 b191dGY4IHBsdWdpbiBtYW51YWxseScpOwogICAgfQogIH0KICBlbHNlCiAgewogICAgZWNo byBncmFmKCdEdWUgdG8gb25lIG9yIG1vcmUgZXJyb3JzIHRoZSB0YWJsZXMgY291bGQgbm90 IGJlIHVwZGF0ZWQgY29ycmVjdGx5LiBZb3UgbWF5IGhhdmUgdG8gcmVzdG9yZSBhIGJhY2t1 cC4nKTsKICB9CgogIHJ2bV9sYXRpbjFfdG9fdXRmOF9lbmQoKTsKfQoKZnVuY3Rpb24gcnZt X2xhdGluMV90b191dGY4X2VuZCgpCnsKICBlY2hvICc8L2Rpdj4nOwogIGVuZF9wYWdlKCk7 CiAgZXhpdCgpOwp9CiI7czozOiJtZDUiO3M6MzI6ImZkYjRkYjcyOTE2ZWYzYjFlYjVhMTRk YzQ2YjM0MjEyIjt9