# Name: soo_txp_obj v1.1.3 # Type: Library plugin # Support library for Txp plugins # Author: Jeff Soo # URL: http://ipsedixit.net/txp/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjExOiJzb29fdHhwX29iaiI7czo2OiJhdXRob3IiO3M6ODoi SmVmZiBTb28iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjU6Imh0dHA6Ly9pcHNlZGl4aXQubmV0 L3R4cC8iO3M6NzoidmVyc2lvbiI7czo1OiIxLjEuMyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MzE6IlN1cHBvcnQgbGlicmFyeSBmb3IgVHhwIHBsdWdpbnMiO3M6NDoiaGVscCI7czo2ODUz OiI8aDE+c29vX3R4cF9vYmo8L2gxPgoKPHA+QSBzdXBwb3J0IGxpYnJhcnkgZm9yIFRleHRw YXR0ZXJuIHBsdWdpbnMuPC9wPgoKPHVsPgoJPGxpPjxhIGhyZWY9Imh0dHA6Ly9pcHNlZGl4 aXQubmV0L3R4cC8yMS9zb28tdHhwLW9iaiI+SW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzPC9h PjwvbGk+Cgk8bGk+PGEgaHJlZj0iaHR0cDovL2lwc2VkaXhpdC5uZXQvYXBpL3Nvb190eHBf b2JqLyI+PHNwYW4gY2xhc3M9ImNhcHMiPkFQSTwvc3Bhbj4gRG9jdW1lbnRhdGlvbjwvYT48 L2xpPgo8L3VsPgoKPGgyIGlkPSJoaXN0b3J5Ij5WZXJzaW9uIGhpc3Rvcnk8L2gyPgoKPGgz IGlkPSIxXzFfMyI+MS4xLjM8L2gzPgoKPHA+MjAyMi0wMy0xMjwvcD4KCjx1bD4KCTxsaT48 c3BhbiBjbGFzcz0iY2FwcyI+UEhQPC9zcGFuPiA4IGNvbXBhdGliaWxpdHkgdXBkYXRlPC9s aT4KPC91bD4KCjxoMyBpZD0iMV8xXzIiPjEuMS4yPC9oMz4KCjxwPjIwMTctMDItMTU8L3A+ Cgo8dWw+Cgk8bGk+VGV4dHBhdHRlcm4gNC42IGNvbXBhdGliaWxpdHkgdXBkYXRlLiAoQnJl YWtzIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIFRleHRwYXR0ZXJu Lik8L2xpPgo8L3VsPgoKPGgzIGlkPSIxXzFfMSI+MS4xLjE8L2gzPgoKPHA+MjAxMi8wMS8y NTwvcD4KCjx1bD4KCTxsaT5Nb3ZlZCBzb29fdHhwX2xlZnRfam9pbjo6Y291bnQoKSB0byBw YXJlbnQgY2xhc3MgKHNvb190eHBfc2VsZWN0KTwvbGk+Cgk8bGk+QnVnZml4L3VwZGF0ZSBm b3Igc29vX3VyaTogYW1wZXJzYW5kcyBub3cgZW5jb2RlZC9kZWNvZGVkIGFwcHJvcHJpYXRl bHk8L2xpPgo8L3VsPgoKPGgzIGlkPSIxXzFfMCI+MS4xLjA8L2gzPgoKPHA+MjAxMS8wMS8w NzwvcD4KCjx1bD4KCTxsaT5zb29fdHhwX3NlbGVjdDo6ZGlzdGluY3QoKSBmb3IgPGNvZGU+ U0VMRUNUIERJU1RJTkNUPC9jb2RlPiBxdWVyaWVzPC9saT4KCTxsaT5CdWdmaXg6IHNvb190 eHBfbGVmdF9qb2luIG5vdyB3b3JrcyB3aXRoIGRhdGFiYXNlIHRhYmxlIHByZWZpeGVzPC9s aT4KPC91bD4KCjxoMyBpZD0iYjkiPjEuMS5iLjE8L2gzPgoKPHA+OS8xMi8yMDEwPC9wPgoK PHA+PGVtPk5vdGU6IHRoaXMgY2hhbmdlbGlzdCBpbmNsdWRlcyBpdGVtcyBmcm9tIHRoZSAx LjAuYi45IGFuZCAxLjAuYi4xMCByZWxlYXNlczwvZW0+PC9wPgoKPHVsPgoJPGxpPk5ldyBj bGFzcywgPHN0cm9uZz5zb29fdHhwX2xlZnRfam9pbjwvc3Ryb25nPiwgZm9yIDxjb2RlPlNF TEVDVCAuLi4gTEVGVCBKT0lOPC9jb2RlPiBxdWVyaWVzPC9saT4KCTxsaT48c3Ryb25nPnNv b190eHBfdXBzZXJ0PC9zdHJvbmc+IG5ldyBmZWF0dXJlczoKCTx1bD4KCQk8bGk+cHJvcGVy dGllcyBhbmQgbWV0aG9kcyBmb3IgPGNvZGU+VkFMVUVTKCk8L2NvZGU+IHN5bnRheDwvbGk+ CgkJPGxpPmNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGEgPHN0cm9uZz5zb29fdHhwX3Jvd3Nl dDwvc3Ryb25nPiBvciA8c3Ryb25nPnNvb190eHBfcm93PC9zdHJvbmc+IG9iamVjdDwvbGk+ Cgk8L3VsPjwvbGk+Cgk8bGk+PHN0cm9uZz5zb29fdHhwX3Jvd3NldDwvc3Ryb25nPiBuZXcg ZmVhdHVyZXM6Cgk8dWw+CgkJPGxpPmNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGEgcXVlcnkg cmVzdWx0IHJlc291cmNlPC9saT4KCQk8bGk+bmV3IGZ1bmN0aW9uIDxjb2RlPnN1YnNldCgp PC9jb2RlPiB0byBjcmVhdGUgYSBuZXcgcm93c2V0IG9iamVjdCBmcm9tIGFuIGV4aXN0aW5n IG9uZTwvbGk+Cgk8L3VsPjwvbGk+Cgk8bGk+TmV3IGNsYXNzLCA8c3Ryb25nPnNvb19uZXN0 ZWRfc2V0PC9zdHJvbmc+LCBmb3IgQ2Vsa28gbmVzdGVkIHNldHMgKG1vZGlmaWVkIHByZW9y ZGVyIHRyZWUpPC9saT4KCTxsaT48c3Ryb25nPnNvb19odG1sX2Zvcm08L3N0cm9uZz4sIG5l dyBmZWF0dXJlcyBhbmQgcmVsYXRlZCBjbGFzc2VzOgoJPHVsPgoJCTxsaT5Db25zdHJ1Y3Rv ciYjODIxNztzIDxjb2RlPmF0dHM8L2NvZGU+IGFyZ3VtZW50IGNhbiBpbmNsdWRlIGFuIDxj b2RlPmFjdGlvbjwvY29kZT4gYXJyYXkgZm9yIGFkZGluZyBxdWVyeSBwYXJhbWV0ZXJzIHRv IHRoZSBmb3JtJiM4MjE3O3MgPGNvZGU+YWN0aW9uPC9jb2RlPiBhdHRyaWJ1dGU8L2xpPgoJ CTxsaT5OZXcgY2xhc3NlczoKCQk8dWw+CgkJCTxsaT48c3Ryb25nPnNvb19odG1sX2xhYmVs PC9zdHJvbmc+IGZvciBsYWJlbGluZyBmb3JtIGNvbnRyb2xzPC9saT4KCQkJPGxpPjxzdHJv bmc+c29vX2h0bWxfaW5wdXQ8L3N0cm9uZz4gZm9yIGlucHV0IGVsZW1lbnRzPC9saT4KCQkJ PGxpPjxzdHJvbmc+c29vX2h0bWxfc2VsZWN0PC9zdHJvbmc+IGZvciBzZWxlY3QgZWxlbWVu dHMgKGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGFycmF5IHdoaWNoIHdpbGwgYXV0by1j cmVhdGUgYXBwcm9wcmlhdGUgPGNvZGU+b3B0aW9uPC9jb2RlPiBlbGVtZW50cyk8L2xpPgoJ CQk8bGk+PHN0cm9uZz5zb29faHRtbF9vcHRpb248L3N0cm9uZz4gKHNlZSBhYm92ZSk8L2xp PgoJCQk8bGk+PHN0cm9uZz5zb29faHRtbF90ZXh0YXJlYTwvc3Ryb25nPiBmb3IgdGV4dGFy ZWEgZWxlbWVudHM8L2xpPgoJCTwvdWw+PC9saT4KCQk8L3VsPjwvbGk+Cgk8bGk+PHN0cm9u Zz5zb29faHRtbF9pbWc8L3N0cm9uZz4gYnVnZml4IGZvciBwcmUgVHhwIDQuMiBjb21wYXRp YmlsaXR5PC9saT4KCTxsaT48c3Ryb25nPnNvb19odG1sX3RhYmxlPC9zdHJvbmc+IGNhbiBu b3cgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBhcnJheSBvZiB2YWx1ZXMgb3IgdGFibGUgY2Vs bHM7IHRoZXNlIHdpbGwgYXV0b21hdGljYWxseSBiZSBmb3JtYXR0ZWQgaW50byByb3dzIGFu ZCBjZWxscyBhcHByb3ByaWF0ZWx5PC9saT4KCTxsaT5OZXcgY2xhc3MsIDxzdHJvbmc+c29v X2h0bWxfY2FwdGlvbjwvc3Ryb25nPiwgZm9yIHRhYmxlIGNhcHRpb25zPC9saT4KCTxsaT48 c3Ryb25nPnNvb19odG1sX29sPC9zdHJvbmc+IGFuZCA8c3Ryb25nPnNvb19odG1sX3VsPC9z dHJvbmc+IGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIG5lc3RlZCBhcnJheXMsIGF1dG9tYXRp Y2FsbHkgZ2VuZXJhdGluZyBuZXN0ZWQgbGlzdHMgKHNlZSA8c3Ryb25nPnNvb19uZXN0ZWRf c2V0PC9zdHJvbmc+IGZvciBhIHBvc3NpYmxlIHNvdXJjZSBvZiB0aGUgbmVzdGVkIGFycmF5 KTwvbGk+CjwvdWw+Cgo8aDMgaWQ9ImI4Ij4xLjAuYi44PC9oMz4KCjxwPjcvOS8yMDEwPC9w PgoKPHVsPgoJPGxpPkRvY3VtZW50YXRpb24gdXBkYXRlcyAoRG94eUdlbiBjb21wYXRpYmls aXR5KTwvbGk+CjwvdWw+Cgo8aDMgaWQ9ImI3Ij4xLjAuYi43PC9oMz4KCjxwPjcvNC8yMDEw PC9wPgoKPHVsPgoJPGxpPjxzdHJvbmc+c29vX2h0bWxfaW1nPC9zdHJvbmc+IG5vdyBhZGRz IHRodW1ibmFpbCA8Y29kZT5oZWlnaHQ8L2NvZGU+IGFuZCA8Y29kZT53aWR0aDwvY29kZT4g YXR0cmlidXRlcyAoVHhwIDQuMi4wIG9yIGxhdGVyKTwvbGk+CjwvdWw+Cgo8aDMgaWQ9ImI2 Ij4xLjAuYi42PC9oMz4KCjxwPjcvMS8yMDEwPC9wPgoKPHVsPgoJPGxpPk5ldyBjbGFzczog c29vX3V0aWwsIGZvciBzdGF0aWMgdXRpbGl0eSBtZXRob2RzPC9saT4KPC91bD4KCjxoMyBp ZD0iYjUiPjEuMC5iLjU8L2gzPgoKPHA+MS8yNy8yMDEwPC9wPgoKPHVsPgoJPGxpPm5ldyBt ZXRob2Q6IDxjb2RlPndoZXJlX2NsYXVzZSgpPC9jb2RlPiBpbiA8c3Ryb25nPnNvb190eHBf cXVlcnk8L3N0cm9uZz4sIGEgY2F0Y2gtYWxsIGZvciBjb21wbGV4IGNsYXVzZXM8L2xpPgoJ PGxpPm1pbm9yIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBmb3JtYXR0aW5nIGNo YW5nZSB0byA8Y29kZT50YWcoKTwvY29kZT4gbWV0aG9kIGluIDxzdHJvbmc+c29vX2h0bWw8 L3N0cm9uZz48L2xpPgo8L3VsPgoKPGgzIGlkPSJiNCI+MS4wLmIuNDwvaDM+Cgo8cD4xMC8z LzIwMDk8L3A+Cgo8dWw+Cgk8bGk+PHN0cm9uZz5zb29fdXJpPC9zdHJvbmc+IHVwZGF0ZWQg Zm9yIGNvcnJlY3QgYmVoYXZpb3IgaW4gVHhwIHN1Yi1kaXIgaW5zdGFsbGF0aW9uczwvbGk+ CjwvdWw+Cgo8aDMgaWQ9ImIzIj4xLjAuYi4zPC9oMz4KCjxwPjkvMjIvMjAwOTwvcD4KCjx1 bD4KCTxsaT48c3Ryb25nPnNvb191cmk8L3N0cm9uZz4gbm93IGdldHMgcXVlcnkgcGFyYW1z IGJ5IHBhcnNpbmcgJF9TRVJWRVJbJiM4MjE2OzxzcGFuIGNsYXNzPSJjYXBzIj5RVUVSWTwv c3Bhbj5fU1RSSU5HJiM4MjE3O10gaW5zdGVhZCBvZiAkX0dFVDwvbGk+CjwvdWw+Cgo8aDMg aWQ9ImIyIj4xLjAuYi4yPC9oMz4KCjxwPjkvMTYvMjAwOTwvcD4KCjx1bD4KCTxsaT5OZXcg Y2FsbGJhY2sgZnVuY3Rpb24gZm9yIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IFBh Y2sgY29tcGF0aWJpbGl0eSB3aXRoIDxzdHJvbmc+c29vX3VyaTwvc3Ryb25nPjwvbGk+Cgk8 bGk+TmV3IGNsYXNzZXM6Cgk8dWw+CgkJPGxpPnNvb190eHBfdXBzZXJ0IGZvciA8c3BhbiBj bGFzcz0iY2FwcyI+U1FMPC9zcGFuPiBpbnNlcnQvdXBkYXRlIHN0YXRlbWVudHM8L2xpPgoJ CTxsaT5zb29fdHhwX2RlbGV0ZSBmb3IgPHNwYW4gY2xhc3M9ImNhcHMiPlNRTDwvc3Bhbj4g ZGVsZXRlIHN0YXRlbWVudHM8L2xpPgoJCTxsaT5zb29faHRtbF9mb3JtIGZvciBmb3JtIGVs ZW1lbnRzPC9saT4KCTwvdWw+PC9saT4KCTxsaT5zb29fdHhwX3Jvd3NldCBvdmVycmlkZXMg cGFyZW50OjpfX2dldCgpIG1ldGhvZDwvbGk+CjwvdWw+Cgo8aDMgaWQ9ImIxIj4xLjAuYi4x PC9oMz4KCjx1bD4KCTxsaT5NYWpvciByZS1vcmdhbml6YXRpb24gYW5kIHJlLXdyaXRlIG9m IG1vc3QgY2xhc3Nlcy4KCTx1bD4KCQk8bGk+VGhlIG9sZCA8c3Ryb25nPlNvb19UeHBfRGF0 YTwvc3Ryb25nPiBmYW1pbHkgaGFzIGJlZW4gZGl2aWRlZCBpbnRvIHNlcGFyYXRlIGNsYXNz ZXMgZm9yIHF1ZXJpZXMgYW5kIGRhdGEuPC9saT4KCQk8bGk+VGhlcmUgYXJlIG5vIGxvbmdl ciBzZXBhcmF0ZSBjbGFzc2VzIGZvciBlYWNoIFR4cCB0YWJsZS48L2xpPgoJCTxsaT5BbGwg Y2xhc3MgbmFtZXMgbm93IGxvd2VyY2FzZSAodGhlc2UgYXJlbiYjODIxNzt0IGNhc2Ugc2Vu c2l0aXZlIGFueXdheSkuPC9saT4KCQk8bGk+R2VuZXJpYyBzZXR0aW5nIGlzIG5vdyBpbiB0 aGUgZm9ybSA8Y29kZT5vYmotJmd0O3Byb3BlcnR5KCk8L2NvZGU+IGluc3RlYWQgb2YgPGNv ZGU+b2JqLSZndDtzZXRfcHJvcGVydHkoKTwvY29kZT4uPC9saT4KCQk8bGk+VmFyaW91cyBy ZW5hbWluZywgY29kZSBjbGVhbmluZywgZXRjLjwvbGk+Cgk8L3VsPjwvbGk+Cgk8L3VsPgoK PGgzIGlkPSJhNiI+MS4wLmEuNjwvaDM+Cgo8cD42LzIvMjAwOTwvcD4KCjxwPldoYXQgdGhl IGhlY2ssIHRpbWUgdG8gdXNlIHRoZSBzYW1lIG5hbWluZyBjb252ZW50aW9uIEkmIzgyMTc7 bSB1c2luZyB3aXRoIG90aGVyIHBsdWdpbnMuPC9wPgoKPHVsPgoJPGxpPkFkZGVkIDxzdHJv bmc+U29vX1R4cF9Vcmk8L3N0cm9uZz4gY2xhc3MsIGZvciA8c3BhbiBjbGFzcz0iY2FwcyI+ VVJJPC9zcGFuPiBxdWVyeSBzdHJpbmcgbWFuaXB1bGF0aW9uPC9saT4KCTxsaT48c3Ryb25n PlNvb19IdG1sX1A8L3N0cm9uZz4gYW5kIDxzdHJvbmc+c29vX2h0bWxfdGg8L3N0cm9uZz4g Y2FuIG5vdyBoYXZlIGNvbnRlbnRzIHNldCBkdXJpbmcgaW5zdGFudGlhdGlvbi4gTm90ZSB0 aGF0IHRoaXMgd2lsbCBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBwcmV2aW91cyB1 c2VzLCBlLmcuIDxjb2RlPm5ldyBTb29fSHRtbF9QKCRhdHRzKTwvY29kZT4uPC9saT4KCTxs aT5BZGRlZCA8Y29kZT4kaW48L2NvZGU+IGFyZ3VtZW50IHRvIDxjb2RlPndoZXJlX2luKCk8 L2NvZGU+IG1ldGhvZCAoPHN0cm9uZz5Tb29fVHhwX0RhdGE8L3N0cm9uZz4pIHRvIGFsbG93 ICYjODIyMDs8c3BhbiBjbGFzcz0iY2FwcyI+Tk9UPC9zcGFuPiBJTiYjODIyMTsgcXVlcmll czwvbGk+CjwvdWw+Cgo8aDMgaWQ9ImE1Ij4xLjAuYTU8L2gzPgoKPHA+NS8xMy8yMDA5PC9w PgoKPHVsPgoJPGxpPkNvcnJlY3RlZCA8c3BhbiBjbGFzcz0iY2FwcyI+U1FMPC9zcGFuPiBz eW50YXggaW4gPGNvZGU+b3JkZXJfYnlfZmllbGQoKTwvY29kZT4gZnVuY3Rpb24gb2YgPGNv ZGU+U29vX1R4cF9EYXRhPC9jb2RlPiBjbGFzczwvbGk+Cgk8bGk+TW9kaWZpZWQgPGNvZGU+ dGFnKCk8L2NvZGU+IGZ1bmN0aW9uIG9mIDxjb2RlPlNvb19IdG1sPC9jb2RlPiBjbGFzcyB0 byBoYW5kbGUgYSA8c3BhbiBjbGFzcz0iY2FwcyI+UEhQPC9zcGFuPiA1LjIuMCBidWc8L2xp Pgo8L3VsPgoKPGgzIGlkPSJhNCI+MS4wLmE0PC9oMz4KCjxwPjUvMS8yMDA5PC9wPgoKPHA+ QWRkZWQgPGNvZGU+Y291bnQoKTwvY29kZT4gYW5kIDxjb2RlPmZpZWxkKCk8L2NvZGU+IG1l dGhvZHMgdG8gdGhlIGFic3RyYWN0IDxjb2RlPlNvb19UeHBfRGF0YTwvY29kZT4gY2xhc3Mu PC9wPgoKPGgzIGlkPSJhMyI+MS4wLmEzPC9oMz4KCjxwPjIvMTkvMjAwOTwvcD4KCjxwPkFk ZGVkICYjODIyMDtFeHBpcmVzJiM4MjIxOyBwcm9wZXJ0eSB0byA8Y29kZT5Tb29fVHhwX0Fy dGljbGU8L2NvZGU+IGFuZCAmIzgyMjA7bG9hZF9vcmRlciYjODIyMTsgcHJvcGVydHkgdG8g PGNvZGU+U29vX1R4cF9QbHVnaW48L2NvZGU+LiBUaGVzZSBmaWVsZHMgd2VyZSBhZGRlZCBp biBUZXh0cGF0dGVybiB2ZXJzaW9uIDQuMC43LjwvcD4KCjxoMyBpZD0iYTIiPjEuMC5hMjwv aDM+Cgo8cD4yLzUvMjAwOTwvcD4KCjxwPk5vIHNpZ25pZmljYW50IGNoYW5nZXMsIGJ1dCBh ZGRlZCBnZW5lcmljIGdldHRlcnMgYW5kIHNldHRlcnMgKHRoYW5rcyB0byA8c3Ryb25nPmpt PC9zdHJvbmc+IGZvciB0aGUgaGludCksIG1ha2luZyB0aGUgZmlsZSBhYm91dCAzNSUgc21h bGxlci48L3A+Cgo8aDMgaWQ9ImExIj4xLjAuYTE8L2gzPgoKPHA+Mi80LzIwMDk8L3A+Ijtz OjQ6ImNvZGUiO3M6NDg0OTY6IgovLy8gR2VuZXJpYyBhYnN0cmFjdCBiYXNlIGNsYXNzLCB3 aXRoIGEgZmV3IGxvdy1sZXZlbCB1dGlsaXR5IG1ldGhvZHMuCmFic3RyYWN0IGNsYXNzIHNv b19vYmoKewoJLyoqIEdlbmVyaWMgZ2V0dGVyLgoJICogIEFsbG93IGNhbGxzIGluIHRoZSBm b3JtICRvYmotPnByb3BlcnR5IGZvciBwcm90ZWN0ZWQgcHJvcGVydGllcy4KCSAqLwoJcHVi bGljIGZ1bmN0aW9uIF9fZ2V0KCAkcHJvcGVydHkgKQoJewoJCXJldHVybiBpc3NldCgkdGhp cy0+JHByb3BlcnR5KSA/ICR0aGlzLT4kcHJvcGVydHkgOiBudWxsOwoJfQoKCS8qKiBNZXRo b2Qgb3ZlcmxvYWRpbmcgZm9yIGdlbmVyaWMgc2V0dGVycy4KCSAqICBBbGxvdyBjYWxscyBp biB0aGUgZm9ybSAkb2JqLT5wcm9wZXJ0eSgkdmFsdWUpLgoJICogIFJldHVybnMgJHRoaXMg dG8gYWxsb3cgbWV0aG9kIGNoYWluaW5nLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jYWxs KCAkcmVxdWVzdCwgJGFyZ3MgKQoJewoJCWlmICggaXNzZXQoJHRoaXMtPiRyZXF1ZXN0KSAp CgkJCSR0aGlzLT4kcmVxdWVzdCA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKCQlyZXR1cm4gJHRo aXM7Cgl9CgoJLyoqIFJldHVybiBhbiBvYmplY3QncyBjbGFzcyBuYW1lLgoJICogIEFsbG93 cyBvYmplY3QgdG8gYmUgdXNlZCBpbiBhIHN0cmluZyBjb250ZXh0LgoJICogIEByZXR1cm4g c3RyaW5nIENsYXNzIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJ ewoJCXJldHVybiBnZXRfY2xhc3MoJHRoaXMpOwoJfQoKCS8qKiBSZXR1cm4gYW4gb2JqZWN0 J3MgcHJvcGVydGllcyBhcyBhbiBhc3NvY2lhdGl2ZSBhcnJheS4KCSAqICBOb3RlOiBpbmNs dWRlcyBwcm90ZWN0ZWQgYW5kIHByaXZhdGUgcHJvcGVydGllcy4KCSAqICBGb3IgcHVibGlj IHByb3BlcnRpZXMgb25seSwgdXNlIGdldF9vYmplY3RfdmFycygkb2JqKSBkaXJlY3RseS4K CSAqICBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcm9wZXJ0aWVzKCkK CXsKCQlyZXR1cm4gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCX0KCgkvKiogUmV0dXJuIGFu IG9iamVjdCdzIHByb3BlcnRpZXMgYXMgYW4gaW5kZXhlZCBhcnJheS4KCSAqICBAcmV0dXJu IGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcm9wZXJ0eV9uYW1lcygpCgl7CgkJcmV0 dXJuIGFycmF5X2tleXMoJHRoaXMtPnByb3BlcnRpZXMoKSk7Cgl9Cgp9CgovLy8gQWJzdHJh Y3QgYmFzZSBjbGFzcyBmb3IgU1FMIHF1ZXJpZXMuCmFic3RyYWN0IGNsYXNzIHNvb190eHBf cXVlcnkgZXh0ZW5kcyBzb29fb2JqCnsKCS8vLyBEYXRhYmFzZSB0YWJsZSBuYW1lLgoJcHJv dGVjdGVkICR0YWJsZQkJPSAnJzsKCS8vLyBTUUwgV0hFUkUgZXhwcmVzc2lvbnMuCglwcm90 ZWN0ZWQgJHdoZXJlCQk9IGFycmF5KCk7CgkvLy8gU1FMIE9SREVSIEJZIGV4cHJlc3Npb25z LgoJcHJvdGVjdGVkICRvcmRlcl9ieQkJPSBhcnJheSgpOwoJLy8vIFNRTCBMSU1JVC4KCXBy b3RlY3RlZCAkbGltaXQJCT0gMDsKCS8vLyBTUUwgT0ZGU0VULgoJcHJvdGVjdGVkICRvZmZz ZXQJCT0gMDsKCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgVXNlICRrZXkgdG8gbWF0Y2ggYSBz aW5nbGUgcm93IG1hdGNoaW5nIG9uIGFwcHJvcHJpYXRlIGtleSBjb2x1bW4KCSAqICBJZiAk a2V5IGlzIGFuIGFycmF5LCBjdXJyZW50IGtleSBpcyB0aGUgY29sdW1uIGFuZCBjdXJyZW50 IHZhbHVlCgkgKiAgaXMgdGhlIHZhbHVlLiBPdGhlcndpc2UgY29sdW1uIHdpbGwgYmUgdGFr ZW4gZnJvbSBzZWxmOjprZXlfY29sdW1uKCkuCgkgKiAgQHBhcmFtIHRhYmxlIFRhYmxlIG5h bWUKCSAqICBAcGFyYW0ga2V5IEtleSBjb2x1bW4gdmFsdWUgKG9yIGFycmF5KSBmb3IgV0hF UkUgZXhwcmVzc2lvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICR0YWJs ZSwgJGtleSA9IG51bGwgKQoJewoJCSR0aGlzLT50YWJsZSA9IHRyaW0oJHRhYmxlKTsKCQlp ZiAoIGlzX2FycmF5KCRrZXkpICkKCQkJJHRoaXMtPndoZXJlKGtleSgka2V5KSwgY3VycmVu dCgka2V5KSk7CgkJZWxzZWlmICggJGtleSApCgkJCSR0aGlzLT53aGVyZSgkdGhpcy0+a2V5 X2NvbHVtbigka2V5KSwgJGtleSk7Cgl9CgoJLyoqIEFkZCBleHByZXNzaW9uIHRvIFdIRVJF IGNsYXVzZS4KCSAqICBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lCgkgKiAgQHBhcmFtIHZh bHVlIENvbHVtbiB2YWx1ZShzKSAoc3RyaW5nLCBhcnJheSwgb3Igc29vX3R4cF9zZWxlY3Qp CgkgKiAgQHBhcmFtIG9wZXJhdG9yIENvbXBhcmlzb24gb3BlcmF0b3IKCSAqICBAcGFyYW0g am9pbiBBTkQgb3IgT1IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdoZXJlKCAkY29sdW1uLCAk dmFsdWUsICRvcGVyYXRvciA9ICc9JywgJGpvaW4gPSAnJyApCgl7CgkJJGpvaW4gPSAkdGhp cy0+YW5kb3IoJGpvaW4pOwoKCQlpZiAoIGlzX2FycmF5KCR2YWx1ZSkgKQoJCQkkdmFsdWUg PSAnKCcgLiBpbXBsb2RlKCcsJywgcXVvdGVfbGlzdChkb1NsYXNoKCR2YWx1ZSkpKSAuICcp JzsKCQllbHNlaWYgKCAkdmFsdWUgaW5zdGFuY2VvZiBzb29fdHhwX3NlbGVjdCApCgkJCSR2 YWx1ZSA9ICcoJyAuICR2YWx1ZS0+c3FsKCkgLiAnKSc7CgkJZWxzZQoJCQkkdmFsdWUgPSAi JyR2YWx1ZSciOwoKCQkkdGhpcy0+d2hlcmVbXSA9ICggJGpvaW4gPyAiJGpvaW4gIiA6ICcn ICkgLgoJCQlzZWxmOjpxdW90ZSgkY29sdW1uKSAuICIgJG9wZXJhdG9yICR2YWx1ZSI7CgkJ cmV0dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgYSByYXcgZXhwcmVzc2lvbiB0byBXSEVSRSBj bGF1c2UuCgkgKiAgVXNlIGluc3RlYWQgb2Yge0BsaW5rIHdoZXJlKCl9IGZvciBjb21wbGV4 IChlLmcuIG5lc3RlZCkgZXhwcmVzc2lvbnMKCSAqICBAcGFyYW0gY2xhdXNlIFdIRVJFIEV4 cHJlc3Npb24KCSAqICBAcGFyYW0gam9pbiBBTkQgb3IgT1IKCSAqLwoJcHVibGljIGZ1bmN0 aW9uIHdoZXJlX2NsYXVzZSggJGNsYXVzZSwgJGpvaW4gPSAnJyApCgl7CgkJJGpvaW4gPSAk dGhpcy0+YW5kb3IoJGpvaW4pOwoJCSR0aGlzLT53aGVyZVtdID0gKCAkam9pbiA/ICIkam9p biAiIDogJycgKSAuICRjbGF1c2U7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgYW4g SU4gZXhwcmVzc2lvbiB0byB0aGUgV0hFUkUgY2xhdXNlLgoJICogIEBwYXJhbSBjb2x1bW4g Q29sdW1uIG5hbWUKCSAqICBAcGFyYW0gbGlzdCBJdGVtcyB0byBjb21wYXJlIGFnYWluc3QK CSAqICBAcGFyYW0gam9pbiBBTkQgb3IgT1IKCSAqICBAcGFyYW0gaW4gdHJ1ZSA9IElOLCBm YWxzZSA9IE5PVCBJTgoJICovCglwdWJsaWMgZnVuY3Rpb24gaW4oICRjb2x1bW4sICRsaXN0 LCAkam9pbiA9ICcnLCAkaW4gPSB0cnVlICkKCXsKCQkkaW4gPSAoICRpbiA/ICcnIDogJyBu b3QnICkgLiAnIGluJzsKCQlpZiAoIGlzX3N0cmluZygkbGlzdCkgKQoJCQkkbGlzdCA9IGRv X2xpc3QoJGxpc3QpOwoJCXJldHVybiAkdGhpcy0+d2hlcmUoJGNvbHVtbiwgJGxpc3QsICRp biwgJGpvaW4pOwoJfQoKCS8qKiBBbGlhcyBvZiBpbigpIHdpdGggJGluID0gZmFsc2UgKGFk ZCBhIE5PVCBJTiBleHByZXNzaW9uKS4KCSAqICBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1l CgkgKiAgQHBhcmFtIGxpc3QgSXRlbXMgdG8gY29tcGFyZSBhZ2FpbnN0CgkgKiAgQHBhcmFt IGpvaW4gQU5EIG9yIE9SCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBub3RfaW4oICRjb2x1bW4s ICRsaXN0LCAkam9pbiA9ICcnICkKCXsKCQlyZXR1cm4gJHRoaXMtPmluKCAkY29sdW1uICwg JGxpc3QgLCAkam9pbiAsIGZhbHNlICk7Cgl9CgoJLyoqIEFkZCBhIE15U1FMIFJFR0VYUCBl eHByZXNzaW9uIHRvIHRoZSBXSEVSRSBjbGF1c2UuCgkgKiAgQHBhcmFtIHBhdHRlcm4gTXlT UUwgUkVHRVhQIHBhdHRlcm4KCSAqICBAcGFyYW0gc3ViamVjdCBDb2x1bW4gbmFtZSBvciBz dHJpbmcgdG8gbWF0Y2gKCSAqICBAcGFyYW0gam9pbiBBTkQgb3IgT1IKCSAqLwoJcHVibGlj IGZ1bmN0aW9uIHJlZ2V4cCggJHBhdHRlcm4sICRzdWJqZWN0LCAkam9pbiA9ICcnICkKCXsK CQlyZXR1cm4gJHRoaXMtPndoZXJlKCRzdWJqZWN0LCAkcGF0dGVybiwgJ3JlZ2V4cCcsICRq b2luKTsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gYW5kb3IoICRqb2luID0gJ2FuZCcgKQoJ ewoJCSRqb2luID0gc3RydG9sb3dlcigkam9pbik7CgkJcmV0dXJuIGNvdW50KCR0aGlzLT53 aGVyZSkgPwoJCQkoIGluX2xpc3QoJGpvaW4sICdhbmQsb3InKSA/ICRqb2luIDogJ2FuZCcg KSA6ICcnOwoJfQoKCS8qKiBRdW90ZSB3aXRoIGJhY2t0aWNrcy4KCSAqICBPbmx5IHF1b3Rl IGl0ZW1zIGNvbnNpc3Rpbmcgb2YgYWxwaGFudW1lcmljcywgJCwgYW5kL29yIF8KCSAqICBA cGFyYW0gaWRlbnRpZmllciBJdGVtIHRvIHF1b3RlCgkgKiAgQHJldHVybiBzdHJpbmcKCSAq LwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBxdW90ZSggJGlkZW50aWZpZXIgKQoJewoJCXJl dHVybiBwcmVnX21hdGNoKCcvXlthLXpfJFxkXSskL2knLCAkaWRlbnRpZmllcikgPwoJCQki YCRpZGVudGlmaWVyYCIgOiAkaWRlbnRpZmllcjsKCX0KCgkvKiogQWRkIGFuIGV4cHJlc3Np b24gdG8gdGhlIE9SREVSIEJZIGFycmF5LgoJICogIEV4YW1wbGU6ICRxdWVyeS0+b3JkZXJf YnkoJ2ZvbyBBU0MsIGJhciBERVNDJyk7CgkgKiAgQHBhcmFtIGV4cHIgQ29tbWEtc2VwYXJh dGVkIGxpc3QsIG9yIGFycmF5LCBvZiBleHByZXNzaW9ucwoJICogIEBwYXJhbSBkaXJlY3Rp b24gQVNDIG9yIERFU0MKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG9yZGVyX2J5KCAkZXhwciwg JGRpcmVjdGlvbiA9ICcnICkKCXsKCQlpZiAoICRleHByICkKCQl7CgkJCWlmICggISBpc19h cnJheSgkZXhwcikgKSAkZXhwciA9IGRvX2xpc3QoJGV4cHIpOwoJCQlmb3JlYWNoICggJGV4 cHIgYXMgJHggKQoJCQl7CgkJCQlpZiAoIHByZWdfbWF0Y2goJy8oXFMrKVxzKyhcUyspLycs ICR4LCAkbWF0Y2gpICkKCQkJCQlsaXN0KCAsICRjb2x1bW4sICRkaXJlY3Rpb24pID0gJG1h dGNoOwoJCQkJZWxzZQoJCQkJCSRjb2x1bW4gPSAkeDsKCQkJCWlmICggaW5fYXJyYXkoc3Ry dG9sb3dlcigkY29sdW1uKSwgYXJyYXkoJ3JhbmRvbScsICdyYW5kJywgJ3JhbmQoKScpKSAp CgkJCQkJJGNvbHVtbiA9ICdyYW5kKCknOwoJCQkJZWxzZQoJCQkJCSRkaXJlY3Rpb24gPSBp bl9hcnJheShzdHJ0b2xvd2VyKCRkaXJlY3Rpb24pLCBhcnJheSgnYXNjJywgJ2Rlc2MnKSkg PyAkZGlyZWN0aW9uIDogJyc7CgkJCQkkdGhpcy0+b3JkZXJfYnlbXSA9ICRjb2x1bW4gLiAo ICRkaXJlY3Rpb24gPyAnICcgLiAkZGlyZWN0aW9uIDogJycpOwoJCQl9CgkJfQoJCXJldHVy biAkdGhpczsKCX0KCgkvKiogQWxpYXMgb2Ygb3JkZXJfYnkoKSBmb3IgYSBzaW5nbGUgY29s dW1uIEFTQy4KCSAqICBAcGFyYW0gY29sIENvbHVtbiBuYW1lCgkgKi8KCXB1YmxpYyBmdW5j dGlvbiBhc2MoICRjb2wgKQoJewoJCXJldHVybiAkdGhpcy0+b3JkZXJfYnkoJGNvbCwgJ2Fz YycpOwoJfQoKCS8qKiBBbGlhcyBvZiBvcmRlcl9ieSgpIGZvciBhIHNpbmdsZSBjb2x1bW4g REVTQy4KCSAqICBAcGFyYW0gY29sIENvbHVtbiBuYW1lCgkgKi8KCXB1YmxpYyBmdW5jdGlv biBkZXNjKCAkY29sICkKCXsKCQlyZXR1cm4gJHRoaXMtPm9yZGVyX2J5KCRjb2wsICdkZXNj Jyk7Cgl9CgoJLyoqIEFkZCBhIEZJRUxEKCkgZXhwcmVzc2lvbiB0byB0aGUgT1JERVIgQlkg YXJyYXkuCgkgKiAgRm9yIHByZXNlcnZpbmcgYW4gYXJiaXRyYXJ5IHNvcnQgb3JkZXIsIGUu Zy4gJzcsNSwxMiwxJwoJICogIE5vdGUgdGhhdCBGSUVMRCgpIGlzIGEgTXlTUUwtc3BlY2lm aWMgZnVuY3Rpb24gKG5vdCBzdGFuZGFyZCBTUUwpCgkgKiAgQHBhcmFtIGZpZWxkIENvbHVt biBuYW1lCgkgKiAgQHBhcmFtIGxpc3QgQ29tbWEtc2VwYXJhdGVkIGxpc3QsIG9yIGFycmF5 LCBvZiB2YWx1ZXMgaW4gb3JkZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG9yZGVyX2J5X2Zp ZWxkKCAkZmllbGQsICRsaXN0ICkKCXsKCQlpZiAoIGlzX3N0cmluZygkbGlzdCkgKSAkbGlz dCA9IGRvX2xpc3QoJGxpc3QpOwoJCWlmICggY291bnQoJGxpc3QpICkKCQkJJHRoaXMtPm9y ZGVyX2J5W10gPSAnZmllbGQoJyAuIHNlbGY6OnF1b3RlKCRmaWVsZCkgLiAnLCAnIC4KCQkJ CWltcGxvZGUoJywgJywgcXVvdGVfbGlzdChkb1NsYXNoKCRsaXN0KSkpIC4gJyknOwoJCXJl dHVybiAkdGhpczsKCX0KCgkvKiogQWRkIGEgTElNSVQgdG8gdGhlIHF1ZXJ5LgoJICogIEBw YXJhbSBsaW1pdCBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KCSAqLwoJcHVi bGljIGZ1bmN0aW9uIGxpbWl0KCAkbGltaXQgKQoJewoJCWlmICggJGxpbWl0ID0gaW50dmFs KCRsaW1pdCkgKQoJCQkkdGhpcy0+bGltaXQgPSAnIGxpbWl0ICcgLiAkbGltaXQ7CgkJcmV0 dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgYW4gT0ZGU0VUIHRvIHRoZSBxdWVyeS4KCSAqICBA cGFyYW0gb2Zmc2V0IE51bWJlciBvZiBpdGVtcyB0byBza2lwCgkgKi8KCXB1YmxpYyBmdW5j dGlvbiBvZmZzZXQoICRvZmZzZXQgKQoJewoJCWlmICggJG9mZnNldCA9IGludHZhbCgkb2Zm c2V0KSApCgkJCSR0aGlzLT5vZmZzZXQgPSAnIG9mZnNldCAnIC4gJG9mZnNldDsKCQlyZXR1 cm4gJHRoaXM7Cgl9CgoJLyoqIEFzc2VtYmxlIGFuZCByZXR1cm4gdGhlIHF1ZXJ5IGNsYXVz ZXMgYXMgYSBzdHJpbmcuCgkgKiAgQHJldHVybiBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkIGZ1 bmN0aW9uIGNsYXVzZV9zdHJpbmcoKQoJewoJCXJldHVybiBpbXBsb2RlKCcgJywgJHRoaXMt PndoZXJlKSAuCgkJCSggY291bnQoJHRoaXMtPm9yZGVyX2J5KSA/ICcgb3JkZXIgYnkgJyAu IGltcGxvZGUoJywgJywgJHRoaXMtPm9yZGVyX2J5KSA6ICcnICkgLgoJCQkoICR0aGlzLT5s aW1pdCA/ICR0aGlzLT5saW1pdCA6ICcnICkgLiAoICR0aGlzLT5vZmZzZXQgPyAkdGhpcy0+ b2Zmc2V0IDogJycgKTsKCX0KCgkvKiogTnVtYmVyIG9mIGl0ZW1zIHRoZSBxdWVyeSB3aWxs IHJldHVybi4KCSAqICBSdW5zIHRoZSBxdWVyeSB3aXRoIENPVU5UKCkgYXMgdGhlIHNlbGVj dCBleHByZXNzaW9uCgkgKiAgQHJldHVybiBpbnR8ZmFsc2UKCSAqLwoJcHVibGljIGZ1bmN0 aW9uIGNvdW50KCkKCXsKCQlyZXR1cm4gZ2V0Q291bnQoJHRoaXMtPnRhYmxlLCAkdGhpcy0+ Y2xhdXNlX3N0cmluZygpID8gJHRoaXMtPmNsYXVzZV9zdHJpbmcoKSA6ICcxPTEnKTsKCX0K CgkvKiogUmV0dXJuIHRoZSBrZXkgY29sdW1uIG5hbWUgZm9yIHRoZSBjdXJyZW50IHRhYmxl LgoJICogIFNvbWUgVHhwIHRhYmxlcyBoYXZlIG11bHRpcGxlIGluZGV4ZXMuCgkgKiAgSWYg JGtleV92YWx1ZSBpcyBwcm92aWRlZCwgY29sdW1uIG9mIHRoZSBtYXRjaGluZyB0eXBlIHdp bGwgYmUgcmV0dXJuZWQuCgkgKiAgT3RoZXJ3aXNlIHRoZSBudW1lcmljIGluZGV4IHdpbGwg YmUgcmV0dXJuZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nIGluZGV4LgoJICogIEBw YXJhbSBrZXlfdmFsdWUKCSAqICBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rp b24ga2V5X2NvbHVtbiggJGtleV92YWx1ZSA9IG51bGwgKQoJewoJCSRudW1lcmljX2luZGV4 CT0gYXJyYXkoCgkJCSd0ZXh0cGF0dGVybicJCT0+ICdJRCcsCgkJCSd0eHBfY2F0ZWdvcnkn CQk9PiAnaWQnLAoJCQkndHhwX2Rpc2N1c3MnCQk9PiAnZGlzY3Vzc2lkJywKCQkJJ3R4cF9m aWxlJwkJCT0+ICdpZCcsCgkJCSd0eHBfaW1hZ2UnCQkJPT4gJ2lkJywKCQkJJ3R4cF9sYW5n JwkJCT0+ICdpZCcsCgkJCSd0eHBfbGluaycJCQk9PiAnaWQnLAoJCQkndHhwX2xvZycJCQk9 PiAnaWQnLAoJCQkndHhwX3VzZXJzJwkJCT0+ICd1c2VyX2lkJywKCQkpOwoJCSRzdHJpbmdf aW5kZXgJCT0gYXJyYXkoCgkJCSd0ZXh0cGF0dGVybicJCT0+ICdUaXRsZScsCgkJCSd0eHBf Y2F0ZWdvcnknCQk9PiAnbmFtZScsCgkJCSd0eHBfY3NzJwkJCT0+ICduYW1lJywKCQkJJ3R4 cF9kaXNjdXNzX2lwYmFuJwk9PiAnaXAnLAoJCQkndHhwX2Rpc2N1c3Nfbm9uY2UnCT0+ICdu b25jZScsCgkJCSd0eHBfZmlsZScJCQk9PiAnZmlsZW5hbWUnLAoJCQkndHhwX2Zvcm0nCQkJ PT4gJ25hbWUnLAoJCQkndHhwX2ltYWdlJwkJCT0+ICduYW1lJywKCQkJJ3R4cF9sYW5nJwkJ CT0+ICdsYW5nJywKCQkJJ3R4cF9wYWdlJwkJCT0+ICduYW1lJywKCQkJJ3R4cF9wbHVnaW4n CQk9PiAnbmFtZScsCgkJCSd0eHBfcHJlZnMnCQkJPT4gJ25hbWUnLAoJCQkndHhwX3NlY3Rp b24nCQk9PiAnbmFtZScsCgkJCSd0eHBfdXNlcnMnCQkJPT4gJ25hbWUnLAoJCSk7CgkJaWYg KCBpc3NldCgkbnVtZXJpY19pbmRleFskdGhpcy0+dGFibGVdKSApCgkJCSRueCA9ICRudW1l cmljX2luZGV4WyR0aGlzLT50YWJsZV07CgkJaWYgKCBpc3NldCgkc3RyaW5nX2luZGV4WyR0 aGlzLT50YWJsZV0pICkKCQkJJHN4ID0gJHN0cmluZ19pbmRleFskdGhpcy0+dGFibGVdOwoK IAkJaWYgKCBpc19udW1lcmljKCRrZXlfdmFsdWUpICkKCQkJcmV0dXJuIGlzc2V0KCRueCkg PyAkbnggOiBudWxsOwogCQlpZiAoIGlzX3N0cmluZygka2V5X3ZhbHVlKSApCgkJCXJldHVy biBpc3NldCgkc3gpID8gJHN4IDogbnVsbDsKCQlyZXR1cm4gaXNzZXQoJG54KSA/ICRueCA6 ICggaXNzZXQoJHN4KSA/ICRzeCA6IG51bGwgKTsKCX0KCn0KCi8vLyBDbGFzcyBmb3IgU0VM RUNUIHF1ZXJpZXMuCmNsYXNzIHNvb190eHBfc2VsZWN0IGV4dGVuZHMgc29vX3R4cF9xdWVy eQp7CgoJLy8vIFNRTCBTRUxFQ1QgZXhwcmVzc2lvbnMuCglwcm90ZWN0ZWQgJHNlbGVjdAkJ PSBhcnJheSgpOwoJLy8vIFdoZXRoZXIgdG8gYWRkIERJU1RJTkNUCglwcm90ZWN0ZWQgJGRp c3RpbmN0CQk9IGZhbHNlOwoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gdGFibGUg VGFibGUgbmFtZQoJICogIEBwYXJhbSBrZXkgT3B0aW9uYWwga2V5IGZvciBzZWxlY3Rpbmcg YSBzaW5nbGUgcmVjb3JkCgkgKiAgQHBhcmFtIHNlbGVjdCBpdGVtKHMpIHRvIHNlbGVjdAoJ ICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICR0YWJsZSwgJGtleSA9IG51bGws ICRzZWxlY3QgPSBudWxsICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCR0YWJsZSwgJGtl eSk7CgkJaWYgKCAkc2VsZWN0ICkgJHRoaXMtPnNlbGVjdCgkc2VsZWN0KTsKCX0KCgkvKiog QWRkIGl0ZW1zIHRvIHRoZSBTRUxFQ1QgYXJyYXkuCgkgKiAgQHBhcmFtIGxpc3QJY29tbWEt c2VwYXJhdGVkIGxpc3QsIG9yIGFycmF5LCBvZiBpdGVtcyB0byBzZWxlY3QKCSAqLwoJcHVi bGljIGZ1bmN0aW9uIHNlbGVjdCggJGxpc3QgPSAnKicgKQoJewoJCWlmICggaXNfc3RyaW5n KCRsaXN0KSApICRsaXN0ID0gZG9fbGlzdCgkbGlzdCk7CgkJZm9yZWFjaCAoICRsaXN0IGFz ICRjb2wgKSAkdGhpcy0+c2VsZWN0W10gPSBwYXJlbnQ6OnF1b3RlKCRjb2wpOwoJCXJldHVy biAkdGhpczsKCX0KCgkvKiogQWRkIHRoZSBESVNUSU5DVCBrZXl3b3JkIHRvIHRoZSBxdWVy eQoJICogIEByZXR1cm4gJHRoaXMgdG8gYWxsb3cgbWV0aG9kIGNoYWluaW5nCgkgKi8KCXB1 YmxpYyBmdW5jdGlvbiBkaXN0aW5jdCggKQoJewoJCSR0aGlzLT5kaXN0aW5jdCA9IHRydWU7 CgkJcmV0dXJuICR0aGlzOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBpbml0X3F1ZXJ5KCkK CXsKCQlpZiAoICEgY291bnQoJHRoaXMtPnNlbGVjdCkgKSAkdGhpcy0+c2VsZWN0KCk7CgkJ aWYgKCAhIGNvdW50KCR0aGlzLT53aGVyZSkgKSAkdGhpcy0+d2hlcmVbXSA9ICcxID0gMSc7 Cgl9CgoJLyoqIFJldHVybiBhIHNpbmdsZSByZWNvcmQsIG9yIGVtcHR5IGFycmF5IGlmIG5v IG1hdGNoaW5nIHJlY29yZHMuCgkgKiAgQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgZnVu Y3Rpb24gcm93KCkKCXsKCQkkdGhpcy0+aW5pdF9xdWVyeSgpOwoJCXJldHVybiBzYWZlX3Jv dyhpbXBsb2RlKCcsJywgJHRoaXMtPnNlbGVjdCksICR0aGlzLT50YWJsZSwKCQkJJHRoaXMt PmNsYXVzZV9zdHJpbmcoKSk7Cgl9CgoJLyoqIFJldHVybiBhbGwgcmVjb3Jkcywgb3IgZW1w dHkgYXJyYXkgaWYgbm8gbWF0Y2hpbmcgcmVjb3Jkcy4KCSAqICBAcmV0dXJuIGFycmF5Cgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiByb3dzKCkKCXsKCQkkdGhpcy0+aW5pdF9xdWVyeSgpOwoJ CXJldHVybiBzYWZlX3Jvd3MoICggJHRoaXMtPmRpc3RpbmN0ID8gJ2Rpc3RpbmN0ICcgOiAn JykgLgoJCQlpbXBsb2RlKCcsJywgJHRoaXMtPnNlbGVjdCksICR0aGlzLT50YWJsZSwgJHRo aXMtPmNsYXVzZV9zdHJpbmcoKSk7Cgl9CgoJLyoqIFJldHVybiB0aGUgcXVlcnkgYXMgYSBz dHJpbmcuCgkgKiAgQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNxbCgp Cgl7CgkJJHRoaXMtPmluaXRfcXVlcnkoKTsKCQlyZXR1cm4gJ3NlbGVjdCAnIC4gaW1wbG9k ZSgnLCcsICR0aGlzLT5zZWxlY3QpIC4gJyBmcm9tICcgLiBzYWZlX3BmeCgkdGhpcy0+dGFi bGUpIC4gJyB3aGVyZSAnIC4gJHRoaXMtPmNsYXVzZV9zdHJpbmcoKTsKCX0KCgkvKiogUmV0 dXJuIHJlc3VsdCBvZiBhIFNFTEVDVCBDT1VOVCgqKSBxdWVyeQoJICogIEBpbnQKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIGNvdW50KCkKCXsKCQkkc2VsZWN0ID0gJHRoaXMtPnNlbGVjdDsK CQkkdGhpcy0+c2VsZWN0ID0gYXJyYXkoJ2NvdW50KCopJyk7CgkJJHIgPSBzYWZlX3F1ZXJ5 KCR0aGlzLT5zcWwoKSk7CgkJJHRoaXMtPnNlbGVjdCA9ICRzZWxlY3Q7CgkJaWYgKCAkciAm JiAkcm93ID0gbXlzcWxpX2ZldGNoX3JvdygkcikgKQoJCQlyZXR1cm4gJHJvd1swXTsKCX0K fQoKLy8vIENsYXNzIGZvciBTRUxFQ1QgLi4uIExFRlQgSk9JTiBxdWVyaWVzLgovLy8gQ3Vy cmVudGx5IHZlcnkgaW5jb21wbGV0ZTsgbmVlZHMgdG8gb3ZlcnJpZGUgbW9zdCBwYXJlbnQg bWV0aG9kcwovLy8gdG8gc3BlY2lmeSB3aGljaCB0YWJsZSBlYWNoIGV4cHJlc3Npb24gcmVm ZXJzIHRvLgpjbGFzcyBzb29fdHhwX2xlZnRfam9pbiBleHRlbmRzIHNvb190eHBfc2VsZWN0 CnsKCS8vLyBKb2luIHRhYmxlIG5hbWUKCXByb3RlY3RlZCAkbGVmdF9qb2luOwoJLy8vIE9O IGV4cHJlc3Npb24gZm9yIGpvaW4KCXByb3RlY3RlZCAkam9pbl9vbjsKCS8vLyBMZWZ0IHRh YmxlIGFsaWFzCgljb25zdCB0MSA9ICd0MSc7CgkvLy8gSm9pbiB0YWJsZSBhbGlhcwoJY29u c3QgdDIgPSAndDInOwoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gdGFibGUgTGVm dCB0YWJsZQoJICogIEBwYXJhbSBsZWZ0X2pvaW4gSm9pbiB0YWJsZQoJICogIEBwYXJhbSBj b2wxIEtleSBjb2x1bW4gbmFtZSBmb3IgbGVmdCB0YWJsZQoJICogIEBwYXJhbSBjb2wyIEtl eSBjb2x1bW4gbmFtZSBmb3Igam9pbiB0YWJsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19j b25zdHJ1Y3QgKCAkdGFibGUsICRsZWZ0X2pvaW4sICRjb2wxLCAkY29sMiApCgl7CgkJcGFy ZW50OjpfX2NvbnN0cnVjdCgkdGFibGUpOwoJCSR0aGlzLT5sZWZ0X2pvaW4gPSAkbGVmdF9q b2luOwoJCSR0aGlzLT5qb2luX29uID0gc2VsZjo6dDEgLiAnLicgLiBzZWxmOjpxdW90ZSgk Y29sMSkgLiAnID0gJyAuIHNlbGY6OnQyIC4gJy4nIC4gc2VsZjo6cXVvdGUoJGNvbDIpOwoJ fQoKCS8qKiBMaWtlIHBhcmVudDo6cXVvdGUsIG9wdGlvbmFsbHkgcHJlcGVuZGluZyB0YWJs ZSBuYW1lL2FsaWFzLgoJICogIEBwYXJhbSBpZGVudGlmaWVyIENvbHVtbiBuYW1lIG9yIGFs aWFzCgkgKiAgQHBhcmFtIHByZWZpeCBUYWJsZSBuYW1lIG9yIGFsaWFzCgkgKi8KCXB1Ymxp YyBzdGF0aWMgZnVuY3Rpb24gcXVvdGUoICRpZGVudGlmaWVyLCAkcHJlZml4ID0gJycgKQoJ ewoJCXJldHVybiAoICRwcmVmaXggPyAkcHJlZml4IC4gJy4nIDogJycgKSAuIHBhcmVudDo6 cXVvdGUoJGlkZW50aWZpZXIpOwoJfQoKCS8qKiBBZGQgaXRlbXMgdG8gdGhlIFNFTEVDVCBh cnJheSBmcm9tIHRoZSBsZWZ0IHRhYmxlLgoJICogIEBwYXJhbSBsaXN0CWNvbW1hLXNlcGFy YXRlZCBsaXN0LCBvciBhcnJheSwgb2YgaXRlbXMgdG8gc2VsZWN0CgkgKi8KCXB1YmxpYyBm dW5jdGlvbiBzZWxlY3QoICRsaXN0ID0gJyonICkKCXsKCQlyZXR1cm4gc2VsZjo6c2VsZWN0 X2Zyb20oJGxpc3QsIHNlbGY6OnQxKTsKCX0KCgkvKiogQWRkIGl0ZW1zIHRvIHRoZSBTRUxF Q1QgYXJyYXkgZnJvbSB0aGUgam9pbiB0YWJsZS4KCSAqICBAcGFyYW0gbGlzdAljb21tYS1z ZXBhcmF0ZWQgbGlzdCwgb3IgYXJyYXksIG9mIGl0ZW1zIHRvIHNlbGVjdAoJICovCglwdWJs aWMgZnVuY3Rpb24gc2VsZWN0X2pvaW4oICRsaXN0ID0gJyonICkKCXsKCQlyZXR1cm4gc2Vs Zjo6c2VsZWN0X2Zyb20oJGxpc3QsIHNlbGY6OnQyKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9u IHNlbGVjdF9mcm9tKCAkbGlzdCwgJHRhYmxlICkKCXsKCQlpZiAoIGlzX3N0cmluZygkbGlz dCkgKSAkbGlzdCA9IGRvX2xpc3QoJGxpc3QpOwoJCWZvcmVhY2ggKCAkbGlzdCBhcyAkY29s ICkgJHRoaXMtPnNlbGVjdFtdID0gc2VsZjo6cXVvdGUoJGNvbCwgJHRhYmxlKTsKCQlyZXR1 cm4gJHRoaXM7Cgl9CgoJLyoqIEFkZCBleHByZXNzaW9uIHRvIFdIRVJFIGNsYXVzZSwgcmVm ZXJyaW5nIHRvIHRoZSBsZWZ0IHRhYmxlLgoJICogIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5h bWUKCSAqICBAcGFyYW0gdmFsdWUgQ29sdW1uIHZhbHVlCgkgKiAgQHBhcmFtIG9wZXJhdG9y IENvbXBhcmlzb24gb3BlcmF0b3IKCSAqICBAcGFyYW0gam9pbiBBTkQgb3IgT1IKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIHdoZXJlKCAkY29sdW1uLCAkdmFsdWUsICRvcGVyYXRvciA9ICc9 JywgJGpvaW4gPSAnJyApCgl7CgkJcmV0dXJuIHBhcmVudDo6d2hlcmUoc2VsZjo6cXVvdGUo JGNvbHVtbiwgc2VsZjo6dDEpLCAkdmFsdWUsICRvcGVyYXRvciwgJGpvaW4pOwoJfQoKCS8q KiBBZGQgZXhwcmVzc2lvbiB0byBXSEVSRSBjbGF1c2UsIHJlZmVycmluZyB0byB0aGUgam9p biB0YWJsZS4KCSAqICBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lCgkgKiAgQHBhcmFtIHZh bHVlIENvbHVtbiB2YWx1ZQoJICogIEBwYXJhbSBvcGVyYXRvciBDb21wYXJpc29uIG9wZXJh dG9yCgkgKiAgQHBhcmFtIGpvaW4gQU5EIG9yIE9SCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3 aGVyZV9qb2luKCAkY29sdW1uLCAkdmFsdWUsICRvcGVyYXRvciA9ICc9JywgJGpvaW4gPSAn JyApCgl7CgkJcmV0dXJuIHBhcmVudDo6d2hlcmUoc2VsZjo6cXVvdGUoJGNvbHVtbiwgc2Vs Zjo6dDIpLCAkdmFsdWUsICRvcGVyYXRvciwgJGpvaW4pOwoJfQoKCS8qKiBBZGQgYW4gSVMg TlVMTCBleHByZXNzaW9uLCBmb3Igc2VsZWN0aW5nIG9ubHkgaXRlbXMgbm90IGluIHRoZSBq b2luIHRhYmxlCgkgKiAgQHBhcmFtIGNvbHVtbiBLZXkgY29sdW1uIGluIGpvaW4gdGFibGUK CSAqLwoJcHVibGljIGZ1bmN0aW9uIHdoZXJlX2pvaW5fbnVsbCggJGNvbHVtbiApCgl7CgkJ JGpvaW4gPSBwYXJlbnQ6OmFuZG9yKCcnKTsKCQkkdGhpcy0+d2hlcmVbXSA9ICggJGpvaW4g PyAkam9pbiAuICcgJyA6ICcnICkgLiBzZWxmOjpxdW90ZSgkY29sdW1uLCBzZWxmOjp0Mikg LiAnIGlzIG51bGwnOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKiogQWRkIGEgY29sdW1uIHRv IHRoZSBPUkRFUiBCWSBhcnJheS4KCSAqICBAcGFyYW0gY29sIENvbHVtbiBuYW1lIGZyb20g bGVmdCB0YWJsZQoJICogIEBwYXJhbSBkaXJlY3Rpb24gQVNDIG9yIERFU0MKCSAqLwoJcHVi bGljIGZ1bmN0aW9uIG9yZGVyX2J5KCAkY29scywgJGRpcmVjdGlvbiA9ICcnICkKCXsKCQkk ZGlyZWN0aW9uID0gaW5fYXJyYXkoc3RydG9sb3dlcigkZGlyZWN0aW9uKSwgYXJyYXkoJ2Fz YycsICdkZXNjJykpID8gJGRpcmVjdGlvbiA6ICcnOwoJCWlmICggaXNfc3RyaW5nKCRjb2xz KSApICRjb2xzID0gZG9fbGlzdCgkY29scyk7CgkJZm9yZWFjaCAoICRjb2xzIGFzICRjb2wg KQoJCXsKCQkJaWYgKCAkY29sID09ICdyYW5kb20nIG9yICRjb2wgPT0gJ3JhbmQnIG9yICRj b2wgPT0gJ3JhbmQoKScgKQoJCQl7CgkJCQkkY29sID0gJ3JhbmQoKSc7CgkJCQkkZGlyZWN0 aW9uID0gJyc7CgkJCX0KCQkJJHRoaXMtPm9yZGVyX2J5W10gPSBzZWxmOjpxdW90ZSgkY29s LCBzZWxmOjp0MSkgLiAoICRkaXJlY3Rpb24gPyAnICcgLiAkZGlyZWN0aW9uIDogJycpOwoJ CX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqIE92ZXJyaWRlIHBhcmVudCBmdW5jdGlvbjsg cmV0dXJuIGEgc2luZ2xlIHJlY29yZC4KCSAqICBAcmV0dXJuIGFycmF5CgkgKi8KCXB1Ymxp YyBmdW5jdGlvbiByb3coKQoJewoJCXJldHVybiBnZXRSb3coJHRoaXMtPnNxbCgpKTsKCX0K CgkvKiogT3ZlcnJpZGUgcGFyZW50IGZ1bmN0aW9uOyByZXR1cm4gYWxsIHJlY29yZHMKCSAq ICBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByb3dzKCkKCXsKCQlyZXR1 cm4gZ2V0Um93cygkdGhpcy0+c3FsKCkpOwoJfQoKCS8qKiBBc3NlbWJsZSBxdWVyeS4KCSAq ICBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gc3FsKCkKCXsKCQlwYXJl bnQ6OmluaXRfcXVlcnkoKTsKCQlyZXR1cm4gJ3NlbGVjdCAnIC4gaW1wbG9kZSgnLCcsICR0 aGlzLT5zZWxlY3QpIC4gJyBmcm9tICcgLiBzZWxmOjpxdW90ZShzYWZlX3BmeCgkdGhpcy0+ dGFibGUpKSAuICcgYXMgJyAuIHNlbGY6OnQxIC4gJyBsZWZ0IGpvaW4gJyAuIHNlbGY6OnF1 b3RlKHNhZmVfcGZ4KCR0aGlzLT5sZWZ0X2pvaW4pKSAuICcgYXMgJyAuIHNlbGY6OnQyIC4g JyBvbiAnIC4gJHRoaXMtPmpvaW5fb24gLiAnIHdoZXJlICcgLiAkdGhpcy0+Y2xhdXNlX3N0 cmluZygpOwoJfQp9CgovLy8gQ2xhc3MgZm9yIElOU0VSVCBhbmQgVVBEQVRFIHF1ZXJpZXMu CmNsYXNzIHNvb190eHBfdXBzZXJ0IGV4dGVuZHMgc29vX3R4cF9xdWVyeQp7CgkvLyBGb3Ig dXNlIHdpdGggVkFMVUVTKCkgc3ludGF4CgkvLy8gQ29sdW1ucyB0byBiZSBleHBsaWNpdGx5 IHNldC4KCXB1YmxpYyAkY29sdW1ucwkJCT0gYXJyYXkoKTsKCS8vLyBWQUxVRVMoKSB2YWx1 ZXMuCglwdWJsaWMgJHZhbHVlcwkJCT0gYXJyYXkoKTsKCS8vLyBWQUxVRVMoKSBjbGF1c2UK CXByb3RlY3RlZCAkdmFsdWVzX2NsYXVzZQk9ICcnOwoKCS8vIEZvciB1c2Ugd2l0aCBTRVQg Y29sX25hbWU9dmFsdWUgc3ludGF4CgkvLy8gU0VUIGNvbHVtbnMgYW5kIHZhbHVlcy4KCXB1 YmxpYyAkc2V0CQkJCT0gYXJyYXkoKTsKCS8vLyBTRVQgY2xhdXNlLgoJcHJvdGVjdGVkICRz ZXRfY2xhdXNlCT0gJyc7CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIFVzZSAkY29sIHRvIHVw ZGF0ZSBhIHNpbmdsZSByb3cgbWF0Y2hpbmcgb24gYXBwcm9wcmlhdGUga2V5IGNvbHVtbgoJ ICogICh1c3VhbGx5IGBuYW1lYCBvciBgaWRgKQoJICogIEBwYXJhbSBpbml0IFRhYmxlIG5h bWUsIHNvb190eHBfcm93c2V0LCBvciBzb29fdHhwX3JvdwoJICogIEBwYXJhbSBjb2wgS2V5 IGNvbHVtbiB2YWx1ZSBmb3IgV0hFUkUgZXhwcmVzc2lvbgoJICovCglwdWJsaWMgZnVuY3Rp b24gX19jb25zdHJ1Y3QoICRpbml0LCAkY29sID0gbnVsbCApCgl7CgkJaWYgKCBpc19zY2Fs YXIoJGluaXQpICkKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCgkaW5pdCwgJGNvbCk7CgkJZWxz ZWlmICggJGluaXQgaW5zdGFuY2VvZiBzb29fdHhwX3Jvd3NldCApCgkJewoJCQkkdGhpcy0+ dGFibGUgPSAkaW5pdC0+dGFibGU7CgkJCWlmICggJGNvbCApCgkJCQkkdGhpcy0+Y29sdW1u cyA9IGlzX2FycmF5KCRjb2wpID8gJGNvbCA6IGRvX2xpc3QoJGNvbCk7CgkJCWVsc2UKCQkJ CSR0aGlzLT5jb2x1bW5zID0gYXJyYXlfa2V5cyhjdXJyZW50KCRpbml0LT5kYXRhKSk7CgkJ CWZvcmVhY2ggKCAkaW5pdC0+cm93cyBhcyAkciApCgkJCQkkdGhpcy0+dmFsdWVzW10gPSAk ci0+ZGF0YTsKCQl9CgkJZWxzZWlmICggJGluaXQgaW5zdGFuY2VvZiBzb29fdHhwX3JvdyAp CgkJewoJCQkkdGhpcy0+dGFibGUgPSAkaW5pdC0+dGFibGU7CgkJCWlmICggJGNvbCApCgkJ CQkkdGhpcy0+Y29sdW1ucyA9IGlzX2FycmF5KCRjb2wpID8gJGNvbCA6IGRvX2xpc3QoJGNv bCk7CgkJCWVsc2UKCQkJCSR0aGlzLT5jb2x1bW5zID0gYXJyYXlfa2V5cygkaW5pdC0+ZGF0 YSk7CgkJCSR0aGlzLT52YWx1ZXNbXSA9ICRpbml0LT5kYXRhOwoJCX0KCX0KCgkvKiogQWRk IGEgY29sdW1uOnZhbHVlIHBhaXIgdG8gdGhlICRzZXQgYXJyYXkuCgkgKiAgQHBhcmFtIGNv bHVtbiBDb2x1bW4gbmFtZQoJICogIEBwYXJhbSB2YWx1ZSBDb2x1bW4gdmFsdWUKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIHNldCggJGNvbHVtbiwgJHZhbHVlICkKCXsKCQkkdGhpcy0+c2V0 WyRjb2x1bW5dID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCglwcml2YXRlIGZ1bmN0 aW9uIGluaXRfcXVlcnkoKQoJewoJCWlmICggY291bnQoJHRoaXMtPnNldCkgKQoJCXsKCQkJ Zm9yZWFjaCAoICR0aGlzLT5zZXQgYXMgJGNvbCA9PiAkdmFsICkKCQkJewoJCQkJJHZhbCA9 IGlzX251bWVyaWMoJHZhbCkgPyAkdmFsIDogIickdmFsJyI7CgkJCQkkc2V0X3BhaXJzW10g PSAiJGNvbCA9ICR2YWwiOwoJCQl9CgkJCSR0aGlzLT5zZXRfY2xhdXNlID0gaW1wbG9kZSgn LCcsICRzZXRfcGFpcnMpOwoJCX0KCQllbHNlaWYgKCBjb3VudCgkdGhpcy0+dmFsdWVzKSAp CgkJewoJCQlpZiAoIGNvdW50KCR0aGlzLT5jb2x1bW5zKSApCgkJCQkkdGhpcy0+dmFsdWVz X2NsYXVzZSA9ICcoYCcgLiBpbXBsb2RlKCdgLGAnLCAkdGhpcy0+Y29sdW1ucykgLiAnYCkg JzsKCQkJJHRoaXMtPnZhbHVlc19jbGF1c2UgLj0gJyB2YWx1ZXMgJzsKCQkJZm9yZWFjaCAo ICR0aGlzLT52YWx1ZXMgYXMgJHZzICkKCQkJewoJCQkJJHRoaXMtPnZhbHVlc19jbGF1c2Ug Lj0gJygnOwoJCQkJZm9yZWFjaCAoICR2cyBhcyAkdiApCgkJCQkJJHRoaXMtPnZhbHVlc19j bGF1c2UgLj0gKCBpc19udW1lcmljKCR2KSA/ICR2IDogIickdiciICkgLiAnLCc7CgkJCQkk dGhpcy0+dmFsdWVzX2NsYXVzZSA9IHJ0cmltKCR0aGlzLT52YWx1ZXNfY2xhdXNlLCAnLCcp IC4gJyksJzsKCQkJfQoJCQkkdGhpcy0+dmFsdWVzX2NsYXVzZSA9IHJ0cmltKCR0aGlzLT52 YWx1ZXNfY2xhdXNlLCAnLCcpIC4gJzsnOwoJCX0KCX0KCgkvKiogUnVuIHRoZSBxdWVyeS4K CSAqICBSdW5zIGFuIFVQREFURSBxdWVyeSBpZiAkd2hlcmUgaXMgc2V0LCBvdGhlcndpc2Ug SU5TRVJUCgkgKiAgQHJldHVybiBib29sIHN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJs aWMgZnVuY3Rpb24gdXBzZXJ0KCkKCXsKCQkkdGhpcy0+aW5pdF9xdWVyeSgpOwoJCWlmICgg Y291bnQoJHRoaXMtPndoZXJlKSApCgkJCXJldHVybiBzYWZlX3Vwc2VydCgkdGhpcy0+dGFi bGUsICR0aGlzLT5zZXRfY2xhdXNlLCAkdGhpcy0+Y2xhdXNlX3N0cmluZygpKTsKCQlpZiAo ICR0aGlzLT5zZXRfY2xhdXNlICkKCQkJcmV0dXJuIHNhZmVfaW5zZXJ0KCR0aGlzLT50YWJs ZSwgJHRoaXMtPnNldF9jbGF1c2UpOwoJCWlmICggJHRoaXMtPnZhbHVlc19jbGF1c2UgKQoJ CQlyZXR1cm4gc2FmZV9xdWVyeSgnaW5zZXJ0IGludG8gJyAuIHNhZmVfcGZ4KCR0aGlzLT50 YWJsZSkgLiAkdGhpcy0+dmFsdWVzX2NsYXVzZSk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgREVM RVRFIHF1ZXJpZXMuCmNsYXNzIHNvb190eHBfZGVsZXRlIGV4dGVuZHMgc29vX3R4cF9xdWVy eQp7CgkvKiogRXhlY3V0ZSB0aGUgREVMRVRFIHF1ZXJ5LgoJICogIEByZXR1cm4gYm9vbAlR dWVyeSBzdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgp Cgl7CgkJaWYgKCBjb3VudCgkdGhpcy0+d2hlcmUpICkKCQkJcmV0dXJuIHNhZmVfZGVsZXRl KCR0aGlzLT50YWJsZSwgJHRoaXMtPmNsYXVzZV9zdHJpbmcoKSk7Cgl9Cn0KCi8vLyBDbGFz cyBmb3IgZGF0YSByZXN1bHRzIHNldHMuCmNsYXNzIHNvb190eHBfcm93c2V0IGV4dGVuZHMg c29vX29iagp7CgoJLy8vIERhdGFiYXNlIHRhYmxlIG5hbWUuCglwcm90ZWN0ZWQgJHRhYmxl CQk9ICcnOwoKCS8vLyBBcnJheSBvZiBzb29fdHhwX3JvdyBvYmplY3RzLgoJcHVibGljICRy b3dzCQkJPSBhcnJheSgpOwoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICAkaW5pdCBjYW4gYmUg YSBzb29fdHhwX3NlbGVjdCBvYmplY3QsIG15c3FsIHJlc3VsdCByZXNvdXJjZSwKCSAqICBv ciBhbiBhcnJheSBvZiByZWNvcmRzLgoJICogIElmICRpbmRleCBpcyBwcm92aWRlZCBvciBp ZiAkaW5pdCBpcyBhIHNvb190eHBfc2VsZWN0IG9iamVjdCwKCSAqICB0aGUgJHJvd3MgYXJy YXkgd2lsbCBiZSBpbmRleGVkIGJ5IGtleSBjb2x1bW4gdmFsdWVzLgoJICogIEBwYXJhbSBp bml0IERhdGEgYXJyYXkgb3IgcXVlcnkgb2JqZWN0IHRvIGluaXRpYWxpemUgcm93c2V0Cgkg KiAgQHBhcmFtIHRhYmxlIFR4cCB0YWJsZSBuYW1lCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBf X2NvbnN0cnVjdCggJGluaXQgPSBhcnJheSgpLCAkdGFibGUgPSAnJywgJGluZGV4ID0gbnVs bCApCgl7CgkJaWYgKCAkaW5pdCBpbnN0YW5jZW9mIHNvb190eHBfc2VsZWN0ICkKCQl7CgkJ CSR0YWJsZSA9ICRpbml0LT50YWJsZTsKCQkJJGluZGV4ID0gJGluaXQtPmtleV9jb2x1bW4o KTsKCQkJJGluaXQgPSAkaW5pdC0+cm93cygpOwoJCX0KCQlpZiAoIGlzX3Jlc291cmNlKCRp bml0KSBhbmQgbXlzcWxfbnVtX3Jvd3MoJGluaXQpICkKCQl7CgkJCXdoaWxlICggJHIgPSBt eXNxbF9mZXRjaF9hc3NvYygkaW5pdCkgKQoJCQkJJGRhdGFbXSA9ICRyOwoJCQlteXNxbF9m cmVlX3Jlc3VsdCgkaW5pdCk7CgkJCSRpbml0ID0gJGRhdGE7CgkJfQoJCSR0aGlzLT50YWJs ZSA9ICR0YWJsZTsKCQlpZiAoIGlzX2FycmF5KCRpbml0KSBhbmQgY291bnQoJGluaXQpICkK CQl7CgkJCWZvcmVhY2ggKCAkaW5pdCBhcyAkciApCgkJCQlpZiAoICRpbmRleCApCgkJCQkJ JHRoaXMtPmFkZF9yb3coJHIsICR0YWJsZSwgJHJbJGluZGV4XSk7CgkJCQllbHNlCgkJCQkJ JHRoaXMtPmFkZF9yb3coJHIsICR0YWJsZSk7CgkJfQoJfQoKCS8qKiBHZW5lcmljIGdldHRl ciwgb3ZlcnJpZGluZyBwYXJlbnQgbWV0aG9kLgoJICogIElmICRwcm9wZXJ0eSBpcyBub3Qg YSBwcm9wZXJ0eSBuYW1lLCBsb29rIGZvciByb3cgb2JqZWN0CgkgKiAgbWF0Y2hpbmcgdGhp cyBpbmRleCB2YWx1ZQoJICogIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lLCBvciBy b3dzZXQgaW5kZXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fZ2V0KCAkcHJvcGVydHkgKQoJ ewoJCWlmICggcHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkcHJvcGVydHkpICkKCQkJcmV0dXJu ICR0aGlzLT4kcHJvcGVydHk7CgkJaWYgKCBhcnJheV9rZXlfZXhpc3RzKCRwcm9wZXJ0eSwg JHRoaXMtPnJvd3MpICkKCQkJcmV0dXJuICR0aGlzLT5yb3dzWyRwcm9wZXJ0eV07Cgl9CgoJ LyoqIFJldHVybiBhbiBhcnJheSBvZiBhbGwgdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgY29s dW1uIChmaWVsZCkuCgkgKiAgSWYgJGtleSBpcyBzZXQsIG1ha2UgaXQgYW4gYXNzb2NpYXRp dmUgYXJyYXksIHVzaW5nIHRoZSB2YWx1ZQoJICogIG9mIHRoZSBrZXkgY29sdW1uIGFzIHRo ZSBhcnJheSBpbmRleAoJICogIEBwYXJhbSBmaWVsZCBDb2x1bW4gKGZpZWxkKSBuYW1lCgkg KiAgQHBhcmFtIGtleSBLZXkgY29sdW1uIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZp ZWxkX3ZhbHMoICRmaWVsZCwgJGtleSA9IG51bGwgKQoJewoJCWZvcmVhY2ggKCAkdGhpcy0+ cm93cyBhcyAkciApCgkJCWlmICggISBpc19udWxsKCRrZXkpICkKCQkJCSRvdXRbJHItPiRr ZXldID0gJHItPiRmaWVsZDsKCQkJZWxzZQoJCQkJJG91dFtdID0gJHItPiRmaWVsZDsKCQly ZXR1cm4gaXNzZXQoJG91dCkgPyAkb3V0IDogYXJyYXkoKTsKCX0KCgkvKiogQWRkIGEgc29v X3R4cF9yb3cgb2JqZWN0IHRvICRyb3dzLgoJICogIEBwYXJhbSBkYXRhIHNvb190eHBfcm93 IG9iamVjdCBvciBrZXkgdmFsdWUKCSAqICBAcGFyYW0gdGFibGUgVHhwIHRhYmxlIG5hbWUK CSAqICBAcGFyYW0gaSBpbmRleCB2YWx1ZSBmb3IgbmV3IHJvdyBpbiAkcm93cyBhcnJheQoJ ICovCglwdWJsaWMgZnVuY3Rpb24gYWRkX3JvdyggJGRhdGEsICR0YWJsZSA9IG51bGwsICRp ID0gbnVsbCApCgl7CgkJJHRhYmxlID0gaXNfbnVsbCgkdGFibGUpID8gJHRoaXMtPnRhYmxl IDogJHRhYmxlOwoJCSRyID0gJGRhdGEgaW5zdGFuY2VvZiBzb29fdHhwX3JvdyA/CgkJCSRk YXRhIDogKCAkdGFibGUgPT0gJ3R4cF9pbWFnZScgPwoJCQkJbmV3IHNvb190eHBfaW1nKCRk YXRhKSA6IG5ldyBzb29fdHhwX3JvdygkZGF0YSwgJHRhYmxlKSApOwoJCWlmICggaXNfbnVs bCgkaSkgKQoJCQkkdGhpcy0+cm93c1tdID0gJHI7CgkJZWxzZQoJCQkkdGhpcy0+cm93c1sk aV0gPSAkcjsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqIFNwbGl0IG9mZiBhIHN1YnNldCBv ZiByb3dzIGFzIGEgbmV3IHNvb190eHBfcm93c2V0IG9iamVjdAoJICogIEBwYXJhbSBrZXkg YXJyYXkga2V5IGZvciBmaW5kaW5nIHJvd3MgZm9yIHRoZSBuZXcgc2V0CgkgKiAgQHBhcmFt IHZhbHVlIGtleSBjb2x1bW4gdmFsdWUgdG8gbWF0Y2ggZm9yIHJvd3MgZm9yIHRoZSBuZXcg c2V0CgkgKiAgQHBhcmFtIGluZGV4IGFycmF5IGluZGV4IGZvciBuZXcgcm93c2V0IHJvd3MK CSAqICBAcmV0dXJuIHNvb190eHBfcm93c2V0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdWJz ZXQoICRrZXksICR2YWx1ZSwgJGluZGV4ID0gbnVsbCApCgl7CgkJJG91dCA9IG5ldyBzZWxm OwoJCWZvcmVhY2ggKCAkdGhpcy0+cm93cyBhcyAkcm93ICkKCQkJaWYgKCAkcm93LT4ka2V5 ID09ICR2YWx1ZSApCgkJCQkkb3V0LT5hZGRfcm93KCRyb3csIG51bGwsIGlzX251bGwoJGlu ZGV4KSA/IG51bGwgOiAkcm93LT4kaW5kZXgpOwoJCXJldHVybiAkb3V0OwoJfQp9CgovLy8g Q2xhc3MgZm9yIEpvZSBDZWxrbyBuZXN0ZWQgc2V0cywgYWthIG1vZGlmaWVkIHByZW9yZGVy IHRyZWUKY2xhc3Mgc29vX25lc3RlZF9zZXQgZXh0ZW5kcyBzb29fdHhwX3Jvd3NldAp7Cgkv KiogQ29uc3RydWN0b3IuCgkgKiAgJGluaXQgY2FuIGJlIGEgc29vX3R4cF9yb3dzZXQgb2Jq ZWN0LAoJICogIG90aGVyd2lzZSBzZWUgcGFyZW50OjpfX2NvbnN0cnVjdCgpCgkgKiAgQHBh cmFtIGluaXQgRGF0YSBhcnJheSBvciBxdWVyeSBvYmplY3QgdG8gaW5pdGlhbGl6ZSByb3dz ZXQKCSAqICBAcGFyYW0gdGFibGUgVHhwIHRhYmxlIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0 aW9uIF9fY29uc3RydWN0KCAkaW5pdCA9IGFycmF5KCksICR0YWJsZSA9ICcnLCAkaW5kZXgg PSBudWxsICkKCXsKCQlpZiAoICRpbml0IGluc3RhbmNlb2Ygc29vX3R4cF9yb3dzZXQgKQoJ CXsKCQkJJHRoaXMtPnRhYmxlID0gJGluaXQtPnRhYmxlOwoJCQkkdGhpcy0+cm93cyA9ICRp bml0LT5yb3dzOwoJCX0KCQllbHNlCgkJCXBhcmVudDo6X19jb25zdHJ1Y3QoJGluaXQsICR0 YWJsZSk7Cgl9CgoJLyoqIFJldHVybiBhbGwgcm93cyBhcyBhIG5lc3RlZCBhcnJheSBvZiBy b3cgb2JqZWN0cy4KCSAqICBFYWNoIGFycmF5IGl0ZW0gaXMgZWl0aGVyIGEgc29vX3R4cF9y b3cgb2JqZWN0LAoJICogIG9yIGFuIGFycmF5IG9mIHN1Y2guIElmIGFuIGFycmF5LCBpdCBp cyB0aGUgY2hpbGRyZW4gb2YgdGhlCgkgKiAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGl0ZW0u CgkgKiAgVGhpcyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbi4KCSAqICBAcGFyYW0gcm93cyBJ bnRlcm5hbCB1c2Ugb25seS4KCSAqICBAcGFyYW0gcmd0IEludGVybmFsIHVzZSBvbmx5LgoJ ICovCglwdWJsaWMgZnVuY3Rpb24gYXNfb2JqZWN0X2FycmF5KCAmJHJvd3MgPSBudWxsLCAk cmd0ID0gbnVsbCApCgl7CgkJaWYgKCBpc19udWxsKCRyb3dzKSApCgkJewoJCQkkcm93cyA9 ICR0aGlzLT5yb3dzOwoJCQkkcm9vdCA9IGN1cnJlbnQoJHJvd3MpOwoJCQkkcmd0ID0gJHJv b3QtPnJndDsKCQl9CgkJd2hpbGUgKCAkb3V0W10gPSAkbm9kZSA9IGFycmF5X3NoaWZ0KCRy b3dzKSBhbmQgJG5vZGUtPnJndCA8PSAkcmd0ICkKCQkJaWYgKCAkbm9kZS0+cmd0ID4gJG5v ZGUtPmxmdCArIDEgKQoJCQkJJG91dFtdID0gJHRoaXMtPmFzX29iamVjdF9hcnJheSgkcm93 cywgJG5vZGUtPnJndCk7CiAJCWlmICggJG5vZGUgYW5kICRub2RlLT5yZ3QgPiAkcmd0ICkK IAkJCWFycmF5X3Vuc2hpZnQoJHJvd3MsIGFycmF5X3BvcCgkb3V0KSk7CiAJCWlmICggaXNf bnVsbCgkb3V0W2NvdW50KCRvdXQpIC0gMV0pICkKIAkJCWFycmF5X3BvcCgkb3V0KTsKCQly ZXR1cm4gJG91dDsKCX0KCgkvKiogUmV0dXJuIGFsbCByb3dzIGFzIGEgbmVzdGVkIGFycmF5 IG9mIHZhbHVlcy4KCSAqICBFYWNoIGFycmF5IGl0ZW0gaXMgZWl0aGVyIGEgbm9kZSwgYXMg JGluZGV4X2NvbHVtbiA9PiAkdmFsdWVfY29sdW1uLAoJICogIG9yIGFuIGFycmF5IG9mIHN1 Y2guIElmIGFuIGFycmF5LCBpdCBpcyB0aGUgY2hpbGRyZW4gb2YgdGhlCgkgKiAgaW1tZWRp YXRlbHkgcHJlY2VkaW5nIGl0ZW0sIGFuZCBoYXMgdGhlIGtleSAneF9jJyB3aGVyZSAneCcg aXMKCSAqICB0aGUgcGFyZW50IG5vZGUncyBpbmRleC4KCSAqICBUaGlzIGlzIGEgcmVjdXJz aXZlIGZ1bmN0aW9uLgoJICogIEBwYXJhbSBpbmRleF9jb2x1bW4gQ29sdW1uIGZvciBub2Rl IGluZGV4IHZhbHVlCgkgKiAgQHBhcmFtIGluZGV4X2NvbHVtbiBDb2x1bW4gZm9yIG5vZGUg dmFsdWUKCSAqICBAcGFyYW0gcm93cyBJbnRlcm5hbCB1c2Ugb25seS4KCSAqICBAcGFyYW0g cmd0IEludGVybmFsIHVzZSBvbmx5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gYXNfYXJyYXko ICRpbmRleF9jb2x1bW4sICR2YWx1ZV9jb2x1bW4sICYkcm93cyA9IG51bGwsICRyZ3QgPSBu dWxsICkKCXsKCQlpZiAoIGlzX251bGwoJHJvd3MpICkKCQl7CgkJCSRyb3dzID0gJHRoaXMt PnJvd3M7CgkJCSRyb290ID0gY3VycmVudCgkcm93cyk7CgkJCSRyZ3QgPSAkcm9vdC0+cmd0 OwoJCX0KCQl3aGlsZSAoICRub2RlID0gYXJyYXlfc2hpZnQoJHJvd3MpIGFuZCAkbm9kZS0+ cmd0IDw9ICRyZ3QgKQoJCXsKCQkJJG91dFskbm9kZS0+JGluZGV4X2NvbHVtbl0gPSAkbm9k ZS0+JHZhbHVlX2NvbHVtbjsKCQkJaWYgKCAkbm9kZS0+cmd0ID4gJG5vZGUtPmxmdCArIDEg KQoJCQkJJG91dFskbm9kZS0+JGluZGV4X2NvbHVtbiAuICdfYyddID0gJHRoaXMtPmFzX2Fy cmF5KCRpbmRleF9jb2x1bW4sICR2YWx1ZV9jb2x1bW4sICRyb3dzLCAkbm9kZS0+cmd0KTsK CQl9CiAJCWlmICggJG5vZGUgYW5kICRub2RlLT5yZ3QgPiAkcmd0ICkKIAkJCWFycmF5X3Vu c2hpZnQoJHJvd3MsICRub2RlKTsKCQlyZXR1cm4gJG91dDsKCX0KCgkvKiogU3BsaXQgb2Zm IGEgc3VidHJlZSBvZiByb3dzIGFzIGEgbmV3IHNvb19uZXN0ZWRfc2V0IG9iamVjdAoJICog IEBwYXJhbSByb290IGlkIG9mIHN1YnRyZWUgcm9vdCBub2RlCgkgKiAgQHJldHVybiBzb29f dHhwX3Jvd3NldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc3VidHJlZSggJHJvb3QsICRpbmRl eCA9IG51bGwgKQoJewoJCSRvdXQgPSBuZXcgc2VsZjsKCQkkcm9vdCA9ICR0aGlzLT5yb3dz WyRyb290XTsKCQlmb3JlYWNoICggJHRoaXMtPnJvd3MgYXMgJHJvdyApCgkJCWlmICggJHJv dy0+bGZ0ID49ICRyb290LT5sZnQgYW5kICRyb3ctPnJndCA8PSAkcm9vdC0+cmd0ICkKCQkJ CSRvdXQtPmFkZF9yb3coJHJvdywgbnVsbCwgaXNfbnVsbCgkaW5kZXgpID8gbnVsbCA6ICRy b3ctPiRpbmRleCk7CgkJcmV0dXJuICRvdXQ7Cgl9Cn0KCi8vLyBDbGFzcyBmb3Igc2luZ2xl IGRhdGEgcmVjb3Jkcy4KY2xhc3Mgc29vX3R4cF9yb3cgZXh0ZW5kcyBzb29fb2JqCnsKCS8v LyBEYXRhYmFzZSB0YWJsZSBuYW1lLgoJcHJvdGVjdGVkICR0YWJsZQkJPSAnJzsKCS8vLyBE YXRhYmFzZSByZWNvcmQuCglwcm90ZWN0ZWQgJGRhdGEJCQk9IGFycmF5KCk7CgoJLyoqIENv bnN0cnVjdG9yLgoJICogIEBwYXJhbSBpbml0IEtleSB2YWx1ZSwgc29vX3R4cF9zZWxlY3Qg b2JqZWN0LCBvciBkYXRhIGFycmF5CgkgKiAgQHBhcmFtIHRhYmxlIFR4cCB0YWJsZSBuYW1l CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGluaXQgPSBhcnJheSgpLCAk dGFibGUgPSAnJyApCgl7CgkJaWYgKCBpc19zY2FsYXIoJGluaXQpIGFuZCAkdGFibGUgKQoJ CQkkaW5pdCA9IG5ldyBzb29fdHhwX3NlbGVjdCgkdGFibGUsICRpbml0KTsKCQlpZiAoICRp bml0IGluc3RhbmNlb2Ygc29vX3R4cF9zZWxlY3QgKQoJCXsKCQkJJHRhYmxlID0gJGluaXQt PnRhYmxlOwoJCQkkaW5pdCA9ICRpbml0LT5yb3coKTsKCQl9CgkJaWYgKCBpc19hcnJheSgk aW5pdCkgKQoJCQlmb3JlYWNoICggJGluaXQgYXMgJGsgPT4gJHYgKQoJCQkJJHRoaXMtPmRh dGFbJGtdID0gJHY7CgkJJHRoaXMtPnRhYmxlID0gJHRhYmxlOwoJfQoKCS8qKiBHZW5lcmlj IGdldHRlciwgb3ZlcnJpZGluZyBwYXJlbnQgbWV0aG9kLgoJICogIExvb2sgZm9yICRwcm9w ZXJ0eSBpbiB0aGUgJGRhdGEgYXJyYXkgZmlyc3QKCSAqICBAcGFyYW0gcHJvcGVydHkgQ29s dW1uIG9yIHByb3BlcnR5IG5hbWUKCSAqICBAcmV0dXJuIG1peGVkIERhdGEgZmllbGQgb3Ig b2JqZWN0IHByb3BlcnR5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2dldCggJHByb3BlcnR5 ICkKCXsKCQlyZXR1cm4gaXNzZXQoJHRoaXMtPmRhdGFbJHByb3BlcnR5XSkgPyAkdGhpcy0+ ZGF0YVskcHJvcGVydHldCgkJCTogcGFyZW50OjpfX2dldCgkcHJvcGVydHkpOwoJfQoKCS8v LyBPdmVycmlkZSBwYXJlbnQgbWV0aG9kLCB0byBrZWVwICRkYXRhIHByb3RlY3RlZC4KCXB1 YmxpYyBmdW5jdGlvbiBkYXRhKCApCgl7CgkJcmV0dXJuOwoJfQoKCS8vLyBAcmV0dXJuIGFy cmF5IERhdGFiYXNlIHJlY29yZCAoY29sdW1uOnZhbHVlIGFycmF5KQoJcHVibGljIGZ1bmN0 aW9uIHByb3BlcnRpZXMoICkKCXsKCQlyZXR1cm4gJHRoaXMtPmRhdGE7Cgl9Cn0KCi8vLyBD bGFzcyBmb3IgVHhwIGltYWdlIHJlY29yZHMuCmNsYXNzIHNvb190eHBfaW1nIGV4dGVuZHMg c29vX3R4cF9yb3cKewoJLy8vIFVSTCBvZiBmdWxsLXNpemUgaW1hZ2UuCglwcm90ZWN0ZWQg JGZ1bGxfdXJsCQk9ICcnOwoJLy8vIFVSTCBvZiB0aHVtYm5haWwgaW1hZ2UuCglwcm90ZWN0 ZWQgJHRodW1iX3VybAk9ICcnOwoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gaW5p dCBUeHAgaW1hZ2UgaWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkaW5p dCApCgl7CgkJZ2xvYmFsICRpbWdfZGlyOwoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJGluaXQs ICd0eHBfaW1hZ2UnKTsKCQkkdGhpcy0+ZnVsbF91cmwgPSBodSAuICRpbWdfZGlyIC4gJy8n IC4gJHRoaXMtPmlkIC4gJHRoaXMtPmV4dDsKCQlpZiAoICR0aGlzLT50aHVtYm5haWwgKQoJ CQkkdGhpcy0+dGh1bWJfdXJsID0gaHUgLiAkaW1nX2RpciAuICcvJyAuICR0aGlzLT5pZCAu ICd0JyAuICR0aGlzLT5leHQ7Cgl9Cn0KCi8vLyBBYnN0YWN0IGJhc2UgY2xhc3MgZm9yIChY KUhUTUwgZWxlbWVudHMuCmFic3RyYWN0IGNsYXNzIHNvb19odG1sIGV4dGVuZHMgc29vX29i agp7Ci8vIEhUTUwgZWxlbWVudCBjbGFzcy4gSW5zdGFudGlhdGlvbiB0YWtlcyBhIHJlcXVp cmVkICduYW1lJyBhcmd1bWVudCBhbmQgYW4KLy8gb3B0aW9uYWwgJ2F0dHMnIGFycmF5OiBp dGVtcyB3aXRoIGtleXMgbWF0Y2hpbmcgSFRNTCBhdHRyaWJ1dGVzCi8vIHdpbGwgYmUgdHJh bnNmZXJyZWQgdG8gdGhlIG5ldyBvYmplY3QuCi8vCi8vIFNlZSB0aGUgc29vX2h0bWxfaW1n IGNsYXNzIGZvciBhbiBleGFtcGxlIG9mIGhvdyB0byBleHRlbmQgdGhpcyBjbGFzcy4KCgkv Ly8gQG5hbWUgSW5oZXJlbnQgcHJvcGVydGllcwoJLy9AewoJLy8vIChYKUhUTUwgZWxlbWVu dCBuYW1lCglwcm90ZWN0ZWQgJGVsZW1lbnRfbmFtZQk9ICcnOwoJLy8vIGNvbnRhaW5lciAo ZmFsc2UpIG9yIGVtcHR5IGVsZW1lbnQgKHRydWUpCglwcm90ZWN0ZWQgJGlzX2VtcHR5CQk9 IDA7CgkvLy8gRWxlbWVudCBjb250ZW50IGFycmF5IChzdHJpbmdzIG9yIHNvb19odG1sIG9i amVjdHMpCglwcm90ZWN0ZWQgJGNvbnRlbnRzCQk9IGFycmF5KCk7CgkvL0B9CgoJLy8vIEBu YW1lIENvbW1vbiAoWClIVE1MIGF0dHJpYnV0ZXMKCS8vQHsKCXByb3RlY3RlZCAkY2xhc3MJ CQk9ICcnOwoJcHJvdGVjdGVkICRkaXIJCQkJPSAnJzsKCXByb3RlY3RlZCAkaWQJCQkJPSAn JzsKCXByb3RlY3RlZCAkbGFuZwkJCQk9ICcnOwoJcHJvdGVjdGVkICRvbmNsaWNrCQkJPSAn JzsKCXByb3RlY3RlZCAkb25kYmxjbGljawkJPSAnJzsKCXByb3RlY3RlZCAkb25rZXlkb3du CQk9ICcnOwoJcHJvdGVjdGVkICRvbmtleXByZXNzCQk9ICcnOwoJcHJvdGVjdGVkICRvbmtl eXVwCQkJPSAnJzsKCXByb3RlY3RlZCAkb25tb3VzZWRvd24JCT0gJyc7Cglwcm90ZWN0ZWQg JG9ubW91c2Vtb3ZlCQk9ICcnOwoJcHJvdGVjdGVkICRvbm1vdXNlb3V0CQk9ICcnOwoJcHJv dGVjdGVkICRvbm1vdXNlb3ZlcgkJPSAnJzsKCXByb3RlY3RlZCAkb25tb3VzZXVwCQk9ICcn OwoJcHJvdGVjdGVkICRzdHlsZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHRpdGxlCQkJPSAnJzsK CS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGVsZW1lbnRfbmFtZSAoWClI VE1MIGVsZW1lbnQgbmFtZQoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9m IG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVu dCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1 YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZWxlbWVudF9uYW1lLCAkYXR0cywgJGNvbnRl bnQgPSBudWxsLCAkaXNfZW1wdHkgPSAwKQoJewoJCSR0aGlzLT5lbGVtZW50X25hbWUoJGVs ZW1lbnRfbmFtZSktPmlzX2VtcHR5KCRpc19lbXB0eSk7CgkJaWYgKCBlbXB0eSgkYXR0cykg KQoJCQkkYXR0cyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoICR0aGlzIGFzICRwcm9wZXJ0eSA9 PiAkdmFsdWUgKQoJCQlpZiAoIGluX2FycmF5KCRwcm9wZXJ0eSwgYXJyYXlfa2V5cygkYXR0 cykpICkKCQkJCSR0aGlzLT4kcHJvcGVydHkoJGF0dHNbJHByb3BlcnR5XSk7CgkJaWYgKCAk Y29udGVudCApCgkJCSR0aGlzLT5jb250ZW50cygkY29udGVudCk7Cgl9CgoJLyoqIFZhbGlk YXRlIGFuZCBzZXQgaWQgYXR0cmlidXRlLgoJICogIEltcG9ydGFudDogKFgpSFRNTCBhdHRy aWJ1dGUsIE5PVCBhIGRhdGFiYXNlIElEIQoJICogIEBwYXJhbSBpZCAobXVzdCBiZWdpbiB3 aXRoIGEgbGV0dGVyKQoJICovCglwdWJsaWMgZnVuY3Rpb24gaWQoJGlkKQoJewoJCWlmICgg JGlkIGFuZCAhcHJlZ19tYXRjaCgnL15bYS16XS8nLCBzdHJ0b2xvd2VyKHRyaW0oJGlkKSkp ICkKCQl7CgkJCSR0aGlzLT5pZCA9ICdpbnZhbGlkX0hUTUxfSURfdmFsdWVfZnJvbV9Tb29f VHhwX09iaic7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHRoaXMtPmlkID0gJGlkOwoJCXJl dHVybiAkdGhpczsKCX0KCgkvKiogQWRkIHN0cmluZ3xvYmplY3R8YXJyYXkgdG8gJGNvbnRl bnRzIGFycmF5LgoJICogIEBwYXJhbSBjb250ZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBj b250ZW50cygkY29udGVudCkKCXsKCQlpZiAoICEgJHRoaXMtPmlzX2VtcHR5ICkKCQl7CgkJ CSRjb250ZW50ID0gaXNfYXJyYXkoJGNvbnRlbnQpID8gJGNvbnRlbnQgOiBhcnJheSgkY29u dGVudCk7CgkJCWZvcmVhY2ggKCAkY29udGVudCBhcyAkaSA9PiAkaXRlbSApCgkJCQlpZiAo IGlzX251bGwoJGl0ZW0pICkKCQkJCQl1bnNldCgkY29udGVudFskaV0pOwoJCQkkdGhpcy0+ Y29udGVudHMgPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29udGVudHMsICRjb250ZW50KTsKCQl9 CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBSZXR1cm4gYW4gYXR0cmlidXRlOnZhbHVlIGFy cmF5IG9mIGFsbCAoWClIVE1MIGF0dHJpYnV0ZXMuCgkgKiAgSGFyZC1jb2RlZCBsaXN0IG9m IGV4Y2x1ZGVkIHByb3BlcnRpZXMgaXMgcmF0aGVyIGxhbWUsCgkgKiAgYnV0IEkgaGF2ZW4n dCB0aG91Z2h0IG9mIGFueXRoaW5nIGJldHRlciB5ZXQuCgkgKiAgQHJldHVybiBhcnJheQoJ ICovCglwcml2YXRlIGZ1bmN0aW9uIGh0bWxfYXR0cmlidXRlcygpCgl7CgkJcmV0dXJuIGFy cmF5X2RpZmZfa2V5KCR0aGlzLT5wcm9wZXJ0aWVzKCksIGFycmF5X2ZsaXAoYXJyYXkoJ2Vs ZW1lbnRfbmFtZScsICdpc19lbXB0eScsICdjb250ZW50cycpKSk7Cgl9CgoJLyoqIENyZWF0 ZSAoWClIVE1MIHRhZyhzKSBzdHJpbmcgZm9yIHRoaXMgZWxlbWVudC4KCSAqICBSZWN1cnNp dmVseSB0YWdzIGNvbnRhaW5lZCBlbGVtZW50cwoJICogIEByZXR1cm4gc3RyaW5nCgkgKi8K CXB1YmxpYyBmdW5jdGlvbiB0YWcoKQoJewoJCSRvdXQgPSAnPCcgLiAkdGhpcy0+ZWxlbWVu dF9uYW1lOwoKCQlmb3JlYWNoICggJHRoaXMtPmh0bWxfYXR0cmlidXRlcygpIGFzICRwcm9w ZXJ0eSA9PiAkdmFsdWUgKQoJCQlpZiAoICR2YWx1ZSBvciAkcHJvcGVydHkgPT0gJ2FsdCcg KQoJCQkJJG91dCAuPSAiICRwcm9wZXJ0eT1cIiR2YWx1ZVwiIjsKCgkJaWYgKCAkdGhpcy0+ aXNfZW1wdHkgKQoJCQlyZXR1cm4gJG91dCAuICcgLz4nOwoKCQkkb3V0IC49ICc+JyAuICR0 aGlzLT5uZXdsaW5lKCk7CgoJCWZvcmVhY2ggKCAkdGhpcy0+Y29udGVudHMgYXMgJGl0ZW0g KQoKCQkJaWYgKCAkaXRlbSBpbnN0YW5jZW9mIHNvb19odG1sICkKCQkJCSRvdXQgLj0gJGl0 ZW0tPnRhZygpOwoJCQllbHNlCgkJCQkkb3V0IC49ICRpdGVtOwoKCQlyZXR1cm4gJG91dCAu ICR0aGlzLT5uZXdsaW5lKCkgLiAiPC8kdGhpcy0+ZWxlbWVudF9uYW1lPiIgLiAkdGhpcy0+ bmV3bGluZSgpOwoJfQoKCS8qKiBDb252ZXJ0ICR0aGlzLT4kcHJvcGVydHkgd2l0aCBodG1s c3BlY2lhbGNoYXJzKCkuCgkgKiAgQHBhcmFtIHByb3BlcnR5IEF0dHJpYnV0ZSBuYW1lCgkg KiAgQHJldHVybiBzdHJpbmcgKFgpSFRNTC1lc2NhcGVkIGF0dHJpYnV0ZSB2YWx1ZQoJICov Cglwcm90ZWN0ZWQgZnVuY3Rpb24gaHRtbF9lc2NhcGUoICRwcm9wZXJ0eSApCgl7CgkJJHRo aXMtPiRwcm9wZXJ0eSA9IGh0bWxzcGVjaWFsY2hhcnMoJHRoaXMtPiRwcm9wZXJ0eSk7CgkJ cmV0dXJuICR0aGlzOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gbmV3bGluZSgpCgl7CgkJcmV0 dXJuICggISAkdGhpcy0+aXNfZW1wdHkgYW5kIGNvdW50KCR0aGlzLT5jb250ZW50cykgPiAx ICkgPyBuIDogJyc7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBhbmNob3IgZWxlbWVu dHMuCmNsYXNzIHNvb19odG1sX2FuY2hvciBleHRlbmRzIHNvb19odG1sCnsKCS8vLyBAbmFt ZSAoWClIVE1MIGF0dHJpYnV0ZXMKCS8vQHsKCXByb3RlY3RlZCAkaHJlZgkJCQk9ICcnOwoJ cHJvdGVjdGVkICRuYW1lCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHJlbAkJCQk9ICcnOwoJcHJv dGVjdGVkICRyZXYJCQkJPSAnJzsKCXByb3RlY3RlZCAkdHlwZQkJCQk9ICcnOwoJcHJvdGVj dGVkICRocmVmbGFuZwkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNoYXJzZXQJCQk9ICcnOwoJcHJv dGVjdGVkICRhY2Nlc3NrZXkJCT0gJyc7Cglwcm90ZWN0ZWQgJHRhYmluZGV4CQkJPSAnJzsK CXByb3RlY3RlZCAkc2hhcGUJCQk9ICcnOwoJcHJvdGVjdGVkICRjb29yZHMJCQk9ICcnOwoJ cHJvdGVjdGVkICRvbmZvY3VzCQkJPSAnJzsKCXByb3RlY3RlZCAkb25ibHVyCQkJPSAnJzsK CS8vQH0KCgkvKiogQHBhcmFtIGF0dHMgVVJJIHN0cmluZyAoaHJlZiB2YWx1ZSkgb3IgYXR0 cmlidXRlIGFycmF5LgoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3Ry aW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBm dW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyAp Cgl7CgkJaWYgKCAhIGlzX2FycmF5KCRhdHRzKSApCgkJCSRhdHRzID0gYXJyYXkoJ2hyZWYn ID0+ICRhdHRzKTsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAnYScsICRhdHRzLCAkY29udGVu dCApOwoJfQoKfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIGJyIGVsZW1lbnRzLgpjbGFzcyBz b29faHRtbF9iciBleHRlbmRzIHNvb19odG1sCnsKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBA cGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAq LwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpICkKCXsK CQlwYXJlbnQ6Ol9fY29uc3RydWN0KCdicicsICRhdHRzLCBudWxsLCB0cnVlKTsKCX0KfQoK Ly8vIENsYXNzIGZvciAoWClIVE1MIGZvcm0gZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfZm9y bSBleHRlbmRzIHNvb19odG1sCnsKCS8vLyBAbmFtZSAoWClIVE1MIGF0dHJpYnV0ZXMKCS8v QHsKCXByb3RlY3RlZCAkYWN0aW9uCQkJPSAnJzsKCXByb3RlY3RlZCAkbWV0aG9kCQkJPSAn JzsKCXByb3RlY3RlZCAkZW5jdHlwZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGFjY2VwdF9jaGFy c2V0CT0gJyc7Cglwcm90ZWN0ZWQgJG9uc3VibWl0CQkJPSAnJzsKCXByb3RlY3RlZCAkb25y ZXNldAkJCT0gJyc7CgkvL0B9CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBpbml0 IEZvcm0gYWN0aW9uIG9yIGF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJz KQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3RyaW5nLCBzb29faHRt bCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nv bnN0cnVjdCAoICRpbml0ID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyApCgl7CgkJJGF0dHMg PSBpc19zdHJpbmcoJGluaXQpID8gYXJyYXkoJ2FjdGlvbicgPT4gJGluaXQpIDogJGluaXQ7 CgkJaWYgKCAhIGlzc2V0KCRhdHRzWydtZXRob2QnXSkgKQoJCQkkYXR0c1snbWV0aG9kJ10g PSAncG9zdCc7CgkJaWYgKCBpc19hcnJheSgkYXR0c1snYWN0aW9uJ10pICkKCQl7CgkJCWZv cmVhY2ggKCAkYXR0c1snYWN0aW9uJ10gYXMgJGsgPT4gJHYgKQoJCQkJJGF0dHNbJ2FjdGlv biddWyRrXSA9ICIkaz0kdiI7CgkJCSRhdHRzWydhY3Rpb24nXSA9ICc/JyAuIGltcGxvZGUo YSwgJGF0dHNbJ2FjdGlvbiddKTsKCQl9CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgnZm9ybScs ICRhdHRzLCAkY29udGVudCApOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgbGFiZWwg ZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfbGFiZWwgZXh0ZW5kcyBzb29faHRtbAp7CgkvLy8g QG5hbWUgKFgpSFRNTCBhdHRyaWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJGZvcgkJCQk9ICcn OwoJcHJvdGVjdGVkICRvbmZvY3VzCQkJPSAnJzsKCXByb3RlY3RlZCAkb25ibHVyCQkJPSAn JzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGluaXQgJ2ZvcicgYXR0 cmlidXRlIG9yIGFycmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJzCgkgKiAgQHBhcmFtIGNvbnRl bnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkg dGhlcmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGluaXQgPSBh cnJheSgpLCAkY29udGVudCA9ICcnICkKCXsKCQlpZiAoIGlzX3N0cmluZygkaW5pdCkgKQoJ CQkkaW5pdCA9IGFycmF5KCdmb3InID0+ICRpbml0KTsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0 KCdsYWJlbCcsICRpbml0LCAkY29udGVudCk7Cgl9Cn0KCi8vLyBBYnN0cmFjdCBiYXNlIGNs YXNzIGZvciAoWClIVE1MIGZvcm0gY29udHJvbHMKYWJzdHJhY3QgY2xhc3Mgc29vX2h0bWxf Zm9ybV9jb250cm9sIGV4dGVuZHMgc29vX2h0bWwKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0 cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRuYW1lCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGRp c2FibGVkCQkJPSAnJzsKCXByb3RlY3RlZCAkdGFiaW5kZXgJCQk9ICcnOwoJcHJvdGVjdGVk ICRvbmZvY3VzCQkJPSAnJzsKCXByb3RlY3RlZCAkb25ibHVyCQkJPSAnJzsKCS8vQH0KfQoK Ly8vIENsYXNzIGZvciAoWClIVE1MIGlucHV0IGVsZW1lbnRzCmNsYXNzIHNvb19odG1sX2lu cHV0IGV4dGVuZHMgc29vX2h0bWxfZm9ybV9jb250cm9sCnsKCgkvLy8gQG5hbWUgKFgpSFRN TCBhdHRyaWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJHR5cGUJCQkJPSAnJzsKCXByb3RlY3Rl ZCAkdmFsdWUJCQk9ICcnOwoJcHJvdGVjdGVkICRjaGVja2VkCQkJPSAnJzsKCXByb3RlY3Rl ZCAkc2l6ZQkJCQk9ICcnOwoJcHJvdGVjdGVkICRtYXhsZW5ndGgJCT0gJyc7Cglwcm90ZWN0 ZWQgJHNyYwkJCQk9ICcnOwoJcHJvdGVjdGVkICRhbHQJCQkJPSAnJzsKCXByb3RlY3RlZCAk dXNlbWFwCQkJPSAnJzsKCXByb3RlY3RlZCAkcmVhZG9ubHkJCQk9ICcnOwoJcHJvdGVjdGVk ICRhY2NlcHQJCQk9ICcnOwoJcHJvdGVjdGVkICRvbnNlbGVjdAkJCT0gJyc7Cglwcm90ZWN0 ZWQgJG9uY2hhbmdlCQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBh cmFtIHR5cGUgSW5wdXQgdHlwZSAodGV4dHxjaGVja2JveHxyYWRpbyBldGMuKQoJICogIEBw YXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJzKQoJICov CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkdHlwZSA9ICd0ZXh0JywgJGF0dHMg PSBhcnJheSgpICkKCXsKCQkkdGhpcy0+dHlwZSgkdHlwZSk7CgkJcGFyZW50OjpfX2NvbnN0 cnVjdCgnaW5wdXQnLCAkYXR0cywgbnVsbCwgdHJ1ZSk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3Ig KFgpSFRNTCBzZWxlY3QgZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfc2VsZWN0IGV4dGVuZHMg c29vX2h0bWxfZm9ybV9jb250cm9sCnsKCS8vLyBAbmFtZSAoWClIVE1MIGF0dHJpYnV0ZXMK CS8vQHsKCXByb3RlY3RlZCAkbXVsdGlwbGUJCQk9ICcnOwoJcHJvdGVjdGVkICRzaXplCQkJ CT0gJyc7Cglwcm90ZWN0ZWQgJG9uY2hhbmdlCQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3Ry dWN0b3IuCgkgKiAgSWYgJGNvbnRlbnQgaXMgYW4gYXJyYXksIGVhY2ggaXRlbSB3aWxsIGJl IGFkZGVkIGFzCgkgKiAgYSBzb29faHRtbF9vcHRpb24gZWxlbWVudCAoYXNzdW1lcyB2YWx1 ZT0+dGV4dCBhcnJheSkKCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBu YW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQg KHNvb19odG1sX29wdGlvbiBvYmplY3RzKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25z dHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gYXJyYXkoKSApCgl7CgkJcGFy ZW50OjpfX2NvbnN0cnVjdCgnc2VsZWN0JywgJGF0dHMpOwoJCWlmICggISBpc19hcnJheSgk Y29udGVudCkgKSAkY29udGVudCA9IGFycmF5KCRjb250ZW50KTsKCQlmb3JlYWNoICggJGNv bnRlbnQgYXMgJGkgPT4gJGl0ZW0gKQoJCXsKCQkJaWYgKCAkaXRlbSBpbnN0YW5jZW9mIHNv b19odG1sX29wdGlvbiApCgkJCQkkdGhpcy0+Y29udGVudHMoJGl0ZW0pOwoJCQllbHNlCgkJ CQkkdGhpcy0+Y29udGVudHMobmV3IHNvb19odG1sX29wdGlvbihhcnJheSgndmFsdWUnID0+ ICRpKSwgJGl0ZW0pKTsKCQl9Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBvcHRpb24g ZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfb3B0aW9uIGV4dGVuZHMgc29vX2h0bWxfZm9ybV9j b250cm9sCnsKCS8vLyBAbmFtZSAoWClIVE1MIGF0dHJpYnV0ZXMKCS8vQHsKCXByb3RlY3Rl ZCAkdmFsdWUJCQk9ICcnOwoJcHJvdGVjdGVkICRzZWxlY3RlZAkJCT0gJyc7Cglwcm90ZWN0 ZWQgJGxhYmVsCQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFt IGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBh cmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChkaXNwbGF5ZWQgb3B0aW9uIHRleHQpCgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNv bnRlbnQgPSBhcnJheSgpICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCdvcHRpb24nLCAk YXR0cywgJGNvbnRlbnQpOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdGV4dGFyZWEg ZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfdGV4dGFyZWEgZXh0ZW5kcyBzb29faHRtbF9mb3Jt X2NvbnRyb2wKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVj dGVkICRyb3dzCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNvbHMJCQkJPSAnJzsKCXByb3RlY3Rl ZCAkcmVhZG9ubHkJCQk9ICcnOwoJcHJvdGVjdGVkICRvbnNlbGVjdAkJCT0gJyc7Cglwcm90 ZWN0ZWQgJG9uY2hhbmdlCQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAg QHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkg KiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcpCgkgKi8KCXB1Ymxp YyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAn JyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgndGV4dGFyZWEnLCAkYXR0cywgJGNvbnRl bnQpOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgaW1nIGVsZW1lbnRzCmNsYXNzIHNv b19odG1sX2ltZyBleHRlbmRzIHNvb19odG1sCnsKCS8vLyBAbmFtZSAoWClIVE1MIGF0dHJp YnV0ZXMKCS8vQHsKCXByb3RlY3RlZCAkYWx0CQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHNyYwkJ CQk9ICcnOwoJcHJvdGVjdGVkICR3aWR0aAkJCT0gJyc7Cglwcm90ZWN0ZWQgJGhlaWdodAkJ CT0gJyc7CgkvL0B9CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBpbml0IHNvb190 eHBfaW1nIG9iamVjdCwgIGF0dHJpYnV0ZSBhcnJheSwgb3Igc3JjIHZhbHVlCgkgKiAgQHBh cmFtIHRodW1ibmFpbCBUaHVtYm5haWwgb3IgZnVsbCBpbWFnZT8KCSAqICBAcGFyYW0gZXNj YXBlIEhUTUwtZXNjYXBlIHRpdGxlIGFuZCBhbHQgYXR0cmlidXRlcz8KCSAqLwoJcHVibGlj IGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGluaXQgPSBhcnJheSgpLCAkdGh1bWJuYWlsID0g ZmFsc2UsICRlc2NhcGUgPSB0cnVlICkKCXsKCQlpZiAoICRpbml0IGluc3RhbmNlb2Ygc29v X3R4cF9pbWcgKQoJCXsKCQkJJHNyYyA9ICR0aHVtYm5haWwgPyAkaW5pdC0+dGh1bWJfdXJs IDogJGluaXQtPmZ1bGxfdXJsOwoJCQkkaW5pdCA9ICRpbml0LT5wcm9wZXJ0aWVzKCk7CgkJ CWlmICggJHRodW1ibmFpbCApCgkJCXsKCQkJCWlmICggISBlbXB0eSgkaW5pdFsndGh1bWJf aCddKSApCgkJCQl7IC8vIHByZSBUeHAgNC4yIGNvbXBhdGliaWxpdHkKCQkJCQkkaW5pdFsn aCddID0gJGluaXRbJ3RodW1iX2gnXTsKCQkJCQkkaW5pdFsndyddID0gJGluaXRbJ3RodW1i X3cnXTsKCQkJCX0KCQkJCWVsc2UgJGluaXRbJ2gnXSA9ICggJGluaXRbJ3cnXSA9IDAgKTsK CQkJfQoJCQkkaW5pdFsnaGVpZ2h0J10gPSAkaW5pdFsnaCddOwoJCQkkaW5pdFsnd2lkdGgn XSA9ICRpbml0Wyd3J107CgkJCSRpbml0Wyd0aXRsZSddID0gJGluaXRbJ2NhcHRpb24nXTsK CQkJJGluaXRbJ3NyYyddID0gJHNyYzsKCQkJdW5zZXQoJGluaXRbJ2lkJ10pOyAvLyBkb24n dCB3YW50IGRhdGFiYXNlIGlkIGFzIEhUTUwgaWQhCgkJfQoJCWVsc2VpZiAoICEgaXNfYXJy YXkoJGluaXQpICkKCQkJJGluaXRbJ3NyYyddID0gJGluaXQ7CgoJCXBhcmVudDo6X19jb25z dHJ1Y3QoJ2ltZycsICRpbml0LCBudWxsLCB0cnVlKTsKCQlpZiAoICRlc2NhcGUgKQoJCQkk dGhpcy0+aHRtbF9lc2NhcGUoJ3RpdGxlJyktPmh0bWxfZXNjYXBlKCdhbHQnKTsKCX0KCn0K Ci8vLyBDbGFzcyBmb3IgKFgpSFRNTCBwIGVsZW1lbnRzCmNsYXNzIHNvb19odG1sX3AgZXh0 ZW5kcyBzb29faHRtbAp7CgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0dHMgQXR0 cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRl bnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkg dGhlcmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBh cnJheSgpLCAkY29udGVudCA9ICcnICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCdwJywg JGF0dHMsICRjb250ZW50KTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIHRhYmxlIGVs ZW1lbnRzCmNsYXNzIHNvb19odG1sX3RhYmxlIGV4dGVuZHMgc29vX2h0bWwKewoJLy8vIEBu YW1lIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRzdW1tYXJ5CQkJCT0g Jyc7Cglwcm90ZWN0ZWQgJHdpZHRoCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGJvcmRlcgkJCQk9 ICcnOwoJcHJvdGVjdGVkICRmcmFtZQkJCQk9ICcnOwoJcHJvdGVjdGVkICRydWxlcwkJCQk9 ICcnOwoJcHJvdGVjdGVkICRjZWxsc3BhY2luZwkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNlbGxw YWRkaW5nCQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0 dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFt IGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3Ig YXJyYXkgdGhlcmVvZikKCSAqICBAc2VlIGNvbnRlbnRzKCkgZm9yICRjb250ZW50IG9wdGlv bnMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgp LCAkY29udGVudCA9IG51bGwgKQoJewoJCSR0aGlzLT5jb250ZW50cygkY29udGVudCk7CgkJ cGFyZW50OjpfX2NvbnN0cnVjdCggJ3RhYmxlJywgJGF0dHMgKTsKCX0KCgkvKiogQWRkIHN0 cmluZ3xvYmplY3R8YXJyYXkgdG8gJGNvbnRlbnRzIGFycmF5LgoJICogIElmIHRoaXMgaXMg YSBzb29faHRtbF90YWJsZV9jb21wb25lbnQgb2JqZWN0LCBvciBhbiBhcnJheSBvZiBzdWNo LAoJICogIGl0IHdpbGwgYmUgYWRkZWQgZGlyZWN0bHkuIE90aGVyd2lzZSBpdCBpcyBhc3N1 bWVkIHRvIGJlIGEgc2luZ2xlCgkgKiAgaXRlbSBvciAyLWRpbWVuc2lvbmFsIGFycmF5IG9m IHN1Y2gsIGFuZCB3aWxsIGJlIGZvcm1lZCBpbnRvIGEgZ3JpZAoJICogIG9mIHRhYmxlIGNl bGxzL3Jvd3MuCgkgKiAgQHBhcmFtIGNvbnRlbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNv bnRlbnRzKCRjb250ZW50KQoJewoJCWlmICggaXNfbnVsbCgkY29udGVudCkgKSByZXR1cm4g JHRoaXM7CgoJCSRjb250ZW50ID0gaXNfYXJyYXkoJGNvbnRlbnQpID8gJGNvbnRlbnQgOiBh cnJheSgkY29udGVudCk7CgkJZm9yZWFjaCAoICRjb250ZW50IGFzICRpdGVtICkKCQl7CgkJ CWlmICggaXNfb2JqZWN0KCRpdGVtKSBhbmQgKCAkaXRlbSBpbnN0YW5jZW9mIHNvb19odG1s X3RhYmxlX2NvbXBvbmVudCBvciAkaXRlbSBpbnN0YW5jZW9mIHNvb19odG1sX2NhcHRpb24p ICkKCQkJCSR0aGlzLT5jb250ZW50c1tdID0gJGl0ZW07CgkJCWVsc2UKCQkJewoJCQkJJGl0 ZW0gPSBpc19hcnJheSgkaXRlbSkgPyAkaXRlbSA6IGFycmF5KCRpdGVtKTsKCQkJCWZvcmVh Y2ggKCAkaXRlbSBhcyAkaSA9PiAkY2VsbCApCgkJCQkJaWYgKCAhICRjZWxsIGluc3RhbmNl b2Ygc29vX2h0bWxfdGFibGVfY29tcG9uZW50ICkKCQkJCQkJJGl0ZW1bJGldID0gbmV3IHNv b19odG1sX3RkKGFycmF5KCksICRjZWxsKTsKCQkJCSR0aGlzLT5jb250ZW50c1tdID0gbmV3 IHNvb19odG1sX3RyKGFycmF5KCksICRpdGVtKTsKCQkJfQoJCX0KCQlyZXR1cm4gJHRoaXM7 Cgl9Cn0KCi8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciAoWClIVE1MIHRhYmxlIGNvbXBv bmVudHMKYWJzdHJhY3QgY2xhc3Mgc29vX2h0bWxfdGFibGVfY29tcG9uZW50IGV4dGVuZHMg c29vX2h0bWwKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVj dGVkICRhbGlnbgkJCQk9ICcnOwoJcHJvdGVjdGVkICRjaGFyCQkJCQk9ICcnOwoJcHJvdGVj dGVkICRjaGFyb2ZmCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHZhbGlnbgkJCQk9ICcnOwoJLy9A fQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gY29tcG9uZW50IChYKUhUTUwgZWxl bWVudCBuYW1lCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+ dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJp bmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGljIGZ1 bmN0aW9uIF9fY29uc3RydWN0ICggJGNvbXBvbmVudCwgJGF0dHMgPSBhcnJheSgpLCAkY29u dGVudCA9ICcnICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkY29tcG9uZW50LCAkYXR0 cywgJGNvbnRlbnQgKTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIGNhcHRpb24gZWxl bWVudHMKY2xhc3Mgc29vX2h0bWxfY2FwdGlvbiBleHRlbmRzIHNvb19odG1sX3RhYmxlX2Nv bXBvbmVudAp7CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkY29udGVudCwgJGF0 dHMgPSBhcnJheSgpICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAnY2FwdGlvbicsICRh dHRzLCAkY29udGVudCApOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdGhlYWQgZWxl bWVudHMKY2xhc3Mgc29vX2h0bWxfdGhlYWQgZXh0ZW5kcyBzb29faHRtbF90YWJsZV9jb21w b25lbnQKewoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMg KGFycmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1l bnQgY29udGVudCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2Yp CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwg JGNvbnRlbnQgPSAnJyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3RoZWFkJywgJGF0 dHMsICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0Ym9keSBlbGVt ZW50cwpjbGFzcyBzb29faHRtbF90Ym9keSBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NvbXBv bmVudAp7CgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAo YXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVu dCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikK CSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAk Y29udGVudCA9ICcnICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAndGJvZHknLCAkYXR0 cywgJGNvbnRlbnQgKTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIHRmb290IGVsZW1l bnRzCmNsYXNzIHNvb19odG1sX3Rmb290IGV4dGVuZHMgc29vX2h0bWxfdGFibGVfY29tcG9u ZW50CnsKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChh cnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50 IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJ ICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRj b250ZW50ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICd0Zm9vdCcsICRhdHRz LCAkY29udGVudCApOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdHIgZWxlbWVudHMK Y2xhc3Mgc29vX2h0bWxfdHIgZXh0ZW5kcyBzb29faHRtbF90YWJsZV9jb21wb25lbnQKewoK CS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBv ZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRl bnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglw dWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50 ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICd0cicsICRhdHRzLCAkY29udGVu dCApOwoJfQp9CgovLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgKFgpSFRNTCB0YWJsZSBj ZWxscwphYnN0cmFjdCBjbGFzcyBzb29faHRtbF90YWJsZV9jZWxsIGV4dGVuZHMgc29vX2h0 bWxfdGFibGVfY29tcG9uZW50CnsKCS8vLyBAbmFtZSAoWClIVE1MIGF0dHJpYnV0ZXMKCS8v QHsKCXByb3RlY3RlZCAkcm93c3BhbgkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNvbHNwYW4JCQk9 ICcnOwoJcHJvdGVjdGVkICRoZWFkZXJzCQkJPSAnJzsKCXByb3RlY3RlZCAkYWJicgkJCQk9 ICcnOwoJcHJvdGVjdGVkICRzY29wZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGF4aXMJCQkJPSAn JzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGNlbGxfdHlwZSBFbGVt ZW50IG5hbWUgKHRkLCB0aCkKCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBv ZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRl bnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglw dWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkY2VsbF90eXBlLCAkYXR0cyA9IGFycmF5 KCksICRjb250ZW50ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICRjZWxsX3R5 cGUsICRhdHRzLCAkY29udGVudCApOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdGgg ZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfdGggZXh0ZW5kcyBzb29faHRtbF90YWJsZV9jZWxs CnsKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJh eSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNv bnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICov CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250 ZW50ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICd0aCcsICRhdHRzLCAkY29u dGVudCApOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdGQgZWxlbWVudHMKY2xhc3Mg c29vX2h0bWxfdGQgZXh0ZW5kcyBzb29faHRtbF90YWJsZV9jZWxsCnsKCS8qKiBDb25zdHJ1 Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1 ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywg c29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rp b24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKQoJewoJ CXBhcmVudDo6X19jb25zdHJ1Y3QoICd0ZCcsICRhdHRzLCAkY29udGVudCApOwoJfQoKfQoK Ly8vIEJhc2UgY2xhc3MgZm9yIChYKUhUTUwgb2wgYW5kIHVsIGVsZW1lbnRzCmFic3RyYWN0 IGNsYXNzIHNvb19odG1sX2xpc3QgZXh0ZW5kcyBzb29faHRtbAp7CgkvKiogQ29uc3RydWN0 b3IuCgkgKiAgSWYgJGNvbnRlbnQgaXMgYW4gYXJyYXksIGVhY2ggaXRlbSB0aGF0IGlzIG5v dCBhbiBhcnJheSB3aWxsIGJlIGFkZGVkCgkgKiAgYXMgYSBzb29faHRtbF9saSBvYmplY3Q7 IGVhY2ggaXRlbSB0aGF0IGlzIGFuIGFycmF5IHdpbGwgYmUgYWRkZWQKCSAqICB0byB0aGUg cHJldmlvdXMgc29vX2h0bWxfbGkgb2JqZWN0IGFzIGEgbmV3IGxpc3Qgb2YgdGhlIHNhbWUg Y2xhc3MKCSAqICAoaGVuY2UgdGhpcyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbikuCgkgKiAg QW55IG90aGVyIGNvbnRlbnQgd2lsbCBiZSBhZGRlZCBhcyBhIHNvb19odG1sX2xpIG9iamVj dC4KCSAqICBAcGFyYW0gZWxlbWVudF9uYW1lIEVsZW1lbnQgbmFtZCAob2wgb3IgdWwpCgkg KiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMp CgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1s IG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29u c3RydWN0ICggJGVsZW1lbnRfbmFtZSwgJGF0dHMsICRjb250ZW50LCAkY2xhc3MgKQoJewoJ CWlmICggISBpc19hcnJheSgkY29udGVudCkgKQoJCQkkY29udGVudCA9IGFycmF5KCRjb250 ZW50KTsKCQkkcHJldiA9IG51bGw7CgkJZm9yZWFjaCAoICRjb250ZW50IGFzICRpID0+ICYk aXRlbSApCgkJewoJCQlpZiAoIGlzX2FycmF5KCRpdGVtKSApCgkJCXsKCQkJCWlmICggISBp c19udWxsKCRwcmV2KSBhbmQgJGNvbnRlbnRbJHByZXZdIGluc3RhbmNlb2Ygc29vX2h0bWxf bGkgKQoJCQkJewoJCQkJCSRjb250ZW50WyRwcmV2XS0+Y29udGVudHMobmV3ICRjbGFzcygk YXR0cywgJGl0ZW0pKTsKCQkJCQl1bnNldCgkY29udGVudFskaV0pOwoJCQkJfQoJCQkJZWxz ZSBmb3JlYWNoICggJGl0ZW0gYXMgJiRsaSApCgkJCQkJJGxpID0gbmV3IHNvb19odG1sX2xp KGFycmF5KCksICRsaSk7CgkJCX0KCQkJZWxzZWlmICggISAkaXRlbSBpbnN0YW5jZW9mIHNv b19odG1sX2xpICkKCQkJCSRpdGVtID0gbmV3IHNvb19odG1sX2xpKGFycmF5KCksICRpdGVt KTsKCQkJJHByZXYgPSAkaTsKCQl9CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkZWxlbWVudF9u YW1lLCAkYXR0cywgJGNvbnRlbnQpOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgb2wg ZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfb2wgZXh0ZW5kcyBzb29faHRtbF9saXN0CnsKCS8q KiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBu YW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQg KHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJs aWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0g JycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJ29sJywgJGF0dHMsICRjb250ZW50LCBf X0NMQVNTX18pOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdWwgZWxlbWVudHMKY2xh c3Mgc29vX2h0bWxfdWwgZXh0ZW5kcyBzb29faHRtbF9saXN0CnsKCS8qKiBDb25zdHJ1Y3Rv ci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBw YWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29v X2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24g X19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKQoJewoJCXBh cmVudDo6X19jb25zdHJ1Y3QoJ3VsJywgJGF0dHMsICRjb250ZW50LCBfX0NMQVNTX18pOwoJ fQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgbGkgZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxf bGkgZXh0ZW5kcyBzb29faHRtbAp7CgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0 dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFt IGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3Ig YXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0 dHMgPSBhcnJheSgpLCAkY29udGVudCA9ICcnICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0 KCdsaScsICRhdHRzLCAkY29udGVudCk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBz cGFuIGVsZW1lbnRzCmNsYXNzIHNvb19odG1sX3NwYW4gZXh0ZW5kcyBzb29faHRtbAp7Cgkv KiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2Yg bmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50 IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVi bGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAkY29udGVudCA9 ICcnICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCdzcGFuJywgJGF0dHMsICRjb250ZW50 KTsKCX0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTUxQIFBhY2sgY29tcGF0aWJpbGl0 eSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBNTFAgUGFjayBtYW5pcHVsYXRlcyAk X1NFUlZFUlsnUkVRVUVTVF9VUkknXSwgc28gZ3JhYiBpdCBmaXJzdAoKLy8gZ2xvYmFsICRw bHVnaW5fY2FsbGJhY2s7Ci8vIGlmKCBpc19hcnJheSgkcGx1Z2luX2NhbGxiYWNrKQovLyAJ YW5kICRwbHVnaW5fY2FsbGJhY2tbMF1bJ2Z1bmN0aW9uJ10gPT0gJ19sMTBuX3ByZXRleHQn ICkKLy8gCQlhcnJheV91bnNoaWZ0KCRwbHVnaW5fY2FsbGJhY2ssIGFycmF5KAovLyAJCQkn ZnVuY3Rpb24nCT0+CSdzb29fdXJpX21scCcsCi8vIAkJCSdldmVudCcJCT0+CSdwcmV0ZXh0 JywKLy8gCQkJJ3N0ZXAnCQk9PgknJywKLy8gCQkJJ3ByZScJCT0+CTAgKQovLyAJCSk7Ci8v Ci8vIGZ1bmN0aW9uIHNvb191cmlfbWxwKCkKLy8gewovLyAJZ2xvYmFsICRzb29fcmVxdWVz dF91cmk7Ci8vIAkkc29vX3JlcXVlc3RfdXJpID0gICRfU0VSVkVSWydSRVFVRVNUX1VSSSdd OwovLyB9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGVuZCBNTFAgUGFjayBjb21wYXRpYmls aXR5IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgovLy8gQ2xhc3MgZm9yIFVSSSBxdWVyeSBz dHJpbmcgbWFuaXB1bGF0aW9uCmNsYXNzIHNvb191cmkgZXh0ZW5kcyBzb29fb2JqCnsKCS8v LyBGdWxsIFVSSQoJcHJvdGVjdGVkICRmdWxsOwoKCS8vLyAkX1NFUlZFUlsnUkVRVUVTVF9V UkknXSB2YWx1ZQoJcHJvdGVjdGVkICRyZXF1ZXN0X3VyaTsKCgkvLy8gJF9TRVJWRVJbJ1FV RVJZX1NUUklORyddIHZhbHVlCglwcm90ZWN0ZWQgJHF1ZXJ5X3N0cmluZzsKCgkvLy8gVVJJ IHF1ZXJ5IHBhcmFtZXRlcnMKCXByb3RlY3RlZCAkcXVlcnlfcGFyYW1zOwoKCS8qKiBDb25z dHJ1Y3Rvci4KCSAqICBFeHRyYWN0IFJFUVVFU1RfVVJJIGFuZCBRVUVSWV9TVFJJTkcgZnJv bSAkX1NFUlZFUiwKCSAqICBhbmQgcGFyc2UgaW50byBxdWVyeSBwYXJhbXMgYW5kIGZ1bGwg VVJJLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCApCgl7CgkJZ2xvYmFs ICRzb29fcmVxdWVzdF91cmk7CS8vIE1MUCBQYWNrIGNvbXBhdGliaWxpdHkKCQkkdGhpcy0+ cmVxdWVzdF91cmkgPSAkc29vX3JlcXVlc3RfdXJpID8gJHNvb19yZXF1ZXN0X3VyaSA6CgkJ CSRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwoJCSR0aGlzLT5xdWVyeV9zdHJpbmcgPSAkX1NF UlZFUlsnUVVFUllfU1RSSU5HJ107CgkJJHRoaXMtPmZ1bGwgPSBwcmVnX3JlcGxhY2UoJy9c LyQvJywgJycsIGh1KSAuICR0aGlzLT5yZXF1ZXN0X3VyaSgpOwoJCXBhcnNlX3N0cigkdGhp cy0+cXVlcnlfc3RyaW5nLCAkdGhpcy0+cXVlcnlfcGFyYW1zKTsKCX0KCgkvLy8gT3ZlcnJp ZGUgcGFyZW50IG1ldGhvZCB0byBwcmV2ZW50IGRpcmVjdCBwcm9wZXJ0eSBtYW5pcHVsYXRp b24KCXB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoICRyZXF1ZXN0LCAkYXJncyApCgl7CgkJcmV0 dXJuIGZhbHNlOwoJfQoKCS8qKiBBZGQsIHJlbW92ZSwgb3IgdXBkYXRlIGEgcXVlcnkgcGFy YW1ldGVyCgkgKiAgVGhlbiBydW4gdXBkYXRlX2Zyb21fcGFyYW1zKCkgdG8gdXBkYXRlICRx dWVyeV9zdHJpbmcgYW5kCgkgKiAgJHJlcXVlc3RfdXJpIChhbmQgdGhlIGNvcnJlc3BvbmRp bmcgJF9TRVJWRVIgdmFsdWVzKSBhY2NvcmRpbmdseQoJICogIEBwYXJhbSBuYW1lIFBhcmFt ZXRlciBuYW1lCgkgKiAgQHBhcmFtIHZhbHVlIFBhcmFtZXRlciB2YWx1ZQoJICovCglwdWJs aWMgZnVuY3Rpb24gc2V0X3F1ZXJ5X3BhcmFtICggJG5hbWUsICR2YWx1ZSA9IG51bGwgKQoJ ewoJCWlmICggaXNfbnVsbCgkdmFsdWUpICkKCQkJdW5zZXQoJHRoaXMtPnF1ZXJ5X3BhcmFt c1skbmFtZV0pOwoJCWVsc2UKCQkJJHRoaXMtPnF1ZXJ5X3BhcmFtc1skbmFtZV0gPSAkdmFs dWU7CgkJJHRoaXMtPnVwZGF0ZV9mcm9tX3BhcmFtcygpOwoJCXJldHVybiAkdGhpczsKCX0K CgkvKiogUmVidWlsZCAkcXVlcnlfc3RyaW5nIGFuZCAkcmVxdWVzdF91cmkgKGFuZCB0aGUg Y29ycmVzcG9uZGluZwoJICogICRfU0VSVkVSIHZhbHVlcykgYmFzZWQgb24gdGhlIGN1cnJl bnQgJHBhcmFtcyBhcnJheQoJICovCglwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZV9mcm9tX3Bh cmFtcyAoICkKCXsKCQkvLyBodG1sZW5jb2RlIGFtcGVyc2FuZHMgbm93LCBiZWNhdXNlIHNv bWUgc2VydmVycyB3aWxsIGFueXdheQoJCSR0aGlzLT5xdWVyeV9zdHJpbmcgPSBodHRwX2J1 aWxkX3F1ZXJ5KCR0aGlzLT5xdWVyeV9wYXJhbXMsICcnLCAnJmFtcDsnKTsKCgkJJHRoaXMt PnJlcXVlc3RfdXJpID0gc2VsZjo6c3RyaXBfcXVlcnkoJHRoaXMtPnJlcXVlc3RfdXJpKSAu CgkJCSggJHRoaXMtPnF1ZXJ5X3N0cmluZyA/ICc/JyAuICR0aGlzLT5xdWVyeV9zdHJpbmcg OiAnJyApOwoJCSR0aGlzLT5mdWxsID0gcHJlZ19yZXBsYWNlKCcvXC8kLycsICcnLCBodSkg LiAkdGhpcy0+cmVxdWVzdF91cmkoKTsKCgkJLy8gdGhlbiBodG1sZGVjb2RlIGJlZm9yZSB1 cGRhdGluZyB0aGUgJF9TRVJWRVIgYXJyYXkKCQkkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10g PSBodG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPnF1ZXJ5X3N0cmluZyk7CgkJJF9TRVJWRVJb J1JFUVVFU1RfVVJJJ10gPSBodG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPnJlcXVlc3RfdXJp KTsKCX0KCgkvKiogUmVtb3ZlIHRoZSBxdWVyeSBzdHJpbmcgZnJvbSBhIFVSSQoJICogIEBy ZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJpcF9xdWVyeSAoICR1cmkg KQoJewoJCXJldHVybiBwcmVnX3JlcGxhY2UgKCcvKC4rKVw/LisvJywgJyQxJywgJHVyaSk7 Cgl9CgoJLyoqIFJldHVybiB0aGUgJHJlcXVlc3RfdXJpIGFmdGVyIHN0cmlwcGluZyBhbnkg c3ViZGlyCgkgKiAgKGZvciBUeHAgc3ViZGlyIGluc3RhbGxhdGlvbnMpCgkgKiAgQHJldHVy biBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiByZXF1ZXN0X3VyaSAoICkKCXsKCQlp ZiAoIHByZWdfbWF0Y2goJyY6Ly9bXi9dKygvLispLyQmJywgaHUsICRtYXRjaCkgKQoJCXsK CQkJJHN1Yl9kaXIgPSAkbWF0Y2hbMV07CgkJCXJldHVybiBzdWJzdHIoJHRoaXMtPnJlcXVl c3RfdXJpLCBzdHJsZW4oJHN1Yl9kaXIpKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5yZXF1ZXN0 X3VyaTsKCX0KCn0KCi8vLyBDbGFzcyBmb3Igc3RhdGljIHV0aWxpdHkgbWV0aG9kcwpjbGFz cyBzb29fdXRpbAp7CgkvKiogQnVpbGQgYSBUeHAgdGFnIHN0cmluZy4KCSAqICBAcGFyYW0g ZnVuYyBUeHAgdGFnIG5hbWUgKGUuZy4gJ2FydGljbGVfY3VzdG9tJykKCSAqICBAcGFyYW0g YXR0cyBUYWcgYXR0cmlidXRlcwoJICogIEBwYXJhbSB0aGluZyBUYWcgY29udGVudHMKCSAq ICBAcmV0dXJuIHN0cmluZyBUeHAgdGFnCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24g dHhwX3RhZyAoICRmdW5jLCAkYXR0cyA9IGFycmF5KCksICR0aGluZyA9IG51bGwgKQoJewoJ CSRhID0gJyc7CgkJZm9yZWFjaCAoICRhdHRzIGFzICRrID0+ICR2ICkKCQkJJGEgLj0gIiAk az1cIiR2XCIiOwoJCXJldHVybiAiPHR4cDokZnVuYyRhIiAuICggaXNfbnVsbCgkdGhpbmcp ID8gJyAvPicgOiAiPiR0aGluZzwvdHhwOiRmdW5jPiIgKTsKCX0KCgkvKiogUmV0dXJuIGEg VHhwIHRhZyBzdHJpbmcsIGlmIGl0J3Mgc3RpbGwgdGhlIGZpcnN0IHBhcnNlKCkgcGFzcy4K CSAqICBBbGxvd3MgcGxhY2luZyBhIHRhZyB3aXRoIGRlcGVuZGVuY2llcyBiZWZvcmUgaXRz IGFzc29jaWF0ZWQgY29udHJvbGxlciwKCSAqICBkZWZlcnJpbmcgcGFyc2luZyB0byB0aGUg c2Vjb25kIHBhcnNlKCkgcGFzcy4KCSAqICBFLmcuIHBsYWNpbmcgYSBwYWdpbmF0aW9uIHRh ZyBiZWZvcmUgaXRzIGFzc29jaWF0ZWQgYXJ0aWNsZSB0YWcuCgkgKiAgQHBhcmFtIGZ1bmMg VHhwIHRhZyBuYW1lIChlLmcuICdhcnRpY2xlX2N1c3RvbScpCgkgKiAgQHBhcmFtIGF0dHMg VGFnIGF0dHJpYnV0ZXMKCSAqICBAcGFyYW0gdGhpbmcgVGFnIGNvbnRlbnRzCgkgKiAgQHJl dHVybiBzdHJpbmcgVHhwIHRhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlY29u ZHBhc3MgKCAkZnVuYywgJGF0dHMgPSBhcnJheSgpLCAkdGhpbmcgPSBudWxsICkKCXsKCQln bG9iYWwgJHByZXRleHQ7CgkJaWYgKCAkcHJldGV4dFsnc2Vjb25kcGFzcyddICkgcmV0dXJu OyAvLyB5b3Ugb25seSBsaXZlIHR3aWNlCgkJcmV0dXJuIHNlbGY6OnR4cF90YWcoJGZ1bmMs ICRhdHRzLCAkdGhpbmcpOwoJfQoKfQoiO3M6NDoidHlwZSI7czoxOiIyIjtzOjU6ImZsYWdz IjtzOjE6IjAiO3M6NToib3JkZXIiO3M6MToiNSI7czozOiJtZDUiO3M6MzI6IjJhN2IwZmZh ODZmMmU3ZThmYWM5ODkxMDNiMzMwZGE4Ijt9