From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lucas Meneghel Rodrigues Subject: Re: [KVM-AUTOTEST PATCH v4] KVM test: A memory efficient kvm_config implementation Date: Wed, 03 Mar 2010 11:44:36 -0300 Message-ID: <1267627476.2565.2.camel@localhost.localdomain> References: <1267551059-24189-1-git-send-email-mgoldish@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: autotest@test.kernel.org, kvm@vger.kernel.org To: Michael Goldish Return-path: In-Reply-To: <1267551059-24189-1-git-send-email-mgoldish@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: autotest-bounces@test.kernel.org Errors-To: autotest-bounces@test.kernel.org List-Id: kvm.vger.kernel.org T24gVHVlLCAyMDEwLTAzLTAyIGF0IDE5OjMwICswMjAwLCBNaWNoYWVsIEdvbGRpc2ggd3JvdGU6 Cj4gVGhpcyBwYXRjaDoKPiAKPiAtIE1ha2VzIGt2bV9jb25maWcgdXNlIGxlc3MgbWVtb3J5IGR1 cmluZyBwYXJzaW5nLCBieSBzdG9yaW5nIGNvbmZpZyBkYXRhCj4gICBjb21wYWN0bHkgaW4gYXJy YXlzIGR1cmluZyBwYXJzaW5nLCBhbmQgZ2VuZXJhdGluZyB0aGUgZmluYWwgZGljdHMgb25seSB3 aGVuCj4gICByZXF1ZXN0ZWQuCj4gICBPbiBteSBtYWNoaW5lIHRoaXMgcmVzdWx0cyBpbiA1LTEw IHRpbWVzIGxlc3MgbWVtb3J5IGJlaW5nIHVzZWQgKGRlcGVuZGluZyBvbgo+ICAgdGhlIHNpemUg b2YgdGhlIGZpbmFsIGdlbmVyYXRlZCBsaXN0KS4KPiAgIFRoaXMgYWxsb3dzIHRoZSB0ZXN0IGNv bmZpZ3VyYXRpb24gdG8ga2VlcCBleHBhbmRpbmcgd2l0aG91dCBoYXZpbmcgdGhlCj4gICBwYXJz ZXIgcnVuIG91dCBvZiBtZW1vcnkuCj4gCj4gLSBBZGRzIGNvbmZpZy5mb3JrX2FuZF9wYXJzZSgp LCBhIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgY29uZmlnIGZpbGUvc3RyaW5nIGluCj4gICBhIGZv cmtlZCBwcm9jZXNzIGFuZCB0aGVuIHRlcm1pbmF0ZXMgdGhlIHByb2Nlc3MuICBUaGlzIHdvcmtz IGFyb3VuZCBQeXRob24ncwo+ICAgcG9saWN5IG9mIGtlZXBpbmcgYWxsb2NhdGVkIG1lbW9yeSB0 byBpdHNlbGYgZXZlbiBhZnRlciB0aGUgb2JqZWN0cyBvY2N1cHlpbmcKPiAgIHRoZSBtZW1vcnkg aGF2ZSBiZWVuIGRlc3Ryb3llZC4gIElmIHRoZSBwcm9jZXNzIHRoYXQgZG9lcyB0aGUgcGFyc2lu ZyBpcyB0aGUKPiAgIHNhbWUgb25lIHRoYXQgcnVucyB0aGUgdGVzdHMsIGxlc3MgbWVtb3J5IHdp bGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBWTXMgZHVyaW5nCj4gICB0ZXN0aW5nLgo+IAo+IC0gTWFr ZXMgcGFyc2luZyA0LTUgdGltZXMgZmFzdGVyIGFzIGEgcmVzdWx0IG9mIHRoZSBuZXcgaW50ZXJu YWwgcmVwcmVzZW50YXRpb24uCj4gCj4gT3ZlcmFsbCwga3ZtX2NvbmZpZydzIG1lbW9yeSB1c2Fn ZSBzaG91bGQgbm93IGJlIG5lZ2xpZ2libGUgaW4gbW9zdCBjYXNlcy4KPiAKPiBDaGFuZ2VzIGZy b20gdjM6Cj4gLSBVc2UgdGhlIGhvbWVtYWRlICdjb25maWdyZWFkZXInIGNsYXNzIGluc3RlYWQg b2YgcmVndWxhciBmaWxlcyBpbiBwYXJzZSgpCj4gICBhbmQgcGFyc2VfdmFyaWFudHMoKSAocmVh ZGxpbmUoKSBhbmQvb3Igc2VlaygpIGFyZSB2ZXJ5IHNsb3cpLgo+IC0gVXNlIGEgcmVnZXggY2Fj aGUgZGljdCAocmVnZXhfY2FjaGUpLgo+IC0gVXNlIGEgc3RyaW5nIGNhY2hlIGRpY3QgaW4gYWRk aXRpb24gdG8gdGhlIGxpc3QgKG9iamVjdF9jYWNoZV9pbmRpY2VzKS4KPiAtIFNvbWUgY2hhbmdl cyB0byBmb3JrX2FuZF9wYXJzZSgpIChkaXNhYmxlIGJ1ZmZlcmluZykuCj4gCj4gQ2hhbmdlcyBm cm9tIHYyOgo+IC0gTWVyZ2VkIF9nZXRfbmV4dF9saW5lKCkgYW5kIF9nZXRfbmV4dF9saW5lX2lu ZGVudCgpLgo+IC0gTWFkZSBfYXJyYXlfZ2V0X25hbWUoKSBmYXN0ZXIuCj4gCj4gQ2hhbmdlcyBm cm9tIHYxOgo+IC0gQWRkZWQgY29uZmlnLmdldF9nZW5lcmF0b3IoKSB3aGljaCBpcyBzaW1pbGFy IHRvIGdldF9saXN0KCkgYnV0IHJldHVybnMgYQo+ICAgZGljdCBnZW5lcmF0b3IgaW5zdGVhZCBv ZiBhIGxpc3QuICBUaGlzIHNob3VsZCBzYXZlIHNvbWUgbW9yZSBtZW1vcnkgYW5kIHdpbGwKPiAg IG1ha2UgdGVzdHMgc3RhcnQgc29vbmVyLgo+IC0gVXNlIGdldF9nZW5lcmF0b3IoKSBpbiBjb250 cm9sLgo+IC0gQ2FsbCB3YWl0cGlkKCkgYXQgdGhlIGVuZCBvZiBmb3JrX2FuZF9wYXJzZSgpLgoK QXMgdGhlIGdlbmVyYXRlZCBwYXRjaCBpcyBraW5kYSBmcmFnbWVudGVkIGZvciBwb3N0aW5nIGNv bW1lbnRzIGlubGluZSwKSSBhbSBnb2luZyB0byB0aHJvdyBqdXN0IGEgYmxvY2sgb2YgbWlub3Ig Y29tbWVudHMgYWZ0ZXIgSSBoYXZlIHJldmlld2VkCnRoZSBjb2RlOgoKT2JzZXJ2YXRpb25zOgoK KiBXaGVuIGEgZmlsZSBpcyBtaXNzaW5nLCBpdCdzIG1vcmUgYXBwcm9wcmlhdGUgdG8gcmFpc2Ug YSBJT0Vycm9yIHRoYW4KYW4gRXhjZXB0aW9uLCBzbyB3ZSBtdXN0IGNoYW5nZSB0aGF0LiBBbHNv LCBpdCdzIGltcG9ydGFudCB0byBmb2xsb3cgdGhlCmNvZGluZyBzdGFuZGFyZHMgZm9yIHJhaXNp bmcgZXhjZXB0aW9ucy4K4oCiIEkgd2FzIHdvbmRlcmluZyB3aGV0aGVyIG1ha2UgZm9ya19hbmRf cGFyc2UgYSBwdWJsaWMgaW50ZXJmYWNlIGZvciB0aGUKY29uZmlnIG9iamVjdCB3YXMgdGhlIHJp Z2h0IGRlY2lzaW9uLCBtYXliZSBhbGwgY2FsbHMgdG8gcGFyc2VfZmlsZQpzaG91bGQgYmUgZG9u ZSBpbiBhIGZvcmtfYW5kX3BhcnNlIGZhc2hpb24/IEkgZ3Vlc3MgSSBnb3QgeW91ciBwb2ludCBp bgptYWtpbmcgaXQgYSBwdWJsaWMgaW50ZXJmYWNlIGFuZCBzZXBhcmF0ZSBpdCBmcm9tIHBhcnNl X2ZpbGUsIGJ1dCBpc24ndAp0aGF0IGtpbmRhIGNvbmZ1c2luZyBmb3IgdGhlIHVzZXJzIChJIG1l YW4sIHBlb3BsZSB3cml0aW5nIGNvbnRyb2wgZmlsZXMKZm9yIGt2bSBhdXRvdGVzdCk/CuKAoiBB Ym91dCBidWZmZXJpbmcgb24gZm9ya19hbmRfcGFyc2U6IFRoZSBwZXJmb3JtYW5jZSBwZW5hbHRp ZXMgaW4KZGlzYWJsaW5nIGJ1ZmZlcmluZyB2YXJpZXMsIHdpdGggY2FjaGVzIGRyb3BwZWQgaXQg d2FzIHNvbWV0aGluZyBsaWtlCjMtNSUsIGFmdGVyICd3YXJtaW5nIHVwJyBpdCB3YXMgc29tZXRo aW5nIGxpa2UgOC0xMSUsIHNvIGl0J3Mgc21hbGwKc3R1ZmYuIEJ1dCB3ZSBjYW4gZmF2b3VyIHNw ZWVkIGluIHRoaXMgY2FzZSBzbyB0aGUgZmluYWwgdmVyc2lvbiB3b24ndApkaXNhYmxlIGJ1ZmZl cmluZy4KCkNvbXBsaW1lbnRzOgoK4oCiIFRoZSBjb25maWdyZWFkZXIgY2xhc3Mgd2FzIGEgdmVy eSBpbnRlcmVzdGluZyBtb3ZlLCBzaW1wbGUsIGNsZWFuIGFuZApmYXN0LiBDb25ncmF0cyEK4oCi IFRoZSBvdXRwdXQgb2YgdGhlIGNvbmZpZyBzeXN0ZW0gaXMgZ29vZCBmb3IgZGVidWdnaW5nIHB1 cnBvc2VzLCBzbwp3ZSdsbCBzdGljayB3aXRoIGl0LgrigKIgVGhhbmsgeW91IHZlcnkgbXVjaCBm b3IgeW91ciB3b3JrLCBub3cgd2UgaGF2ZSBmYXN0ZXIgcGFyc2luZywgdGhhdApjb25zdW1lcyBh IGxvdCBsZXNzIG1lbW9yeSwgc28gc21hbGxlciBib3hlcyB3aWxsIGJlbmVmaXQgYSAqbG90KiBm cm9tCnRoYXQuCgpXaGF0IEkgYW0gZ29pbmcgdG8gZG86CgrigKIgSSB3aWxsIHJlLXNlbmQgdGhl IHZlcnNpb24gd2l0aCB0aGUgdGlueSBjaGFuZ2VzIEkgbWFkZSBzbyBpdCBnZXRzCnJlY29yZGVk IG9uIHBhdGNod29yaywgYW5kIHNvb24gYWZ0ZXIgSSdsbCBhcHBseSBpdCB1cHN0cmVhbS4gSSB0 aGluawpmcm9tIHRoaXMgcG9pbnQgb24gd2UgbWlnaHQgaGF2ZSBvbmx5IG1pbm9yIHR3ZWFrcyB0 byBtYWtlLgoKPiAKPiBTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIEdvbGRpc2ggPG1nb2xkaXNoQHJl ZGhhdC5jb20+Cj4gLS0tCj4gIGNsaWVudC90ZXN0cy9rdm0vY29udHJvbCAgICAgICAgICB8ICAg MzAgKy0KPiAgY2xpZW50L3Rlc3RzL2t2bS9jb250cm9sLnBhcmFsbGVsIHwgICAyMSArLQo+ICBj bGllbnQvdGVzdHMva3ZtL2t2bV9jb25maWcucHkgICAgfCAgODMyICsrKysrKysrKysrKysrKysr KysrKystLS0tLS0tLS0tLS0tLS0KPiAgMyBmaWxlcyBjaGFuZ2VkLCA1MzUgaW5zZXJ0aW9ucygr KSwgMzQ4IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9jbGllbnQvdGVzdHMva3ZtL2Nv bnRyb2wgYi9jbGllbnQvdGVzdHMva3ZtL2NvbnRyb2wKPiBpbmRleCAxNjMyODZlLi4xNWM0NTM5 IDEwMDY0NAo+IC0tLSBhL2NsaWVudC90ZXN0cy9rdm0vY29udHJvbAo+ICsrKyBiL2NsaWVudC90 ZXN0cy9rdm0vY29udHJvbAo+IEBAIC0zMCwzNCArMzAsMzggQEAgaW1wb3J0IGt2bV91dGlscywg a3ZtX2NvbmZpZwo+ICAjIHNldCBFbmdsaXNoIGVudmlyb25tZW50IChjb21tYW5kIG91dHB1dCBt aWdodCBiZSBsb2NhbGl6ZWQsIG5lZWQgdG8gYmUgc2FmZSkKPiAgb3MuZW52aXJvblsnTEFORydd ID0gJ2VuX1VTLlVURi04Jwo+ICAKPiAtYnVpbGRfY2ZnX3BhdGggPSBvcy5wYXRoLmpvaW4oa3Zt X3Rlc3RfZGlyLCAiYnVpbGQuY2ZnIikKPiAtYnVpbGRfY2ZnID0ga3ZtX2NvbmZpZy5jb25maWco YnVpbGRfY2ZnX3BhdGgpCj4gLSMgTWFrZSBhbnkgZGVzaXJlZCBjaGFuZ2VzIHRvIHRoZSBidWls ZCBjb25maWd1cmF0aW9uIGhlcmUuIEZvciBleGFtcGxlOgo+IC0jYnVpbGRfY2ZnLnBhcnNlX3N0 cmluZygiIiIKPiArc3RyID0gIiIiCj4gKyMgVGhpcyBzdHJpbmcgd2lsbCBiZSBwYXJzZWQgYWZ0 ZXIgYnVpbGQuY2ZnLiAgTWFrZSBhbnkgZGVzaXJlZCBjaGFuZ2VzIHRvIHRoZQo+ICsjIGJ1aWxk IGNvbmZpZ3VyYXRpb24gaGVyZS4gIEZvciBleGFtcGxlOgo+ICAjcmVsZWFzZV90YWcgPSA4NAo+ IC0jIiIiKQo+IC1pZiBub3Qga3ZtX3V0aWxzLnJ1bl90ZXN0cyhidWlsZF9jZmcuZ2V0X2xpc3Qo KSwgam9iKToKPiArIiIiCj4gK2J1aWxkX2NmZyA9IGt2bV9jb25maWcuY29uZmlnKCkKPiArYnVp bGRfY2ZnX3BhdGggPSBvcy5wYXRoLmpvaW4oa3ZtX3Rlc3RfZGlyLCAiYnVpbGQuY2ZnIikKPiAr YnVpbGRfY2ZnLmZvcmtfYW5kX3BhcnNlKGJ1aWxkX2NmZ19wYXRoLCBzdHIpCj4gK2lmIG5vdCBr dm1fdXRpbHMucnVuX3Rlc3RzKGJ1aWxkX2NmZy5nZXRfZ2VuZXJhdG9yKCksIGpvYik6Cj4gICAg ICBsb2dnaW5nLmVycm9yKCJLVk0gYnVpbGQgc3RlcCBmYWlsZWQsIGV4aXRpbmcuIikKPiAgICAg IHN5cy5leGl0KDEpCj4gIAo+IC10ZXN0c19jZmdfcGF0aCA9IG9zLnBhdGguam9pbihrdm1fdGVz dF9kaXIsICJ0ZXN0cy5jZmciKQo+IC10ZXN0c19jZmcgPSBrdm1fY29uZmlnLmNvbmZpZyh0ZXN0 c19jZmdfcGF0aCkKPiAtIyBNYWtlIGFueSBkZXNpcmVkIGNoYW5nZXMgdG8gdGhlIHRlc3QgY29u ZmlndXJhdGlvbiBoZXJlLiBGb3IgZXhhbXBsZToKPiAtI3Rlc3RzX2NmZy5wYXJzZV9zdHJpbmco IiIiCj4gK3N0ciA9ICIiIgo+ICsjIFRoaXMgc3RyaW5nIHdpbGwgYmUgcGFyc2VkIGFmdGVyIHRl c3RzLmNmZy4gIE1ha2UgYW55IGRlc2lyZWQgY2hhbmdlcyB0byB0aGUKPiArIyB0ZXN0IGNvbmZp Z3VyYXRpb24gaGVyZS4gIEZvciBleGFtcGxlOgo+ICAjZGlzcGxheSA9IHNkbAo+ICAjaW5zdGFs bHxzZXR1cDogdGltZW91dF9tdWx0aXBsaWVyID0gMwo+IC0jIiIiKQo+ICsiIiIKPiArdGVzdHNf Y2ZnID0ga3ZtX2NvbmZpZy5jb25maWcoKQo+ICt0ZXN0c19jZmdfcGF0aCA9IG9zLnBhdGguam9p bihrdm1fdGVzdF9kaXIsICJ0ZXN0cy5jZmciKQo+ICt0ZXN0c19jZmcuZm9ya19hbmRfcGFyc2Uo dGVzdHNfY2ZnX3BhdGgsIHN0cikKPiAgCj4gIHBvb2xzX2NmZ19wYXRoID0gb3MucGF0aC5qb2lu KGt2bV90ZXN0X2RpciwgImFkZHJlc3NfcG9vbHMuY2ZnIikKPiAgdGVzdHNfY2ZnLnBhcnNlX2Zp bGUocG9vbHNfY2ZnX3BhdGgpCj4gIGhvc3RuYW1lID0gb3MudW5hbWUoKVsxXS5zcGxpdCgiLiIp WzBdCj4gLWlmIHRlc3RzX2NmZy5maWx0ZXIoIl4iICsgaG9zdG5hbWUpOgo+ICtpZiB0ZXN0c19j ZmcuY291bnQoIl4iICsgaG9zdG5hbWUpOgo+ICAgICAgdGVzdHNfY2ZnLnBhcnNlX3N0cmluZygi b25seSBeJXMiICUgaG9zdG5hbWUpCj4gIGVsc2U6Cj4gICAgICB0ZXN0c19jZmcucGFyc2Vfc3Ry aW5nKCJvbmx5IF5kZWZhdWx0X2hvc3QiKQo+ICAKPiAgIyBSdW4gdGhlIHRlc3RzCj4gLWt2bV91 dGlscy5ydW5fdGVzdHModGVzdHNfY2ZnLmdldF9saXN0KCksIGpvYikKPiAra3ZtX3V0aWxzLnJ1 bl90ZXN0cyh0ZXN0c19jZmcuZ2V0X2dlbmVyYXRvcigpLCBqb2IpCj4gIAo+ICAjIEdlbmVyYXRl IGEgbmljZSBIVE1MIHJlcG9ydCBpbnNpZGUgdGhlIGpvYidzIHJlc3VsdHMgZGlyCj4gIGt2bV91 dGlscy5jcmVhdGVfcmVwb3J0KGt2bV90ZXN0X2Rpciwgam9iLnJlc3VsdGRpcikKPiBkaWZmIC0t Z2l0IGEvY2xpZW50L3Rlc3RzL2t2bS9jb250cm9sLnBhcmFsbGVsIGIvY2xpZW50L3Rlc3RzL2t2 bS9jb250cm9sLnBhcmFsbGVsCj4gaW5kZXggMzQzZjY5NC4uMDdiYzZlNSAxMDA2NDQKPiAtLS0g YS9jbGllbnQvdGVzdHMva3ZtL2NvbnRyb2wucGFyYWxsZWwKPiArKysgYi9jbGllbnQvdGVzdHMv a3ZtL2NvbnRyb2wucGFyYWxsZWwKPiBAQCAtMTYwLDE5ICsxNjAsMjIgQEAgaWYgbm90IHBhcmFt cy5nZXQoIm1vZGUiKSA9PSAibm9pbnN0YWxsIjoKPiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gIGltcG9ydCBrdm1fY29uZmln Cj4gIAo+IC1maWxlbmFtZSA9IG9zLnBhdGguam9pbihwd2QsICJrdm1fdGVzdHMuY2ZnIikKPiAt Y2ZnID0ga3ZtX2NvbmZpZy5jb25maWcoZmlsZW5hbWUpCj4gLQo+IC0jIElmIGRlc2lyYWJsZSwg bWFrZSBjaGFuZ2VzIHRvIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb24gaGVyZS4gIEZvciBleGFtcGxl Ogo+IC0jIGNmZy5wYXJzZV9zdHJpbmcoImluc3RhbGx8c2V0dXA6IHRpbWVvdXRfbXVsdGlwbGll ciA9IDIiKQo+IC0jIGNmZy5wYXJzZV9zdHJpbmcoIm9ubHkgZmM4X3F1aWNrIikKPiAtIyBjZmcu cGFyc2Vfc3RyaW5nKCJkaXNwbGF5ID0gc2RsIikKPiArc3RyID0gIiIiCj4gKyMgVGhpcyBzdHJp bmcgd2lsbCBiZSBwYXJzZWQgYWZ0ZXIgdGVzdHMuY2ZnLiAgTWFrZSBhbnkgZGVzaXJlZCBjaGFu Z2VzIHRvIHRoZQo+ICsjIHRlc3QgY29uZmlndXJhdGlvbiBoZXJlLiAgRm9yIGV4YW1wbGU6Cj4g KyNpbnN0YWxsfHNldHVwOiB0aW1lb3V0X211bHRpcGxpZXIgPSAzCj4gKyNvbmx5IGZjOF9xdWlj awo+ICsjZGlzcGxheSA9IHNkbAo+ICsiIiIKPiArY2ZnID0ga3ZtX2NvbmZpZy5jb25maWcoKQo+ ICtmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwd2QsICJ0ZXN0cy5jZmciKQo+ICtjZmcuZm9ya19h bmRfcGFyc2UoZmlsZW5hbWUsIHN0cikKPiAgCj4gLWZpbGVuYW1lID0gb3MucGF0aC5qb2luKHB3 ZCwgImt2bV9hZGRyZXNzX3Bvb2xzLmNmZyIpCj4gK2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHB3 ZCwgImFkZHJlc3NfcG9vbHMuY2ZnIikKPiAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgo+ ICAgICAgY2ZnLnBhcnNlX2ZpbGUoZmlsZW5hbWUpCj4gICAgICBob3N0bmFtZSA9IG9zLnVuYW1l KClbMV0uc3BsaXQoIi4iKVswXQo+IC0gICAgaWYgY2ZnLmZpbHRlcigiXiIgKyBob3N0bmFtZSk6 Cj4gKyAgICBpZiBjZmcuY291bnQoIl4iICsgaG9zdG5hbWUpOgo+ICAgICAgICAgIGNmZy5wYXJz ZV9zdHJpbmcoIm9ubHkgXiVzIiAlIGhvc3RuYW1lKQo+ICAgICAgZWxzZToKPiAgICAgICAgICBj ZmcucGFyc2Vfc3RyaW5nKCJvbmx5IF5kZWZhdWx0X2hvc3QiKQo+IGRpZmYgLS1naXQgYS9jbGll bnQvdGVzdHMva3ZtL2t2bV9jb25maWcucHkgYi9jbGllbnQvdGVzdHMva3ZtL2t2bV9jb25maWcu cHkKPiBpbmRleCA3OThlZjU2Li43ZmYyOGU0IDEwMDc1NQo+IC0tLSBhL2NsaWVudC90ZXN0cy9r dm0va3ZtX2NvbmZpZy5weQo+ICsrKyBiL2NsaWVudC90ZXN0cy9rdm0va3ZtX2NvbmZpZy5weQo+ IEBAIC0yLDEwICsyLDEwIEBACj4gICIiIgo+ICBLVk0gY29uZmlndXJhdGlvbiBmaWxlIHV0aWxp dHkgZnVuY3Rpb25zLgo+ICAKPiAtQGNvcHlyaWdodDogUmVkIEhhdCAyMDA4LTIwMDkKPiArQGNv cHlyaWdodDogUmVkIEhhdCAyMDA4LTIwMTAKPiAgIiIiCj4gIAo+IC1pbXBvcnQgbG9nZ2luZywg cmUsIG9zLCBzeXMsIFN0cmluZ0lPLCBvcHRwYXJzZQo+ICtpbXBvcnQgbG9nZ2luZywgcmUsIG9z LCBzeXMsIG9wdHBhcnNlLCBhcnJheSwgdHJhY2ViYWNrLCBjUGlja2xlCj4gIGltcG9ydCBjb21t b24KPiAgZnJvbSBhdXRvdGVzdF9saWIuY2xpZW50LmNvbW1vbl9saWIgaW1wb3J0IGVycm9yCj4g IGZyb20gYXV0b3Rlc3RfbGliLmNsaWVudC5jb21tb25fbGliIGltcG9ydCBsb2dnaW5nX2NvbmZp ZywgbG9nZ2luZ19tYW5hZ2VyCj4gQEAgLTIxLDQ5MCArMjEsNjcwIEBAIGNsYXNzIGNvbmZpZzoK PiAgICAgICIiIgo+ICAgICAgUGFyc2UgYW4gaW5wdXQgZmlsZSBvciBzdHJpbmcgdGhhdCBmb2xs b3dzIHRoZSBLVk0gVGVzdCBDb25maWcgRmlsZSBmb3JtYXQKPiAgICAgIGFuZCBnZW5lcmF0ZSBh IGxpc3Qgb2YgZGljdHMgdGhhdCB3aWxsIGJlIGxhdGVyIHVzZWQgYXMgY29uZmlndXJhdGlvbgo+ IC0gICAgcGFyYW1ldGVycyBieSB0aGUgdGhlIEtWTSB0ZXN0cy4KPiArICAgIHBhcmFtZXRlcnMg YnkgdGhlIEtWTSB0ZXN0cy4KPiAgCj4gICAgICBAc2VlOiBodHRwOi8vd3d3LmxpbnV4LWt2bS5v cmcvcGFnZS9LVk0tQXV0b3Rlc3QvVGVzdF9Db25maWdfRmlsZQo+ICAgICAgIiIiCj4gIAo+IC0g ICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGRlYnVnPUZhbHNlKToKPiArICAg IGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZT1Ob25lLCBkZWJ1Zz1UcnVlKToKPiAgICAgICAg ICAiIiIKPiAtICAgICAgICBJbml0aWFsaXplIHRoZSBsaXN0IGFuZCBvcHRpb25hbGx5IHBhcnNl IGZpbGVuYW1lLgo+ICsgICAgICAgIEluaXRpYWxpemUgdGhlIGxpc3QgYW5kIG9wdGlvbmFsbHkg cGFyc2UgYSBmaWxlLgo+ICAKPiAgICAgICAgICBAcGFyYW0gZmlsZW5hbWU6IFBhdGggb2YgdGhl IGZpbGUgdGhhdCB3aWxsIGJlIHRha2VuLgo+IC0gICAgICAgIEBwYXJhbSBkZWJ1ZzogV2hldGhl ciB0byB0dXJuIGRlYnVnZ2luZyBvdXRwdXQuCj4gKyAgICAgICAgQHBhcmFtIGRlYnVnOiBXaGV0 aGVyIHRvIHR1cm4gb24gZGVidWdnaW5nIG91dHB1dC4KPiAgICAgICAgICAiIiIKPiAtICAgICAg ICBzZWxmLmxpc3QgPSBbeyJuYW1lIjogIiIsICJzaG9ydG5hbWUiOiAiIiwgImRlcGVuZCI6IFtd fV0KPiAtICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKPiArICAgICAgICBzZWxmLmxpc3QgPSBb YXJyYXkuYXJyYXkoIkgiLCBbNCwgNCwgNCwgNF0pXQo+ICsgICAgICAgIHNlbGYub2JqZWN0X2Nh Y2hlID0gW10KPiArICAgICAgICBzZWxmLm9iamVjdF9jYWNoZV9pbmRpY2VzID0ge30KPiArICAg ICAgICBzZWxmLnJlZ2V4X2NhY2hlID0ge30KPiAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmls ZW5hbWUKPiArICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKPiAgICAgICAgICBpZiBmaWxlbmFt ZToKPiAgICAgICAgICAgICAgc2VsZi5wYXJzZV9maWxlKGZpbGVuYW1lKQo+ICAKPiAKPiAgICAg IGRlZiBwYXJzZV9maWxlKHNlbGYsIGZpbGVuYW1lKToKPiAgICAgICAgICAiIiIKPiAtICAgICAg ICBQYXJzZSBmaWxlbmFtZSwgcmV0dXJuIHRoZSByZXN1bHRpbmcgbGlzdCBhbmQgc3RvcmUgaXQg aW4gLmxpc3QuIElmCj4gLSAgICAgICAgZmlsZW5hbWUgZG9lcyBub3QgZXhpc3QsIHJhaXNlIGFu IGV4Y2VwdGlvbi4KPiArICAgICAgICBQYXJzZSBmaWxlLiAgSWYgaXQgZG9lc24ndCBleGlzdCwg cmFpc2UgYW4gZXhjZXB0aW9uLgo+ICAKPiAgICAgICAgICBAcGFyYW0gZmlsZW5hbWU6IFBhdGgg b2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KPiAgICAgICAgICAiIiIKPiAgICAgICAgICBpZiBu b3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgo+ICAgICAgICAgICAgICByYWlzZSBFeGNlcHRp b24sICJGaWxlICVzIG5vdCBmb3VuZCIgJSBmaWxlbmFtZQo+ICAgICAgICAgIHNlbGYuZmlsZW5h bWUgPSBmaWxlbmFtZQo+IC0gICAgICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lLCAiciIpCj4gLSAg ICAgICAgc2VsZi5saXN0ID0gc2VsZi5wYXJzZShmaWxlLCBzZWxmLmxpc3QpCj4gLSAgICAgICAg ZmlsZS5jbG9zZSgpCj4gLSAgICAgICAgcmV0dXJuIHNlbGYubGlzdAo+ICsgICAgICAgIHN0ciA9 IG9wZW4oZmlsZW5hbWUpLnJlYWQoKQo+ICsgICAgICAgIHNlbGYubGlzdCA9IHNlbGYucGFyc2Uo Y29uZmlncmVhZGVyKHN0ciksIHNlbGYubGlzdCkKPiAgCj4gCj4gICAgICBkZWYgcGFyc2Vfc3Ry aW5nKHNlbGYsIHN0cik6Cj4gICAgICAgICAgIiIiCj4gLSAgICAgICAgUGFyc2UgYSBzdHJpbmcs IHJldHVybiB0aGUgcmVzdWx0aW5nIGxpc3QgYW5kIHN0b3JlIGl0IGluIC5saXN0Lgo+ICsgICAg ICAgIFBhcnNlIGEgc3RyaW5nLgo+ICAKPiAtICAgICAgICBAcGFyYW0gc3RyOiBTdHJpbmcgdGhh dCB3aWxsIGJlIHBhcnNlZC4KPiArICAgICAgICBAcGFyYW0gc3RyOiBTdHJpbmcgdG8gcGFyc2Uu Cj4gICAgICAgICAgIiIiCj4gLSAgICAgICAgZmlsZSA9IFN0cmluZ0lPLlN0cmluZ0lPKHN0cikK PiAtICAgICAgICBzZWxmLmxpc3QgPSBzZWxmLnBhcnNlKGZpbGUsIHNlbGYubGlzdCkKPiAtICAg ICAgICBmaWxlLmNsb3NlKCkKPiAtICAgICAgICByZXR1cm4gc2VsZi5saXN0Cj4gKyAgICAgICAg c2VsZi5saXN0ID0gc2VsZi5wYXJzZShjb25maWdyZWFkZXIoc3RyKSwgc2VsZi5saXN0KQo+ICAK PiAKPiAtICAgIGRlZiBnZXRfbGlzdChzZWxmKToKPiAtICAgICAgICAiIiIKPiAtICAgICAgICBS ZXR1cm4gdGhlIGxpc3Qgb2YgZGljdGlvbmFyaWVzLiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBj YWxsZWQgYWZ0ZXIKPiAtICAgICAgICBwYXJzaW5nIHNvbWV0aGluZy4KPiArICAgIGRlZiBmb3Jr X2FuZF9wYXJzZShzZWxmLCBmaWxlbmFtZT1Ob25lLCBzdHI9Tm9uZSk6Cj4gICAgICAgICAgIiIi Cj4gLSAgICAgICAgcmV0dXJuIHNlbGYubGlzdAo+ICsgICAgICAgIFBhcnNlIGEgZmlsZSBhbmQv b3IgYSBzdHJpbmcgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIHRvIHNhdmUgbWVtb3J5Lgo+ICAKPiAr ICAgICAgICBQeXRob24gbGlrZXMgdG8ga2VlcCBtZW1vcnkgdG8gaXRzZWxmIGV2ZW4gYWZ0ZXIg dGhlIG9iamVjdHMgb2NjdXB5aW5nCj4gKyAgICAgICAgaXQgaGF2ZSBiZWVuIGRlc3Ryb3llZC4g IElmIGR1cmluZyBhIGNhbGwgdG8gcGFyc2VfZmlsZSgpIG9yCj4gKyAgICAgICAgcGFyc2Vfc3Ry aW5nKCkgYSBsb3Qgb2YgbWVtb3J5IGlzIHVzZWQsIGl0IGNhbiBvbmx5IGJlIGZyZWVkIGJ5Cj4g KyAgICAgICAgdGVybWluYXRpbmcgdGhlIHByb2Nlc3MuICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFy b3VuZCB0aGUgcHJvYmxlbSBieQo+ICsgICAgICAgIGRvaW5nIHRoZSBwYXJzaW5nIGluIGEgZm9y a2VkIHByb2Nlc3MgYW5kIHRoZW4gdGVybWluYXRpbmcgaXQsIGZyZWVpbmcKPiArICAgICAgICBh bnkgdW5uZWVkZWQgbWVtb3J5Lgo+ICAKPiAtICAgIGRlZiBtYXRjaChzZWxmLCBmaWx0ZXIsIGRp Y3QpOgo+IC0gICAgICAgICIiIgo+IC0gICAgICAgIFJldHVybiBUcnVlIGlmIGRpY3QgbWF0Y2hl cyBmaWx0ZXIuCj4gKyAgICAgICAgTm90ZTogaWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJp bmcgcGFyc2luZywgaXRzIGluZm9ybWF0aW9uIHdpbGwgYmUKPiArICAgICAgICBwcmludGVkLCBh bmQgdGhlIHJlc3VsdGluZyBsaXN0IHdpbGwgYmUgZW1wdHkuICBUaGUgZXhjZXB0aW9uIHdpbGwg bm90Cj4gKyAgICAgICAgYmUgcmFpc2VkIGluIHRoZSBwcm9jZXNzIGNhbGxpbmcgdGhpcyBmdW5j dGlvbi4KPiAgCj4gLSAgICAgICAgQHBhcmFtIGZpbHRlcjogQSByZWd1bGFyIGV4cHJlc3Npb24g dGhhdCBkZWZpbmVzIHRoZSBmaWx0ZXIuCj4gLSAgICAgICAgQHBhcmFtIGRpY3Q6IERpY3Rpb25h cnkgdGhhdCB3aWxsIGJlIGluc3BlY3RlZC4KPiArICAgICAgICBAcGFyYW0gZmlsZW5hbWU6IFBh dGggb2YgZmlsZSB0byBwYXJzZSAob3B0aW9uYWwpLgo+ICsgICAgICAgIEBwYXJhbSBzdHI6IFN0 cmluZyB0byBwYXJzZSAob3B0aW9uYWwpLgo+ICAgICAgICAgICIiIgo+IC0gICAgICAgIGZpbHRl ciA9IHJlLmNvbXBpbGUociIoXC58XikoJXMpKFwufCQpIiAlIGZpbHRlcikKPiAtICAgICAgICBy ZXR1cm4gYm9vbChmaWx0ZXIuc2VhcmNoKGRpY3RbIm5hbWUiXSkpCj4gLQo+IC0KPiAtICAgIGRl ZiBmaWx0ZXIoc2VsZiwgZmlsdGVyLCBsaXN0PU5vbmUpOgo+ICsgICAgICAgIHIsIHcgPSBvcy5w aXBlKCkKPiArICAgICAgICByLCB3ID0gb3MuZmRvcGVuKHIsICJyIiwgMCksIG9zLmZkb3Blbih3 LCAidyIsIDApCj4gKyAgICAgICAgcGlkID0gb3MuZm9yaygpCj4gKyAgICAgICAgaWYgbm90IHBp ZDoKPiArICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzCj4gKyAgICAgICAgICAgIHIuY2xvc2Uo KQo+ICsgICAgICAgICAgICB0cnk6Cj4gKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZToKPiAr ICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlX2ZpbGUoZmlsZW5hbWUpCj4gKyAgICAgICAg ICAgICAgICBpZiBzdHI6Cj4gKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZV9zdHJpbmco c3RyKQo+ICsgICAgICAgICAgICBleGNlcHQ6Cj4gKyAgICAgICAgICAgICAgICB0cmFjZWJhY2su cHJpbnRfZXhjKCkKPiArICAgICAgICAgICAgICAgIHNlbGYubGlzdCA9IFtdCj4gKyAgICAgICAg ICAgICMgQ29udmVydCB0aGUgYXJyYXlzIHRvIHN0cmluZ3MgYmVmb3JlIHBpY2tsaW5nIGJlY2F1 c2UgYXQgbGVhc3QKPiArICAgICAgICAgICAgIyBzb21lIFB5dGhvbiB2ZXJzaW9ucyBjYW4ndCBw aWNrbGUvdW5waWNrbGUgYXJyYXlzCj4gKyAgICAgICAgICAgIGwgPSBbYS50b3N0cmluZygpIGZv ciBhIGluIHNlbGYubGlzdF0KPiArICAgICAgICAgICAgY1BpY2tsZS5kdW1wKChsLCBzZWxmLm9i amVjdF9jYWNoZSksIHcsIC0xKQo+ICsgICAgICAgICAgICB3LmNsb3NlKCkKPiArICAgICAgICAg ICAgb3MuX2V4aXQoMCkKPiArICAgICAgICBlbHNlOgo+ICsgICAgICAgICAgICAjIFBhcmVudCBw cm9jZXNzCj4gKyAgICAgICAgICAgIHcuY2xvc2UoKQo+ICsgICAgICAgICAgICAobCwgc2VsZi5v YmplY3RfY2FjaGUpID0gY1BpY2tsZS5sb2FkKHIpCj4gKyAgICAgICAgICAgIHIuY2xvc2UoKQo+ ICsgICAgICAgICAgICBvcy53YWl0cGlkKHBpZCwgMCkKPiArICAgICAgICAgICAgc2VsZi5saXN0 ID0gW10KPiArICAgICAgICAgICAgZm9yIHMgaW4gbDoKPiArICAgICAgICAgICAgICAgIGEgPSBh cnJheS5hcnJheSgiSCIpCj4gKyAgICAgICAgICAgICAgICBhLmZyb21zdHJpbmcocykKPiArICAg ICAgICAgICAgICAgIHNlbGYubGlzdC5hcHBlbmQoYSkKPiArCj4gKwo+ICsgICAgZGVmIGdldF9n ZW5lcmF0b3Ioc2VsZik6Cj4gICAgICAgICAgIiIiCj4gLSAgICAgICAgRmlsdGVyIGEgbGlzdCBv ZiBkaWN0cy4KPiArICAgICAgICBHZW5lcmF0ZSBkaWN0aW9uYXJpZXMgZnJvbSB0aGUgY29kZSBw YXJzZWQgc28gZmFyLiAgVGhpcyBzaG91bGQKPiArICAgICAgICBwcm9iYWJseSBiZSBjYWxsZWQg YWZ0ZXIgcGFyc2luZyBzb21ldGhpbmcuCj4gIAo+IC0gICAgICAgIEBwYXJhbSBmaWx0ZXI6IEEg cmVndWxhciBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgZmlsdGVyLgo+IC0gICAg ICAgIEBwYXJhbSBsaXN0OiBBIGxpc3Qgb2YgZGljdGlvbmFyaWVzIHRoYXQgd2lsbCBiZSBmaWx0 ZXJlZC4KPiArICAgICAgICBAcmV0dXJuOiBBIGRpY3QgZ2VuZXJhdG9yLgo+ICAgICAgICAgICIi Igo+IC0gICAgICAgIGlmIGxpc3QgaXMgTm9uZToKPiAtICAgICAgICAgICAgbGlzdCA9IHNlbGYu bGlzdAo+IC0gICAgICAgIHJldHVybiBbZGljdCBmb3IgZGljdCBpbiBsaXN0IGlmIHNlbGYubWF0 Y2goZmlsdGVyLCBkaWN0KV0KPiArICAgICAgICBmb3IgYSBpbiBzZWxmLmxpc3Q6Cj4gKyAgICAg ICAgICAgIG5hbWUsIHNob3J0bmFtZSwgZGVwZW5kLCBjb250ZW50ID0gX2FycmF5X2dldF9hbGwo YSwgc2VsZi5vYmplY3RfY2FjaGUpCj4gKyAgICAgICAgICAgIGRpY3QgPSB7Im5hbWUiOiBuYW1l LCAic2hvcnRuYW1lIjogc2hvcnRuYW1lLCAiZGVwZW5kIjogZGVwZW5kfQo+ICsgICAgICAgICAg ICBzZWxmLl9hcHBseV9jb250ZW50X3RvX2RpY3QoZGljdCwgY29udGVudCkKPiArICAgICAgICAg ICAgeWllbGQgZGljdAo+ICAKPiAKPiAtICAgIGRlZiBzcGxpdF9hbmRfc3RyaXAoc2VsZiwgc3Ry LCBzZXA9Ij0iKToKPiArICAgIGRlZiBnZXRfbGlzdChzZWxmKToKPiAgICAgICAgICAiIiIKPiAt ICAgICAgICBTcGxpdCBzdHIgYW5kIHN0cmlwIHF1b3RlcyBmcm9tIHRoZSByZXN1bHRpbmcgcGFy dHMuCj4gKyAgICAgICAgR2VuZXJhdGUgYSBsaXN0IG9mIGRpY3Rpb25hcmllcyBmcm9tIHRoZSBj b2RlIHBhcnNlZCBzbyBmYXIuCj4gKyAgICAgICAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgY2Fs bGVkIGFmdGVyIHBhcnNpbmcgc29tZXRoaW5nLgo+ICAKPiAtICAgICAgICBAcGFyYW0gc3RyOiBT dHJpbmcgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZAo+IC0gICAgICAgIEBwYXJhbSBzZXA6IFNlcGFy YXRvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBzcGxpdCB0aGUgc3RyaW5nCj4gKyAgICAgICAgQHJl dHVybjogQSBsaXN0IG9mIGRpY3RzLgo+ICAgICAgICAgICIiIgo+IC0gICAgICAgIHRlbXAgPSBz dHIuc3BsaXQoc2VwLCAxKQo+IC0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbih0ZW1wKSk6Cj4g LSAgICAgICAgICAgIHRlbXBbaV0gPSB0ZW1wW2ldLnN0cmlwKCkKPiAtICAgICAgICAgICAgaWYg cmUuZmluZGFsbCgiXlwiLipcIiQiLCB0ZW1wW2ldKToKPiAtICAgICAgICAgICAgICAgIHRlbXBb aV0gPSB0ZW1wW2ldLnN0cmlwKCJcIiIpCj4gLSAgICAgICAgICAgIGVsaWYgcmUuZmluZGFsbCgi XlwnLipcJyQiLCB0ZW1wW2ldKToKPiAtICAgICAgICAgICAgICAgIHRlbXBbaV0gPSB0ZW1wW2ld LnN0cmlwKCJcJyIpCj4gLSAgICAgICAgcmV0dXJuIHRlbXAKPiAtCj4gKyAgICAgICAgcmV0dXJu IGxpc3Qoc2VsZi5nZXRfZ2VuZXJhdG9yKCkpCj4gIAo+IC0gICAgZGVmIGdldF9uZXh0X2xpbmUo c2VsZiwgZmlsZSk6Cj4gLSAgICAgICAgIiIiCj4gLSAgICAgICAgR2V0IHRoZSBuZXh0IG5vbi1l bXB0eSwgbm9uLWNvbW1lbnQgbGluZSBpbiBhIGZpbGUgbGlrZSBvYmplY3QuCj4gIAo+IC0gICAg ICAgIEBwYXJhbSBmaWxlOiBGaWxlIGxpa2Ugb2JqZWN0Cj4gLSAgICAgICAgQHJldHVybjogSWYg bm8gbGluZSBpcyBhdmFpbGFibGUsIHJldHVybiBOb25lLgo+ICsgICAgZGVmIGNvdW50KHNlbGYs IGZpbHRlcj0iLioiKToKPiAgICAgICAgICAiIiIKPiAtICAgICAgICB3aGlsZSBUcnVlOgo+IC0g ICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCj4gLSAgICAgICAgICAgIGlmIGxpbmUg PT0gIiI6IHJldHVybiBOb25lCj4gLSAgICAgICAgICAgIHN0cmlwcGVkX2xpbmUgPSBsaW5lLnN0 cmlwKCkKPiAtICAgICAgICAgICAgaWYgbGVuKHN0cmlwcGVkX2xpbmUpID4gMCBcCj4gLSAgICAg ICAgICAgICAgICAgICAgYW5kIG5vdCBzdHJpcHBlZF9saW5lLnN0YXJ0c3dpdGgoJyMnKSBcCj4g LSAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBzdHJpcHBlZF9saW5lLnN0YXJ0c3dpdGgoJy8v Jyk6Cj4gLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZQo+IC0KPiArICAgICAgICBSZXR1cm4g dGhlIG51bWJlciBvZiBkaWN0aW9uYXJpZXMgd2hvc2UgbmFtZXMgbWF0Y2ggZmlsdGVyLgo+ICAK PiAtICAgIGRlZiBnZXRfbmV4dF9saW5lX2luZGVudChzZWxmLCBmaWxlKToKPiArICAgICAgICBA cGFyYW0gZmlsdGVyOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcuCj4gICAgICAgICAgIiIi Cj4gLSAgICAgICAgUmV0dXJuIHRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhlIG5leHQgbm9uLWVtcHR5 LCBub24tY29tbWVudCBsaW5lIGluIGZpbGUuCj4gLQo+IC0gICAgICAgIEBwYXJhbSBmaWxlOiBG aWxlIGxpa2Ugb2JqZWN0Lgo+IC0gICAgICAgIEByZXR1cm46IElmIG5vIGxpbmUgaXMgYXZhaWxh YmxlLCByZXR1cm4gLTEuCj4gLSAgICAgICAgIiIiCj4gLSAgICAgICAgcG9zID0gZmlsZS50ZWxs KCkKPiAtICAgICAgICBsaW5lID0gc2VsZi5nZXRfbmV4dF9saW5lKGZpbGUpCj4gLSAgICAgICAg aWYgbm90IGxpbmU6Cj4gLSAgICAgICAgICAgIGZpbGUuc2Vlayhwb3MpCj4gLSAgICAgICAgICAg IHJldHVybiAtMQo+IC0gICAgICAgIGxpbmUgPSBsaW5lLmV4cGFuZHRhYnMoKQo+IC0gICAgICAg IGluZGVudCA9IDAKPiAtICAgICAgICB3aGlsZSBsaW5lW2luZGVudF0gPT0gJyAnOgo+IC0gICAg ICAgICAgICBpbmRlbnQgKz0gMQo+IC0gICAgICAgIGZpbGUuc2Vlayhwb3MpCj4gLSAgICAgICAg cmV0dXJuIGluZGVudAo+IC0KPiAtCj4gLSAgICBkZWYgYWRkX25hbWUoc2VsZiwgc3RyLCBuYW1l LCBhcHBlbmQ9RmFsc2UpOgo+IC0gICAgICAgICIiIgo+IC0gICAgICAgIEFkZCBuYW1lIHRvIHN0 ciB3aXRoIGEgc2VwYXJhdG9yIGRvdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCj4gLQo+IC0gICAg ICAgIEBwYXJhbSBzdHI6IFN0cmluZyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkCj4gLSAgICAgICAg QHBhcmFtIG5hbWU6IG5hbWUgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBzdHJpbmcuCj4g LSAgICAgICAgQHJldHVybjogSWYgYXBwZW5kIGlzIFRydWUsIGFwcGVuZCBuYW1lIHRvIHN0ci4K PiAtICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgcHJlLXBlbmQgbmFtZSB0byBzdHIuCj4gLSAg ICAgICAgIiIiCj4gLSAgICAgICAgaWYgc3RyID09ICIiOgo+IC0gICAgICAgICAgICByZXR1cm4g bmFtZQo+IC0gICAgICAgICMgQXBwZW5kPwo+IC0gICAgICAgIGVsaWYgYXBwZW5kOgo+IC0gICAg ICAgICAgICByZXR1cm4gc3RyICsgIi4iICsgbmFtZQo+IC0gICAgICAgICMgUHJlcGVuZD8KPiAt ICAgICAgICBlbHNlOgo+IC0gICAgICAgICAgICByZXR1cm4gbmFtZSArICIuIiArIHN0cgo+ICsg ICAgICAgIGV4cCA9IHNlbGYuX2dldF9maWx0ZXJfcmVnZXgoZmlsdGVyKQo+ICsgICAgICAgIGNv dW50ID0gMAo+ICsgICAgICAgIGZvciBhIGluIHNlbGYubGlzdDoKPiArICAgICAgICAgICAgbmFt ZSA9IF9hcnJheV9nZXRfbmFtZShhLCBzZWxmLm9iamVjdF9jYWNoZSkKPiArICAgICAgICAgICAg aWYgZXhwLnNlYXJjaChuYW1lKToKPiArICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKPiArICAg ICAgICByZXR1cm4gY291bnQKPiAgCj4gCj4gLSAgICBkZWYgcGFyc2VfdmFyaWFudHMoc2VsZiwg ZmlsZSwgbGlzdCwgc3VidmFyaWFudHM9RmFsc2UsIHByZXZfaW5kZW50PS0xKToKPiArICAgIGRl ZiBwYXJzZV92YXJpYW50cyhzZWxmLCBjciwgbGlzdCwgc3VidmFyaWFudHM9RmFsc2UsIHByZXZf aW5kZW50PS0xKToKPiAgICAgICAgICAiIiIKPiAtICAgICAgICBSZWFkIGFuZCBwYXJzZSBsaW5l cyBmcm9tIGZpbGUgbGlrZSBvYmplY3QgdW50aWwgYSBsaW5lIHdpdGggYW4gaW5kZW50Cj4gLSAg ICAgICAgbGV2ZWwgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBwcmV2X2luZGVudCBpcyBlbmNvdW50 ZXJlZC4KPiArICAgICAgICBSZWFkIGFuZCBwYXJzZSBsaW5lcyBmcm9tIGEgY29uZmlncmVhZGVy IG9iamVjdCB1bnRpbCBhIGxpbmUgd2l0aCBhbgo+ICsgICAgICAgIGluZGVudCBsZXZlbCBsb3dl ciB0aGFuIG9yIGVxdWFsIHRvIHByZXZfaW5kZW50IGlzIGVuY291bnRlcmVkLgo+ICAKPiAtICAg ICAgICBAYnJpZWY6IFBhcnNlIGEgJ3ZhcmlhbnRzJyBvciAnc3VidmFyaWFudHMnIGJsb2NrIGZy b20gYSBmaWxlLWxpa2UKPiAtICAgICAgICBvYmplY3QuCj4gLSAgICAgICAgQHBhcmFtIGZpbGU6 IEZpbGUtbGlrZSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhcnNlZAo+IC0gICAgICAgIEBwYXJhbSBs aXN0OiBMaXN0IG9mIGRpY3RzIHRvIG9wZXJhdGUgb24KPiArICAgICAgICBAYnJpZWY6IFBhcnNl IGEgJ3ZhcmlhbnRzJyBvciAnc3VidmFyaWFudHMnIGJsb2NrIGZyb20gYSBjb25maWdyZWFkZXIK PiArICAgICAgICAgICAgb2JqZWN0Lgo+ICsgICAgICAgIEBwYXJhbSBjcjogY29uZmlncmVhZGVy IG9iamVjdCB0byBiZSBwYXJzZWQuCj4gKyAgICAgICAgQHBhcmFtIGxpc3Q6IExpc3Qgb2YgYXJy YXlzIHRvIG9wZXJhdGUgb24uCj4gICAgICAgICAgQHBhcmFtIHN1YnZhcmlhbnRzOiBJZiBUcnVl LCBwYXJzZSBpbiAnc3VidmFyaWFudHMnIG1vZGU7Cj4gLSAgICAgICAgb3RoZXJ3aXNlIHBhcnNl IGluICd2YXJpYW50cycgbW9kZQo+IC0gICAgICAgIEBwYXJhbSBwcmV2X2luZGVudDogVGhlIGlu ZGVudCBsZXZlbCBvZiB0aGUgInBhcmVudCIgYmxvY2sKPiAtICAgICAgICBAcmV0dXJuOiBUaGUg cmVzdWx0aW5nIGxpc3Qgb2YgZGljdHMuCj4gKyAgICAgICAgICAgIG90aGVyd2lzZSBwYXJzZSBp biAndmFyaWFudHMnIG1vZGUuCj4gKyAgICAgICAgQHBhcmFtIHByZXZfaW5kZW50OiBUaGUgaW5k ZW50IGxldmVsIG9mIHRoZSAicGFyZW50IiBibG9jay4KPiArICAgICAgICBAcmV0dXJuOiBUaGUg cmVzdWx0aW5nIGxpc3Qgb2YgYXJyYXlzLgo+ICAgICAgICAgICIiIgo+ICAgICAgICAgIG5ld19s aXN0ID0gW10KPiAgCj4gICAgICAgICAgd2hpbGUgVHJ1ZToKPiAtICAgICAgICAgICAgaW5kZW50 ID0gc2VsZi5nZXRfbmV4dF9saW5lX2luZGVudChmaWxlKQo+ICsgICAgICAgICAgICBwb3MgPSBj ci50ZWxsKCkKPiArICAgICAgICAgICAgKGluZGVudGVkX2xpbmUsIGxpbmUsIGluZGVudCkgPSBj ci5nZXRfbmV4dF9saW5lKCkKPiAgICAgICAgICAgICAgaWYgaW5kZW50IDw9IHByZXZfaW5kZW50 Ogo+ICsgICAgICAgICAgICAgICAgY3Iuc2Vlayhwb3MpCj4gICAgICAgICAgICAgICAgICBicmVh awo+IC0gICAgICAgICAgICBpbmRlbnRlZF9saW5lID0gc2VsZi5nZXRfbmV4dF9saW5lKGZpbGUp LnJzdHJpcCgpCj4gLSAgICAgICAgICAgIGxpbmUgPSBpbmRlbnRlZF9saW5lLnN0cmlwKCkKPiAg Cj4gICAgICAgICAgICAgICMgR2V0IG5hbWUgYW5kIGRlcGVuZGVuY2llcwo+IC0gICAgICAgICAg ICB0ZW1wID0gbGluZS5zdHJpcCgiLSAiKS5zcGxpdCgiOiIpCj4gLSAgICAgICAgICAgIG5hbWUg PSB0ZW1wWzBdCj4gLSAgICAgICAgICAgIGlmIGxlbih0ZW1wKSA9PSAxOgo+IC0gICAgICAgICAg ICAgICAgZGVwX2xpc3QgPSBbXQo+IC0gICAgICAgICAgICBlbHNlOgo+IC0gICAgICAgICAgICAg ICAgZGVwX2xpc3QgPSB0ZW1wWzFdLnNwbGl0KCkKPiArICAgICAgICAgICAgKG5hbWUsIGRlcGVu ZCkgPSBtYXAoc3RyLnN0cmlwLCBsaW5lLmxzdHJpcCgiLSAiKS5zcGxpdCgiOiIpKQo+ICAKPiAg ICAgICAgICAgICAgIyBTZWUgaWYgbmFtZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlICdzaG9ydG5h bWUnIGZpZWxkCj4gLSAgICAgICAgICAgIGFkZF90b19zaG9ydG5hbWUgPSBUcnVlCj4gLSAgICAg ICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiQCIpOgo+IC0gICAgICAgICAgICAgICAgbmFtZSA9 IG5hbWUuc3RyaXAoIkAiKQo+IC0gICAgICAgICAgICAgICAgYWRkX3RvX3Nob3J0bmFtZSA9IEZh bHNlCj4gLQo+IC0gICAgICAgICAgICAjIE1ha2UgYSBkZWVwIGNvcHkgb2YgbGlzdAo+IC0gICAg ICAgICAgICB0ZW1wX2xpc3QgPSBbXQo+IC0gICAgICAgICAgICBmb3IgZGljdCBpbiBsaXN0Ogo+ IC0gICAgICAgICAgICAgICAgbmV3X2RpY3QgPSBkaWN0LmNvcHkoKQo+IC0gICAgICAgICAgICAg ICAgbmV3X2RpY3RbImRlcGVuZCJdID0gZGljdFsiZGVwZW5kIl1bOl0KPiAtICAgICAgICAgICAg ICAgIHRlbXBfbGlzdC5hcHBlbmQobmV3X2RpY3QpCj4gKyAgICAgICAgICAgIGFkZF90b19zaG9y dG5hbWUgPSBub3QgbmFtZS5zdGFydHN3aXRoKCJAIikKPiArICAgICAgICAgICAgbmFtZSA9IG5h bWUubHN0cmlwKCJAIikKPiArCj4gKyAgICAgICAgICAgICMgU3RvcmUgbmFtZSBhbmQgZGVwZW5k ZW5jaWVzIGluIGNhY2hlIGFuZCBnZXQgdGhlaXIgaW5kaWNlcwo+ICsgICAgICAgICAgICBuID0g c2VsZi5fc3RvcmVfc3RyKG5hbWUpCj4gKyAgICAgICAgICAgIGQgPSBzZWxmLl9zdG9yZV9zdHIo ZGVwZW5kKQo+ICsKPiArICAgICAgICAgICAgIyBNYWtlIGEgY29weSBvZiBsaXN0Cj4gKyAgICAg ICAgICAgIHRlbXBfbGlzdCA9IFthWzpdIGZvciBhIGluIGxpc3RdCj4gIAo+ICAgICAgICAgICAg ICBpZiBzdWJ2YXJpYW50czoKPiAgICAgICAgICAgICAgICAgICMgSWYgd2UncmUgcGFyc2luZyAn c3VidmFyaWFudHMnLCBmaXJzdCBtb2RpZnkgdGhlIGxpc3QKPiAtICAgICAgICAgICAgICAgIHNl bGYuX19tb2RpZnlfbGlzdF9zdWJ2YXJpYW50cyh0ZW1wX2xpc3QsIG5hbWUsIGRlcF9saXN0LAo+ IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90b19z aG9ydG5hbWUpCj4gLSAgICAgICAgICAgICAgICB0ZW1wX2xpc3QgPSBzZWxmLnBhcnNlKGZpbGUs IHRlbXBfbGlzdCwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZD1UcnVlLCBw cmV2X2luZGVudD1pbmRlbnQpCj4gKyAgICAgICAgICAgICAgICBpZiBhZGRfdG9fc2hvcnRuYW1l Ogo+ICsgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIHRlbXBfbGlzdDoKPiArICAgICAgICAg ICAgICAgICAgICAgICAgX2FycmF5X2FwcGVuZF90b19uYW1lX3Nob3J0bmFtZV9kZXBlbmQoYSwg biwgZCkKPiArICAgICAgICAgICAgICAgIGVsc2U6Cj4gKyAgICAgICAgICAgICAgICAgICAgZm9y IGEgaW4gdGVtcF9saXN0Ogo+ICsgICAgICAgICAgICAgICAgICAgICAgICBfYXJyYXlfYXBwZW5k X3RvX25hbWVfZGVwZW5kKGEsIG4sIGQpCj4gKyAgICAgICAgICAgICAgICB0ZW1wX2xpc3QgPSBz ZWxmLnBhcnNlKGNyLCB0ZW1wX2xpc3QsIHJlc3RyaWN0ZWQ9VHJ1ZSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9pbmRlbnQ9aW5kZW50KQo+ICAgICAgICAg ICAgICBlbHNlOgo+ICAgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBwYXJzaW5nICd2YXJpYW50 cycsIHBhcnNlIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGxpc3QKPiAgICAgICAgICAgICAgICAgIGlm IHNlbGYuZGVidWc6Cj4gLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RlYnVnX3ByaW50KGlu ZGVudGVkX2xpbmUsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJF bnRlcmluZyB2YXJpYW50ICclcycgIgo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAiKHZhcmlhbnQgaW5oZXJpdHMgJWQgZGljdHMpIiAlCj4gLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBsZW4obGlzdCkpKQo+IC0gICAgICAgICAg ICAgICAgdGVtcF9saXN0ID0gc2VsZi5wYXJzZShmaWxlLCB0ZW1wX2xpc3QsCj4gLSAgICAgICAg ICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWQ9RmFsc2UsIHByZXZfaW5kZW50PWluZGVudCkKPiAt ICAgICAgICAgICAgICAgIHNlbGYuX19tb2RpZnlfbGlzdF92YXJpYW50cyh0ZW1wX2xpc3QsIG5h bWUsIGRlcF9saXN0LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGFkZF90b19zaG9ydG5hbWUpCj4gKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnX3ByaW50 KGluZGVudGVkX2xpbmUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRl cmluZyB2YXJpYW50ICclcycgIgo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi KHZhcmlhbnQgaW5oZXJpdHMgJWQgZGljdHMpIiAlCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChuYW1lLCBsZW4obGlzdCkpKQo+ICsgICAgICAgICAgICAgICAgdGVtcF9saXN0 ID0gc2VsZi5wYXJzZShjciwgdGVtcF9saXN0LCByZXN0cmljdGVkPUZhbHNlLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2luZGVudD1pbmRlbnQpCj4gKyAg ICAgICAgICAgICAgICBpZiBhZGRfdG9fc2hvcnRuYW1lOgo+ICsgICAgICAgICAgICAgICAgICAg IGZvciBhIGluIHRlbXBfbGlzdDoKPiArICAgICAgICAgICAgICAgICAgICAgICAgX2FycmF5X3By ZXBlbmRfdG9fbmFtZV9zaG9ydG5hbWVfZGVwZW5kKGEsIG4sIGQpCj4gKyAgICAgICAgICAgICAg ICBlbHNlOgo+ICsgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIHRlbXBfbGlzdDoKPiArICAg ICAgICAgICAgICAgICAgICAgICAgX2FycmF5X3ByZXBlbmRfdG9fbmFtZV9kZXBlbmQoYSwgbiwg ZCkKPiAgCj4gICAgICAgICAgICAgIG5ld19saXN0ICs9IHRlbXBfbGlzdAo+ICAKPiAgICAgICAg ICByZXR1cm4gbmV3X2xpc3QKPiAgCj4gCj4gLSAgICBkZWYgcGFyc2Uoc2VsZiwgZmlsZSwgbGlz dCwgcmVzdHJpY3RlZD1GYWxzZSwgcHJldl9pbmRlbnQ9LTEpOgo+ICsgICAgZGVmIHBhcnNlKHNl bGYsIGNyLCBsaXN0LCByZXN0cmljdGVkPUZhbHNlLCBwcmV2X2luZGVudD0tMSk6Cj4gICAgICAg ICAgIiIiCj4gLSAgICAgICAgUmVhZCBhbmQgcGFyc2UgbGluZXMgZnJvbSBmaWxlIHVudGlsIGEg bGluZSB3aXRoIGFuIGluZGVudCBsZXZlbCBsb3dlcgo+IC0gICAgICAgIHRoYW4gb3IgZXF1YWwg dG8gcHJldl9pbmRlbnQgaXMgZW5jb3VudGVyZWQuCj4gLQo+IC0gICAgICAgIEBicmllZjogUGFy c2UgYSBmaWxlLWxpa2Ugb2JqZWN0Lgo+IC0gICAgICAgIEBwYXJhbSBmaWxlOiBBIGZpbGUtbGlr ZSBvYmplY3QKPiAtICAgICAgICBAcGFyYW0gbGlzdDogQSBsaXN0IG9mIGRpY3RzIHRvIG9wZXJh dGUgb24gKGxpc3QgaXMgbW9kaWZpZWQgaW4KPiAtICAgICAgICBwbGFjZSBhbmQgc2hvdWxkIG5v dCBiZSB1c2VkIGFmdGVyIHRoZSBjYWxsKQo+IC0gICAgICAgIEBwYXJhbSByZXN0cmljdGVkOiBp ZiBUcnVlLCBvcGVyYXRlIGluIHJlc3RyaWN0ZWQgbW9kZQo+IC0gICAgICAgIChwcm9oaWJpdCAn dmFyaWFudHMnKQo+IC0gICAgICAgIEBwYXJhbSBwcmV2X2luZGVudDogdGhlIGluZGVudCBsZXZl bCBvZiB0aGUgInBhcmVudCIgYmxvY2sKPiAtICAgICAgICBAcmV0dXJuOiBSZXR1cm4gdGhlIHJl c3VsdGluZyBsaXN0IG9mIGRpY3RzLgo+ICsgICAgICAgIFJlYWQgYW5kIHBhcnNlIGxpbmVzIGZy b20gYSBjb25maWdyZWFkZXIgb2JqZWN0IHVudGlsIGEgbGluZSB3aXRoIGFuCj4gKyAgICAgICAg aW5kZW50IGxldmVsIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gcHJldl9pbmRlbnQgaXMgZW5jb3Vu dGVyZWQuCj4gKwo+ICsgICAgICAgIEBicmllZjogUGFyc2UgYSBjb25maWdyZWFkZXIgb2JqZWN0 Lgo+ICsgICAgICAgIEBwYXJhbSBjcjogQSBjb25maWdyZWFkZXIgb2JqZWN0Lgo+ICsgICAgICAg IEBwYXJhbSBsaXN0OiBBIGxpc3Qgb2YgYXJyYXlzIHRvIG9wZXJhdGUgb24gKGxpc3QgaXMgbW9k aWZpZWQgaW4KPiArICAgICAgICAgICAgcGxhY2UgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhZnRl ciB0aGUgY2FsbCkuCj4gKyAgICAgICAgQHBhcmFtIHJlc3RyaWN0ZWQ6IElmIFRydWUsIG9wZXJh dGUgaW4gcmVzdHJpY3RlZCBtb2RlCj4gKyAgICAgICAgICAgIChwcm9oaWJpdCAndmFyaWFudHMn KS4KPiArICAgICAgICBAcGFyYW0gcHJldl9pbmRlbnQ6IFRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhl ICJwYXJlbnQiIGJsb2NrLgo+ICsgICAgICAgIEByZXR1cm46IFRoZSByZXN1bHRpbmcgbGlzdCBv ZiBhcnJheXMuCj4gICAgICAgICAgQG5vdGU6IExpc3QgaXMgZGVzdHJveWVkIGFuZCBzaG91bGQg bm90IGJlIHVzZWQgYWZ0ZXIgdGhlIGNhbGwuCj4gLSAgICAgICAgT25seSB0aGUgcmV0dXJuZWQg bGlzdCBzaG91bGQgYmUgdXNlZC4KPiArICAgICAgICAgICAgT25seSB0aGUgcmV0dXJuZWQgbGlz dCBzaG91bGQgYmUgdXNlZC4KPiAgICAgICAgICAiIiIKPiArICAgICAgICBjdXJyZW50X2Jsb2Nr ID0gIiIKPiArCj4gICAgICAgICAgd2hpbGUgVHJ1ZToKPiAtICAgICAgICAgICAgaW5kZW50ID0g c2VsZi5nZXRfbmV4dF9saW5lX2luZGVudChmaWxlKQo+ICsgICAgICAgICAgICBwb3MgPSBjci50 ZWxsKCkKPiArICAgICAgICAgICAgKGluZGVudGVkX2xpbmUsIGxpbmUsIGluZGVudCkgPSBjci5n ZXRfbmV4dF9saW5lKCkKPiAgICAgICAgICAgICAgaWYgaW5kZW50IDw9IHByZXZfaW5kZW50Ogo+ ICsgICAgICAgICAgICAgICAgY3Iuc2Vlayhwb3MpCj4gKyAgICAgICAgICAgICAgICBzZWxmLl9h cHBlbmRfY29udGVudF90b19hcnJheXMobGlzdCwgY3VycmVudF9ibG9jaykKPiAgICAgICAgICAg ICAgICAgIGJyZWFrCj4gLSAgICAgICAgICAgIGluZGVudGVkX2xpbmUgPSBzZWxmLmdldF9uZXh0 X2xpbmUoZmlsZSkucnN0cmlwKCkKPiAtICAgICAgICAgICAgbGluZSA9IGluZGVudGVkX2xpbmUu c3RyaXAoKQo+IC0gICAgICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQo+ICAKPiAgICAgICAg ICAgICAgbGVuX2xpc3QgPSBsZW4obGlzdCkKPiAgCj4gLSAgICAgICAgICAgICMgTG9vayBmb3Ig YSBrbm93biBvcGVyYXRvciBpbiB0aGUgbGluZQo+IC0gICAgICAgICAgICBvcGVyYXRvcnMgPSBb Ij8rPSIsICI/PD0iLCAiPz0iLCAiKz0iLCAiPD0iLCAiPSJdCj4gLSAgICAgICAgICAgIG9wX2Zv dW5kID0gTm9uZQo+IC0gICAgICAgICAgICBvcF9wb3MgPSBsZW4obGluZSkKPiAtICAgICAgICAg ICAgZm9yIG9wIGluIG9wZXJhdG9yczoKPiAtICAgICAgICAgICAgICAgIHBvcyA9IGxpbmUuZmlu ZChvcCkKPiAtICAgICAgICAgICAgICAgIGlmIHBvcyA+PSAwIGFuZCBwb3MgPCBvcF9wb3M6Cj4g LSAgICAgICAgICAgICAgICAgICAgb3BfZm91bmQgPSBvcAo+IC0gICAgICAgICAgICAgICAgICAg IG9wX3BvcyA9IHBvcwo+IC0KPiAtICAgICAgICAgICAgIyBGb3VuZCBhbiBvcGVyYXRvcj8KPiAt ICAgICAgICAgICAgaWYgb3BfZm91bmQ6Cj4gKyAgICAgICAgICAgICMgUGFyc2UgYXNzaWdubWVu dCBvcGVyYXRvcnMgKGtlZXAgbGluZXMgaW4gdGVtcG9yYXJ5IGJ1ZmZlcikKPiArICAgICAgICAg ICAgaWYgIj0iIGluIGxpbmU6Cj4gICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnIGFuZCBu b3QgcmVzdHJpY3RlZDoKPiAtICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGVidWdfcHJpbnQo aW5kZW50ZWRfbGluZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IlBhcnNpbmcgb3BlcmF0b3IgKCVkIGRpY3RzIGluIGN1cnJlbnQgIgo+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dCkiICUgbGVuX2xpc3QpCj4gLSAgICAg ICAgICAgICAgICAobGVmdCwgdmFsdWUpID0gc2VsZi5zcGxpdF9hbmRfc3RyaXAobGluZSwgb3Bf Zm91bmQpCj4gLSAgICAgICAgICAgICAgICBmaWx0ZXJzX2FuZF9rZXkgPSBzZWxmLnNwbGl0X2Fu ZF9zdHJpcChsZWZ0LCAiOiIpCj4gLSAgICAgICAgICAgICAgICBmaWx0ZXJzID0gZmlsdGVyc19h bmRfa2V5WzotMV0KPiAtICAgICAgICAgICAgICAgIGtleSA9IGZpbHRlcnNfYW5kX2tleVstMV0K PiAtICAgICAgICAgICAgICAgIGZpbHRlcmVkX2xpc3QgPSBsaXN0Cj4gLSAgICAgICAgICAgICAg ICBmb3IgZmlsdGVyIGluIGZpbHRlcnM6Cj4gLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRf bGlzdCA9IHNlbGYuZmlsdGVyKGZpbHRlciwgZmlsdGVyZWRfbGlzdCkKPiAtICAgICAgICAgICAg ICAgICMgQXBwbHkgdGhlIG9wZXJhdGlvbiB0byB0aGUgZmlsdGVyZWQgbGlzdAo+IC0gICAgICAg ICAgICAgICAgaWYgb3BfZm91bmQgPT0gIj0iOgo+IC0gICAgICAgICAgICAgICAgICAgIGZvciBk aWN0IGluIGZpbHRlcmVkX2xpc3Q6Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rba2V5 XSA9IHZhbHVlCj4gLSAgICAgICAgICAgICAgICBlbGlmIG9wX2ZvdW5kID09ICIrPSI6Cj4gLSAg ICAgICAgICAgICAgICAgICAgZm9yIGRpY3QgaW4gZmlsdGVyZWRfbGlzdDoKPiAtICAgICAgICAg ICAgICAgICAgICAgICAgZGljdFtrZXldID0gZGljdC5nZXQoa2V5LCAiIikgKyB2YWx1ZQo+IC0g ICAgICAgICAgICAgICAgZWxpZiBvcF9mb3VuZCA9PSAiPD0iOgo+IC0gICAgICAgICAgICAgICAg ICAgIGZvciBkaWN0IGluIGZpbHRlcmVkX2xpc3Q6Cj4gLSAgICAgICAgICAgICAgICAgICAgICAg IGRpY3Rba2V5XSA9IHZhbHVlICsgZGljdC5nZXQoa2V5LCAiIikKPiAtICAgICAgICAgICAgICAg IGVsaWYgb3BfZm91bmQuc3RhcnRzd2l0aCgiPyIpOgo+IC0gICAgICAgICAgICAgICAgICAgIGV4 cCA9IHJlLmNvbXBpbGUoIl4oJXMpJCIgJSBrZXkpCj4gLSAgICAgICAgICAgICAgICAgICAgaWYg b3BfZm91bmQgPT0gIj89IjoKPiAtICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRpY3QgaW4g ZmlsdGVyZWRfbGlzdDoKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4g ZGljdC5rZXlzKCk6Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXhwLm1h dGNoKGtleSk6Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rba2V5 XSA9IHZhbHVlCj4gLSAgICAgICAgICAgICAgICAgICAgZWxpZiBvcF9mb3VuZCA9PSAiPys9IjoK PiAtICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRpY3QgaW4gZmlsdGVyZWRfbGlzdDoKPiAt ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gZGljdC5rZXlzKCk6Cj4gLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXhwLm1hdGNoKGtleSk6Cj4gLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rba2V5XSA9IGRpY3QuZ2V0KGtleSwg IiIpICsgdmFsdWUKPiAtICAgICAgICAgICAgICAgICAgICBlbGlmIG9wX2ZvdW5kID09ICI/PD0i Ogo+IC0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGljdCBpbiBmaWx0ZXJlZF9saXN0Ogo+ IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBkaWN0LmtleXMoKToKPiAt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHAubWF0Y2goa2V5KToKPiAtICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUgKyBkaWN0 LmdldChrZXksICIiKQo+ICsgICAgICAgICAgICAgICAgICAgIF9kZWJ1Z19wcmludChpbmRlbnRl ZF9saW5lLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2luZyBvcGVy YXRvciAoJWQgZGljdHMgaW4gY3VycmVudCAiCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICJjb250ZXh0KSIgJSBsZW5fbGlzdCkKPiArICAgICAgICAgICAgICAgIGN1cnJlbnRf YmxvY2sgKz0gbGluZSArICJcbiIKPiArICAgICAgICAgICAgICAgIGNvbnRpbnVlCj4gKwo+ICsg ICAgICAgICAgICAjIEZsdXNoIHRoZSB0ZW1wb3JhcnkgYnVmZmVyCj4gKyAgICAgICAgICAgIHNl bGYuX2FwcGVuZF9jb250ZW50X3RvX2FycmF5cyhsaXN0LCBjdXJyZW50X2Jsb2NrKQo+ICsgICAg ICAgICAgICBjdXJyZW50X2Jsb2NrID0gIiIKPiArCj4gKyAgICAgICAgICAgIHdvcmRzID0gbGlu ZS5zcGxpdCgpCj4gIAo+ICAgICAgICAgICAgICAjIFBhcnNlICdubycgYW5kICdvbmx5JyBzdGF0 ZW1lbnRzCj4gLSAgICAgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gIm5vIiBvciB3b3Jkc1swXSA9 PSAib25seSI6Cj4gKyAgICAgICAgICAgIGlmIHdvcmRzWzBdID09ICJubyIgb3Igd29yZHNbMF0g PT0gIm9ubHkiOgo+ICAgICAgICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8PSAxOgo+ICAgICAg ICAgICAgICAgICAgICAgIGNvbnRpbnVlCj4gLSAgICAgICAgICAgICAgICBmaWx0ZXJzID0gd29y ZHNbMTpdCj4gKyAgICAgICAgICAgICAgICBmaWx0ZXJzID0gbWFwKHNlbGYuX2dldF9maWx0ZXJf cmVnZXgsIHdvcmRzWzE6XSkKPiAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2xpc3QgPSBbXQo+ ICAgICAgICAgICAgICAgICAgaWYgd29yZHNbMF0gPT0gIm5vIjoKPiAtICAgICAgICAgICAgICAg ICAgICBmb3IgZGljdCBpbiBsaXN0Ogo+ICsgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGxp c3Q6Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfYXJyYXlfZ2V0X25hbWUoYSwg c2VsZi5vYmplY3RfY2FjaGUpCj4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWx0ZXIg aW4gZmlsdGVyczoKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubWF0Y2go ZmlsdGVyLCBkaWN0KToKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbHRlci5z ZWFyY2gobmFtZSk6Cj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKPiAg ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKPiAtICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZpbHRlcmVkX2xpc3QuYXBwZW5kKGRpY3QpCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBmaWx0ZXJlZF9saXN0LmFwcGVuZChhKQo+ICAgICAgICAgICAgICAgICAgaWYgd29yZHNb MF0gPT0gIm9ubHkiOgo+IC0gICAgICAgICAgICAgICAgICAgIGZvciBkaWN0IGluIGxpc3Q6Cj4g KyAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gbGlzdDoKPiArICAgICAgICAgICAgICAgICAg ICAgICAgbmFtZSA9IF9hcnJheV9nZXRfbmFtZShhLCBzZWxmLm9iamVjdF9jYWNoZSkKPiAgICAg ICAgICAgICAgICAgICAgICAgICAgZm9yIGZpbHRlciBpbiBmaWx0ZXJzOgo+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tYXRjaChmaWx0ZXIsIGRpY3QpOgo+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2xpc3QuYXBwZW5kKGRpY3QpCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaWx0ZXIuc2VhcmNoKG5hbWUpOgo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2xpc3QuYXBwZW5kKGEpCj4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKPiAgICAgICAgICAgICAgICAgIGxp c3QgPSBmaWx0ZXJlZF9saXN0Cj4gICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnIGFuZCBu b3QgcmVzdHJpY3RlZDoKPiAtICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGVidWdfcHJpbnQo aW5kZW50ZWRfbGluZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IlBhcnNpbmcgbm8vb25seSAoJWQgZGljdHMgaW4gY3VycmVudCAiCj4gLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0LCAlZCByZW1haW4pIiAlCj4gLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5fbGlzdCwgbGVuKGxpc3QpKSkK PiArICAgICAgICAgICAgICAgICAgICBfZGVidWdfcHJpbnQoaW5kZW50ZWRfbGluZSwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNpbmcgbm8vb25seSAoJWQgZGljdHMg aW4gY3VycmVudCAiCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0 LCAlZCByZW1haW4pIiAlCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5f bGlzdCwgbGVuKGxpc3QpKSkKPiArICAgICAgICAgICAgICAgIGNvbnRpbnVlCj4gIAo+ICAgICAg ICAgICAgICAjIFBhcnNlICd2YXJpYW50cycKPiAtICAgICAgICAgICAgZWxpZiBsaW5lID09ICJ2 YXJpYW50czoiOgo+ICsgICAgICAgICAgICBpZiBsaW5lID09ICJ2YXJpYW50czoiOgo+ICAgICAg ICAgICAgICAgICAgIyAndmFyaWFudHMnIG5vdCBhbGxvd2VkIGluIHJlc3RyaWN0ZWQgbW9kZQo+ ICAgICAgICAgICAgICAgICAgIyAoaW5zaWRlIGFuIGV4Y2VwdGlvbiBvciBpbnNpZGUgc3VidmFy aWFudHMpCj4gICAgICAgICAgICAgICAgICBpZiByZXN0cmljdGVkOgo+ICAgICAgICAgICAgICAg ICAgICAgIGVfbXNnID0gIlVzaW5nIHZhcmlhbnRzIGluIHRoaXMgY29udGV4dCBpcyBub3QgYWxs b3dlZCIKPiAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvci5BdXRvdGVzdEVycm9yKGVf bXNnKQo+ICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyBhbmQgbm90IHJlc3RyaWN0ZWQ6 Cj4gLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RlYnVnX3ByaW50KGluZGVudGVkX2xpbmUs Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRlcmluZyB2YXJp YW50cyBibG9jayAoJWQgZGljdHMgaW4gIgo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiY3VycmVudCBjb250ZXh0KSIgJSBsZW5fbGlzdCkKPiAtICAgICAgICAgICAg ICAgIGxpc3QgPSBzZWxmLnBhcnNlX3ZhcmlhbnRzKGZpbGUsIGxpc3QsIHN1YnZhcmlhbnRzPUZh bHNlLAo+ICsgICAgICAgICAgICAgICAgICAgIF9kZWJ1Z19wcmludChpbmRlbnRlZF9saW5lLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW50ZXJpbmcgdmFyaWFudHMgYmxv Y2sgKCVkIGRpY3RzIGluICIKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1 cnJlbnQgY29udGV4dCkiICUgbGVuX2xpc3QpCj4gKyAgICAgICAgICAgICAgICBsaXN0ID0gc2Vs Zi5wYXJzZV92YXJpYW50cyhjciwgbGlzdCwgc3VidmFyaWFudHM9RmFsc2UsCj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2luZGVudD1pbmRlbnQpCj4g KyAgICAgICAgICAgICAgICBjb250aW51ZQo+ICAKPiAgICAgICAgICAgICAgIyBQYXJzZSAnc3Vi dmFyaWFudHMnICh0aGUgYmxvY2sgaXMgcGFyc2VkIGZvciBlYWNoIGRpY3QKPiAgICAgICAgICAg ICAgIyBzZXBhcmF0ZWx5KQo+IC0gICAgICAgICAgICBlbGlmIGxpbmUgPT0gInN1YnZhcmlhbnRz OiI6Cj4gKyAgICAgICAgICAgIGlmIGxpbmUgPT0gInN1YnZhcmlhbnRzOiI6Cj4gICAgICAgICAg ICAgICAgICBpZiBzZWxmLmRlYnVnIGFuZCBub3QgcmVzdHJpY3RlZDoKPiAtICAgICAgICAgICAg ICAgICAgICBzZWxmLl9fZGVidWdfcHJpbnQoaW5kZW50ZWRfbGluZSwKPiAtICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudGVyaW5nIHN1YnZhcmlhbnRzIGJsb2NrICgl ZCBkaWN0cyBpbiAiCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJj dXJyZW50IGNvbnRleHQpIiAlIGxlbl9saXN0KQo+ICsgICAgICAgICAgICAgICAgICAgIF9kZWJ1 Z19wcmludChpbmRlbnRlZF9saW5lLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiRW50ZXJpbmcgc3VidmFyaWFudHMgYmxvY2sgKCVkIGRpY3RzIGluICIKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgImN1cnJlbnQgY29udGV4dCkiICUgbGVuX2xpc3QpCj4g ICAgICAgICAgICAgICAgICBuZXdfbGlzdCA9IFtdCj4gLSAgICAgICAgICAgICAgICAjIFJlbWVt YmVyIGN1cnJlbnQgZmlsZSBwb3NpdGlvbgo+IC0gICAgICAgICAgICAgICAgcG9zID0gZmlsZS50 ZWxsKCkKPiArICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgY3VycmVudCBwb3NpdGlvbgo+ICsg ICAgICAgICAgICAgICAgcG9zID0gY3IudGVsbCgpCj4gICAgICAgICAgICAgICAgICAjIFJlYWQg dGhlIGxpbmVzIGluIGFueSBjYXNlCj4gLSAgICAgICAgICAgICAgICBzZWxmLnBhcnNlX3Zhcmlh bnRzKGZpbGUsIFtdLCBzdWJ2YXJpYW50cz1UcnVlLAo+ICsgICAgICAgICAgICAgICAgc2VsZi5w YXJzZV92YXJpYW50cyhjciwgW10sIHN1YnZhcmlhbnRzPVRydWUsCj4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHByZXZfaW5kZW50PWluZGVudCkKPiAgICAgICAgICAgICAg ICAgICMgSXRlcmF0ZSBvdmVyIHRoZSBsaXN0Li4uCj4gLSAgICAgICAgICAgICAgICBmb3IgaW5k ZXggaW4gcmFuZ2UobGVuKGxpc3QpKToKPiAtICAgICAgICAgICAgICAgICAgICAjIFJldmVydCB0 byBpbml0aWFsIGZpbGUgcG9zaXRpb24gaW4gdGhpcyAnc3VidmFyaWFudHMnCj4gLSAgICAgICAg ICAgICAgICAgICAgIyBibG9jawo+IC0gICAgICAgICAgICAgICAgICAgIGZpbGUuc2Vlayhwb3Mp Cj4gKyAgICAgICAgICAgICAgICBmb3IgaW5kZXggaW4geHJhbmdlKGxlbihsaXN0KSk6Cj4gKyAg ICAgICAgICAgICAgICAgICAgIyBSZXZlcnQgdG8gaW5pdGlhbCBwb3NpdGlvbiBpbiB0aGlzICdz dWJ2YXJpYW50cycgYmxvY2sKPiArICAgICAgICAgICAgICAgICAgICBjci5zZWVrKHBvcykKPiAg ICAgICAgICAgICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgaW5zaWRlICdzdWJ2YXJpYW50cycgc2hv dWxkIGJlIHBhcnNlZCBpbgo+ICAgICAgICAgICAgICAgICAgICAgICMgcmVzdHJpY3RlZCBtb2Rl Cj4gLSAgICAgICAgICAgICAgICAgICAgbmV3X2xpc3QgKz0gc2VsZi5wYXJzZV92YXJpYW50cyhm aWxlLCBsaXN0W2luZGV4OmluZGV4KzFdLAo+ICsgICAgICAgICAgICAgICAgICAgIG5ld19saXN0 ICs9IHNlbGYucGFyc2VfdmFyaWFudHMoY3IsIGxpc3RbaW5kZXg6aW5kZXgrMV0sCj4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ2YXJpYW50 cz1UcnVlLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcHJldl9pbmRlbnQ9aW5kZW50KQo+ICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ld19s aXN0Cj4gKyAgICAgICAgICAgICAgICBjb250aW51ZQo+ICAKPiAgICAgICAgICAgICAgIyBQYXJz ZSAnaW5jbHVkZScgc3RhdGVtZW50cwo+IC0gICAgICAgICAgICBlbGlmIHdvcmRzWzBdID09ICJp bmNsdWRlIjoKPiArICAgICAgICAgICAgaWYgd29yZHNbMF0gPT0gImluY2x1ZGUiOgo+ICAgICAg ICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8PSAxOgo+ICAgICAgICAgICAgICAgICAgICAgIGNv bnRpbnVlCj4gICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnIGFuZCBub3QgcmVzdHJpY3Rl ZDoKPiAtICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGVidWdfcHJpbnQoaW5kZW50ZWRfbGlu ZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudGVyaW5nIGZp bGUgJXMiICUgd29yZHNbMV0pCj4gKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnX3ByaW50KGlu ZGVudGVkX2xpbmUsICJFbnRlcmluZyBmaWxlICVzIiAlIHdvcmRzWzFdKQo+ICAgICAgICAgICAg ICAgICAgaWYgc2VsZi5maWxlbmFtZToKPiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9 IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc2VsZi5maWxlbmFtZSksCj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNbMV0pCj4gICAgICAgICAg ICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgo+IC0gICAgICAgICAgICAg ICAgICAgICAgICBuZXdfZmlsZSA9IG9wZW4oZmlsZW5hbWUsICJyIikKPiAtICAgICAgICAgICAg ICAgICAgICAgICAgbGlzdCA9IHNlbGYucGFyc2UobmV3X2ZpbGUsIGxpc3QsIHJlc3RyaWN0ZWQp Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLmNsb3NlKCkKPiArICAgICAgICAg ICAgICAgICAgICAgICAgc3RyID0gb3BlbihmaWxlbmFtZSkucmVhZCgpCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIGxpc3QgPSBzZWxmLnBhcnNlKGNvbmZpZ3JlYWRlcihzdHIpLCBsaXN0LCBy ZXN0cmljdGVkKQo+ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnIGFuZCBu b3QgcmVzdHJpY3RlZDoKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19kZWJ1 Z19wcmludCgiIiwgIkxlYXZpbmcgZmlsZSAlcyIgJSB3b3Jkc1sxXSkKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9kZWJ1Z19wcmludCgiIiwgIkxlYXZpbmcgZmlsZSAlcyIgJSB3b3Jk c1sxXSkKPiAgICAgICAgICAgICAgICAgICAgICBlbHNlOgo+ICAgICAgICAgICAgICAgICAgICAg ICAgICBsb2dnaW5nLndhcm5pbmcoIkNhbm5vdCBpbmNsdWRlICVzIC0tIGZpbGUgbm90IGZvdW5k IiwKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKQo+ ICAgICAgICAgICAgICAgICAgZWxzZToKPiAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLndh cm5pbmcoIkNhbm5vdCBpbmNsdWRlICVzIGJlY2F1c2Ugbm8gZmlsZSBpcyAiCj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50bHkgb3BlbiIsIHdvcmRzWzFdKQo+ ICsgICAgICAgICAgICAgICAgY29udGludWUKPiAgCj4gICAgICAgICAgICAgICMgUGFyc2UgbXVs dGktbGluZSBleGNlcHRpb25zCj4gICAgICAgICAgICAgICMgKHRoZSBibG9jayBpcyBwYXJzZWQg Zm9yIGVhY2ggZGljdCBzZXBhcmF0ZWx5KQo+IC0gICAgICAgICAgICBlbGlmIGxpbmUuZW5kc3dp dGgoIjoiKToKPiArICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiOiIpOgo+ICAgICAgICAg ICAgICAgICAgaWYgc2VsZi5kZWJ1ZyBhbmQgbm90IHJlc3RyaWN0ZWQ6Cj4gLSAgICAgICAgICAg ICAgICAgICAgc2VsZi5fX2RlYnVnX3ByaW50KGluZGVudGVkX2xpbmUsCj4gLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRlcmluZyBtdWx0aS1saW5lIGV4Y2VwdGlv biBibG9jayAiCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQg ZGljdHMgaW4gY3VycmVudCBjb250ZXh0IG91dHNpZGUgIgo+IC0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uKSIgJSBsZW5fbGlzdCkKPiAtICAgICAgICAg ICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCI6IikKPiArICAgICAgICAgICAgICAgICAgICBfZGVi dWdfcHJpbnQoaW5kZW50ZWRfbGluZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIkVudGVyaW5nIG11bHRpLWxpbmUgZXhjZXB0aW9uIGJsb2NrICIKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIiglZCBkaWN0cyBpbiBjdXJyZW50IGNvbnRleHQgb3V0c2lk ZSAiCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24pIiAlIGxl bl9saXN0KQo+ICsgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQo+ICAgICAgICAgICAg ICAgICAgbmV3X2xpc3QgPSBbXQo+IC0gICAgICAgICAgICAgICAgIyBSZW1lbWJlciBjdXJyZW50 IGZpbGUgcG9zaXRpb24KPiAtICAgICAgICAgICAgICAgIHBvcyA9IGZpbGUudGVsbCgpCj4gKyAg ICAgICAgICAgICAgICAjIFJlbWVtYmVyIGN1cnJlbnQgcG9zaXRpb24KPiArICAgICAgICAgICAg ICAgIHBvcyA9IGNyLnRlbGwoKQo+ICAgICAgICAgICAgICAgICAgIyBSZWFkIHRoZSBsaW5lcyBp biBhbnkgY2FzZQo+IC0gICAgICAgICAgICAgICAgc2VsZi5wYXJzZShmaWxlLCBbXSwgcmVzdHJp Y3RlZD1UcnVlLCBwcmV2X2luZGVudD1pbmRlbnQpCj4gKyAgICAgICAgICAgICAgICBzZWxmLnBh cnNlKGNyLCBbXSwgcmVzdHJpY3RlZD1UcnVlLCBwcmV2X2luZGVudD1pbmRlbnQpCj4gICAgICAg ICAgICAgICAgICAjIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdC4uLgo+IC0gICAgICAgICAgICAgICAg Zm9yIGluZGV4IGluIHJhbmdlKGxlbihsaXN0KSk6Cj4gLSAgICAgICAgICAgICAgICAgICAgaWYg c2VsZi5tYXRjaChsaW5lLCBsaXN0W2luZGV4XSk6Cj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICMgUmV2ZXJ0IHRvIGluaXRpYWwgZmlsZSBwb3NpdGlvbiBpbiB0aGlzCj4gLSAgICAgICAgICAg ICAgICAgICAgICAgICMgZXhjZXB0aW9uIGJsb2NrCj4gLSAgICAgICAgICAgICAgICAgICAgICAg IGZpbGUuc2Vlayhwb3MpCj4gKyAgICAgICAgICAgICAgICBleHAgPSBzZWxmLl9nZXRfZmlsdGVy X3JlZ2V4KGxpbmUpCj4gKyAgICAgICAgICAgICAgICBmb3IgaW5kZXggaW4geHJhbmdlKGxlbihs aXN0KSk6Cj4gKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IF9hcnJheV9nZXRfbmFtZShsaXN0 W2luZGV4XSwgc2VsZi5vYmplY3RfY2FjaGUpCj4gKyAgICAgICAgICAgICAgICAgICAgaWYgZXhw LnNlYXJjaChuYW1lKToKPiArICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXZlcnQgdG8gaW5p dGlhbCBwb3NpdGlvbiBpbiB0aGlzIGV4Y2VwdGlvbiBibG9jawo+ICsgICAgICAgICAgICAgICAg ICAgICAgICBjci5zZWVrKHBvcykKPiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFdmVyeXRo aW5nIGluc2lkZSBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHBhcnNlZCBpbgo+ICAgICAgICAgICAg ICAgICAgICAgICAgICAjIHJlc3RyaWN0ZWQgbW9kZQo+IC0gICAgICAgICAgICAgICAgICAgICAg ICBuZXdfbGlzdCArPSBzZWxmLnBhcnNlKGZpbGUsIGxpc3RbaW5kZXg6aW5kZXgrMV0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIG5ld19saXN0ICs9IHNlbGYucGFyc2UoY3IsIGxpc3RbaW5k ZXg6aW5kZXgrMV0sCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzdHJpY3RlZD1UcnVlLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHByZXZfaW5kZW50PWluZGVudCkKPiAgICAgICAgICAgICAgICAgICAg ICBlbHNlOgo+IC0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfbGlzdCArPSBsaXN0W2luZGV4 OmluZGV4KzFdCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZChsaXN0 W2luZGV4XSkKPiAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXdfbGlzdAo+ICsgICAgICAgICAg ICAgICAgY29udGludWUKPiAgCj4gICAgICAgICAgcmV0dXJuIGxpc3QKPiAgCj4gCj4gLSAgICBk ZWYgX19kZWJ1Z19wcmludChzZWxmLCBzdHIxLCBzdHIyPSIiKToKPiArICAgIGRlZiBfZ2V0X2Zp bHRlcl9yZWdleChzZWxmLCBmaWx0ZXIpOgo+ICAgICAgICAgICIiIgo+IC0gICAgICAgIE5pY2Vs eSBwcmludCB0d28gc3RyaW5ncyBhbmQgYW4gYXJyb3cuCj4gKyAgICAgICAgUmV0dXJuIGEgcmVn ZXggb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBmaWx0ZXIgc3RyaW5nLgo+ICAKPiAt ICAgICAgICBAcGFyYW0gc3RyMTogRmlyc3Qgc3RyaW5nCj4gLSAgICAgICAgQHBhcmFtIHN0cjI6 IFNlY29uZCBzdHJpbmcKPiArICAgICAgICBBbGwgcmVndWxhciBleHByZXNzaW9ucyBnaXZlbiB0 byB0aGUgcGFyc2VyIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGlzCj4gKyAgICAgICAgZnVuY3Rpb24g Zmlyc3QuICBJdHMgcHVycG9zZSBpcyB0byBtYWtlIHRoZW0gbW9yZSBzcGVjaWZpYyBhbmQgYmV0 dGVyCj4gKyAgICAgICAgc3VpdGVkIHRvIG1hdGNoIGRpY3Rpb25hcnkgbmFtZXM6IGl0IGZvcmNl cyBzaW1wbGUgZXhwcmVzc2lvbnMgdG8gbWF0Y2gKPiArICAgICAgICBvbmx5IGJldHdlZW4gZG90 cyBvciBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIHN0cmluZy4gIEZvciBleGFtcGxlLAo+ ICsgICAgICAgIHRoZSBmaWx0ZXIgJ2Zvbycgd2lsbCBtYXRjaCAnZm9vLmJhcicgYnV0IG5vdCAn Zm9vYmFyJy4KPiAgICAgICAgICAiIiIKPiAtICAgICAgICBpZiBzdHIyOgo+IC0gICAgICAgICAg ICBzdHIgPSAiJS01MHMgLS0tPiAlcyIgJSAoc3RyMSwgc3RyMikKPiAtICAgICAgICBlbHNlOgo+ IC0gICAgICAgICAgICBzdHIgPSBzdHIxCj4gLSAgICAgICAgbG9nZ2luZy5kZWJ1ZyhzdHIpCj4g LQo+IC0KPiAtICAgIGRlZiBfX21vZGlmeV9saXN0X3ZhcmlhbnRzKHNlbGYsIGxpc3QsIG5hbWUs IGRlcF9saXN0LCBhZGRfdG9fc2hvcnRuYW1lKToKPiAtICAgICAgICAiIiIKPiAtICAgICAgICBN YWtlIHNvbWUgbW9kaWZpY2F0aW9ucyB0byBsaXN0LCBhcyBwYXJ0IG9mIHBhcnNpbmcgYSAndmFy aWFudHMnIGJsb2NrLgo+IC0KPiAtICAgICAgICBAcGFyYW0gbGlzdDogTGlzdCB0byBiZSBwcm9j ZXNzZWQKPiAtICAgICAgICBAcGFyYW0gbmFtZTogTmFtZSB0byBiZSBwcmVwZW5kZWQgdG8gdGhl IGRpY3Rpb25hcnkncyAnbmFtZScga2V5Cj4gLSAgICAgICAgQHBhcmFtIGRlcF9saXN0OiBMaXN0 IG9mIGRlcGVuZGVuY2llcyB0byBiZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSdzCj4gLSAgICAg ICAgICAgICAgICAnZGVwZW5kJyBrZXkKPiAtICAgICAgICBAcGFyYW0gYWRkX3RvX3Nob3J0bmFt ZTogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgbmFtZSBzaG91bGQgYmUKPiAtICAgICAgICAg ICAgICAgIHByZXBlbmRlZCB0byB0aGUgZGljdGlvbmFyeSdzICdzaG9ydG5hbWUnIGtleSBhcyB3 ZWxsCj4gLSAgICAgICAgIiIiCj4gLSAgICAgICAgZm9yIGRpY3QgaW4gbGlzdDoKPiAtICAgICAg ICAgICAgIyBQcmVwZW5kIG5hbWUgdG8gdGhlIGRpY3QncyAnbmFtZScgZmllbGQKPiAtICAgICAg ICAgICAgZGljdFsibmFtZSJdID0gc2VsZi5hZGRfbmFtZShkaWN0WyJuYW1lIl0sIG5hbWUpCj4g LSAgICAgICAgICAgICMgUHJlcGVuZCBuYW1lIHRvIHRoZSBkaWN0J3MgJ3Nob3J0bmFtZScgZmll bGQKPiAtICAgICAgICAgICAgaWYgYWRkX3RvX3Nob3J0bmFtZToKPiAtICAgICAgICAgICAgICAg IGRpY3RbInNob3J0bmFtZSJdID0gc2VsZi5hZGRfbmFtZShkaWN0WyJzaG9ydG5hbWUiXSwgbmFt ZSkKPiAtICAgICAgICAgICAgIyBQcmVwZW5kIG5hbWUgdG8gZWFjaCBvZiB0aGUgZGljdCdzIGRl cGVuZGVuY2llcwo+IC0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZGljdFsiZGVwZW5k Il0pKToKPiAtICAgICAgICAgICAgICAgIGRpY3RbImRlcGVuZCJdW2ldID0gc2VsZi5hZGRfbmFt ZShkaWN0WyJkZXBlbmQiXVtpXSwgbmFtZSkKPiAtICAgICAgICAgICAgIyBBZGQgbmV3IGRlcGVu ZGVuY2llcwo+IC0gICAgICAgICAgICBkaWN0WyJkZXBlbmQiXSArPSBkZXBfbGlzdAo+IC0KPiAt Cj4gLSAgICBkZWYgX19tb2RpZnlfbGlzdF9zdWJ2YXJpYW50cyhzZWxmLCBsaXN0LCBuYW1lLCBk ZXBfbGlzdCwgYWRkX3RvX3Nob3J0bmFtZSk6Cj4gLSAgICAgICAgIiIiCj4gLSAgICAgICAgTWFr ZSBzb21lIG1vZGlmaWNhdGlvbnMgdG8gbGlzdCwgYXMgcGFydCBvZiBwYXJzaW5nIGEgJ3N1YnZh cmlhbnRzJwo+IC0gICAgICAgIGJsb2NrLgo+IC0KPiAtICAgICAgICBAcGFyYW0gbGlzdDogTGlz dCB0byBiZSBwcm9jZXNzZWQKPiAtICAgICAgICBAcGFyYW0gbmFtZTogTmFtZSB0byBiZSBhcHBl bmRlZCB0byB0aGUgZGljdGlvbmFyeSdzICduYW1lJyBrZXkKPiAtICAgICAgICBAcGFyYW0gZGVw X2xpc3Q6IExpc3Qgb2YgZGVwZW5kZW5jaWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5 J3MKPiAtICAgICAgICAgICAgICAgICdkZXBlbmQnIGtleQo+IC0gICAgICAgIEBwYXJhbSBhZGRf dG9fc2hvcnRuYW1lOiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBuYW1lIHNob3VsZCBiZQo+ IC0gICAgICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIGRpY3Rpb25hcnkncyAnc2hvcnRuYW1l JyBhcyB3ZWxsCj4gLSAgICAgICAgIiIiCj4gLSAgICAgICAgZm9yIGRpY3QgaW4gbGlzdDoKPiAt ICAgICAgICAgICAgIyBBZGQgbmV3IGRlcGVuZGVuY2llcwo+IC0gICAgICAgICAgICBmb3IgZGVw IGluIGRlcF9saXN0Ogo+IC0gICAgICAgICAgICAgICAgZGVwX25hbWUgPSBzZWxmLmFkZF9uYW1l KGRpY3RbIm5hbWUiXSwgZGVwLCBhcHBlbmQ9VHJ1ZSkKPiAtICAgICAgICAgICAgICAgIGRpY3Rb ImRlcGVuZCJdLmFwcGVuZChkZXBfbmFtZSkKPiAtICAgICAgICAgICAgIyBBcHBlbmQgbmFtZSB0 byB0aGUgZGljdCdzICduYW1lJyBmaWVsZAo+IC0gICAgICAgICAgICBkaWN0WyJuYW1lIl0gPSBz ZWxmLmFkZF9uYW1lKGRpY3RbIm5hbWUiXSwgbmFtZSwgYXBwZW5kPVRydWUpCj4gLSAgICAgICAg ICAgICMgQXBwZW5kIG5hbWUgdG8gdGhlIGRpY3QncyAnc2hvcnRuYW1lJyBmaWVsZAo+IC0gICAg ICAgICAgICBpZiBhZGRfdG9fc2hvcnRuYW1lOgo+IC0gICAgICAgICAgICAgICAgZGljdFsic2hv cnRuYW1lIl0gPSBzZWxmLmFkZF9uYW1lKGRpY3RbInNob3J0bmFtZSJdLCBuYW1lLAo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZD1UcnVl KQo+ICsgICAgICAgIHRyeToKPiArICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVnZXhfY2FjaGVb ZmlsdGVyXQo+ICsgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKPiArICAgICAgICAgICAgZXhwID0g cmUuY29tcGlsZShyIihcLnxeKSglcykoXC58JCkiICUgZmlsdGVyKQo+ICsgICAgICAgICAgICBz ZWxmLnJlZ2V4X2NhY2hlW2ZpbHRlcl0gPSBleHAKPiArICAgICAgICAgICAgcmV0dXJuIGV4cAo+ ICsKPiArCj4gKyAgICBkZWYgX3N0b3JlX3N0cihzZWxmLCBzdHIpOgo+ICsgICAgICAgICIiIgo+ ICsgICAgICAgIFN0b3JlIHN0ciBpbiB0aGUgaW50ZXJuYWwgb2JqZWN0IGNhY2hlLCBpZiBpdCBp c24ndCBhbHJlYWR5IHRoZXJlLCBhbmQKPiArICAgICAgICByZXR1cm4gaXRzIGlkZW50aWZ5aW5n IGluZGV4Lgo+ICsKPiArICAgICAgICBAcGFyYW0gc3RyOiBTdHJpbmcgdG8gc3RvcmUuCj4gKyAg ICAgICAgQHJldHVybjogVGhlIGluZGV4IG9mIHN0ciBpbiB0aGUgb2JqZWN0IGNhY2hlLgo+ICsg ICAgICAgICIiIgo+ICsgICAgICAgIHRyeToKPiArICAgICAgICAgICAgcmV0dXJuIHNlbGYub2Jq ZWN0X2NhY2hlX2luZGljZXNbc3RyXQo+ICsgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKPiArICAg ICAgICAgICAgc2VsZi5vYmplY3RfY2FjaGUuYXBwZW5kKHN0cikKPiArICAgICAgICAgICAgaW5k ZXggPSBsZW4oc2VsZi5vYmplY3RfY2FjaGUpIC0gMQo+ICsgICAgICAgICAgICBzZWxmLm9iamVj dF9jYWNoZV9pbmRpY2VzW3N0cl0gPSBpbmRleAo+ICsgICAgICAgICAgICByZXR1cm4gaW5kZXgK PiArCj4gKwo+ICsgICAgZGVmIF9hcHBlbmRfY29udGVudF90b19hcnJheXMoc2VsZiwgbGlzdCwg Y29udGVudCk6Cj4gKyAgICAgICAgIiIiCj4gKyAgICAgICAgQXBwZW5kIGNvbnRlbnQgKGNvbmZp ZyBjb2RlIGNvbnRhaW5pbmcgYXNzaWdubWVudCBvcGVyYXRpb25zKSB0byBhIGxpc3QKPiArICAg ICAgICBvZiBhcnJheXMuCj4gKwo+ICsgICAgICAgIEBwYXJhbSBsaXN0OiBMaXN0IG9mIGFycmF5 cyB0byBvcGVyYXRlIG9uLgo+ICsgICAgICAgIEBwYXJhbSBjb250ZW50OiBTdHJpbmcgY29udGFp bmluZyBhc3NpZ25tZW50IG9wZXJhdGlvbnMuCj4gKyAgICAgICAgIiIiCj4gKyAgICAgICAgaWYg Y29udGVudDoKPiArICAgICAgICAgICAgc3RyX2luZGV4ID0gc2VsZi5fc3RvcmVfc3RyKGNvbnRl bnQpCj4gKyAgICAgICAgICAgIGZvciBhIGluIGxpc3Q6Cj4gKyAgICAgICAgICAgICAgICBfYXJy YXlfYXBwZW5kX3RvX2NvbnRlbnQoYSwgc3RyX2luZGV4KQo+ICsKPiArCj4gKyAgICBkZWYgX2Fw cGx5X2NvbnRlbnRfdG9fZGljdChzZWxmLCBkaWN0LCBjb250ZW50KToKPiArICAgICAgICAiIiIK PiArICAgICAgICBBcHBseSB0aGUgb3BlcmF0aW9ucyBpbiBjb250ZW50IChjb25maWcgY29kZSBj b250YWluaW5nIGFzc2lnbm1lbnQKPiArICAgICAgICBvcGVyYXRpb25zKSB0byBhIGRpY3QuCj4g Kwo+ICsgICAgICAgIEBwYXJhbSBkaWN0OiBEaWN0aW9uYXJ5IHRvIG9wZXJhdGUgb24uICBNdXN0 IGhhdmUgJ25hbWUnIGtleS4KPiArICAgICAgICBAcGFyYW0gY29udGVudDogU3RyaW5nIGNvbnRh aW5pbmcgYXNzaWdubWVudCBvcGVyYXRpb25zLgo+ICsgICAgICAgICIiIgo+ICsgICAgICAgIGZv ciBsaW5lIGluIGNvbnRlbnQuc3BsaXRsaW5lcygpOgo+ICsgICAgICAgICAgICBvcF9mb3VuZCA9 IE5vbmUKPiArICAgICAgICAgICAgb3BfcG9zID0gbGVuKGxpbmUpCj4gKyAgICAgICAgICAgIGZv ciBvcCBpbiBvcHM6Cj4gKyAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmZpbmQob3ApCj4gKyAg ICAgICAgICAgICAgICBpZiBwb3MgPj0gMCBhbmQgcG9zIDwgb3BfcG9zOgo+ICsgICAgICAgICAg ICAgICAgICAgIG9wX2ZvdW5kID0gb3AKPiArICAgICAgICAgICAgICAgICAgICBvcF9wb3MgPSBw b3MKPiArICAgICAgICAgICAgaWYgbm90IG9wX2ZvdW5kOgo+ICsgICAgICAgICAgICAgICAgY29u dGludWUKPiArICAgICAgICAgICAgKGxlZnQsIHZhbHVlKSA9IG1hcChzdHIuc3RyaXAsIGxpbmUu c3BsaXQob3BfZm91bmQsIDEpKQo+ICsgICAgICAgICAgICBpZiB2YWx1ZSBhbmQgKCh2YWx1ZVsw XSA9PSAnIicgYW5kIHZhbHVlWy0xXSA9PSAnIicpIG9yCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgKHZhbHVlWzBdID09ICInIiBhbmQgdmFsdWVbLTFdID09ICInIikpOgo+ICsgICAgICAg ICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQo+ICsgICAgICAgICAgICBmaWx0ZXJzX2FuZF9r ZXkgPSBtYXAoc3RyLnN0cmlwLCBsZWZ0LnNwbGl0KCI6IikpCj4gKyAgICAgICAgICAgIGZpbHRl cnMgPSBmaWx0ZXJzX2FuZF9rZXlbOi0xXQo+ICsgICAgICAgICAgICBrZXkgPSBmaWx0ZXJzX2Fu ZF9rZXlbLTFdCj4gKyAgICAgICAgICAgIGZvciBmaWx0ZXIgaW4gZmlsdGVyczoKPiArICAgICAg ICAgICAgICAgIGV4cCA9IHNlbGYuX2dldF9maWx0ZXJfcmVnZXgoZmlsdGVyKQo+ICsgICAgICAg ICAgICAgICAgaWYgbm90IGV4cC5zZWFyY2goZGljdFsibmFtZSJdKToKPiArICAgICAgICAgICAg ICAgICAgICBicmVhawo+ICsgICAgICAgICAgICBlbHNlOgo+ICsgICAgICAgICAgICAgICAgb3Bz W29wX2ZvdW5kXShkaWN0LCBrZXksIHZhbHVlKQo+ICsKPiArCj4gKyMgQXNzaWdubWVudCBvcGVy YXRvcnMKPiArCj4gK2RlZiBfb3Bfc2V0KGRpY3QsIGtleSwgdmFsdWUpOgo+ICsgICAgZGljdFtr ZXldID0gdmFsdWUKPiArCj4gKwo+ICtkZWYgX29wX2FwcGVuZChkaWN0LCBrZXksIHZhbHVlKToK PiArICAgIGRpY3Rba2V5XSA9IGRpY3QuZ2V0KGtleSwgIiIpICsgdmFsdWUKPiArCj4gKwo+ICtk ZWYgX29wX3ByZXBlbmQoZGljdCwga2V5LCB2YWx1ZSk6Cj4gKyAgICBkaWN0W2tleV0gPSB2YWx1 ZSArIGRpY3QuZ2V0KGtleSwgIiIpCj4gKwo+ICsKPiArZGVmIF9vcF9yZWdleF9zZXQoZGljdCwg ZXhwLCB2YWx1ZSk6Cj4gKyAgICBleHAgPSByZS5jb21waWxlKCJeKCVzKSQiICUgZXhwKQo+ICsg ICAgZm9yIGtleSBpbiBkaWN0Ogo+ICsgICAgICAgIGlmIGV4cC5tYXRjaChrZXkpOgo+ICsgICAg ICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQo+ICsKPiArCj4gK2RlZiBfb3BfcmVnZXhfYXBwZW5k KGRpY3QsIGV4cCwgdmFsdWUpOgo+ICsgICAgZXhwID0gcmUuY29tcGlsZSgiXiglcykkIiAlIGV4 cCkKPiArICAgIGZvciBrZXkgaW4gZGljdDoKPiArICAgICAgICBpZiBleHAubWF0Y2goa2V5KToK PiArICAgICAgICAgICAgZGljdFtrZXldICs9IHZhbHVlCj4gKwo+ICsKPiArZGVmIF9vcF9yZWdl eF9wcmVwZW5kKGRpY3QsIGV4cCwgdmFsdWUpOgo+ICsgICAgZXhwID0gcmUuY29tcGlsZSgiXigl cykkIiAlIGV4cCkKPiArICAgIGZvciBrZXkgaW4gZGljdDoKPiArICAgICAgICBpZiBleHAubWF0 Y2goa2V5KToKPiArICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUgKyBkaWN0W2tleV0KPiAr Cj4gKwo+ICtvcHMgPSB7Cj4gKyAgICAiPSI6IF9vcF9zZXQsCj4gKyAgICAiKz0iOiBfb3BfYXBw ZW5kLAo+ICsgICAgIjw9IjogX29wX3ByZXBlbmQsCj4gKyAgICAiPz0iOiBfb3BfcmVnZXhfc2V0 LAo+ICsgICAgIj8rPSI6IF9vcF9yZWdleF9hcHBlbmQsCj4gKyAgICAiPzw9IjogX29wX3JlZ2V4 X3ByZXBlbmQsCj4gK30KPiArCj4gKwo+ICsjIE1pc2MgZnVuY3Rpb25zCj4gKwo+ICtkZWYgX2Rl YnVnX3ByaW50KHN0cjEsIHN0cjI9IiIpOgo+ICsgICAgIiIiCj4gKyAgICBOaWNlbHkgcHJpbnQg dHdvIHN0cmluZ3MgYW5kIGFuIGFycm93Lgo+ICsKPiArICAgIEBwYXJhbSBzdHIxOiBGaXJzdCBz dHJpbmcuCj4gKyAgICBAcGFyYW0gc3RyMjogU2Vjb25kIHN0cmluZy4KPiArICAgICIiIgo+ICsg ICAgaWYgc3RyMjoKPiArICAgICAgICBzdHIgPSAiJS01MHMgLS0tPiAlcyIgJSAoc3RyMSwgc3Ry MikKPiArICAgIGVsc2U6Cj4gKyAgICAgICAgc3RyID0gc3RyMQo+ICsgICAgbG9nZ2luZy5kZWJ1 ZyhzdHIpCj4gKwo+ICsKPiArIyBjb25maWdyZWFkZXIKPiArCj4gK2NsYXNzIGNvbmZpZ3JlYWRl cjoKPiArICAgICIiIgo+ICsgICAgUHJlcHJvY2VzcyBhbiBpbnB1dCBzdHJpbmcgYW5kIHByb3Zp ZGUgZmlsZS1saWtlIHNlcnZpY2VzLgo+ICsgICAgVGhpcyBpcyBpbnRlbmRlZCBhcyBhIHJlcGxh Y2VtZW50IGZvciB0aGUgZmlsZSBhbmQgU3RyaW5nSU8gY2xhc3NlcywKPiArICAgIHdob3NlIHJl YWRsaW5lKCkgYW5kL29yIHNlZWsoKSBtZXRob2RzIHNlZW0gdG8gYmUgc2xvdy4KPiArICAgICIi Igo+ICsKPiArICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHIpOgo+ICsgICAgICAgICIiIgo+ICsg ICAgICAgIEluaXRpYWxpemUgdGhlIHJlYWRlci4KPiArCj4gKyAgICAgICAgQHBhcmFtIHN0cjog VGhlIHN0cmluZyB0byBwYXJzZS4KPiArICAgICAgICAiIiIKPiArICAgICAgICBzZWxmLmxpbmVf aW5kZXggPSAwCj4gKyAgICAgICAgc2VsZi5saW5lcyA9IFtdCj4gKyAgICAgICAgZm9yIGxpbmUg aW4gc3RyLnNwbGl0bGluZXMoKToKPiArICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCku ZXhwYW5kdGFicygpCj4gKyAgICAgICAgICAgIHN0cmlwcGVkX2xpbmUgPSBsaW5lLnN0cmlwKCkK PiArICAgICAgICAgICAgaW5kZW50ID0gbGVuKGxpbmUpIC0gbGVuKHN0cmlwcGVkX2xpbmUpCj4g KyAgICAgICAgICAgIGlmIChub3Qgc3RyaXBwZWRfbGluZQo+ICsgICAgICAgICAgICAgICAgb3Ig c3RyaXBwZWRfbGluZS5zdGFydHN3aXRoKCIjIikKPiArICAgICAgICAgICAgICAgIG9yIHN0cmlw cGVkX2xpbmUuc3RhcnRzd2l0aCgiLy8iKSk6Cj4gKyAgICAgICAgICAgICAgICBjb250aW51ZQo+ ICsgICAgICAgICAgICBzZWxmLmxpbmVzLmFwcGVuZCgobGluZSwgc3RyaXBwZWRfbGluZSwgaW5k ZW50KSkKPiArCj4gKwo+ICsgICAgZGVmIGdldF9uZXh0X2xpbmUoc2VsZik6Cj4gKyAgICAgICAg IiIiCj4gKyAgICAgICAgR2V0IHRoZSBuZXh0IG5vbi1lbXB0eSwgbm9uLWNvbW1lbnQgbGluZSBp biB0aGUgc3RyaW5nLgo+ICsKPiArICAgICAgICBAcGFyYW0gZmlsZTogRmlsZSBsaWtlIG9iamVj dC4KPiArICAgICAgICBAcmV0dXJuOiAobGluZSwgc3RyaXBwZWRfbGluZSwgaW5kZW50KSwgd2hl cmUgaW5kZW50IGlzIHRoZSBsaW5lJ3MKPiArICAgICAgICAgICAgaW5kZW50IGxldmVsIG9yIC0x IGlmIG5vIGxpbmUgaXMgYXZhaWxhYmxlLgo+ICsgICAgICAgICIiIgo+ICsgICAgICAgIHRyeToK PiArICAgICAgICAgICAgaWYgc2VsZi5saW5lX2luZGV4IDwgbGVuKHNlbGYubGluZXMpOgo+ICsg ICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubGluZXNbc2VsZi5saW5lX2luZGV4XQo+ICsgICAg ICAgICAgICBlbHNlOgo+ICsgICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCAtMSkK PiArICAgICAgICBmaW5hbGx5Ogo+ICsgICAgICAgICAgICBzZWxmLmxpbmVfaW5kZXggKz0gMQo+ ICsKPiArCj4gKyAgICBkZWYgdGVsbChzZWxmKToKPiArICAgICAgICAiIiIKPiArICAgICAgICBS ZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBpbmRleC4KPiArICAgICAgICAiIiIKPiArICAgICAgICBy ZXR1cm4gc2VsZi5saW5lX2luZGV4Cj4gKwo+ICsKPiArICAgIGRlZiBzZWVrKHNlbGYsIGluZGV4 KToKPiArICAgICAgICAiIiIKPiArICAgICAgICBTZXQgdGhlIGN1cnJlbnQgbGluZSBpbmRleC4K PiArICAgICAgICAiIiIKPiArICAgICAgICBzZWxmLmxpbmVfaW5kZXggPSBpbmRleAo+ICsKPiAr Cj4gKyMgQXJyYXkgc3RydWN0dXJlOgo+ICsjIC0tLS0tLS0tLS0tLS0tLS0KPiArIyBUaGUgZmly c3QgNCBlbGVtZW50cyBjb250YWluIHRoZSBpbmRpY2VzIG9mIHRoZSA0IHNlZ21lbnRzLgo+ICsj IGFbMF0gLS0gSW5kZXggb2YgYmVnaW5uaW5nIG9mICduYW1lJyBzZWdtZW50IChhbHdheXMgNCku Cj4gKyMgYVsxXSAtLSBJbmRleCBvZiBiZWdpbm5pbmcgb2YgJ3Nob3J0bmFtZScgc2VnbWVudC4K PiArIyBhWzJdIC0tIEluZGV4IG9mIGJlZ2lubmluZyBvZiAnZGVwZW5kJyBzZWdtZW50Lgo+ICsj IGFbM10gLS0gSW5kZXggb2YgYmVnaW5uaW5nIG9mICdjb250ZW50JyBzZWdtZW50Lgo+ICsjIFRo ZSBuZXh0IGVsZW1lbnRzIGluIHRoZSBhcnJheSBjb21wcmlzZSB0aGUgYWZvcmVtZW50aW9uZWQg c2VnbWVudHM6Cj4gKyMgVGhlICduYW1lJyBzZWdtZW50IGJlZ2lucyB3aXRoIGFbYVswXV0gYW5k IGVuZHMgd2l0aCBhW2FbMV0tMV0uCj4gKyMgVGhlICdzaG9ydG5hbWUnIHNlZ21lbnQgYmVnaW5z IHdpdGggYVthWzFdXSBhbmQgZW5kcyB3aXRoIGFbYVsyXS0xXS4KPiArIyBUaGUgJ2RlcGVuZCcg c2VnbWVudCBiZWdpbnMgd2l0aCBhW2FbMl1dIGFuZCBlbmRzIHdpdGggYVthWzNdLTFdLgo+ICsj IFRoZSAnY29udGVudCcgc2VnbWVudCBiZWdpbnMgd2l0aCBhW2FbM11dIGFuZCBlbmRzIGF0IHRo ZSBlbmQgb2YgdGhlIGFycmF5Lgo+ICsKPiArIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcHBl bmQvcHJlcGVuZCB0byB2YXJpb3VzIHNlZ21lbnRzIG9mIGFuIGFycmF5Lgo+ICsKPiArZGVmIF9h cnJheV9hcHBlbmRfdG9fbmFtZV9zaG9ydG5hbWVfZGVwZW5kKGEsIG5hbWUsIGRlcGVuZCk6Cj4g KyAgICBhLmluc2VydChhWzFdLCBuYW1lKQo+ICsgICAgYS5pbnNlcnQoYVsyXSArIDEsIG5hbWUp Cj4gKyAgICBhLmluc2VydChhWzNdICsgMiwgZGVwZW5kKQo+ICsgICAgYVsxXSArPSAxCj4gKyAg ICBhWzJdICs9IDIKPiArICAgIGFbM10gKz0gMwo+ICsKPiArCj4gK2RlZiBfYXJyYXlfcHJlcGVu ZF90b19uYW1lX3Nob3J0bmFtZV9kZXBlbmQoYSwgbmFtZSwgZGVwZW5kKToKPiArICAgIGFbMV0g Kz0gMQo+ICsgICAgYVsyXSArPSAyCj4gKyAgICBhWzNdICs9IDMKPiArICAgIGEuaW5zZXJ0KGFb MF0sIG5hbWUpCj4gKyAgICBhLmluc2VydChhWzFdLCBuYW1lKQo+ICsgICAgYS5pbnNlcnQoYVsy XSwgZGVwZW5kKQo+ICsKPiArCj4gK2RlZiBfYXJyYXlfYXBwZW5kX3RvX25hbWVfZGVwZW5kKGEs IG5hbWUsIGRlcGVuZCk6Cj4gKyAgICBhLmluc2VydChhWzFdLCBuYW1lKQo+ICsgICAgYS5pbnNl cnQoYVszXSArIDEsIGRlcGVuZCkKPiArICAgIGFbMV0gKz0gMQo+ICsgICAgYVsyXSArPSAxCj4g KyAgICBhWzNdICs9IDIKPiArCj4gKwo+ICtkZWYgX2FycmF5X3ByZXBlbmRfdG9fbmFtZV9kZXBl bmQoYSwgbmFtZSwgZGVwZW5kKToKPiArICAgIGFbMV0gKz0gMQo+ICsgICAgYVsyXSArPSAxCj4g KyAgICBhWzNdICs9IDIKPiArICAgIGEuaW5zZXJ0KGFbMF0sIG5hbWUpCj4gKyAgICBhLmluc2Vy dChhWzJdLCBkZXBlbmQpCj4gKwo+ICsKPiArZGVmIF9hcnJheV9hcHBlbmRfdG9fY29udGVudChh LCBjb250ZW50KToKPiArICAgIGEuYXBwZW5kKGNvbnRlbnQpCj4gKwo+ICsKPiArZGVmIF9hcnJh eV9nZXRfbmFtZShhLCBvYmplY3RfY2FjaGUpOgo+ICsgICAgIiIiCj4gKyAgICBSZXR1cm4gdGhl IG5hbWUgb2YgYSBkaWN0aW9uYXJ5IHJlcHJlc2VudGVkIGJ5IGEgZ2l2ZW4gYXJyYXkuCj4gKwo+ ICsgICAgQHBhcmFtIGE6IEFycmF5IHJlcHJlc2VudGluZyBhIGRpY3Rpb25hcnkuCj4gKyAgICBA cGFyYW0gb2JqZWN0X2NhY2hlOiBBIGxpc3Qgb2Ygc3RyaW5ncyByZWZlcmVuY2VkIGJ5IGVsZW1l bnRzIGluIHRoZSBhcnJheS4KPiArICAgICIiIgo+ICsgICAgcmV0dXJuICIuIi5qb2luKFtvYmpl Y3RfY2FjaGVbaV0gZm9yIGkgaW4gYVthWzBdOmFbMV1dXSkKPiArCj4gKwo+ICtkZWYgX2FycmF5 X2dldF9hbGwoYSwgb2JqZWN0X2NhY2hlKToKPiArICAgICIiIgo+ICsgICAgUmV0dXJuIGEgNC10 dXBsZSBjb250YWluaW5nIGFsbCB0aGUgZGF0YSBzdG9yZWQgaW4gYSBnaXZlbiBhcnJheSwgaW4g YQo+ICsgICAgZm9ybWF0IHRoYXQgaXMgZWFzeSB0byB0dXJuIGludG8gYW4gYWN0dWFsIGRpY3Rp b25hcnkuCj4gKwo+ICsgICAgQHBhcmFtIGE6IEFycmF5IHJlcHJlc2VudGluZyBhIGRpY3Rpb25h cnkuCj4gKyAgICBAcGFyYW0gb2JqZWN0X2NhY2hlOiBBIGxpc3Qgb2Ygc3RyaW5ncyByZWZlcmVu Y2VkIGJ5IGVsZW1lbnRzIGluIHRoZSBhcnJheS4KPiArICAgIEByZXR1cm46IEEgNC10dXBsZTog KG5hbWUsIHNob3J0bmFtZSwgZGVwZW5kLCBjb250ZW50KSwgaW4gd2hpY2ggYWxsCj4gKyAgICAg ICAgbWVtYmVycyBhcmUgc3RyaW5ncyBleGNlcHQgZGVwZW5kIHdoaWNoIGlzIGEgbGlzdCBvZiBz dHJpbmdzLgo+ICsgICAgIiIiCj4gKyAgICBuYW1lID0gIi4iLmpvaW4oW29iamVjdF9jYWNoZVtp XSBmb3IgaSBpbiBhW2FbMF06YVsxXV1dKQo+ICsgICAgc2hvcnRuYW1lID0gIi4iLmpvaW4oW29i amVjdF9jYWNoZVtpXSBmb3IgaSBpbiBhW2FbMV06YVsyXV1dKQo+ICsgICAgY29udGVudCA9ICIi LmpvaW4oW29iamVjdF9jYWNoZVtpXSBmb3IgaSBpbiBhW2FbM106XV0pCj4gKyAgICBkZXBlbmQg PSBbXQo+ICsgICAgcHJlZml4ID0gIiIKPiArICAgIGZvciBuLCBkIGluIHppcChhW2FbMF06YVsx XV0sIGFbYVsyXTphWzNdXSk6Cj4gKyAgICAgICAgZm9yIGRlcCBpbiBvYmplY3RfY2FjaGVbZF0u c3BsaXQoKToKPiArICAgICAgICAgICAgZGVwZW5kLmFwcGVuZChwcmVmaXggKyBkZXApCj4gKyAg ICAgICAgcHJlZml4ICs9IG9iamVjdF9jYWNoZVtuXSArICIuIgo+ICsgICAgcmV0dXJuIG5hbWUs IHNob3J0bmFtZSwgZGVwZW5kLCBjb250ZW50Cj4gKwo+ICAKPiAKPiAgaWYgX19uYW1lX18gPT0g Il9fbWFpbl9fIjoKPiAgICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigpCj4gICAg ICBwYXJzZXIuYWRkX29wdGlvbignLWYnLCAnLS1maWxlJywgZGVzdD0iZmlsZW5hbWUiLCBhY3Rp b249J3N0b3JlJywKPiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3BhdGggdG8gYSBjb25m aWcgZmlsZSB0aGF0IHdpbGwgYmUgcGFyc2VkLiAnCj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICdJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIHBhcnNlIGt2bV90ZXN0cy5jZmcgJwo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAnbG9jYXRlZCBpbnNpZGUgdGhlIGt2bSB0ZXN0IGRpci4n KQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgbm90IHNwZWNpZmllZCwgd2lsbCBw YXJzZSB0ZXN0cy5jZmcgbG9jYXRlZCAnCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdp bnNpZGUgdGhlIGt2bSB0ZXN0IGRpci4nKQo+ICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdmVy Ym9zZScsIGRlc3Q9ImRlYnVnIiwgYWN0aW9uPSdzdG9yZV90cnVlJywKPiAgICAgICAgICAgICAg ICAgICAgICAgIGhlbHA9J2luY2x1ZGUgZGVidWcgbWVzc2FnZXMgaW4gY29uc29sZSBvdXRwdXQn KQo+ICAKPiBAQCAtNTE4LDkgKzY5OCw5IEBAIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Cj4g ICAgICAjIEhlcmUgd2UgY29uZmlndXJlIHRoZSBzdGFuZCBhbG9uZSBwcm9ncmFtIHRvIHVzZSB0 aGUgYXV0b3Rlc3QKPiAgICAgICMgbG9nZ2luZyBzeXN0ZW0uCj4gICAgICBsb2dnaW5nX21hbmFn ZXIuY29uZmlndXJlX2xvZ2dpbmcoS3ZtTG9nZ2luZ0NvbmZpZygpLCB2ZXJib3NlPWRlYnVnKQo+ IC0gICAgbGlzdCA9IGNvbmZpZyhmaWxlbmFtZSwgZGVidWc9ZGVidWcpLmdldF9saXN0KCkKPiAr ICAgIGRpY3RzID0gY29uZmlnKGZpbGVuYW1lLCBkZWJ1Zz1kZWJ1ZykuZ2V0X2dlbmVyYXRvcigp Cj4gICAgICBpID0gMAo+IC0gICAgZm9yIGRpY3QgaW4gbGlzdDoKPiArICAgIGZvciBkaWN0IGlu IGRpY3RzOgo+ICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRGljdGlvbmFyeSAjJWQ6IiwgaSkKPiAg ICAgICAgICBrZXlzID0gZGljdC5rZXlzKCkKPiAgICAgICAgICBrZXlzLnNvcnQoKQoKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkF1dG90ZXN0IG1haWxp bmcgbGlzdApBdXRvdGVzdEB0ZXN0Lmtlcm5lbC5vcmcKaHR0cDovL3Rlc3Qua2VybmVsLm9yZy9j Z2ktYmluL21haWxtYW4vbGlzdGluZm8vYXV0b3Rlc3QK