# ob1_advanced_search v1.032b # Makes it possible to create a more advanced search feature for your users. # Henrik Jönsson # http://rise.lewander.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMDp7czo0OiJuYW1lIjtzOjE5OiJvYjFfYWR2YW5jZWRfc2VhcmNoIjtzOjc6InZlcnNp b24iO3M6NjoiMS4wMzJiIjtzOjY6ImF1dGhvciI7czoxNToiSGVucmlrIErDtm5zc29uIjtz OjEwOiJhdXRob3JfdXJpIjtzOjI1OiJodHRwOi8vcmlzZS5sZXdhbmRlci5jb20vIjtzOjEx OiJkZXNjcmlwdGlvbiI7czo3NDoiTWFrZXMgaXQgcG9zc2libGUgdG8gY3JlYXRlIGEgbW9y ZSBhZHZhbmNlZCBzZWFyY2ggZmVhdHVyZSBmb3IgeW91ciB1c2Vycy4iO3M6NDoidHlwZSI7 aTowO3M6MzoiY3NzIjtzOjE5NjU6IjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CkBtZWRpYSBh bGwgewoJI2hlbHBDb250ZW50cyAqIHsKCQlib3JkZXI6IDA7CgkJbWFyZ2luOiAwOwoJfQoJ I2hlbHBDb250ZW50cyB7CgkJZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJyxIZWx2ZXRp Y2EsQXJpYWwsc2Fucy1zZXJpZjsKCQlmb250LXNpemU6IDExcHg7CgkJbGluZS1oZWlnaHQ6 MS40ZW07CgkJcGFkZGluZzoxMHB4OwoJfQoJI2hlbHBDb250ZW50cyB1bCB7CgkJbGlzdC1z dHlsZTogc3F1YXJlOwoJfQoJI2hlbHBDb250ZW50cyBoMSxoMixoMyB7CgkJZm9udC13ZWln aHQ6IGJvbGQ7CgkJZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJyxIZWx2ZXRpY2EsQXJp YWwsc2Fucy1zZXJpZjsKCX0KCSNoZWxwQ29udGVudHMgaDEgewoJCW1hcmdpbi1ib3R0b206 IDRweDsKCX0KCSNoZWxwQ29udGVudHMgaDIgewoJCW1hcmdpbi10b3A6IDEwcHg7CgkJdGV4 dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKCX0KCSNoZWxwQ29udGVudHMgaDMgewoJCWZvbnQt c2l6ZTogMWVtOwoJCW1hcmdpbi10b3A6IDEwcHg7CgkJbWFyZ2luLWxlZnQ6IDEwcHg7Cgl9 CgkjaGVscENvbnRlbnRzIGxpIHsKCQltYXJnaW4tdG9wOiA0cHg7Cgl9CgkjaGVscENvbnRl bnRzIHAgewoJCWZvbnQtZmFtaWx5OiAnVHJlYnVjaGV0IE1TJyxIZWx2ZXRpY2EsQXJpYWws c2Fucy1zZXJpZjsKCQlmb250LXNpemU6IDEuMWVtOwoJCW1hcmdpbi10b3A6IDEwcHg7CgkJ bWFyZ2luLWxlZnQ6IDIwcHg7Cgl9CgkjaGVscENvbnRlbnRzIHN0cm9uZywgI2hlbHBDb250 ZW50cyBiIHsKCQlmb250LWZhbWlseTogJ1RyZWJ1Y2hldCBNUycsSGVsdmV0aWNhLEFyaWFs LHNhbnMtc2VyaWY7CgkJZm9udC1zaXplOiAxZW07Cgl9CgkjaGVscENvbnRlbnRzIHVsLCAj aGVscENvbnRlbnRzIG9sIHsKCQltYXJnaW4tbGVmdDogMzBweDsKCX0KCSNoZWxwQ29udGVu dHMgYmxvY2txdW90ZSB7CgkJcGFkZGluZzogOHB4IDRweCA4cHggNHB4OwoJfQp9CkBtZWRp YSBzY3JlZW4gewoJI2hlbHBDb250ZW50cyB7CgkJYmFja2dyb3VuZC1jb2xvcjogIzAwNWU3 ZTsKCQlib3JkZXI6IDFweCBkb3R0ZWQgIzAwNWU3ZTsKCQl3aWR0aDogNzAwcHg7CgkJY29s b3I6ICNjM2U5ZjY7Cgl9CgkjaGVscENvbnRlbnRzIGEsICNoZWxwQ29udGVudHMgYS52aXNp dGVkIHsKCQljb2xvcjogIzQyYjNkNzsKCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJYm9y ZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjNDJiM2Q3OwoJfQoJI2hlbHBDb250ZW50cyBhW3Rp dGxlPSdFeHRlcm5hbCBsaW5rJ10gewoJCWNvbG9yOiAjZGVlYmNkOwoJCWJvcmRlci1ib3R0 b206IDFweCBkb3R0ZWQgI2RlZWJjZDsKCX0KCSNoZWxwQ29udGVudHMgYTpob3ZlciB7CgkJ Y29sb3I6ICM2YmQ1ZmE7CgkJYm9yZGVyLWJvdHRvbTogMDsKCX0KCSNoZWxwQ29udGVudHMg YWNyb255bSB7CgkJYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjYzNlOWY2OwoJCWN1cnNv cjogaGVscDsKCX0KCSNoZWxwQ29udGVudHMgY29kZSwgI2hlbHBDb250ZW50cyBibG9ja3F1 b3RlIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiAjNDJiM2Q3OwoJCXBhZGRpbmctbGVmdDogNHB4 OwoJCXBhZGRpbmctcmlnaHQ6IDRweDsKCX0KCSNoZWxwQ29udGVudHMgYmxvY2txdW90ZSB7 CgkJbWFyZ2luLXRvcDogMTBweDsKCQlwYWRkaW5nOiA0cHg7CgkJYm9yZGVyOiAxcHggZG90 dGVkICMwMDVlN2U7CgkJY29sb3I6ICMwMDVlN2U7Cgl9Cn0KQG1lZGlhIHByaW50IHsKCSNo ZWxwQ29udGVudHMgewoJCWJvcmRlcjogMXB4IGRvdHRlZCAjY2NjOwoJCWNvbG9yOiAjMDAw OwoJfQoJI2hlbHBDb250ZW50cyBhLCAjaGVscENvbnRlbnRzIGE6dmlzaXRlZCB7CgkJY29s b3I6ICMzMzM7Cgl9CgkjaGVscENvbnRlbnRzIGRpdi5pbmRleCB1bCB7CgkJZGlzcGxheTog bm9uZTsKCX0KfQo8L3N0eWxlPgo8ZGl2IGlkPSJoZWxwQ29udGVudHMiPiI7czo0OiJoZWxw IjtzOjc5Mzg6IjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CkBtZWRpYSBhbGwgewoJI2hlbHBD b250ZW50cyAqIHsKCQlib3JkZXI6IDA7CgkJbWFyZ2luOiAwOwoJfQoJI2hlbHBDb250ZW50 cyB7CgkJZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJyxIZWx2ZXRpY2EsQXJpYWwsc2Fu cy1zZXJpZjsKCQlmb250LXNpemU6IDExcHg7CgkJbGluZS1oZWlnaHQ6MS40ZW07CgkJcGFk ZGluZzoxMHB4OwoJfQoJI2hlbHBDb250ZW50cyB1bCB7CgkJbGlzdC1zdHlsZTogc3F1YXJl OwoJfQoJI2hlbHBDb250ZW50cyBoMSxoMixoMyB7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJ Zm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJyxIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJp ZjsKCX0KCSNoZWxwQ29udGVudHMgaDEgewoJCW1hcmdpbi1ib3R0b206IDRweDsKCX0KCSNo ZWxwQ29udGVudHMgaDIgewoJCW1hcmdpbi10b3A6IDEwcHg7CgkJdGV4dC10cmFuc2Zvcm06 IHVwcGVyY2FzZTsKCX0KCSNoZWxwQ29udGVudHMgaDMgewoJCWZvbnQtc2l6ZTogMWVtOwoJ CW1hcmdpbi10b3A6IDEwcHg7CgkJbWFyZ2luLWxlZnQ6IDEwcHg7Cgl9CgkjaGVscENvbnRl bnRzIGxpIHsKCQltYXJnaW4tdG9wOiA0cHg7Cgl9CgkjaGVscENvbnRlbnRzIHAgewoJCWZv bnQtZmFtaWx5OiAnVHJlYnVjaGV0IE1TJyxIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsK CQlmb250LXNpemU6IDEuMWVtOwoJCW1hcmdpbi10b3A6IDEwcHg7CgkJbWFyZ2luLWxlZnQ6 IDIwcHg7Cgl9CgkjaGVscENvbnRlbnRzIHN0cm9uZywgI2hlbHBDb250ZW50cyBiIHsKCQlm b250LWZhbWlseTogJ1RyZWJ1Y2hldCBNUycsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7 CgkJZm9udC1zaXplOiAxZW07Cgl9CgkjaGVscENvbnRlbnRzIHVsLCAjaGVscENvbnRlbnRz IG9sIHsKCQltYXJnaW4tbGVmdDogMzBweDsKCX0KCSNoZWxwQ29udGVudHMgYmxvY2txdW90 ZSB7CgkJcGFkZGluZzogOHB4IDRweCA4cHggNHB4OwoJfQp9CkBtZWRpYSBzY3JlZW4gewoJ I2hlbHBDb250ZW50cyB7CgkJYmFja2dyb3VuZC1jb2xvcjogIzAwNWU3ZTsKCQlib3JkZXI6 IDFweCBkb3R0ZWQgIzAwNWU3ZTsKCQl3aWR0aDogNzAwcHg7CgkJY29sb3I6ICNjM2U5ZjY7 Cgl9CgkjaGVscENvbnRlbnRzIGEsICNoZWxwQ29udGVudHMgYS52aXNpdGVkIHsKCQljb2xv cjogIzQyYjNkNzsKCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJYm9yZGVyLWJvdHRvbTog MXB4IGRvdHRlZCAjNDJiM2Q3OwoJfQoJI2hlbHBDb250ZW50cyBhW3RpdGxlPSdFeHRlcm5h bCBsaW5rJ10gewoJCWNvbG9yOiAjZGVlYmNkOwoJCWJvcmRlci1ib3R0b206IDFweCBkb3R0 ZWQgI2RlZWJjZDsKCX0KCSNoZWxwQ29udGVudHMgYTpob3ZlciB7CgkJY29sb3I6ICM2YmQ1 ZmE7CgkJYm9yZGVyLWJvdHRvbTogMDsKCX0KCSNoZWxwQ29udGVudHMgYWNyb255bSB7CgkJ Ym9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjYzNlOWY2OwoJCWN1cnNvcjogaGVscDsKCX0K CSNoZWxwQ29udGVudHMgY29kZSwgI2hlbHBDb250ZW50cyBibG9ja3F1b3RlIHsKCQliYWNr Z3JvdW5kLWNvbG9yOiAjNDJiM2Q3OwoJCXBhZGRpbmctbGVmdDogNHB4OwoJCXBhZGRpbmct cmlnaHQ6IDRweDsKCX0KCSNoZWxwQ29udGVudHMgYmxvY2txdW90ZSB7CgkJbWFyZ2luLXRv cDogMTBweDsKCQlwYWRkaW5nOiA0cHg7CgkJYm9yZGVyOiAxcHggZG90dGVkICMwMDVlN2U7 CgkJY29sb3I6ICMwMDVlN2U7Cgl9Cn0KQG1lZGlhIHByaW50IHsKCSNoZWxwQ29udGVudHMg ewoJCWJvcmRlcjogMXB4IGRvdHRlZCAjY2NjOwoJCWNvbG9yOiAjMDAwOwoJfQoJI2hlbHBD b250ZW50cyBhLCAjaGVscENvbnRlbnRzIGE6dmlzaXRlZCB7CgkJY29sb3I6ICMzMzM7Cgl9 CgkjaGVscENvbnRlbnRzIGRpdi5pbmRleCB1bCB7CgkJZGlzcGxheTogbm9uZTsKCX0KfQo8 L3N0eWxlPgo8ZGl2IGlkPSJoZWxwQ29udGVudHMiPgoKCgk8aDE+b2IxLWFkdmFuY2VkLXNl YXJjaCB2MS4wMzJiIFsyMDA3LTEwLTEzXTwvaDE+Cgo8ZGl2IGNsYXNzPSJpbmRleCI+CgoJ PHVsPgoJCTxsaT48YSBocmVmPSIjcGx1Z2luUmVhZFRoaXNGaXJzdCI+PHNwYW4gY2xhc3M9 ImNhcHMiPlJFQUQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5USElTPC9zcGFuPiA8c3Bh biBjbGFzcz0iY2FwcyI+RklSU1Q8L3NwYW4+PC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNw bHVnaW5TdW1tYXJ5Ij5TdW1tYXJ5PC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNwbHVnaW5B dHRyaWJ1dGVzIj5BdHRyaWJ1dGVzPC9hPgoJPHVsPgoJCTxsaT48YSBocmVmPSIjcGx1Z2lu QXR0cmlidXRlc0luaXQiPmluaXQ8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3BsdWdpbkF0 dHJpYnV0ZXNTZXQiPnNldDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjcGx1Z2luQXR0cmli dXRlc1ZhbHVlIj52YWx1ZTwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjcGx1Z2luQXR0cmli dXRlc1NldHVwIj5zZXR1cDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjcGx1Z2luQXR0cmli dXRlc1VuaW5zdGFsbCI+dW5pbnN0YWxsPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNwbHVn aW5BdHRyaWJ1dGVzT3V0cHV0Ij5vdXRwdXQ8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3Bs dWdpbkF0dHJpYnV0ZXNTZWFyY2hTdGF0dXMiPnNlYXJjaHN0YXR1czwvYT48L2xpPgoJCTxs aT48YSBocmVmPSIjcGx1Z2luQXR0cmlidXRlc1NlY3Rpb25zIj5zZWN0aW9uczwvYT48L2xp PgoJPC91bD48L2xpPgoJCTxsaT48YSBocmVmPSIjcGx1Z2luRXhhbXBsZXNBbmRDaGFuZ2VM b2ciPkV4YW1wbGVzICYjMzg7IGNoYW5nZSBsb2c8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0i aHR0cDovL3Jpc2UubGV3YW5kZXIuY29tLyIgdGl0bGU9IkV4dGVybmFsIGxpbmsiPkF1dGhv ciA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPjwvYT48L2xpPgoJCTxsaT48YSBocmVm PSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9NDc3NiIg dGl0bGU9IkV4dGVybmFsIGxpbmsiPjxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IGZv cnVtIHRocmVhZDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSJodHRwOi8vcmlzZS5sZXdhbmRl ci5jb20vdGV4dHBhdHRlcm4vb2IxLWFkdmFuY2VkLXNlYXJjaCIgdGl0bGU9IkV4dGVybmFs IGxpbmsiPlBsdWdpbiA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPjwvYT48L2xpPgoJ CTxsaT48YSBocmVmPSJodHRwOi8vcmlzZS5sZXdhbmRlci5jb20vZmlsZXMvcGRmL29iMS1h ZHZhbmNlZC1zZWFyY2gtbWFudWFsLTEwMDAtMi0xLjAzYi5wZGYiIHRpdGxlPSJFeHRlcm5h bCBsaW5rIj5QbHVnaW4gbWFudWFsPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9j cmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8iIHRpdGxlPSJFeHRlcm5h bCBsaW5rIj5MaWNlbnNlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+PC9hPjwvbGk+ Cgk8L3VsPgoKPC9kaXY+CgoJPGgyIGlkPSJwbHVnaW5SZWFkVGhpc0ZpcnN0Ij48c3BhbiBj bGFzcz0iY2FwcyI+UkVBRDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNhcHMiPlRISVM8L3NwYW4+ IDxzcGFuIGNsYXNzPSJjYXBzIj5GSVJTVDwvc3Bhbj48L2gyPgoKCTxwPlRoaXMgcGx1Z2lu IGlzIHF1aXRlIGFkdmFuY2VkIGFuZCBzb21lIHBhcnRzIG9mIGl0IGNhbiBwcm9iYWJseSBi ZSB0d2Vha2VkIGV2ZW4gZnVydGhlci4gVGhlcmVmb3IsIHVzaW5nIHRoaXMgcGx1Z2luIG1p Z2h0IGNhdXNlIHlvdXIgd2Vic2l0ZXMgc2VhcmNoIHRvIGZlZWwgc2xvd2VyLCBtaWdodCB1 c2UgdXAgYSBsb3Qgb2YgdGhlIHNlcnZlcnMgbWVtb3J5IGFuZCB3aWxsIGluY3JlYXNlIHRo ZSBzaXplIG9mIHlvdXIgZGF0YWJhc2UgaWYgeW91IG1ha2Ugb3RoZXIgZmllbGRzIHRoZW4g dGhlIHN0YW5kYXJkIGJvZHkgYW5kIHRpdGxlIHNlYXJjaGFibGUuIEluIHRoZSByZWxlYXNl IHZlcnNpb24gaXQgaXMgc2V0IHRvIHNlYXJjaCBUaXRsZSwgQm9keSwgRXhjZXJwdCwgQ3Vz dG9tMSBhbmQgQ3VzdG9tMi4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoaXMgZWl0aGVyIGVk aXQgdGhlIHBsdWdpbiBjb2RlIG9yIGNoYW5nZSB0aGUgdmFsdWVzIHVzaW5nIHRoZSA8YSBo cmVmPSIjcGx1Z2luQXR0cmlidXRlc1NldCI+c2V0PC9hPiBhbmQgPGEgaHJlZj0icGx1Z2lu QXR0cmlidXRlc1ZhbHVlIj52YWx1ZTwvYT4gYXR0cmlidXRlcyBiZWZvcmUgcnVubmluZyA8 YSBocmVmPSIjcGx1Z2luQXR0cmlidXRlc1NldHVwIj5zZXR1cDwvYT4uPGJyIC8+Ckkgc3Ry b25nbHkgcmVjb21tZW5kIHRoYXQgeW91IHJlYWQgPGEgaHJlZj0iaHR0cDovL3Jpc2UubGV3 YW5kZXIuY29tL2ZpbGVzL3BkZi9vYjEtYWR2YW5jZWQtc2VhcmNoLW1hbnVhbC0xMDAwLTIt MS4wM2IucGRmIiB0aXRsZT0iRXh0ZXJuYWwgbGluayI+dGhlIG1hbnVhbDwvYT4gYmVmb3Jl IHlvdSBzdGFydCB1c2luZyB0aGUgcGx1Z2luLjwvcD4KCgk8aDIgaWQ9InBsdWdpblN1bW1h cnkiPlN1bW1hcnk8L2gyPgoKCTxwPlRoaXMgaXMgYSBvbGQgcGx1ZyBpbiBvZiBtaW5lIHRo YXQgbmV2ZXIgZ290IHByb3Blcmx5IHJlbGVhc2VkIGFuZCBicm9rZSB3aGVuIDxhY3Jvbnlt IHRpdGxlPSJUZXh0cGF0dGVybiI+PHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj48L2Fj cm9ueW0+IHdhcyBnb2luZyB0b3dhcmRzIGEgc3RhYmxlIHZlcnNpb24uIEZpcnN0IHJlbGVh c2VkIGluIDIwMDQtMTEtMTEgaXQgc3VyZSBoYXMgdGFrZW4gbWUgc29tZSB0aW1lIHRvIG1h a2UgaXQgcmVsZWFzZSByZWFkeS4gQW55aG93LCB0aGlzIHBsdWdpbiBhbGxvd3MgeW91IHRv IGxldCB5b3VyIHVzZXJzIHNlYXJjaCBpbiBwbGFjZXMgYW5kIHdheXMgdGhleSBkaWRuJiM4 MjE3O3Qga25vdyBleGlzdGVkLiBJZiB5b3UgYWxsb3cgdGhlbSB0aGF0IGlzLjwvcD4KCgk8 aDIgaWQ9InBsdWdpbkF0dHJpYnV0ZXMiPkF0dHJpYnV0ZXM8L2gyPgoKCTxoMyBpZD0icGx1 Z2luQXR0cmlidXRlc0luaXQiPmluaXQ8L2gzPgoKCTxwPkluaXRpYWxpemVzIHRoZSBwbHVn aW4gYW5kIHNldHMgdGhlIHByZWZlcmVuY2VzIGludG8gdGhlIGdsb2JhbCB2YXJpYWJsZSA8 Y29kZT4kcHJlZnM8L2NvZGU+LiBUaGUgPHN0cm9uZz5wbHVnaW4gYXV0by1pbml0aWFsaXpl czwvc3Ryb25nPiBieSBpdHNlbGYgc28geW91IGRvIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBv biB5b3VyIG93bi4gTWVhbmluZzogSG93ZXZlciB5b3UgY2FsbCB0aGUgcGx1Z2luIHRoZSBw bHVnaW4gd2lsbCBtYWtlIHN1cmUgdGhpcyBwcm9jZXNzIGlzIGRvbmUgZmlyc3Qgc2luY2Ug aXQgaXMgZXNzZW50aWFsLjwvcD4KCgk8aDMgaWQ9InBsdWdpbkF0dHJpYnV0ZXNTZXQiPnNl dDwvaDM+CgoJPHA+VXNlZCB0byBzZXQgbmV3IHZhbHVlcyB0byB0aGUgcHJlZmVyZW5jZXMg aW4gY29uanVuY3Rpb24gd2l0aCA8YSBocmVmPSIjcGx1Z2luQXR0cmlidXRlc1ZhbHVlIj52 YWx1ZTwvYT4uIFNldCA8c3Ryb25nPmRlZmluZXMgdGhlIG5hbWU8L3N0cm9uZz4gb2YgdGhl IHByZWZlcmVuY2VzIHRvIGNoYW5nZS4gVW5saWtlIG1vc3QgdGhpbmdzIGluIHRoaXMgcGx1 Z2luLCB0aGlzIGxpc3QgaXMgc2VtaS1jb2xvbiBzZXBhcmF0ZWQgKDspLjwvcD4KCgk8aDMg aWQ9InBsdWdpbkF0dHJpYnV0ZXNWYWx1ZSI+dmFsdWU8L2gzPgoKCTxwPlVzZWQgdG8gc2V0 IG5ldyB2YWx1ZXMgdG8gdGhlIHByZWZlcmVuY2VzIGluIGNvbmp1bmN0aW9uIHdpdGggPGEg aHJlZj0iI3BsdWdpbkF0dHJpYnV0ZXNTZXQiPnNldDwvYT4uIFZhbHVlIDxzdHJvbmc+ZGVm aW5lcyB0aGUgY29udGVudHM8L3N0cm9uZz4gb2YgdGhlIHByZWZlcmVuY2VzIHRvIGNoYW5n ZS4gVW5saWtlIG1vc3QgdGhpbmdzIGluIHRoaXMgcGx1Z2luLCB0aGlzIGxpc3QgaXMgc2Vt aS1jb2xvbiBzZXBhcmF0ZWQgKDspLjwvcD4KCgk8aDMgaWQ9InBsdWdpbkF0dHJpYnV0ZXNT ZXR1cCI+c2V0dXA8L2gzPgoKCTxwPkEgcG93ZXJjb21tYW5kIHlvdSBzaG91bGQsIGhvcGVm dWxseSwgb25seSBuZWVkIHRvIHJ1biBvbmNlLiA8c3Ryb25nPkJlZm9yZSB1c2luZyB0aGlz LCBwbGVhc2UgcmVhZCA8YSBocmVmPSJodHRwOi8vcmlzZS5sZXdhbmRlci5jb20vZmlsZXMv cGRmL29iMS1hZHZhbmNlZC1zZWFyY2gtbWFudWFsLTEwMDAtMi0xLjAzYi5wZGYiIHRpdGxl PSJFeHRlcm5hbCBsaW5rIj50aGUgbWFudWFsPC9hPiBjYXJlZnVsbHk8L3N0cm9uZz4gcmVn YXJkaW5nIHRoZSBzZXR1cCBwcm9jZXNzLjwvcD4KCgk8aDMgaWQ9InBsdWdpbkF0dHJpYnV0 ZXNVbmluc3RhbGwiPnVuaW5zdGFsbDwvaDM+CgoJPHA+VGhpcyB3ZWxsIDxzdHJvbmc+cmVt b3ZlIGFueSBpbmRleCBpbiB0aGUgZGF0YWJhc2U8L3N0cm9uZz4gdGhhdCB0aGUgcGx1Z2lu IG1pZ2h0IGhhdmUgY3JlYXRlZCAoYWxsIHN0YXJ0aW5nIHdpdGggPGNvZGU+c2VhcmNoaW5n XzwvY29kZT4pLiBUaGUgZm9ybXMsIHBhZ2VzIGFuZCA8YWNyb255bSB0aXRsZT0iQ2FzY2Fk aW5nIFN0eWxlIFNoZWV0cyI+PHNwYW4gY2xhc3M9ImNhcHMiPkNTUzwvc3Bhbj48L2Fjcm9u eW0+IHlvdSB3aWxsIGhhdmUgdG8gcmVtb3ZlIGJ5IGhhbmQuPC9wPgoKCTxoMyBpZD0icGx1 Z2luQXR0cmlidXRlc091dHB1dCI+b3V0cHV0PC9oMz4KCgk8cD5BdHRyaWJ1dGUgbW9zdGx5 IHVzZWQgYnkgdGhlIHBsdWdpbiBpdHNlbGYuIEl0JiM4MjE3O3MgdXNlIGlzIHRoYXQgPHN0 cm9uZz5pdCBjYWxscyBhbnkgb2YgdGhlIGZvdXIgZGVmaW5lZCBmb3JtcyBpbiB0aGUgcHJl ZmVyZW5jZXM8L3N0cm9uZz4gYnkgbmFtZSBhbmQgYWx0ZXJzIHRoZW0gYWNjb3JkaW5nbHkg YmVmb3JlIG91dHB1dHRpbmcgdGhlbSB0byB0aGUgdXNlci48L3A+CgoJPGgzIGlkPSJwbHVn aW5BdHRyaWJ1dGVzU2VhcmNoU3RhdHVzIj5zZWFyY2hzdGF0dXM8L2gzPgoKCTxwPlNldHMg d2hhdCBhcnRpY2xlc3RhdHVzJiM4MjE3OyB0byBzZWFyY2ggKGNvbW1hLXNlcGFyYXRlZCku IFRoZSA8c3Ryb25nPnN0YXR1cyYjODIxNzsgYXZhaWxhYmxlPC9zdHJvbmc+IGFyZSB0aGUg b25lcyB1c2VkIGluIDxhY3JvbnltIHRpdGxlPSJUZXh0cGF0dGVybiI+PHNwYW4gY2xhc3M9 ImNhcHMiPlRYUDwvc3Bhbj48L2Fjcm9ueW0+OjwvcD4KCgk8b2w+CgkJPGxpPkRyYWZ0PC9s aT4KCQk8bGk+SGlkZGVuPC9saT4KCQk8bGk+UGVuZGluZzwvbGk+CgkJPGxpPkxpdmU8L2xp PgoJCTxsaT5TdGlja3k8L2xpPgoJPC9vbD4KCgk8aDMgaWQ9InBsdWdpbkF0dHJpYnV0ZXNT ZWN0aW9ucyI+c2VjdGlvbnM8L2gzPgoKCTxwPlNldHMgPHN0cm9uZz53aGF0IHNlY3Rpb25z JiM4MjE3OyB0byBzZWFyY2g8L3N0cm9uZz4gKGNvbW1hLXNlcGFyYXRlZCkuIFVzZXMgdGhl IG5hbWUsIG5vdCB0aGUgdGl0bGUgZGVmaW5lZCBpbiA8YWNyb255bSB0aXRsZT0iVGV4dHBh dHRlcm4iPjxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+PC9hY3JvbnltPi48L3A+CgoJ PGgyIGlkPSJwbHVnaW5FeGFtcGxlc0FuZENoYW5nZUxvZyI+RXhhbXBsZXMgJiMzODsgY2hh bmdlIGxvZzwvaDI+CgoJPHA+QSBzZXR1cCBleGFtcGxlIGlzIGF2YWlsYWJsZSBpbiA8YSBo cmVmPSJodHRwOi8vcmlzZS5sZXdhbmRlci5jb20vZmlsZXMvcGRmL29iMS1hZHZhbmNlZC1z ZWFyY2gtbWFudWFsLTEwMDAtMi0xLjAzYi5wZGYiIHRpdGxlPSJFeHRlcm5hbCBsaW5rIj50 aGUgbWFudWFsPC9hPi4gVGhlIGNoYW5nZSBsb2cgaXMgYWxzbyBtb3ZlZCB0byA8YSBocmVm PSJodHRwOi8vcmlzZS5sZXdhbmRlci5jb20vZmlsZXMvcGRmL29iMS1hZHZhbmNlZC1zZWFy Y2gtbWFudWFsLTEwMDAtMi0xLjAzYi5wZGYiIHRpdGxlPSJFeHRlcm5hbCBsaW5rIj50aGUg bWFudWFsPC9hPiAodGhhdCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCBlYWNoIHJlbGVhc2UpLjwv cD4KCjwvZGl2PiI7czo0OiJjb2RlIjtzOjQzMzA4OiIJLyoKCQlQbHVnaW46IG9iMV9hZHZh bmNlZF9zZWFyY2gKCQlVUkw6IGh0dHA6Ly9yaXNlLmxld2FuZGVyLmNvbS90ZXh0cGF0dGVy bi9vYjEtYWR2YW5jZWQtc2VhcmNoCgkJUmVsZWFzZWQgdW5kZXIgdGhlIENyZWF0aXZlIENv bW1vbnMgQXR0cmlidXRpb24tU2hhcmUgQWxpa2UgMy4wIFVucG9ydGVkLCBodHRwOi8vY3Jl YXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAvCgkqLwoKCWZ1bmN0aW9uIG9i MV9hZHZhbmNlZF9zZWFyY2goJGF0dHMpIHsKCQlnbG9iYWwgJHEsJHByZWZzLCRwcmV0ZXh0 LCRwcm9kdWN0aW9uX3N0YXR1cywkcGZyLCR0eHBjZmcsJHBnLCR0ZXh0YXJyYXksJHRoaXNw YWdlLCR0aGlzYXJ0aWNsZSwkaGFzX2FydGljbGVfdGFnLCRvYjFBU0Vycm9yOwoJCSRoYXNf YXJ0aWNsZV90YWcgPSB0cnVlOyAjIG5lZWRlZCB0byB0ZWxsIFRYUCB0aGF0IHRoaXMgaXMg YW4gJ2FydGljbGUnIHRhZywgb3RoZXJ3aXNlIGl0IHdpbGwgb3V0cHV0IGVycm9ycwoJCWV4 dHJhY3QoJHByZXRleHQpOwoJCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJCSJzZWFyY2hzdGF0 dXMiPT4iNCIsICMgc3RhdHVzJyB0byBzZWFyY2g7IDEgPSBkcmFmdCwgMiA9IGhpZGRlbiwg MyA9IHBlbmRpbmcsIDQgPSBsaXZlLCA1ID0gc3RpY2t5IChjb21tYS1zZXBhcmF0ZWQpCgkJ CSJzZWN0aW9ucyI9PiIiLCAjIHdoYXQgc2VjdGlvbnMgdG8gc2VhcmNoLCBpZiBub3QgZGVm aW5lZCB3aWxsIHVzZSB0aGUgb25lcyBkZWZpbmVkIGluIFRYUAoJCQkic2V0Ij0+IiIsICMg bGlua2VkIHdpdGggdmFsdWUsIHVzZWQgdG8gY2hhbmdlIHByZWZzCgkJCSJ2YWx1ZSI9PiIi LCAjIGxpbmtlZCB3aXRoIHNldCwgc2VlIGFib3ZlCgkJCSJpbml0Ij0+IiIsICMgTk9URTog c2hvdWxkIG5ldmVyIGhhdmUgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyIHNpbmNlIHBsdWdp biBhdXRvLWluaXRpYWxpemVzCgkJCSJvdXRwdXQiPT4iIiwgIyBmb3JtcyBhbGxvd2VkIHNw ZWNpZmllZCBpbiB0aGUgcHJlZnMgdW5kZXIgZm9ybXMsIHNlZSBiZWxvdwoJCQkic2V0dXAi PT4iIiwKCQkJInVuaW5zdGFsbCI9PiIiICNyZW1vdmVzIHRoZSBpbmRleGVzIGNyZWF0ZWQg YnkgdGhlIHNldHVwIHByb2Nlc3MgKG5vdCB0aGUgZm9ybXMsIHBhZ2VzIG5vciBjc3MgdGhv dWdoISkKCQkpLCRhdHRzKSk7CgoJCSRpc0RldiA9ICggQCRwcm9kdWN0aW9uX3N0YXR1cyA9 PSAnZGVidWcnIG9yIEAkcHJvZHVjdGlvbl9zdGF0dXMgPT0gJ3Rlc3RpbmcnICkgPyB0cnVl IDogZmFsc2U7ICMgdmFyIGluc3RlYWQgcmUtY2hlY2sgdGhpcyBpbnN0ZWFkIG9mIHRoZSBw cm9kc3RhdHVzCgoJCSRhcnJZZXMgPSBhcnJheSggInllcyIsICJ5IiwgIjEiLCAiamEiLCAi b3VpIiwgImphd29obCIsICJzaSIsIHRydWUsIDEgKTsgIyBqdXN0IGFuIGFycmF5IHRvIHNl ZSB3aGF0IGlzIGFsbG93ZWQgInllcyIgdmFsdWVzIHRvIGluaXQgYW5kIHNldHVwIGF0dHJp YnV0ZXMKCgkJIyBpIHdvbid0IGFsbG93IGl0IHRvIGJlIGNhbGxlZCBmcm9tIGFuIGFydGlj bGUgZm9ybSwgbm8gc2lyCgkJaWYoJHRoaXNhcnRpY2xlIT1OVUxMIG9yICFlbXB0eSgkdGhp c2FydGljbGUpKXsKCQkJdHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2g6IEZhaWxl ZC4gUmVhc29uOiBUaGlzIHBsdWdpbiBtYXkgbm90IGJlIGNhbGxlZCB3aXRoaW4gYW4gYXJ0 aWNsZSBiZWFjdXNlIG9mIHNlY3VyaXR5LXJlYXNvbnNdIiApOwoJCQlyZXR1cm4gZmFsc2U7 CgkJfQoKCQkjIGluaXRpYWxpemUgdmFycyBpZiBub3QgeWV0IGRvbmUKCQlpZiggZW1wdHko ICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdICkgYW5kICFpbl9hcnJheSggJGluaXQs ICRhcnJZZXMgKSApewoJCQlvYjFfYWR2YW5jZWRfc2VhcmNoKCBhcnJheSggImluaXQiID0+ ICIxIiApICk7CgkJCSMgbm8gcmV0dXJuIHNpbmNlIGl0IHNob3VsZCBhbHNvIGRvIHdoYXQg aXQgd2FzIHN1cHBvc2VkIHRvIGRvCgkJfQoJLyoKCgkJMS4wIFBMVUdJTiBJTklUSUFMSVpF CgoJKi8KCQkjIGluaXRpYWxpemUgdGhlIHBsdWdpbiBhbmQgc2V0IGRlZmF1bHQgcHJlZnMg aW50byB0aGUgZ2xvYmFsICRwcmVmcyBhcnJheSwgb3ZlcndyaXRpbmcgYW55IGN1cnJlbnRs eSBzZXQgdmFsdWUgKHNlZSBzZXQgYmVsb3cpCgkJaWYoIGluX2FycmF5KCAkaW5pdCwgJGFy clllcyApICl7CgkvKgoKCQkxLjEgQUREIFBSRUZFUkVOQ0VTCgoJKi8KCQkJIyBlaXRoZXIg eW91IGVkaXQgdGhpcyBvbmUgaW4gdGhlIGNvZGUgb3IgeW91IHVzZSB0aGUgc2V0IGFuZCB2 YWx1ZSB0byBjaGFuZ2UgdGhlIHZhbHVlcyB0aHJvdWdoIHRoZSBwYWdlCgkJCSRwcmVmc1sg Im9iMUFkdmFuY2VkU2VhcmNoIiBdID0gYXJyYXkoCgkJCQkiYWxsb3dlZF91c2FnZSI9PiJy ZXN1bHRzX3Blcl9wYWdlLHdvcmRzLHdpdGhvdXRfd29yZHMsb2NjdXJyZW5jZXMsZmlyc3Rf c2VlbixkYXRlX2JldHdlZW4sZGF0ZV9mdXR1cmUiLCAjIGRlZmluZXMgd2hhdCB0aGUgdXNl ciBtYXkgdXNlIGZvciB0eXBlcyBvZiBzZWFyY2hlcywgcmVtb3ZlIHdoYXRldmVyIHlvdSB3 aXNoIG5vdCB0byBiZSB1c2VkLiBOT1RFOiB3aWxsIG9ubHkgcmVtb3ZlIGlucHV0cy9zZWxl Y3RzIG5vdCBhbnkgdGV4dCBpbiB0aGUgZm9ybXMhIHdvcmRzZWFyY2hlcyBpcyBkZWZpbmVk IGluIHRoZSBuZXh0CgkJCQkiYWxsb3dlZF93b3Jkc191c2FnZSI9PiJhbGxfd29yZHMsZXhh Y3RfcGhyYXNlLGF0X2xlYXN0X29uZV93b3JkIiwgIyBOT1RFOiBJIGRvIG5vdCByZWNvbW1l bmQgcmVtb3ZpbmcgYWxsX3dvcmRzIQoJCQkJImFsbG93ZWRfd29yZHNfdXNhZ2VfbmFtZSI9 PiJ3aXRoIGFsbCB0aGUgd29yZHMsd2l0aCB0aGUgZXhhY3QgcGhyYXNlLHdpdGggYXQgbGVh c3Qgb25lIG9mIHRoZSB3b3JkcyIsICMgbmFtZSB0aGUgYWJvdmUgdXNlcwoJCQkJImZpcnN0 X3NlZW4iPT4iKiwxMDA4MCwyMDE2MCw0NDY0MCwxMzM5MjAsMjY3ODQwLDUyNzA0MCIsICMg bWludXRlcyBwYXNzZWQsIGV4IHdlZWs6IDcgKiAyNCAqIDYwID0gMTAwODAKCQkJCSJmaXJz dF9zZWVuX25hbWUiPT4iYW55dGltZSxwYXN0IHdlZWsscGFzdCB0d28gd2Vla3MscGFzdCBt b250aCxwYXN0IHRocmVlIG1vbnRocyxwYXN0IHNpeCBtb250aHMscGFzdCB5ZWFyIiwgIyBu YW1lIHRoZSBhYm92ZSB1c2VzCgkJCQkib2NjdXJyZW5jZXMiPT4iKixUaXRsZSxCb2R5LEV4 Y2VycHQsJWN1c3RvbSIsICMgJWN1c3RvbSBwb2ludHMgdG8gdGhlIG5hbWVzIG9mIHRoZSBj dXN0b21maWVsZHMgeW91IHNlYXJjaCwgZGVmaW5lZCBpbiBzZWFyY2hfY3VzdG9tCgkJCQki b2NjdXJyZW5jZXNfbmFtZSI9PiJhbnl3aGVyZSBpbiB0aGUgYXJ0aWNsZSxpbiB0aGUgdGl0 bGUgb2YgdGhlIGFydGljbGUsaW4gdGhlIHRleHQgb2YgdGhlIGFydGljbGUsaW4gdGhlIGV4 Y2VycHQgb2YgdGhlIGFydGljbGUsaW4gdGhlICVjdXN0b21uYW1lIG9mIHRoZSBhcnRpY2xl IiwgIyAlY3VzdG9tbmFtZSBwb2ludHMgdG8gdGhlIG5hbWVzIHNldCB0byB0aGUgb25lcyBp biB0aGUgYWRtaW4gcGFydCBvZiBUWFAuIHdpbGwgbG9vcCBpZiBtb3JlIHRoZW4gb25lIGZp ZWxkIGRlZmluZWQgaW4gc2VhcmNoX2N1c3RvbQoJCQkJInJlc3VsdHMiPT4iIHJlc3VsdHMi LCAjIHVzZWQgaW4gY3JlYXRpbmcgdGhlIHJlc3VsdHMvcGFnZSBzZWxlY3QuIE5PVEU6IFRo ZSBkZWZhdWx0IHNwYWNlIGlzIGludGVuZGVkIQoJCQkJInJlc3VsdHNfcGVyX3BhZ2UiPT4i MTAsMjAsNTAsMTAwIiwgIyB1c2VkIGluIGNyZWF0aW5nIHRoZSByZXN1bHRzL3BhZ2Ugc2Vs ZWN0IGFuZCBsYXRlciBmb3IgY2hlY2tpbmcgaWYgcmVzdWx0cyBpcyBhbGxvd2VkCgkJCQki cmVzdWx0c19jb29raWUiPT4iMSIsICMgaWYgdGhlIHJlc3VsdHMvcGFnZSBzaG91bGQgYmUg c2V0IGluIGEgY29va2llIG9yIG5vdAoJCQkJImZvcm1zIj0+Im9iMV9zZWFyY2hfYWR2YW5j ZWRfZm9ybSxvYjFfc2VhcmNoX2FkdmFuY2VkX2hlYWRlcixvYjFfc2VhcmNoX2Zvcm0sc2Vh cmNoX3Jlc3VsdHMsb2IxX3NlYXJjaF9lcnJvciIsICMgMSBkZWZhdWx0IHNlYXJjaCBmb3Jt LCAyIHNlYXJjaCByZXN1bHRzIGhlYWRlciwgMyBzbWFsbCBzZWFyY2ggZm9ybSwgNCBzZWFy Y2ggcmVzdWx0cwoJCQkJInNlYXJjaF9zZWN0aW9uIj0+InNlYXJjaCxTZWFyY2giLCAjIHVz ZWQgaW4gc2V0dXAsIGZpcnN0IGlzIHNlY3Rpb24gdXJsbmFtZSwgc2Vjb25kIGlzIHRoZSB0 aXRsZSAoY29tbWEtc2VwYXJhdGVkKQoJCQkJInNlYXJjaF9jdXN0b20iPT4iMSwyIiwgIyBv bmx5IHVzZSB0aGUgbnVtYmVycyAoMS0xMCkgb2YgdGhlIGZpZWxkcywgTk9UIHRoZSBuYW1l cyEgKGNvbW1hLXNlcGFyYXRlZCksIGJsYW5rIGlmIG5vIGN1c3RvbSBmaWVsZHMgc2hvdWxk IGJlIHNlYXJjaGVkCgkJCQkic2hvd19zZWFyY2hfZm9ybSI9PiJlbXB0eSxub19yZXN1bHRz LGFmdGVyX3Jlc3VsdHMiLCAjIGFsbG93ZWQgdmFsdWVzOiBlbXB0eSxub19yZXN1bHRzLGFm dGVyX3Jlc3VsdHMsYmVmb3JlX3Jlc3VsdHMKCQkJCSJzZXR1cCI9PiJpbmRleCxzZWN0aW9u LGZvcm1zLGNzcyIsICMgd2hhdCB0aGUgc2V0dXAgc2hvdWxkIGNoZWNrIChjb21tYS1zZXBh cmF0ZWQpCgkJCQkjIGJlbG93IGFyZSB0aGUgZGVmYXVsdCBlcnJvcm1lc3NhZ2VzIG91dHB1 dCwgZWl0aGVyIGNoYW5nZSBoZXJlIG9yIHRocm91Z2ggc2V0L3ZhbHVlCgkJCQkiZXJyb3Jf c2VhcmNoX3Nob3J0Ij0+IlNlYXJjaHN0cmluZyB0b28gc2hvcnQgKGF0bGVhc3QgdHdvIGNo YXJzIG5lZWRlZCkgb3Igbm8gZGF0ZSBzZWFyY2ggc3BlY2llZC4iLAoJCQkJImVycm9yX2Rh dGVfbGFyZ2VyIj0+IkVuZCBkYXRlIGxhcmdlciB0aGVuIHN0YXJ0IGRhdGUiLAoJCQkJImVy cm9yX2RhdGVfZnV0dXJlIj0+IkRhdGVzIHVzZWQgaW4gYmV0d2VlbiBpcyBmdXR1cmUgZGF0 ZXMgd2hpY2ggaXMgbm90IGFsbG93ZWQuIgoJCQkpOwoJLyoKCgkJMS4yIElOSVRJQUxJWkUg T1VUUFVUIChERUJVRyBPUiBURVNUSU5HKQoKCSovCgkJCSMgb3V0cHV0IGluIGRlYnVnIG9y IHRlc3RpbmcgaWYgdGhlIGluaXQgZmFpbGVkIG9yIHdlbnQgc21vb3RobHkKCQkJaWYoICRp c0RldiApewoJCQkJaWYoIGVtcHR5KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIgXSAp ICl7CgkJCQkJZG1wKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggaW5pdGlhbGl6ZTogRmFpbGVk XSIgKTsgIyBpZiB0aGlzIGZhaWxzLCBub3RoaW5nIGVsc2UgY2FuIHJlYWxseSBiZSBkb25l CgkJCQkJdHJpZ2dlcl9lcnJvciggIlBIUCBjYW4gbm90IHNldCBuZXcgdmFsdWVzIGludG8g dGhlICRwcmVmcyBnbG9iYWwgdmFyaWFibGUuIElmIHRoaXMgaGFwcGVucywgc29tZXRoaW5n IGlzIHNlcmlvdXNseSB3cm9uZyBvbiB5b3VyIGluc3RhbGxhdGlvbi4iLCBFX1VTRVJfRVJS T1IgKTsKCQkJCQlkaWUoKTsKCQkJCX1lbHNlewoJCQkJCSRhcnJTZXR1cCA9IGRvX2xpc3Qo ICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdWyAic2V0dXAiIF0sICIsIiApOwoJCQkJ CSRhcnJGb3JtcyA9IGRvX2xpc3QoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdWyAi Zm9ybXMiIF0sICIsIiApOwoJCQkJCSRhcnJTZWN0aW9uID0gZG9fbGlzdCggJHByZWZzWyAi b2IxQWR2YW5jZWRTZWFyY2giIF1bICJzZWFyY2hfc2VjdGlvbiIgXSwgIiwiICk7CgkJCQkJ aWYoIGZldGNoKCAnbmFtZScsJ3R4cF9zZWN0aW9uJywnbmFtZScsZG9TbGFzaCgkYXJyU2Vj dGlvblswXSkgKSA9PSBmYWxzZSBhbmQgaW5fYXJyYXkoICJzZWN0aW9uIiwgJGFyclNldHVw ICkgKSB7CgkJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIGluaXRpYWxp emU6IEZhaWxlZC4gUmVhc29uOiBNaXNzaW5nIHNlY3Rpb24gJyRhcnJTZWN0aW9uWzBdJy4g UGxlYXNlIHJ1biBzZXR1cF0iICk7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJaWYoIHNh ZmVfcm93KCdGb3JtJywgJ3R4cF9mb3JtJywibmFtZT0nIi5kb1NsYXNoKCRhcnJGb3Jtc1sw XSkuIiciKSA9PSBmYWxzZSBhbmQgaW5fYXJyYXkoICJmb3JtcyIsICRhcnJTZXR1cCApICAp IHsKCQkJCQkJdHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggaW5pdGlhbGl6ZTog RmFpbGVkLiBSZWFzb246IE1pc3NpbmcgZm9ybSAnJGFyckZvcm1zWzBdJy4gUGxlYXNlIHJ1 biBzZXR1cF0iICk7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJaWYoIHNhZmVfcm93KCdG b3JtJywgJ3R4cF9mb3JtJywibmFtZT0nIi5kb1NsYXNoKCRhcnJGb3Jtc1sxXSkuIiciKSA9 PSBmYWxzZSBhbmQgaW5fYXJyYXkoICJmb3JtcyIsICRhcnJTZXR1cCApICApIHsKCQkJCQkJ dHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggaW5pdGlhbGl6ZTogRmFpbGVkLiBS ZWFzb246IE1pc3NpbmcgZm9ybSAnJGFyckZvcm1zWzFdJy4gUGxlYXNlIHJ1biBzZXR1cF0i ICk7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJaWYoIHNhZmVfcm93KCdGb3JtJywgJ3R4 cF9mb3JtJywibmFtZT0nIi5kb1NsYXNoKCRhcnJGb3Jtc1syXSkuIiciKSA9PSBmYWxzZSBh bmQgaW5fYXJyYXkoICJmb3JtcyIsICRhcnJTZXR1cCApICApIHsKCQkJCQkJdHJhY2VfYWRk KCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggaW5pdGlhbGl6ZTogRmFpbGVkLiBSZWFzb246IE1p c3NpbmcgZm9ybSAnJGFyckZvcm1zWzJdJy4gUGxlYXNlIHJ1biBzZXR1cF0iICk7CgkJCQkJ CXJldHVybjsKCQkJCQl9CgkJCQkJaWYoIHNhZmVfcm93KCdGb3JtJywgJ3R4cF9mb3JtJywi bmFtZT0nIi5kb1NsYXNoKCRhcnJGb3Jtc1szXSkuIiciKSA9PSBmYWxzZSBhbmQgaW5fYXJy YXkoICJmb3JtcyIsICRhcnJTZXR1cCApICApIHsKCQkJCQkJdHJhY2VfYWRkKCAiW29iMV9h ZHZhbmNlZF9zZWFyY2ggaW5pdGlhbGl6ZTogRmFpbGVkLiBSZWFzb246IE1pc3NpbmcgZm9y bSAnJGFyckZvcm1zWzNdJy4gUGxlYXNlIHJ1biBzZXR1cF0iICk7CgkJCQkJCXJldHVybjsK CQkJCQl9CgkJCQkJdHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggaW5pdGlhbGl6 ZTogT2tdIiApOwoJCQkJCXVuc2V0KCRhcnJTZXR1cCwkYXJyRm9ybXMsJGFyclNlY3Rpb24p OwoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJLyoKCgkJMi4wIFBMVUdJTiBTRVRVUAoKCSov CgkJIyBkbyB0aGUgc2V0dXAsIHN0YXJ0IHdpdGggYnJlYWtpbmcgdXAgdGhlIHByZWZlcmVu Y2VzIGludG8gYXJyYXlzCgkJfWVsc2UgaWYoIGluX2FycmF5KCAkc2V0dXAsICRhcnJZZXMg KSApewoJCQkkYXJyU2V0dXAgPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJj aCIgXVsgInNldHVwIiBdICk7CgkJCSRhcnJGb3JtcyA9IGRvX2xpc3QoICRwcmVmc1sgIm9i MUFkdmFuY2VkU2VhcmNoIiBdWyAiZm9ybXMiIF0gKTsKCQkJJGFyckN1c3RvbSA9IGRvX2xp c3QoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdWyAic2VhcmNoX2N1c3RvbSIgXSAp OwoJCQkkYXJyU2VjdGlvbiA9IGRvX2xpc3QoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNo IiBdWyAic2VhcmNoX3NlY3Rpb24iIF0gKTsKCQkJJGFyck9jY3VycmVuY2VzID0gZG9fbGlz dCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2giIF1bICJvY2N1cnJlbmNlcyIgXSApOwoJ LyoKCgkJMi4xIFNFVFVQIElOREVYRVMKCgkqLwoJCQkjIHNldHVwIHRoZSBpbmRleGVzIG5l ZWRlZAoJCQlpZiggaW5fYXJyYXkoICJpbmRleCIsICRhcnJTZXR1cCApICkgewoJCQkJJGFy cj1hcnJheSgpOyAjIGNvbnRhaW5zIGFsbCB0aGUgZmllbGRuYW1lcyB1c2VkIGluIHRoZSBp bmRleGVzCgkJCQlmb3JlYWNoKCRhcnJPY2N1cnJlbmNlcyBhcyAkdmFsKXsKCQkJCQlpZigk dmFsIT0iKiIgYW5kICR2YWwhPSIlY3VzdG9tIikgJGFycltdID0gJHZhbDsKCQkJCX0KCQkJ CWlmKCAhZW1wdHkoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdWyAic2VhcmNoX2N1 c3RvbSIgXSApICkgewoJCQkJCWZvcmVhY2goJGFyckN1c3RvbSBhcyAkdmFsKSB7ICRhcnJb XSA9ICJjdXN0b21fIi4kdmFsOyB9CgkJCQl9CgkJCQkjIHF1ZXJ5IGRhdGFiYXNlIGZvciBl eGlzdGluZyBpbmRleGVzCgkJCQkkcXVlcnkgPSAiU0hPVyBLRVlTIEZST00gIi5zYWZlX3Bm eCgndGV4dHBhdHRlcm4nKTsKCQkJCSRycyA9IHNhZmVfcXVlcnkoJHF1ZXJ5KTsKCQkJCXdo aWxlKCRpZHhMaXN0ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJzLE1ZU1FMX0FTU09DKSkgQCRh cnJJZHhbXSA9IGFycmF5KCAna2V5JyA9PiAkaWR4TGlzdFsiS2V5X25hbWUiXSwndHlwZScg PT4gJGlkeExpc3RbIkluZGV4X3R5cGUiXSwnY29sdW1uJyA9PiAkaWR4TGlzdFsiQ29sdW1u X25hbWUiXSApOyAjIGdldCB0aGUgY3VycmVudCBpbmRleGVzIG9mIHRoZSB0YWJsZQoJCQkJ dW5zZXQoJGlkeExpc3QpOwoJCQkJZm9yZWFjaCgkYXJySWR4IGFzICRpZHgpewoJCQkJCWlm KCRpZHhbInR5cGUiXT09IkZVTExURVhUIil7CgkJCQkJCWZvcmVhY2goJGFyciBhcyAkdHlw ZSl7CgkJCQkJCQlAJCR0eXBlID0gKGluX2FycmF5KCAic2VhcmNoaW5nXyIuc3RydG9sb3dl cigkdHlwZSksICRpZHgpIG9yIEAkJHR5cGUpID8gMSA6IDA7ICMgY2hlY2sgaWYgaW5kZXhl cyBleGlzdHMgYW5kIHNldCBkeW5hbWljIHZhciB0byB0cnVlL2ZhbHNlCgkJCQkJCX0KCQkJ CQl9CgkJCQl9CgkJCQl1bnNldCgkYXJySWR4KTsKCQkJCWZvcmVhY2goJGFyciBhcyAkdHlw ZSl7CgkJCQkJaWYoJCR0eXBlPT0wKXsgIyBhZGQgaW5kZXggaWYgbm90IGZvdW5kIGJlZm9y ZQoJCQkJCQkkcSA9ICJBTFRFUiBUQUJMRSAiLnNhZmVfcGZ4KCd0ZXh0cGF0dGVybicpLiIg QUREIEZVTExURVhUIGBzZWFyY2hpbmdfIi5zdHJ0b2xvd2VyKCR0eXBlKS4iYCAoYCIuJHR5 cGUuImApIjsKCQkJCQkJJHJzID0gc2FmZV9xdWVyeSgkcSk7CgkJCQkJCXRyYWNlX2FkZCgg IltvYjFfYWR2YW5jZWRfc2VhcmNoICdzZWFyY2hpbmdfIi5zdHJ0b2xvd2VyKCR0eXBlKS4i JyBpbmRleDogQ3JlYXRlZF0iICk7CgkJCQkJfWVsc2V7CgkJCQkJCXRyYWNlX2FkZCggIltv YjFfYWR2YW5jZWRfc2VhcmNoICdzZWFyY2hpbmdfIi5zdHJ0b2xvd2VyKCR0eXBlKS4iJyBp bmRleDogRXhpc3RzXSIgKTsKCQkJCQl9CgkJCQl9CgkJCQkjIGdldCB0aGUgdG90YWwgaW5k ZXggYW5kIGNoZWNrIGl0IGlmIGl0cyBjb3JyZWN0IHdpdGggdGhlIGN1cnJlbnQgc2V0dGlu Z3MKCQkJCSRxdWVyeSA9ICJTSE9XIEtFWVMgRlJPTSAiLnNhZmVfcGZ4KCd0ZXh0cGF0dGVy bicpOwoJCQkJJHJzID0gZ2V0Um93cygkcXVlcnkpOwoJCQkJJGFyckZvdW5kID0gYXJyYXko KTsKCQkJCWZvcmVhY2goJHJzIGFzICR2YWwpIHsKCQkJCQlpZihpbl9hcnJheSgnc2VhcmNo aW5nX3RvdGFsJywkdmFsKSkKCQkJCQkJQCRhcnJGb3VuZFtdID0gJHZhbFsnQ29sdW1uX25h bWUnXTsKCQkJCX0KCQkJCSRhcnJEaWZmID0gYXJyYXlfZGlmZigkYXJyLCRhcnJGb3VuZCk7 CgkJCQlpZighZW1wdHkoJGFyckRpZmYpKXsKCQkJCQlpZighZW1wdHkoJGFyckZvdW5kKSl7 ICMgaWYgdGhlIGluZGV4IGV4aXN0cyBhbmQgaXMgZ29pbmcgdG8gYmUgY2hhbmdlZCwgcmVt b3ZlIGl0IHNvIHdlIGNhbiBhZGQgdGhlIG5ldyB2ZXJzaW9uIG9mIGl0CgkJCQkJCSRxdWVy eSA9ICJBTFRFUiBUQUJMRSAiLnNhZmVfcGZ4KCd0ZXh0cGF0dGVybicpLiIgRFJPUCBJTkRF WCBgc2VhcmNoaW5nX3RvdGFsYCI7CgkJCQkJCSRycyA9IHNhZmVfcXVlcnkoJHF1ZXJ5KTsK CQkJCQl9CgkJCQkJJHF1ZXJ5ID0gIkFMVEVSIFRBQkxFICIuc2FmZV9wZngoJ3RleHRwYXR0 ZXJuJykuIiBBREQgRlVMTFRFWFQgYHNlYXJjaGluZ190b3RhbGAgKCI7CgkJCQkJJG91dD1h cnJheSgpOwoJCQkJCWZvcigkaj0wOyRqPGNvdW50KCRhcnIpOyRqKyspewoJCQkJCQkkb3V0 W10gPSAiYCIuJGFyclskal0uImAiOwoJCQkJCX0KCQkJCQkkcXVlcnk9JHF1ZXJ5LmpvaW4o IiwgIiwkb3V0KS4iKSI7CgkJCQkJJHJzID0gc2FmZV9xdWVyeSgkcXVlcnkpOwoJCQkJCXRy YWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoICdzZWFyY2hpbmdfdG90YWwnIGluZGV4 OiBBbHRlcmVkXSIgKTsKCQkJCX1lbHNlewoJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5j ZWRfc2VhcmNoICdzZWFyY2hpbmdfdG90YWwnIGluZGV4OiBFeGlzdHNdIiApOwoJCQkJfQoJ CQkJJHF1ZXJ5PSJPUFRJTUlaRSBUQUJMRSAiLnNhZmVfcGZ4KCd0ZXh0cGF0dGVybicpOyAj IG9wdGltaXplIGl0IGFmdGVyIGluZGV4ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gZXRjCgkJCQkk cnMgPSBzYWZlX3F1ZXJ5KCRxdWVyeSk7CgkJCQl1bnNldCgkcXVlcnksJHJzLCRhcnIsJGFy ckZvdW5kKTsgIyBjbGVhciB1cCBzb21lIG1lbW9yeQoJCQl9CgkvKgoKCQkyLjIgU0VUVVAg U0VDVElPTiAmIFBBR0UKCgkqLwoJCQkjIHNldHVwIHRoZSBzZWN0aW9uIGFuZCBwYWdlIHVz ZWQKCQkJaWYoICFlbXB0eSggJGFyclNlY3Rpb24gKSBhbmQgaW5fYXJyYXkoICJzZWN0aW9u IiwgJGFyclNldHVwICkgKSB7CgkJCQlpZiggZmV0Y2goICduYW1lJywndHhwX3NlY3Rpb24n LCduYW1lJywkYXJyU2VjdGlvblswXSApICkgewoJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2 YW5jZWRfc2VhcmNoICckYXJyU2VjdGlvblswXScgc2VjdGlvbjogRXhpc3RzXSIgKTsKCQkJ CX1lbHNlewoJCQkJCXNhZmVfaW5zZXJ0KCAndHhwX3NlY3Rpb24nLCAibmFtZT0nIi4kYXJy U2VjdGlvblswXS4iJywgcGFnZT0nIi4kYXJyU2VjdGlvblswXS4iJywgY3NzPSdkZWZhdWx0 JywgaXNfZGVmYXVsdD0wLCBpbl9yc3M9MCwgb25fZnJvbnRwYWdlPTAsIHNlYXJjaGFibGU9 MCwgdGl0bGU9JyIuJGFyclNlY3Rpb25bMV0uIiciICk7CgkJCQkJdHJhY2VfYWRkKCAiW29i MV9hZHZhbmNlZF9zZWFyY2ggJyRhcnJTZWN0aW9uWzBdJyBzZWN0aW9uIGNyZWF0ZWQ6IE9r XSIgKTsKCQkJCQlpZiggIWZldGNoKCAnbmFtZScsJ3R4cF9wYWdlJywnbmFtZScsJGFyclNl Y3Rpb25bMF0gKSApIHsKCQkJCQkJJGRlZmF1bHRQYWdlID0gZmV0Y2goICduYW1lJywndHhw X3BhZ2UnLCduYW1lJywiZGVmYXVsdCIgKTsKCQkJCQkJc2FmZV9pbnNlcnQoICJ0eHBfcGFn ZSIsICJuYW1lPSciLiRhcnJTZWN0aW9uWzBdLiInLCB1c2VyX2h0bWw9JyIubXlzcWxfcmVh bF9lc2NhcGVfc3RyaW5nKCRkZWZhdWx0UGFnZSkuIiciICk7CgkJCQkJCXRyYWNlX2FkZCgg IltvYjFfYWR2YW5jZWRfc2VhcmNoICckYXJyU2VjdGlvblswXScgcGFnZSBjcmVhdGVkOiBP a10iICk7CgkJCQkJfWVsc2V7CgkJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2Vh cmNoICckYXJyU2VjdGlvblswXScgcGFnZTogRXhpc3RzXSIgKTsKCQkJCQl9CgkJCQl9CgkJ CX0KCS8qCgoJCTIuMyBTRVRVUCBGT1JNUwoKCSovCgkJCSMgc2V0dXAgdGhlIGZvcm1zIHVz ZWQsIG5hbWVkIGluIHRoZSBwcmVmZXJlbmNlcyB1bmRlciAiZm9ybXMiCgkJCWlmKCAhZW1w dHkoICRhcnJGb3JtcyApIGFuZCBpbl9hcnJheSggImZvcm1zIiwgJGFyclNldHVwICkgKSB7 CgkJCQkjIHN0YW5kYXJkIGZvcm0gZm9yIHRoZSBzZWFyY2ggZm9ybXMKCQkJCSRyb3cgPSBz YWZlX3JvdygnRm9ybScsICd0eHBfZm9ybScsIm5hbWU9JyIuZG9TbGFzaCgkYXJyRm9ybXNb MF0pLiInIik7CgkJCQlpZiAoISRyb3cpIHsKCQkJCQkkc3RhbmRhcmRfZm9ybSA9IDw8PGVv ZAo8ZGl2IGlkPSJvYjFBZHZhbmNlZFNlYXJjaCI+Cjxmb3JtIGFjdGlvbj0iJXNlYXJjaCUi IG1ldGhvZD0iZ2V0Ij4KPGZpZWxkc2V0PgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0i YnRzIiB2YWx1ZT0iMSIvPgolc2VhcmNoX2hpZGRlbiUJPGRpdiBjbGFzcz0icm93Ij4KCQk8 aDE+RmluZCByZXN1bHRzPC9oMT4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icm93IiBpZD0ib2Ix RGlzcGxheVJlc3VsdHMiPgoJCTxkaXYgY2xhc3M9ImxlZnRDZWxsIj5EaXNwbGF5PC9kaXY+ PGRpdiBjbGFzcz0icmlnaHRDZWxsIj4lc2VsZWN0X2Rpc3BsYXlfcmVzdWx0cyUgcGVyIHBh Z2UKCQk8L2Rpdj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icm93IiBpZD0ib2IxV29yZHMiPgoJ CTxkaXYgY2xhc3M9ImxlZnRDZWxsIj53aXRoIDxzdHJvbmc+YWxsPC9zdHJvbmc+IHRoZSB3 b3Jkczo8L2Rpdj48ZGl2IGNsYXNzPSJyaWdodENlbGwiPiV3b3JkcyU8L2Rpdj4KCTwvZGl2 PgoJPGRpdiBjbGFzcz0icm93IiBpZD0ib2IxRXhhY3RQaHJhc2UiPgoJCTxkaXYgY2xhc3M9 ImxlZnRDZWxsIj48L2Rpdj48ZGl2IGNsYXNzPSJyaWdodENlbGwiPiVzZWxlY3Rfd29yZHNf aG93JTwvZGl2PgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJyb3ciIGlkPSJvYjFXaXRob3V0Ij4K CQk8ZGl2IGNsYXNzPSJsZWZ0Q2VsbCI+PHN0cm9uZz53aXRob3V0PC9zdHJvbmc+IHRoZSB3 b3Jkczo8L2Rpdj48ZGl2IGNsYXNzPSJyaWdodENlbGwiPiV3aXRob3V0X3dvcmRzJTwvZGl2 PgoJPGRpdiBjbGFzcz0icm93Ij4KCQk8aDI+T2NjdXJyZW5jZXM8L2gyPgoJPC9kaXY+Cgk8 ZGl2IGNsYXNzPSJyb3ciIGlkPSJvYjFvY2N1cnJlbmNlcyI+CgkJPGRpdiBjbGFzcz0ibGVm dENlbGwiPlJldHVybiByZXN1bHRzIHdoZXJlIG15IHRlcm1zIG9jY3VyPC9kaXY+PGRpdiBj bGFzcz0icmlnaHRDZWxsIj4lc2VsZWN0X29jY3VycmVuY2VzJTwvZGl2PgoJPC9kaXY+Cgk8 ZGl2IGNsYXNzPSJyb3ciPgoJCTxoMj5EYXRlPC9oMj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0i cm93IiBpZD0ib2IxRmlyc3RTZWVuIj4KCQk8ZGl2IGNsYXNzPSJsZWZ0Q2VsbCI+UmV0dXJu IGFydGljbGVzIGZpcnN0IHNlZW4gaW4gdGhlPC9kaXY+PGRpdiBjbGFzcz0icmlnaHRDZWxs Ij4lc2VsZWN0X2ZpcnN0X3NlZW4lPC9kaXY+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InJvdyIg aWQ9Im9iMUJldHdlZW5EYXRlIj4KCQk8ZGl2IGNsYXNzPSJsZWZ0Q2VsbCI+UmV0dXJuIGFy dGljbGVzIGJldHdlZW4gdGhlIGRhdGVzIDwvZGl2PjxkaXYgY2xhc3M9InJpZ2h0Q2VsbCI+ JXN0YXJ0ZGF0ZSUgYW5kICVlbmRkYXRlJTwvZGl2PgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJy b3ciPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0cyIgdmFsdWU9IkFkdmFuY2Vk IHNlYXJjaCIvPgoJPC9kaXY+CjwvZmllbGRzZXQ+CjwvZm9ybT48L2Rpdj4KZW9kOwoJCQkJ CXNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsICJuYW1lPSckYXJyRm9ybXNbMF0nLCB0eXBlPSdt aXNjJywgRm9ybT0nIi5teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHN0YW5kYXJkX2Zvcm0p LiInIiApOwoJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIGZvcm0gJyRh cnJGb3Jtc1swXScgY3JlYXRlZDogT2tdIiApOwoJCQkJfWVsc2V7CgkJCQkJdHJhY2VfYWRk KCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggZm9ybSAnJGFyckZvcm1zWzBdJyBleGlzdHM6IE9r XSIgKTsKCQkJCX0KCQkJCSMgc3RhbmRhcmQgZm9ybSBmb3IgdGhlIHNlYXJjaCBoZWFkZXIK CQkJCSRyb3cgPSBzYWZlX3JvdygnRm9ybScsICd0eHBfZm9ybScsIm5hbWU9JyIuZG9TbGFz aCgkYXJyRm9ybXNbMV0pLiInIik7CgkJCQlpZiAoISRyb3cpIHsKCQkJCQkkc3RhbmRhcmRf Zm9ybSA9IDw8PGVvZAo8ZGl2IGlkPSJvYjFTZWFyY2hIZWFkZXIiPgoJPGgxPkFkdmFuY2Vk IHNlYXJjaDwvaDE+CgklcmVzdWx0cyVEaXNwbGF5aW5nICVzdGFydCUtJWVuZCUgb2YgJXRv dGFsJSAlYXJ0aWNsZSUuJS9yZXN1bHRzJQoJJW5vX3Jlc3VsdHMlWW91ciBzZWFyY2ggcmVz dWx0ZWQgaW4gMCBhcnRpY2xlcywgcGxlYXNlIHJlcGhyYXNlIHRoZSBzZWFyY2guJS9ub19y ZXN1bHRzJQo8L2Rpdj4KZW9kOwoJCQkJCXNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsICJuYW1l PSckYXJyRm9ybXNbMV0nLCB0eXBlPSdtaXNjJywgRm9ybT0nIi5teXNxbF9yZWFsX2VzY2Fw ZV9zdHJpbmcoJHN0YW5kYXJkX2Zvcm0pLiInIiApOwoJCQkJCXRyYWNlX2FkZCggIltvYjFf YWR2YW5jZWRfc2VhcmNoIGZvcm0gJyRhcnJGb3Jtc1sxXScgY3JlYXRlZDogT2tdIiApOwoJ CQkJfWVsc2V7CgkJCQkJdHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggZm9ybSAn JGFyckZvcm1zWzFdJyBleGlzdHM6IE9rXSIgKTsKCQkJCX0KCQkJCSMgc3RhbmRhcmQgZm9y bSBmb3IgdGhlIHNtYWxsIHNlYXJjaCBmb3JtcwoJCQkJJHJvdyA9IHNhZmVfcm93KCdGb3Jt JywgJ3R4cF9mb3JtJywibmFtZT0nIi5kb1NsYXNoKCRhcnJGb3Jtc1syXSkuIiciKTsKCQkJ CWlmICghJHJvdykgewoJCQkJCSRzdGFuZGFyZF9mb3JtID0gPDw8ZW9kCjxkaXYgaWQ9Im9i MVNlYXJjaCI+Cjxmb3JtIG1ldGhvZD0iZ2V0IiBhY3Rpb249IiVzZWFyY2glIj4KPGZpZWxk c2V0Pgolc2VhcmNoX2hpZGRlbiUJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYnRzIiB2 YWx1ZT0iMSIvPgoJPHA+U2VhcmNoPGJyLz4KCSV3b3JkcyU8L3A+CjwvZmllbGRzZXQ+Cjwv Zm9ybT4KPC9kaXY+CmVvZDsKCQkJCQlzYWZlX2luc2VydCgndHhwX2Zvcm0nLCAibmFtZT0n JGFyckZvcm1zWzJdJywgdHlwZT0nbWlzYycsIEZvcm09JyIubXlzcWxfcmVhbF9lc2NhcGVf c3RyaW5nKCRzdGFuZGFyZF9mb3JtKS4iJyIgKTsKCQkJCQl0cmFjZV9hZGQoICJbb2IxX2Fk dmFuY2VkX3NlYXJjaCBmb3JtICckYXJyRm9ybXNbMl0nIGNyZWF0ZWQ6IE9rXSIgKTsKCQkJ CX1lbHNlewoJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIGZvcm0gJyRh cnJGb3Jtc1syXScgZXhpc3RzOiBPa10iICk7CgkJCQl9CgkJCQkjIHN0YW5kYXJkIHNlYXJj aF9yZXN1bHRzIGZvcm0gKHN1cHBsaWVkIGJ5IFRYUCkKCQkJCSRyb3cgPSBzYWZlX3Jvdygn Rm9ybScsICd0eHBfZm9ybScsIm5hbWU9JyIuZG9TbGFzaCgkYXJyRm9ybXNbM10pLiInIik7 CgkJCQlpZiAoISRyb3cpIHsKCQkJCQkkc3RhbmRhcmRfZm9ybSA9IDw8PGVvZAo8aDM+PHR4 cDpwZXJtbGluaz48dHhwOnRpdGxlIC8+PC90eHA6cGVybWxpbms+PC9oMz4KCjxwPjx0eHA6 c2VhcmNoX3Jlc3VsdF9leGNlcnB0IC8+PC9wPgoKPHAgY2xhc3M9InNtYWxsIj48dHhwOnBl cm1saW5rPjx0eHA6cGVybWxpbmsgLz48L3R4cDpwZXJtbGluaz4gJiMxODM7IDx0eHA6cG9z dGVkIC8+PC9wPgplb2Q7CgkJCQkJc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywgIm5hbWU9JyRh cnJGb3Jtc1szXScsIHR5cGU9J2FydGljbGUnLCBGb3JtPSciLm15c3FsX3JlYWxfZXNjYXBl X3N0cmluZygkc3RhbmRhcmRfZm9ybSkuIiciICk7CgkJCQkJdHJhY2VfYWRkKCAiW29iMV9h ZHZhbmNlZF9zZWFyY2ggZm9ybSAnJGFyckZvcm1zWzNdJyBjcmVhdGVkOiBPa10iICk7CgkJ CQl9ZWxzZXsKCQkJCQl0cmFjZV9hZGQoICJbb2IxX2FkdmFuY2VkX3NlYXJjaCBmb3JtICck YXJyRm9ybXNbM10nIGV4aXN0czogT2tdIiApOwoJCQkJfQoJCQkJIyBzdGFuZGFyZCBmb3Jt IGZvciB0aGUgZXJyb3IgcmVwb3J0aW5nCgkJCQkkcm93ID0gc2FmZV9yb3coJ0Zvcm0nLCAn dHhwX2Zvcm0nLCJuYW1lPSciLmRvU2xhc2goJGFyckZvcm1zWzRdKS4iJyIpOwoJCQkJaWYg KCEkcm93KSB7CgkJCQkJJHN0YW5kYXJkX2Zvcm0gPSA8PDxlb2QKPGRpdiBpZD0ib2IxQWR2 YW5jZWRTZWFyY2hFcnJvciI+CjxwPlRoZXJlIHdlcmUgZXJyb3JzIGluIHlvdXIgc2VhcmNo LjwvcD4KPHVsPiVlcnJvcl9saXN0IHdyYXB0YWc9ImxpIiU8L3VsPgo8L2Rpdj4KZW9kOwoJ CQkJCXNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsICJuYW1lPSckYXJyRm9ybXNbNF0nLCB0eXBl PSdtaXNjJywgRm9ybT0nIi5teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHN0YW5kYXJkX2Zv cm0pLiInIiApOwoJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIGZvcm0g JyRhcnJGb3Jtc1s0XScgY3JlYXRlZDogT2tdIiApOwoJCQkJfWVsc2V7CgkJCQkJdHJhY2Vf YWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggZm9ybSAnJGFyckZvcm1zWzRdJyBleGlzdHM6 IE9rXSIgKTsKCQkJCX0KCQkJfWVsc2V7CgkJCQlpZihpbl9hcnJheSggImZvcm1zIiwgJGFy clNldHVwICkpIHRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIHNldHVwOiBGYWls ZWQuIFJlYXNvbjogU3RvcHBlZCBzaW5jZSB0aGVyZSBhcmUgbm8gZm9ybXMgZGVmaW5lZCBp biB0aGUgcHJlZmVyZW5jZXNdIiApOwoJCQkJcmV0dXJuOwoJCQl9CgkvKgoKCQkyLjQgU0VU VVAgQ1NTCgoJKi8KCQkJIyBzZXR1cCB0aGUgZGVmYXVsdCBjc3MgaWYgbm90IGFsbHJlYWR5 IGluc2VydGVkCgkJCWlmKCBpbl9hcnJheSggImNzcyIsICRhcnJTZXR1cCApICkgewoJCQkJ JGNzcyA9IGJhc2U2NF9kZWNvZGUoIHNhZmVfZmllbGQoICdjc3MnLCAndHhwX2NzcycsICJu YW1lPSdkZWZhdWx0JyIgKSApOyAjIGdldCB0aGUgZGVmYXVsdCBjc3MgZnJvbSB0aGUgZGIg YW5kIGRlY29kZSBpdAoJCQkJaWYgKCBzdHJzdHIoICRjc3MsICIjb2IxQWR2YW5jZWRTZWFy Y2giICkgPT0gZmFsc2UgKSB7ICMgY2hlY2sgZm9yIHRoZSBzdGFuZGFyZCBpZCBvZiB0aGUg ZGl2IHRoYXQgc3Vycm91bmRzIHRoZSBzZWFyY2gKCQkJCQkkYWRkX2NzcyAgPSA8PDxlb2QK Lyogb2IxX2FkdmFuY2VkX3NlYXJjaCBzcGVjaWZpYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwojb2IxQWR2YW5jZWRTZWFyY2gsICNvYjFT ZWFyY2hIZWFkZXIsICNvYjFTZWFyY2hSZXN1bHRzIHsKCWZvbnQtc2l6ZTogMC43ZW07Cn0K CiNvYjFBZHZhbmNlZFNlYXJjaCAud29yZHMgewoJYmFja2dyb3VuZC1jb2xvcjogI2NjYzsK fQoKI29iMUFkdmFuY2VkU2VhcmNoIGZpZWxkc2V0LCAjb2IxU2VhcmNoIGZpZWxkc2V0IHsK CWJvcmRlcjowOwp9Cgojb2IxQWR2YW5jZWRTZWFyY2ggZm9ybSB7CgltYXJnaW46MDsKCXBh ZGRpbmc6MDsKfQojb2IxQWR2YW5jZWRTZWFyY2ggZm9ybSBpbnB1dFt0eXBlPXRleHRdewoJ d2lkdGg6IDIwMHB4Owp9CiNvYjFBZHZhbmNlZFNlYXJjaCBmb3JtIGlucHV0W3R5cGU9dGV4 dF0uZElucHV0IHsKCXdpZHRoOiA3MHB4Owp9CiNvYjFBZHZhbmNlZFNlYXJjaCBmb3JtIHNl bGVjdCB7Cglmb250LXNpemU6IDFlbTsKfQoKI29iMUFkdmFuY2VkU2VhcmNoIC5sZWZ0Q2Vs bCB7CglmbG9hdDpsZWZ0OwoJd2lkdGg6IDIyMHB4Owp9Cgojb2IxQWR2YW5jZWRTZWFyY2gg LnJpZ2h0Q2VsbCB7CglmbG9hdDpsZWZ0Owp9Cgojb2IxQWR2YW5jZWRTZWFyY2ggLnJvdyB7 CgljbGVhcjogYm90aDsKCW1hcmdpbi10b3A6IDRweDsKfQojb2IxQWR2YW5jZWRTZWFyY2gg LnJvdzpmaXJzdC1jaGlsZCB7CgltYXJnaW4tdG9wOiAwOwp9CiNvYjFBZHZhbmNlZFNlYXJj aEVycm9yIHsKCWJhY2tncm91bmQ6I2MwMDsKCWNvbG9yOiAjZmZmOwoJbWFyZ2luLXRvcDog NHB4OwoJcGFkZGluZzogNHB4OwoJZm9udC1zaXplOiAwLjc1ZW07Cn0KI29iMUFkdmFuY2Vk U2VhcmNoRXJyb3IgdWwsICNvYjFBZHZhbmNlZFNlYXJjaEVycm9yIGxpLCAjb2IxQWR2YW5j ZWRTZWFyY2hFcnJvciBwIHsKCWxpc3Qtc3R5bGU6bm9uZTsKCXBhZGRpbmc6IDA7CgltYXJn aW46IDA7Cn0KZW9kOwoJCQkJCSRjc3MgPSBiYXNlNjRfZW5jb2RlKCAkY3NzIC4gbiAuIG4g LiAkYWRkX2NzcyApOyAjIGVuY29kZSBpdCBiZWZvcmUgaW5zZXJ0aW9uCgkJCQkJaWYgKCBz YWZlX3VwZGF0ZSggInR4cF9jc3MiLCAiY3NzID0gJyIubXlzcWxfcmVhbF9lc2NhcGVfc3Ry aW5nKCRjc3MpLiInIiwgIm5hbWUgPSAnZGVmYXVsdCciICkgPT0gZmFsc2UgKSB7CgkJCQkJ CXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIGZvcm0gY3NzIGluc2VydGVkIGlu dG8gZGVmYXVsdDogRmFpbGVkXSIgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0cmFjZV9hZGQo ICJbb2IxX2FkdmFuY2VkX3NlYXJjaCBmb3JtIGNzcyBpbnNlcnRlZCBpbnRvIGRlZmF1bHQ6 IE9rXSIgKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2 YW5jZWRfc2VhcmNoIGZvcm0gY3NzIGV4aXN0czogT2tdIiApOwoJCQkJfQoJCQl9CgkJCXVu c2V0KCRhcnJTZXR1cCwkYXJyRm9ybXMsJGFyclNlY3Rpb24sJGNzcywkYWRkX2Nzcyk7Cgkv KgoKCQkzLjAgU0VUIFZBTFVFIFRPIFBSRUZTCgoJKi8KCQkjIHNldHMgYW55IHByZWZlcmVu Y2UgY2hvc2VuIGJ5IHRoZSB1c2VyL2FkbWluLCBib3RoIHVzZSA7IHRvIHNlcGFyYXRlIHRo ZSBsaXN0IChzaW5jZSB0aGV5IGNhbiBjb250YWluIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMp CgkJfWVsc2UgaWYoICFlbXB0eSggJHNldCApIG9yICFlbXB0eSggJHZhbHVlICkgKXsKCQkJ JGFyclNldCA9IGRvX2xpc3QoICRzZXQsICI7IiApOwoJCQkkYXJyVmFsdWUgPSBkb19saXN0 KCAkdmFsdWUsICI7IiApOwoJCQkkYXJyTmV3UHJlZnMgPSBAYXJyYXlfY29tYmluZSggJGFy clNldCwgJGFyclZhbHVlICk7CgkJCWlmKCAkYXJyTmV3UHJlZnMgPT0gZmFsc2UgKSB7ICMg Y2hlY2sgdGhhdCB3ZSBoYXZlIGVxdWFsIG51bWJlciBvZiBzZXRzIGFzIHZhbHVlcywgb3Ro ZXJ3aXNlIG91dHB1dCBhbiBlcnJvcgoJCQkJaWYoICRpc0RldiApIHsKCQkJCQlkbXAoICJb b2IxX2FkdmFuY2VkX3NlYXJjaCBzZXQgRmFpbGVkXSIgKTsKCQkJCQl0cmlnZ2VyX2Vycm9y KCAiSW5jb3JyZWN0IHVzZSBvZiBvYjFfYWR2YW5jZWRfc2VhcmNoLiBFaXRoZXIgc2V0IG9y IHZhbHVlIGhhcyBtb3JlL2xlc3MgZW50cmllcy4iLCBFX1VTRVJfRVJST1IgKTsKCQkJCQlk bXAoICJzZXQgYXR0cmlidXRlczogIi5jb3VudCgkYXJyU2V0KSk7CgkJCQkJZG1wKCAkc2V0 ICk7CgkJCQkJZG1wKCAidmFsdWUgYXR0cmlidXRlczogIi5jb3VudCgkYXJyVmFsdWUpKTsK CQkJCQlkbXAoICR2YWx1ZSApOwoJCQkJCWRtcCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIHBy ZWZlcmVuY2VzXSIgKTsKCQkJCQlkbXAoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBd ICk7CgkJCQkJZGllKCk7CgkJCQl9ZWxzZXsKCQkJCQlyZXR1cm4gZmFsc2U7ICMgaWYgbm90 IGluIGRlYnVnL3Rlc3RpbmcgbW9kZSwgZG8gbm90aGluZwoJCQkJfQoJCQl9ZWxzZXsKCQkJ CWZvcmVhY2goIEAkYXJyTmV3UHJlZnMgYXMgJGtleSA9PiAkdmFsdWUgKSB7CgkJCQkJaWYo ICFhcnJheV9rZXlfZXhpc3RzKCAka2V5LCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIg XSApICkgewoJCQkJCQlpZiAoICRpc0RldiApIHsgIyBvdXRwdXQgZXJyb3IgaW4gZGVidWcv dGVzdGluZyBtb2RlCgkJCQkJCQlkbXAoICJbb2IxX2FkdmFuY2VkX3NlYXJjaCBzZXQ6ICck a2V5JyB0byAnJHZhbHVlJzogRmFpbGVkXSIgKTsKCQkJCQkJCXRyaWdnZXJfZXJyb3IoICJN b3N0IGxpa2VseSBpcyBhIG1pc3NwZWxsaW5nIG9mIHRoZSBzZXQsIGNoZWNrIHlvdXIgc3Bl bGxpbmcuIiwgRV9VU0VSX0VSUk9SICk7CgkJCQkJCQlkbXAoICJbb2IxX2FkdmFuY2VkX3Nl YXJjaCBwcmVmZXJlbmNlc10iICk7CgkJCQkJCQlkbXAoICRwcmVmc1sgIm9iMUFkdmFuY2Vk U2VhcmNoIiBdICk7CgkJCQkJCQlkaWUoKTsKCQkJCQkJfWVsc2V7CgkJCQkJCQlyZXR1cm4g ZmFsc2U7ICMgaWYgbm90IGluIGRlYnVnL3Rlc3RpbmcgbW9kZSwgZG8gbm90aGluZwoJCQkJ CQl9CgkJCQkJfWVsc2V7CgkJCQkJCSRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdWyAk a2V5IF0gPSAkdmFsdWU7ICMgc2V0IHRoZSBuZXcgdmFsdWUgdG8gdGhlIHByZWZlcmVuY2Vz CgkJCQkJCXRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIHNldDogJyRrZXknIHRv ICckdmFsdWUnOiBPa10iICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXVuc2V0KCRhcnJTZXQs JGFyclZhbHVlLCRhcnJOZXdQcmVmcywkc2V0LCR2YWx1ZSk7CgkJCXJldHVybjsKCS8qCgoJ CTQuMCBGT1JNIE9VVFBVVAoKCSovCgkJIyBvdXRwdXRzIGZvcm0KCQl9ZWxzZSBpZiggIWVt cHR5KCAkb3V0cHV0ICkgKSB7CgkJCSRhbGxvd2VkRm9ybXMgPSBkb19saXN0KCAkcHJlZnNb ICJvYjFBZHZhbmNlZFNlYXJjaCIgXVsgImZvcm1zIiBdICk7CgkJCSRhbGxvd2VkVXNhZ2Ug PSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIgXVsgImFsbG93ZWRfdXNh Z2UiIF0gKTsKCQkJJGFsbG93ZWRXb3Jkc1VzYWdlID0gZG9fbGlzdCggJHByZWZzWyAib2Ix QWR2YW5jZWRTZWFyY2giIF1bICJhbGxvd2VkX3dvcmRzX3VzYWdlIiBdICk7CgkJCSRhbGxv d2VkV29yZHNVc2FnZU5hbWUgPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJj aCIgXVsgImFsbG93ZWRfd29yZHNfdXNhZ2VfbmFtZSIgXSApOwoJCQlpZiggaW5fYXJyYXko ICRvdXRwdXQsICRhbGxvd2VkRm9ybXMgKSApIHsKCQkJCSRmID0gZmV0Y2hfZm9ybSggJG91 dHB1dCApOwoJCQkJdHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2ggZm9ybSAnJG91 dHB1dCc6IE9rXSIgKTsgIyBtYXliZSBub3QgbmVlZGVkIHNpbmNlIGZldGNoX2Zvcm0gb3V0 cHV0cyB0aGUgZm9ybSBpbmZvIGFsc28KCS8qCgoJCTQuMSBBRFZBTkNFRCBTRUFSQ0ggRk9S TQoKCSovCgkJCQlpZigkb3V0cHV0PT0kYWxsb3dlZEZvcm1zWzBdKXsgIyByZXBsYWNlIGFs bCB0aGUgJWFkZF9oZXJlJSBpbiB0aGUgZm9ybSB3aXRoIGFwcHJvcHJpYXRlIGNvbnRlbnRz CgkJCQkJJGFyclNlY3Rpb24gPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJj aCIgXVsgInNlYXJjaF9zZWN0aW9uIiBdLCAiLCIgKTsKCQkJCQkjIHNldCBjbGFzcycgdG8g YWRkIHRvIGlucHV0cyBpZiB0aGVyZSB3ZXJlIGVycm9ycwoJCQkJCWlmKCFlbXB0eSgkb2Ix QVNFcnJvcikpewoJCQkJCQkkZWM9IiBlcnJvciI7CgkJCQkJCWlmKGFycmF5X2tleV9leGlz dHMoImVycm9yX2RhdGVfbGFyZ2VyIiwkb2IxQVNFcnJvcikgb3IgYXJyYXlfa2V5X2V4aXN0 cygiZXJyb3JfZGF0ZV9mdXR1cmUiLCRvYjFBU0Vycm9yKSBvciBhcnJheV9rZXlfZXhpc3Rz KCJlcnJvcl9zZWFyY2hfc2hvcnQiLCRvYjFBU0Vycm9yKSkgJGFkZENsYXNzRGF0ZT0kZWM7 CgkJCQkJCWlmKGFycmF5X2tleV9leGlzdHMoImVycm9yX3NlYXJjaF9zaG9ydCIsJG9iMUFT RXJyb3IpKSAkYWRkQ2xhc3NXb3JkPSRlYzsKCQkJCQkJdW5zZXQoJGVjKTsKCQkJCQl9CgkJ CQkJIyBzZXQgdGhlIHNlYXJjaCBzZWN0aW9uIGVpdGhlciBpbiBhY3Rpb24gb3IgdGhyb3Vn aCBhIGhpZGRlbiBpbnB1dCAoaWYgbWVzc3kgbW9kZSkKCQkJCQkkZiA9ICgkcHJlZnNbICJw ZXJtbGlua19tb2RlIiBdPT0ibWVzc3kiKQoJCQkJCQk/IHN0cl9yZXBsYWNlKCAiJXNlYXJj aCUiLCAiLi8iLCAkZikKCQkJCQkJOiBzdHJfcmVwbGFjZSggIiVzZWFyY2glIiwgJHBmci4k YXJyU2VjdGlvblswXS4iLyIsICRmKTsKCQkJCQkkZiA9ICgkcHJlZnNbICJwZXJtbGlua19t b2RlIiBdPT0ibWVzc3kiKQoJCQkJCQk/IHN0cl9yZXBsYWNlKCAiJXNlYXJjaF9oaWRkZW4l IiwgIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3MnIHZhbHVlPSciLiRhcnJTZWN0aW9u WzBdLiInLz5cbiIsICRmKQoJCQkJCQk6IHN0cl9yZXBsYWNlKCAiJXNlYXJjaF9oaWRkZW4l IiwgIiIsICRmKTsKCQkJCQlpZihpbl9hcnJheSgid29yZHMiLCRhbGxvd2VkVXNhZ2UpKXsK CQkJCQkJIyByZXBsYWNlICV3b3JkcyUgd2l0aCBhbiBpbnB1dCBpZiBhbGxvd2VkCgkJCQkJ CSRmID0gc3RyX3JlcGxhY2UoICIld29yZHMlIiwgZklucHV0KCAndGV4dCcsICdxJywgQCRf R0VUWyAncScgXSwgQCRhZGRDbGFzc1dvcmQgKSwgJGYgKTsKCQkJCQkJIyByZXBsYWNlICV3 aXRob3V0X3dvcmRzJSB3aXRoIGFuIGlucHV0IGlmIGFsbG93ZWQKCQkJCQkJJGYgPSAoaW5f YXJyYXkoIndpdGhvdXRfd29yZHMiLCRhbGxvd2VkVXNhZ2UpKQoJCQkJCQkJPyBzdHJfcmVw bGFjZSggIiV3aXRob3V0X3dvcmRzJSIsIGZJbnB1dCggJ3RleHQnLCAnd3cnLCBAJF9HRVRb ICd3dycgXSwgQCRhZGRDbGFzc1dvcmQgKSwgJGYgKQoJCQkJCQkJOiBzdHJfcmVwbGFjZSgg IiV3aXRob3V0X3dvcmRzJSIsICIiLCAkZiApOwoJCQkJCQlpZihjb3VudCgkYWxsb3dlZFdv cmRzVXNhZ2UpPjEpewoJCQkJCQkJJGFycj1hcnJheSgpOwoJCQkJCQkJZm9yKCRpPTA7JGk8 Y291bnQoJGFsbG93ZWRXb3Jkc1VzYWdlKTskaSsrKXsKCQkJCQkJCQkkYXJyWygkaSsxKV0g PSAkYWxsb3dlZFdvcmRzVXNhZ2VOYW1lWyRpXTsKCQkJCQkJCX0KCQkJCQkJCSRmID0gc3Ry X3JlcGxhY2UoICIlc2VsZWN0X3dvcmRzX2hvdyUiLCBzZWxlY3RJbnB1dCggJ3doJywgJGFy ciwgQCRfR0VUWyAnd2gnIF0sIGZhbHNlICksICRmICk7CgkJCQkJCX1lbHNlaWYoJGFsbG93 ZWRXb3Jkc1VzYWdlWzBdKXsKCQkJCQkJCSRmID0gc3RyX3JlcGxhY2UoICIlc2VsZWN0X3dv cmRzX2hvdyUiLCBmSW5wdXQoICdoaWRkZW4nLCAnd2gnLCAnMScgKSwgJGYgKTsKCQkJCQkJ fWVsc2V7CgkJCQkJCQkkZiA9IHN0cl9yZXBsYWNlKCAiJXNlbGVjdF93b3Jkc19ob3clIiwg IiIsICRmICk7CgkJCQkJCX0KCQkJCQl9ZWxzZXsKCQkJCQkJJGYgPSBzdHJfcmVwbGFjZSgg IiV3b3JkcyUiLCAiIiwgJGYgKTsKCQkJCQkJJGYgPSBzdHJfcmVwbGFjZSggIiV3aXRob3V0 X3dvcmRzJSIsICIiLCAkZiApOwoJCQkJCQkkZiA9IHN0cl9yZXBsYWNlKCAiJXNlbGVjdF93 b3Jkc19ob3clIiwgIiIsICRmICk7CgkJCQkJfQoJCQkJCSMgcmVwbGFjZSAlc3RhcnRkYXRl JSBhbmQgJWVuZGRhdGUlIHdpdGggYW4gaW5wdXQgaWYgYWxsb3dlZAoJCQkJCSRmID0gKGlu X2FycmF5KCJkYXRlX2JldHdlZW4iLCRhbGxvd2VkVXNhZ2UpKQoJCQkJCQk/IHN0cl9yZXBs YWNlKCAiJXN0YXJ0ZGF0ZSUiLCBmSW5wdXQoICd0ZXh0JywgJ3NkJywgQCRfR0VUWyAnc2Qn IF0sICdkSW5wdXQnLkAkYWRkQ2xhc3NEYXRlICksICRmICkKCQkJCQkJOiBzdHJfcmVwbGFj ZSggIiVzdGFydGRhdGUlIiwgIiIsICRmICk7CgkJCQkJJGYgPSAoaW5fYXJyYXkoImRhdGVf YmV0d2VlbiIsJGFsbG93ZWRVc2FnZSkpCgkJCQkJCT8gc3RyX3JlcGxhY2UoICIlZW5kZGF0 ZSUiLCBmSW5wdXQoICd0ZXh0JywgJ2VkJywgQCRfR0VUWyAnZWQnIF0sICdkSW5wdXQnLkAk YWRkQ2xhc3NEYXRlICksICRmICkKCQkJCQkJOiBzdHJfcmVwbGFjZSggIiVlbmRkYXRlJSIs ICIiLCAkZiApOwoJCQkJCSMgc2V0IHRoZSBzZWxlY3Qgd2l0aCByZXN1bHRzIHBlciBwYWdl CgkJCQkJaWYoaW5fYXJyYXkoInJlc3VsdHNfcGVyX3BhZ2UiLCRhbGxvd2VkVXNhZ2UpKXsK CQkJCQkJJGFyciA9IGFycmF5KCk7CgkJCQkJCSRhcnJSZXN1bHRzID0gZG9fbGlzdCggJHBy ZWZzWyAib2IxQWR2YW5jZWRTZWFyY2giIF1bICJyZXN1bHRzX3Blcl9wYWdlIiBdICk7CgkJ CQkJCWZvcigkaT0wOyRpPGNvdW50KCRhcnJSZXN1bHRzKTskaSsrKXsKCQkJCQkJCSRhcnJb KCRpKzEpXSA9ICRhcnJSZXN1bHRzWyRpXS4kcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIg XVsgInJlc3VsdHMiIF07CgkJCQkJCX0KCQkJCQkJaWYoZW1wdHkoJF9DT09LSUVbIm9iMUF2 YW5jZWRTZWFyY2hSZXN1bHRzIl0pIGFuZCBzdHJsZW4oQCRfQ09PS0lFWyJvYjFBdmFuY2Vk U2VhcmNoUmVzdWx0cyJdKT09MCl7ICRwcmVzZXQgPSBAJF9HRVRbICdycHAnIF07IH0gZWxz ZSB7ICRwcmVzZXQgPSAkX0NPT0tJRVsib2IxQXZhbmNlZFNlYXJjaFJlc3VsdHMiXTsgfQoJ CQkJCQkkZiA9IHN0cl9yZXBsYWNlKCAiJXNlbGVjdF9kaXNwbGF5X3Jlc3VsdHMlIiwgc2Vs ZWN0SW5wdXQoICdycHAnLCAkYXJyLCAkcHJlc2V0LCBmYWxzZSApLCAkZiApOwoJCQkJCQl1 bnNldCgkcHJlc2V0LCRhcnIpOwoJCQkJCX1lbHNlewoJCQkJCQkkZiA9IHN0cl9yZXBsYWNl KCAiJXNlbGVjdF9kaXNwbGF5X3Jlc3VsdHMlIiwgIiIsICRmICk7CgkJCQkJfQoJCQkJCSMg c2V0IHRoZSBzZWxlY3Qgd2l0aCBmaXJzdCBzZWVuCgkJCQkJaWYoaW5fYXJyYXkoImZpcnN0 X3NlZW4iLCRhbGxvd2VkVXNhZ2UpKXsKCQkJCQkJJGFyciA9IGFycmF5KCk7CgkJCQkJCSRh cnJGaXJzdFNlZW4gPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIgXVsg ImZpcnN0X3NlZW5fbmFtZSIgXSApOwoJCQkJCQlmb3IoJGk9MDskaTxjb3VudCgkYXJyRmly c3RTZWVuKTskaSsrKXsKCQkJCQkJCSRhcnJbKCRpKzEpXSA9ICRhcnJGaXJzdFNlZW5bJGld OwoJCQkJCQl9CgkJCQkJCSRmID0gc3RyX3JlcGxhY2UoICIlc2VsZWN0X2ZpcnN0X3NlZW4l Iiwgc2VsZWN0SW5wdXQoICdhZCcsICRhcnIsIEAkX0dFVFsgJ2FkJyBdLCBmYWxzZSApLCAk ZiApOwoJCQkJCQl1bnNldCgkYXJyKTsKCQkJCQl9ZWxzZXsKCQkJCQkJJGYgPSBzdHJfcmVw bGFjZSggIiVzZWxlY3RfZmlyc3Rfc2VlbiUiLCAiIiwgJGYgKTsKCQkJCQl9CgkJCQkJIyBz ZXQgdGhlIHNlbGVjdCB3aXRoIG9jY3VycmVuY2VzCgkJCQkJaWYoaW5fYXJyYXkoIm9jY3Vy cmVuY2VzIiwkYWxsb3dlZFVzYWdlKSl7CgkJCQkJCSRhcnIgPSBhcnJheSgpOwoJCQkJCQkk YXJyT2NjdXJyZW5jZXMgPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIg XVsgIm9jY3VycmVuY2VzX25hbWUiIF0gKTsKCQkJCQkJZm9yKCRpPTA7JGk8Y291bnQoJGFy ck9jY3VycmVuY2VzKTskaSsrKXsKCQkJCQkJCWlmKHN0cmlzdHIoJGFyck9jY3VycmVuY2Vz WyRpXSwiJWN1c3RvbW5hbWUiKT09ZmFsc2UpewoJCQkJCQkJCSRhcnJbKCRpKzEpXSA9ICRh cnJPY2N1cnJlbmNlc1skaV07CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQkkYXJyQ3VzdG9tID0g ZG9fbGlzdCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2giIF1bICJzZWFyY2hfY3VzdG9t IiBdICk7CgkJCQkJCQkJZm9yKCRqPTA7JGo8Y291bnQoJGFyckN1c3RvbSk7JGorKyl7CgkJ CQkJCQkJCWlmKCFlbXB0eSgkYXJyQ3VzdG9tWyRqXSkpewoJCQkJCQkJCQkJJGJvbCA9IHRy aW0oJHByZWZzWyAiY3VzdG9tX3skYXJyQ3VzdG9tWyRqXX1fc2V0Il0pOyAjIGNoZWNrIGZv ciBlbXB0eSBjdXN0b20gZmllbGRuYW1lcyAoZXg6IG9ubHkgc3BhY2VzKQoJCQkJCQkJCQkJ JHZhbCA9ICghZW1wdHkoJGJvbCkpCgkJCQkJCQkJCQkJPyBzdHJfcmVwbGFjZSggIiVjdXN0 b21uYW1lIiwgc3RydG9sb3dlcigkcHJlZnNbICJjdXN0b21feyRhcnJDdXN0b21bJGpdfV9z ZXQiXSksICRhcnJPY2N1cnJlbmNlc1skaV0pCgkJCQkJCQkJCQkJOiBzdHJfcmVwbGFjZSgg IiVjdXN0b21uYW1lIiwgImN1c3RvbSIuKCRqKzEpLCAkYXJyT2NjdXJyZW5jZXNbJGldKTsK CQkJCQkJCQkJCSRhcnJbKCRpKzErJGopXSA9ICR2YWw7CgkJCQkJCQkJCX0KCQkJCQkJCQl9 CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJGYgPSBzdHJfcmVwbGFjZSggIiVzZWxlY3Rfb2Nj dXJyZW5jZXMlIiwgc2VsZWN0SW5wdXQoICdvYycsICRhcnIsIEAkX0dFVFsgJ29jJyBdLCBm YWxzZSApLCAkZiApOwoJCQkJCQl1bnNldCgkYXJyLCRhcnIpOwoJCQkJCX1lbHNlewoJCQkJ CQkkZiA9IHN0cl9yZXBsYWNlKCAiJXNlbGVjdF9vY2N1cnJlbmNlcyUiLCAiIiwgJGYgKTsK CQkJCQl9CgkJCQkJdW5zZXQoJGFkZENsYXNzRGF0ZSwkYWRkQ2xhc3NXb3JkKTsKCS8qCgoJ CTQuMiBTRUFSQ0ggSEVBREVSIEZPUk0KCgkqLwoJCQkJfWVsc2VpZigkb3V0cHV0PT0kYWxs b3dlZEZvcm1zWzFdKXsgIyBzZWFyY2ggaGVhZGVyCgkJCQkJaWYoIWVtcHR5KCRvYjFBU0Vy cm9yKSl7ICMgcmVtb3ZlIGFsbCB0aGUgaGVhZGVyIGluZm8gb24gZXJyb3JzCgkJCQkJCSRm PXN0cl9yZXBsYWNlKHN1YnN0cigkZixzdHJwb3MoJGYsIiVyZXN1bHRzJSIpLHN0cnJwb3Mo JGYsIiUvcmVzdWx0cyUiKSsxMC1zdHJwb3MoJGYsIiVyZXN1bHRzJSIpKSwiIiwkZik7CgkJ CQkJCSRmPXN0cl9yZXBsYWNlKHN1YnN0cigkZixzdHJwb3MoJGYsIiVub19yZXN1bHRzJSIp LHN0cnJwb3MoJGYsIiUvbm9fcmVzdWx0cyUiKSsxMy1zdHJwb3MoJGYsIiVub19yZXN1bHRz JSIpKSwiIiwkZik7CgkJCQkJCXVuc2V0KCRzdGFydCwkZW5kKTsKCQkJCQl9ZWxzZXsKCQkJ CQkJaWYoJHRoaXNwYWdlWydncmFuZF90b3RhbCddPjApeyAjIHRoaXMgbWVhbnMgd2UgaGF2 ZSBzb21lIHJlc3VsdHMgdG8gdGVsbCB0aGUgdXNlciBhYm91dAoJCQkJCQkJJGYgPSBzdHJf cmVwbGFjZSggIiVyZXN1bHRzJSIsICIiLCAkZiApOwoJCQkJCQkJJGYgPSBzdHJfcmVwbGFj ZSggIiUvcmVzdWx0cyUiLCAiIiwgJGYgKTsKCQkJCQkJCSRmID0gKCR0aGlzcGFnZVsiZ3Jh bmRfdG90YWwiXTwxKQoJCQkJCQkJCT8gc3RyX3JlcGxhY2UoICIlc3RhcnQlIiwgIjAiLCAk ZiApCgkJCQkJCQkJOiBzdHJfcmVwbGFjZSggIiVzdGFydCUiLCAoKCR0aGlzcGFnZVsicGci XS0xKSokdGhpc3BhZ2VbImxpbWl0Il0rMSksICRmICk7CgkJCQkJCQkkZiA9ICgoJHRoaXNw YWdlWyJwZyJdKiR0aGlzcGFnZVsibGltaXQiXSk8JHRoaXNwYWdlWyJncmFuZF90b3RhbCJd KQoJCQkJCQkJCT8gc3RyX3JlcGxhY2UoICIlZW5kJSIsICgkdGhpc3BhZ2VbInBnIl0qJHRo aXNwYWdlWyJsaW1pdCJdKSwgJGYgKQoJCQkJCQkJCTogc3RyX3JlcGxhY2UoICIlZW5kJSIs ICR0aGlzcGFnZVsiZ3JhbmRfdG90YWwiXSwgJGYgKTsKCQkJCQkJCSRmID0gc3RyX3JlcGxh Y2UoICIldG90YWwlIiwgJHRoaXNwYWdlWyJncmFuZF90b3RhbCJdLCAkZiApOwoJCQkJCQkJ JGYgPSAoJHRoaXNwYWdlWyJncmFuZF90b3RhbCJdPjEpCgkJCQkJCQkJPyBzdHJfcmVwbGFj ZSggIiVhcnRpY2xlJSIsIGdUeHQoICdhcnRpY2xlc19mb3VuZCcgKSwgJGYgKQoJCQkJCQkJ CTogc3RyX3JlcGxhY2UoICIlYXJ0aWNsZSUiLCBnVHh0KCAnYXJ0aWNsZV9mb3VuZCcgKSwg JGYgKTsKCQkJCQkJCSRmPXN0cl9yZXBsYWNlKHN1YnN0cigkZixzdHJwb3MoJGYsIiVub19y ZXN1bHRzJSIpLHN0cnJwb3MoJGYsIiUvbm9fcmVzdWx0cyUiKSsxMy1zdHJwb3MoJGYsIiVu b19yZXN1bHRzJSIpKSwiIiwkZik7CgkJCQkJCX1lbHNleyAjIG5vIHJlc3VsdHMgZm91bmQs IHRlbGwgdGhlIHVzZXIKCQkJCQkJCSRmID0gc3RyX3JlcGxhY2UoICIlbm9fcmVzdWx0cyUi LCAiIiwgJGYgKTsKCQkJCQkJCSRmID0gc3RyX3JlcGxhY2UoICIlL25vX3Jlc3VsdHMlIiwg IiIsICRmICk7CgkJCQkJCQkkZj1zdHJfcmVwbGFjZShzdWJzdHIoJGYsc3RycG9zKCRmLCIl cmVzdWx0cyUiKSxzdHJycG9zKCRmLCIlL3Jlc3VsdHMlIikrMTAtc3RycG9zKCRmLCIlcmVz dWx0cyUiKSksIiIsJGYpOwoJCQkJCQl9CgkJCQkJfQoJLyoKCgkJNC4zIFNNQUxMIFNFQVJD SCBGT1JNCgoJKi8KCQkJCX1lbHNlaWYoJG91dHB1dD09JGFsbG93ZWRGb3Jtc1syXSl7ICMg c21hbGwgc2VhcmNoIGZvcm0KCQkJCQkkYXJyU2VjdGlvbiA9IGRvX2xpc3QoICRwcmVmc1sg Im9iMUFkdmFuY2VkU2VhcmNoIiBdWyAic2VhcmNoX3NlY3Rpb24iIF0sICIsIiApOwoJCQkJ CSRmID0gKCRwcmVmc1sgInBlcm1saW5rX21vZGUiIF09PSJtZXNzeSIpCgkJCQkJCT8gc3Ry X3JlcGxhY2UoICIlc2VhcmNoJSIsICIuLyIsICRmKQoJCQkJCQk6IHN0cl9yZXBsYWNlKCAi JXNlYXJjaCUiLCAkcGZyLiRhcnJTZWN0aW9uWzBdLiIvIiwgJGYpOwoJCQkJCSRmID0gKCRw cmVmc1sgInBlcm1saW5rX21vZGUiIF09PSJtZXNzeSIpCgkJCQkJCT8gc3RyX3JlcGxhY2Uo ICIlc2VhcmNoX2hpZGRlbiUiLCAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0ncycgdmFs dWU9JyIuJGFyclNlY3Rpb25bMF0uIicvPlxuIiwgJGYpCgkJCQkJCTogc3RyX3JlcGxhY2Uo ICIlc2VhcmNoX2hpZGRlbiUiLCAiIiwgJGYpOwoJCQkJCSRmID0gc3RyX3JlcGxhY2UoICIl d29yZHMlIiwgZklucHV0KCAndGV4dCcsICdxJywgQCRfR0VUWyAncScgXSApLCAkZiApOwoJ LyoKCgkJNC40IEVSUk9SIEZPUk0KCgkqLwoJCQkJfWVsc2VpZigkb3V0cHV0PT0kYWxsb3dl ZEZvcm1zWzRdKXsgIyBlcnJvciBmb3JtCgkJCQkJJGFycj1leHBsb2RlKCAiICIsIHN1YnN0 cigkZixzdHJwb3MoJGYsIiVlcnJvcl9saXN0IikrMSxzdHJycG9zKCRmLCIlIiktc3RycG9z KCRmLCIlZXJyb3JfbGlzdCIpLTEpKTsKCQkJCQlpZihjb3VudCgkYXJyKT4xKSAkYXR0cz1l eHBsb2RlKCI9IiwkYXJyWzFdKTsKCQkJCQkkYXR0c1sxXT1zdHJfcmVwbGFjZSgiXCIiLCIi LCRhdHRzWzFdKTskYXR0c1sxXT1zdHJfcmVwbGFjZSgiJyIsIiIsJGF0dHNbMV0pOyAjIHJl bW92ZSBhbnkgcXVvdGVzCgkJCQkJJG91dD1hcnJheSgpOwoJCQkJCWZvcmVhY2goJG9iMUFT RXJyb3IgYXMgJGVycm9yKXsgIyBnbyB0aHJvdWdoIHRoZSBlcnJvcnMgYW5kIGFkZCB0aGVt IHRvIHRoZSBmb3JtCgkJCQkJCSRvdXRbXT0oJGF0dHNbMF09PSJ3cmFwdGFnIikgPyB0YWco JGVycm9yLCRhdHRzWzFdKSA6ICRlcnJvcjsKCQkJCQl9CgkJCQkJJGY9c3RyX3JlcGxhY2Uo c3Vic3RyKCRmLHN0cnBvcygkZiwiJWVycm9yX2xpc3QiKSxzdHJycG9zKCRmLCIlIiktc3Ry cG9zKCRmLCIlZXJyb3JfbGlzdCIpKzEpLGpvaW4obiwkb3V0KSwkZik7CgkJCQl9CgkJCQl1 bnNldCgkYWxsb3dlZEZvcm1zLCRvdXRwdXQsJGFyclNlY3Rpb24sJGFyciwkYXJyT2NjdXJy ZW5jZXMsJGFyckN1c3RvbSwkYXJyUmVzdWx0cywkYWxsb3dlZFVzYWdlLCRhcnJGaXJzdFNl ZW4sJGFyciwkYXR0cywkb3V0KTsKCQkJCXJldHVybiAkZjsKCQkJfWVsc2V7CgkJCQl0cmFj ZV9hZGQoICJbb2IxX2FkdmFuY2VkX3NlYXJjaCBmb3JtICckb3V0cHV0JzogRmFpbGVkLiBS ZWFzb246IE5vdCBpbiB0aGUgYWxsb3dlZCBsaXN0IHNldCBpbiBwcmVmZXJlbmNlc10iICk7 CgkJCQlyZXR1cm47ICMgcmV0dXJuIG5vdGhpbmcgaWYgZm9ybSBub3QgaW4gYWxsb3dlZCBs aXN0IGluIHByZWZlcmVuY2VzCgkJCX0KCS8qCgoJCTUuMCBTRUFSQ0gKCgkqLwoJCSMgZG8g dGhlIGFjdHVhbCBzZWFyY2h0aGluZwoJCX1lbHNlIGlmKCAhZW1wdHkoICRfR0VUWyAnYnRz JyBdICkgb3IgIWVtcHR5KCAkX0dFVFsgJ3EnIF0gKSApIHsgIyBjaGVja3MgaWYgdGhlIHN1 Ym1pdCBidXR0b24gb3IgdGhlIHF1ZXJ5IGhhdmUgYmVlbiB1c2VkCgkJCSRhbGxvd2VkRm9y bXMgPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIgXVsgImZvcm1zIiBd ICk7CgkJCSRhbGxvd2VkVXNhZ2UgPSBkb19saXN0KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNl YXJjaCIgXVsgImFsbG93ZWRfdXNhZ2UiIF0gKTsKCQkJJHBnID0gKCEkcGcpID8gMSA6ICRw ZzsKCgkJCSMgb25seSBzZWFyY2ggaW4gdGhlIHNlY3Rpb25zIHNwZWNpZmllZCBvbiB0aGUg YWRtaW4gc2lkZQoJCQlAaW5jbHVkZV9vbmNlKCAkdHhwY2ZnWyd0eHBhdGgnXS4iL3B1Ymxp c2gvc2VhcmNoLnBocCIgKTsKCQkJaWYoZW1wdHkoJHNlY3Rpb25zKSl7CgkJCQkkc2VjdGlv bkZpbHRlciA9IGZpbHRlclNlYXJjaCgpOwoJCQl9ZWxzZXsKCQkJCSRhcnJTZWN0aW9ucyA9 IGRvX2xpc3QoICRzZWN0aW9ucyApOwoJCQkJZm9yZWFjaCgkYXJyU2VjdGlvbnMgYXMgJGtl eT0+JHZhbCkgewoJCQkJCWlmKCRrZXkpewoJCQkJCQkkc2VjdGlvbkZpbHRlciA9IEAkc2Vj dGlvbkZpbHRlci4iIE9SIFNlY3Rpb24gPSAnIi4kdmFsLiInIjsKCQkJCQl9ZWxzZXsKCQkJ CQkJJHNlY3Rpb25GaWx0ZXIgPSBAJHNlY3Rpb25GaWx0ZXIuIiBBTkQgKCBTZWN0aW9uID0g JyIuJHZhbC4iJyI7CgkJCQkJfQoJCQkJfQoJCQkJJHNlY3Rpb25GaWx0ZXIgPSAkc2VjdGlv bkZpbHRlci4iICkiOwoJCQl9CgkvKgoKCQk1LjEgTUFUQ0gKCgkqLwoJCQkjIGNoZWNrIHdo YXQgdGhlIHNlYXJjaCBzaG91bGQgYmUgbWF0Y2hlZCBhZ2FpbnN0CgkJCWlmKCAhZW1wdHko ICRfR0VUWyAib2MiIF0gKSBhbmQgaW5fYXJyYXkoICJvY2N1cnJlbmNlcyIsICRhbGxvd2Vk VXNhZ2UgKSApIHsKCQkJCSRhcnIgPSBhcnJheSgpOwoJCQkJJGFyck9jY3VycmVuY2VzID0g ZG9fbGlzdCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2giIF1bICJvY2N1cnJlbmNlcyIg XSApOwoJCQkJZm9yKCRpPTA7JGk8Y291bnQoJGFyck9jY3VycmVuY2VzKTskaSsrKXsKCQkJ CQlpZihzdHJpc3RyKCRhcnJPY2N1cnJlbmNlc1skaV0sIiVjdXN0b20iKT09ZmFsc2UpewoJ CQkJCQkkYXJyWygkaSsxKV0gPSAkYXJyT2NjdXJyZW5jZXNbJGldOwoJCQkJCX1lbHNlewoJ CQkJCQkkYXJyQ3VzdG9tID0gZG9fbGlzdCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2gi IF1bICJzZWFyY2hfY3VzdG9tIiBdICk7CgkJCQkJCWZvcigkaj0wOyRqPGNvdW50KCRhcnJD dXN0b20pOyRqKyspewoJCQkJCQkJaWYoIWVtcHR5KCRhcnJDdXN0b21bJGpdKSl7CgkJCQkJ CQkJJGFyclsoJGkrMSskaildID0gImN1c3RvbV8iLiRhcnJDdXN0b21bJGpdOwoJCQkJCQkJ fQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJaWYoJF9HRVRbICJvYyIgXSkgeyAjIGlmICdv Yycgbm90IGFuIGludCBzZXQgdGhlIGRlZmF1bHQgdmFsdWUKCQkJCQlpZigkYXJyWyAkX0dF VFsgIm9jIiBdIF0gPT0gIioiKXsKCQkJCQkJZm9yZWFjaCgkYXJyIGFzICR2YWwpIHsKCQkJ CQkJCWlmKCR2YWwhPSIqIikgJGFyck1hdGNoW10gPSAkdmFsOwoJCQkJCQl9CgkJCQkJCSRv YjFTUUxNYXRjaCA9IGltcGxvZGUoICIsIiwgJGFyck1hdGNoICk7CgkJCQkJfWVsc2V7CgkJ CQkJCSRvYjFTUUxNYXRjaCA9ICRhcnJbICRfR0VUWyAib2MiIF1dOwoJCQkJCX0KCQkJCQl1 bnNldCgkYXJyTWF0Y2gpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZihAJGFyclsgKGludHZhbCgk X0dFVFsgIm9jIiBdKS0xKSBdPT1OVUxMKSB0cmFjZV9hZGQoICJbb2IxX2FkdmFuY2VkX3Nl YXJjaCByZXN1bHRzIHBlciBwYWdlOiBGYWlsZWQgYW5kIHJldmVydGVkIHRvIGRlZmF1bHQg KFRpdGxlLEJvZHkpLiBSZWFzb246IEludmFsaWQgc2VsZWN0ICciLiRfR0VUWyAib2MiIF0u IicgY2hvc2VuXSIgKTsKCQkJCQkkb2IxU1FMTWF0Y2ggPSAiVGl0bGUsQm9keSI7ICMgZGVm YXVsdCBtYXRjaCB2YWx1ZQoJCQkJfQoJCQkJdW5zZXQoJGFyciwkYXJyT2NjdXJyZW5jZXMs JGFyck9jY3VycmVuY2VzTmFtZSwkYXJyQ3VzdG9tKTsKCQkJfWVsc2V7CgkJCQkkb2IxU1FM TWF0Y2ggPSAiVGl0bGUsQm9keSI7ICMgZGVmYXVsdCBtYXRjaCB2YWx1ZQoJCQl9CgkJCSRv YjFTUUxNYXRjaEFyciA9IGV4cGxvZGUoIiwiLCRvYjFTUUxNYXRjaCk7CgkvKgoKCQk1LjIg UkVTVUxUUyBQRVIgUEFHRSAmIExJTUlUCgoJKi8KCQkJIyBjaGVjayBudW1iZXIgb2YgcmVz dWx0cyBwZXIgcGFnZQoJCQlpZiggIWVtcHR5KCAkX0dFVFsgInJwcCIgXSApIGFuZCBpbl9h cnJheSggInJlc3VsdHNfcGVyX3BhZ2UiLCAkYWxsb3dlZFVzYWdlICkgKSB7CgkJCQkkYXJy UmVzdWx0cyA9IGRvX2xpc3QoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNoIiBdWyAicmVz dWx0c19wZXJfcGFnZSIgXSApOwoJCQkJaWYoIEAkYXJyUmVzdWx0c1sgKGludHZhbCgkX0dF VFsgInJwcCIgXSktMSkgXSAhPSBOVUxMICkgewoJCQkJCSRvYjFBU1JQUCA9ICRhcnJSZXN1 bHRzWyAoaW50dmFsKCRfR0VUWyAicnBwIiBdKS0xKSBdOwoJCQkJfWVsc2V7CgkJCQkJaWYo IEAkYXJyUmVzdWx0c1sgKGludHZhbCgkX0dFVFsgInJwcCIgXSktMSkgXT09TlVMTCApIHRy YWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIHJlc3VsdHMgcGVyIHBhZ2U6IEZhaWxl ZCBhbmQgcmV2ZXJ0ZWQgdG8gZGVmYXVsdCAoMTApLiBSZWFzb246IEludmFsaWQgc2VsZWN0 ICciLiRfR0VUWyAicnBwIiBdLiInIGNob3Nlbl0iICk7CgkJCQkJJG9iMUFTUlBQID0gMTA7 ICMgZGVmYXVsdCByZXN1bHRzIHBlciBwYWdlIHZhbHVlCgkJCQl9CgkJCQl1bnNldCgkYXJy UmVzdWx0cyk7CgkJCX0gZWxzZSB7CgkJCQkkb2IxQVNSUFAgPSAxMDsgIyBkZWZhdWx0IHJl c3VsdHMgcGVyIHBhZ2UgdmFsdWUKCQkJfQoKCQkJIyBzZXQgdGhlIGxpbWl0IG9mIHRoZSBx dWVyeSB1c2luZyByZXN1bHRzL3BhZ2UKCQkJJG9iMVNRTExpbWl0ID0gKCRwZykgPyAiIExJ TUlUICIuKCRwZyokb2IxQVNSUFAtJG9iMUFTUlBQKS4iLCIuJG9iMUFTUlBQIDogIiBMSU1J VCAiLiRvYjFBU1JQUCA7CgkvKgoKCQk1LjMgREFURQoKCSovCgkJCSMgc2V0IGRhdGUgc2V0 dGluZ3MKCQkJJGFyckZpcnN0U2VlbiA9IGRvX2xpc3QoICRwcmVmc1sgIm9iMUFkdmFuY2Vk U2VhcmNoIiBdWyAiZmlyc3Rfc2VlbiIgXSApOwoJCQlpZiggIWVtcHR5KCAkX0dFVFsgImFk IiBdICkgYW5kIGluX2FycmF5KCAiZmlyc3Rfc2VlbiIsICRhbGxvd2VkVXNhZ2UgKSBhbmQg QCRhcnJGaXJzdFNlZW5bIChpbnR2YWwoJF9HRVRbICJhZCIgXSktMSldICE9ICIqIiApIHsK CQkJCWlmKCBAJGFyckZpcnN0U2VlblsgKGludHZhbCgkX0dFVFsgImFkIiBdKS0xKSBdICE9 IE5VTEwgKSB7CgkJCQkJJG9iMVNRTFBvc3RlZCA9ICIgQU5EIChQb3N0ZWQgPj0gJyIuZGF0 ZSggIlktbS1kIEg6aTpzIiwgdGltZSgpLSgkYXJyRmlyc3RTZWVuWyAoaW50dmFsKCRfR0VU WyAiYWQiIF0pLTEpIF0qNjApKS4iJyBhbmQgUG9zdGVkIDw9IG5vdygpKSI7CgkJCQl9ZWxz ZXsKCQkJCQlpZiggQCRhcnJGaXJzdFNlZW5bIChpbnR2YWwoJF9HRVRbICJhZCIgXSktMSkg XT09TlVMTCApIHRyYWNlX2FkZCggIltvYjFfYWR2YW5jZWRfc2VhcmNoIGZpcnN0IHNlZW46 IEZhaWxlZCBhbmQgcmV2ZXJ0ZWQgdG8gZGVmYXVsdCAoYW55dGltZSkuIFJlYXNvbjogSW52 YWxpZCBzZWxlY3QgJyIuJF9HRVRbICJhZCIgXS4iJyBjaG9zZW5dIiApOwoJCQkJCSRvYjFT UUxQb3N0ZWQgPSAiIEFORCBQb3N0ZWQgPD0gbm93KCkiOyAjIGRlZmF1bHQgdmFsdWUKCQkJ CX0KCQkJCXVuc2V0KCRhcnJGaXJzdFNlZW4pOwoJCQl9IGVsc2UgewoJCQkJJG9iMVNRTFBv c3RlZCA9ICIgQU5EIFBvc3RlZCA8PSBub3coKSI7ICMgZGVmYXVsdCB2YWx1ZQoJCQl9CgoJ CQkjIG92ZXJ3cml0ZSBwcmV2aW91cyBzZXQgZGF0ZSBzZXR0aW5ncyBpZiBkYXRlIGJldHdl ZW4gaGFzIGJlZW4gdXNlZAoJCQlpZiggKCFlbXB0eSggJF9HRVRbICJzZCIgXSApIG9yICFl bXB0eSggJF9HRVRbICJlZCIgXSApICkgYW5kIGluX2FycmF5KCAiZGF0ZV9iZXR3ZWVuIiwg JGFsbG93ZWRVc2FnZSApICkgewoJCQkJJHN0YXJ0ZGF0ZSA9IChlbXB0eSggJF9HRVRbICJz ZCIgXSkpID8gMCA6IHN0cnRvdGltZSgkX0dFVFsic2QiXSk7CgkJCQkkZW5kZGF0ZSA9IChl bXB0eSggJF9HRVRbICJlZCIgXSkpID8gMCA6IHN0cnRvdGltZSgkX0dFVFsiZWQiXSk7CgkJ CQlpZighaW5fYXJyYXkoImRhdGVfZnV0dXJlIiwkYWxsb3dlZFVzYWdlKSBhbmQgKCRzdGFy dGRhdGU+dGltZSgpIG9yICRlbmRkYXRlPnRpbWUoKSkpIHsKCQkJCQkkb2IxQVNFcnJvclsi ZXJyb3JfZGF0ZV9mdXR1cmUiXSA9ICRwcmVmc1sib2IxQWR2YW5jZWRTZWFyY2giXVsiZXJy b3JfZGF0ZV9mdXR1cmUiXTsKCQkJCQl0cmFjZV9hZGQoICJbb2IxX2FkdmFuY2VkX3NlYXJj aCBkYXRlIGJldHdlZW46IEZhaWxlZC4gUmVhc29uOiBzdGFydCBvciBlbmQgZGF0ZSBsYXJn ZXIgdGhlbiBub3ddIiApOwoJCQkJfWVsc2V7CgkJCQkJJGFsd2F5c1RydWUgPSAoaW5fYXJy YXkoImRhdGVfZnV0dXJlIiwkYWxsb3dlZFVzYWdlKSBhbmQgISRlbmRkYXRlKSA/IDAgOiAx OwoJCQkJCWlmKCgkZW5kZGF0ZTwkc3RhcnRkYXRlKSBhbmQgQCRhbHdheXNUcnVlKXsKCQkJ CQkJJG9iMUFTRXJyb3JbImVycm9yX2RhdGVfbGFyZ2VyIl0gPSAkcHJlZnNbIm9iMUFkdmFu Y2VkU2VhcmNoIl1bImVycm9yX2RhdGVfbGFyZ2VyIl07CgkJCQkJCXRyYWNlX2FkZCggIltv YjFfYWR2YW5jZWRfc2VhcmNoIGRhdGUgYmV0d2VlbjogRmFpbGVkLiBSZWFzb246IHN0YXJ0 IGRhdGUgbGFyZ2VyIHRoZW4gZW5kIGRhdGVdIiApOwoJCQkJCX1lbHNleyAjIGNyZWF0ZSB0 aGUgU1FMCgkJCQkJCSRvYjFTUUxQb3N0ZWQgPSAiIEFORCAoIjsKCQkJCQkJJG9iMVNRTFBv c3RlZCAuPSAoJHN0YXJ0ZGF0ZSkgPyAiUG9zdGVkID49ICciLmRhdGUoIlktbS1kIiwkc3Rh cnRkYXRlKS4iIDAwOjAwOjAwJyIgOiAiIjsKCQkJCQkJJG9iMVNRTFBvc3RlZCAuPSAoJHN0 YXJ0ZGF0ZSBhbmQgJGVuZGRhdGUpID8gIiBBTkQgIiA6ICIiOwoJCQkJCQkkb2IxU1FMUG9z dGVkIC49ICgkZW5kZGF0ZSkgPyAiUG9zdGVkIDw9ICciLmRhdGUoIlktbS1kIiwkZW5kZGF0 ZSkuIiAyMzo1OTo1OSciIDogIiI7CgkJCQkJCSRvYjFTUUxQb3N0ZWQgLj0gIikiOwoJCQkJ CX0KCQkJCX0KCQkJCXVuc2V0KCRzdGFydGRhdGUsJGVuZGRhdGUsJGFsd2F5c1RydWUpOwoJ CQl9CgkvKgoKCQk1LjQgQVJUSUNMRSBTVEFUVVMKCgkqLwoJCQkjIHNldCBpbiB3aGF0IHR5 cGUvc3RhdHVzIG9mIGFydGljbGVzIHRvIHNlYXJjaCBkZWZpbmVkIGluIHRoZSBzZWFyY2hz dGF0dXMgYXR0cmlidXRlCgkJCSRhcnJTdGF0dXMgPSBkb19saXN0KCAkc2VhcmNoc3RhdHVz ICk7CgkJCSRvdXQgPSBhcnJheSgpOwoJCQlpZiggIWVtcHR5KCAkYXJyU3RhdHVzICkgKSB7 CgkJCQlmb3JlYWNoKCRhcnJTdGF0dXMgYXMgJHN0YXR1cyl7CgkJCQkJJG91dFtdID0gIlN0 YXR1cyA9ICciLiRzdGF0dXMuIiciOwoJCQkJfQoJCQl9ZWxzZXsKCQkJCSRvdXRbXSA9ICJT dGF0dXMgPSAnNCciOyAjIGRlZmF1bHQgdG8gJ0xpdmUnIHN0YXR1cwoJCQl9CgkJCSRvYjFT UUxTdGF0dXMgPSAiIEFORCAoIi5qb2luKCIgb3IgIiwkb3V0KS4iKSI7CgkJCXVuc2V0KCRv dXQpOwoJLyoKCgkJNS41IE9SREVSCgoJKi8KCQkJIyBzZXQgdGhlIGRlZmF1bHQgb3JkZXIg KG5vdCBjdXJyZW50bHkgYmVlaW5nIGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMgb25lKSwgaWYg YSB3b3JkcyBzZWFyY2ggd2lsbCBhbHRlciB0aGUgb3JkZXIgdGhvdWdoCgkJCSMjIyBUT0RP OiBvcmRlciBhdHRyaWJ1dCBrYW5za2U/CgkJCSRvYjFPcmRlckJ5ID0gIiBPUkRFUiBCWSBQ b3N0ZWQgZGVzYyI7CgkvKgoKCQk1LjYgV09SRFMgU0VUVVAKCgkqLwoJCQlpZihlbXB0eSgk X0dFVFsnd2gnXSkpICRfR0VUWyAnd2gnIF0gPSAiMSI7CgoJCQkkb2IxU1FMTWF0Y2hBcnIg PSBleHBsb2RlKCIsIiwkb2IxU1FMTWF0Y2gpOwoJCQkkb2IxU1FMQWdhaW5zdCA9IHRyaW0o c3RyaXBfdGFncyhteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoQCRfR0VUWydxJ10pKSk7ICMg bWFrZSBzdXJlIHRoZSB1c2VyIGlzbid0IHRyeWluZyBzb21ldGhpbmcgc3R1cGlkCgoJCQkk YWxsb3dlZFdvcmRzVXNhZ2UgPSBkb19saXN0KCAkcHJlZnNbIm9iMUFkdmFuY2VkU2VhcmNo Il1bImFsbG93ZWRfd29yZHNfdXNhZ2UiXSApOwoJCQkkb2IxV29yZHNBcnIgPSAoJGFsbG93 ZWRXb3Jkc1VzYWdlW0AkX0dFVFsnd2gnXS0xXT09ImFsbF93b3JkcyIgb3IgJGFsbG93ZWRX b3Jkc1VzYWdlW0AkX0dFVFsnd2gnXS0xXT09ImF0X2xlYXN0X29uZV93b3JkIikKCQkJCQk/ IGV4cGxvZGUoICIgIiwgJG9iMVNRTEFnYWluc3QgKQoJCQkJCTogYXJyYXkoICRvYjFTUUxB Z2FpbnN0ICk7ICMgc3BsaXQgdGhlIHdvcmRzIGlmIG5vdCBhbiBleGFjdCBwaHJhc2Ugc2Vh cmNoCgoJCQkkb2IxU1FMV2l0aG91dCA9IHRyaW0oc3RyaXBfdGFncyhteXNxbF9yZWFsX2Vz Y2FwZV9zdHJpbmcoQCRfR0VUWyd3dyddKSkpOyAjIG1ha2Ugc3VyZSB0aGUgdXNlciBpc24n dCB0cnlpbmcgc29tZXRoaW5nIHN0dXBpZAoJCQkkb2IxV2l0aG91dFdvcmRzQXJyID0gZXhw bG9kZSggIiAiLCAkb2IxU1FMV2l0aG91dCApOwoKCQkJIyBjaGVjayBzbyB3ZSBhdGxlYXN0 IGhhdmUgdHdvIGNoYXJhY3RlcnMgdG8gdXNlLCBvciBzb21lIGRhdGUgc2V0dGluZ3MKCQkJ aWYoIHN0cmxlbigkb2IxU1FMQWdhaW5zdCk8PTEKCQkJCQlhbmQgc3RybGVuKCRvYjFTUUxX aXRob3V0KTw9MQoJCQkJCWFuZCBlbXB0eSgkX0dFVFsgInNkIiBdKQoJCQkJCWFuZCBlbXB0 eSgkX0dFVFsgImVkIiBdKQoJCQkJCWFuZCAkYXJyRmlyc3RTZWVuWyAoQCRfR0VUWyAnYWQn IF0tMSkgXSA9PSAiKiIKCQkJKSB7CgkJCQkkb2IxQVNFcnJvclsiZXJyb3Jfc2VhcmNoX3No b3J0Il0gPSAkcHJlZnNbIm9iMUFkdmFuY2VkU2VhcmNoIl1bImVycm9yX3NlYXJjaF9zaG9y dCJdOwoJCQkJdHJhY2VfYWRkKCAiW29iMV9hZHZhbmNlZF9zZWFyY2g6IEZhaWxlZC4gUmVh c29uOiBOb3RoaW5nIHRvIHVzZSBpbiB0aGUgc2VhcmNoIGNob3Nlbl0iICk7CgkJCX0KCgkJ CSRvYjFTUUxNYXRjaGVzPSIiOwoJCQkkb2IxU1FMV29yZHM9IiI7CgkvKgoKCQk1LjcgV09S RFMgQUxML0VYQUNUL09ORQoKCSovCgkJCWlmKGluX2FycmF5KCJ3b3JkcyIsJGFsbG93ZWRV c2FnZSkgYW5kIGVtcHR5KCRvYjFBU0Vycm9yKSBhbmQgIWVtcHR5KCRvYjFTUUxBZ2FpbnN0 KSl7CgkJCQkjIGZpeCB0aGUgc2NvcmUgbWF0Y2gKCQkJCSRvdXQ9YXJyYXkoKTsKCQkJCWlm KCRhbGxvd2VkV29yZHNVc2FnZVsoJF9HRVRbJ3doJ10tMSldPT0iYWxsX3dvcmRzIiBvciAk YWxsb3dlZFdvcmRzVXNhZ2VbKCRfR0VUWyd3aCddLTEpXT09ImF0X2xlYXN0X29uZV93b3Jk Iil7CgkJCQkJZm9yZWFjaCgkb2IxV29yZHNBcnIgYXMgJGtleSA9PiAkd29yZCl7CgkJCQkJ CSRvdXRbXSA9ICgka2V5PjApID8gIisgTUFUQ0ggKCRvYjFTUUxNYXRjaCkgQUdBSU5TVCAo JyR3b3JkJykgIiA6ICIsICggTUFUQ0ggKCRvYjFTUUxNYXRjaCkgQUdBSU5TVCAoJyR3b3Jk JykgIjsKCQkJCQl9CgkJCQl9ZWxzZWlmKCRhbGxvd2VkV29yZHNVc2FnZVsoJF9HRVRbJ3do J10tMSldPT0iZXhhY3RfcGhyYXNlIil7CgkJCQkJJG91dFtdID0gIiwgKCBNQVRDSCAoJG9i MVNRTE1hdGNoKSBBR0FJTlNUICgnJG9iMVNRTEFnYWluc3QnKSAiOwoJCQkJfQoJCQkJJG9i MVNRTE1hdGNoZXMgPSAoIWVtcHR5KCRvdXQpKSA/IGpvaW4oIiIsJG91dCkuIikgQVMgc2Nv cmUiIDogJyc7CgkJCQkkb2IxT3JkZXJCeSA9ICghZW1wdHkoJG91dCkpID8gIiBPUkRFUiBC WSBzY29yZSBERVNDIiA6ICRvYjFPcmRlckJ5OwoJCQkJdW5zZXQoJG91dCk7CgoJCQkJIyBm aXggdGhlIGFjdHVhbCBzZWFyY2gKCQkJCWlmKCRhbGxvd2VkV29yZHNVc2FnZVsoJF9HRVRb J3doJ10tMSldPT0iYWxsX3dvcmRzIiBvciAkYWxsb3dlZFdvcmRzVXNhZ2VbKCRfR0VUWyd3 aCddLTEpXT09ImF0X2xlYXN0X29uZV93b3JkIil7CgkJCQkJJHNlYXJjaFR5cGUgPSAoJGFs bG93ZWRXb3Jkc1VzYWdlWygkX0dFVFsnd2gnXS0xKV09PSJhbGxfd29yZHMiKSA/ICJBTkQi IDogIk9SIjsKCQkJCQkkb3V0PWFycmF5KCk7CgkJCQkJZm9yZWFjaCgkb2IxU1FMTWF0Y2hB cnIgYXMgJGtleSA9PiAkbWF0Y2gpewoJCQkJCQlpZigka2V5PjApICRvdXRbXT0iT1IiOwoJ CQkJCQlmb3JlYWNoKCRvYjFXb3Jkc0FyciBhcyAkayA9PiAkd29yZCl7CgkJCQkJCQlpZihz dHJsZW4oJHdvcmQpPjIpewoJCQkJCQkJCWlmKCRrPjApICRvdXRbXT1uLiRzZWFyY2hUeXBl OwoJCQkJCQkJCSRvdXRbXSA9ICgkaz4wKSA/ICIkbWF0Y2ggUkxJS0UgJyR3b3JkJyIgOiAi KCAkbWF0Y2ggUkxJS0UgJyR3b3JkJyI7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJG91dFtd PSIpIi5uOwoJCQkJCX0KCQkJCQkkb2IxU1FMV29yZHM9IiggIi5qb2luKCIgIiwkb3V0KS4i ICkiOwoJCQkJCXVuc2V0KCRvdXQpOwoJCQkJfWVsc2VpZigkYWxsb3dlZFdvcmRzVXNhZ2Vb KCRfR0VUWyd3aCddLTEpXT09ImV4YWN0X3BocmFzZSIpewoJCQkJCSRvdXQ9YXJyYXkoKTsK CQkJCQlmb3JlYWNoKCRvYjFTUUxNYXRjaEFyciBhcyAka2V5ID0+ICRtYXRjaCl7CgkJCQkJ CWlmKCRrZXk+MCkgJG91dFtdPSJPUiI7CgkJCQkJCSRvdXRbXSA9ICIoICRtYXRjaCBSTElL RSAnJG9iMVNRTEFnYWluc3QnICkiLm47CgkJCQkJfQoJCQkJCSRvYjFTUUxXb3Jkcz0iKCAi LmpvaW4oIiAiLCRvdXQpLiIgKSI7CgkJCQkJdW5zZXQoJG91dCk7CgkJCQl9CgkJCX0KCS8q CgoJCTUuOCBXT1JEUyBXSVRIT1VUCgoJKi8KCQkJaWYoaW5fYXJyYXkoIndpdGhvdXRfd29y ZHMiLCRhbGxvd2VkVXNhZ2UpIGFuZCBlbXB0eSgkb2IxQVNFcnJvcikgYW5kICFlbXB0eSgk b2IxU1FMV2l0aG91dCkpewoJCQkJIyBmaXggdGhlIGFjdHVhbCBzZWFyY2gKCQkJCSRvdXQ9 YXJyYXkoKTsKCQkJCWZvcmVhY2goJG9iMVNRTE1hdGNoQXJyIGFzICRrZXkgPT4gJG1hdGNo KXsKCQkJCQlpZigka2V5PjApICRvdXRbXT0iT1IiOwoJCQkJCWZvcmVhY2goJG9iMVdpdGhv dXRXb3Jkc0FyciBhcyAkayA9PiAkd29yZCl7CgkJCQkJCWlmKHN0cmxlbigkd29yZCk+Mil7 CgkJCQkJCQlpZigkaz4wKSAkb3V0W109bi4iT1IiOwoJCQkJCQkJJG91dFtdID0gKCRrPjAp ID8gIiRtYXRjaCBSTElLRSAnJHdvcmQnIiA6ICIoICRtYXRjaCBSTElLRSAnJHdvcmQnIjsK CQkJCQkJfQoJCQkJCX0KCQkJCQkkb3V0W109IikiLm47CgkJCQl9CgkJCQkkb2IxU1FMV29y ZHMgPSAoJG9iMVNRTFdvcmRzKSA/ICRvYjFTUUxXb3Jkcy4iIEFORCBOT1QgKCAiLmpvaW4o IiAiLCAkb3V0KS4iICkiIDoiIE5PVCAoICIuam9pbigiICIsICRvdXQpLiIgKSI7CgkJCX0K CQkJJG9iMVNRTFdvcmRzID0gKHN0cmxlbihAJG9iMVNRTFdvcmRzKT4wKSA/ICIgQU5EICgg Ii5uLiRvYjFTUUxXb3Jkcy4iICkiOiAnJzsKCS8qCgoJCTUuOSBEQVRBQkFTRSBRVUVSWQoK CSovCgkJCSMgc2V0IHRoZSByZXN1bHRzL3Blci9wYWdlIGNvb2tpZSBpZiAncnBwJyBpcyBh dmFpbGFibGUKCQkJaWYoaW5fYXJyYXkoJHByZWZzWyJvYjFBZHZhbmNlZFNlYXJjaCJdWyJy ZXN1bHRzX2Nvb2tpZSJdLCRhcnJZZXMpIGFuZCAhZW1wdHkoJF9HRVRbJ3JwcCddKSl7CgkJ CQlzZXRjb29raWUoIm9iMUF2YW5jZWRTZWFyY2hSZXN1bHRzIiwkX0dFVFsncnBwJ10sdGlt ZSgpKzEwMDgwMCk7ICMgZXhwaXJlcyBpbiBmb3VyIHdlZWtzCgkJCX0KCQkJIyBzdGFydCB0 aGUgZG9pbmcsIG1vc3Qgb2YgdGhpcyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIGRvQXJ0aWNs ZXMgaW4gcHVibGlzaC5waHAKCQkJJHdoZXJlID0gIjEiLiRvYjFTUUxXb3Jkcy4kb2IxU1FM U3RhdHVzLiRvYjFTUUxQb3N0ZWQ7CgkJCSRhcnRpY2xlcyA9IGFycmF5KCk7CgkJCWlmKGVt cHR5KCRvYjFBU0Vycm9yKSl7ICMgbm8gcXVlcmllcyBpZiB0aGVyZSB3aGVyZSBlcnJvcnMK CQkJCSRncmFuZF90b3RhbCA9IHNhZmVfY291bnQoJ3RleHRwYXR0ZXJuJywkd2hlcmUuJHNl Y3Rpb25GaWx0ZXIpOwoJCQkJJG51bVBhZ2VzID0gY2VpbCgkZ3JhbmRfdG90YWwvJG9iMUFT UlBQKTsKCQkJCSRwZyA9ICghJHBnKSA/IDEgOiAkcGc7CgkJCQkvLyBzZW5kIHBhZ2luZyBp bmZvIHRvIHR4cDpuZXdlciBhbmQgdHhwOm9sZGVyCgkJCQkkcGFnZW91dFsncGcnXSAgICAg ICA9ICRwZzsKCQkJCSRwYWdlb3V0WydudW1QYWdlcyddID0gJG51bVBhZ2VzOwoJCQkJJHBh Z2VvdXRbJ2xpbWl0J10gPSAkb2IxQVNSUFA7CgkJCQkkcGFnZW91dFsncyddICAgICAgICA9 ICRzOwoJCQkJJHBhZ2VvdXRbJ2MnXSAgICAgICAgPSAkYzsKCQkJCSRwYWdlb3V0WydncmFu ZF90b3RhbCddID0gJGdyYW5kX3RvdGFsOwoJCQkJJHBhZ2VvdXRbJ3RvdGFsJ10gICAgPSAk Z3JhbmRfdG90YWw7CgoJCQkJZ2xvYmFsICR0aGlzcGFnZSwkaXNfYXJ0aWNsZV9saXN0OwoJ CQkJJHRoaXNwYWdlID0gJHBhZ2VvdXQ7CgkJCQlpZigkdGhpc3BhZ2VbJ2dyYW5kX3RvdGFs J10pICRpc19hcnRpY2xlX2xpc3QgPSB0cnVlOwoJCQkJIyBhcmUgeW91IHJlYWR5PyB0aGVu IGRvIHRoZSBkYiBxdWVyeQoJCQkJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3Rp bWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQiLiRvYjFTUUxNYXRjaGVzLCAndGV4dHBhdHRl cm4nLCR3aGVyZS4kc2VjdGlvbkZpbHRlci4kb2IxT3JkZXJCeS4kb2IxU1FMTGltaXQpOwoJ CQkJJGZuYW1lID0gJGFsbG93ZWRGb3Jtc1szXTsKCQkJCSRvdXQgPSBhcnJheSgpOwoJCQkJ aWYgKCRycykgewoJCQkJCSRjb3VudCA9IDA7CgkJCQkJd2hpbGUoJGEgPSBuZXh0Um93KCRy cykpIHsKCQkJCQkJKyskY291bnQ7CgkJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJGEpOwoJ CQkJCQlnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdVBvc3RlZCwgJGxpbWl0OwoJCQkJCQkkdGhp c2FydGljbGVbJ2lzX2ZpcnN0J10gPSAoJGNvdW50ID09IDEpOwoJCQkJCQkkdGhpc2FydGlj bGVbJ2lzX2xhc3QnXSA9ICgkY291bnQgPT0gbnVtUm93cygkcnMpKTsKCQkJCQkJaWYoY291 bnQoJG9iMVdvcmRzQXJyKT09MSl7ICRhWydzY29yZSddPSIxIjsgfQoJCQkJCQkkdGhpc2Fy dGljbGVbJ3NlYXJjaF9zY29yZSddID0gJGFbJ3Njb3JlJ107ICMgYWRkIHRoZSBzY29yZSB0 byAkdGhpc2FydGljbGUKCQkJCQkJJGFydGljbGVzW10gPSBwYXJzZV9mb3JtKCRmbmFtZSk7 CgkJCQkJfQoJCQkJCXVuc2V0KCRHTE9CQUxTWyd0aGlzYXJ0aWNsZSddKTsKCQkJCX0KCQkJ fWVsc2V7CgkvKgoKCQk1LjEwIEVSUk9SIEhBTkRMSU5HCgoJKi8KCQkJCSMgaW5zdGVhZCBv ZiBmaWxsaW5nIHRoZSBhcnRpY2xlcyBhcnJheSB3aXRoIGFydGljbGVzLCBhZGQgdGhlIGVy cm9yIGluZm8gaW5zdGVhZAoJCQkJJGFydGljbGVzW10gPSBvYjFfYWR2YW5jZWRfc2VhcmNo KCBhcnJheSggIm91dHB1dCIgPT4gJGFsbG93ZWRGb3Jtc1s0XSApICk7CgkJCX0KCS8qCgoJ CTYuMCBDT05URU5UUyBPVVRQVVQKCgkqLwoJCQkjIGFkZCB0aGUgc2VhcmNocmVzdWx0cyBo ZWFkZXIKCQkJJG91dFtdID0gb2IxX2FkdmFuY2VkX3NlYXJjaCggYXJyYXkoICJvdXRwdXQi ID0+ICRhbGxvd2VkRm9ybXNbMV0gKSApOwoKCQkJIyBpZiBiZWZvcmVfcmVzdWx0cyBzZXQs IGluY2x1ZGUgdGhlIHNlYXJjaCBmb3JtCgkJCWlmKGluX2FycmF5KCJiZWZvcmVfcmVzdWx0 cyIsZG9fbGlzdCgkcHJlZnNbIm9iMUFkdmFuY2VkU2VhcmNoIl1bInNob3dfc2VhcmNoX2Zv cm0iXSkpIGFuZCAkdGhpc3BhZ2VbJ2dyYW5kX3RvdGFsJ10hPTApICRvdXRbXSA9IG9iMV9h ZHZhbmNlZF9zZWFyY2goIGFycmF5KCAib3V0cHV0IiA9PiAkYWxsb3dlZEZvcm1zWzBdICkg KTsKCgkJCSMgYWRkIGFueSBhcnRpY2xlcyBmb3VuZAoJCQkkb3V0W10gPSBqb2luKCcnLCRh cnRpY2xlcyk7CgoJCQkjIGlmIGFmdGVyX3Jlc3VsdHMgc2V0LCBpbmNsdWRlIHRoZSBzZWFy Y2ggZm9ybQoJCQlpZihpbl9hcnJheSgiYWZ0ZXJfcmVzdWx0cyIsZG9fbGlzdCgkcHJlZnNb Im9iMUFkdmFuY2VkU2VhcmNoIl1bInNob3dfc2VhcmNoX2Zvcm0iXSkpIGFuZCAkdGhpc3Bh Z2VbJ2dyYW5kX3RvdGFsJ10hPTApICRvdXRbXSA9IG9iMV9hZHZhbmNlZF9zZWFyY2goIGFy cmF5KCAib3V0cHV0IiA9PiAkYWxsb3dlZEZvcm1zWzBdICkgKTsKCgkJCSMgaWYgbm9fcmVz dWx0cyBzZXQgYW5kIG5vIGFydGljbGVzIHdoZXJlIGZvdW5kLCBpbmNsdWRlIHRoZSBzZWFy Y2ggZm9ybQoJCQlpZihpbl9hcnJheSgiZW1wdHkiLGRvX2xpc3QoJHByZWZzWyJvYjFBZHZh bmNlZFNlYXJjaCJdWyJzaG93X3NlYXJjaF9mb3JtIl0pKSBhbmQgJHRoaXNwYWdlWydncmFu ZF90b3RhbCddPT0wKSAkb3V0W10gPSBvYjFfYWR2YW5jZWRfc2VhcmNoKCBhcnJheSggIm91 dHB1dCIgPT4gJGFsbG93ZWRGb3Jtc1swXSApICk7CgoJCQkjIHJldHVybiB0aGUgd2hvbGUg c2hlYmFuZyB0byB0ZXh0cGF0dGVybgoJCQlyZXR1cm4gKCRvdXQpID8gam9pbihuLCRvdXQp IDogIiI7CgkvKgoKCQk3LjAgUExVR0lOIFVOSU5TVEFMTAoKCSovCgkJIyBkbyB0aGUgdW5p bnN0YWxsIG9mIHRoZSBpbmRleGVzICh0aGUgZm9ybXMgZXRjIHlvdSBoYXZlIHRvIHJlbW92 ZSBieSBoYW5kKQoJCX1lbHNlIGlmKCBpbl9hcnJheSggJHVuaW5zdGFsbCwgJGFyclllcyAp ICl7CgkJCSRhcnJTZXR1cCA9IGRvX2xpc3QoICRwcmVmc1sgIm9iMUFkdmFuY2VkU2VhcmNo IiBdWyAic2V0dXAiIF0gKTsKCQkJJGFyckZvcm1zID0gZG9fbGlzdCggJHByZWZzWyAib2Ix QWR2YW5jZWRTZWFyY2giIF1bICJmb3JtcyIgXSApOwoJCQkkYXJyQ3VzdG9tID0gZG9fbGlz dCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2giIF1bICJzZWFyY2hfY3VzdG9tIiBdICk7 CgkJCSRhcnJTZWN0aW9uID0gZG9fbGlzdCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2gi IF1bICJzZWFyY2hfc2VjdGlvbiIgXSApOwoJCQkkYXJyT2NjdXJyZW5jZXMgPSBkb19saXN0 KCAkcHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIgXVsgIm9jY3VycmVuY2VzIiBdICk7CgkJ CSMgcmVtb3ZlIGluZGV4ZXMKCQkJJHF1ZXJ5ID0gIlNIT1cgS0VZUyBGUk9NICIuc2FmZV9w ZnhfaigndGV4dHBhdHRlcm4nKS4iIFdIRVJFIEtleV9uYW1lIExJS0UgJ3NlYXJjaGluZ18l JyI7CgkJCSRycyA9IHNhZmVfcXVlcnkoJHF1ZXJ5KTsKCQkJd2hpbGUoJGlkeExpc3QgPSBt eXNxbF9mZXRjaF9hcnJheSgkcnMsTVlTUUxfQVNTT0MpKSBAJGFycklkeFtdID0gYXJyYXko ICdrZXknID0+ICRpZHhMaXN0WyJLZXlfbmFtZSJdLCd0eXBlJyA9PiAkaWR4TGlzdFsiSW5k ZXhfdHlwZSJdLCdjb2x1bW4nID0+ICRpZHhMaXN0WyJDb2x1bW5fbmFtZSJdICk7ICMgZ2V0 IHRoZSBjdXJyZW50IGluZGV4ZXMgb2YgdGhlIHRhYmxlCgkJCXVuc2V0KCRpZHhMaXN0KTsK CQkJaWYoaXNfYXJyYXkoQCRhcnJJZHgpKXsKCQkJCWZvcmVhY2goJGFycklkeCBhcyAka2V5 PT4kdmFsdWUpCgkJCQkJJGFycklkeFska2V5XSA9ICR2YWx1ZVsna2V5J107CgkJCQkkYXJy SWR4PWFycmF5X3VuaXF1ZSgkYXJySWR4KTsKCQkJCWZvcmVhY2goQCRhcnJJZHggYXMgJGtl eT0+JHZhbHVlKSB7CgkJCQkJJHF1ZXJ5ID0gIkFMVEVSIFRBQkxFICIuc2FmZV9wZnhfaign dGV4dHBhdHRlcm4nKS4iIERST1AgSU5ERVggYCIuJHZhbHVlLiJgIjsKCQkJCQkkcnMgPSBz YWZlX3F1ZXJ5KCRxdWVyeSk7CgkJCQl9CgkJCQl0cmFjZV9hZGQoICJbb2IxX2FkdmFuY2Vk X3NlYXJjaCB1bmluc3RhbGw6IE9rXSIgKTsKCQkJfWVsc2V7CgkJCQl0cmFjZV9hZGQoICJb b2IxX2FkdmFuY2VkX3NlYXJjaCB1bmluc3RhbGw6IE9rLiBOb3RlOiBObyBpbmRleGVzIGlu IHRoZSBkYXRhYmFzZV0iICk7CgkJCX0KCQl9ZWxzZXsKCS8qCgoJCTguMCBFTVBUWSBDQUxM CgoJKi8KCQkJIyBpZiBjYWxsZWQgd2l0aCBub3RoaW5nLCBvdXRwdXQgdGhlIHNlYXJjaGZv cm0gaWYgZW1wdHkgaXMgc3BlY2lmaWVkCgkJCSRhbGxvd2VkRm9ybXMgPSBkb19saXN0KCAk cHJlZnNbICJvYjFBZHZhbmNlZFNlYXJjaCIgXVsgImZvcm1zIiBdICk7CgkJCSRhcnJTaG93 U2VhcmNoID0gZG9fbGlzdCggJHByZWZzWyAib2IxQWR2YW5jZWRTZWFyY2giIF1bICJzaG93 X3NlYXJjaF9mb3JtIiBdLCAiLCIgKTsKCQkJcmV0dXJuIChpbl9hcnJheSggImVtcHR5Iiwg JGFyclNob3dTZWFyY2ggKSkgPyBvYjFfYWR2YW5jZWRfc2VhcmNoKCBhcnJheSggIm91dHB1 dCIgPT4gJGFsbG93ZWRGb3Jtc1swXSApICkgOiAnJzsKCQl9Cgl9ICMgYSBiaXQgdHJhZ2lj IHJlYWxseSwgYnV0IGhlcmUgaXQgaXMsIHRoZSBlbmQiO3M6MzoibWQ1IjtzOjMyOiJlMGVl Y2I5OTNlNTMwMzY5MmJmYzNkZjM5MjdmZmY5OSI7fQ==