# mem_moderation_article 0.4.5 # Modified version of Manfre's moderation plugin that allows articles to be submitted to the moderation queue. # Michael Manfre # http://manfre.net/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MjI6Im1lbV9tb2RlcmF0aW9uX2FydGljbGUiO3M6NjoiYXV0aG9yIjtzOjE0OiJNaWNoYWVsIE1hbmZyZSI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL21hbmZyZS5uZXQvIjtzOjc6InZlcnNpb24iO3M6NToiMC40LjUiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjEwODoiTW9kaWZpZWQgdmVyc2lvbiBvZiBNYW5mcmUncyBtb2RlcmF0aW9uIHBsdWdpbiB0aGF0IGFsbG93cyBhcnRpY2xlcyB0byBiZSBzdWJtaXR0ZWQgdG8gdGhlIG1vZGVyYXRpb24gcXVldWUuIjtzOjQ6ImhlbHAiO3M6MjYyNToiCTxoMT5BcnRpY2xlIE1vZGVyYXRpb248L2gxPg0KDQoJPHA+VGhpcyBtb2RlcmF0aW9uIHBsdWdpbiBhbGxvd3MgdXNlcnMgdG8gc3VibWl0IGFydGljbGVzIGluIHRvIHRoZSBtb2RlcmF0aW9uIHF1ZXVlLjwvcD4NCg0KCTxoMT5JbnN0YWxsYXRpb248L2gxPg0KDQoJPHA+VGhpcyBwbHVnaW4gcmVxdWlyZXMgcGx1Z2lucyBtZW1fbW9kZXJhdGlvbiBhbmQgbWVtX2FkbWluX3BhcnNlIHRvIGJlIGluc3RhbGxlZCBhbmQgZW5hYmxlZCB0byBmdW5jdGlvbi48L3A+DQoNCgk8cD48YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9YXJ0aWNsZV9tb2RlcmF0ZSYjMzg7c3RlcD1wcmVpbnN0YWxsIj5TdGFydCBJbnN0YWxsIFdpemFyZDwvYT48L3A+DQoNCgk8aDE+VGFnIExpc3QgKHdpdGggYXJndW1lbnRzKTwvaDE+DQoNCgk8cD48c3Ryb25nPm1vZF9hcnRpY2xlX2Zvcm08L3N0cm9uZz4gJiM4MjExOyBUaGlzIGNsaWVudCBzaWRlIHRhZyB3aWxsIHBsYWNlIGEgZm9ybSBmb3Igc3VibWl0dGluZyBhbmQgcmUtZWRpdGluZyBzdWJtaXR0ZWQgYXJ0aWNsZXMuPC9wPg0KCTx1bD4NCgk8bGk+Zm9ybSAmIzgyMTE7IFRoZSB0eHAgZm9ybSB0aGF0IGhvbGRzIHRoZSBsYXlvdXQgdGFncy48L2xpPg0KCQk8bGk+c3VjY2Vzc2Zvcm0gJiM4MjExOyBUaGUgdHhwIGZvcm0gdGhhdCBob2xkcyB0aGUgdGVtcGxhdGUgdG8gc2hvdyB0byB0aGUgdXNlciBvbiBhIHN1Y2Nlc3NmdWwgZm9ybSBzdWJtaXNzaW9uIChmb3IgZWl0aGVyIHNhdmUsIGVkaXQsIG9yIGRlbGV0ZSkuPC9saT4NCgk8L3VsPg0KDQoJPHA+VGhlc2UgdGFncyBtYXkgYmUgdXNlZCB3aXRoaW4gZWl0aGVyIHRoZSBmb3JtIG9yIHN1Y2Nlc3Nmb3JtLiBBbGwgb2YgdGhlc2UgdGFncyBzdXBwb3J0IHRoZSBhdHRyaWJ1dGVzICYjODIxNjtjbGFzcyYjODIxNzssIHdoaWNoIGlzIHRoZSBjc3MgY2xhc3MuPC9wPg0KDQoJPHA+PHN0cm9uZz5tb2RfY3VzdG9tX2lucHV0PC9zdHJvbmc+ICYjODIxMTsgRGlzcGxheSBhIHRleHQgaW5wdXQgZmllbGQgZm9yIGN1c3RvbSBpbnB1dCBmaWVsZHMuPC9wPg0KCTx1bD4NCgk8bGk+aWQgJiM4MjExOyBUaGUgZmllbGQgaWQgdGhpcyB0YWcgcmVwcmVzZW50cy4gRS5nLiBpZD0mIzgyMjE7MSYjODIyMTsgbWF0Y2hlcyBmaWVsZCBjdXN0b21fMTwvbGk+DQoJCTxsaT5pc2l6ZSAmIzgyMTE7IFRoZSBzaXplIG9mIHRoZSBpbnB1dCBmaWVsZC48L2xpPg0KCTwvdWw+DQoNCgk8cD48c3Ryb25nPm1vZF90aXRsZV9pbnB1dDwvc3Ryb25nPiAmIzgyMTE7IERpc3BsYXkgYSB0ZXh0IGlucHV0IGZpZWxkIGZvciB0aGUgdGl0bGUuPC9wPg0KCTx1bD4NCgk8bGk+aXNpemUgJiM4MjExOyBUaGUgc2l6ZSBvZiB0aGUgaW5wdXQgZmllbGQuPC9saT4NCgk8L3VsPg0KDQoJPHA+PHN0cm9uZz5tb2RfaW1hZ2VfaW5wdXQ8L3N0cm9uZz4gJiM4MjExOyBEaXNwbGF5IGEgdGV4dCBpbnB1dCBmaWVsZCBmb3IgdGhlIGltYWdlLjwvcD4NCgk8dWw+DQoJPGxpPmlzaXplICYjODIxMTsgVGhlIHNpemUgb2YgdGhlIGlucHV0IGZpZWxkLjwvbGk+DQoJPC91bD4NCg0KCTxwPjxzdHJvbmc+bW9kX2tleXdvcmRzX2lucHV0PC9zdHJvbmc+ICYjODIxMTsgRGlzcGxheSBhIHRleHQgaW5wdXQgZmllbGQgZm9yIHRoZSBrZXl3b3Jkcy48L3A+DQoJPHVsPg0KCTxsaT5pc2l6ZSAmIzgyMTE7IFRoZSBzaXplIG9mIHRoZSBpbnB1dCBmaWVsZC48L2xpPg0KCTwvdWw+DQoNCgk8cD48c3Ryb25nPm1vZF9ib2R5X2lucHV0PC9zdHJvbmc+ICYjODIxMTsgRGlzcGxheSBhIHRleHRhcmVhIGZpZWxkIGZvciB0aGUgYm9keS48L3A+DQoJPHVsPg0KCTxsaT5zdHlsZSAmIzgyMTE7IFRoZSBjc3Mgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRleHRhcmVhLjwvbGk+DQoJPC91bD4NCg0KCTxwPjxzdHJvbmc+bW9kX2JvZHlfaHRtbF9pbnB1dDwvc3Ryb25nPiAmIzgyMTE7IERpc3BsYXkgYSB0ZXh0YXJlYSBmaWVsZCBmb3IgdGhlIGJvZHlfaHRtbC48L3A+DQoJPHVsPg0KCTxsaT5zdHlsZSAmIzgyMTE7IFRoZSBjc3Mgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRleHRhcmVhLjwvbGk+DQoJPC91bD4NCg0KCTxwPjxzdHJvbmc+bW9kX2V4Y2VycHRfaW5wdXQ8L3N0cm9uZz4gJiM4MjExOyBEaXNwbGF5IGEgdGV4dGFyZWEgZmllbGQgZm9yIHRoZSBleGNlcnB0LjwvcD4NCgk8dWw+DQoJPGxpPnN0eWxlICYjODIxMTsgVGhlIGNzcyBzdHlsZSB0byBhcHBseSB0byB0aGUgdGV4dGFyZWEuPC9saT4NCgk8L3VsPg0KDQoJPHA+PHN0cm9uZz5tb2RfZXhjZXJwdF9odG1sX2lucHV0PC9zdHJvbmc+ICYjODIxMTsgRGlzcGxheSBhIHRleHRhcmVhIGZpZWxkIGZvciB0aGUgZXhjZXJwdF9odG1sLjwvcD4NCgk8dWw+DQoJPGxpPnN0eWxlICYjODIxMTsgVGhlIGNzcyBzdHlsZSB0byBhcHBseSB0byB0aGUgdGV4dGFyZWEuPC9saT4NCgk8L3VsPg0KDQoJPHA+PHN0cm9uZz5tb2Rfbm90ZV9pbnB1dDwvc3Ryb25nPiAmIzgyMTE7IERpc3BsYXkgYSB0ZXh0YXJlYSBmaWVsZCBmb3IgdGhlIG5vdGUgKHRvIHRoZSBtb2RlcmF0b3JzKTwvcD4NCgk8dWw+DQoJPGxpPnN0eWxlICYjODIxMTsgVGhlIGNzcyBzdHlsZSB0byBhcHBseSB0byB0aGUgdGV4dGFyZWEuPC9saT4NCgk8L3VsPg0KDQoNCg0KDQogIjtzOjQ6ImNvZGUiO3M6MTc5OTE6Ii8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLy8gUGx1Z2luOiBtZW1fbW9kZXJhdGlvbl9hcnRpY2xlDQovLyBBdXRob3I6IE1pY2hhZWwgTWFuZnJlIChodHRwOi8vbWFuZnJlLm5ldC8pDQovLyBSZXZpc2lvbnM6IAlUSElTIFBMVUdJTiBIQVMgTU9ESUZJRUQgQlkgTklDTyBGRVJBR05PTEkNCi8vCQkJCS1OT1QgMTAwJSBTVVJFIElUIFdPUktTISEhLQ0KLy8JCQkJDQovLwkJCQlPUklHSU5BTCBQTFVHSU4gTUlTU0VEIDMgJ2lkJyBBVFRSSUJVVEVTIFRPDQovLwkJCQlHRU5FUkFURSBQT1BVUCBGT1JNUyBJTiBNT0RFUkFUSU9OIFFVRVVFDQovLwkJCQlBVFRSSUJVVEVTIFdFUkU6DQovLwkJCQknY2F0ZWdvcnktMScsICdjYXRlZ29yeS0yJywgJ292ZXJyaWRlLWZvcm0nDQovLw0KLy8JCQkJQURERUQgSEVSRToJDQovLwkJCQljYXRlZ29yeV9wb3B1cCgiY2F0ZWdvcnkxIiwgJGNhdGVnb3J5MSwgJ2NhdGVnb3J5LTEnKQ0KLy8JCQkJbGluZSAzODgNCi8vCQkJCQ0KLy8JCQkJSEVSRToNCi8vCQkJCWNhdGVnb3J5X3BvcHVwKCJjYXRlZ29yeTIiLCAkY2F0ZWdvcnkyLCAnY2F0ZWdvcnktMicpDQovLwkJCQlsaW5lIDM4OA0KLy8JCQkJDQovLwkJCQkNCi8vCQkJCWFuZCBIRVJFOiANCi8vCQkJCWZvcm1fcG9wKCRvdmVycmlkZV9mb3JtLCAnb3ZlcnJpZGUtZm9ybScpDQovLwkJCQlsaW5lIDM5MQ0KLy8JCQkJCQkJCQkJCQ0KLy8NCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KZ2xvYmFsICRldmVudDsNCg0KJGFydGljbGVfdmFycyA9IGFycmF5KCdub3RlJywndXNlcicsJ2VtYWlsJywnbW9kaWQnLCdpZCcsDQoJCSd0aXRsZScsJ3RpdGxlX2h0bWwnLCdib2R5JywnYm9keV9odG1sJywnZXhjZXJwdCcsJ2V4Y2VycHRfaHRtbCcsJ3RleHRpbGVfZXhjZXJwdCcsJ2ltYWdlJywNCgkJJ3RleHRpbGVfYm9keScsJ2tleXdvcmRzJywnc3RhdHVzJywnc2VjdGlvbicsJ2NhdGVnb3J5MScsJ2NhdGVnb3J5MicsDQoJCSdhbm5vdGF0ZScsJ2Fubm90YXRlaW52aXRlJywnb3ZlcnJpZGVfZm9ybScsDQoJCSdjdXN0b21fMScsJ2N1c3RvbV8yJywnY3VzdG9tXzMnLCdjdXN0b21fNCcsJ2N1c3RvbV81JywNCgkJJ2N1c3RvbV82JywnY3VzdG9tXzcnLCdjdXN0b21fOCcsJ2N1c3RvbV85JywnY3VzdG9tXzEwJyk7DQoNCnJlcXVpcmVfcGx1Z2luKCdtZW1fbW9kZXJhdGlvbicpOw0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQppZiAoKEB0eHBpbnRlcmZhY2U9PSdhZG1pbicgYW5kICgkZXZlbnQ9PSdtb2RlcmF0ZScgb3IgJGV2ZW50PT0nYXJ0aWNsZV9tb2RlcmF0ZScpKSBvciBAdHhwaW50ZXJmYWNlIT0nYWRtaW4nKQ0KCXJlcXVpcmVfb25jZSh0eHBhdGguJy9pbmNsdWRlL3R4cF9hcnRpY2xlLnBocCcpOw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KaWYgKEB0eHBpbnRlcmZhY2UgPT0gJ2FkbWluJykgew0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdhcnRpY2xlX21vZGVyYXRlJywnYXJ0aWNsZV9tb2RlcmF0ZScsJycsIDEpOw0KCXJlZ2lzdGVyX21vZGVyYXRpb25fdHlwZSgnYXJ0aWNsZScsJGFydGljbGVfdmFycywnYXJ0aWNsZV9wcmVzZW50ZXInLCdhcnRpY2xlX2FwcHJvdmVyJywnYXJ0aWNsZV9yZWplY3RlcicpOw0KDQoJaWYgKCRldmVudD09J2FydGljbGVfbW9kZXJhdGUnKSB7DQoJCWZ1bmN0aW9uIGFydGljbGVfbW9kZXJhdGUoJGV2ZW50LCAkc3RlcCkgew0KCQkJJG1zZz0nJzsNCg0KCQkJaWYgKCRzdGVwPT0nYXJ0aWNsZV9zYXZlJyBvciAkc3RlcD09J2FydGljbGVfcG9zdCcpIHsNCgkJCQkvLyBzYXZlIGNoYW5nZXMNCgkJCQkkbXNnID0gYXJ0aWNsZV9zYXZlKCRzdGVwKTsNCgkJCX0gZWxzZSBpZiAoJHN0ZXA9PSdwcmVpbnN0YWxsJyBvciAkc3RlcD09J2luc3RhbGwnKSB7DQoJCQkJcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywnYXJ0aWNsZV9tb2RlcmF0ZScsJ2FydGljbGVfbW9kZXJhdGUnKTsNCgkJCQllY2hvIHBhZ2VUb3AoJ0FydGljbGUgTW9kZXJhdGlvbicsJycpOw0KDQoJCQkJaWYgKCRzdGVwPT0ncHJlaW5zdGFsbCcpDQoJCQkJCWVjaG8gYXJ0aWNsZV9wcmVpbnN0YWxsKCk7DQoJCQkJZWxzZQ0KCQkJCQllY2hvIGFydGljbGVfaW5zdGFsbCgpOw0KDQoJCQkJcmV0dXJuOw0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoJHN0ZXApIHsNCgkJCQkJJG1zZyA9ICJTdGVwIGlzICckc3RlcCciOw0KCQkJCX0NCgkJCX0NCg0KCQkJcGFnZVRvcCgnYXJ0aWNsZSBNb2RlcmF0aW9uJywkbXNnKTsNCg0KCQkJZWNobyAnJzsvL2FydGljbGVfbW9kZXJhdGVfZm9ybSgpOw0KCQl9DQoNCgkJZnVuY3Rpb24gYXJ0aWNsZV9wcmVpbnN0YWxsKCkgew0KCQkJcmV0dXJuIGFydGljbGVfaW5zdGFsbCgpOw0KCQl9DQoNCgkJZnVuY3Rpb24gYXJ0aWNsZV9pbnN0YWxsKCkgew0KCQkJJGxvZyA9IGFycmF5KCk7DQoNCgkJCSRmb3JtID0gZmV0Y2goJ0Zvcm0nLCd0eHBfZm9ybScsJ25hbWUnLCdtb2RfYXJ0aWNsZV9mb3JtJyk7DQoJCQlpZiAoISRmb3JtKSB7DQoJCQkJJGZvcm1faHRtbCA9IDw8PEVPRg0KPGRpdiBjbGFzcz0ic3VibWl0X2xhYmVsIj5UaXRsZTwvZGl2Pg0KPHR4cDptb2RfdGl0bGVfaW5wdXQgLz4NCg0KPGRpdiBjbGFzcz0ic3VibWl0X2xhYmVsIj5DYXRlZ29yeTwvZGl2Pg0KPHR4cDptb2RfY2F0ZWdvcnkxX3NlbGVjdCAvPg0KDQo8ZGl2IGNsYXNzPSJzdWJtaXRfbGFiZWwiPkJvZHk8L2Rpdj4NCjx0eHA6bW9kX2JvZHlfaW5wdXQgLz4NCg0KPGRpdiBjbGFzcz0ic3VibWl0X2xhYmVsIj5Ob3RlcyBmb3IgdGhlIE1vZGVyYXRvciAob3B0aW9uYWwpPC9kaXY+DQo8dHhwOm1vZF9ub3RlX2lucHV0IC8+DQo8IS0tIHRoaXMgd2lsbCBwdXQgdGhlIHN1Ym1pdHRpbmcgdXNlcm5hbWUgaW4gdG8gY3VzdG9tIGZpZWxkIDEgLS0+DQo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjdXN0b21fMSIgdmFsdWU9Jzx0eHA6bWVtX3Byb2ZpbGUgdmFyPSJuYW1lIiAvPicgLz4NCg0KPGRpdj48dHhwOm1vZF9zdWJtaXQgLz48L2Rpdj4NCkVPRjsNCgkJCQkkZm9ybV9odG1sID0gZG9TbGFzaCgkZm9ybV9odG1sKTsNCgkJCQlpZiAoc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywibmFtZT0nbW9kX2FydGljbGVfZm9ybScsdHlwZT0nbWlzYycsRm9ybT0neyRmb3JtX2h0bWx9JyIpKQ0KCQkJCQkkbG9nW10gPSAiQ3JlYXRlZCBmb3JtICdtb2RfYXJ0aWNsZV9mb3JtJyI7DQoJCQkJZWxzZQ0KCQkJCQkkbG9nW10gPSAiRmFpbGVkIHRvIGNyZWF0ZSBmb3JtICdtb2RfYXJ0aWNsZV9mb3JtJy4gIiAuIG15c3FsX2Vycm9yKCk7DQoJCQl9IGVsc2UNCgkJCQkkbG9nW10gPSAiRm91bmQgZm9ybSAnbW9kX2FydGljbGVfZm9ybScuIFNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiBkZWZhdWx0IGZvcm0uIjsNCg0KCQkJJGZvcm0gPSBmZXRjaCgnRm9ybScsJ3R4cF9mb3JtJywnbmFtZScsJ21vZF9hcnRpY2xlX3N1Y2Nlc3MnKTsNCgkJCWlmICghJGZvcm0pIHsNCgkJCQkkZm9ybV9odG1sID0gPDw8RU9GDQo8dHhwOm1lbV9pZl9zdGVwIG5hbWU9ImFydGljbGVfZGVsZXRlIj4NCgk8aDI+QXJ0aWNsZSBkZWxldGVkPC9oMj4NCgk8cD5Zb3VyIGFydGljbGUgaGFzIGJlZW4gZGVsZXRlZCBhbmQgd2lsbCBub3QgYmUgcG9zdGVkIG9uIHRoaXMgc2l0ZS48L3A+DQo8dHhwOmVsc2UgLz4NCgk8aDI+TmV3cyBzdWJtaXR0ZWQ8L2gyPg0KCTxwPlRoYW5rIHlvdSBmb3Igc3VibWl0dGluZyB5b3VyIGFydGljbGUuIEl0IHdpbGwgYmUgcmV2aWV3ZWQgYnkgYSBtb2RlcmF0b3IgYmVmb3JlIGJlaW5nIHBvc3RlZCB0byB0aGUgc2l0ZS48L3A+DQo8L3R4cDptZW1faWZfc3RlcD4NCkVPRjsNCgkJCQkkZm9ybV9odG1sID0gZG9TbGFzaCgkZm9ybV9odG1sKTsNCgkJCQlpZiAoc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywibmFtZT0nbW9kX2FydGljbGVfc3VjY2VzcycsdHlwZT0nbWlzYycsRm9ybT0neyRmb3JtX2h0bWx9JyIpKQ0KCQkJCQkkbG9nW10gPSAiQ3JlYXRlZCBmb3JtICdtb2RfYXJ0aWNsZV9mb3JtJyI7DQoJCQkJZWxzZQ0KCQkJCQkkbG9nW10gPSAiRmFpbGVkIHRvIGNyZWF0ZSBmb3JtICdtb2RfYXJ0aWNsZV9zdWNjZXNzJy4gIiAuIG15c3FsX2Vycm9yKCk7DQoJCQl9IGVsc2UNCgkJCQkkbG9nW10gPSAiRm91bmQgZm9ybSAnbW9kX2FydGljbGVfc3VjY2VzcycuIFNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiBkZWZhdWx0IGZvcm0uIjsNCg0KCQkJcmV0dXJuIHRhZygiSW5zdGFsbCBMb2ciLCdoMicpLmRvV3JhcCgkbG9nLCd1bCcsJ2xpJyk7DQoJCX0NCg0KCX0NCn0NCg0KZnVuY3Rpb24gYXJ0aWNsZV9tb2RlcmF0ZV9mb3JtKCkNCnsNCglnbG9iYWwgJHN0ZXA7DQoNCgkkZGF0YSA9IGdwc2EoYXJyYXkoJ25vdGUnLCd1c2VyJywnZW1haWwnLCdtb2RpZCcsJ2lkJywNCgkJJ3RpdGxlJywndGl0bGVfaHRtbCcsJ2JvZHknLCdib2R5X2h0bWwnLCdleGNlcnB0JywnZXhjZXJwdF9odG1sJywndGV4dGlsZV9leGNlcnB0JywnaW1hZ2UnLA0KCQkndGV4dGlsZV9ib2R5Jywna2V5d29yZHMnLCdzdGF0dXMnLCdzZWN0aW9uJywnY2F0ZWdvcnkxJywnY2F0ZWdvcnkyJywNCgkJJ2Fubm90YXRlJywnYW5ub3RhdGVpbnZpdGUnLCdvdmVycmlkZV9mb3JtJywNCgkJJ2N1c3RvbV8xJywnY3VzdG9tXzInLCdjdXN0b21fMycsJ2N1c3RvbV80JywnY3VzdG9tXzUnLA0KCQknY3VzdG9tXzYnLCdjdXN0b21fNycsJ2N1c3RvbV84JywnY3VzdG9tXzknLCdjdXN0b21fMTAnKSk7DQoNCglyZXR1cm4gYXJ0aWNsZV9wcmVzZW50ZXIoJ2FydGljbGUnLCRkYXRhKTsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gbW9kX2FydGljbGVfZm9ybSgkYXR0cywkdGhpbmc9JycpDQp7DQoJZ2xvYmFsICRzdGVwLCR0eHBfdXNlciwkaWduX3VzZXIsJG1lbV9tb2RfaW5mbywkbWVtX21vZGFydGljbGVfaW5mbzsNCglleHRyYWN0KGdwc2EoYXJyYXkoJ21vZGlkJywnYWN0aW9uJywnZXZlbnQnLCdzdGVwJywnaWQnKSkpOw0KCSR2YXJzPWFycmF5KCdub3RlJywndXNlcicsJ2VtYWlsJywNCgkndGl0bGUnLCd0aXRsZV9odG1sJywnYm9keScsJ2JvZHlfaHRtbCcsJ2V4Y2VycHQnLCdleGNlcnB0X2h0bWwnLCd0ZXh0aWxlX2V4Y2VycHQnLCdpbWFnZScsDQoJJ3RleHRpbGVfYm9keScsJ2tleXdvcmRzJywnc3RhdHVzJywnc2VjdGlvbicsJ2NhdGVnb3J5MScsJ2NhdGVnb3J5MicsDQoJJ2Fubm90YXRlJywnYW5ub3RhdGVpbnZpdGUnLCdvdmVycmlkZV9mb3JtJywNCgknY3VzdG9tXzEnLCdjdXN0b21fMicsJ2N1c3RvbV8zJywnY3VzdG9tXzQnLCdjdXN0b21fNScsDQoJJ2N1c3RvbV82JywnY3VzdG9tXzcnLCdjdXN0b21fOCcsJ2N1c3RvbV85JywnY3VzdG9tXzEwJwkpOw0KDQoJaWYgKCFlbXB0eSgkbW9kaWQpKSAkaWQgPSAkbW9kaWQ7DQoNCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGlnbl91c2VyOw0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2Zvcm0nCQk9PiAnbW9kX2FydGljbGVfZm9ybScsDQoJCSdzdWNjZXNzZm9ybScJPT4gJ21vZF9hcnRpY2xlX3N1Y2Nlc3MnDQoJKSwkYXR0cykpOw0KDQoJJG1lbV9tb2RhcnRpY2xlX2luZm8gPSBncHNhKCR2YXJzKTsNCglpZiAoaXNzZXQoJGlkKSkNCgkJJG1lbV9tb2RhcnRpY2xlX2luZm9bJ2lkJ10gPSAkaWQ7DQoJZXh0cmFjdCgkbWVtX21vZGFydGljbGVfaW5mbyk7DQoJJG91dCA9ICcnOw0KDQoJaWYgKGlzc2V0KCRhY3Rpb24pIGFuZCAkYWN0aW9uPT1nVHh0KCAnZGVsZXRlJyApKQ0KCQkkc3RlcCA9ICdhcnRpY2xlX2RlbGV0ZSc7DQoNCglpZiAoaXNzZXQoJHN0ZXApIGFuZCAoJHN0ZXA9PSdhcnRpY2xlX3NhdmUnIG9yICRzdGVwPT0nYXJ0aWNsZV91cGRhdGUnIG9yICRzdGVwPT0nYXJ0aWNsZV9kZWxldGUnKSkgew0KCQlpZiAoIWVtcHR5KCRzdWNjZXNzZm9ybSkpDQoJCQkkRm9ybSA9IGZldGNoX2Zvcm0oJHN1Y2Nlc3Nmb3JtKTsNCg0KCQlpZiAoJHN0ZXA9PSdhcnRpY2xlX2RlbGV0ZScpIHsNCgkJCWlmIChyZW1vdmVfbW9kZXJhdGVkX2NvbnRlbnQoJG1vZGlkKSkgew0KCQkJCSRtc2cgPSAnRGVsZXRlZCBhcnRpY2xlJzsNCgkJCX0gZWxzZSB7DQoJCQkJJG1zZyA9ICdGYWlsZWQgdG8gYXJ0aWNsZSBpbWFnZSc7DQoJCQl9DQoJCX0gZWxzZSBpZiAoJHN0ZXA9PSdhcnRpY2xlX3VwZGF0ZScpIHsNCgkJCWlmICh1cGRhdGVfbW9kZXJhdGVkX2NvbnRlbnQoJGlkLCRub3RlLCRtZW1fbW9kYXJ0aWNsZV9pbmZvKSkgew0KCQkJCSRyZXMgPSAnVXBkYXRlZCBBcnRpY2xlJzsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlcyA9ICdGYWlsZWQgdG8gdXBkYXRlIEFydGljbGUnOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJaWYgKCFpc3NldCgkdXNlcikpDQoJCQkJJG1lbV9tb2RhcnRpY2xlX2luZm9bJ3VzZXInXSA9ICR0eHBfdXNlcjsNCg0KCQkJJHJlcyA9IHN1Ym1pdF9tb2RlcmF0ZWRfY29udGVudCgnYXJ0aWNsZScsJycsJG1lbV9tb2RhcnRpY2xlX2luZm9bJ25vdGUnXSwkbWVtX21vZGFydGljbGVfaW5mbyk7DQoJCX0NCg0KCQkkb3V0ID0gYWRtaW5fcGFyc2UoJEZvcm0pOw0KDQoJCXVuc2V0KCRtZW1fbW9kYXJ0aWNsZV9pbmZvKTsNCgl9IGVsc2Ugew0KDQoJCWlmIChlbXB0eSgkZm9ybSkpDQoJCQkkRm9ybSA9ICR0aGluZzsNCgkJZWxzZQ0KCQkJJEZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsNCg0KDQoJCSRhY3Rpb25fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJCSRxcyA9IHN0cnBvcygkYWN0aW9uX3VybCwnPycpOw0KCQlpZiAoJHFzKSAkYWN0aW9uX3VybCA9IHN1YnN0cigkYWN0aW9uX3VybCwgMCwgJHFzKTsNCg0KCQkkb3V0ID0Jbi5uLiI8Zm9ybSBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJyBhY3Rpb249J3skYWN0aW9uX3VybH0nIG1ldGhvZD0ncG9zdCc+IiAuDQoJCQkJZUlucHV0KCdhcnRpY2xlX21vZGVyYXRlJykgLg0KCQkJCXNJbnB1dCggJHN0ZXA9PSdhcnRpY2xlX2VkaXQnID8gJ2FydGljbGVfdXBkYXRlJyA6ICdhcnRpY2xlX3NhdmUnICk7DQoNCgkJaWYgKGlzc2V0KCRtb2RpZCkgYW5kICFlbXB0eSgkbW9kaWQpKSB7DQoJCQkkb3V0IC49IGhJbnB1dCgnbW9kaWQnLCRtb2RpZCk7DQoNCgkJCSRtZW1fbW9kX2luZm8gPSBzYWZlX3JvdygnKicsJ3R4cF9tb2RlcmF0aW9uJywiYGlkYD0nIi5kb1NsYXNoKCRtb2RpZCkuIiciKTsNCg0KCQkJZXh0cmFjdCgkbWVtX21vZGFydGljbGVfaW5mbz1kZWNvZGVfY29udGVudCgkbWVtX21vZF9pbmZvWydkYXRhJ10pKTsNCgkJfQ0KDQoJCWlmIChpc3NldCgkdXNlcikgYW5kICFlbXB0eSgkdXNlcikpDQoJCQkkb3V0IC49IGhJbnB1dCgndXNlcicsJHVzZXIpOw0KCQlpZiAoaXNzZXQoJGVtYWlsKSBhbmQgIWVtcHR5KCRlbWFpbCkpDQoJCQkkb3V0IC49IGhJbnB1dCgnZW1haWwnLCRlbWFpbCk7DQoJCWVsc2UgaWYgKCRlbWFpbD1zYWZlX2ZpZWxkKCdlbWFpbCcsJ3R4cF91c2VycycsIm5hbWU9JyIuZG9TbGFzaCgkdXNlcikuIiciKSkNCgkJCSRvdXQgLj0gaElucHV0KCdlbWFpbCcsJGVtYWlsKTsNCg0KCQkkY2F0dHJlZSA9IGdldFRyZWUoInJvb3QiLCdhcnRpY2xlJyk7DQoJCSRycyA9IHNhZmVfY29sdW1uKCJuYW1lIiwgInR4cF9zZWN0aW9uIiwgIm5hbWUhPSdkZWZhdWx0JyIpOw0KCQlpZiAoIWlzc2V0KCRzZWN0aW9uKSB8fCBlbXB0eSgkc2VjdGlvbikpDQoJCQkkc2VjdGlvbiA9IGdldERlZmF1bHRTZWN0aW9uKCk7DQoJCSRzZWN0aW9uX3NlbGVjdCA9ICgkcnMpID8gc2VsZWN0SW5wdXQoInNlY3Rpb24iLCAkcnMsICRzZWN0aW9uKSA6ICcnOw0KDQoJCSR2YWxzID0gYXJyYXkoDQoJCQknY2F0ZWdvcnkxX3NlbGVjdCcJPT4gdHJlZVNlbGVjdElucHV0KCJjYXRlZ29yeTEiLCAkY2F0dHJlZSwgJGNhdGVnb3J5MSksDQoJCQknY2F0ZWdvcnkyX3NlbGVjdCcJPT4gdHJlZVNlbGVjdElucHV0KCJjYXRlZ29yeTIiLCAkY2F0dHJlZSwgJGNhdGVnb3J5MiksDQoJCQknc2VjdGlvbl9zZWxlY3QnCT0+ICRzZWN0aW9uX3NlbGVjdCwNCgkJCSdzdWJtaXQnCQkJPT4gZklucHV0KCAic3VibWl0IiwgJ2FjdGlvbicsIGdUeHQoICdzYXZlJyApLCAicHVibGlzaCIgKSwNCgkJCSdkZWxldGUnCQkJPT4gKCFlbXB0eSgkbW9kaWQpID8gZklucHV0KCAic3VibWl0IiwgJ2FjdGlvbicsIGdUeHQoICdkZWxldGUnICksICJkZWxldGUiLCAnJywgInJldHVybiBjb25maXJtKCciLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuIicpIiApIDogJycpDQoJCSk7DQoNCgkJZm9yZWFjaCAoJHZhbHMgYXMgJGE9PiRiKSB7DQoJCQkkYSA9ICc8dHhwOm1vZF8nLiRhLicgLz4nOw0KCQkJJEZvcm0gPSBzdHJfcmVwbGFjZSgkYSwkYiwkRm9ybSk7DQoJCX0NCg0KCQkkb3V0IC49IHBhcnNlKCRGb3JtKTsNCgkJJG91dCAuPSAnPC9mb3JtPicubjsNCg0KCQl1bnNldCgkbWVtX21vZF9pbmZvKTsNCgkJdW5zZXQoJG1lbV9tb2RhcnRpY2xlX2luZm8pOw0KCX0NCg0KCXJldHVybiAkb3V0Ow0KfQ0KZnVuY3Rpb24gbW9kX2N1c3RvbV9pbnB1dCgkYXR0cykgew0KCWdsb2JhbCAkbWVtX21vZGFydGljbGVfaW5mbzsNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknaWQnCT0+CScxJywNCgkJJ2lzaXplJwk9PgkyNSwNCgkJJ2NsYXNzJwk9PglfX0ZVTkNUSU9OX18NCgkpLCRhdHRzKSk7DQoJJHRpdGxlID0gJHZhbHVlID0gJG1lbV9tb2RhcnRpY2xlX2luZm9bImN1c3RvbV97JGlkfSJdOw0KCXJldHVybiBmSW5wdXQoJ3RleHQnLCJjdXN0b21feyRpZH0iLCR2YWx1ZSwkY2xhc3MsImN1c3RvbV97JGlkfSIsJycsJGlzaXplKTsNCn0NCmZ1bmN0aW9uIG1vZF90aXRsZV9pbnB1dCgkYXR0cykgew0KCWdsb2JhbCAkbWVtX21vZF9pbmZvLCRtZW1fbW9kYXJ0aWNsZV9pbmZvOw0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdpc2l6ZScJPT4JMjUsDQoJCSdjbGFzcycJPT4JX19GVU5DVElPTl9fDQoJKSwkYXR0cykpOw0KCSR0aXRsZSA9ICR2YWx1ZSA9ICRtZW1fbW9kYXJ0aWNsZV9pbmZvWyJ0aXRsZSJdOw0KCXJldHVybiBmSW5wdXQoJ3RleHQnLCJ0aXRsZSIsJHZhbHVlLCRjbGFzcywndGl0bGUnLCcnLCRpc2l6ZSk7DQp9DQpmdW5jdGlvbiBtb2RfaW1hZ2VfaW5wdXQoJGF0dHMpIHsNCglnbG9iYWwgJG1lbV9tb2RfaW5mbywkbWVtX21vZGFydGljbGVfaW5mbzsNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknaXNpemUnCT0+CTI1LA0KCQknY2xhc3MnCT0+CV9fRlVOQ1RJT05fXw0KCSksJGF0dHMpKTsNCgkkdGl0bGUgPSAkdmFsdWUgPSAkbWVtX21vZGFydGljbGVfaW5mb1siaW1hZ2UiXTsNCglyZXR1cm4gZklucHV0KCd0ZXh0JywiaW1hZ2UiLCR2YWx1ZSwkY2xhc3MsJ2ltYWdlJywnJywkaXNpemUpOw0KfQ0KZnVuY3Rpb24gbW9kX2tleXdvcmRzX2lucHV0KCRhdHRzKSB7DQoJZ2xvYmFsICRtZW1fbW9kX2luZm8sJG1lbV9tb2RhcnRpY2xlX2luZm87DQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2lzaXplJwk9PgkyNSwNCgkJJ3N0eWxlJwk9PgknJywNCgkJJ2NsYXNzJwk9PglfX0ZVTkNUSU9OX18NCgkpLCRhdHRzKSk7DQoJJHRpdGxlID0gJHZhbHVlID0gJG1lbV9tb2RhcnRpY2xlX2luZm9bImtleXdvcmRzIl07DQoJcmV0dXJuICc8dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiJy4oIWVtcHR5KCRzdHlsZSk/JyBzdHlsZT0iJy4kc3R5bGUuJyInOicnKS4NCgkJCSghZW1wdHkoJGNsYXNzKT8nIGNsYXNzPSInLiRjbGFzcy4nIic6JycpLic+Jy4NCgkJCWh0bWxzcGVjaWFsY2hhcnMoJG1lbV9tb2RhcnRpY2xlX2luZm9bJ2tleXdvcmRzJ10pLic8L3RleHRhcmVhPic7DQoNCn0NCmZ1bmN0aW9uIG1vZF9ib2R5X2lucHV0KCRhdHRzKSB7DQoJZ2xvYmFsICRtZW1fbW9kX2luZm8sJG1lbV9tb2RhcnRpY2xlX2luZm87DQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ3N0eWxlJwk9PgknJywNCgkJJ2NsYXNzJwk9PglfX0ZVTkNUSU9OX18NCgkpLCRhdHRzKSk7DQoJcmV0dXJuICc8dGV4dGFyZWEgbmFtZT0iYm9keSInLighZW1wdHkoJHN0eWxlKT8nIHN0eWxlPSInLiRzdHlsZS4nIic6JycpLg0KCQkJKCFlbXB0eSgkY2xhc3MpPycgY2xhc3M9IicuJGNsYXNzLiciJzonJykuJz4nLg0KCQkJaHRtbHNwZWNpYWxjaGFycygkbWVtX21vZGFydGljbGVfaW5mb1snYm9keSddKS4nPC90ZXh0YXJlYT4nOw0KfQ0KZnVuY3Rpb24gbW9kX2JvZHlfaHRtbF9pbnB1dCgkYXR0cykgew0KCWdsb2JhbCAkbWVtX21vZF9pbmZvLCRtZW1fbW9kYXJ0aWNsZV9pbmZvOw0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdzdHlsZScJPT4JJycsDQoJCSdjbGFzcycJPT4JX19GVU5DVElPTl9fDQoJKSwkYXR0cykpOw0KCXJldHVybiAnPHRleHRhcmVhIG5hbWU9ImJvZHlfaHRtbCInLighZW1wdHkoJHN0eWxlKT8nIHN0eWxlPSInLiRzdHlsZS4nIic6JycpLg0KCQkJKCFlbXB0eSgkY2xhc3MpPycgY2xhc3M9IicuJGNsYXNzLiciJzonJykuJz4nLg0KCQkJaHRtbHNwZWNpYWxjaGFycygkbWVtX21vZGFydGljbGVfaW5mb1snYm9keV9odG1sJ10pLic8L3RleHRhcmVhPic7DQp9DQpmdW5jdGlvbiBtb2RfZXhjZXJwdF9pbnB1dCgkYXR0cykgew0KCWdsb2JhbCAkbWVtX21vZF9pbmZvLCRtZW1fbW9kYXJ0aWNsZV9pbmZvOw0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdzdHlsZScJPT4JJycsDQoJCSdjbGFzcycJPT4JX19GVU5DVElPTl9fDQoJKSwkYXR0cykpOw0KCXJldHVybiAnPHRleHRhcmVhIG5hbWU9ImV4Y2VycHQiJy4oIWVtcHR5KCRzdHlsZSk/JyBzdHlsZT0iJy4kc3R5bGUuJyInOicnKS4NCgkJCSghZW1wdHkoJGNsYXNzKT8nIGNsYXNzPSInLiRjbGFzcy4nIic6JycpLic+Jy4NCgkJCWh0bWxzcGVjaWFsY2hhcnMoJG1lbV9tb2RhcnRpY2xlX2luZm9bJ2V4Y2VycHQnXSkuJzwvdGV4dGFyZWE+JzsNCn0NCmZ1bmN0aW9uIG1vZF9leGNlcnB0X2h0bWxfaW5wdXQoJGF0dHMpIHsNCglnbG9iYWwgJG1lbV9tb2RfaW5mbywkbWVtX21vZGFydGljbGVfaW5mbzsNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknc3R5bGUnCT0+CScnLA0KCQknY2xhc3MnCT0+CV9fRlVOQ1RJT05fXw0KCSksJGF0dHMpKTsNCglyZXR1cm4gJzx0ZXh0YXJlYSBuYW1lPSJleGNlcnB0X2h0bWwiJy4oIWVtcHR5KCRzdHlsZSk/JyBzdHlsZT0iJy4kc3R5bGUuJyInOicnKS4NCgkJCSghZW1wdHkoJGNsYXNzKT8nIGNsYXNzPSInLiRjbGFzcy4nIic6JycpLic+Jy4NCgkJCWh0bWxzcGVjaWFsY2hhcnMoJG1lbV9tb2RhcnRpY2xlX2luZm9bJ2V4Y2VycHRfaHRtbCddKS4nPC90ZXh0YXJlYT4nOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmZ1bmN0aW9uIGFydGljbGVfcHJlc2VudGVyKCR0eXBlLCRkYXRhKSB7DQoNCgkkb3V0ID0gJyc7DQoNCglpZiAoJHR5cGU9PSdhcnRpY2xlJyBhbmQgaXNfYXJyYXkoJGRhdGEpKSB7DQoJCWV4dHJhY3QoZ2V0X3ByZWZzKCkpOw0KDQoJCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCQkndXNlcicJCT0+ICcnLA0KCQkJJ2VtYWlsJwkJPT4gJycsDQoJCQkndGl0bGUnCQk9PiAnJywNCgkJCSd0aXRsZV9odG1sJwk9PiAnJywNCgkJCSdib2R5JwkJPT4gJycsDQoJCQknYm9keV9odG1sJwk9PiAnJywNCgkJCSdleGNlcnB0Jwk9PiAnJywNCgkJCSdleGNlcnB0X2h0bWwnCT0+ICcnLA0KCQkJJ2ltYWdlJwkJPT4gJycsDQoJCQkna2V5d29yZHMnCT0+ICcnLA0KCQkJJ3N0YXR1cycJPT4gJycsDQoJCQknc2VjdGlvbicJPT4gJycsDQoJCQknY2F0ZWdvcnkxJwk9PiAnJywNCgkJCSdjYXRlZ29yeTInCT0+ICcnLA0KCQkJJ2Fubm90YXRlJwk9PiAnJywNCgkJCSdhbm5vdGF0ZWludml0ZScJPT4gJGNvbW1lbnRzX2RlZmF1bHRfaW52aXRlLA0KCQkJJ292ZXJyaWRlX2Zvcm0nCT0+ICcnLA0KCQkJJ2N1c3RvbV8xJwk9PiAnJywNCgkJCSdjdXN0b21fMicJPT4gJycsDQoJCQknY3VzdG9tXzMnCT0+ICcnLA0KCQkJJ2N1c3RvbV80Jwk9PiAnJywNCgkJCSdjdXN0b21fNScJPT4gJycsDQoJCQknY3VzdG9tXzYnCT0+ICcnLA0KCQkJJ2N1c3RvbV83Jwk9PiAnJywNCgkJCSdjdXN0b21fOCcJPT4gJycsDQoJCQknY3VzdG9tXzknCT0+ICcnLA0KCQkJJ2N1c3RvbV8xMCcJPT4gJycNCgkJKSwkZGF0YSkpOw0KDQoJCWlmIChlbXB0eSgkYW5ub3RhdGVpbnZpdGUpKSAkYW5ub3RhdGVpbnZpdGUgPSAkY29tbWVudHNfZGVmYXVsdF9pbnZpdGU7DQoJCWlmIChlbXB0eSgkc2VjdGlvbikpICRzZWN0aW9uID0gZ2V0RGVmYXVsdFNlY3Rpb24oKTsNCgkJaWYgKGVtcHR5KCRhbm5vdGF0ZSkpICRhbm5vdGF0ZSA9ICgkY29tbWVudHNfb25fZGVmYXVsdD09MSA/IDEgOiAwKTsNCg0KCQkkcnMgPSBzYWZlX2NvbHVtbigibmFtZSIsICJ0eHBfc2VjdGlvbiIsICJuYW1lIT0nZGVmYXVsdCciKTsNCgkJJHNlY3Rpb25fc2VsZWN0ID0gKCRycykgPyBzZWxlY3RJbnB1dCgic2VjdGlvbiIsICRycywgJHNlY3Rpb24pIDogJyc7DQoNCgkJJG91dCA9IHN0YXJ0VGFibGUoICdlZGl0JyApIC4NCgkJCQl0ciggZkxhYmVsQ2VsbCggJ3RpdGxlJyApIC4gZklucHV0Q2VsbCggJ3RpdGxlJywgJHRpdGxlLCAxLCAzMCApKSAuDQoJCQkJKGVtcHR5KCRzZWN0aW9uX3NlbGVjdCkgPyAnJyA6IHRyKCBmTGFiZWxDZWxsKCAnc2VjdGlvbicgKSAuIHRkYSggJHNlY3Rpb25fc2VsZWN0ICkgKSkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAnY2F0ZWdvcml6ZScgKSAuIHRkYSggY2F0ZWdvcnlfcG9wdXAoImNhdGVnb3J5MSIsICRjYXRlZ29yeTEsICdjYXRlZ29yeS0xJykgLmJyLiBjYXRlZ29yeV9wb3B1cCgiY2F0ZWdvcnkyIiwgJGNhdGVnb3J5MiwgJ2NhdGVnb3J5LTInKSApICkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAnZXhjZXJwdCcgKSAuIHRkYSggJzx0ZXh0YXJlYSBuYW1lPSJleGNlcnB0IiBjb2xzPSI0MCIgcm93cz0iNCI+Jy4kZXhjZXJwdC4nPC90ZXh0YXJlYT4nLCAnIHZhbGlnbj0idG9wIicgKSApIC4NCgkJCQl0ciggZkxhYmVsQ2VsbCggJ2JvZHknICkgLiB0ZGEoICc8dGV4dGFyZWEgbmFtZT0iYm9keSIgY29scz0iNDAiIHJvd3M9IjciPicuJGJvZHkuJzwvdGV4dGFyZWE+JywgJyB2YWxpZ249InRvcCInICkgKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICdzdGF0dXMnICkgLiB0ZGEoIHNlbGVjdElucHV0KCdzdGF0dXMnLCBhcnJheSgxPT4nRHJhZnQnLDI9PidIaWRkZW4nLDM9PidQZW5kaW5nJyw0PT4nTGl2ZScsNT0+J1N0aWNreScpLDQpICkgKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICdpbWFnZScgKSAuIGZJbnB1dENlbGwoICdpbWFnZScsICRpbWFnZSwgMSwgMzAgKSkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAnYW5ub3RhdGUnICkgLiB0ZGEoIHllc25vUmFkaW8oJ2Fubm90YXRlJywkYW5ub3RhdGUpICkgKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICdhbm5vdGF0ZWludml0ZScgKSAuIGZJbnB1dENlbGwoICdhbm5vdGF0ZWludml0ZScsICRhbm5vdGF0ZWludml0ZSwgMSwgMzAgKSkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAna2V5d29yZHMnICkgLiBmSW5wdXRDZWxsKCAna2V5d29yZHMnLCAka2V5d29yZHMsIDEsIDMwICkpIC4NCgkJCQl0ciggZkxhYmVsQ2VsbCggJ292ZXJyaWRlX2RlZmF1bHRfZm9ybScgKSAuIHRkYShmb3JtX3BvcCgkb3ZlcnJpZGVfZm9ybSwgJ292ZXJyaWRlLWZvcm0nKS5wb3BIZWxwKCdvdmVycmlkZV9mb3JtJykpKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICdhdXRob3InICkgLiBmSW5wdXRDZWxsKCAndXNlcicsICR1c2VyLCAxLCAzMCApKTsNCg0KCQlmb3IoJGk9MTskaTw9MTA7JGkrKykgew0KCQkJJGsgPSAiY3VzdG9tX3skaX0iOw0KCQkJJGtzZXQgPSAiY3VzdG9tX3skaX1fc2V0IjsNCgkJCWlmIChpc3NldCgkJGtzZXQpIGFuZCAhZW1wdHkoJCRrc2V0KSkNCgkJCQkkb3V0IC49IHRyKAlmTGFiZWxDZWxsKCAkJGtzZXQgKSAuDQoJCQkJCQkJZklucHV0Q2VsbCggJGssICQkaywgMSwgMzAgKSApOw0KCQl9DQoJCSRvdXQgLj0gZW5kVGFibGUoKTsNCg0KCQkkb3V0IC49IGhJbnB1dCgnZW1haWwnLCRlbWFpbCk7DQoJCSRvdXQgLj0gaElucHV0KCdleGNlcnB0X2h0bWwnLCRleGNlcnB0X2h0bWwpOw0KCQkkb3V0IC49IGhJbnB1dCgnYm9keV9odG1sJywkYm9keV9odG1sKTsNCgkJJG91dCAuPSBoSW5wdXQoJ3RpdGxlX2h0bWwnLCR0aXRsZV9odG1sKTsNCg0KCX0NCg0KCXJldHVybiAkb3V0Ow0KfQ0KDQpmdW5jdGlvbiBhcnRpY2xlX2FwcHJvdmVyKCR0eXBlLCRkYXRhKQ0Kew0KCWdsb2JhbCAkdHhwY2ZnLCR0eHBfdXNlcjsNCg0KCWlmICgkdHlwZT09J2FydGljbGUnICYmIGlzX2FycmF5KCRkYXRhKSkgew0KCQkkaW5jb21pbmcgPSAkZGF0YTsNCg0KCQlleHRyYWN0KGdldF9wcmVmcygpKTsNCg0KCQkkbWVzc2FnZT0nJzsNCg0KCQkvLyByZW1hcCBmaWVsZCB2YWx1ZXMNCgkJJGluY29taW5nWyd0ZXh0aWxlX2JvZHknXSA9IFVTRV9URVhUSUxFOw0KCQkkaW5jb21pbmdbJ3RleHRpbGVfZXhjZXJwdCddID0gVVNFX1RFWFRJTEU7DQoJCSRpbmNvbWluZ1snU3RhdHVzJ10gPSAkaW5jb21pbmdbJ3N0YXR1cyddOw0KCQkkaW5jb21pbmdbJ1RpdGxlJ10gPSAkaW5jb21pbmdbJ3RpdGxlJ107DQoJCSRpbmNvbWluZ1snQm9keSddID0gJGluY29taW5nWydib2R5J107DQoJCSRpbmNvbWluZ1snRXhjZXJwdCddID0gJGluY29taW5nWydleGNlcnB0J107DQoJCSRpbmNvbWluZ1sncHVibGlzaF9ub3cnXSA9IDE7DQoNCgkJJGluY29taW5nID0gdGV4dGlsZV9tYWluX2ZpZWxkcygkaW5jb21pbmcsICR1c2VfdGV4dGlsZSk7DQoNCgkJZXh0cmFjdChkb1NsYXNoKCRpbmNvbWluZykpOw0KDQoJCWlmICgkcHVibGlzaF9ub3c9PTEpIHsNCgkJCSR3aGVuID0gJ25vdygpJzsNCgkJfSBlbHNlIHsNCgkJCSR3aGVuID0gc3RydG90aW1lKCR5ZWFyLictJy4kbW9udGguJy0nLiRkYXkuJyAnLiRob3VyLic6Jy4kbWludXRlLiI6MDAiKS10el9vZmZzZXQoKTsNCgkJCSR3aGVuID0gImZyb21fdW5peHRpbWUoJHdoZW4pIjsNCgkJfQ0KDQoJCWlmICgkVGl0bGUgb3IgJEJvZHkgb3IgJEV4Y2VycHQpIHsNCg0KCQkJaWYgKCFoYXNfcHJpdnMoJ2FydGljbGUucHVibGlzaCcpICYmICRTdGF0dXM+PTQpICRTdGF0dXMgPSAzOw0KCQkJaWYgKGVtcHR5KCR1cmxfdGl0bGUpKSAkdXJsX3RpdGxlID0gc3RyaXBTcGFjZSgkVGl0bGVfcGxhaW4sIDEpOw0KCQkJaWYgKCEkYW5ub3RhdGUpIHsNCgkJCQkkYW5ub3RhdGUgPSAkY29tbWVudHNfb25fZGVmYXVsdDsNCgkJCX0NCg0KCQkJaWYgKGVtcHR5KCRhbm5vdGF0ZWludml0ZSkpDQoJCQkJJGFubm90YXRlaW52aXRlID0gJGNvbW1lbnRzX2RlZmF1bHRfaW52aXRlOw0KDQoJCQkkcnMgPSBzYWZlX2luc2VydCgNCgkJCSAgICJ0ZXh0cGF0dGVybiIsDQoJCQkgICAiVGl0bGUgICAgICAgICAgID0gJyRUaXRsZScsDQoJCQkJQm9keSAgICAgICAgICAgID0gJyRCb2R5JywNCgkJCQlCb2R5X2h0bWwgICAgICAgPSAnJEJvZHlfaHRtbCcsDQoJCQkJRXhjZXJwdCAgICAgICAgID0gJyRFeGNlcnB0JywNCgkJCQlFeGNlcnB0X2h0bWwgICAgPSAnJEV4Y2VycHRfaHRtbCcsDQoJCQkJSW1hZ2UgICAgICAgICAgID0gJyRpbWFnZScsDQoJCQkJS2V5d29yZHMgICAgICAgID0gJyRrZXl3b3JkcycsDQoJCQkJU3RhdHVzICAgICAgICAgID0gJyRTdGF0dXMnLA0KCQkJCVBvc3RlZCAgICAgICAgICA9ICR3aGVuLA0KCQkJCUxhc3RNb2QgICAgICAgICA9IG5vdygpLA0KCQkJCUF1dGhvcklEICAgICAgICA9ICckdHhwX3VzZXInLA0KCQkJCVNlY3Rpb24gICAgICAgICA9ICckc2VjdGlvbicsDQoJCQkJQ2F0ZWdvcnkxICAgICAgID0gJyRjYXRlZ29yeTEnLA0KCQkJCUNhdGVnb3J5MiAgICAgICA9ICckY2F0ZWdvcnkyJywNCgkJCQl0ZXh0aWxlX2JvZHkgICAgPSAgJHRleHRpbGVfYm9keSwNCgkJCQl0ZXh0aWxlX2V4Y2VycHQgPSAgJHRleHRpbGVfZXhjZXJwdCwNCgkJCQlBbm5vdGF0ZSAgICAgICAgPSAnJGFubm90YXRlJywNCgkJCQlvdmVycmlkZV9mb3JtICAgPSAnJG92ZXJyaWRlX2Zvcm0nLA0KCQkJCXVybF90aXRsZSAgICAgICA9ICckdXJsX3RpdGxlJywNCgkJCQlBbm5vdGF0ZUludml0ZSAgPSAnJGFubm90YXRlaW52aXRlJywNCgkJCQljdXN0b21fMSAgICAgICAgPSAnJGN1c3RvbV8xJywNCgkJCQljdXN0b21fMiAgICAgICAgPSAnJGN1c3RvbV8yJywNCgkJCQljdXN0b21fMyAgICAgICAgPSAnJGN1c3RvbV8zJywNCgkJCQljdXN0b21fNCAgICAgICAgPSAnJGN1c3RvbV80JywNCgkJCQljdXN0b21fNSAgICAgICAgPSAnJGN1c3RvbV81JywNCgkJCQljdXN0b21fNiAgICAgICAgPSAnJGN1c3RvbV82JywNCgkJCQljdXN0b21fNyAgICAgICAgPSAnJGN1c3RvbV83JywNCgkJCQljdXN0b21fOCAgICAgICAgPSAnJGN1c3RvbV84JywNCgkJCQljdXN0b21fOSAgICAgICAgPSAnJGN1c3RvbV85JywNCgkJCQljdXN0b21fMTAgICAgICAgPSAnJGN1c3RvbV8xMCcsDQoJCQkJdWlkCQkJCT0gJyIubWQ1KHVuaXFpZChyYW5kKCksdHJ1ZSkpLiInLA0KCQkJCWZlZWRfdGltZQkJPSBub3coKSINCgkJCSk7DQoNCgkJCWlmICgkcnMgIT09IGZhbHNlKQ0KCQkJew0KCQkJCSRHTE9CQUxTWydJRCddID0gbXlzcWxfaW5zZXJ0X2lkKCk7DQoNCgkJCQlpZiAoJFN0YXR1cz49NCkgew0KDQoJCQkJCWRvX3BpbmdzKCk7DQoNCgkJCQkJc2FmZV91cGRhdGUoInR4cF9wcmVmcyIsICJ2YWwgPSBub3coKSIsICJuYW1lID0gJ2xhc3Rtb2QnIik7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXJldHVybiAnZXJyb3IgKCcubXlzcWxfZXJybm8oKS4nKSAtICcuIG15c3FsX2Vycm9yKCk7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlyZXR1cm4gJ21pc3NpbmcgdGl0bGUsIGJvZHksIGFuZCBleGNlcnB0JzsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlyZXR1cm4gJ2ludmFsaWQgZGF0YSBvciB0eXBlJzsNCgl9DQp9DQoNCmZ1bmN0aW9uIGFydGljbGVfcmVqZWN0ZXIoJHR5cGUsJGRhdGEpDQp7DQovLwlpZiAoJHR5cGU9PSdhcnRpY2xlJyBhbmQgaXNfYXJyYXkoJGRhdGEpKSB7DQovLwkJLy8gZG8gbm90aGluZw0KLy8JfQ0KfQ0KDQpmdW5jdGlvbiBtZW1fZ3BzX2NhdGVnb3J5KCRhdHRzKQ0Kew0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdhcmcnCT0+ICdjYXRlZ29yeTEnLA0KCQknbGluaycJPT4gMCwNCgkJJ3RpdGxlJyA9PiAxLA0KCQknc2VjdGlvbicJPT4gZ3BzKCdzZWN0aW9uJyksDQoJCSd3cmFwdGFnJwk9PiAnJywNCgkpLCRhdHRzKSk7DQoNCg0KCXJldHVybiBjYXRlZ29yeShhcnJheSgNCgkJCQkJJ2xpbmsnID0+ICRsaW5rLA0KCQkJCQkndGl0bGUnID0+ICR0aXRsZSwNCgkJCQkJJ25hbWUnID0+IGdwcygkYXJnKSwNCgkJCQkJJ3dyYXB0YWcnID0+ICR3cmFwdGFnLA0KCQkJCQknc2VjdGlvbicgPT4gJHNlY3Rpb24NCgkJCQkJKSk7DQp9DQoNCmZ1bmN0aW9uIG1lbV9ncHNfc2VjdGlvbigkYXR0cykNCnsNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknYXJnJwk9PiAnc2VjdGlvbicsDQoJCSdsaW5rJwk9PiAwLA0KCQkndGl0bGUnID0+IDEsDQoJCSd3cmFwdGFnJwk9PiAnJywNCgkpLCRhdHRzKSk7DQoNCg0KCXJldHVybiBzZWN0aW9uKGFycmF5KA0KCQkJCQknbGluaycgPT4gJGxpbmssDQoJCQkJCSd0aXRsZScgPT4gJHRpdGxlLA0KCQkJCQknbmFtZScgPT4gZ3BzKCRhcmcpLA0KCQkJCQknd3JhcHRhZycgPT4gJHdyYXB0YWcNCgkJCQkJKSk7DQp9DQoNCiI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6MzoibWQ1IjtzOjMyOiI5ZmIyMjMyM2ZlYmM1YmQ4ZjFmZWFhOTgwOWMwZjhkMiI7fQ==