com gtk/php-gtk: dos -> nix line endings: win32/confutils.js
[email protected] (David Soria Parra) Tue, 20 Sep 2005 02:17:53 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
--d3048ba218c2fc8b349b9b852af27b48caac49fd Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Commit: 464741f5c911c5f59564f3aa4565cb456a8884aa=0AAuthor: Steph Fox = <[email protected]> Tue, 20 Sep 2005 02:17:53 +0000=0AParents: a64b442= 8416deaf93684d760ce9c6d9ab3493ea7=0ABranches: master=0A=0ALink: http= ://git.php.net/?p=3Dgtk/php-gtk.git;a=3Dcommitdiff;h=3D464741f5c911c5f59564= f3aa4565cb456a8884aa=0A=0ALog:=0Ados -> nix line endings=0A=0AChanged paths= :=0A M win32/confutils.js=0A=0A --d3048ba218c2fc8b349b9b852af27b48caac49fd Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="diff_464741f5c911c5f59564f3aa4565cb456a8884aa.txt" NDY0NzQxZjVjOTExYzVmNTk1NjRmM2FhNDU2NWNiNDU2YTg4ODRhYQpkaWZmIC0tZ2l0IGEvd2lu MzIvY29uZnV0aWxzLmpzIGIvd2luMzIvY29uZnV0aWxzLmpzCmluZGV4IGU1OWJlN2MuLmZkNWJm YWMgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbmZ1dGlscy5qcworKysgYi93aW4zMi9jb25mdXRpbHMu anMKQEAgLTEsMTIxOSArMSwxMjE5IEBACi0vLyBVdGlscyBmb3IgY29uZmlndXJlIHNjcmlwdA0K LS8qDQotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gIHwgUEhQLUdUSyBWZXJzaW9uIDIgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0rDQotICB8IENvcHlyaWdodCAoYykgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLSAgfCBUaGlz IHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNl LCAgICAgICB8DQotICB8IHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUg ZmlsZSBMSUNFTlNFLCBhbmQgaXMgICAgICAgIHwNCi0gIHwgYXZhaWxhYmxlIHRocm91Z2ggdGhl IHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAgICAgICAgfA0KLSAgfCBo dHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8DQotICB8IElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBQ SFAgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byAgIHwNCi0gIHwgb2J0YWluIGl0IHRocm91Z2gg dGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfA0KLSAg fCBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4g ICAgICAgICAgICAgICB8DQotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gIHwgQXV0aG9yOiBXZXogRnVy bG9uZyA8d2V6QHRoZWJyYWlucm9vbS5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0K LSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rDQotKi8NCi0NCi0vLyAkSWQ6IGNvbmZ1dGlscy5qcyx2IDEuNyAy MDA1LTA5LTEzIDE3OjAyOjEwIHNmb3ggRXhwICQNCi0NCi0vKiBzZXQgdmFycyAqLw0KLXZhciBT VERPVVQgPSBXU2NyaXB0LlN0ZE91dDsNCi12YXIgU1RERVJSID0gV1NjcmlwdC5TdGRFcnI7DQot dmFyIFdzaFNoZWxsID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKTsNCi12 YXIgRlNPID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIlNjcmlwdGluZy5GaWxlU3lzdGVtT2JqZWN0 Iik7DQotdmFyIE1GTyA9IG51bGw7DQotdmFyIFNZU1RFTV9EUklWRSA9IFdzaFNoZWxsLkVudmly b25tZW50KCJQcm9jZXNzIikuSXRlbSgiU3lzdGVtRHJpdmUiKTsNCi12YXIgUFJPR1JBTV9GSUxF UyA9IFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIikuSXRlbSgiUHJvZ3JhbUZpbGVzIik7 DQotDQotaWYgKFBST0dSQU1fRklMRVMgPT0gbnVsbCkgew0KLQlQUk9HUkFNX0ZJTEVTID0gIkM6 XFxQcm9ncmFtIEZpbGVzIjsNCi19DQotDQotdmFyIENXRCA9IFdzaFNoZWxsLkN1cnJlbnREaXJl Y3Rvcnk7DQotDQotaWYgKHR5cGVvZihDV0QpID09ICJ1bmRlZmluZWQiKSB7DQotCUNXRCA9IEZT Ty5HZXRQYXJlbnRGb2xkZXJOYW1lKEZTTy5HZXRBYnNvbHV0ZVBhdGhOYW1lKCJidWlsZGNvbmYu YmF0IikpOw0KLX0NCi0NCi1jb25maWd1cmVfYXJncyA9IG5ldyBBcnJheSgpOw0KLWNvbmZpZ3Vy ZV9zdWJzdCA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRGljdGlvbmFyeSIpOw0K LQ0KLWNvbmZpZ3VyZV9oZHIgPSBXU2NyaXB0LkNyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkRpY3Rp b25hcnkiKTsNCi1idWlsZF9kaXJzID0gbmV3IEFycmF5KCk7DQotDQotZXh0ZW5zaW9uX2luY2x1 ZGVfY29kZSA9ICIiOw0KLWV4dGVuc2lvbl9tb2R1bGVfcHRycyA9ICIiOw0KLQ0KLS8qIGZ1bmN0 aW9ucyAqLw0KLQ0KLWZ1bmN0aW9uIGNvdW50X2dlbmVyYXRlZF9maWxlcygpIHsNCi0NCi0JdmFy IGRpciA9IEZTTy5HZXRGb2xkZXIoImV4dC9ndGsrIik7DQotCXZhciBjb3VudCA9IDA7DQotDQot CWl0ZXIgPSBuZXcgRW51bWVyYXRvcihkaXIuRmlsZXMpOw0KLQluYW1lID0gIiI7DQotDQotCWZv ciAoOyAhaXRlci5hdEVuZCgpOyBpdGVyLm1vdmVOZXh0KCkpIHsNCi0JCW5hbWUgPSBGU08uR2V0 RmlsZU5hbWUoaXRlci5pdGVtKCkpOw0KLQkJaWYgKG5hbWUubWF0Y2gobmV3IFJlZ0V4cCgiZ2Vu XyIpKSkgew0KLQkJCWNvdW50Kys7DQotCQl9DQotCX0NCi0JcmV0dXJuIGNvdW50Ow0KLX0NCi0N Ci1mdW5jdGlvbiBnZW5lcmF0ZV9zb3VyY2UoKSB7DQotDQotCXZhciBjb3VudCA9IGNvdW50X2dl bmVyYXRlZF9maWxlcygpOw0KLQ0KLQlpZiAoY291bnQgPCA4KSB7DQotCQlpZiAoIUZTTy5GaWxl RXhpc3RzKCJ3aW4zMlxcdGVtcC5iYXQiKSkgew0KLQkJCVNUREVSUi5Xcml0ZUxpbmUoIlJ1biBi dWlsZGNvbmYgZmlyc3QgLSB0aGUgc291cmNlIGZpbGUgZ2VuZXJhdG9yIGlzIG1pc3NpbmciKTsN Ci0JCQlXU2NyaXB0LlF1aXQoMTApOw0KLQkJfSBlbHNlIHsNCi0JCQlXc2hTaGVsbC5SdW4oIndp bjMyXFx0ZW1wIiwgMCk7DQotCQl9DQotCX0NCi0JcmV0dXJuOw0KLX0NCi0NCi1mdW5jdGlvbiBj aGVja19nZW5lcmF0aW9uKCkgew0KLQ0KLQl2YXIgY291bnQgPSBjb3VudF9nZW5lcmF0ZWRfZmls ZXMoKTsNCi0NCi0JaWYgKGNvdW50IDwgOCkgew0KLQkJU1RET1VULldyaXRlTGluZSgiV2FpdGlu ZyBmb3Igc291cmNlIGZpbGVzIHRvIGdlbmVyYXRlLi4uIik7DQotCQlXU2NyaXB0LlNsZWVwKDM1 MDApOw0KLQkJY2hlY2tfZ2VuZXJhdGlvbigpOw0KLQl9DQotCXJldHVybjsNCi19DQotDQotZnVu Y3Rpb24gZ2V0X3ZlcnNpb25fbnVtYmVycygpIHsNCi0NCi0JLyogcGljayB1cCB0aGUgdmVyc2lv biBmcm9tIG1haW4vcGhwX2d0ay5oICovDQotCXZhciB2aW4gPSBmaWxlX2dldF9jb250ZW50cygi bWFpblxccGhwX2d0ay5oIik7DQotCXZhciB2ZXJzaW9uLCB2ZXJzaW9uX3N0cmluZ3MsIG1ham9y LCBtaW5vciwgZGV0YWlscywgcmVsZWFzZSwgc3VidmVyc2lvbl9zdHJpbmdzLCBleHRyYSA9ICIi Ow0KLQ0KLQlpZiAodmluLm1hdGNoKG5ldyBSZWdFeHAoIlBIUF9HVEtfVkVSU0lPTiBcIihbXlwi XSspXCIiKSkpIHsNCi0JCXZlcnNpb24gPSBSZWdFeHAuJDE7DQotCQl2ZXJzaW9uX3N0cmluZ3Mg PSB2ZXJzaW9uLnNwbGl0KCIuIik7DQotDQotCQltYWpvciA9IHZlcnNpb25fc3RyaW5nc1swXTsN Ci0JCW1pbm9yID0gdmVyc2lvbl9zdHJpbmdzWzFdOw0KLQkJZGV0YWlscyA9IHZlcnNpb25fc3Ry aW5nc1syXTsNCi0NCi0JCWlmIChkZXRhaWxzLmluZGV4T2YoIi0iKSA9PSAtMSkgew0KLQkJCXJl bGVhc2UgPSBkZXRhaWxzOw0KLQkJfSBlbHNlIHsNCi0JCQlzdWJ2ZXJzaW9uX3N0cmluZ3MgPSBk ZXRhaWxzLnNwbGl0KCItIik7DQotCQkJcmVsZWFzZSA9IHN1YnZlcnNpb25fc3RyaW5nc1swXTsN Ci0JCQlleHRyYSA9ICItIiArIHN1YnZlcnNpb25fc3RyaW5nc1sxXTsNCi0JCX0NCi0JfQ0KLQ0K LQl2YXIgdmZpbGUgPSBGU08uQ3JlYXRlVGV4dEZpbGUoIm1haW4vcGhwX2d0a192ZXJzaW9uLmgi LCB0cnVlKTsNCi0JdmZpbGUuV3JpdGVMaW5lKCIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxs eSBnZW5lcmF0ZWQgZHVyaW5nIHdpbjMyIGNvbmZpZ3VyYXRpb24gKi8iKTsNCi0JdmZpbGUuV3Jp dGVMaW5lKCIvKiBFZGl0IHBocF9ndGsuaCB0byBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyICov Iik7DQotCXZmaWxlLldyaXRlTGluZSgiI2RlZmluZSBQSFBfR1RLX01BSk9SX1ZFUlNJT04gIiAr IG1ham9yKTsNCi0JdmZpbGUuV3JpdGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfTUlOT1JfVkVSU0lP TiAiICsgbWlub3IpOw0KLQl2ZmlsZS5Xcml0ZUxpbmUoIiNkZWZpbmUgUEhQX0dUS19SRUxFQVNF X1ZFUlNJT04gIiArIHJlbGVhc2UpOw0KLQl2ZmlsZS5Xcml0ZUxpbmUoIiNkZWZpbmUgUEhQX0dU S19FWFRSQV9WRVJTSU9OIFwiIiArIGV4dHJhICsgIlwiIik7DQotDQotCURFRklORSgnUEhQX0dU S19WRVJTSU9OX1NUUklORycsIHZlcnNpb24pOw0KLX0NCi0NCi1mdW5jdGlvbiBjb25kZW5zZV9w YXRoKHBhdGgpIHsNCi0NCi0JcGF0aCA9IEZTTy5HZXRBYnNvbHV0ZVBhdGhOYW1lKHBhdGgpOw0K LQ0KLQlpZiAocGF0aC5zdWJzdHIoMCwgQ1dELmxlbmd0aCkudG9Mb3dlckNhc2UoKQ0KLQkJCT09 IENXRC50b0xvd2VyQ2FzZSgpICYmDQotCQkJKHBhdGguY2hhckNvZGVBdChDV0QubGVuZ3RoKSA9 PSA5MiB8fCBwYXRoLmNoYXJDb2RlQXQoQ1dELmxlbmd0aCkgPT0gNDcpKSB7DQotCQlyZXR1cm4g cGF0aC5zdWJzdHIoQ1dELmxlbmd0aCArIDEpOw0KLQl9DQotDQotCXZhciBhID0gQ1dELnNwbGl0 KCJcXCIpOw0KLQl2YXIgYiA9IHBhdGguc3BsaXQoIlxcIik7DQotCXZhciBpLCBqOw0KLQ0KLQlm b3IgKGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgew0KLQkJaWYgKGFbaV0udG9Mb3dlckNhc2Uo KSA9PSBiW2ldLnRvTG93ZXJDYXNlKCkpDQotCQkJY29udGludWU7DQotCQlpZiAoaSA+IDApIHsN Ci0JCQkvKiBmaXJzdCBkaWZmZXJlbmNlIGZvdW5kICovDQotCQkJcGF0aCA9ICIiOw0KLQkJCWZv ciAoaiA9IDA7IGogPCBhLmxlbmd0aCAtIGk7IGorKykgew0KLQkJCQlwYXRoICs9ICIuLlxcIjsN Ci0JCQl9DQotCQkJZm9yIChqID0gaTsgaiA8IGIubGVuZ3RoOyBqKyspIHsNCi0JCQkJcGF0aCAr PSBiW2pdOw0KLQkJCQlpZiAoaiA8IGIubGVuZ3RoIC0gMSkNCi0JCQkJCXBhdGggKz0gIlxcIjsN Ci0JCQl9DQotCQkJcmV0dXJuIHBhdGg7DQotCQl9DQotCQkvKiBvbiBhIGRpZmZlcmVudCBkcml2 ZSAqLw0KLQkJYnJlYWs7DQotCX0NCi0NCi0JcmV0dXJuIHBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9u IENvbmZpZ3VyZUFyZyh0eXBlLCBvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKSB7DQotDQotCXZh ciBvcHB0eXBlID0gdHlwZSA9PSAiZW5hYmxlIiA/ICJkaXNhYmxlIiA6ICJ3aXRob3V0IjsNCi0N Ci0JaWYgKGRlZnZhbCA9PSAieWVzIiB8fCBkZWZ2YWwgPT0gInllcyxzaGFyZWQiKSB7DQotCQl0 aGlzLmFyZyA9ICItLSIgKyBvcHB0eXBlICsgIi0iICsgb3B0bmFtZTsNCi0JCXRoaXMuaW1wYXJn ID0gIi0tIiArIHR5cGUgKyAiLSIgKyBvcHRuYW1lOw0KLQl9IGVsc2Ugew0KLQkJdGhpcy5hcmcg PSAiLS0iICsgdHlwZSArICItIiArIG9wdG5hbWU7DQotCQl0aGlzLmltcGFyZyA9ICItLSIgKyBv cHB0eXBlICsgIi0iICsgb3B0bmFtZTsNCi0JfQ0KLQ0KLQl0aGlzLm9wdG5hbWUgPSBvcHRuYW1l Ow0KLQl0aGlzLmhlbHB0ZXh0ID0gaGVscHRleHQ7DQotCXRoaXMuZGVmdmFsID0gZGVmdmFsOw0K LQl0aGlzLnN5bXZhbCA9IG9wdG5hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKG5ldyBSZWdFeHAo Ii0iLCAiZyIpLCAiXyIpOw0KLQl0aGlzLnNlZW4gPSBmYWxzZTsNCi0JdGhpcy5hcmd2YWwgPSBk ZWZ2YWw7DQotfQ0KLQ0KLWZ1bmN0aW9uIGFuYWx5emVfYXJnKGFyZ3ZhbCkgew0KLQ0KLQl2YXIg cmV0ID0gbmV3IEFycmF5KCk7DQotCXZhciBzaGFyZWQgPSBmYWxzZTsNCi0NCi0JaWYgKGFyZ3Zh bCA9PSAic2hhcmVkIikgew0KLQkJc2hhcmVkID0gdHJ1ZTsNCi0JCWFyZ3ZhbCA9ICJ5ZXMiOw0K LQl9IGVsc2UgaWYgKGFyZ3ZhbCA9PSBudWxsKSB7DQotCQkvKiBub3RoaW5nICovDQotCX0gZWxz ZSBpZiAoYXJnX21hdGNoID0gYXJndmFsLm1hdGNoKG5ldyBSZWdFeHAoIl5zaGFyZWQsKC4qKSIp KSkgew0KLQkJc2hhcmVkID0gdHJ1ZTsNCi0JCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsNCi0JfSBl bHNlIGlmIChhcmdfbWF0Y2ggPSBhcmd2YWwubWF0Y2gobmV3IFJlZ0V4cCgiXiguKiksc2hhcmVk JCIpKSkgew0KLQkJc2hhcmVkID0gdHJ1ZTsNCi0JCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsNCi0J fQ0KLQ0KLQlyZXRbMF0gPSBzaGFyZWQ7DQotCXJldFsxXSA9IGFyZ3ZhbDsNCi0JcmV0dXJuIHJl dDsNCi19DQotDQotZnVuY3Rpb24gY29uZl9wcm9jZXNzX2FyZ3MoKSB7DQotDQotCXZhciBpLCBq Ow0KLQl2YXIgY29uZmlndXJlX2hlbHBfbW9kZSA9IGZhbHNlOw0KLQl2YXIgYW5hbHl6ZWQgPSBm YWxzZTsNCi0JdmFyIG5pY2UgPSAiY3NjcmlwdCAvbm9sb2dvIGNvbmZpZ3VyZS5qcyAiOw0KLQl2 YXIgZGlzYWJsZV9hbGwgPSBmYWxzZTsNCi0NCi0JYXJncyA9IFdTY3JpcHQuQXJndW1lbnRzOw0K LQlmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgew0KLQkJYXJnID0gYXJncyhpKTsN Ci0JCW5pY2UgKz0gJyAiJyArIGFyZyArICciJzsNCi0JCWlmIChhcmcgPT0gIi0taGVscCIpIHsN Ci0JCQljb25maWd1cmVfaGVscF9tb2RlID0gdHJ1ZTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWlm IChhcmcgPT0gIi0tZGlzYWJsZS1hbGwiKSB7DQotCQkJZGlzYWJsZV9hbGwgPSB0cnVlOw0KLQkJ CWNvbnRpbnVlOw0KLQkJfQ0KLQ0KLQkJLy8gSWYgaXQgaXMgLS1mb289YmFyLCBzcGxpdCBvbiB0 aGUgZXF1YWxzIHNpZ24NCi0JCWFyZyA9IGFyZy5zcGxpdCgiPSIsIDIpOw0KLQkJYXJnbmFtZSA9 IGFyZ1swXTsNCi0JCWlmIChhcmcubGVuZ3RoID4gMSkgew0KLQkJCWFyZ3ZhbCA9IGFyZ1sxXTsN Ci0JCX0gZWxzZSB7DQotCQkJYXJndmFsID0gbnVsbDsNCi0JCX0NCi0NCi0JCS8vIEZpbmQgdGhl IGFyZw0KLQkJZm91bmQgPSBmYWxzZTsNCi0JCWZvciAoaiA9IDA7IGogPCBjb25maWd1cmVfYXJn cy5sZW5ndGg7IGorKykgew0KLQkJCWlmIChhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmlt cGFyZyB8fCBhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmFyZykgew0KLQkJCQlmb3VuZCA9 IHRydWU7DQotDQotCQkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2pdOw0KLQkJCQlhcmcuc2VlbiA9 IHRydWU7DQotDQotCQkJCWFuYWx5emVkID0gYW5hbHl6ZV9hcmcoYXJndmFsKTsNCi0JCQkJc2hh cmVkID0gYW5hbHl6ZWRbMF07DQotCQkJCWFyZ3ZhbCA9IGFuYWx5emVkWzFdOw0KLQ0KLQkJCQlp ZiAoYXJnbmFtZSA9PSBhcmcuaW1wYXJnKSB7DQotCQkJCQkvKiB3ZSBtYXRjaGVkIHRoZSBpbXBs aWNpdCwgb3IgZGVmYXVsdCBhcmcgKi8NCi0JCQkJCWlmIChhcmd2YWwgPT0gbnVsbCkgew0KLQkJ CQkJCWFyZ3ZhbCA9IGFyZy5kZWZ2YWw7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQkv KiB3ZSBtYXRjaGVkIHRoZSBub24tZGVmYXVsdCBhcmcgKi8NCi0JCQkJCWlmIChhcmd2YWwgPT0g bnVsbCkgew0KLQkJCQkJCWFyZ3ZhbCA9IGFyZy5kZWZ2YWwgPT0gIm5vIiA/ICJ5ZXMiIDogIm5v IjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJYXJnLmFyZ3ZhbCA9IGFyZ3ZhbDsNCi0J CQkJZXZhbCgiUEhQX0dUS18iICsgYXJnLnN5bXZhbCArICIgPSBhcmd2YWw7Iik7DQotCQkJCWV2 YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwgKyAiX1NIQVJFRCA9IHNoYXJlZDsiKTsNCi0JCQkJ YnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKCFmb3VuZCkgew0KLQkJCVNUREVSUi5Xcml0ZUxp bmUoIlVua25vd24gb3B0aW9uICIgKyBhcmduYW1lKQ0KLQkJCVNUREVSUi5Xcml0ZUxpbmUoIlBs ZWFzZSB0cnkgY29uZmlndXJlLmpzIC0taGVscCBmb3IgYSBsaXN0IG9mIHZhbGlkIG9wdGlvbnMi KTsNCi0JCQlXU2NyaXB0LlF1aXQoMik7DQotCQl9DQotCX0NCi0NCi0JaWYgKGNvbmZpZ3VyZV9o ZWxwX21vZGUpIHsNCi0JCVNURE9VVC5Xcml0ZUJsYW5rTGluZXMoMSk7DQotCQlTVERPVVQuV3Jp dGVMaW5lKCIgIFRoZXJlIGFyZSBubyBQSFAtR1RLIGV4dGVuc2lvbnMgYXZhaWxhYmxlIGF0IHBy ZXNlbnQuIik7DQotCQlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOw0KLQ0KLQkJLy8gTWVhc3Vy ZSB3aWR0aCB0byBwcmV0dHktcHJpbnQgdGhlIG91dHB1dA0KLQkJbWF4X3dpZHRoID0gMDsNCi0J CWZvciAoaSA9IDA7IGkgPCBjb25maWd1cmVfYXJncy5sZW5ndGg7IGkrKykgew0KLQkJCWFyZyA9 IGNvbmZpZ3VyZV9hcmdzW2ldOw0KLQkJCWlmIChhcmcuYXJnLmxlbmd0aCA+IG1heF93aWR0aCkg ew0KLQkJCQltYXhfd2lkdGggPSBhcmcuYXJnLmxlbmd0aDsNCi0JCQl9DQotCQl9DQotDQotCQlm b3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBpKyspIHsNCi0JCQlhcmcgPSBj b25maWd1cmVfYXJnc1tpXTsNCi0NCi0JCQluID0gbWF4X3dpZHRoIC0gYXJnLmFyZy5sZW5ndGg7 DQotCQkJcGFkID0gIiAgICI7DQotCQkJZm9yIChqID0gMDsgaiA8IG47IGorKykgew0KLQkJCQlw YWQgKz0gIiAiOw0KLQkJCX0NCi0JCQlTVERPVVQuV3JpdGVMaW5lKCIgICIgKyBhcmcuYXJnICsg cGFkICsgd29yZF93cmFwX2FuZF9pbmRlbnQobWF4X3dpZHRoICsgNSwgYXJnLmhlbHB0ZXh0KSk7 DQotCQl9DQotCQlXU2NyaXB0LlF1aXQoMSk7DQotDQotCX0gZWxzZSB7IC8vIG5vdCAtLWhlbHAN Ci0NCi0JCWdlbmVyYXRlX3NvdXJjZSgpOw0KLQl9DQotDQotCS8vIE5vdyBzZXQgYW55IGRlZmF1 bHRzIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIG91dCBlYXJsaWVyDQotCWZvciAoaSA9IDA7IGkgPCBj b25maWd1cmVfYXJncy5sZW5ndGg7IGkrKykgew0KLQkJYXJnID0gY29uZmlndXJlX2FyZ3NbaV07 DQotCQlpZiAoYXJnLnNlZW4pDQotCQkJY29udGludWU7DQotCQlhbmFseXplZCA9IGFuYWx5emVf YXJnKGFyZy5kZWZ2YWwpOw0KLQkJc2hhcmVkID0gYW5hbHl6ZWRbMF07DQotCQlhcmd2YWwgPSBh bmFseXplZFsxXTsNCi0NCi0JCWlmIChkaXNhYmxlX2FsbCkgew0KLQkJCWFyZ3ZhbCA9ICJubyI7 DQotCQkJc2hhcmVkID0gZmFsc2U7DQotCQl9DQotDQotCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcu c3ltdmFsICsgIiA9IGFyZ3ZhbDsiKTsNCi0JCWV2YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwg KyAiX1NIQVJFRCA9IHNoYXJlZDsiKTsNCi0JfQ0KLQ0KLQlNRk8gPSBGU08uQ3JlYXRlVGV4dEZp bGUoIk1ha2VmaWxlLm9iamVjdHMiLCB0cnVlKTsNCi0NCi0JU1RET1VULldyaXRlQmxhbmtMaW5l cygxKTsNCi0JU1RET1VULldyaXRlTGluZSgiU2F2aW5nIGNvbmZpZ3VyZSBvcHRpb25zIHRvIGNv bmZpZ3VyZS5iYXQiKTsNCi0JdmFyIG5pY2VmaWxlID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJjb25m aWd1cmUuYmF0IiwgdHJ1ZSk7DQotCW5pY2VmaWxlLldyaXRlTGluZShuaWNlKTsNCi0JbmljZWZp bGUuQ2xvc2UoKTsNCi0NCi0JQUNfREVGSU5FKCdDT05GSUdVUkVfQ09NTUFORCcsIG5pY2UpOw0K LX0NCi0NCi1mdW5jdGlvbiBmaW5kX3BhdHRlcm5faW5fcGF0aChwYXR0ZXJuLCBwYXRoKSB7DQot DQotCWlmIChwYXRoID09IG51bGwpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQl2YXIg ZGlycyA9IHBhdGguc3BsaXQoJzsnKTsNCi0JdmFyIGk7DQotCXZhciBpdGVtczsNCi0NCi0JZm9y IChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsNCi0JCWl0ZW1zID0gZ2xvYihkaXJzW2ld ICsgIlxcIiArIHBhdHRlcm4pOw0KLQkJaWYgKGl0ZW1zKSB7DQotCQkJcmV0dXJuIGNvbmRlbnNl X3BhdGgoaXRlbXNbMF0pOw0KLQkJfQ0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotZnVu Y3Rpb24gQVJHX1dJVEgob3B0bmFtZSwgaGVscHRleHQsIGRlZnZhbCkgew0KLQ0KLQljb25maWd1 cmVfYXJnc1tjb25maWd1cmVfYXJncy5sZW5ndGhdID0gbmV3IENvbmZpZ3VyZUFyZygid2l0aCIs IG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpOw0KLX0NCi0NCi1mdW5jdGlvbiBBUkdfRU5BQkxF KG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpIHsNCi0NCi0JY29uZmlndXJlX2FyZ3NbY29uZmln dXJlX2FyZ3MubGVuZ3RoXSA9IG5ldyBDb25maWd1cmVBcmcoImVuYWJsZSIsIG9wdG5hbWUsIGhl bHB0ZXh0LCBkZWZ2YWwpOw0KLX0NCi0NCi1mdW5jdGlvbiBERUZJTkUobmFtZSwgdmFsdWUpIHsN Ci0NCi0JaWYgKGNvbmZpZ3VyZV9zdWJzdC5FeGlzdHMobmFtZSkpIHsNCi0JCWNvbmZpZ3VyZV9z dWJzdC5SZW1vdmUobmFtZSk7DQotCX0NCi0JY29uZmlndXJlX3N1YnN0LkFkZChuYW1lLCB2YWx1 ZSk7DQotfQ0KLQ0KLWZ1bmN0aW9uIEFDX0RFRklORShuYW1lLCB2YWx1ZSwgY29tbWVudCwgcXVv dGUpIHsNCi0NCi0JaWYgKHF1b3RlID09IG51bGwpIHsNCi0JCXF1b3RlID0gdHJ1ZTsNCi0JfQ0K LQlpZiAocXVvdGUgJiYgdHlwZW9mKHZhbHVlKSA9PSAic3RyaW5nIikgew0KLQkJdmFsdWUgPSAn IicgKyB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhbIlxcXFxdKScsICJnIiksICdcXCQxJykg KyAnIic7DQotCX0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID09IDApIHsNCi0JCXZhbHVlID0gJyIi JzsNCi0JfQ0KLQl2YXIgaXRlbSA9IG5ldyBBcnJheSh2YWx1ZSwgY29tbWVudCk7DQotCWlmIChj b25maWd1cmVfaGRyLkV4aXN0cyhuYW1lKSkgew0KLQkJdmFyIG9yaWdfaXRlbSA9IGNvbmZpZ3Vy ZV9oZHIuSXRlbShuYW1lKTsNCi0JCVNURE9VVC5Xcml0ZUxpbmUoIkFDX0RFRklORVsiICsgbmFt ZSArICJdPSIgKyB2YWx1ZSArICI6IGlzIGFscmVhZHkgZGVmaW5lZCB0byAiICsgaXRlbVswXSk7 DQotCX0gZWxzZSB7DQotCQljb25maWd1cmVfaGRyLkFkZChuYW1lLCBpdGVtKTsNCi0JfQ0KLX0N Ci0NCi1mdW5jdGlvbiBQQVRIX1BST0cocHJvZ25hbWUsIGFkZGl0aW9uYWxfcGF0aHMsIHN5bWJv bCkgew0KLQ0KLQl2YXIgZXhlOw0KLQl2YXIgcGxhY2U7DQotCXZhciBjeWdfcGF0aCA9IFBIUF9H VEtfQ1lHV0lOICsgIlxcYmluOyIgKyBQSFBfR1RLX0NZR1dJTiArICJcXHVzclxcbG9jYWxcXGJp biI7DQotDQotCWV4ZSA9IHByb2duYW1lICsgIi5leGUiOw0KLQ0KLQlpZiAoYWRkaXRpb25hbF9w YXRocyA9PSBudWxsKSB7DQotCQlhZGRpdGlvbmFsX3BhdGhzID0gY3lnX3BhdGg7DQotCX0gZWxz ZSB7DQotCQlhZGRpdGlvbmFsX3BhdGhzICs9ICI7IiArIGN5Z19wYXRoOw0KLQl9DQotDQotCXBs YWNlID0gc2VhcmNoX3BhdGhzKGV4ZSwgYWRkaXRpb25hbF9wYXRocywgIlBBVEgiKTsNCi0NCi0J aWYgKHBsYWNlID09IHRydWUpIHsNCi0JCXBsYWNlID0gZXhlOw0KLQl9IGVsc2UgaWYgKHBsYWNl ICE9IGZhbHNlKSB7DQotDQotCQlpZiAocGxhY2UubGFzdEluZGV4T2YoIlxcIikgIT0gcGxhY2Uu bGVuZ3RoIC0gMSkgew0KLQkJCXBsYWNlICs9ICJcXCI7DQotCQl9DQotDQotCQlwbGFjZSA9IHBs YWNlICsgZXhlOw0KLQ0KLQkJaWYgKHBsYWNlLmluZGV4T2YoIiAiKSkgew0KLQkJCXBsYWNlID0g JyInICsgcGxhY2UgKyAnIic7DQotCQl9DQotCX0NCi0NCi0JaWYgKHBsYWNlKSB7DQotCQlpZiAo c3ltYm9sID09IG51bGwpIHsNCi0JCQlzeW1ib2wgPSBwcm9nbmFtZS50b1VwcGVyQ2FzZSgpOw0K LQkJfQ0KLQkJREVGSU5FKHN5bWJvbCwgcGxhY2UpOw0KLQl9DQotCXJldHVybiBwbGFjZTsNCi19 DQotDQotZnVuY3Rpb24gQ0hFQ0tfTElCKGxpYm5hbWVzLCB0YXJnZXQsIHBhdGhfdG9fY2hlY2ss IGNvbW1vbl9uYW1lKSB7DQotDQotCVNURE9VVC5Xcml0ZSgiQ2hlY2tpbmcgZm9yICIgKyBsaWJu YW1lcyArICIgLi4uICIpOw0KLQ0KLQlpZiAoY29tbW9uX25hbWUgPT0gbnVsbCAmJiB0YXJnZXQg IT0gbnVsbCkgew0KLQkJY29tbW9uX25hbWUgPSB0YXJnZXQ7DQotCX0NCi0NCi0JaWYgKHBhdGhf dG9fY2hlY2sgPT0gbnVsbCkgew0KLQkJcGF0aF90b19jaGVjayA9ICIiOw0KLQl9DQotDQotCS8v IGlmIHRoZXkgc3BlY2lmaWVkIGEgY29tbW9uIG5hbWUgZm9yIHRoZSBwYWNrYWdlIHRoYXQgY29u dGFpbnMNCi0JLy8gdGhlIGxpYnJhcnksIHRhZyBzb21lIHVzZWZ1bCBkZWZhdWx0cyBvbiB0byB0 aGUgZW5kIG9mIHRoZQ0KLQkvLyBwYXRoIHRvIGJlIHNlYXJjaGVkDQotCWlmIChjb21tb25fbmFt ZSAhPSBudWxsKSB7DQotCQlwYXRoX3RvX2NoZWNrICs9ICI7Li5cXCIgKyBjb21tb25fbmFtZSAr ICIqIjsNCi0JfQ0KLQ0KLQkvLyBEZXRlcm1pbmUgdGFyZ2V0IGZvciBidWlsZCBmbGFncw0KLQlp ZiAodGFyZ2V0ID09IG51bGwpIHsNCi0JCXRhcmdldCA9ICIiOw0KLQl9IGVsc2Ugew0KLQkJdGFy Z2V0ID0gIl8iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwg ImciKSwgIl8iKTsNCi0JfQ0KLQ0KLQkvLyBFeHBhbmQgcGF0aCB0byBpbmNsdWRlIGdlbmVyYWwg ZGlycw0KLQlwYXRoX3RvX2NoZWNrICs9ICI7IiArIHBocF91c3VhbF9saWJfc3VzcGVjdHM7DQot DQotCS8vIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byBwdXQgbGlicyB1bmRlciBvbmUgb2YgdGhl c2UgZGlyIG5hbWVzDQotCXZhciBzdWJkaXJzID0gbmV3IEFycmF5KFBIUF9HVEtfREVCVUcgPT0g InllcyIgPyAiRGVidWciIDogIlJlbGVhc2UiLCAibGliIiwgImxpYnMiLCAibGliZXhlYyIpOw0K LQ0KLQkvLyBsaWJuYW1lcyBjYW4gYmUgOyBzZXBhcmF0ZWQgbGlzdCBvZiBhY2NlcHRlZCBsaWJy YXJ5IG5hbWVzDQotCWxpYm5hbWVzID0gbGlibmFtZXMuc3BsaXQoJzsnKTsNCi0NCi0JdmFyIGks IGosIGssIGxpYm5hbWU7DQotCXZhciBsb2NhdGlvbiA9IGZhbHNlOw0KLQl2YXIgcGF0aCA9IHBh dGhfdG9fY2hlY2suc3BsaXQoJzsnKTsNCi0JDQotCWZvciAoaSA9IDA7IGkgPCBsaWJuYW1lcy5s ZW5ndGg7IGkrKykgew0KLQkJbGlibmFtZSA9IGxpYm5hbWVzW2ldOw0KLQ0KLQkJZm9yIChrID0g MDsgayA8IHBhdGgubGVuZ3RoOyBrKyspIHsNCi0JCQlsb2NhdGlvbiA9IGdsb2IocGF0aFtrXSAr ICJcXCIgKyBsaWJuYW1lKTsNCi0JCQlpZiAobG9jYXRpb24pIHsNCi0JCQkJbG9jYXRpb24gPSBs b2NhdGlvblswXTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWZvciAoaiA9IDA7IGogPCBzdWJk aXJzLmxlbmd0aDsgaisrKSB7DQotCQkJCWxvY2F0aW9uID0gZ2xvYihwYXRoW2tdICsgIlxcIiAr IHN1YmRpcnNbal0gKyAiXFwiICsgbGlibmFtZSk7DQotCQkJCWlmIChsb2NhdGlvbikgew0KLQkJ CQkJbG9jYXRpb24gPSBsb2NhdGlvblswXTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0K LQkJCWlmIChsb2NhdGlvbikNCi0JCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAobG9jYXRpb24p IHsNCi0JCQlsb2NhdGlvbiA9IGNvbmRlbnNlX3BhdGgobG9jYXRpb24pOw0KLQkJCXZhciBsaWJk aXIgPSBGU08uR2V0UGFyZW50Rm9sZGVyTmFtZShsb2NhdGlvbik7DQotCQkJbGlibmFtZSA9IEZT Ty5HZXRGaWxlTmFtZShsb2NhdGlvbik7DQotCQkJQUREX0ZMQUcoIkxERkxBR1MiICsgdGFyZ2V0 LCAnL2xpYnBhdGg6IicgKyBsaWJkaXIgKyAnIiAnKTsNCi0JCQlBRERfRkxBRygiTElCUyIgKyB0 YXJnZXQsIGxpYm5hbWUpOw0KLQ0KLQkJCVNURE9VVC5Xcml0ZUxpbmUoCWxvY2F0aW9uKTsNCi0N Ci0JCQlyZXR1cm4gbG9jYXRpb247DQotCQl9DQotDQotCQkvLyBDaGVjayBpbiB0aGVpciBzdGFu ZGFyZCBsaWIgcGF0aA0KLQkJbG9jYXRpb24gPSBmaW5kX3BhdHRlcm5faW5fcGF0aChsaWJuYW1l LCBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oIkxJQiIpKTsNCi0NCi0JCWlm IChsb2NhdGlvbikgew0KLQkJCWxvY2F0aW9uID0gY29uZGVuc2VfcGF0aChsb2NhdGlvbik7DQot CQkJbGlibmFtZSA9IEZTTy5HZXRGaWxlTmFtZShsb2NhdGlvbik7DQotCQkJQUREX0ZMQUcoIkxJ QlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsNCi0NCi0JCQlTVERPVVQuV3JpdGVMaW5lKCIJPGluIExJ QiBwYXRoPiAiICsgbGlibmFtZSk7DQotCQkJcmV0dXJuIGxvY2F0aW9uOw0KLQkJfQ0KLQl9DQot DQotCVNURE9VVC5Xcml0ZUxpbmUoIgk8bm90IGZvdW5kPiIpOw0KLQ0KLQlyZXR1cm4gZmFsc2U7 DQotfQ0KLQ0KLWZ1bmN0aW9uIENIRUNLX0hFQURFUihoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVj aykgew0KLQ0KLQl2YXIgcGF0aCA9IHNlYXJjaF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19j aGVjaywgIklOQ0xVREUiKTsNCi0NCi0JaWYgKCFwYXRoKSB7DQotCQlFUlJPUigiQWJvcnRpbmcg Y29uZmlndXJlIHByb2Nlc3MiKTsNCi0JfQ0KLQ0KLQlyZXR1cm4gcGF0aDsNCi19DQotDQotLy8g dXNlIHRoaXMgZm9yIHZlcnNpb24gY2hlY2tpbmcNCi1mdW5jdGlvbiBHUkVQX0hFQURFUihoZWFk ZXJfbmFtZSwgcmVnZXgsIHBhdGhfdG9fY2hlY2spIHsNCi0NCi0JdmFyIGMgPSBmYWxzZTsNCi0N Ci0JaWYgKEZTTy5GaWxlRXhpc3RzKHBhdGhfdG9fY2hlY2sgKyAiXFwiICsgaGVhZGVyX25hbWUp KSB7DQotCQljID0gZmlsZV9nZXRfY29udGVudHMocGF0aF90b19jaGVjayArICJcXCIgKyBoZWFk ZXJfbmFtZSk7DQotCX0NCi0NCi0JaWYgKCFjKSB7DQotCQkvKiBsb29rIGluIHRoZSBpbmNsdWRl IHBhdGggKi8NCi0NCi0JCXZhciBwID0gc2VhcmNoX3BhdGhzKGhlYWRlcl9uYW1lLCBwYXRoX3Rv X2NoZWNrLCAiSU5DTFVERSIpOw0KLQ0KLQkJaWYgKHR5cGVvZihwKSA9PSAic3RyaW5nIikgew0K LQkJCWMgPSBmaWxlX2dldF9jb250ZW50cyhwKTsNCi0JCX0NCi0NCi0JCWlmICghYykgew0KLQkJ CXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQ0KLQlpZiAodHlwZW9mKHJlZ2V4KSA9PSAic3Ry aW5nIikgew0KLQkJcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4KTsNCi0JfQ0KLQ0KLQlpZiAoYy5t YXRjaChyZWdleCkpIHsNCi0JCS8qIGNhbGxlciBjYW4gbm93IHVzZSBSZWdFeHAuJDEgZXRjLiB0 byBnZXQgYXQgcGF0dGVybnMgKi8NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCXJldHVybiBmYWxz ZTsNCi19DQotDQotZnVuY3Rpb24gQ0hFQ0tfSEVBREVSX0FERF9JTkNMVURFKGhlYWRlcl9uYW1l LCBmbGFnX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYsIGFkZF9kaXJfcGFydCwgYWRkX3Rv X2ZsYWdfb25seSkgew0KLQ0KLQl2YXIgZGlyX3BhcnRfdG9fYWRkID0gIiI7DQotDQotCWlmICh1 c2VfZW52ID09IG51bGwpIHsNCi0JCXVzZV9lbnYgPSB0cnVlOw0KLQl9DQotDQotCS8vIGlmIHRy dWUsIGFkZCB0aGUgZGlyIHBhcnQgb2YgdGhlIGhlYWRlcl9uYW1lIHRvIHRoZSBpbmNsdWRlIHBh dGgNCi0JaWYgKGFkZF9kaXJfcGFydCA9PSBudWxsKSB7DQotCQlhZGRfZGlyX3BhcnQgPSBmYWxz ZTsNCi0JfSBlbHNlIGlmIChhZGRfZGlyX3BhcnQpIHsNCi0JCXZhciBiYXNlbmFtZSA9IEZTTy5H ZXRGaWxlTmFtZShoZWFkZXJfbmFtZSk7DQotCQlkaXJfcGFydF90b19hZGQgPSAiXFwiICsgaGVh ZGVyX25hbWUuc3Vic3RyKDAsIGhlYWRlcl9uYW1lLmxlbmd0aCAtIGJhc2VuYW1lLmxlbmd0aCAt IDEpOw0KLQl9DQotDQotCWlmIChwYXRoX3RvX2NoZWNrID09IG51bGwpIHsNCi0JCXBhdGhfdG9f Y2hlY2sgPSBwaHBfdXN1YWxfaW5jbHVkZV9zdXNwZWN0czsNCi0JfSBlbHNlIHsNCi0JCXBhdGhf dG9fY2hlY2sgKz0gIjsiICsgcGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHM7DQotCX0NCi0JDQot CXZhciBwID0gc2VhcmNoX3BhdGhzKGhlYWRlcl9uYW1lLCBwYXRoX3RvX2NoZWNrLCB1c2VfZW52 ID8gIklOQ0xVREUiIDogbnVsbCk7DQotCXZhciBoYXZlID0gMDsNCi0JdmFyIHN5bTsNCi0NCi0J aWYgKHR5cGVvZihwKSA9PSAic3RyaW5nIikgew0KLQkJQUREX0ZMQUcoZmxhZ19uYW1lLCAnL0kg IicgKyBwICsgZGlyX3BhcnRfdG9fYWRkICsgJyIgJyk7DQotCX0NCi0NCi0JaGF2ZSA9IHAgPyAx IDogMA0KLQ0KLQlzeW0gPSBoZWFkZXJfbmFtZS50b1VwcGVyQ2FzZSgpOw0KLQlzeW0gPSBzeW0u cmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC9cLi1dIiwgImciKSwgIl8iKTsNCi0NCi0JaWYgKHR5 cGVvZihhZGRfdG9fZmxhZ19vbmx5KSA9PSAidW5kZWZpbmVkIiAmJg0KLQkJCWZsYWdfbmFtZS5t YXRjaChuZXcgUmVnRXhwKCJeQ0ZMQUdTXyguKikkIikpKSB7DQotCQlhZGRfdG9fZmxhZ19vbmx5 ID0gdHJ1ZTsNCi0JfQ0KLQ0KLQlpZiAodHlwZW9mKGFkZF90b19mbGFnX29ubHkpICE9ICJ1bmRl ZmluZWQiKSB7DQotCQlBRERfRkxBRyhmbGFnX25hbWUsICIvRCBIQVZFXyIgKyBzeW0gKyAiPSIg KyBoYXZlKTsNCi0JfSBlbHNlIHsNCi0JCUFDX0RFRklORSgiSEFWRV8iICsgc3ltLCBoYXZlLCAi aGF2ZSB0aGUgIiArIGhlYWRlcl9uYW1lICsgIiBoZWFkZXIgZmlsZSIpOw0KLQl9DQotDQotCXJl dHVybiBwOw0KLX0NCi0NCi0vKiBBZGQgYSBkZXBlbmRlbmN5LCBzbyB0aGF0IFBIUC1HVEsgaXMg YnVpbHQgYmVmb3JlIGFueSBvZiBpdHMgZXh0ZW5zaW9ucyAqLw0KLWZ1bmN0aW9uIEFERF9FWFRF TlNJT05fREVQKGV4dG5hbWUsIGRlcGVuZHNvbiwgb3B0aW9uYWwpIHsNCi0NCi0JdmFyIEVYVCA9 IGV4dG5hbWUudG9VcHBlckNhc2UoKTsNCi0JdmFyIERFUCA9IGRlcGVuZHNvbi50b1VwcGVyQ2Fz ZSgpOw0KLQl2YXIgZGVwX3ByZXNlbnQgPSBmYWxzZTsNCi0JdmFyIGRlcF9zaGFyZWQgPSBmYWxz ZTsNCi0NCi0JdHJ5IHsNCi0JCWRlcF9wcmVzZW50ID0gZXZhbCgiUEhQX0dUS18iICsgREVQKTsN Ci0JCWRlcF9zaGFyZWQgPSBldmFsKCJQSFBfR1RLXyIgKyBERVAgKyAiX1NIQVJFRCIpOw0KLQl9 IGNhdGNoIChlKSB7DQotCQlkZXBfcHJlc2VudCA9ICJubyI7DQotCQlkZXBfc2hhcmVkID0gZmFs c2U7DQotCX0NCi0JDQotCWlmIChvcHRpb25hbCkgew0KLQkJaWYgKGRlcF9wcmVzZW50ID09ICJu byIpDQotCQkJcmV0dXJuOw0KLQl9DQotDQotCXZhciBleHRfc2hhcmVkID0gZXZhbCgiUEhQX0dU S18iICsgRVhUICsgIl9TSEFSRUQiKTsNCi0NCi0JaWYgKGRlcF9zaGFyZWQpIHsNCi0JCUFERF9G TEFHKCJMREZMQUdTXyIgKyBFWFQsICIvbGlicGF0aDokKEJVSUxEX0RJUikiKTsNCi0JCUFERF9G TEFHKCJMSUJTXyIgKyBFWFQsICJwaHBfIiArIGRlcGVuZHNvbiArICIubGliIik7DQotCQlBRERf RkxBRygiREVQU18iICsgRVhULCAiJChCVUlMRF9ESVIpXFxwaHBfIiArIGRlcGVuZHNvbiArICIu bGliIik7DQotCX0NCi19DQotDQotZnVuY3Rpb24gRVhURU5TSU9OKGV4dG5hbWUsIGZpbGVfbGlz dCwgc2hhcmVkLCBjZmxhZ3MsIGRsbG5hbWUsIG9ial9kaXIpIHsNCi0NCi0JdmFyIG9ianMgPSBu dWxsOw0KLQl2YXIgRVhUID0gZXh0bmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJlZ0V4 cCgiLSIsICJnIiksICJfIik7DQotCXZhciBleHRuYW1lX2Zvcl9wcmludGluZzsNCi0NCi0JaWYg KHNoYXJlZCA9PSBudWxsKSB7DQotCQlldmFsKCJzaGFyZWQgPSBQSFBfR1RLXyIgKyBFWFQgKyAi X1NIQVJFRDsiKTsNCi0JfQ0KLQ0KLQlpZiAoY2ZsYWdzID09IG51bGwpIHsNCi0JCWNmbGFncyA9 ICIiOw0KLQl9DQotDQotCWlmICh0eXBlb2Yob2JqX2RpcikgPT0gInVuZGVmaW5lZCIpIHsNCi0N Ci0JCWV4dG5hbWVfZm9yX3ByaW50aW5nID0gY29uZmlndXJlX21vZHVsZV9kaXJuYW1lOw0KLQ0K LQl9IGVsc2Ugew0KLQ0KLQkJZXh0bmFtZV9mb3JfcHJpbnRpbmcgPSBjb25maWd1cmVfbW9kdWxl X2Rpcm5hbWUgKyAiICh2aWEgIiArIG9ial9kaXIgKyAiKSI7DQotCX0NCi0NCi0JU1RET1VULldy aXRlTGluZSgiRW5hYmxpbmcgZXh0ZW5zaW9uICIgKyBleHRuYW1lX2Zvcl9wcmludGluZyArICIg W3NoYXJlZF0iKTsNCi0JY2ZsYWdzID0gIi9EIENPTVBJTEVfRExfIiArIEVYVCArICIyIC9EICIg KyBFWFQgKyAiX0VYUE9SVFM9MSIgKyBjZmxhZ3M7DQotDQotCU1GTy5Xcml0ZUJsYW5rTGluZXMo MSk7DQotCU1GTy5Xcml0ZUxpbmUoIiMgb2JqZWN0cyBmb3IgRVhUICIgKyBleHRuYW1lKTsNCi0J TUZPLldyaXRlQmxhbmtMaW5lcygxKTsNCi0NCi0JQUREX1NPVVJDRVMoY29uZmlndXJlX21vZHVs ZV9kaXJuYW1lLCBmaWxlX2xpc3QsIGV4dG5hbWUsIG9ial9kaXIpOw0KLQ0KLQlNRk8uV3JpdGVC bGFua0xpbmVzKDEpOw0KLQ0KLQkvLyBQSFAtR1RLIGFuZCBpdHMgZXh0ZW5zaW9ucyBhcmUgYWx3 YXlzIGJ1aWx0IGFzIHNoYXJlZA0KLQ0KLQlpZiAoZGxsbmFtZSA9PSBudWxsKSB7DQotCQlpZiAo ZXh0bmFtZSA9PSAncGhwLWd0aycpIHsNCi0JCQlkbGxuYW1lID0gZXh0bmFtZSArICIyLmRsbCI7 DQotCQl9IGVsc2Ugew0KLQkJCWRsbG5hbWUgPSAicGhwX2d0a18iICsgZXh0bmFtZSArICIuZGxs IjsNCi0JCX0NCi0JfQ0KLQl2YXIgbGlibmFtZSA9IGRsbG5hbWUuc3Vic3RyaW5nKDAsIGRsbG5h bWUubGVuZ3RoLTQpICsgIi5saWIiOw0KLQl2YXIgbGQgPSAiQCQoTEQpIjsNCi0NCi0JcmVzbmFt ZSA9IGdlbmVyYXRlX3ZlcnNpb25faW5mb19yZXNvdXJjZShkbGxuYW1lLCBjb25maWd1cmVfbW9k dWxlX2Rpcm5hbWUpOw0KLQ0KLQlNRk8uV3JpdGVMaW5lKCIkKEJVSUxEX0RJUilcXCQoUEhQR1RL RExMKTogJCgiICsgRVhUICsgIl9HTE9CQUxfT0JKUykgJChQSFBHVEtETExfUkVTKSIpOw0KLQlN Rk8uV3JpdGVMaW5lKCJcdCIgKyBsZCArICIgL291dDokKEJVSUxEX0RJUilcXCQoUEhQR1RLRExM KSAkKCIgKyBFWFQgKyAiX0xERkxBR1MpICQoTERGTEFHUykgJCgiICsgRVhUICsgIl9HTE9CQUxf T0JKUykgJChMSUJTXyIgKyBFWFQgKyAiKSAkKExJQlMpICQoUEhQR1RLRExMX1JFUykiKTsNCi0J TUZPLldyaXRlQmxhbmtMaW5lcygxKTsNCi0NCi0JTUZPLldyaXRlTGluZShkbGxuYW1lICsgIjog JChCVUlMRF9ESVIpXFwiICsgZGxsbmFtZSk7DQotCU1GTy5Xcml0ZUxpbmUoIlx0QGVjaG8gRVhU ICIgKyBleHRuYW1lICsgIiBidWlsZCBjb21wbGV0ZSIpOw0KLQlNRk8uV3JpdGVCbGFua0xpbmVz KDEpOw0KLQ0KLQlBRERfRkxBRygiQ0ZMQUdTXyIgKyBFWFQsIGNmbGFncyk7DQotfQ0KLQ0KLWZ1 bmN0aW9uIEFERF9TT1VSQ0VTKGRpciwgZmlsZV9saXN0LCB0YXJnZXQsIG9ial9kaXIpIHsNCi0N Ci0JdmFyIGk7DQotCXZhciB0djsNCi0JdmFyIHNyYywgb2JqLCBzeW0sIGZsYWdzOw0KLQ0KLQlp ZiAodGFyZ2V0ID09IG51bGwpIHsNCi0JCXRhcmdldCA9ICJwaHAiOw0KLQl9DQotDQotCXN5bSA9 IHRhcmdldC50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIikg KyAiX0dMT0JBTF9PQkpTIjsNCi0JZmxhZ3MgPSAiQ0ZMQUdTXyIgKyB0YXJnZXQudG9VcHBlckNh c2UoKS5yZXBsYWNlKG5ldyBSZWdFeHAoIi0iLCAiZyIpLCAiXyIpOw0KLQ0KLQlpZiAoY29uZmln dXJlX3N1YnN0LkV4aXN0cyhzeW0pKSB7DQotCQl0diA9IGNvbmZpZ3VyZV9zdWJzdC5JdGVtKHN5 bSk7DQotCX0gZWxzZSB7DQotCQl0diA9ICIiOw0KLQl9DQotDQotCWZpbGVfbGlzdCA9IGZpbGVf bGlzdC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIikpOw0KLQlmaWxlX2xpc3Quc29ydCgpOw0KLQ0K LQl2YXIgcmUgPSBuZXcgUmVnRXhwKCJcLlthLXowLTlBLVpdKyQiKTsNCi0NCi0JZGlyID0gZGly LnJlcGxhY2UobmV3IFJlZ0V4cCgiLyIsICJnIiksICJcXCIpOw0KLQl2YXIgb2Jqc19saW5lID0g IiI7DQotCXZhciBzcmNzX2xpbmUgPSAiIjsNCi0NCi0JdmFyIHN1Yl9idWlsZCA9ICIkKEJVSUxE X0RJUilcXCI7DQotDQotCS8qIGlmIG1vZHVsZSBkaXIgaXMgbm90IGEgY2hpbGQgb2YgdGhlIG1h aW4gc291cmNlIGRpciwNCi0JICogd2UgbmVlZCB0byB0d2VhayBpdDsgd2Ugc2hvdWxkIGhhdmUg ZGV0ZWN0ZWQgc3VjaCBhDQotCSAqIGNhc2UgaW4gY29uZGVuc2VfcGF0aCBhbmQgcmV3cml0dGVu IHRoZSBwYXRoIHRvDQotCSAqIGJlIHJlbGF0aXZlLg0KLQkgKiBUaGlzIHByb2JhYmx5IGJyZWFr cyBmb3Igbm9uLXNpYmxpbmcgZGlycyAqLw0KLQlpZiAob2JqX2RpciA9PSBudWxsKSB7DQotCQl2 YXIgYnVpbGRfZGlyID0gZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXi4uXFxcXCIpLCAiIik7DQot CQl2YXIgbWFuZ2xlX2RpciA9IGJ1aWxkX2Rpci5yZXBsYWNlKG5ldyBSZWdFeHAoIltcXFxcLy4r LV0iLCAiZyIpLCAiXyIpOw0KLQkJdmFyIGJkX2ZsYWdzX25hbWUgPSAiQ0ZMQUdTX0JEXyIgKyBt YW5nbGVfZGlyLnRvVXBwZXJDYXNlKCk7DQotCX0NCi0JZWxzZSB7DQotCQl2YXIgYnVpbGRfZGly ID0gb2JqX2Rpci5yZXBsYWNlKG5ldyBSZWdFeHAoIl4uLlxcXFwiKSwgIiIpOw0KLQkJdmFyIG1h bmdsZV9kaXIgPSBidWlsZF9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC8uKy1dIiwgImci KSwgIl8iKTsNCi0JCXZhciBiZF9mbGFnc19uYW1lID0gIkNGTEFHU19CRF8iICsgbWFuZ2xlX2Rp ci50b1VwcGVyQ2FzZSgpOw0KLQl9DQotCQ0KLQl2YXIgZGlycyA9IGJ1aWxkX2Rpci5zcGxpdCgi XFwiKTsNCi0JdmFyIGksIGQgPSAiIjsNCi0JZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBp KyspIHsNCi0JCWQgKz0gZGlyc1tpXTsNCi0JCWJ1aWxkX2RpcnNbYnVpbGRfZGlycy5sZW5ndGhd ID0gZDsNCi0JCWQgKz0gIlxcIjsNCi0JfQ0KLQlzdWJfYnVpbGQgKz0gZDsNCi0NCi0NCi0JREVG SU5FKGJkX2ZsYWdzX25hbWUsICIgL0ZkIiArIHN1Yl9idWlsZCArICIgL0ZwIiArIHN1Yl9idWls ZCArICIgL0ZSIiArIHN1Yl9idWlsZCk7DQotDQotCWZvciAoaSBpbiBmaWxlX2xpc3QpIHsNCi0J CXNyYyA9IGZpbGVfbGlzdFtpXTsNCi0JCW9iaiA9IHNyYy5yZXBsYWNlKHJlLCAiLm9iaiIpOw0K LQkJdHYgKz0gIiAiICsgc3ViX2J1aWxkICsgb2JqOw0KLQ0KLQkJTUZPLldyaXRlTGluZShzdWJf YnVpbGQgKyBvYmogKyAiOiAiICsgZGlyICsgIlxcIiArIHNyYyk7DQotCQlNRk8uV3JpdGVMaW5l KCJcdEAkKENDKSAkKCIgKyBmbGFncyArICIpICQoQ0ZMQUdTKSAkKCIgKyBiZF9mbGFnc19uYW1l ICsgIikgL2MgIiArIGRpciArICJcXCIgKyBzcmMgKyAiIC9GbyIgKyBzdWJfYnVpbGQgKyBvYmop Ow0KLQl9DQotDQotCURFRklORShzeW0sIHR2KTsNCi19DQotDQotZnVuY3Rpb24gQUREX0ZMQUco bmFtZSwgZmxhZ3MsIHRhcmdldCkgew0KLQ0KLQlpZiAodGFyZ2V0ICE9IG51bGwpIHsNCi0JCW5h bWUgPSB0YXJnZXQudG9VcHBlckNhc2UoKSArICJfIiArIG5hbWU7DQotCX0NCi0JaWYgKGNvbmZp Z3VyZV9zdWJzdC5FeGlzdHMobmFtZSkpIHsNCi0JCXZhciBjdXJyX2ZsYWdzID0gY29uZmlndXJl X3N1YnN0Lkl0ZW0obmFtZSk7DQotDQotCQlpZiAoY3Vycl9mbGFncy5pbmRleE9mKGZsYWdzKSA+ PSAwKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlmbGFncyA9IGN1cnJfZmxhZ3MgKyAi ICIgKyBmbGFnczsNCi0JCWNvbmZpZ3VyZV9zdWJzdC5SZW1vdmUobmFtZSk7DQotCX0NCi0JY29u ZmlndXJlX3N1YnN0LkFkZChuYW1lLCBmbGFncyk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldF9kZWZp bmUobmFtZSkgew0KLQ0KLQlyZXR1cm4gY29uZmlndXJlX3N1YnN0Lkl0ZW0obmFtZSk7DQotfQ0K LQ0KLWZ1bmN0aW9uIEVSUk9SKG1zZykgew0KLQ0KLQlTVERFUlIuV3JpdGVMaW5lKCJFUlJPUjog IiArIG1zZyk7DQotCVdTY3JpcHQuUXVpdCgzKTsNCi19DQotDQotZnVuY3Rpb24gV0FSTklORyht c2cpIHsNCi0NCi0JU1RERVJSLldyaXRlTGluZSgiV0FSTklORzogIiArIG1zZyk7DQotCVNUREVS Ui5Xcml0ZUJsYW5rTGluZXMoMSk7DQotfQ0KLQ0KLS8qIFNlYXJjaGVzIGEgc2V0IG9mIHBhdGhz IGZvciBhIGZpbGU7IHJldHVybnMgdGhlIGRpciBpbiB3aGljaCB0aGUgZmlsZSB3YXMgZm91bmQs IHRydWUgaWYgaXQNCi13YXMgZm91bmQgaW4gdGhlIGRlZmF1bHQgZW52IHBhdGgsIG9yIGZhbHNl IGlmIGl0IHdhcyBub3QgZm91bmQgYXQgYWxsLiBlbnZfbmFtZSBpcyB0aGUgb3B0aW9uYWwNCi1u YW1lIG9mIGFuIGVudiB2YXIgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBwYXRoIHRvIHNlYXJjaCAq Lw0KLWZ1bmN0aW9uIHNlYXJjaF9wYXRocyh0aGluZ190b19maW5kLCBleHBsaWNpdF9wYXRoLCBl bnZfbmFtZSkgew0KLQ0KLQl2YXIgaSwgZm91bmQgPSBmYWxzZSwgcGxhY2UgPSBmYWxzZSwgZmls ZSwgZW52Ow0KLQ0KLQlTVERPVVQuV3JpdGUoIkNoZWNraW5nIGZvciAiICsgdGhpbmdfdG9fZmlu ZCArICIgLi4uICIpOw0KLQ0KLQlpZiAodGhpbmdfdG9fZmluZC5sZW5ndGggPCA2KSB7DQotCQlT VERPVVQuV3JpdGUoIgkiKTsNCi0JfQ0KLQ0KLQl0aGluZ190b19maW5kID0gdGhpbmdfdG9fZmlu ZC5yZXBsYWNlKG5ldyBSZWdFeHAoIi8iLCAiZyIpLCAiXFwiKTsNCi0NCi0JaWYgKGV4cGxpY2l0 X3BhdGggIT0gbnVsbCkgew0KLQkJaWYgKHR5cGVvZihleHBsaWNpdF9wYXRoKSA9PSAic3RyaW5n Iikgew0KLQkJCWV4cGxpY2l0X3BhdGggPSBleHBsaWNpdF9wYXRoLnNwbGl0KCI7Iik7DQotCQl9 DQotDQotCQlmb3IgKGkgPSAwOyBpIDwgZXhwbGljaXRfcGF0aC5sZW5ndGg7IGkrKykgew0KLQkJ CWZpbGUgPSBnbG9iKGV4cGxpY2l0X3BhdGhbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7DQot CQkJaWYgKGZpbGUpIHsNCi0JCQkJZm91bmQgPSB0cnVlOw0KLQkJCQlwbGFjZSA9IGZpbGVbMF07 DQotCQkJCXBsYWNlID0gcGxhY2Uuc3Vic3RyKDAsIHBsYWNlLmxlbmd0aCAtIHRoaW5nX3RvX2Zp bmQubGVuZ3RoIC0gMSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlpZiAo IWZvdW5kICYmIGVudl9uYW1lICE9IG51bGwpIHsNCi0JCWVudiA9IFdzaFNoZWxsLkVudmlyb25t ZW50KCJQcm9jZXNzIikuSXRlbShlbnZfbmFtZSk7DQotCQllbnYgPSBlbnYuc3BsaXQoIjsiKTsN Ci0JCWZvciAoaSA9IDA7IGkgPCBlbnYubGVuZ3RoOyBpKyspIHsNCi0JCQlmaWxlID0gZ2xvYihl bnZbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7DQotCQkJaWYgKGZpbGUpIHsNCi0JCQkJZm91 bmQgPSB0cnVlOw0KLQkJCQlwbGFjZSA9IHRydWU7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0N Ci0JfQ0KLQ0KLQlpZiAoZm91bmQgJiYgcGxhY2UgPT0gdHJ1ZSkgew0KLQkJU1RET1VULldyaXRl TGluZSgiCTxpbiBkZWZhdWx0IHBhdGg+Iik7DQotCX0gZWxzZSBpZiAoZm91bmQpIHsNCi0JCVNU RE9VVC5Xcml0ZUxpbmUoIgkiICsgcGxhY2UpOw0KLQl9IGVsc2Ugew0KLQkJU1RET1VULldyaXRl TGluZSgiCTxub3QgZm91bmQ+Iik7DQotCX0NCi0JcmV0dXJuIHBsYWNlOw0KLX0NCi0NCi1mdW5j dGlvbiB3b3JkX3dyYXBfYW5kX2luZGVudChpbmRlbnQsIHRleHQsIGxpbmVfc3VmZml4LCBpbmRl bnRfY2hhcikgew0KLQ0KLQlpZiAodGV4dCA9PSBudWxsKSB7DQotCQlyZXR1cm4gIiI7DQotCX0N Ci0NCi0JdmFyIHdvcmRzID0gdGV4dC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIiwgImciKSk7DQot CXZhciBpID0gMDsNCi0JdmFyIHJldF90ZXh0ID0gIiI7DQotCXZhciB0aGlzX2xpbmUgPSAiIjsN Ci0JdmFyIHQ7DQotCXZhciBzcGFjZSA9ICIiOw0KLQl2YXIgbGluZXMgPSAwOw0KLQ0KLQlpZiAo bGluZV9zdWZmaXggPT0gbnVsbCkgew0KLQkJbGluZV9zdWZmaXggPSAiIjsNCi0JfQ0KLQ0KLQlp ZiAoaW5kZW50X2NoYXIgPT0gbnVsbCkgew0KLQkJaW5kZW50X2NoYXIgPSAiICI7DQotCX0NCi0N Ci0JZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7DQotCQlzcGFjZSArPSBpbmRlbnRfY2hh cjsNCi0JfQ0KLQkNCi0JZm9yIChpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7DQotCQlp ZiAodGhpc19saW5lLmxlbmd0aCkgew0KLQkJCXQgPSB0aGlzX2xpbmUgKyAiICIgKyB3b3Jkc1tp XTsNCi0JCX0gZWxzZSB7DQotCQkJdCA9IHdvcmRzW2ldOw0KLQkJfQ0KLQ0KLQkJaWYgKHQubGVu Z3RoICsgaW5kZW50ID4gNzgpIHsNCi0JCQlpZiAobGluZXMrKykgew0KLQkJCQlyZXRfdGV4dCAr PSBzcGFjZTsNCi0JCQl9DQotCQkJcmV0X3RleHQgKz0gdGhpc19saW5lICsgbGluZV9zdWZmaXgg KyAiXHJcbiI7DQotCQkJdGhpc19saW5lID0gIiI7DQotCQl9DQotDQotCQlpZiAodGhpc19saW5l Lmxlbmd0aCkgew0KLQkJCXRoaXNfbGluZSArPSAiICIgKyB3b3Jkc1tpXTsNCi0JCX0gZWxzZSB7 DQotCQkJdGhpc19saW5lID0gd29yZHNbaV07DQotCQl9DQotCX0NCi0NCi0JaWYgKHRoaXNfbGlu ZS5sZW5ndGgpIHsNCi0JCWlmIChsaW5lcykNCi0JCQlyZXRfdGV4dCArPSBzcGFjZTsNCi0JCXJl dF90ZXh0ICs9IHRoaXNfbGluZTsNCi0JfQ0KLQ0KLQlyZXR1cm4gcmV0X3RleHQ7DQotfQ0KLQ0K LWZ1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzKGZpbGVuYW1lKSB7DQotDQotCXZhciBmLCBjOw0K LQ0KLQl0cnkgew0KLQkJZiA9IEZTTy5PcGVuVGV4dEZpbGUoZmlsZW5hbWUsIDEpOw0KLQkJYyA9 IGYuUmVhZEFsbCgpOw0KLQkJZi5DbG9zZSgpOw0KLQkJcmV0dXJuIGM7DQotCX0gY2F0Y2ggKGUp IHsNCi0JCVNURE9VVC5Xcml0ZUxpbmUoIlByb2JsZW0gcmVhZGluZyAiICsgZmlsZW5hbWUpOw0K LQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdlbmVyYXRlX2ZpbGVzKCkg ew0KLQ0KLQl2YXIgaSwgZGlyLCBiZCwgbGFzdDsNCi0NCi0JU1RET1VULldyaXRlQmxhbmtMaW5l cygxKTsNCi0JU1RET1VULldyaXRlTGluZSgiQ3JlYXRpbmcgYnVpbGQgZGlycy4uLiIpOw0KLQlk aXIgPSBnZXRfZGVmaW5lKCJCVUlMRF9ESVIiKTsNCi0JYnVpbGRfZGlycy5zb3J0KCk7DQotCWxh c3QgPSBudWxsOw0KLQ0KLQlpZiAoIUZTTy5Gb2xkZXJFeGlzdHMoZGlyKSkgew0KLQkJRlNPLkNy ZWF0ZUZvbGRlcihkaXIpOw0KLQl9DQotCQ0KLQlmb3IgKGkgPSAwOyBpIDwgYnVpbGRfZGlycy5s ZW5ndGg7IGkrKykgew0KLQkJYmQgPSBGU08uQnVpbGRQYXRoKGRpciwgYnVpbGRfZGlyc1tpXSk7 DQotCQlpZiAoYmQgPT0gbGFzdCkgew0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJbGFzdCA9IGJk Ow0KLQkJQUREX0ZMQUcoIkJVSUxEX0RJUlNfU1VCIiwgYmQpOw0KLQkJaWYgKCFGU08uRm9sZGVy RXhpc3RzKGJkKSkgew0KLQkJCUZTTy5DcmVhdGVGb2xkZXIoYmQpOw0KLQkJfQ0KLQl9DQotDQot CVNURE9VVC5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgc291cmNlIGZpbGVzIC0gdGhpcyBtYXkgdGFr ZSBhIGZldyBzZWNvbmRzIik7DQotCVdTY3JpcHQuU2xlZXAoMzUwMCk7DQotCWNoZWNrX2dlbmVy YXRpb24oKTsNCi0JZ2VuZXJhdGVfbWFrZWZpbGUoKTsNCi0NCi0JU1RET1VULldyaXRlTGluZSgi RG9uZS4iKTsNCi0JU1RET1VULldyaXRlQmxhbmtMaW5lcygxKTsNCi0JU1RET1VULldyaXRlTGlu ZSgiVHlwZSAnbm1ha2UnIHRvIGJ1aWxkIFBIUC1HVEsiKTsNCi19DQotDQotZnVuY3Rpb24gZ2Vu ZXJhdGVfbWFrZWZpbGUoKSB7DQotDQotCU1GTy5DbG9zZSgpOyAvLyBNYWtlZmlsZS5vYmplY3Rz IGlzIG5vdyBjb21wbGV0ZQ0KLQl2YXIgTUYgPSBGU08uQ3JlYXRlVGV4dEZpbGUoIk1ha2VmaWxl IiwgdHJ1ZSk7DQotCVNURE9VVC5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgTWFrZWZpbGUiKTsNCi0N Ci0JTUYuV3JpdGVMaW5lKCIjIEdlbmVyYXRlZCBieSBjb25maWd1cmUuanMiKTsNCi0JTUYuV3Jp dGVCbGFua0xpbmVzKDEpOw0KLQ0KLQkvKiBzcGl0IG91dCB2YXJpYWJsZSBkZWZpbml0aW9ucyAq Lw0KLQl2YXIga2V5cyA9IChuZXcgVkJBcnJheShjb25maWd1cmVfc3Vic3QuS2V5cygpKSkudG9B cnJheSgpOw0KLQl2YXIgaTsNCi0NCi0JZm9yIChpIGluIGtleXMpIHsNCi0JCS8qIFRoZSB0cmFp bGluZyBzcGFjZSBpcyBuZWVkZWQgdG8gcHJldmVudCB0aGUgdHJhaWxpbmcgYmFja3NsYXNoIHRo YXQgaXMgcGFydCBvZg0KLQkJdGhlIGJ1aWxkIGRpciBmbGFncyAoQ0ZMQUdTX0JEX1hYWCkgZnJv bSBiZWluZyBzZWVuIGFzIGEgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyICovDQotCQlNRi5X cml0ZUxpbmUoa2V5c1tpXSArICI9IiArIGNvbmZpZ3VyZV9zdWJzdC5JdGVtKGtleXNbaV0pICsg IiAiKTsNCi0JfQ0KLQ0KLQlNRi5Xcml0ZUJsYW5rTGluZXMoMSk7DQotCU1GLldyaXRlTGluZSgi YWxsOiAkKEJVSUxEX0RJUilcXCQoUEhQR1RLRExMKSIpOw0KLQlNRi5Xcml0ZUxpbmUoImJ1aWxk X2RpcnM6ICQoQlVJTERfRElSKSAkKEJVSUxEX0RJUlNfU1VCKSIpOw0KLQlNRi5Xcml0ZUJsYW5r TGluZXMoMSk7DQotDQotCVRGID0gRlNPLk9wZW5UZXh0RmlsZSgiTWFrZWZpbGUub2JqZWN0cyIs IDEpOw0KLQlNRi5Xcml0ZShURi5SZWFkQWxsKCkpOw0KLQlURi5DbG9zZSgpOw0KLQ0KLQlNRi5D bG9zZSgpOw0KLQ0KLQlGU08uRGVsZXRlRmlsZSgiTWFrZWZpbGUub2JqZWN0cyIpOw0KLQkvL0ZT Ty5EZWxldGVGaWxlKCJ3aW4zMlxcdGVtcC5iYXQiKTsNCi19DQotDQotZnVuY3Rpb24gY29weV9h bmRfc3Vic3Qoc3JjbmFtZSwgZGVzdG5hbWUsIHN1YnN0X2FycmF5KSB7DQotDQotCWlmICghRlNP LkZpbGVFeGlzdHMoc3JjbmFtZSkpIHsNCi0JCXNyY25hbWUgPSBjb25maWd1cmVfbW9kdWxlX2Rp cm5hbWUgKyAiXFwiICsgc3JjbmFtZTsNCi0JCWRlc3RuYW1lID0gY29uZmlndXJlX21vZHVsZV9k aXJuYW1lICsgIlxcIiArIGRlc3RuYW1lOw0KLQl9DQotDQotCXZhciBjb250ZW50ID0gZmlsZV9n ZXRfY29udGVudHMoc3JjbmFtZSk7DQotCXZhciBpOw0KLQ0KLQlmb3IgKGkgPSAwOyBpIDwgc3Vi c3RfYXJyYXkubGVuZ3RoOyBpKz0yKSB7DQotCQl2YXIgcmUgPSBzdWJzdF9hcnJheVtpXTsNCi0J CXZhciByZXAgPSBzdWJzdF9hcnJheVtpKzFdOw0KLQ0KLQkJY29udGVudCA9IGNvbnRlbnQucmVw bGFjZShyZSwgcmVwKTsNCi0JfQ0KLQ0KLQl2YXIgZiA9IEZTTy5DcmVhdGVUZXh0RmlsZShkZXN0 bmFtZSwgdHJ1ZSk7DQotCWYuV3JpdGUoY29udGVudCk7DQotCWYuQ2xvc2UoKTsNCi19DQotDQot Ly8gZ2xvYiB1c2luZyBzaW1wbGUgZmlsZW5hbWUgd2lsZGNhcmRzOyByZXR1cm5zIGFuIGFycmF5 IG9mIG1hdGNoZXMgZm91bmQgaW4gdGhlIGZpbGVzeXN0ZW0NCi1mdW5jdGlvbiBnbG9iKHBhdGhf cGF0dGVybikgew0KLQ0KLQl2YXIgcGF0aF9wYXJ0cyA9IHBhdGhfcGF0dGVybi5yZXBsYWNlKG5l dyBSZWdFeHAoIi8iLCAiZyIpLCAiXFwiKS5zcGxpdCgiXFwiKTsNCi0JdmFyIHA7DQotCXZhciBi YXNlID0gIiI7DQotCXZhciBpc19wYXRfcmUgPSAvXCovOw0KLQ0KLQlpZiAoRlNPLkZpbGVFeGlz dHMocGF0aF9wYXR0ZXJuKSkgew0KLQkJcmV0dXJuIG5ldyBBcnJheShwYXRoX3BhdHRlcm4pOw0K LQl9DQotCQ0KLQkvLyBmaXJzdCwgYnVpbGQgYXMgbXVjaCBhcyBwb3NzaWJsZSB0aGF0IGRvZXNu J3QgaGF2ZSBhIHBhdHRlcm4NCi0JZm9yIChwID0gMDsgcCA8IHBhdGhfcGFydHMubGVuZ3RoOyBw KyspIHsNCi0JCWlmIChwYXRoX3BhcnRzW3BdLm1hdGNoKGlzX3BhdF9yZSkpDQotCQkJYnJlYWs7 DQotCQlpZiAocCkNCi0JCQliYXNlICs9ICJcXCI7DQotCQliYXNlICs9IHBhdGhfcGFydHNbcF07 CQ0KLQl9DQotDQotCXJldHVybiBfaW5uZXJfZ2xvYihiYXNlLCBwLCBwYXRoX3BhcnRzKTsNCi19 DQotDQotZnVuY3Rpb24gX2lubmVyX2dsb2IoYmFzZSwgcCwgcGFydHMpIHsNCi0NCi0JdmFyIHBh dCA9IHBhcnRzW3BdOw0KLQl2YXIgZnVsbF9uYW1lID0gYmFzZSArICJcXCIgKyBwYXQ7DQotCXZh ciByZSA9IG51bGw7DQotCXZhciBpdGVtcyA9IG51bGw7DQotDQotCWlmIChwID09IHBhcnRzLmxl bmd0aCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCWlmIChGU08uRmlsZUV4aXN0cyhm dWxsX25hbWUpKSB7DQotCQlpZiAocCA8IHBhcnRzLmxlbmd0aCAtIDEpIHsNCi0JCQkvLyB3ZSBk aWRuJ3QgcmVhY2ggdGhlIGZ1bGwgZXh0ZW50IG9mIHRoZSBwYXR0ZXJuDQotCQkJcmV0dXJuIGZh bHNlOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBBcnJheShmdWxsX25hbWUpOw0KLQl9DQotDQotCWlm IChGU08uRm9sZGVyRXhpc3RzKGZ1bGxfbmFtZSkgJiYgcCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7 DQotCQkvLyB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybjsgbm8gbmVlZCB0 byByZWN1cnNlDQotCQlyZXR1cm4gbmV3IEFycmF5KGZ1bGxfbmFtZSk7DQotCX0NCi0NCi0JLy8g Q29udmVydCB0aGUgcGF0dGVybiBpbnRvIGEgcmVnZXhwDQotCXJlID0gbmV3IFJlZ0V4cCgiXiIg KyBwYXQucmVwbGFjZSgvXC4vZywgJ1xcLicpLnJlcGxhY2UoL1wqL2csICcuKicpLnJlcGxhY2Uo L1w/L2csICcuJykgKyAiJCIsICJpIik7DQotDQotCWl0ZW1zID0gbmV3IEFycmF5KCk7DQotDQot CWlmICghRlNPLkZvbGRlckV4aXN0cyhiYXNlKSkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQot DQotCXZhciBmb2xkZXIgPSBGU08uR2V0Rm9sZGVyKGJhc2UpOw0KLQl2YXIgZmMgPSBudWxsOw0K LQl2YXIgc3ViaXRlbXMgPSBudWxsOw0KLQl2YXIgaXRlbV9uYW1lID0gbnVsbDsNCi0JdmFyIGo7 DQotDQotCWZjID0gbmV3IEVudW1lcmF0b3IoZm9sZGVyLlN1YkZvbGRlcnMpOw0KLQlmb3IgKDsg IWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsNCi0JCWl0ZW1fbmFtZSA9IEZTTy5HZXRGaWxl TmFtZShmYy5pdGVtKCkpOw0KLQ0KLQkJaWYgKGl0ZW1fbmFtZS5tYXRjaChyZSkpIHsNCi0JCQkv LyBnb3QgYSBtYXRjaDsgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIGp1c3Qg YWRkIHRoZXNlDQotCQkJLy8gdGhpbmdzIHRvIHRoZSBpdGVtcyBhcnJheQ0KLQkJCWlmIChwID09 IHBhcnRzLmxlbmd0aCAtIDEpIHsNCi0JCQkJaXRlbXNbaXRlbXMubGVuZ3RoXSA9IGZjLml0ZW0o KTsNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyB3ZSBzaG91bGQgcmVjdXJzZSBhbmQgZG8gbW9yZSBt YXRjaGVzDQotCQkJCXN1Yml0ZW1zID0gX2lubmVyX2dsb2IoYmFzZSArICJcXCIgKyBpdGVtX25h bWUsIHAgKyAxLCBwYXJ0cyk7DQotCQkJCWlmIChzdWJpdGVtcykgew0KLQkJCQkJZm9yIChqID0g MDsgaiA8IHN1Yml0ZW1zLmxlbmd0aDsgaisrKSB7DQotCQkJCQkJaXRlbXNbaXRlbXMubGVuZ3Ro XSA9IHN1Yml0ZW1zW2pdOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQot CS8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCB3ZSBzaG91bGQgbWF0Y2gg ZmlsZXMgdG9vDQotCWlmIChwID09IHBhcnRzLmxlbmd0aCAtIDEpIHsNCi0JCWZjID0gbmV3IEVu dW1lcmF0b3IoZm9sZGVyLkZpbGVzKTsNCi0JCWZvciAoOyAhZmMuYXRFbmQoKTsgZmMubW92ZU5l eHQoKSkgew0KLQkJCWl0ZW1fbmFtZSA9IEZTTy5HZXRGaWxlTmFtZShmYy5pdGVtKCkpOw0KLQkJ CWlmIChpdGVtX25hbWUubWF0Y2gocmUpKSB7DQotCQkJCWl0ZW1zW2l0ZW1zLmxlbmd0aF0gPSBm Yy5pdGVtKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCWlmIChpdGVtcy5sZW5ndGggPT0gMCkN Ci0JCXJldHVybiBmYWxzZTsNCi0NCi0JcmV0dXJuIGl0ZW1zOw0KLX0NCi0NCi0vKiBFbWl0cyBy dWxlIHRvIGdlbmVyYXRlIHZlcnNpb24gaW5mbyBmb3IgYW4gZXh0ZW5zaW9uLg0KLVJldHVybnMg dGhlIG5hbWUgb2YgdGhlIC5yZXMgZmlsZSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkICovDQotZnVu Y3Rpb24gZ2VuZXJhdGVfdmVyc2lvbl9pbmZvX3Jlc291cmNlKG1ha2VmaWxldGFyZ2V0LCBjcmVk aXRzcGF0aCkgew0KLQ0KLQkvLyBtYWtlZmlsZXRhcmdldCBpcyBwaHAtZ3RrLmRsbA0KLQkvLyBj cmVkaXRzcGF0aCBpcyBleHRcZ3RrKw0KLQ0KLQl2YXIgcmVzbmFtZSA9IG1ha2VmaWxldGFyZ2V0 ICsgIi5yZXMiOw0KLQl2YXIgcmVzX2Rlc2MgPSAiUEhQLUdUSyBTY3JpcHQgSW50ZXJwcmV0ZXIi Ow0KLQl2YXIgcmVzX3Byb2RfbmFtZSA9ICJQSFAtR1RLIjsNCi0JdmFyIGNyZWRpdHM7DQotCXZh ciB0aGFua3MgPSAiVGhhbmtzIHRvIEFuZHJlaSBabWlldnNraSI7DQotCXZhciBsb2dvID0gIiI7 DQotDQotCWlmIChGU08uRmlsZUV4aXN0cyhjcmVkaXRzcGF0aCArICcvQ1JFRElUUycpKSB7DQot CQljcmVkaXRzID0gRlNPLk9wZW5UZXh0RmlsZShjcmVkaXRzcGF0aCArICcvQ1JFRElUUycsIDEp Ow0KLQkJcmVzX2Rlc2MgPSBjcmVkaXRzLlJlYWRMaW5lKCk7DQotCQl0cnkgew0KLQkJCXRoYW5r cyA9IGNyZWRpdHMuUmVhZExpbmUoKTsNCi0JCX0gY2F0Y2ggKGUpIHsNCi0JCQl0aGFua3MgPSBu dWxsOw0KLQkJfQ0KLQkJaWYgKHRoYW5rcyA9PSBudWxsKSB7DQotCQkJdGhhbmtzID0gIiI7DQot CQl9IGVsc2Ugew0KLQkJCXRoYW5rcyA9ICJUaGFua3MgdG8gIiArIHRoYW5rczsNCi0JCX0NCi0J CWNyZWRpdHMuQ2xvc2UoKTsNCi0JfQ0KLQ0KLQlNRk8uV3JpdGVMaW5lKCJQSFBHVEtETExfUkVT PSQoQlVJTERfRElSKVxcJChQSFBHVEtETEwpLnJlcyIpOw0KLQlNRk8uV3JpdGVCbGFua0xpbmVz KDEpOw0KLQ0KLQlpZiAobWFrZWZpbGV0YXJnZXQubWF0Y2gobmV3IFJlZ0V4cCgiXFwuZXhlJCIp KSkgew0KLQkJbG9nbyA9ICIgL0QgV0FOVF9MT0dPIjsNCi0JfQ0KLQkNCi0JTUZPLldyaXRlTGlu ZSgiJChQSFBHVEtETExfUkVTKTogd2luMzJcXHRlbXBsYXRlLnJjIik7DQotCU1GTy5Xcml0ZUxp bmUoIlx0JChSQykgL2ZvICQoUEhQR1RLRExMX1JFUykiICsgbG9nbyArICcgL0QgRklMRV9ERVND UklQVElPTj0iXFwiJyArIHJlc19kZXNjICsgJ1xcIiIgL0QgRklMRV9OQU1FPSJcXCIkKFBIUEdU S0RMTClcXCIiIC9EIFBST0RVQ1RfTkFNRT0iXFwiJyArIHJlc19wcm9kX25hbWUgKyAnXFwiIiAv RCBUSEFOS1NfR1VZUz0iXFwiJyArIHRoYW5rcyArICdcXCIiIHdpbjMyXFx0ZW1wbGF0ZS5yYycp Ow0KLQlNRk8uV3JpdGVCbGFua0xpbmVzKDEpOw0KLQkNCi0JcmV0dXJuIHJlc25hbWU7DQotfQ0K LQ0KLS8qIGV4ZWN1dGUgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmlu ZyAqLw0KLWZ1bmN0aW9uIGV4ZWN1dGUoY29tbWFuZF9saW5lKSB7DQotCXZhciBlID0gV3NoU2hl bGwuRXhlYyhjb21tYW5kX2xpbmUpOw0KLQl2YXIgcmV0ID0gIiI7DQotDQotCXJldCA9IGUuU3Rk T3V0LlJlYWRBbGwoKTsNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotLy8gV2hpY2ggdmVyc2lv biBvZiB0aGUgY29tcGlsZXIgZG8gd2UgaGF2ZT8NCi1mdW5jdGlvbiBwcm9iZV9tc3ZjX2NvbXBp bGVyX3ZlcnNpb24oQ0wpIHsNCi0NCi0JLy8gdHJpY2t5IGVzY2FwZXMgdG8gZ2V0IHN0ZGVyciBy ZWRpcmVjdGlvbiB0byB3b3JrDQotCXZhciBiYW5uZXIgPSBleGVjdXRlKCdjbWQgL2MgIiInICsg Q0wgKyAnIiAyPiYxIicpOw0KLQ0KLQlpZiAoYmFubmVyLm1hdGNoKC8oXGQrKVwuKFxkKylcLihc ZCspKFwuKFxkKykpPy8pKSB7DQotCQlyZXR1cm4gUmVnRXhwLiQxOw0KLQl9DQotCXJldHVybiAw Ow0KLX0NCi0NCi0vLyBQb2tlIGFyb3VuZCBmb3Igc29tZSBoZWFkZXJzDQotZnVuY3Rpb24gcHJv YmVfYmFzaWNfaGVhZGVycygpDQotew0KLQl2YXIgcDsNCi0NCi0JaWYgKFBIUF9HVEtfUEhQX0JV SUxEICE9ICJubyIpIHsNCi0JCXBocF91c3VhbF9pbmNsdWRlX3N1c3BlY3RzICs9ICI7IiArIFBI UF9HVEtfUEhQX0JVSUxEICsgIlxcaW5jbHVkZSI7DQotCQlwaHBfdXN1YWxfbGliX3N1c3BlY3Rz ICs9ICI7IiArIFBIUF9HVEtfUEhQX0JVSUxEICsgIlxcbGliIjsNCi0JfQ0KLQ0KLQkvLyBoYWNr IHRvIGNhdGNoIGNvbW1vbiBsb2NhdGlvbiBvZiBsaWJzDQotCWlmICh0eXBlb2YocCkgPT0gInN0 cmluZyIpIHsNCi0JCXAgPSBwLnJlcGxhY2UobmV3IFJlZ0V4cCgiaW5jbHVkZSQiKSwgImxpYiIp Ow0KLQkJQUREX0ZMQUcoIkxERkxBR1MiLCAnL2xpYnBhdGg6IicgKyBwICsgJyIgJyk7DQotCQlw aHBfdXN1YWxfbGliX3N1c3BlY3RzICs9ICI7IiArIHA7DQotCX0NCi19DQotDQotLyogbm9uLWZ1 bmN0aW9ucyAqLw0KLQ0KLWlmICghRlNPLkZpbGVFeGlzdHMoImJ1aWxkY29uZi5iYXQiKSkgew0K LQlTVERFUlIuV3JpdGVMaW5lKCJNdXN0IGJlIHJ1biBmcm9tIHRoZSByb290IG9mIHRoZSBQSFAt R1RLIHNvdXJjZSIpOw0KLQlXU2NyaXB0LlF1aXQoMTApOw0KLX0NCisvLyBVdGlscyBmb3IgY29u ZmlndXJlIHNjcmlwdAorLyoKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgUEhQLUdUSyBWZXJzaW9u IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAor ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBUaGUgUEhQIEdy b3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICstLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwor ICB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQ IGxpY2Vuc2UsICAgICAgIHwKKyAgfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2Ug aW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8CisgIHwgYXZhaWxhYmxlIHRocm91 Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAgICAgICAgfAor ICB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwKKyAgfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0 aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8CisgIHwgb2J0YWluIGl0IHRocm91 Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAor ICB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5 LiAgICAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgQXV0aG9yOiBXZXogRnVy bG9uZyA8d2V6QHRoZWJyYWlucm9vbS5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAor ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSsKKyovCisKKy8vICRJZDogY29uZnV0aWxzLmpzLHYgMS44IDIwMDUt MDktMjAgMDI6MTc6NTMgc2ZveCBFeHAgJAorCisvKiBzZXQgdmFycyAqLwordmFyIFNURE9VVCA9 IFdTY3JpcHQuU3RkT3V0OwordmFyIFNUREVSUiA9IFdTY3JpcHQuU3RkRXJyOwordmFyIFdzaFNo ZWxsID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKTsKK3ZhciBGU08gPSBX U2NyaXB0LkNyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QiKTsKK3ZhciBN Rk8gPSBudWxsOwordmFyIFNZU1RFTV9EUklWRSA9IFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9j ZXNzIikuSXRlbSgiU3lzdGVtRHJpdmUiKTsKK3ZhciBQUk9HUkFNX0ZJTEVTID0gV3NoU2hlbGwu RW52aXJvbm1lbnQoIlByb2Nlc3MiKS5JdGVtKCJQcm9ncmFtRmlsZXMiKTsKKworaWYgKFBST0dS QU1fRklMRVMgPT0gbnVsbCkgeworCVBST0dSQU1fRklMRVMgPSAiQzpcXFByb2dyYW0gRmlsZXMi OworfQorCit2YXIgQ1dEID0gV3NoU2hlbGwuQ3VycmVudERpcmVjdG9yeTsKKworaWYgKHR5cGVv ZihDV0QpID09ICJ1bmRlZmluZWQiKSB7CisJQ1dEID0gRlNPLkdldFBhcmVudEZvbGRlck5hbWUo RlNPLkdldEFic29sdXRlUGF0aE5hbWUoImJ1aWxkY29uZi5iYXQiKSk7Cit9CisKK2NvbmZpZ3Vy ZV9hcmdzID0gbmV3IEFycmF5KCk7Citjb25maWd1cmVfc3Vic3QgPSBXU2NyaXB0LkNyZWF0ZU9i amVjdCgiU2NyaXB0aW5nLkRpY3Rpb25hcnkiKTsKKworY29uZmlndXJlX2hkciA9IFdTY3JpcHQu Q3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRGljdGlvbmFyeSIpOworYnVpbGRfZGlycyA9IG5ldyBB cnJheSgpOworCitleHRlbnNpb25faW5jbHVkZV9jb2RlID0gIiI7CitleHRlbnNpb25fbW9kdWxl X3B0cnMgPSAiIjsKKworLyogZnVuY3Rpb25zICovCisKK2Z1bmN0aW9uIGNvdW50X2dlbmVyYXRl ZF9maWxlcygpIHsKKworCXZhciBkaXIgPSBGU08uR2V0Rm9sZGVyKCJleHQvZ3RrKyIpOworCXZh ciBjb3VudCA9IDA7CisKKwlpdGVyID0gbmV3IEVudW1lcmF0b3IoZGlyLkZpbGVzKTsKKwluYW1l ID0gIiI7CisKKwlmb3IgKDsgIWl0ZXIuYXRFbmQoKTsgaXRlci5tb3ZlTmV4dCgpKSB7CisJCW5h bWUgPSBGU08uR2V0RmlsZU5hbWUoaXRlci5pdGVtKCkpOworCQlpZiAobmFtZS5tYXRjaChuZXcg UmVnRXhwKCJnZW5fIikpKSB7CisJCQljb3VudCsrOworCQl9CisJfQorCXJldHVybiBjb3VudDsK K30KKworZnVuY3Rpb24gZ2VuZXJhdGVfc291cmNlKCkgeworCisJdmFyIGNvdW50ID0gY291bnRf Z2VuZXJhdGVkX2ZpbGVzKCk7CisKKwlpZiAoY291bnQgPCA4KSB7CisJCWlmICghRlNPLkZpbGVF eGlzdHMoIndpbjMyXFx0ZW1wLmJhdCIpKSB7CisJCQlTVERFUlIuV3JpdGVMaW5lKCJSdW4gYnVp bGRjb25mIGZpcnN0IC0gdGhlIHNvdXJjZSBmaWxlIGdlbmVyYXRvciBpcyBtaXNzaW5nIik7CisJ CQlXU2NyaXB0LlF1aXQoMTApOworCQl9IGVsc2UgeworCQkJV3NoU2hlbGwuUnVuKCJ3aW4zMlxc dGVtcCIsIDApOworCQl9CisJfQorCXJldHVybjsKK30KKworZnVuY3Rpb24gY2hlY2tfZ2VuZXJh dGlvbigpIHsKKworCXZhciBjb3VudCA9IGNvdW50X2dlbmVyYXRlZF9maWxlcygpOworCisJaWYg KGNvdW50IDwgOCkgeworCQlTVERPVVQuV3JpdGVMaW5lKCJXYWl0aW5nIGZvciBzb3VyY2UgZmls ZXMgdG8gZ2VuZXJhdGUuLi4iKTsKKwkJV1NjcmlwdC5TbGVlcCgzNTAwKTsKKwkJY2hlY2tfZ2Vu ZXJhdGlvbigpOworCX0KKwlyZXR1cm47Cit9CisKK2Z1bmN0aW9uIGdldF92ZXJzaW9uX251bWJl cnMoKSB7CisKKwkvKiBwaWNrIHVwIHRoZSB2ZXJzaW9uIGZyb20gbWFpbi9waHBfZ3RrLmggKi8K Kwl2YXIgdmluID0gZmlsZV9nZXRfY29udGVudHMoIm1haW5cXHBocF9ndGsuaCIpOworCXZhciB2 ZXJzaW9uLCB2ZXJzaW9uX3N0cmluZ3MsIG1ham9yLCBtaW5vciwgZGV0YWlscywgcmVsZWFzZSwg c3VidmVyc2lvbl9zdHJpbmdzLCBleHRyYSA9ICIiOworCisJaWYgKHZpbi5tYXRjaChuZXcgUmVn RXhwKCJQSFBfR1RLX1ZFUlNJT04gXCIoW15cIl0rKVwiIikpKSB7CisJCXZlcnNpb24gPSBSZWdF eHAuJDE7CisJCXZlcnNpb25fc3RyaW5ncyA9IHZlcnNpb24uc3BsaXQoIi4iKTsKKworCQltYWpv ciA9IHZlcnNpb25fc3RyaW5nc1swXTsKKwkJbWlub3IgPSB2ZXJzaW9uX3N0cmluZ3NbMV07CisJ CWRldGFpbHMgPSB2ZXJzaW9uX3N0cmluZ3NbMl07CisKKwkJaWYgKGRldGFpbHMuaW5kZXhPZigi LSIpID09IC0xKSB7CisJCQlyZWxlYXNlID0gZGV0YWlsczsKKwkJfSBlbHNlIHsKKwkJCXN1YnZl cnNpb25fc3RyaW5ncyA9IGRldGFpbHMuc3BsaXQoIi0iKTsKKwkJCXJlbGVhc2UgPSBzdWJ2ZXJz aW9uX3N0cmluZ3NbMF07CisJCQlleHRyYSA9ICItIiArIHN1YnZlcnNpb25fc3RyaW5nc1sxXTsK KwkJfQorCX0KKworCXZhciB2ZmlsZSA9IEZTTy5DcmVhdGVUZXh0RmlsZSgibWFpbi9waHBfZ3Rr X3ZlcnNpb24uaCIsIHRydWUpOworCXZmaWxlLldyaXRlTGluZSgiLyogVGhpcyBmaWxlIGlzIGF1 dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyB3aW4zMiBjb25maWd1cmF0aW9uICovIik7CisJ dmZpbGUuV3JpdGVMaW5lKCIvKiBFZGl0IHBocF9ndGsuaCB0byBjaGFuZ2UgdGhlIHZlcnNpb24g bnVtYmVyICovIik7CisJdmZpbGUuV3JpdGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfTUFKT1JfVkVS U0lPTiAiICsgbWFqb3IpOworCXZmaWxlLldyaXRlTGluZSgiI2RlZmluZSBQSFBfR1RLX01JTk9S X1ZFUlNJT04gIiArIG1pbm9yKTsKKwl2ZmlsZS5Xcml0ZUxpbmUoIiNkZWZpbmUgUEhQX0dUS19S RUxFQVNFX1ZFUlNJT04gIiArIHJlbGVhc2UpOworCXZmaWxlLldyaXRlTGluZSgiI2RlZmluZSBQ SFBfR1RLX0VYVFJBX1ZFUlNJT04gXCIiICsgZXh0cmEgKyAiXCIiKTsKKworCURFRklORSgnUEhQ X0dUS19WRVJTSU9OX1NUUklORycsIHZlcnNpb24pOworfQorCitmdW5jdGlvbiBjb25kZW5zZV9w YXRoKHBhdGgpIHsKKworCXBhdGggPSBGU08uR2V0QWJzb2x1dGVQYXRoTmFtZShwYXRoKTsKKwor CWlmIChwYXRoLnN1YnN0cigwLCBDV0QubGVuZ3RoKS50b0xvd2VyQ2FzZSgpCisJCQk9PSBDV0Qu dG9Mb3dlckNhc2UoKSAmJgorCQkJKHBhdGguY2hhckNvZGVBdChDV0QubGVuZ3RoKSA9PSA5MiB8 fCBwYXRoLmNoYXJDb2RlQXQoQ1dELmxlbmd0aCkgPT0gNDcpKSB7CisJCXJldHVybiBwYXRoLnN1 YnN0cihDV0QubGVuZ3RoICsgMSk7CisJfQorCisJdmFyIGEgPSBDV0Quc3BsaXQoIlxcIik7CisJ dmFyIGIgPSBwYXRoLnNwbGl0KCJcXCIpOworCXZhciBpLCBqOworCisJZm9yIChpID0gMDsgaSA8 IGIubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGFbaV0udG9Mb3dlckNhc2UoKSA9PSBiW2ldLnRvTG93 ZXJDYXNlKCkpCisJCQljb250aW51ZTsKKwkJaWYgKGkgPiAwKSB7CisJCQkvKiBmaXJzdCBkaWZm ZXJlbmNlIGZvdW5kICovCisJCQlwYXRoID0gIiI7CisJCQlmb3IgKGogPSAwOyBqIDwgYS5sZW5n dGggLSBpOyBqKyspIHsKKwkJCQlwYXRoICs9ICIuLlxcIjsKKwkJCX0KKwkJCWZvciAoaiA9IGk7 IGogPCBiLmxlbmd0aDsgaisrKSB7CisJCQkJcGF0aCArPSBiW2pdOworCQkJCWlmIChqIDwgYi5s ZW5ndGggLSAxKQorCQkJCQlwYXRoICs9ICJcXCI7CisJCQl9CisJCQlyZXR1cm4gcGF0aDsKKwkJ fQorCQkvKiBvbiBhIGRpZmZlcmVudCBkcml2ZSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4g cGF0aDsKK30KKworZnVuY3Rpb24gQ29uZmlndXJlQXJnKHR5cGUsIG9wdG5hbWUsIGhlbHB0ZXh0 LCBkZWZ2YWwpIHsKKworCXZhciBvcHB0eXBlID0gdHlwZSA9PSAiZW5hYmxlIiA/ICJkaXNhYmxl IiA6ICJ3aXRob3V0IjsKKworCWlmIChkZWZ2YWwgPT0gInllcyIgfHwgZGVmdmFsID09ICJ5ZXMs c2hhcmVkIikgeworCQl0aGlzLmFyZyA9ICItLSIgKyBvcHB0eXBlICsgIi0iICsgb3B0bmFtZTsK KwkJdGhpcy5pbXBhcmcgPSAiLS0iICsgdHlwZSArICItIiArIG9wdG5hbWU7CisJfSBlbHNlIHsK KwkJdGhpcy5hcmcgPSAiLS0iICsgdHlwZSArICItIiArIG9wdG5hbWU7CisJCXRoaXMuaW1wYXJn ID0gIi0tIiArIG9wcHR5cGUgKyAiLSIgKyBvcHRuYW1lOworCX0KKworCXRoaXMub3B0bmFtZSA9 IG9wdG5hbWU7CisJdGhpcy5oZWxwdGV4dCA9IGhlbHB0ZXh0OworCXRoaXMuZGVmdmFsID0gZGVm dmFsOworCXRoaXMuc3ltdmFsID0gb3B0bmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJl Z0V4cCgiLSIsICJnIiksICJfIik7CisJdGhpcy5zZWVuID0gZmFsc2U7CisJdGhpcy5hcmd2YWwg PSBkZWZ2YWw7Cit9CisKK2Z1bmN0aW9uIGFuYWx5emVfYXJnKGFyZ3ZhbCkgeworCisJdmFyIHJl dCA9IG5ldyBBcnJheSgpOworCXZhciBzaGFyZWQgPSBmYWxzZTsKKworCWlmIChhcmd2YWwgPT0g InNoYXJlZCIpIHsKKwkJc2hhcmVkID0gdHJ1ZTsKKwkJYXJndmFsID0gInllcyI7CisJfSBlbHNl IGlmIChhcmd2YWwgPT0gbnVsbCkgeworCQkvKiBub3RoaW5nICovCisJfSBlbHNlIGlmIChhcmdf bWF0Y2ggPSBhcmd2YWwubWF0Y2gobmV3IFJlZ0V4cCgiXnNoYXJlZCwoLiopIikpKSB7CisJCXNo YXJlZCA9IHRydWU7CisJCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsKKwl9IGVsc2UgaWYgKGFyZ19t YXRjaCA9IGFyZ3ZhbC5tYXRjaChuZXcgUmVnRXhwKCJeKC4qKSxzaGFyZWQkIikpKSB7CisJCXNo YXJlZCA9IHRydWU7CisJCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsKKwl9CisKKwlyZXRbMF0gPSBz aGFyZWQ7CisJcmV0WzFdID0gYXJndmFsOworCXJldHVybiByZXQ7Cit9CisKK2Z1bmN0aW9uIGNv bmZfcHJvY2Vzc19hcmdzKCkgeworCisJdmFyIGksIGo7CisJdmFyIGNvbmZpZ3VyZV9oZWxwX21v ZGUgPSBmYWxzZTsKKwl2YXIgYW5hbHl6ZWQgPSBmYWxzZTsKKwl2YXIgbmljZSA9ICJjc2NyaXB0 IC9ub2xvZ28gY29uZmlndXJlLmpzICI7CisJdmFyIGRpc2FibGVfYWxsID0gZmFsc2U7CisKKwlh cmdzID0gV1NjcmlwdC5Bcmd1bWVudHM7CisJZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBp KyspIHsKKwkJYXJnID0gYXJncyhpKTsKKwkJbmljZSArPSAnICInICsgYXJnICsgJyInOworCQlp ZiAoYXJnID09ICItLWhlbHAiKSB7CisJCQljb25maWd1cmVfaGVscF9tb2RlID0gdHJ1ZTsKKwkJ CWJyZWFrOworCQl9CisJCWlmIChhcmcgPT0gIi0tZGlzYWJsZS1hbGwiKSB7CisJCQlkaXNhYmxl X2FsbCA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIElmIGl0IGlzIC0tZm9vPWJh ciwgc3BsaXQgb24gdGhlIGVxdWFscyBzaWduCisJCWFyZyA9IGFyZy5zcGxpdCgiPSIsIDIpOwor CQlhcmduYW1lID0gYXJnWzBdOworCQlpZiAoYXJnLmxlbmd0aCA+IDEpIHsKKwkJCWFyZ3ZhbCA9 IGFyZ1sxXTsKKwkJfSBlbHNlIHsKKwkJCWFyZ3ZhbCA9IG51bGw7CisJCX0KKworCQkvLyBGaW5k IHRoZSBhcmcKKwkJZm91bmQgPSBmYWxzZTsKKwkJZm9yIChqID0gMDsgaiA8IGNvbmZpZ3VyZV9h cmdzLmxlbmd0aDsgaisrKSB7CisJCQlpZiAoYXJnbmFtZSA9PSBjb25maWd1cmVfYXJnc1tqXS5p bXBhcmcgfHwgYXJnbmFtZSA9PSBjb25maWd1cmVfYXJnc1tqXS5hcmcpIHsKKwkJCQlmb3VuZCA9 IHRydWU7CisKKwkJCQlhcmcgPSBjb25maWd1cmVfYXJnc1tqXTsKKwkJCQlhcmcuc2VlbiA9IHRy dWU7CisKKwkJCQlhbmFseXplZCA9IGFuYWx5emVfYXJnKGFyZ3ZhbCk7CisJCQkJc2hhcmVkID0g YW5hbHl6ZWRbMF07CisJCQkJYXJndmFsID0gYW5hbHl6ZWRbMV07CisKKwkJCQlpZiAoYXJnbmFt ZSA9PSBhcmcuaW1wYXJnKSB7CisJCQkJCS8qIHdlIG1hdGNoZWQgdGhlIGltcGxpY2l0LCBvciBk ZWZhdWx0IGFyZyAqLworCQkJCQlpZiAoYXJndmFsID09IG51bGwpIHsKKwkJCQkJCWFyZ3ZhbCA9 IGFyZy5kZWZ2YWw7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3ZSBtYXRjaGVkIHRo ZSBub24tZGVmYXVsdCBhcmcgKi8KKwkJCQkJaWYgKGFyZ3ZhbCA9PSBudWxsKSB7CisJCQkJCQlh cmd2YWwgPSBhcmcuZGVmdmFsID09ICJubyIgPyAieWVzIiA6ICJubyI7CisJCQkJCX0KKwkJCQl9 CisJCQkJCisJCQkJYXJnLmFyZ3ZhbCA9IGFyZ3ZhbDsKKwkJCQlldmFsKCJQSFBfR1RLXyIgKyBh cmcuc3ltdmFsICsgIiA9IGFyZ3ZhbDsiKTsKKwkJCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcuc3lt dmFsICsgIl9TSEFSRUQgPSBzaGFyZWQ7Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYg KCFmb3VuZCkgeworCQkJU1RERVJSLldyaXRlTGluZSgiVW5rbm93biBvcHRpb24gIiArIGFyZ25h bWUpCisJCQlTVERFUlIuV3JpdGVMaW5lKCJQbGVhc2UgdHJ5IGNvbmZpZ3VyZS5qcyAtLWhlbHAg Zm9yIGEgbGlzdCBvZiB2YWxpZCBvcHRpb25zIik7CisJCQlXU2NyaXB0LlF1aXQoMik7CisJCX0K Kwl9CisKKwlpZiAoY29uZmlndXJlX2hlbHBfbW9kZSkgeworCQlTVERPVVQuV3JpdGVCbGFua0xp bmVzKDEpOworCQlTVERPVVQuV3JpdGVMaW5lKCIgIFRoZXJlIGFyZSBubyBQSFAtR1RLIGV4dGVu c2lvbnMgYXZhaWxhYmxlIGF0IHByZXNlbnQuIik7CisJCVNURE9VVC5Xcml0ZUJsYW5rTGluZXMo MSk7CisKKwkJLy8gTWVhc3VyZSB3aWR0aCB0byBwcmV0dHktcHJpbnQgdGhlIG91dHB1dAorCQlt YXhfd2lkdGggPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBp KyspIHsKKwkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2ldOworCQkJaWYgKGFyZy5hcmcubGVuZ3Ro ID4gbWF4X3dpZHRoKSB7CisJCQkJbWF4X3dpZHRoID0gYXJnLmFyZy5sZW5ndGg7CisJCQl9CisJ CX0KKworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBpKyspIHsKKwkJ CWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2ldOworCisJCQluID0gbWF4X3dpZHRoIC0gYXJnLmFyZy5s ZW5ndGg7CisJCQlwYWQgPSAiICAgIjsKKwkJCWZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJ CQlwYWQgKz0gIiAiOworCQkJfQorCQkJU1RET1VULldyaXRlTGluZSgiICAiICsgYXJnLmFyZyAr IHBhZCArIHdvcmRfd3JhcF9hbmRfaW5kZW50KG1heF93aWR0aCArIDUsIGFyZy5oZWxwdGV4dCkp OworCQl9CisJCVdTY3JpcHQuUXVpdCgxKTsKKworCX0gZWxzZSB7IC8vIG5vdCAtLWhlbHAKKwor CQlnZW5lcmF0ZV9zb3VyY2UoKTsKKwl9CisKKwkvLyBOb3cgc2V0IGFueSBkZWZhdWx0cyB3ZSBt aWdodCBoYXZlIG1pc3NlZCBvdXQgZWFybGllcgorCWZvciAoaSA9IDA7IGkgPCBjb25maWd1cmVf YXJncy5sZW5ndGg7IGkrKykgeworCQlhcmcgPSBjb25maWd1cmVfYXJnc1tpXTsKKwkJaWYgKGFy Zy5zZWVuKQorCQkJY29udGludWU7CisJCWFuYWx5emVkID0gYW5hbHl6ZV9hcmcoYXJnLmRlZnZh bCk7CisJCXNoYXJlZCA9IGFuYWx5emVkWzBdOworCQlhcmd2YWwgPSBhbmFseXplZFsxXTsKKwor CQlpZiAoZGlzYWJsZV9hbGwpIHsKKwkJCWFyZ3ZhbCA9ICJubyI7CisJCQlzaGFyZWQgPSBmYWxz ZTsKKwkJfQorCisJCWV2YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwgKyAiID0gYXJndmFsOyIp OworCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcuc3ltdmFsICsgIl9TSEFSRUQgPSBzaGFyZWQ7Iik7 CisJfQorCisJTUZPID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJNYWtlZmlsZS5vYmplY3RzIiwgdHJ1 ZSk7CisKKwlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOworCVNURE9VVC5Xcml0ZUxpbmUoIlNh dmluZyBjb25maWd1cmUgb3B0aW9ucyB0byBjb25maWd1cmUuYmF0Iik7CisJdmFyIG5pY2VmaWxl ID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJjb25maWd1cmUuYmF0IiwgdHJ1ZSk7CisJbmljZWZpbGUu V3JpdGVMaW5lKG5pY2UpOworCW5pY2VmaWxlLkNsb3NlKCk7CisKKwlBQ19ERUZJTkUoJ0NPTkZJ R1VSRV9DT01NQU5EJywgbmljZSk7Cit9CisKK2Z1bmN0aW9uIGZpbmRfcGF0dGVybl9pbl9wYXRo KHBhdHRlcm4sIHBhdGgpIHsKKworCWlmIChwYXRoID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNl OworCX0KKworCXZhciBkaXJzID0gcGF0aC5zcGxpdCgnOycpOworCXZhciBpOworCXZhciBpdGVt czsKKworCWZvciAoaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7CisJCWl0ZW1zID0gZ2xv YihkaXJzW2ldICsgIlxcIiArIHBhdHRlcm4pOworCQlpZiAoaXRlbXMpIHsKKwkJCXJldHVybiBj b25kZW5zZV9wYXRoKGl0ZW1zWzBdKTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Z1 bmN0aW9uIEFSR19XSVRIKG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpIHsKKworCWNvbmZpZ3Vy ZV9hcmdzW2NvbmZpZ3VyZV9hcmdzLmxlbmd0aF0gPSBuZXcgQ29uZmlndXJlQXJnKCJ3aXRoIiwg b3B0bmFtZSwgaGVscHRleHQsIGRlZnZhbCk7Cit9CisKK2Z1bmN0aW9uIEFSR19FTkFCTEUob3B0 bmFtZSwgaGVscHRleHQsIGRlZnZhbCkgeworCisJY29uZmlndXJlX2FyZ3NbY29uZmlndXJlX2Fy Z3MubGVuZ3RoXSA9IG5ldyBDb25maWd1cmVBcmcoImVuYWJsZSIsIG9wdG5hbWUsIGhlbHB0ZXh0 LCBkZWZ2YWwpOworfQorCitmdW5jdGlvbiBERUZJTkUobmFtZSwgdmFsdWUpIHsKKworCWlmIChj b25maWd1cmVfc3Vic3QuRXhpc3RzKG5hbWUpKSB7CisJCWNvbmZpZ3VyZV9zdWJzdC5SZW1vdmUo bmFtZSk7CisJfQorCWNvbmZpZ3VyZV9zdWJzdC5BZGQobmFtZSwgdmFsdWUpOworfQorCitmdW5j dGlvbiBBQ19ERUZJTkUobmFtZSwgdmFsdWUsIGNvbW1lbnQsIHF1b3RlKSB7CisKKwlpZiAocXVv dGUgPT0gbnVsbCkgeworCQlxdW90ZSA9IHRydWU7CisJfQorCWlmIChxdW90ZSAmJiB0eXBlb2Yo dmFsdWUpID09ICJzdHJpbmciKSB7CisJCXZhbHVlID0gJyInICsgdmFsdWUucmVwbGFjZShuZXcg UmVnRXhwKCcoWyJcXFxcXSknLCAiZyIpLCAnXFwkMScpICsgJyInOworCX0gZWxzZSBpZiAodmFs dWUubGVuZ3RoID09IDApIHsKKwkJdmFsdWUgPSAnIiInOworCX0KKwl2YXIgaXRlbSA9IG5ldyBB cnJheSh2YWx1ZSwgY29tbWVudCk7CisJaWYgKGNvbmZpZ3VyZV9oZHIuRXhpc3RzKG5hbWUpKSB7 CisJCXZhciBvcmlnX2l0ZW0gPSBjb25maWd1cmVfaGRyLkl0ZW0obmFtZSk7CisJCVNURE9VVC5X cml0ZUxpbmUoIkFDX0RFRklORVsiICsgbmFtZSArICJdPSIgKyB2YWx1ZSArICI6IGlzIGFscmVh ZHkgZGVmaW5lZCB0byAiICsgaXRlbVswXSk7CisJfSBlbHNlIHsKKwkJY29uZmlndXJlX2hkci5B ZGQobmFtZSwgaXRlbSk7CisJfQorfQorCitmdW5jdGlvbiBQQVRIX1BST0cocHJvZ25hbWUsIGFk ZGl0aW9uYWxfcGF0aHMsIHN5bWJvbCkgeworCisJdmFyIGV4ZTsKKwl2YXIgcGxhY2U7CisJdmFy IGN5Z19wYXRoID0gUEhQX0dUS19DWUdXSU4gKyAiXFxiaW47IiArIFBIUF9HVEtfQ1lHV0lOICsg IlxcdXNyXFxsb2NhbFxcYmluIjsKKworCWV4ZSA9IHByb2duYW1lICsgIi5leGUiOworCisJaWYg KGFkZGl0aW9uYWxfcGF0aHMgPT0gbnVsbCkgeworCQlhZGRpdGlvbmFsX3BhdGhzID0gY3lnX3Bh dGg7CisJfSBlbHNlIHsKKwkJYWRkaXRpb25hbF9wYXRocyArPSAiOyIgKyBjeWdfcGF0aDsKKwl9 CisKKwlwbGFjZSA9IHNlYXJjaF9wYXRocyhleGUsIGFkZGl0aW9uYWxfcGF0aHMsICJQQVRIIik7 CisKKwlpZiAocGxhY2UgPT0gdHJ1ZSkgeworCQlwbGFjZSA9IGV4ZTsKKwl9IGVsc2UgaWYgKHBs YWNlICE9IGZhbHNlKSB7CisKKwkJaWYgKHBsYWNlLmxhc3RJbmRleE9mKCJcXCIpICE9IHBsYWNl Lmxlbmd0aCAtIDEpIHsKKwkJCXBsYWNlICs9ICJcXCI7CisJCX0KKworCQlwbGFjZSA9IHBsYWNl ICsgZXhlOworCisJCWlmIChwbGFjZS5pbmRleE9mKCIgIikpIHsKKwkJCXBsYWNlID0gJyInICsg cGxhY2UgKyAnIic7CisJCX0KKwl9CisKKwlpZiAocGxhY2UpIHsKKwkJaWYgKHN5bWJvbCA9PSBu dWxsKSB7CisJCQlzeW1ib2wgPSBwcm9nbmFtZS50b1VwcGVyQ2FzZSgpOworCQl9CisJCURFRklO RShzeW1ib2wsIHBsYWNlKTsKKwl9CisJcmV0dXJuIHBsYWNlOworfQorCitmdW5jdGlvbiBDSEVD S19MSUIobGlibmFtZXMsIHRhcmdldCwgcGF0aF90b19jaGVjaywgY29tbW9uX25hbWUpIHsKKwor CVNURE9VVC5Xcml0ZSgiQ2hlY2tpbmcgZm9yICIgKyBsaWJuYW1lcyArICIgLi4uICIpOworCisJ aWYgKGNvbW1vbl9uYW1lID09IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsKKwkJY29tbW9uX25h bWUgPSB0YXJnZXQ7CisJfQorCisJaWYgKHBhdGhfdG9fY2hlY2sgPT0gbnVsbCkgeworCQlwYXRo X3RvX2NoZWNrID0gIiI7CisJfQorCisJLy8gaWYgdGhleSBzcGVjaWZpZWQgYSBjb21tb24gbmFt ZSBmb3IgdGhlIHBhY2thZ2UgdGhhdCBjb250YWlucworCS8vIHRoZSBsaWJyYXJ5LCB0YWcgc29t ZSB1c2VmdWwgZGVmYXVsdHMgb24gdG8gdGhlIGVuZCBvZiB0aGUKKwkvLyBwYXRoIHRvIGJlIHNl YXJjaGVkCisJaWYgKGNvbW1vbl9uYW1lICE9IG51bGwpIHsKKwkJcGF0aF90b19jaGVjayArPSAi Oy4uXFwiICsgY29tbW9uX25hbWUgKyAiKiI7CisJfQorCisJLy8gRGV0ZXJtaW5lIHRhcmdldCBm b3IgYnVpbGQgZmxhZ3MKKwlpZiAodGFyZ2V0ID09IG51bGwpIHsKKwkJdGFyZ2V0ID0gIiI7CisJ fSBlbHNlIHsKKwkJdGFyZ2V0ID0gIl8iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCkucmVwbGFjZShu ZXcgUmVnRXhwKCItIiwgImciKSwgIl8iKTsKKwl9CisKKwkvLyBFeHBhbmQgcGF0aCB0byBpbmNs dWRlIGdlbmVyYWwgZGlycworCXBhdGhfdG9fY2hlY2sgKz0gIjsiICsgcGhwX3VzdWFsX2xpYl9z dXNwZWN0czsKKworCS8vIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byBwdXQgbGlicyB1bmRlciBv bmUgb2YgdGhlc2UgZGlyIG5hbWVzCisJdmFyIHN1YmRpcnMgPSBuZXcgQXJyYXkoUEhQX0dUS19E RUJVRyA9PSAieWVzIiA/ICJEZWJ1ZyIgOiAiUmVsZWFzZSIsICJsaWIiLCAibGlicyIsICJsaWJl eGVjIik7CisKKwkvLyBsaWJuYW1lcyBjYW4gYmUgOyBzZXBhcmF0ZWQgbGlzdCBvZiBhY2NlcHRl ZCBsaWJyYXJ5IG5hbWVzCisJbGlibmFtZXMgPSBsaWJuYW1lcy5zcGxpdCgnOycpOworCisJdmFy IGksIGosIGssIGxpYm5hbWU7CisJdmFyIGxvY2F0aW9uID0gZmFsc2U7CisJdmFyIHBhdGggPSBw YXRoX3RvX2NoZWNrLnNwbGl0KCc7Jyk7CisJCisJZm9yIChpID0gMDsgaSA8IGxpYm5hbWVzLmxl bmd0aDsgaSsrKSB7CisJCWxpYm5hbWUgPSBsaWJuYW1lc1tpXTsKKworCQlmb3IgKGsgPSAwOyBr IDwgcGF0aC5sZW5ndGg7IGsrKykgeworCQkJbG9jYXRpb24gPSBnbG9iKHBhdGhba10gKyAiXFwi ICsgbGlibmFtZSk7CisJCQlpZiAobG9jYXRpb24pIHsKKwkJCQlsb2NhdGlvbiA9IGxvY2F0aW9u WzBdOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IHN1YmRpcnMubGVuZ3Ro OyBqKyspIHsKKwkJCQlsb2NhdGlvbiA9IGdsb2IocGF0aFtrXSArICJcXCIgKyBzdWJkaXJzW2pd ICsgIlxcIiArIGxpYm5hbWUpOworCQkJCWlmIChsb2NhdGlvbikgeworCQkJCQlsb2NhdGlvbiA9 IGxvY2F0aW9uWzBdOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAobG9jYXRpb24p CisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAobG9jYXRpb24pIHsKKwkJCWxvY2F0aW9uID0gY29u ZGVuc2VfcGF0aChsb2NhdGlvbik7CisJCQl2YXIgbGliZGlyID0gRlNPLkdldFBhcmVudEZvbGRl ck5hbWUobG9jYXRpb24pOworCQkJbGlibmFtZSA9IEZTTy5HZXRGaWxlTmFtZShsb2NhdGlvbik7 CisJCQlBRERfRkxBRygiTERGTEFHUyIgKyB0YXJnZXQsICcvbGlicGF0aDoiJyArIGxpYmRpciAr ICciICcpOworCQkJQUREX0ZMQUcoIkxJQlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsKKworCQkJU1RE T1VULldyaXRlTGluZSgJbG9jYXRpb24pOworCisJCQlyZXR1cm4gbG9jYXRpb247CisJCX0KKwor CQkvLyBDaGVjayBpbiB0aGVpciBzdGFuZGFyZCBsaWIgcGF0aAorCQlsb2NhdGlvbiA9IGZpbmRf cGF0dGVybl9pbl9wYXRoKGxpYm5hbWUsIFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIiku SXRlbSgiTElCIikpOworCisJCWlmIChsb2NhdGlvbikgeworCQkJbG9jYXRpb24gPSBjb25kZW5z ZV9wYXRoKGxvY2F0aW9uKTsKKwkJCWxpYm5hbWUgPSBGU08uR2V0RmlsZU5hbWUobG9jYXRpb24p OworCQkJQUREX0ZMQUcoIkxJQlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsKKworCQkJU1RET1VULldy aXRlTGluZSgiCTxpbiBMSUIgcGF0aD4gIiArIGxpYm5hbWUpOworCQkJcmV0dXJuIGxvY2F0aW9u OworCQl9CisJfQorCisJU1RET1VULldyaXRlTGluZSgiCTxub3QgZm91bmQ+Iik7CisKKwlyZXR1 cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIENIRUNLX0hFQURFUihoZWFkZXJfbmFtZSwgcGF0aF90 b19jaGVjaykgeworCisJdmFyIHBhdGggPSBzZWFyY2hfcGF0aHMoaGVhZGVyX25hbWUsIHBhdGhf dG9fY2hlY2ssICJJTkNMVURFIik7CisKKwlpZiAoIXBhdGgpIHsKKwkJRVJST1IoIkFib3J0aW5n IGNvbmZpZ3VyZSBwcm9jZXNzIik7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKy8vIHVzZSB0 aGlzIGZvciB2ZXJzaW9uIGNoZWNraW5nCitmdW5jdGlvbiBHUkVQX0hFQURFUihoZWFkZXJfbmFt ZSwgcmVnZXgsIHBhdGhfdG9fY2hlY2spIHsKKworCXZhciBjID0gZmFsc2U7CisKKwlpZiAoRlNP LkZpbGVFeGlzdHMocGF0aF90b19jaGVjayArICJcXCIgKyBoZWFkZXJfbmFtZSkpIHsKKwkJYyA9 IGZpbGVfZ2V0X2NvbnRlbnRzKHBhdGhfdG9fY2hlY2sgKyAiXFwiICsgaGVhZGVyX25hbWUpOwor CX0KKworCWlmICghYykgeworCQkvKiBsb29rIGluIHRoZSBpbmNsdWRlIHBhdGggKi8KKworCQl2 YXIgcCA9IHNlYXJjaF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVjaywgIklOQ0xVREUi KTsKKworCQlpZiAodHlwZW9mKHApID09ICJzdHJpbmciKSB7CisJCQljID0gZmlsZV9nZXRfY29u dGVudHMocCk7CisJCX0KKworCQlpZiAoIWMpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0K KworCWlmICh0eXBlb2YocmVnZXgpID09ICJzdHJpbmciKSB7CisJCXJlZ2V4ID0gbmV3IFJlZ0V4 cChyZWdleCk7CisJfQorCisJaWYgKGMubWF0Y2gocmVnZXgpKSB7CisJCS8qIGNhbGxlciBjYW4g bm93IHVzZSBSZWdFeHAuJDEgZXRjLiB0byBnZXQgYXQgcGF0dGVybnMgKi8KKwkJcmV0dXJuIHRy dWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworZnVuY3Rpb24gQ0hFQ0tfSEVBREVSX0FERF9J TkNMVURFKGhlYWRlcl9uYW1lLCBmbGFnX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYsIGFk ZF9kaXJfcGFydCwgYWRkX3RvX2ZsYWdfb25seSkgeworCisJdmFyIGRpcl9wYXJ0X3RvX2FkZCA9 ICIiOworCisJaWYgKHVzZV9lbnYgPT0gbnVsbCkgeworCQl1c2VfZW52ID0gdHJ1ZTsKKwl9CisK KwkvLyBpZiB0cnVlLCBhZGQgdGhlIGRpciBwYXJ0IG9mIHRoZSBoZWFkZXJfbmFtZSB0byB0aGUg aW5jbHVkZSBwYXRoCisJaWYgKGFkZF9kaXJfcGFydCA9PSBudWxsKSB7CisJCWFkZF9kaXJfcGFy dCA9IGZhbHNlOworCX0gZWxzZSBpZiAoYWRkX2Rpcl9wYXJ0KSB7CisJCXZhciBiYXNlbmFtZSA9 IEZTTy5HZXRGaWxlTmFtZShoZWFkZXJfbmFtZSk7CisJCWRpcl9wYXJ0X3RvX2FkZCA9ICJcXCIg KyBoZWFkZXJfbmFtZS5zdWJzdHIoMCwgaGVhZGVyX25hbWUubGVuZ3RoIC0gYmFzZW5hbWUubGVu Z3RoIC0gMSk7CisJfQorCisJaWYgKHBhdGhfdG9fY2hlY2sgPT0gbnVsbCkgeworCQlwYXRoX3Rv X2NoZWNrID0gcGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHM7CisJfSBlbHNlIHsKKwkJcGF0aF90 b19jaGVjayArPSAiOyIgKyBwaHBfdXN1YWxfaW5jbHVkZV9zdXNwZWN0czsKKwl9CisJCisJdmFy IHAgPSBzZWFyY2hfcGF0aHMoaGVhZGVyX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYgPyAi SU5DTFVERSIgOiBudWxsKTsKKwl2YXIgaGF2ZSA9IDA7CisJdmFyIHN5bTsKKworCWlmICh0eXBl b2YocCkgPT0gInN0cmluZyIpIHsKKwkJQUREX0ZMQUcoZmxhZ19uYW1lLCAnL0kgIicgKyBwICsg ZGlyX3BhcnRfdG9fYWRkICsgJyIgJyk7CisJfQorCisJaGF2ZSA9IHAgPyAxIDogMAorCisJc3lt ID0gaGVhZGVyX25hbWUudG9VcHBlckNhc2UoKTsKKwlzeW0gPSBzeW0ucmVwbGFjZShuZXcgUmVn RXhwKCJbXFxcXC9cLi1dIiwgImciKSwgIl8iKTsKKworCWlmICh0eXBlb2YoYWRkX3RvX2ZsYWdf b25seSkgPT0gInVuZGVmaW5lZCIgJiYKKwkJCWZsYWdfbmFtZS5tYXRjaChuZXcgUmVnRXhwKCJe Q0ZMQUdTXyguKikkIikpKSB7CisJCWFkZF90b19mbGFnX29ubHkgPSB0cnVlOworCX0KKworCWlm ICh0eXBlb2YoYWRkX3RvX2ZsYWdfb25seSkgIT0gInVuZGVmaW5lZCIpIHsKKwkJQUREX0ZMQUco ZmxhZ19uYW1lLCAiL0QgSEFWRV8iICsgc3ltICsgIj0iICsgaGF2ZSk7CisJfSBlbHNlIHsKKwkJ QUNfREVGSU5FKCJIQVZFXyIgKyBzeW0sIGhhdmUsICJoYXZlIHRoZSAiICsgaGVhZGVyX25hbWUg KyAiIGhlYWRlciBmaWxlIik7CisJfQorCisJcmV0dXJuIHA7Cit9CisKKy8qIEFkZCBhIGRlcGVu ZGVuY3ksIHNvIHRoYXQgUEhQLUdUSyBpcyBidWlsdCBiZWZvcmUgYW55IG9mIGl0cyBleHRlbnNp b25zICovCitmdW5jdGlvbiBBRERfRVhURU5TSU9OX0RFUChleHRuYW1lLCBkZXBlbmRzb24sIG9w dGlvbmFsKSB7CisKKwl2YXIgRVhUID0gZXh0bmFtZS50b1VwcGVyQ2FzZSgpOworCXZhciBERVAg PSBkZXBlbmRzb24udG9VcHBlckNhc2UoKTsKKwl2YXIgZGVwX3ByZXNlbnQgPSBmYWxzZTsKKwl2 YXIgZGVwX3NoYXJlZCA9IGZhbHNlOworCisJdHJ5IHsKKwkJZGVwX3ByZXNlbnQgPSBldmFsKCJQ SFBfR1RLXyIgKyBERVApOworCQlkZXBfc2hhcmVkID0gZXZhbCgiUEhQX0dUS18iICsgREVQICsg Il9TSEFSRUQiKTsKKwl9IGNhdGNoIChlKSB7CisJCWRlcF9wcmVzZW50ID0gIm5vIjsKKwkJZGVw X3NoYXJlZCA9IGZhbHNlOworCX0KKwkKKwlpZiAob3B0aW9uYWwpIHsKKwkJaWYgKGRlcF9wcmVz ZW50ID09ICJubyIpCisJCQlyZXR1cm47CisJfQorCisJdmFyIGV4dF9zaGFyZWQgPSBldmFsKCJQ SFBfR1RLXyIgKyBFWFQgKyAiX1NIQVJFRCIpOworCisJaWYgKGRlcF9zaGFyZWQpIHsKKwkJQURE X0ZMQUcoIkxERkxBR1NfIiArIEVYVCwgIi9saWJwYXRoOiQoQlVJTERfRElSKSIpOworCQlBRERf RkxBRygiTElCU18iICsgRVhULCAicGhwXyIgKyBkZXBlbmRzb24gKyAiLmxpYiIpOworCQlBRERf RkxBRygiREVQU18iICsgRVhULCAiJChCVUlMRF9ESVIpXFxwaHBfIiArIGRlcGVuZHNvbiArICIu bGliIik7CisJfQorfQorCitmdW5jdGlvbiBFWFRFTlNJT04oZXh0bmFtZSwgZmlsZV9saXN0LCBz aGFyZWQsIGNmbGFncywgZGxsbmFtZSwgb2JqX2RpcikgeworCisJdmFyIG9ianMgPSBudWxsOwor CXZhciBFWFQgPSBleHRuYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwg ImciKSwgIl8iKTsKKwl2YXIgZXh0bmFtZV9mb3JfcHJpbnRpbmc7CisKKwlpZiAoc2hhcmVkID09 IG51bGwpIHsKKwkJZXZhbCgic2hhcmVkID0gUEhQX0dUS18iICsgRVhUICsgIl9TSEFSRUQ7Iik7 CisJfQorCisJaWYgKGNmbGFncyA9PSBudWxsKSB7CisJCWNmbGFncyA9ICIiOworCX0KKworCWlm ICh0eXBlb2Yob2JqX2RpcikgPT0gInVuZGVmaW5lZCIpIHsKKworCQlleHRuYW1lX2Zvcl9wcmlu dGluZyA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZTsKKworCX0gZWxzZSB7CisKKwkJZXh0bmFt ZV9mb3JfcHJpbnRpbmcgPSBjb25maWd1cmVfbW9kdWxlX2Rpcm5hbWUgKyAiICh2aWEgIiArIG9i al9kaXIgKyAiKSI7CisJfQorCisJU1RET1VULldyaXRlTGluZSgiRW5hYmxpbmcgZXh0ZW5zaW9u ICIgKyBleHRuYW1lX2Zvcl9wcmludGluZyArICIgW3NoYXJlZF0iKTsKKwljZmxhZ3MgPSAiL0Qg Q09NUElMRV9ETF8iICsgRVhUICsgIjIgL0QgIiArIEVYVCArICJfRVhQT1JUUz0xIiArIGNmbGFn czsKKworCU1GTy5Xcml0ZUJsYW5rTGluZXMoMSk7CisJTUZPLldyaXRlTGluZSgiIyBvYmplY3Rz IGZvciBFWFQgIiArIGV4dG5hbWUpOworCU1GTy5Xcml0ZUJsYW5rTGluZXMoMSk7CisKKwlBRERf U09VUkNFUyhjb25maWd1cmVfbW9kdWxlX2Rpcm5hbWUsIGZpbGVfbGlzdCwgZXh0bmFtZSwgb2Jq X2Rpcik7CisKKwlNRk8uV3JpdGVCbGFua0xpbmVzKDEpOworCisJLy8gUEhQLUdUSyBhbmQgaXRz IGV4dGVuc2lvbnMgYXJlIGFsd2F5cyBidWlsdCBhcyBzaGFyZWQKKworCWlmIChkbGxuYW1lID09 IG51bGwpIHsKKwkJaWYgKGV4dG5hbWUgPT0gJ3BocC1ndGsnKSB7CisJCQlkbGxuYW1lID0gZXh0 bmFtZSArICIyLmRsbCI7CisJCX0gZWxzZSB7CisJCQlkbGxuYW1lID0gInBocF9ndGtfIiArIGV4 dG5hbWUgKyAiLmRsbCI7CisJCX0KKwl9CisJdmFyIGxpYm5hbWUgPSBkbGxuYW1lLnN1YnN0cmlu ZygwLCBkbGxuYW1lLmxlbmd0aC00KSArICIubGliIjsKKwl2YXIgbGQgPSAiQCQoTEQpIjsKKwor CXJlc25hbWUgPSBnZW5lcmF0ZV92ZXJzaW9uX2luZm9fcmVzb3VyY2UoZGxsbmFtZSwgY29uZmln dXJlX21vZHVsZV9kaXJuYW1lKTsKKworCU1GTy5Xcml0ZUxpbmUoIiQoQlVJTERfRElSKVxcJChQ SFBHVEtETEwpOiAkKCIgKyBFWFQgKyAiX0dMT0JBTF9PQkpTKSAkKFBIUEdUS0RMTF9SRVMpIik7 CisJTUZPLldyaXRlTGluZSgiXHQiICsgbGQgKyAiIC9vdXQ6JChCVUlMRF9ESVIpXFwkKFBIUEdU S0RMTCkgJCgiICsgRVhUICsgIl9MREZMQUdTKSAkKExERkxBR1MpICQoIiArIEVYVCArICJfR0xP QkFMX09CSlMpICQoTElCU18iICsgRVhUICsgIikgJChMSUJTKSAkKFBIUEdUS0RMTF9SRVMpIik7 CisJTUZPLldyaXRlQmxhbmtMaW5lcygxKTsKKworCU1GTy5Xcml0ZUxpbmUoZGxsbmFtZSArICI6 ICQoQlVJTERfRElSKVxcIiArIGRsbG5hbWUpOworCU1GTy5Xcml0ZUxpbmUoIlx0QGVjaG8gRVhU ICIgKyBleHRuYW1lICsgIiBidWlsZCBjb21wbGV0ZSIpOworCU1GTy5Xcml0ZUJsYW5rTGluZXMo MSk7CisKKwlBRERfRkxBRygiQ0ZMQUdTXyIgKyBFWFQsIGNmbGFncyk7Cit9CisKK2Z1bmN0aW9u IEFERF9TT1VSQ0VTKGRpciwgZmlsZV9saXN0LCB0YXJnZXQsIG9ial9kaXIpIHsKKworCXZhciBp OworCXZhciB0djsKKwl2YXIgc3JjLCBvYmosIHN5bSwgZmxhZ3M7CisKKwlpZiAodGFyZ2V0ID09 IG51bGwpIHsKKwkJdGFyZ2V0ID0gInBocCI7CisJfQorCisJc3ltID0gdGFyZ2V0LnRvVXBwZXJD YXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwgImciKSwgIl8iKSArICJfR0xPQkFMX09CSlMi OworCWZsYWdzID0gIkNGTEFHU18iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCkucmVwbGFjZShuZXcg UmVnRXhwKCItIiwgImciKSwgIl8iKTsKKworCWlmIChjb25maWd1cmVfc3Vic3QuRXhpc3RzKHN5 bSkpIHsKKwkJdHYgPSBjb25maWd1cmVfc3Vic3QuSXRlbShzeW0pOworCX0gZWxzZSB7CisJCXR2 ID0gIiI7CisJfQorCisJZmlsZV9saXN0ID0gZmlsZV9saXN0LnNwbGl0KG5ldyBSZWdFeHAoIlxc cysiKSk7CisJZmlsZV9saXN0LnNvcnQoKTsKKworCXZhciByZSA9IG5ldyBSZWdFeHAoIlwuW2Et ejAtOUEtWl0rJCIpOworCisJZGlyID0gZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiLyIsICJnIiks ICJcXCIpOworCXZhciBvYmpzX2xpbmUgPSAiIjsKKwl2YXIgc3Jjc19saW5lID0gIiI7CisKKwl2 YXIgc3ViX2J1aWxkID0gIiQoQlVJTERfRElSKVxcIjsKKworCS8qIGlmIG1vZHVsZSBkaXIgaXMg bm90IGEgY2hpbGQgb2YgdGhlIG1haW4gc291cmNlIGRpciwKKwkgKiB3ZSBuZWVkIHRvIHR3ZWFr IGl0OyB3ZSBzaG91bGQgaGF2ZSBkZXRlY3RlZCBzdWNoIGEKKwkgKiBjYXNlIGluIGNvbmRlbnNl X3BhdGggYW5kIHJld3JpdHRlbiB0aGUgcGF0aCB0bworCSAqIGJlIHJlbGF0aXZlLgorCSAqIFRo aXMgcHJvYmFibHkgYnJlYWtzIGZvciBub24tc2libGluZyBkaXJzICovCisJaWYgKG9ial9kaXIg PT0gbnVsbCkgeworCQl2YXIgYnVpbGRfZGlyID0gZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXi4u XFxcXCIpLCAiIik7CisJCXZhciBtYW5nbGVfZGlyID0gYnVpbGRfZGlyLnJlcGxhY2UobmV3IFJl Z0V4cCgiW1xcXFwvListXSIsICJnIiksICJfIik7CisJCXZhciBiZF9mbGFnc19uYW1lID0gIkNG TEFHU19CRF8iICsgbWFuZ2xlX2Rpci50b1VwcGVyQ2FzZSgpOworCX0KKwllbHNlIHsKKwkJdmFy IGJ1aWxkX2RpciA9IG9ial9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJeLi5cXFxcIiksICIiKTsK KwkJdmFyIG1hbmdsZV9kaXIgPSBidWlsZF9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC8u Ky1dIiwgImciKSwgIl8iKTsKKwkJdmFyIGJkX2ZsYWdzX25hbWUgPSAiQ0ZMQUdTX0JEXyIgKyBt YW5nbGVfZGlyLnRvVXBwZXJDYXNlKCk7CisJfQorCQorCXZhciBkaXJzID0gYnVpbGRfZGlyLnNw bGl0KCJcXCIpOworCXZhciBpLCBkID0gIiI7CisJZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3Ro OyBpKyspIHsKKwkJZCArPSBkaXJzW2ldOworCQlidWlsZF9kaXJzW2J1aWxkX2RpcnMubGVuZ3Ro XSA9IGQ7CisJCWQgKz0gIlxcIjsKKwl9CisJc3ViX2J1aWxkICs9IGQ7CisKKworCURFRklORShi ZF9mbGFnc19uYW1lLCAiIC9GZCIgKyBzdWJfYnVpbGQgKyAiIC9GcCIgKyBzdWJfYnVpbGQgKyAi IC9GUiIgKyBzdWJfYnVpbGQpOworCisJZm9yIChpIGluIGZpbGVfbGlzdCkgeworCQlzcmMgPSBm aWxlX2xpc3RbaV07CisJCW9iaiA9IHNyYy5yZXBsYWNlKHJlLCAiLm9iaiIpOworCQl0diArPSAi ICIgKyBzdWJfYnVpbGQgKyBvYmo7CisKKwkJTUZPLldyaXRlTGluZShzdWJfYnVpbGQgKyBvYmog KyAiOiAiICsgZGlyICsgIlxcIiArIHNyYyk7CisJCU1GTy5Xcml0ZUxpbmUoIlx0QCQoQ0MpICQo IiArIGZsYWdzICsgIikgJChDRkxBR1MpICQoIiArIGJkX2ZsYWdzX25hbWUgKyAiKSAvYyAiICsg ZGlyICsgIlxcIiArIHNyYyArICIgL0ZvIiArIHN1Yl9idWlsZCArIG9iaik7CisJfQorCisJREVG SU5FKHN5bSwgdHYpOworfQorCitmdW5jdGlvbiBBRERfRkxBRyhuYW1lLCBmbGFncywgdGFyZ2V0 KSB7CisKKwlpZiAodGFyZ2V0ICE9IG51bGwpIHsKKwkJbmFtZSA9IHRhcmdldC50b1VwcGVyQ2Fz ZSgpICsgIl8iICsgbmFtZTsKKwl9CisJaWYgKGNvbmZpZ3VyZV9zdWJzdC5FeGlzdHMobmFtZSkp IHsKKwkJdmFyIGN1cnJfZmxhZ3MgPSBjb25maWd1cmVfc3Vic3QuSXRlbShuYW1lKTsKKworCQlp ZiAoY3Vycl9mbGFncy5pbmRleE9mKGZsYWdzKSA+PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJ CisJCWZsYWdzID0gY3Vycl9mbGFncyArICIgIiArIGZsYWdzOworCQljb25maWd1cmVfc3Vic3Qu UmVtb3ZlKG5hbWUpOworCX0KKwljb25maWd1cmVfc3Vic3QuQWRkKG5hbWUsIGZsYWdzKTsKK30K KworZnVuY3Rpb24gZ2V0X2RlZmluZShuYW1lKSB7CisKKwlyZXR1cm4gY29uZmlndXJlX3N1YnN0 Lkl0ZW0obmFtZSk7Cit9CisKK2Z1bmN0aW9uIEVSUk9SKG1zZykgeworCisJU1RERVJSLldyaXRl TGluZSgiRVJST1I6ICIgKyBtc2cpOworCVdTY3JpcHQuUXVpdCgzKTsKK30KKworZnVuY3Rpb24g V0FSTklORyhtc2cpIHsKKworCVNUREVSUi5Xcml0ZUxpbmUoIldBUk5JTkc6ICIgKyBtc2cpOwor CVNUREVSUi5Xcml0ZUJsYW5rTGluZXMoMSk7Cit9CisKKy8qIFNlYXJjaGVzIGEgc2V0IG9mIHBh dGhzIGZvciBhIGZpbGU7IHJldHVybnMgdGhlIGRpciBpbiB3aGljaCB0aGUgZmlsZSB3YXMgZm91 bmQsIHRydWUgaWYgaXQKK3dhcyBmb3VuZCBpbiB0aGUgZGVmYXVsdCBlbnYgcGF0aCwgb3IgZmFs c2UgaWYgaXQgd2FzIG5vdCBmb3VuZCBhdCBhbGwuIGVudl9uYW1lIGlzIHRoZSBvcHRpb25hbAor bmFtZSBvZiBhbiBlbnYgdmFyIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgcGF0aCB0byBzZWFyY2gg Ki8KK2Z1bmN0aW9uIHNlYXJjaF9wYXRocyh0aGluZ190b19maW5kLCBleHBsaWNpdF9wYXRoLCBl bnZfbmFtZSkgeworCisJdmFyIGksIGZvdW5kID0gZmFsc2UsIHBsYWNlID0gZmFsc2UsIGZpbGUs IGVudjsKKworCVNURE9VVC5Xcml0ZSgiQ2hlY2tpbmcgZm9yICIgKyB0aGluZ190b19maW5kICsg IiAuLi4gIik7CisKKwlpZiAodGhpbmdfdG9fZmluZC5sZW5ndGggPCA2KSB7CisJCVNURE9VVC5X cml0ZSgiCSIpOworCX0KKworCXRoaW5nX3RvX2ZpbmQgPSB0aGluZ190b19maW5kLnJlcGxhY2Uo bmV3IFJlZ0V4cCgiLyIsICJnIiksICJcXCIpOworCisJaWYgKGV4cGxpY2l0X3BhdGggIT0gbnVs bCkgeworCQlpZiAodHlwZW9mKGV4cGxpY2l0X3BhdGgpID09ICJzdHJpbmciKSB7CisJCQlleHBs aWNpdF9wYXRoID0gZXhwbGljaXRfcGF0aC5zcGxpdCgiOyIpOworCQl9CisKKwkJZm9yIChpID0g MDsgaSA8IGV4cGxpY2l0X3BhdGgubGVuZ3RoOyBpKyspIHsKKwkJCWZpbGUgPSBnbG9iKGV4cGxp Y2l0X3BhdGhbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7CisJCQlpZiAoZmlsZSkgeworCQkJ CWZvdW5kID0gdHJ1ZTsKKwkJCQlwbGFjZSA9IGZpbGVbMF07CisJCQkJcGxhY2UgPSBwbGFjZS5z dWJzdHIoMCwgcGxhY2UubGVuZ3RoIC0gdGhpbmdfdG9fZmluZC5sZW5ndGggLSAxKTsKKwkJCQli cmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZm91bmQgJiYgZW52X25hbWUgIT0gbnVsbCkg eworCQllbnYgPSBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oZW52X25hbWUp OworCQllbnYgPSBlbnYuc3BsaXQoIjsiKTsKKwkJZm9yIChpID0gMDsgaSA8IGVudi5sZW5ndGg7 IGkrKykgeworCQkJZmlsZSA9IGdsb2IoZW52W2ldICsgIlxcIiArIHRoaW5nX3RvX2ZpbmQpOwor CQkJaWYgKGZpbGUpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJcGxhY2UgPSB0cnVlOworCQkJ CWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGZvdW5kICYmIHBsYWNlID09IHRydWUpIHsK KwkJU1RET1VULldyaXRlTGluZSgiCTxpbiBkZWZhdWx0IHBhdGg+Iik7CisJfSBlbHNlIGlmIChm b3VuZCkgeworCQlTVERPVVQuV3JpdGVMaW5lKCIJIiArIHBsYWNlKTsKKwl9IGVsc2UgeworCQlT VERPVVQuV3JpdGVMaW5lKCIJPG5vdCBmb3VuZD4iKTsKKwl9CisJcmV0dXJuIHBsYWNlOworfQor CitmdW5jdGlvbiB3b3JkX3dyYXBfYW5kX2luZGVudChpbmRlbnQsIHRleHQsIGxpbmVfc3VmZml4 LCBpbmRlbnRfY2hhcikgeworCisJaWYgKHRleHQgPT0gbnVsbCkgeworCQlyZXR1cm4gIiI7CisJ fQorCisJdmFyIHdvcmRzID0gdGV4dC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIiwgImciKSk7CisJ dmFyIGkgPSAwOworCXZhciByZXRfdGV4dCA9ICIiOworCXZhciB0aGlzX2xpbmUgPSAiIjsKKwl2 YXIgdDsKKwl2YXIgc3BhY2UgPSAiIjsKKwl2YXIgbGluZXMgPSAwOworCisJaWYgKGxpbmVfc3Vm Zml4ID09IG51bGwpIHsKKwkJbGluZV9zdWZmaXggPSAiIjsKKwl9CisKKwlpZiAoaW5kZW50X2No YXIgPT0gbnVsbCkgeworCQlpbmRlbnRfY2hhciA9ICIgIjsKKwl9CisKKwlmb3IgKGkgPSAwOyBp IDwgaW5kZW50OyBpKyspIHsKKwkJc3BhY2UgKz0gaW5kZW50X2NoYXI7CisJfQorCQorCWZvciAo aSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpc19saW5lLmxlbmd0aCkg eworCQkJdCA9IHRoaXNfbGluZSArICIgIiArIHdvcmRzW2ldOworCQl9IGVsc2UgeworCQkJdCA9 IHdvcmRzW2ldOworCQl9CisKKwkJaWYgKHQubGVuZ3RoICsgaW5kZW50ID4gNzgpIHsKKwkJCWlm IChsaW5lcysrKSB7CisJCQkJcmV0X3RleHQgKz0gc3BhY2U7CisJCQl9CisJCQlyZXRfdGV4dCAr PSB0aGlzX2xpbmUgKyBsaW5lX3N1ZmZpeCArICJcclxuIjsKKwkJCXRoaXNfbGluZSA9ICIiOwor CQl9CisKKwkJaWYgKHRoaXNfbGluZS5sZW5ndGgpIHsKKwkJCXRoaXNfbGluZSArPSAiICIgKyB3 b3Jkc1tpXTsKKwkJfSBlbHNlIHsKKwkJCXRoaXNfbGluZSA9IHdvcmRzW2ldOworCQl9CisJfQor CisJaWYgKHRoaXNfbGluZS5sZW5ndGgpIHsKKwkJaWYgKGxpbmVzKQorCQkJcmV0X3RleHQgKz0g c3BhY2U7CisJCXJldF90ZXh0ICs9IHRoaXNfbGluZTsKKwl9CisKKwlyZXR1cm4gcmV0X3RleHQ7 Cit9CisKK2Z1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzKGZpbGVuYW1lKSB7CisKKwl2YXIgZiwg YzsKKworCXRyeSB7CisJCWYgPSBGU08uT3BlblRleHRGaWxlKGZpbGVuYW1lLCAxKTsKKwkJYyA9 IGYuUmVhZEFsbCgpOworCQlmLkNsb3NlKCk7CisJCXJldHVybiBjOworCX0gY2F0Y2ggKGUpIHsK KwkJU1RET1VULldyaXRlTGluZSgiUHJvYmxlbSByZWFkaW5nICIgKyBmaWxlbmFtZSk7CisJCXJl dHVybiBmYWxzZTsKKwl9Cit9CisKK2Z1bmN0aW9uIGdlbmVyYXRlX2ZpbGVzKCkgeworCisJdmFy IGksIGRpciwgYmQsIGxhc3Q7CisKKwlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOworCVNURE9V VC5Xcml0ZUxpbmUoIkNyZWF0aW5nIGJ1aWxkIGRpcnMuLi4iKTsKKwlkaXIgPSBnZXRfZGVmaW5l KCJCVUlMRF9ESVIiKTsKKwlidWlsZF9kaXJzLnNvcnQoKTsKKwlsYXN0ID0gbnVsbDsKKworCWlm ICghRlNPLkZvbGRlckV4aXN0cyhkaXIpKSB7CisJCUZTTy5DcmVhdGVGb2xkZXIoZGlyKTsKKwl9 CisJCisJZm9yIChpID0gMDsgaSA8IGJ1aWxkX2RpcnMubGVuZ3RoOyBpKyspIHsKKwkJYmQgPSBG U08uQnVpbGRQYXRoKGRpciwgYnVpbGRfZGlyc1tpXSk7CisJCWlmIChiZCA9PSBsYXN0KSB7CisJ CQljb250aW51ZTsKKwkJfQorCQlsYXN0ID0gYmQ7CisJCUFERF9GTEFHKCJCVUlMRF9ESVJTX1NV QiIsIGJkKTsKKwkJaWYgKCFGU08uRm9sZGVyRXhpc3RzKGJkKSkgeworCQkJRlNPLkNyZWF0ZUZv bGRlcihiZCk7CisJCX0KKwl9CisKKwlTVERPVVQuV3JpdGVMaW5lKCJHZW5lcmF0aW5nIHNvdXJj ZSBmaWxlcyAtIHRoaXMgbWF5IHRha2UgYSBmZXcgc2Vjb25kcyIpOworCVdTY3JpcHQuU2xlZXAo MzUwMCk7CisJY2hlY2tfZ2VuZXJhdGlvbigpOworCWdlbmVyYXRlX21ha2VmaWxlKCk7CisKKwlT VERPVVQuV3JpdGVMaW5lKCJEb25lLiIpOworCVNURE9VVC5Xcml0ZUJsYW5rTGluZXMoMSk7CisJ U1RET1VULldyaXRlTGluZSgiVHlwZSAnbm1ha2UnIHRvIGJ1aWxkIFBIUC1HVEsiKTsKK30KKwor ZnVuY3Rpb24gZ2VuZXJhdGVfbWFrZWZpbGUoKSB7CisKKwlNRk8uQ2xvc2UoKTsgLy8gTWFrZWZp bGUub2JqZWN0cyBpcyBub3cgY29tcGxldGUKKwl2YXIgTUYgPSBGU08uQ3JlYXRlVGV4dEZpbGUo Ik1ha2VmaWxlIiwgdHJ1ZSk7CisJU1RET1VULldyaXRlTGluZSgiR2VuZXJhdGluZyBNYWtlZmls ZSIpOworCisJTUYuV3JpdGVMaW5lKCIjIEdlbmVyYXRlZCBieSBjb25maWd1cmUuanMiKTsKKwlN Ri5Xcml0ZUJsYW5rTGluZXMoMSk7CisKKwkvKiBzcGl0IG91dCB2YXJpYWJsZSBkZWZpbml0aW9u cyAqLworCXZhciBrZXlzID0gKG5ldyBWQkFycmF5KGNvbmZpZ3VyZV9zdWJzdC5LZXlzKCkpKS50 b0FycmF5KCk7CisJdmFyIGk7CisKKwlmb3IgKGkgaW4ga2V5cykgeworCQkvKiBUaGUgdHJhaWxp bmcgc3BhY2UgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCB0aGF0 IGlzIHBhcnQgb2YKKwkJdGhlIGJ1aWxkIGRpciBmbGFncyAoQ0ZMQUdTX0JEX1hYWCkgZnJvbSBi ZWluZyBzZWVuIGFzIGEgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyICovCisJCU1GLldyaXRl TGluZShrZXlzW2ldICsgIj0iICsgY29uZmlndXJlX3N1YnN0Lkl0ZW0oa2V5c1tpXSkgKyAiICIp OworCX0KKworCU1GLldyaXRlQmxhbmtMaW5lcygxKTsKKwlNRi5Xcml0ZUxpbmUoImFsbDogJChC VUlMRF9ESVIpXFwkKFBIUEdUS0RMTCkiKTsKKwlNRi5Xcml0ZUxpbmUoImJ1aWxkX2RpcnM6ICQo QlVJTERfRElSKSAkKEJVSUxEX0RJUlNfU1VCKSIpOworCU1GLldyaXRlQmxhbmtMaW5lcygxKTsK KworCVRGID0gRlNPLk9wZW5UZXh0RmlsZSgiTWFrZWZpbGUub2JqZWN0cyIsIDEpOworCU1GLldy aXRlKFRGLlJlYWRBbGwoKSk7CisJVEYuQ2xvc2UoKTsKKworCU1GLkNsb3NlKCk7CisKKwlGU08u RGVsZXRlRmlsZSgiTWFrZWZpbGUub2JqZWN0cyIpOworCS8vRlNPLkRlbGV0ZUZpbGUoIndpbjMy XFx0ZW1wLmJhdCIpOworfQorCitmdW5jdGlvbiBjb3B5X2FuZF9zdWJzdChzcmNuYW1lLCBkZXN0 bmFtZSwgc3Vic3RfYXJyYXkpIHsKKworCWlmICghRlNPLkZpbGVFeGlzdHMoc3JjbmFtZSkpIHsK KwkJc3JjbmFtZSA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICJcXCIgKyBzcmNuYW1lOwor CQlkZXN0bmFtZSA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICJcXCIgKyBkZXN0bmFtZTsK Kwl9CisKKwl2YXIgY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNyY25hbWUpOworCXZhciBp OworCisJZm9yIChpID0gMDsgaSA8IHN1YnN0X2FycmF5Lmxlbmd0aDsgaSs9MikgeworCQl2YXIg cmUgPSBzdWJzdF9hcnJheVtpXTsKKwkJdmFyIHJlcCA9IHN1YnN0X2FycmF5W2krMV07CisKKwkJ Y29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZSwgcmVwKTsKKwl9CisKKwl2YXIgZiA9IEZTTy5D cmVhdGVUZXh0RmlsZShkZXN0bmFtZSwgdHJ1ZSk7CisJZi5Xcml0ZShjb250ZW50KTsKKwlmLkNs b3NlKCk7Cit9CisKKy8vIGdsb2IgdXNpbmcgc2ltcGxlIGZpbGVuYW1lIHdpbGRjYXJkczsgcmV0 dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzIGZvdW5kIGluIHRoZSBmaWxlc3lzdGVtCitmdW5jdGlv biBnbG9iKHBhdGhfcGF0dGVybikgeworCisJdmFyIHBhdGhfcGFydHMgPSBwYXRoX3BhdHRlcm4u cmVwbGFjZShuZXcgUmVnRXhwKCIvIiwgImciKSwgIlxcIikuc3BsaXQoIlxcIik7CisJdmFyIHA7 CisJdmFyIGJhc2UgPSAiIjsKKwl2YXIgaXNfcGF0X3JlID0gL1wqLzsKKworCWlmIChGU08uRmls ZUV4aXN0cyhwYXRoX3BhdHRlcm4pKSB7CisJCXJldHVybiBuZXcgQXJyYXkocGF0aF9wYXR0ZXJu KTsKKwl9CisJCisJLy8gZmlyc3QsIGJ1aWxkIGFzIG11Y2ggYXMgcG9zc2libGUgdGhhdCBkb2Vz bid0IGhhdmUgYSBwYXR0ZXJuCisJZm9yIChwID0gMDsgcCA8IHBhdGhfcGFydHMubGVuZ3RoOyBw KyspIHsKKwkJaWYgKHBhdGhfcGFydHNbcF0ubWF0Y2goaXNfcGF0X3JlKSkKKwkJCWJyZWFrOwor CQlpZiAocCkKKwkJCWJhc2UgKz0gIlxcIjsKKwkJYmFzZSArPSBwYXRoX3BhcnRzW3BdOwkKKwl9 CisKKwlyZXR1cm4gX2lubmVyX2dsb2IoYmFzZSwgcCwgcGF0aF9wYXJ0cyk7Cit9CisKK2Z1bmN0 aW9uIF9pbm5lcl9nbG9iKGJhc2UsIHAsIHBhcnRzKSB7CisKKwl2YXIgcGF0ID0gcGFydHNbcF07 CisJdmFyIGZ1bGxfbmFtZSA9IGJhc2UgKyAiXFwiICsgcGF0OworCXZhciByZSA9IG51bGw7CisJ dmFyIGl0ZW1zID0gbnVsbDsKKworCWlmIChwID09IHBhcnRzLmxlbmd0aCkgeworCQlyZXR1cm4g ZmFsc2U7CisJfQorCisJaWYgKEZTTy5GaWxlRXhpc3RzKGZ1bGxfbmFtZSkpIHsKKwkJaWYgKHAg PCBwYXJ0cy5sZW5ndGggLSAxKSB7CisJCQkvLyB3ZSBkaWRuJ3QgcmVhY2ggdGhlIGZ1bGwgZXh0 ZW50IG9mIHRoZSBwYXR0ZXJuCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIG5ldyBB cnJheShmdWxsX25hbWUpOworCX0KKworCWlmIChGU08uRm9sZGVyRXhpc3RzKGZ1bGxfbmFtZSkg JiYgcCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7CisJCS8vIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5k IG9mIHRoZSBwYXR0ZXJuOyBubyBuZWVkIHRvIHJlY3Vyc2UKKwkJcmV0dXJuIG5ldyBBcnJheShm dWxsX25hbWUpOworCX0KKworCS8vIENvbnZlcnQgdGhlIHBhdHRlcm4gaW50byBhIHJlZ2V4cAor CXJlID0gbmV3IFJlZ0V4cCgiXiIgKyBwYXQucmVwbGFjZSgvXC4vZywgJ1xcLicpLnJlcGxhY2Uo L1wqL2csICcuKicpLnJlcGxhY2UoL1w/L2csICcuJykgKyAiJCIsICJpIik7CisKKwlpdGVtcyA9 IG5ldyBBcnJheSgpOworCisJaWYgKCFGU08uRm9sZGVyRXhpc3RzKGJhc2UpKSB7CisJCXJldHVy biBmYWxzZTsKKwl9CisKKwl2YXIgZm9sZGVyID0gRlNPLkdldEZvbGRlcihiYXNlKTsKKwl2YXIg ZmMgPSBudWxsOworCXZhciBzdWJpdGVtcyA9IG51bGw7CisJdmFyIGl0ZW1fbmFtZSA9IG51bGw7 CisJdmFyIGo7CisKKwlmYyA9IG5ldyBFbnVtZXJhdG9yKGZvbGRlci5TdWJGb2xkZXJzKTsKKwlm b3IgKDsgIWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsKKwkJaXRlbV9uYW1lID0gRlNPLkdl dEZpbGVOYW1lKGZjLml0ZW0oKSk7CisKKwkJaWYgKGl0ZW1fbmFtZS5tYXRjaChyZSkpIHsKKwkJ CS8vIGdvdCBhIG1hdGNoOyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwganVz dCBhZGQgdGhlc2UKKwkJCS8vIHRoaW5ncyB0byB0aGUgaXRlbXMgYXJyYXkKKwkJCWlmIChwID09 IHBhcnRzLmxlbmd0aCAtIDEpIHsKKwkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gZmMuaXRlbSgp OworCQkJfSBlbHNlIHsKKwkJCQkvLyB3ZSBzaG91bGQgcmVjdXJzZSBhbmQgZG8gbW9yZSBtYXRj aGVzCisJCQkJc3ViaXRlbXMgPSBfaW5uZXJfZ2xvYihiYXNlICsgIlxcIiArIGl0ZW1fbmFtZSwg cCArIDEsIHBhcnRzKTsKKwkJCQlpZiAoc3ViaXRlbXMpIHsKKwkJCQkJZm9yIChqID0gMDsgaiA8 IHN1Yml0ZW1zLmxlbmd0aDsgaisrKSB7CisJCQkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gc3Vi aXRlbXNbal07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBpZiB3ZSBhcmUg YXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwgd2Ugc2hvdWxkIG1hdGNoIGZpbGVzIHRvbworCWlm IChwID09IHBhcnRzLmxlbmd0aCAtIDEpIHsKKwkJZmMgPSBuZXcgRW51bWVyYXRvcihmb2xkZXIu RmlsZXMpOworCQlmb3IgKDsgIWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsKKwkJCWl0ZW1f bmFtZSA9IEZTTy5HZXRGaWxlTmFtZShmYy5pdGVtKCkpOworCQkJaWYgKGl0ZW1fbmFtZS5tYXRj aChyZSkpIHsKKwkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gZmMuaXRlbSgpOworCQkJfQorCQl9 CisJfQorCisJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1 cm4gaXRlbXM7Cit9CisKKy8qIEVtaXRzIHJ1bGUgdG8gZ2VuZXJhdGUgdmVyc2lvbiBpbmZvIGZv ciBhbiBleHRlbnNpb24uCitSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSAucmVzIGZpbGUgdGhhdCB3 aWxsIGJlIGdlbmVyYXRlZCAqLworZnVuY3Rpb24gZ2VuZXJhdGVfdmVyc2lvbl9pbmZvX3Jlc291 cmNlKG1ha2VmaWxldGFyZ2V0LCBjcmVkaXRzcGF0aCkgeworCisJLy8gbWFrZWZpbGV0YXJnZXQg aXMgcGhwLWd0ay5kbGwKKwkvLyBjcmVkaXRzcGF0aCBpcyBleHRcZ3RrKworCisJdmFyIHJlc25h bWUgPSBtYWtlZmlsZXRhcmdldCArICIucmVzIjsKKwl2YXIgcmVzX2Rlc2MgPSAiUEhQLUdUSyBT Y3JpcHQgSW50ZXJwcmV0ZXIiOworCXZhciByZXNfcHJvZF9uYW1lID0gIlBIUC1HVEsiOworCXZh ciBjcmVkaXRzOworCXZhciB0aGFua3MgPSAiVGhhbmtzIHRvIEFuZHJlaSBabWlldnNraSI7CisJ dmFyIGxvZ28gPSAiIjsKKworCWlmIChGU08uRmlsZUV4aXN0cyhjcmVkaXRzcGF0aCArICcvQ1JF RElUUycpKSB7CisJCWNyZWRpdHMgPSBGU08uT3BlblRleHRGaWxlKGNyZWRpdHNwYXRoICsgJy9D UkVESVRTJywgMSk7CisJCXJlc19kZXNjID0gY3JlZGl0cy5SZWFkTGluZSgpOworCQl0cnkgewor CQkJdGhhbmtzID0gY3JlZGl0cy5SZWFkTGluZSgpOworCQl9IGNhdGNoIChlKSB7CisJCQl0aGFu a3MgPSBudWxsOworCQl9CisJCWlmICh0aGFua3MgPT0gbnVsbCkgeworCQkJdGhhbmtzID0gIiI7 CisJCX0gZWxzZSB7CisJCQl0aGFua3MgPSAiVGhhbmtzIHRvICIgKyB0aGFua3M7CisJCX0KKwkJ Y3JlZGl0cy5DbG9zZSgpOworCX0KKworCU1GTy5Xcml0ZUxpbmUoIlBIUEdUS0RMTF9SRVM9JChC VUlMRF9ESVIpXFwkKFBIUEdUS0RMTCkucmVzIik7CisJTUZPLldyaXRlQmxhbmtMaW5lcygxKTsK KworCWlmIChtYWtlZmlsZXRhcmdldC5tYXRjaChuZXcgUmVnRXhwKCJcXC5leGUkIikpKSB7CisJ CWxvZ28gPSAiIC9EIFdBTlRfTE9HTyI7CisJfQorCQorCU1GTy5Xcml0ZUxpbmUoIiQoUEhQR1RL RExMX1JFUyk6IHdpbjMyXFx0ZW1wbGF0ZS5yYyIpOworCU1GTy5Xcml0ZUxpbmUoIlx0JChSQykg L2ZvICQoUEhQR1RLRExMX1JFUykiICsgbG9nbyArICcgL0QgRklMRV9ERVNDUklQVElPTj0iXFwi JyArIHJlc19kZXNjICsgJ1xcIiIgL0QgRklMRV9OQU1FPSJcXCIkKFBIUEdUS0RMTClcXCIiIC9E IFBST0RVQ1RfTkFNRT0iXFwiJyArIHJlc19wcm9kX25hbWUgKyAnXFwiIiAvRCBUSEFOS1NfR1VZ Uz0iXFwiJyArIHRoYW5rcyArICdcXCIiIHdpbjMyXFx0ZW1wbGF0ZS5yYycpOworCU1GTy5Xcml0 ZUJsYW5rTGluZXMoMSk7CisJCisJcmV0dXJuIHJlc25hbWU7Cit9CisKKy8qIGV4ZWN1dGUgYSBj b21tYW5kIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmluZyAqLworZnVuY3Rpb24gZXhl Y3V0ZShjb21tYW5kX2xpbmUpIHsKKwl2YXIgZSA9IFdzaFNoZWxsLkV4ZWMoY29tbWFuZF9saW5l KTsKKwl2YXIgcmV0ID0gIiI7CisKKwlyZXQgPSBlLlN0ZE91dC5SZWFkQWxsKCk7CisKKwlyZXR1 cm4gcmV0OworfQorCisvLyBXaGljaCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciBkbyB3ZSBoYXZl PworZnVuY3Rpb24gcHJvYmVfbXN2Y19jb21waWxlcl92ZXJzaW9uKENMKSB7CisKKwkvLyB0cmlj a3kgZXNjYXBlcyB0byBnZXQgc3RkZXJyIHJlZGlyZWN0aW9uIHRvIHdvcmsKKwl2YXIgYmFubmVy ID0gZXhlY3V0ZSgnY21kIC9jICIiJyArIENMICsgJyIgMj4mMSInKTsKKworCWlmIChiYW5uZXIu bWF0Y2goLyhcZCspXC4oXGQrKVwuKFxkKykoXC4oXGQrKSk/LykpIHsKKwkJcmV0dXJuIFJlZ0V4 cC4kMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8vIFBva2UgYXJvdW5kIGZvciBzb21lIGhlYWRl cnMKK2Z1bmN0aW9uIHByb2JlX2Jhc2ljX2hlYWRlcnMoKQoreworCXZhciBwOworCisJaWYgKFBI UF9HVEtfUEhQX0JVSUxEICE9ICJubyIpIHsKKwkJcGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHMg Kz0gIjsiICsgUEhQX0dUS19QSFBfQlVJTEQgKyAiXFxpbmNsdWRlIjsKKwkJcGhwX3VzdWFsX2xp Yl9zdXNwZWN0cyArPSAiOyIgKyBQSFBfR1RLX1BIUF9CVUlMRCArICJcXGxpYiI7CisJfQorCisJ Ly8gaGFjayB0byBjYXRjaCBjb21tb24gbG9jYXRpb24gb2YgbGlicworCWlmICh0eXBlb2YocCkg PT0gInN0cmluZyIpIHsKKwkJcCA9IHAucmVwbGFjZShuZXcgUmVnRXhwKCJpbmNsdWRlJCIpLCAi bGliIik7CisJCUFERF9GTEFHKCJMREZMQUdTIiwgJy9saWJwYXRoOiInICsgcCArICciICcpOwor CQlwaHBfdXN1YWxfbGliX3N1c3BlY3RzICs9ICI7IiArIHA7CisJfQorfQorCisvKiBub24tZnVu Y3Rpb25zICovCisKK2lmICghRlNPLkZpbGVFeGlzdHMoImJ1aWxkY29uZi5iYXQiKSkgeworCVNU REVSUi5Xcml0ZUxpbmUoIk11c3QgYmUgcnVuIGZyb20gdGhlIHJvb3Qgb2YgdGhlIFBIUC1HVEsg c291cmNlIik7CisJV1NjcmlwdC5RdWl0KDEwKTsKK30= --d3048ba218c2fc8b349b9b852af27b48caac49fd--