# rvm_utf8_to_utf8mb4 v0.2 # Alter pre-MySQL 5.5.3 tables to use full UTF-8 charset (utf8mb4 instead of utf8) # # 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: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTk6InJ2bV91dGY4X3RvX3V0ZjhtYjQiO3M6NzoidmVyc2lv biI7czozOiIwLjIiO3M6NjoiYXV0aG9yIjtzOjE1OiJSdXVkIHZhbiBNZWxpY2siO3M6MTA6 ImF1dGhvcl91cmkiO3M6MjE6Imh0dHA6Ly92YW5tZWxpY2suY29tLyI7czoxMToiZGVzY3Jp cHRpb24iO3M6ODA6IkFsdGVyIHByZS1NeVNRTCA1LjUuMyB0YWJsZXMgdG8gdXNlIGZ1bGwg VVRGLTggY2hhcnNldCAodXRmOG1iNCBpbnN0ZWFkIG9mIHV0ZjgpIjtzOjQ6InR5cGUiO2k6 MTtzOjQ6ImhlbHAiO3M6MzM1NzoiPGgxPnV0ZjggdG8gdXRmOG1iNDwvaDE+Cgo8cD48c3Ry b25nPjxzcGFuIGNsYXNzPSJjYXBzIj5XQVJOSU5HPC9zcGFuPjogY2FyZWZ1bGx5IHJlYWQg dGhpcyBkb2N1bWVudGF0aW9uIGFuZCA8c3BhbiBjbGFzcz0iY2FwcyI+QkFDS1VQPC9zcGFu PiA8c3BhbiBjbGFzcz0iY2FwcyI+WU9VUjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNhcHMiPkRB VEFCQVNFPC9zcGFuPiBiZWZvcmUgYWN0aXZhdGluZy91c2luZyB0aGlzIHBsdWdpbi48L3N0 cm9uZz48L3A+Cgo8cD5UZXh0cGF0dGVybiBhbHdheXMgdXNlcyAmIzgyMTY7dXRmOCYjODIx NzsgdG8gc3RvcmUgZGF0YSBpbiB0aGUgZGF0YWJhc2UsIGJ1dCBkZXBlbmRpbmcgb24gd2hp Y2ggTXlTUUwgdmVyc2lvbiB5b3UgdXNlZCB3aGVuIGluc3RhbGxpbmcgVGV4dHBhdHRlcm4s IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSB0YWJsZXMgYW5kIGNvbHVtbnMgZGlmZmVyczo8 L3A+Cgo8b2w+Cgk8bGk+TXlTUUwgdmVyc2lvbnMgb2xkZXIgdGhhbiA0LjE6IHRoZSBjaGFy YWN0ZXIgc2V0IG9mIHRoZSB0YWJsZXMgY3JlYXRlZCBieSBUZXh0cGF0dGVybiBpcyB0eXBp Y2FsbHkgJiM4MjE2O2xhdGluMSYjODIxNzsuPC9saT4KCTxsaT5NeVNRTCB2ZXJzaW9ucyA0 LjEgYW5kIGhpZ2hlcjogdGhlIHRhYmxlcyBhcmUgc2V0IHRvIHVzZSB0aGUgJiM4MjE2O3V0 ZjgmIzgyMTc7IGNoYXJhY3RlciBzZXQsIHdoaWNoIG1hdGNoZXMgdGhlIGFjdHVhbCBjaGFy YWN0ZXIgc2V0IG9mIHRoZSBkYXRhIHN0b3JlZCBpbiB0aG9zZSB0YWJsZXMsIGJ1dCBkb2Vz biYjODIxNzt0IGFsbG93IDQtYnl0ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVRGPC9zcGFuPi04 IGNoYXJhY3RlcnMuPC9saT4KCTxsaT5NeVNRTCB2ZXJzaW9ucyA1LjUuMyBhbmQgaGlnaGVy ICsgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gNC42IGFuZCBoaWdoZXI6IHRoZSB0 YWJsZXMgYXJlIHNldCB0byB1c2UgdGhlICYjODIxNjt1dGY4bWI0JiM4MjE3OyBjaGFyYWN0 ZXIgc2V0LCB3aGljaCBhbGxvd3MgdGhlIGZ1bGwgcmFuZ2Ugb2YgPHNwYW4gY2xhc3M9ImNh cHMiPlVURjwvc3Bhbj4tOCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQsIGluY2x1ZGluZyBlbW9q aXMuPC9saT4KPC9vbD4KCjxwPkhhdmluZyB0aGUgdGFibGVzL2NvbHVtbnMgdGhlbXNlbHZl cyB1c2UgdGhlIHNhbWUgY2hhcmFjdGVyIHNldCBhcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhl bSBoYXMgc29tZSBhZHZhbnRhZ2VzIHdoZW4gcGVyZm9ybWluZyBzZWFyY2hlcyBvciBzb3J0 aW5nIGluIFRleHRwYXR0ZXJuLCBlc3BlY2lhbGx5IGlmIHlvdSB1c2UgY2hhcmFjdGVycyBv dXRzaWRlIFVTLTxzcGFuIGNsYXNzPSJjYXBzIj5BU0NJSTwvc3Bhbj4uPC9wPgoKPHA+SWYg eW91IHVwZ3JhZGUgeW91ciBUZXh0cGF0dGVybiB2ZXJzaW9uIHRvIDQuNiBvciBoaWdoZXIg KyBNeVNRTCB2ZXJzaW9uIGZyb20gNS41LjMgb3IgaGlnaGVyLCB0aGUgdGFibGUvY29sdW1u IGNoYXJhY3RlciBzZXRzIGFyZSBub3QgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gJiM4 MjE2O3V0ZjhtYjQmIzgyMTc7LCBzbyB0aGV5IHN0YXkgJiM4MjE2O2xhdGluMSYjODIxNzsg b3IgJiM4MjE2O3V0ZjgmIzgyMTc7IHdoaWxlIHRoZSBkYXRhIHN0b3JlZCBpbiB0aG9zZSB0 YWJsZXMgaXMgc3RpbGwgJiM4MjE2O3V0ZjgmIzgyMTc7LjwvcD4KCjxwPlRvIHN3aXRjaCBm cm9tICYjODIxNjtsYXRpbjEmIzgyMTc7IHRvICYjODIxNjt1dGY4JiM4MjE3OywgdXNlIHRo ZSBydm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGJlZm9yZSB1c2luZyB0aGlzIG9uZS48YnIg Lz4KVG8gc3dpdGNoIGZyb20gJiM4MjE2O3V0ZjgmIzgyMTc7IHRvICYjODIxNjt1dGY4bWI0 JiM4MjE3OywgdGhpcyBwbHVnaW4gY2FuIGJlIHVzZWQuPC9wPgoKPHA+VGhpcyBwbHVnaW4g YXNzdW1lcyB0aGUgY3VycmVudCBjaGFyc2V0IGZvciB0YWJsZXMgYW5kIGNvbHVtbnMgaXMg c2V0IHRvICYjODIxNjt1dGY4JiM4MjE3OyBhbmQgY2hhbmdlcyB0aGF0IHRvICYjODIxNjt1 dGY4bWI0JiM4MjE3Oy4gVGhpcyBjYW4gYmUgZG9uZSBpbiA8c3BhbiBjbGFzcz0iY2FwcyI+ VFhQPC9zcGFuPiA0LjYgb3IgaGlnaGVyLCBiZWNhdXNlIHRoZSByZWxldmFudCBpbmRleGVz IGhhdmUgYWxyZWFkeSBiZWVuIGNoYW5nZWQgdG8gYWxsb3cgZm9yIHRoZSBleHRyYSBieXRl IHNwYWNlIHBlciBjaGFyYWN0ZXIgYXMgcmVxdWlyZWQgYnkgJiM4MjE2O3V0ZjhtYjQmIzgy MTc7LiBTaW5jZSB0aGUgb2xkICYjODIxNjt1dGY4JiM4MjE3OyBjb2x1bW5zIGNvdWxkbiYj ODIxNzt0IGNvbnRhaW4gNC1ieXRlIDxzcGFuIGNsYXNzPSJjYXBzIj5VVEY8L3NwYW4+LTgg Y2hhcmFjdGVycywgbm8gZGF0YSBpcyBsb3N0IHdoZW4gY2hhbmdpbmcgdG8gdXRmOG1iNC48 L3A+Cgo8cD5BZnRlcndhcmRzIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1cGRhdGUgdGhlICYj ODIxNjtkYmNoYXJzZXQmIzgyMTc7IHNldHRpbmcgaW4gdGhlIDxjb2RlPnRleHRwYXR0ZXJu L2NvbmZpZy5waHA8L2NvZGU+IGZpbGUgdG8gJiM4MjE2O3V0ZjhtYjQmIzgyMTc7LiBTaG91 bGQgdGhpcyBmYWlsIGR1ZSB0byBsYWNrIG9mIHBlcm1pc3Npb25zLCB5b3Ugd2lsbCBiZSBh c2tlZCB0byBtYWtlIHRoaXMgY2hhbmdlIHlvdXJzZWxmLiBEbyBub3Qgc2tpcCB0aGlzIHN0 ZXAsIG90aGVyd2lzZSB5b3Ugd2lsbCBleHBlcmllbmNlIGlycmVwYXJhYmxlIGRhdGEgY29y cnVwdGlvbiBzbyBzZXZlcmUgdGhhdCB5b3Ugd2lsbCBjcnkgbGlrZSBhIGJhYnkgKHlvdSBt YWRlIGJhY2t1cHMsIHJpZ2h0PyksIG11Y2ggdG8gdGhlIGFtdXNlbWVudCBvZiBvbmxvb2tl cnMuPC9wPgoKPHA+SG93IHRvIHVzZSB0aGlzIHBsdWdpbjo8L3A+Cgo8b2w+Cgk8bGk+PHN0 cm9uZz48c3BhbiBjbGFzcz0iY2FwcyI+TUFLRTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNhcHMi PkJBQ0tVUFM8L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5GSVJTVDwvc3Bhbj4hPC9zdHJv bmc+IChub3QganVzdCB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gdGFibGVz LCBidXQgdGhlIGVudGlyZSBkYXRhYmFzZSk8L2xpPgoJPGxpPk1ha2Ugc3VyZSB5b3UgaGF2 ZSBNeVNRTCB2ZXJzaW9uIDUuNS4zIG9yIGhpZ2hlciBpbnN0YWxsZWQuPC9saT4KCTxsaT5V cGdyYWRlIHRvIGF0IGxlYXN0IFRleHRwYXR0ZXJuIDQuNiBvciBoaWdoZXIuPC9saT4KCTxs aT5BY3RpdmF0ZSB0aGUgcGx1Z2luLjwvbGk+Cgk8bGk+PGEgaHJlZj0iP2V2ZW50PXJ2bV91 dGY4X3RvX3V0ZjhtYjQiPkNsaWNrIGhlcmU8L2E+IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0 aW9ucyBvbiB0aGUgc2NyZWVuLjwvbGk+Cjwvb2w+IjtzOjQ6ImNvZGUiO3M6NjAxNDoiCmlm ICh0eHBpbnRlcmZhY2UgPT0gJ2FkbWluJyBhbmQgZ3BzKCdldmVudCcpID09ICdydm1fdXRm OF90b191dGY4bWI0JykKewogIGFkZF9wcml2cygncnZtX3V0ZjhfdG9fdXRmOG1iNCcsICcx Jyk7CiAgcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywgJ3J2bV91dGY4X3RvX3V0ZjhtYjQn LCAndXRmOF90b191dGY4bWI0Jyk7CiAgcmVnaXN0ZXJfY2FsbGJhY2soJ3J2bV91dGY4X3Rv X3V0ZjhtYjQnLCAncnZtX3V0ZjhfdG9fdXRmOG1iNCcpOwp9CgpmdW5jdGlvbiBydm1fdXRm OF90b191dGY4bWI0KCkKewogIGdsb2JhbCAkdHhwY2ZnLCAkREIsICRkYnZlcnNpb247Cgog ICRkZWJ1ZyA9IEZBTFNFOwogICRlcnJvciA9IEZBTFNFOwoKICByZXF1aXJlX3ByaXZzKCdy dm1fdXRmOF90b191dGY4bWI0Jyk7CiAgcGFnZXRvcCgnJyk7CgogIGVjaG8gJzxkaXYgc3R5 bGU9Im1hcmdpbi1sZWZ0OiA1MHB4Ij4nOwoKICBpZiAobXlzcWxpX2dldF9zZXJ2ZXJfdmVy c2lvbigkREItPmxpbmspIDwgNTA1MDMpIHsKICAgICRlcnJvciA9ICdNeVNRTCB2ZXJzaW9u IGlzIGxvd2VyIHRoYW4gNS41LjMnOwogIH0gZWxzZSB7CiAgICBpZiAoZmFsc2UgIT09IHN0 cnBvcyhteXNxbGlfZ2V0X2NsaWVudF9pbmZvKCREQi0+bGluayksICdteXNxbG5kJykpIHsK ICAgICAgLy8gbXlzcWxuZCA1LjAuOSsgcmVxdWlyZWQKICAgICAgaWYgKG15c3FsaV9nZXRf Y2xpZW50X3ZlcnNpb24oJG15bGluaykgPCA1MDAwOSkgewogICAgICAgICRlcnJvciA9ICdt eXNxbG5kIGNsaWVudCB2ZXJzaW9uIGlzIGJlbG93IDUuMC45JzsKICAgICAgfQogICAgfSBl bHNlIHsKICAgICAgLy8gbGlibXlzcWxjbGllbnQgNS41LjMrIHJlcXVpcmVkCiAgICAgIGlm IChteXNxbGlfZ2V0X2NsaWVudF92ZXJzaW9uKCREQi0+bGluaykgPCA1MDUwMykgewogICAg ICAgICRlcnJvciA9ICdsaWJteXNxbGNsaWVudCB2ZXJzaW9uIGlzIGJlbG93IDUuNS4zJzsK ICAgICAgfQogICAgfQogIH0KCiAgaWYgKHZlcnNpb25fY29tcGFyZSgkZGJ2ZXJzaW9uLCAn NC42LjAnLCAnPCcpKSB7CiAgICAkZXJyb3IgPSAnVGV4dHBhdHRlcm4gZGF0YWJhc2UgdmVy c2lvbiBpcyBiZWxvdyA0LjYuMC4gVXBncmFkZSBUZXh0cGF0dGVybiBmaXJzdCc7CiAgfQoK ICBpZiAoJHR4cGNmZ1snZGJjaGFyc2V0J10gPT0gJ2xhdGluMScpIHsKICAgICRlcnJvciA9 ICdkYmNoYXJzZXQgaXMgbGF0aW4xLCBzbyB5b3UgaGF2ZSB0byB1c2UgdGhlIHJ2bV9sYXRp bjFfdG9fdXRmOCBwbHVnaW4gZmlyc3QnOwogIH0KCiAgaWYgKCRlcnJvcikKICB7CiAgICBl Y2hvIGdyYWYoJ1RoZSBydm1fdXRmOF90b191dGY4bWI0IHBsdWdpbiBoYXMgYmVlbiByZW1v dmVkLCBiZWNhdXNlIHlvdXIgJy4kZXJyb3IpOwogICAgc2FmZV9kZWxldGUoJ3R4cF9wbHVn aW4nLCAibmFtZSA9ICdydm1fdXRmOF90b191dGY4bWI0JyIpOwogICAgcnZtX3V0ZjhfdG9f dXRmOG1iNF9lbmQoKTsKICB9CgogICMgc3RhbmRhcmQgVFhQIHRhYmxlcwogICR0eHB0YWJs ZXMgPSBhcnJheSgKICAgICd0ZXh0cGF0dGVybicsCiAgICAndHhwX2NhdGVnb3J5JywKICAg ICd0eHBfY3NzJywKICAgICd0eHBfZGlzY3VzcycsCiAgICAndHhwX2Rpc2N1c3NfaXBiYW4n LAogICAgJ3R4cF9kaXNjdXNzX25vbmNlJywKICAgICd0eHBfZmlsZScsCiAgICAndHhwX2Zv cm0nLAogICAgJ3R4cF9pbWFnZScsCiAgICAndHhwX2xhbmcnLAogICAgJ3R4cF9saW5rJywK ICAgICd0eHBfbG9nJywKICAgICd0eHBfcGFnZScsCiAgICAndHhwX3BsdWdpbicsCiAgICAn dHhwX3ByZWZzJywKICAgICd0eHBfc2VjdGlvbicsCiAgICAndHhwX3Rva2VuJywKICAgICd0 eHBfdXNlcnMnCiAgKTsKCiAgIyBmaW5kIHRhYmxlcyB0aGF0IG1hdGNoIHRoZSBUWFAgdGFi bGUgcHJlZml4LCBtYXJrIHN0YW5kYXJkIGFuZCBzZWxlY3RlZCBvbmVzLgogICRteXRhYmxl cyA9IHBzKCdteXRhYmxlcycsIGFycmF5KCkpID8gcHMoJ215dGFibGVzJykgOiBhcnJheSgp OwogICR1bmtub3duICA9IEZBTFNFOwoKICBpZiAoJHJzID0gc2FmZV9xdWVyeSgiU0hPVyBU QUJMRVMgTElLRSAnIi5hZGRjc2xhc2hlcyhkb1NsYXNoKFBGWCksICclXycpLiIlJyIpKQog IHsKICAgIHdoaWxlICgkcm93ID0gbXlzcWxpX2ZldGNoX3JvdygkcnMpKQogICAgewogICAg ICAkdGFibGUgPSBzdWJzdHIoJHJvd1swXSwgc3RybGVuKFBGWCkpOwoKICAgICAgaWYgKGlu X2FycmF5KCR0YWJsZSwgJHR4cHRhYmxlcykgb3IgaW5fYXJyYXkoJHRhYmxlLCAkbXl0YWJs ZXMpKQogICAgICB7CiAgICAgICAgJHRhYmxlc1tdID0gJHRhYmxlOwogICAgICB9CiAgICAg IGVsc2UKICAgICAgewogICAgICAgICR1bmtub3duID0gVFJVRTsKICAgICAgfQoKICAgICAg JGlucHV0c1tdID0KICAgICAgICAnPGxhYmVsPicuCiAgICAgICAgICAnPGlucHV0IHR5cGU9 ImNoZWNrYm94IiBuYW1lPSJteXRhYmxlc1tdIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJz KCR0YWJsZSkuJyIgJy4KICAgICAgICAgICAgKGluX2FycmF5KCR0YWJsZSwgJHR4cHRhYmxl cykgPyAnZGlzYWJsZWQ9ImRpc2FibGVkIiBjaGVja2VkPSJjaGVja2VkIicgOiAnJykuJyAv PicuCiAgICAgICAgICBodG1sc3BlY2lhbGNoYXJzKFBGWC4kdGFibGUpLgogICAgICAgICc8 L2xhYmVsPic7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBlY2hvIGdyYWYoJ0htbW0uLi4g c3RyYW5nZSwgSSBjYW5ub3QgZmluZCBhbnkgdGFibGVzIHRoYXQgbWF0Y2ggeW91ciBUWFAg dGFibGUgcHJlZml4Jyk7CiAgfQoKICAjIGFzayB1c2VyIHdoYXQgdG8gZG8gd2l0aCB0YWJs ZXMgd2UncmUgbm90IHN1cmUgYWJvdXQuCiAgaWYgKCR1bmtub3duIGFuZCAhcHMoJ2NvbnRp bnVlJykpCiAgewogICAgZWNobwogICAgICBncmFmKCdCZWxvdywgYSBsaXN0IG9mIHRhYmxl cyBpcyBzaG93biB0aGF0IG1heSBiZSBwYXJ0IG9mIHlvdXIgVGV4dHBhdHRlcm4gaW5zdGFs bC4nKS4KICAgICAgZ3JhZignU29tZSBvZiB0aGVzZSB0YWJsZXMgbWF5IGhhdmUgYmVlbiBj cmVhdGVkIGJ5IHBsdWdpbnMgeW91IGhhdmUgaW5zdGFsbGVkLjxiciAvPgogICAgICAgIElu IHRoYXQgY2FzZSwgY2hlY2sgdGhlIHRhYmxlcyB0aGF0IHRoZXNlIHBsdWdpbnMgaGF2ZSBh ZGRlZC48YnIgLz4KICAgICAgICBCZSBjYXJlZnVsIG5vdCB0byBjaGVjayB0YWJsZXMgdGhh dCBhcmUgbm90IHJlbGF0ZWQgdG8gdGhpcyBUZXh0cGF0dGVybiBpbnN0YWxsIScpLgogICAg ICBncmFmKCdUaGUgc3RhbmRhcmQgVGV4dHBhdHRlcm4gdGFibGVzIGFyZSBhbHJlYWR5IGNo ZWNrZWQuJykuCiAgICAgIGZvcm0oCiAgICAgICAgam9pbignPGJyIC8+JywgJGlucHV0cyku CiAgICAgICAgZ3JhZigKICAgICAgICAgIGVJbnB1dCgncnZtX3V0ZjhfdG9fdXRmOG1iNCcp Lic8YnIgLz4nLgogICAgICAgICAgZklucHV0KCdzdWJtaXQnLCAnY29udGludWUnLCAnQ29u dGludWUnLCAncHVibGlzaCcpCiAgICAgICAgKQogICAgICApOwoKICAgIHJ2bV91dGY4X3Rv X3V0ZjhtYjRfZW5kKCk7CiAgfQoKICBlY2hvIGdyYWYoJ1VwZGF0aW5nIFRleHRwYXR0ZXJu IHRhYmxlcy4uLicpOwoKICAjIGxvb3AgdGhyb3VnaCB0YWJsZXMKICBmb3JlYWNoICgkdGFi bGVzIGFzICR0YWJsZSkKICB7CiAgICAkdXRmOG1iNCA9IGFycmF5KCk7CgogICAgIyBwcmVw YXJlIGFsdGVyIHN0YXRlbWVudHMgZm9yIGNvbHVtbnMKICAgICRjb2x1bW5zID0gZ2V0Um93 cygnU0hPVyBDT0xVTU5TIEZST00gJy5zYWZlX3BmeCgkdGFibGUpKTsKCiAgICBpZiAoJGNv bHVtbnMpIGZvcmVhY2ggKCRjb2x1bW5zIGFzICRjb2x1bW4pCiAgICB7CiAgICAgIGV4dHJh Y3QoJGNvbHVtbik7CgogICAgICBpZiAocHJlZ19tYXRjaCgnL14oY2hhcnx2YXJjaGFyfHRp bnl0ZXh0fHRleHR8bWVkaXVtdGV4dHxsb25ndGV4dHxlbnVtfHNldClcYi8nLCAkVHlwZSkp CiAgICAgIHsKICAgICAgICAkdXRmOG1iNFtdID0gJ01PRElGWSBgJy5kb1NsYXNoKCRGaWVs ZCkuJ2AgJy4kVHlwZS4nCiAgICAgICAgICBDSEFSQUNURVIgU0VUIHV0ZjhtYjQKICAgICAg ICAgIENPTExBVEUgdXRmOG1iNF91bmljb2RlX2NpJy4KICAgICAgICAgICgkTnVsbCA9PSAn WUVTJyA/ICcgTlVMTCcgOiAnIE5PVCBOVUxMJykuCiAgICAgICAgICAoJERlZmF1bHQgPT0g J05VTEwnCiAgICAgICAgICAgID8gKChwcmVnX21hdGNoKCcvdGV4dC8nLCAkVHlwZSkgfHwg JE51bGwgPT0gJ05PJykgPyAnJyA6ICdERUZBVUxUIE5VTEwnKQogICAgICAgICAgICA6ICIg REVGQVVMVCAnIi5kb1NsYXNoKCREZWZhdWx0KS4iJyIKICAgICAgICAgICk7CiAgICAgIH0K ICAgIH0KCiAgICAkc3VjY2VzcyA9IFRSVUU7CgogICAgIyBhbHRlciB0aGUgdGFibGUKICAg ICRzdWNjZXNzICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcsICcsICR1dGY4bWI0KS4n LCBERUZBVUxUIENIQVJBQ1RFUiBTRVQgdXRmOG1iNCBDT0xMQVRFIHV0ZjhtYjRfdW5pY29k ZV9jaScsICRkZWJ1Zyk7CiAgfQoKICAjIHdoaWxlIHdlJ3JlIGhlcmUsIG1pZ2h0IGFzIHdl bGwgb3B0aW1pemUgdGhlIHRhYmxlcwogIHNhZmVfcXVlcnkoIk9QVElNSVpFIFRBQkxFICIu am9pbignLCAnLCBhcnJheV9tYXAoJ3NhZmVfcGZ4JywgJHRhYmxlcykpLCAkZGVidWcpOwoK ICBpZiAoJHN1Y2Nlc3MpCiAgewogICAgZWNobyBncmFmKCdTdWNjZXNzZnVsbHkgY29tcGxl dGVkLicpOwoKICAgICRmaWxlICAgPSB0eHBhdGguJy9jb25maWcucGhwJzsKICAgICRjb25m aWcgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAkY29uZmlnID0gc3RyX3JlcGxh Y2UoJyR0eHBjZmdbXCdkYmNoYXJzZXRcJ10gPSBcJ3V0ZjhcJycubiwgJyR0eHBjZmdbXCdk YmNoYXJzZXRcJ10gPSBcJ3V0ZjhcJzsnLm4sICRjb25maWcpOyAjIGZpeCBtaXNzaW5nIDsg b24gbGluZSBhZGRlZCBieSBpbiBydm1fbGF0aW4xX3RvX3V0ZjgKICAgICRjb25maWcgPSBz dHJfcmVwbGFjZSgnPz4nLCBuLicjIHJ2bV91dGY4X3RvX3V0ZjhtYjQgcGx1Z2luIGFkZGVk IHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbnN1cmUgYSBjb3JyZWN0IGRiY2hhcnNldCcubi4n JHR4cGNmZ1tcJ2RiY2hhcnNldFwnXSA9IFwndXRmOG1iNFwnOycubi4nPz4nLCAkY29uZmln KTsKCiAgICBpZiAoJHR4cGNmZ1snZGJjaGFyc2V0J10gPT0gJ3V0ZjhtYjQnCiAgICAgIG9y IGlzX3dyaXRhYmxlKCRmaWxlKQogICAgICBhbmQgJGhhbmRsZSA9IGZvcGVuKCRmaWxlLCAn dycpCiAgICAgIGFuZCBmd3JpdGUoJGhhbmRsZSwgJGNvbmZpZykgIT09IEZBTFNFCiAgICAg IGFuZCBmY2xvc2UoJGhhbmRsZSkpCiAgICB7CiAgICAgIGVjaG8gZ3JhZignVGhlIHJ2bV91 dGY4X3RvX3V0ZjhtYjQgcGx1Z2luIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZGUtaW5zdGFs bGVkLicpOwogICAgICBzYWZlX2RlbGV0ZSgndHhwX3BsdWdpbicsICJuYW1lID0gJ3J2bV91 dGY4X3RvX3V0ZjhtYjQnIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGVjaG8gZ3Jh ZignPGI+V0FSTklORzogdGV4dHBhdHRlcm4vY29uZmlnLnBocCBjb3VsZCBub3QgYmUgdXBk YXRlZCBhdXRvbWF0aWNhbGx5LiBQbGVhc2UgdXBkYXRlIHlvdXIgdGV4dHBhdHRlcm4vY29u ZmlnLnBocCBmaWxlIHRvIGNvbnRhaW4gPGNvZGU+JHR4cGNmZ1tcJ2RiY2hhcnNldFwnXSA9 IFwndXRmOG1iNFwnOzwvY29kZT48L2I+IGFuZCBkZWluc3RhbGwgdGhlIHJ2bV91dGY4X3Rv X3V0ZjhtYjQgcGx1Z2luIG1hbnVhbGx5Jyk7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBl Y2hvIGdyYWYoJ0R1ZSB0byBvbmUgb3IgbW9yZSBlcnJvcnMgdGhlIHRhYmxlcyBjb3VsZCBu b3QgYmUgdXBkYXRlZCBjb3JyZWN0bHkuIFlvdSBtYXkgaGF2ZSB0byByZXN0b3JlIGEgYmFj a3VwLicpOwogIH0KCiAgcnZtX3V0ZjhfdG9fdXRmOG1iNF9lbmQoKTsKfQoKZnVuY3Rpb24g cnZtX3V0ZjhfdG9fdXRmOG1iNF9lbmQoKQp7CiAgZWNobyAnPC9kaXY+JzsKICBlbmRfcGFn ZSgpOwogIGV4aXQoKTsKfQoiO3M6MzoibWQ1IjtzOjMyOiJhYmUyOTE2MTU3MWZjNjkyZTEw NTNkMDJjNjZhMDFlMiI7fQ==