# rvm_latin1_to_utf8 v0.3 # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4zIjtzOjY6ImF1dGhvciI7czoxNToiUnV1ZCB2 YW4gTWVsaWNrIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vdmFubWVsaWNrLmNv bS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjQ3OiJBbHRlciBwcmUtTXlTUUwgNC4xIHRhYmxl cyB0byB1c2UgVVRGLTggY2hhcnNldCI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjE4 OiJydm1fbGF0aW4xX3RvX3V0ZjgiO3M6NDoiaGVscCI7czoyOTI4OiIJPGgxPmxhdGluMSB0 byB1dGY4PC9oMT4KCgk8cD48c3Ryb25nPjxzcGFuIGNsYXNzPSJjYXBzIj5XQVJOSU5HPC9z cGFuPjogY2FyZWZ1bGx5IHJlYWQgdGhpcyBkb2N1bWVudGF0aW9uIGFuZCA8c3BhbiBjbGFz cz0iY2FwcyI+QkFDS1VQPC9zcGFuPiA8c3BhbiBjbGFzcz0iY2FwcyI+WU9VUjwvc3Bhbj4g PHNwYW4gY2xhc3M9ImNhcHMiPkRBVEFCQVNFPC9zcGFuPiBiZWZvcmUgYWN0aXZhdGluZy91 c2luZyB0aGlzIHBsdWdpbi48L3N0cm9uZz48L3A+CgoJPHA+VGV4dHBhdHRlcm4gYWx3YXlz IHVzZXMgJiM4MjE2O3V0ZjgmIzgyMTc7IHRvIHN0b3JlIGRhdGEgaW4gdGhlIGRhdGFiYXNl LCBidXQgZGVwZW5kaW5nIG9uIHdoaWNoIE15U1FMIHZlcnNpb24geW91IHVzZWQgd2hlbiBp bnN0YWxsaW5nIFRleHRwYXR0ZXJuLCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgdGFibGVz IGFuZCBjb2x1bW5zIGRpZmZlcnM6PC9wPgoKCTxvbD4KCQk8bGk+TXlTUUwgdmVyc2lvbnMg b2xkZXIgdGhhbiA0LjE6IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSB0YWJsZXMgY3JlYXRl ZCBieSBUZXh0cGF0dGVybiBpcyB0eXBpY2FsbHkgJiM4MjE2O2xhdGluMSYjODIxNzsuPC9s aT4KCQk8bGk+TXlTUUwgdmVyc2lvbnMgNC4xIGFuZCBoaWdoZXI6IHRoZSB0YWJsZXMgYXJl IHNldCB0byB1c2UgdGhlICYjODIxNjt1dGY4JiM4MjE3OyBjaGFyYWN0ZXIgc2V0LCB3aGlj aCBtYXRjaGVzIHRoZSBhY3R1YWwgY2hhcmFjdGVyIHNldCBvZiB0aGUgZGF0YSBzdG9yZWQg aW4gdGhvc2UgdGFibGVzLjwvbGk+Cgk8L29sPgoKCTxwPkhhdmluZyB0aGUgdGFibGVzL2Nv bHVtbnMgdGhlbXNlbHZlcyB1c2UgdGhlIHNhbWUgY2hhcmFjdGVyIHNldCBhcyB0aGUgZGF0 YSBzdG9yZWQgaW4gdGhlbSBoYXMgc29tZSBhZHZhbnRhZ2VzIHdoZW4gcGVyZm9ybWluZyBz ZWFyY2hlcyBvciBzb3J0aW5nIGluIFRleHRwYXR0ZXJuLCBlc3BlY2lhbGx5IGlmIHlvdSB1 c2UgY2hhcmFjdGVycyBvdXRzaWRlIFVTLTxzcGFuIGNsYXNzPSJjYXBzIj5BU0NJSTwvc3Bh bj4uPC9wPgoKCTxwPklmIHlvdSB1cGdyYWRlIHlvdXIgTXlTUUwgdmVyc2lvbiBmcm9tIHBy ZS00LjEgdG8gNC4xIG9yIGhpZ2hlciwgdGhlIHRhYmxlL2NvbHVtbiBjaGFyYWN0ZXIgc2V0 cyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvICYjODIxNjt1dGY4JiM4MjE3 Oywgc28gdGhleSBzdGF5ICYjODIxNjtsYXRpbjEmIzgyMTc7IHdoaWxlIHRoZSBkYXRhIHN0 b3JlZCBpbiB0aG9zZSB0YWJsZXMgaXMgc3RpbGwgJiM4MjE2O3V0ZjgmIzgyMTc7LjwvcD4K Cgk8cD5DaGFuZ2luZyB0aGlzIGlzIHRyaWNreSwgYmVjYXVzZSBpZiB5b3Ugc2ltcGx5IGNo YW5nZSB0aGUgY2hhcmFjdGVyIHNldCwgTXlTUUwgYXNzdW1lcyB0aGF0IHRoZSBzdG9yZWQg ZGF0YSBtdXN0IGFsc28gYmUgY29udmVydGVkIGZyb20gJiM4MjE2O2xhdGluMSYjODIxNzsg dG8gJiM4MjE2O3V0ZjgmIzgyMTc7LCB3aGljaCBsZWFkcyB0byBnYXJiYWdlLCBiZWNhdXNl IHRoZSBkYXRhIGlzIGFscmVhZHkgJiM4MjE2O3V0ZjgmIzgyMTc7LjwvcD4KCgk8cD5UaGlz IHBsdWdpbiBhdm9pZHMgdGhlIHVud2FudGVkIGNoYXJhY3RlciBzZXQgY29udmVyc2lvbiBv ZiB0aGUgc3RvcmVkIGRhdGEgYnkgdGFraW5nIHRoZSBmb2xsb3dpbmcgc3RlcHMgZm9yIGVh Y2ggVGV4dHBhdHRlcm4gdGFibGU6PC9wPgoKCTxvbD4KCQk8bGk+ZHJvcCBpbmRleGVzPC9s aT4KCQk8bGk+Y29udmVydCBhbGwgY29sdW1ucyB0aGF0IGNvbnRhaW4gdGV4dCB0byB1c2Ug YSAmIzgyMTY7YmluYXJ5JiM4MjE3OyBjaGFyc2V0IChpbnN0ZWFkIG9mICYjODIxNjtsYXRp bjEmIzgyMTc7KTwvbGk+CgkJPGxpPmNvbnZlcnQgdGhvc2UgY29sdW1ucyB5ZXQgYWdhaW4s IHRoaXMgdGltZSB0byAmIzgyMTY7dXRmOCYjODIxNzsgY2hhcnNldCAoaW5zdGVhZCBvZiAm IzgyMTY7YmluYXJ5JiM4MjE3Oyk8L2xpPgoJCTxsaT5hZGQgaW5kZXhlczwvbGk+CgkJPGxp Pm9wdGltaXplIHRhYmxlPC9saT4KCTwvb2w+CgoJPHA+QWZ0ZXJ3YXJkcyBhbiBhdHRlbXB0 IGlzIG1hZGUgdG8gdXBkYXRlIHRoZSAmIzgyMTY7ZGJjaGFyc2V0JiM4MjE3OyBzZXR0aW5n IGluIHRoZSA8Y29kZT50ZXh0cGF0dGVybi9jb25maWcucGhwPC9jb2RlPiBmaWxlIHRvICYj ODIxNjt1dGY4JiM4MjE3Oy4gU2hvdWxkIHRoaXMgZmFpbCBkdWUgdG8gbGFjayBvZiBwZXJt aXNzaW9ucywgeW91IHdpbGwgYmUgYXNrZWQgdG8gbWFrZSB0aGlzIGNoYW5nZSB5b3Vyc2Vs Zi4gRG8gbm90IHNraXAgdGhpcyBzdGVwLCBvdGhlcndpc2UgeW91IHdpbGwgZXhwZXJpZW5j ZSBpcnJlcGFyYWJsZSBkYXRhIGNvcnJ1cHRpb24gc28gc2V2ZXJlIHRoYXQgeW91IHdpbGwg Y3J5IGxpa2UgYSBiYWJ5ICh5b3UgbWFkZSBiYWNrdXBzLCByaWdodD8pLCBtdWNoIHRvIHRo ZSBhbXVzZW1lbnQgb2Ygb25sb29rZXJzLjwvcD4KCgk8cD5Ib3cgdG8gdXNlIHRoaXMgcGx1 Z2luOjwvcD4KCgk8b2w+CgkJPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImNhcHMiPk1BS0U8 L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5CQUNLVVBTPC9zcGFuPiA8c3BhbiBjbGFzcz0i Y2FwcyI+RklSU1Q8L3NwYW4+ITwvc3Ryb25nPiAobm90IGp1c3QgdGhlIDxzcGFuIGNsYXNz PSJjYXBzIj5UWFA8L3NwYW4+IHRhYmxlcywgYnV0IHRoZSBlbnRpcmUgZGF0YWJhc2UpPC9s aT4KCQk8bGk+TWFrZSBzdXJlIHlvdSBoYXZlIE15U1FMIHZlcnNpb24gNC4xIG9yIGhpZ2hl ciBpbnN0YWxsZWQuPC9saT4KCQk8bGk+QWN0aXZhdGUgdGhlIHBsdWdpbi48L2xpPgoJCTxs aT48YSBocmVmPSI/ZXZlbnQ9cnZtX2xhdGluMV90b191dGY4Ij5DbGljayBoZXJlPC9hPiBh bmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgb24gdGhlIHNjcmVlbi48L2xpPgoJPC9vbD4i O3M6NDoiY29kZSI7czo2MzAzOiIKaWYgKHR4cGludGVyZmFjZSA9PSAnYWRtaW4nIGFuZCBn cHMoJ2V2ZW50JykgPT0gJ3J2bV9sYXRpbjFfdG9fdXRmOCcpCnsKICBhZGRfcHJpdnMoJ3J2 bV9sYXRpbjFfdG9fdXRmOCcsICcxJyk7CiAgcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywg J3J2bV9sYXRpbjFfdG9fdXRmOCcsICdsYXRpbjFfdG9fdXRmOCcpOwogIHJlZ2lzdGVyX2Nh bGxiYWNrKCdydm1fbGF0aW4xX3RvX3V0ZjgnLCAncnZtX2xhdGluMV90b191dGY4Jyk7Cn0K CmZ1bmN0aW9uIHJ2bV9sYXRpbjFfdG9fdXRmOCgpCnsKICBnbG9iYWwgJHR4cGNmZzsKCiAg JGRlYnVnID0gRkFMU0U7CgogIHJlcXVpcmVfcHJpdnMoJ3J2bV9sYXRpbjFfdG9fdXRmOCcp OwoKICBwYWdldG9wKCcnKTsKCiAgZWNobyAnPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDUw cHgiPic7CgogIGlmICh2ZXJzaW9uX2NvbXBhcmUobXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCks ICc0LjEuMCcsICc8JykpCiAgewogICAgZWNobyBncmFmKCdUaGUgcnZtX2xhdGluMV90b191 dGY4IHBsdWdpbiBoYXMgYmVlbiByZW1vdmVkLCBiZWNhdXNlIHlvdXIgTXlTUUwgdmVyc2lv biBpcyBsb3dlciB0aGFuIDQuMS4nKTsKICAgIHNhZmVfZGVsZXRlKCd0eHBfcGx1Z2luJywg Im5hbWUgPSAncnZtX2xhdGluMV90b191dGY4JyIpOwogICAgcnZtX2xhdGluMV90b191dGY4 X2VuZCgpOwogIH0KCiAgIyBzdGFuZGFyZCBUWFAgdGFibGVzCiAgJHR4cHRhYmxlcyA9IGFy cmF5KAogICAgJ3RleHRwYXR0ZXJuJywKICAgICd0eHBfY2F0ZWdvcnknLAogICAgJ3R4cF9j c3MnLAogICAgJ3R4cF9kaXNjdXNzJywKICAgICd0eHBfZGlzY3Vzc19pcGJhbicsCiAgICAn dHhwX2Rpc2N1c3Nfbm9uY2UnLAogICAgJ3R4cF9maWxlJywKICAgICd0eHBfZm9ybScsCiAg ICAndHhwX2ltYWdlJywKICAgICd0eHBfbGFuZycsCiAgICAndHhwX2xpbmsnLAogICAgJ3R4 cF9sb2cnLAogICAgJ3R4cF9wYWdlJywKICAgICd0eHBfcGx1Z2luJywKICAgICd0eHBfcHJl ZnMnLAogICAgJ3R4cF9wcml2JywKICAgICd0eHBfc2VjdGlvbicsCiAgICAndHhwX3VzZXJz JwogICk7CgogICMgZmluZCB0YWJsZXMgdGhhdCBtYXRjaCB0aGUgVFhQIHRhYmxlIHByZWZp eCwgbWFyayBzdGFuZGFyZCBhbmQgc2VsZWN0ZWQgb25lcy4KICAkbXl0YWJsZXMgPSBwcygn bXl0YWJsZXMnLCBhcnJheSgpKSA/IHBzKCdteXRhYmxlcycpIDogYXJyYXkoKTsKICAkdW5r bm93biAgPSBGQUxTRTsKCiAgaWYgKCRycyA9IHNhZmVfcXVlcnkoIlNIT1cgVEFCTEVTIExJ S0UgJyIuYWRkY3NsYXNoZXMoZG9TbGFzaChQRlgpLCAnJV8nKS4iJSciKSkKICB7CiAgICB3 aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcnMpKQogICAgewogICAgICAkdGFibGUg PSBzdWJzdHIoJHJvd1swXSwgc3RybGVuKFBGWCkpOwoKICAgICAgaWYgKGluX2FycmF5KCR0 YWJsZSwgJHR4cHRhYmxlcykgb3IgaW5fYXJyYXkoJHRhYmxlLCAkbXl0YWJsZXMpKQogICAg ICB7CiAgICAgICAgJHRhYmxlc1tdID0gJHRhYmxlOwogICAgICB9CiAgICAgIGVsc2UKICAg ICAgewogICAgICAgICR1bmtub3duID0gVFJVRTsKICAgICAgfQoKICAgICAgJGlucHV0c1td ID0KICAgICAgICAnPGxhYmVsPicuCiAgICAgICAgICAnPGlucHV0IHR5cGU9ImNoZWNrYm94 IiBuYW1lPSJteXRhYmxlc1tdIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCR0YWJsZSku JyIgJy4KICAgICAgICAgICAgKGluX2FycmF5KCR0YWJsZSwgJHR4cHRhYmxlcykgPyAnZGlz YWJsZWQ9ImRpc2FibGVkIiBjaGVja2VkPSJjaGVja2VkIicgOiAnJykuJyAvPicuCiAgICAg ICAgICBodG1sc3BlY2lhbGNoYXJzKFBGWC4kdGFibGUpLgogICAgICAgICc8L2xhYmVsPic7 CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBlY2hvIGdyYWYoJ0htbW0uLi4gc3RyYW5nZSwg SSBjYW5ub3QgZmluZCBhbnkgdGFibGVzIHRoYXQgbWF0Y2ggeW91ciBUWFAgdGFibGUgcHJl Zml4Jyk7CiAgfQoKICAjIGFzayB1c2VyIHdoYXQgdG8gZG8gd2l0aCB0YWJsZXMgd2UncmUg bm90IHN1cmUgYWJvdXQuCiAgaWYgKCR1bmtub3duIGFuZCAhcHMoJ2NvbnRpbnVlJykpCiAg ewogICAgZWNobwogICAgICBncmFmKCdCZWxvdywgYSBsaXN0IG9mIHRhYmxlcyBpcyBzaG93 biB0aGF0IG1heSBiZSBwYXJ0IG9mIHlvdXIgVGV4dHBhdHRlcm4gaW5zdGFsbC4nKS4KICAg ICAgZ3JhZignU29tZSBvZiB0aGVzZSB0YWJsZXMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5 IHBsdWdpbnMgeW91IGhhdmUgaW5zdGFsbGVkLjxiciAvPgogICAgICAgIEluIHRoYXQgY2Fz ZSwgY2hlY2sgdGhlIHRhYmxlcyB0aGF0IHRoZXNlIHBsdWdpbnMgaGF2ZSBhZGRlZC48YnIg Lz4KICAgICAgICBCZSBjYXJlZnVsIG5vdCB0byBjaGVjayB0YWJsZXMgdGhhdCBhcmUgbm90 IHJlbGF0ZWQgdG8gdGhpcyBUZXh0cGF0dGVybiBpbnN0YWxsIScpLgogICAgICBncmFmKCdU aGUgc3RhbmRhcmQgVGV4dHBhdHRlcm4gdGFibGVzIGFyZSBhbHJlYWR5IGNoZWNrZWQuJyku CiAgICAgIGZvcm0oCiAgICAgICAgam9pbignPGJyIC8+JywgJGlucHV0cykuCiAgICAgICAg Z3JhZigKICAgICAgICAgIGVJbnB1dCgncnZtX2xhdGluMV90b191dGY4JykuJzxiciAvPicu CiAgICAgICAgICBmSW5wdXQoJ3N1Ym1pdCcsICdjb250aW51ZScsICdDb250aW51ZScsICdw dWJsaXNoJykKICAgICAgICApCiAgICAgICk7CgogICAgcnZtX2xhdGluMV90b191dGY4X2Vu ZCgpOwogIH0KCiAgZWNobyBncmFmKCdVcGRhdGluZyBUZXh0cGF0dGVybiB0YWJsZXMuLi4n KTsKCiAgIyBsb29wIHRocm91Z2ggdGFibGVzCiAgZm9yZWFjaCAoJHRhYmxlcyBhcyAkdGFi bGUpCiAgewogICAgJGluZGV4ZXMgPSBhcnJheSgpOwogICAgJGRyb3AgICAgPSBhcnJheSgp OwogICAgJGNyZWF0ZSAgPSBhcnJheSgpOwogICAgJGJpbiAgICAgPSBhcnJheSgpOwogICAg JHV0ZjggICAgPSBhcnJheSgpOwogICAgJGNvbHMgICAgPSBhcnJheSgpOwoKICAgICMgcHJl cGFyZSBhbHRlciBzdGF0ZW1lbnRzIGZvciBjb2x1bW5zCiAgICAkY29sdW1ucyA9IGdldFJv d3MoJ1NIT1cgQ09MVU1OUyBGUk9NICcuc2FmZV9wZngoJHRhYmxlKSk7CgogICAgaWYgKCRj b2x1bW5zKSBmb3JlYWNoICgkY29sdW1ucyBhcyAkY29sdW1uKQogICAgewogICAgICBleHRy YWN0KCRjb2x1bW4pOwoKICAgICAgaWYgKHByZWdfbWF0Y2goJy9eKGNoYXJ8dmFyY2hhcnx0 aW55dGV4dHx0ZXh0fG1lZGl1bXRleHR8bG9uZ3RleHR8ZW51bXxzZXQpXGIvJywgJFR5cGUp KQogICAgICB7CiAgICAgICAgJE51bGwgPSAoJE51bGwgPT0gJ1lFUycgPyAnIE5VTEwnIDog JyBOT1QgTlVMTCcpOwoKICAgICAgICAkYmVnaW4gPSAnTU9ESUZZIGAnLmRvU2xhc2goJEZp ZWxkKS4nYCAnLiRUeXBlLicgQ0hBUkFDVEVSIFNFVCAnOwogICAgICAgICRlbmQgICA9ICRO dWxsLiIgREVGQVVMVCAnIi5kb1NsYXNoKCREZWZhdWx0KS4iJyI7CgogICAgICAgICRiaW5b XSAgPSAkYmVnaW4uJ2JpbmFyeScuJGVuZDsKICAgICAgICAkdXRmOFtdID0gJGJlZ2luLid1 dGY4IENPTExBVEUgdXRmOF9nZW5lcmFsX2NpJy4kZW5kOwogICAgICAgICRjb2xzW10gPSAk RmllbGQ7CiAgICAgIH0KICAgIH0KCiAgICAjIGFuYWx5c2UgaW5kZXggc3RydWN0dXJlcwog ICAgJHJvd3MgPSBnZXRSb3dzKCdTSE9XIElOREVYIEZST00gJy5zYWZlX3BmeCgkdGFibGUp KTsKCiAgICBpZiAoJHJvd3MpIGZvcmVhY2ggKCRyb3dzIGFzICRyb3cpCiAgICB7CiAgICAg IGV4dHJhY3QoJHJvdyk7CgogICAgICBpZiAoJEtleV9uYW1lID09ICdQUklNQVJZJyBvciAh aW5fYXJyYXkoJENvbHVtbl9uYW1lLCAkY29scykpCiAgICAgIHsKICAgICAgICBjb250aW51 ZTsKICAgICAgfQoKICAgICAgJEtleV9uYW1lID0gJ2AnLiRLZXlfbmFtZS4nYCc7CgogICAg ICAkaW5kZXhlc1skS2V5X25hbWVdWyd1bmlxdWUnXSA9ICgkTm9uX3VuaXF1ZSA/ICcnIDog JyBVTklRVUUnKTsKICAgICAgJGluZGV4ZXNbJEtleV9uYW1lXVsnZnVsbHRleHQnXSA9ICgk SW5kZXhfdHlwZSA9PSAnRlVMTFRFWFQnID8gJyBGVUxMVEVYVCcgOiAnJyk7CiAgICAgICRp bmRleGVzWyRLZXlfbmFtZV1bJ2NvbHVtbnMnXVskU2VxX2luX2luZGV4XSA9ICdgJy4kQ29s dW1uX25hbWUuJ2AnLigkU3ViX3BhcnQgPyAnICgnLiRTdWJfcGFydC4nKScgOiAnJyk7CiAg ICB9CgogICAgIyBwcmVwYXJlIGluZGV4IGRyb3AvY3JlYXRlIHN0YXRlbWVudHMKICAgIGZv cmVhY2ggKCRpbmRleGVzIGFzICRpbmRleCA9PiAkc3RydWN0dXJlKQogICAgewogICAgICBl eHRyYWN0KCRzdHJ1Y3R1cmUpOwoKICAgICAgJGRyb3BbXSAgID0gJ0RST1AgSU5ERVggJy4k aW5kZXg7CiAgICAgICRjcmVhdGVbXSA9ICdBREQnLiR1bmlxdWUuJGZ1bGx0ZXh0LicgSU5E RVggJy4kaW5kZXguJyAoJy5qb2luKCcsICcsICRjb2x1bW5zKS4nKSc7CiAgICB9CgogICAg JHN1Y2Nlc3MgPSBUUlVFOwoKICAgICMgYWx0ZXIgdGhlIHRhYmxlICsgaW5kZXhlcwogICAg aWYgKCRkcm9wKQogICAgewogICAgICAkc3VjY2VzcyAqPSBzYWZlX2FsdGVyKCR0YWJsZSwg am9pbignLCAnLCAkZHJvcCksICRkZWJ1Zyk7CiAgICB9CgogICAgaWYgKCRiaW4gYW5kICRz dWNjZXNzKQogICAgewogICAgICAkc3VjY2VzcyAqPSBzYWZlX2FsdGVyKCR0YWJsZSwgam9p bignLCAnLCAkYmluKSwgJGRlYnVnKTsKCiAgICAgIGlmICgkc3VjY2VzcykKICAgICAgewog ICAgICAgICRzdWNjZXNzICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcsICcsICR1dGY4 KS4nLCBERUZBVUxUIENIQVJBQ1RFUiBTRVQgdXRmOCBDT0xMQVRFIHV0ZjhfZ2VuZXJhbF9j aScsICRkZWJ1Zyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoJGNyZWF0ZSBhbmQgJHN1Y2Nl c3MpCiAgICB7CiAgICAgICRzdWNjZXNzICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcs ICcsICRjcmVhdGUpLCAkZGVidWcpOwogICAgfQogIH0KCiAgIyB3aGlsZSB3ZSdyZSBoZXJl LCBtaWdodCBhcyB3ZWxsIG9wdGltaXplIHRoZSB0YWJsZXMKICBzYWZlX3F1ZXJ5KCJPUFRJ TUlaRSBUQUJMRSAiLmpvaW4oJywgJywgYXJyYXlfbWFwKCdzYWZlX3BmeCcsICR0YWJsZXMp KSwgJGRlYnVnKTsKCiAgaWYgKCRzdWNjZXNzKQogIHsKICAgIGVjaG8gZ3JhZignU3VjY2Vz ZnVsbHkgY29tcGxldGVkLicpOwoKICAgICRmaWxlICAgPSB0eHBhdGguJy9jb25maWcucGhw JzsKICAgICRjb25maWcgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAkY29uZmln ID0gc3RyX3JlcGxhY2UoJz8+Jywgbi4nIyBydm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGFk ZGVkIHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbnN1cmUgYSBjb3JyZWN0IGRiY2hhcnNldCcu bi4nJHR4cGNmZ1tcJ2RiY2hhcnNldFwnXSA9IFwndXRmOFwnJy5uLic/PicsICRjb25maWcp OwoKICAgIGlmICgkdHhwY2ZnWydkYmNoYXJzZXQnXSA9PSAndXRmOCcKICAgICAgb3IgaXNf d3JpdGFibGUoJGZpbGUpCiAgICAgIGFuZCAkaGFuZGxlID0gZm9wZW4oJGZpbGUsICd3JykK ICAgICAgYW5kIGZ3cml0ZSgkaGFuZGxlLCAkY29uZmlnKSAhPT0gRkFMU0UKICAgICAgYW5k IGZjbG9zZSgkaGFuZGxlKSkKICAgIHsKICAgICAgZWNobyBncmFmKCdUaGUgcnZtX2xhdGlu MV90b191dGY4IHBsdWdpbiBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGRlLWluc3RhbGxlZC4n KTsKICAgICAgc2FmZV9kZWxldGUoJ3R4cF9wbHVnaW4nLCAibmFtZSA9ICdydm1fbGF0aW4x X3RvX3V0ZjgnIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGVjaG8gZ3JhZignPGI+ V0FSTklORzogdGV4dHBhdHRlcm4vY29uZmlnLnBocCBjb3VsZCBub3QgYmUgdXBkYXRlZCBh dXRvbWF0aWNhbGx5LiBQbGVhc2UgdXBkYXRlIHlvdXIgdGV4dHBhdHRlcm4vY29uZmlnLnBo cCBmaWxlIHRvIGNvbnRhaW4gPGNvZGU+JHR4cGNmZ1tcJ2RiY2hhcnNldFwnXSA9IFwndXRm OFwnOzwvY29kZT48L2I+IGFuZCBkZWluc3RhbGwgdGhlIHJ2bV9sYXRpbjFfdG9fdXRmOCBw bHVnaW4gbWFudWFsbHknKTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGVjaG8gZ3JhZign RHVlIHRvIG9uZSBvciBtb3JlIGVycm9ycyB0aGUgdGFibGVzIGNvdWxkIG5vdCBiZSB1cGRh dGVkIGNvcnJlY3RseS4gWW91IG1heSBoYXZlIHRvIHJlc3RvcmUgYSBiYWNrdXAuJyk7CiAg fQoKICBydm1fbGF0aW4xX3RvX3V0ZjhfZW5kKCk7Cn0KCmZ1bmN0aW9uIHJ2bV9sYXRpbjFf dG9fdXRmOF9lbmQoKQp7CiAgZWNobyAnPC9kaXY+JzsKICBlbmRfcGFnZSgpOwogIGV4aXQo KTsKfQoiO3M6MzoibWQ1IjtzOjMyOiJkMmFhMGJmOTIxOTRlOGJmYzY1MTFmOGE5NmU2NzUy YiI7fQ==