From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Cummins Subject: [PATCH] assembler: Add a regions visualizer tool Date: Tue, 12 Mar 2013 17:53:01 +0000 Message-ID: <1363110781-27837-1-git-send-email-christopher.e.cummins@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id BF307E5D74 for ; Tue, 12 Mar 2013 10:53:24 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org VGhpcyBhZGRzIGEgaHRtbC9qcyB0b29sIGZvciB2aXN1YWxpemluZyBHRU4gaW5zdHJ1Y3Rpb24g c291cmNlIG9wZXJhbmQKcmVnaW9ucywgc2ltaWxhciB0byB0aG9zZSB1c2VkIGluIHRoZSBQcm9n cmFtbWVyJ3MgUmVmZXJlbmNlIE1hbnVhbC4gVG8KdXNlIHRoZSB0b29sLCBvcGVuIHRoZSBmaWxl IGFzc2VtYmxlci9nZW5fcmVnaW9ucy9nZW5fcmVnaW9ucy5odG1sIGluCnlvdXIgYnJvd3Nlci1v Zi1wcmVmZXJlbmNlLgotLS0KIGFzc2VtYmxlci9NYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxNyArCiAuLi4vYXNzZXRzL2Nzcy9ib290c3RyYXAtcmVzcG9uc2l2 ZS5jc3MgICAgICAgICAgICB8IDExMDkgKysrCiBhc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRz L2Nzcy9ib290c3RyYXAuY3NzICAgICB8IDYxNTggKysrKysrKysrKysrKwogYXNzZW1ibGVyL2dl bl9yZWdpb25zL2Fzc2V0cy9qcy9ib290c3RyYXAtYWxlcnQuanMgfCAgIDk5ICsKIC4uLi9nZW5f cmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLWJ1dHRvbi5qcyAgICAgIHwgIDEwNSArCiAuLi4v Z2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2Jvb3RzdHJhcC1jb2xsYXBzZS5qcyAgICB8ICAxNjcgKwog Li4uL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9ib290c3RyYXAtZHJvcGRvd24uanMgICAgfCAgMTY1 ICsKIGFzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLmpzICAgICAgIHwg MjI3NiArKysrKwogYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9nZW5fcmVnaW9ucy5q cyAgICAgfCAgNzk1ICsrCiBhc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2pxdWVyeS0x LjkuMS5qcyAgICB8IDk1OTcgKysrKysrKysrKysrKysrKysrKysKIC4uLi9nZW5fcmVnaW9ucy9h c3NldHMvanMvanF1ZXJ5LW1pZ3JhdGUtMS4xLjEuanMgIHwgIDUxMSArKwogLi4uL2dlbl9yZWdp b25zL2Fzc2V0cy9qcy9qcXVlcnkuYmEtaGFzaGNoYW5nZS5qcyAgfCAgMzkwICsKIGFzc2VtYmxl ci9nZW5fcmVnaW9ucy9hc3NldHMvanMvanF1ZXJ5LmhvdGtleXMuanMgIHwgIDEwMCArCiBhc3Nl bWJsZXIvZ2VuX3JlZ2lvbnMvZ2VuX3JlZ2lvbnMuaHRtbCAgICAgICAgICAgICB8ICAxNzMgKwog MTQgZmlsZXMgY2hhbmdlZCwgMjE2NjIgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGFzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvY3NzL2Jvb3RzdHJhcC1yZXNwb25zaXZlLmNz cwogY3JlYXRlIG1vZGUgMTAwNjQ0IGFzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvY3NzL2Jv b3RzdHJhcC5jc3MKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNz ZXRzL2pzL2Jvb3RzdHJhcC1hbGVydC5qcwogY3JlYXRlIG1vZGUgMTAwNjQ0IGFzc2VtYmxlci9n ZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLWJ1dHRvbi5qcwogY3JlYXRlIG1vZGUgMTAw NjQ0IGFzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLWNvbGxhcHNlLmpz CiBjcmVhdGUgbW9kZSAxMDA2NDQgYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9ib290 c3RyYXAtZHJvcGRvd24uanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhc3NlbWJsZXIvZ2VuX3JlZ2lv bnMvYXNzZXRzL2pzL2Jvb3RzdHJhcC5qcwogY3JlYXRlIG1vZGUgMTAwNjQ0IGFzc2VtYmxlci9n ZW5fcmVnaW9ucy9hc3NldHMvanMvZ2VuX3JlZ2lvbnMuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBh c3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2pxdWVyeS0xLjkuMS5qcwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGFzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvanF1ZXJ5LW1pZ3JhdGUt MS4xLjEuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRz L2pzL2pxdWVyeS5iYS1oYXNoY2hhbmdlLmpzCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXNzZW1ibGVy L2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9qcXVlcnkuaG90a2V5cy5qcwogY3JlYXRlIG1vZGUgMTAw NjQ0IGFzc2VtYmxlci9nZW5fcmVnaW9ucy9nZW5fcmVnaW9ucy5odG1sCgpkaWZmIC0tZ2l0IGEv YXNzZW1ibGVyL01ha2VmaWxlLmFtIGIvYXNzZW1ibGVyL01ha2VmaWxlLmFtCmluZGV4IDk1YmEw OGQuLmNiYzI5YTEgMTAwNjQ0Ci0tLSBhL2Fzc2VtYmxlci9NYWtlZmlsZS5hbQorKysgYi9hc3Nl bWJsZXIvTWFrZWZpbGUuYW0KQEAgLTQ0LDggKzQ0LDI1IEBAIGludGVsX2dlbjRkaXNhc21fTERB REQgPSBsaWJicncubGEKIHBrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKIHBrZ2Nv bmZpZ19EQVRBID0gaW50ZWwtZ2VuNGFzbS5wYwogCitnZW5fcmVnaW9uc19maWxlcyA9IAkJCQkJ XAorCWdlbl9yZWdpb25zL2dlbl9yZWdpb25zLmh0bWwJCQlcCisJZ2VuX3JlZ2lvbnMvYXNzZXRz L2Nzcy9ib290c3RyYXAtcmVzcG9uc2l2ZS5jc3MJXAorCWdlbl9yZWdpb25zL2Fzc2V0cy9jc3Mv Ym9vdHN0cmFwLmNzcwkJXAorCWdlbl9yZWdpb25zL2Fzc2V0cy9qcy9qcXVlcnktMS45LjEuanMJ CVwKKwlnZW5fcmVnaW9ucy9hc3NldHMvanMvanF1ZXJ5LmJhLWhhc2hjaGFuZ2UuanMJXAorCWdl bl9yZWdpb25zL2Fzc2V0cy9qcy9qcXVlcnkuaG90a2V5cy5qcwkJXAorCWdlbl9yZWdpb25zL2Fz c2V0cy9qcy9ib290c3RyYXAtYWxlcnQuanMJXAorCWdlbl9yZWdpb25zL2Fzc2V0cy9qcy9ib290 c3RyYXAtY29sbGFwc2UuanMJXAorCWdlbl9yZWdpb25zL2Fzc2V0cy9qcy9nZW5fcmVnaW9ucy5q cwkJXAorCWdlbl9yZWdpb25zL2Fzc2V0cy9qcy9ib290c3RyYXAtYnV0dG9uLmpzCVwKKwlnZW5f cmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLmpzCQlcCisJZ2VuX3JlZ2lvbnMvYXNzZXRzL2pz L2Jvb3RzdHJhcC1kcm9wZG93bi5qcwlcCisJZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2pxdWVyeS1t aWdyYXRlLTEuMS4xLmpzCVwKKwkkKE5VTEwpCisKIE1BSU5UQUlORVJDTEVBTkZJTEVTID0gJChC VUlMVF9TT1VSQ0VTKQogRVhUUkFfRElTVCA9IFwKKwkkKGdlbl9yZWdpb25zX2ZpbGVzKSBcCiAJ UkVBRE1FIFwKIAlUT0RPIFwKIAlpbnRlbC1nZW40YXNtLnBjLmluCmRpZmYgLS1naXQgYS9hc3Nl bWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2Nzcy9ib290c3RyYXAtcmVzcG9uc2l2ZS5jc3MgYi9h c3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2Nzcy9ib290c3RyYXAtcmVzcG9uc2l2ZS5jc3MK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkNzJmNwotLS0gL2Rldi9udWxs CisrKyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvY3NzL2Jvb3RzdHJhcC1yZXNwb25z aXZlLmNzcwpAQCAtMCwwICsxLDExMDkgQEAKKy8qIQorICogQm9vdHN0cmFwIFJlc3BvbnNpdmUg djIuMy4xCisgKgorICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jCisgKiBMaWNlbnNlZCB1 bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp Y2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRo ZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LgorICovCisKKy5j bGVhcmZpeCB7CisgICp6b29tOiAxOworfQorCisuY2xlYXJmaXg6YmVmb3JlLAorLmNsZWFyZml4 OmFmdGVyIHsKKyAgZGlzcGxheTogdGFibGU7CisgIGxpbmUtaGVpZ2h0OiAwOworICBjb250ZW50 OiAiIjsKK30KKworLmNsZWFyZml4OmFmdGVyIHsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy5oaWRl LXRleHQgeworICBmb250OiAwLzAgYTsKKyAgY29sb3I6IHRyYW5zcGFyZW50OworICB0ZXh0LXNo YWRvdzogbm9uZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIGJvcmRlcjog MDsKK30KKworLmlucHV0LWJsb2NrLWxldmVsIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHdpZHRo OiAxMDAlOworICBtaW4taGVpZ2h0OiAzMHB4OworICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRl ci1ib3g7CisgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgICAgICBib3gt c2l6aW5nOiBib3JkZXItYm94OworfQorCitALW1zLXZpZXdwb3J0IHsKKyAgd2lkdGg6IGRldmlj ZS13aWR0aDsKK30KKworLmhpZGRlbiB7CisgIGRpc3BsYXk6IG5vbmU7CisgIHZpc2liaWxpdHk6 IGhpZGRlbjsKK30KKworLnZpc2libGUtcGhvbmUgeworICBkaXNwbGF5OiBub25lICFpbXBvcnRh bnQ7Cit9CisKKy52aXNpYmxlLXRhYmxldCB7CisgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsK K30KKworLmhpZGRlbi1kZXNrdG9wIHsKKyAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OworfQor CisudmlzaWJsZS1kZXNrdG9wIHsKKyAgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OworfQor CitAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIGFuZCAobWF4LXdpZHRoOiA5NzlweCkgeworICAu aGlkZGVuLWRlc2t0b3AgeworICAgIGRpc3BsYXk6IGluaGVyaXQgIWltcG9ydGFudDsKKyAgfQor ICAudmlzaWJsZS1kZXNrdG9wIHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQgOworICB9 CisgIC52aXNpYmxlLXRhYmxldCB7CisgICAgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50Owor ICB9CisgIC5oaWRkZW4tdGFibGV0IHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cisg IH0KK30KKworQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7CisgIC5oaWRkZW4tZGVza3RvcCB7 CisgICAgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OworICB9CisgIC52aXNpYmxlLWRlc2t0 b3AgeworICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKKyAgfQorICAudmlzaWJsZS1waG9u ZSB7CisgICAgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OworICB9CisgIC5oaWRkZW4tcGhv bmUgeworICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKKyAgfQorfQorCisudmlzaWJsZS1w cmludCB7CisgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKK30KKworQG1lZGlhIHByaW50IHsK KyAgLnZpc2libGUtcHJpbnQgeworICAgIGRpc3BsYXk6IGluaGVyaXQgIWltcG9ydGFudDsKKyAg fQorICAuaGlkZGVuLXByaW50IHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CisgIH0K K30KKworQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgeworICAucm93IHsKKyAgICBtYXJnaW4t bGVmdDogLTMwcHg7CisgICAgKnpvb206IDE7CisgIH0KKyAgLnJvdzpiZWZvcmUsCisgIC5yb3c6 YWZ0ZXIgeworICAgIGRpc3BsYXk6IHRhYmxlOworICAgIGxpbmUtaGVpZ2h0OiAwOworICAgIGNv bnRlbnQ6ICIiOworICB9CisgIC5yb3c6YWZ0ZXIgeworICAgIGNsZWFyOiBib3RoOworICB9Cisg IFtjbGFzcyo9InNwYW4iXSB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWluLWhlaWdodDogMXB4 OworICAgIG1hcmdpbi1sZWZ0OiAzMHB4OworICB9CisgIC5jb250YWluZXIsCisgIC5uYXZiYXIt c3RhdGljLXRvcCAuY29udGFpbmVyLAorICAubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLAor ICAubmF2YmFyLWZpeGVkLWJvdHRvbSAuY29udGFpbmVyIHsKKyAgICB3aWR0aDogMTE3MHB4Owor ICB9CisgIC5zcGFuMTIgeworICAgIHdpZHRoOiAxMTcwcHg7CisgIH0KKyAgLnNwYW4xMSB7Cisg ICAgd2lkdGg6IDEwNzBweDsKKyAgfQorICAuc3BhbjEwIHsKKyAgICB3aWR0aDogOTcwcHg7Cisg IH0KKyAgLnNwYW45IHsKKyAgICB3aWR0aDogODcwcHg7CisgIH0KKyAgLnNwYW44IHsKKyAgICB3 aWR0aDogNzcwcHg7CisgIH0KKyAgLnNwYW43IHsKKyAgICB3aWR0aDogNjcwcHg7CisgIH0KKyAg LnNwYW42IHsKKyAgICB3aWR0aDogNTcwcHg7CisgIH0KKyAgLnNwYW41IHsKKyAgICB3aWR0aDog NDcwcHg7CisgIH0KKyAgLnNwYW40IHsKKyAgICB3aWR0aDogMzcwcHg7CisgIH0KKyAgLnNwYW4z IHsKKyAgICB3aWR0aDogMjcwcHg7CisgIH0KKyAgLnNwYW4yIHsKKyAgICB3aWR0aDogMTcwcHg7 CisgIH0KKyAgLnNwYW4xIHsKKyAgICB3aWR0aDogNzBweDsKKyAgfQorICAub2Zmc2V0MTIgewor ICAgIG1hcmdpbi1sZWZ0OiAxMjMwcHg7CisgIH0KKyAgLm9mZnNldDExIHsKKyAgICBtYXJnaW4t bGVmdDogMTEzMHB4OworICB9CisgIC5vZmZzZXQxMCB7CisgICAgbWFyZ2luLWxlZnQ6IDEwMzBw eDsKKyAgfQorICAub2Zmc2V0OSB7CisgICAgbWFyZ2luLWxlZnQ6IDkzMHB4OworICB9CisgIC5v ZmZzZXQ4IHsKKyAgICBtYXJnaW4tbGVmdDogODMwcHg7CisgIH0KKyAgLm9mZnNldDcgeworICAg IG1hcmdpbi1sZWZ0OiA3MzBweDsKKyAgfQorICAub2Zmc2V0NiB7CisgICAgbWFyZ2luLWxlZnQ6 IDYzMHB4OworICB9CisgIC5vZmZzZXQ1IHsKKyAgICBtYXJnaW4tbGVmdDogNTMwcHg7CisgIH0K KyAgLm9mZnNldDQgeworICAgIG1hcmdpbi1sZWZ0OiA0MzBweDsKKyAgfQorICAub2Zmc2V0MyB7 CisgICAgbWFyZ2luLWxlZnQ6IDMzMHB4OworICB9CisgIC5vZmZzZXQyIHsKKyAgICBtYXJnaW4t bGVmdDogMjMwcHg7CisgIH0KKyAgLm9mZnNldDEgeworICAgIG1hcmdpbi1sZWZ0OiAxMzBweDsK KyAgfQorICAucm93LWZsdWlkIHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICAqem9vbTogMTsKKyAg fQorICAucm93LWZsdWlkOmJlZm9yZSwKKyAgLnJvdy1mbHVpZDphZnRlciB7CisgICAgZGlzcGxh eTogdGFibGU7CisgICAgbGluZS1oZWlnaHQ6IDA7CisgICAgY29udGVudDogIiI7CisgIH0KKyAg LnJvdy1mbHVpZDphZnRlciB7CisgICAgY2xlYXI6IGJvdGg7CisgIH0KKyAgLnJvdy1mbHVpZCBb Y2xhc3MqPSJzcGFuIl0geworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGZsb2F0OiBsZWZ0Owor ICAgIHdpZHRoOiAxMDAlOworICAgIG1pbi1oZWlnaHQ6IDMwcHg7CisgICAgbWFyZ2luLWxlZnQ6 IDIuNTY0MTAyNTY0MTAyNTY0JTsKKyAgICAqbWFyZ2luLWxlZnQ6IDIuNTEwOTExMDc0NzQwODYx NiU7CisgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgIC1tb3otYm94 LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7 CisgIH0KKyAgLnJvdy1mbHVpZCBbY2xhc3MqPSJzcGFuIl06Zmlyc3QtY2hpbGQgeworICAgIG1h cmdpbi1sZWZ0OiAwOworICB9CisgIC5yb3ctZmx1aWQgLmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJz cGFuIl0gKyBbY2xhc3MqPSJzcGFuIl0geworICAgIG1hcmdpbi1sZWZ0OiAyLjU2NDEwMjU2NDEw MjU2NCU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjEyIHsKKyAgICB3aWR0aDogMTAwJTsKKyAg ICAqd2lkdGg6IDk5Ljk0NjgwODUxMDYzODI5JTsKKyAgfQorICAucm93LWZsdWlkIC5zcGFuMTEg eworICAgIHdpZHRoOiA5MS40NTI5OTE0NTI5OTE0NSU7CisgICAgKndpZHRoOiA5MS4zOTk3OTk5 NjM2Mjk3NSU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjEwIHsKKyAgICB3aWR0aDogODIuOTA1 OTgyOTA1OTgyOTElOworICAgICp3aWR0aDogODIuODUyNzkxNDE2NjIxMiU7CisgIH0KKyAgLnJv dy1mbHVpZCAuc3BhbjkgeworICAgIHdpZHRoOiA3NC4zNTg5NzQzNTg5NzQzNiU7CisgICAgKndp ZHRoOiA3NC4zMDU3ODI4Njk2MTI2NiU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjggeworICAg IHdpZHRoOiA2NS44MTE5NjU4MTE5NjU4MiU7CisgICAgKndpZHRoOiA2NS43NTg3NzQzMjI2MDQx MSU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjcgeworICAgIHdpZHRoOiA1Ny4yNjQ5NTcyNjQ5 NTcyNiU7CisgICAgKndpZHRoOiA1Ny4yMTE3NjU3NzU1OTU1NiU7CisgIH0KKyAgLnJvdy1mbHVp ZCAuc3BhbjYgeworICAgIHdpZHRoOiA0OC43MTc5NDg3MTc5NDg3MTUlOworICAgICp3aWR0aDog NDguNjY0NzU3MjI4NTg3MDE0JTsKKyAgfQorICAucm93LWZsdWlkIC5zcGFuNSB7CisgICAgd2lk dGg6IDQwLjE3MDk0MDE3MDk0MDE3JTsKKyAgICAqd2lkdGg6IDQwLjExNzc0ODY4MTU3ODQ3JTsK KyAgfQorICAucm93LWZsdWlkIC5zcGFuNCB7CisgICAgd2lkdGg6IDMxLjYyMzkzMTYyMzkzMTYy NSU7CisgICAgKndpZHRoOiAzMS41NzA3NDAxMzQ1Njk5MjQlOworICB9CisgIC5yb3ctZmx1aWQg LnNwYW4zIHsKKyAgICB3aWR0aDogMjMuMDc2OTIzMDc2OTIzMDc3JTsKKyAgICAqd2lkdGg6IDIz LjAyMzczMTU4NzU2MTM3NSU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjIgeworICAgIHdpZHRo OiAxNC41Mjk5MTQ1Mjk5MTQ1MyU7CisgICAgKndpZHRoOiAxNC40NzY3MjMwNDA1NTI4MjglOwor ICB9CisgIC5yb3ctZmx1aWQgLnNwYW4xIHsKKyAgICB3aWR0aDogNS45ODI5MDU5ODI5MDU5ODMl OworICAgICp3aWR0aDogNS45Mjk3MTQ0OTM1NDQyODElOworICB9CisgIC5yb3ctZmx1aWQgLm9m ZnNldDEyIHsKKyAgICBtYXJnaW4tbGVmdDogMTA1LjEyODIwNTEyODIwNTEyJTsKKyAgICAqbWFy Z2luLWxlZnQ6IDEwNS4wMjE4MjIxNDk0ODE3MSU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0 MTI6Zmlyc3QtY2hpbGQgeworICAgIG1hcmdpbi1sZWZ0OiAxMDIuNTY0MTAyNTY0MTAyNTclOwor ICAgICptYXJnaW4tbGVmdDogMTAyLjQ1NzcxOTU4NTM3OTE1JTsKKyAgfQorICAucm93LWZsdWlk IC5vZmZzZXQxMSB7CisgICAgbWFyZ2luLWxlZnQ6IDk2LjU4MTE5NjU4MTE5NjU4JTsKKyAgICAq bWFyZ2luLWxlZnQ6IDk2LjQ3NDgxMzYwMjQ3MzE2JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZz ZXQxMTpmaXJzdC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDk0LjAxNzA5NDAxNzA5NDAyJTsK KyAgICAqbWFyZ2luLWxlZnQ6IDkzLjkxMDcxMTAzODM3MDYxJTsKKyAgfQorICAucm93LWZsdWlk IC5vZmZzZXQxMCB7CisgICAgbWFyZ2luLWxlZnQ6IDg4LjAzNDE4ODAzNDE4ODAzJTsKKyAgICAq bWFyZ2luLWxlZnQ6IDg3LjkyNzgwNTA1NTQ2NDYyJTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZz ZXQxMDpmaXJzdC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDg1LjQ3MDA4NTQ3MDA4NTQ4JTsK KyAgICAqbWFyZ2luLWxlZnQ6IDg1LjM2MzcwMjQ5MTM2MjA2JTsKKyAgfQorICAucm93LWZsdWlk IC5vZmZzZXQ5IHsKKyAgICBtYXJnaW4tbGVmdDogNzkuNDg3MTc5NDg3MTc5NDklOworICAgICpt YXJnaW4tbGVmdDogNzkuMzgwNzk2NTA4NDU2MDclOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNl dDk6Zmlyc3QtY2hpbGQgeworICAgIG1hcmdpbi1sZWZ0OiA3Ni45MjMwNzY5MjMwNzY5MyU7Cisg ICAgKm1hcmdpbi1sZWZ0OiA3Ni44MTY2OTM5NDQzNTM1MiU7CisgIH0KKyAgLnJvdy1mbHVpZCAu b2Zmc2V0OCB7CisgICAgbWFyZ2luLWxlZnQ6IDcwLjk0MDE3MDk0MDE3MDk0JTsKKyAgICAqbWFy Z2luLWxlZnQ6IDcwLjgzMzc4Nzk2MTQ0NzUzJTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ4 OmZpcnN0LWNoaWxkIHsKKyAgICBtYXJnaW4tbGVmdDogNjguMzc2MDY4Mzc2MDY4MzklOworICAg ICptYXJnaW4tbGVmdDogNjguMjY5Njg1Mzk3MzQ0OTclOworICB9CisgIC5yb3ctZmx1aWQgLm9m ZnNldDcgeworICAgIG1hcmdpbi1sZWZ0OiA2Mi4zOTMxNjIzOTMxNjIzODUlOworICAgICptYXJn aW4tbGVmdDogNjIuMjg2Nzc5NDE0NDM4OTklOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNldDc6 Zmlyc3QtY2hpbGQgeworICAgIG1hcmdpbi1sZWZ0OiA1OS44MjkwNTk4MjkwNTk4MiU7CisgICAg Km1hcmdpbi1sZWZ0OiA1OS43MjI2NzY4NTAzMzY0MiU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zm c2V0NiB7CisgICAgbWFyZ2luLWxlZnQ6IDUzLjg0NjE1Mzg0NjE1Mzg0JTsKKyAgICAqbWFyZ2lu LWxlZnQ6IDUzLjczOTc3MDg2NzQzMDQ0NCU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0Njpm aXJzdC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDUxLjI4MjA1MTI4MjA1MTI4JTsKKyAgICAq bWFyZ2luLWxlZnQ6IDUxLjE3NTY2ODMwMzMyNzg3NSU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zm c2V0NSB7CisgICAgbWFyZ2luLWxlZnQ6IDQ1LjI5OTE0NTI5OTE0NTI5NSU7CisgICAgKm1hcmdp bi1sZWZ0OiA0NS4xOTI3NjIzMjA0MjE5JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ1OmZp cnN0LWNoaWxkIHsKKyAgICBtYXJnaW4tbGVmdDogNDIuNzM1MDQyNzM1MDQyNzMlOworICAgICpt YXJnaW4tbGVmdDogNDIuNjI4NjU5NzU2MzE5MzMlOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNl dDQgeworICAgIG1hcmdpbi1sZWZ0OiAzNi43NTIxMzY3NTIxMzY3NSU7CisgICAgKm1hcmdpbi1s ZWZ0OiAzNi42NDU3NTM3NzM0MTMzNTQlOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNldDQ6Zmly c3QtY2hpbGQgeworICAgIG1hcmdpbi1sZWZ0OiAzNC4xODgwMzQxODgwMzQxOSU7CisgICAgKm1h cmdpbi1sZWZ0OiAzNC4wODE2NTEyMDkzMTA3ODUlOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNl dDMgeworICAgIG1hcmdpbi1sZWZ0OiAyOC4yMDUxMjgyMDUxMjgyMDQlOworICAgICptYXJnaW4t bGVmdDogMjguMDk4NzQ1MjI2NDA0OCU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MzpmaXJz dC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDI1LjY0MTAyNTY0MTAyNTY0MiU7CisgICAgKm1h cmdpbi1sZWZ0OiAyNS41MzQ2NDI2NjIzMDIyNCU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0 MiB7CisgICAgbWFyZ2luLWxlZnQ6IDE5LjY1ODExOTY1ODExOTY2JTsKKyAgICAqbWFyZ2luLWxl ZnQ6IDE5LjU1MTczNjY3OTM5NjI1NyU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MjpmaXJz dC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDE3LjA5NDAxNzA5NDAxNzA5NCU7CisgICAgKm1h cmdpbi1sZWZ0OiAxNi45ODc2MzQxMTUyOTM2OSU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0 MSB7CisgICAgbWFyZ2luLWxlZnQ6IDExLjExMTExMTExMTExMTExJTsKKyAgICAqbWFyZ2luLWxl ZnQ6IDExLjAwNDcyODEzMjM4NzcwOCU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MTpmaXJz dC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDguNTQ3MDA4NTQ3MDA4NTQ3JTsKKyAgICAqbWFy Z2luLWxlZnQ6IDguNDQwNjI1NTY4Mjg1MTQyJTsKKyAgfQorICBpbnB1dCwKKyAgdGV4dGFyZWEs CisgIC51bmVkaXRhYmxlLWlucHV0IHsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgfQorICAuY29u dHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXSArIFtjbGFzcyo9InNwYW4iXSB7CisgICAgbWFyZ2lu LWxlZnQ6IDMwcHg7CisgIH0KKyAgaW5wdXQuc3BhbjEyLAorICB0ZXh0YXJlYS5zcGFuMTIsCisg IC51bmVkaXRhYmxlLWlucHV0LnNwYW4xMiB7CisgICAgd2lkdGg6IDExNTZweDsKKyAgfQorICBp bnB1dC5zcGFuMTEsCisgIHRleHRhcmVhLnNwYW4xMSwKKyAgLnVuZWRpdGFibGUtaW5wdXQuc3Bh bjExIHsKKyAgICB3aWR0aDogMTA1NnB4OworICB9CisgIGlucHV0LnNwYW4xMCwKKyAgdGV4dGFy ZWEuc3BhbjEwLAorICAudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTAgeworICAgIHdpZHRoOiA5NTZw eDsKKyAgfQorICBpbnB1dC5zcGFuOSwKKyAgdGV4dGFyZWEuc3BhbjksCisgIC51bmVkaXRhYmxl LWlucHV0LnNwYW45IHsKKyAgICB3aWR0aDogODU2cHg7CisgIH0KKyAgaW5wdXQuc3BhbjgsCisg IHRleHRhcmVhLnNwYW44LAorICAudW5lZGl0YWJsZS1pbnB1dC5zcGFuOCB7CisgICAgd2lkdGg6 IDc1NnB4OworICB9CisgIGlucHV0LnNwYW43LAorICB0ZXh0YXJlYS5zcGFuNywKKyAgLnVuZWRp dGFibGUtaW5wdXQuc3BhbjcgeworICAgIHdpZHRoOiA2NTZweDsKKyAgfQorICBpbnB1dC5zcGFu NiwKKyAgdGV4dGFyZWEuc3BhbjYsCisgIC51bmVkaXRhYmxlLWlucHV0LnNwYW42IHsKKyAgICB3 aWR0aDogNTU2cHg7CisgIH0KKyAgaW5wdXQuc3BhbjUsCisgIHRleHRhcmVhLnNwYW41LAorICAu dW5lZGl0YWJsZS1pbnB1dC5zcGFuNSB7CisgICAgd2lkdGg6IDQ1NnB4OworICB9CisgIGlucHV0 LnNwYW40LAorICB0ZXh0YXJlYS5zcGFuNCwKKyAgLnVuZWRpdGFibGUtaW5wdXQuc3BhbjQgewor ICAgIHdpZHRoOiAzNTZweDsKKyAgfQorICBpbnB1dC5zcGFuMywKKyAgdGV4dGFyZWEuc3BhbjMs CisgIC51bmVkaXRhYmxlLWlucHV0LnNwYW4zIHsKKyAgICB3aWR0aDogMjU2cHg7CisgIH0KKyAg aW5wdXQuc3BhbjIsCisgIHRleHRhcmVhLnNwYW4yLAorICAudW5lZGl0YWJsZS1pbnB1dC5zcGFu MiB7CisgICAgd2lkdGg6IDE1NnB4OworICB9CisgIGlucHV0LnNwYW4xLAorICB0ZXh0YXJlYS5z cGFuMSwKKyAgLnVuZWRpdGFibGUtaW5wdXQuc3BhbjEgeworICAgIHdpZHRoOiA1NnB4OworICB9 CisgIC50aHVtYm5haWxzIHsKKyAgICBtYXJnaW4tbGVmdDogLTMwcHg7CisgIH0KKyAgLnRodW1i bmFpbHMgPiBsaSB7CisgICAgbWFyZ2luLWxlZnQ6IDMwcHg7CisgIH0KKyAgLnJvdy1mbHVpZCAu dGh1bWJuYWlscyB7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgIH0KK30KKworQG1lZGlhIChtaW4t d2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogOTc5cHgpIHsKKyAgLnJvdyB7CisgICAgbWFy Z2luLWxlZnQ6IC0yMHB4OworICAgICp6b29tOiAxOworICB9CisgIC5yb3c6YmVmb3JlLAorICAu cm93OmFmdGVyIHsKKyAgICBkaXNwbGF5OiB0YWJsZTsKKyAgICBsaW5lLWhlaWdodDogMDsKKyAg ICBjb250ZW50OiAiIjsKKyAgfQorICAucm93OmFmdGVyIHsKKyAgICBjbGVhcjogYm90aDsKKyAg fQorICBbY2xhc3MqPSJzcGFuIl0geworICAgIGZsb2F0OiBsZWZ0OworICAgIG1pbi1oZWlnaHQ6 IDFweDsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKKyAgfQorICAuY29udGFpbmVyLAorICAubmF2 YmFyLXN0YXRpYy10b3AgLmNvbnRhaW5lciwKKyAgLm5hdmJhci1maXhlZC10b3AgLmNvbnRhaW5l ciwKKyAgLm5hdmJhci1maXhlZC1ib3R0b20gLmNvbnRhaW5lciB7CisgICAgd2lkdGg6IDcyNHB4 OworICB9CisgIC5zcGFuMTIgeworICAgIHdpZHRoOiA3MjRweDsKKyAgfQorICAuc3BhbjExIHsK KyAgICB3aWR0aDogNjYycHg7CisgIH0KKyAgLnNwYW4xMCB7CisgICAgd2lkdGg6IDYwMHB4Owor ICB9CisgIC5zcGFuOSB7CisgICAgd2lkdGg6IDUzOHB4OworICB9CisgIC5zcGFuOCB7CisgICAg d2lkdGg6IDQ3NnB4OworICB9CisgIC5zcGFuNyB7CisgICAgd2lkdGg6IDQxNHB4OworICB9Cisg IC5zcGFuNiB7CisgICAgd2lkdGg6IDM1MnB4OworICB9CisgIC5zcGFuNSB7CisgICAgd2lkdGg6 IDI5MHB4OworICB9CisgIC5zcGFuNCB7CisgICAgd2lkdGg6IDIyOHB4OworICB9CisgIC5zcGFu MyB7CisgICAgd2lkdGg6IDE2NnB4OworICB9CisgIC5zcGFuMiB7CisgICAgd2lkdGg6IDEwNHB4 OworICB9CisgIC5zcGFuMSB7CisgICAgd2lkdGg6IDQycHg7CisgIH0KKyAgLm9mZnNldDEyIHsK KyAgICBtYXJnaW4tbGVmdDogNzY0cHg7CisgIH0KKyAgLm9mZnNldDExIHsKKyAgICBtYXJnaW4t bGVmdDogNzAycHg7CisgIH0KKyAgLm9mZnNldDEwIHsKKyAgICBtYXJnaW4tbGVmdDogNjQwcHg7 CisgIH0KKyAgLm9mZnNldDkgeworICAgIG1hcmdpbi1sZWZ0OiA1NzhweDsKKyAgfQorICAub2Zm c2V0OCB7CisgICAgbWFyZ2luLWxlZnQ6IDUxNnB4OworICB9CisgIC5vZmZzZXQ3IHsKKyAgICBt YXJnaW4tbGVmdDogNDU0cHg7CisgIH0KKyAgLm9mZnNldDYgeworICAgIG1hcmdpbi1sZWZ0OiAz OTJweDsKKyAgfQorICAub2Zmc2V0NSB7CisgICAgbWFyZ2luLWxlZnQ6IDMzMHB4OworICB9Cisg IC5vZmZzZXQ0IHsKKyAgICBtYXJnaW4tbGVmdDogMjY4cHg7CisgIH0KKyAgLm9mZnNldDMgewor ICAgIG1hcmdpbi1sZWZ0OiAyMDZweDsKKyAgfQorICAub2Zmc2V0MiB7CisgICAgbWFyZ2luLWxl ZnQ6IDE0NHB4OworICB9CisgIC5vZmZzZXQxIHsKKyAgICBtYXJnaW4tbGVmdDogODJweDsKKyAg fQorICAucm93LWZsdWlkIHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICAqem9vbTogMTsKKyAgfQor ICAucm93LWZsdWlkOmJlZm9yZSwKKyAgLnJvdy1mbHVpZDphZnRlciB7CisgICAgZGlzcGxheTog dGFibGU7CisgICAgbGluZS1oZWlnaHQ6IDA7CisgICAgY29udGVudDogIiI7CisgIH0KKyAgLnJv dy1mbHVpZDphZnRlciB7CisgICAgY2xlYXI6IGJvdGg7CisgIH0KKyAgLnJvdy1mbHVpZCBbY2xh c3MqPSJzcGFuIl0geworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGZsb2F0OiBsZWZ0OworICAg IHdpZHRoOiAxMDAlOworICAgIG1pbi1oZWlnaHQ6IDMwcHg7CisgICAgbWFyZ2luLWxlZnQ6IDIu NzYyNDMwOTM5MjI2NTE5NCU7CisgICAgKm1hcmdpbi1sZWZ0OiAyLjcwOTIzOTQ0OTg2NDgxNyU7 CisgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgIC1tb3otYm94LXNp emluZzogYm9yZGVyLWJveDsKKyAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cisg IH0KKyAgLnJvdy1mbHVpZCBbY2xhc3MqPSJzcGFuIl06Zmlyc3QtY2hpbGQgeworICAgIG1hcmdp bi1sZWZ0OiAwOworICB9CisgIC5yb3ctZmx1aWQgLmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFu Il0gKyBbY2xhc3MqPSJzcGFuIl0geworICAgIG1hcmdpbi1sZWZ0OiAyLjc2MjQzMDkzOTIyNjUx OTQlOworICB9CisgIC5yb3ctZmx1aWQgLnNwYW4xMiB7CisgICAgd2lkdGg6IDEwMCU7CisgICAg KndpZHRoOiA5OS45NDY4MDg1MTA2MzgyOSU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjExIHsK KyAgICB3aWR0aDogOTEuNDM2NDY0MDg4Mzk3NzglOworICAgICp3aWR0aDogOTEuMzgzMjcyNTk5 MDM2MDglOworICB9CisgIC5yb3ctZmx1aWQgLnNwYW4xMCB7CisgICAgd2lkdGg6IDgyLjg3Mjky ODE3Njc5NTU4JTsKKyAgICAqd2lkdGg6IDgyLjgxOTczNjY4NzQzMzg3JTsKKyAgfQorICAucm93 LWZsdWlkIC5zcGFuOSB7CisgICAgd2lkdGg6IDc0LjMwOTM5MjI2NTE5MzM3JTsKKyAgICAqd2lk dGg6IDc0LjI1NjIwMDc3NTgzMTY2JTsKKyAgfQorICAucm93LWZsdWlkIC5zcGFuOCB7CisgICAg d2lkdGg6IDY1Ljc0NTg1NjM1MzU5MTE3JTsKKyAgICAqd2lkdGg6IDY1LjY5MjY2NDg2NDIyOTQ2 JTsKKyAgfQorICAucm93LWZsdWlkIC5zcGFuNyB7CisgICAgd2lkdGg6IDU3LjE4MjMyMDQ0MTk4 ODk1JTsKKyAgICAqd2lkdGg6IDU3LjEyOTEyODk1MjYyNzI1JTsKKyAgfQorICAucm93LWZsdWlk IC5zcGFuNiB7CisgICAgd2lkdGg6IDQ4LjYxODc4NDUzMDM4Njc0JTsKKyAgICAqd2lkdGg6IDQ4 LjU2NTU5MzA0MTAyNTA0JTsKKyAgfQorICAucm93LWZsdWlkIC5zcGFuNSB7CisgICAgd2lkdGg6 IDQwLjA1NTI0ODYxODc4NDUzJTsKKyAgICAqd2lkdGg6IDQwLjAwMjA1NzEyOTQyMjgzJTsKKyAg fQorICAucm93LWZsdWlkIC5zcGFuNCB7CisgICAgd2lkdGg6IDMxLjQ5MTcxMjcwNzE4MjMyMyU7 CisgICAgKndpZHRoOiAzMS40Mzg1MjEyMTc4MjA2MiU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3Bh bjMgeworICAgIHdpZHRoOiAyMi45MjgxNzY3OTU1ODAxMSU7CisgICAgKndpZHRoOiAyMi44NzQ5 ODUzMDYyMTg0MSU7CisgIH0KKyAgLnJvdy1mbHVpZCAuc3BhbjIgeworICAgIHdpZHRoOiAxNC4z NjQ2NDA4ODM5Nzc5JTsKKyAgICAqd2lkdGg6IDE0LjMxMTQ0OTM5NDYxNjE5OSU7CisgIH0KKyAg LnJvdy1mbHVpZCAuc3BhbjEgeworICAgIHdpZHRoOiA1LjgwMTEwNDk3MjM3NTY5MSU7CisgICAg KndpZHRoOiA1Ljc0NzkxMzQ4MzAxMzk4OCU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MTIg eworICAgIG1hcmdpbi1sZWZ0OiAxMDUuNTI0ODYxODc4NDUzMDQlOworICAgICptYXJnaW4tbGVm dDogMTA1LjQxODQ3ODg5OTcyOTYyJTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQxMjpmaXJz dC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDEwMi43NjI0MzA5MzkyMjY1MiU7CisgICAgKm1h cmdpbi1sZWZ0OiAxMDIuNjU2MDQ3OTYwNTAzMSU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0 MTEgeworICAgIG1hcmdpbi1sZWZ0OiA5Ni45NjEzMjU5NjY4NTA4MiU7CisgICAgKm1hcmdpbi1s ZWZ0OiA5Ni44NTQ5NDI5ODgxMjc0JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQxMTpmaXJz dC1jaGlsZCB7CisgICAgbWFyZ2luLWxlZnQ6IDk0LjE5ODg5NTAyNzYyNDMlOworICAgICptYXJn aW4tbGVmdDogOTQuMDkyNTEyMDQ4OTAwODklOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNldDEw IHsKKyAgICBtYXJnaW4tbGVmdDogODguMzk3NzkwMDU1MjQ4NjIlOworICAgICptYXJnaW4tbGVm dDogODguMjkxNDA3MDc2NTI1MiU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MTA6Zmlyc3Qt Y2hpbGQgeworICAgIG1hcmdpbi1sZWZ0OiA4NS42MzUzNTkxMTYwMjIxJTsKKyAgICAqbWFyZ2lu LWxlZnQ6IDg1LjUyODk3NjEzNzI5ODY4JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ5IHsK KyAgICBtYXJnaW4tbGVmdDogNzkuODM0MjU0MTQzNjQ2NCU7CisgICAgKm1hcmdpbi1sZWZ0OiA3 OS43Mjc4NzExNjQ5MjI5OSU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0OTpmaXJzdC1jaGls ZCB7CisgICAgbWFyZ2luLWxlZnQ6IDc3LjA3MTgyMzIwNDQxOTg5JTsKKyAgICAqbWFyZ2luLWxl ZnQ6IDc2Ljk2NTQ0MDIyNTY5NjQ3JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ4IHsKKyAg ICBtYXJnaW4tbGVmdDogNzEuMjcwNzE4MjMyMDQ0MiU7CisgICAgKm1hcmdpbi1sZWZ0OiA3MS4x NjQzMzUyNTMzMjA3OSU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0ODpmaXJzdC1jaGlsZCB7 CisgICAgbWFyZ2luLWxlZnQ6IDY4LjUwODI4NzI5MjgxNzY4JTsKKyAgICAqbWFyZ2luLWxlZnQ6 IDY4LjQwMTkwNDMxNDA5NDI3JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ3IHsKKyAgICBt YXJnaW4tbGVmdDogNjIuNzA3MTgyMzIwNDQxOTklOworICAgICptYXJnaW4tbGVmdDogNjIuNjAw Nzk5MzQxNzE4NTg0JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ3OmZpcnN0LWNoaWxkIHsK KyAgICBtYXJnaW4tbGVmdDogNTkuOTQ0NzUxMzgxMjE1NDclOworICAgICptYXJnaW4tbGVmdDog NTkuODM4MzY4NDAyNDkyMDY1JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ2IHsKKyAgICBt YXJnaW4tbGVmdDogNTQuMTQzNjQ2NDA4ODM5NzglOworICAgICptYXJnaW4tbGVmdDogNTQuMDM3 MjYzNDMwMTE2Mzc2JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ2OmZpcnN0LWNoaWxkIHsK KyAgICBtYXJnaW4tbGVmdDogNTEuMzgxMjE1NDY5NjEzMjYlOworICAgICptYXJnaW4tbGVmdDog NTEuMjc0ODMyNDkwODg5ODYlOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNldDUgeworICAgIG1h cmdpbi1sZWZ0OiA0NS41ODAxMTA0OTcyMzc1NyU7CisgICAgKm1hcmdpbi1sZWZ0OiA0NS40NzM3 Mjc1MTg1MTQxNyU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0NTpmaXJzdC1jaGlsZCB7Cisg ICAgbWFyZ2luLWxlZnQ6IDQyLjgxNzY3OTU1ODAxMTA1JTsKKyAgICAqbWFyZ2luLWxlZnQ6IDQy LjcxMTI5NjU3OTI4NzY1JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQ0IHsKKyAgICBtYXJn aW4tbGVmdDogMzcuMDE2NTc0NTg1NjM1MzYlOworICAgICptYXJnaW4tbGVmdDogMzYuOTEwMTkx NjA2OTExOTYlOworICB9CisgIC5yb3ctZmx1aWQgLm9mZnNldDQ6Zmlyc3QtY2hpbGQgeworICAg IG1hcmdpbi1sZWZ0OiAzNC4yNTQxNDM2NDY0MDg4NCU7CisgICAgKm1hcmdpbi1sZWZ0OiAzNC4x NDc3NjA2Njc2ODU0NCU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MyB7CisgICAgbWFyZ2lu LWxlZnQ6IDI4LjQ1MzAzODY3NDAzMzE1JTsKKyAgICAqbWFyZ2luLWxlZnQ6IDI4LjM0NjY1NTY5 NTMwOTc0NiU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MzpmaXJzdC1jaGlsZCB7CisgICAg bWFyZ2luLWxlZnQ6IDI1LjY5MDYwNzczNDgwNjYzJTsKKyAgICAqbWFyZ2luLWxlZnQ6IDI1LjU4 NDIyNDc1NjA4MzIyNyU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MiB7CisgICAgbWFyZ2lu LWxlZnQ6IDE5Ljg4OTUwMjc2MjQzMDk0JTsKKyAgICAqbWFyZ2luLWxlZnQ6IDE5Ljc4MzExOTc4 MzcwNzUzNyU7CisgIH0KKyAgLnJvdy1mbHVpZCAub2Zmc2V0MjpmaXJzdC1jaGlsZCB7CisgICAg bWFyZ2luLWxlZnQ6IDE3LjEyNzA3MTgyMzIwNDQyJTsKKyAgICAqbWFyZ2luLWxlZnQ6IDE3LjAy MDY4ODg0NDQ4MTAyJTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQxIHsKKyAgICBtYXJnaW4t bGVmdDogMTEuMzI1OTY2ODUwODI4NzMlOworICAgICptYXJnaW4tbGVmdDogMTEuMjE5NTgzODcy MTA1MzI1JTsKKyAgfQorICAucm93LWZsdWlkIC5vZmZzZXQxOmZpcnN0LWNoaWxkIHsKKyAgICBt YXJnaW4tbGVmdDogOC41NjM1MzU5MTE2MDIyMSU7CisgICAgKm1hcmdpbi1sZWZ0OiA4LjQ1NzE1 MjkzMjg3ODgwNiU7CisgIH0KKyAgaW5wdXQsCisgIHRleHRhcmVhLAorICAudW5lZGl0YWJsZS1p bnB1dCB7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgIH0KKyAgLmNvbnRyb2xzLXJvdyBbY2xhc3Mq PSJzcGFuIl0gKyBbY2xhc3MqPSJzcGFuIl0geworICAgIG1hcmdpbi1sZWZ0OiAyMHB4OworICB9 CisgIGlucHV0LnNwYW4xMiwKKyAgdGV4dGFyZWEuc3BhbjEyLAorICAudW5lZGl0YWJsZS1pbnB1 dC5zcGFuMTIgeworICAgIHdpZHRoOiA3MTBweDsKKyAgfQorICBpbnB1dC5zcGFuMTEsCisgIHRl eHRhcmVhLnNwYW4xMSwKKyAgLnVuZWRpdGFibGUtaW5wdXQuc3BhbjExIHsKKyAgICB3aWR0aDog NjQ4cHg7CisgIH0KKyAgaW5wdXQuc3BhbjEwLAorICB0ZXh0YXJlYS5zcGFuMTAsCisgIC51bmVk aXRhYmxlLWlucHV0LnNwYW4xMCB7CisgICAgd2lkdGg6IDU4NnB4OworICB9CisgIGlucHV0LnNw YW45LAorICB0ZXh0YXJlYS5zcGFuOSwKKyAgLnVuZWRpdGFibGUtaW5wdXQuc3BhbjkgeworICAg IHdpZHRoOiA1MjRweDsKKyAgfQorICBpbnB1dC5zcGFuOCwKKyAgdGV4dGFyZWEuc3BhbjgsCisg IC51bmVkaXRhYmxlLWlucHV0LnNwYW44IHsKKyAgICB3aWR0aDogNDYycHg7CisgIH0KKyAgaW5w dXQuc3BhbjcsCisgIHRleHRhcmVhLnNwYW43LAorICAudW5lZGl0YWJsZS1pbnB1dC5zcGFuNyB7 CisgICAgd2lkdGg6IDQwMHB4OworICB9CisgIGlucHV0LnNwYW42LAorICB0ZXh0YXJlYS5zcGFu NiwKKyAgLnVuZWRpdGFibGUtaW5wdXQuc3BhbjYgeworICAgIHdpZHRoOiAzMzhweDsKKyAgfQor ICBpbnB1dC5zcGFuNSwKKyAgdGV4dGFyZWEuc3BhbjUsCisgIC51bmVkaXRhYmxlLWlucHV0LnNw YW41IHsKKyAgICB3aWR0aDogMjc2cHg7CisgIH0KKyAgaW5wdXQuc3BhbjQsCisgIHRleHRhcmVh LnNwYW40LAorICAudW5lZGl0YWJsZS1pbnB1dC5zcGFuNCB7CisgICAgd2lkdGg6IDIxNHB4Owor ICB9CisgIGlucHV0LnNwYW4zLAorICB0ZXh0YXJlYS5zcGFuMywKKyAgLnVuZWRpdGFibGUtaW5w dXQuc3BhbjMgeworICAgIHdpZHRoOiAxNTJweDsKKyAgfQorICBpbnB1dC5zcGFuMiwKKyAgdGV4 dGFyZWEuc3BhbjIsCisgIC51bmVkaXRhYmxlLWlucHV0LnNwYW4yIHsKKyAgICB3aWR0aDogOTBw eDsKKyAgfQorICBpbnB1dC5zcGFuMSwKKyAgdGV4dGFyZWEuc3BhbjEsCisgIC51bmVkaXRhYmxl LWlucHV0LnNwYW4xIHsKKyAgICB3aWR0aDogMjhweDsKKyAgfQorfQorCitAbWVkaWEgKG1heC13 aWR0aDogNzY3cHgpIHsKKyAgYm9keSB7CisgICAgcGFkZGluZy1yaWdodDogMjBweDsKKyAgICBw YWRkaW5nLWxlZnQ6IDIwcHg7CisgIH0KKyAgLm5hdmJhci1maXhlZC10b3AsCisgIC5uYXZiYXIt Zml4ZWQtYm90dG9tLAorICAubmF2YmFyLXN0YXRpYy10b3AgeworICAgIG1hcmdpbi1yaWdodDog LTIwcHg7CisgICAgbWFyZ2luLWxlZnQ6IC0yMHB4OworICB9CisgIC5jb250YWluZXItZmx1aWQg eworICAgIHBhZGRpbmc6IDA7CisgIH0KKyAgLmRsLWhvcml6b250YWwgZHQgeworICAgIGZsb2F0 OiBub25lOworICAgIHdpZHRoOiBhdXRvOworICAgIGNsZWFyOiBub25lOworICAgIHRleHQtYWxp Z246IGxlZnQ7CisgIH0KKyAgLmRsLWhvcml6b250YWwgZGQgeworICAgIG1hcmdpbi1sZWZ0OiAw OworICB9CisgIC5jb250YWluZXIgeworICAgIHdpZHRoOiBhdXRvOworICB9CisgIC5yb3ctZmx1 aWQgeworICAgIHdpZHRoOiAxMDAlOworICB9CisgIC5yb3csCisgIC50aHVtYm5haWxzIHsKKyAg ICBtYXJnaW4tbGVmdDogMDsKKyAgfQorICAudGh1bWJuYWlscyA+IGxpIHsKKyAgICBmbG9hdDog bm9uZTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgfQorICBbY2xhc3MqPSJzcGFuIl0sCisgIC51 bmVkaXRhYmxlLWlucHV0W2NsYXNzKj0ic3BhbiJdLAorICAucm93LWZsdWlkIFtjbGFzcyo9InNw YW4iXSB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgZmxvYXQ6IG5vbmU7CisgICAgd2lkdGg6 IDEwMCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3Jk ZXItYm94OworICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgICAgICAg IGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIH0KKyAgLnNwYW4xMiwKKyAgLnJvdy1mbHVpZCAu c3BhbjEyIHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRl ci1ib3g7CisgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgICAgICAg Ym94LXNpemluZzogYm9yZGVyLWJveDsKKyAgfQorICAucm93LWZsdWlkIFtjbGFzcyo9Im9mZnNl dCJdOmZpcnN0LWNoaWxkIHsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgfQorICAuaW5wdXQtbGFy Z2UsCisgIC5pbnB1dC14bGFyZ2UsCisgIC5pbnB1dC14eGxhcmdlLAorICBpbnB1dFtjbGFzcyo9 InNwYW4iXSwKKyAgc2VsZWN0W2NsYXNzKj0ic3BhbiJdLAorICB0ZXh0YXJlYVtjbGFzcyo9InNw YW4iXSwKKyAgLnVuZWRpdGFibGUtaW5wdXQgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHdp ZHRoOiAxMDAlOworICAgIG1pbi1oZWlnaHQ6IDMwcHg7CisgICAgLXdlYmtpdC1ib3gtc2l6aW5n OiBib3JkZXItYm94OworICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAg ICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIH0KKyAgLmlucHV0LXByZXBlbmQgaW5w dXQsCisgIC5pbnB1dC1hcHBlbmQgaW5wdXQsCisgIC5pbnB1dC1wcmVwZW5kIGlucHV0W2NsYXNz Kj0ic3BhbiJdLAorICAuaW5wdXQtYXBwZW5kIGlucHV0W2NsYXNzKj0ic3BhbiJdIHsKKyAgICBk aXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgd2lkdGg6IGF1dG87CisgIH0KKyAgLmNvbnRyb2xz LXJvdyBbY2xhc3MqPSJzcGFuIl0gKyBbY2xhc3MqPSJzcGFuIl0geworICAgIG1hcmdpbi1sZWZ0 OiAwOworICB9CisgIC5tb2RhbCB7CisgICAgcG9zaXRpb246IGZpeGVkOworICAgIHRvcDogMjBw eDsKKyAgICByaWdodDogMjBweDsKKyAgICBsZWZ0OiAyMHB4OworICAgIHdpZHRoOiBhdXRvOwor ICAgIG1hcmdpbjogMDsKKyAgfQorICAubW9kYWwuZmFkZSB7CisgICAgdG9wOiAtMTAwcHg7Cisg IH0KKyAgLm1vZGFsLmZhZGUuaW4geworICAgIHRvcDogMjBweDsKKyAgfQorfQorCitAbWVkaWEg KG1heC13aWR0aDogNDgwcHgpIHsKKyAgLm5hdi1jb2xsYXBzZSB7CisgICAgLXdlYmtpdC10cmFu c2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOworICB9CisgIC5wYWdlLWhlYWRlciBoMSBzbWFs bCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIH0KKyAg aW5wdXRbdHlwZT0iY2hlY2tib3giXSwKKyAgaW5wdXRbdHlwZT0icmFkaW8iXSB7CisgICAgYm9y ZGVyOiAxcHggc29saWQgI2NjYzsKKyAgfQorICAuZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxh YmVsIHsKKyAgICBmbG9hdDogbm9uZTsKKyAgICB3aWR0aDogYXV0bzsKKyAgICBwYWRkaW5nLXRv cDogMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICB9CisgIC5mb3JtLWhvcml6b250YWwgLmNv bnRyb2xzIHsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgfQorICAuZm9ybS1ob3Jpem9udGFsIC5j b250cm9sLWxpc3QgeworICAgIHBhZGRpbmctdG9wOiAwOworICB9CisgIC5mb3JtLWhvcml6b250 YWwgLmZvcm0tYWN0aW9ucyB7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICBwYWRkaW5n LWxlZnQ6IDEwcHg7CisgIH0KKyAgLm1lZGlhIC5wdWxsLWxlZnQsCisgIC5tZWRpYSAucHVsbC1y aWdodCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgZmxvYXQ6IG5vbmU7CisgICAgbWFyZ2lu LWJvdHRvbTogMTBweDsKKyAgfQorICAubWVkaWEtb2JqZWN0IHsKKyAgICBtYXJnaW4tcmlnaHQ6 IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgIH0KKyAgLm1vZGFsIHsKKyAgICB0b3A6IDEwcHg7 CisgICAgcmlnaHQ6IDEwcHg7CisgICAgbGVmdDogMTBweDsKKyAgfQorICAubW9kYWwtaGVhZGVy IC5jbG9zZSB7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBtYXJnaW46IC0xMHB4OworICB9Cisg IC5jYXJvdXNlbC1jYXB0aW9uIHsKKyAgICBwb3NpdGlvbjogc3RhdGljOworICB9Cit9CisKK0Bt ZWRpYSAobWF4LXdpZHRoOiA5NzlweCkgeworICBib2R5IHsKKyAgICBwYWRkaW5nLXRvcDogMDsK KyAgfQorICAubmF2YmFyLWZpeGVkLXRvcCwKKyAgLm5hdmJhci1maXhlZC1ib3R0b20geworICAg IHBvc2l0aW9uOiBzdGF0aWM7CisgIH0KKyAgLm5hdmJhci1maXhlZC10b3AgeworICAgIG1hcmdp bi1ib3R0b206IDIwcHg7CisgIH0KKyAgLm5hdmJhci1maXhlZC1ib3R0b20geworICAgIG1hcmdp bi10b3A6IDIwcHg7CisgIH0KKyAgLm5hdmJhci1maXhlZC10b3AgLm5hdmJhci1pbm5lciwKKyAg Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1pbm5lciB7CisgICAgcGFkZGluZzogNXB4Owor ICB9CisgIC5uYXZiYXIgLmNvbnRhaW5lciB7CisgICAgd2lkdGg6IGF1dG87CisgICAgcGFkZGlu ZzogMDsKKyAgfQorICAubmF2YmFyIC5icmFuZCB7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsK KyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgbWFyZ2luOiAwIDAgMCAtNXB4OworICB9Cisg IC5uYXYtY29sbGFwc2UgeworICAgIGNsZWFyOiBib3RoOworICB9CisgIC5uYXYtY29sbGFwc2Ug Lm5hdiB7CisgICAgZmxvYXQ6IG5vbmU7CisgICAgbWFyZ2luOiAwIDAgMTBweDsKKyAgfQorICAu bmF2LWNvbGxhcHNlIC5uYXYgPiBsaSB7CisgICAgZmxvYXQ6IG5vbmU7CisgIH0KKyAgLm5hdi1j b2xsYXBzZSAubmF2ID4gbGkgPiBhIHsKKyAgICBtYXJnaW4tYm90dG9tOiAycHg7CisgIH0KKyAg Lm5hdi1jb2xsYXBzZSAubmF2ID4gLmRpdmlkZXItdmVydGljYWwgeworICAgIGRpc3BsYXk6IG5v bmU7CisgIH0KKyAgLm5hdi1jb2xsYXBzZSAubmF2IC5uYXYtaGVhZGVyIHsKKyAgICBjb2xvcjog Izc3Nzc3NzsKKyAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgfQorICAubmF2LWNvbGxhcHNlIC5u YXYgPiBsaSA+IGEsCisgIC5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnUgYSB7CisgICAgcGFk ZGluZzogOXB4IDE1cHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgY29sb3I6ICM3Nzc3 Nzc7CisgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICAgLW1vei1ib3JkZXIt cmFkaXVzOiAzcHg7CisgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgIH0KKyAgLm5h di1jb2xsYXBzZSAuYnRuIHsKKyAgICBwYWRkaW5nOiA0cHggMTBweCA0cHg7CisgICAgZm9udC13 ZWlnaHQ6IG5vcm1hbDsKKyAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAt bW96LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsK KyAgfQorICAubmF2LWNvbGxhcHNlIC5kcm9wZG93bi1tZW51IGxpICsgbGkgYSB7CisgICAgbWFy Z2luLWJvdHRvbTogMnB4OworICB9CisgIC5uYXYtY29sbGFwc2UgLm5hdiA+IGxpID4gYTpob3Zl ciwKKyAgLm5hdi1jb2xsYXBzZSAubmF2ID4gbGkgPiBhOmZvY3VzLAorICAubmF2LWNvbGxhcHNl IC5kcm9wZG93bi1tZW51IGE6aG92ZXIsCisgIC5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnUg YTpmb2N1cyB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsKKyAgfQorICAubmF2YmFy LWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2ID4gbGkgPiBhLAorICAubmF2YmFyLWludmVyc2Ug Lm5hdi1jb2xsYXBzZSAuZHJvcGRvd24tbWVudSBhIHsKKyAgICBjb2xvcjogIzk5OTk5OTsKKyAg fQorICAubmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2ID4gbGkgPiBhOmhvdmVyLAor ICAubmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2ID4gbGkgPiBhOmZvY3VzLAorICAu bmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAuZHJvcGRvd24tbWVudSBhOmhvdmVyLAorICAu bmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAuZHJvcGRvd24tbWVudSBhOmZvY3VzIHsKKyAg ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTExMTExOworICB9CisgIC5uYXYtY29sbGFwc2UuaW4gLmJ0 bi1ncm91cCB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW4tdG9wOiA1cHg7CisgIH0KKyAg Lm5hdi1jb2xsYXBzZSAuZHJvcGRvd24tbWVudSB7CisgICAgcG9zaXRpb246IHN0YXRpYzsKKyAg ICB0b3A6IGF1dG87CisgICAgbGVmdDogYXV0bzsKKyAgICBkaXNwbGF5OiBub25lOworICAgIGZs b2F0OiBub25lOworICAgIG1heC13aWR0aDogbm9uZTsKKyAgICBwYWRkaW5nOiAwOworICAgIG1h cmdpbjogMCAxNXB4OworICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgIGJv cmRlcjogbm9uZTsKKyAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CisgICAgICAgLW1vei1i b3JkZXItcmFkaXVzOiAwOworICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICAtd2Vi a2l0LWJveC1zaGFkb3c6IG5vbmU7CisgICAgICAgLW1vei1ib3gtc2hhZG93OiBub25lOworICAg ICAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKKyAgfQorICAubmF2LWNvbGxhcHNlIC5vcGVuID4g LmRyb3Bkb3duLW1lbnUgeworICAgIGRpc3BsYXk6IGJsb2NrOworICB9CisgIC5uYXYtY29sbGFw c2UgLmRyb3Bkb3duLW1lbnU6YmVmb3JlLAorICAubmF2LWNvbGxhcHNlIC5kcm9wZG93bi1tZW51 OmFmdGVyIHsKKyAgICBkaXNwbGF5OiBub25lOworICB9CisgIC5uYXYtY29sbGFwc2UgLmRyb3Bk b3duLW1lbnUgLmRpdmlkZXIgeworICAgIGRpc3BsYXk6IG5vbmU7CisgIH0KKyAgLm5hdi1jb2xs YXBzZSAubmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudTpiZWZvcmUsCisgIC5uYXYtY29sbGFwc2Ug Lm5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnU6YWZ0ZXIgeworICAgIGRpc3BsYXk6IG5vbmU7Cisg IH0KKyAgLm5hdi1jb2xsYXBzZSAubmF2YmFyLWZvcm0sCisgIC5uYXYtY29sbGFwc2UgLm5hdmJh ci1zZWFyY2ggeworICAgIGZsb2F0OiBub25lOworICAgIHBhZGRpbmc6IDEwcHggMTVweDsKKyAg ICBtYXJnaW46IDEwcHggMDsKKyAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2YyZjJmMjsKKyAg ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YyZjJmMjsKKyAgICAtd2Via2l0LWJveC1zaGFk b3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCAwIDFweCAwIHJnYmEo MjU1LCAyNTUsIDI1NSwgMC4xKTsKKyAgICAgICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4 IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwg MC4xKTsKKyAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1 NSwgMjU1LCAwLjEpLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKKyAgfQorICAu bmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2YmFyLWZvcm0sCisgIC5uYXZiYXItaW52 ZXJzZSAubmF2LWNvbGxhcHNlIC5uYXZiYXItc2VhcmNoIHsKKyAgICBib3JkZXItdG9wLWNvbG9y OiAjMTExMTExOworICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMxMTExMTE7CisgIH0KKyAgLm5h dmJhciAubmF2LWNvbGxhcHNlIC5uYXYucHVsbC1yaWdodCB7CisgICAgZmxvYXQ6IG5vbmU7Cisg ICAgbWFyZ2luLWxlZnQ6IDA7CisgIH0KKyAgLm5hdi1jb2xsYXBzZSwKKyAgLm5hdi1jb2xsYXBz ZS5jb2xsYXBzZSB7CisgICAgaGVpZ2h0OiAwOworICAgIG92ZXJmbG93OiBoaWRkZW47CisgIH0K KyAgLm5hdmJhciAuYnRuLW5hdmJhciB7CisgICAgZGlzcGxheTogYmxvY2s7CisgIH0KKyAgLm5h dmJhci1zdGF0aWMgLm5hdmJhci1pbm5lciB7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAg ICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgIH0KK30KKworQG1lZGlhIChtaW4td2lkdGg6IDk4MHB4 KSB7CisgIC5uYXYtY29sbGFwc2UuY29sbGFwc2UgeworICAgIGhlaWdodDogYXV0byAhaW1wb3J0 YW50OworICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CisgIH0KK30KZGlmZiAtLWdp dCBhL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvY3NzL2Jvb3RzdHJhcC5jc3MgYi9hc3Nl bWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2Nzcy9ib290c3RyYXAuY3NzCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTZhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NlbWJs ZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2Nzcy9ib290c3RyYXAuY3NzCkBAIC0wLDAgKzEsNjE1OCBA QAorLyohCisgKiBCb290c3RyYXAgdjIuMy4xCisgKgorICogQ29weXJpZ2h0IDIwMTIgVHdpdHRl ciwgSW5jCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMAorICogaHR0 cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogRGVzaWduZWQg YW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRv IGFuZCBAZmF0LgorICovCisKKy5jbGVhcmZpeCB7CisgICp6b29tOiAxOworfQorCisuY2xlYXJm aXg6YmVmb3JlLAorLmNsZWFyZml4OmFmdGVyIHsKKyAgZGlzcGxheTogdGFibGU7CisgIGxpbmUt aGVpZ2h0OiAwOworICBjb250ZW50OiAiIjsKK30KKworLmNsZWFyZml4OmFmdGVyIHsKKyAgY2xl YXI6IGJvdGg7Cit9CisKKy5oaWRlLXRleHQgeworICBmb250OiAwLzAgYTsKKyAgY29sb3I6IHRy YW5zcGFyZW50OworICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJh bnNwYXJlbnQ7CisgIGJvcmRlcjogMDsKK30KKworLmlucHV0LWJsb2NrLWxldmVsIHsKKyAgZGlz cGxheTogYmxvY2s7CisgIHdpZHRoOiAxMDAlOworICBtaW4taGVpZ2h0OiAzMHB4OworICAtd2Vi a2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVy LWJveDsKKyAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworfQorCithcnRpY2xlLAor YXNpZGUsCitkZXRhaWxzLAorZmlnY2FwdGlvbiwKK2ZpZ3VyZSwKK2Zvb3RlciwKK2hlYWRlciwK K2hncm91cCwKK25hdiwKK3NlY3Rpb24geworICBkaXNwbGF5OiBibG9jazsKK30KKworYXVkaW8s CitjYW52YXMsCit2aWRlbyB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgKmRpc3BsYXk6 IGlubGluZTsKKyAgKnpvb206IDE7Cit9CisKK2F1ZGlvOm5vdChbY29udHJvbHNdKSB7CisgIGRp c3BsYXk6IG5vbmU7Cit9CisKK2h0bWwgeworICBmb250LXNpemU6IDEwMCU7CisgIC13ZWJraXQt dGV4dC1zaXplLWFkanVzdDogMTAwJTsKKyAgICAgIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAl OworfQorCithOmZvY3VzIHsKKyAgb3V0bGluZTogdGhpbiBkb3R0ZWQgIzMzMzsKKyAgb3V0bGlu ZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yOworICBvdXRsaW5lLW9mZnNldDog LTJweDsKK30KKworYTpob3ZlciwKK2E6YWN0aXZlIHsKKyAgb3V0bGluZTogMDsKK30KKworc3Vi LAorc3VwIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBmb250LXNpemU6IDc1JTsKKyAgbGlu ZS1oZWlnaHQ6IDA7CisgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKK30KKworc3VwIHsKKyAg dG9wOiAtMC41ZW07Cit9CisKK3N1YiB7CisgIGJvdHRvbTogLTAuMjVlbTsKK30KKworaW1nIHsK KyAgd2lkdGg6IGF1dG9cOTsKKyAgaGVpZ2h0OiBhdXRvOworICBtYXgtd2lkdGg6IDEwMCU7Cisg IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgIGJvcmRlcjogMDsKKyAgLW1zLWludGVycG9sYXRp b24tbW9kZTogYmljdWJpYzsKK30KKworI21hcF9jYW52YXMgaW1nLAorLmdvb2dsZS1tYXBzIGlt ZyB7CisgIG1heC13aWR0aDogbm9uZTsKK30KKworYnV0dG9uLAoraW5wdXQsCitzZWxlY3QsCit0 ZXh0YXJlYSB7CisgIG1hcmdpbjogMDsKKyAgZm9udC1zaXplOiAxMDAlOworICB2ZXJ0aWNhbC1h bGlnbjogbWlkZGxlOworfQorCitidXR0b24sCitpbnB1dCB7CisgICpvdmVyZmxvdzogdmlzaWJs ZTsKKyAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKK30KKworYnV0dG9uOjotbW96LWZvY3VzLWlubmVy LAoraW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXIgeworICBwYWRkaW5nOiAwOworICBib3JkZXI6IDA7 Cit9CisKK2J1dHRvbiwKK2h0bWwgaW5wdXRbdHlwZT0iYnV0dG9uIl0sCitpbnB1dFt0eXBlPSJy ZXNldCJdLAoraW5wdXRbdHlwZT0ic3VibWl0Il0geworICBjdXJzb3I6IHBvaW50ZXI7CisgIC13 ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOworfQorCitsYWJlbCwKK3NlbGVjdCwKK2J1dHRvbiwK K2lucHV0W3R5cGU9ImJ1dHRvbiJdLAoraW5wdXRbdHlwZT0icmVzZXQiXSwKK2lucHV0W3R5cGU9 InN1Ym1pdCJdLAoraW5wdXRbdHlwZT0icmFkaW8iXSwKK2lucHV0W3R5cGU9ImNoZWNrYm94Il0g eworICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKK2lucHV0W3R5cGU9InNlYXJjaCJdIHsKKyAgLXdl YmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKKyAgICAgLW1vei1ib3gtc2l6aW5nOiBjb250 ZW50LWJveDsKKyAgICAgICAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKKyAgLXdlYmtpdC1h cHBlYXJhbmNlOiB0ZXh0ZmllbGQ7Cit9CisKK2lucHV0W3R5cGU9InNlYXJjaCJdOjotd2Via2l0 LXNlYXJjaC1kZWNvcmF0aW9uLAoraW5wdXRbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNo LWNhbmNlbC1idXR0b24geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Cit9CisKK3RleHRh cmVhIHsKKyAgb3ZlcmZsb3c6IGF1dG87CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK0Bt ZWRpYSBwcmludCB7CisgICogeworICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7CisgICAgdGV4 dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKKyAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAh aW1wb3J0YW50OworICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKKyAgfQorICBhLAor ICBhOnZpc2l0ZWQgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICB9CisgIGFb aHJlZl06YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICIgKCIgYXR0cihocmVmKSAiKSI7CisgIH0KKyAg YWJiclt0aXRsZV06YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICIgKCIgYXR0cih0aXRsZSkgIikiOwor ICB9CisgIC5pciBhOmFmdGVyLAorICBhW2hyZWZePSJqYXZhc2NyaXB0OiJdOmFmdGVyLAorICBh W2hyZWZePSIjIl06YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICIiOworICB9CisgIHByZSwKKyAgYmxv Y2txdW90ZSB7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKyAgICBwYWdlLWJyZWFrLWlu c2lkZTogYXZvaWQ7CisgIH0KKyAgdGhlYWQgeworICAgIGRpc3BsYXk6IHRhYmxlLWhlYWRlci1n cm91cDsKKyAgfQorICB0ciwKKyAgaW1nIHsKKyAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7 CisgIH0KKyAgaW1nIHsKKyAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKKyAgfQorICBA cGFnZSAgeworICAgIG1hcmdpbjogMC41Y207CisgIH0KKyAgcCwKKyAgaDIsCisgIGgzIHsKKyAg ICBvcnBoYW5zOiAzOworICAgIHdpZG93czogMzsKKyAgfQorICBoMiwKKyAgaDMgeworICAgIHBh Z2UtYnJlYWstYWZ0ZXI6IGF2b2lkOworICB9Cit9CisKK2JvZHkgeworICBtYXJnaW46IDA7Cisg IGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNl cmlmOworICBmb250LXNpemU6IDE0cHg7CisgIGxpbmUtaGVpZ2h0OiAyMHB4OworICBjb2xvcjog IzMzMzMzMzsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKK30KKworYSB7CisgIGNvbG9y OiAjMDA4OGNjOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2E6aG92ZXIsCithOmZv Y3VzIHsKKyAgY29sb3I6ICMwMDU1ODA7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwor fQorCisuaW1nLXJvdW5kZWQgeworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsKKyAgICAg LW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4Owor fQorCisuaW1nLXBvbGFyb2lkIHsKKyAgcGFkZGluZzogNHB4OworICBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmOworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICBib3JkZXI6IDFweCBzb2xpZCBy Z2JhKDAsIDAsIDAsIDAuMik7CisgIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEo MCwgMCwgMCwgMC4xKTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAw LCAwLCAwLjEpOworICAgICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAs IDAuMSk7Cit9CisKKy5pbWctY2lyY2xlIHsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1MDBw eDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA1MDBweDsKKyAgICAgICAgICBib3JkZXItcmFk aXVzOiA1MDBweDsKK30KKworLnJvdyB7CisgIG1hcmdpbi1sZWZ0OiAtMjBweDsKKyAgKnpvb206 IDE7Cit9CisKKy5yb3c6YmVmb3JlLAorLnJvdzphZnRlciB7CisgIGRpc3BsYXk6IHRhYmxlOwor ICBsaW5lLWhlaWdodDogMDsKKyAgY29udGVudDogIiI7Cit9CisKKy5yb3c6YWZ0ZXIgeworICBj bGVhcjogYm90aDsKK30KKworW2NsYXNzKj0ic3BhbiJdIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIG1p bi1oZWlnaHQ6IDFweDsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisKKy5jb250YWluZXIsCisu bmF2YmFyLXN0YXRpYy10b3AgLmNvbnRhaW5lciwKKy5uYXZiYXItZml4ZWQtdG9wIC5jb250YWlu ZXIsCisubmF2YmFyLWZpeGVkLWJvdHRvbSAuY29udGFpbmVyIHsKKyAgd2lkdGg6IDk0MHB4Owor fQorCisuc3BhbjEyIHsKKyAgd2lkdGg6IDk0MHB4OworfQorCisuc3BhbjExIHsKKyAgd2lkdGg6 IDg2MHB4OworfQorCisuc3BhbjEwIHsKKyAgd2lkdGg6IDc4MHB4OworfQorCisuc3Bhbjkgewor ICB3aWR0aDogNzAwcHg7Cit9CisKKy5zcGFuOCB7CisgIHdpZHRoOiA2MjBweDsKK30KKworLnNw YW43IHsKKyAgd2lkdGg6IDU0MHB4OworfQorCisuc3BhbjYgeworICB3aWR0aDogNDYwcHg7Cit9 CisKKy5zcGFuNSB7CisgIHdpZHRoOiAzODBweDsKK30KKworLnNwYW40IHsKKyAgd2lkdGg6IDMw MHB4OworfQorCisuc3BhbjMgeworICB3aWR0aDogMjIwcHg7Cit9CisKKy5zcGFuMiB7CisgIHdp ZHRoOiAxNDBweDsKK30KKworLnNwYW4xIHsKKyAgd2lkdGg6IDYwcHg7Cit9CisKKy5vZmZzZXQx MiB7CisgIG1hcmdpbi1sZWZ0OiA5ODBweDsKK30KKworLm9mZnNldDExIHsKKyAgbWFyZ2luLWxl ZnQ6IDkwMHB4OworfQorCisub2Zmc2V0MTAgeworICBtYXJnaW4tbGVmdDogODIwcHg7Cit9CisK Ky5vZmZzZXQ5IHsKKyAgbWFyZ2luLWxlZnQ6IDc0MHB4OworfQorCisub2Zmc2V0OCB7CisgIG1h cmdpbi1sZWZ0OiA2NjBweDsKK30KKworLm9mZnNldDcgeworICBtYXJnaW4tbGVmdDogNTgwcHg7 Cit9CisKKy5vZmZzZXQ2IHsKKyAgbWFyZ2luLWxlZnQ6IDUwMHB4OworfQorCisub2Zmc2V0NSB7 CisgIG1hcmdpbi1sZWZ0OiA0MjBweDsKK30KKworLm9mZnNldDQgeworICBtYXJnaW4tbGVmdDog MzQwcHg7Cit9CisKKy5vZmZzZXQzIHsKKyAgbWFyZ2luLWxlZnQ6IDI2MHB4OworfQorCisub2Zm c2V0MiB7CisgIG1hcmdpbi1sZWZ0OiAxODBweDsKK30KKworLm9mZnNldDEgeworICBtYXJnaW4t bGVmdDogMTAwcHg7Cit9CisKKy5yb3ctZmx1aWQgeworICB3aWR0aDogMTAwJTsKKyAgKnpvb206 IDE7Cit9CisKKy5yb3ctZmx1aWQ6YmVmb3JlLAorLnJvdy1mbHVpZDphZnRlciB7CisgIGRpc3Bs YXk6IHRhYmxlOworICBsaW5lLWhlaWdodDogMDsKKyAgY29udGVudDogIiI7Cit9CisKKy5yb3ct Zmx1aWQ6YWZ0ZXIgeworICBjbGVhcjogYm90aDsKK30KKworLnJvdy1mbHVpZCBbY2xhc3MqPSJz cGFuIl0geworICBkaXNwbGF5OiBibG9jazsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAxMDAl OworICBtaW4taGVpZ2h0OiAzMHB4OworICBtYXJnaW4tbGVmdDogMi4xMjc2NTk1NzQ0NjgwODUl OworICAqbWFyZ2luLWxlZnQ6IDIuMDc0NDY4MDg1MTA2MzgzJTsKKyAgLXdlYmtpdC1ib3gtc2l6 aW5nOiBib3JkZXItYm94OworICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAg ICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKK30KKworLnJvdy1mbHVpZCBbY2xhc3MqPSJz cGFuIl06Zmlyc3QtY2hpbGQgeworICBtYXJnaW4tbGVmdDogMDsKK30KKworLnJvdy1mbHVpZCAu Y29udHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXSArIFtjbGFzcyo9InNwYW4iXSB7CisgIG1hcmdp bi1sZWZ0OiAyLjEyNzY1OTU3NDQ2ODA4NSU7Cit9CisKKy5yb3ctZmx1aWQgLnNwYW4xMiB7Cisg IHdpZHRoOiAxMDAlOworICAqd2lkdGg6IDk5Ljk0NjgwODUxMDYzODI5JTsKK30KKworLnJvdy1m bHVpZCAuc3BhbjExIHsKKyAgd2lkdGg6IDkxLjQ4OTM2MTcwMjEyNzY1JTsKKyAgKndpZHRoOiA5 MS40MzYxNzAyMTI3NjU5NCU7Cit9CisKKy5yb3ctZmx1aWQgLnNwYW4xMCB7CisgIHdpZHRoOiA4 Mi45Nzg3MjM0MDQyNTUzMiU7CisgICp3aWR0aDogODIuOTI1NTMxOTE0ODkzNjElOworfQorCisu cm93LWZsdWlkIC5zcGFuOSB7CisgIHdpZHRoOiA3NC40NjgwODUxMDYzODI5NyU7CisgICp3aWR0 aDogNzQuNDE0ODkzNjE3MDIxMjYlOworfQorCisucm93LWZsdWlkIC5zcGFuOCB7CisgIHdpZHRo OiA2NS45NTc0NDY4MDg1MTA2NCU7CisgICp3aWR0aDogNjUuOTA0MjU1MzE5MTQ4OTMlOworfQor Cisucm93LWZsdWlkIC5zcGFuNyB7CisgIHdpZHRoOiA1Ny40NDY4MDg1MTA2MzgyOSU7CisgICp3 aWR0aDogNTcuMzkzNjE3MDIxMjc2NTklOworfQorCisucm93LWZsdWlkIC5zcGFuNiB7CisgIHdp ZHRoOiA0OC45MzYxNzAyMTI3NjU5NSU7CisgICp3aWR0aDogNDguODgyOTc4NzIzNDA0MjUlOwor fQorCisucm93LWZsdWlkIC5zcGFuNSB7CisgIHdpZHRoOiA0MC40MjU1MzE5MTQ4OTM2MiU7Cisg ICp3aWR0aDogNDAuMzcyMzQwNDI1NTMxOTIlOworfQorCisucm93LWZsdWlkIC5zcGFuNCB7Cisg IHdpZHRoOiAzMS45MTQ4OTM2MTcwMjEyNzglOworICAqd2lkdGg6IDMxLjg2MTcwMjEyNzY1OTU3 NiU7Cit9CisKKy5yb3ctZmx1aWQgLnNwYW4zIHsKKyAgd2lkdGg6IDIzLjQwNDI1NTMxOTE0ODkz NCU7CisgICp3aWR0aDogMjMuMzUxMDYzODI5Nzg3MjMzJTsKK30KKworLnJvdy1mbHVpZCAuc3Bh bjIgeworICB3aWR0aDogMTQuODkzNjE3MDIxMjc2NTk1JTsKKyAgKndpZHRoOiAxNC44NDA0MjU1 MzE5MTQ4OTQlOworfQorCisucm93LWZsdWlkIC5zcGFuMSB7CisgIHdpZHRoOiA2LjM4Mjk3ODcy MzQwNDI1NSU7CisgICp3aWR0aDogNi4zMjk3ODcyMzQwNDI1NTMlOworfQorCisucm93LWZsdWlk IC5vZmZzZXQxMiB7CisgIG1hcmdpbi1sZWZ0OiAxMDQuMjU1MzE5MTQ4OTM2MTclOworICAqbWFy Z2luLWxlZnQ6IDEwNC4xNDg5MzYxNzAyMTI3NSU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDEy OmZpcnN0LWNoaWxkIHsKKyAgbWFyZ2luLWxlZnQ6IDEwMi4xMjc2NTk1NzQ0NjgwOCU7CisgICpt YXJnaW4tbGVmdDogMTAyLjAyMTI3NjU5NTc0NDY3JTsKK30KKworLnJvdy1mbHVpZCAub2Zmc2V0 MTEgeworICBtYXJnaW4tbGVmdDogOTUuNzQ0NjgwODUxMDYzODIlOworICAqbWFyZ2luLWxlZnQ6 IDk1LjYzODI5Nzg3MjM0MDQlOworfQorCisucm93LWZsdWlkIC5vZmZzZXQxMTpmaXJzdC1jaGls ZCB7CisgIG1hcmdpbi1sZWZ0OiA5My42MTcwMjEyNzY1OTU3NCU7CisgICptYXJnaW4tbGVmdDog OTMuNTEwNjM4Mjk3ODcyMzIlOworfQorCisucm93LWZsdWlkIC5vZmZzZXQxMCB7CisgIG1hcmdp bi1sZWZ0OiA4Ny4yMzQwNDI1NTMxOTE0OSU7CisgICptYXJnaW4tbGVmdDogODcuMTI3NjU5NTc0 NDY4MDclOworfQorCisucm93LWZsdWlkIC5vZmZzZXQxMDpmaXJzdC1jaGlsZCB7CisgIG1hcmdp bi1sZWZ0OiA4NS4xMDYzODI5Nzg3MjM0JTsKKyAgKm1hcmdpbi1sZWZ0OiA4NC45OTk5OTk5OTk5 OTk5OSU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDkgeworICBtYXJnaW4tbGVmdDogNzguNzIz NDA0MjU1MzE5MTQlOworICAqbWFyZ2luLWxlZnQ6IDc4LjYxNzAyMTI3NjU5NTcyJTsKK30KKwor LnJvdy1mbHVpZCAub2Zmc2V0OTpmaXJzdC1jaGlsZCB7CisgIG1hcmdpbi1sZWZ0OiA3Ni41OTU3 NDQ2ODA4NTEwNiU7CisgICptYXJnaW4tbGVmdDogNzYuNDg5MzYxNzAyMTI3NjQlOworfQorCisu cm93LWZsdWlkIC5vZmZzZXQ4IHsKKyAgbWFyZ2luLWxlZnQ6IDcwLjIxMjc2NTk1NzQ0NjglOwor ICAqbWFyZ2luLWxlZnQ6IDcwLjEwNjM4Mjk3ODcyMzM5JTsKK30KKworLnJvdy1mbHVpZCAub2Zm c2V0ODpmaXJzdC1jaGlsZCB7CisgIG1hcmdpbi1sZWZ0OiA2OC4wODUxMDYzODI5Nzg3MiU7Cisg ICptYXJnaW4tbGVmdDogNjcuOTc4NzIzNDA0MjU1MyU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNl dDcgeworICBtYXJnaW4tbGVmdDogNjEuNzAyMTI3NjU5NTc0NDYlOworICAqbWFyZ2luLWxlZnQ6 IDYxLjU5NTc0NDY4MDg1MTA2JTsKK30KKworLnJvdy1mbHVpZCAub2Zmc2V0NzpmaXJzdC1jaGls ZCB7CisgIG1hcmdpbi1sZWZ0OiA1OS41NzQ0NjgwODUxMDYzNzUlOworICAqbWFyZ2luLWxlZnQ6 IDU5LjQ2ODA4NTEwNjM4Mjk3JTsKK30KKworLnJvdy1mbHVpZCAub2Zmc2V0NiB7CisgIG1hcmdp bi1sZWZ0OiA1My4xOTE0ODkzNjE3MDIxMjUlOworICAqbWFyZ2luLWxlZnQ6IDUzLjA4NTEwNjM4 Mjk3ODcxNSU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDY6Zmlyc3QtY2hpbGQgeworICBtYXJn aW4tbGVmdDogNTEuMDYzODI5Nzg3MjM0MDM1JTsKKyAgKm1hcmdpbi1sZWZ0OiA1MC45NTc0NDY4 MDg1MTA2MyU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDUgeworICBtYXJnaW4tbGVmdDogNDQu NjgwODUxMDYzODI5NzklOworICAqbWFyZ2luLWxlZnQ6IDQ0LjU3NDQ2ODA4NTEwNjM4JTsKK30K KworLnJvdy1mbHVpZCAub2Zmc2V0NTpmaXJzdC1jaGlsZCB7CisgIG1hcmdpbi1sZWZ0OiA0Mi41 NTMxOTE0ODkzNjE3JTsKKyAgKm1hcmdpbi1sZWZ0OiA0Mi40NDY4MDg1MTA2MzgzJTsKK30KKwor LnJvdy1mbHVpZCAub2Zmc2V0NCB7CisgIG1hcmdpbi1sZWZ0OiAzNi4xNzAyMTI3NjU5NTc0NDQl OworICAqbWFyZ2luLWxlZnQ6IDM2LjA2MzgyOTc4NzIzNDA1JTsKK30KKworLnJvdy1mbHVpZCAu b2Zmc2V0NDpmaXJzdC1jaGlsZCB7CisgIG1hcmdpbi1sZWZ0OiAzNC4wNDI1NTMxOTE0ODkzNiU7 CisgICptYXJnaW4tbGVmdDogMzMuOTM2MTcwMjEyNzY1OTYlOworfQorCisucm93LWZsdWlkIC5v ZmZzZXQzIHsKKyAgbWFyZ2luLWxlZnQ6IDI3LjY1OTU3NDQ2ODA4NTEwNCU7CisgICptYXJnaW4t bGVmdDogMjcuNTUzMTkxNDg5MzYxNyU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDM6Zmlyc3Qt Y2hpbGQgeworICBtYXJnaW4tbGVmdDogMjUuNTMxOTE0ODkzNjE3MDIlOworICAqbWFyZ2luLWxl ZnQ6IDI1LjQyNTUzMTkxNDg5MzYxOCU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDIgeworICBt YXJnaW4tbGVmdDogMTkuMTQ4OTM2MTcwMjEyNzY0JTsKKyAgKm1hcmdpbi1sZWZ0OiAxOS4wNDI1 NTMxOTE0ODkzNiU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDI6Zmlyc3QtY2hpbGQgeworICBt YXJnaW4tbGVmdDogMTcuMDIxMjc2NTk1NzQ0NjglOworICAqbWFyZ2luLWxlZnQ6IDE2LjkxNDg5 MzYxNzAyMTI3OCU7Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDEgeworICBtYXJnaW4tbGVmdDog MTAuNjM4Mjk3ODcyMzQwNDI1JTsKKyAgKm1hcmdpbi1sZWZ0OiAxMC41MzE5MTQ4OTM2MTcwMiU7 Cit9CisKKy5yb3ctZmx1aWQgLm9mZnNldDE6Zmlyc3QtY2hpbGQgeworICBtYXJnaW4tbGVmdDog OC41MTA2MzgyOTc4NzIzNCU7CisgICptYXJnaW4tbGVmdDogOC40MDQyNTUzMTkxNDg5MzglOwor fQorCitbY2xhc3MqPSJzcGFuIl0uaGlkZSwKKy5yb3ctZmx1aWQgW2NsYXNzKj0ic3BhbiJdLmhp ZGUgeworICBkaXNwbGF5OiBub25lOworfQorCitbY2xhc3MqPSJzcGFuIl0ucHVsbC1yaWdodCwK Ky5yb3ctZmx1aWQgW2NsYXNzKj0ic3BhbiJdLnB1bGwtcmlnaHQgeworICBmbG9hdDogcmlnaHQ7 Cit9CisKKy5jb250YWluZXIgeworICBtYXJnaW4tcmlnaHQ6IGF1dG87CisgIG1hcmdpbi1sZWZ0 OiBhdXRvOworICAqem9vbTogMTsKK30KKworLmNvbnRhaW5lcjpiZWZvcmUsCisuY29udGFpbmVy OmFmdGVyIHsKKyAgZGlzcGxheTogdGFibGU7CisgIGxpbmUtaGVpZ2h0OiAwOworICBjb250ZW50 OiAiIjsKK30KKworLmNvbnRhaW5lcjphZnRlciB7CisgIGNsZWFyOiBib3RoOworfQorCisuY29u dGFpbmVyLWZsdWlkIHsKKyAgcGFkZGluZy1yaWdodDogMjBweDsKKyAgcGFkZGluZy1sZWZ0OiAy MHB4OworICAqem9vbTogMTsKK30KKworLmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsCisuY29udGFp bmVyLWZsdWlkOmFmdGVyIHsKKyAgZGlzcGxheTogdGFibGU7CisgIGxpbmUtaGVpZ2h0OiAwOwor ICBjb250ZW50OiAiIjsKK30KKworLmNvbnRhaW5lci1mbHVpZDphZnRlciB7CisgIGNsZWFyOiBi b3RoOworfQorCitwIHsKKyAgbWFyZ2luOiAwIDAgMTBweDsKK30KKworLmxlYWQgeworICBtYXJn aW4tYm90dG9tOiAyMHB4OworICBmb250LXNpemU6IDIxcHg7CisgIGZvbnQtd2VpZ2h0OiAyMDA7 CisgIGxpbmUtaGVpZ2h0OiAzMHB4OworfQorCitzbWFsbCB7CisgIGZvbnQtc2l6ZTogODUlOwor fQorCitzdHJvbmcgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworZW0geworICBmb250LXN0 eWxlOiBpdGFsaWM7Cit9CisKK2NpdGUgeworICBmb250LXN0eWxlOiBub3JtYWw7Cit9CisKKy5t dXRlZCB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorCithLm11dGVkOmhvdmVyLAorYS5tdXRlZDpm b2N1cyB7CisgIGNvbG9yOiAjODA4MDgwOworfQorCisudGV4dC13YXJuaW5nIHsKKyAgY29sb3I6 ICNjMDk4NTM7Cit9CisKK2EudGV4dC13YXJuaW5nOmhvdmVyLAorYS50ZXh0LXdhcm5pbmc6Zm9j dXMgeworICBjb2xvcjogI2E0N2UzYzsKK30KKworLnRleHQtZXJyb3IgeworICBjb2xvcjogI2I5 NGE0ODsKK30KKworYS50ZXh0LWVycm9yOmhvdmVyLAorYS50ZXh0LWVycm9yOmZvY3VzIHsKKyAg Y29sb3I6ICM5NTNiMzk7Cit9CisKKy50ZXh0LWluZm8geworICBjb2xvcjogIzNhODdhZDsKK30K KworYS50ZXh0LWluZm86aG92ZXIsCithLnRleHQtaW5mbzpmb2N1cyB7CisgIGNvbG9yOiAjMmQ2 OTg3OworfQorCisudGV4dC1zdWNjZXNzIHsKKyAgY29sb3I6ICM0Njg4NDc7Cit9CisKK2EudGV4 dC1zdWNjZXNzOmhvdmVyLAorYS50ZXh0LXN1Y2Nlc3M6Zm9jdXMgeworICBjb2xvcjogIzM1NjYz NTsKK30KKworLnRleHQtbGVmdCB7CisgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy50ZXh0LXJp Z2h0IHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy50ZXh0LWNlbnRlciB7CisgIHRleHQt YWxpZ246IGNlbnRlcjsKK30KKworaDEsCitoMiwKK2gzLAoraDQsCitoNSwKK2g2IHsKKyAgbWFy Z2luOiAxMHB4IDA7CisgIGZvbnQtZmFtaWx5OiBpbmhlcml0OworICBmb250LXdlaWdodDogYm9s ZDsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIGNvbG9yOiBpbmhlcml0OworICB0ZXh0LXJlbmRl cmluZzogb3B0aW1pemVsZWdpYmlsaXR5OworfQorCitoMSBzbWFsbCwKK2gyIHNtYWxsLAoraDMg c21hbGwsCitoNCBzbWFsbCwKK2g1IHNtYWxsLAoraDYgc21hbGwgeworICBmb250LXdlaWdodDog bm9ybWFsOworICBsaW5lLWhlaWdodDogMTsKKyAgY29sb3I6ICM5OTk5OTk7Cit9CisKK2gxLAor aDIsCitoMyB7CisgIGxpbmUtaGVpZ2h0OiA0MHB4OworfQorCitoMSB7CisgIGZvbnQtc2l6ZTog MzguNXB4OworfQorCitoMiB7CisgIGZvbnQtc2l6ZTogMzEuNXB4OworfQorCitoMyB7CisgIGZv bnQtc2l6ZTogMjQuNXB4OworfQorCitoNCB7CisgIGZvbnQtc2l6ZTogMTcuNXB4OworfQorCito NSB7CisgIGZvbnQtc2l6ZTogMTRweDsKK30KKworaDYgeworICBmb250LXNpemU6IDExLjlweDsK K30KKworaDEgc21hbGwgeworICBmb250LXNpemU6IDI0LjVweDsKK30KKworaDIgc21hbGwgewor ICBmb250LXNpemU6IDE3LjVweDsKK30KKworaDMgc21hbGwgeworICBmb250LXNpemU6IDE0cHg7 Cit9CisKK2g0IHNtYWxsIHsKKyAgZm9udC1zaXplOiAxNHB4OworfQorCisucGFnZS1oZWFkZXIg eworICBwYWRkaW5nLWJvdHRvbTogOXB4OworICBtYXJnaW46IDIwcHggMCAzMHB4OworICBib3Jk ZXItYm90dG9tOiAxcHggc29saWQgI2VlZWVlZTsKK30KKwordWwsCitvbCB7CisgIHBhZGRpbmc6 IDA7CisgIG1hcmdpbjogMCAwIDEwcHggMjVweDsKK30KKwordWwgdWwsCit1bCBvbCwKK29sIG9s LAorb2wgdWwgeworICBtYXJnaW4tYm90dG9tOiAwOworfQorCitsaSB7CisgIGxpbmUtaGVpZ2h0 OiAyMHB4OworfQorCit1bC51bnN0eWxlZCwKK29sLnVuc3R5bGVkIHsKKyAgbWFyZ2luLWxlZnQ6 IDA7CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKK3VsLmlubGluZSwKK29sLmlubGluZSB7Cisg IG1hcmdpbi1sZWZ0OiAwOworICBsaXN0LXN0eWxlOiBub25lOworfQorCit1bC5pbmxpbmUgPiBs aSwKK29sLmlubGluZSA+IGxpIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAqZGlzcGxh eTogaW5saW5lOworICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIHBhZGRpbmctbGVmdDogNXB4Owor ICAqem9vbTogMTsKK30KKworZGwgeworICBtYXJnaW4tYm90dG9tOiAyMHB4OworfQorCitkdCwK K2RkIHsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7Cit9CisKK2R0IHsKKyAgZm9udC13ZWlnaHQ6IGJv bGQ7Cit9CisKK2RkIHsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7Cit9CisKKy5kbC1ob3Jpem9udGFs IHsKKyAgKnpvb206IDE7Cit9CisKKy5kbC1ob3Jpem9udGFsOmJlZm9yZSwKKy5kbC1ob3Jpem9u dGFsOmFmdGVyIHsKKyAgZGlzcGxheTogdGFibGU7CisgIGxpbmUtaGVpZ2h0OiAwOworICBjb250 ZW50OiAiIjsKK30KKworLmRsLWhvcml6b250YWw6YWZ0ZXIgeworICBjbGVhcjogYm90aDsKK30K KworLmRsLWhvcml6b250YWwgZHQgeworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDE2MHB4Owor ICBvdmVyZmxvdzogaGlkZGVuOworICBjbGVhcjogbGVmdDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7 CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQor CisuZGwtaG9yaXpvbnRhbCBkZCB7CisgIG1hcmdpbi1sZWZ0OiAxODBweDsKK30KKworaHIgewor ICBtYXJnaW46IDIwcHggMDsKKyAgYm9yZGVyOiAwOworICBib3JkZXItdG9wOiAxcHggc29saWQg I2VlZWVlZTsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmZmZmY7Cit9CisKK2FiYnJb dGl0bGVdLAorYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7CisgIGN1cnNvcjogaGVscDsKKyAg Ym9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjOTk5OTk5OworfQorCithYmJyLmluaXRpYWxpc20g eworICBmb250LXNpemU6IDkwJTsKKyAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKK30KKwor YmxvY2txdW90ZSB7CisgIHBhZGRpbmc6IDAgMCAwIDE1cHg7CisgIG1hcmdpbjogMCAwIDIwcHg7 CisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2VlZWVlZTsKK30KKworYmxvY2txdW90ZSBwIHsK KyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgZm9udC1zaXplOiAxNy41cHg7CisgIGZvbnQtd2VpZ2h0 OiAzMDA7CisgIGxpbmUtaGVpZ2h0OiAxLjI1OworfQorCitibG9ja3F1b3RlIHNtYWxsIHsKKyAg ZGlzcGxheTogYmxvY2s7CisgIGxpbmUtaGVpZ2h0OiAyMHB4OworICBjb2xvcjogIzk5OTk5OTsK K30KKworYmxvY2txdW90ZSBzbWFsbDpiZWZvcmUgeworICBjb250ZW50OiAnXDIwMTQgXDAwQTAn OworfQorCitibG9ja3F1b3RlLnB1bGwtcmlnaHQgeworICBmbG9hdDogcmlnaHQ7CisgIHBhZGRp bmctcmlnaHQ6IDE1cHg7CisgIHBhZGRpbmctbGVmdDogMDsKKyAgYm9yZGVyLXJpZ2h0OiA1cHgg c29saWQgI2VlZWVlZTsKKyAgYm9yZGVyLWxlZnQ6IDA7Cit9CisKK2Jsb2NrcXVvdGUucHVsbC1y aWdodCBwLAorYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsIHsKKyAgdGV4dC1hbGlnbjogcmln aHQ7Cit9CisKK2Jsb2NrcXVvdGUucHVsbC1yaWdodCBzbWFsbDpiZWZvcmUgeworICBjb250ZW50 OiAnJzsKK30KKworYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsOmFmdGVyIHsKKyAgY29udGVu dDogJ1wwMEEwIFwyMDE0JzsKK30KKworcTpiZWZvcmUsCitxOmFmdGVyLAorYmxvY2txdW90ZTpi ZWZvcmUsCitibG9ja3F1b3RlOmFmdGVyIHsKKyAgY29udGVudDogIiI7Cit9CisKK2FkZHJlc3Mg eworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgZm9udC1zdHls ZTogbm9ybWFsOworICBsaW5lLWhlaWdodDogMjBweDsKK30KKworY29kZSwKK3ByZSB7CisgIHBh ZGRpbmc6IDAgM3B4IDJweDsKKyAgZm9udC1mYW1pbHk6IE1vbmFjbywgTWVubG8sIENvbnNvbGFz LCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7CisgIGZvbnQtc2l6ZTogMTJweDsKKyAgY29sb3I6 ICMzMzMzMzM7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OworICAgICAtbW96LWJvcmRl ci1yYWRpdXM6IDNweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKK2NvZGUg eworICBwYWRkaW5nOiAycHggNHB4OworICBjb2xvcjogI2QxNDsKKyAgd2hpdGUtc3BhY2U6IG5v d3JhcDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmOTsKKyAgYm9yZGVyOiAxcHggc29saWQg I2UxZTFlODsKK30KKworcHJlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmc6IDkuNXB4 OworICBtYXJnaW46IDAgMCAxMHB4OworICBmb250LXNpemU6IDEzcHg7CisgIGxpbmUtaGVpZ2h0 OiAyMHB4OworICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CisgIHdvcmQtd3JhcDogYnJlYWstd29y ZDsKKyAgd2hpdGUtc3BhY2U6IHByZTsKKyAgd2hpdGUtc3BhY2U6IHByZS13cmFwOworICBiYWNr Z3JvdW5kLWNvbG9yOiAjZjVmNWY1OworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICBib3Jk ZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAtd2Via2l0LWJvcmRlci1yYWRp dXM6IDRweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVy LXJhZGl1czogNHB4OworfQorCitwcmUucHJldHR5cHJpbnQgeworICBtYXJnaW4tYm90dG9tOiAy MHB4OworfQorCitwcmUgY29kZSB7CisgIHBhZGRpbmc6IDA7CisgIGNvbG9yOiBpbmhlcml0Owor ICB3aGl0ZS1zcGFjZTogcHJlOworICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CisgIGJhY2tncm91 bmQtY29sb3I6IHRyYW5zcGFyZW50OworICBib3JkZXI6IDA7Cit9CisKKy5wcmUtc2Nyb2xsYWJs ZSB7CisgIG1heC1oZWlnaHQ6IDM0MHB4OworICBvdmVyZmxvdy15OiBzY3JvbGw7Cit9CisKK2Zv cm0geworICBtYXJnaW46IDAgMCAyMHB4OworfQorCitmaWVsZHNldCB7CisgIHBhZGRpbmc6IDA7 CisgIG1hcmdpbjogMDsKKyAgYm9yZGVyOiAwOworfQorCitsZWdlbmQgeworICBkaXNwbGF5OiBi bG9jazsKKyAgd2lkdGg6IDEwMCU7CisgIHBhZGRpbmc6IDA7CisgIG1hcmdpbi1ib3R0b206IDIw cHg7CisgIGZvbnQtc2l6ZTogMjFweDsKKyAgbGluZS1oZWlnaHQ6IDQwcHg7CisgIGNvbG9yOiAj MzMzMzMzOworICBib3JkZXI6IDA7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1 OworfQorCitsZWdlbmQgc21hbGwgeworICBmb250LXNpemU6IDE1cHg7CisgIGNvbG9yOiAjOTk5 OTk5OworfQorCitsYWJlbCwKK2lucHV0LAorYnV0dG9uLAorc2VsZWN0LAordGV4dGFyZWEgewor ICBmb250LXNpemU6IDE0cHg7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIGxpbmUtaGVpZ2h0 OiAyMHB4OworfQorCitpbnB1dCwKK2J1dHRvbiwKK3NlbGVjdCwKK3RleHRhcmVhIHsKKyAgZm9u dC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7 Cit9CisKK2xhYmVsIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1ib3R0b206IDVweDsK K30KKworc2VsZWN0LAordGV4dGFyZWEsCitpbnB1dFt0eXBlPSJ0ZXh0Il0sCitpbnB1dFt0eXBl PSJwYXNzd29yZCJdLAoraW5wdXRbdHlwZT0iZGF0ZXRpbWUiXSwKK2lucHV0W3R5cGU9ImRhdGV0 aW1lLWxvY2FsIl0sCitpbnB1dFt0eXBlPSJkYXRlIl0sCitpbnB1dFt0eXBlPSJtb250aCJdLAor aW5wdXRbdHlwZT0idGltZSJdLAoraW5wdXRbdHlwZT0id2VlayJdLAoraW5wdXRbdHlwZT0ibnVt YmVyIl0sCitpbnB1dFt0eXBlPSJlbWFpbCJdLAoraW5wdXRbdHlwZT0idXJsIl0sCitpbnB1dFt0 eXBlPSJzZWFyY2giXSwKK2lucHV0W3R5cGU9InRlbCJdLAoraW5wdXRbdHlwZT0iY29sb3IiXSwK Ky51bmVkaXRhYmxlLWlucHV0IHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBoZWlnaHQ6 IDIwcHg7CisgIHBhZGRpbmc6IDRweCA2cHg7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgIGZv bnQtc2l6ZTogMTRweDsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIGNvbG9yOiAjNTU1NTU1Owor ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsK KyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czog NHB4OworfQorCitpbnB1dCwKK3RleHRhcmVhLAorLnVuZWRpdGFibGUtaW5wdXQgeworICB3aWR0 aDogMjA2cHg7Cit9CisKK3RleHRhcmVhIHsKKyAgaGVpZ2h0OiBhdXRvOworfQorCit0ZXh0YXJl YSwKK2lucHV0W3R5cGU9InRleHQiXSwKK2lucHV0W3R5cGU9InBhc3N3b3JkIl0sCitpbnB1dFt0 eXBlPSJkYXRldGltZSJdLAoraW5wdXRbdHlwZT0iZGF0ZXRpbWUtbG9jYWwiXSwKK2lucHV0W3R5 cGU9ImRhdGUiXSwKK2lucHV0W3R5cGU9Im1vbnRoIl0sCitpbnB1dFt0eXBlPSJ0aW1lIl0sCitp bnB1dFt0eXBlPSJ3ZWVrIl0sCitpbnB1dFt0eXBlPSJudW1iZXIiXSwKK2lucHV0W3R5cGU9ImVt YWlsIl0sCitpbnB1dFt0eXBlPSJ1cmwiXSwKK2lucHV0W3R5cGU9InNlYXJjaCJdLAoraW5wdXRb dHlwZT0idGVsIl0sCitpbnB1dFt0eXBlPSJjb2xvciJdLAorLnVuZWRpdGFibGUtaW5wdXQgewor ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2Nj OworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAu MDc1KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAw LCAwLjA3NSk7CisgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwg MCwgMCwgMC4wNzUpOworICAtd2Via2l0LXRyYW5zaXRpb246IGJvcmRlciBsaW5lYXIgMC4ycywg Ym94LXNoYWRvdyBsaW5lYXIgMC4yczsKKyAgICAgLW1vei10cmFuc2l0aW9uOiBib3JkZXIgbGlu ZWFyIDAuMnMsIGJveC1zaGFkb3cgbGluZWFyIDAuMnM7CisgICAgICAgLW8tdHJhbnNpdGlvbjog Ym9yZGVyIGxpbmVhciAwLjJzLCBib3gtc2hhZG93IGxpbmVhciAwLjJzOworICAgICAgICAgIHRy YW5zaXRpb246IGJvcmRlciBsaW5lYXIgMC4ycywgYm94LXNoYWRvdyBsaW5lYXIgMC4yczsKK30K KwordGV4dGFyZWE6Zm9jdXMsCitpbnB1dFt0eXBlPSJ0ZXh0Il06Zm9jdXMsCitpbnB1dFt0eXBl PSJwYXNzd29yZCJdOmZvY3VzLAoraW5wdXRbdHlwZT0iZGF0ZXRpbWUiXTpmb2N1cywKK2lucHV0 W3R5cGU9ImRhdGV0aW1lLWxvY2FsIl06Zm9jdXMsCitpbnB1dFt0eXBlPSJkYXRlIl06Zm9jdXMs CitpbnB1dFt0eXBlPSJtb250aCJdOmZvY3VzLAoraW5wdXRbdHlwZT0idGltZSJdOmZvY3VzLAor aW5wdXRbdHlwZT0id2VlayJdOmZvY3VzLAoraW5wdXRbdHlwZT0ibnVtYmVyIl06Zm9jdXMsCitp bnB1dFt0eXBlPSJlbWFpbCJdOmZvY3VzLAoraW5wdXRbdHlwZT0idXJsIl06Zm9jdXMsCitpbnB1 dFt0eXBlPSJzZWFyY2giXTpmb2N1cywKK2lucHV0W3R5cGU9InRlbCJdOmZvY3VzLAoraW5wdXRb dHlwZT0iY29sb3IiXTpmb2N1cywKKy51bmVkaXRhYmxlLWlucHV0OmZvY3VzIHsKKyAgYm9yZGVy LWNvbG9yOiByZ2JhKDgyLCAxNjgsIDIzNiwgMC44KTsKKyAgb3V0bGluZTogMDsKKyAgb3V0bGlu ZTogdGhpbiBkb3R0ZWQgXDk7CisgIC8qIElFNi05ICovCisKKyAgLXdlYmtpdC1ib3gtc2hhZG93 OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA4cHggcmdiYSg4Miwg MTY4LCAyMzYsIDAuNik7CisgICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJn YmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgOHB4IHJnYmEoODIsIDE2OCwgMjM2LCAwLjYpOworICAg ICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwg MCAwIDhweCByZ2JhKDgyLCAxNjgsIDIzNiwgMC42KTsKK30KKworaW5wdXRbdHlwZT0icmFkaW8i XSwKK2lucHV0W3R5cGU9ImNoZWNrYm94Il0geworICBtYXJnaW46IDRweCAwIDA7CisgIG1hcmdp bi10b3A6IDFweCBcOTsKKyAgKm1hcmdpbi10b3A6IDA7CisgIGxpbmUtaGVpZ2h0OiBub3JtYWw7 Cit9CisKK2lucHV0W3R5cGU9ImZpbGUiXSwKK2lucHV0W3R5cGU9ImltYWdlIl0sCitpbnB1dFt0 eXBlPSJzdWJtaXQiXSwKK2lucHV0W3R5cGU9InJlc2V0Il0sCitpbnB1dFt0eXBlPSJidXR0b24i XSwKK2lucHV0W3R5cGU9InJhZGlvIl0sCitpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKKyAgd2lk dGg6IGF1dG87Cit9CisKK3NlbGVjdCwKK2lucHV0W3R5cGU9ImZpbGUiXSB7CisgIGhlaWdodDog MzBweDsKKyAgLyogSW4gSUU3LCB0aGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgZWxlbWVudCBjYW5u b3QgYmUgY2hhbmdlZCBieSBoZWlnaHQsIG9ubHkgZm9udC1zaXplICovCisKKyAgKm1hcmdpbi10 b3A6IDRweDsKKyAgLyogRm9yIElFNywgYWRkIHRvcCBtYXJnaW4gdG8gYWxpZ24gc2VsZWN0IHdp dGggbGFiZWxzICovCisKKyAgbGluZS1oZWlnaHQ6IDMwcHg7Cit9CisKK3NlbGVjdCB7CisgIHdp ZHRoOiAyMjBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiAxcHgg c29saWQgI2NjY2NjYzsKK30KKworc2VsZWN0W211bHRpcGxlXSwKK3NlbGVjdFtzaXplXSB7Cisg IGhlaWdodDogYXV0bzsKK30KKworc2VsZWN0OmZvY3VzLAoraW5wdXRbdHlwZT0iZmlsZSJdOmZv Y3VzLAoraW5wdXRbdHlwZT0icmFkaW8iXTpmb2N1cywKK2lucHV0W3R5cGU9ImNoZWNrYm94Il06 Zm9jdXMgeworICBvdXRsaW5lOiB0aGluIGRvdHRlZCAjMzMzOworICBvdXRsaW5lOiA1cHggYXV0 byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7CisgIG91dGxpbmUtb2Zmc2V0OiAtMnB4OworfQor CisudW5lZGl0YWJsZS1pbnB1dCwKKy51bmVkaXRhYmxlLXRleHRhcmVhIHsKKyAgY29sb3I6ICM5 OTk5OTk7CisgIGN1cnNvcjogbm90LWFsbG93ZWQ7CisgIGJhY2tncm91bmQtY29sb3I6ICNmY2Zj ZmM7CisgIGJvcmRlci1jb2xvcjogI2NjY2NjYzsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNl dCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjAyNSk7CisgICAgIC1tb3otYm94LXNoYWRvdzog aW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wMjUpOworICAgICAgICAgIGJveC1zaGFk b3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDI1KTsKK30KKworLnVuZWRpdGFi bGUtaW5wdXQgeworICBvdmVyZmxvdzogaGlkZGVuOworICB3aGl0ZS1zcGFjZTogbm93cmFwOwor fQorCisudW5lZGl0YWJsZS10ZXh0YXJlYSB7CisgIHdpZHRoOiBhdXRvOworICBoZWlnaHQ6IGF1 dG87Cit9CisKK2lucHV0Oi1tb3otcGxhY2Vob2xkZXIsCit0ZXh0YXJlYTotbW96LXBsYWNlaG9s ZGVyIHsKKyAgY29sb3I6ICM5OTk5OTk7Cit9CisKK2lucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRl ciwKK3RleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CisgIGNvbG9yOiAjOTk5OTk5Owor fQorCitpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwKK3RleHRhcmVhOjotd2Via2l0 LWlucHV0LXBsYWNlaG9sZGVyIHsKKyAgY29sb3I6ICM5OTk5OTk7Cit9CisKKy5yYWRpbywKKy5j aGVja2JveCB7CisgIG1pbi1oZWlnaHQ6IDIwcHg7CisgIHBhZGRpbmctbGVmdDogMjBweDsKK30K KworLnJhZGlvIGlucHV0W3R5cGU9InJhZGlvIl0sCisuY2hlY2tib3ggaW5wdXRbdHlwZT0iY2hl Y2tib3giXSB7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW4tbGVmdDogLTIwcHg7Cit9CisKKy5j b250cm9scyA+IC5yYWRpbzpmaXJzdC1jaGlsZCwKKy5jb250cm9scyA+IC5jaGVja2JveDpmaXJz dC1jaGlsZCB7CisgIHBhZGRpbmctdG9wOiA1cHg7Cit9CisKKy5yYWRpby5pbmxpbmUsCisuY2hl Y2tib3guaW5saW5lIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBwYWRkaW5nLXRvcDog NXB4OworICBtYXJnaW4tYm90dG9tOiAwOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQor CisucmFkaW8uaW5saW5lICsgLnJhZGlvLmlubGluZSwKKy5jaGVja2JveC5pbmxpbmUgKyAuY2hl Y2tib3guaW5saW5lIHsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7Cit9CisKKy5pbnB1dC1taW5pIHsK KyAgd2lkdGg6IDYwcHg7Cit9CisKKy5pbnB1dC1zbWFsbCB7CisgIHdpZHRoOiA5MHB4OworfQor CisuaW5wdXQtbWVkaXVtIHsKKyAgd2lkdGg6IDE1MHB4OworfQorCisuaW5wdXQtbGFyZ2Ugewor ICB3aWR0aDogMjEwcHg7Cit9CisKKy5pbnB1dC14bGFyZ2UgeworICB3aWR0aDogMjcwcHg7Cit9 CisKKy5pbnB1dC14eGxhcmdlIHsKKyAgd2lkdGg6IDUzMHB4OworfQorCitpbnB1dFtjbGFzcyo9 InNwYW4iXSwKK3NlbGVjdFtjbGFzcyo9InNwYW4iXSwKK3RleHRhcmVhW2NsYXNzKj0ic3BhbiJd LAorLnVuZWRpdGFibGUtaW5wdXRbY2xhc3MqPSJzcGFuIl0sCisucm93LWZsdWlkIGlucHV0W2Ns YXNzKj0ic3BhbiJdLAorLnJvdy1mbHVpZCBzZWxlY3RbY2xhc3MqPSJzcGFuIl0sCisucm93LWZs dWlkIHRleHRhcmVhW2NsYXNzKj0ic3BhbiJdLAorLnJvdy1mbHVpZCAudW5lZGl0YWJsZS1pbnB1 dFtjbGFzcyo9InNwYW4iXSB7CisgIGZsb2F0OiBub25lOworICBtYXJnaW4tbGVmdDogMDsKK30K KworLmlucHV0LWFwcGVuZCBpbnB1dFtjbGFzcyo9InNwYW4iXSwKKy5pbnB1dC1hcHBlbmQgLnVu ZWRpdGFibGUtaW5wdXRbY2xhc3MqPSJzcGFuIl0sCisuaW5wdXQtcHJlcGVuZCBpbnB1dFtjbGFz cyo9InNwYW4iXSwKKy5pbnB1dC1wcmVwZW5kIC51bmVkaXRhYmxlLWlucHV0W2NsYXNzKj0ic3Bh biJdLAorLnJvdy1mbHVpZCBpbnB1dFtjbGFzcyo9InNwYW4iXSwKKy5yb3ctZmx1aWQgc2VsZWN0 W2NsYXNzKj0ic3BhbiJdLAorLnJvdy1mbHVpZCB0ZXh0YXJlYVtjbGFzcyo9InNwYW4iXSwKKy5y b3ctZmx1aWQgLnVuZWRpdGFibGUtaW5wdXRbY2xhc3MqPSJzcGFuIl0sCisucm93LWZsdWlkIC5p bnB1dC1wcmVwZW5kIFtjbGFzcyo9InNwYW4iXSwKKy5yb3ctZmx1aWQgLmlucHV0LWFwcGVuZCBb Y2xhc3MqPSJzcGFuIl0geworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cit9CisKK2lucHV0LAor dGV4dGFyZWEsCisudW5lZGl0YWJsZS1pbnB1dCB7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCisu Y29udHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXSArIFtjbGFzcyo9InNwYW4iXSB7CisgIG1hcmdp bi1sZWZ0OiAyMHB4OworfQorCitpbnB1dC5zcGFuMTIsCit0ZXh0YXJlYS5zcGFuMTIsCisudW5l ZGl0YWJsZS1pbnB1dC5zcGFuMTIgeworICB3aWR0aDogOTI2cHg7Cit9CisKK2lucHV0LnNwYW4x MSwKK3RleHRhcmVhLnNwYW4xMSwKKy51bmVkaXRhYmxlLWlucHV0LnNwYW4xMSB7CisgIHdpZHRo OiA4NDZweDsKK30KKworaW5wdXQuc3BhbjEwLAordGV4dGFyZWEuc3BhbjEwLAorLnVuZWRpdGFi bGUtaW5wdXQuc3BhbjEwIHsKKyAgd2lkdGg6IDc2NnB4OworfQorCitpbnB1dC5zcGFuOSwKK3Rl eHRhcmVhLnNwYW45LAorLnVuZWRpdGFibGUtaW5wdXQuc3BhbjkgeworICB3aWR0aDogNjg2cHg7 Cit9CisKK2lucHV0LnNwYW44LAordGV4dGFyZWEuc3BhbjgsCisudW5lZGl0YWJsZS1pbnB1dC5z cGFuOCB7CisgIHdpZHRoOiA2MDZweDsKK30KKworaW5wdXQuc3BhbjcsCit0ZXh0YXJlYS5zcGFu NywKKy51bmVkaXRhYmxlLWlucHV0LnNwYW43IHsKKyAgd2lkdGg6IDUyNnB4OworfQorCitpbnB1 dC5zcGFuNiwKK3RleHRhcmVhLnNwYW42LAorLnVuZWRpdGFibGUtaW5wdXQuc3BhbjYgeworICB3 aWR0aDogNDQ2cHg7Cit9CisKK2lucHV0LnNwYW41LAordGV4dGFyZWEuc3BhbjUsCisudW5lZGl0 YWJsZS1pbnB1dC5zcGFuNSB7CisgIHdpZHRoOiAzNjZweDsKK30KKworaW5wdXQuc3BhbjQsCit0 ZXh0YXJlYS5zcGFuNCwKKy51bmVkaXRhYmxlLWlucHV0LnNwYW40IHsKKyAgd2lkdGg6IDI4NnB4 OworfQorCitpbnB1dC5zcGFuMywKK3RleHRhcmVhLnNwYW4zLAorLnVuZWRpdGFibGUtaW5wdXQu c3BhbjMgeworICB3aWR0aDogMjA2cHg7Cit9CisKK2lucHV0LnNwYW4yLAordGV4dGFyZWEuc3Bh bjIsCisudW5lZGl0YWJsZS1pbnB1dC5zcGFuMiB7CisgIHdpZHRoOiAxMjZweDsKK30KKworaW5w dXQuc3BhbjEsCit0ZXh0YXJlYS5zcGFuMSwKKy51bmVkaXRhYmxlLWlucHV0LnNwYW4xIHsKKyAg d2lkdGg6IDQ2cHg7Cit9CisKKy5jb250cm9scy1yb3cgeworICAqem9vbTogMTsKK30KKworLmNv bnRyb2xzLXJvdzpiZWZvcmUsCisuY29udHJvbHMtcm93OmFmdGVyIHsKKyAgZGlzcGxheTogdGFi bGU7CisgIGxpbmUtaGVpZ2h0OiAwOworICBjb250ZW50OiAiIjsKK30KKworLmNvbnRyb2xzLXJv dzphZnRlciB7CisgIGNsZWFyOiBib3RoOworfQorCisuY29udHJvbHMtcm93IFtjbGFzcyo9InNw YW4iXSwKKy5yb3ctZmx1aWQgLmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFuIl0geworICBmbG9h dDogbGVmdDsKK30KKworLmNvbnRyb2xzLXJvdyAuY2hlY2tib3hbY2xhc3MqPSJzcGFuIl0sCisu Y29udHJvbHMtcm93IC5yYWRpb1tjbGFzcyo9InNwYW4iXSB7CisgIHBhZGRpbmctdG9wOiA1cHg7 Cit9CisKK2lucHV0W2Rpc2FibGVkXSwKK3NlbGVjdFtkaXNhYmxlZF0sCit0ZXh0YXJlYVtkaXNh YmxlZF0sCitpbnB1dFtyZWFkb25seV0sCitzZWxlY3RbcmVhZG9ubHldLAordGV4dGFyZWFbcmVh ZG9ubHldIHsKKyAgY3Vyc29yOiBub3QtYWxsb3dlZDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Vl ZWVlZTsKK30KKworaW5wdXRbdHlwZT0icmFkaW8iXVtkaXNhYmxlZF0sCitpbnB1dFt0eXBlPSJj aGVja2JveCJdW2Rpc2FibGVkXSwKK2lucHV0W3R5cGU9InJhZGlvIl1bcmVhZG9ubHldLAoraW5w dXRbdHlwZT0iY2hlY2tib3giXVtyZWFkb25seV0geworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFu c3BhcmVudDsKK30KKworLmNvbnRyb2wtZ3JvdXAud2FybmluZyAuY29udHJvbC1sYWJlbCwKKy5j b250cm9sLWdyb3VwLndhcm5pbmcgLmhlbHAtYmxvY2ssCisuY29udHJvbC1ncm91cC53YXJuaW5n IC5oZWxwLWlubGluZSB7CisgIGNvbG9yOiAjYzA5ODUzOworfQorCisuY29udHJvbC1ncm91cC53 YXJuaW5nIC5jaGVja2JveCwKKy5jb250cm9sLWdyb3VwLndhcm5pbmcgLnJhZGlvLAorLmNvbnRy b2wtZ3JvdXAud2FybmluZyBpbnB1dCwKKy5jb250cm9sLWdyb3VwLndhcm5pbmcgc2VsZWN0LAor LmNvbnRyb2wtZ3JvdXAud2FybmluZyB0ZXh0YXJlYSB7CisgIGNvbG9yOiAjYzA5ODUzOworfQor CisuY29udHJvbC1ncm91cC53YXJuaW5nIGlucHV0LAorLmNvbnRyb2wtZ3JvdXAud2FybmluZyBz ZWxlY3QsCisuY29udHJvbC1ncm91cC53YXJuaW5nIHRleHRhcmVhIHsKKyAgYm9yZGVyLWNvbG9y OiAjYzA5ODUzOworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAs IDAsIDAsIDAuMDc1KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdi YSgwLCAwLCAwLCAwLjA3NSk7CisgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4 IHJnYmEoMCwgMCwgMCwgMC4wNzUpOworfQorCisuY29udHJvbC1ncm91cC53YXJuaW5nIGlucHV0 OmZvY3VzLAorLmNvbnRyb2wtZ3JvdXAud2FybmluZyBzZWxlY3Q6Zm9jdXMsCisuY29udHJvbC1n cm91cC53YXJuaW5nIHRleHRhcmVhOmZvY3VzIHsKKyAgYm9yZGVyLWNvbG9yOiAjYTQ3ZTNjOwor ICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1 KSwgMCAwIDZweCAjZGJjNTllOworICAgICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFw eCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjZGJjNTllOworICAgICAgICAgIGJveC1z aGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjZGJj NTllOworfQorCisuY29udHJvbC1ncm91cC53YXJuaW5nIC5pbnB1dC1wcmVwZW5kIC5hZGQtb24s CisuY29udHJvbC1ncm91cC53YXJuaW5nIC5pbnB1dC1hcHBlbmQgLmFkZC1vbiB7CisgIGNvbG9y OiAjYzA5ODUzOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzOworICBib3JkZXItY29sb3I6 ICNjMDk4NTM7Cit9CisKKy5jb250cm9sLWdyb3VwLmVycm9yIC5jb250cm9sLWxhYmVsLAorLmNv bnRyb2wtZ3JvdXAuZXJyb3IgLmhlbHAtYmxvY2ssCisuY29udHJvbC1ncm91cC5lcnJvciAuaGVs cC1pbmxpbmUgeworICBjb2xvcjogI2I5NGE0ODsKK30KKworLmNvbnRyb2wtZ3JvdXAuZXJyb3Ig LmNoZWNrYm94LAorLmNvbnRyb2wtZ3JvdXAuZXJyb3IgLnJhZGlvLAorLmNvbnRyb2wtZ3JvdXAu ZXJyb3IgaW5wdXQsCisuY29udHJvbC1ncm91cC5lcnJvciBzZWxlY3QsCisuY29udHJvbC1ncm91 cC5lcnJvciB0ZXh0YXJlYSB7CisgIGNvbG9yOiAjYjk0YTQ4OworfQorCisuY29udHJvbC1ncm91 cC5lcnJvciBpbnB1dCwKKy5jb250cm9sLWdyb3VwLmVycm9yIHNlbGVjdCwKKy5jb250cm9sLWdy b3VwLmVycm9yIHRleHRhcmVhIHsKKyAgYm9yZGVyLWNvbG9yOiAjYjk0YTQ4OworICAtd2Via2l0 LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTsKKyAgICAg LW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7Cisg ICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUp OworfQorCisuY29udHJvbC1ncm91cC5lcnJvciBpbnB1dDpmb2N1cywKKy5jb250cm9sLWdyb3Vw LmVycm9yIHNlbGVjdDpmb2N1cywKKy5jb250cm9sLWdyb3VwLmVycm9yIHRleHRhcmVhOmZvY3Vz IHsKKyAgYm9yZGVyLWNvbG9yOiAjOTUzYjM5OworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0 IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjZDU5MzkyOworICAgICAt bW96LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAw IDZweCAjZDU5MzkyOworICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2Jh KDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjZDU5MzkyOworfQorCisuY29udHJvbC1ncm91cC5l cnJvciAuaW5wdXQtcHJlcGVuZCAuYWRkLW9uLAorLmNvbnRyb2wtZ3JvdXAuZXJyb3IgLmlucHV0 LWFwcGVuZCAuYWRkLW9uIHsKKyAgY29sb3I6ICNiOTRhNDg7CisgIGJhY2tncm91bmQtY29sb3I6 ICNmMmRlZGU7CisgIGJvcmRlci1jb2xvcjogI2I5NGE0ODsKK30KKworLmNvbnRyb2wtZ3JvdXAu c3VjY2VzcyAuY29udHJvbC1sYWJlbCwKKy5jb250cm9sLWdyb3VwLnN1Y2Nlc3MgLmhlbHAtYmxv Y2ssCisuY29udHJvbC1ncm91cC5zdWNjZXNzIC5oZWxwLWlubGluZSB7CisgIGNvbG9yOiAjNDY4 ODQ3OworfQorCisuY29udHJvbC1ncm91cC5zdWNjZXNzIC5jaGVja2JveCwKKy5jb250cm9sLWdy b3VwLnN1Y2Nlc3MgLnJhZGlvLAorLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyBpbnB1dCwKKy5jb250 cm9sLWdyb3VwLnN1Y2Nlc3Mgc2VsZWN0LAorLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyB0ZXh0YXJl YSB7CisgIGNvbG9yOiAjNDY4ODQ3OworfQorCisuY29udHJvbC1ncm91cC5zdWNjZXNzIGlucHV0 LAorLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyBzZWxlY3QsCisuY29udHJvbC1ncm91cC5zdWNjZXNz IHRleHRhcmVhIHsKKyAgYm9yZGVyLWNvbG9yOiAjNDY4ODQ3OworICAtd2Via2l0LWJveC1zaGFk b3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTsKKyAgICAgLW1vei1ib3gt c2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7CisgICAgICAgICAg Ym94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpOworfQorCisu Y29udHJvbC1ncm91cC5zdWNjZXNzIGlucHV0OmZvY3VzLAorLmNvbnRyb2wtZ3JvdXAuc3VjY2Vz cyBzZWxlY3Q6Zm9jdXMsCisuY29udHJvbC1ncm91cC5zdWNjZXNzIHRleHRhcmVhOmZvY3VzIHsK KyAgYm9yZGVyLWNvbG9yOiAjMzU2NjM1OworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAg MXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjN2FiYTdiOworICAgICAtbW96 LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZw eCAjN2FiYTdiOworICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAs IDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjN2FiYTdiOworfQorCisuY29udHJvbC1ncm91cC5zdWNj ZXNzIC5pbnB1dC1wcmVwZW5kIC5hZGQtb24sCisuY29udHJvbC1ncm91cC5zdWNjZXNzIC5pbnB1 dC1hcHBlbmQgLmFkZC1vbiB7CisgIGNvbG9yOiAjNDY4ODQ3OworICBiYWNrZ3JvdW5kLWNvbG9y OiAjZGZmMGQ4OworICBib3JkZXItY29sb3I6ICM0Njg4NDc7Cit9CisKKy5jb250cm9sLWdyb3Vw LmluZm8gLmNvbnRyb2wtbGFiZWwsCisuY29udHJvbC1ncm91cC5pbmZvIC5oZWxwLWJsb2NrLAor LmNvbnRyb2wtZ3JvdXAuaW5mbyAuaGVscC1pbmxpbmUgeworICBjb2xvcjogIzNhODdhZDsKK30K KworLmNvbnRyb2wtZ3JvdXAuaW5mbyAuY2hlY2tib3gsCisuY29udHJvbC1ncm91cC5pbmZvIC5y YWRpbywKKy5jb250cm9sLWdyb3VwLmluZm8gaW5wdXQsCisuY29udHJvbC1ncm91cC5pbmZvIHNl bGVjdCwKKy5jb250cm9sLWdyb3VwLmluZm8gdGV4dGFyZWEgeworICBjb2xvcjogIzNhODdhZDsK K30KKworLmNvbnRyb2wtZ3JvdXAuaW5mbyBpbnB1dCwKKy5jb250cm9sLWdyb3VwLmluZm8gc2Vs ZWN0LAorLmNvbnRyb2wtZ3JvdXAuaW5mbyB0ZXh0YXJlYSB7CisgIGJvcmRlci1jb2xvcjogIzNh ODdhZDsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAw LCAwLjA3NSk7CisgICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwg MCwgMCwgMC4wNzUpOworICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2Jh KDAsIDAsIDAsIDAuMDc1KTsKK30KKworLmNvbnRyb2wtZ3JvdXAuaW5mbyBpbnB1dDpmb2N1cywK Ky5jb250cm9sLWdyb3VwLmluZm8gc2VsZWN0OmZvY3VzLAorLmNvbnRyb2wtZ3JvdXAuaW5mbyB0 ZXh0YXJlYTpmb2N1cyB7CisgIGJvcmRlci1jb2xvcjogIzJkNjk4NzsKKyAgLXdlYmtpdC1ib3gt c2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzdh YjVkMzsKKyAgICAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAw LCAwLjA3NSksIDAgMCA2cHggIzdhYjVkMzsKKyAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAw IDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzdhYjVkMzsKK30KKworLmNv bnRyb2wtZ3JvdXAuaW5mbyAuaW5wdXQtcHJlcGVuZCAuYWRkLW9uLAorLmNvbnRyb2wtZ3JvdXAu aW5mbyAuaW5wdXQtYXBwZW5kIC5hZGQtb24geworICBjb2xvcjogIzNhODdhZDsKKyAgYmFja2dy b3VuZC1jb2xvcjogI2Q5ZWRmNzsKKyAgYm9yZGVyLWNvbG9yOiAjM2E4N2FkOworfQorCitpbnB1 dDpmb2N1czppbnZhbGlkLAordGV4dGFyZWE6Zm9jdXM6aW52YWxpZCwKK3NlbGVjdDpmb2N1czpp bnZhbGlkIHsKKyAgY29sb3I6ICNiOTRhNDg7CisgIGJvcmRlci1jb2xvcjogI2VlNWY1YjsKK30K KworaW5wdXQ6Zm9jdXM6aW52YWxpZDpmb2N1cywKK3RleHRhcmVhOmZvY3VzOmludmFsaWQ6Zm9j dXMsCitzZWxlY3Q6Zm9jdXM6aW52YWxpZDpmb2N1cyB7CisgIGJvcmRlci1jb2xvcjogI2U5MzIy ZDsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4ICNmOGI5Yjc7CisgICAgIC1tb3otYm94 LXNoYWRvdzogMCAwIDZweCAjZjhiOWI3OworICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHgg I2Y4YjliNzsKK30KKworLmZvcm0tYWN0aW9ucyB7CisgIHBhZGRpbmc6IDE5cHggMjBweCAyMHB4 OworICBtYXJnaW4tdG9wOiAyMHB4OworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBiYWNrZ3Jv dW5kLWNvbG9yOiAjZjVmNWY1OworICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTVlNTsKKyAg Knpvb206IDE7Cit9CisKKy5mb3JtLWFjdGlvbnM6YmVmb3JlLAorLmZvcm0tYWN0aW9uczphZnRl ciB7CisgIGRpc3BsYXk6IHRhYmxlOworICBsaW5lLWhlaWdodDogMDsKKyAgY29udGVudDogIiI7 Cit9CisKKy5mb3JtLWFjdGlvbnM6YWZ0ZXIgeworICBjbGVhcjogYm90aDsKK30KKworLmhlbHAt YmxvY2ssCisuaGVscC1pbmxpbmUgeworICBjb2xvcjogIzU5NTk1OTsKK30KKworLmhlbHAtYmxv Y2sgeworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKworLmhl bHAtaW5saW5lIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAqZGlzcGxheTogaW5saW5l OworICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgKnpv b206IDE7Cit9CisKKy5pbnB1dC1hcHBlbmQsCisuaW5wdXQtcHJlcGVuZCB7CisgIGRpc3BsYXk6 IGlubGluZS1ibG9jazsKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgZm9udC1zaXplOiAwOwor ICB3aGl0ZS1zcGFjZTogbm93cmFwOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisu aW5wdXQtYXBwZW5kIGlucHV0LAorLmlucHV0LXByZXBlbmQgaW5wdXQsCisuaW5wdXQtYXBwZW5k IHNlbGVjdCwKKy5pbnB1dC1wcmVwZW5kIHNlbGVjdCwKKy5pbnB1dC1hcHBlbmQgLnVuZWRpdGFi bGUtaW5wdXQsCisuaW5wdXQtcHJlcGVuZCAudW5lZGl0YWJsZS1pbnB1dCwKKy5pbnB1dC1hcHBl bmQgLmRyb3Bkb3duLW1lbnUsCisuaW5wdXQtcHJlcGVuZCAuZHJvcGRvd24tbWVudSwKKy5pbnB1 dC1hcHBlbmQgLnBvcG92ZXIsCisuaW5wdXQtcHJlcGVuZCAucG9wb3ZlciB7CisgIGZvbnQtc2l6 ZTogMTRweDsKK30KKworLmlucHV0LWFwcGVuZCBpbnB1dCwKKy5pbnB1dC1wcmVwZW5kIGlucHV0 LAorLmlucHV0LWFwcGVuZCBzZWxlY3QsCisuaW5wdXQtcHJlcGVuZCBzZWxlY3QsCisuaW5wdXQt YXBwZW5kIC51bmVkaXRhYmxlLWlucHV0LAorLmlucHV0LXByZXBlbmQgLnVuZWRpdGFibGUtaW5w dXQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIG1hcmdpbi1ib3R0b206IDA7CisgICptYXJn aW4tbGVmdDogMDsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgLXdlYmtpdC1ib3JkZXItcmFk aXVzOiAwIDRweCA0cHggMDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsK KyAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsKK30KKworLmlucHV0LWFwcGVu ZCBpbnB1dDpmb2N1cywKKy5pbnB1dC1wcmVwZW5kIGlucHV0OmZvY3VzLAorLmlucHV0LWFwcGVu ZCBzZWxlY3Q6Zm9jdXMsCisuaW5wdXQtcHJlcGVuZCBzZWxlY3Q6Zm9jdXMsCisuaW5wdXQtYXBw ZW5kIC51bmVkaXRhYmxlLWlucHV0OmZvY3VzLAorLmlucHV0LXByZXBlbmQgLnVuZWRpdGFibGUt aW5wdXQ6Zm9jdXMgeworICB6LWluZGV4OiAyOworfQorCisuaW5wdXQtYXBwZW5kIC5hZGQtb24s CisuaW5wdXQtcHJlcGVuZCAuYWRkLW9uIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICB3 aWR0aDogYXV0bzsKKyAgaGVpZ2h0OiAyMHB4OworICBtaW4td2lkdGg6IDE2cHg7CisgIHBhZGRp bmc6IDRweCA1cHg7CisgIGZvbnQtc2l6ZTogMTRweDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsK KyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgdGV4dC1zaGFk b3c6IDAgMXB4IDAgI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKKyAgYm9y ZGVyOiAxcHggc29saWQgI2NjYzsKK30KKworLmlucHV0LWFwcGVuZCAuYWRkLW9uLAorLmlucHV0 LXByZXBlbmQgLmFkZC1vbiwKKy5pbnB1dC1hcHBlbmQgLmJ0biwKKy5pbnB1dC1wcmVwZW5kIC5i dG4sCisuaW5wdXQtYXBwZW5kIC5idG4tZ3JvdXAgPiAuZHJvcGRvd24tdG9nZ2xlLAorLmlucHV0 LXByZXBlbmQgLmJ0bi1ncm91cCA+IC5kcm9wZG93bi10b2dnbGUgeworICB2ZXJ0aWNhbC1hbGln bjogdG9wOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CisgICAgIC1tb3otYm9yZGVyLXJh ZGl1czogMDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOworfQorCisuaW5wdXQtYXBwZW5k IC5hY3RpdmUsCisuaW5wdXQtcHJlcGVuZCAuYWN0aXZlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjog I2E5ZGJhOTsKKyAgYm9yZGVyLWNvbG9yOiAjNDZhNTQ2OworfQorCisuaW5wdXQtcHJlcGVuZCAu YWRkLW9uLAorLmlucHV0LXByZXBlbmQgLmJ0biB7CisgIG1hcmdpbi1yaWdodDogLTFweDsKK30K KworLmlucHV0LXByZXBlbmQgLmFkZC1vbjpmaXJzdC1jaGlsZCwKKy5pbnB1dC1wcmVwZW5kIC5i dG46Zmlyc3QtY2hpbGQgeworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4Owor ICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OworICAgICAgICAgIGJvcmRlci1y YWRpdXM6IDRweCAwIDAgNHB4OworfQorCisuaW5wdXQtYXBwZW5kIGlucHV0LAorLmlucHV0LWFw cGVuZCBzZWxlY3QsCisuaW5wdXQtYXBwZW5kIC51bmVkaXRhYmxlLWlucHV0IHsKKyAgLXdlYmtp dC1ib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA0 cHggMCAwIDRweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDsKK30KKwor LmlucHV0LWFwcGVuZCBpbnB1dCArIC5idG4tZ3JvdXAgLmJ0bjpsYXN0LWNoaWxkLAorLmlucHV0 LWFwcGVuZCBzZWxlY3QgKyAuYnRuLWdyb3VwIC5idG46bGFzdC1jaGlsZCwKKy5pbnB1dC1hcHBl bmQgLnVuZWRpdGFibGUtaW5wdXQgKyAuYnRuLWdyb3VwIC5idG46bGFzdC1jaGlsZCB7CisgIC13 ZWJraXQtYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1 czogMCA0cHggNHB4IDA7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7Cit9 CisKKy5pbnB1dC1hcHBlbmQgLmFkZC1vbiwKKy5pbnB1dC1hcHBlbmQgLmJ0biwKKy5pbnB1dC1h cHBlbmQgLmJ0bi1ncm91cCB7CisgIG1hcmdpbi1sZWZ0OiAtMXB4OworfQorCisuaW5wdXQtYXBw ZW5kIC5hZGQtb246bGFzdC1jaGlsZCwKKy5pbnB1dC1hcHBlbmQgLmJ0bjpsYXN0LWNoaWxkLAor LmlucHV0LWFwcGVuZCAuYnRuLWdyb3VwOmxhc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlIHsK KyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsKKyAgICAgLW1vei1ib3JkZXIt cmFkaXVzOiAwIDRweCA0cHggMDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHgg MDsKK30KKworLmlucHV0LXByZXBlbmQuaW5wdXQtYXBwZW5kIGlucHV0LAorLmlucHV0LXByZXBl bmQuaW5wdXQtYXBwZW5kIHNlbGVjdCwKKy5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCAudW5l ZGl0YWJsZS1pbnB1dCB7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKKyAgICAgLW1vei1i b3JkZXItcmFkaXVzOiAwOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7Cit9CisKKy5pbnB1 dC1wcmVwZW5kLmlucHV0LWFwcGVuZCBpbnB1dCArIC5idG4tZ3JvdXAgLmJ0biwKKy5pbnB1dC1w cmVwZW5kLmlucHV0LWFwcGVuZCBzZWxlY3QgKyAuYnRuLWdyb3VwIC5idG4sCisuaW5wdXQtcHJl cGVuZC5pbnB1dC1hcHBlbmQgLnVuZWRpdGFibGUtaW5wdXQgKyAuYnRuLWdyb3VwIC5idG4gewor ICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOworICAgICAtbW96LWJvcmRlci1y YWRpdXM6IDAgNHB4IDRweCAwOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAw OworfQorCisuaW5wdXQtcHJlcGVuZC5pbnB1dC1hcHBlbmQgLmFkZC1vbjpmaXJzdC1jaGlsZCwK Ky5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCAuYnRuOmZpcnN0LWNoaWxkIHsKKyAgbWFyZ2lu LXJpZ2h0OiAtMXB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OworICAg ICAtbW96LWJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OworICAgICAgICAgIGJvcmRlci1yYWRp dXM6IDRweCAwIDAgNHB4OworfQorCisuaW5wdXQtcHJlcGVuZC5pbnB1dC1hcHBlbmQgLmFkZC1v bjpsYXN0LWNoaWxkLAorLmlucHV0LXByZXBlbmQuaW5wdXQtYXBwZW5kIC5idG46bGFzdC1jaGls ZCB7CisgIG1hcmdpbi1sZWZ0OiAtMXB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAgNHB4 IDRweCAwOworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOworICAgICAgICAg IGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOworfQorCisuaW5wdXQtcHJlcGVuZC5pbnB1dC1h cHBlbmQgLmJ0bi1ncm91cDpmaXJzdC1jaGlsZCB7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCitp bnB1dC5zZWFyY2gtcXVlcnkgeworICBwYWRkaW5nLXJpZ2h0OiAxNHB4OworICBwYWRkaW5nLXJp Z2h0OiA0cHggXDk7CisgIHBhZGRpbmctbGVmdDogMTRweDsKKyAgcGFkZGluZy1sZWZ0OiA0cHgg XDk7CisgIC8qIElFNy04IGRvZXNuJ3QgaGF2ZSBib3JkZXItcmFkaXVzLCBzbyBkb24ndCBpbmRl bnQgdGhlIHBhZGRpbmcgKi8KKworICBtYXJnaW4tYm90dG9tOiAwOworICAtd2Via2l0LWJvcmRl ci1yYWRpdXM6IDE1cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTVweDsKKyAgICAgICAg ICBib3JkZXItcmFkaXVzOiAxNXB4OworfQorCisvKiBBbGxvdyBmb3IgaW5wdXQgcHJlcGVuZC9h cHBlbmQgaW4gc2VhcmNoIGZvcm1zICovCisKKy5mb3JtLXNlYXJjaCAuaW5wdXQtYXBwZW5kIC5z ZWFyY2gtcXVlcnksCisuZm9ybS1zZWFyY2ggLmlucHV0LXByZXBlbmQgLnNlYXJjaC1xdWVyeSB7 CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAw OworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7Cit9CisKKy5mb3JtLXNlYXJjaCAuaW5wdXQt YXBwZW5kIC5zZWFyY2gtcXVlcnkgeworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDE0cHggMCAw IDE0cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTRweCAwIDAgMTRweDsKKyAgICAgICAg ICBib3JkZXItcmFkaXVzOiAxNHB4IDAgMCAxNHB4OworfQorCisuZm9ybS1zZWFyY2ggLmlucHV0 LWFwcGVuZCAuYnRuIHsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwIDE0cHggMTRweCAwOwor ICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDAgMTRweCAxNHB4IDA7CisgICAgICAgICAgYm9yZGVy LXJhZGl1czogMCAxNHB4IDE0cHggMDsKK30KKworLmZvcm0tc2VhcmNoIC5pbnB1dC1wcmVwZW5k IC5zZWFyY2gtcXVlcnkgeworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAgMTRweCAxNHB4IDA7 CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMCAxNHB4IDE0cHggMDsKKyAgICAgICAgICBib3Jk ZXItcmFkaXVzOiAwIDE0cHggMTRweCAwOworfQorCisuZm9ybS1zZWFyY2ggLmlucHV0LXByZXBl bmQgLmJ0biB7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTRweCAwIDAgMTRweDsKKyAgICAg LW1vei1ib3JkZXItcmFkaXVzOiAxNHB4IDAgMCAxNHB4OworICAgICAgICAgIGJvcmRlci1yYWRp dXM6IDE0cHggMCAwIDE0cHg7Cit9CisKKy5mb3JtLXNlYXJjaCBpbnB1dCwKKy5mb3JtLWlubGlu ZSBpbnB1dCwKKy5mb3JtLWhvcml6b250YWwgaW5wdXQsCisuZm9ybS1zZWFyY2ggdGV4dGFyZWEs CisuZm9ybS1pbmxpbmUgdGV4dGFyZWEsCisuZm9ybS1ob3Jpem9udGFsIHRleHRhcmVhLAorLmZv cm0tc2VhcmNoIHNlbGVjdCwKKy5mb3JtLWlubGluZSBzZWxlY3QsCisuZm9ybS1ob3Jpem9udGFs IHNlbGVjdCwKKy5mb3JtLXNlYXJjaCAuaGVscC1pbmxpbmUsCisuZm9ybS1pbmxpbmUgLmhlbHAt aW5saW5lLAorLmZvcm0taG9yaXpvbnRhbCAuaGVscC1pbmxpbmUsCisuZm9ybS1zZWFyY2ggLnVu ZWRpdGFibGUtaW5wdXQsCisuZm9ybS1pbmxpbmUgLnVuZWRpdGFibGUtaW5wdXQsCisuZm9ybS1o b3Jpem9udGFsIC51bmVkaXRhYmxlLWlucHV0LAorLmZvcm0tc2VhcmNoIC5pbnB1dC1wcmVwZW5k LAorLmZvcm0taW5saW5lIC5pbnB1dC1wcmVwZW5kLAorLmZvcm0taG9yaXpvbnRhbCAuaW5wdXQt cHJlcGVuZCwKKy5mb3JtLXNlYXJjaCAuaW5wdXQtYXBwZW5kLAorLmZvcm0taW5saW5lIC5pbnB1 dC1hcHBlbmQsCisuZm9ybS1ob3Jpem9udGFsIC5pbnB1dC1hcHBlbmQgeworICBkaXNwbGF5OiBp bmxpbmUtYmxvY2s7CisgICpkaXNwbGF5OiBpbmxpbmU7CisgIG1hcmdpbi1ib3R0b206IDA7Cisg IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICp6b29tOiAxOworfQorCisuZm9ybS1zZWFyY2gg LmhpZGUsCisuZm9ybS1pbmxpbmUgLmhpZGUsCisuZm9ybS1ob3Jpem9udGFsIC5oaWRlIHsKKyAg ZGlzcGxheTogbm9uZTsKK30KKworLmZvcm0tc2VhcmNoIGxhYmVsLAorLmZvcm0taW5saW5lIGxh YmVsLAorLmZvcm0tc2VhcmNoIC5idG4tZ3JvdXAsCisuZm9ybS1pbmxpbmUgLmJ0bi1ncm91cCB7 CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKK30KKworLmZvcm0tc2VhcmNoIC5pbnB1dC1hcHBl bmQsCisuZm9ybS1pbmxpbmUgLmlucHV0LWFwcGVuZCwKKy5mb3JtLXNlYXJjaCAuaW5wdXQtcHJl cGVuZCwKKy5mb3JtLWlubGluZSAuaW5wdXQtcHJlcGVuZCB7CisgIG1hcmdpbi1ib3R0b206IDA7 Cit9CisKKy5mb3JtLXNlYXJjaCAucmFkaW8sCisuZm9ybS1zZWFyY2ggLmNoZWNrYm94LAorLmZv cm0taW5saW5lIC5yYWRpbywKKy5mb3JtLWlubGluZSAuY2hlY2tib3ggeworICBwYWRkaW5nLWxl ZnQ6IDA7CisgIG1hcmdpbi1ib3R0b206IDA7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9 CisKKy5mb3JtLXNlYXJjaCAucmFkaW8gaW5wdXRbdHlwZT0icmFkaW8iXSwKKy5mb3JtLXNlYXJj aCAuY2hlY2tib3ggaW5wdXRbdHlwZT0iY2hlY2tib3giXSwKKy5mb3JtLWlubGluZSAucmFkaW8g aW5wdXRbdHlwZT0icmFkaW8iXSwKKy5mb3JtLWlubGluZSAuY2hlY2tib3ggaW5wdXRbdHlwZT0i Y2hlY2tib3giXSB7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW4tcmlnaHQ6IDNweDsKKyAgbWFy Z2luLWxlZnQ6IDA7Cit9CisKKy5jb250cm9sLWdyb3VwIHsKKyAgbWFyZ2luLWJvdHRvbTogMTBw eDsKK30KKworbGVnZW5kICsgLmNvbnRyb2wtZ3JvdXAgeworICBtYXJnaW4tdG9wOiAyMHB4Owor ICAtd2Via2l0LW1hcmdpbi10b3AtY29sbGFwc2U6IHNlcGFyYXRlOworfQorCisuZm9ybS1ob3Jp em9udGFsIC5jb250cm9sLWdyb3VwIHsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgKnpvb206 IDE7Cit9CisKKy5mb3JtLWhvcml6b250YWwgLmNvbnRyb2wtZ3JvdXA6YmVmb3JlLAorLmZvcm0t aG9yaXpvbnRhbCAuY29udHJvbC1ncm91cDphZnRlciB7CisgIGRpc3BsYXk6IHRhYmxlOworICBs aW5lLWhlaWdodDogMDsKKyAgY29udGVudDogIiI7Cit9CisKKy5mb3JtLWhvcml6b250YWwgLmNv bnRyb2wtZ3JvdXA6YWZ0ZXIgeworICBjbGVhcjogYm90aDsKK30KKworLmZvcm0taG9yaXpvbnRh bCAuY29udHJvbC1sYWJlbCB7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMTYwcHg7CisgIHBh ZGRpbmctdG9wOiA1cHg7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCisuZm9ybS1ob3Jpem9u dGFsIC5jb250cm9scyB7CisgICpkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICpwYWRkaW5nLWxl ZnQ6IDIwcHg7CisgIG1hcmdpbi1sZWZ0OiAxODBweDsKKyAgKm1hcmdpbi1sZWZ0OiAwOworfQor CisuZm9ybS1ob3Jpem9udGFsIC5jb250cm9sczpmaXJzdC1jaGlsZCB7CisgICpwYWRkaW5nLWxl ZnQ6IDE4MHB4OworfQorCisuZm9ybS1ob3Jpem9udGFsIC5oZWxwLWJsb2NrIHsKKyAgbWFyZ2lu LWJvdHRvbTogMDsKK30KKworLmZvcm0taG9yaXpvbnRhbCBpbnB1dCArIC5oZWxwLWJsb2NrLAor LmZvcm0taG9yaXpvbnRhbCBzZWxlY3QgKyAuaGVscC1ibG9jaywKKy5mb3JtLWhvcml6b250YWwg dGV4dGFyZWEgKyAuaGVscC1ibG9jaywKKy5mb3JtLWhvcml6b250YWwgLnVuZWRpdGFibGUtaW5w dXQgKyAuaGVscC1ibG9jaywKKy5mb3JtLWhvcml6b250YWwgLmlucHV0LXByZXBlbmQgKyAuaGVs cC1ibG9jaywKKy5mb3JtLWhvcml6b250YWwgLmlucHV0LWFwcGVuZCArIC5oZWxwLWJsb2NrIHsK KyAgbWFyZ2luLXRvcDogMTBweDsKK30KKworLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1hY3Rpb25z IHsKKyAgcGFkZGluZy1sZWZ0OiAxODBweDsKK30KKwordGFibGUgeworICBtYXgtd2lkdGg6IDEw MCU7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICBib3JkZXItY29sbGFwc2U6 IGNvbGxhcHNlOworICBib3JkZXItc3BhY2luZzogMDsKK30KKworLnRhYmxlIHsKKyAgd2lkdGg6 IDEwMCU7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7Cit9CisKKy50YWJsZSB0aCwKKy50YWJsZSB0 ZCB7CisgIHBhZGRpbmc6IDhweDsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIHRleHQtYWxpZ246 IGxlZnQ7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAj ZGRkZGRkOworfQorCisudGFibGUgdGggeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLnRh YmxlIHRoZWFkIHRoIHsKKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKK30KKworLnRhYmxlIGNh cHRpb24gKyB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwKKy50YWJsZSBjYXB0aW9uICsgdGhlYWQg dHI6Zmlyc3QtY2hpbGQgdGQsCisudGFibGUgY29sZ3JvdXAgKyB0aGVhZCB0cjpmaXJzdC1jaGls ZCB0aCwKKy50YWJsZSBjb2xncm91cCArIHRoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLAorLnRhYmxl IHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLAorLnRhYmxlIHRoZWFkOmZpcnN0 LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRkIHsKKyAgYm9yZGVyLXRvcDogMDsKK30KKworLnRhYmxl IHRib2R5ICsgdGJvZHkgeworICBib3JkZXItdG9wOiAycHggc29saWQgI2RkZGRkZDsKK30KKwor LnRhYmxlIC50YWJsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Cit9CisKKy50YWJs ZS1jb25kZW5zZWQgdGgsCisudGFibGUtY29uZGVuc2VkIHRkIHsKKyAgcGFkZGluZzogNHB4IDVw eDsKK30KKworLnRhYmxlLWJvcmRlcmVkIHsKKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsK KyAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKKyAgKmJvcmRlci1jb2xsYXBzZTogY29sbGFw c2U7CisgIGJvcmRlci1sZWZ0OiAwOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAg ICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4 OworfQorCisudGFibGUtYm9yZGVyZWQgdGgsCisudGFibGUtYm9yZGVyZWQgdGQgeworICBib3Jk ZXItbGVmdDogMXB4IHNvbGlkICNkZGRkZGQ7Cit9CisKKy50YWJsZS1ib3JkZXJlZCBjYXB0aW9u ICsgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsCisudGFibGUtYm9yZGVyZWQgY2FwdGlvbiArIHRi b2R5IHRyOmZpcnN0LWNoaWxkIHRoLAorLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24gKyB0Ym9keSB0 cjpmaXJzdC1jaGlsZCB0ZCwKKy50YWJsZS1ib3JkZXJlZCBjb2xncm91cCArIHRoZWFkIHRyOmZp cnN0LWNoaWxkIHRoLAorLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwICsgdGJvZHkgdHI6Zmlyc3Qt Y2hpbGQgdGgsCisudGFibGUtYm9yZGVyZWQgY29sZ3JvdXAgKyB0Ym9keSB0cjpmaXJzdC1jaGls ZCB0ZCwKKy50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0 aCwKKy50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aCwK Ky50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0ZCB7Cisg IGJvcmRlci10b3A6IDA7Cit9CisKKy50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0 cjpmaXJzdC1jaGlsZCA+IHRoOmZpcnN0LWNoaWxkLAorLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZp cnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkID4gdGQ6Zmlyc3QtY2hpbGQsCisudGFibGUtYm9yZGVy ZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgPiB0aDpmaXJzdC1jaGlsZCB7Cisg IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAgICAgICAgIGJvcmRlci10 b3AtbGVmdC1yYWRpdXM6IDRweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsK K30KKworLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkID4g dGg6bGFzdC1jaGlsZCwKKy50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJz dC1jaGlsZCA+IHRkOmxhc3QtY2hpbGQsCisudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hp bGQgdHI6Zmlyc3QtY2hpbGQgPiB0aDpsYXN0LWNoaWxkIHsKKyAgLXdlYmtpdC1ib3JkZXItdG9w LXJpZ2h0LXJhZGl1czogNHB4OworICAgICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0 cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4OworfQorCisudGFibGUtYm9y ZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkID4gdGg6Zmlyc3QtY2hpbGQsCisu dGFibGUtYm9yZGVyZWQgdGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkID4gdGQ6Zmlyc3Qt Y2hpbGQsCisudGFibGUtYm9yZGVyZWQgdGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkID4g dGg6Zmlyc3QtY2hpbGQsCisudGFibGUtYm9yZGVyZWQgdGZvb3Q6bGFzdC1jaGlsZCB0cjpsYXN0 LWNoaWxkID4gdGQ6Zmlyc3QtY2hpbGQsCisudGFibGUtYm9yZGVyZWQgdGZvb3Q6bGFzdC1jaGls ZCB0cjpsYXN0LWNoaWxkID4gdGg6Zmlyc3QtY2hpbGQgeworICAtd2Via2l0LWJvcmRlci1ib3R0 b20tbGVmdC1yYWRpdXM6IDRweDsKKyAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVz OiA0cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7Cit9CisKKy50YWJs ZS1ib3JkZXJlZCB0aGVhZDpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQgPiB0aDpsYXN0LWNoaWxk LAorLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCA+IHRkOmxh c3QtY2hpbGQsCisudGFibGUtYm9yZGVyZWQgdGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxk ID4gdGg6bGFzdC1jaGlsZCwKKy50YWJsZS1ib3JkZXJlZCB0Zm9vdDpsYXN0LWNoaWxkIHRyOmxh c3QtY2hpbGQgPiB0ZDpsYXN0LWNoaWxkLAorLnRhYmxlLWJvcmRlcmVkIHRmb290Omxhc3QtY2hp bGQgdHI6bGFzdC1jaGlsZCA+IHRoOmxhc3QtY2hpbGQgeworICAtd2Via2l0LWJvcmRlci1ib3R0 b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRp dXM6IDRweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiA0cHg7Cit9CisKKy50 YWJsZS1ib3JkZXJlZCB0Zm9vdCArIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0ZDpm aXJzdC1jaGlsZCB7CisgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKKyAg ICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwOworICAtbW96LWJvcmRlci1yYWRp dXMtYm90dG9tbGVmdDogMDsKK30KKworLnRhYmxlLWJvcmRlcmVkIHRmb290ICsgdGJvZHk6bGFz dC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQgeworICAtd2Via2l0LWJvcmRlci1i b3R0b20tcmlnaHQtcmFkaXVzOiAwOworICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFk aXVzOiAwOworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDA7Cit9CisKKy50YWJs ZS1ib3JkZXJlZCBjYXB0aW9uICsgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQs CisudGFibGUtYm9yZGVyZWQgY2FwdGlvbiArIHRib2R5IHRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0 LWNoaWxkLAorLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwICsgdGhlYWQgdHI6Zmlyc3QtY2hpbGQg dGg6Zmlyc3QtY2hpbGQsCisudGFibGUtYm9yZGVyZWQgY29sZ3JvdXAgKyB0Ym9keSB0cjpmaXJz dC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCB7CisgIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1 czogNHB4OworICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKKyAgLW1vei1i b3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsKK30KKworLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24g KyB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLAorLnRhYmxlLWJvcmRlcmVkIGNh cHRpb24gKyB0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLAorLnRhYmxlLWJvcmRl cmVkIGNvbGdyb3VwICsgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwKKy50YWJs ZS1ib3JkZXJlZCBjb2xncm91cCArIHRib2R5IHRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQg eworICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9y ZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0 OiA0cHg7Cit9CisKKy50YWJsZS1zdHJpcGVkIHRib2R5ID4gdHI6bnRoLWNoaWxkKG9kZCkgPiB0 ZCwKKy50YWJsZS1zdHJpcGVkIHRib2R5ID4gdHI6bnRoLWNoaWxkKG9kZCkgPiB0aCB7CisgIGJh Y2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Cit9CisKKy50YWJsZS1ob3ZlciB0Ym9keSB0cjpob3Zl ciA+IHRkLAorLnRhYmxlLWhvdmVyIHRib2R5IHRyOmhvdmVyID4gdGggeworICBiYWNrZ3JvdW5k LWNvbG9yOiAjZjVmNWY1OworfQorCit0YWJsZSB0ZFtjbGFzcyo9InNwYW4iXSwKK3RhYmxlIHRo W2NsYXNzKj0ic3BhbiJdLAorLnJvdy1mbHVpZCB0YWJsZSB0ZFtjbGFzcyo9InNwYW4iXSwKKy5y b3ctZmx1aWQgdGFibGUgdGhbY2xhc3MqPSJzcGFuIl0geworICBkaXNwbGF5OiB0YWJsZS1jZWxs OworICBmbG9hdDogbm9uZTsKKyAgbWFyZ2luLWxlZnQ6IDA7Cit9CisKKy50YWJsZSB0ZC5zcGFu MSwKKy50YWJsZSB0aC5zcGFuMSB7CisgIGZsb2F0OiBub25lOworICB3aWR0aDogNDRweDsKKyAg bWFyZ2luLWxlZnQ6IDA7Cit9CisKKy50YWJsZSB0ZC5zcGFuMiwKKy50YWJsZSB0aC5zcGFuMiB7 CisgIGZsb2F0OiBub25lOworICB3aWR0aDogMTI0cHg7CisgIG1hcmdpbi1sZWZ0OiAwOworfQor CisudGFibGUgdGQuc3BhbjMsCisudGFibGUgdGguc3BhbjMgeworICBmbG9hdDogbm9uZTsKKyAg d2lkdGg6IDIwNHB4OworICBtYXJnaW4tbGVmdDogMDsKK30KKworLnRhYmxlIHRkLnNwYW40LAor LnRhYmxlIHRoLnNwYW40IHsKKyAgZmxvYXQ6IG5vbmU7CisgIHdpZHRoOiAyODRweDsKKyAgbWFy Z2luLWxlZnQ6IDA7Cit9CisKKy50YWJsZSB0ZC5zcGFuNSwKKy50YWJsZSB0aC5zcGFuNSB7Cisg IGZsb2F0OiBub25lOworICB3aWR0aDogMzY0cHg7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCisu dGFibGUgdGQuc3BhbjYsCisudGFibGUgdGguc3BhbjYgeworICBmbG9hdDogbm9uZTsKKyAgd2lk dGg6IDQ0NHB4OworICBtYXJnaW4tbGVmdDogMDsKK30KKworLnRhYmxlIHRkLnNwYW43LAorLnRh YmxlIHRoLnNwYW43IHsKKyAgZmxvYXQ6IG5vbmU7CisgIHdpZHRoOiA1MjRweDsKKyAgbWFyZ2lu LWxlZnQ6IDA7Cit9CisKKy50YWJsZSB0ZC5zcGFuOCwKKy50YWJsZSB0aC5zcGFuOCB7CisgIGZs b2F0OiBub25lOworICB3aWR0aDogNjA0cHg7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCisudGFi bGUgdGQuc3BhbjksCisudGFibGUgdGguc3BhbjkgeworICBmbG9hdDogbm9uZTsKKyAgd2lkdGg6 IDY4NHB4OworICBtYXJnaW4tbGVmdDogMDsKK30KKworLnRhYmxlIHRkLnNwYW4xMCwKKy50YWJs ZSB0aC5zcGFuMTAgeworICBmbG9hdDogbm9uZTsKKyAgd2lkdGg6IDc2NHB4OworICBtYXJnaW4t bGVmdDogMDsKK30KKworLnRhYmxlIHRkLnNwYW4xMSwKKy50YWJsZSB0aC5zcGFuMTEgeworICBm bG9hdDogbm9uZTsKKyAgd2lkdGg6IDg0NHB4OworICBtYXJnaW4tbGVmdDogMDsKK30KKworLnRh YmxlIHRkLnNwYW4xMiwKKy50YWJsZSB0aC5zcGFuMTIgeworICBmbG9hdDogbm9uZTsKKyAgd2lk dGg6IDkyNHB4OworICBtYXJnaW4tbGVmdDogMDsKK30KKworLnRhYmxlIHRib2R5IHRyLnN1Y2Nl c3MgPiB0ZCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7Cit9CisKKy50YWJsZSB0Ym9k eSB0ci5lcnJvciA+IHRkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTsKK30KKworLnRh YmxlIHRib2R5IHRyLndhcm5pbmcgPiB0ZCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7 Cit9CisKKy50YWJsZSB0Ym9keSB0ci5pbmZvID4gdGQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAj ZDllZGY3OworfQorCisudGFibGUtaG92ZXIgdGJvZHkgdHIuc3VjY2Vzczpob3ZlciA+IHRkIHsK KyAgYmFja2dyb3VuZC1jb2xvcjogI2QwZTljNjsKK30KKworLnRhYmxlLWhvdmVyIHRib2R5IHRy LmVycm9yOmhvdmVyID4gdGQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJjY2NjOworfQorCisu dGFibGUtaG92ZXIgdGJvZHkgdHIud2FybmluZzpob3ZlciA+IHRkIHsKKyAgYmFja2dyb3VuZC1j b2xvcjogI2ZhZjJjYzsKK30KKworLnRhYmxlLWhvdmVyIHRib2R5IHRyLmluZm86aG92ZXIgPiB0 ZCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNjNGUzZjM7Cit9CisKK1tjbGFzc149Imljb24tIl0s CitbY2xhc3MqPSIgaWNvbi0iXSB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgd2lkdGg6 IDE0cHg7CisgIGhlaWdodDogMTRweDsKKyAgbWFyZ2luLXRvcDogMXB4OworICAqbWFyZ2luLXJp Z2h0OiAuM2VtOworICBsaW5lLWhlaWdodDogMTRweDsKKyAgdmVydGljYWwtYWxpZ246IHRleHQt dG9wOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi4uL2ltZy9nbHlwaGljb25zLWhhbGZsaW5n cy5wbmciKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTRweCAxNHB4OworICBiYWNrZ3JvdW5k LXJlcGVhdDogbm8tcmVwZWF0OworfQorCisvKiBXaGl0ZSBpY29ucyB3aXRoIG9wdGlvbmFsIGNs YXNzLCBvciBvbiBob3Zlci9mb2N1cy9hY3RpdmUgc3RhdGVzIG9mIGNlcnRhaW4gZWxlbWVudHMg Ki8KKworLmljb24td2hpdGUsCisubmF2LXBpbGxzID4gLmFjdGl2ZSA+IGEgPiBbY2xhc3NePSJp Y29uLSJdLAorLm5hdi1waWxscyA+IC5hY3RpdmUgPiBhID4gW2NsYXNzKj0iIGljb24tIl0sCisu bmF2LWxpc3QgPiAuYWN0aXZlID4gYSA+IFtjbGFzc149Imljb24tIl0sCisubmF2LWxpc3QgPiAu YWN0aXZlID4gYSA+IFtjbGFzcyo9IiBpY29uLSJdLAorLm5hdmJhci1pbnZlcnNlIC5uYXYgPiAu YWN0aXZlID4gYSA+IFtjbGFzc149Imljb24tIl0sCisubmF2YmFyLWludmVyc2UgLm5hdiA+IC5h Y3RpdmUgPiBhID4gW2NsYXNzKj0iIGljb24tIl0sCisuZHJvcGRvd24tbWVudSA+IGxpID4gYTpo b3ZlciA+IFtjbGFzc149Imljb24tIl0sCisuZHJvcGRvd24tbWVudSA+IGxpID4gYTpmb2N1cyA+ IFtjbGFzc149Imljb24tIl0sCisuZHJvcGRvd24tbWVudSA+IGxpID4gYTpob3ZlciA+IFtjbGFz cyo9IiBpY29uLSJdLAorLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMgPiBbY2xhc3MqPSIg aWNvbi0iXSwKKy5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGEgPiBbY2xhc3NePSJpY29uLSJd LAorLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSA+IFtjbGFzcyo9IiBpY29uLSJdLAorLmRy b3Bkb3duLXN1Ym1lbnU6aG92ZXIgPiBhID4gW2NsYXNzXj0iaWNvbi0iXSwKKy5kcm9wZG93bi1z dWJtZW51OmZvY3VzID4gYSA+IFtjbGFzc149Imljb24tIl0sCisuZHJvcGRvd24tc3VibWVudTpo b3ZlciA+IGEgPiBbY2xhc3MqPSIgaWNvbi0iXSwKKy5kcm9wZG93bi1zdWJtZW51OmZvY3VzID4g YSA+IFtjbGFzcyo9IiBpY29uLSJdIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCIuLi9pbWcv Z2x5cGhpY29ucy1oYWxmbGluZ3Mtd2hpdGUucG5nIik7Cit9CisKKy5pY29uLWdsYXNzIHsKKyAg YmFja2dyb3VuZC1wb3NpdGlvbjogMCAgICAgIDA7Cit9CisKKy5pY29uLW11c2ljIHsKKyAgYmFj a2dyb3VuZC1wb3NpdGlvbjogLTI0cHggMDsKK30KKworLmljb24tc2VhcmNoIHsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTQ4cHggMDsKK30KKworLmljb24tZW52ZWxvcGUgeworICBiYWNrZ3Jv dW5kLXBvc2l0aW9uOiAtNzJweCAwOworfQorCisuaWNvbi1oZWFydCB7CisgIGJhY2tncm91bmQt cG9zaXRpb246IC05NnB4IDA7Cit9CisKKy5pY29uLXN0YXIgeworICBiYWNrZ3JvdW5kLXBvc2l0 aW9uOiAtMTIwcHggMDsKK30KKworLmljb24tc3Rhci1lbXB0eSB7CisgIGJhY2tncm91bmQtcG9z aXRpb246IC0xNDRweCAwOworfQorCisuaWNvbi11c2VyIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlv bjogLTE2OHB4IDA7Cit9CisKKy5pY29uLWZpbG0geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAt MTkycHggMDsKK30KKworLmljb24tdGgtbGFyZ2UgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAt MjE2cHggMDsKK30KKworLmljb24tdGggeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHgg MDsKK30KKworLmljb24tdGgtbGlzdCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNjRweCAw OworfQorCisuaWNvbi1vayB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yODhweCAwOworfQor CisuaWNvbi1yZW1vdmUgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzEycHggMDsKK30KKwor Lmljb24tem9vbS1pbiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMzZweCAwOworfQorCisu aWNvbi16b29tLW91dCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zNjBweCAwOworfQorCisu aWNvbi1vZmYgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzg0cHggMDsKK30KKworLmljb24t c2lnbmFsIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQwOHB4IDA7Cit9CisKKy5pY29uLWNv ZyB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00MzJweCAwOworfQorCisuaWNvbi10cmFzaCB7 CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00NTZweCAwOworfQorCisuaWNvbi1ob21lIHsKKyAg YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjRweDsKK30KKworLmljb24tZmlsZSB7CisgIGJhY2tn cm91bmQtcG9zaXRpb246IC0yNHB4IC0yNHB4OworfQorCisuaWNvbi10aW1lIHsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTQ4cHggLTI0cHg7Cit9CisKKy5pY29uLXJvYWQgeworICBiYWNrZ3Jv dW5kLXBvc2l0aW9uOiAtNzJweCAtMjRweDsKK30KKworLmljb24tZG93bmxvYWQtYWx0IHsKKyAg YmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTI0cHg7Cit9CisKKy5pY29uLWRvd25sb2FkIHsK KyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyMHB4IC0yNHB4OworfQorCisuaWNvbi11cGxvYWQg eworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTI0cHg7Cit9CisKKy5pY29uLWluYm94 IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2OHB4IC0yNHB4OworfQorCisuaWNvbi1wbGF5 LWNpcmNsZSB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMjRweDsKK30KKworLmlj b24tcmVwZWF0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxNnB4IC0yNHB4OworfQorCisu aWNvbi1yZWZyZXNoIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0yNHB4OworfQor CisuaWNvbi1saXN0LWFsdCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNjRweCAtMjRweDsK K30KKworLmljb24tbG9jayB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yODdweCAtMjRweDsK K30KKworLmljb24tZmxhZyB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMTJweCAtMjRweDsK K30KKworLmljb24taGVhZHBob25lcyB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMzZweCAt MjRweDsKK30KKworLmljb24tdm9sdW1lLW9mZiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0z NjBweCAtMjRweDsKK30KKworLmljb24tdm9sdW1lLWRvd24geworICBiYWNrZ3JvdW5kLXBvc2l0 aW9uOiAtMzg0cHggLTI0cHg7Cit9CisKKy5pY29uLXZvbHVtZS11cCB7CisgIGJhY2tncm91bmQt cG9zaXRpb246IC00MDhweCAtMjRweDsKK30KKworLmljb24tcXJjb2RlIHsKKyAgYmFja2dyb3Vu ZC1wb3NpdGlvbjogLTQzMnB4IC0yNHB4OworfQorCisuaWNvbi1iYXJjb2RlIHsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTQ1NnB4IC0yNHB4OworfQorCisuaWNvbi10YWcgeworICBiYWNrZ3Jv dW5kLXBvc2l0aW9uOiAwIC00OHB4OworfQorCisuaWNvbi10YWdzIHsKKyAgYmFja2dyb3VuZC1w b3NpdGlvbjogLTI1cHggLTQ4cHg7Cit9CisKKy5pY29uLWJvb2sgeworICBiYWNrZ3JvdW5kLXBv c2l0aW9uOiAtNDhweCAtNDhweDsKK30KKworLmljb24tYm9va21hcmsgeworICBiYWNrZ3JvdW5k LXBvc2l0aW9uOiAtNzJweCAtNDhweDsKK30KKworLmljb24tcHJpbnQgeworICBiYWNrZ3JvdW5k LXBvc2l0aW9uOiAtOTZweCAtNDhweDsKK30KKworLmljb24tY2FtZXJhIHsKKyAgYmFja2dyb3Vu ZC1wb3NpdGlvbjogLTEyMHB4IC00OHB4OworfQorCisuaWNvbi1mb250IHsKKyAgYmFja2dyb3Vu ZC1wb3NpdGlvbjogLTE0NHB4IC00OHB4OworfQorCisuaWNvbi1ib2xkIHsKKyAgYmFja2dyb3Vu ZC1wb3NpdGlvbjogLTE2N3B4IC00OHB4OworfQorCisuaWNvbi1pdGFsaWMgeworICBiYWNrZ3Jv dW5kLXBvc2l0aW9uOiAtMTkycHggLTQ4cHg7Cit9CisKKy5pY29uLXRleHQtaGVpZ2h0IHsKKyAg YmFja2dyb3VuZC1wb3NpdGlvbjogLTIxNnB4IC00OHB4OworfQorCisuaWNvbi10ZXh0LXdpZHRo IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OworfQorCisuaWNvbi1hbGln bi1sZWZ0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI2NHB4IC00OHB4OworfQorCisuaWNv bi1hbGlnbi1jZW50ZXIgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjg4cHggLTQ4cHg7Cit9 CisKKy5pY29uLWFsaWduLXJpZ2h0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMxMnB4IC00 OHB4OworfQorCisuaWNvbi1hbGlnbi1qdXN0aWZ5IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjog LTMzNnB4IC00OHB4OworfQorCisuaWNvbi1saXN0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjog LTM2MHB4IC00OHB4OworfQorCisuaWNvbi1pbmRlbnQtbGVmdCB7CisgIGJhY2tncm91bmQtcG9z aXRpb246IC0zODRweCAtNDhweDsKK30KKworLmljb24taW5kZW50LXJpZ2h0IHsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTQwOHB4IC00OHB4OworfQorCisuaWNvbi1mYWNldGltZS12aWRlbyB7 CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00MzJweCAtNDhweDsKK30KKworLmljb24tcGljdHVy ZSB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00NTZweCAtNDhweDsKK30KKworLmljb24tcGVu Y2lsIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNzJweDsKK30KKworLmljb24tbWFwLW1h cmtlciB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNHB4IC03MnB4OworfQorCisuaWNvbi1h ZGp1c3QgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNzJweDsKK30KKworLmljb24t dGludCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC03MnB4IC03MnB4OworfQorCisuaWNvbi1l ZGl0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTcycHg7Cit9CisKKy5pY29uLXNo YXJlIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyMHB4IC03MnB4OworfQorCisuaWNvbi1j aGVjayB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNzJweDsKK30KKworLmljb24t bW92ZSB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNjhweCAtNzJweDsKK30KKworLmljb24t c3RlcC1iYWNrd2FyZCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtNzJweDsKK30K KworLmljb24tZmFzdC1iYWNrd2FyZCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMTZweCAt NzJweDsKK30KKworLmljb24tYmFja3dhcmQgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQw cHggLTcycHg7Cit9CisKKy5pY29uLXBsYXkgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjY0 cHggLTcycHg7Cit9CisKKy5pY29uLXBhdXNlIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4 OHB4IC03MnB4OworfQorCisuaWNvbi1zdG9wIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMx MnB4IC03MnB4OworfQorCisuaWNvbi1mb3J3YXJkIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjog LTMzNnB4IC03MnB4OworfQorCisuaWNvbi1mYXN0LWZvcndhcmQgeworICBiYWNrZ3JvdW5kLXBv c2l0aW9uOiAtMzYwcHggLTcycHg7Cit9CisKKy5pY29uLXN0ZXAtZm9yd2FyZCB7CisgIGJhY2tn cm91bmQtcG9zaXRpb246IC0zODRweCAtNzJweDsKK30KKworLmljb24tZWplY3QgeworICBiYWNr Z3JvdW5kLXBvc2l0aW9uOiAtNDA4cHggLTcycHg7Cit9CisKKy5pY29uLWNoZXZyb24tbGVmdCB7 CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00MzJweCAtNzJweDsKK30KKworLmljb24tY2hldnJv bi1yaWdodCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00NTZweCAtNzJweDsKK30KKworLmlj b24tcGx1cy1zaWduIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsKK30KKworLmlj b24tbWludXMtc2lnbiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNHB4IC05NnB4OworfQor CisuaWNvbi1yZW1vdmUtc2lnbiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4 OworfQorCisuaWNvbi1vay1zaWduIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcycHggLTk2 cHg7Cit9CisKKy5pY29uLXF1ZXN0aW9uLXNpZ24geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAt OTZweCAtOTZweDsKK30KKworLmljb24taW5mby1zaWduIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlv bjogLTEyMHB4IC05NnB4OworfQorCisuaWNvbi1zY3JlZW5zaG90IHsKKyAgYmFja2dyb3VuZC1w b3NpdGlvbjogLTE0NHB4IC05NnB4OworfQorCisuaWNvbi1yZW1vdmUtY2lyY2xlIHsKKyAgYmFj a2dyb3VuZC1wb3NpdGlvbjogLTE2OHB4IC05NnB4OworfQorCisuaWNvbi1vay1jaXJjbGUgewor ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTk2cHg7Cit9CisKKy5pY29uLWJhbi1jaXJj bGUgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE2cHggLTk2cHg7Cit9CisKKy5pY29uLWFy cm93LWxlZnQgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7Cit9CisKKy5p Y29uLWFycm93LXJpZ2h0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI2NHB4IC05NnB4Owor fQorCisuaWNvbi1hcnJvdy11cCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yODlweCAtOTZw eDsKK30KKworLmljb24tYXJyb3ctZG93biB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMTJw eCAtOTZweDsKK30KKworLmljb24tc2hhcmUtYWx0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjog LTMzNnB4IC05NnB4OworfQorCisuaWNvbi1yZXNpemUtZnVsbCB7CisgIGJhY2tncm91bmQtcG9z aXRpb246IC0zNjBweCAtOTZweDsKK30KKworLmljb24tcmVzaXplLXNtYWxsIHsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTM4NHB4IC05NnB4OworfQorCisuaWNvbi1wbHVzIHsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTQwOHB4IC05NnB4OworfQorCisuaWNvbi1taW51cyB7CisgIGJhY2tn cm91bmQtcG9zaXRpb246IC00MzNweCAtOTZweDsKK30KKworLmljb24tYXN0ZXJpc2sgeworICBi YWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDU2cHggLTk2cHg7Cit9CisKKy5pY29uLWV4Y2xhbWF0aW9u LXNpZ24geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMjBweDsKK30KKworLmljb24tZ2lm dCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNHB4IC0xMjBweDsKK30KKworLmljb24tbGVh ZiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMjBweDsKK30KKworLmljb24tZmly ZSB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC03MnB4IC0xMjBweDsKK30KKworLmljb24tZXll LW9wZW4geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTIwcHg7Cit9CisKKy5pY29u LWV5ZS1jbG9zZSB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjBweCAtMTIwcHg7Cit9CisK Ky5pY29uLXdhcm5pbmctc2lnbiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTIw cHg7Cit9CisKKy5pY29uLXBsYW5lIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2OHB4IC0x MjBweDsKK30KKworLmljb24tY2FsZW5kYXIgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTky cHggLTEyMHB4OworfQorCisuaWNvbi1yYW5kb20geworICB3aWR0aDogMTZweDsKKyAgYmFja2dy b3VuZC1wb3NpdGlvbjogLTIxNnB4IC0xMjBweDsKK30KKworLmljb24tY29tbWVudCB7CisgIGJh Y2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTIwcHg7Cit9CisKKy5pY29uLW1hZ25ldCB7Cisg IGJhY2tncm91bmQtcG9zaXRpb246IC0yNjRweCAtMTIwcHg7Cit9CisKKy5pY29uLWNoZXZyb24t dXAgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjg4cHggLTEyMHB4OworfQorCisuaWNvbi1j aGV2cm9uLWRvd24geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzEzcHggLTExOXB4OworfQor CisuaWNvbi1yZXR3ZWV0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMzNnB4IC0xMjBweDsK K30KKworLmljb24tc2hvcHBpbmctY2FydCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zNjBw eCAtMTIwcHg7Cit9CisKKy5pY29uLWZvbGRlci1jbG9zZSB7CisgIHdpZHRoOiAxNnB4OworICBi YWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzg0cHggLTEyMHB4OworfQorCisuaWNvbi1mb2xkZXItb3Bl biB7CisgIHdpZHRoOiAxNnB4OworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDA4cHggLTEyMHB4 OworfQorCisuaWNvbi1yZXNpemUtdmVydGljYWwgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAt NDMycHggLTExOXB4OworfQorCisuaWNvbi1yZXNpemUtaG9yaXpvbnRhbCB7CisgIGJhY2tncm91 bmQtcG9zaXRpb246IC00NTZweCAtMTE4cHg7Cit9CisKKy5pY29uLWhkZCB7CisgIGJhY2tncm91 bmQtcG9zaXRpb246IDAgLTE0NHB4OworfQorCisuaWNvbi1idWxsaG9ybiB7CisgIGJhY2tncm91 bmQtcG9zaXRpb246IC0yNHB4IC0xNDRweDsKK30KKworLmljb24tYmVsbCB7CisgIGJhY2tncm91 bmQtcG9zaXRpb246IC00OHB4IC0xNDRweDsKK30KKworLmljb24tY2VydGlmaWNhdGUgeworICBi YWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzJweCAtMTQ0cHg7Cit9CisKKy5pY29uLXRodW1icy11cCB7 CisgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNDRweDsKK30KKworLmljb24tdGh1bWJz LWRvd24geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTIwcHggLTE0NHB4OworfQorCisuaWNv bi1oYW5kLXJpZ2h0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNDRweDsKK30K KworLmljb24taGFuZC1sZWZ0IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2OHB4IC0xNDRw eDsKK30KKworLmljb24taGFuZC11cCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAt MTQ0cHg7Cit9CisKKy5pY29uLWhhbmQtZG93biB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0y MTZweCAtMTQ0cHg7Cit9CisKKy5pY29uLWNpcmNsZS1hcnJvdy1yaWdodCB7CisgIGJhY2tncm91 bmQtcG9zaXRpb246IC0yNDBweCAtMTQ0cHg7Cit9CisKKy5pY29uLWNpcmNsZS1hcnJvdy1sZWZ0 IHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI2NHB4IC0xNDRweDsKK30KKworLmljb24tY2ly Y2xlLWFycm93LXVwIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4OHB4IC0xNDRweDsKK30K KworLmljb24tY2lyY2xlLWFycm93LWRvd24geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzEy cHggLTE0NHB4OworfQorCisuaWNvbi1nbG9iZSB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0z MzZweCAtMTQ0cHg7Cit9CisKKy5pY29uLXdyZW5jaCB7CisgIGJhY2tncm91bmQtcG9zaXRpb246 IC0zNjBweCAtMTQ0cHg7Cit9CisKKy5pY29uLXRhc2tzIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlv bjogLTM4NHB4IC0xNDRweDsKK30KKworLmljb24tZmlsdGVyIHsKKyAgYmFja2dyb3VuZC1wb3Np dGlvbjogLTQwOHB4IC0xNDRweDsKK30KKworLmljb24tYnJpZWZjYXNlIHsKKyAgYmFja2dyb3Vu ZC1wb3NpdGlvbjogLTQzMnB4IC0xNDRweDsKK30KKworLmljb24tZnVsbHNjcmVlbiB7CisgIGJh Y2tncm91bmQtcG9zaXRpb246IC00NTZweCAtMTQ0cHg7Cit9CisKKy5kcm9wdXAsCisuZHJvcGRv d24geworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKy5kcm9wZG93bi10b2dnbGUgeworICAq bWFyZ2luLWJvdHRvbTogLTNweDsKK30KKworLmRyb3Bkb3duLXRvZ2dsZTphY3RpdmUsCisub3Bl biAuZHJvcGRvd24tdG9nZ2xlIHsKKyAgb3V0bGluZTogMDsKK30KKworLmNhcmV0IHsKKyAgZGlz cGxheTogaW5saW5lLWJsb2NrOworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICB2ZXJ0aWNh bC1hbGlnbjogdG9wOworICBib3JkZXItdG9wOiA0cHggc29saWQgIzAwMDAwMDsKKyAgYm9yZGVy LXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci1sZWZ0OiA0cHggc29saWQg dHJhbnNwYXJlbnQ7CisgIGNvbnRlbnQ6ICIiOworfQorCisuZHJvcGRvd24gLmNhcmV0IHsKKyAg bWFyZ2luLXRvcDogOHB4OworICBtYXJnaW4tbGVmdDogMnB4OworfQorCisuZHJvcGRvd24tbWVu dSB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAxMDAlOworICBsZWZ0OiAwOworICB6 LWluZGV4OiAxMDAwOworICBkaXNwbGF5OiBub25lOworICBmbG9hdDogbGVmdDsKKyAgbWluLXdp ZHRoOiAxNjBweDsKKyAgcGFkZGluZzogNXB4IDA7CisgIG1hcmdpbjogMnB4IDAgMDsKKyAgbGlz dC1zdHlsZTogbm9uZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiAx cHggc29saWQgI2NjYzsKKyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpOwor ICAqYm9yZGVyLXJpZ2h0LXdpZHRoOiAycHg7CisgICpib3JkZXItYm90dG9tLXdpZHRoOiAycHg7 CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNnB4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6 IDZweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CisgIC13ZWJraXQtYm94LXNoYWRv dzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgIC1tb3otYm94LXNoYWRvdzog MCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgICAgICAgYm94LXNoYWRvdzogMCA1 cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgIC13ZWJraXQtYmFja2dyb3VuZC1jbGlwOiBw YWRkaW5nLWJveDsKKyAgICAgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmc7CisgICAgICAg ICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKK30KKworLmRyb3Bkb3duLW1lbnUucHVs bC1yaWdodCB7CisgIHJpZ2h0OiAwOworICBsZWZ0OiBhdXRvOworfQorCisuZHJvcGRvd24tbWVu dSAuZGl2aWRlciB7CisgICp3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiAxcHg7CisgIG1hcmdpbjog OXB4IDFweDsKKyAgKm1hcmdpbjogLTVweCAwIDVweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAg YmFja2dyb3VuZC1jb2xvcjogI2U1ZTVlNTsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNm ZmZmZmY7Cit9CisKKy5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHsKKyAgZGlzcGxheTogYmxvY2s7 CisgIHBhZGRpbmc6IDNweCAyMHB4OworICBjbGVhcjogYm90aDsKKyAgZm9udC13ZWlnaHQ6IG5v cm1hbDsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIGNvbG9yOiAjMzMzMzMzOworICB3aGl0ZS1z cGFjZTogbm93cmFwOworfQorCisuZHJvcGRvd24tbWVudSA+IGxpID4gYTpob3ZlciwKKy5kcm9w ZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzLAorLmRyb3Bkb3duLXN1Ym1lbnU6aG92ZXIgPiBhLAor LmRyb3Bkb3duLXN1Ym1lbnU6Zm9jdXMgPiBhIHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIHRleHQt ZGVjb3JhdGlvbjogbm9uZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzAwODFjMjsKKyAgYmFja2dy b3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjMDA4OGNjLCAjMDA3N2IzKTsK KyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAl LCBmcm9tKCMwMDg4Y2MpLCB0bygjMDA3N2IzKSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJr aXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzAwODhjYywgIzAwNzdiMyk7CisgIGJhY2tncm91bmQt aW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMwMDg4Y2MsICMwMDc3YjMpOworICBiYWNr Z3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMDA4OGNjLCAjMDA3N2Iz KTsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICBmaWx0ZXI6IHByb2dpZDpEWElt YWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYwMDg4Y2Mn LCBlbmRDb2xvcnN0cj0nI2ZmMDA3N2IzJywgR3JhZGllbnRUeXBlPTApOworfQorCisuZHJvcGRv d24tbWVudSA+IC5hY3RpdmUgPiBhLAorLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpob3Zl ciwKKy5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6Zm9jdXMgeworICBjb2xvcjogI2ZmZmZm ZjsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA4MWMy OworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICMwMDg4Y2Ms ICMwMDc3YjMpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwg MCAwLCAwIDEwMCUsIGZyb20oIzAwODhjYyksIHRvKCMwMDc3YjMpKTsKKyAgYmFja2dyb3VuZC1p bWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjMDA4OGNjLCAjMDA3N2IzKTsKKyAg YmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzAwODhjYywgIzAwNzdi Myk7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwMDg4 Y2MsICMwMDc3YjMpOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisgIG91dGxpbmU6 IDA7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50 KHN0YXJ0Q29sb3JzdHI9JyNmZjAwODhjYycsIGVuZENvbG9yc3RyPScjZmYwMDc3YjMnLCBHcmFk aWVudFR5cGU9MCk7Cit9CisKKy5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYSwKKy5kcm9w ZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3ZlciwKKy5kcm9wZG93bi1tZW51ID4gLmRpc2Fi bGVkID4gYTpmb2N1cyB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorCisuZHJvcGRvd24tbWVudSA+ IC5kaXNhYmxlZCA+IGE6aG92ZXIsCisuZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6Zm9j dXMgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGN1cnNvcjogZGVmYXVsdDsKKyAgYmFj a2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Cisg IGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJs ZWQ9ZmFsc2UpOworfQorCisub3BlbiB7CisgICp6LWluZGV4OiAxMDAwOworfQorCisub3BlbiA+ IC5kcm9wZG93bi1tZW51IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKy5wdWxsLXJpZ2h0ID4g LmRyb3Bkb3duLW1lbnUgeworICByaWdodDogMDsKKyAgbGVmdDogYXV0bzsKK30KKworLmRyb3B1 cCAuY2FyZXQsCisubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24gLmNhcmV0IHsKKyAgYm9y ZGVyLXRvcDogMDsKKyAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkICMwMDAwMDA7CisgIGNvbnRl bnQ6ICIiOworfQorCisuZHJvcHVwIC5kcm9wZG93bi1tZW51LAorLm5hdmJhci1maXhlZC1ib3R0 b20gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IHsKKyAgdG9wOiBhdXRvOworICBib3R0b206IDEw MCU7CisgIG1hcmdpbi1ib3R0b206IDFweDsKK30KKworLmRyb3Bkb3duLXN1Ym1lbnUgeworICBw b3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKy5kcm9wZG93bi1zdWJtZW51ID4gLmRyb3Bkb3duLW1l bnUgeworICB0b3A6IDA7CisgIGxlZnQ6IDEwMCU7CisgIG1hcmdpbi10b3A6IC02cHg7CisgIG1h cmdpbi1sZWZ0OiAtMXB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAgNnB4IDZweCA2cHg7 CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMCA2cHggNnB4IDZweDsKKyAgICAgICAgICBib3Jk ZXItcmFkaXVzOiAwIDZweCA2cHggNnB4OworfQorCisuZHJvcGRvd24tc3VibWVudTpob3ZlciA+ IC5kcm9wZG93bi1tZW51IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKy5kcm9wdXAgLmRyb3Bk b3duLXN1Ym1lbnUgPiAuZHJvcGRvd24tbWVudSB7CisgIHRvcDogYXV0bzsKKyAgYm90dG9tOiAw OworICBtYXJnaW4tdG9wOiAwOworICBtYXJnaW4tYm90dG9tOiAtMnB4OworICAtd2Via2l0LWJv cmRlci1yYWRpdXM6IDVweCA1cHggNXB4IDA7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNXB4 IDVweCA1cHggMDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDVweCAwOworfQor CisuZHJvcGRvd24tc3VibWVudSA+IGE6YWZ0ZXIgeworICBkaXNwbGF5OiBibG9jazsKKyAgZmxv YXQ6IHJpZ2h0OworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICBtYXJnaW4tdG9wOiA1cHg7 CisgIG1hcmdpbi1yaWdodDogLTEwcHg7CisgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7Cisg IGJvcmRlci1sZWZ0LWNvbG9yOiAjY2NjY2NjOworICBib3JkZXItc3R5bGU6IHNvbGlkOworICBi b3JkZXItd2lkdGg6IDVweCAwIDVweCA1cHg7CisgIGNvbnRlbnQ6ICIgIjsKK30KKworLmRyb3Bk b3duLXN1Ym1lbnU6aG92ZXIgPiBhOmFmdGVyIHsKKyAgYm9yZGVyLWxlZnQtY29sb3I6ICNmZmZm ZmY7Cit9CisKKy5kcm9wZG93bi1zdWJtZW51LnB1bGwtbGVmdCB7CisgIGZsb2F0OiBub25lOwor fQorCisuZHJvcGRvd24tc3VibWVudS5wdWxsLWxlZnQgPiAuZHJvcGRvd24tbWVudSB7CisgIGxl ZnQ6IC0xMDAlOworICBtYXJnaW4tbGVmdDogMTBweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVz OiA2cHggMCA2cHggNnB4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDZweCAwIDZweCA2cHg7 CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4IDAgNnB4IDZweDsKK30KKworLmRyb3Bkb3du IC5kcm9wZG93bi1tZW51IC5uYXYtaGVhZGVyIHsKKyAgcGFkZGluZy1yaWdodDogMjBweDsKKyAg cGFkZGluZy1sZWZ0OiAyMHB4OworfQorCisudHlwZWFoZWFkIHsKKyAgei1pbmRleDogMTA1MTsK KyAgbWFyZ2luLXRvcDogMnB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAg LW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4Owor fQorCisud2VsbCB7CisgIG1pbi1oZWlnaHQ6IDIwcHg7CisgIHBhZGRpbmc6IDE5cHg7CisgIG1h cmdpbi1ib3R0b206IDIwcHg7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CisgIGJvcmRl cjogMXB4IHNvbGlkICNlM2UzZTM7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OworICAg ICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7 CisgIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4w NSk7CisgICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwg MC4wNSk7CisgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwg MCwgMC4wNSk7Cit9CisKKy53ZWxsIGJsb2NrcXVvdGUgeworICBib3JkZXItY29sb3I6ICNkZGQ7 CisgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTsKK30KKworLndlbGwtbGFyZ2Ug eworICBwYWRkaW5nOiAyNHB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsKKyAgICAg LW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4Owor fQorCisud2VsbC1zbWFsbCB7CisgIHBhZGRpbmc6IDlweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFk aXVzOiAzcHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogM3B4OworICAgICAgICAgIGJvcmRl ci1yYWRpdXM6IDNweDsKK30KKworLmZhZGUgeworICBvcGFjaXR5OiAwOworICAtd2Via2l0LXRy YW5zaXRpb246IG9wYWNpdHkgMC4xNXMgbGluZWFyOworICAgICAtbW96LXRyYW5zaXRpb246IG9w YWNpdHkgMC4xNXMgbGluZWFyOworICAgICAgIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMg bGluZWFyOworICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgbGluZWFyOworfQor CisuZmFkZS5pbiB7CisgIG9wYWNpdHk6IDE7Cit9CisKKy5jb2xsYXBzZSB7CisgIHBvc2l0aW9u OiByZWxhdGl2ZTsKKyAgaGVpZ2h0OiAwOworICBvdmVyZmxvdzogaGlkZGVuOworICAtd2Via2l0 LXRyYW5zaXRpb246IGhlaWdodCAwLjM1cyBlYXNlOworICAgICAtbW96LXRyYW5zaXRpb246IGhl aWdodCAwLjM1cyBlYXNlOworICAgICAgIC1vLXRyYW5zaXRpb246IGhlaWdodCAwLjM1cyBlYXNl OworICAgICAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjM1cyBlYXNlOworfQorCisuY29sbGFw c2UuaW4geworICBoZWlnaHQ6IGF1dG87Cit9CisKKy5jbG9zZSB7CisgIGZsb2F0OiByaWdodDsK KyAgZm9udC1zaXplOiAyMHB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgbGluZS1oZWlnaHQ6 IDIwcHg7CisgIGNvbG9yOiAjMDAwMDAwOworICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjZmZmZmZm OworICBvcGFjaXR5OiAwLjI7CisgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7Cit9CisKKy5j bG9zZTpob3ZlciwKKy5jbG9zZTpmb2N1cyB7CisgIGNvbG9yOiAjMDAwMDAwOworICB0ZXh0LWRl Y29yYXRpb246IG5vbmU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgb3BhY2l0eTogMC40OworICBm aWx0ZXI6IGFscGhhKG9wYWNpdHk9NDApOworfQorCitidXR0b24uY2xvc2UgeworICBwYWRkaW5n OiAwOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworICBi b3JkZXI6IDA7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKK30KKworLmJ0biB7CisgIGRp c3BsYXk6IGlubGluZS1ibG9jazsKKyAgKmRpc3BsYXk6IGlubGluZTsKKyAgcGFkZGluZzogNHB4 IDEycHg7CisgIG1hcmdpbi1ib3R0b206IDA7CisgICptYXJnaW4tbGVmdDogLjNlbTsKKyAgZm9u dC1zaXplOiAxNHB4OworICBsaW5lLWhlaWdodDogMjBweDsKKyAgY29sb3I6ICMzMzMzMzM7Cisg IHRleHQtYWxpZ246IGNlbnRlcjsKKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwg MjU1LCAyNTUsIDAuNzUpOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICBjdXJzb3I6IHBv aW50ZXI7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CisgICpiYWNrZ3JvdW5kLWNvbG9y OiAjZTZlNmU2OworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3As ICNmZmZmZmYsICNlNmU2ZTYpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50 KGxpbmVhciwgMCAwLCAwIDEwMCUsIGZyb20oI2ZmZmZmZiksIHRvKCNlNmU2ZTYpKTsKKyAgYmFj a2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZTZl NmU2KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmZmZm ZiwgI2U2ZTZlNik7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0 b20sICNmZmZmZmYsICNlNmU2ZTYpOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7Cisg IGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7CisgICpib3JkZXI6IDA7CisgIGJvcmRlci1jb2xv cjogI2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7CisgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAw LCAwLjEpIHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMjUpOworICBib3JkZXIt Ym90dG9tLWNvbG9yOiAjYjNiM2IzOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAg ICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4 OworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChz dGFydENvbG9yc3RyPScjZmZmZmZmZmYnLCBlbmRDb2xvcnN0cj0nI2ZmZTZlNmU2JywgR3JhZGll bnRUeXBlPTApOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5n cmFkaWVudChlbmFibGVkPWZhbHNlKTsKKyAgKnpvb206IDE7CisgIC13ZWJraXQtYm94LXNoYWRv dzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAgMXB4IDJweCByZ2Jh KDAsIDAsIDAsIDAuMDUpOworICAgICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdi YSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKKyAg ICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4y KSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7Cit9CisKKy5idG46aG92ZXIsCisuYnRu OmZvY3VzLAorLmJ0bjphY3RpdmUsCisuYnRuLmFjdGl2ZSwKKy5idG4uZGlzYWJsZWQsCisuYnRu W2Rpc2FibGVkXSB7CisgIGNvbG9yOiAjMzMzMzMzOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZl NmU2OworICAqYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTsKK30KKworLmJ0bjphY3RpdmUsCisu YnRuLmFjdGl2ZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2MgXDk7Cit9CisKKy5idG46 Zmlyc3QtY2hpbGQgeworICAqbWFyZ2luLWxlZnQ6IDA7Cit9CisKKy5idG46aG92ZXIsCisuYnRu OmZvY3VzIHsKKyAgY29sb3I6ICMzMzMzMzM7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAg YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTVweDsKKyAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNr Z3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOworICAgICAtbW96LXRyYW5zaXRpb246IGJhY2tn cm91bmQtcG9zaXRpb24gMC4xcyBsaW5lYXI7CisgICAgICAgLW8tdHJhbnNpdGlvbjogYmFja2dy b3VuZC1wb3NpdGlvbiAwLjFzIGxpbmVhcjsKKyAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3Jv dW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOworfQorCisuYnRuOmZvY3VzIHsKKyAgb3V0bGluZTog dGhpbiBkb3R0ZWQgIzMzMzsKKyAgb3V0bGluZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5n LWNvbG9yOworICBvdXRsaW5lLW9mZnNldDogLTJweDsKK30KKworLmJ0bi5hY3RpdmUsCisuYnRu OmFjdGl2ZSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CisgIG91dGxpbmU6IDA7CisgIC13 ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xNSksIDAg MXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOworICAgICAtbW96LWJveC1zaGFkb3c6IGluc2V0 IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAw LjA1KTsKKyAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDJweCA0cHggcmdiYSgwLCAwLCAw LCAwLjE1KSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7Cit9CisKKy5idG4uZGlzYWJs ZWQsCisuYnRuW2Rpc2FibGVkXSB7CisgIGN1cnNvcjogZGVmYXVsdDsKKyAgYmFja2dyb3VuZC1p bWFnZTogbm9uZTsKKyAgb3BhY2l0eTogMC42NTsKKyAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1 KTsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOworICAgICAtbW96LWJveC1zaGFkb3c6IG5v bmU7CisgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKK30KKworLmJ0bi1sYXJnZSB7CisgIHBh ZGRpbmc6IDExcHggMTlweDsKKyAgZm9udC1zaXplOiAxNy41cHg7CisgIC13ZWJraXQtYm9yZGVy LXJhZGl1czogNnB4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDZweDsKKyAgICAgICAgICBi b3JkZXItcmFkaXVzOiA2cHg7Cit9CisKKy5idG4tbGFyZ2UgW2NsYXNzXj0iaWNvbi0iXSwKKy5i dG4tbGFyZ2UgW2NsYXNzKj0iIGljb24tIl0geworICBtYXJnaW4tdG9wOiA0cHg7Cit9CisKKy5i dG4tc21hbGwgeworICBwYWRkaW5nOiAycHggMTBweDsKKyAgZm9udC1zaXplOiAxMS45cHg7Cisg IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDNw eDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKy5idG4tc21hbGwgW2NsYXNz Xj0iaWNvbi0iXSwKKy5idG4tc21hbGwgW2NsYXNzKj0iIGljb24tIl0geworICBtYXJnaW4tdG9w OiAwOworfQorCisuYnRuLW1pbmkgW2NsYXNzXj0iaWNvbi0iXSwKKy5idG4tbWluaSBbY2xhc3Mq PSIgaWNvbi0iXSB7CisgIG1hcmdpbi10b3A6IC0xcHg7Cit9CisKKy5idG4tbWluaSB7CisgIHBh ZGRpbmc6IDAgNnB4OworICBmb250LXNpemU6IDEwLjVweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFk aXVzOiAzcHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogM3B4OworICAgICAgICAgIGJvcmRl ci1yYWRpdXM6IDNweDsKK30KKworLmJ0bi1ibG9jayB7CisgIGRpc3BsYXk6IGJsb2NrOworICB3 aWR0aDogMTAwJTsKKyAgcGFkZGluZy1yaWdodDogMDsKKyAgcGFkZGluZy1sZWZ0OiAwOworICAt d2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgIC1tb3otYm94LXNpemluZzogYm9y ZGVyLWJveDsKKyAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworfQorCisuYnRuLWJs b2NrICsgLmJ0bi1ibG9jayB7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKworaW5wdXRbdHlwZT0i c3VibWl0Il0uYnRuLWJsb2NrLAoraW5wdXRbdHlwZT0icmVzZXQiXS5idG4tYmxvY2ssCitpbnB1 dFt0eXBlPSJidXR0b24iXS5idG4tYmxvY2sgeworICB3aWR0aDogMTAwJTsKK30KKworLmJ0bi1w cmltYXJ5LmFjdGl2ZSwKKy5idG4td2FybmluZy5hY3RpdmUsCisuYnRuLWRhbmdlci5hY3RpdmUs CisuYnRuLXN1Y2Nlc3MuYWN0aXZlLAorLmJ0bi1pbmZvLmFjdGl2ZSwKKy5idG4taW52ZXJzZS5h Y3RpdmUgeworICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKK30KKworLmJ0bi1w cmltYXJ5IHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2Jh KDAsIDAsIDAsIDAuMjUpOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2ZGNjOworICAqYmFja2dy b3VuZC1jb2xvcjogIzAwNDRjYzsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3Jh ZGllbnQodG9wLCAjMDA4OGNjLCAjMDA0NGNjKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtp dC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCMwMDg4Y2MpLCB0bygjMDA0NGNj KSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzAw ODhjYywgIzAwNDRjYyk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0 b3AsICMwMDg4Y2MsICMwMDQ0Y2MpOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGll bnQodG8gYm90dG9tLCAjMDA4OGNjLCAjMDA0NGNjKTsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJl cGVhdC14OworICBib3JkZXItY29sb3I6ICMwMDQ0Y2MgIzAwNDRjYyAjMDAyYTgwOworICBib3Jk ZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMSkgcmdiYSgwLCAw LCAwLCAwLjI1KTsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQu Z3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmMDA4OGNjJywgZW5kQ29sb3JzdHI9JyNmZjAwNDRj YycsIEdyYWRpZW50VHlwZT0wKTsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5N aWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSk7Cit9CisKKy5idG4tcHJpbWFyeTpob3Zl ciwKKy5idG4tcHJpbWFyeTpmb2N1cywKKy5idG4tcHJpbWFyeTphY3RpdmUsCisuYnRuLXByaW1h cnkuYWN0aXZlLAorLmJ0bi1wcmltYXJ5LmRpc2FibGVkLAorLmJ0bi1wcmltYXJ5W2Rpc2FibGVk XSB7CisgIGNvbG9yOiAjZmZmZmZmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA0NGNjOworICAq YmFja2dyb3VuZC1jb2xvcjogIzAwM2JiMzsKK30KKworLmJ0bi1wcmltYXJ5OmFjdGl2ZSwKKy5i dG4tcHJpbWFyeS5hY3RpdmUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzk5IFw5OworfQor CisuYnRuLXdhcm5pbmcgeworICBjb2xvcjogI2ZmZmZmZjsKKyAgdGV4dC1zaGFkb3c6IDAgLTFw eCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYWE3MzI7Cisg ICpiYWNrZ3JvdW5kLWNvbG9yOiAjZjg5NDA2OworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxp bmVhci1ncmFkaWVudCh0b3AsICNmYmI0NTAsICNmODk0MDYpOworICBiYWNrZ3JvdW5kLWltYWdl OiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCAwLCAwIDEwMCUsIGZyb20oI2ZiYjQ1MCksIHRv KCNmODk0MDYpKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQo dG9wLCAjZmJiNDUwLCAjZjg5NDA2KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdy YWRpZW50KHRvcCwgI2ZiYjQ1MCwgI2Y4OTQwNik7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVh ci1ncmFkaWVudCh0byBib3R0b20sICNmYmI0NTAsICNmODk0MDYpOworICBiYWNrZ3JvdW5kLXJl cGVhdDogcmVwZWF0LXg7CisgIGJvcmRlci1jb2xvcjogI2Y4OTQwNiAjZjg5NDA2ICNhZDY3MDQ7 CisgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEpIHJnYmEoMCwgMCwgMCwgMC4xKSBy Z2JhKDAsIDAsIDAsIDAuMjUpOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1p Y3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmZmYmI0NTAnLCBlbmRDb2xvcnN0cj0n I2ZmZjg5NDA2JywgR3JhZGllbnRUeXBlPTApOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJh bnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkPWZhbHNlKTsKK30KKworLmJ0bi13YXJu aW5nOmhvdmVyLAorLmJ0bi13YXJuaW5nOmZvY3VzLAorLmJ0bi13YXJuaW5nOmFjdGl2ZSwKKy5i dG4td2FybmluZy5hY3RpdmUsCisuYnRuLXdhcm5pbmcuZGlzYWJsZWQsCisuYnRuLXdhcm5pbmdb ZGlzYWJsZWRdIHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGJhY2tncm91bmQtY29sb3I6ICNmODk0 MDY7CisgICpiYWNrZ3JvdW5kLWNvbG9yOiAjZGY4NTA1OworfQorCisuYnRuLXdhcm5pbmc6YWN0 aXZlLAorLmJ0bi13YXJuaW5nLmFjdGl2ZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNjNjc2MDUg XDk7Cit9CisKKy5idG4tZGFuZ2VyIHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIHRleHQtc2hhZG93 OiAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMjUpOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGE0 ZjQ5OworICAqYmFja2dyb3VuZC1jb2xvcjogI2JkMzYyZjsKKyAgYmFja2dyb3VuZC1pbWFnZTog LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZWU1ZjViLCAjYmQzNjJmKTsKKyAgYmFja2dyb3Vu ZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCNlZTVm NWIpLCB0bygjYmQzNjJmKSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdy YWRpZW50KHRvcCwgI2VlNWY1YiwgI2JkMzYyZik7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxp bmVhci1ncmFkaWVudCh0b3AsICNlZTVmNWIsICNiZDM2MmYpOworICBiYWNrZ3JvdW5kLWltYWdl OiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZWU1ZjViLCAjYmQzNjJmKTsKKyAgYmFja2dy b3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICBib3JkZXItY29sb3I6ICNiZDM2MmYgI2JkMzYyZiAj ODAyNDIwOworICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAs IDAuMSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5z Zm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZWU1ZjViJywgZW5kQ29s b3JzdHI9JyNmZmJkMzYyZicsIEdyYWRpZW50VHlwZT0wKTsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJ bWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSk7Cit9CisKKy5i dG4tZGFuZ2VyOmhvdmVyLAorLmJ0bi1kYW5nZXI6Zm9jdXMsCisuYnRuLWRhbmdlcjphY3RpdmUs CisuYnRuLWRhbmdlci5hY3RpdmUsCisuYnRuLWRhbmdlci5kaXNhYmxlZCwKKy5idG4tZGFuZ2Vy W2Rpc2FibGVkXSB7CisgIGNvbG9yOiAjZmZmZmZmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmQz NjJmOworICAqYmFja2dyb3VuZC1jb2xvcjogI2E5MzAyYTsKK30KKworLmJ0bi1kYW5nZXI6YWN0 aXZlLAorLmJ0bi1kYW5nZXIuYWN0aXZlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzk0MmEyNSBc OTsKK30KKworLmJ0bi1zdWNjZXNzIHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIHRleHQtc2hhZG93 OiAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMjUpOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWJi NzViOworICAqYmFja2dyb3VuZC1jb2xvcjogIzUxYTM1MTsKKyAgYmFja2dyb3VuZC1pbWFnZTog LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjNjJjNDYyLCAjNTFhMzUxKTsKKyAgYmFja2dyb3Vu ZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCM2MmM0 NjIpLCB0bygjNTFhMzUxKSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdy YWRpZW50KHRvcCwgIzYyYzQ2MiwgIzUxYTM1MSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxp bmVhci1ncmFkaWVudCh0b3AsICM2MmM0NjIsICM1MWEzNTEpOworICBiYWNrZ3JvdW5kLWltYWdl OiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNjJjNDYyLCAjNTFhMzUxKTsKKyAgYmFja2dy b3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICBib3JkZXItY29sb3I6ICM1MWEzNTEgIzUxYTM1MSAj Mzg3MDM4OworICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAs IDAuMSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5z Zm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmNjJjNDYyJywgZW5kQ29s b3JzdHI9JyNmZjUxYTM1MScsIEdyYWRpZW50VHlwZT0wKTsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJ bWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSk7Cit9CisKKy5i dG4tc3VjY2Vzczpob3ZlciwKKy5idG4tc3VjY2Vzczpmb2N1cywKKy5idG4tc3VjY2VzczphY3Rp dmUsCisuYnRuLXN1Y2Nlc3MuYWN0aXZlLAorLmJ0bi1zdWNjZXNzLmRpc2FibGVkLAorLmJ0bi1z dWNjZXNzW2Rpc2FibGVkXSB7CisgIGNvbG9yOiAjZmZmZmZmOworICBiYWNrZ3JvdW5kLWNvbG9y OiAjNTFhMzUxOworICAqYmFja2dyb3VuZC1jb2xvcjogIzQ5OTI0OTsKK30KKworLmJ0bi1zdWNj ZXNzOmFjdGl2ZSwKKy5idG4tc3VjY2Vzcy5hY3RpdmUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAj NDA4MTQwIFw5OworfQorCisuYnRuLWluZm8geworICBjb2xvcjogI2ZmZmZmZjsKKyAgdGV4dC1z aGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7CisgIGJhY2tncm91bmQtY29sb3I6 ICM0OWFmY2Q7CisgICpiYWNrZ3JvdW5kLWNvbG9yOiAjMmY5NmI0OworICBiYWNrZ3JvdW5kLWlt YWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICM1YmMwZGUsICMyZjk2YjQpOworICBiYWNr Z3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCAwLCAwIDEwMCUsIGZyb20o IzViYzBkZSksIHRvKCMyZjk2YjQpKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5l YXItZ3JhZGllbnQodG9wLCAjNWJjMGRlLCAjMmY5NmI0KTsKKyAgYmFja2dyb3VuZC1pbWFnZTog LW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzViYzBkZSwgIzJmOTZiNCk7CisgIGJhY2tncm91bmQt aW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM1YmMwZGUsICMyZjk2YjQpOworICBi YWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisgIGJvcmRlci1jb2xvcjogIzJmOTZiNCAjMmY5 NmI0ICMxZjYzNzc7CisgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEpIHJnYmEoMCwg MCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMjUpOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdl VHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmY1YmMwZGUnLCBl bmRDb2xvcnN0cj0nI2ZmMmY5NmI0JywgR3JhZGllbnRUeXBlPTApOworICBmaWx0ZXI6IHByb2dp ZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkPWZhbHNlKTsKK30K KworLmJ0bi1pbmZvOmhvdmVyLAorLmJ0bi1pbmZvOmZvY3VzLAorLmJ0bi1pbmZvOmFjdGl2ZSwK Ky5idG4taW5mby5hY3RpdmUsCisuYnRuLWluZm8uZGlzYWJsZWQsCisuYnRuLWluZm9bZGlzYWJs ZWRdIHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGJhY2tncm91bmQtY29sb3I6ICMyZjk2YjQ7Cisg ICpiYWNrZ3JvdW5kLWNvbG9yOiAjMmE4NWEwOworfQorCisuYnRuLWluZm86YWN0aXZlLAorLmJ0 bi1pbmZvLmFjdGl2ZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMyNDc0OGMgXDk7Cit9CisKKy5i dG4taW52ZXJzZSB7CisgIGNvbG9yOiAjZmZmZmZmOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAg cmdiYSgwLCAwLCAwLCAwLjI1KTsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzM2MzYzNjsKKyAgKmJh Y2tncm91bmQtY29sb3I6ICMyMjIyMjI7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFy LWdyYWRpZW50KHRvcCwgIzQ0NDQ0NCwgIzIyMjIyMik7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13 ZWJraXQtZ3JhZGllbnQobGluZWFyLCAwIDAsIDAgMTAwJSwgZnJvbSgjNDQ0NDQ0KSwgdG8oIzIy MjIyMikpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3As ICM0NDQ0NDQsICMyMjIyMjIpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGll bnQodG9wLCAjNDQ0NDQ0LCAjMjIyMjIyKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdy YWRpZW50KHRvIGJvdHRvbSwgIzQ0NDQ0NCwgIzIyMjIyMik7CisgIGJhY2tncm91bmQtcmVwZWF0 OiByZXBlYXQteDsKKyAgYm9yZGVyLWNvbG9yOiAjMjIyMjIyICMyMjIyMjIgIzAwMDAwMDsKKyAg Ym9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMSkgcmdiYSgwLCAwLCAwLCAwLjEpIHJnYmEo MCwgMCwgMCwgMC4yNSk7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9z b2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjQ0NDQ0NCcsIGVuZENvbG9yc3RyPScjZmYy MjIyMjInLCBHcmFkaWVudFR5cGU9MCk7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zv cm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQ9ZmFsc2UpOworfQorCisuYnRuLWludmVyc2U6 aG92ZXIsCisuYnRuLWludmVyc2U6Zm9jdXMsCisuYnRuLWludmVyc2U6YWN0aXZlLAorLmJ0bi1p bnZlcnNlLmFjdGl2ZSwKKy5idG4taW52ZXJzZS5kaXNhYmxlZCwKKy5idG4taW52ZXJzZVtkaXNh YmxlZF0geworICBjb2xvcjogI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjIyMjsK KyAgKmJhY2tncm91bmQtY29sb3I6ICMxNTE1MTU7Cit9CisKKy5idG4taW52ZXJzZTphY3RpdmUs CisuYnRuLWludmVyc2UuYWN0aXZlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzA4MDgwOCBcOTsK K30KKworYnV0dG9uLmJ0biwKK2lucHV0W3R5cGU9InN1Ym1pdCJdLmJ0biB7CisgICpwYWRkaW5n LXRvcDogM3B4OworICAqcGFkZGluZy1ib3R0b206IDNweDsKK30KKworYnV0dG9uLmJ0bjo6LW1v ei1mb2N1cy1pbm5lciwKK2lucHV0W3R5cGU9InN1Ym1pdCJdLmJ0bjo6LW1vei1mb2N1cy1pbm5l ciB7CisgIHBhZGRpbmc6IDA7CisgIGJvcmRlcjogMDsKK30KKworYnV0dG9uLmJ0bi5idG4tbGFy Z2UsCitpbnB1dFt0eXBlPSJzdWJtaXQiXS5idG4uYnRuLWxhcmdlIHsKKyAgKnBhZGRpbmctdG9w OiA3cHg7CisgICpwYWRkaW5nLWJvdHRvbTogN3B4OworfQorCitidXR0b24uYnRuLmJ0bi1zbWFs bCwKK2lucHV0W3R5cGU9InN1Ym1pdCJdLmJ0bi5idG4tc21hbGwgeworICAqcGFkZGluZy10b3A6 IDNweDsKKyAgKnBhZGRpbmctYm90dG9tOiAzcHg7Cit9CisKK2J1dHRvbi5idG4uYnRuLW1pbmks CitpbnB1dFt0eXBlPSJzdWJtaXQiXS5idG4uYnRuLW1pbmkgeworICAqcGFkZGluZy10b3A6IDFw eDsKKyAgKnBhZGRpbmctYm90dG9tOiAxcHg7Cit9CisKKy5idG4tbGluaywKKy5idG4tbGluazph Y3RpdmUsCisuYnRuLWxpbmtbZGlzYWJsZWRdIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNw YXJlbnQ7CisgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CisgIC13ZWJraXQtYm94LXNoYWRvdzog bm9uZTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiBub25lOworICAgICAgICAgIGJveC1zaGFkb3c6 IG5vbmU7Cit9CisKKy5idG4tbGluayB7CisgIGNvbG9yOiAjMDA4OGNjOworICBjdXJzb3I6IHBv aW50ZXI7CisgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIC13ZWJraXQtYm9yZGVyLXJh ZGl1czogMDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwOworICAgICAgICAgIGJvcmRlci1y YWRpdXM6IDA7Cit9CisKKy5idG4tbGluazpob3ZlciwKKy5idG4tbGluazpmb2N1cyB7CisgIGNv bG9yOiAjMDA1NTgwOworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgYmFja2dyb3Vu ZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cit9CisKKy5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsCisu YnRuLWxpbmtbZGlzYWJsZWRdOmZvY3VzIHsKKyAgY29sb3I6ICMzMzMzMzM7CisgIHRleHQtZGVj b3JhdGlvbjogbm9uZTsKK30KKworLmJ0bi1ncm91cCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsK KyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAqZGlzcGxheTogaW5saW5lOworICAqbWFyZ2lu LWxlZnQ6IC4zZW07CisgIGZvbnQtc2l6ZTogMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAg dmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgKnpvb206IDE7Cit9CisKKy5idG4tZ3JvdXA6Zmly c3QtY2hpbGQgeworICAqbWFyZ2luLWxlZnQ6IDA7Cit9CisKKy5idG4tZ3JvdXAgKyAuYnRuLWdy b3VwIHsKKyAgbWFyZ2luLWxlZnQ6IDVweDsKK30KKworLmJ0bi10b29sYmFyIHsKKyAgbWFyZ2lu LXRvcDogMTBweDsKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgZm9udC1zaXplOiAwOworfQor CisuYnRuLXRvb2xiYXIgPiAuYnRuICsgLmJ0biwKKy5idG4tdG9vbGJhciA+IC5idG4tZ3JvdXAg KyAuYnRuLAorLmJ0bi10b29sYmFyID4gLmJ0biArIC5idG4tZ3JvdXAgeworICBtYXJnaW4tbGVm dDogNXB4OworfQorCisuYnRuLWdyb3VwID4gLmJ0biB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsK KyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDA7 CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKK30KKworLmJ0bi1ncm91cCA+IC5idG4gKyAu YnRuIHsKKyAgbWFyZ2luLWxlZnQ6IC0xcHg7Cit9CisKKy5idG4tZ3JvdXAgPiAuYnRuLAorLmJ0 bi1ncm91cCA+IC5kcm9wZG93bi1tZW51LAorLmJ0bi1ncm91cCA+IC5wb3BvdmVyIHsKKyAgZm9u dC1zaXplOiAxNHB4OworfQorCisuYnRuLWdyb3VwID4gLmJ0bi1taW5pIHsKKyAgZm9udC1zaXpl OiAxMC41cHg7Cit9CisKKy5idG4tZ3JvdXAgPiAuYnRuLXNtYWxsIHsKKyAgZm9udC1zaXplOiAx MS45cHg7Cit9CisKKy5idG4tZ3JvdXAgPiAuYnRuLWxhcmdlIHsKKyAgZm9udC1zaXplOiAxNy41 cHg7Cit9CisKKy5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHsKKyAgbWFyZ2luLWxlZnQ6 IDA7CisgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OworICAgICAgICAg IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKKyAgLXdlYmtpdC1ib3JkZXItdG9wLWxl ZnQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4Owor ICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogNHB4OworICAtbW96LWJvcmRlci1yYWRp dXMtdG9wbGVmdDogNHB4OworfQorCisuYnRuLWdyb3VwID4gLmJ0bjpsYXN0LWNoaWxkLAorLmJ0 bi1ncm91cCA+IC5kcm9wZG93bi10b2dnbGUgeworICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQt cmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAg LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICAgICAgICAgIGJvcmRl ci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdo dDogNHB4OworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsKK30KKworLmJ0 bi1ncm91cCA+IC5idG4ubGFyZ2U6Zmlyc3QtY2hpbGQgeworICBtYXJnaW4tbGVmdDogMDsKKyAg LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA2cHg7CisgICAgICAgICAgYm9yZGVy LWJvdHRvbS1sZWZ0LXJhZGl1czogNnB4OworICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRp dXM6IDZweDsKKyAgICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA2cHg7CisgIC1tb3ot Ym9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA2cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy10b3Bs ZWZ0OiA2cHg7Cit9CisKKy5idG4tZ3JvdXAgPiAuYnRuLmxhcmdlOmxhc3QtY2hpbGQsCisuYnRu LWdyb3VwID4gLmxhcmdlLmRyb3Bkb3duLXRvZ2dsZSB7CisgIC13ZWJraXQtYm9yZGVyLXRvcC1y aWdodC1yYWRpdXM6IDZweDsKKyAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNnB4 OworICAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA2cHg7CisgICAgICAgICAg Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDZweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLXRv cHJpZ2h0OiA2cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNnB4OworfQor CisuYnRuLWdyb3VwID4gLmJ0bjpob3ZlciwKKy5idG4tZ3JvdXAgPiAuYnRuOmZvY3VzLAorLmJ0 bi1ncm91cCA+IC5idG46YWN0aXZlLAorLmJ0bi1ncm91cCA+IC5idG4uYWN0aXZlIHsKKyAgei1p bmRleDogMjsKK30KKworLmJ0bi1ncm91cCAuZHJvcGRvd24tdG9nZ2xlOmFjdGl2ZSwKKy5idG4t Z3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHsKKyAgb3V0bGluZTogMDsKK30KKworLmJ0bi1n cm91cCA+IC5idG4gKyAuZHJvcGRvd24tdG9nZ2xlIHsKKyAgKnBhZGRpbmctdG9wOiA1cHg7Cisg IHBhZGRpbmctcmlnaHQ6IDhweDsKKyAgKnBhZGRpbmctYm90dG9tOiA1cHg7CisgIHBhZGRpbmct bGVmdDogOHB4OworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDFweCAwIDAgcmdiYSgyNTUs IDI1NSwgMjU1LCAwLjEyNSksIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIp LCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiBp bnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMjUpLCBpbnNldCAwIDFweCAwIHJn YmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7Cisg ICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAu MTI1KSwgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAgMXB4IDJweCBy Z2JhKDAsIDAsIDAsIDAuMDUpOworfQorCisuYnRuLWdyb3VwID4gLmJ0bi1taW5pICsgLmRyb3Bk b3duLXRvZ2dsZSB7CisgICpwYWRkaW5nLXRvcDogMnB4OworICBwYWRkaW5nLXJpZ2h0OiA1cHg7 CisgICpwYWRkaW5nLWJvdHRvbTogMnB4OworICBwYWRkaW5nLWxlZnQ6IDVweDsKK30KKworLmJ0 bi1ncm91cCA+IC5idG4tc21hbGwgKyAuZHJvcGRvd24tdG9nZ2xlIHsKKyAgKnBhZGRpbmctdG9w OiA1cHg7CisgICpwYWRkaW5nLWJvdHRvbTogNHB4OworfQorCisuYnRuLWdyb3VwID4gLmJ0bi1s YXJnZSArIC5kcm9wZG93bi10b2dnbGUgeworICAqcGFkZGluZy10b3A6IDdweDsKKyAgcGFkZGlu Zy1yaWdodDogMTJweDsKKyAgKnBhZGRpbmctYm90dG9tOiA3cHg7CisgIHBhZGRpbmctbGVmdDog MTJweDsKK30KKworLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUgeworICBiYWNrZ3Jv dW5kLWltYWdlOiBub25lOworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCBy Z2JhKDAsIDAsIDAsIDAuMTUpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKKyAgICAg LW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjE1KSwgMCAx cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7CisgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQg MCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xNSksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAu MDUpOworfQorCisuYnRuLWdyb3VwLm9wZW4gLmJ0bi5kcm9wZG93bi10b2dnbGUgeworICBiYWNr Z3JvdW5kLWNvbG9yOiAjZTZlNmU2OworfQorCisuYnRuLWdyb3VwLm9wZW4gLmJ0bi1wcmltYXJ5 LmRyb3Bkb3duLXRvZ2dsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMwMDQ0Y2M7Cit9CisKKy5i dG4tZ3JvdXAub3BlbiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlIHsKKyAgYmFja2dyb3Vu ZC1jb2xvcjogI2Y4OTQwNjsKK30KKworLmJ0bi1ncm91cC5vcGVuIC5idG4tZGFuZ2VyLmRyb3Bk b3duLXRvZ2dsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNiZDM2MmY7Cit9CisKKy5idG4tZ3Jv dXAub3BlbiAuYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xlIHsKKyAgYmFja2dyb3VuZC1jb2xv cjogIzUxYTM1MTsKK30KKworLmJ0bi1ncm91cC5vcGVuIC5idG4taW5mby5kcm9wZG93bi10b2dn bGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmY5NmI0OworfQorCisuYnRuLWdyb3VwLm9wZW4g LmJ0bi1pbnZlcnNlLmRyb3Bkb3duLXRvZ2dsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMyMjIy MjI7Cit9CisKKy5idG4gLmNhcmV0IHsKKyAgbWFyZ2luLXRvcDogOHB4OworICBtYXJnaW4tbGVm dDogMDsKK30KKworLmJ0bi1sYXJnZSAuY2FyZXQgeworICBtYXJnaW4tdG9wOiA2cHg7Cit9CisK Ky5idG4tbGFyZ2UgLmNhcmV0IHsKKyAgYm9yZGVyLXRvcC13aWR0aDogNXB4OworICBib3JkZXIt cmlnaHQtd2lkdGg6IDVweDsKKyAgYm9yZGVyLWxlZnQtd2lkdGg6IDVweDsKK30KKworLmJ0bi1t aW5pIC5jYXJldCwKKy5idG4tc21hbGwgLmNhcmV0IHsKKyAgbWFyZ2luLXRvcDogOHB4OworfQor CisuZHJvcHVwIC5idG4tbGFyZ2UgLmNhcmV0IHsKKyAgYm9yZGVyLWJvdHRvbS13aWR0aDogNXB4 OworfQorCisuYnRuLXByaW1hcnkgLmNhcmV0LAorLmJ0bi13YXJuaW5nIC5jYXJldCwKKy5idG4t ZGFuZ2VyIC5jYXJldCwKKy5idG4taW5mbyAuY2FyZXQsCisuYnRuLXN1Y2Nlc3MgLmNhcmV0LAor LmJ0bi1pbnZlcnNlIC5jYXJldCB7CisgIGJvcmRlci10b3AtY29sb3I6ICNmZmZmZmY7CisgIGJv cmRlci1ib3R0b20tY29sb3I6ICNmZmZmZmY7Cit9CisKKy5idG4tZ3JvdXAtdmVydGljYWwgewor ICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICpkaXNwbGF5OiBpbmxpbmU7CisgIC8qIElFNyBp bmxpbmUtYmxvY2sgaGFjayAqLworCisgICp6b29tOiAxOworfQorCisuYnRuLWdyb3VwLXZlcnRp Y2FsID4gLmJ0biB7CisgIGRpc3BsYXk6IGJsb2NrOworICBmbG9hdDogbm9uZTsKKyAgbWF4LXdp ZHRoOiAxMDAlOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CisgICAgIC1tb3otYm9yZGVy LXJhZGl1czogMDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOworfQorCisuYnRuLWdyb3Vw LXZlcnRpY2FsID4gLmJ0biArIC5idG4geworICBtYXJnaW4tdG9wOiAtMXB4OworICBtYXJnaW4t bGVmdDogMDsKK30KKworLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46Zmlyc3QtY2hpbGQgewor ICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwOworICAgICAtbW96LWJvcmRlci1y YWRpdXM6IDRweCA0cHggMCAwOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAw OworfQorCisuYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpsYXN0LWNoaWxkIHsKKyAgLXdlYmtp dC1ib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAw IDAgNHB4IDRweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDsKK30KKwor LmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tbGFyZ2U6Zmlyc3QtY2hpbGQgeworICAtd2Via2l0 LWJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDZw eCA2cHggMCAwOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOworfQorCisu YnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1sYXJnZTpsYXN0LWNoaWxkIHsKKyAgLXdlYmtpdC1i b3JkZXItcmFkaXVzOiAwIDAgNnB4IDZweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwIDAg NnB4IDZweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgNnB4IDZweDsKK30KKworLmFs ZXJ0IHsKKyAgcGFkZGluZzogOHB4IDM1cHggOHB4IDE0cHg7CisgIG1hcmdpbi1ib3R0b206IDIw cHg7CisgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsKKyAg YmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMzsKKyAgYm9yZGVyOiAxcHggc29saWQgI2ZiZWVkNTsK KyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czog NHB4OworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKK30KKworLmFsZXJ0LAorLmFsZXJ0 IGg0IHsKKyAgY29sb3I6ICNjMDk4NTM7Cit9CisKKy5hbGVydCBoNCB7CisgIG1hcmdpbjogMDsK K30KKworLmFsZXJ0IC5jbG9zZSB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAtMnB4 OworICByaWdodDogLTIxcHg7CisgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorCisuYWxlcnQtc3Vj Y2VzcyB7CisgIGNvbG9yOiAjNDY4ODQ3OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4Owor ICBib3JkZXItY29sb3I6ICNkNmU5YzY7Cit9CisKKy5hbGVydC1zdWNjZXNzIGg0IHsKKyAgY29s b3I6ICM0Njg4NDc7Cit9CisKKy5hbGVydC1kYW5nZXIsCisuYWxlcnQtZXJyb3IgeworICBjb2xv cjogI2I5NGE0ODsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTsKKyAgYm9yZGVyLWNvbG9y OiAjZWVkM2Q3OworfQorCisuYWxlcnQtZGFuZ2VyIGg0LAorLmFsZXJ0LWVycm9yIGg0IHsKKyAg Y29sb3I6ICNiOTRhNDg7Cit9CisKKy5hbGVydC1pbmZvIHsKKyAgY29sb3I6ICMzYTg3YWQ7Cisg IGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7CisgIGJvcmRlci1jb2xvcjogI2JjZThmMTsKK30K KworLmFsZXJ0LWluZm8gaDQgeworICBjb2xvcjogIzNhODdhZDsKK30KKworLmFsZXJ0LWJsb2Nr IHsKKyAgcGFkZGluZy10b3A6IDE0cHg7CisgIHBhZGRpbmctYm90dG9tOiAxNHB4OworfQorCisu YWxlcnQtYmxvY2sgPiBwLAorLmFsZXJ0LWJsb2NrID4gdWwgeworICBtYXJnaW4tYm90dG9tOiAw OworfQorCisuYWxlcnQtYmxvY2sgcCArIHAgeworICBtYXJnaW4tdG9wOiA1cHg7Cit9CisKKy5u YXYgeworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBtYXJnaW4tbGVmdDogMDsKKyAgbGlzdC1z dHlsZTogbm9uZTsKK30KKworLm5hdiA+IGxpID4gYSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQor CisubmF2ID4gbGkgPiBhOmhvdmVyLAorLm5hdiA+IGxpID4gYTpmb2N1cyB7CisgIHRleHQtZGVj b3JhdGlvbjogbm9uZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKK30KKworLm5hdiA+ IGxpID4gYSA+IGltZyB7CisgIG1heC13aWR0aDogbm9uZTsKK30KKworLm5hdiA+IC5wdWxsLXJp Z2h0IHsKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisubmF2LWhlYWRlciB7CisgIGRpc3BsYXk6IGJs b2NrOworICBwYWRkaW5nOiAzcHggMTVweDsKKyAgZm9udC1zaXplOiAxMXB4OworICBmb250LXdl aWdodDogYm9sZDsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIGNvbG9yOiAjOTk5OTk5OworICB0 ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7CisgIHRleHQtdHJh bnNmb3JtOiB1cHBlcmNhc2U7Cit9CisKKy5uYXYgbGkgKyAubmF2LWhlYWRlciB7CisgIG1hcmdp bi10b3A6IDlweDsKK30KKworLm5hdi1saXN0IHsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKKyAg cGFkZGluZy1sZWZ0OiAxNXB4OworICBtYXJnaW4tYm90dG9tOiAwOworfQorCisubmF2LWxpc3Qg PiBsaSA+IGEsCisubmF2LWxpc3QgLm5hdi1oZWFkZXIgeworICBtYXJnaW4tcmlnaHQ6IC0xNXB4 OworICBtYXJnaW4tbGVmdDogLTE1cHg7CisgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1 LCAyNTUsIDI1NSwgMC41KTsKK30KKworLm5hdi1saXN0ID4gbGkgPiBhIHsKKyAgcGFkZGluZzog M3B4IDE1cHg7Cit9CisKKy5uYXYtbGlzdCA+IC5hY3RpdmUgPiBhLAorLm5hdi1saXN0ID4gLmFj dGl2ZSA+IGE6aG92ZXIsCisubmF2LWxpc3QgPiAuYWN0aXZlID4gYTpmb2N1cyB7CisgIGNvbG9y OiAjZmZmZmZmOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpOwor ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA4OGNjOworfQorCisubmF2LWxpc3QgW2NsYXNzXj0iaWNv bi0iXSwKKy5uYXYtbGlzdCBbY2xhc3MqPSIgaWNvbi0iXSB7CisgIG1hcmdpbi1yaWdodDogMnB4 OworfQorCisubmF2LWxpc3QgLmRpdmlkZXIgeworICAqd2lkdGg6IDEwMCU7CisgIGhlaWdodDog MXB4OworICBtYXJnaW46IDlweCAxcHg7CisgICptYXJnaW46IC01cHggMCA1cHg7CisgIG92ZXJm bG93OiBoaWRkZW47CisgIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7CisgIGJvcmRlci1ib3R0 b206IDFweCBzb2xpZCAjZmZmZmZmOworfQorCisubmF2LXRhYnMsCisubmF2LXBpbGxzIHsKKyAg Knpvb206IDE7Cit9CisKKy5uYXYtdGFiczpiZWZvcmUsCisubmF2LXBpbGxzOmJlZm9yZSwKKy5u YXYtdGFiczphZnRlciwKKy5uYXYtcGlsbHM6YWZ0ZXIgeworICBkaXNwbGF5OiB0YWJsZTsKKyAg bGluZS1oZWlnaHQ6IDA7CisgIGNvbnRlbnQ6ICIiOworfQorCisubmF2LXRhYnM6YWZ0ZXIsCisu bmF2LXBpbGxzOmFmdGVyIHsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy5uYXYtdGFicyA+IGxpLAor Lm5hdi1waWxscyA+IGxpIHsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKy5uYXYtdGFicyA+IGxpID4g YSwKKy5uYXYtcGlsbHMgPiBsaSA+IGEgeworICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworICBwYWRk aW5nLWxlZnQ6IDEycHg7CisgIG1hcmdpbi1yaWdodDogMnB4OworICBsaW5lLWhlaWdodDogMTRw eDsKK30KKworLm5hdi10YWJzIHsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7Cit9 CisKKy5uYXYtdGFicyA+IGxpIHsKKyAgbWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworLm5hdi10 YWJzID4gbGkgPiBhIHsKKyAgcGFkZGluZy10b3A6IDhweDsKKyAgcGFkZGluZy1ib3R0b206IDhw eDsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50 OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwOworICAgICAtbW96LWJvcmRl ci1yYWRpdXM6IDRweCA0cHggMCAwOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHgg MCAwOworfQorCisubmF2LXRhYnMgPiBsaSA+IGE6aG92ZXIsCisubmF2LXRhYnMgPiBsaSA+IGE6 Zm9jdXMgeworICBib3JkZXItY29sb3I6ICNlZWVlZWUgI2VlZWVlZSAjZGRkZGRkOworfQorCisu bmF2LXRhYnMgPiAuYWN0aXZlID4gYSwKKy5uYXYtdGFicyA+IC5hY3RpdmUgPiBhOmhvdmVyLAor Lm5hdi10YWJzID4gLmFjdGl2ZSA+IGE6Zm9jdXMgeworICBjb2xvcjogIzU1NTU1NTsKKyAgY3Vy c29yOiBkZWZhdWx0OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICBib3JkZXI6IDFw eCBzb2xpZCAjZGRkOworICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKK30KKwor Lm5hdi1waWxscyA+IGxpID4gYSB7CisgIHBhZGRpbmctdG9wOiA4cHg7CisgIHBhZGRpbmctYm90 dG9tOiA4cHg7CisgIG1hcmdpbi10b3A6IDJweDsKKyAgbWFyZ2luLWJvdHRvbTogMnB4OworICAt d2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7 CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4OworfQorCisubmF2LXBpbGxzID4gLmFjdGl2 ZSA+IGEsCisubmF2LXBpbGxzID4gLmFjdGl2ZSA+IGE6aG92ZXIsCisubmF2LXBpbGxzID4gLmFj dGl2ZSA+IGE6Zm9jdXMgeworICBjb2xvcjogI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjog IzAwODhjYzsKK30KKworLm5hdi1zdGFja2VkID4gbGkgeworICBmbG9hdDogbm9uZTsKK30KKwor Lm5hdi1zdGFja2VkID4gbGkgPiBhIHsKKyAgbWFyZ2luLXJpZ2h0OiAwOworfQorCisubmF2LXRh YnMubmF2LXN0YWNrZWQgeworICBib3JkZXItYm90dG9tOiAwOworfQorCisubmF2LXRhYnMubmF2 LXN0YWNrZWQgPiBsaSA+IGEgeworICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOworICAtd2Via2l0 LWJvcmRlci1yYWRpdXM6IDA7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDsKKyAgICAgICAg ICBib3JkZXItcmFkaXVzOiAwOworfQorCisubmF2LXRhYnMubmF2LXN0YWNrZWQgPiBsaTpmaXJz dC1jaGlsZCA+IGEgeworICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7Cisg ICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgLXdlYmtpdC1ib3JkZXIt dG9wLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czog NHB4OworICAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDRweDsKKyAgLW1vei1ib3JkZXIt cmFkaXVzLXRvcGxlZnQ6IDRweDsKK30KKworLm5hdi10YWJzLm5hdi1zdGFja2VkID4gbGk6bGFz dC1jaGlsZCA+IGEgeworICAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7 CisgICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsKKyAgLXdlYmtpdC1i b3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLWJvdHRvbS1s ZWZ0LXJhZGl1czogNHB4OworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsK KyAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDRweDsKK30KKworLm5hdi10YWJzLm5h di1zdGFja2VkID4gbGkgPiBhOmhvdmVyLAorLm5hdi10YWJzLm5hdi1zdGFja2VkID4gbGkgPiBh OmZvY3VzIHsKKyAgei1pbmRleDogMjsKKyAgYm9yZGVyLWNvbG9yOiAjZGRkOworfQorCisubmF2 LXBpbGxzLm5hdi1zdGFja2VkID4gbGkgPiBhIHsKKyAgbWFyZ2luLWJvdHRvbTogM3B4OworfQor CisubmF2LXBpbGxzLm5hdi1zdGFja2VkID4gbGk6bGFzdC1jaGlsZCA+IGEgeworICBtYXJnaW4t Ym90dG9tOiAxcHg7Cit9CisKKy5uYXYtdGFicyAuZHJvcGRvd24tbWVudSB7CisgIC13ZWJraXQt Ym9yZGVyLXJhZGl1czogMCAwIDZweCA2cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMCAw IDZweCA2cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDZweCA2cHg7Cit9CisKKy5u YXYtcGlsbHMgLmRyb3Bkb3duLW1lbnUgeworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsK KyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czog NnB4OworfQorCisubmF2IC5kcm9wZG93bi10b2dnbGUgLmNhcmV0IHsKKyAgbWFyZ2luLXRvcDog NnB4OworICBib3JkZXItdG9wLWNvbG9yOiAjMDA4OGNjOworICBib3JkZXItYm90dG9tLWNvbG9y OiAjMDA4OGNjOworfQorCisubmF2IC5kcm9wZG93bi10b2dnbGU6aG92ZXIgLmNhcmV0LAorLm5h diAuZHJvcGRvd24tdG9nZ2xlOmZvY3VzIC5jYXJldCB7CisgIGJvcmRlci10b3AtY29sb3I6ICMw MDU1ODA7CisgIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDU1ODA7Cit9CisKKy8qIG1vdmUgZG93 biBjYXJldHMgZm9yIHRhYnMgKi8KKworLm5hdi10YWJzIC5kcm9wZG93bi10b2dnbGUgLmNhcmV0 IHsKKyAgbWFyZ2luLXRvcDogOHB4OworfQorCisubmF2IC5hY3RpdmUgLmRyb3Bkb3duLXRvZ2ds ZSAuY2FyZXQgeworICBib3JkZXItdG9wLWNvbG9yOiAjZmZmOworICBib3JkZXItYm90dG9tLWNv bG9yOiAjZmZmOworfQorCisubmF2LXRhYnMgLmFjdGl2ZSAuZHJvcGRvd24tdG9nZ2xlIC5jYXJl dCB7CisgIGJvcmRlci10b3AtY29sb3I6ICM1NTU1NTU7CisgIGJvcmRlci1ib3R0b20tY29sb3I6 ICM1NTU1NTU7Cit9CisKKy5uYXYgPiAuZHJvcGRvd24uYWN0aXZlID4gYTpob3ZlciwKKy5uYXYg PiAuZHJvcGRvd24uYWN0aXZlID4gYTpmb2N1cyB7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKwor Lm5hdi10YWJzIC5vcGVuIC5kcm9wZG93bi10b2dnbGUsCisubmF2LXBpbGxzIC5vcGVuIC5kcm9w ZG93bi10b2dnbGUsCisubmF2ID4gbGkuZHJvcGRvd24ub3Blbi5hY3RpdmUgPiBhOmhvdmVyLAor Lm5hdiA+IGxpLmRyb3Bkb3duLm9wZW4uYWN0aXZlID4gYTpmb2N1cyB7CisgIGNvbG9yOiAjZmZm ZmZmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OworICBib3JkZXItY29sb3I6ICM5OTk5 OTk7Cit9CisKKy5uYXYgbGkuZHJvcGRvd24ub3BlbiAuY2FyZXQsCisubmF2IGxpLmRyb3Bkb3du Lm9wZW4uYWN0aXZlIC5jYXJldCwKKy5uYXYgbGkuZHJvcGRvd24ub3BlbiBhOmhvdmVyIC5jYXJl dCwKKy5uYXYgbGkuZHJvcGRvd24ub3BlbiBhOmZvY3VzIC5jYXJldCB7CisgIGJvcmRlci10b3At Y29sb3I6ICNmZmZmZmY7CisgIGJvcmRlci1ib3R0b20tY29sb3I6ICNmZmZmZmY7CisgIG9wYWNp dHk6IDE7CisgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApOworfQorCisudGFicy1zdGFja2Vk IC5vcGVuID4gYTpob3ZlciwKKy50YWJzLXN0YWNrZWQgLm9wZW4gPiBhOmZvY3VzIHsKKyAgYm9y ZGVyLWNvbG9yOiAjOTk5OTk5OworfQorCisudGFiYmFibGUgeworICAqem9vbTogMTsKK30KKwor LnRhYmJhYmxlOmJlZm9yZSwKKy50YWJiYWJsZTphZnRlciB7CisgIGRpc3BsYXk6IHRhYmxlOwor ICBsaW5lLWhlaWdodDogMDsKKyAgY29udGVudDogIiI7Cit9CisKKy50YWJiYWJsZTphZnRlciB7 CisgIGNsZWFyOiBib3RoOworfQorCisudGFiLWNvbnRlbnQgeworICBvdmVyZmxvdzogYXV0bzsK K30KKworLnRhYnMtYmVsb3cgPiAubmF2LXRhYnMsCisudGFicy1yaWdodCA+IC5uYXYtdGFicywK Ky50YWJzLWxlZnQgPiAubmF2LXRhYnMgeworICBib3JkZXItYm90dG9tOiAwOworfQorCisudGFi LWNvbnRlbnQgPiAudGFiLXBhbmUsCisucGlsbC1jb250ZW50ID4gLnBpbGwtcGFuZSB7CisgIGRp c3BsYXk6IG5vbmU7Cit9CisKKy50YWItY29udGVudCA+IC5hY3RpdmUsCisucGlsbC1jb250ZW50 ID4gLmFjdGl2ZSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisudGFicy1iZWxvdyA+IC5uYXYt dGFicyB7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOworfQorCisudGFicy1iZWxvdyA+ IC5uYXYtdGFicyA+IGxpIHsKKyAgbWFyZ2luLXRvcDogLTFweDsKKyAgbWFyZ2luLWJvdHRvbTog MDsKK30KKworLnRhYnMtYmVsb3cgPiAubmF2LXRhYnMgPiBsaSA+IGEgeworICAtd2Via2l0LWJv cmRlci1yYWRpdXM6IDAgMCA0cHggNHB4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDAgMCA0 cHggNHB4OworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4OworfQorCisudGFi cy1iZWxvdyA+IC5uYXYtdGFicyA+IGxpID4gYTpob3ZlciwKKy50YWJzLWJlbG93ID4gLm5hdi10 YWJzID4gbGkgPiBhOmZvY3VzIHsKKyAgYm9yZGVyLXRvcC1jb2xvcjogI2RkZDsKKyAgYm9yZGVy LWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7Cit9CisKKy50YWJzLWJlbG93ID4gLm5hdi10YWJz ID4gLmFjdGl2ZSA+IGEsCisudGFicy1iZWxvdyA+IC5uYXYtdGFicyA+IC5hY3RpdmUgPiBhOmhv dmVyLAorLnRhYnMtYmVsb3cgPiAubmF2LXRhYnMgPiAuYWN0aXZlID4gYTpmb2N1cyB7CisgIGJv cmRlci1jb2xvcjogdHJhbnNwYXJlbnQgI2RkZCAjZGRkICNkZGQ7Cit9CisKKy50YWJzLWxlZnQg PiAubmF2LXRhYnMgPiBsaSwKKy50YWJzLXJpZ2h0ID4gLm5hdi10YWJzID4gbGkgeworICBmbG9h dDogbm9uZTsKK30KKworLnRhYnMtbGVmdCA+IC5uYXYtdGFicyA+IGxpID4gYSwKKy50YWJzLXJp Z2h0ID4gLm5hdi10YWJzID4gbGkgPiBhIHsKKyAgbWluLXdpZHRoOiA3NHB4OworICBtYXJnaW4t cmlnaHQ6IDA7CisgIG1hcmdpbi1ib3R0b206IDNweDsKK30KKworLnRhYnMtbGVmdCA+IC5uYXYt dGFicyB7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW4tcmlnaHQ6IDE5cHg7CisgIGJvcmRlci1y aWdodDogMXB4IHNvbGlkICNkZGQ7Cit9CisKKy50YWJzLWxlZnQgPiAubmF2LXRhYnMgPiBsaSA+ IGEgeworICBtYXJnaW4tcmlnaHQ6IC0xcHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4 IDAgMCA0cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4IDAgMCA0cHg7CisgICAgICAg ICAgYm9yZGVyLXJhZGl1czogNHB4IDAgMCA0cHg7Cit9CisKKy50YWJzLWxlZnQgPiAubmF2LXRh YnMgPiBsaSA+IGE6aG92ZXIsCisudGFicy1sZWZ0ID4gLm5hdi10YWJzID4gbGkgPiBhOmZvY3Vz IHsKKyAgYm9yZGVyLWNvbG9yOiAjZWVlZWVlICNkZGRkZGQgI2VlZWVlZSAjZWVlZWVlOworfQor CisudGFicy1sZWZ0ID4gLm5hdi10YWJzIC5hY3RpdmUgPiBhLAorLnRhYnMtbGVmdCA+IC5uYXYt dGFicyAuYWN0aXZlID4gYTpob3ZlciwKKy50YWJzLWxlZnQgPiAubmF2LXRhYnMgLmFjdGl2ZSA+ IGE6Zm9jdXMgeworICBib3JkZXItY29sb3I6ICNkZGQgdHJhbnNwYXJlbnQgI2RkZCAjZGRkOwor ICAqYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZmZmZmZmOworfQorCisudGFicy1yaWdodCA+IC5uYXYt dGFicyB7CisgIGZsb2F0OiByaWdodDsKKyAgbWFyZ2luLWxlZnQ6IDE5cHg7CisgIGJvcmRlci1s ZWZ0OiAxcHggc29saWQgI2RkZDsKK30KKworLnRhYnMtcmlnaHQgPiAubmF2LXRhYnMgPiBsaSA+ IGEgeworICBtYXJnaW4tbGVmdDogLTFweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwIDRw eCA0cHggMDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsKKyAgICAgICAg ICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsKK30KKworLnRhYnMtcmlnaHQgPiAubmF2LXRh YnMgPiBsaSA+IGE6aG92ZXIsCisudGFicy1yaWdodCA+IC5uYXYtdGFicyA+IGxpID4gYTpmb2N1 cyB7CisgIGJvcmRlci1jb2xvcjogI2VlZWVlZSAjZWVlZWVlICNlZWVlZWUgI2RkZGRkZDsKK30K KworLnRhYnMtcmlnaHQgPiAubmF2LXRhYnMgLmFjdGl2ZSA+IGEsCisudGFicy1yaWdodCA+IC5u YXYtdGFicyAuYWN0aXZlID4gYTpob3ZlciwKKy50YWJzLXJpZ2h0ID4gLm5hdi10YWJzIC5hY3Rp dmUgPiBhOmZvY3VzIHsKKyAgYm9yZGVyLWNvbG9yOiAjZGRkICNkZGQgI2RkZCB0cmFuc3BhcmVu dDsKKyAgKmJvcmRlci1sZWZ0LWNvbG9yOiAjZmZmZmZmOworfQorCisubmF2ID4gLmRpc2FibGVk ID4gYSB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorCisubmF2ID4gLmRpc2FibGVkID4gYTpob3Zl ciwKKy5uYXYgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25l OworICBjdXJzb3I6IGRlZmF1bHQ7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owor fQorCisubmF2YmFyIHsKKyAgKnBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgKnotaW5kZXg6IDI7Cisg IG1hcmdpbi1ib3R0b206IDIwcHg7CisgIG92ZXJmbG93OiB2aXNpYmxlOworfQorCisubmF2YmFy LWlubmVyIHsKKyAgbWluLWhlaWdodDogNDBweDsKKyAgcGFkZGluZy1yaWdodDogMjBweDsKKyAg cGFkZGluZy1sZWZ0OiAyMHB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOworICBiYWNr Z3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNmMmYyZjIp OworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCAwLCAwIDEw MCUsIGZyb20oI2ZmZmZmZiksIHRvKCNmMmYyZjIpKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdl YmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZjJmMmYyKTsKKyAgYmFja2dyb3Vu ZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmZmZmZiwgI2YyZjJmMik7CisgIGJh Y2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmZmZmZmYsICNmMmYy ZjIpOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisgIGJvcmRlcjogMXB4IHNvbGlk ICNkNGQ0ZDQ7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OworICAgICAtbW96LWJvcmRl ci1yYWRpdXM6IDRweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgIGZpbHRlcjog cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9 JyNmZmZmZmZmZicsIGVuZENvbG9yc3RyPScjZmZmMmYyZjInLCBHcmFkaWVudFR5cGU9MCk7Cisg ICp6b29tOiAxOworICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAs IDAuMDY1KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAw LjA2NSk7CisgICAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgMC4w NjUpOworfQorCisubmF2YmFyLWlubmVyOmJlZm9yZSwKKy5uYXZiYXItaW5uZXI6YWZ0ZXIgewor ICBkaXNwbGF5OiB0YWJsZTsKKyAgbGluZS1oZWlnaHQ6IDA7CisgIGNvbnRlbnQ6ICIiOworfQor CisubmF2YmFyLWlubmVyOmFmdGVyIHsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy5uYXZiYXIgLmNv bnRhaW5lciB7CisgIHdpZHRoOiBhdXRvOworfQorCisubmF2LWNvbGxhcHNlLmNvbGxhcHNlIHsK KyAgaGVpZ2h0OiBhdXRvOworICBvdmVyZmxvdzogdmlzaWJsZTsKK30KKworLm5hdmJhciAuYnJh bmQgeworICBkaXNwbGF5OiBibG9jazsKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmc6IDEwcHgg MjBweCAxMHB4OworICBtYXJnaW4tbGVmdDogLTIwcHg7CisgIGZvbnQtc2l6ZTogMjBweDsKKyAg Zm9udC13ZWlnaHQ6IDIwMDsKKyAgY29sb3I6ICM3Nzc3Nzc7CisgIHRleHQtc2hhZG93OiAwIDFw eCAwICNmZmZmZmY7Cit9CisKKy5uYXZiYXIgLmJyYW5kOmhvdmVyLAorLm5hdmJhciAuYnJhbmQ6 Zm9jdXMgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy5uYXZiYXItdGV4dCB7Cisg IG1hcmdpbi1ib3R0b206IDA7CisgIGxpbmUtaGVpZ2h0OiA0MHB4OworICBjb2xvcjogIzc3Nzc3 NzsKK30KKworLm5hdmJhci1saW5rIHsKKyAgY29sb3I6ICM3Nzc3Nzc7Cit9CisKKy5uYXZiYXIt bGluazpob3ZlciwKKy5uYXZiYXItbGluazpmb2N1cyB7CisgIGNvbG9yOiAjMzMzMzMzOworfQor CisubmF2YmFyIC5kaXZpZGVyLXZlcnRpY2FsIHsKKyAgaGVpZ2h0OiA0MHB4OworICBtYXJnaW46 IDAgOXB4OworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZmZmZmZmOworICBib3JkZXItbGVm dDogMXB4IHNvbGlkICNmMmYyZjI7Cit9CisKKy5uYXZiYXIgLmJ0biwKKy5uYXZiYXIgLmJ0bi1n cm91cCB7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKworLm5hdmJhciAuYnRuLWdyb3VwIC5idG4s CisubmF2YmFyIC5pbnB1dC1wcmVwZW5kIC5idG4sCisubmF2YmFyIC5pbnB1dC1hcHBlbmQgLmJ0 biwKKy5uYXZiYXIgLmlucHV0LXByZXBlbmQgLmJ0bi1ncm91cCwKKy5uYXZiYXIgLmlucHV0LWFw cGVuZCAuYnRuLWdyb3VwIHsKKyAgbWFyZ2luLXRvcDogMDsKK30KKworLm5hdmJhci1mb3JtIHsK KyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgKnpvb206IDE7Cit9CisKKy5uYXZiYXItZm9ybTpiZWZv cmUsCisubmF2YmFyLWZvcm06YWZ0ZXIgeworICBkaXNwbGF5OiB0YWJsZTsKKyAgbGluZS1oZWln aHQ6IDA7CisgIGNvbnRlbnQ6ICIiOworfQorCisubmF2YmFyLWZvcm06YWZ0ZXIgeworICBjbGVh cjogYm90aDsKK30KKworLm5hdmJhci1mb3JtIGlucHV0LAorLm5hdmJhci1mb3JtIHNlbGVjdCwK Ky5uYXZiYXItZm9ybSAucmFkaW8sCisubmF2YmFyLWZvcm0gLmNoZWNrYm94IHsKKyAgbWFyZ2lu LXRvcDogNXB4OworfQorCisubmF2YmFyLWZvcm0gaW5wdXQsCisubmF2YmFyLWZvcm0gc2VsZWN0 LAorLm5hdmJhci1mb3JtIC5idG4geworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIG1hcmdp bi1ib3R0b206IDA7Cit9CisKKy5uYXZiYXItZm9ybSBpbnB1dFt0eXBlPSJpbWFnZSJdLAorLm5h dmJhci1mb3JtIGlucHV0W3R5cGU9ImNoZWNrYm94Il0sCisubmF2YmFyLWZvcm0gaW5wdXRbdHlw ZT0icmFkaW8iXSB7CisgIG1hcmdpbi10b3A6IDNweDsKK30KKworLm5hdmJhci1mb3JtIC5pbnB1 dC1hcHBlbmQsCisubmF2YmFyLWZvcm0gLmlucHV0LXByZXBlbmQgeworICBtYXJnaW4tdG9wOiA1 cHg7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5uYXZiYXItZm9ybSAuaW5wdXQtYXBw ZW5kIGlucHV0LAorLm5hdmJhci1mb3JtIC5pbnB1dC1wcmVwZW5kIGlucHV0IHsKKyAgbWFyZ2lu LXRvcDogMDsKK30KKworLm5hdmJhci1zZWFyY2ggeworICBwb3NpdGlvbjogcmVsYXRpdmU7Cisg IGZsb2F0OiBsZWZ0OworICBtYXJnaW4tdG9wOiA1cHg7CisgIG1hcmdpbi1ib3R0b206IDA7Cit9 CisKKy5uYXZiYXItc2VhcmNoIC5zZWFyY2gtcXVlcnkgeworICBwYWRkaW5nOiA0cHggMTRweDsK KyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhl bHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTNweDsKKyAgZm9udC13 ZWlnaHQ6IG5vcm1hbDsKKyAgbGluZS1oZWlnaHQ6IDE7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1 czogMTVweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAxNXB4OworICAgICAgICAgIGJvcmRl ci1yYWRpdXM6IDE1cHg7Cit9CisKKy5uYXZiYXItc3RhdGljLXRvcCB7CisgIHBvc2l0aW9uOiBz dGF0aWM7CisgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5uYXZiYXItc3RhdGljLXRvcCAubmF2 YmFyLWlubmVyIHsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOworICAgICAtbW96LWJvcmRl ci1yYWRpdXM6IDA7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKK30KKworLm5hdmJhci1m aXhlZC10b3AsCisubmF2YmFyLWZpeGVkLWJvdHRvbSB7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAg cmlnaHQ6IDA7CisgIGxlZnQ6IDA7CisgIHotaW5kZXg6IDEwMzA7CisgIG1hcmdpbi1ib3R0b206 IDA7Cit9CisKKy5uYXZiYXItZml4ZWQtdG9wIC5uYXZiYXItaW5uZXIsCisubmF2YmFyLXN0YXRp Yy10b3AgLm5hdmJhci1pbm5lciB7CisgIGJvcmRlci13aWR0aDogMCAwIDFweDsKK30KKworLm5h dmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1pbm5lciB7CisgIGJvcmRlci13aWR0aDogMXB4IDAg MDsKK30KKworLm5hdmJhci1maXhlZC10b3AgLm5hdmJhci1pbm5lciwKKy5uYXZiYXItZml4ZWQt Ym90dG9tIC5uYXZiYXItaW5uZXIgeworICBwYWRkaW5nLXJpZ2h0OiAwOworICBwYWRkaW5nLWxl ZnQ6IDA7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKKyAgICAgLW1vei1ib3JkZXItcmFk aXVzOiAwOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7Cit9CisKKy5uYXZiYXItc3RhdGlj LXRvcCAuY29udGFpbmVyLAorLm5hdmJhci1maXhlZC10b3AgLmNvbnRhaW5lciwKKy5uYXZiYXIt Zml4ZWQtYm90dG9tIC5jb250YWluZXIgeworICB3aWR0aDogOTQwcHg7Cit9CisKKy5uYXZiYXIt Zml4ZWQtdG9wIHsKKyAgdG9wOiAwOworfQorCisubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWlu bmVyLAorLm5hdmJhci1zdGF0aWMtdG9wIC5uYXZiYXItaW5uZXIgeworICAtd2Via2l0LWJveC1z aGFkb3c6IDAgMXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjEpOworICAgICAtbW96LWJveC1zaGFk b3c6IDAgMXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjEpOworICAgICAgICAgIGJveC1zaGFkb3c6 IDAgMXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjEpOworfQorCisubmF2YmFyLWZpeGVkLWJvdHRv bSB7CisgIGJvdHRvbTogMDsKK30KKworLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1pbm5l ciB7CisgIC13ZWJraXQtYm94LXNoYWRvdzogMCAtMXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjEp OworICAgICAtbW96LWJveC1zaGFkb3c6IDAgLTFweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsK KyAgICAgICAgICBib3gtc2hhZG93OiAwIC0xcHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMSk7Cit9 CisKKy5uYXZiYXIgLm5hdiB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbGVmdDogMDsKKyAg ZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW46IDAgMTBweCAwIDA7Cit9 CisKKy5uYXZiYXIgLm5hdi5wdWxsLXJpZ2h0IHsKKyAgZmxvYXQ6IHJpZ2h0OworICBtYXJnaW4t cmlnaHQ6IDA7Cit9CisKKy5uYXZiYXIgLm5hdiA+IGxpIHsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisK Ky5uYXZiYXIgLm5hdiA+IGxpID4gYSB7CisgIGZsb2F0OiBub25lOworICBwYWRkaW5nOiAxMHB4 IDE1cHggMTBweDsKKyAgY29sb3I6ICM3Nzc3Nzc7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsK KyAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZmZmZjsKK30KKworLm5hdmJhciAubmF2IC5kcm9w ZG93bi10b2dnbGUgLmNhcmV0IHsKKyAgbWFyZ2luLXRvcDogOHB4OworfQorCisubmF2YmFyIC5u YXYgPiBsaSA+IGE6Zm9jdXMsCisubmF2YmFyIC5uYXYgPiBsaSA+IGE6aG92ZXIgeworICBjb2xv cjogIzMzMzMzMzsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBiYWNrZ3JvdW5kLWNvbG9y OiB0cmFuc3BhcmVudDsKK30KKworLm5hdmJhciAubmF2ID4gLmFjdGl2ZSA+IGEsCisubmF2YmFy IC5uYXYgPiAuYWN0aXZlID4gYTpob3ZlciwKKy5uYXZiYXIgLm5hdiA+IC5hY3RpdmUgPiBhOmZv Y3VzIHsKKyAgY29sb3I6ICM1NTU1NTU7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgYmFj a2dyb3VuZC1jb2xvcjogI2U1ZTVlNTsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDNw eCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyNSk7CisgICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQg MCAzcHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMjUpOworICAgICAgICAgIGJveC1zaGFkb3c6IGlu c2V0IDAgM3B4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTI1KTsKK30KKworLm5hdmJhciAuYnRuLW5h dmJhciB7CisgIGRpc3BsYXk6IG5vbmU7CisgIGZsb2F0OiByaWdodDsKKyAgcGFkZGluZzogN3B4 IDEwcHg7CisgIG1hcmdpbi1yaWdodDogNXB4OworICBtYXJnaW4tbGVmdDogNXB4OworICBjb2xv cjogI2ZmZmZmZjsKKyAgdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7 CisgIGJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7CisgICpiYWNrZ3JvdW5kLWNvbG9yOiAjZTVl NWU1OworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmMmYy ZjIsICNlNWU1ZTUpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVh ciwgMCAwLCAwIDEwMCUsIGZyb20oI2YyZjJmMiksIHRvKCNlNWU1ZTUpKTsKKyAgYmFja2dyb3Vu ZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZjJmMmYyLCAjZTVlNWU1KTsK KyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2YyZjJmMiwgI2U1 ZTVlNSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNm MmYyZjIsICNlNWU1ZTUpOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisgIGJvcmRl ci1jb2xvcjogI2U1ZTVlNSAjZTVlNWU1ICNiZmJmYmY7CisgIGJvcmRlci1jb2xvcjogcmdiYSgw LCAwLCAwLCAwLjEpIHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMjUpOworICBm aWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENv bG9yc3RyPScjZmZmMmYyZjInLCBlbmRDb2xvcnN0cj0nI2ZmZTVlNWU1JywgR3JhZGllbnRUeXBl PTApOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVu dChlbmFibGVkPWZhbHNlKTsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJn YmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDc1 KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1 NSwgMC4xKSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDc1KTsKKyAgICAgICAgICBi b3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgMCAxcHgg MCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDc1KTsKK30KKworLm5hdmJhciAuYnRuLW5hdmJhcjpo b3ZlciwKKy5uYXZiYXIgLmJ0bi1uYXZiYXI6Zm9jdXMsCisubmF2YmFyIC5idG4tbmF2YmFyOmFj dGl2ZSwKKy5uYXZiYXIgLmJ0bi1uYXZiYXIuYWN0aXZlLAorLm5hdmJhciAuYnRuLW5hdmJhci5k aXNhYmxlZCwKKy5uYXZiYXIgLmJ0bi1uYXZiYXJbZGlzYWJsZWRdIHsKKyAgY29sb3I6ICNmZmZm ZmY7CisgIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7CisgICpiYWNrZ3JvdW5kLWNvbG9yOiAj ZDlkOWQ5OworfQorCisubmF2YmFyIC5idG4tbmF2YmFyOmFjdGl2ZSwKKy5uYXZiYXIgLmJ0bi1u YXZiYXIuYWN0aXZlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYyBcOTsKK30KKworLm5h dmJhciAuYnRuLW5hdmJhciAuaWNvbi1iYXIgeworICBkaXNwbGF5OiBibG9jazsKKyAgd2lkdGg6 IDE4cHg7CisgIGhlaWdodDogMnB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OworICAt d2Via2l0LWJvcmRlci1yYWRpdXM6IDFweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAxcHg7 CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OworICAtd2Via2l0LWJveC1zaGFkb3c6IDAg MXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAw IHJnYmEoMCwgMCwgMCwgMC4yNSk7CisgICAgICAgICAgYm94LXNoYWRvdzogMCAxcHggMCByZ2Jh KDAsIDAsIDAsIDAuMjUpOworfQorCisuYnRuLW5hdmJhciAuaWNvbi1iYXIgKyAuaWNvbi1iYXIg eworICBtYXJnaW4tdG9wOiAzcHg7Cit9CisKKy5uYXZiYXIgLm5hdiA+IGxpID4gLmRyb3Bkb3du LW1lbnU6YmVmb3JlIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC03cHg7CisgIGxl ZnQ6IDlweDsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBib3JkZXItcmlnaHQ6IDdweCBz b2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLWJvdHRvbTogN3B4IHNvbGlkICNjY2M7CisgIGJv cmRlci1sZWZ0OiA3cHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci1ib3R0b20tY29sb3I6 IHJnYmEoMCwgMCwgMCwgMC4yKTsKKyAgY29udGVudDogJyc7Cit9CisKKy5uYXZiYXIgLm5hdiA+ IGxpID4gLmRyb3Bkb3duLW1lbnU6YWZ0ZXIgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRv cDogLTZweDsKKyAgbGVmdDogMTBweDsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBib3Jk ZXItcmlnaHQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLWJvdHRvbTogNnB4IHNv bGlkICNmZmZmZmY7CisgIGJvcmRlci1sZWZ0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGNv bnRlbnQ6ICcnOworfQorCisubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2ID4gbGkgPiAuZHJvcGRv d24tbWVudTpiZWZvcmUgeworICB0b3A6IGF1dG87CisgIGJvdHRvbTogLTdweDsKKyAgYm9yZGVy LXRvcDogN3B4IHNvbGlkICNjY2M7CisgIGJvcmRlci1ib3R0b206IDA7CisgIGJvcmRlci10b3At Y29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTsKK30KKworLm5hdmJhci1maXhlZC1ib3R0b20gLm5h diA+IGxpID4gLmRyb3Bkb3duLW1lbnU6YWZ0ZXIgeworICB0b3A6IGF1dG87CisgIGJvdHRvbTog LTZweDsKKyAgYm9yZGVyLXRvcDogNnB4IHNvbGlkICNmZmZmZmY7CisgIGJvcmRlci1ib3R0b206 IDA7Cit9CisKKy5uYXZiYXIgLm5hdiBsaS5kcm9wZG93biA+IGE6aG92ZXIgLmNhcmV0LAorLm5h dmJhciAubmF2IGxpLmRyb3Bkb3duID4gYTpmb2N1cyAuY2FyZXQgeworICBib3JkZXItdG9wLWNv bG9yOiAjMzMzMzMzOworICBib3JkZXItYm90dG9tLWNvbG9yOiAjMzMzMzMzOworfQorCisubmF2 YmFyIC5uYXYgbGkuZHJvcGRvd24ub3BlbiA+IC5kcm9wZG93bi10b2dnbGUsCisubmF2YmFyIC5u YXYgbGkuZHJvcGRvd24uYWN0aXZlID4gLmRyb3Bkb3duLXRvZ2dsZSwKKy5uYXZiYXIgLm5hdiBs aS5kcm9wZG93bi5vcGVuLmFjdGl2ZSA+IC5kcm9wZG93bi10b2dnbGUgeworICBjb2xvcjogIzU1 NTU1NTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2U1ZTVlNTsKK30KKworLm5hdmJhciAubmF2IGxp LmRyb3Bkb3duID4gLmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXQgeworICBib3JkZXItdG9wLWNvbG9y OiAjNzc3Nzc3OworICBib3JkZXItYm90dG9tLWNvbG9yOiAjNzc3Nzc3OworfQorCisubmF2YmFy IC5uYXYgbGkuZHJvcGRvd24ub3BlbiA+IC5kcm9wZG93bi10b2dnbGUgLmNhcmV0LAorLm5hdmJh ciAubmF2IGxpLmRyb3Bkb3duLmFjdGl2ZSA+IC5kcm9wZG93bi10b2dnbGUgLmNhcmV0LAorLm5h dmJhciAubmF2IGxpLmRyb3Bkb3duLm9wZW4uYWN0aXZlID4gLmRyb3Bkb3duLXRvZ2dsZSAuY2Fy ZXQgeworICBib3JkZXItdG9wLWNvbG9yOiAjNTU1NTU1OworICBib3JkZXItYm90dG9tLWNvbG9y OiAjNTU1NTU1OworfQorCisubmF2YmFyIC5wdWxsLXJpZ2h0ID4gbGkgPiAuZHJvcGRvd24tbWVu dSwKKy5uYXZiYXIgLm5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUucHVsbC1yaWdodCB7CisgIHJp Z2h0OiAwOworICBsZWZ0OiBhdXRvOworfQorCisubmF2YmFyIC5wdWxsLXJpZ2h0ID4gbGkgPiAu ZHJvcGRvd24tbWVudTpiZWZvcmUsCisubmF2YmFyIC5uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51 LnB1bGwtcmlnaHQ6YmVmb3JlIHsKKyAgcmlnaHQ6IDEycHg7CisgIGxlZnQ6IGF1dG87Cit9CisK Ky5uYXZiYXIgLnB1bGwtcmlnaHQgPiBsaSA+IC5kcm9wZG93bi1tZW51OmFmdGVyLAorLm5hdmJh ciAubmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudS5wdWxsLXJpZ2h0OmFmdGVyIHsKKyAgcmlnaHQ6 IDEzcHg7CisgIGxlZnQ6IGF1dG87Cit9CisKKy5uYXZiYXIgLnB1bGwtcmlnaHQgPiBsaSA+IC5k cm9wZG93bi1tZW51IC5kcm9wZG93bi1tZW51LAorLm5hdmJhciAubmF2ID4gbGkgPiAuZHJvcGRv d24tbWVudS5wdWxsLXJpZ2h0IC5kcm9wZG93bi1tZW51IHsKKyAgcmlnaHQ6IDEwMCU7CisgIGxl ZnQ6IGF1dG87CisgIG1hcmdpbi1yaWdodDogLTFweDsKKyAgbWFyZ2luLWxlZnQ6IDA7CisgIC13 ZWJraXQtYm9yZGVyLXJhZGl1czogNnB4IDAgNnB4IDZweDsKKyAgICAgLW1vei1ib3JkZXItcmFk aXVzOiA2cHggMCA2cHggNnB4OworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweCAwIDZweCA2 cHg7Cit9CisKKy5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWlubmVyIHsKKyAgYmFja2dyb3VuZC1j b2xvcjogIzFiMWIxYjsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQo dG9wLCAjMjIyMjIyLCAjMTExMTExKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFk aWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCMyMjIyMjIpLCB0bygjMTExMTExKSk7Cisg IGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzIyMjIyMiwg IzExMTExMSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMy MjIyMjIsICMxMTExMTEpOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8g Ym90dG9tLCAjMjIyMjIyLCAjMTExMTExKTsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14 OworICBib3JkZXItY29sb3I6ICMyNTI1MjU7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFu c2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjIyMjIyMicsIGVuZENv bG9yc3RyPScjZmYxMTExMTEnLCBHcmFkaWVudFR5cGU9MCk7Cit9CisKKy5uYXZiYXItaW52ZXJz ZSAuYnJhbmQsCisubmF2YmFyLWludmVyc2UgLm5hdiA+IGxpID4gYSB7CisgIGNvbG9yOiAjOTk5 OTk5OworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTsKK30KKwor Lm5hdmJhci1pbnZlcnNlIC5icmFuZDpob3ZlciwKKy5uYXZiYXItaW52ZXJzZSAubmF2ID4gbGkg PiBhOmhvdmVyLAorLm5hdmJhci1pbnZlcnNlIC5icmFuZDpmb2N1cywKKy5uYXZiYXItaW52ZXJz ZSAubmF2ID4gbGkgPiBhOmZvY3VzIHsKKyAgY29sb3I6ICNmZmZmZmY7Cit9CisKKy5uYXZiYXIt aW52ZXJzZSAuYnJhbmQgeworICBjb2xvcjogIzk5OTk5OTsKK30KKworLm5hdmJhci1pbnZlcnNl IC5uYXZiYXItdGV4dCB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorCisubmF2YmFyLWludmVyc2Ug Lm5hdiA+IGxpID4gYTpmb2N1cywKKy5uYXZiYXItaW52ZXJzZSAubmF2ID4gbGkgPiBhOmhvdmVy IHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owor fQorCisubmF2YmFyLWludmVyc2UgLm5hdiAuYWN0aXZlID4gYSwKKy5uYXZiYXItaW52ZXJzZSAu bmF2IC5hY3RpdmUgPiBhOmhvdmVyLAorLm5hdmJhci1pbnZlcnNlIC5uYXYgLmFjdGl2ZSA+IGE6 Zm9jdXMgeworICBjb2xvcjogI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzExMTExMTsK K30KKworLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGluayB7CisgIGNvbG9yOiAjOTk5OTk5Owor fQorCisubmF2YmFyLWludmVyc2UgLm5hdmJhci1saW5rOmhvdmVyLAorLm5hdmJhci1pbnZlcnNl IC5uYXZiYXItbGluazpmb2N1cyB7CisgIGNvbG9yOiAjZmZmZmZmOworfQorCisubmF2YmFyLWlu dmVyc2UgLmRpdmlkZXItdmVydGljYWwgeworICBib3JkZXItcmlnaHQtY29sb3I6ICMyMjIyMjI7 CisgIGJvcmRlci1sZWZ0LWNvbG9yOiAjMTExMTExOworfQorCisubmF2YmFyLWludmVyc2UgLm5h diBsaS5kcm9wZG93bi5vcGVuID4gLmRyb3Bkb3duLXRvZ2dsZSwKKy5uYXZiYXItaW52ZXJzZSAu bmF2IGxpLmRyb3Bkb3duLmFjdGl2ZSA+IC5kcm9wZG93bi10b2dnbGUsCisubmF2YmFyLWludmVy c2UgLm5hdiBsaS5kcm9wZG93bi5vcGVuLmFjdGl2ZSA+IC5kcm9wZG93bi10b2dnbGUgeworICBj b2xvcjogI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzExMTExMTsKK30KKworLm5hdmJh ci1pbnZlcnNlIC5uYXYgbGkuZHJvcGRvd24gPiBhOmhvdmVyIC5jYXJldCwKKy5uYXZiYXItaW52 ZXJzZSAubmF2IGxpLmRyb3Bkb3duID4gYTpmb2N1cyAuY2FyZXQgeworICBib3JkZXItdG9wLWNv bG9yOiAjZmZmZmZmOworICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmZmZmZmOworfQorCisubmF2 YmFyLWludmVyc2UgLm5hdiBsaS5kcm9wZG93biA+IC5kcm9wZG93bi10b2dnbGUgLmNhcmV0IHsK KyAgYm9yZGVyLXRvcC1jb2xvcjogIzk5OTk5OTsKKyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzk5 OTk5OTsKK30KKworLm5hdmJhci1pbnZlcnNlIC5uYXYgbGkuZHJvcGRvd24ub3BlbiA+IC5kcm9w ZG93bi10b2dnbGUgLmNhcmV0LAorLm5hdmJhci1pbnZlcnNlIC5uYXYgbGkuZHJvcGRvd24uYWN0 aXZlID4gLmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXQsCisubmF2YmFyLWludmVyc2UgLm5hdiBsaS5k cm9wZG93bi5vcGVuLmFjdGl2ZSA+IC5kcm9wZG93bi10b2dnbGUgLmNhcmV0IHsKKyAgYm9yZGVy LXRvcC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ZmZmZmZjsKK30K KworLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItc2VhcmNoIC5zZWFyY2gtcXVlcnkgeworICBjb2xv cjogI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzUxNTE1MTsKKyAgYm9yZGVyLWNvbG9y OiAjMTExMTExOworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAs IDAsIDAsIDAuMSksIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKKyAgICAgLW1v ei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAw IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CisgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQg MCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUs IDAuMTUpOworICAtd2Via2l0LXRyYW5zaXRpb246IG5vbmU7CisgICAgIC1tb3otdHJhbnNpdGlv bjogbm9uZTsKKyAgICAgICAtby10cmFuc2l0aW9uOiBub25lOworICAgICAgICAgIHRyYW5zaXRp b246IG5vbmU7Cit9CisKKy5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJjaCAuc2VhcmNoLXF1 ZXJ5Oi1tb3otcGxhY2Vob2xkZXIgeworICBjb2xvcjogI2NjY2NjYzsKK30KKworLm5hdmJhci1p bnZlcnNlIC5uYXZiYXItc2VhcmNoIC5zZWFyY2gtcXVlcnk6LW1zLWlucHV0LXBsYWNlaG9sZGVy IHsKKyAgY29sb3I6ICNjY2NjY2M7Cit9CisKKy5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJj aCAuc2VhcmNoLXF1ZXJ5Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKKyAgY29sb3I6ICNj Y2NjY2M7Cit9CisKKy5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJjaCAuc2VhcmNoLXF1ZXJ5 OmZvY3VzLAorLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItc2VhcmNoIC5zZWFyY2gtcXVlcnkuZm9j dXNlZCB7CisgIHBhZGRpbmc6IDVweCAxNXB4OworICBjb2xvcjogIzMzMzMzMzsKKyAgdGV4dC1z aGFkb3c6IDAgMXB4IDAgI2ZmZmZmZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAg Ym9yZGVyOiAwOworICBvdXRsaW5lOiAwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAzcHgg cmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgLW1vei1ib3gtc2hhZG93OiAwIDAgM3B4IHJnYmEo MCwgMCwgMCwgMC4xNSk7CisgICAgICAgICAgYm94LXNoYWRvdzogMCAwIDNweCByZ2JhKDAsIDAs IDAsIDAuMTUpOworfQorCisubmF2YmFyLWludmVyc2UgLmJ0bi1uYXZiYXIgeworICBjb2xvcjog I2ZmZmZmZjsKKyAgdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7Cisg IGJhY2tncm91bmQtY29sb3I6ICMwZTBlMGU7CisgICpiYWNrZ3JvdW5kLWNvbG9yOiAjMDQwNDA0 OworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICMxNTE1MTUs ICMwNDA0MDQpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwg MCAwLCAwIDEwMCUsIGZyb20oIzE1MTUxNSksIHRvKCMwNDA0MDQpKTsKKyAgYmFja2dyb3VuZC1p bWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjMTUxNTE1LCAjMDQwNDA0KTsKKyAg YmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzE1MTUxNSwgIzA0MDQw NCk7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMxNTE1 MTUsICMwNDA0MDQpOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisgIGJvcmRlci1j b2xvcjogIzA0MDQwNCAjMDQwNDA0ICMwMDAwMDA7CisgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAw LCAwLCAwLjEpIHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMjUpOworICBmaWx0 ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9y c3RyPScjZmYxNTE1MTUnLCBlbmRDb2xvcnN0cj0nI2ZmMDQwNDA0JywgR3JhZGllbnRUeXBlPTAp OworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChl bmFibGVkPWZhbHNlKTsKK30KKworLm5hdmJhci1pbnZlcnNlIC5idG4tbmF2YmFyOmhvdmVyLAor Lm5hdmJhci1pbnZlcnNlIC5idG4tbmF2YmFyOmZvY3VzLAorLm5hdmJhci1pbnZlcnNlIC5idG4t bmF2YmFyOmFjdGl2ZSwKKy5uYXZiYXItaW52ZXJzZSAuYnRuLW5hdmJhci5hY3RpdmUsCisubmF2 YmFyLWludmVyc2UgLmJ0bi1uYXZiYXIuZGlzYWJsZWQsCisubmF2YmFyLWludmVyc2UgLmJ0bi1u YXZiYXJbZGlzYWJsZWRdIHsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGJhY2tncm91bmQtY29sb3I6 ICMwNDA0MDQ7CisgICpiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOworfQorCisubmF2YmFyLWlu dmVyc2UgLmJ0bi1uYXZiYXI6YWN0aXZlLAorLm5hdmJhci1pbnZlcnNlIC5idG4tbmF2YmFyLmFj dGl2ZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDAgXDk7Cit9CisKKy5icmVhZGNydW1i IHsKKyAgcGFkZGluZzogOHB4IDE1cHg7CisgIG1hcmdpbjogMCAwIDIwcHg7CisgIGxpc3Qtc3R5 bGU6IG5vbmU7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CisgIC13ZWJraXQtYm9yZGVy LXJhZGl1czogNHB4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgICBi b3JkZXItcmFkaXVzOiA0cHg7Cit9CisKKy5icmVhZGNydW1iID4gbGkgeworICBkaXNwbGF5OiBp bmxpbmUtYmxvY2s7CisgICpkaXNwbGF5OiBpbmxpbmU7CisgIHRleHQtc2hhZG93OiAwIDFweCAw ICNmZmZmZmY7CisgICp6b29tOiAxOworfQorCisuYnJlYWRjcnVtYiA+IGxpID4gLmRpdmlkZXIg eworICBwYWRkaW5nOiAwIDVweDsKKyAgY29sb3I6ICNjY2M7Cit9CisKKy5icmVhZGNydW1iID4g LmFjdGl2ZSB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorCisucGFnaW5hdGlvbiB7CisgIG1hcmdp bjogMjBweCAwOworfQorCisucGFnaW5hdGlvbiB1bCB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9j azsKKyAgKmRpc3BsYXk6IGlubGluZTsKKyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgbWFyZ2luLWxl ZnQ6IDA7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OworICAgICAtbW96LWJvcmRlci1y YWRpdXM6IDRweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICp6b29tOiAxOwor ICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOworICAg ICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOworICAgICAg ICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOworfQorCisucGFn aW5hdGlvbiB1bCA+IGxpIHsKKyAgZGlzcGxheTogaW5saW5lOworfQorCisucGFnaW5hdGlvbiB1 bCA+IGxpID4gYSwKKy5wYWdpbmF0aW9uIHVsID4gbGkgPiBzcGFuIHsKKyAgZmxvYXQ6IGxlZnQ7 CisgIHBhZGRpbmc6IDRweCAxMnB4OworICBsaW5lLWhlaWdodDogMjBweDsKKyAgdGV4dC1kZWNv cmF0aW9uOiBub25lOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICBib3JkZXI6IDFw eCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItbGVmdC13aWR0aDogMDsKK30KKworLnBhZ2luYXRp b24gdWwgPiBsaSA+IGE6aG92ZXIsCisucGFnaW5hdGlvbiB1bCA+IGxpID4gYTpmb2N1cywKKy5w YWdpbmF0aW9uIHVsID4gLmFjdGl2ZSA+IGEsCisucGFnaW5hdGlvbiB1bCA+IC5hY3RpdmUgPiBz cGFuIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKK30KKworLnBhZ2luYXRpb24gdWwg PiAuYWN0aXZlID4gYSwKKy5wYWdpbmF0aW9uIHVsID4gLmFjdGl2ZSA+IHNwYW4geworICBjb2xv cjogIzk5OTk5OTsKKyAgY3Vyc29yOiBkZWZhdWx0OworfQorCisucGFnaW5hdGlvbiB1bCA+IC5k aXNhYmxlZCA+IHNwYW4sCisucGFnaW5hdGlvbiB1bCA+IC5kaXNhYmxlZCA+IGEsCisucGFnaW5h dGlvbiB1bCA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsCisucGFnaW5hdGlvbiB1bCA+IC5kaXNhYmxl ZCA+IGE6Zm9jdXMgeworICBjb2xvcjogIzk5OTk5OTsKKyAgY3Vyc29yOiBkZWZhdWx0OworICBi YWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKK30KKworLnBhZ2luYXRpb24gdWwgPiBsaTpm aXJzdC1jaGlsZCA+IGEsCisucGFnaW5hdGlvbiB1bCA+IGxpOmZpcnN0LWNoaWxkID4gc3BhbiB7 CisgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0 LXJhZGl1czogNHB4OworICAgICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsK KyAgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVy LXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDog NHB4OworICAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogNHB4OworfQorCisucGFnaW5hdGlv biB1bCA+IGxpOmxhc3QtY2hpbGQgPiBhLAorLnBhZ2luYXRpb24gdWwgPiBsaTpsYXN0LWNoaWxk ID4gc3BhbiB7CisgIC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAg ICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworICAtd2Via2l0LWJvcmRlci1ib3R0 b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRp dXM6IDRweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiA0cHg7CisgIC1tb3otYm9y ZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OworfQorCisucGFnaW5hdGlvbi1jZW50ZXJlZCB7 CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnBhZ2luYXRpb24tcmlnaHQgeworICB0ZXh0 LWFsaWduOiByaWdodDsKK30KKworLnBhZ2luYXRpb24tbGFyZ2UgdWwgPiBsaSA+IGEsCisucGFn aW5hdGlvbi1sYXJnZSB1bCA+IGxpID4gc3BhbiB7CisgIHBhZGRpbmc6IDExcHggMTlweDsKKyAg Zm9udC1zaXplOiAxNy41cHg7Cit9CisKKy5wYWdpbmF0aW9uLWxhcmdlIHVsID4gbGk6Zmlyc3Qt Y2hpbGQgPiBhLAorLnBhZ2luYXRpb24tbGFyZ2UgdWwgPiBsaTpmaXJzdC1jaGlsZCA+IHNwYW4g eworICAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgICAgICAgICBi b3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA2cHg7CisgIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0 LXJhZGl1czogNnB4OworICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDZweDsKKyAg LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDZweDsKKyAgLW1vei1ib3JkZXItcmFkaXVz LXRvcGxlZnQ6IDZweDsKK30KKworLnBhZ2luYXRpb24tbGFyZ2UgdWwgPiBsaTpsYXN0LWNoaWxk ID4gYSwKKy5wYWdpbmF0aW9uLWxhcmdlIHVsID4gbGk6bGFzdC1jaGlsZCA+IHNwYW4geworICAt d2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA2cHg7CisgICAgICAgICAgYm9yZGVyLXRv cC1yaWdodC1yYWRpdXM6IDZweDsKKyAgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1 czogNnB4OworICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA2cHg7CisgIC1t b3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNnB4OworICAtbW96LWJvcmRlci1yYWRpdXMtYm90 dG9tcmlnaHQ6IDZweDsKK30KKworLnBhZ2luYXRpb24tbWluaSB1bCA+IGxpOmZpcnN0LWNoaWxk ID4gYSwKKy5wYWdpbmF0aW9uLXNtYWxsIHVsID4gbGk6Zmlyc3QtY2hpbGQgPiBhLAorLnBhZ2lu YXRpb24tbWluaSB1bCA+IGxpOmZpcnN0LWNoaWxkID4gc3BhbiwKKy5wYWdpbmF0aW9uLXNtYWxs IHVsID4gbGk6Zmlyc3QtY2hpbGQgPiBzcGFuIHsKKyAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxl ZnQtcmFkaXVzOiAzcHg7CisgICAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4 OworICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsKKyAgICAgICAgICBib3Jk ZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0 OiAzcHg7CisgIC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAzcHg7Cit9CisKKy5wYWdpbmF0 aW9uLW1pbmkgdWwgPiBsaTpsYXN0LWNoaWxkID4gYSwKKy5wYWdpbmF0aW9uLXNtYWxsIHVsID4g bGk6bGFzdC1jaGlsZCA+IGEsCisucGFnaW5hdGlvbi1taW5pIHVsID4gbGk6bGFzdC1jaGlsZCA+ IHNwYW4sCisucGFnaW5hdGlvbi1zbWFsbCB1bCA+IGxpOmxhc3QtY2hpbGQgPiBzcGFuIHsKKyAg LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4OworICAgICAgICAgIGJvcmRlci10 b3AtcmlnaHQtcmFkaXVzOiAzcHg7CisgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRp dXM6IDNweDsKKyAgICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OworICAt bW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDNweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLWJv dHRvbXJpZ2h0OiAzcHg7Cit9CisKKy5wYWdpbmF0aW9uLXNtYWxsIHVsID4gbGkgPiBhLAorLnBh Z2luYXRpb24tc21hbGwgdWwgPiBsaSA+IHNwYW4geworICBwYWRkaW5nOiAycHggMTBweDsKKyAg Zm9udC1zaXplOiAxMS45cHg7Cit9CisKKy5wYWdpbmF0aW9uLW1pbmkgdWwgPiBsaSA+IGEsCisu cGFnaW5hdGlvbi1taW5pIHVsID4gbGkgPiBzcGFuIHsKKyAgcGFkZGluZzogMCA2cHg7CisgIGZv bnQtc2l6ZTogMTAuNXB4OworfQorCisucGFnZXIgeworICBtYXJnaW46IDIwcHggMDsKKyAgdGV4 dC1hbGlnbjogY2VudGVyOworICBsaXN0LXN0eWxlOiBub25lOworICAqem9vbTogMTsKK30KKwor LnBhZ2VyOmJlZm9yZSwKKy5wYWdlcjphZnRlciB7CisgIGRpc3BsYXk6IHRhYmxlOworICBsaW5l LWhlaWdodDogMDsKKyAgY29udGVudDogIiI7Cit9CisKKy5wYWdlcjphZnRlciB7CisgIGNsZWFy OiBib3RoOworfQorCisucGFnZXIgbGkgeworICBkaXNwbGF5OiBpbmxpbmU7Cit9CisKKy5wYWdl ciBsaSA+IGEsCisucGFnZXIgbGkgPiBzcGFuIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOwor ICBwYWRkaW5nOiA1cHggMTRweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgYm9yZGVy OiAxcHggc29saWQgI2RkZDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxNXB4OworICAgICAt bW96LWJvcmRlci1yYWRpdXM6IDE1cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTVweDsK K30KKworLnBhZ2VyIGxpID4gYTpob3ZlciwKKy5wYWdlciBsaSA+IGE6Zm9jdXMgeworICB0ZXh0 LWRlY29yYXRpb246IG5vbmU7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7Cit9CisKKy5w YWdlciAubmV4dCA+IGEsCisucGFnZXIgLm5leHQgPiBzcGFuIHsKKyAgZmxvYXQ6IHJpZ2h0Owor fQorCisucGFnZXIgLnByZXZpb3VzID4gYSwKKy5wYWdlciAucHJldmlvdXMgPiBzcGFuIHsKKyAg ZmxvYXQ6IGxlZnQ7Cit9CisKKy5wYWdlciAuZGlzYWJsZWQgPiBhLAorLnBhZ2VyIC5kaXNhYmxl ZCA+IGE6aG92ZXIsCisucGFnZXIgLmRpc2FibGVkID4gYTpmb2N1cywKKy5wYWdlciAuZGlzYWJs ZWQgPiBzcGFuIHsKKyAgY29sb3I6ICM5OTk5OTk7CisgIGN1cnNvcjogZGVmYXVsdDsKKyAgYmFj a2dyb3VuZC1jb2xvcjogI2ZmZjsKK30KKworLm1vZGFsLWJhY2tkcm9wIHsKKyAgcG9zaXRpb246 IGZpeGVkOworICB0b3A6IDA7CisgIHJpZ2h0OiAwOworICBib3R0b206IDA7CisgIGxlZnQ6IDA7 CisgIHotaW5kZXg6IDEwNDA7CisgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Cit9CisKKy5t b2RhbC1iYWNrZHJvcC5mYWRlIHsKKyAgb3BhY2l0eTogMDsKK30KKworLm1vZGFsLWJhY2tkcm9w LAorLm1vZGFsLWJhY2tkcm9wLmZhZGUuaW4geworICBvcGFjaXR5OiAwLjg7CisgIGZpbHRlcjog YWxwaGEob3BhY2l0eT04MCk7Cit9CisKKy5tb2RhbCB7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAg dG9wOiAxMCU7CisgIGxlZnQ6IDUwJTsKKyAgei1pbmRleDogMTA1MDsKKyAgd2lkdGg6IDU2MHB4 OworICBtYXJnaW4tbGVmdDogLTI4MHB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwor ICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAs IDAsIDAuMyk7CisgICpib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAtd2Via2l0LWJvcmRlci1y YWRpdXM6IDZweDsKKyAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CisgICAgICAgICAgYm9y ZGVyLXJhZGl1czogNnB4OworICBvdXRsaW5lOiBub25lOworICAtd2Via2l0LWJveC1zaGFkb3c6 IDAgM3B4IDdweCByZ2JhKDAsIDAsIDAsIDAuMyk7CisgICAgIC1tb3otYm94LXNoYWRvdzogMCAz cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKKyAgICAgICAgICBib3gtc2hhZG93OiAwIDNweCA3 cHggcmdiYSgwLCAwLCAwLCAwLjMpOworICAtd2Via2l0LWJhY2tncm91bmQtY2xpcDogcGFkZGlu Zy1ib3g7CisgICAgIC1tb3otYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKKyAgICAgICAg ICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OworfQorCisubW9kYWwuZmFkZSB7CisgIHRv cDogLTI1JTsKKyAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyLCB0b3Ag MC4zcyBlYXNlLW91dDsKKyAgICAgLW1vei10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFy LCB0b3AgMC4zcyBlYXNlLW91dDsKKyAgICAgICAtby10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3Mg bGluZWFyLCB0b3AgMC4zcyBlYXNlLW91dDsKKyAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5 IDAuM3MgbGluZWFyLCB0b3AgMC4zcyBlYXNlLW91dDsKK30KKworLm1vZGFsLmZhZGUuaW4gewor ICB0b3A6IDEwJTsKK30KKworLm1vZGFsLWhlYWRlciB7CisgIHBhZGRpbmc6IDlweCAxNXB4Owor ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsKK30KKworLm1vZGFsLWhlYWRlciAuY2xv c2UgeworICBtYXJnaW4tdG9wOiAycHg7Cit9CisKKy5tb2RhbC1oZWFkZXIgaDMgeworICBtYXJn aW46IDA7CisgIGxpbmUtaGVpZ2h0OiAzMHB4OworfQorCisubW9kYWwtYm9keSB7CisgIHBvc2l0 aW9uOiByZWxhdGl2ZTsKKyAgbWF4LWhlaWdodDogNDAwcHg7CisgIHBhZGRpbmc6IDE1cHg7Cisg IG92ZXJmbG93LXk6IGF1dG87Cit9CisKKy5tb2RhbC1mb3JtIHsKKyAgbWFyZ2luLWJvdHRvbTog MDsKK30KKworLm1vZGFsLWZvb3RlciB7CisgIHBhZGRpbmc6IDE0cHggMTVweCAxNXB4OworICBt YXJnaW4tYm90dG9tOiAwOworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgYmFja2dyb3VuZC1jb2xv cjogI2Y1ZjVmNTsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7CisgIC13ZWJraXQtYm9y ZGVyLXJhZGl1czogMCAwIDZweCA2cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMCAwIDZw eCA2cHg7CisgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDZweCA2cHg7CisgICp6b29tOiAx OworICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgI2ZmZmZmZjsKKyAgICAgLW1v ei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAwICNmZmZmZmY7CisgICAgICAgICAgYm94LXNoYWRv dzogaW5zZXQgMCAxcHggMCAjZmZmZmZmOworfQorCisubW9kYWwtZm9vdGVyOmJlZm9yZSwKKy5t b2RhbC1mb290ZXI6YWZ0ZXIgeworICBkaXNwbGF5OiB0YWJsZTsKKyAgbGluZS1oZWlnaHQ6IDA7 CisgIGNvbnRlbnQ6ICIiOworfQorCisubW9kYWwtZm9vdGVyOmFmdGVyIHsKKyAgY2xlYXI6IGJv dGg7Cit9CisKKy5tb2RhbC1mb290ZXIgLmJ0biArIC5idG4geworICBtYXJnaW4tYm90dG9tOiAw OworICBtYXJnaW4tbGVmdDogNXB4OworfQorCisubW9kYWwtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0 biArIC5idG4geworICBtYXJnaW4tbGVmdDogLTFweDsKK30KKworLm1vZGFsLWZvb3RlciAuYnRu LWJsb2NrICsgLmJ0bi1ibG9jayB7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCisudG9vbHRpcCB7 CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgei1pbmRleDogMTAzMDsKKyAgZGlzcGxheTogYmxv Y2s7CisgIGZvbnQtc2l6ZTogMTFweDsKKyAgbGluZS1oZWlnaHQ6IDEuNDsKKyAgb3BhY2l0eTog MDsKKyAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApOworICB2aXNpYmlsaXR5OiB2aXNpYmxlOwor fQorCisudG9vbHRpcC5pbiB7CisgIG9wYWNpdHk6IDAuODsKKyAgZmlsdGVyOiBhbHBoYShvcGFj aXR5PTgwKTsKK30KKworLnRvb2x0aXAudG9wIHsKKyAgcGFkZGluZzogNXB4IDA7CisgIG1hcmdp bi10b3A6IC0zcHg7Cit9CisKKy50b29sdGlwLnJpZ2h0IHsKKyAgcGFkZGluZzogMCA1cHg7Cisg IG1hcmdpbi1sZWZ0OiAzcHg7Cit9CisKKy50b29sdGlwLmJvdHRvbSB7CisgIHBhZGRpbmc6IDVw eCAwOworICBtYXJnaW4tdG9wOiAzcHg7Cit9CisKKy50b29sdGlwLmxlZnQgeworICBwYWRkaW5n OiAwIDVweDsKKyAgbWFyZ2luLWxlZnQ6IC0zcHg7Cit9CisKKy50b29sdGlwLWlubmVyIHsKKyAg bWF4LXdpZHRoOiAyMDBweDsKKyAgcGFkZGluZzogOHB4OworICBjb2xvcjogI2ZmZmZmZjsKKyAg dGV4dC1hbGlnbjogY2VudGVyOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGJhY2tncm91 bmQtY29sb3I6ICMwMDAwMDA7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OworICAgICAt bW96LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7Cit9 CisKKy50b29sdGlwLWFycm93IHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB3aWR0aDogMDsK KyAgaGVpZ2h0OiAwOworICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OworICBib3JkZXItc3R5 bGU6IHNvbGlkOworfQorCisudG9vbHRpcC50b3AgLnRvb2x0aXAtYXJyb3cgeworICBib3R0b206 IDA7CisgIGxlZnQ6IDUwJTsKKyAgbWFyZ2luLWxlZnQ6IC01cHg7CisgIGJvcmRlci10b3AtY29s b3I6ICMwMDAwMDA7CisgIGJvcmRlci13aWR0aDogNXB4IDVweCAwOworfQorCisudG9vbHRpcC5y aWdodCAudG9vbHRpcC1hcnJvdyB7CisgIHRvcDogNTAlOworICBsZWZ0OiAwOworICBtYXJnaW4t dG9wOiAtNXB4OworICBib3JkZXItcmlnaHQtY29sb3I6ICMwMDAwMDA7CisgIGJvcmRlci13aWR0 aDogNXB4IDVweCA1cHggMDsKK30KKworLnRvb2x0aXAubGVmdCAudG9vbHRpcC1hcnJvdyB7Cisg IHRvcDogNTAlOworICByaWdodDogMDsKKyAgbWFyZ2luLXRvcDogLTVweDsKKyAgYm9yZGVyLWxl ZnQtY29sb3I6ICMwMDAwMDA7CisgIGJvcmRlci13aWR0aDogNXB4IDAgNXB4IDVweDsKK30KKwor LnRvb2x0aXAuYm90dG9tIC50b29sdGlwLWFycm93IHsKKyAgdG9wOiAwOworICBsZWZ0OiA1MCU7 CisgIG1hcmdpbi1sZWZ0OiAtNXB4OworICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwMDAwOwor ICBib3JkZXItd2lkdGg6IDAgNXB4IDVweDsKK30KKworLnBvcG92ZXIgeworICBwb3NpdGlvbjog YWJzb2x1dGU7CisgIHRvcDogMDsKKyAgbGVmdDogMDsKKyAgei1pbmRleDogMTAxMDsKKyAgZGlz cGxheTogbm9uZTsKKyAgbWF4LXdpZHRoOiAyNzZweDsKKyAgcGFkZGluZzogMXB4OworICB0ZXh0 LWFsaWduOiBsZWZ0OworICB3aGl0ZS1zcGFjZTogbm9ybWFsOworICBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZmZmOworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICBib3JkZXI6IDFweCBzb2xp ZCByZ2JhKDAsIDAsIDAsIDAuMik7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNnB4OworICAg ICAtbW96LWJvcmRlci1yYWRpdXM6IDZweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7 CisgIC13ZWJraXQtYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7Cisg ICAgIC1tb3otYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAg ICAgICAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgIC13ZWJr aXQtYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKKyAgICAgLW1vei1iYWNrZ3JvdW5kLWNs aXA6IHBhZGRpbmc7CisgICAgICAgICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKK30K KworLnBvcG92ZXIudG9wIHsKKyAgbWFyZ2luLXRvcDogLTEwcHg7Cit9CisKKy5wb3BvdmVyLnJp Z2h0IHsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7Cit9CisKKy5wb3BvdmVyLmJvdHRvbSB7CisgIG1h cmdpbi10b3A6IDEwcHg7Cit9CisKKy5wb3BvdmVyLmxlZnQgeworICBtYXJnaW4tbGVmdDogLTEw cHg7Cit9CisKKy5wb3BvdmVyLXRpdGxlIHsKKyAgcGFkZGluZzogOHB4IDE0cHg7CisgIG1hcmdp bjogMDsKKyAgZm9udC1zaXplOiAxNHB4OworICBmb250LXdlaWdodDogbm9ybWFsOworICBsaW5l LWhlaWdodDogMThweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgYm9yZGVyLWJv dHRvbTogMXB4IHNvbGlkICNlYmViZWI7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4IDVw eCAwIDA7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7CisgICAgICAgICAg Ym9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7Cit9CisKKy5wb3BvdmVyLXRpdGxlOmVtcHR5IHsK KyAgZGlzcGxheTogbm9uZTsKK30KKworLnBvcG92ZXItY29udGVudCB7CisgIHBhZGRpbmc6IDlw eCAxNHB4OworfQorCisucG9wb3ZlciAuYXJyb3csCisucG9wb3ZlciAuYXJyb3c6YWZ0ZXIgewor ICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGRpc3BsYXk6IGJsb2NrOworICB3aWR0aDogMDsKKyAg aGVpZ2h0OiAwOworICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OworICBib3JkZXItc3R5bGU6 IHNvbGlkOworfQorCisucG9wb3ZlciAuYXJyb3cgeworICBib3JkZXItd2lkdGg6IDExcHg7Cit9 CisKKy5wb3BvdmVyIC5hcnJvdzphZnRlciB7CisgIGJvcmRlci13aWR0aDogMTBweDsKKyAgY29u dGVudDogIiI7Cit9CisKKy5wb3BvdmVyLnRvcCAuYXJyb3cgeworICBib3R0b206IC0xMXB4Owor ICBsZWZ0OiA1MCU7CisgIG1hcmdpbi1sZWZ0OiAtMTFweDsKKyAgYm9yZGVyLXRvcC1jb2xvcjog Izk5OTsKKyAgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTsKKyAgYm9yZGVy LWJvdHRvbS13aWR0aDogMDsKK30KKworLnBvcG92ZXIudG9wIC5hcnJvdzphZnRlciB7CisgIGJv dHRvbTogMXB4OworICBtYXJnaW4tbGVmdDogLTEwcHg7CisgIGJvcmRlci10b3AtY29sb3I6ICNm ZmZmZmY7CisgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7Cit9CisKKy5wb3BvdmVyLnJpZ2h0IC5h cnJvdyB7CisgIHRvcDogNTAlOworICBsZWZ0OiAtMTFweDsKKyAgbWFyZ2luLXRvcDogLTExcHg7 CisgIGJvcmRlci1yaWdodC1jb2xvcjogIzk5OTsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiByZ2Jh KDAsIDAsIDAsIDAuMjUpOworICBib3JkZXItbGVmdC13aWR0aDogMDsKK30KKworLnBvcG92ZXIu cmlnaHQgLmFycm93OmFmdGVyIHsKKyAgYm90dG9tOiAtMTBweDsKKyAgbGVmdDogMXB4OworICBi b3JkZXItcmlnaHQtY29sb3I6ICNmZmZmZmY7CisgIGJvcmRlci1sZWZ0LXdpZHRoOiAwOworfQor CisucG9wb3Zlci5ib3R0b20gLmFycm93IHsKKyAgdG9wOiAtMTFweDsKKyAgbGVmdDogNTAlOwor ICBtYXJnaW4tbGVmdDogLTExcHg7CisgIGJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk7CisgIGJv cmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7CisgIGJvcmRlci10b3Atd2lk dGg6IDA7Cit9CisKKy5wb3BvdmVyLmJvdHRvbSAuYXJyb3c6YWZ0ZXIgeworICB0b3A6IDFweDsK KyAgbWFyZ2luLWxlZnQ6IC0xMHB4OworICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmZmZmZmOwor ICBib3JkZXItdG9wLXdpZHRoOiAwOworfQorCisucG9wb3Zlci5sZWZ0IC5hcnJvdyB7CisgIHRv cDogNTAlOworICByaWdodDogLTExcHg7CisgIG1hcmdpbi10b3A6IC0xMXB4OworICBib3JkZXIt bGVmdC1jb2xvcjogIzk5OTsKKyAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4y NSk7CisgIGJvcmRlci1yaWdodC13aWR0aDogMDsKK30KKworLnBvcG92ZXIubGVmdCAuYXJyb3c6 YWZ0ZXIgeworICByaWdodDogMXB4OworICBib3R0b206IC0xMHB4OworICBib3JkZXItbGVmdC1j b2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOworfQorCisudGh1bWJuYWls cyB7CisgIG1hcmdpbi1sZWZ0OiAtMjBweDsKKyAgbGlzdC1zdHlsZTogbm9uZTsKKyAgKnpvb206 IDE7Cit9CisKKy50aHVtYm5haWxzOmJlZm9yZSwKKy50aHVtYm5haWxzOmFmdGVyIHsKKyAgZGlz cGxheTogdGFibGU7CisgIGxpbmUtaGVpZ2h0OiAwOworICBjb250ZW50OiAiIjsKK30KKworLnRo dW1ibmFpbHM6YWZ0ZXIgeworICBjbGVhcjogYm90aDsKK30KKworLnJvdy1mbHVpZCAudGh1bWJu YWlscyB7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCisudGh1bWJuYWlscyA+IGxpIHsKKyAgZmxv YXQ6IGxlZnQ7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7CisgIG1hcmdpbi1sZWZ0OiAyMHB4Owor fQorCisudGh1bWJuYWlsIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmc6IDRweDsKKyAg bGluZS1oZWlnaHQ6IDIwcHg7CisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisgIC13ZWJraXQt Ym9yZGVyLXJhZGl1czogNHB4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAg ICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggM3B4 IHJnYmEoMCwgMCwgMCwgMC4wNTUpOworICAgICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDNweCBy Z2JhKDAsIDAsIDAsIDAuMDU1KTsKKyAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdi YSgwLCAwLCAwLCAwLjA1NSk7CisgIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1p bi1vdXQ7CisgICAgIC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7CisgICAg ICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7CisgICAgICAgICAgdHJhbnNp dGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7Cit9CisKK2EudGh1bWJuYWlsOmhvdmVyLAorYS50 aHVtYm5haWw6Zm9jdXMgeworICBib3JkZXItY29sb3I6ICMwMDg4Y2M7CisgIC13ZWJraXQtYm94 LXNoYWRvdzogMCAxcHggNHB4IHJnYmEoMCwgMTA1LCAyMTQsIDAuMjUpOworICAgICAtbW96LWJv eC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDEwNSwgMjE0LCAwLjI1KTsKKyAgICAgICAgICBi b3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAxMDUsIDIxNCwgMC4yNSk7Cit9CisKKy50aHVt Ym5haWwgPiBpbWcgeworICBkaXNwbGF5OiBibG9jazsKKyAgbWF4LXdpZHRoOiAxMDAlOworICBt YXJnaW4tcmlnaHQ6IGF1dG87CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworfQorCisudGh1bWJuYWls IC5jYXB0aW9uIHsKKyAgcGFkZGluZzogOXB4OworICBjb2xvcjogIzU1NTU1NTsKK30KKworLm1l ZGlhLAorLm1lZGlhLWJvZHkgeworICBvdmVyZmxvdzogaGlkZGVuOworICAqb3ZlcmZsb3c6IHZp c2libGU7CisgIHpvb206IDE7Cit9CisKKy5tZWRpYSwKKy5tZWRpYSAubWVkaWEgeworICBtYXJn aW4tdG9wOiAxNXB4OworfQorCisubWVkaWE6Zmlyc3QtY2hpbGQgeworICBtYXJnaW4tdG9wOiAw OworfQorCisubWVkaWEtb2JqZWN0IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKy5tZWRpYS1o ZWFkaW5nIHsKKyAgbWFyZ2luOiAwIDAgNXB4OworfQorCisubWVkaWEgPiAucHVsbC1sZWZ0IHsK KyAgbWFyZ2luLXJpZ2h0OiAxMHB4OworfQorCisubWVkaWEgPiAucHVsbC1yaWdodCB7CisgIG1h cmdpbi1sZWZ0OiAxMHB4OworfQorCisubWVkaWEtbGlzdCB7CisgIG1hcmdpbi1sZWZ0OiAwOwor ICBsaXN0LXN0eWxlOiBub25lOworfQorCisubGFiZWwsCisuYmFkZ2UgeworICBkaXNwbGF5OiBp bmxpbmUtYmxvY2s7CisgIHBhZGRpbmc6IDJweCA0cHg7CisgIGZvbnQtc2l6ZTogMTEuODQ0cHg7 CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBsaW5lLWhlaWdodDogMTRweDsKKyAgY29sb3I6ICNm ZmZmZmY7CisgIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMjUpOworICB3 aGl0ZS1zcGFjZTogbm93cmFwOworICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgIGJhY2tn cm91bmQtY29sb3I6ICM5OTk5OTk7Cit9CisKKy5sYWJlbCB7CisgIC13ZWJraXQtYm9yZGVyLXJh ZGl1czogM3B4OworICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsKKyAgICAgICAgICBib3Jk ZXItcmFkaXVzOiAzcHg7Cit9CisKKy5iYWRnZSB7CisgIHBhZGRpbmctcmlnaHQ6IDlweDsKKyAg cGFkZGluZy1sZWZ0OiA5cHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogOXB4OworICAgICAt bW96LWJvcmRlci1yYWRpdXM6IDlweDsKKyAgICAgICAgICBib3JkZXItcmFkaXVzOiA5cHg7Cit9 CisKKy5sYWJlbDplbXB0eSwKKy5iYWRnZTplbXB0eSB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisK K2EubGFiZWw6aG92ZXIsCithLmxhYmVsOmZvY3VzLAorYS5iYWRnZTpob3ZlciwKK2EuYmFkZ2U6 Zm9jdXMgeworICBjb2xvcjogI2ZmZmZmZjsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBj dXJzb3I6IHBvaW50ZXI7Cit9CisKKy5sYWJlbC1pbXBvcnRhbnQsCisuYmFkZ2UtaW1wb3J0YW50 IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2I5NGE0ODsKK30KKworLmxhYmVsLWltcG9ydGFudFto cmVmXSwKKy5iYWRnZS1pbXBvcnRhbnRbaHJlZl0geworICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTUz YjM5OworfQorCisubGFiZWwtd2FybmluZywKKy5iYWRnZS13YXJuaW5nIHsKKyAgYmFja2dyb3Vu ZC1jb2xvcjogI2Y4OTQwNjsKK30KKworLmxhYmVsLXdhcm5pbmdbaHJlZl0sCisuYmFkZ2Utd2Fy bmluZ1tocmVmXSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNjNjc2MDU7Cit9CisKKy5sYWJlbC1z dWNjZXNzLAorLmJhZGdlLXN1Y2Nlc3MgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDY4ODQ3Owor fQorCisubGFiZWwtc3VjY2Vzc1tocmVmXSwKKy5iYWRnZS1zdWNjZXNzW2hyZWZdIHsKKyAgYmFj a2dyb3VuZC1jb2xvcjogIzM1NjYzNTsKK30KKworLmxhYmVsLWluZm8sCisuYmFkZ2UtaW5mbyB7 CisgIGJhY2tncm91bmQtY29sb3I6ICMzYTg3YWQ7Cit9CisKKy5sYWJlbC1pbmZvW2hyZWZdLAor LmJhZGdlLWluZm9baHJlZl0geworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmQ2OTg3OworfQorCisu bGFiZWwtaW52ZXJzZSwKKy5iYWRnZS1pbnZlcnNlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzMz MzMzMzsKK30KKworLmxhYmVsLWludmVyc2VbaHJlZl0sCisuYmFkZ2UtaW52ZXJzZVtocmVmXSB7 CisgIGJhY2tncm91bmQtY29sb3I6ICMxYTFhMWE7Cit9CisKKy5idG4gLmxhYmVsLAorLmJ0biAu YmFkZ2UgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogLTFweDsKK30KKworLmJ0bi1t aW5pIC5sYWJlbCwKKy5idG4tbWluaSAuYmFkZ2UgeworICB0b3A6IDA7Cit9CisKK0Atd2Via2l0 LWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlcyB7CisgIGZyb20geworICAgIGJhY2tncm91 bmQtcG9zaXRpb246IDQwcHggMDsKKyAgfQorICB0byB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlv bjogMCAwOworICB9Cit9CisKK0AtbW96LWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlcyB7 CisgIGZyb20geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDsKKyAgfQorICB0byB7 CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOworICB9Cit9CisKK0AtbXMta2V5ZnJhbWVz IHByb2dyZXNzLWJhci1zdHJpcGVzIHsKKyAgZnJvbSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlv bjogNDBweCAwOworICB9CisgIHRvIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7Cisg IH0KK30KKworQC1vLWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlcyB7CisgIGZyb20gewor ICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsKKyAgfQorICB0byB7CisgICAgYmFja2dyb3Vu ZC1wb3NpdGlvbjogNDBweCAwOworICB9Cit9CisKK0BrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0 cmlwZXMgeworICBmcm9tIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7CisgIH0K KyAgdG8geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsKKyAgfQorfQorCisucHJvZ3Jl c3MgeworICBoZWlnaHQ6IDIwcHg7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7CisgIG92ZXJmbG93 OiBoaWRkZW47CisgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CisgIGJhY2tncm91bmQtaW1h Z2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y1ZjVmNSwgI2Y5ZjlmOSk7CisgIGJhY2tn cm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAwIDAsIDAgMTAwJSwgZnJvbSgj ZjVmNWY1KSwgdG8oI2Y5ZjlmOSkpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVh ci1ncmFkaWVudCh0b3AsICNmNWY1ZjUsICNmOWY5ZjkpOworICBiYWNrZ3JvdW5kLWltYWdlOiAt by1saW5lYXItZ3JhZGllbnQodG9wLCAjZjVmNWY1LCAjZjlmOWY5KTsKKyAgYmFja2dyb3VuZC1p bWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2Y1ZjVmNSwgI2Y5ZjlmOSk7CisgIGJh Y2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7 CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAgIGJvcmRlci1yYWRpdXM6 IDRweDsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGll bnQoc3RhcnRDb2xvcnN0cj0nI2ZmZjVmNWY1JywgZW5kQ29sb3JzdHI9JyNmZmY5ZjlmOScsIEdy YWRpZW50VHlwZT0wKTsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdi YSgwLCAwLCAwLCAwLjEpOworICAgICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCBy Z2JhKDAsIDAsIDAsIDAuMSk7CisgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4 IHJnYmEoMCwgMCwgMCwgMC4xKTsKK30KKworLnByb2dyZXNzIC5iYXIgeworICBmbG9hdDogbGVm dDsKKyAgd2lkdGg6IDA7CisgIGhlaWdodDogMTAwJTsKKyAgZm9udC1zaXplOiAxMnB4OworICBj b2xvcjogI2ZmZmZmZjsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICB0ZXh0LXNoYWRvdzogMCAt MXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzBlOTBkMjsK KyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjMTQ5YmRmLCAj MDQ4MGJlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAg MCwgMCAxMDAlLCBmcm9tKCMxNDliZGYpLCB0bygjMDQ4MGJlKSk7CisgIGJhY2tncm91bmQtaW1h Z2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzE0OWJkZiwgIzA0ODBiZSk7CisgIGJh Y2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMxNDliZGYsICMwNDgwYmUp OworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMTQ5YmRm LCAjMDQ4MGJlKTsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICBmaWx0ZXI6IHBy b2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScj ZmYxNDliZGYnLCBlbmRDb2xvcnN0cj0nI2ZmMDQ4MGJlJywgR3JhZGllbnRUeXBlPTApOworICAt d2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4xNSk7Cisg ICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjE1KTsK KyAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUp OworICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgIC1tb3otYm94LXNpemlu ZzogYm9yZGVyLWJveDsKKyAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAtd2Vi a2l0LXRyYW5zaXRpb246IHdpZHRoIDAuNnMgZWFzZTsKKyAgICAgLW1vei10cmFuc2l0aW9uOiB3 aWR0aCAwLjZzIGVhc2U7CisgICAgICAgLW8tdHJhbnNpdGlvbjogd2lkdGggMC42cyBlYXNlOwor ICAgICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuNnMgZWFzZTsKK30KKworLnByb2dyZXNzIC5i YXIgKyAuYmFyIHsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMCwg MCwgMCwgMC4xNSksIGluc2V0IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgIC1t b3otYm94LXNoYWRvdzogaW5zZXQgMXB4IDAgMCByZ2JhKDAsIDAsIDAsIDAuMTUpLCBpbnNldCAw IC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0 IDFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjE1KSwgaW5zZXQgMCAtMXB4IDAgcmdiYSgwLCAwLCAw LCAwLjE1KTsKK30KKworLnByb2dyZXNzLXN0cmlwZWQgLmJhciB7CisgIGJhY2tncm91bmQtY29s b3I6ICMxNDliZGY7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFy LCAwIDEwMCUsIDEwMCUgMCwgY29sb3Itc3RvcCgwLjI1LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAu MTUpKSwgY29sb3Itc3RvcCgwLjI1LCB0cmFuc3BhcmVudCksIGNvbG9yLXN0b3AoMC41LCB0cmFu c3BhcmVudCksIGNvbG9yLXN0b3AoMC41LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpKSwgY29s b3Itc3RvcCgwLjc1LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpKSwgY29sb3Itc3RvcCgwLjc1 LCB0cmFuc3BhcmVudCksIHRvKHRyYW5zcGFyZW50KSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13 ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1 JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwg MC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUl LCB0cmFuc3BhcmVudCk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50 KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0 cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwg MjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7CisgIGJh Y2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwg MjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1 NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRy YW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXIt Z3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVu dCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJn YmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50 KTsKKyAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDQwcHggNDBweDsKKyAgICAgLW1vei1iYWNr Z3JvdW5kLXNpemU6IDQwcHggNDBweDsKKyAgICAgICAtby1iYWNrZ3JvdW5kLXNpemU6IDQwcHgg NDBweDsKKyAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDQwcHggNDBweDsKK30KKworLnByb2dy ZXNzLmFjdGl2ZSAuYmFyIHsKKyAgLXdlYmtpdC1hbmltYXRpb246IHByb2dyZXNzLWJhci1zdHJp cGVzIDJzIGxpbmVhciBpbmZpbml0ZTsKKyAgICAgLW1vei1hbmltYXRpb246IHByb2dyZXNzLWJh ci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTsKKyAgICAgIC1tcy1hbmltYXRpb246IHByb2dy ZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTsKKyAgICAgICAtby1hbmltYXRpb246 IHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTsKKyAgICAgICAgICBhbmlt YXRpb246IHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTsKK30KKworLnBy b2dyZXNzLWRhbmdlciAuYmFyLAorLnByb2dyZXNzIC5iYXItZGFuZ2VyIHsKKyAgYmFja2dyb3Vu ZC1jb2xvcjogI2RkNTE0YzsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGll bnQodG9wLCAjZWU1ZjViLCAjYzQzYzM1KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1n cmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCNlZTVmNWIpLCB0bygjYzQzYzM1KSk7 CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlNWY1 YiwgI2M0M2MzNSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3As ICNlZTVmNWIsICNjNDNjMzUpOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQo dG8gYm90dG9tLCAjZWU1ZjViLCAjYzQzYzM1KTsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVh dC14OworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVu dChzdGFydENvbG9yc3RyPScjZmZlZTVmNWInLCBlbmRDb2xvcnN0cj0nI2ZmYzQzYzM1JywgR3Jh ZGllbnRUeXBlPTApOworfQorCisucHJvZ3Jlc3MtZGFuZ2VyLnByb2dyZXNzLXN0cmlwZWQgLmJh ciwKKy5wcm9ncmVzcy1zdHJpcGVkIC5iYXItZGFuZ2VyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjog I2VlNWY1YjsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAg MTAwJSwgMTAwJSAwLCBjb2xvci1zdG9wKDAuMjUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkp LCBjb2xvci1zdG9wKDAuMjUsIHRyYW5zcGFyZW50KSwgY29sb3Itc3RvcCgwLjUsIHRyYW5zcGFy ZW50KSwgY29sb3Itc3RvcCgwLjUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkpLCBjb2xvci1z dG9wKDAuNzUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkpLCBjb2xvci1zdG9wKDAuNzUsIHRy YW5zcGFyZW50KSwgdG8odHJhbnNwYXJlbnQpKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtp dC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0 cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1 KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRy YW5zcGFyZW50KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoNDVk ZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5z cGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUs IDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTsKKyAgYmFja2dy b3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUs IDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAy NTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNw YXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFk aWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1 JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgy NTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpOwor fQorCisucHJvZ3Jlc3Mtc3VjY2VzcyAuYmFyLAorLnByb2dyZXNzIC5iYXItc3VjY2VzcyB7Cisg IGJhY2tncm91bmQtY29sb3I6ICM1ZWI5NWU7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGlu ZWFyLWdyYWRpZW50KHRvcCwgIzYyYzQ2MiwgIzU3YTk1Nyk7CisgIGJhY2tncm91bmQtaW1hZ2U6 IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAwIDAsIDAgMTAwJSwgZnJvbSgjNjJjNDYyKSwgdG8o IzU3YTk1NykpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0 b3AsICM2MmM0NjIsICM1N2E5NTcpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3Jh ZGllbnQodG9wLCAjNjJjNDYyLCAjNTdhOTU3KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFy LWdyYWRpZW50KHRvIGJvdHRvbSwgIzYyYzQ2MiwgIzU3YTk1Nyk7CisgIGJhY2tncm91bmQtcmVw ZWF0OiByZXBlYXQteDsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3Nv ZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmNjJjNDYyJywgZW5kQ29sb3JzdHI9JyNmZjU3 YTk1NycsIEdyYWRpZW50VHlwZT0wKTsKK30KKworLnByb2dyZXNzLXN1Y2Nlc3MucHJvZ3Jlc3Mt c3RyaXBlZCAuYmFyLAorLnByb2dyZXNzLXN0cmlwZWQgLmJhci1zdWNjZXNzIHsKKyAgYmFja2dy b3VuZC1jb2xvcjogIzYyYzQ2MjsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVu dChsaW5lYXIsIDAgMTAwJSwgMTAwJSAwLCBjb2xvci1zdG9wKDAuMjUsIHJnYmEoMjU1LCAyNTUs IDI1NSwgMC4xNSkpLCBjb2xvci1zdG9wKDAuMjUsIHRyYW5zcGFyZW50KSwgY29sb3Itc3RvcCgw LjUsIHRyYW5zcGFyZW50KSwgY29sb3Itc3RvcCgwLjUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4x NSkpLCBjb2xvci1zdG9wKDAuNzUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkpLCBjb2xvci1z dG9wKDAuNzUsIHRyYW5zcGFyZW50KSwgdG8odHJhbnNwYXJlbnQpKTsKKyAgYmFja2dyb3VuZC1p bWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwg MC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1 NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3Bh cmVudCA3NSUsIHRyYW5zcGFyZW50KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXIt Z3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVu dCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJn YmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50 KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1 NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUs IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUp IDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7CisgIGJhY2tncm91bmQtaW1hZ2U6 IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRy YW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUp IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJh bnNwYXJlbnQpOworfQorCisucHJvZ3Jlc3MtaW5mbyAuYmFyLAorLnByb2dyZXNzIC5iYXItaW5m byB7CisgIGJhY2tncm91bmQtY29sb3I6ICM0YmIxY2Y7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1t b3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzViYzBkZSwgIzMzOWJiOSk7CisgIGJhY2tncm91bmQt aW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAwIDAsIDAgMTAwJSwgZnJvbSgjNWJjMGRl KSwgdG8oIzMzOWJiOSkpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFk aWVudCh0b3AsICM1YmMwZGUsICMzMzliYjkpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5l YXItZ3JhZGllbnQodG9wLCAjNWJjMGRlLCAjMzM5YmI5KTsKKyAgYmFja2dyb3VuZC1pbWFnZTog bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzViYzBkZSwgIzMzOWJiOSk7CisgIGJhY2tncm91 bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5N aWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmNWJjMGRlJywgZW5kQ29sb3JzdHI9 JyNmZjMzOWJiOScsIEdyYWRpZW50VHlwZT0wKTsKK30KKworLnByb2dyZXNzLWluZm8ucHJvZ3Jl c3Mtc3RyaXBlZCAuYmFyLAorLnByb2dyZXNzLXN0cmlwZWQgLmJhci1pbmZvIHsKKyAgYmFja2dy b3VuZC1jb2xvcjogIzViYzBkZTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVu dChsaW5lYXIsIDAgMTAwJSwgMTAwJSAwLCBjb2xvci1zdG9wKDAuMjUsIHJnYmEoMjU1LCAyNTUs IDI1NSwgMC4xNSkpLCBjb2xvci1zdG9wKDAuMjUsIHRyYW5zcGFyZW50KSwgY29sb3Itc3RvcCgw LjUsIHRyYW5zcGFyZW50KSwgY29sb3Itc3RvcCgwLjUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4x NSkpLCBjb2xvci1zdG9wKDAuNzUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkpLCBjb2xvci1z dG9wKDAuNzUsIHRyYW5zcGFyZW50KSwgdG8odHJhbnNwYXJlbnQpKTsKKyAgYmFja2dyb3VuZC1p bWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwg MC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1 NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3Bh cmVudCA3NSUsIHRyYW5zcGFyZW50KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXIt Z3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVu dCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJn YmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50 KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1 NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUs IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUp IDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7CisgIGJhY2tncm91bmQtaW1hZ2U6 IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRy YW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUp IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJh bnNwYXJlbnQpOworfQorCisucHJvZ3Jlc3Mtd2FybmluZyAuYmFyLAorLnByb2dyZXNzIC5iYXIt d2FybmluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYWE3MzI7CisgIGJhY2tncm91bmQtaW1h Z2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZiYjQ1MCwgI2Y4OTQwNik7CisgIGJhY2tn cm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAwIDAsIDAgMTAwJSwgZnJvbSgj ZmJiNDUwKSwgdG8oI2Y4OTQwNikpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVh ci1ncmFkaWVudCh0b3AsICNmYmI0NTAsICNmODk0MDYpOworICBiYWNrZ3JvdW5kLWltYWdlOiAt by1saW5lYXItZ3JhZGllbnQodG9wLCAjZmJiNDUwLCAjZjg5NDA2KTsKKyAgYmFja2dyb3VuZC1p bWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2ZiYjQ1MCwgI2Y4OTQwNik7CisgIGJh Y2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5z Zm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZmJiNDUwJywgZW5kQ29s b3JzdHI9JyNmZmY4OTQwNicsIEdyYWRpZW50VHlwZT0wKTsKK30KKworLnByb2dyZXNzLXdhcm5p bmcucHJvZ3Jlc3Mtc3RyaXBlZCAuYmFyLAorLnByb2dyZXNzLXN0cmlwZWQgLmJhci13YXJuaW5n IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZiYjQ1MDsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdl YmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMTAwJSwgMTAwJSAwLCBjb2xvci1zdG9wKDAuMjUsIHJn YmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkpLCBjb2xvci1zdG9wKDAuMjUsIHRyYW5zcGFyZW50KSwg Y29sb3Itc3RvcCgwLjUsIHRyYW5zcGFyZW50KSwgY29sb3Itc3RvcCgwLjUsIHJnYmEoMjU1LCAy NTUsIDI1NSwgMC4xNSkpLCBjb2xvci1zdG9wKDAuNzUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4x NSkpLCBjb2xvci1zdG9wKDAuNzUsIHRyYW5zcGFyZW50KSwgdG8odHJhbnNwYXJlbnQpKTsKKyAg YmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1 LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwg cmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkg NzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTsKKyAgYmFja2dyb3VuZC1pbWFnZTog LW1vei1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUl LCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAw LjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUs IHRyYW5zcGFyZW50KTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1 ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFu c3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1 LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7CisgIGJhY2tn cm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAw LjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1 LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFy ZW50IDc1JSwgdHJhbnNwYXJlbnQpOworfQorCisuYWNjb3JkaW9uIHsKKyAgbWFyZ2luLWJvdHRv bTogMjBweDsKK30KKworLmFjY29yZGlvbi1ncm91cCB7CisgIG1hcmdpbi1ib3R0b206IDJweDsK KyAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTVlNTsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0 cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAgIGJvcmRlci1yYWRp dXM6IDRweDsKK30KKworLmFjY29yZGlvbi1oZWFkaW5nIHsKKyAgYm9yZGVyLWJvdHRvbTogMDsK K30KKworLmFjY29yZGlvbi1oZWFkaW5nIC5hY2NvcmRpb24tdG9nZ2xlIHsKKyAgZGlzcGxheTog YmxvY2s7CisgIHBhZGRpbmc6IDhweCAxNXB4OworfQorCisuYWNjb3JkaW9uLXRvZ2dsZSB7Cisg IGN1cnNvcjogcG9pbnRlcjsKK30KKworLmFjY29yZGlvbi1pbm5lciB7CisgIHBhZGRpbmc6IDlw eCAxNXB4OworICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTVlNTsKK30KKworLmNhcm91c2Vs IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBsaW5l LWhlaWdodDogMTsKK30KKworLmNhcm91c2VsLWlubmVyIHsKKyAgcG9zaXRpb246IHJlbGF0aXZl OworICB3aWR0aDogMTAwJTsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworLmNhcm91c2VsLWlu bmVyID4gLml0ZW0geworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGRpc3BsYXk6IG5vbmU7Cisg IC13ZWJraXQtdHJhbnNpdGlvbjogMC42cyBlYXNlLWluLW91dCBsZWZ0OworICAgICAtbW96LXRy YW5zaXRpb246IDAuNnMgZWFzZS1pbi1vdXQgbGVmdDsKKyAgICAgICAtby10cmFuc2l0aW9uOiAw LjZzIGVhc2UtaW4tb3V0IGxlZnQ7CisgICAgICAgICAgdHJhbnNpdGlvbjogMC42cyBlYXNlLWlu LW91dCBsZWZ0OworfQorCisuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbSA+IGltZywKKy5jYXJvdXNl bC1pbm5lciA+IC5pdGVtID4gYSA+IGltZyB7CisgIGRpc3BsYXk6IGJsb2NrOworICBsaW5lLWhl aWdodDogMTsKK30KKworLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZSwKKy5jYXJvdXNlbC1pbm5l ciA+IC5uZXh0LAorLmNhcm91c2VsLWlubmVyID4gLnByZXYgeworICBkaXNwbGF5OiBibG9jazsK K30KKworLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZSB7CisgIGxlZnQ6IDA7Cit9CisKKy5jYXJv dXNlbC1pbm5lciA+IC5uZXh0LAorLmNhcm91c2VsLWlubmVyID4gLnByZXYgeworICBwb3NpdGlv bjogYWJzb2x1dGU7CisgIHRvcDogMDsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKy5jYXJvdXNlbC1p bm5lciA+IC5uZXh0IHsKKyAgbGVmdDogMTAwJTsKK30KKworLmNhcm91c2VsLWlubmVyID4gLnBy ZXYgeworICBsZWZ0OiAtMTAwJTsKK30KKworLmNhcm91c2VsLWlubmVyID4gLm5leHQubGVmdCwK Ky5jYXJvdXNlbC1pbm5lciA+IC5wcmV2LnJpZ2h0IHsKKyAgbGVmdDogMDsKK30KKworLmNhcm91 c2VsLWlubmVyID4gLmFjdGl2ZS5sZWZ0IHsKKyAgbGVmdDogLTEwMCU7Cit9CisKKy5jYXJvdXNl bC1pbm5lciA+IC5hY3RpdmUucmlnaHQgeworICBsZWZ0OiAxMDAlOworfQorCisuY2Fyb3VzZWwt Y29udHJvbCB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiA0MCU7CisgIGxlZnQ6IDE1 cHg7CisgIHdpZHRoOiA0MHB4OworICBoZWlnaHQ6IDQwcHg7CisgIG1hcmdpbi10b3A6IC0yMHB4 OworICBmb250LXNpemU6IDYwcHg7CisgIGZvbnQtd2VpZ2h0OiAxMDA7CisgIGxpbmUtaGVpZ2h0 OiAzMHB4OworICBjb2xvcjogI2ZmZmZmZjsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBiYWNr Z3JvdW5kOiAjMjIyMjIyOworICBib3JkZXI6IDNweCBzb2xpZCAjZmZmZmZmOworICAtd2Via2l0 LWJvcmRlci1yYWRpdXM6IDIzcHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMjNweDsKKyAg ICAgICAgICBib3JkZXItcmFkaXVzOiAyM3B4OworICBvcGFjaXR5OiAwLjU7CisgIGZpbHRlcjog YWxwaGEob3BhY2l0eT01MCk7Cit9CisKKy5jYXJvdXNlbC1jb250cm9sLnJpZ2h0IHsKKyAgcmln aHQ6IDE1cHg7CisgIGxlZnQ6IGF1dG87Cit9CisKKy5jYXJvdXNlbC1jb250cm9sOmhvdmVyLAor LmNhcm91c2VsLWNvbnRyb2w6Zm9jdXMgeworICBjb2xvcjogI2ZmZmZmZjsKKyAgdGV4dC1kZWNv cmF0aW9uOiBub25lOworICBvcGFjaXR5OiAwLjk7CisgIGZpbHRlcjogYWxwaGEob3BhY2l0eT05 MCk7Cit9CisKKy5jYXJvdXNlbC1pbmRpY2F0b3JzIHsKKyAgcG9zaXRpb246IGFic29sdXRlOwor ICB0b3A6IDE1cHg7CisgIHJpZ2h0OiAxNXB4OworICB6LWluZGV4OiA1OworICBtYXJnaW46IDA7 CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKKy5jYXJvdXNlbC1pbmRpY2F0b3JzIGxpIHsKKyAg ZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMTBweDsKKyAgaGVpZ2h0 OiAxMHB4OworICBtYXJnaW4tbGVmdDogNXB4OworICB0ZXh0LWluZGVudDogLTk5OXB4OworICBi YWNrZ3JvdW5kLWNvbG9yOiAjY2NjOworICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1 LCAyNTUsIDAuMjUpOworICBib3JkZXItcmFkaXVzOiA1cHg7Cit9CisKKy5jYXJvdXNlbC1pbmRp Y2F0b3JzIC5hY3RpdmUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworfQorCisuY2Fyb3Vz ZWwtY2FwdGlvbiB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgcmlnaHQ6IDA7CisgIGJvdHRv bTogMDsKKyAgbGVmdDogMDsKKyAgcGFkZGluZzogMTVweDsKKyAgYmFja2dyb3VuZDogIzMzMzMz MzsKKyAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjc1KTsKK30KKworLmNhcm91c2VsLWNh cHRpb24gaDQsCisuY2Fyb3VzZWwtY2FwdGlvbiBwIHsKKyAgbGluZS1oZWlnaHQ6IDIwcHg7Cisg IGNvbG9yOiAjZmZmZmZmOworfQorCisuY2Fyb3VzZWwtY2FwdGlvbiBoNCB7CisgIG1hcmdpbjog MCAwIDVweDsKK30KKworLmNhcm91c2VsLWNhcHRpb24gcCB7CisgIG1hcmdpbi1ib3R0b206IDA7 Cit9CisKKy5oZXJvLXVuaXQgeworICBwYWRkaW5nOiA2MHB4OworICBtYXJnaW4tYm90dG9tOiAz MHB4OworICBmb250LXNpemU6IDE4cHg7CisgIGZvbnQtd2VpZ2h0OiAyMDA7CisgIGxpbmUtaGVp Z2h0OiAzMHB4OworICBjb2xvcjogaW5oZXJpdDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVl ZTsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CisgICAgIC1tb3otYm9yZGVyLXJhZGl1 czogNnB4OworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKK30KKworLmhlcm8tdW5pdCBo MSB7CisgIG1hcmdpbi1ib3R0b206IDA7CisgIGZvbnQtc2l6ZTogNjBweDsKKyAgbGluZS1oZWln aHQ6IDE7CisgIGxldHRlci1zcGFjaW5nOiAtMXB4OworICBjb2xvcjogaW5oZXJpdDsKK30KKwor Lmhlcm8tdW5pdCBsaSB7CisgIGxpbmUtaGVpZ2h0OiAzMHB4OworfQorCisucHVsbC1yaWdodCB7 CisgIGZsb2F0OiByaWdodDsKK30KKworLnB1bGwtbGVmdCB7CisgIGZsb2F0OiBsZWZ0OworfQor CisuaGlkZSB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy5zaG93IHsKKyAgZGlzcGxheTogYmxv Y2s7Cit9CisKKy5pbnZpc2libGUgeworICB2aXNpYmlsaXR5OiBoaWRkZW47Cit9CisKKy5hZmZp eCB7CisgIHBvc2l0aW9uOiBmaXhlZDsKK30KZGlmZiAtLWdpdCBhL2Fzc2VtYmxlci9nZW5fcmVn aW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLWFsZXJ0LmpzIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25z L2Fzc2V0cy9qcy9ib290c3RyYXAtYWxlcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uODkxN2Y5NAotLS0gL2Rldi9udWxsCisrKyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9u cy9hc3NldHMvanMvYm9vdHN0cmFwLWFsZXJ0LmpzCkBAIC0wLDAgKzEsOTkgQEAKKy8qID09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAq IGJvb3RzdHJhcC1hbGVydC5qcyB2Mi4zLjEKKyAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20v Ym9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNhbGVydHMKKyAqID09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDEy IFR3aXR0ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0 YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9y Zy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNh YmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVk IHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisg KiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4 cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxh bmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRo ZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PSAqLworCisKKyFmdW5jdGlvbiAoJCkgeworCisgICJ1c2Ugc3RyaWN0 IjsgLy8ganNoaW50IDtfOworCisKKyAvKiBBTEVSVCBDTEFTUyBERUZJTklUSU9OCisgICogPT09 PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBkaXNtaXNzID0gJ1tkYXRhLWRpc21pc3M9 ImFsZXJ0Il0nCisgICAgLCBBbGVydCA9IGZ1bmN0aW9uIChlbCkgeworICAgICAgICAkKGVsKS5v bignY2xpY2snLCBkaXNtaXNzLCB0aGlzLmNsb3NlKQorICAgICAgfQorCisgIEFsZXJ0LnByb3Rv dHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChlKSB7CisgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAg ICAgLCBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykKKyAgICAgICwgJHBhcmVu dAorCisgICAgaWYgKCFzZWxlY3RvcikgeworICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdo cmVmJykKKyAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLioo Pz0jW15cc10qJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3CisgICAgfQorCisgICAgJHBhcmVudCA9 ICQoc2VsZWN0b3IpCisKKyAgICBlICYmIGUucHJldmVudERlZmF1bHQoKQorCisgICAgJHBhcmVu dC5sZW5ndGggfHwgKCRwYXJlbnQgPSAkdGhpcy5oYXNDbGFzcygnYWxlcnQnKSA/ICR0aGlzIDog JHRoaXMucGFyZW50KCkpCisKKyAgICAkcGFyZW50LnRyaWdnZXIoZSA9ICQuRXZlbnQoJ2Nsb3Nl JykpCisKKyAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuCisKKyAgICAkcGFy ZW50LnJlbW92ZUNsYXNzKCdpbicpCisKKyAgICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KCkgewor ICAgICAgJHBhcmVudAorICAgICAgICAudHJpZ2dlcignY2xvc2VkJykKKyAgICAgICAgLnJlbW92 ZSgpCisgICAgfQorCisgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgJHBhcmVudC5oYXNDbGFz cygnZmFkZScpID8KKyAgICAgICRwYXJlbnQub24oJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBy ZW1vdmVFbGVtZW50KSA6CisgICAgICByZW1vdmVFbGVtZW50KCkKKyAgfQorCisKKyAvKiBBTEVS VCBQTFVHSU4gREVGSU5JVElPTgorICAqID09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAg dmFyIG9sZCA9ICQuZm4uYWxlcnQKKworICAkLmZuLmFsZXJ0ID0gZnVuY3Rpb24gKG9wdGlvbikg eworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgdmFyICR0aGlzID0g JCh0aGlzKQorICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdhbGVydCcpCisgICAgICBpZiAo IWRhdGEpICR0aGlzLmRhdGEoJ2FsZXJ0JywgKGRhdGEgPSBuZXcgQWxlcnQodGhpcykpKQorICAg ICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlz KQorICAgIH0pCisgIH0KKworICAkLmZuLmFsZXJ0LkNvbnN0cnVjdG9yID0gQWxlcnQKKworCisg LyogQUxFUlQgTk8gQ09ORkxJQ1QKKyAgKiA9PT09PT09PT09PT09PT09PSAqLworCisgICQuZm4u YWxlcnQubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAkLmZuLmFsZXJ0ID0gb2xkCisg ICAgcmV0dXJuIHRoaXMKKyAgfQorCisKKyAvKiBBTEVSVCBEQVRBLUFQSQorICAqID09PT09PT09 PT09PT09ICovCisKKyAgJChkb2N1bWVudCkub24oJ2NsaWNrLmFsZXJ0LmRhdGEtYXBpJywgZGlz bWlzcywgQWxlcnQucHJvdG90eXBlLmNsb3NlKQorCit9KHdpbmRvdy5qUXVlcnkpOwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9h c3NldHMvanMvYm9vdHN0cmFwLWJ1dHRvbi5qcyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3Nl dHMvanMvYm9vdHN0cmFwLWJ1dHRvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi42NmRmMGEyCi0tLSAvZGV2L251bGwKKysrIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fz c2V0cy9qcy9ib290c3RyYXAtYnV0dG9uLmpzCkBAIC0wLDAgKzEsMTA1IEBACisvKiA9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAq IGJvb3RzdHJhcC1idXR0b24uanMgdjIuMy4xCisgKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29t L2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjYnV0dG9ucworICogPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQg MjAxMiBUd2l0dGVyLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNl bnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhp cyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5 IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNo ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl ciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKyFmdW5jdGlvbiAoJCkgeworCisgICJ1c2Ug c3RyaWN0IjsgLy8ganNoaW50IDtfOworCisKKyAvKiBCVVRUT04gUFVCTElDIENMQVNTIERFRklO SVRJT04KKyAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgQnV0 dG9uID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHsKKyAgICB0aGlzLiRlbGVtZW50ID0g JChlbGVtZW50KQorICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmJ1dHRvbi5k ZWZhdWx0cywgb3B0aW9ucykKKyAgfQorCisgIEJ1dHRvbi5wcm90b3R5cGUuc2V0U3RhdGUgPSBm dW5jdGlvbiAoc3RhdGUpIHsKKyAgICB2YXIgZCA9ICdkaXNhYmxlZCcKKyAgICAgICwgJGVsID0g dGhpcy4kZWxlbWVudAorICAgICAgLCBkYXRhID0gJGVsLmRhdGEoKQorICAgICAgLCB2YWwgPSAk ZWwuaXMoJ2lucHV0JykgPyAndmFsJyA6ICdodG1sJworCisgICAgc3RhdGUgPSBzdGF0ZSArICdU ZXh0JworICAgIGRhdGEucmVzZXRUZXh0IHx8ICRlbC5kYXRhKCdyZXNldFRleHQnLCAkZWxbdmFs XSgpKQorCisgICAgJGVsW3ZhbF0oZGF0YVtzdGF0ZV0gfHwgdGhpcy5vcHRpb25zW3N0YXRlXSkK KworICAgIC8vIHB1c2ggdG8gZXZlbnQgbG9vcCB0byBhbGxvdyBmb3JtcyB0byBzdWJtaXQKKyAg ICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgIHN0YXRlID09ICdsb2FkaW5nVGV4dCcg PworICAgICAgICAkZWwuYWRkQ2xhc3MoZCkuYXR0cihkLCBkKSA6CisgICAgICAgICRlbC5yZW1v dmVDbGFzcyhkKS5yZW1vdmVBdHRyKGQpCisgICAgfSwgMCkKKyAgfQorCisgIEJ1dHRvbi5wcm90 b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciAkcGFyZW50ID0gdGhpcy4kZWxl bWVudC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9ImJ1dHRvbnMtcmFkaW8iXScpCisKKyAgICAkcGFy ZW50ICYmICRwYXJlbnQKKyAgICAgIC5maW5kKCcuYWN0aXZlJykKKyAgICAgIC5yZW1vdmVDbGFz cygnYWN0aXZlJykKKworICAgIHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpCisg IH0KKworCisgLyogQlVUVE9OIFBMVUdJTiBERUZJTklUSU9OCisgICogPT09PT09PT09PT09PT09 PT09PT09PT09ICovCisKKyAgdmFyIG9sZCA9ICQuZm4uYnV0dG9uCisKKyAgJC5mbi5idXR0b24g PSBmdW5jdGlvbiAob3B0aW9uKSB7CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7 CisgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpCisgICAgICAgICwgZGF0YSA9ICR0aGlzLmRhdGEo J2J1dHRvbicpCisgICAgICAgICwgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcg JiYgb3B0aW9uCisgICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2J1dHRvbicsIChkYXRhID0g bmV3IEJ1dHRvbih0aGlzLCBvcHRpb25zKSkpCisgICAgICBpZiAob3B0aW9uID09ICd0b2dnbGUn KSBkYXRhLnRvZ2dsZSgpCisgICAgICBlbHNlIGlmIChvcHRpb24pIGRhdGEuc2V0U3RhdGUob3B0 aW9uKQorICAgIH0pCisgIH0KKworICAkLmZuLmJ1dHRvbi5kZWZhdWx0cyA9IHsKKyAgICBsb2Fk aW5nVGV4dDogJ2xvYWRpbmcuLi4nCisgIH0KKworICAkLmZuLmJ1dHRvbi5Db25zdHJ1Y3RvciA9 IEJ1dHRvbgorCisKKyAvKiBCVVRUT04gTk8gQ09ORkxJQ1QKKyAgKiA9PT09PT09PT09PT09PT09 PT0gKi8KKworICAkLmZuLmJ1dHRvbi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkgeworICAgICQu Zm4uYnV0dG9uID0gb2xkCisgICAgcmV0dXJuIHRoaXMKKyAgfQorCisKKyAvKiBCVVRUT04gREFU QS1BUEkKKyAgKiA9PT09PT09PT09PT09PT0gKi8KKworICAkKGRvY3VtZW50KS5vbignY2xpY2su YnV0dG9uLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZV49YnV0dG9uXScsIGZ1bmN0aW9uIChlKSB7 CisgICAgdmFyICRidG4gPSAkKGUudGFyZ2V0KQorICAgIGlmICghJGJ0bi5oYXNDbGFzcygnYnRu JykpICRidG4gPSAkYnRuLmNsb3Nlc3QoJy5idG4nKQorICAgICRidG4uYnV0dG9uKCd0b2dnbGUn KQorICB9KQorCit9KHdpbmRvdy5qUXVlcnkpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK ZGlmZiAtLWdpdCBhL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFwLWNv bGxhcHNlLmpzIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9ib290c3RyYXAtY29s bGFwc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlZGU0YQotLS0g L2Rldi9udWxsCisrKyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFw LWNvbGxhcHNlLmpzCkBAIC0wLDAgKzEsMTY3IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib290c3RyYXAtY29s bGFwc2UuanMgdjIuMy4xCisgKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9q YXZhc2NyaXB0Lmh0bWwjY29sbGFwc2UKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDEyIFR3aXR0 ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl bnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxh dyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVy IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRI T1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mg b3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdl IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNl bnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09ICovCisKKworIWZ1bmN0aW9uICgkKSB7CisKKyAgInVzZSBzdHJpY3QiOyAv LyBqc2hpbnQgO187CisKKworIC8qIENPTExBUFNFIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OCisg ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgQ29sbGFwc2Ug PSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykgeworICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVs ZW1lbnQpCisgICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4uY29sbGFwc2UuZGVm YXVsdHMsIG9wdGlvbnMpCisKKyAgICBpZiAodGhpcy5vcHRpb25zLnBhcmVudCkgeworICAgICAg dGhpcy4kcGFyZW50ID0gJCh0aGlzLm9wdGlvbnMucGFyZW50KQorICAgIH0KKworICAgIHRoaXMu b3B0aW9ucy50b2dnbGUgJiYgdGhpcy50b2dnbGUoKQorICB9CisKKyAgQ29sbGFwc2UucHJvdG90 eXBlID0geworCisgICAgY29uc3RydWN0b3I6IENvbGxhcHNlCisKKyAgLCBkaW1lbnNpb246IGZ1 bmN0aW9uICgpIHsKKyAgICAgIHZhciBoYXNXaWR0aCA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3Mo J3dpZHRoJykKKyAgICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0JworICAg IH0KKworICAsIHNob3c6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkaW1lbnNpb24KKyAgICAg ICAgLCBzY3JvbGwKKyAgICAgICAgLCBhY3RpdmVzCisgICAgICAgICwgaGFzRGF0YQorCisgICAg ICBpZiAodGhpcy50cmFuc2l0aW9uaW5nIHx8IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2luJykp IHJldHVybgorCisgICAgICBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpCisgICAgICBzY3Jv bGwgPSAkLmNhbWVsQ2FzZShbJ3Njcm9sbCcsIGRpbWVuc2lvbl0uam9pbignLScpKQorICAgICAg YWN0aXZlcyA9IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuZmluZCgnPiAuYWNjb3JkaW9u LWdyb3VwID4gLmluJykKKworICAgICAgaWYgKGFjdGl2ZXMgJiYgYWN0aXZlcy5sZW5ndGgpIHsK KyAgICAgICAgaGFzRGF0YSA9IGFjdGl2ZXMuZGF0YSgnY29sbGFwc2UnKQorICAgICAgICBpZiAo aGFzRGF0YSAmJiBoYXNEYXRhLnRyYW5zaXRpb25pbmcpIHJldHVybgorICAgICAgICBhY3RpdmVz LmNvbGxhcHNlKCdoaWRlJykKKyAgICAgICAgaGFzRGF0YSB8fCBhY3RpdmVzLmRhdGEoJ2NvbGxh cHNlJywgbnVsbCkKKyAgICAgIH0KKworICAgICAgdGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKDAp CisgICAgICB0aGlzLnRyYW5zaXRpb24oJ2FkZENsYXNzJywgJC5FdmVudCgnc2hvdycpLCAnc2hv d24nKQorICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVudFtkaW1lbnNp b25dKHRoaXMuJGVsZW1lbnRbMF1bc2Nyb2xsXSkKKyAgICB9CisKKyAgLCBoaWRlOiBmdW5jdGlv biAoKSB7CisgICAgICB2YXIgZGltZW5zaW9uCisgICAgICBpZiAodGhpcy50cmFuc2l0aW9uaW5n IHx8ICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdpbicpKSByZXR1cm4KKyAgICAgIGRpbWVuc2lv biA9IHRoaXMuZGltZW5zaW9uKCkKKyAgICAgIHRoaXMucmVzZXQodGhpcy4kZWxlbWVudFtkaW1l bnNpb25dKCkpCisgICAgICB0aGlzLnRyYW5zaXRpb24oJ3JlbW92ZUNsYXNzJywgJC5FdmVudCgn aGlkZScpLCAnaGlkZGVuJykKKyAgICAgIHRoaXMuJGVsZW1lbnRbZGltZW5zaW9uXSgwKQorICAg IH0KKworICAsIHJlc2V0OiBmdW5jdGlvbiAoc2l6ZSkgeworICAgICAgdmFyIGRpbWVuc2lvbiA9 IHRoaXMuZGltZW5zaW9uKCkKKworICAgICAgdGhpcy4kZWxlbWVudAorICAgICAgICAucmVtb3Zl Q2xhc3MoJ2NvbGxhcHNlJykKKyAgICAgICAgW2RpbWVuc2lvbl0oc2l6ZSB8fCAnYXV0bycpCisg ICAgICAgIFswXS5vZmZzZXRXaWR0aAorCisgICAgICB0aGlzLiRlbGVtZW50W3NpemUgIT09IG51 bGwgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10oJ2NvbGxhcHNlJykKKworICAgICAgcmV0 dXJuIHRoaXMKKyAgICB9CisKKyAgLCB0cmFuc2l0aW9uOiBmdW5jdGlvbiAobWV0aG9kLCBzdGFy dEV2ZW50LCBjb21wbGV0ZUV2ZW50KSB7CisgICAgICB2YXIgdGhhdCA9IHRoaXMKKyAgICAgICAg LCBjb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmIChzdGFydEV2ZW50LnR5 cGUgPT0gJ3Nob3cnKSB0aGF0LnJlc2V0KCkKKyAgICAgICAgICAgIHRoYXQudHJhbnNpdGlvbmlu ZyA9IDAKKyAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcihjb21wbGV0ZUV2ZW50KQor ICAgICAgICAgIH0KKworICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHN0YXJ0RXZlbnQpCisK KyAgICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm4KKworICAg ICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMQorCisgICAgICB0aGlzLiRlbGVtZW50W21ldGhvZF0o J2luJykKKworICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVudC5oYXND bGFzcygnY29sbGFwc2UnKSA/CisgICAgICAgIHRoaXMuJGVsZW1lbnQub25lKCQuc3VwcG9ydC50 cmFuc2l0aW9uLmVuZCwgY29tcGxldGUpIDoKKyAgICAgICAgY29tcGxldGUoKQorICAgIH0KKwor ICAsIHRvZ2dsZTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpc1t0aGlzLiRlbGVtZW50Lmhhc0Ns YXNzKCdpbicpID8gJ2hpZGUnIDogJ3Nob3cnXSgpCisgICAgfQorCisgIH0KKworCisgLyogQ09M TEFQU0UgUExVR0lOIERFRklOSVRJT04KKyAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAq LworCisgIHZhciBvbGQgPSAkLmZuLmNvbGxhcHNlCisKKyAgJC5mbi5jb2xsYXBzZSA9IGZ1bmN0 aW9uIChvcHRpb24pIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAg IHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgnY29sbGFw c2UnKQorICAgICAgICAsIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgJC5mbi5jb2xsYXBzZS5kZWZh dWx0cywgJHRoaXMuZGF0YSgpLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbikK KyAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnY29sbGFwc2UnLCAoZGF0YSA9IG5ldyBDb2xs YXBzZSh0aGlzLCBvcHRpb25zKSkpCisgICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5n JykgZGF0YVtvcHRpb25dKCkKKyAgICB9KQorICB9CisKKyAgJC5mbi5jb2xsYXBzZS5kZWZhdWx0 cyA9IHsKKyAgICB0b2dnbGU6IHRydWUKKyAgfQorCisgICQuZm4uY29sbGFwc2UuQ29uc3RydWN0 b3IgPSBDb2xsYXBzZQorCisKKyAvKiBDT0xMQVBTRSBOTyBDT05GTElDVAorICAqID09PT09PT09 PT09PT09PT09PT09ICovCisKKyAgJC5mbi5jb2xsYXBzZS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24g KCkgeworICAgICQuZm4uY29sbGFwc2UgPSBvbGQKKyAgICByZXR1cm4gdGhpcworICB9CisKKwor IC8qIENPTExBUFNFIERBVEEtQVBJCisgICogPT09PT09PT09PT09PT09PT0gKi8KKworICAkKGRv Y3VtZW50KS5vbignY2xpY2suY29sbGFwc2UuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPWNvbGxh cHNlXScsIGZ1bmN0aW9uIChlKSB7CisgICAgdmFyICR0aGlzID0gJCh0aGlzKSwgaHJlZgorICAg ICAgLCB0YXJnZXQgPSAkdGhpcy5hdHRyKCdkYXRhLXRhcmdldCcpCisgICAgICAgIHx8IGUucHJl dmVudERlZmF1bHQoKQorICAgICAgICB8fCAoaHJlZiA9ICR0aGlzLmF0dHIoJ2hyZWYnKSkgJiYg aHJlZi5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sICcnKSAvL3N0cmlwIGZvciBpZTcKKyAgICAg ICwgb3B0aW9uID0gJCh0YXJnZXQpLmRhdGEoJ2NvbGxhcHNlJykgPyAndG9nZ2xlJyA6ICR0aGlz LmRhdGEoKQorICAgICR0aGlzWyQodGFyZ2V0KS5oYXNDbGFzcygnaW4nKSA/ICdhZGRDbGFzcycg OiAncmVtb3ZlQ2xhc3MnXSgnY29sbGFwc2VkJykKKyAgICAkKHRhcmdldCkuY29sbGFwc2Uob3B0 aW9uKQorICB9KQorCit9KHdpbmRvdy5qUXVlcnkpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp bGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFw LWRyb3Bkb3duLmpzIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9ib290c3RyYXAt ZHJvcGRvd24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkNTE1MQot LS0gL2Rldi9udWxsCisrKyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0 cmFwLWRyb3Bkb3duLmpzCkBAIC0wLDAgKzEsMTY1IEBACisvKiA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGJvb3RzdHJhcC1k cm9wZG93bi5qcyB2Mi4zLjEKKyAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFw L2phdmFzY3JpcHQuaHRtbCNkcm9wZG93bnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMTIgVHdp dHRlciwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp Y2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUg bGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5k ZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJ VEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVz cyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3Vh Z2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExp Y2Vuc2UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0gKi8KKworCishZnVuY3Rpb24gKCQpIHsKKworICAidXNlIHN0cmljdCI7 IC8vIGpzaGludCA7XzsKKworCisgLyogRFJPUERPV04gQ0xBU1MgREVGSU5JVElPTgorICAqID09 PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgdG9nZ2xlID0gJ1tkYXRhLXRvZ2ds ZT1kcm9wZG93bl0nCisgICAgLCBEcm9wZG93biA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAg ICAgIHZhciAkZWwgPSAkKGVsZW1lbnQpLm9uKCdjbGljay5kcm9wZG93bi5kYXRhLWFwaScsIHRo aXMudG9nZ2xlKQorICAgICAgICAkKCdodG1sJykub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBp JywgZnVuY3Rpb24gKCkgeworICAgICAgICAgICRlbC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnb3Bl bicpCisgICAgICAgIH0pCisgICAgICB9CisKKyAgRHJvcGRvd24ucHJvdG90eXBlID0geworCisg ICAgY29uc3RydWN0b3I6IERyb3Bkb3duCisKKyAgLCB0b2dnbGU6IGZ1bmN0aW9uIChlKSB7Cisg ICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpCisgICAgICAgICwgJHBhcmVudAorICAgICAgICAsIGlz QWN0aXZlCisKKyAgICAgIGlmICgkdGhpcy5pcygnLmRpc2FibGVkLCA6ZGlzYWJsZWQnKSkgcmV0 dXJuCisKKyAgICAgICRwYXJlbnQgPSBnZXRQYXJlbnQoJHRoaXMpCisKKyAgICAgIGlzQWN0aXZl ID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpCisKKyAgICAgIGNsZWFyTWVudXMoKQorCisgICAg ICBpZiAoIWlzQWN0aXZlKSB7CisgICAgICAgICRwYXJlbnQudG9nZ2xlQ2xhc3MoJ29wZW4nKQor ICAgICAgfQorCisgICAgICAkdGhpcy5mb2N1cygpCisKKyAgICAgIHJldHVybiBmYWxzZQorICAg IH0KKworICAsIGtleWRvd246IGZ1bmN0aW9uIChlKSB7CisgICAgICB2YXIgJHRoaXMKKyAgICAg ICAgLCAkaXRlbXMKKyAgICAgICAgLCAkYWN0aXZlCisgICAgICAgICwgJHBhcmVudAorICAgICAg ICAsIGlzQWN0aXZlCisgICAgICAgICwgaW5kZXgKKworICAgICAgaWYgKCEvKDM4fDQwfDI3KS8u dGVzdChlLmtleUNvZGUpKSByZXR1cm4KKworICAgICAgJHRoaXMgPSAkKHRoaXMpCisKKyAgICAg IGUucHJldmVudERlZmF1bHQoKQorICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQorCisgICAgICBp ZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVybgorCisgICAgICAkcGFy ZW50ID0gZ2V0UGFyZW50KCR0aGlzKQorCisgICAgICBpc0FjdGl2ZSA9ICRwYXJlbnQuaGFzQ2xh c3MoJ29wZW4nKQorCisgICAgICBpZiAoIWlzQWN0aXZlIHx8IChpc0FjdGl2ZSAmJiBlLmtleUNv ZGUgPT0gMjcpKSB7CisgICAgICAgIGlmIChlLndoaWNoID09IDI3KSAkcGFyZW50LmZpbmQodG9n Z2xlKS5mb2N1cygpCisgICAgICAgIHJldHVybiAkdGhpcy5jbGljaygpCisgICAgICB9CisKKyAg ICAgICRpdGVtcyA9ICQoJ1tyb2xlPW1lbnVdIGxpOm5vdCguZGl2aWRlcik6dmlzaWJsZSBhJywg JHBhcmVudCkKKworICAgICAgaWYgKCEkaXRlbXMubGVuZ3RoKSByZXR1cm4KKworICAgICAgaW5k ZXggPSAkaXRlbXMuaW5kZXgoJGl0ZW1zLmZpbHRlcignOmZvY3VzJykpCisKKyAgICAgIGlmIChl LmtleUNvZGUgPT0gMzggJiYgaW5kZXggPiAwKSBpbmRleC0tICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC8vIHVwCisgICAgICBpZiAoZS5rZXlDb2RlID09IDQwICYmIGlu ZGV4IDwgJGl0ZW1zLmxlbmd0aCAtIDEpIGluZGV4KysgICAgICAgICAgICAgICAgICAgICAgICAv LyBkb3duCisgICAgICBpZiAoIX5pbmRleCkgaW5kZXggPSAwCisKKyAgICAgICRpdGVtcworICAg ICAgICAuZXEoaW5kZXgpCisgICAgICAgIC5mb2N1cygpCisgICAgfQorCisgIH0KKworICBmdW5j dGlvbiBjbGVhck1lbnVzKCkgeworICAgICQodG9nZ2xlKS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAg ICAgIGdldFBhcmVudCgkKHRoaXMpKS5yZW1vdmVDbGFzcygnb3BlbicpCisgICAgfSkKKyAgfQor CisgIGZ1bmN0aW9uIGdldFBhcmVudCgkdGhpcykgeworICAgIHZhciBzZWxlY3RvciA9ICR0aGlz LmF0dHIoJ2RhdGEtdGFyZ2V0JykKKyAgICAgICwgJHBhcmVudAorCisgICAgaWYgKCFzZWxlY3Rv cikgeworICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJykKKyAgICAgIHNlbGVjdG9y ID0gc2VsZWN0b3IgJiYgLyMvLnRlc3Qoc2VsZWN0b3IpICYmIHNlbGVjdG9yLnJlcGxhY2UoLy4q KD89I1teXHNdKiQpLywgJycpIC8vc3RyaXAgZm9yIGllNworICAgIH0KKworICAgICRwYXJlbnQg PSBzZWxlY3RvciAmJiAkKHNlbGVjdG9yKQorCisgICAgaWYgKCEkcGFyZW50IHx8ICEkcGFyZW50 Lmxlbmd0aCkgJHBhcmVudCA9ICR0aGlzLnBhcmVudCgpCisKKyAgICByZXR1cm4gJHBhcmVudAor ICB9CisKKworICAvKiBEUk9QRE9XTiBQTFVHSU4gREVGSU5JVElPTgorICAgKiA9PT09PT09PT09 PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBvbGQgPSAkLmZuLmRyb3Bkb3duCisKKyAgJC5m bi5kcm9wZG93biA9IGZ1bmN0aW9uIChvcHRpb24pIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1 bmN0aW9uICgpIHsKKyAgICAgIHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAgLCBkYXRhID0g JHRoaXMuZGF0YSgnZHJvcGRvd24nKQorICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdkcm9w ZG93bicsIChkYXRhID0gbmV3IERyb3Bkb3duKHRoaXMpKSkKKyAgICAgIGlmICh0eXBlb2Ygb3B0 aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0uY2FsbCgkdGhpcykKKyAgICB9KQorICB9CisK KyAgJC5mbi5kcm9wZG93bi5Db25zdHJ1Y3RvciA9IERyb3Bkb3duCisKKworIC8qIERST1BET1dO IE5PIENPTkZMSUNUCisgICogPT09PT09PT09PT09PT09PT09PT0gKi8KKworICAkLmZuLmRyb3Bk b3duLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CisgICAgJC5mbi5kcm9wZG93biA9IG9sZAor ICAgIHJldHVybiB0aGlzCisgIH0KKworCisgIC8qIEFQUExZIFRPIFNUQU5EQVJEIERST1BET1dO IEVMRU1FTlRTCisgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisK KyAgJChkb2N1bWVudCkKKyAgICAub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBpJywgY2xlYXJN ZW51cykKKyAgICAub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBpJywgJy5kcm9wZG93biBmb3Jt JywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKSB9KQorICAgIC5vbignY2xpY2su ZHJvcGRvd24tbWVudScsIGZ1bmN0aW9uIChlKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCkgfSkKKyAg ICAub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBpJyAgLCB0b2dnbGUsIERyb3Bkb3duLnByb3Rv dHlwZS50b2dnbGUpCisgICAgLm9uKCdrZXlkb3duLmRyb3Bkb3duLmRhdGEtYXBpJywgdG9nZ2xl ICsgJywgW3JvbGU9bWVudV0nICwgRHJvcGRvd24ucHJvdG90eXBlLmtleWRvd24pCisKK30od2lu ZG93LmpRdWVyeSk7CmRpZmYgLS1naXQgYS9hc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pz L2Jvb3RzdHJhcC5qcyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvYm9vdHN0cmFw LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOThlZTQKLS0tIC9kZXYv bnVsbAorKysgYi9hc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2Jvb3RzdHJhcC5qcwpA QCAtMCwwICsxLDIyNzYgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQorICogYm9vdHN0cmFwLXRyYW5zaXRpb24uanMgdjIuMy4xCisgKiBo dHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjdHJhbnNp dGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQorICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVu ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor ICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5s ZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBz b2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQg b24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05T IE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNl bnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAor ICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworIWZ1bmN0aW9u ICgkKSB7CisKKyAgInVzZSBzdHJpY3QiOyAvLyBqc2hpbnQgO187CisKKworICAvKiBDU1MgVFJB TlNJVElPTiBTVVBQT1JUIChodHRwOi8vd3d3Lm1vZGVybml6ci5jb20vKQorICAgKiA9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAg JChmdW5jdGlvbiAoKSB7CisKKyAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiA9IChmdW5jdGlvbiAo KSB7CisKKyAgICAgIHZhciB0cmFuc2l0aW9uRW5kID0gKGZ1bmN0aW9uICgpIHsKKworICAgICAg ICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib290c3RyYXAnKQorICAgICAgICAg ICwgdHJhbnNFbmRFdmVudE5hbWVzID0geworICAgICAgICAgICAgICAgJ1dlYmtpdFRyYW5zaXRp b24nIDogJ3dlYmtpdFRyYW5zaXRpb25FbmQnCisgICAgICAgICAgICAsICAnTW96VHJhbnNpdGlv bicgICAgOiAndHJhbnNpdGlvbmVuZCcKKyAgICAgICAgICAgICwgICdPVHJhbnNpdGlvbicgICAg ICA6ICdvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCcKKyAgICAgICAgICAgICwgICd0cmFu c2l0aW9uJyAgICAgICA6ICd0cmFuc2l0aW9uZW5kJworICAgICAgICAgICAgfQorICAgICAgICAg ICwgbmFtZQorCisgICAgICAgIGZvciAobmFtZSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpeworICAg ICAgICAgIGlmIChlbC5zdHlsZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBy ZXR1cm4gdHJhbnNFbmRFdmVudE5hbWVzW25hbWVdCisgICAgICAgICAgfQorICAgICAgICB9CisK KyAgICAgIH0oKSkKKworICAgICAgcmV0dXJuIHRyYW5zaXRpb25FbmQgJiYgeworICAgICAgICBl bmQ6IHRyYW5zaXRpb25FbmQKKyAgICAgIH0KKworICAgIH0pKCkKKworICB9KQorCit9KHdpbmRv dy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKyAqIGJvb3RzdHJhcC1hbGVydC5qcyB2Mi4zLjEKKyAqIGh0dHA6Ly90 d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNhbGVydHMKKyAqID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KyAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0 aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBt YXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5z ZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0 dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKyFmdW5jdGlvbiAoJCkg eworCisgICJ1c2Ugc3RyaWN0IjsgLy8ganNoaW50IDtfOworCisKKyAvKiBBTEVSVCBDTEFTUyBE RUZJTklUSU9OCisgICogPT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBkaXNtaXNz ID0gJ1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nCisgICAgLCBBbGVydCA9IGZ1bmN0aW9uIChlbCkg eworICAgICAgICAkKGVsKS5vbignY2xpY2snLCBkaXNtaXNzLCB0aGlzLmNsb3NlKQorICAgICAg fQorCisgIEFsZXJ0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChlKSB7CisgICAgdmFyICR0 aGlzID0gJCh0aGlzKQorICAgICAgLCBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0 JykKKyAgICAgICwgJHBhcmVudAorCisgICAgaWYgKCFzZWxlY3RvcikgeworICAgICAgc2VsZWN0 b3IgPSAkdGhpcy5hdHRyKCdocmVmJykKKyAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2Vs ZWN0b3IucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3CisgICAg fQorCisgICAgJHBhcmVudCA9ICQoc2VsZWN0b3IpCisKKyAgICBlICYmIGUucHJldmVudERlZmF1 bHQoKQorCisgICAgJHBhcmVudC5sZW5ndGggfHwgKCRwYXJlbnQgPSAkdGhpcy5oYXNDbGFzcygn YWxlcnQnKSA/ICR0aGlzIDogJHRoaXMucGFyZW50KCkpCisKKyAgICAkcGFyZW50LnRyaWdnZXIo ZSA9ICQuRXZlbnQoJ2Nsb3NlJykpCisKKyAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkg cmV0dXJuCisKKyAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdpbicpCisKKyAgICBmdW5jdGlvbiBy ZW1vdmVFbGVtZW50KCkgeworICAgICAgJHBhcmVudAorICAgICAgICAudHJpZ2dlcignY2xvc2Vk JykKKyAgICAgICAgLnJlbW92ZSgpCisgICAgfQorCisgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24g JiYgJHBhcmVudC5oYXNDbGFzcygnZmFkZScpID8KKyAgICAgICRwYXJlbnQub24oJC5zdXBwb3J0 LnRyYW5zaXRpb24uZW5kLCByZW1vdmVFbGVtZW50KSA6CisgICAgICByZW1vdmVFbGVtZW50KCkK KyAgfQorCisKKyAvKiBBTEVSVCBQTFVHSU4gREVGSU5JVElPTgorICAqID09PT09PT09PT09PT09 PT09PT09PT09ICovCisKKyAgdmFyIG9sZCA9ICQuZm4uYWxlcnQKKworICAkLmZuLmFsZXJ0ID0g ZnVuY3Rpb24gKG9wdGlvbikgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewor ICAgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdh bGVydCcpCisgICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2FsZXJ0JywgKGRhdGEgPSBuZXcg QWxlcnQodGhpcykpKQorICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFb b3B0aW9uXS5jYWxsKCR0aGlzKQorICAgIH0pCisgIH0KKworICAkLmZuLmFsZXJ0LkNvbnN0cnVj dG9yID0gQWxlcnQKKworCisgLyogQUxFUlQgTk8gQ09ORkxJQ1QKKyAgKiA9PT09PT09PT09PT09 PT09PSAqLworCisgICQuZm4uYWxlcnQubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAk LmZuLmFsZXJ0ID0gb2xkCisgICAgcmV0dXJuIHRoaXMKKyAgfQorCisKKyAvKiBBTEVSVCBEQVRB LUFQSQorICAqID09PT09PT09PT09PT09ICovCisKKyAgJChkb2N1bWVudCkub24oJ2NsaWNrLmFs ZXJ0LmRhdGEtYXBpJywgZGlzbWlzcywgQWxlcnQucHJvdG90eXBlLmNsb3NlKQorCit9KHdpbmRv dy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQorICogYm9vdHN0cmFwLWJ1dHRvbi5qcyB2Mi4zLjEKKyAqIGh0dHA6 Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNidXR0b25zCisg KiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKyAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1 bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAq IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUg TGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoK KyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVu bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg c29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVk IG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9O UyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGlj ZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQK KyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworIWZ1bmN0 aW9uICgkKSB7CisKKyAgInVzZSBzdHJpY3QiOyAvLyBqc2hpbnQgO187CisKKworIC8qIEJVVFRP TiBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTgorICAqID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PSAqLworCisgIHZhciBCdXR0b24gPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykgewor ICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpCisgICAgdGhpcy5vcHRpb25zID0gJC5leHRl bmQoe30sICQuZm4uYnV0dG9uLmRlZmF1bHRzLCBvcHRpb25zKQorICB9CisKKyAgQnV0dG9uLnBy b3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkgeworICAgIHZhciBkID0gJ2Rpc2Fi bGVkJworICAgICAgLCAkZWwgPSB0aGlzLiRlbGVtZW50CisgICAgICAsIGRhdGEgPSAkZWwuZGF0 YSgpCisgICAgICAsIHZhbCA9ICRlbC5pcygnaW5wdXQnKSA/ICd2YWwnIDogJ2h0bWwnCisKKyAg ICBzdGF0ZSA9IHN0YXRlICsgJ1RleHQnCisgICAgZGF0YS5yZXNldFRleHQgfHwgJGVsLmRhdGEo J3Jlc2V0VGV4dCcsICRlbFt2YWxdKCkpCisKKyAgICAkZWxbdmFsXShkYXRhW3N0YXRlXSB8fCB0 aGlzLm9wdGlvbnNbc3RhdGVdKQorCisgICAgLy8gcHVzaCB0byBldmVudCBsb29wIHRvIGFsbG93 IGZvcm1zIHRvIHN1Ym1pdAorICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgc3Rh dGUgPT0gJ2xvYWRpbmdUZXh0JyA/CisgICAgICAgICRlbC5hZGRDbGFzcyhkKS5hdHRyKGQsIGQp IDoKKyAgICAgICAgJGVsLnJlbW92ZUNsYXNzKGQpLnJlbW92ZUF0dHIoZCkKKyAgICB9LCAwKQor ICB9CisKKyAgQnV0dG9uLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFy ICRwYXJlbnQgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9ucy1y YWRpbyJdJykKKworICAgICRwYXJlbnQgJiYgJHBhcmVudAorICAgICAgLmZpbmQoJy5hY3RpdmUn KQorICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKQorCisgICAgdGhpcy4kZWxlbWVudC50b2dn bGVDbGFzcygnYWN0aXZlJykKKyAgfQorCisKKyAvKiBCVVRUT04gUExVR0lOIERFRklOSVRJT04K KyAgKiA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgb2xkID0gJC5mbi5idXR0 b24KKworICAkLmZuLmJ1dHRvbiA9IGZ1bmN0aW9uIChvcHRpb24pIHsKKyAgICByZXR1cm4gdGhp cy5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAg LCBkYXRhID0gJHRoaXMuZGF0YSgnYnV0dG9uJykKKyAgICAgICAgLCBvcHRpb25zID0gdHlwZW9m IG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24KKyAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0 YSgnYnV0dG9uJywgKGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMsIG9wdGlvbnMpKSkKKyAgICAgIGlm IChvcHRpb24gPT0gJ3RvZ2dsZScpIGRhdGEudG9nZ2xlKCkKKyAgICAgIGVsc2UgaWYgKG9wdGlv bikgZGF0YS5zZXRTdGF0ZShvcHRpb24pCisgICAgfSkKKyAgfQorCisgICQuZm4uYnV0dG9uLmRl ZmF1bHRzID0geworICAgIGxvYWRpbmdUZXh0OiAnbG9hZGluZy4uLicKKyAgfQorCisgICQuZm4u YnV0dG9uLkNvbnN0cnVjdG9yID0gQnV0dG9uCisKKworIC8qIEJVVFRPTiBOTyBDT05GTElDVAor ICAqID09PT09PT09PT09PT09PT09PSAqLworCisgICQuZm4uYnV0dG9uLm5vQ29uZmxpY3QgPSBm dW5jdGlvbiAoKSB7CisgICAgJC5mbi5idXR0b24gPSBvbGQKKyAgICByZXR1cm4gdGhpcworICB9 CisKKworIC8qIEJVVFRPTiBEQVRBLUFQSQorICAqID09PT09PT09PT09PT09PSAqLworCisgICQo ZG9jdW1lbnQpLm9uKCdjbGljay5idXR0b24uZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlXj1idXR0 b25dJywgZnVuY3Rpb24gKGUpIHsKKyAgICB2YXIgJGJ0biA9ICQoZS50YXJnZXQpCisgICAgaWYg KCEkYnRuLmhhc0NsYXNzKCdidG4nKSkgJGJ0biA9ICRidG4uY2xvc2VzdCgnLmJ0bicpCisgICAg JGJ0bi5idXR0b24oJ3RvZ2dsZScpCisgIH0pCisKK30od2luZG93LmpRdWVyeSk7LyogPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICog Ym9vdHN0cmFwLWNhcm91c2VsLmpzIHYyLjMuMQorICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNv bS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2Nhcm91c2VsCisgKiA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQg MjAxMiBUd2l0dGVyLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNl bnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhp cyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5 IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNo ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl ciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0gKi8KKworCishZnVuY3Rpb24gKCQpIHsKKworICAidXNlIHN0 cmljdCI7IC8vIGpzaGludCA7XzsKKworCisgLyogQ0FST1VTRUwgQ0xBU1MgREVGSU5JVElPTgor ICAqID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgQ2Fyb3VzZWwgPSBmdW5j dGlvbiAoZWxlbWVudCwgb3B0aW9ucykgeworICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQp CisgICAgdGhpcy4kaW5kaWNhdG9ycyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmNhcm91c2VsLWlu ZGljYXRvcnMnKQorICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMKKyAgICB0aGlzLm9wdGlvbnMu cGF1c2UgPT0gJ2hvdmVyJyAmJiB0aGlzLiRlbGVtZW50CisgICAgICAub24oJ21vdXNlZW50ZXIn LCAkLnByb3h5KHRoaXMucGF1c2UsIHRoaXMpKQorICAgICAgLm9uKCdtb3VzZWxlYXZlJywgJC5w cm94eSh0aGlzLmN5Y2xlLCB0aGlzKSkKKyAgfQorCisgIENhcm91c2VsLnByb3RvdHlwZSA9IHsK KworICAgIGN5Y2xlOiBmdW5jdGlvbiAoZSkgeworICAgICAgaWYgKCFlKSB0aGlzLnBhdXNlZCA9 IGZhbHNlCisgICAgICBpZiAodGhpcy5pbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVy dmFsKTsKKyAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnZhbAorICAgICAgICAmJiAhdGhpcy5wYXVz ZWQKKyAgICAgICAgJiYgKHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgkLnByb3h5KHRoaXMu bmV4dCwgdGhpcyksIHRoaXMub3B0aW9ucy5pbnRlcnZhbCkpCisgICAgICByZXR1cm4gdGhpcwor ICAgIH0KKworICAsIGdldEFjdGl2ZUluZGV4OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLiRh Y3RpdmUgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpCisgICAgICB0aGlzLiRp dGVtcyA9IHRoaXMuJGFjdGl2ZS5wYXJlbnQoKS5jaGlsZHJlbigpCisgICAgICByZXR1cm4gdGhp cy4kaXRlbXMuaW5kZXgodGhpcy4kYWN0aXZlKQorICAgIH0KKworICAsIHRvOiBmdW5jdGlvbiAo cG9zKSB7CisgICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZUluZGV4KCkKKyAg ICAgICAgLCB0aGF0ID0gdGhpcworCisgICAgICBpZiAocG9zID4gKHRoaXMuJGl0ZW1zLmxlbmd0 aCAtIDEpIHx8IHBvcyA8IDApIHJldHVybgorCisgICAgICBpZiAodGhpcy5zbGlkaW5nKSB7Cisg ICAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50Lm9uZSgnc2xpZCcsIGZ1bmN0aW9uICgpIHsKKyAg ICAgICAgICB0aGF0LnRvKHBvcykKKyAgICAgICAgfSkKKyAgICAgIH0KKworICAgICAgaWYgKGFj dGl2ZUluZGV4ID09IHBvcykgeworICAgICAgICByZXR1cm4gdGhpcy5wYXVzZSgpLmN5Y2xlKCkK KyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuc2xpZGUocG9zID4gYWN0aXZlSW5kZXggPyAn bmV4dCcgOiAncHJldicsICQodGhpcy4kaXRlbXNbcG9zXSkpCisgICAgfQorCisgICwgcGF1c2U6 IGZ1bmN0aW9uIChlKSB7CisgICAgICBpZiAoIWUpIHRoaXMucGF1c2VkID0gdHJ1ZQorICAgICAg aWYgKHRoaXMuJGVsZW1lbnQuZmluZCgnLm5leHQsIC5wcmV2JykubGVuZ3RoICYmICQuc3VwcG9y dC50cmFuc2l0aW9uLmVuZCkgeworICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJC5zdXBw b3J0LnRyYW5zaXRpb24uZW5kKQorICAgICAgICB0aGlzLmN5Y2xlKHRydWUpCisgICAgICB9Cisg ICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpCisgICAgICB0aGlzLmludGVydmFsID0g bnVsbAorICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgLCBuZXh0OiBmdW5jdGlvbiAoKSB7 CisgICAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm4KKyAgICAgIHJldHVybiB0aGlzLnNsaWRl KCduZXh0JykKKyAgICB9CisKKyAgLCBwcmV2OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhp cy5zbGlkaW5nKSByZXR1cm4KKyAgICAgIHJldHVybiB0aGlzLnNsaWRlKCdwcmV2JykKKyAgICB9 CisKKyAgLCBzbGlkZTogZnVuY3Rpb24gKHR5cGUsIG5leHQpIHsKKyAgICAgIHZhciAkYWN0aXZl ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuaXRlbS5hY3RpdmUnKQorICAgICAgICAsICRuZXh0ID0g bmV4dCB8fCAkYWN0aXZlW3R5cGVdKCkKKyAgICAgICAgLCBpc0N5Y2xpbmcgPSB0aGlzLmludGVy dmFsCisgICAgICAgICwgZGlyZWN0aW9uID0gdHlwZSA9PSAnbmV4dCcgPyAnbGVmdCcgOiAncmln aHQnCisgICAgICAgICwgZmFsbGJhY2sgID0gdHlwZSA9PSAnbmV4dCcgPyAnZmlyc3QnIDogJ2xh c3QnCisgICAgICAgICwgdGhhdCA9IHRoaXMKKyAgICAgICAgLCBlCisKKyAgICAgIHRoaXMuc2xp ZGluZyA9IHRydWUKKworICAgICAgaXNDeWNsaW5nICYmIHRoaXMucGF1c2UoKQorCisgICAgICAk bmV4dCA9ICRuZXh0Lmxlbmd0aCA/ICRuZXh0IDogdGhpcy4kZWxlbWVudC5maW5kKCcuaXRlbScp W2ZhbGxiYWNrXSgpCisKKyAgICAgIGUgPSAkLkV2ZW50KCdzbGlkZScsIHsKKyAgICAgICAgcmVs YXRlZFRhcmdldDogJG5leHRbMF0KKyAgICAgICwgZGlyZWN0aW9uOiBkaXJlY3Rpb24KKyAgICAg IH0pCisKKyAgICAgIGlmICgkbmV4dC5oYXNDbGFzcygnYWN0aXZlJykpIHJldHVybgorCisgICAg ICBpZiAodGhpcy4kaW5kaWNhdG9ycy5sZW5ndGgpIHsKKyAgICAgICAgdGhpcy4kaW5kaWNhdG9y cy5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpCisgICAgICAgIHRoaXMuJGVs ZW1lbnQub25lKCdzbGlkJywgZnVuY3Rpb24gKCkgeworICAgICAgICAgIHZhciAkbmV4dEluZGlj YXRvciA9ICQodGhhdC4kaW5kaWNhdG9ycy5jaGlsZHJlbigpW3RoYXQuZ2V0QWN0aXZlSW5kZXgo KV0pCisgICAgICAgICAgJG5leHRJbmRpY2F0b3IgJiYgJG5leHRJbmRpY2F0b3IuYWRkQ2xhc3Mo J2FjdGl2ZScpCisgICAgICAgIH0pCisgICAgICB9CisKKyAgICAgIGlmICgkLnN1cHBvcnQudHJh bnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdzbGlkZScpKSB7CisgICAgICAgIHRo aXMuJGVsZW1lbnQudHJpZ2dlcihlKQorICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQo KSkgcmV0dXJuCisgICAgICAgICRuZXh0LmFkZENsYXNzKHR5cGUpCisgICAgICAgICRuZXh0WzBd Lm9mZnNldFdpZHRoIC8vIGZvcmNlIHJlZmxvdworICAgICAgICAkYWN0aXZlLmFkZENsYXNzKGRp cmVjdGlvbikKKyAgICAgICAgJG5leHQuYWRkQ2xhc3MoZGlyZWN0aW9uKQorICAgICAgICB0aGlz LiRlbGVtZW50Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHsKKyAg ICAgICAgICAkbmV4dC5yZW1vdmVDbGFzcyhbdHlwZSwgZGlyZWN0aW9uXS5qb2luKCcgJykpLmFk ZENsYXNzKCdhY3RpdmUnKQorICAgICAgICAgICRhY3RpdmUucmVtb3ZlQ2xhc3MoWydhY3RpdmUn LCBkaXJlY3Rpb25dLmpvaW4oJyAnKSkKKyAgICAgICAgICB0aGF0LnNsaWRpbmcgPSBmYWxzZQor ICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGF0LiRlbGVtZW50LnRyaWdnZXIo J3NsaWQnKSB9LCAwKQorICAgICAgICB9KQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy4k ZWxlbWVudC50cmlnZ2VyKGUpCisgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSBy ZXR1cm4KKyAgICAgICAgJGFjdGl2ZS5yZW1vdmVDbGFzcygnYWN0aXZlJykKKyAgICAgICAgJG5l eHQuYWRkQ2xhc3MoJ2FjdGl2ZScpCisgICAgICAgIHRoaXMuc2xpZGluZyA9IGZhbHNlCisgICAg ICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignc2xpZCcpCisgICAgICB9CisKKyAgICAgIGlzQ3lj bGluZyAmJiB0aGlzLmN5Y2xlKCkKKworICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgfQor CisKKyAvKiBDQVJPVVNFTCBQTFVHSU4gREVGSU5JVElPTgorICAqID09PT09PT09PT09PT09PT09 PT09PT09PT09ICovCisKKyAgdmFyIG9sZCA9ICQuZm4uY2Fyb3VzZWwKKworICAkLmZuLmNhcm91 c2VsID0gZnVuY3Rpb24gKG9wdGlvbikgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24g KCkgeworICAgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAgICAgICAsIGRhdGEgPSAkdGhpcy5k YXRhKCdjYXJvdXNlbCcpCisgICAgICAgICwgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmNh cm91c2VsLmRlZmF1bHRzLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbikKKyAg ICAgICAgLCBhY3Rpb24gPSB0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnID8gb3B0aW9uIDogb3B0 aW9ucy5zbGlkZQorICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdjYXJvdXNlbCcsIChkYXRh ID0gbmV3IENhcm91c2VsKHRoaXMsIG9wdGlvbnMpKSkKKyAgICAgIGlmICh0eXBlb2Ygb3B0aW9u ID09ICdudW1iZXInKSBkYXRhLnRvKG9wdGlvbikKKyAgICAgIGVsc2UgaWYgKGFjdGlvbikgZGF0 YVthY3Rpb25dKCkKKyAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaW50ZXJ2YWwpIGRhdGEucGF1c2Uo KS5jeWNsZSgpCisgICAgfSkKKyAgfQorCisgICQuZm4uY2Fyb3VzZWwuZGVmYXVsdHMgPSB7Cisg ICAgaW50ZXJ2YWw6IDUwMDAKKyAgLCBwYXVzZTogJ2hvdmVyJworICB9CisKKyAgJC5mbi5jYXJv dXNlbC5Db25zdHJ1Y3RvciA9IENhcm91c2VsCisKKworIC8qIENBUk9VU0VMIE5PIENPTkZMSUNU CisgICogPT09PT09PT09PT09PT09PT09PT0gKi8KKworICAkLmZuLmNhcm91c2VsLm5vQ29uZmxp Y3QgPSBmdW5jdGlvbiAoKSB7CisgICAgJC5mbi5jYXJvdXNlbCA9IG9sZAorICAgIHJldHVybiB0 aGlzCisgIH0KKworIC8qIENBUk9VU0VMIERBVEEtQVBJCisgICogPT09PT09PT09PT09PT09PT0g Ki8KKworICAkKGRvY3VtZW50KS5vbignY2xpY2suY2Fyb3VzZWwuZGF0YS1hcGknLCAnW2RhdGEt c2xpZGVdLCBbZGF0YS1zbGlkZS10b10nLCBmdW5jdGlvbiAoZSkgeworICAgIHZhciAkdGhpcyA9 ICQodGhpcyksIGhyZWYKKyAgICAgICwgJHRhcmdldCA9ICQoJHRoaXMuYXR0cignZGF0YS10YXJn ZXQnKSB8fCAoaHJlZiA9ICR0aGlzLmF0dHIoJ2hyZWYnKSkgJiYgaHJlZi5yZXBsYWNlKC8uKig/ PSNbXlxzXSskKS8sICcnKSkgLy9zdHJpcCBmb3IgaWU3CisgICAgICAsIG9wdGlvbnMgPSAkLmV4 dGVuZCh7fSwgJHRhcmdldC5kYXRhKCksICR0aGlzLmRhdGEoKSkKKyAgICAgICwgc2xpZGVJbmRl eAorCisgICAgJHRhcmdldC5jYXJvdXNlbChvcHRpb25zKQorCisgICAgaWYgKHNsaWRlSW5kZXgg PSAkdGhpcy5hdHRyKCdkYXRhLXNsaWRlLXRvJykpIHsKKyAgICAgICR0YXJnZXQuZGF0YSgnY2Fy b3VzZWwnKS5wYXVzZSgpLnRvKHNsaWRlSW5kZXgpLmN5Y2xlKCkKKyAgICB9CisKKyAgICBlLnBy ZXZlbnREZWZhdWx0KCkKKyAgfSkKKworfSh3aW5kb3cualF1ZXJ5KTsvKiA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib290 c3RyYXAtY29sbGFwc2UuanMgdjIuMy4xCisgKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jv b3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjY29sbGFwc2UKKyAqID09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAy MDEyIFR3aXR0ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hl Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1 dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy IHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09ICovCisKKworIWZ1bmN0aW9uICgkKSB7CisKKyAgInVzZSBz dHJpY3QiOyAvLyBqc2hpbnQgO187CisKKworIC8qIENPTExBUFNFIFBVQkxJQyBDTEFTUyBERUZJ TklUSU9OCisgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIg Q29sbGFwc2UgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykgeworICAgIHRoaXMuJGVsZW1l bnQgPSAkKGVsZW1lbnQpCisgICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4uY29s bGFwc2UuZGVmYXVsdHMsIG9wdGlvbnMpCisKKyAgICBpZiAodGhpcy5vcHRpb25zLnBhcmVudCkg eworICAgICAgdGhpcy4kcGFyZW50ID0gJCh0aGlzLm9wdGlvbnMucGFyZW50KQorICAgIH0KKwor ICAgIHRoaXMub3B0aW9ucy50b2dnbGUgJiYgdGhpcy50b2dnbGUoKQorICB9CisKKyAgQ29sbGFw c2UucHJvdG90eXBlID0geworCisgICAgY29uc3RydWN0b3I6IENvbGxhcHNlCisKKyAgLCBkaW1l bnNpb246IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBoYXNXaWR0aCA9IHRoaXMuJGVsZW1lbnQu aGFzQ2xhc3MoJ3dpZHRoJykKKyAgICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVp Z2h0JworICAgIH0KKworICAsIHNob3c6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkaW1lbnNp b24KKyAgICAgICAgLCBzY3JvbGwKKyAgICAgICAgLCBhY3RpdmVzCisgICAgICAgICwgaGFzRGF0 YQorCisgICAgICBpZiAodGhpcy50cmFuc2l0aW9uaW5nIHx8IHRoaXMuJGVsZW1lbnQuaGFzQ2xh c3MoJ2luJykpIHJldHVybgorCisgICAgICBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpCisg ICAgICBzY3JvbGwgPSAkLmNhbWVsQ2FzZShbJ3Njcm9sbCcsIGRpbWVuc2lvbl0uam9pbignLScp KQorICAgICAgYWN0aXZlcyA9IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuZmluZCgnPiAu YWNjb3JkaW9uLWdyb3VwID4gLmluJykKKworICAgICAgaWYgKGFjdGl2ZXMgJiYgYWN0aXZlcy5s ZW5ndGgpIHsKKyAgICAgICAgaGFzRGF0YSA9IGFjdGl2ZXMuZGF0YSgnY29sbGFwc2UnKQorICAg ICAgICBpZiAoaGFzRGF0YSAmJiBoYXNEYXRhLnRyYW5zaXRpb25pbmcpIHJldHVybgorICAgICAg ICBhY3RpdmVzLmNvbGxhcHNlKCdoaWRlJykKKyAgICAgICAgaGFzRGF0YSB8fCBhY3RpdmVzLmRh dGEoJ2NvbGxhcHNlJywgbnVsbCkKKyAgICAgIH0KKworICAgICAgdGhpcy4kZWxlbWVudFtkaW1l bnNpb25dKDApCisgICAgICB0aGlzLnRyYW5zaXRpb24oJ2FkZENsYXNzJywgJC5FdmVudCgnc2hv dycpLCAnc2hvd24nKQorICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVu dFtkaW1lbnNpb25dKHRoaXMuJGVsZW1lbnRbMF1bc2Nyb2xsXSkKKyAgICB9CisKKyAgLCBoaWRl OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZGltZW5zaW9uCisgICAgICBpZiAodGhpcy50cmFu c2l0aW9uaW5nIHx8ICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdpbicpKSByZXR1cm4KKyAgICAg IGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKCkKKyAgICAgIHRoaXMucmVzZXQodGhpcy4kZWxl bWVudFtkaW1lbnNpb25dKCkpCisgICAgICB0aGlzLnRyYW5zaXRpb24oJ3JlbW92ZUNsYXNzJywg JC5FdmVudCgnaGlkZScpLCAnaGlkZGVuJykKKyAgICAgIHRoaXMuJGVsZW1lbnRbZGltZW5zaW9u XSgwKQorICAgIH0KKworICAsIHJlc2V0OiBmdW5jdGlvbiAoc2l6ZSkgeworICAgICAgdmFyIGRp bWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKCkKKworICAgICAgdGhpcy4kZWxlbWVudAorICAgICAg ICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlJykKKyAgICAgICAgW2RpbWVuc2lvbl0oc2l6ZSB8fCAn YXV0bycpCisgICAgICAgIFswXS5vZmZzZXRXaWR0aAorCisgICAgICB0aGlzLiRlbGVtZW50W3Np emUgIT09IG51bGwgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10oJ2NvbGxhcHNlJykKKwor ICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgLCB0cmFuc2l0aW9uOiBmdW5jdGlvbiAobWV0 aG9kLCBzdGFydEV2ZW50LCBjb21wbGV0ZUV2ZW50KSB7CisgICAgICB2YXIgdGhhdCA9IHRoaXMK KyAgICAgICAgLCBjb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmIChzdGFy dEV2ZW50LnR5cGUgPT0gJ3Nob3cnKSB0aGF0LnJlc2V0KCkKKyAgICAgICAgICAgIHRoYXQudHJh bnNpdGlvbmluZyA9IDAKKyAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcihjb21wbGV0 ZUV2ZW50KQorICAgICAgICAgIH0KKworICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHN0YXJ0 RXZlbnQpCisKKyAgICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1 cm4KKworICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMQorCisgICAgICB0aGlzLiRlbGVtZW50 W21ldGhvZF0oJ2luJykKKworICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxl bWVudC5oYXNDbGFzcygnY29sbGFwc2UnKSA/CisgICAgICAgIHRoaXMuJGVsZW1lbnQub25lKCQu c3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgY29tcGxldGUpIDoKKyAgICAgICAgY29tcGxldGUoKQor ICAgIH0KKworICAsIHRvZ2dsZTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpc1t0aGlzLiRlbGVt ZW50Lmhhc0NsYXNzKCdpbicpID8gJ2hpZGUnIDogJ3Nob3cnXSgpCisgICAgfQorCisgIH0KKwor CisgLyogQ09MTEFQU0UgUExVR0lOIERFRklOSVRJT04KKyAgKiA9PT09PT09PT09PT09PT09PT09 PT09PT09PSAqLworCisgIHZhciBvbGQgPSAkLmZuLmNvbGxhcHNlCisKKyAgJC5mbi5jb2xsYXBz ZSA9IGZ1bmN0aW9uIChvcHRpb24pIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgp IHsKKyAgICAgIHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0 YSgnY29sbGFwc2UnKQorICAgICAgICAsIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgJC5mbi5jb2xs YXBzZS5kZWZhdWx0cywgJHRoaXMuZGF0YSgpLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYm IG9wdGlvbikKKyAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnY29sbGFwc2UnLCAoZGF0YSA9 IG5ldyBDb2xsYXBzZSh0aGlzLCBvcHRpb25zKSkpCisgICAgICBpZiAodHlwZW9mIG9wdGlvbiA9 PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKCkKKyAgICB9KQorICB9CisKKyAgJC5mbi5jb2xsYXBz ZS5kZWZhdWx0cyA9IHsKKyAgICB0b2dnbGU6IHRydWUKKyAgfQorCisgICQuZm4uY29sbGFwc2Uu Q29uc3RydWN0b3IgPSBDb2xsYXBzZQorCisKKyAvKiBDT0xMQVBTRSBOTyBDT05GTElDVAorICAq ID09PT09PT09PT09PT09PT09PT09ICovCisKKyAgJC5mbi5jb2xsYXBzZS5ub0NvbmZsaWN0ID0g ZnVuY3Rpb24gKCkgeworICAgICQuZm4uY29sbGFwc2UgPSBvbGQKKyAgICByZXR1cm4gdGhpcwor ICB9CisKKworIC8qIENPTExBUFNFIERBVEEtQVBJCisgICogPT09PT09PT09PT09PT09PT0gKi8K KworICAkKGRvY3VtZW50KS5vbignY2xpY2suY29sbGFwc2UuZGF0YS1hcGknLCAnW2RhdGEtdG9n Z2xlPWNvbGxhcHNlXScsIGZ1bmN0aW9uIChlKSB7CisgICAgdmFyICR0aGlzID0gJCh0aGlzKSwg aHJlZgorICAgICAgLCB0YXJnZXQgPSAkdGhpcy5hdHRyKCdkYXRhLXRhcmdldCcpCisgICAgICAg IHx8IGUucHJldmVudERlZmF1bHQoKQorICAgICAgICB8fCAoaHJlZiA9ICR0aGlzLmF0dHIoJ2hy ZWYnKSkgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sICcnKSAvL3N0cmlwIGZvciBp ZTcKKyAgICAgICwgb3B0aW9uID0gJCh0YXJnZXQpLmRhdGEoJ2NvbGxhcHNlJykgPyAndG9nZ2xl JyA6ICR0aGlzLmRhdGEoKQorICAgICR0aGlzWyQodGFyZ2V0KS5oYXNDbGFzcygnaW4nKSA/ICdh ZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgnY29sbGFwc2VkJykKKyAgICAkKHRhcmdldCkuY29s bGFwc2Uob3B0aW9uKQorICB9KQorCit9KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYm9vdHN0 cmFwLWRyb3Bkb3duLmpzIHYyLjMuMQorICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290 c3RyYXAvamF2YXNjcmlwdC5odG1sI2Ryb3Bkb3ducworICogPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAx MiBUd2l0dGVyLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNl LCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBm aWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9i dGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5v cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0 aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PSAqLworCisKKyFmdW5jdGlvbiAoJCkgeworCisgICJ1c2Ugc3Ry aWN0IjsgLy8ganNoaW50IDtfOworCisKKyAvKiBEUk9QRE9XTiBDTEFTUyBERUZJTklUSU9OCisg ICogPT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciB0b2dnbGUgPSAnW2RhdGEt dG9nZ2xlPWRyb3Bkb3duXScKKyAgICAsIERyb3Bkb3duID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsK KyAgICAgICAgdmFyICRlbCA9ICQoZWxlbWVudCkub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBp JywgdGhpcy50b2dnbGUpCisgICAgICAgICQoJ2h0bWwnKS5vbignY2xpY2suZHJvcGRvd24uZGF0 YS1hcGknLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgJGVsLnBhcmVudCgpLnJlbW92ZUNsYXNz KCdvcGVuJykKKyAgICAgICAgfSkKKyAgICAgIH0KKworICBEcm9wZG93bi5wcm90b3R5cGUgPSB7 CisKKyAgICBjb25zdHJ1Y3RvcjogRHJvcGRvd24KKworICAsIHRvZ2dsZTogZnVuY3Rpb24gKGUp IHsKKyAgICAgIHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAgLCAkcGFyZW50CisgICAgICAg ICwgaXNBY3RpdmUKKworICAgICAgaWYgKCR0aGlzLmlzKCcuZGlzYWJsZWQsIDpkaXNhYmxlZCcp KSByZXR1cm4KKworICAgICAgJHBhcmVudCA9IGdldFBhcmVudCgkdGhpcykKKworICAgICAgaXNB Y3RpdmUgPSAkcGFyZW50Lmhhc0NsYXNzKCdvcGVuJykKKworICAgICAgY2xlYXJNZW51cygpCisK KyAgICAgIGlmICghaXNBY3RpdmUpIHsKKyAgICAgICAgJHBhcmVudC50b2dnbGVDbGFzcygnb3Bl bicpCisgICAgICB9CisKKyAgICAgICR0aGlzLmZvY3VzKCkKKworICAgICAgcmV0dXJuIGZhbHNl CisgICAgfQorCisgICwga2V5ZG93bjogZnVuY3Rpb24gKGUpIHsKKyAgICAgIHZhciAkdGhpcwor ICAgICAgICAsICRpdGVtcworICAgICAgICAsICRhY3RpdmUKKyAgICAgICAgLCAkcGFyZW50Cisg ICAgICAgICwgaXNBY3RpdmUKKyAgICAgICAgLCBpbmRleAorCisgICAgICBpZiAoIS8oMzh8NDB8 MjcpLy50ZXN0KGUua2V5Q29kZSkpIHJldHVybgorCisgICAgICAkdGhpcyA9ICQodGhpcykKKwor ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCisgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCisKKyAg ICAgIGlmICgkdGhpcy5pcygnLmRpc2FibGVkLCA6ZGlzYWJsZWQnKSkgcmV0dXJuCisKKyAgICAg ICRwYXJlbnQgPSBnZXRQYXJlbnQoJHRoaXMpCisKKyAgICAgIGlzQWN0aXZlID0gJHBhcmVudC5o YXNDbGFzcygnb3BlbicpCisKKyAgICAgIGlmICghaXNBY3RpdmUgfHwgKGlzQWN0aXZlICYmIGUu a2V5Q29kZSA9PSAyNykpIHsKKyAgICAgICAgaWYgKGUud2hpY2ggPT0gMjcpICRwYXJlbnQuZmlu ZCh0b2dnbGUpLmZvY3VzKCkKKyAgICAgICAgcmV0dXJuICR0aGlzLmNsaWNrKCkKKyAgICAgIH0K KworICAgICAgJGl0ZW1zID0gJCgnW3JvbGU9bWVudV0gbGk6bm90KC5kaXZpZGVyKTp2aXNpYmxl IGEnLCAkcGFyZW50KQorCisgICAgICBpZiAoISRpdGVtcy5sZW5ndGgpIHJldHVybgorCisgICAg ICBpbmRleCA9ICRpdGVtcy5pbmRleCgkaXRlbXMuZmlsdGVyKCc6Zm9jdXMnKSkKKworICAgICAg aWYgKGUua2V5Q29kZSA9PSAzOCAmJiBpbmRleCA+IDApIGluZGV4LS0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAKKyAgICAgIGlmIChlLmtleUNvZGUgPT0gNDAg JiYgaW5kZXggPCAkaXRlbXMubGVuZ3RoIC0gMSkgaW5kZXgrKyAgICAgICAgICAgICAgICAgICAg ICAgIC8vIGRvd24KKyAgICAgIGlmICghfmluZGV4KSBpbmRleCA9IDAKKworICAgICAgJGl0ZW1z CisgICAgICAgIC5lcShpbmRleCkKKyAgICAgICAgLmZvY3VzKCkKKyAgICB9CisKKyAgfQorCisg IGZ1bmN0aW9uIGNsZWFyTWVudXMoKSB7CisgICAgJCh0b2dnbGUpLmVhY2goZnVuY3Rpb24gKCkg eworICAgICAgZ2V0UGFyZW50KCQodGhpcykpLnJlbW92ZUNsYXNzKCdvcGVuJykKKyAgICB9KQor ICB9CisKKyAgZnVuY3Rpb24gZ2V0UGFyZW50KCR0aGlzKSB7CisgICAgdmFyIHNlbGVjdG9yID0g JHRoaXMuYXR0cignZGF0YS10YXJnZXQnKQorICAgICAgLCAkcGFyZW50CisKKyAgICBpZiAoIXNl bGVjdG9yKSB7CisgICAgICBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2hyZWYnKQorICAgICAgc2Vs ZWN0b3IgPSBzZWxlY3RvciAmJiAvIy8udGVzdChzZWxlY3RvcikgJiYgc2VsZWN0b3IucmVwbGFj ZSgvLiooPz0jW15cc10qJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3CisgICAgfQorCisgICAgJHBh cmVudCA9IHNlbGVjdG9yICYmICQoc2VsZWN0b3IpCisKKyAgICBpZiAoISRwYXJlbnQgfHwgISRw YXJlbnQubGVuZ3RoKSAkcGFyZW50ID0gJHRoaXMucGFyZW50KCkKKworICAgIHJldHVybiAkcGFy ZW50CisgIH0KKworCisgIC8qIERST1BET1dOIFBMVUdJTiBERUZJTklUSU9OCisgICAqID09PT09 PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgdmFyIG9sZCA9ICQuZm4uZHJvcGRvd24KKwor ICAkLmZuLmRyb3Bkb3duID0gZnVuY3Rpb24gKG9wdGlvbikgeworICAgIHJldHVybiB0aGlzLmVh Y2goZnVuY3Rpb24gKCkgeworICAgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAgICAgICAsIGRh dGEgPSAkdGhpcy5kYXRhKCdkcm9wZG93bicpCisgICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEo J2Ryb3Bkb3duJywgKGRhdGEgPSBuZXcgRHJvcGRvd24odGhpcykpKQorICAgICAgaWYgKHR5cGVv ZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlzKQorICAgIH0pCisg IH0KKworICAkLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yID0gRHJvcGRvd24KKworCisgLyogRFJP UERPV04gTk8gQ09ORkxJQ1QKKyAgKiA9PT09PT09PT09PT09PT09PT09PSAqLworCisgICQuZm4u ZHJvcGRvd24ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAkLmZuLmRyb3Bkb3duID0g b2xkCisgICAgcmV0dXJuIHRoaXMKKyAgfQorCisKKyAgLyogQVBQTFkgVE8gU1RBTkRBUkQgRFJP UERPV04gRUxFTUVOVFMKKyAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0g Ki8KKworICAkKGRvY3VtZW50KQorICAgIC5vbignY2xpY2suZHJvcGRvd24uZGF0YS1hcGknLCBj bGVhck1lbnVzKQorICAgIC5vbignY2xpY2suZHJvcGRvd24uZGF0YS1hcGknLCAnLmRyb3Bkb3du IGZvcm0nLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpIH0pCisgICAgLm9uKCdj bGljay5kcm9wZG93bi1tZW51JywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKSB9 KQorICAgIC5vbignY2xpY2suZHJvcGRvd24uZGF0YS1hcGknICAsIHRvZ2dsZSwgRHJvcGRvd24u cHJvdG90eXBlLnRvZ2dsZSkKKyAgICAub24oJ2tleWRvd24uZHJvcGRvd24uZGF0YS1hcGknLCB0 b2dnbGUgKyAnLCBbcm9sZT1tZW51XScgLCBEcm9wZG93bi5wcm90b3R5cGUua2V5ZG93bikKKwor fSh3aW5kb3cualF1ZXJ5KTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQorICogYm9vdHN0cmFwLW1vZGFsLmpzIHYyLjMuMQorICog aHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI21vZGFs cworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CisgKiBDb3B5cmlnaHQgMjAxMiBUd2l0dGVyLCBJbmMuCisgKgorICogTGljZW5zZWQg dW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cisg KiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhl IExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAq CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKyFmdW5jdGlv biAoJCkgeworCisgICJ1c2Ugc3RyaWN0IjsgLy8ganNoaW50IDtfOworCisKKyAvKiBNT0RBTCBD TEFTUyBERUZJTklUSU9OCisgICogPT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBN b2RhbCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7CisgICAgdGhpcy5vcHRpb25zID0g b3B0aW9ucworICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpCisgICAgICAuZGVsZWdhdGUo J1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLCAnY2xpY2suZGlzbWlzcy5tb2RhbCcsICQucHJveHko dGhpcy5oaWRlLCB0aGlzKSkKKyAgICB0aGlzLm9wdGlvbnMucmVtb3RlICYmIHRoaXMuJGVsZW1l bnQuZmluZCgnLm1vZGFsLWJvZHknKS5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUpCisgIH0KKwor ICBNb2RhbC5wcm90b3R5cGUgPSB7CisKKyAgICAgIGNvbnN0cnVjdG9yOiBNb2RhbAorCisgICAg LCB0b2dnbGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXNbIXRoaXMuaXNTaG93 biA/ICdzaG93JyA6ICdoaWRlJ10oKQorICAgICAgfQorCisgICAgLCBzaG93OiBmdW5jdGlvbiAo KSB7CisgICAgICAgIHZhciB0aGF0ID0gdGhpcworICAgICAgICAgICwgZSA9ICQuRXZlbnQoJ3No b3cnKQorCisgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKQorCisgICAgICAgIGlmICh0 aGlzLmlzU2hvd24gfHwgZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuCisKKyAgICAgICAg dGhpcy5pc1Nob3duID0gdHJ1ZQorCisgICAgICAgIHRoaXMuZXNjYXBlKCkKKworICAgICAgICB0 aGlzLmJhY2tkcm9wKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9ICQu c3VwcG9ydC50cmFuc2l0aW9uICYmIHRoYXQuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKQorCisg ICAgICAgICAgaWYgKCF0aGF0LiRlbGVtZW50LnBhcmVudCgpLmxlbmd0aCkgeworICAgICAgICAg ICAgdGhhdC4kZWxlbWVudC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KSAvL2Rvbid0IG1vdmUgbW9k YWxzIGRvbSBwb3NpdGlvbgorICAgICAgICAgIH0KKworICAgICAgICAgIHRoYXQuJGVsZW1lbnQu c2hvdygpCisKKyAgICAgICAgICBpZiAodHJhbnNpdGlvbikgeworICAgICAgICAgICAgdGhhdC4k ZWxlbWVudFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3cKKyAgICAgICAgICB9CisKKyAg ICAgICAgICB0aGF0LiRlbGVtZW50CisgICAgICAgICAgICAuYWRkQ2xhc3MoJ2luJykKKyAgICAg ICAgICAgIC5hdHRyKCdhcmlhLWhpZGRlbicsIGZhbHNlKQorCisgICAgICAgICAgdGhhdC5lbmZv cmNlRm9jdXMoKQorCisgICAgICAgICAgdHJhbnNpdGlvbiA/CisgICAgICAgICAgICB0aGF0LiRl bGVtZW50Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHsgdGhhdC4k ZWxlbWVudC5mb2N1cygpLnRyaWdnZXIoJ3Nob3duJykgfSkgOgorICAgICAgICAgICAgdGhhdC4k ZWxlbWVudC5mb2N1cygpLnRyaWdnZXIoJ3Nob3duJykKKworICAgICAgICB9KQorICAgICAgfQor CisgICAgLCBoaWRlOiBmdW5jdGlvbiAoZSkgeworICAgICAgICBlICYmIGUucHJldmVudERlZmF1 bHQoKQorCisgICAgICAgIHZhciB0aGF0ID0gdGhpcworCisgICAgICAgIGUgPSAkLkV2ZW50KCdo aWRlJykKKworICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSkKKworICAgICAgICBpZiAo IXRoaXMuaXNTaG93biB8fCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm4KKworICAgICAg ICB0aGlzLmlzU2hvd24gPSBmYWxzZQorCisgICAgICAgIHRoaXMuZXNjYXBlKCkKKworICAgICAg ICAkKGRvY3VtZW50KS5vZmYoJ2ZvY3VzaW4ubW9kYWwnKQorCisgICAgICAgIHRoaXMuJGVsZW1l bnQKKyAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2luJykKKyAgICAgICAgICAuYXR0cignYXJpYS1o aWRkZW4nLCB0cnVlKQorCisgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVs ZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/CisgICAgICAgICAgdGhpcy5oaWRlV2l0aFRyYW5zaXRp b24oKSA6CisgICAgICAgICAgdGhpcy5oaWRlTW9kYWwoKQorICAgICAgfQorCisgICAgLCBlbmZv cmNlRm9jdXM6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHRoYXQgPSB0aGlzCisgICAgICAg ICQoZG9jdW1lbnQpLm9uKCdmb2N1c2luLm1vZGFsJywgZnVuY3Rpb24gKGUpIHsKKyAgICAgICAg ICBpZiAodGhhdC4kZWxlbWVudFswXSAhPT0gZS50YXJnZXQgJiYgIXRoYXQuJGVsZW1lbnQuaGFz KGUudGFyZ2V0KS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQuZm9jdXMoKQor ICAgICAgICAgIH0KKyAgICAgICAgfSkKKyAgICAgIH0KKworICAgICwgZXNjYXBlOiBmdW5jdGlv biAoKSB7CisgICAgICAgIHZhciB0aGF0ID0gdGhpcworICAgICAgICBpZiAodGhpcy5pc1Nob3du ICYmIHRoaXMub3B0aW9ucy5rZXlib2FyZCkgeworICAgICAgICAgIHRoaXMuJGVsZW1lbnQub24o J2tleXVwLmRpc21pc3MubW9kYWwnLCBmdW5jdGlvbiAoIGUgKSB7CisgICAgICAgICAgICBlLndo aWNoID09IDI3ICYmIHRoYXQuaGlkZSgpCisgICAgICAgICAgfSkKKyAgICAgICAgfSBlbHNlIGlm ICghdGhpcy5pc1Nob3duKSB7CisgICAgICAgICAgdGhpcy4kZWxlbWVudC5vZmYoJ2tleXVwLmRp c21pc3MubW9kYWwnKQorICAgICAgICB9CisgICAgICB9CisKKyAgICAsIGhpZGVXaXRoVHJhbnNp dGlvbjogZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgdGhhdCA9IHRoaXMKKyAgICAgICAgICAs IHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgdGhhdC4k ZWxlbWVudC5vZmYoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKQorICAgICAgICAgICAgICB0aGF0 LmhpZGVNb2RhbCgpCisgICAgICAgICAgICB9LCA1MDApCisKKyAgICAgICAgdGhpcy4kZWxlbWVu dC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAg Y2xlYXJUaW1lb3V0KHRpbWVvdXQpCisgICAgICAgICAgdGhhdC5oaWRlTW9kYWwoKQorICAgICAg ICB9KQorICAgICAgfQorCisgICAgLCBoaWRlTW9kYWw6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAg dmFyIHRoYXQgPSB0aGlzCisgICAgICAgIHRoaXMuJGVsZW1lbnQuaGlkZSgpCisgICAgICAgIHRo aXMuYmFja2Ryb3AoZnVuY3Rpb24gKCkgeworICAgICAgICAgIHRoYXQucmVtb3ZlQmFja2Ryb3Ao KQorICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignaGlkZGVuJykKKyAgICAgICAgfSkK KyAgICAgIH0KKworICAgICwgcmVtb3ZlQmFja2Ryb3A6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAg dGhpcy4kYmFja2Ryb3AgJiYgdGhpcy4kYmFja2Ryb3AucmVtb3ZlKCkKKyAgICAgICAgdGhpcy4k YmFja2Ryb3AgPSBudWxsCisgICAgICB9CisKKyAgICAsIGJhY2tkcm9wOiBmdW5jdGlvbiAoY2Fs bGJhY2spIHsKKyAgICAgICAgdmFyIHRoYXQgPSB0aGlzCisgICAgICAgICAgLCBhbmltYXRlID0g dGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFkZScpID8gJ2ZhZGUnIDogJycKKworICAgICAgICBp ZiAodGhpcy5pc1Nob3duICYmIHRoaXMub3B0aW9ucy5iYWNrZHJvcCkgeworICAgICAgICAgIHZh ciBkb0FuaW1hdGUgPSAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBhbmltYXRlCisKKyAgICAgICAg ICB0aGlzLiRiYWNrZHJvcCA9ICQoJzxkaXYgY2xhc3M9Im1vZGFsLWJhY2tkcm9wICcgKyBhbmlt YXRlICsgJyIgLz4nKQorICAgICAgICAgICAgLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpCisKKyAg ICAgICAgICB0aGlzLiRiYWNrZHJvcC5jbGljaygKKyAgICAgICAgICAgIHRoaXMub3B0aW9ucy5i YWNrZHJvcCA9PSAnc3RhdGljJyA/CisgICAgICAgICAgICAgICQucHJveHkodGhpcy4kZWxlbWVu dFswXS5mb2N1cywgdGhpcy4kZWxlbWVudFswXSkKKyAgICAgICAgICAgIDogJC5wcm94eSh0aGlz LmhpZGUsIHRoaXMpCisgICAgICAgICAgKQorCisgICAgICAgICAgaWYgKGRvQW5pbWF0ZSkgdGhp cy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93CisKKyAgICAgICAgICB0 aGlzLiRiYWNrZHJvcC5hZGRDbGFzcygnaW4nKQorCisgICAgICAgICAgaWYgKCFjYWxsYmFjaykg cmV0dXJuCisKKyAgICAgICAgICBkb0FuaW1hdGUgPworICAgICAgICAgICAgdGhpcy4kYmFja2Ry b3Aub25lKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgY2FsbGJhY2spIDoKKyAgICAgICAgICAg IGNhbGxiYWNrKCkKKworICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2hvd24gJiYgdGhpcy4k YmFja2Ryb3ApIHsKKyAgICAgICAgICB0aGlzLiRiYWNrZHJvcC5yZW1vdmVDbGFzcygnaW4nKQor CisgICAgICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVudC5oYXNDbGFz cygnZmFkZScpPworICAgICAgICAgICAgdGhpcy4kYmFja2Ryb3Aub25lKCQuc3VwcG9ydC50cmFu c2l0aW9uLmVuZCwgY2FsbGJhY2spIDoKKyAgICAgICAgICAgIGNhbGxiYWNrKCkKKworICAgICAg ICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgY2FsbGJhY2soKQorICAgICAgICB9 CisgICAgICB9CisgIH0KKworCisgLyogTU9EQUwgUExVR0lOIERFRklOSVRJT04KKyAgKiA9PT09 PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBvbGQgPSAkLmZuLm1vZGFsCisKKyAgJC5m bi5tb2RhbCA9IGZ1bmN0aW9uIChvcHRpb24pIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0 aW9uICgpIHsKKyAgICAgIHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAgLCBkYXRhID0gJHRo aXMuZGF0YSgnbW9kYWwnKQorICAgICAgICAsIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgJC5mbi5t b2RhbC5kZWZhdWx0cywgJHRoaXMuZGF0YSgpLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYm IG9wdGlvbikKKyAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnbW9kYWwnLCAoZGF0YSA9IG5l dyBNb2RhbCh0aGlzLCBvcHRpb25zKSkpCisgICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3Ry aW5nJykgZGF0YVtvcHRpb25dKCkKKyAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2hvdykgZGF0YS5z aG93KCkKKyAgICB9KQorICB9CisKKyAgJC5mbi5tb2RhbC5kZWZhdWx0cyA9IHsKKyAgICAgIGJh Y2tkcm9wOiB0cnVlCisgICAgLCBrZXlib2FyZDogdHJ1ZQorICAgICwgc2hvdzogdHJ1ZQorICB9 CisKKyAgJC5mbi5tb2RhbC5Db25zdHJ1Y3RvciA9IE1vZGFsCisKKworIC8qIE1PREFMIE5PIENP TkZMSUNUCisgICogPT09PT09PT09PT09PT09PT0gKi8KKworICAkLmZuLm1vZGFsLm5vQ29uZmxp Y3QgPSBmdW5jdGlvbiAoKSB7CisgICAgJC5mbi5tb2RhbCA9IG9sZAorICAgIHJldHVybiB0aGlz CisgIH0KKworCisgLyogTU9EQUwgREFUQS1BUEkKKyAgKiA9PT09PT09PT09PT09PSAqLworCisg ICQoZG9jdW1lbnQpLm9uKCdjbGljay5tb2RhbC5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9Im1v ZGFsIl0nLCBmdW5jdGlvbiAoZSkgeworICAgIHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICwg aHJlZiA9ICR0aGlzLmF0dHIoJ2hyZWYnKQorICAgICAgLCAkdGFyZ2V0ID0gJCgkdGhpcy5hdHRy KCdkYXRhLXRhcmdldCcpIHx8IChocmVmICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cc10rJCkv LCAnJykpKSAvL3N0cmlwIGZvciBpZTcKKyAgICAgICwgb3B0aW9uID0gJHRhcmdldC5kYXRhKCdt b2RhbCcpID8gJ3RvZ2dsZScgOiAkLmV4dGVuZCh7IHJlbW90ZTohLyMvLnRlc3QoaHJlZikgJiYg aHJlZiB9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKQorCisgICAgZS5wcmV2ZW50RGVm YXVsdCgpCisKKyAgICAkdGFyZ2V0CisgICAgICAubW9kYWwob3B0aW9uKQorICAgICAgLm9uZSgn aGlkZScsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgJHRoaXMuZm9jdXMoKQorICAgICAgfSkKKyAg fSkKKworfSh3aW5kb3cualF1ZXJ5KTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib290c3RyYXAtdG9vbHRpcC5qcyB2 Mi4zLjEKKyAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQu aHRtbCN0b29sdGlwcworICogSW5zcGlyZWQgYnkgdGhlIG9yaWdpbmFsIGpRdWVyeS50aXBzeSBi eSBKYXNvbiBGcmFtZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy4KKyAq CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg IkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg TGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNF LTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQg dG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNl IGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJ RVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4K KyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBw ZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAq LworCisKKyFmdW5jdGlvbiAoJCkgeworCisgICJ1c2Ugc3RyaWN0IjsgLy8ganNoaW50IDtfOwor CisKKyAvKiBUT09MVElQIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OCisgICogPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBUb29sdGlwID0gZnVuY3Rpb24gKGVsZW1l bnQsIG9wdGlvbnMpIHsKKyAgICB0aGlzLmluaXQoJ3Rvb2x0aXAnLCBlbGVtZW50LCBvcHRpb25z KQorICB9CisKKyAgVG9vbHRpcC5wcm90b3R5cGUgPSB7CisKKyAgICBjb25zdHJ1Y3RvcjogVG9v bHRpcAorCisgICwgaW5pdDogZnVuY3Rpb24gKHR5cGUsIGVsZW1lbnQsIG9wdGlvbnMpIHsKKyAg ICAgIHZhciBldmVudEluCisgICAgICAgICwgZXZlbnRPdXQKKyAgICAgICAgLCB0cmlnZ2Vycwor ICAgICAgICAsIHRyaWdnZXIKKyAgICAgICAgLCBpCisKKyAgICAgIHRoaXMudHlwZSA9IHR5cGUK KyAgICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpCisgICAgICB0aGlzLm9wdGlvbnMgPSB0 aGlzLmdldE9wdGlvbnMob3B0aW9ucykKKyAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWUKKworICAg ICAgdHJpZ2dlcnMgPSB0aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgnICcpCisKKyAgICAgIGZv ciAoaSA9IHRyaWdnZXJzLmxlbmd0aDsgaS0tOykgeworICAgICAgICB0cmlnZ2VyID0gdHJpZ2dl cnNbaV0KKyAgICAgICAgaWYgKHRyaWdnZXIgPT0gJ2NsaWNrJykgeworICAgICAgICAgIHRoaXMu JGVsZW1lbnQub24oJ2NsaWNrLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3Rvciwg JC5wcm94eSh0aGlzLnRvZ2dsZSwgdGhpcykpCisgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAh PSAnbWFudWFsJykgeworICAgICAgICAgIGV2ZW50SW4gPSB0cmlnZ2VyID09ICdob3ZlcicgPyAn bW91c2VlbnRlcicgOiAnZm9jdXMnCisgICAgICAgICAgZXZlbnRPdXQgPSB0cmlnZ2VyID09ICdo b3ZlcicgPyAnbW91c2VsZWF2ZScgOiAnYmx1cicKKyAgICAgICAgICB0aGlzLiRlbGVtZW50Lm9u KGV2ZW50SW4gKyAnLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94 eSh0aGlzLmVudGVyLCB0aGlzKSkKKyAgICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKGV2ZW50T3V0 ICsgJy4nICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsICQucHJveHkodGhpcy5s ZWF2ZSwgdGhpcykpCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5vcHRpb25zLnNl bGVjdG9yID8KKyAgICAgICAgKHRoaXMuX29wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRp b25zLCB7IHRyaWdnZXI6ICdtYW51YWwnLCBzZWxlY3RvcjogJycgfSkpIDoKKyAgICAgICAgdGhp cy5maXhUaXRsZSgpCisgICAgfQorCisgICwgZ2V0T3B0aW9uczogZnVuY3Rpb24gKG9wdGlvbnMp IHsKKyAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgJC5mblt0aGlzLnR5cGVdLmRlZmF1bHRz LCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucykKKworICAgICAgaWYgKG9wdGlvbnMuZGVs YXkgJiYgdHlwZW9mIG9wdGlvbnMuZGVsYXkgPT0gJ251bWJlcicpIHsKKyAgICAgICAgb3B0aW9u cy5kZWxheSA9IHsKKyAgICAgICAgICBzaG93OiBvcHRpb25zLmRlbGF5CisgICAgICAgICwgaGlk ZTogb3B0aW9ucy5kZWxheQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBvcHRp b25zCisgICAgfQorCisgICwgZW50ZXI6IGZ1bmN0aW9uIChlKSB7CisgICAgICB2YXIgZGVmYXVs dHMgPSAkLmZuW3RoaXMudHlwZV0uZGVmYXVsdHMKKyAgICAgICAgLCBvcHRpb25zID0ge30KKyAg ICAgICAgLCBzZWxmCisKKyAgICAgIHRoaXMuX29wdGlvbnMgJiYgJC5lYWNoKHRoaXMuX29wdGlv bnMsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICAgIGlmIChkZWZhdWx0c1trZXldICE9 IHZhbHVlKSBvcHRpb25zW2tleV0gPSB2YWx1ZQorICAgICAgfSwgdGhpcykKKworICAgICAgc2Vs ZiA9ICQoZS5jdXJyZW50VGFyZ2V0KVt0aGlzLnR5cGVdKG9wdGlvbnMpLmRhdGEodGhpcy50eXBl KQorCisgICAgICBpZiAoIXNlbGYub3B0aW9ucy5kZWxheSB8fCAhc2VsZi5vcHRpb25zLmRlbGF5 LnNob3cpIHJldHVybiBzZWxmLnNob3coKQorCisgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1l b3V0KQorICAgICAgc2VsZi5ob3ZlclN0YXRlID0gJ2luJworICAgICAgdGhpcy50aW1lb3V0ID0g c2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKHNlbGYuaG92ZXJTdGF0ZSA9PSAn aW4nKSBzZWxmLnNob3coKQorICAgICAgfSwgc2VsZi5vcHRpb25zLmRlbGF5LnNob3cpCisgICAg fQorCisgICwgbGVhdmU6IGZ1bmN0aW9uIChlKSB7CisgICAgICB2YXIgc2VsZiA9ICQoZS5jdXJy ZW50VGFyZ2V0KVt0aGlzLnR5cGVdKHRoaXMuX29wdGlvbnMpLmRhdGEodGhpcy50eXBlKQorCisg ICAgICBpZiAodGhpcy50aW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KQorICAgICAg aWYgKCFzZWxmLm9wdGlvbnMuZGVsYXkgfHwgIXNlbGYub3B0aW9ucy5kZWxheS5oaWRlKSByZXR1 cm4gc2VsZi5oaWRlKCkKKworICAgICAgc2VsZi5ob3ZlclN0YXRlID0gJ291dCcKKyAgICAgIHRo aXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgIGlmIChzZWxmLmhv dmVyU3RhdGUgPT0gJ291dCcpIHNlbGYuaGlkZSgpCisgICAgICB9LCBzZWxmLm9wdGlvbnMuZGVs YXkuaGlkZSkKKyAgICB9CisKKyAgLCBzaG93OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgJHRp cAorICAgICAgICAsIHBvcworICAgICAgICAsIGFjdHVhbFdpZHRoCisgICAgICAgICwgYWN0dWFs SGVpZ2h0CisgICAgICAgICwgcGxhY2VtZW50CisgICAgICAgICwgdHAKKyAgICAgICAgLCBlID0g JC5FdmVudCgnc2hvdycpCisKKyAgICAgIGlmICh0aGlzLmhhc0NvbnRlbnQoKSAmJiB0aGlzLmVu YWJsZWQpIHsKKyAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpCisgICAgICAgIGlmIChl LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm4KKyAgICAgICAgJHRpcCA9IHRoaXMudGlwKCkK KyAgICAgICAgdGhpcy5zZXRDb250ZW50KCkKKworICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFu aW1hdGlvbikgeworICAgICAgICAgICR0aXAuYWRkQ2xhc3MoJ2ZhZGUnKQorICAgICAgICB9CisK KyAgICAgICAgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQgPT0gJ2Z1 bmN0aW9uJyA/CisgICAgICAgICAgdGhpcy5vcHRpb25zLnBsYWNlbWVudC5jYWxsKHRoaXMsICR0 aXBbMF0sIHRoaXMuJGVsZW1lbnRbMF0pIDoKKyAgICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2Vt ZW50CisKKyAgICAgICAgJHRpcAorICAgICAgICAgIC5kZXRhY2goKQorICAgICAgICAgIC5jc3Mo eyB0b3A6IDAsIGxlZnQ6IDAsIGRpc3BsYXk6ICdibG9jaycgfSkKKworICAgICAgICB0aGlzLm9w dGlvbnMuY29udGFpbmVyID8gJHRpcC5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSA6 ICR0aXAuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCkKKworICAgICAgICBwb3MgPSB0aGlzLmdl dFBvc2l0aW9uKCkKKworICAgICAgICBhY3R1YWxXaWR0aCA9ICR0aXBbMF0ub2Zmc2V0V2lkdGgK KyAgICAgICAgYWN0dWFsSGVpZ2h0ID0gJHRpcFswXS5vZmZzZXRIZWlnaHQKKworICAgICAgICBz d2l0Y2ggKHBsYWNlbWVudCkgeworICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6CisgICAgICAgICAg ICB0cCA9IHt0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0LCBsZWZ0OiBwb3MubGVmdCArIHBvcy53 aWR0aCAvIDIgLSBhY3R1YWxXaWR0aCAvIDJ9CisgICAgICAgICAgICBicmVhaworICAgICAgICAg IGNhc2UgJ3RvcCc6CisgICAgICAgICAgICB0cCA9IHt0b3A6IHBvcy50b3AgLSBhY3R1YWxIZWln aHQsIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRoIC8gMiAtIGFjdHVhbFdpZHRoIC8gMn0KKyAg ICAgICAgICAgIGJyZWFrCisgICAgICAgICAgY2FzZSAnbGVmdCc6CisgICAgICAgICAgICB0cCA9 IHt0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6 IHBvcy5sZWZ0IC0gYWN0dWFsV2lkdGh9CisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGNh c2UgJ3JpZ2h0JzoKKyAgICAgICAgICAgIHRwID0ge3RvcDogcG9zLnRvcCArIHBvcy5oZWlnaHQg LyAyIC0gYWN0dWFsSGVpZ2h0IC8gMiwgbGVmdDogcG9zLmxlZnQgKyBwb3Mud2lkdGh9CisgICAg ICAgICAgICBicmVhaworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5hcHBseVBsYWNlbWVudCh0 cCwgcGxhY2VtZW50KQorICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3Nob3duJykKKyAg ICAgIH0KKyAgICB9CisKKyAgLCBhcHBseVBsYWNlbWVudDogZnVuY3Rpb24ob2Zmc2V0LCBwbGFj ZW1lbnQpeworICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpCisgICAgICAgICwgd2lkdGggPSAk dGlwWzBdLm9mZnNldFdpZHRoCisgICAgICAgICwgaGVpZ2h0ID0gJHRpcFswXS5vZmZzZXRIZWln aHQKKyAgICAgICAgLCBhY3R1YWxXaWR0aAorICAgICAgICAsIGFjdHVhbEhlaWdodAorICAgICAg ICAsIGRlbHRhCisgICAgICAgICwgcmVwbGFjZQorCisgICAgICAkdGlwCisgICAgICAgIC5vZmZz ZXQob2Zmc2V0KQorICAgICAgICAuYWRkQ2xhc3MocGxhY2VtZW50KQorICAgICAgICAuYWRkQ2xh c3MoJ2luJykKKworICAgICAgYWN0dWFsV2lkdGggPSAkdGlwWzBdLm9mZnNldFdpZHRoCisgICAg ICBhY3R1YWxIZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodAorCisgICAgICBpZiAocGxhY2Vt ZW50ID09ICd0b3AnICYmIGFjdHVhbEhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgICAgb2Zmc2V0 LnRvcCA9IG9mZnNldC50b3AgKyBoZWlnaHQgLSBhY3R1YWxIZWlnaHQKKyAgICAgICAgcmVwbGFj ZSA9IHRydWUKKyAgICAgIH0KKworICAgICAgaWYgKHBsYWNlbWVudCA9PSAnYm90dG9tJyB8fCBw bGFjZW1lbnQgPT0gJ3RvcCcpIHsKKyAgICAgICAgZGVsdGEgPSAwCisKKyAgICAgICAgaWYgKG9m ZnNldC5sZWZ0IDwgMCl7CisgICAgICAgICAgZGVsdGEgPSBvZmZzZXQubGVmdCAqIC0yCisgICAg ICAgICAgb2Zmc2V0LmxlZnQgPSAwCisgICAgICAgICAgJHRpcC5vZmZzZXQob2Zmc2V0KQorICAg ICAgICAgIGFjdHVhbFdpZHRoID0gJHRpcFswXS5vZmZzZXRXaWR0aAorICAgICAgICAgIGFjdHVh bEhlaWdodCA9ICR0aXBbMF0ub2Zmc2V0SGVpZ2h0CisgICAgICAgIH0KKworICAgICAgICB0aGlz LnJlcGxhY2VBcnJvdyhkZWx0YSAtIHdpZHRoICsgYWN0dWFsV2lkdGgsIGFjdHVhbFdpZHRoLCAn bGVmdCcpCisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnJlcGxhY2VBcnJvdyhhY3R1YWxI ZWlnaHQgLSBoZWlnaHQsIGFjdHVhbEhlaWdodCwgJ3RvcCcpCisgICAgICB9CisKKyAgICAgIGlm IChyZXBsYWNlKSAkdGlwLm9mZnNldChvZmZzZXQpCisgICAgfQorCisgICwgcmVwbGFjZUFycm93 OiBmdW5jdGlvbihkZWx0YSwgZGltZW5zaW9uLCBwb3NpdGlvbil7CisgICAgICB0aGlzCisgICAg ICAgIC5hcnJvdygpCisgICAgICAgIC5jc3MocG9zaXRpb24sIGRlbHRhID8gKDUwICogKDEgLSBk ZWx0YSAvIGRpbWVuc2lvbikgKyAiJSIpIDogJycpCisgICAgfQorCisgICwgc2V0Q29udGVudDog ZnVuY3Rpb24gKCkgeworICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpCisgICAgICAgICwgdGl0 bGUgPSB0aGlzLmdldFRpdGxlKCkKKworICAgICAgJHRpcC5maW5kKCcudG9vbHRpcC1pbm5lcicp W3RoaXMub3B0aW9ucy5odG1sID8gJ2h0bWwnIDogJ3RleHQnXSh0aXRsZSkKKyAgICAgICR0aXAu cmVtb3ZlQ2xhc3MoJ2ZhZGUgaW4gdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0JykKKyAgICB9CisKKyAg LCBoaWRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgdGhhdCA9IHRoaXMKKyAgICAgICAgLCAk dGlwID0gdGhpcy50aXAoKQorICAgICAgICAsIGUgPSAkLkV2ZW50KCdoaWRlJykKKworICAgICAg dGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpCisgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQo KSkgcmV0dXJuCisKKyAgICAgICR0aXAucmVtb3ZlQ2xhc3MoJ2luJykKKworICAgICAgZnVuY3Rp b24gcmVtb3ZlV2l0aEFuaW1hdGlvbigpIHsKKyAgICAgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1l b3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAkdGlwLm9mZigkLnN1cHBvcnQudHJhbnNpdGlv bi5lbmQpLmRldGFjaCgpCisgICAgICAgIH0sIDUwMCkKKworICAgICAgICAkdGlwLm9uZSgkLnN1 cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBjbGVhclRpbWVv dXQodGltZW91dCkKKyAgICAgICAgICAkdGlwLmRldGFjaCgpCisgICAgICAgIH0pCisgICAgICB9 CisKKyAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJHRpcC5oYXNDbGFzcygnZmFk ZScpID8KKyAgICAgICAgcmVtb3ZlV2l0aEFuaW1hdGlvbigpIDoKKyAgICAgICAgJHRpcC5kZXRh Y2goKQorCisgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2hpZGRlbicpCisKKyAgICAgIHJl dHVybiB0aGlzCisgICAgfQorCisgICwgZml4VGl0bGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh ciAkZSA9IHRoaXMuJGVsZW1lbnQKKyAgICAgIGlmICgkZS5hdHRyKCd0aXRsZScpIHx8IHR5cGVv ZigkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJykpICE9ICdzdHJpbmcnKSB7CisgICAgICAg ICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCAkZS5hdHRyKCd0aXRsZScpIHx8ICcnKS5h dHRyKCd0aXRsZScsICcnKQorICAgICAgfQorICAgIH0KKworICAsIGhhc0NvbnRlbnQ6IGZ1bmN0 aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkKKyAgICB9CisKKyAgLCBnZXRQ b3NpdGlvbjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGVsID0gdGhpcy4kZWxlbWVudFswXQor ICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCAodHlwZW9mIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVj dCA9PSAnZnVuY3Rpb24nKSA/IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogeworICAgICAg ICB3aWR0aDogZWwub2Zmc2V0V2lkdGgKKyAgICAgICwgaGVpZ2h0OiBlbC5vZmZzZXRIZWlnaHQK KyAgICAgIH0sIHRoaXMuJGVsZW1lbnQub2Zmc2V0KCkpCisgICAgfQorCisgICwgZ2V0VGl0bGU6 IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciB0aXRsZQorICAgICAgICAsICRlID0gdGhpcy4kZWxl bWVudAorICAgICAgICAsIG8gPSB0aGlzLm9wdGlvbnMKKworICAgICAgdGl0bGUgPSAkZS5hdHRy KCdkYXRhLW9yaWdpbmFsLXRpdGxlJykKKyAgICAgICAgfHwgKHR5cGVvZiBvLnRpdGxlID09ICdm dW5jdGlvbicgPyBvLnRpdGxlLmNhbGwoJGVbMF0pIDogIG8udGl0bGUpCisKKyAgICAgIHJldHVy biB0aXRsZQorICAgIH0KKworICAsIHRpcDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRo aXMuJHRpcCA9IHRoaXMuJHRpcCB8fCAkKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSkKKyAgICB9CisK KyAgLCBhcnJvdzogZnVuY3Rpb24oKXsKKyAgICAgIHJldHVybiB0aGlzLiRhcnJvdyA9IHRoaXMu JGFycm93IHx8IHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKQorICAgIH0KKworICAs IHZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoIXRoaXMuJGVsZW1lbnRbMF0ucGFy ZW50Tm9kZSkgeworICAgICAgICB0aGlzLmhpZGUoKQorICAgICAgICB0aGlzLiRlbGVtZW50ID0g bnVsbAorICAgICAgICB0aGlzLm9wdGlvbnMgPSBudWxsCisgICAgICB9CisgICAgfQorCisgICwg ZW5hYmxlOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlCisgICAgfQor CisgICwgZGlzYWJsZTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2UK KyAgICB9CisKKyAgLCB0b2dnbGVFbmFibGVkOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLmVu YWJsZWQgPSAhdGhpcy5lbmFibGVkCisgICAgfQorCisgICwgdG9nZ2xlOiBmdW5jdGlvbiAoZSkg eworICAgICAgdmFyIHNlbGYgPSBlID8gJChlLmN1cnJlbnRUYXJnZXQpW3RoaXMudHlwZV0odGhp cy5fb3B0aW9ucykuZGF0YSh0aGlzLnR5cGUpIDogdGhpcworICAgICAgc2VsZi50aXAoKS5oYXND bGFzcygnaW4nKSA/IHNlbGYuaGlkZSgpIDogc2VsZi5zaG93KCkKKyAgICB9CisKKyAgLCBkZXN0 cm95OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLmhpZGUoKS4kZWxlbWVudC5vZmYoJy4nICsg dGhpcy50eXBlKS5yZW1vdmVEYXRhKHRoaXMudHlwZSkKKyAgICB9CisKKyAgfQorCisKKyAvKiBU T09MVElQIFBMVUdJTiBERUZJTklUSU9OCisgICogPT09PT09PT09PT09PT09PT09PT09PT09PSAq LworCisgIHZhciBvbGQgPSAkLmZuLnRvb2x0aXAKKworICAkLmZuLnRvb2x0aXAgPSBmdW5jdGlv biAoIG9wdGlvbiApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAg IHZhciAkdGhpcyA9ICQodGhpcykKKyAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgndG9vbHRp cCcpCisgICAgICAgICwgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0 aW9uCisgICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ3Rvb2x0aXAnLCAoZGF0YSA9IG5ldyBU b29sdGlwKHRoaXMsIG9wdGlvbnMpKSkKKyAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJp bmcnKSBkYXRhW29wdGlvbl0oKQorICAgIH0pCisgIH0KKworICAkLmZuLnRvb2x0aXAuQ29uc3Ry dWN0b3IgPSBUb29sdGlwCisKKyAgJC5mbi50b29sdGlwLmRlZmF1bHRzID0geworICAgIGFuaW1h dGlvbjogdHJ1ZQorICAsIHBsYWNlbWVudDogJ3RvcCcKKyAgLCBzZWxlY3RvcjogZmFsc2UKKyAg LCB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9InRvb2x0aXAiPjxkaXYgY2xhc3M9InRvb2x0aXAtYXJy b3ciPjwvZGl2PjxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiPjwvZGl2PjwvZGl2PicKKyAgLCB0 cmlnZ2VyOiAnaG92ZXIgZm9jdXMnCisgICwgdGl0bGU6ICcnCisgICwgZGVsYXk6IDAKKyAgLCBo dG1sOiBmYWxzZQorICAsIGNvbnRhaW5lcjogZmFsc2UKKyAgfQorCisKKyAvKiBUT09MVElQIE5P IENPTkZMSUNUCisgICogPT09PT09PT09PT09PT09PT09PSAqLworCisgICQuZm4udG9vbHRpcC5u b0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkgeworICAgICQuZm4udG9vbHRpcCA9IG9sZAorICAgIHJl dHVybiB0aGlzCisgIH0KKworfSh3aW5kb3cualF1ZXJ5KTsKKy8qID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib290c3RyYXAt cG9wb3Zlci5qcyB2Mi4zLjEKKyAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFw L2phdmFzY3JpcHQuaHRtbCNwb3BvdmVycworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDEyIFR3aXR0 ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl bnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxh dyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVy IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRI T1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mg b3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdl IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNl bnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0gKi8KKworCishZnVuY3Rpb24gKCQpIHsKKworICAidXNlIHN0cmljdCI7IC8v IGpzaGludCA7XzsKKworCisgLyogUE9QT1ZFUiBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTgorICAq ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgUG9wb3ZlciA9IGZ1 bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7CisgICAgdGhpcy5pbml0KCdwb3BvdmVyJywgZWxl bWVudCwgb3B0aW9ucykKKyAgfQorCisKKyAgLyogTk9URTogUE9QT1ZFUiBFWFRFTkRTIEJPT1RT VFJBUC1UT09MVElQLmpzCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PSAqLworCisgIFBvcG92ZXIucHJvdG90eXBlID0gJC5leHRlbmQoe30sICQuZm4udG9v bHRpcC5Db25zdHJ1Y3Rvci5wcm90b3R5cGUsIHsKKworICAgIGNvbnN0cnVjdG9yOiBQb3BvdmVy CisKKyAgLCBzZXRDb250ZW50OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgJHRpcCA9IHRoaXMu dGlwKCkKKyAgICAgICAgLCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKQorICAgICAgICAsIGNvbnRl bnQgPSB0aGlzLmdldENvbnRlbnQoKQorCisgICAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxl JylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKHRpdGxlKQorICAgICAgJHRp cC5maW5kKCcucG9wb3Zlci1jb250ZW50JylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAn dGV4dCddKGNvbnRlbnQpCisKKyAgICAgICR0aXAucmVtb3ZlQ2xhc3MoJ2ZhZGUgdG9wIGJvdHRv bSBsZWZ0IHJpZ2h0IGluJykKKyAgICB9CisKKyAgLCBoYXNDb250ZW50OiBmdW5jdGlvbiAoKSB7 CisgICAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpIHx8IHRoaXMuZ2V0Q29udGVudCgpCisgICAg fQorCisgICwgZ2V0Q29udGVudDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNvbnRlbnQKKyAg ICAgICAgLCAkZSA9IHRoaXMuJGVsZW1lbnQKKyAgICAgICAgLCBvID0gdGhpcy5vcHRpb25zCisK KyAgICAgIGNvbnRlbnQgPSAodHlwZW9mIG8uY29udGVudCA9PSAnZnVuY3Rpb24nID8gby5jb250 ZW50LmNhbGwoJGVbMF0pIDogIG8uY29udGVudCkKKyAgICAgICAgfHwgJGUuYXR0cignZGF0YS1j b250ZW50JykKKworICAgICAgcmV0dXJuIGNvbnRlbnQKKyAgICB9CisKKyAgLCB0aXA6IGZ1bmN0 aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy4kdGlwKSB7CisgICAgICAgIHRoaXMuJHRpcCA9ICQo dGhpcy5vcHRpb25zLnRlbXBsYXRlKQorICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuJHRpcAor ICAgIH0KKworICAsIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuaGlkZSgpLiRl bGVtZW50Lm9mZignLicgKyB0aGlzLnR5cGUpLnJlbW92ZURhdGEodGhpcy50eXBlKQorICAgIH0K KworICB9KQorCisKKyAvKiBQT1BPVkVSIFBMVUdJTiBERUZJTklUSU9OCisgICogPT09PT09PT09 PT09PT09PT09PT09PT0gKi8KKworICB2YXIgb2xkID0gJC5mbi5wb3BvdmVyCisKKyAgJC5mbi5w b3BvdmVyID0gZnVuY3Rpb24gKG9wdGlvbikgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rp b24gKCkgeworICAgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAgICAgICAsIGRhdGEgPSAkdGhp cy5kYXRhKCdwb3BvdmVyJykKKyAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAn b2JqZWN0JyAmJiBvcHRpb24KKyAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgncG9wb3Zlcics IChkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgb3B0aW9ucykpKQorICAgICAgaWYgKHR5cGVvZiBv cHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpCisgICAgfSkKKyAgfQorCisgICQuZm4u cG9wb3Zlci5Db25zdHJ1Y3RvciA9IFBvcG92ZXIKKworICAkLmZuLnBvcG92ZXIuZGVmYXVsdHMg PSAkLmV4dGVuZCh7fSAsICQuZm4udG9vbHRpcC5kZWZhdWx0cywgeworICAgIHBsYWNlbWVudDog J3JpZ2h0JworICAsIHRyaWdnZXI6ICdjbGljaycKKyAgLCBjb250ZW50OiAnJworICAsIHRlbXBs YXRlOiAnPGRpdiBjbGFzcz0icG9wb3ZlciI+PGRpdiBjbGFzcz0iYXJyb3ciPjwvZGl2PjxoMyBj bGFzcz0icG9wb3Zlci10aXRsZSI+PC9oMz48ZGl2IGNsYXNzPSJwb3BvdmVyLWNvbnRlbnQiPjwv ZGl2PjwvZGl2PicKKyAgfSkKKworCisgLyogUE9QT1ZFUiBOTyBDT05GTElDVAorICAqID09PT09 PT09PT09PT09PT09PT0gKi8KKworICAkLmZuLnBvcG92ZXIubm9Db25mbGljdCA9IGZ1bmN0aW9u ICgpIHsKKyAgICAkLmZuLnBvcG92ZXIgPSBvbGQKKyAgICByZXR1cm4gdGhpcworICB9CisKK30o d2luZG93LmpRdWVyeSk7CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib290c3RyYXAtc2Nyb2xsc3B5LmpzIHYyLjMu MQorICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1s I3Njcm9sbHNweQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLgorICoK KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM aWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0Ut Mi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0 byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2Ug aXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElF UyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgor ICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBl cm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PSAqLworCisKKyFmdW5jdGlvbiAoJCkgeworCisgICJ1c2Ugc3RyaWN0IjsgLy8ganNoaW50IDtf OworCisKKyAvKiBTQ1JPTExTUFkgQ0xBU1MgREVGSU5JVElPTgorICAqID09PT09PT09PT09PT09 PT09PT09PT09PT09ICovCisKKyAgZnVuY3Rpb24gU2Nyb2xsU3B5KGVsZW1lbnQsIG9wdGlvbnMp IHsKKyAgICB2YXIgcHJvY2VzcyA9ICQucHJveHkodGhpcy5wcm9jZXNzLCB0aGlzKQorICAgICAg LCAkZWxlbWVudCA9ICQoZWxlbWVudCkuaXMoJ2JvZHknKSA/ICQod2luZG93KSA6ICQoZWxlbWVu dCkKKyAgICAgICwgaHJlZgorICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnNj cm9sbHNweS5kZWZhdWx0cywgb3B0aW9ucykKKyAgICB0aGlzLiRzY3JvbGxFbGVtZW50ID0gJGVs ZW1lbnQub24oJ3Njcm9sbC5zY3JvbGwtc3B5LmRhdGEtYXBpJywgcHJvY2VzcykKKyAgICB0aGlz LnNlbGVjdG9yID0gKHRoaXMub3B0aW9ucy50YXJnZXQKKyAgICAgIHx8ICgoaHJlZiA9ICQoZWxl bWVudCkuYXR0cignaHJlZicpKSAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywgJycp KSAvL3N0cmlwIGZvciBpZTcKKyAgICAgIHx8ICcnKSArICcgLm5hdiBsaSA+IGEnCisgICAgdGhp cy4kYm9keSA9ICQoJ2JvZHknKQorICAgIHRoaXMucmVmcmVzaCgpCisgICAgdGhpcy5wcm9jZXNz KCkKKyAgfQorCisgIFNjcm9sbFNweS5wcm90b3R5cGUgPSB7CisKKyAgICAgIGNvbnN0cnVjdG9y OiBTY3JvbGxTcHkKKworICAgICwgcmVmcmVzaDogZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIg c2VsZiA9IHRoaXMKKyAgICAgICAgICAsICR0YXJnZXRzCisKKyAgICAgICAgdGhpcy5vZmZzZXRz ID0gJChbXSkKKyAgICAgICAgdGhpcy50YXJnZXRzID0gJChbXSkKKworICAgICAgICAkdGFyZ2V0 cyA9IHRoaXMuJGJvZHkKKyAgICAgICAgICAuZmluZCh0aGlzLnNlbGVjdG9yKQorICAgICAgICAg IC5tYXAoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyICRlbCA9ICQodGhpcykKKyAgICAg ICAgICAgICAgLCBocmVmID0gJGVsLmRhdGEoJ3RhcmdldCcpIHx8ICRlbC5hdHRyKCdocmVmJykK KyAgICAgICAgICAgICAgLCAkaHJlZiA9IC9eI1x3Ly50ZXN0KGhyZWYpICYmICQoaHJlZikKKyAg ICAgICAgICAgIHJldHVybiAoICRocmVmCisgICAgICAgICAgICAgICYmICRocmVmLmxlbmd0aAor ICAgICAgICAgICAgICAmJiBbWyAkaHJlZi5wb3NpdGlvbigpLnRvcCArICghJC5pc1dpbmRvdyhz ZWxmLiRzY3JvbGxFbGVtZW50LmdldCgwKSkgJiYgc2VsZi4kc2Nyb2xsRWxlbWVudC5zY3JvbGxU b3AoKSksIGhyZWYgXV0gKSB8fCBudWxsCisgICAgICAgICAgfSkKKyAgICAgICAgICAuc29ydChm dW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF0gfSkKKyAgICAgICAgICAuZWFjaChm dW5jdGlvbiAoKSB7CisgICAgICAgICAgICBzZWxmLm9mZnNldHMucHVzaCh0aGlzWzBdKQorICAg ICAgICAgICAgc2VsZi50YXJnZXRzLnB1c2godGhpc1sxXSkKKyAgICAgICAgICB9KQorICAgICAg fQorCisgICAgLCBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBzY3JvbGxUb3Ag PSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpICsgdGhpcy5vcHRpb25zLm9mZnNldAor ICAgICAgICAgICwgc2Nyb2xsSGVpZ2h0ID0gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxI ZWlnaHQgfHwgdGhpcy4kYm9keVswXS5zY3JvbGxIZWlnaHQKKyAgICAgICAgICAsIG1heFNjcm9s bCA9IHNjcm9sbEhlaWdodCAtIHRoaXMuJHNjcm9sbEVsZW1lbnQuaGVpZ2h0KCkKKyAgICAgICAg ICAsIG9mZnNldHMgPSB0aGlzLm9mZnNldHMKKyAgICAgICAgICAsIHRhcmdldHMgPSB0aGlzLnRh cmdldHMKKyAgICAgICAgICAsIGFjdGl2ZVRhcmdldCA9IHRoaXMuYWN0aXZlVGFyZ2V0CisgICAg ICAgICAgLCBpCisKKyAgICAgICAgaWYgKHNjcm9sbFRvcCA+PSBtYXhTY3JvbGwpIHsKKyAgICAg ICAgICByZXR1cm4gYWN0aXZlVGFyZ2V0ICE9IChpID0gdGFyZ2V0cy5sYXN0KClbMF0pCisgICAg ICAgICAgICAmJiB0aGlzLmFjdGl2YXRlICggaSApCisgICAgICAgIH0KKworICAgICAgICBmb3Ig KGkgPSBvZmZzZXRzLmxlbmd0aDsgaS0tOykgeworICAgICAgICAgIGFjdGl2ZVRhcmdldCAhPSB0 YXJnZXRzW2ldCisgICAgICAgICAgICAmJiBzY3JvbGxUb3AgPj0gb2Zmc2V0c1tpXQorICAgICAg ICAgICAgJiYgKCFvZmZzZXRzW2kgKyAxXSB8fCBzY3JvbGxUb3AgPD0gb2Zmc2V0c1tpICsgMV0p CisgICAgICAgICAgICAmJiB0aGlzLmFjdGl2YXRlKCB0YXJnZXRzW2ldICkKKyAgICAgICAgfQor ICAgICAgfQorCisgICAgLCBhY3RpdmF0ZTogZnVuY3Rpb24gKHRhcmdldCkgeworICAgICAgICB2 YXIgYWN0aXZlCisgICAgICAgICAgLCBzZWxlY3RvcgorCisgICAgICAgIHRoaXMuYWN0aXZlVGFy Z2V0ID0gdGFyZ2V0CisKKyAgICAgICAgJCh0aGlzLnNlbGVjdG9yKQorICAgICAgICAgIC5wYXJl bnQoJy5hY3RpdmUnKQorICAgICAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJykKKworICAgICAg ICBzZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IKKyAgICAgICAgICArICdbZGF0YS10YXJnZXQ9Iicg KyB0YXJnZXQgKyAnIl0sJworICAgICAgICAgICsgdGhpcy5zZWxlY3RvciArICdbaHJlZj0iJyAr IHRhcmdldCArICciXScKKworICAgICAgICBhY3RpdmUgPSAkKHNlbGVjdG9yKQorICAgICAgICAg IC5wYXJlbnQoJ2xpJykKKyAgICAgICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpCisKKyAgICAgICAg aWYgKGFjdGl2ZS5wYXJlbnQoJy5kcm9wZG93bi1tZW51JykubGVuZ3RoKSAgeworICAgICAgICAg IGFjdGl2ZSA9IGFjdGl2ZS5jbG9zZXN0KCdsaS5kcm9wZG93bicpLmFkZENsYXNzKCdhY3RpdmUn KQorICAgICAgICB9CisKKyAgICAgICAgYWN0aXZlLnRyaWdnZXIoJ2FjdGl2YXRlJykKKyAgICAg IH0KKworICB9CisKKworIC8qIFNDUk9MTFNQWSBQTFVHSU4gREVGSU5JVElPTgorICAqID09PT09 PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZhciBvbGQgPSAkLmZuLnNjcm9sbHNweQor CisgICQuZm4uc2Nyb2xsc3B5ID0gZnVuY3Rpb24gKG9wdGlvbikgeworICAgIHJldHVybiB0aGlz LmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAgICAgICAs IGRhdGEgPSAkdGhpcy5kYXRhKCdzY3JvbGxzcHknKQorICAgICAgICAsIG9wdGlvbnMgPSB0eXBl b2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbgorICAgICAgaWYgKCFkYXRhKSAkdGhpcy5k YXRhKCdzY3JvbGxzcHknLCAoZGF0YSA9IG5ldyBTY3JvbGxTcHkodGhpcywgb3B0aW9ucykpKQor ICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpCisgICAg fSkKKyAgfQorCisgICQuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yID0gU2Nyb2xsU3B5CisKKyAg JC5mbi5zY3JvbGxzcHkuZGVmYXVsdHMgPSB7CisgICAgb2Zmc2V0OiAxMAorICB9CisKKworIC8q IFNDUk9MTFNQWSBOTyBDT05GTElDVAorICAqID09PT09PT09PT09PT09PT09PT09PSAqLworCisg ICQuZm4uc2Nyb2xsc3B5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CisgICAgJC5mbi5zY3Jv bGxzcHkgPSBvbGQKKyAgICByZXR1cm4gdGhpcworICB9CisKKworIC8qIFNDUk9MTFNQWSBEQVRB LUFQSQorICAqID09PT09PT09PT09PT09PT09PSAqLworCisgICQod2luZG93KS5vbignbG9hZCcs IGZ1bmN0aW9uICgpIHsKKyAgICAkKCdbZGF0YS1zcHk9InNjcm9sbCJdJykuZWFjaChmdW5jdGlv biAoKSB7CisgICAgICB2YXIgJHNweSA9ICQodGhpcykKKyAgICAgICRzcHkuc2Nyb2xsc3B5KCRz cHkuZGF0YSgpKQorICAgIH0pCisgIH0pCisKK30od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGJvb3Rz dHJhcC10YWIuanMgdjIuMy4xCisgKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJh cC9qYXZhc2NyaXB0Lmh0bWwjdGFicworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIElu Yy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4w ICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGlu IGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBv ZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0gKi8KKworCishZnVuY3Rpb24gKCQpIHsKKworICAidXNlIHN0cmljdCI7IC8vIGpzaGludCA7 XzsKKworCisgLyogVEFCIENMQVNTIERFRklOSVRJT04KKyAgKiA9PT09PT09PT09PT09PT09PT09 PSAqLworCisgIHZhciBUYWIgPSBmdW5jdGlvbiAoZWxlbWVudCkgeworICAgIHRoaXMuZWxlbWVu dCA9ICQoZWxlbWVudCkKKyAgfQorCisgIFRhYi5wcm90b3R5cGUgPSB7CisKKyAgICBjb25zdHJ1 Y3RvcjogVGFiCisKKyAgLCBzaG93OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgJHRoaXMgPSB0 aGlzLmVsZW1lbnQKKyAgICAgICAgLCAkdWwgPSAkdGhpcy5jbG9zZXN0KCd1bDpub3QoLmRyb3Bk b3duLW1lbnUpJykKKyAgICAgICAgLCBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0 JykKKyAgICAgICAgLCBwcmV2aW91cworICAgICAgICAsICR0YXJnZXQKKyAgICAgICAgLCBlCisK KyAgICAgIGlmICghc2VsZWN0b3IpIHsKKyAgICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdo cmVmJykKKyAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvciAmJiBzZWxlY3Rvci5yZXBsYWNlKC8u Kig/PSNbXlxzXSokKS8sICcnKSAvL3N0cmlwIGZvciBpZTcKKyAgICAgIH0KKworICAgICAgaWYg KCAkdGhpcy5wYXJlbnQoJ2xpJykuaGFzQ2xhc3MoJ2FjdGl2ZScpICkgcmV0dXJuCisKKyAgICAg IHByZXZpb3VzID0gJHVsLmZpbmQoJy5hY3RpdmU6bGFzdCBhJylbMF0KKworICAgICAgZSA9ICQu RXZlbnQoJ3Nob3cnLCB7CisgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzCisgICAgICB9 KQorCisgICAgICAkdGhpcy50cmlnZ2VyKGUpCisKKyAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZl bnRlZCgpKSByZXR1cm4KKworICAgICAgJHRhcmdldCA9ICQoc2VsZWN0b3IpCisKKyAgICAgIHRo aXMuYWN0aXZhdGUoJHRoaXMucGFyZW50KCdsaScpLCAkdWwpCisgICAgICB0aGlzLmFjdGl2YXRl KCR0YXJnZXQsICR0YXJnZXQucGFyZW50KCksIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgJHRoaXMu dHJpZ2dlcih7CisgICAgICAgICAgdHlwZTogJ3Nob3duJworICAgICAgICAsIHJlbGF0ZWRUYXJn ZXQ6IHByZXZpb3VzCisgICAgICAgIH0pCisgICAgICB9KQorICAgIH0KKworICAsIGFjdGl2YXRl OiBmdW5jdGlvbiAoIGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHsKKyAgICAgIHZhciAk YWN0aXZlID0gY29udGFpbmVyLmZpbmQoJz4gLmFjdGl2ZScpCisgICAgICAgICwgdHJhbnNpdGlv biA9IGNhbGxiYWNrCisgICAgICAgICAgICAmJiAkLnN1cHBvcnQudHJhbnNpdGlvbgorICAgICAg ICAgICAgJiYgJGFjdGl2ZS5oYXNDbGFzcygnZmFkZScpCisKKyAgICAgIGZ1bmN0aW9uIG5leHQo KSB7CisgICAgICAgICRhY3RpdmUKKyAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpCisg ICAgICAgICAgLmZpbmQoJz4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlJykKKyAgICAgICAgICAu cmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpCisKKyAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnYWN0aXZl JykKKworICAgICAgICBpZiAodHJhbnNpdGlvbikgeworICAgICAgICAgIGVsZW1lbnRbMF0ub2Zm c2V0V2lkdGggLy8gcmVmbG93IGZvciB0cmFuc2l0aW9uCisgICAgICAgICAgZWxlbWVudC5hZGRD bGFzcygnaW4nKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xh c3MoJ2ZhZGUnKQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBlbGVtZW50LnBhcmVudCgnLmRy b3Bkb3duLW1lbnUnKSApIHsKKyAgICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJ2xpLmRyb3Bkb3du JykuYWRkQ2xhc3MoJ2FjdGl2ZScpCisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayAmJiBj YWxsYmFjaygpCisgICAgICB9CisKKyAgICAgIHRyYW5zaXRpb24gPworICAgICAgICAkYWN0aXZl Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIG5leHQpIDoKKyAgICAgICAgbmV4dCgpCisK KyAgICAgICRhY3RpdmUucmVtb3ZlQ2xhc3MoJ2luJykKKyAgICB9CisgIH0KKworCisgLyogVEFC IFBMVUdJTiBERUZJTklUSU9OCisgICogPT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgdmFy IG9sZCA9ICQuZm4udGFiCisKKyAgJC5mbi50YWIgPSBmdW5jdGlvbiAoIG9wdGlvbiApIHsKKyAg ICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciAkdGhpcyA9ICQodGhp cykKKyAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgndGFiJykKKyAgICAgIGlmICghZGF0YSkg JHRoaXMuZGF0YSgndGFiJywgKGRhdGEgPSBuZXcgVGFiKHRoaXMpKSkKKyAgICAgIGlmICh0eXBl b2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKQorICAgIH0pCisgIH0KKworICAk LmZuLnRhYi5Db25zdHJ1Y3RvciA9IFRhYgorCisKKyAvKiBUQUIgTk8gQ09ORkxJQ1QKKyAgKiA9 PT09PT09PT09PT09PT0gKi8KKworICAkLmZuLnRhYi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkg eworICAgICQuZm4udGFiID0gb2xkCisgICAgcmV0dXJuIHRoaXMKKyAgfQorCisKKyAvKiBUQUIg REFUQS1BUEkKKyAgKiA9PT09PT09PT09PT0gKi8KKworICAkKGRvY3VtZW50KS5vbignY2xpY2su dGFiLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT0idGFiIl0sIFtkYXRhLXRvZ2dsZT0icGlsbCJd JywgZnVuY3Rpb24gKGUpIHsKKyAgICBlLnByZXZlbnREZWZhdWx0KCkKKyAgICAkKHRoaXMpLnRh Yignc2hvdycpCisgIH0pCisKK30od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYm9vdHN0cmFw LXR5cGVhaGVhZC5qcyB2Mi4zLjEKKyAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0 cmFwL2phdmFzY3JpcHQuaHRtbCN0eXBlYWhlYWQKKyAqID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDEy IFR3aXR0ZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0 YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9y Zy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNh YmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVk IHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisg KiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4 cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxh bmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRo ZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09ICovCisKKworIWZ1bmN0aW9uKCQpeworCisgICJ1c2Ugc3RyaWN0 IjsgLy8ganNoaW50IDtfOworCisKKyAvKiBUWVBFQUhFQUQgUFVCTElDIENMQVNTIERFRklOSVRJ T04KKyAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICB2YXIgVHlw ZWFoZWFkID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHsKKyAgICB0aGlzLiRlbGVtZW50 ID0gJChlbGVtZW50KQorICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnR5cGVh aGVhZC5kZWZhdWx0cywgb3B0aW9ucykKKyAgICB0aGlzLm1hdGNoZXIgPSB0aGlzLm9wdGlvbnMu bWF0Y2hlciB8fCB0aGlzLm1hdGNoZXIKKyAgICB0aGlzLnNvcnRlciA9IHRoaXMub3B0aW9ucy5z b3J0ZXIgfHwgdGhpcy5zb3J0ZXIKKyAgICB0aGlzLmhpZ2hsaWdodGVyID0gdGhpcy5vcHRpb25z LmhpZ2hsaWdodGVyIHx8IHRoaXMuaGlnaGxpZ2h0ZXIKKyAgICB0aGlzLnVwZGF0ZXIgPSB0aGlz Lm9wdGlvbnMudXBkYXRlciB8fCB0aGlzLnVwZGF0ZXIKKyAgICB0aGlzLnNvdXJjZSA9IHRoaXMu b3B0aW9ucy5zb3VyY2UKKyAgICB0aGlzLiRtZW51ID0gJCh0aGlzLm9wdGlvbnMubWVudSkKKyAg ICB0aGlzLnNob3duID0gZmFsc2UKKyAgICB0aGlzLmxpc3RlbigpCisgIH0KKworICBUeXBlYWhl YWQucHJvdG90eXBlID0geworCisgICAgY29uc3RydWN0b3I6IFR5cGVhaGVhZAorCisgICwgc2Vs ZWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgdmFsID0gdGhpcy4kbWVudS5maW5kKCcuYWN0 aXZlJykuYXR0cignZGF0YS12YWx1ZScpCisgICAgICB0aGlzLiRlbGVtZW50CisgICAgICAgIC52 YWwodGhpcy51cGRhdGVyKHZhbCkpCisgICAgICAgIC5jaGFuZ2UoKQorICAgICAgcmV0dXJuIHRo aXMuaGlkZSgpCisgICAgfQorCisgICwgdXBkYXRlcjogZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAg IHJldHVybiBpdGVtCisgICAgfQorCisgICwgc2hvdzogZnVuY3Rpb24gKCkgeworICAgICAgdmFy IHBvcyA9ICQuZXh0ZW5kKHt9LCB0aGlzLiRlbGVtZW50LnBvc2l0aW9uKCksIHsKKyAgICAgICAg aGVpZ2h0OiB0aGlzLiRlbGVtZW50WzBdLm9mZnNldEhlaWdodAorICAgICAgfSkKKworICAgICAg dGhpcy4kbWVudQorICAgICAgICAuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCkKKyAgICAgICAg LmNzcyh7CisgICAgICAgICAgdG9wOiBwb3MudG9wICsgcG9zLmhlaWdodAorICAgICAgICAsIGxl ZnQ6IHBvcy5sZWZ0CisgICAgICAgIH0pCisgICAgICAgIC5zaG93KCkKKworICAgICAgdGhpcy5z aG93biA9IHRydWUKKyAgICAgIHJldHVybiB0aGlzCisgICAgfQorCisgICwgaGlkZTogZnVuY3Rp b24gKCkgeworICAgICAgdGhpcy4kbWVudS5oaWRlKCkKKyAgICAgIHRoaXMuc2hvd24gPSBmYWxz ZQorICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgLCBsb29rdXA6IGZ1bmN0aW9uIChldmVu dCkgeworICAgICAgdmFyIGl0ZW1zCisKKyAgICAgIHRoaXMucXVlcnkgPSB0aGlzLiRlbGVtZW50 LnZhbCgpCisKKyAgICAgIGlmICghdGhpcy5xdWVyeSB8fCB0aGlzLnF1ZXJ5Lmxlbmd0aCA8IHRo aXMub3B0aW9ucy5taW5MZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2hvd24gPyB0aGlz LmhpZGUoKSA6IHRoaXMKKyAgICAgIH0KKworICAgICAgaXRlbXMgPSAkLmlzRnVuY3Rpb24odGhp cy5zb3VyY2UpID8gdGhpcy5zb3VyY2UodGhpcy5xdWVyeSwgJC5wcm94eSh0aGlzLnByb2Nlc3Ms IHRoaXMpKSA6IHRoaXMuc291cmNlCisKKyAgICAgIHJldHVybiBpdGVtcyA/IHRoaXMucHJvY2Vz cyhpdGVtcykgOiB0aGlzCisgICAgfQorCisgICwgcHJvY2VzczogZnVuY3Rpb24gKGl0ZW1zKSB7 CisgICAgICB2YXIgdGhhdCA9IHRoaXMKKworICAgICAgaXRlbXMgPSAkLmdyZXAoaXRlbXMsIGZ1 bmN0aW9uIChpdGVtKSB7CisgICAgICAgIHJldHVybiB0aGF0Lm1hdGNoZXIoaXRlbSkKKyAgICAg IH0pCisKKyAgICAgIGl0ZW1zID0gdGhpcy5zb3J0ZXIoaXRlbXMpCisKKyAgICAgIGlmICghaXRl bXMubGVuZ3RoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNob3duID8gdGhpcy5oaWRlKCkgOiB0 aGlzCisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcihpdGVtcy5zbGljZSgwLCB0 aGlzLm9wdGlvbnMuaXRlbXMpKS5zaG93KCkKKyAgICB9CisKKyAgLCBtYXRjaGVyOiBmdW5jdGlv biAoaXRlbSkgeworICAgICAgcmV0dXJuIH5pdGVtLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlz LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpCisgICAgfQorCisgICwgc29ydGVyOiBmdW5jdGlvbiAoaXRl bXMpIHsKKyAgICAgIHZhciBiZWdpbnN3aXRoID0gW10KKyAgICAgICAgLCBjYXNlU2Vuc2l0aXZl ID0gW10KKyAgICAgICAgLCBjYXNlSW5zZW5zaXRpdmUgPSBbXQorICAgICAgICAsIGl0ZW0KKwor ICAgICAgd2hpbGUgKGl0ZW0gPSBpdGVtcy5zaGlmdCgpKSB7CisgICAgICAgIGlmICghaXRlbS50 b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5xdWVyeS50b0xvd2VyQ2FzZSgpKSkgYmVnaW5zd2l0 aC5wdXNoKGl0ZW0pCisgICAgICAgIGVsc2UgaWYgKH5pdGVtLmluZGV4T2YodGhpcy5xdWVyeSkp IGNhc2VTZW5zaXRpdmUucHVzaChpdGVtKQorICAgICAgICBlbHNlIGNhc2VJbnNlbnNpdGl2ZS5w dXNoKGl0ZW0pCisgICAgICB9CisKKyAgICAgIHJldHVybiBiZWdpbnN3aXRoLmNvbmNhdChjYXNl U2Vuc2l0aXZlLCBjYXNlSW5zZW5zaXRpdmUpCisgICAgfQorCisgICwgaGlnaGxpZ2h0ZXI6IGZ1 bmN0aW9uIChpdGVtKSB7CisgICAgICB2YXIgcXVlcnkgPSB0aGlzLnF1ZXJ5LnJlcGxhY2UoL1tc LVxbXF17fSgpKis/LixcXFxeJHwjXHNdL2csICdcXCQmJykKKyAgICAgIHJldHVybiBpdGVtLnJl cGxhY2UobmV3IFJlZ0V4cCgnKCcgKyBxdWVyeSArICcpJywgJ2lnJyksIGZ1bmN0aW9uICgkMSwg bWF0Y2gpIHsKKyAgICAgICAgcmV0dXJuICc8c3Ryb25nPicgKyBtYXRjaCArICc8L3N0cm9uZz4n CisgICAgICB9KQorICAgIH0KKworICAsIHJlbmRlcjogZnVuY3Rpb24gKGl0ZW1zKSB7CisgICAg ICB2YXIgdGhhdCA9IHRoaXMKKworICAgICAgaXRlbXMgPSAkKGl0ZW1zKS5tYXAoZnVuY3Rpb24g KGksIGl0ZW0pIHsKKyAgICAgICAgaSA9ICQodGhhdC5vcHRpb25zLml0ZW0pLmF0dHIoJ2RhdGEt dmFsdWUnLCBpdGVtKQorICAgICAgICBpLmZpbmQoJ2EnKS5odG1sKHRoYXQuaGlnaGxpZ2h0ZXIo aXRlbSkpCisgICAgICAgIHJldHVybiBpWzBdCisgICAgICB9KQorCisgICAgICBpdGVtcy5maXJz dCgpLmFkZENsYXNzKCdhY3RpdmUnKQorICAgICAgdGhpcy4kbWVudS5odG1sKGl0ZW1zKQorICAg ICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgLCBuZXh0OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAg ICAgIHZhciBhY3RpdmUgPSB0aGlzLiRtZW51LmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygn YWN0aXZlJykKKyAgICAgICAgLCBuZXh0ID0gYWN0aXZlLm5leHQoKQorCisgICAgICBpZiAoIW5l eHQubGVuZ3RoKSB7CisgICAgICAgIG5leHQgPSAkKHRoaXMuJG1lbnUuZmluZCgnbGknKVswXSkK KyAgICAgIH0KKworICAgICAgbmV4dC5hZGRDbGFzcygnYWN0aXZlJykKKyAgICB9CisKKyAgLCBw cmV2OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgIHZhciBhY3RpdmUgPSB0aGlzLiRtZW51LmZp bmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJykKKyAgICAgICAgLCBwcmV2ID0gYWN0 aXZlLnByZXYoKQorCisgICAgICBpZiAoIXByZXYubGVuZ3RoKSB7CisgICAgICAgIHByZXYgPSB0 aGlzLiRtZW51LmZpbmQoJ2xpJykubGFzdCgpCisgICAgICB9CisKKyAgICAgIHByZXYuYWRkQ2xh c3MoJ2FjdGl2ZScpCisgICAgfQorCisgICwgbGlzdGVuOiBmdW5jdGlvbiAoKSB7CisgICAgICB0 aGlzLiRlbGVtZW50CisgICAgICAgIC5vbignZm9jdXMnLCAgICAkLnByb3h5KHRoaXMuZm9jdXMs IHRoaXMpKQorICAgICAgICAub24oJ2JsdXInLCAgICAgJC5wcm94eSh0aGlzLmJsdXIsIHRoaXMp KQorICAgICAgICAub24oJ2tleXByZXNzJywgJC5wcm94eSh0aGlzLmtleXByZXNzLCB0aGlzKSkK KyAgICAgICAgLm9uKCdrZXl1cCcsICAgICQucHJveHkodGhpcy5rZXl1cCwgdGhpcykpCisKKyAg ICAgIGlmICh0aGlzLmV2ZW50U3VwcG9ydGVkKCdrZXlkb3duJykpIHsKKyAgICAgICAgdGhpcy4k ZWxlbWVudC5vbigna2V5ZG93bicsICQucHJveHkodGhpcy5rZXlkb3duLCB0aGlzKSkKKyAgICAg IH0KKworICAgICAgdGhpcy4kbWVudQorICAgICAgICAub24oJ2NsaWNrJywgJC5wcm94eSh0aGlz LmNsaWNrLCB0aGlzKSkKKyAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgJ2xpJywgJC5wcm94eSh0 aGlzLm1vdXNlZW50ZXIsIHRoaXMpKQorICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAnbGknLCAk LnByb3h5KHRoaXMubW91c2VsZWF2ZSwgdGhpcykpCisgICAgfQorCisgICwgZXZlbnRTdXBwb3J0 ZWQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgeworICAgICAgdmFyIGlzU3VwcG9ydGVkID0gZXZlbnRO YW1lIGluIHRoaXMuJGVsZW1lbnQKKyAgICAgIGlmICghaXNTdXBwb3J0ZWQpIHsKKyAgICAgICAg dGhpcy4kZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpCisgICAgICAg IGlzU3VwcG9ydGVkID0gdHlwZW9mIHRoaXMuJGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0 aW9uJworICAgICAgfQorICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkCisgICAgfQorCisgICwgbW92 ZTogZnVuY3Rpb24gKGUpIHsKKyAgICAgIGlmICghdGhpcy5zaG93bikgcmV0dXJuCisKKyAgICAg IHN3aXRjaChlLmtleUNvZGUpIHsKKyAgICAgICAgY2FzZSA5OiAvLyB0YWIKKyAgICAgICAgY2Fz ZSAxMzogLy8gZW50ZXIKKyAgICAgICAgY2FzZSAyNzogLy8gZXNjYXBlCisgICAgICAgICAgZS5w cmV2ZW50RGVmYXVsdCgpCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBjYXNlIDM4OiAvLyB1 cCBhcnJvdworICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQorICAgICAgICAgIHRoaXMucHJl digpCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBjYXNlIDQwOiAvLyBkb3duIGFycm93Cisg ICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCisgICAgICAgICAgdGhpcy5uZXh0KCkKKyAgICAg ICAgICBicmVhaworICAgICAgfQorCisgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCisgICAgfQor CisgICwga2V5ZG93bjogZnVuY3Rpb24gKGUpIHsKKyAgICAgIHRoaXMuc3VwcHJlc3NLZXlQcmVz c1JlcGVhdCA9IH4kLmluQXJyYXkoZS5rZXlDb2RlLCBbNDAsMzgsOSwxMywyN10pCisgICAgICB0 aGlzLm1vdmUoZSkKKyAgICB9CisKKyAgLCBrZXlwcmVzczogZnVuY3Rpb24gKGUpIHsKKyAgICAg IGlmICh0aGlzLnN1cHByZXNzS2V5UHJlc3NSZXBlYXQpIHJldHVybgorICAgICAgdGhpcy5tb3Zl KGUpCisgICAgfQorCisgICwga2V5dXA6IGZ1bmN0aW9uIChlKSB7CisgICAgICBzd2l0Y2goZS5r ZXlDb2RlKSB7CisgICAgICAgIGNhc2UgNDA6IC8vIGRvd24gYXJyb3cKKyAgICAgICAgY2FzZSAz ODogLy8gdXAgYXJyb3cKKyAgICAgICAgY2FzZSAxNjogLy8gc2hpZnQKKyAgICAgICAgY2FzZSAx NzogLy8gY3RybAorICAgICAgICBjYXNlIDE4OiAvLyBhbHQKKyAgICAgICAgICBicmVhaworCisg ICAgICAgIGNhc2UgOTogLy8gdGFiCisgICAgICAgIGNhc2UgMTM6IC8vIGVudGVyCisgICAgICAg ICAgaWYgKCF0aGlzLnNob3duKSByZXR1cm4KKyAgICAgICAgICB0aGlzLnNlbGVjdCgpCisgICAg ICAgICAgYnJlYWsKKworICAgICAgICBjYXNlIDI3OiAvLyBlc2NhcGUKKyAgICAgICAgICBpZiAo IXRoaXMuc2hvd24pIHJldHVybgorICAgICAgICAgIHRoaXMuaGlkZSgpCisgICAgICAgICAgYnJl YWsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRoaXMubG9va3VwKCkKKyAgICAgIH0K KworICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQorICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCisg IH0KKworICAsIGZvY3VzOiBmdW5jdGlvbiAoZSkgeworICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1 ZQorICAgIH0KKworICAsIGJsdXI6IGZ1bmN0aW9uIChlKSB7CisgICAgICB0aGlzLmZvY3VzZWQg PSBmYWxzZQorICAgICAgaWYgKCF0aGlzLm1vdXNlZG92ZXIgJiYgdGhpcy5zaG93bikgdGhpcy5o aWRlKCkKKyAgICB9CisKKyAgLCBjbGljazogZnVuY3Rpb24gKGUpIHsKKyAgICAgIGUuc3RvcFBy b3BhZ2F0aW9uKCkKKyAgICAgIGUucHJldmVudERlZmF1bHQoKQorICAgICAgdGhpcy5zZWxlY3Qo KQorICAgICAgdGhpcy4kZWxlbWVudC5mb2N1cygpCisgICAgfQorCisgICwgbW91c2VlbnRlcjog ZnVuY3Rpb24gKGUpIHsKKyAgICAgIHRoaXMubW91c2Vkb3ZlciA9IHRydWUKKyAgICAgIHRoaXMu JG1lbnUuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKQorICAgICAgJChlLmN1 cnJlbnRUYXJnZXQpLmFkZENsYXNzKCdhY3RpdmUnKQorICAgIH0KKworICAsIG1vdXNlbGVhdmU6 IGZ1bmN0aW9uIChlKSB7CisgICAgICB0aGlzLm1vdXNlZG92ZXIgPSBmYWxzZQorICAgICAgaWYg KCF0aGlzLmZvY3VzZWQgJiYgdGhpcy5zaG93bikgdGhpcy5oaWRlKCkKKyAgICB9CisKKyAgfQor CisKKyAgLyogVFlQRUFIRUFEIFBMVUdJTiBERUZJTklUSU9OCisgICAqID09PT09PT09PT09PT09 PT09PT09PT09PT09PSAqLworCisgIHZhciBvbGQgPSAkLmZuLnR5cGVhaGVhZAorCisgICQuZm4u dHlwZWFoZWFkID0gZnVuY3Rpb24gKG9wdGlvbikgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVu Y3Rpb24gKCkgeworICAgICAgdmFyICR0aGlzID0gJCh0aGlzKQorICAgICAgICAsIGRhdGEgPSAk dGhpcy5kYXRhKCd0eXBlYWhlYWQnKQorICAgICAgICAsIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9u ID09ICdvYmplY3QnICYmIG9wdGlvbgorICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCd0eXBl YWhlYWQnLCAoZGF0YSA9IG5ldyBUeXBlYWhlYWQodGhpcywgb3B0aW9ucykpKQorICAgICAgaWYg KHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpCisgICAgfSkKKyAgfQor CisgICQuZm4udHlwZWFoZWFkLmRlZmF1bHRzID0geworICAgIHNvdXJjZTogW10KKyAgLCBpdGVt czogOAorICAsIG1lbnU6ICc8dWwgY2xhc3M9InR5cGVhaGVhZCBkcm9wZG93bi1tZW51Ij48L3Vs PicKKyAgLCBpdGVtOiAnPGxpPjxhIGhyZWY9IiMiPjwvYT48L2xpPicKKyAgLCBtaW5MZW5ndGg6 IDEKKyAgfQorCisgICQuZm4udHlwZWFoZWFkLkNvbnN0cnVjdG9yID0gVHlwZWFoZWFkCisKKwor IC8qIFRZUEVBSEVBRCBOTyBDT05GTElDVAorICAqID09PT09PT09PT09PT09PT09PT0gKi8KKwor ICAkLmZuLnR5cGVhaGVhZC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkgeworICAgICQuZm4udHlw ZWFoZWFkID0gb2xkCisgICAgcmV0dXJuIHRoaXMKKyAgfQorCisKKyAvKiBUWVBFQUhFQUQgREFU QS1BUEkKKyAgKiA9PT09PT09PT09PT09PT09PT0gKi8KKworICAkKGRvY3VtZW50KS5vbignZm9j dXMudHlwZWFoZWFkLmRhdGEtYXBpJywgJ1tkYXRhLXByb3ZpZGU9InR5cGVhaGVhZCJdJywgZnVu Y3Rpb24gKGUpIHsKKyAgICB2YXIgJHRoaXMgPSAkKHRoaXMpCisgICAgaWYgKCR0aGlzLmRhdGEo J3R5cGVhaGVhZCcpKSByZXR1cm4KKyAgICAkdGhpcy50eXBlYWhlYWQoJHRoaXMuZGF0YSgpKQor ICB9KQorCit9KHdpbmRvdy5qUXVlcnkpOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYm9vdHN0cmFwLWFmZml4LmpzIHYy LjMuMQorICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5o dG1sI2FmZml4CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAxMiBUd2l0dGVyLCBJbmMuCisgKgorICog TGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNl bnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNl IHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vu c2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAK KyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGlu IHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBk aXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9S IENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBT ZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlz c2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwor CishZnVuY3Rpb24gKCQpIHsKKworICAidXNlIHN0cmljdCI7IC8vIGpzaGludCA7XzsKKworCisg LyogQUZGSVggQ0xBU1MgREVGSU5JVElPTgorICAqID09PT09PT09PT09PT09PT09PT09PT0gKi8K KworICB2YXIgQWZmaXggPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykgeworICAgIHRoaXMu b3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmFmZml4LmRlZmF1bHRzLCBvcHRpb25zKQorICAg IHRoaXMuJHdpbmRvdyA9ICQod2luZG93KQorICAgICAgLm9uKCdzY3JvbGwuYWZmaXguZGF0YS1h cGknLCAkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbiwgdGhpcykpCisgICAgICAub24oJ2NsaWNr LmFmZml4LmRhdGEtYXBpJywgICQucHJveHkoZnVuY3Rpb24gKCkgeyBzZXRUaW1lb3V0KCQucHJv eHkodGhpcy5jaGVja1Bvc2l0aW9uLCB0aGlzKSwgMSkgfSwgdGhpcykpCisgICAgdGhpcy4kZWxl bWVudCA9ICQoZWxlbWVudCkKKyAgICB0aGlzLmNoZWNrUG9zaXRpb24oKQorICB9CisKKyAgQWZm aXgucHJvdG90eXBlLmNoZWNrUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCF0aGlz LiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSByZXR1cm4KKworICAgIHZhciBzY3JvbGxIZWlnaHQg PSAkKGRvY3VtZW50KS5oZWlnaHQoKQorICAgICAgLCBzY3JvbGxUb3AgPSB0aGlzLiR3aW5kb3cu c2Nyb2xsVG9wKCkKKyAgICAgICwgcG9zaXRpb24gPSB0aGlzLiRlbGVtZW50Lm9mZnNldCgpCisg ICAgICAsIG9mZnNldCA9IHRoaXMub3B0aW9ucy5vZmZzZXQKKyAgICAgICwgb2Zmc2V0Qm90dG9t ID0gb2Zmc2V0LmJvdHRvbQorICAgICAgLCBvZmZzZXRUb3AgPSBvZmZzZXQudG9wCisgICAgICAs IHJlc2V0ID0gJ2FmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20nCisgICAgICAsIGFmZml4CisK KyAgICBpZiAodHlwZW9mIG9mZnNldCAhPSAnb2JqZWN0Jykgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0 VG9wID0gb2Zmc2V0CisgICAgaWYgKHR5cGVvZiBvZmZzZXRUb3AgPT0gJ2Z1bmN0aW9uJykgb2Zm c2V0VG9wID0gb2Zmc2V0LnRvcCgpCisgICAgaWYgKHR5cGVvZiBvZmZzZXRCb3R0b20gPT0gJ2Z1 bmN0aW9uJykgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0LmJvdHRvbSgpCisKKyAgICBhZmZpeCA9IHRo aXMudW5waW4gIT0gbnVsbCAmJiAoc2Nyb2xsVG9wICsgdGhpcy51bnBpbiA8PSBwb3NpdGlvbi50 b3ApID8KKyAgICAgIGZhbHNlICAgIDogb2Zmc2V0Qm90dG9tICE9IG51bGwgJiYgKHBvc2l0aW9u LnRvcCArIHRoaXMuJGVsZW1lbnQuaGVpZ2h0KCkgPj0gc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0Qm90 dG9tKSA/CisgICAgICAnYm90dG9tJyA6IG9mZnNldFRvcCAhPSBudWxsICYmIHNjcm9sbFRvcCA8 PSBvZmZzZXRUb3AgPworICAgICAgJ3RvcCcgICAgOiBmYWxzZQorCisgICAgaWYgKHRoaXMuYWZm aXhlZCA9PT0gYWZmaXgpIHJldHVybgorCisgICAgdGhpcy5hZmZpeGVkID0gYWZmaXgKKyAgICB0 aGlzLnVucGluID0gYWZmaXggPT0gJ2JvdHRvbScgPyBwb3NpdGlvbi50b3AgLSBzY3JvbGxUb3Ag OiBudWxsCisKKyAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHJlc2V0KS5hZGRDbGFzcygn YWZmaXgnICsgKGFmZml4ID8gJy0nICsgYWZmaXggOiAnJykpCisgIH0KKworCisgLyogQUZGSVgg UExVR0lOIERFRklOSVRJT04KKyAgKiA9PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHZh ciBvbGQgPSAkLmZuLmFmZml4CisKKyAgJC5mbi5hZmZpeCA9IGZ1bmN0aW9uIChvcHRpb24pIHsK KyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciAkdGhpcyA9ICQo dGhpcykKKyAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgnYWZmaXgnKQorICAgICAgICAsIG9w dGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbgorICAgICAgaWYgKCFk YXRhKSAkdGhpcy5kYXRhKCdhZmZpeCcsIChkYXRhID0gbmV3IEFmZml4KHRoaXMsIG9wdGlvbnMp KSkKKyAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKQor ICAgIH0pCisgIH0KKworICAkLmZuLmFmZml4LkNvbnN0cnVjdG9yID0gQWZmaXgKKworICAkLmZu LmFmZml4LmRlZmF1bHRzID0geworICAgIG9mZnNldDogMAorICB9CisKKworIC8qIEFGRklYIE5P IENPTkZMSUNUCisgICogPT09PT09PT09PT09PT09PT0gKi8KKworICAkLmZuLmFmZml4Lm5vQ29u ZmxpY3QgPSBmdW5jdGlvbiAoKSB7CisgICAgJC5mbi5hZmZpeCA9IG9sZAorICAgIHJldHVybiB0 aGlzCisgIH0KKworCisgLyogQUZGSVggREFUQS1BUEkKKyAgKiA9PT09PT09PT09PT09PSAqLwor CisgICQod2luZG93KS5vbignbG9hZCcsIGZ1bmN0aW9uICgpIHsKKyAgICAkKCdbZGF0YS1zcHk9 ImFmZml4Il0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciAkc3B5ID0gJCh0aGlzKQor ICAgICAgICAsIGRhdGEgPSAkc3B5LmRhdGEoKQorCisgICAgICBkYXRhLm9mZnNldCA9IGRhdGEu b2Zmc2V0IHx8IHt9CisKKyAgICAgIGRhdGEub2Zmc2V0Qm90dG9tICYmIChkYXRhLm9mZnNldC5i b3R0b20gPSBkYXRhLm9mZnNldEJvdHRvbSkKKyAgICAgIGRhdGEub2Zmc2V0VG9wICYmIChkYXRh Lm9mZnNldC50b3AgPSBkYXRhLm9mZnNldFRvcCkKKworICAgICAgJHNweS5hZmZpeChkYXRhKQor ICAgIH0pCisgIH0pCisKKworfSh3aW5kb3cualF1ZXJ5KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2dlbl9y ZWdpb25zLmpzIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9nZW5fcmVnaW9ucy5q cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGE3NTg4Ci0tLSAvZGV2L251 bGwKKysrIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9nZW5fcmVnaW9ucy5qcwpA QCAtMCwwICsxLDc5NSBAQAorLyogR2xvYmFsIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgVGhlIG1vcmUg Y2FwaXRhbCBsZXR0ZXJzIGluIGEgdmFyaWFibGUgbmFtZSwgdGhlIG1vcmUgaW1wb3J0YW50IGl0 IGlzLi4uCisgKi8KK3ZhciBSRUdfRklMRV9TSVpFID0gMTI4OwordmFyIFJFR19TSVpFID0gMzI7 IC8qIEluIGJ5dGVzLiAqLworCit2YXIgTUFYX1NVQlJFR05VTSA9IE1hdGgucG93KDIsIDE2KTsK K3ZhciBNQVhfUkVHX1NQQU4gPSAyIC8qIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXIgYSByZWdpb24g Y2FuIHNwYW4uKi8KKworLyogRGVmYXVsdCB2YWx1ZXMgZm9yIHJlZ2lvbnMuICovCit2YXIgREVG QVVMVF9SRUdfRklMRSA9ICdnJzsKK3ZhciBERUZBVUxUX0VYRUNfU0laRSA9IDg7Cit2YXIgREVG QVVMVF9EQVRBX1NJWkUgPSA0OyAvKiBGbG9hdCAqLworCisvKiBWZXJ0aWNhbCBncmlkIHNpemUu ICovCit2YXIgUk9XUyA9IDEwOworCisvKiBPdXIgZHJhd2luZyBjb250ZXh0LiAqLwordmFyIGNh bnZhcyA9ICQoJyNjYW52YXMnKVswXTsKK3ZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQn KTsKKworLyogeCx5IG9mZnNldCB0byBzdGFydCBkcmF3aW5nIGdyaWQgKGxlYXZlcyByb29tIGZv ciBsYWJlbHMpLiAqLwordmFyIFNUQVJUX1kgPSAzMDsKK3ZhciBTVEFSVF9YID0gNDM7CisKK3Zh ciBDT0xPUl9HT09EID0gJyNkZmYwZDgnOwordmFyIENPTE9SX0JBRCA9ICcjZjJkZWRlJzsKKwor LyogRGVyaXZlZC4gRG9uJ3QgdG91Y2guICovCit2YXIgQ09MX1cgPSBNYXRoLmZsb29yKChjYW52 YXMud2lkdGggLSBTVEFSVF9YKSAvIFJFR19TSVpFKTsKK3ZhciBST1dfSCA9IE1hdGguZmxvb3Io KGNhbnZhcy5oZWlnaHQgLSBTVEFSVF9ZKSAvIFJPV1MpOworCisvKiBUaGlzIHJlZ2V4cCB3aWxs IG1hdGNoIHRoZSBzeW50YXggb2YgYW55IGRpcmVjdCBhZGRyZXNzaW5nIHJlZ2lzdGVyIGFkZHJl c3MKKyAqIHJlZ2lvbiBkZXNjcmlwdGlvbi4gTm90ZSB0aGF0IG1hdGNoaW5nIHRoaXMgcmVnZXhw IG9ubHkgZW5zdXJlIHRoYXQgdGhlCisgKiBzeW50YXggaXMgY29ycmVjdCwgdGhlcmUgbWF5IHN0 aWxsIGJlIG5vbi1zeW50YWN0aWMgZXJyb3JzIGluIHRoZQorICogZGVzY3JpcHRpb24sIGUuZy4s IGFuIGludmFsaWQgY29tYmluYXRpb24gb2Ygc3RyaWRlcywgZXRjLiAqLwordmFyIFJFR0lPTl9S RUdFWFAgPSBuZXcgUmVnRXhwIChbJ15ccyooZ3xyKT8wKicsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAnKFswLTldP1swLTldfDFbMC0xXVswLTldfDEyWzAtN10pJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoXFwuMCooWzAtOV0/WzAtOV0/WzAtOV18JywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbMC01XVswLTldezN9fDZbMC00XVsw LTldezN9fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNjVbMC00XVswLTld ezJ9fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNjU1WzAtMl1bMC05XXw2 NTUzWzAtNl0pKT8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhccyo8KCgw fDF8Mnw0fDh8MTZ8MzIpWzssXVxzKicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAnKDF8Mnw0fDh8MTYpLFwqKT8oMHwxfDJ8NCk+KT8nLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJyg6Pyh1YnxifHV3fHd8dWR8ZHxmfHYpKT8kJ10uam9pbignJyksICdpJyk7 CisKKy8qIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieSBhbiBpbnZhbGlkIHJlZ2lvbi4gKi8K K2Z1bmN0aW9uIFBhcnNlRXJyb3IodGl0bGUsIG1zZykgeworICAgIHRoaXMudGl0bGUgPSB0aXRs ZTsKKyAgICB0aGlzLm1zZyA9IG1zZzsKK30KKworLyogRHluYW1pYyBDb250ZW50ICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAq ICAgSlF1ZXJ5IHNuaXBwZXRzIGFuZCBtaXNjZWxsYW5lb3VzIGdldHRlcnMvc2V0dGVycyBmb3Ig YnJpbmdpbmcgb3VyIEhUTUwKKyAqICAgZWxlbWVudHMgdG8gbGlmZS4KKyAqLworCisvKiBUaGlz IGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgZm9yIGEgY2hhbmdlIGluIHRoZSBwYWdlJ3MgaGFzaC4g Ki8KKyQod2luZG93KS5oYXNoY2hhbmdlKGZ1bmN0aW9uKCkgeworICAgIGhpZGVBbGVydHMoKTsK KworICAgIC8qIEVuYWJsZSB0aGUgJ1NoYXJlJyBidXR0b24uICovCisgICAgJCgnI3NoYXJlLWJ0 bicpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CisKKyAgICB0cnkgeworICAgICAgICBkZWNvZGVI YXNoKCk7CisgICAgICAgIHN1Ym1pdFJlZ2lvbigpOworICAgICAgICBkcmF3UmVnaW9uKCk7Cisg ICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFBhcnNlRXJyb3Ipewor ICAgICAgICAgICAgc2hvd0FsZXJ0RXJyb3IoZS50aXRsZSwgZS5tc2cpOworICAgICAgICAgICAg c3VibWl0RW1wdHlSZWdpb24oKTsKKyAgICAgICAgICAgIGZsYXNoUmVnaW9uRm9ybUJhY2tncm91 bmQoQ09MT1JfQkFEKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzaG93QWxlcnRFcnJv cignQXBwbGljYXRpb24gRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuY2F1 Z2h0IEphdmFTY3JpcHQgZXhjZXB0aW9uLicpOworICAgIH0KK30pOworCiskKGZ1bmN0aW9uKCkg eworICAgICQoJyNleGVjLXNpemUtdWwgbGkgYScpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAg ICBoaWRlQWxlcnRzKCk7CisgICAgICAgICQoJyNleGVjLXNpemUtYnRuOmZpcnN0LWNoaWxkJyku aHRtbCgkKHRoaXMpLnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKyAnIDxzcGFuIGNsYXNzPSJjYXJldCI+PC9zcGFuPicpOworICAgICAgICAkKCcj ZXhlYy1zaXplLWJ0bjpmaXJzdC1jaGlsZCcpLnZhbCgkKHRoaXMpLnRleHQoKSk7CisKKyAgICAg ICAgaWYgKGlzVmFsaWRSZWdpb24oKSkKKyAgICAgICAgICAgIGVuY29kZUhhc2goKTsKKyAgICB9 KTsKK30pOworCisvKiBSZWdpb24gaW5wdXQuICovCiskKCcjcmVnaW9uLWZvcm0nKS5rZXl1cChm dW5jdGlvbihldmVudCkgeworICAgIHZhciBrZXkgPSBldmVudC5rZXlDb2RlOworCisgICAgLyog V2Ugd2FudCB0byB1cGRhdGUgdGhlIHJlZ2lvbiBpZiB3ZSdyZSB0eXBpbmcgc29tZXRoaW5nIHVz ZWZ1bC4gKi8KKyAgICBpZighKGtleSA+PSAzNyAmJiBrZXkgPD0gNDApCisgICAgICAgJiYgKGtl eSA9PSAxMyB8fCBpc1ZhbGlkUmVnaW9uKCkpKSB7CisgICAgICAgIGVuY29kZUhhc2goKTsKKyAg ICB9Cit9KTsKKworLyogLS1hZHZhbmNlZC4gKi8KKyQoJyNhZHZhbmNlZCcpLm1vdXNldXAoZnVu Y3Rpb24oKSB7CisgICAgdG9nZ2xlQWR2YW5jZWQoKTsKK30pOworCit2YXIgYWR2YW5jZWQgPSBm YWxzZTsKKworZnVuY3Rpb24gdG9nZ2xlQWR2YW5jZWQoKSB7CisgICAgaGlkZUFsZXJ0cygpOwor ICAgIGFkdmFuY2VkID0gIWFkdmFuY2VkOworCisgICAgZW5jb2RlSGFzaCgpOworfQorCisvKiBT aGFyZSAqLworZnVuY3Rpb24gc2hhcmVCdG5DYihpZCkgeworICAgIHRvZ2dsZVNoYXJlKCk7Cit9 CisKKyQoJyNzaGFyZSAuY2xvc2UnKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAkKCcjc2hhcmUn KS5oaWRlKCk7Cit9KTsKKworLyogQWxlcnRzICovCiskKCcjYWxlcnQtZXJyb3IgLmNsb3NlJyku Y2xpY2soZnVuY3Rpb24oKSB7CisgICAgJCgnI2FsZXJ0LWVycm9yJykuaGlkZSgpOworfSk7CisK KyQoJyNhbGVydCAuY2xvc2UnKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAkKCcjYWxlcnQnKS5o aWRlKCk7Cit9KTsKKworZnVuY3Rpb24gc2hvd0FsZXJ0RXJyb3IodGl0bGUsIG1zZykgeworICAg ICQoJyNhbGVydC1lcnJvci1wbGFjZWhvbGRlcicpLmh0bWwoJzxzdHJvbmc+JyArIHRpdGxlICsg Jzwvc3Ryb25nPiAnICsgbXNnKTsKKyAgICAkKCcjYWxlcnQtZXJyb3InKS5zaG93KCk7Cit9CisK K2Z1bmN0aW9uIHNob3dBbGVydCh0aXRsZSwgbXNnKSB7CisgICAgJCgnI2FsZXJ0LXBsYWNlaG9s ZGVyJykuaHRtbCgnPHN0cm9uZz4nICsgdGl0bGUgKyAnPC9zdHJvbmc+ICcgKyBtc2cpOworICAg ICQoJyNhbGVydCcpLnNob3coKTsKK30KKworZnVuY3Rpb24gdG9nZ2xlU2hhcmUoKSB7CisgICAg aWYgKCQoJyNzaGFyZScpLmlzKCc6dmlzaWJsZScpKSB7CisgICAgICAgICQoJyNzaGFyZScpLmhp ZGUoKTsKKyAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhhc2gpIHsKKyAgICAgICAgLyogU2hvdyB0 aGUgaGFzaCBhbmQgaGlnaGxpZ2h0IGl0IGZvciBxdWljayBjb3B5aW5nLiAqLworICAgICAgICB2 YXIgaGFzaCA9ICQoJyNzaGFyZS1oYXNoJylbMF07CisKKyAgICAgICAgaGFzaC52YWx1ZSA9IGxv Y2F0aW9uLmhhc2g7CisgICAgICAgICQoJyNzaGFyZScpLnNob3coKTsKKyAgICAgICAgaGFzaC5m b2N1cygpOworICAgICAgICBoYXNoLnNlbGVjdCgpOworICAgICAgICBoYXNoLnNldFNlbGVjdGlv blJhbmdlKDAsIDEyMCk7CisgICAgfQorfQorCitmdW5jdGlvbiBoaWRlQWxlcnRzKCkgeworICAg ICQoJy5hbGVydCcpLmhpZGUoKTsKK30KKworZnVuY3Rpb24gc2V0RGVmYXVsdEV4ZWNTaXplKCkg eworICAgICQoJyNleGVjLXNpemUtYnRuOmZpcnN0LWNoaWxkJykudGV4dCgkKCcjZGVmYXVsdC1l eGVjLXNpemUtbGknKS50ZXh0KCkpOworfQorCitmdW5jdGlvbiBzZXRDYW52YXNDYXB0aW9uKG1z ZykgeworICAgICQoJyNjYW52YXMtY2FwdGlvbicpLnRleHQobXNnKTsKK30KKworZnVuY3Rpb24g Zmxhc2hSZWdpb25Gb3JtQmFja2dyb3VuZChjb2xvcil7CisgICAgdmFyIHJlZ2lvbkZvcm0gPSAk KCcjcmVnaW9uLWZvcm0nKVswXTsKKworICAgIHJlZ2lvbkZvcm0uc3R5bGUuYmFja2dyb3VuZCA9 IGNvbG9yOworICAgIHZhciBpbnQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAg cmVnaW9uRm9ybS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNGRkYnOworICAgICAgICBjbGVhckludGVy dmFsKGludCk7CisgICAgfSwgNTAwKTsKK30KKworZnVuY3Rpb24gZ2V0UmVnaW9uU3RyaW5nKCkg eworICAgIHJldHVybiAkKCcjcmVnaW9uLWZvcm0nKVswXS52YWx1ZTsKK30KKworZnVuY3Rpb24g c2V0UmVnaW9uU3RyaW5nKHN0cmluZykgeworICAgICQoJyNyZWdpb24tZm9ybScpWzBdLnZhbHVl ID0gc3RyaW5nOworfQorCitmdW5jdGlvbiBjbGVhclJlZ2lvblN0cmluZyhzdHJpbmcpIHsKKyAg ICBzZXRSZWdpb25TdHJpbmcoJycpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitmdW5jdGlv biBnZXRFeGVjU2l6ZSgpIHsKKyAgICByZXR1cm4gcGFyc2VJbnQoJCgnI2V4ZWMtc2l6ZS1idG46 Zmlyc3QtY2hpbGQnKVswXS50ZXh0KTsKK30KKworZnVuY3Rpb24gc2V0RXhlY1NpemUoc2l6ZSkg eworICAgICQoJyNleGVjLXNpemUtYnRuOmZpcnN0LWNoaWxkJykuaHRtbChzaXplICsgJyA8c3Bh biBjbGFzcz0iY2FyZXQiPjwvc3Bhbj4nKTsKKyAgICAkKCcjZXhlYy1zaXplLWJ0bjpmaXJzdC1j aGlsZCcpLnZhbChzaXplKTsKK30KKworZnVuY3Rpb24gYnVtcEV4ZWNTaXplVXAoKSB7CisgICAg aWYgKGdldEV4ZWNTaXplKCkgPD0xNikKKyAgICAgICAgc2V0RXhlY1NpemUoZ2V0RXhlY1NpemUo KSAqIDIpOworICAgIGVsc2UKKyAgICAgICAgc2V0RXhlY1NpemUoMSk7CisKKyAgICBpZiAoZ2V0 UmVnaW9uU3RyaW5nKCkubWF0Y2goUkVHSU9OX1JFR0VYUCkpCisgICAgICAgIGVuY29kZUhhc2go KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLyogU2V0IGEgbmV3IGhhc2ggYmFzZWQgb2Zm IG9mIHRoZSByZWdpb25zLiAqLworZnVuY3Rpb24gZW5jb2RlSGFzaCgpIHsKKyAgICB2YXIgcmVn aW9uU3RyaW5nID0gZ2V0UmVnaW9uU3RyaW5nKCk7CisgICAgdmFyIGhhc2g7CisKKyAgICBpZiAo cmVnaW9uU3RyaW5nLm1hdGNoKC9eXHMqIy8pKSB7CisgICAgICAgIC8qIElmIG91ciByZWdpb24g c3RyaW5nIGlzIGEgaGFzaCwgdGhlbiB1c2UgdGhhdC4gKi8KKyAgICAgICAgaGFzaCA9IHJlZ2lv blN0cmluZzsKKyAgICB9IGVsc2UgeworICAgICAgICBoYXNoID0gJ2V4ZWNzaXplPScgKyBnZXRF eGVjU2l6ZSgpICsgJyZyZWdpb249JyArIHJlZ2lvblN0cmluZworICAgICAgICAgICAgKyAnJmFk dmFuY2VkPScgKyAoKGFkdmFuY2VkKSA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBsb2NhdGlvbi5o YXNoID0gaGFzaDsKKyAgICAkKHdpbmRvdykuaGFzaGNoYW5nZSgpOworfQorCisvKiBEZWNvZGUg YSByZWdpb24gZnJvbSBVUkwgaGFzaC4gSWYgdGhlIGhhc2ggY29udGFpbnMgYSBtYWxmb3JtZWQg cmVnaW9uLAorICogc2hvdyBhbiBlcnJvci4KKyAqCisgKiBAcmV0dXJuIDEgaWYgaGFzaCBjb250 YWluZWQgcmVnaW9uIGRlc2NyaXB0aW9uLCBlbHNlIDAuCisgKi8KK2Z1bmN0aW9uIGRlY29kZUhh c2goKSB7CisgICAgYXJncyA9IGxvY2F0aW9uLmhhc2guc3BsaXQoJyYnKTsKKyAgICB2YXIgYXJn YyA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAg ICAgICAgdmFyIHBhaXIgPSBhcmdzW2ldLnNwbGl0KCc9Jyk7CisKKyAgICAgICAgc3dpdGNoIChT dHJpbmcocGFpclswXSkpIHsKKyAgICAgICAgY2FzZSAnI2V4ZWNzaXplJzoKKyAgICAgICAgICAg IHNldEV4ZWNTaXplKHBhaXJbMV0pOworICAgICAgICAgICAgYXJnYysrOworICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIGNhc2UgJ3JlZ2lvbic6CisgICAgICAgICAgICAvKiBXZSBvbmx5IHNl dCB0aGUgcmVnaW9uIHRleHQgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQKKyAgICAg ICAgICAgICAqIHRleHQuIFRoaXMgcHJldmVudHMgdGhlIGNhcmV0IGZyb20gYmVpbmcgbW92ZWQg dG8gdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICAqIHN0cmluZyB3aGlsZSB0eXBpbmcuICov CisgICAgICAgICAgICBpZiAoZ2V0UmVnaW9uU3RyaW5nKCkgIT0gcGFpclsxXSkKKyAgICAgICAg ICAgICAgICBzZXRSZWdpb25TdHJpbmcocGFpclsxXSk7CisKKyAgICAgICAgICAgIGFyZ2MrKzsK KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdhZHZhbmNlZCc6CisgICAgICAgICAg ICAkKCcjYWR2YW5jZWQnKS5wcm9wKCdjaGVja2VkJywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKHBhcnNlSW50KHBhaXJbMV0pID8gdHJ1ZSA6IGZhbHNlKSk7CisgICAgICAgICAg ICBhcmdjKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm IChhcmdjID09PSAzKSB7CisgICAgICAgIC8qIFdlIGdvdCBhbGwgb3VyIGFyZ3VtZW50cy4gKi8K KyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFyZ2MpIHsKKyAg ICAgICAgICAgIC8qIFdlIGdvdCBzb21lIGFyZ3VtZW50cywgYnV0IG5vdCBhbGwuICovCisgICAg ICAgICAgICBzaG93QWxlcnRFcnJvcignTWFsZm9ybWVkIFVSTCcsICdVUkwgaGFzaCBjb250YWlu ZWQgaW52YWxpZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICdyZWdpb24gZGVzY3Jp cHRpb24uJyk7CisgICAgICAgICAgICBzdWJtaXRFbXB0eVJlZ2lvbigpOworICAgICAgICB9CisK KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBDbGVhciB0aGUgY2FudmFzLiAqLwor ZnVuY3Rpb24gY2xlYXJDYW52YXMoKSB7CisgICAgY3R4LmZpbGxTdHlsZSA9ICcjRkZGJzsKKyAg ICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKK30KKwor LyogRHJhdyB0aGUgdmVydGljYWwgY29sdW1uIGxpbmVzLiAqLworZnVuY3Rpb24gZHJhd0dyaWRD b2x1bW5zKCkgeworICAgIHZhciBjb2xfeCA9IFNUQVJUX1g7CisKKyAgICBjdHguc3Ryb2tlU3R5 bGUgPSAnI0MwQzBDMCcKKyAgICBjdHgubGluZVdpZHRoID0gMTsKKworICAgIGZvciAodmFyIGkg PSAwOyBpIDw9IFJFR19TSVpFOyBpKyspIHsKKyAgICAgICAgY3R4Lm1vdmVUbyhjb2xfeCArIC41 LCBTVEFSVF9ZKTsKKyAgICAgICAgY3R4LmxpbmVUbyhjb2xfeCArIC41LCBTVEFSVF9ZICsgKFJP V1MgKiBST1dfSCkpOworICAgICAgICBjdHguc3Ryb2tlKCk7CisgICAgICAgIGNvbF94ICs9IENP TF9XOworICAgIH0KK30KKworLyogRHJhdyB0aGUgY29sdW1uIGxhYmVscyAoYnl0ZSBpbmRleGVz KS4gKi8KK2Z1bmN0aW9uIGRyYXdDb2xMYWJlbHMoKSB7CisgICAgdmFyIGNvbF94ID0gU1RBUlRf WCArIDU7CisKKyAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7CisgICAgY3R4LmZpbGxTdHls ZSA9ICcjMDAwJzsKKyAgICBjdHguZm9udCA9ICcxNHB4IGFyaWFsJzsKKworICAgIGZvciAodmFy IGkgPSAwOyBpIDwgUkVHX1NJWkU7IGkrKykgeworICAgICAgICBjdHguZmlsbFRleHQoaSwgY29s X3ggKyBDT0xfVyAvIDIgLSA1LCBTVEFSVF9ZIC0gNSk7CisgICAgICAgIGNvbF94ICs9IENPTF9X OworICAgIH0KK30KKworLyogRHJhdyB0aGUgaG9yaXpvbnRhbCByb3cgbGluZXMuICovCitmdW5j dGlvbiBkcmF3R3JpZFJvd3MoKSB7CisgICAgdmFyIHJvd195ID0gU1RBUlRfWTsKKworICAgIGN0 eC5zdHJva2VTdHlsZSA9ICcjQzBDMEMwJworICAgIGN0eC5saW5lV2lkdGggPSAxOworCisgICAg Zm9yICh2YXIgaSA9IDA7IGkgPD0gUk9XUzsgaSsrKSB7CisgICAgICAgIGN0eC5tb3ZlVG8oU1RB UlRfWCwgcm93X3kgKyAuNSk7CisgICAgICAgIGN0eC5saW5lVG8oU1RBUlRfWCArIChSRUdfU0la RSAqIENPTF9XKSwgcm93X3kgKyAuNSk7CisgICAgICAgIGN0eC5zdHJva2UoKTsKKyAgICAgICAg cm93X3kgKz0gUk9XX0g7CisgICAgfQorfQorCisvKiBEcmF3IHRoZSByb3cgbGFiZWxzIChyZWdp c3RlciBudW1iZXJzKS4KKyAqCisgKiBAcGFyYW0gcmVnRmlsZSAgICAgICBUaGUgKG9wdGlvbmFs KSBvbmUgb3IgbW9yZSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQKKyAqICAgICAgICAgICAgICAgICAg ICAgIHByZWZpeGVzIGEgcmVnaXN0ZXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAnZycgZm9yIEdSRi4K KyAqIEBwYXJhbSBzdGFydFJlZ2lzdGVyIFRoZSBudW1iZXIgdG8gYmVnaW4gbGFiZWxpbmcgcmVn aXN0ZXJzIGZyb20sIGZvciBleGFtcGxlCisgKiAgICAgICAgICAgICAgICAgICAgICAxMTAuCisg Ki8KK2Z1bmN0aW9uIGRyYXdSb3dMYWJlbHMocmVnRmlsZSwgc3RhcnRSZWdpc3RlcikgeworICAg IHZhciByb3dfeSA9IFNUQVJUX1kgKyBST1dfSCAtIChjYW52YXMuaGVpZ2h0IC8gMzApOworCisg ICAgY3R4LnRleHRBbGlnbiA9ICdyaWdodCc7CisgICAgY3R4LmZpbGxTdHlsZSA9ICcjMDAwJzsK KyAgICBjdHguZm9udCA9ICdib2xkIDE0cHggYXJpYWwnOworCisgICAgZm9yICh2YXIgaSA9IDA7 IGkgPCBST1dTOyBpKyspIHsKKyAgICAgICAgY3R4LmZpbGxUZXh0KHJlZ0ZpbGUgKyAoc3RhcnRS ZWdpc3RlciArIGkpLCBTVEFSVF9YIC0gNSwgcm93X3kpOworICAgICAgICByb3dfeSArPSBST1df SDsKKyAgICB9Cit9CisKKy8qIERyYXcgYSBjZWxsIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4K KyAqCisgKiBAcGFyYW0gbGFiZWwgQW55IHRleHQgdG8gcGxhY2UgaW5zaWRlIHRoZSBjZWxsLgor ICogQHBhcmFtIHggQ2VsbCBvcmlnaW4gKGxlZnRtb3N0IGVkZ2UsIGluIHB4KS4KKyAqIEBwYXJh bSB5IENlbGwgb3JpZ2luICh1cHBlcm1vc3QgZWRnZSwgaW4gcHgpLgorICogQHBhcmFtIHdpZHRo IFRoZSB3aWR0aCBvZiB0aGUgY2VsbCAoaW4gcHgpLgorICovCitmdW5jdGlvbiBkcmF3Q2VsbChs YWJlbCwgeCwgeSwgd2lkdGgsIGNvbG9yKSB7CisgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOwor ICAgIGN0eC5nbG9iYWxBbHBoYSA9IDAuNzsKKyAgICBjdHguZmlsbFJlY3QoeCwgeSwgd2lkdGgs IFJPV19IKTsKKworICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjMDYyNjZGJzsKKyAgICBjdHgubGlu ZVdpZHRoID0gMjsKKyAgICBjdHguc3Ryb2tlUmVjdCh4ICsgLjUsIHkgKyAuNSwgd2lkdGggKyAu NSwgUk9XX0ggKyAuNSk7CisKKyAgICBjdHguZmlsbFN0eWxlID0gJyNGRkYnOworICAgIGN0eC5n bG9iYWxBbHBoYSA9IDEuMDsKKyAgICBjdHguZmlsbFRleHQobGFiZWwsIHggKyAod2lkdGggLyAy KSwgeSArIChST1dfSCAvIDIpICsgNSk7Cit9CisKKy8qIEJvb3RzdHJhcC4gKi8KK2Z1bmN0aW9u IGluaXQoKSB7CisgICAgJCgnI3NoYXJlLWJ0bicpLmF0dHIoJ2Rpc2FibGVkJywnZGlzYWJsZWQn KTsKKworICAgIGlmIChkZWNvZGVIYXNoKCkpIHsKKyAgICAgICAgJCh3aW5kb3cpLmhhc2hjaGFu Z2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoaWRlQWxlcnRzKCk7CisgICAgICAgIHN1Ym1p dEVtcHR5UmVnaW9uKCk7CisgICAgfQorfQorCisvKiBLZXkgQmluZGluZ3MgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICog ICBTZXQgZG9jdW1lbnQtd2lkZSBrZXkgYmluZGluZ3MuCisgKi8KK2Z1bmN0aW9uIHBhZ2VCaW5k KGtleSwgZnVuYykgeworICAgICQoZG9jdW1lbnQpLmJpbmQoJ2tleWRvd24nLCBrZXksIGZ1bmMp OworICAgICQoJyNyZWdpb24tZm9ybScpLmJpbmQoJ2tleWRvd24nLCBrZXksIGZ1bmMpOworICAg ICQoJyNzaGFyZS1oYXNoJykuYmluZCgna2V5ZG93bicsIGtleSwgZnVuYyk7Cit9CisKK3BhZ2VC aW5kKCdhJywgdG9nZ2xlQWR2YW5jZWQpOworcGFnZUJpbmQoJ2UnLCBidW1wRXhlY1NpemVVcCk7 CitwYWdlQmluZCgncycsIHRvZ2dsZVNoYXJlKTsKK3BhZ2VCaW5kKCdlc2MnLCBoaWRlQWxlcnRz KTsKK3BhZ2VCaW5kKCdjJywgY2xlYXJSZWdpb25TdHJpbmcpOworCiskKGRvY3VtZW50KS5iaW5k KCdrZXlkb3duJywgJ3InLCBmdW5jdGlvbigpIHsKKyAgICAkKCcjcmVnaW9uLWZvcm0nKS5mb2N1 cygpOworICAgIHJldHVybiBmYWxzZTsKK30pOworCiskKCcjc2hhcmUtaGFzaCcpLmJpbmQoJ2tl eWRvd24nLCAncicsIGZ1bmN0aW9uKCkgeworICAgICQoJyNyZWdpb24tZm9ybScpLmZvY3VzKCk7 CisgICAgcmV0dXJuIGZhbHNlOworfSk7CisKKyQoZG9jdW1lbnQpLmJpbmQoJ2tleWRvd24nLCAn cmV0dXJuJywgZnVuY3Rpb24oKSB7CisgICAgaWYgKGlzTmFOKGdldEV4ZWNTaXplKCkpKQorICAg ICAgICBzZXRFeGVjU2l6ZShERUZBVUxUX0VYRUNfU0laRSk7CisKKyAgICBlbmNvZGVIYXNoKCk7 Cit9KTsKKworLyogUmVnaXN0ZXIgUmVnaW9uIHBhcnNpbmcgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgT3VyIG1haW4gcHJvZ3JhbSBs b2dpYywgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgaW5wdXQgc3RyaW5ncworICog ICBhbmQgcHJlc2VudGluZyB0aGUgcmVzdWx0cy4KKyAqLwordmFyIGV4ZWNTaXplOwordmFyIHJl Z0ZpbGU7Cit2YXIgcmVnaXN0ZXI7Cit2YXIgc3ViUmVnTnVtOwordmFyIHZlcnRTdHJpZGU7Cit2 YXIgd2lkdGg7Cit2YXIgaG9yelN0cmlkZTsKK3ZhciBkYXRhU2l6ZTsKKworLyogUGVyZm9ybSBh IGRyeS1ydW4gcGFyc2Ugb2YgdGhlIHJlZ2lvbiBkZXNjcmlwdGlvbi4KKyAqCisgKiBAcmV0dXJu IDEgaWYgYWxsIGlucHV0cyBhcmUgdmFsaWQsIGVsc2UgMC4KKyAqLworZnVuY3Rpb24gaXNWYWxp ZFJlZ2lvbigpeworICAgIGlmIChnZXRSZWdpb25TdHJpbmcoKS5tYXRjaChSRUdJT05fUkVHRVhQ KSkgeworICAgICAgICAvKiBJdCBwYXNzZWQgdGhlIHJlZ2V4cCBtYXRjaCwgc28gbGV0cyBzZWUg aWYgd2UgY2FuIHN1Ym1pdCBpdCAod2l0aG91dAorICAgICAgICAgKiBkcmF3aW5nIGFueXRoaW5n LiAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VibWl0UmVnaW9uKCk7CisgICAgICAg ICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBjYXRjaCAoZSl7CisgICAgICAgICAgICByZXR1cm4g MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBHZXRzIHRoZSBy ZWdpb24gZGVzY3JpcHRpb24sIGV4ZWNTaXplIGFuZCAtLWFkdmFuY2VkLiBJZiBhbnkgb2YgdGhl IGlucHV0CisgKiBkYXRhIGlzIGludmFsaWQsIGl0IHdpbGwgdGhyb3cgYSBkZXNjcmlwdGl2ZSBQ YXJzZUVycm9yIGV4Y2VwdGlvbi4KKyAqCisgKiBSZWdpb24gZGVzY3JpcHRpb25zIHRha2UgdGhl IGZvcm06CisgKiAgICBbUmVnRmlsZV0gUmVnTnVtWy5TdWJSZWdOdW1dWzxbVmVydFN0cmlkZTtX aWR0aCxdSG9yelN0aWRlPl1bOnR5cGVdCisgKgorICogVmFsdWVzIGluIHNxdWFyZSBicmFja2V0 cyAoW3hdKSBkZW5vdGUgb3B0aW9uYWwgYWRkaXRpb25zLiBXaGVyZSBvcHRpb25hbAorICogcGFy dHMgYXJlIG9taXR0ZWQsIHRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnMgYXJlIG1hZGU6CisgKgor ICogICBbUmVnRmlsZV0gICAgICAgICAgICAgICAgICAgICAgIFJlZ0ZpbGUgaXMgJ2cnLgorICog ICBbLlN1YlJlZ051bV0gICAgICAgICAgICAgICAgICAgIFN1YlJlZ051bSBpcyAwLgorICogICBb VmVydFNyaWRlO1dpZHRoLF0gICAgICAgICAgICAgIFJlZ2lvbiBpcyAxRC4KKyAqICAgWzxWZXJ0 U3RyaWRlO1dpZHRoLEhvcnpTdHJpZGU+XSBSZWdpb24gaXMgc2NhbGFyLgorICogICBbOnR5cGVd ICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgaXMgZmxvYXQgKGRhdGFTaXplID0gNCkuCisg Ki8KK2Z1bmN0aW9uIHN1Ym1pdFJlZ2lvbigpIHsKKyAgICB2YXIgcmVnaW9uU3RyaW5nID0gZ2V0 UmVnaW9uU3RyaW5nKCk7CisKKyAgICBpZiAoIXJlZ2lvblN0cmluZykgeworICAgICAgICB0aHJv dyBuZXcgUGFyc2VFcnJvcignU3ludGF4IEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJ1JlZ2lvbiBtdXN0IGJlIGluIHRoZSBmb3JtOiAnCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICsgJzxjb2RlPlJlZ051bS5TdWJSZWdOdW0mbHQ7VmVydFN0cmlkZTsnCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICsgJ1dpZHRoLEhvcnpTdGlkZSZndDs6dHlwZTwvY29k ZT4nKTsKKyAgICB9CisKKyAgICAvKiBXZSBkb24ndCB3YW50IHdoaXRlc3BhY2UgZ2V0dGluZyBp biBvdXIgd2F5LCBzbyBsZXRzIHJlbW92ZSBpdC4gKi8KKyAgICB3aGlsZSAocmVnaW9uU3RyaW5n Lm1hdGNoKC9ccy8pKQorICAgICAgICByZWdpb25TdHJpbmcgPSByZWdpb25TdHJpbmcucmVwbGFj ZSgvXHMrLywgJycpOworCisgICAgaWYgKHJlZ2lvblN0cmluZy5tYXRjaCgvOiQvKSkgeworICAg ICAgICB0aHJvdyBuZXcgUGFyc2VFcnJvcignU3ludGF4IEVycm9yJywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ0lsbGVnYWwgdHJhaWxpbmcgPGNvZGU+OjwvY29kZT4gY2hhcmFjdGVy LicpOworICAgIH0KKworICAgIC8qIFN0cmlwIHRoZSBkYXRhIHR5cGUgZnJvbSB0aGUgcmVnaW9u IHN0cmluZyBhbmQgc2V0IHRoZSBkYXRhU2l6ZSwgb3IgdXNlCisgICAgICogZGVmYXVsdC4gKi8K KyAgICBkYXRhU2l6ZSA9IHJlZ2lvblN0cmluZy5tYXRjaCgvW2Etel0rJC9pKTsKKyAgICBpZiAo ZGF0YVNpemUpIHsKKyAgICAgICAgc3dpdGNoIChTdHJpbmcoZGF0YVNpemUpLnRvTG93ZXJDYXNl KCkpIHsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgIGNhc2UgJ3ViJzoKKyAgICAgICAgICAg IGRhdGFTaXplID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd1dyc6Cisg ICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgZGF0YVNpemUgPSAyOworICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIGNhc2UgJ3VkJzoKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgIGNh c2UgJ2YnOgorICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIGRhdGFTaXplID0gNDsKKyAg ICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3 IFBhcnNlRXJyb3IoJ0lsbGVnYWwgRGF0YSBUeXBlIFwnJyArIGRhdGFTaXplICsgJ1wnJywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQb3NzaWJsZSB2YWx1ZXM6ICcKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxjb2RlPnVifGJ8dXd8d3x1ZHxkfGZ8djwv Y29kZT4uJyk7CisgICAgICAgIH0KKyAgICAgICAgLyogU3RyaXAgdGhlIGRhdGEgdHlwZSBmcm9t IHRoZSByZWdpb24gc3RyaW5nLiAqLworICAgICAgICByZWdpb25TdHJpbmcgPSByZWdpb25TdHJp bmcucmVwbGFjZSgvW2Etel0rJC9pLCAnJyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YVNp emUgPSBERUZBVUxUX0RBVEFfU0laRTsKKyAgICB9CisKKyAgICAvKiBUZXN0IGFuZCBzZXQgdGhl IFtvcHRpb25hbF0gUmVnRmlsZS4gKi8KKyAgICByZWdGaWxlID0gcmVnaW9uU3RyaW5nLm1hdGNo KC9eW2Etel0rL2kpOworICAgIGlmIChyZWdGaWxlKSB7CisgICAgICAgIC8qIFdlIGhhdmUgYSBy ZWdGaWxlLCBzbyBzdHJpcCBpdCBmcm9tIHRoZSByZWdpb24gc3RyaW5nLiAqLworICAgICAgICBy ZWdpb25TdHJpbmcgPSByZWdpb25TdHJpbmcucmVwbGFjZSgvXlthLXpdKy9pLCAnJyk7CisgICAg fSBlbHNlIHsKKyAgICAgICAgLyogTm8gUmVnRmlsZSwgdXNlIHRoZSBkZWZhdWx0LiAqLworICAg ICAgICByZWdGaWxlID0gREVGQVVMVF9SRUdfRklMRTsKKyAgICB9CisKKyAgICAvKiBTdHJpcCB0 aGUgcmVnaXN0ZXIgbnVtYmVyIGZyb20gdGhlIHJlZ2lvbiBzdHJpbmcuICovCisgICAgcmVnaXN0 ZXIgPSBwYXJzZUludChyZWdpb25TdHJpbmcubWF0Y2goL15cZCsvKSk7CisgICAgcmVnaW9uU3Ry aW5nID0gcmVnaW9uU3RyaW5nLnJlcGxhY2UoL15cZCsvZywgJycpOworCisgICAgLyogR2V0IG9y IHNldCB0aGUgbnVtYmVyIG9mIGV4ZWN1dGlvbiBjaGFubmVscy4gKi8KKyAgICBleGVjU2l6ZSA9 IGdldEV4ZWNTaXplKCk7CisgICAgaWYgKGlzTmFOKGV4ZWNTaXplKSkgeworICAgICAgICAvKiBF eGVjU2l6ZSBub3Qgc2V0LCBzaG93IHdhcm5pbmcgYW5kIHNldCBpdCB0byB0aGUgZGVmYXVsdCB2 YWx1ZS4gKi8KKyAgICAgICAgZXhlY1NpemUgPSBERUZBVUxUX0VYRUNfU0laRTsKKyAgICAgICAg c2hvd0FsZXJ0KCdXYXJuaW5nJywgJ0V4ZWN1dGlvbiBzaXplIG5vdCBzZXQsIHVzaW5nIGRlZmF1 bHQgdmFsdWUgJworICAgICAgICAgICAgICAgICAgKyAnb2YgXCc4XCcuJyk7CisgICAgICAgIHNl dERlZmF1bHRFeGVjU2l6ZSgpOworICAgIH0KKworICAgIC8qIFN0cmlwIHRoZSB0aGUgU3ViUmVn TnVtIGZyb20gdGhlIHJlZ2lvbiBzdHJpbmcsIG9yIHVzZSBkZWZhdWx0LiBIZXJlLCB3ZQorICAg ICAqIGRlbGliZXJhdGVseSBjYXRjaCBhIHdpZGVyIHNldCBvZiB2YWx1ZXMgdGhlbiBhcmUgcGVy bWlzc2libGUsIHNvIHRoYXQgaW4KKyAgICAgKiB0aGUgY2FzZSBvZiByZWdpb24gZGVzY3JpcHRp b25zIGNvbnRhaW5pbmcgc3ludGF4IGVycm9ycyBzdWNoIGFzCisgICAgICogJzEwLmZvbzwxPics IHdlIHN0aWxsIHJlY2VpdmUgdGhlICdmb28nIGFzIGEgc3ViUmVnTnVtLCB3aGljaCB3ZSBjYW4g dGhlbgorICAgICAqIHVzZSB0byBnaXZlIGEgbW9yZSBpbmZvcm1hdGl2ZSBzeW50YXggZXJyb3Iu ICovCisgICAgaWYgKHJlZ2lvblN0cmluZy5tYXRjaCgvXlwuXHcrLykpIHsKKyAgICAgICAgcmVn aW9uU3RyaW5nID0gcmVnaW9uU3RyaW5nLnJlcGxhY2UoL15cLi8sICcnKTsKKyAgICAgICAgc3Vi UmVnTnVtID0gcGFyc2VJbnQocmVnaW9uU3RyaW5nLm1hdGNoKC9eXHcrLykpOworICAgICAgICBy ZWdpb25TdHJpbmcgPSByZWdpb25TdHJpbmcucmVwbGFjZSgvXlx3Ky8sICcnKTsKKyAgICB9IGVs c2UgeworICAgICAgICBzdWJSZWdOdW0gPSAwOworICAgIH0KKworICAgIGlmIChpc05hTihzdWJS ZWdOdW0pKSB7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUVycm9yKCdJbnZhbGlkIFN1YlJlZ051 bScsICdBIHN1YnJlZ2lzdGVyIG11c3QgYmUgYW4gJworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICArICdpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSBbMCwgJworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICArIE1BWF9TVUJSRUdOVU0gKyAnXS4nKTsKKyAgICB9CisKKyAgICBpZiAo c3ViUmVnTnVtID4gTUFYX1NVQlJFR05VTSkgeworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFcnJv cignSW52YWxpZCBTdWJSZWdOdW0gXCcnICsgc3ViUmVnTnVtICsgJ1wnJywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJ0Egc3VicmVnaXN0ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVl IGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ3JhbmdlIFswLCAnICsg TUFYX1NVQlJFR05VTSArICddLicpOworICAgIH0KKworICAgIC8qIENvbnZlcnQgc3ViUmVnTnVt IHRvIGEgYnl0ZSBvZmZzZXQgaWYgaW4gLS1hZHZhbmNlZCBtb2RlLiAqLworICAgIGlmIChhZHZh bmNlZCkKKyAgICAgICAgc3ViUmVnTnVtICo9IGRhdGFTaXplOworCisgICAgLyogTGV0J3MgZG8g YSBzYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSByZWdpb24gZGVzY3JpcHRpb24gaXMgaW4g dGhlCisgICAgICogY29ycmVjdCBmb3JtLiAqLworICAgIGlmICghcmVnaW9uU3RyaW5nLm1hdGNo KC9eKDxbXGQ7LF0rPik/Oj8kL2cpKXsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXJyb3IoJ1N5 bnRheCBFcnJvcicsICdSZWdpb24gZGVzY3JpcHRpb25zIG11c3QgYmUgaW4gJworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICArICd0aGUgZm9ybTogPGNvZGU+Jmx0O1ZlcnRTdHJpZGU7V2lk dGgsJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdIb3J6U3RyaWRlJmd0OzwvY29k ZT4nKTsKKyAgICB9CisKKyAgICAvKiBMZXQncyBkaXNjYXJkIHRob3NlIHBlc2t5IGFuZ2xlIGJy YWNrZXRzIG5vdywgYW5kIHRoZSB0cmFpbGluZyAnOicsIGlmCisgICAgICogcHJlc2VudC4gKi8K KyAgICBpZiAocmVnaW9uU3RyaW5nKXsKKyAgICAgICAgcmVnaW9uU3RyaW5nID0gcmVnaW9uU3Ry aW5nLnJlcGxhY2UoL148LywgJycpOworICAgICAgICByZWdpb25TdHJpbmcgPSByZWdpb25TdHJp bmcucmVwbGFjZSgvPj86PyQvLCAnJyk7CisgICAgfQorCisgICAgLyogRGlyZWN0IGFkZHJlc3Np bmcgcmVnaW9uIGRlc2NyaXB0aW9ucyBjYW4gdGFrZSAzIGZvcm1zOgorICAgICAqCisgICAgICog ICAgUmVnaW9uICAgOjo9IDxWZXJ0U3RyaWRlPiDigJw74oCdIDxXaWR0aD4g4oCcLOKAnSA8SG9y elN0cmlkZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgfCA8VmVydFN0cmlkZT4g4oCcLOKAnSA8 V2lkdGg+IOKAnCzigJ0gPEhvcnpTdHJpZGU+CisgICAgICogICAgUmVnaW9uViAgOjo9IDxWZXJ0 U3RyaWRlPgorICAgICAqICAgIFJlZ2lvbkUgIDo6PSAiIgorICAgICAqCisgICAgICogSGVyZSBp cyB3aGVyZSB3ZSdsbCBleHRyYWN0IHRoZSB2ZXJ0U3RyaWRlLCB3aWR0aCBhbmQgaG9yelN0cmlk ZSBmcm9tCisgICAgICogdGhpcyBkZXNjcmlwdGlvbiwgaW5zZXJ0aW5nIGRlZmF1bHRzIGlmIGFu eSBvZiB0aGUgdmFsdWVzIGFyZSBtaXNzaW5nLgorICAgICAqIElmIHRoZSByZWdpb24gZG9lcyBu b3QgbWF0Y2ggYW55IG9mIHRob3NlIGZvcm1zLCBpdCBpcyBhIHN5bnRheCBlcnJvci4KKyAgICAg Ki8KKyAgICBpZiAocmVnaW9uU3RyaW5nLm1hdGNoKC9eXGQrWzssXVxkKyxcZCskLykpIHsKKyAg ICAgICAgLyogUmVnaW9uICAgOjo9IDxWZXJ0U3RyaWRlPiDigJw74oCdIDxXaWR0aD4g4oCcLOKA nSA8SG9yelN0cmlkZT4KKyAgICAgICAgICogICAgICAgICAgICAgIHwgPFZlcnRTdHJpZGU+IOKA nCzigJ0gPFdpZHRoPiDigJws4oCdIDxIb3J6U3RyaWRlPiAqLworICAgICAgICB2ZXJ0U3RyaWRl ID0gcGFyc2VJbnQocmVnaW9uU3RyaW5nLm1hdGNoKC9eXGQrLykpOworICAgICAgICByZWdpb25T dHJpbmcgPSByZWdpb25TdHJpbmcucmVwbGFjZSgvXlxkK1s7LF0vLCAnJyk7CisgICAgICAgIHdp ZHRoID0gcGFyc2VJbnQocmVnaW9uU3RyaW5nLm1hdGNoKC9eXGQrLykpOworICAgICAgICByZWdp b25TdHJpbmcgPSByZWdpb25TdHJpbmcucmVwbGFjZSgvXlxkKywvLCAnJyk7CisgICAgICAgIGhv cnpTdHJpZGUgPSBwYXJzZUludChyZWdpb25TdHJpbmcpOworICAgIH0gZWxzZSBpZiAocmVnaW9u U3RyaW5nLm1hdGNoKC9eXGQrJC8pKSB7CisgICAgICAgIC8qIFJlZ2lvblYgOjo9IDxWZXJ0U3Ry aWRlPiAqLworICAgICAgICB2ZXJ0U3RyaWRlID0gcGFyc2VJbnQocmVnaW9uU3RyaW5nKTsKKyAg ICAgICAgd2lkdGggPSAxOworICAgICAgICBob3J6U3RyaWRlID0gMDsKKyAgICB9IGVsc2UgaWYg KHJlZ2lvblN0cmluZy5tYXRjaCgvXiQvKSl7CisgICAgICAgIC8qIFJlZ2lvbkUgOjo9ICIiICov CisgICAgICAgIHZlcnRTdHJpZGUgPSAwOworICAgICAgICB3aWR0aCA9IDE7CisgICAgICAgIGhv cnpTdHJpZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUVycm9y KCdTeW50YXggRXJyb3InLCAnUmVnaW9uIGRlc2NyaXB0aW9ucyBtdXN0IGJlIGluICcKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKyAndGhlIGZvcm06IDxjb2RlPiZsdDtWZXJ0U3RyaWRl O1dpZHRoLCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnSG9yelN0cmlkZSZndDs8 L2NvZGU+Jyk7CisgICAgfQorCisgICAgLyogTm93IHRoYXQgdGhlIGlucHV0IHN0cmluZyBpcyBw YXJzZWQsIHdlIHBlcmZvcm0gc29tZSBjaGVja3MgZm9yIGdlbmVyYWwKKyAgICAgKiByZXN0cmlj dGlvbnMgb24gcmVnaW9uaW5nIHBhcmFtZXRlcnMuICovCisgICAgaWYgKGlzTmFOKHJlZ2lzdGVy KSl7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUVycm9yKCdTeW50YXggRXJyb3InLCAnUmVnTnVt IG11c3QgYmUgYW4gaW50ZWdlciBpbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsg J3RoZSByYW5nZSBbMCwgMTI3XS4nKTsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXIgPj0gUkVH X0ZJTEVfU0laRSkgeworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFcnJvcignT3V0IG9mIEJvdW5k cycsICdSZWdOdW0gXCcnICsgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KyAnXCcgbXVzdCBiZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCwgMTI3XS4nKTsKKyAgICB9 CisKKyAgICBpZiAoIVN0cmluZyh2ZXJ0U3RyaWRlKS5tYXRjaCgvXigwfDF8Mnw0fDh8MTZ8MzIp JC8pKSB7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUVycm9yKCdJbnZhbGlkIFZlcnRpY2FsIFN0 cmlkZSBcJycgKyB2ZXJ0U3RyaWRlICsgJ1wnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ1Bvc3NpYmxlIHZhbHVlczogPGNvZGU+MHwxfDJ8NHw4fDE2fDMyPC9jb2RlPi4nKTsKKyAg ICB9CisKKyAgICBpZiAoIVN0cmluZyh3aWR0aCkubWF0Y2goL14oMXwyfDR8OHwxNikkLykpIHsK KyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXJyb3IoJ0ludmFsaWQgV2lkdGggXCcnICsgd2lkdGgg KyAnXCcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUG9zc2libGUgdmFsdWVzOiA8 Y29kZT4xfDJ8NHw4fDE2PC9jb2RlPi4nKTsKKyAgICB9CisKKyAgICBpZiAoIVN0cmluZyhob3J6 U3RyaWRlKS5tYXRjaCgvXigwfDF8Mnw0KSQvKSkgeworICAgICAgICB0aHJvdyBuZXcgUGFyc2VF cnJvcignSW52YWxpZCBIb3Jpem9udGFsIFN0cmlkZSBcJycgKyBob3J6U3RyaWRlICsgJ1wnJywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Bvc3NpYmxlIHZhbHVlczogPGNvZGU+MHwx fDJ8NDwvY29kZT4uJyk7CisgICAgfQorCisgICAgaWYgKGV4ZWNTaXplIDwgd2lkdGgpeworICAg ICAgICB0aHJvdyBuZXcgUGFyc2VFcnJvcignT3V0IG9mIEJvdW5kcycsICdFeGVjdXRpb24gc2l6 ZSBtdXN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnZ3JlYXRlciBvciBl cXVhbCB0byB3aWR0aC4gKGV4ZWNTaXplOiBcJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKyBleGVjU2l6ZSArICdcJywgd2lkdGg6IFwnJyArIHdpZHRoICsgJ1wnKScpOworICAgIH0K KworICAgIGlmIChleGVjU2l6ZSA9PSB3aWR0aCAmJiBob3J6U3RyaWRlICYmIHZlcnRTdHJpZGUg IT0gd2lkdGggKiBob3J6U3RyaWRlKXsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXJyb3IoJ0lu dmFsaWQgUmVnaW9uJywgJ0lmIGV4ZWN1dGlvbiBzaXplIGlzIGVxdWFsICcKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKyAndG8gd2lkdGggYW5kIGhvcml6b250YWwgc3RyaWRlIGlzIGdy ZWF0ZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICd0aGFuIDAsIHZlcnRpY2Fs IHN0cmlkZSBtdXN0IGJlIHNldCB0byB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICArICdwcm9kdWN0IG9mIHRoZSB3aWR0aCBhbmQgaG9yaXpvbnRhbCBzdHJpZGVzLiAnCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICsgJyhleGVjU2l6ZTogd2lkdGg6IFwnJyArIHdpZHRo ICsgJ1wnLCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ2hvcnpTdHJpZGU6IFwn JyArIGhvcnpTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnXCcsIHZlcnRT dHJpZGU6IFwnJyArIHZlcnRTdHJpZGUgKyAnXCcpJyk7CisgICAgfQorCisgICAgaWYgKHdpZHRo ID09IDEgJiYgaG9yelN0cmlkZSl7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUVycm9yKCdJbnZh bGlkIFJlZ2lvbicsICdJZiB3aWR0aCBpcyBlcXVhbCB0byBcJzFcJywgJworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICArICdob3Jpem9udGFsIHN0cmlkZSBtdXN0IGJlIFwnMFwnLiAnCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyh3aWR0aDogXCcnICsgd2lkdGggKyAnXCcs ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnaG9yelN0cmlkZTogXCcnICsgaG9y elN0cmlkZSArICdcJyknKTsKKyAgICB9CisKKyAgICBpZiAoZXhlY1NpemUgPT0gMSAmJiB3aWR0 aCA9PSAxCisgICAgICAgICYmICh2ZXJ0U3RyaWRlIHx8IGhvcnpTdHJpZGUpKSB7CisgICAgICAg IHRocm93IG5ldyBQYXJzZUVycm9yKCdJbnZhbGlkIFNjYWxhcicsICdJZiBib3RoIHRoZSBleGVj dXRpb24gc2l6ZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ2FuZCB3aWR0aCBh cmUgZXF1YWwgdG8gXCcxXCcsIGJvdGggdmVydGljYWwgJworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICArICdzdHJpZGUgYW5kIGhvcml6b250YWwgc3RyaWRlIG11c3QgYmUgXCcwXCcuICcK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnKGV4ZWNTaXplOiBcJycgKyBleGVjU2l6 ZSArICdcJywgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICd3aWR0aDogXCcnICsg d2lkdGggKyAnXCcsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAndmVydFN0cmlk ZTogXCcnICsgdmVydFN0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdcJywg aG9yelN0cmlkZTogXCcnICsgaG9yelN0cmlkZSArICdcJyknKTsKKyAgICB9CisKKyAgICBpZiAo IXZlcnRTdHJpZGUgJiYgIWhvcnpTdHJpZGUgJiYgd2lkdGggIT0gMSl7CisgICAgICAgIHRocm93 IG5ldyBQYXJzZUVycm9yKCdJbnZhbGlkIFJlZ2lvbicsICdJZiBib3RoIHZlcnRpY2FsIGFuZCAn CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ2hvcml6b250YWwgc3RyaWRlcyBhcmUg ZXF1YWwgdG8gXCcwXCcsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnd2lkdGgg bXVzdCBiZSBzZXQgdG8gXCcxXCcuICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAn KHZlcnRTdHJpZGU6IFwnJyArIHZlcnRTdHJpZGUgKyAnXCcsICcKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKyAnaG9yelN0cmlkZTogXCcnICsgaG9yelN0cmlkZSArICdcJywgJworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICArICd3aWR0aDogXCcnICsgd2lkdGggKyAnXCcpJyk7 CisgICAgfQorfQorCitmdW5jdGlvbiBzdWJtaXRFbXB0eVJlZ2lvbigpIHsKKyAgICAvKiBaZXJv IHRoZSByZWdpb24gZGVzY3JpcHRpb24uICovCisgICAgZXhlY1NpemUgPSAwOworICAgIHJlZ0Zp bGUgPSAnZyc7CisgICAgcmVnaXN0ZXIgPSAwOworICAgIHN1YlJlZ051bSA9IDA7CisgICAgdmVy dFN0cmlkZSA9IDA7CisgICAgd2lkdGggPSAwOworICAgIGhvcnpTdHJpZGUgPSAwOworICAgIGRh dGFTaXplID0gMDsKKworICAgIGRyYXdSZWdpb24oKTsKKyAgICBzZXRDYW52YXNDYXB0aW9uKCcn KTsKK30KKworZnVuY3Rpb24gZHJhd1JlZ2lvbigpIHsKKyAgICB2YXIgc3RhcnRSZWdpc3Rlcjsg LyogVGhlIGxvd2VybW9zdCByZWdpc3RlciB0byBkcmF3LiAqLworCisgICAgLyogU2V0IHRoZSBj YXB0aW9uLiAqLworICAgIGRlc2NyaXB0aW9uID0gZXhlY1NpemUgKyAnIGNoYW5uZWxzIGV4ZWN1 dGluZyBvbiBhIHJlZ2lvbiBzdGFydGluZyBhdCAnCisgICAgICAgICsgJ3JlZ2lzdGVyICcgKyBy ZWdGaWxlICsgcmVnaXN0ZXIgKyAnLicgKyBzdWJSZWdOdW0gKyAnLCB3aXRoIGEgd2lkdGggb2Yg JworICAgICAgICArIHdpZHRoICsgJywgYSBob3Jpem9udGFsIHN0cmlkZSBvZiAnICsgaG9yelN0 cmlkZQorICAgICAgICArICcgYW5kIGEgdmVydGljYWwgc3RyaWRlIG9mICcgKyB2ZXJ0U3RyaWRl ICsgJy4nOworCisgICAgc2V0Q2FudmFzQ2FwdGlvbihkZXNjcmlwdGlvbik7CisKKyAgICBpZiAo ZXhlY1NpemUpCisgICAgICAgIGZsYXNoUmVnaW9uRm9ybUJhY2tncm91bmQoQ09MT1JfR09PRCk7 CisKKyAgICBzdGFydFJlZ2lzdGVyID0gTWF0aC5tYXgocmVnaXN0ZXIgLSAyLCAwKTsKKyAgICBz dGFydFJlZ2lzdGVyID0gTWF0aC5taW4oc3RhcnRSZWdpc3RlciwgUkVHX0ZJTEVfU0laRSAtIFJP V1MpOworCisgICAgY2xlYXJDYW52YXMoKTsKKyAgICBkcmF3R3JpZENvbHVtbnMoKTsKKyAgICBk cmF3R3JpZFJvd3MoKTsKKyAgICBkcmF3Q29sTGFiZWxzKCk7CisgICAgZHJhd1Jvd0xhYmVscyhy ZWdGaWxlLCBzdGFydFJlZ2lzdGVyKTsKKyAgICBkcmF3UmVnaW9uQ2VsbHMoc3RhcnRSZWdpc3Rl cik7Cit9CisKKy8qIFBlcmZvcm1zIHRoZSBtZWF0IG9mIHRoZSByZWdpb24gdmlld2luZyB3b3Jr LgorICoKKyAqIEBwYXJhbSBzdGFydFJlZ2lzdGVyIFRoZSBmaXJzdCByZWdpc3RlciBkcmF3biBi eSBkcmF3Um93TGFiZWxzKCkuCisgKi8KK2Z1bmN0aW9uIGRyYXdSZWdpb25DZWxscyhzdGFydFJl Z2lzdGVyKSB7CisgICAgdmFyIGNvdW50ID0gMDsKKyAgICB2YXIgcm93cyA9IGV4ZWNTaXplIC8g d2lkdGg7CisgICAgdmFyIGZpcnN0UmVnOworCisgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXIn OworICAgIGN0eC5mb250ID0gJ2JvbGQgMTRweCBhcmlhbCc7CisKKyAgICBmb3IgKHZhciByID0g MDsgciA8IHJvd3M7IHIrKykgeworICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHdpZHRoOyBj KyspIHsKKyAgICAgICAgICAgIC8qIFRoZSBhYnNvbHV0ZSBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0 aGUgdGFyZ2V0IGVsZW1lbnQgZnJvbSB0aGUKKyAgICAgICAgICAgICAqIHN0YXJ0aW5nIHJlZ2lz dGVyLiAqLworICAgICAgICAgICAgdmFyIHJlZ0J5dGUgPSBzdWJSZWdOdW0gKyAociAqIHZlcnRT dHJpZGUgKiBkYXRhU2l6ZSkKKyAgICAgICAgICAgICAgICArIChjICogaG9yelN0cmlkZSAqIGRh dGFTaXplKTsKKworICAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyIG9mIHRoZSBjdXJyZW50IGVs ZW1lbnQuICovCisgICAgICAgICAgICB2YXIgcmVnID0gcmVnaXN0ZXIgKyBNYXRoLmZsb29yKHJl Z0J5dGUgLyBSRUdfU0laRSk7CisgICAgICAgICAgICB2YXIgcmVnT2Zmc2V0ID0gKHJlZ0J5dGUg JSBSRUdfU0laRSk7CisKKyAgICAgICAgICAgIC8qIFdlIGNhY2hlIHRoZSBmaXJzdCByZWcgc28g dGhhdCB3ZSBjYW4gZGV0ZWN0IHdoZW4gYSByZWdpb24gc3BhbnMKKyAgICAgICAgICAgICAqIG1v cmUgdGhhbiAyIHJlZ2lzdGVycy4gKi8KKyAgICAgICAgICAgIGlmICghciAmJiAhYykKKyAgICAg ICAgICAgICAgICBmaXJzdFJlZyA9IHJlZzsKKworICAgICAgICAgICAgLyogV2Ugb25seSBzaG93 IGEgd2FybmluZyBmb3Igb3V0IG9mIHJhbmdlIGFjY2Vzc2VzLiAqLworICAgICAgICAgICAgaWYg KHJlZyAtIGZpcnN0UmVnID49IE1BWF9SRUdfU1BBTikgeworICAgICAgICAgICAgICAgIGZsYXNo UmVnaW9uRm9ybUJhY2tncm91bmQoQ09MT1JfQkFEKTsKKyAgICAgICAgICAgICAgICBzaG93QWxl cnQoJ091dCBvZiBCb3VuZHMnLCAnQSBzb3VyY2UgY2Fubm90IHNwYW4gbW9yZSAnCisgICAgICAg ICAgICAgICAgICAgICAgICAgICsgJ3RoYW4gMiBhZGphY2VudCBHUkYgcmVnaXN0ZXJzICcKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgKyAnKGFmZmVjdGVkIHJlZ2lvbiBpcyBzaG93biBpbiBy ZWQpLicpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBXZSBjaGVjayBub3cgdGhh dCBldmVyeXRoaW5nIGlzIGluIGJvdW5kcy4gSWYgbm90LCBhbGVydCB0aGUgdXNlcgorICAgICAg ICAgICAgICogYW5kIGNhbmNlbCB0aGUgZHJhd2luZy4gKi8KKyAgICAgICAgICAgIGlmIChyZWcg Pj0gUkVHX0ZJTEVfU0laRSkgeworICAgICAgICAgICAgICAgIHNob3dBbGVydEVycm9yKCdPdXQg b2YgQm91bmRzJywgJ1JlZ2lzdGVyIGFjY2VzcyBcJycgKyByZWcKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICArICdcJyBvdXQgb2YgYm91bmRzIScpOworICAgICAgICAgICAgICAgIGZs YXNoUmVnaW9uRm9ybUJhY2tncm91bmQoQ09MT1JfQkFEKTsKKyAgICAgICAgICAgIH0KKworICAg ICAgICAgICAgLyogTm93IGxldHMgZ2V0IHRoZSBjYW52YXMgY29vcmRpbmF0ZXMgb2YgdGhlIGNl bGwgZm9yIGRyYXdpbmcuICovCisgICAgICAgICAgICB2YXIgeCA9IFNUQVJUX1ggKyAocmVnT2Zm c2V0ICogQ09MX1cpOworICAgICAgICAgICAgdmFyIHkgPSBTVEFSVF9ZICsgKChyZWcgLSBzdGFy dFJlZ2lzdGVyKSAqIFJPV19IKTsKKworICAgICAgICAgICAgLyogRmluYWxseSwgd2UgY2FuIHBh aW50IHRoZSBjZWxsLCBhc3N1bWluZyBvZiBjb3Vyc2UgdGhhdCB3ZSBhcmUKKyAgICAgICAgICAg ICAqIHBhaW50aW5nIGEgY2VsbCB3aXRoaW4gdGhlIGV4ZWN1dGlvbiBzaXplLiBPdGhlcndpc2Us IHdlIGFyZQorICAgICAgICAgICAgICogZG9uZS4gVGhpcyBjaGVjayBpcyBuZWVkZWQgZm9yIGNh c2VzIHdoZXJlOgorICAgICAgICAgICAgICogICAgICAgICAgKGV4ZWNTaXplICUgd2lkdGgpICE9 IDAuICovCisgICAgICAgICAgICBpZiAoY291bnQgPCBleGVjU2l6ZSAmJiByZWcgPCBSRUdfRklM RV9TSVpFKSB7CisgICAgICAgICAgICAgICAgLyogV2UgY29sb3VyIG91dC1vZi1yYW5nZSBjZWxs cyByZWQuICovCisgICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gKHJlZyAtIGZpcnN0UmVnIDwg TUFYX1JFR19TUEFOKQorICAgICAgICAgICAgICAgICAgICA/ICcjMGY0ZmE4JyA6ICcjZTI3MTcx JzsKKworICAgICAgICAgICAgICAgIGRyYXdDZWxsKGNvdW50KyssIHgsIHksIChkYXRhU2l6ZSAq IENPTF9XKSwgY29sb3IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBy ZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9h c3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2pxdWVyeS0xLjkuMS5qcyBiL2Fzc2VtYmxl ci9nZW5fcmVnaW9ucy9hc3NldHMvanMvanF1ZXJ5LTEuOS4xLmpzCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLmUyYzIwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NlbWJsZXIv Z2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2pxdWVyeS0xLjkuMS5qcwpAQCAtMCwwICsxLDk1OTcgQEAK Ky8qIQorICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2MS45LjEKKyAqIGh0dHA6Ly9qcXVl cnkuY29tLworICoKKyAqIEluY2x1ZGVzIFNpenpsZS5qcworICogaHR0cDovL3NpenpsZWpzLmNv bS8KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSwgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBh bmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UK KyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDEzLTItNAorICov CisoZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkgeworCisvLyBDYW4ndCBkbyB0aGlzIGJl Y2F1c2Ugc2V2ZXJhbCBhcHBzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlCisvLyB0aGUgc3RhY2sg dmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWYKKy8vIHlvdSB0 cnkgdG8gdHJhY2UgdGhyb3VnaCAidXNlIHN0cmljdCIgY2FsbCBjaGFpbnMuICgjMTMzMzUpCisv LyBTdXBwb3J0OiBGaXJlZm94IDE4KworLy8idXNlIHN0cmljdCI7Cit2YXIKKwkvLyBUaGUgZGVm ZXJyZWQgdXNlZCBvbiBET00gcmVhZHkKKwlyZWFkeUxpc3QsCisKKwkvLyBBIGNlbnRyYWwgcmVm ZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKKwlyb290alF1ZXJ5LAorCisJLy8g U3VwcG9ydDogSUU8OQorCS8vIEZvciBgdHlwZW9mIG5vZGUubWV0aG9kYCBpbnN0ZWFkIG9mIGBu b2RlLm1ldGhvZCAhPT0gdW5kZWZpbmVkYAorCWNvcmVfc3RydW5kZWZpbmVkID0gdHlwZW9mIHVu ZGVmaW5lZCwKKworCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRo IHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKKwlkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwK Kwlsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbiwKKworCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBj YXNlIG9mIG92ZXJ3cml0ZQorCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAorCisJLy8gTWFwIG92 ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKwlfJCA9IHdpbmRvdy4kLAorCisJLy8gW1tD bGFzc11dIC0+IHR5cGUgcGFpcnMKKwljbGFzczJ0eXBlID0ge30sCisKKwkvLyBMaXN0IG9mIGRl bGV0ZWQgZGF0YSBjYWNoZSBpZHMsIHNvIHdlIGNhbiByZXVzZSB0aGVtCisJY29yZV9kZWxldGVk SWRzID0gW10sCisKKwljb3JlX3ZlcnNpb24gPSAiMS45LjEiLAorCisJLy8gU2F2ZSBhIHJlZmVy ZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcworCWNvcmVfY29uY2F0ID0gY29yZV9kZWxldGVkSWRz LmNvbmNhdCwKKwljb3JlX3B1c2ggPSBjb3JlX2RlbGV0ZWRJZHMucHVzaCwKKwljb3JlX3NsaWNl ID0gY29yZV9kZWxldGVkSWRzLnNsaWNlLAorCWNvcmVfaW5kZXhPZiA9IGNvcmVfZGVsZXRlZElk cy5pbmRleE9mLAorCWNvcmVfdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nLAorCWNvcmVf aGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eSwKKwljb3JlX3RyaW0gPSBjb3JlX3Zl cnNpb24udHJpbSwKKworCS8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CisJalF1ZXJ5 ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQkvLyBUaGUgalF1ZXJ5IG9iamVj dCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKKwkJcmV0 dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsK Kwl9LAorCisJLy8gVXNlZCBmb3IgbWF0Y2hpbmcgbnVtYmVycworCWNvcmVfcG51bSA9IC9bKy1d Pyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLAorCisJLy8gVXNlZCBmb3Ig c3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UKKwljb3JlX3Jub3R3aGl0ZSA9IC9cUysvZywKKworCS8v IE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQgeW91LCBT YWZhcmkgNS4wIGFuZCBJRSkKKwlydHJpbSA9IC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4 QTBdKyQvZywKKworCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCisJ Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhh c2ggKCM5NTIxKQorCS8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3Rh cnQgd2l0aCA8KQorCXJxdWlja0V4cHIgPSAvXig/Oig8W1x3XFddKz4pW14+XSp8IyhbXHctXSop KSQvLAorCisJLy8gTWF0Y2ggYSBzdGFuZGFsb25lIHRhZworCXJzaW5nbGVUYWcgPSAvXjwoXHcr KVxzKlwvPz4oPzo8XC9cMT58KSQvLAorCisJLy8gSlNPTiBSZWdFeHAKKwlydmFsaWRjaGFycyA9 IC9eW1xdLDp7fVxzXSokLywKKwlydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9n LAorCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZywK KwlydmFsaWR0b2tlbnMgPSAvIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZCtc LnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvZywKKworCS8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBm b3IgY2FtZWxpemluZworCXJtc1ByZWZpeCA9IC9eLW1zLS8sCisJcmRhc2hBbHBoYSA9IC8tKFtc ZGEtel0pL2dpLAorCisJLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRv IHJlcGxhY2UoKQorCWZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7CisJCXJl dHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwl9LAorCisJLy8gVGhlIHJlYWR5IGV2ZW50IGhh bmRsZXIKKwljb21wbGV0ZWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisKKwkJLy8gcmVhZHlTdGF0 ZSA9PT0gImNvbXBsZXRlIiBpcyBnb29kIGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJl YWR5IGluIG9sZElFCisJCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciB8fCBldmVudC50 eXBlID09PSAibG9hZCIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsK KwkJCWRldGFjaCgpOworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0KKwl9LAorCS8vIENsZWFuLXVw IG1ldGhvZCBmb3IgZG9tIHJlYWR5IGV2ZW50cworCWRldGFjaCA9IGZ1bmN0aW9uKCkgeworCQlp ZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisJCQlkb2N1bWVudC5yZW1vdmVFdmVu dExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKKwkJCXdp bmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKKwor CQl9IGVsc2UgeworCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2Ui LCBjb21wbGV0ZWQgKTsKKwkJCXdpbmRvdy5kZXRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRl ZCApOworCQl9CisJfTsKKworalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKKwkvLyBU aGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCisJanF1ZXJ5OiBjb3JlX3Zl cnNpb24sCisKKwljb25zdHJ1Y3RvcjogalF1ZXJ5LAorCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3Rv ciwgY29udGV4dCwgcm9vdGpRdWVyeSApIHsKKwkJdmFyIG1hdGNoLCBlbGVtOworCisJCS8vIEhB TkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKKwkJaWYgKCAhc2Vs ZWN0b3IgKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCS8vIEhhbmRsZSBIVE1MIHN0cmlu Z3MKKwkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJaWYgKCBzZWxl Y3Rvci5jaGFyQXQoMCkgPT09ICI8IiAmJiBzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0 aCAtIDEgKSA9PT0gIj4iICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkgeworCQkJCS8vIEFzc3Vt ZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNr aXAgdGhlIHJlZ2V4IGNoZWNrCisJCQkJbWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07 CisKKwkJCX0gZWxzZSB7CisJCQkJbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7 CisJCQl9CisKKwkJCS8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3Bl Y2lmaWVkIGZvciAjaWQKKwkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSAp IHsKKworCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICggbWF0Y2hb MV0gKSB7CisJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4 dFswXSA6IGNvbnRleHQ7CisKKwkJCQkJLy8gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBh dAorCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCisJCQkJCQltYXRj aFsxXSwKKwkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJE b2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCisJCQkJCQl0cnVlCisJCQkJCSkgKTsKKwor CQkJCQkvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpCisJCQkJCWlmICggcnNpbmdsZVRhZy50ZXN0 KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CisJCQkJ CQlmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgeworCQkJCQkJCS8vIFByb3BlcnRpZXMgb2YgY29u dGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGUKKwkJCQkJCQlpZiAoIGpRdWVy eS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CisJCQkJCQkJCXRoaXNbIG1hdGNoIF0o IGNvbnRleHRbIG1hdGNoIF0gKTsKKworCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFz IGF0dHJpYnV0ZXMKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl0aGlzLmF0dHIoIG1hdGNoLCBj b250ZXh0WyBtYXRjaCBdICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcmV0 dXJuIHRoaXM7CisKKwkJCQkvLyBIQU5ETEU6ICQoI2lkKQorCQkJCX0gZWxzZSB7CisJCQkJCWVs ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKKworCQkJCQkvLyBDaGVj ayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucworCQkJCQkv LyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCisJCQkJCWlm ICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ug d2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcworCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFk IG9mIElECisJCQkJCQlpZiAoIGVsZW0uaWQgIT09IG1hdGNoWzJdICkgeworCQkJCQkJCXJldHVy biByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7CisJCQkJCQl9CisKKwkJCQkJCS8vIE90aGVy d2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmpl Y3QKKwkJCQkJCXRoaXMubGVuZ3RoID0gMTsKKwkJCQkJCXRoaXNbMF0gPSBlbGVtOworCQkJCQl9 CisKKwkJCQkJdGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7CisJCQkJCXRoaXMuc2VsZWN0b3IgPSBz ZWxlY3RvcjsKKwkJCQkJcmV0dXJuIHRoaXM7CisJCQkJfQorCisJCQkvLyBIQU5ETEU6ICQoZXhw ciwgJCguLi4pKQorCQkJfSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7 CisJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsK KworCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCisJCQkvLyAod2hpY2ggaXMganVzdCBl cXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKKwkJCX0gZWxzZSB7CisJCQkJcmV0 dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOworCQkJfQor CisJCS8vIEhBTkRMRTogJChET01FbGVtZW50KQorCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2Rl VHlwZSApIHsKKwkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKKwkJCXRoaXMu bGVuZ3RoID0gMTsKKwkJCXJldHVybiB0aGlzOworCisJCS8vIEhBTkRMRTogJChmdW5jdGlvbikK KwkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CisJCX0gZWxzZSBpZiAoIGpRdWVyeS5p c0Z1bmN0aW9uKCBzZWxlY3RvciApICkgeworCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNl bGVjdG9yICk7CisJCX0KKworCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQg KSB7CisJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0aGlzLmNvbnRl eHQgPSBzZWxlY3Rvci5jb250ZXh0OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5tYWtlQXJyYXko IHNlbGVjdG9yLCB0aGlzICk7CisJfSwKKworCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0 b3IKKwlzZWxlY3RvcjogIiIsCisKKwkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkg b2JqZWN0IGlzIDAKKwlsZW5ndGg6IDAsCisKKwkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNv bnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAorCXNpemU6IGZ1bmN0aW9uKCkgewor CQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfSwKKworCXRvQXJyYXk6IGZ1bmN0aW9uKCkgeworCQly ZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7CisJfSwKKworCS8vIEdldCB0aGUgTnRoIGVs ZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKwkvLyBHZXQgdGhlIHdob2xlIG1h dGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorCWdldDogZnVuY3Rpb24oIG51bSAp IHsKKwkJcmV0dXJuIG51bSA9PSBudWxsID8KKworCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJh eQorCQkJdGhpcy50b0FycmF5KCkgOgorCisJCQkvLyBSZXR1cm4ganVzdCB0aGUgb2JqZWN0CisJ CQkoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTsK Kwl9LAorCisJLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRo ZSBzdGFjaworCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQorCXB1 c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgeworCisJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBt YXRjaGVkIGVsZW1lbnQgc2V0CisJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3Ry dWN0b3IoKSwgZWxlbXMgKTsKKworCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3Rh Y2sgKGFzIGEgcmVmZXJlbmNlKQorCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CisJCXJldC5jb250 ZXh0ID0gdGhpcy5jb250ZXh0OworCisJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1l bnQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3Ig ZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCisJLy8gKFlvdSBjYW4gc2VlZCB0aGUg YXJndW1lbnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywgYnV0IHRoaXMgaXMKKwkvLyBvbmx5IHVz ZWQgaW50ZXJuYWxseS4pCisJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgeworCQly ZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7CisJfSwKKworCXJlYWR5 OiBmdW5jdGlvbiggZm4gKSB7CisJCS8vIEFkZCB0aGUgY2FsbGJhY2sKKwkJalF1ZXJ5LnJlYWR5 LnByb21pc2UoKS5kb25lKCBmbiApOworCisJCXJldHVybiB0aGlzOworCX0sCisKKwlzbGljZTog ZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggY29yZV9zbGljZS5hcHBseSgg dGhpcywgYXJndW1lbnRzICkgKTsKKwl9LAorCisJZmlyc3Q6IGZ1bmN0aW9uKCkgeworCQlyZXR1 cm4gdGhpcy5lcSggMCApOworCX0sCisKKwlsYXN0OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRo aXMuZXEoIC0xICk7CisJfSwKKworCWVxOiBmdW5jdGlvbiggaSApIHsKKwkJdmFyIGxlbiA9IHRo aXMubGVuZ3RoLAorCQkJaiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTsKKwkJcmV0dXJuIHRo aXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKKwl9 LAorCisJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFj ayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXJldHVybiBjYWxs YmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCX0pKTsKKwl9LAorCisJZW5kOiBmdW5jdGlv bigpIHsKKwkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwp OworCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisJLy8gQmVoYXZlcyBsaWtlIGFu IEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCisJcHVzaDogY29yZV9w dXNoLAorCXNvcnQ6IFtdLnNvcnQsCisJc3BsaWNlOiBbXS5zcGxpY2UKK307CisKKy8vIEdpdmUg dGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRp YXRpb24KK2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworalF1ZXJ5LmV4 dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKKwl2YXIgc3JjLCBjb3B5SXNB cnJheSwgY29weSwgbmFtZSwgb3B0aW9ucywgY2xvbmUsCisJCXRhcmdldCA9IGFyZ3VtZW50c1sw XSB8fCB7fSwKKwkJaSA9IDEsCisJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCisJCWRlZXAg PSBmYWxzZTsKKworCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKwlpZiAoIHR5cGVv ZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKKwkJZGVlcCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0g YXJndW1lbnRzWzFdIHx8IHt9OworCQkvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0 CisJCWkgPSAyOworCX0KKworCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5n IG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQorCWlmICggdHlwZW9mIHRhcmdl dCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CisJCXRhcmdl dCA9IHt9OworCX0KKworCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3Vt ZW50IGlzIHBhc3NlZAorCWlmICggbGVuZ3RoID09PSBpICkgeworCQl0YXJnZXQgPSB0aGlzOwor CQktLWk7CisJfQorCisJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCS8vIE9ubHkgZGVh bCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCAob3B0aW9ucyA9IGFyZ3Vt ZW50c1sgaSBdKSAhPSBudWxsICkgeworCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAorCQkJ Zm9yICggbmFtZSBpbiBvcHRpb25zICkgeworCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOworCQkJ CWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CisKKwkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBs b29wCisJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0K KworCQkJCS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5 cworCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkg fHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CisJCQkJCWlmICgg Y29weUlzQXJyYXkgKSB7CisJCQkJCQljb3B5SXNBcnJheSA9IGZhbHNlOworCQkJCQkJY2xvbmUg PSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOworCisJCQkJCX0gZWxzZSB7 CisJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDog e307CisJCQkJCX0KKworCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25l IHRoZW0KKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwg Y29weSApOworCisJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcworCQkJCX0g ZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBj b3B5OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2Jq ZWN0CisJcmV0dXJuIHRhcmdldDsKK307CisKK2pRdWVyeS5leHRlbmQoeworCW5vQ29uZmxpY3Q6 IGZ1bmN0aW9uKCBkZWVwICkgeworCQlpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisJCQl3 aW5kb3cuJCA9IF8kOworCQl9CisKKwkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpR dWVyeSApIHsKKwkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OworCQl9CisKKwkJcmV0dXJuIGpR dWVyeTsKKwl9LAorCisJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1 ZSBvbmNlIGl0IG9jY3Vycy4KKwlpc1JlYWR5OiBmYWxzZSwKKworCS8vIEEgY291bnRlciB0byB0 cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKKwkvLyB0aGUgcmVhZHkgZXZl bnQgZmlyZXMuIFNlZSAjNjc4MQorCXJlYWR5V2FpdDogMSwKKworCS8vIEhvbGQgKG9yIHJlbGVh c2UpIHRoZSByZWFkeSBldmVudAorCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CisJCWlm ICggaG9sZCApIHsKKwkJCWpRdWVyeS5yZWFkeVdhaXQrKzsKKwkJfSBlbHNlIHsKKwkJCWpRdWVy eS5yZWFkeSggdHJ1ZSApOworCQl9CisJfSwKKworCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMg cmVhZHkKKwlyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CisKKwkJLy8gQWJvcnQgaWYgdGhlcmUg YXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeQorCQlpZiAoIHdhaXQgPT09 IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHsKKwkJCXJldHVy bjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2Ug SUUgZ2V0cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4KKwkJaWYgKCAhZG9j dW1lbnQuYm9keSApIHsKKwkJCXJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTsKKwkJ fQorCisJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQorCQlqUXVlcnkuaXNSZWFk eSA9IHRydWU7CisKKwkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNy ZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKKwkJaWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1 ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBJZiB0aGVyZSBh cmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCgg ZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKKworCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBl dmVudHMKKwkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKKwkJCWpRdWVyeSggZG9jdW1lbnQg KS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKTsKKwkJfQorCX0sCisKKwkvLyBTZWUgdGVz dC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgorCS8vIFNp bmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKKwkv LyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgorCWlz RnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBqUXVlcnkudHlwZShvYmopID09 PSAiZnVuY3Rpb24iOworCX0sCisKKwlpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9u KCBvYmogKSB7CisJCXJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAiYXJyYXkiOworCX0sCisK Kwlpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIG9iaiAhPSBudWxsICYmIG9i aiA9PSBvYmoud2luZG93OworCX0sCisKKwlpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7CisJ CXJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQob2JqKSApICYmIGlzRmluaXRlKCBvYmogKTsKKwl9 LAorCisJdHlwZTogZnVuY3Rpb24oIG9iaiApIHsKKwkJaWYgKCBvYmogPT0gbnVsbCApIHsKKwkJ CXJldHVybiBTdHJpbmcoIG9iaiApOworCQl9CisJCXJldHVybiB0eXBlb2Ygb2JqID09PSAib2Jq ZWN0IiB8fCB0eXBlb2Ygb2JqID09PSAiZnVuY3Rpb24iID8KKwkJCWNsYXNzMnR5cGVbIGNvcmVf dG9TdHJpbmcuY2FsbChvYmopIF0gfHwgIm9iamVjdCIgOgorCQkJdHlwZW9mIG9iajsKKwl9LAor CisJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKKwkJLy8gTXVzdCBiZSBhbiBPYmpl Y3QuCisJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2Vu Y2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgorCQkvLyBNYWtlIHN1cmUgdGhhdCBET00g bm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbAorCQlp ZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUob2JqKSAhPT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBl IHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwor CQl0cnkgeworCQkJLy8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVj dAorCQkJaWYgKCBvYmouY29uc3RydWN0b3IgJiYKKwkJCQkhY29yZV9oYXNPd24uY2FsbChvYmos ICJjb25zdHJ1Y3RvciIpICYmCisJCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9y LnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9 CisJCX0gY2F0Y2ggKCBlICkgeworCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9u IGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkv LyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwK KwkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24uCisK KwkJdmFyIGtleTsKKwkJZm9yICgga2V5IGluIG9iaiApIHt9CisKKwkJcmV0dXJuIGtleSA9PT0g dW5kZWZpbmVkIHx8IGNvcmVfaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7CisJfSwKKworCWlzRW1w dHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXZhciBuYW1lOworCQlmb3IgKCBuYW1lIGlu IG9iaiApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJ ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7CisJCXRocm93IG5ldyBFcnJvciggbXNnICk7CisJfSwK KworCS8vIGRhdGE6IHN0cmluZyBvZiBodG1sCisJLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBz cGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBk ZWZhdWx0cyB0byBkb2N1bWVudAorCS8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUs IHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmcKKwlwYXJzZUhU TUw6IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHsKKwkJaWYgKCAhZGF0 YSB8fCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQor CQlpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAiYm9vbGVhbiIgKSB7CisJCQlrZWVwU2NyaXB0cyA9 IGNvbnRleHQ7CisJCQljb250ZXh0ID0gZmFsc2U7CisJCX0KKwkJY29udGV4dCA9IGNvbnRleHQg fHwgZG9jdW1lbnQ7CisKKwkJdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAor CQkJc2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTsKKworCQkvLyBTaW5nbGUgdGFnCisJCWlm ICggcGFyc2VkICkgeworCQkJcmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRb MV0gKSBdOworCQl9CisKKwkJcGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBd LCBjb250ZXh0LCBzY3JpcHRzICk7CisJCWlmICggc2NyaXB0cyApIHsKKwkJCWpRdWVyeSggc2Ny aXB0cyApLnJlbW92ZSgpOworCQl9CisJCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQu Y2hpbGROb2RlcyApOworCX0sCisKKwlwYXJzZUpTT046IGZ1bmN0aW9uKCBkYXRhICkgeworCQkv LyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3QKKwkJ aWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5wYXJzZSApIHsKKwkJCXJldHVybiB3aW5k b3cuSlNPTi5wYXJzZSggZGF0YSApOworCQl9CisKKwkJaWYgKCBkYXRhID09PSBudWxsICkgewor CQkJcmV0dXJuIGRhdGE7CisJCX0KKworCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiAp IHsKKworCQkJLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1v dmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCisJCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsK KworCQkJaWYgKCBkYXRhICkgeworCQkJCS8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBp cyBhY3R1YWwgSlNPTgorCQkJCS8vIExvZ2ljIGJvcnJvd2VkIGZyb20gaHR0cDovL2pzb24ub3Jn L2pzb24yLmpzCisJCQkJaWYgKCBydmFsaWRjaGFycy50ZXN0KCBkYXRhLnJlcGxhY2UoIHJ2YWxp ZGVzY2FwZSwgIkAiICkKKwkJCQkJLnJlcGxhY2UoIHJ2YWxpZHRva2VucywgIl0iICkKKwkJCQkJ LnJlcGxhY2UoIHJ2YWxpZGJyYWNlcywgIiIpKSApIHsKKworCQkJCQlyZXR1cm4gKCBuZXcgRnVu Y3Rpb24oICJyZXR1cm4gIiArIGRhdGEgKSApKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJalF1 ZXJ5LmVycm9yKCAiSW52YWxpZCBKU09OOiAiICsgZGF0YSApOworCX0sCisKKwkvLyBDcm9zcy1i cm93c2VyIHhtbCBwYXJzaW5nCisJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgeworCQl2YXIg eG1sLCB0bXA7CisJCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewor CQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdHJ5IHsKKwkJCWlmICggd2luZG93LkRPTVBhcnNlciAp IHsgLy8gU3RhbmRhcmQKKwkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CisJCQkJeG1sID0gdG1w LnBhcnNlRnJvbVN0cmluZyggZGF0YSAsICJ0ZXh0L3htbCIgKTsKKwkJCX0gZWxzZSB7IC8vIElF CisJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOworCQkJ CXhtbC5hc3luYyA9ICJmYWxzZSI7CisJCQkJeG1sLmxvYWRYTUwoIGRhdGEgKTsKKwkJCX0KKwkJ fSBjYXRjaCggZSApIHsKKwkJCXhtbCA9IHVuZGVmaW5lZDsKKwkJfQorCQlpZiAoICF4bWwgfHwg IXhtbC5kb2N1bWVudEVsZW1lbnQgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAicGFyc2Vy ZXJyb3IiICkubGVuZ3RoICkgeworCQkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBYTUw6ICIgKyBk YXRhICk7CisJCX0KKwkJcmV0dXJuIHhtbDsKKwl9LAorCisJbm9vcDogZnVuY3Rpb24oKSB7fSwK KworCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CisJLy8gV29ya2Fy b3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkgSmltIERyaXNjb2xsCisJLy8gaHR0cDovL3dlYmxv Z3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9hcmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2Ny aXB0LWdsb2JhbC1jb250ZXh0CisJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisJCWlm ICggZGF0YSAmJiBqUXVlcnkudHJpbSggZGF0YSApICkgeworCQkJLy8gV2UgdXNlIGV4ZWNTY3Jp cHQgb24gSW50ZXJuZXQgRXhwbG9yZXIKKwkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rp b24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdworCQkJLy8gcmF0aGVyIHRoYW4galF1ZXJ5IGlu IEZpcmVmb3gKKwkJCSggd2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7CisJ CQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKKwkJCX0gKSggZGF0YSAp OworCQl9CisJfSwKKworCS8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0 aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKKwkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhl aXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCisJY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkg eworCQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgIm1zLSIgKS5yZXBsYWNlKCBy ZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7CisJfSwKKworCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxl bSwgbmFtZSApIHsKKwkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xv d2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJfSwKKworCS8vIGFyZ3MgaXMgZm9y IGludGVybmFsIHVzYWdlIG9ubHkKKwllYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJn cyApIHsKKwkJdmFyIHZhbHVlLAorCQkJaSA9IDAsCisJCQlsZW5ndGggPSBvYmoubGVuZ3RoLAor CQkJaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTsKKworCQlpZiAoIGFyZ3MgKSB7CisJCQlp ZiAoIGlzQXJyYXkgKSB7CisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJCXZh bHVlID0gY2FsbGJhY2suYXBwbHkoIG9ialsgaSBdLCBhcmdzICk7CisKKwkJCQkJaWYgKCB2YWx1 ZSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7 CisJCQkJZm9yICggaSBpbiBvYmogKSB7CisJCQkJCXZhbHVlID0gY2FsbGJhY2suYXBwbHkoIG9i alsgaSBdLCBhcmdzICk7CisKKwkJCQkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisJCQkJCQli cmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2Ug Zm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAorCQl9IGVsc2UgeworCQkJaWYgKCBpc0Fy cmF5ICkgeworCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCQl2YWx1ZSA9IGNh bGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApOworCisJCQkJCWlmICggdmFsdWUg PT09IGZhbHNlICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2Ugewor CQkJCWZvciAoIGkgaW4gb2JqICkgeworCQkJCQl2YWx1ZSA9IGNhbGxiYWNrLmNhbGwoIG9ialsg aSBdLCBpLCBvYmpbIGkgXSApOworCisJCQkJCWlmICggdmFsdWUgPT09IGZhbHNlICkgeworCQkJ CQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gb2JqOworCX0s CisKKwkvLyBVc2UgbmF0aXZlIFN0cmluZy50cmltIGZ1bmN0aW9uIHdoZXJldmVyIHBvc3NpYmxl CisJdHJpbTogY29yZV90cmltICYmICFjb3JlX3RyaW0uY2FsbCgiXHVGRUZGXHhBMCIpID8KKwkJ ZnVuY3Rpb24oIHRleHQgKSB7CisJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KKwkJCQkiIiA6CisJ CQkJY29yZV90cmltLmNhbGwoIHRleHQgKTsKKwkJfSA6CisKKwkJLy8gT3RoZXJ3aXNlIHVzZSBv dXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHkKKwkJZnVuY3Rpb24oIHRleHQgKSB7CisJCQly ZXR1cm4gdGV4dCA9PSBudWxsID8KKwkJCQkiIiA6CisJCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNl KCBydHJpbSwgIiIgKTsKKwkJfSwKKworCS8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdl IG9ubHkKKwltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7CisJCXZhciByZXQg PSByZXN1bHRzIHx8IFtdOworCisJCWlmICggYXJyICE9IG51bGwgKSB7CisJCQlpZiAoIGlzQXJy YXlsaWtlKCBPYmplY3QoYXJyKSApICkgeworCQkJCWpRdWVyeS5tZXJnZSggcmV0LAorCQkJCQl0 eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CisJCQkJCVsgYXJyIF0gOiBhcnIKKwkJCQkpOworCQkJ fSBlbHNlIHsKKwkJCQljb3JlX3B1c2guY2FsbCggcmV0LCBhcnIgKTsKKwkJCX0KKwkJfQorCisJ CXJldHVybiByZXQ7CisJfSwKKworCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7 CisJCXZhciBsZW47CisKKwkJaWYgKCBhcnIgKSB7CisJCQlpZiAoIGNvcmVfaW5kZXhPZiApIHsK KwkJCQlyZXR1cm4gY29yZV9pbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApOworCQkJfQorCisJ CQlsZW4gPSBhcnIubGVuZ3RoOworCQkJaSA9IGkgPyBpIDwgMCA/IE1hdGgubWF4KCAwLCBsZW4g KyBpICkgOiBpIDogMDsKKworCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisJCQkJLy8gU2tp cCBhY2Nlc3NpbmcgaW4gc3BhcnNlIGFycmF5cworCQkJCWlmICggaSBpbiBhcnIgJiYgYXJyWyBp IF0gPT09IGVsZW0gKSB7CisJCQkJCXJldHVybiBpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJl dHVybiAtMTsKKwl9LAorCisJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgeworCQl2 YXIgbCA9IHNlY29uZC5sZW5ndGgsCisJCQlpID0gZmlyc3QubGVuZ3RoLAorCQkJaiA9IDA7CisK KwkJaWYgKCB0eXBlb2YgbCA9PT0gIm51bWJlciIgKSB7CisJCQlmb3IgKCA7IGogPCBsOyBqKysg KSB7CisJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07CisJCQl9CisJCX0gZWxzZSB7CisJ CQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgeworCQkJCWZpcnN0WyBpKysgXSA9 IHNlY29uZFsgaisrIF07CisJCQl9CisJCX0KKworCQlmaXJzdC5sZW5ndGggPSBpOworCisJCXJl dHVybiBmaXJzdDsKKwl9LAorCisJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52 ICkgeworCQl2YXIgcmV0VmFsLAorCQkJcmV0ID0gW10sCisJCQlpID0gMCwKKwkJCWxlbmd0aCA9 IGVsZW1zLmxlbmd0aDsKKwkJaW52ID0gISFpbnY7CisKKwkJLy8gR28gdGhyb3VnaCB0aGUgYXJy YXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcworCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBm dW5jdGlvbgorCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCXJldFZhbCA9ICEhY2Fs bGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKKwkJCWlmICggaW52ICE9PSByZXRWYWwgKSB7CisJCQkJ cmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwK KworCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorCW1hcDogZnVuY3Rpb24oIGVs ZW1zLCBjYWxsYmFjaywgYXJnICkgeworCQl2YXIgdmFsdWUsCisJCQlpID0gMCwKKwkJCWxlbmd0 aCA9IGVsZW1zLmxlbmd0aCwKKwkJCWlzQXJyYXkgPSBpc0FycmF5bGlrZSggZWxlbXMgKSwKKwkJ CXJldCA9IFtdOworCisJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNo IG9mIHRoZSBpdGVtcyB0byB0aGVpcgorCQlpZiAoIGlzQXJyYXkgKSB7CisJCQlmb3IgKCA7IGkg PCBsZW5ndGg7IGkrKyApIHsKKwkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBh cmcgKTsKKworCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKKwkJCQkJcmV0WyByZXQubGVuZ3Ro IF0gPSB2YWx1ZTsKKwkJCQl9CisJCQl9CisKKwkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24g dGhlIG9iamVjdCwKKwkJfSBlbHNlIHsKKwkJCWZvciAoIGkgaW4gZWxlbXMgKSB7CisJCQkJdmFs dWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKwkJCQlpZiAoIHZhbHVlICE9 IG51bGwgKSB7CisJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CisJCQkJfQorCQkJfQor CQl9CisKKwkJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cworCQlyZXR1cm4gY29yZV9jb25j YXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9LAorCisJLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZv ciBvYmplY3RzCisJZ3VpZDogMSwKKworCS8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQs IG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQorCS8vIGFyZ3VtZW50cy4KKwlwcm94 eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgeworCQl2YXIgYXJncywgcHJveHksIHRtcDsKKwor CQlpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAic3RyaW5nIiApIHsKKwkJCXRtcCA9IGZuWyBjb250 ZXh0IF07CisJCQljb250ZXh0ID0gZm47CisJCQlmbiA9IHRtcDsKKwkJfQorCisJCS8vIFF1aWNr IGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCisJ CS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRl ZmluZWQuCisJCWlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkgeworCQkJcmV0dXJuIHVu ZGVmaW5lZDsKKwkJfQorCisJCS8vIFNpbXVsYXRlZCBiaW5kCisJCWFyZ3MgPSBjb3JlX3NsaWNl LmNhbGwoIGFyZ3VtZW50cywgMiApOworCQlwcm94eSA9IGZ1bmN0aW9uKCkgeworCQkJcmV0dXJu IGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBjb3JlX3NsaWNlLmNhbGwo IGFyZ3VtZW50cyApICkgKTsKKwkJfTsKKworCQkvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhh bmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92 ZWQKKwkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CisK KwkJcmV0dXJuIHByb3h5OworCX0sCisKKwkvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdl dCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb24KKwkvLyBUaGUgdmFsdWUvcyBjYW4gb3B0 aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KKwlhY2Nlc3M6IGZ1bmN0aW9u KCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKwkJ dmFyIGkgPSAwLAorCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAorCQkJYnVsayA9IGtleSA9PSBu dWxsOworCisJCS8vIFNldHMgbWFueSB2YWx1ZXMKKwkJaWYgKCBqUXVlcnkudHlwZSgga2V5ICkg PT09ICJvYmplY3QiICkgeworCQkJY2hhaW5hYmxlID0gdHJ1ZTsKKwkJCWZvciAoIGkgaW4ga2V5 ICkgeworCQkJCWpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCB0cnVlLCBlbXB0 eUdldCwgcmF3ICk7CisJCQl9CisKKwkJLy8gU2V0cyBvbmUgdmFsdWUKKwkJfSBlbHNlIGlmICgg dmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKwkJCWNoYWluYWJsZSA9IHRydWU7CisKKwkJCWlmICgg IWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJCXJhdyA9IHRydWU7CisJCQl9CisK KwkJCWlmICggYnVsayApIHsKKwkJCQkvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhl IGVudGlyZSBzZXQKKwkJCQlpZiAoIHJhdyApIHsKKwkJCQkJZm4uY2FsbCggZWxlbXMsIHZhbHVl ICk7CisJCQkJCWZuID0gbnVsbDsKKworCQkJCS8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBm dW5jdGlvbiB2YWx1ZXMKKwkJCQl9IGVsc2UgeworCQkJCQlidWxrID0gZm47CisJCQkJCWZuID0g ZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7CisJCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBq UXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKKwkJCQkJfTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgg Zm4gKSB7CisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJCWZuKCBlbGVtc1tp XSwga2V5LCByYXcgPyB2YWx1ZSA6IHZhbHVlLmNhbGwoIGVsZW1zW2ldLCBpLCBmbiggZWxlbXNb aV0sIGtleSApICkgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gY2hhaW5hYmxlID8K KwkJCWVsZW1zIDoKKworCQkJLy8gR2V0cworCQkJYnVsayA/CisJCQkJZm4uY2FsbCggZWxlbXMg KSA6CisJCQkJbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0OworCX0sCisK Kwlub3c6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpOwor CX0KK30pOworCitqUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7CisJaWYg KCAhcmVhZHlMaXN0ICkgeworCisJCXJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpOworCisJ CS8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkIGFmdGVy IHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLgorCQkvLyB3ZSBvbmNlIHRy aWVkIHRvIHVzZSByZWFkeVN0YXRlICJpbnRlcmFjdGl2ZSIgaGVyZSwgYnV0IGl0IGNhdXNlZCBp c3N1ZXMgbGlrZSB0aGUgb25lCisJCS8vIGRpc2NvdmVyZWQgYnkgQ2hyaXNTIGhlcmU6IGh0dHA6 Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMjgyI2NvbW1lbnQ6MTUKKwkJaWYgKCBkb2N1bWVu dC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJLy8gSGFuZGxlIGl0IGFzeW5jaHJv bm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5CisJ CQlzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTsKKworCQkvLyBTdGFuZGFyZHMtYmFzZWQgYnJv d3NlcnMgc3VwcG9ydCBET01Db250ZW50TG9hZGVkCisJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmFk ZEV2ZW50TGlzdGVuZXIgKSB7CisJCQkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCisJ CQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRl ZCwgZmFsc2UgKTsKKworCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdp bGwgYWx3YXlzIHdvcmsKKwkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGNvbXBs ZXRlZCwgZmFsc2UgKTsKKworCQkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisJCX0gZWxz ZSB7CisJCQkvLyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNh ZmUgYWxzbyBmb3IgaWZyYW1lcworCQkJZG9jdW1lbnQuYXR0YWNoRXZlbnQoICJvbnJlYWR5c3Rh dGVjaGFuZ2UiLCBjb21wbGV0ZWQgKTsKKworCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25s b2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9h ZCIsIGNvbXBsZXRlZCApOworCisJCQkvLyBJZiBJRSBhbmQgbm90IGEgZnJhbWUKKwkJCS8vIGNv bnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKKwkJCXZhciB0 b3AgPSBmYWxzZTsKKworCQkJdHJ5IHsKKwkJCQl0b3AgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09 IG51bGwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCQkJfSBjYXRjaChlKSB7fQorCisJ CQlpZiAoIHRvcCAmJiB0b3AuZG9TY3JvbGwgKSB7CisJCQkJKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hl Y2soKSB7CisJCQkJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgeworCisJCQkJCQl0cnkgeworCQkJ CQkJCS8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCisJCQkJCQkJLy8gaHR0cDovL2ph dmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KKwkJCQkJCQl0b3AuZG9TY3JvbGwo ImxlZnQiKTsKKwkJCQkJCX0gY2F0Y2goZSkgeworCQkJCQkJCXJldHVybiBzZXRUaW1lb3V0KCBk b1Njcm9sbENoZWNrLCA1MCApOworCQkJCQkJfQorCisJCQkJCQkvLyBkZXRhY2ggYWxsIGRvbSBy ZWFkeSBldmVudHMKKwkJCQkJCWRldGFjaCgpOworCisJCQkJCQkvLyBhbmQgZXhlY3V0ZSBhbnkg d2FpdGluZyBmdW5jdGlvbnMKKwkJCQkJCWpRdWVyeS5yZWFkeSgpOworCQkJCQl9CisJCQkJfSko KTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApOworfTsK KworLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCitqUXVlcnkuZWFjaCgiQm9vbGVhbiBO dW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3Bs aXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgeworCWNsYXNzMnR5cGVbICJbb2JqZWN0ICIgKyBu YW1lICsgIl0iIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7Cit9KTsKKworZnVuY3Rpb24gaXNBcnJh eWxpa2UoIG9iaiApIHsKKwl2YXIgbGVuZ3RoID0gb2JqLmxlbmd0aCwKKwkJdHlwZSA9IGpRdWVy eS50eXBlKCBvYmogKTsKKworCWlmICggalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKKwkJcmV0 dXJuIGZhbHNlOworCX0KKworCWlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHsK KwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIHR5cGUgPT09ICJhcnJheSIgfHwgdHlwZSAh PT0gImZ1bmN0aW9uIiAmJgorCQkoIGxlbmd0aCA9PT0gMCB8fAorCQl0eXBlb2YgbGVuZ3RoID09 PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iaiApOworfQor CisvLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKK3Jvb3Rq UXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOworLy8gU3RyaW5nIHRvIE9iamVjdCBvcHRpb25zIGZv cm1hdCBjYWNoZQordmFyIG9wdGlvbnNDYWNoZSA9IHt9OworCisvLyBDb252ZXJ0IFN0cmluZy1m b3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lcyBhbmQgc3RvcmUgaW4g Y2FjaGUKK2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7CisJdmFyIG9iamVjdCA9 IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307CisJalF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0 Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkgeworCQlvYmpl Y3RbIGZsYWcgXSA9IHRydWU7CisJfSk7CisJcmV0dXJuIG9iamVjdDsKK30KKworLyoKKyAqIENy ZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoK KyAqCW9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMg dGhhdCB3aWxsIGNoYW5nZSBob3cKKyAqCQkJdGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBh IG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdAorICoKKyAqIEJ5IGRlZmF1bHQgYSBjYWxs YmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJl CisgKiAiZmlyZWQiIG11bHRpcGxlIHRpbWVzLgorICoKKyAqIFBvc3NpYmxlIG9wdGlvbnM6Cisg KgorICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBm aXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICoJbWVtb3J5OgkJCXdpbGwga2VlcCB0 cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQK KyAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhl IGxhdGVzdCAibWVtb3JpemVkIgorICoJCQkJCXZhbHVlcyAobGlrZSBhIERlZmVycmVkKQorICoK KyAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9u Y2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKKyAqCisgKglzdG9wT25GYWxzZToJaW50ZXJy dXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlCisgKgorICovCitqUXVl cnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CisKKwkvLyBDb252ZXJ0IG9wdGlv bnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkCisJ Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KQorCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9 PT0gInN0cmluZyIgPworCQkoIG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdIHx8IGNyZWF0ZU9wdGlv bnMoIG9wdGlvbnMgKSApIDoKKwkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKKworCXZh ciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCisJCWZpcmluZywK KwkJLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQorCQltZW1v cnksCisJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCisJCWZpcmVk LAorCQkvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKKwkJZmlyaW5nTGVuZ3RoLAorCQkv LyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUg aWYgbmVlZGVkKQorCQlmaXJpbmdJbmRleCwKKwkJLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAo dXNlZCBpbnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCisJCWZpcmluZ1N0YXJ0LAorCQkv LyBBY3R1YWwgY2FsbGJhY2sgbGlzdAorCQlsaXN0ID0gW10sCisJCS8vIFN0YWNrIG9mIGZpcmUg Y2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHMKKwkJc3RhY2sgPSAhb3B0aW9ucy5vbmNlICYmIFtd LAorCQkvLyBGaXJlIGNhbGxiYWNrcworCQlmaXJlID0gZnVuY3Rpb24oIGRhdGEgKSB7CisJCQlt ZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAmJiBkYXRhOworCQkJZmlyZWQgPSB0cnVlOworCQkJZmly aW5nSW5kZXggPSBmaXJpbmdTdGFydCB8fCAwOworCQkJZmlyaW5nU3RhcnQgPSAwOworCQkJZmly aW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7CisJCQlmaXJpbmcgPSB0cnVlOworCQkJZm9yICggOyBs aXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5nTGVuZ3RoOyBmaXJpbmdJbmRleCsrICkgeworCQkJ CWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggZGF0YVsgMCBdLCBkYXRhWyAxIF0gKSA9 PT0gZmFsc2UgJiYgb3B0aW9ucy5zdG9wT25GYWxzZSApIHsKKwkJCQkJbWVtb3J5ID0gZmFsc2U7 IC8vIFRvIHByZXZlbnQgZnVydGhlciBjYWxscyB1c2luZyBhZGQKKwkJCQkJYnJlYWs7CisJCQkJ fQorCQkJfQorCQkJZmlyaW5nID0gZmFsc2U7CisJCQlpZiAoIGxpc3QgKSB7CisJCQkJaWYgKCBz dGFjayApIHsKKwkJCQkJaWYgKCBzdGFjay5sZW5ndGggKSB7CisJCQkJCQlmaXJlKCBzdGFjay5z aGlmdCgpICk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKCBtZW1vcnkgKSB7CisJCQkJCWxpc3Qg PSBbXTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZWxmLmRpc2FibGUoKTsKKwkJCQl9CisJCQl9CisJ CX0sCisJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CisJCXNlbGYgPSB7CisJCQkvLyBBZGQg YSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0CisJCQlh ZGQ6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggbGlzdCApIHsKKwkJCQkJLy8gRmlyc3QsIHdlIHNh dmUgdGhlIGN1cnJlbnQgbGVuZ3RoCisJCQkJCXZhciBzdGFydCA9IGxpc3QubGVuZ3RoOworCQkJ CQkoZnVuY3Rpb24gYWRkKCBhcmdzICkgeworCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0 aW9uKCBfLCBhcmcgKSB7CisJCQkJCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7CisJ CQkJCQkJaWYgKCB0eXBlID09PSAiZnVuY3Rpb24iICkgeworCQkJCQkJCQlpZiAoICFvcHRpb25z LnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkgeworCQkJCQkJCQkJbGlzdC5wdXNoKCBhcmcg KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHR5 cGUgIT09ICJzdHJpbmciICkgeworCQkJCQkJCQkvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5CisJCQkJ CQkJCWFkZCggYXJnICk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0pKCBhcmd1bWVudHMg KTsKKwkJCQkJLy8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGUKKwkJCQkJ Ly8gY3VycmVudCBmaXJpbmcgYmF0Y2g/CisJCQkJCWlmICggZmlyaW5nICkgeworCQkJCQkJZmly aW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7CisJCQkJCS8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBu b3QgZmlyaW5nIHRoZW4KKwkJCQkJLy8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheQorCQkJCQl9 IGVsc2UgaWYgKCBtZW1vcnkgKSB7CisJCQkJCQlmaXJpbmdTdGFydCA9IHN0YXJ0OworCQkJCQkJ ZmlyZSggbWVtb3J5ICk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAor CQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAorCQkJcmVtb3ZlOiBmdW5jdGlv bigpIHsKKwkJCQlpZiAoIGxpc3QgKSB7CisJCQkJCWpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1 bmN0aW9uKCBfLCBhcmcgKSB7CisJCQkJCQl2YXIgaW5kZXg7CisJCQkJCQl3aGlsZSggKCBpbmRl eCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkgeworCQkJCQkJ CWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOworCQkJCQkJCS8vIEhhbmRsZSBmaXJpbmcgaW5kZXhl cworCQkJCQkJCWlmICggZmlyaW5nICkgeworCQkJCQkJCQlpZiAoIGluZGV4IDw9IGZpcmluZ0xl bmd0aCApIHsKKwkJCQkJCQkJCWZpcmluZ0xlbmd0aC0tOworCQkJCQkJCQl9CisJCQkJCQkJCWlm ICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CisJCQkJCQkJCQlmaXJpbmdJbmRleC0tOworCQkJ CQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQkJcmV0dXJuIHRo aXM7CisJCQl9LAorCQkJLy8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlz dC4KKwkJCS8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3Qg bGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLgorCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CisJ CQkJcmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBsaXN0 ICYmIGxpc3QubGVuZ3RoICk7CisJCQl9LAorCQkJLy8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJv bSB0aGUgbGlzdAorCQkJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQkJCWxpc3QgPSBbXTsKKwkJCQly ZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBIYXZlIHRoZSBsaXN0IGRvIG5vdGhpbmcgYW55bW9y ZQorCQkJZGlzYWJsZTogZnVuY3Rpb24oKSB7CisJCQkJbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0g dW5kZWZpbmVkOworCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIElzIGl0IGRpc2FibGVk PworCQkJZGlzYWJsZWQ6IGZ1bmN0aW9uKCkgeworCQkJCXJldHVybiAhbGlzdDsKKwkJCX0sCisJ CQkvLyBMb2NrIHRoZSBsaXN0IGluIGl0cyBjdXJyZW50IHN0YXRlCisJCQlsb2NrOiBmdW5jdGlv bigpIHsKKwkJCQlzdGFjayA9IHVuZGVmaW5lZDsKKwkJCQlpZiAoICFtZW1vcnkgKSB7CisJCQkJ CXNlbGYuZGlzYWJsZSgpOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBJ cyBpdCBsb2NrZWQ/CisJCQlsb2NrZWQ6IGZ1bmN0aW9uKCkgeworCQkJCXJldHVybiAhc3RhY2s7 CisJCQl9LAorCQkJLy8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQg YW5kIGFyZ3VtZW50cworCQkJZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgewor CQkJCWFyZ3MgPSBhcmdzIHx8IFtdOworCQkJCWFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2Ug PyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07CisJCQkJaWYgKCBsaXN0ICYmICggIWZpcmVkIHx8IHN0 YWNrICkgKSB7CisJCQkJCWlmICggZmlyaW5nICkgeworCQkJCQkJc3RhY2sucHVzaCggYXJncyAp OworCQkJCQl9IGVsc2UgeworCQkJCQkJZmlyZSggYXJncyApOworCQkJCQl9CisJCQkJfQorCQkJ CXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0 aGUgZ2l2ZW4gYXJndW1lbnRzCisJCQlmaXJlOiBmdW5jdGlvbigpIHsKKwkJCQlzZWxmLmZpcmVX aXRoKCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBU byBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0 IG9uY2UKKwkJCWZpcmVkOiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gISFmaXJlZDsKKwkJCX0K KwkJfTsKKworCXJldHVybiBzZWxmOworfTsKK2pRdWVyeS5leHRlbmQoeworCisJRGVmZXJyZWQ6 IGZ1bmN0aW9uKCBmdW5jICkgeworCQl2YXIgdHVwbGVzID0gWworCQkJCS8vIGFjdGlvbiwgYWRk IGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQorCQkJCVsgInJlc29sdmUiLCAi ZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZXNvbHZlZCIgXSwKKwkJ CQlbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJy ZWplY3RlZCIgXSwKKwkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tz KCJtZW1vcnkiKSBdCisJCQldLAorCQkJc3RhdGUgPSAicGVuZGluZyIsCisJCQlwcm9taXNlID0g eworCQkJCXN0YXRlOiBmdW5jdGlvbigpIHsKKwkJCQkJcmV0dXJuIHN0YXRlOworCQkJCX0sCisJ CQkJYWx3YXlzOiBmdW5jdGlvbigpIHsKKwkJCQkJZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICku ZmFpbCggYXJndW1lbnRzICk7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0sCisJCQkJdGhlbjog ZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgeworCQkJCQl2YXIg Zm5zID0gYXJndW1lbnRzOworCQkJCQlyZXR1cm4galF1ZXJ5LkRlZmVycmVkKGZ1bmN0aW9uKCBu ZXdEZWZlciApIHsKKwkJCQkJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBs ZSApIHsKKwkJCQkJCQl2YXIgYWN0aW9uID0gdHVwbGVbIDAgXSwKKwkJCQkJCQkJZm4gPSBqUXVl cnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTsKKwkJCQkJCQkvLyBkZWZlcnJl ZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3 RGVmZXIKKwkJCQkJCQlkZWZlcnJlZFsgdHVwbGVbMV0gXShmdW5jdGlvbigpIHsKKwkJCQkJCQkJ dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJCQkJ CQlpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkg KSB7CisJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKKwkJCQkJCQkJCQkuZG9uZSggbmV3RGVm ZXIucmVzb2x2ZSApCisJCQkJCQkJCQkJLmZhaWwoIG5ld0RlZmVyLnJlamVjdCApCisJCQkJCQkJ CQkJLnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJ CQkJCW5ld0RlZmVyWyBhY3Rpb24gKyAiV2l0aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0Rl ZmVyLnByb21pc2UoKSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7CisJ CQkJCQkJCX0KKwkJCQkJCQl9KTsKKwkJCQkJCX0pOworCQkJCQkJZm5zID0gbnVsbDsKKwkJCQkJ fSkucHJvbWlzZSgpOworCQkJCX0sCisJCQkJLy8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZl cnJlZAorCQkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFk ZGVkIHRvIHRoZSBvYmplY3QKKwkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgeworCQkJCQly ZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21p c2U7CisJCQkJfQorCQkJfSwKKwkJCWRlZmVycmVkID0ge307CisKKwkJLy8gS2VlcCBwaXBlIGZv ciBiYWNrLWNvbXBhdAorCQlwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47CisKKwkJLy8gQWRk IGxpc3Qtc3BlY2lmaWMgbWV0aG9kcworCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbigg aSwgdHVwbGUgKSB7CisJCQl2YXIgbGlzdCA9IHR1cGxlWyAyIF0sCisJCQkJc3RhdGVTdHJpbmcg PSB0dXBsZVsgMyBdOworCisJCQkvLyBwcm9taXNlWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0g PSBsaXN0LmFkZAorCQkJcHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkOworCisJCQkvLyBI YW5kbGUgc3RhdGUKKwkJCWlmICggc3RhdGVTdHJpbmcgKSB7CisJCQkJbGlzdC5hZGQoZnVuY3Rp b24oKSB7CisJCQkJCS8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KKwkJCQkJc3Rh dGUgPSBzdGF0ZVN0cmluZzsKKworCQkJCS8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3Qg XS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2sKKwkJCQl9LCB0dXBsZXNbIGkgXiAxIF1bIDIg XS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKKwkJCX0KKworCQkJLy8gZGVmZXJy ZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXQorCQkJZGVmZXJyZWRbIHR1cGxlWzBdIF0g PSBmdW5jdGlvbigpIHsKKwkJCQlkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSggdGhpcyA9 PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7CisJCQkJcmV0dXJuIHRo aXM7CisJCQl9OworCQkJZGVmZXJyZWRbIHR1cGxlWzBdICsgIldpdGgiIF0gPSBsaXN0LmZpcmVX aXRoOworCQl9KTsKKworCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKKwkJcHJvbWlz ZS5wcm9taXNlKCBkZWZlcnJlZCApOworCisJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKKwkJ aWYgKCBmdW5jICkgeworCQkJZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTsKKwkJfQor CisJCS8vIEFsbCBkb25lIQorCQlyZXR1cm4gZGVmZXJyZWQ7CisJfSwKKworCS8vIERlZmVycmVk IGhlbHBlcgorCXdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5h dGVOICovICkgeworCQl2YXIgaSA9IDAsCisJCQlyZXNvbHZlVmFsdWVzID0gY29yZV9zbGljZS5j YWxsKCBhcmd1bWVudHMgKSwKKwkJCWxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLAorCisJ CQkvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCisJCQlyZW1haW5pbmcg PSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vi b3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLAorCisJCQkvLyB0aGUgbWFzdGVyIERl ZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJl ZCwganVzdCB1c2UgdGhhdC4KKwkJCWRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3Jk aW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKKworCQkJLy8gVXBkYXRlIGZ1bmN0aW9uIGZvciBi b3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlcworCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9u KCBpLCBjb250ZXh0cywgdmFsdWVzICkgeworCQkJCXJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7 CisJCQkJCWNvbnRleHRzWyBpIF0gPSB0aGlzOworCQkJCQl2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50 cy5sZW5ndGggPiAxID8gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOworCQkJ CQlpZiggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHsKKwkJCQkJCWRlZmVycmVkLm5vdGlm eVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKKwkJCQkJfSBlbHNlIGlmICggISggLS1yZW1haW5p bmcgKSApIHsKKwkJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7 CisJCQkJCX0KKwkJCQl9OworCQkJfSwKKworCQkJcHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29u dGV4dHMsIHJlc29sdmVDb250ZXh0czsKKworCQkvLyBhZGQgbGlzdGVuZXJzIHRvIERlZmVycmVk IHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkCisJCWlmICggbGVuZ3RoID4g MSApIHsKKwkJCXByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKKwkJCXByb2dy ZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOworCQkJcmVzb2x2ZUNvbnRleHRzID0g bmV3IEFycmF5KCBsZW5ndGggKTsKKwkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJ CWlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFs dWVzWyBpIF0ucHJvbWlzZSApICkgeworCQkJCQlyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgp CisJCQkJCQkuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFs dWVzICkgKQorCQkJCQkJLmZhaWwoIGRlZmVycmVkLnJlamVjdCApCisJCQkJCQkucHJvZ3Jlc3Mo IHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTsKKwkJ CQl9IGVsc2UgeworCQkJCQktLXJlbWFpbmluZzsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBp ZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCisJCWlm ICggIXJlbWFpbmluZyApIHsKKwkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4 dHMsIHJlc29sdmVWYWx1ZXMgKTsKKwkJfQorCisJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7 CisJfQorfSk7CitqUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHsKKworCXZhciBzdXBwb3J0 LCBhbGwsIGEsCisJCWlucHV0LCBzZWxlY3QsIGZyYWdtZW50LAorCQlvcHQsIGV2ZW50TmFtZSwg aXNTdXBwb3J0ZWQsIGksCisJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwor CisJLy8gU2V0dXAKKwlkaXYuc2V0QXR0cmlidXRlKCAiY2xhc3NOYW1lIiwgInQiICk7CisJZGl2 LmlubmVySFRNTCA9ICIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48 aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iOworCisJLy8gU3VwcG9ydCB0ZXN0cyB3b24ndCBydW4g aW4gc29tZSBsaW1pdGVkIG9yIG5vbi1icm93c2VyIGVudmlyb25tZW50cworCWFsbCA9IGRpdi5n ZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUo ImEiKVsgMCBdOworCWlmICggIWFsbCB8fCAhYSB8fCAhYWxsLmxlbmd0aCApIHsKKwkJcmV0dXJu IHt9OworCX0KKworCS8vIEZpcnN0IGJhdGNoIG9mIHRlc3RzCisJc2VsZWN0ID0gZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CisJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSApOworCWlucHV0ID0gZGl2LmdldEVsZW1lbnRz QnlUYWdOYW1lKCJpbnB1dCIpWyAwIF07CisKKwlhLnN0eWxlLmNzc1RleHQgPSAidG9wOjFweDtm bG9hdDpsZWZ0O29wYWNpdHk6LjUiOworCXN1cHBvcnQgPSB7CisJCS8vIFRlc3Qgc2V0QXR0cmli dXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdo ZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpCisJCWdldFNldEF0dHJpYnV0ZTogZGl2 LmNsYXNzTmFtZSAhPT0gInQiLAorCisJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ug d2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKwkJbGVhZGluZ1doaXRlc3BhY2U6IGRpdi5maXJzdENo aWxkLm5vZGVUeXBlID09PSAzLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRz IGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCisJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0g aW50byBlbXB0eSB0YWJsZXMKKwkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRi b2R5IikubGVuZ3RoLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGxpbmsgZWxlbWVudHMgZ2V0IHNl cmlhbGl6ZWQgY29ycmVjdGx5IGJ5IGlubmVySFRNTAorCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3Jh cHBlciBlbGVtZW50IGluIElFCisJCWh0bWxTZXJpYWxpemU6ICEhZGl2LmdldEVsZW1lbnRzQnlU YWdOYW1lKCJsaW5rIikubGVuZ3RoLAorCisJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24g ZnJvbSBnZXRBdHRyaWJ1dGUKKwkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKKwkJc3R5 bGU6IC90b3AvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCisKKwkJLy8gTWFrZSBz dXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKKwkJLy8gKElFIG5vcm1hbGl6ZXMgaXQg YnkgZGVmYXVsdCkKKwkJaHJlZk5vcm1hbGl6ZWQ6IGEuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09 ICIvYSIsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cworCQkv LyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKKwkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91 bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQorCQlvcGFjaXR5OiAvXjAuNS8udGVzdCggYS5z dHlsZS5vcGFjaXR5ICksCisKKwkJLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQorCQkv LyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCisJCWNzc0Zsb2F0OiAh IWEuc3R5bGUuY3NzRmxvYXQsCisKKwkJLy8gQ2hlY2sgdGhlIGRlZmF1bHQgY2hlY2tib3gvcmFk aW8gdmFsdWUgKCIiIG9uIFdlYktpdDsgIm9uIiBlbHNld2hlcmUpCisJCWNoZWNrT246ICEhaW5w dXQudmFsdWUsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9w dGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5LgorCQkvLyAoV2ViS2l0IGRlZmF1 bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdy b3VwKQorCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAorCisJCS8vIFRlc3RzIGZvciBlbmN0 eXBlIHN1cHBvcnQgb24gYSBmb3JtICgjNjc0MykKKwkJZW5jdHlwZTogISFkb2N1bWVudC5jcmVh dGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSwKKworCQkvLyBNYWtlcyBzdXJlIGNsb25pbmcgYW4g aHRtbDUgZWxlbWVudCBkb2VzIG5vdCBjYXVzZSBwcm9ibGVtcworCQkvLyBXaGVyZSBvdXRlckhU TUwgaXMgdW5kZWZpbmVkLCB0aGlzIHN0aWxsIHdvcmtzCisJCWh0bWw1Q2xvbmU6IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6 bmF2PjwvOm5hdj4iLAorCisJCS8vIGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsIERFUFJFQ0FURUQg aW4gMS44IHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgUXVpcmtzIE1vZGUKKwkJYm94TW9kZWw6IGRv Y3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiwKKworCQkvLyBXaWxsIGJlIGRlZmlu ZWQgbGF0ZXIKKwkJZGVsZXRlRXhwYW5kbzogdHJ1ZSwKKwkJbm9DbG9uZUV2ZW50OiB0cnVlLAor CQlpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxzZSwKKwkJc2hyaW5rV3JhcEJsb2NrczogZmFs c2UsCisJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUsCisJCWJveFNpemluZ1JlbGlhYmxlOiB0 cnVlLAorCQlwaXhlbFBvc2l0aW9uOiBmYWxzZQorCX07CisKKwkvLyBNYWtlIHN1cmUgY2hlY2tl ZCBzdGF0dXMgaXMgcHJvcGVybHkgY2xvbmVkCisJaW5wdXQuY2hlY2tlZCA9IHRydWU7CisJc3Vw cG9ydC5ub0Nsb25lQ2hlY2tlZCA9IGlucHV0LmNsb25lTm9kZSggdHJ1ZSApLmNoZWNrZWQ7CisK KwkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBh cmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCisJLy8gKFdlYktpdCBtYXJrcyB0aGVtIGFzIGRpc2Fi bGVkKQorCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7CisJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFv cHQuZGlzYWJsZWQ7CisKKwkvLyBTdXBwb3J0OiBJRTw5CisJdHJ5IHsKKwkJZGVsZXRlIGRpdi50 ZXN0OworCX0gY2F0Y2goIGUgKSB7CisJCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOwor CX0KKworCS8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBnZXRBdHRyaWJ1dGUoInZhbHVlIikKKwlp bnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisJaW5wdXQuc2V0QXR0cmli dXRlKCAidmFsdWUiLCAiIiApOworCXN1cHBvcnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUo ICJ2YWx1ZSIgKSA9PT0gIiI7CisKKwkvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFpbnMgaXRz IHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW8KKwlpbnB1dC52YWx1ZSA9ICJ0IjsKKwlpbnB1 dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOworCXN1cHBvcnQucmFkaW9WYWx1ZSA9 IGlucHV0LnZhbHVlID09PSAidCI7CisKKwkvLyAjMTEyMTcgLSBXZWJLaXQgbG9zZXMgY2hlY2sg d2hlbiB0aGUgbmFtZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUKKwlpbnB1dC5zZXRB dHRyaWJ1dGUoICJjaGVja2VkIiwgInQiICk7CisJaW5wdXQuc2V0QXR0cmlidXRlKCAibmFtZSIs ICJ0IiApOworCisJZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7 CisJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CisKKwkvLyBDaGVjayBpZiBhIGRpc2Nv bm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAorCS8vIHZhbHVlIG9mIHRy dWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCisJc3VwcG9ydC5hcHBlbmRDaGVj a2VkID0gaW5wdXQuY2hlY2tlZDsKKworCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQg c3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cworCXN1cHBvcnQuY2hlY2tDbG9uZSA9IGZyYWdt ZW50LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2Vk OworCisJLy8gU3VwcG9ydDogSUU8OQorCS8vIE9wZXJhIGRvZXMgbm90IGNsb25lIGV2ZW50cyAo YW5kIHR5cGVvZiBkaXYuYXR0YWNoRXZlbnQgPT09IHVuZGVmaW5lZCkuCisJLy8gSUU5LTEwIGNs b25lcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50LCBidXQgdGhleSBkb24ndCB0cmlnZ2Vy IHdpdGggLmNsaWNrKCkKKwlpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKKwkJZGl2LmF0dGFjaEV2 ZW50KCAib25jbGljayIsIGZ1bmN0aW9uKCkgeworCQkJc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBm YWxzZTsKKwkJfSk7CisKKwkJZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsaWNrKCk7CisJfQorCisJ Ly8gU3VwcG9ydDogSUU8OSAobGFjayBzdWJtaXQvY2hhbmdlIGJ1YmJsZSksIEZpcmVmb3ggMTcr IChsYWNrIGZvY3VzaW4gZXZlbnQpCisJLy8gQmV3YXJlIG9mIENTUCByZXN0cmljdGlvbnMgKGh0 dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUCksIHRlc3QvY3NwLnBo cAorCWZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIGNoYW5nZTogdHJ1ZSwgZm9jdXNpbjogdHJ1 ZSB9KSB7CisJCWRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSA9ICJvbiIgKyBpLCAidCIgKTsK KworCQlzdXBwb3J0WyBpICsgIkJ1YmJsZXMiIF0gPSBldmVudE5hbWUgaW4gd2luZG93IHx8IGRp di5hdHRyaWJ1dGVzWyBldmVudE5hbWUgXS5leHBhbmRvID09PSBmYWxzZTsKKwl9CisKKwlkaXYu c3R5bGUuYmFja2dyb3VuZENsaXAgPSAiY29udGVudC1ib3giOworCWRpdi5jbG9uZU5vZGUoIHRy dWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIiOworCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxl ID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOworCisJLy8gUnVu IHRlc3RzIHRoYXQgbmVlZCBhIGJvZHkgYXQgZG9jIHJlYWR5CisJalF1ZXJ5KGZ1bmN0aW9uKCkg eworCQl2YXIgY29udGFpbmVyLCBtYXJnaW5EaXYsIHRkcywKKwkJCWRpdlJlc2V0ID0gInBhZGRp bmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Y29udGVudC1i b3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYm94LXNpemluZzpjb250ZW50 LWJveDsiLAorCQkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5Iilb MF07CisKKwkJaWYgKCAhYm9keSApIHsKKwkJCS8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0 aGF0IGRvbid0IGhhdmUgYSBib2R5CisJCQlyZXR1cm47CisJCX0KKworCQljb250YWluZXIgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQg PSAiYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0 Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHgiOworCisJCWJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5l ciApLmFwcGVuZENoaWxkKCBkaXYgKTsKKworCQkvLyBTdXBwb3J0OiBJRTgKKwkJLy8gQ2hlY2sg aWYgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQgd2hlbiB0aGV5IGFy ZSBzZXQKKwkJLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlz aWJsZSB0YWJsZSBjZWxscyBpbiBhCisJCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRo L0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgorCQkvLyBkZXRlcm1pbmluZyBp ZiBhbiBlbGVtZW50IGhhcyBiZWVuIGhpZGRlbiBkaXJlY3RseSB1c2luZworCQkvLyBkaXNwbGF5 Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVu dCBpcworCQkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBm b3IgbW9yZSBpbmZvcm1hdGlvbikuCisJCWRpdi5pbm5lckhUTUwgPSAiPHRhYmxlPjx0cj48dGQ+ PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiI7CisJCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5 VGFnTmFtZSgidGQiKTsKKwkJdGRzWyAwIF0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjA7bWFy Z2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIjsKKwkJaXNTdXBwb3J0ZWQgPSAoIHRkc1sgMCBd Lm9mZnNldEhlaWdodCA9PT0gMCApOworCisJCXRkc1sgMCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsK KwkJdGRzWyAxIF0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKworCQkvLyBTdXBwb3J0OiBJRTgK KwkJLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9I ZWlnaHQKKwkJc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBpc1N1cHBvcnRlZCAmJiAo IHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOworCisJCS8vIENoZWNrIGJveC1zaXppbmcg YW5kIG1hcmdpbiBiZWhhdmlvcgorCQlkaXYuaW5uZXJIVE1MID0gIiI7CisJCWRpdi5zdHlsZS5j c3NUZXh0ID0gImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJv eDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rp c3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9w OjElOyI7CisJCXN1cHBvcnQuYm94U2l6aW5nID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDQgKTsK KwkJc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCA9ICggYm9keS5vZmZz ZXRUb3AgIT09IDEgKTsKKworCQkvLyBVc2Ugd2luZG93LmdldENvbXB1dGVkU3R5bGUgYmVjYXVz ZSBqc2RvbSBvbiBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC4KKwkJaWYgKCB3aW5kb3cu Z2V0Q29tcHV0ZWRTdHlsZSApIHsKKwkJCXN1cHBvcnQucGl4ZWxQb3NpdGlvbiA9ICggd2luZG93 LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHt9ICkudG9wICE9PSAiMSUiOworCQkJ c3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRp diwgbnVsbCApIHx8IHsgd2lkdGg6ICI0cHgiIH0gKS53aWR0aCA9PT0gIjRweCI7CisKKwkJCS8v IENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5j b3JyZWN0bHkKKwkJCS8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRo IG9mIGNvbnRhaW5lci4gKCMzMzMzKQorCQkJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIg MjAxMSBuaWdodGxpZXMKKwkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxl IHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAorCQkJbWFyZ2luRGl2ID0gZGl2 LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSApOworCQkJbWFyZ2lu RGl2LnN0eWxlLmNzc1RleHQgPSBkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0OworCQkJbWFy Z2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOwor CQkJZGl2LnN0eWxlLndpZHRoID0gIjFweCI7CisKKwkJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5S aWdodCA9CisJCQkJIXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdp bkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmlnaHQgKTsKKwkJfQorCisJCWlmICggdHlwZW9m IGRpdi5zdHlsZS56b29tICE9PSBjb3JlX3N0cnVuZGVmaW5lZCApIHsKKwkJCS8vIFN1cHBvcnQ6 IElFPDgKKwkJCS8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBs aWtlIGlubGluZS1ibG9jaworCQkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3Bs YXkgdG8gJ2lubGluZScgYW5kIGdpdmluZworCQkJLy8gdGhlbSBsYXlvdXQKKwkJCWRpdi5pbm5l ckhUTUwgPSAiIjsKKwkJCWRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2UmVzZXQgKyAid2lkdGg6MXB4 O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSI7CisJCQlzdXBwb3J0LmlubGluZUJs b2NrTmVlZHNMYXlvdXQgPSAoIGRpdi5vZmZzZXRXaWR0aCA9PT0gMyApOworCisJCQkvLyBTdXBw b3J0OiBJRTYKKwkJCS8vIENoZWNrIGlmIGVsZW1lbnRzIHdpdGggbGF5b3V0IHNocmluay13cmFw IHRoZWlyIGNoaWxkcmVuCisJCQlkaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJCQlkaXYu aW5uZXJIVE1MID0gIjxkaXY+PC9kaXY+IjsKKwkJCWRpdi5maXJzdENoaWxkLnN0eWxlLndpZHRo ID0gIjVweCI7CisJCQlzdXBwb3J0LnNocmlua1dyYXBCbG9ja3MgPSAoIGRpdi5vZmZzZXRXaWR0 aCAhPT0gMyApOworCisJCQlpZiAoIHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCApIHsK KwkJCQkvLyBQcmV2ZW50IElFIDYgZnJvbSBhZmZlY3RpbmcgbGF5b3V0IGZvciBwb3NpdGlvbmVk IGVsZW1lbnRzICMxMTA0OAorCQkJCS8vIFByZXZlbnQgSUUgZnJvbSBzaHJpbmtpbmcgdGhlIGJv ZHkgaW4gSUUgNyBtb2RlICMxMjg2OQorCQkJCS8vIFN1cHBvcnQ6IElFPDgKKwkJCQlib2R5LnN0 eWxlLnpvb20gPSAxOworCQkJfQorCQl9CisKKwkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVy ICk7CisKKwkJLy8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRQorCQljb250YWlu ZXIgPSBkaXYgPSB0ZHMgPSBtYXJnaW5EaXYgPSBudWxsOworCX0pOworCisJLy8gTnVsbCBlbGVt ZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRQorCWFsbCA9IHNlbGVjdCA9IGZyYWdtZW50ID0gb3B0 ID0gYSA9IGlucHV0ID0gbnVsbDsKKworCXJldHVybiBzdXBwb3J0OworfSkoKTsKKwordmFyIHJi cmFjZSA9IC8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLywKKwlybXVsdGlEYXNoID0gLyhb QS1aXSkvZzsKKworZnVuY3Rpb24gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQg LyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKXsKKwlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxl bSApICkgeworCQlyZXR1cm47CisJfQorCisJdmFyIHRoaXNDYWNoZSwgcmV0LAorCQlpbnRlcm5h bEtleSA9IGpRdWVyeS5leHBhbmRvLAorCQlnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gInN0 cmluZyIsCisKKwkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3Rz IGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKKwkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5j ZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKKwkJaXNOb2RlID0gZWxlbS5u b2RlVHlwZSwKKworCQkvLyBPbmx5IERPTSBub2RlcyBuZWVkIHRoZSBnbG9iYWwgalF1ZXJ5IGNh Y2hlOyBKUyBvYmplY3QgZGF0YSBpcworCQkvLyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgb2Jq ZWN0IHNvIEdDIGNhbiBvY2N1ciBhdXRvbWF0aWNhbGx5CisJCWNhY2hlID0gaXNOb2RlID8galF1 ZXJ5LmNhY2hlIDogZWxlbSwKKworCQkvLyBPbmx5IGRlZmluaW5nIGFuIElEIGZvciBKUyBvYmpl Y3RzIGlmIGl0cyBjYWNoZSBhbHJlYWR5IGV4aXN0cyBhbGxvd3MKKwkJLy8gdGhlIGNvZGUgdG8g c2hvcnRjdXQgb24gdGhlIHNhbWUgcGF0aCBhcyBhIERPTSBub2RlIHdpdGggbm8gY2FjaGUKKwkJ aWQgPSBpc05vZGUgPyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxlbVsgaW50ZXJuYWxLZXkgXSAm JiBpbnRlcm5hbEtleTsKKworCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBu ZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCisJLy8gb2JqZWN0IHRoYXQgaGFz IG5vIGRhdGEgYXQgYWxsCisJaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNh Y2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYmIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKKwkJ cmV0dXJuOworCX0KKworCWlmICggIWlkICkgeworCQkvLyBPbmx5IERPTSBub2RlcyBuZWVkIGEg bmV3IHVuaXF1ZSBJRCBmb3IgZWFjaCBlbGVtZW50IHNpbmNlIHRoZWlyIGRhdGEKKwkJLy8gZW5k cyB1cCBpbiB0aGUgZ2xvYmFsIGNhY2hlCisJCWlmICggaXNOb2RlICkgeworCQkJZWxlbVsgaW50 ZXJuYWxLZXkgXSA9IGlkID0gY29yZV9kZWxldGVkSWRzLnBvcCgpIHx8IGpRdWVyeS5ndWlkKys7 CisJCX0gZWxzZSB7CisJCQlpZCA9IGludGVybmFsS2V5OworCQl9CisJfQorCisJaWYgKCAhY2Fj aGVbIGlkIF0gKSB7CisJCWNhY2hlWyBpZCBdID0ge307CisKKwkJLy8gQXZvaWRzIGV4cG9zaW5n IGpRdWVyeSBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdAorCQkv LyBpcyBzZXJpYWxpemVkIHVzaW5nIEpTT04uc3RyaW5naWZ5CisJCWlmICggIWlzTm9kZSApIHsK KwkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOworCQl9CisJfQorCisJLy8gQW4g b2JqZWN0IGNhbiBiZSBwYXNzZWQgdG8galF1ZXJ5LmRhdGEgaW5zdGVhZCBvZiBhIGtleS92YWx1 ZSBwYWlyOyB0aGlzIGdldHMKKwkvLyBzaGFsbG93IGNvcGllZCBvdmVyIG9udG8gdGhlIGV4aXN0 aW5nIGNhY2hlCisJaWYgKCB0eXBlb2YgbmFtZSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG5hbWUg PT09ICJmdW5jdGlvbiIgKSB7CisJCWlmICggcHZ0ICkgeworCQkJY2FjaGVbIGlkIF0gPSBqUXVl cnkuZXh0ZW5kKCBjYWNoZVsgaWQgXSwgbmFtZSApOworCQl9IGVsc2UgeworCQkJY2FjaGVbIGlk IF0uZGF0YSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLmRhdGEsIG5hbWUgKTsKKwkJfQor CX0KKworCXRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdOworCisJLy8galF1ZXJ5IGRhdGEoKSBpcyBz dG9yZWQgaW4gYSBzZXBhcmF0ZSBvYmplY3QgaW5zaWRlIHRoZSBvYmplY3QncyBpbnRlcm5hbCBk YXRhCisJLy8gY2FjaGUgaW4gb3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMgYmV0d2VlbiBp bnRlcm5hbCBkYXRhIGFuZCB1c2VyLWRlZmluZWQKKwkvLyBkYXRhLgorCWlmICggIXB2dCApIHsK KwkJaWYgKCAhdGhpc0NhY2hlLmRhdGEgKSB7CisJCQl0aGlzQ2FjaGUuZGF0YSA9IHt9OworCQl9 CisKKwkJdGhpc0NhY2hlID0gdGhpc0NhY2hlLmRhdGE7CisJfQorCisJaWYgKCBkYXRhICE9PSB1 bmRlZmluZWQgKSB7CisJCXRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0gPSBk YXRhOworCX0KKworCS8vIENoZWNrIGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1lbCBhbmQgbm9u LWNvbnZlcnRlZCBkYXRhIHByb3BlcnR5IG5hbWVzCisJLy8gSWYgYSBkYXRhIHByb3BlcnR5IHdh cyBzcGVjaWZpZWQKKwlpZiAoIGdldEJ5TmFtZSApIHsKKworCQkvLyBGaXJzdCBUcnkgdG8gZmlu ZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCisJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOworCisJCS8v IFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGEKKwkJaWYgKCByZXQgPT0gbnVs bCApIHsKKworCQkJLy8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHkKKwkJCXJl dCA9IHRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF07CisJCX0KKwl9IGVsc2Ug eworCQlyZXQgPSB0aGlzQ2FjaGU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworZnVuY3Rpb24g aW50ZXJuYWxSZW1vdmVEYXRhKCBlbGVtLCBuYW1lLCBwdnQgKSB7CisJaWYgKCAhalF1ZXJ5LmFj Y2VwdERhdGEoIGVsZW0gKSApIHsKKwkJcmV0dXJuOworCX0KKworCXZhciBpLCBsLCB0aGlzQ2Fj aGUsCisJCWlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCisKKwkJLy8gU2VlIGpRdWVyeS5kYXRhIGZv ciBtb3JlIGluZm9ybWF0aW9uCisJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxl bSwKKwkJaWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFu ZG87CisKKwkvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IG5vIGNhY2hlIGVudHJ5IGZvciB0aGlzIG9i amVjdCwgdGhlcmUgaXMgbm8KKwkvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmcKKwlpZiAoICFjYWNo ZVsgaWQgXSApIHsKKwkJcmV0dXJuOworCX0KKworCWlmICggbmFtZSApIHsKKworCQl0aGlzQ2Fj aGUgPSBwdnQgPyBjYWNoZVsgaWQgXSA6IGNhY2hlWyBpZCBdLmRhdGE7CisKKwkJaWYgKCB0aGlz Q2FjaGUgKSB7CisKKwkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmlu ZyBuYW1lcyBmb3IgZGF0YSBrZXlzCisJCQlpZiAoICFqUXVlcnkuaXNBcnJheSggbmFtZSApICkg eworCisJCQkJLy8gdHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFueSBtYW5pcHVsYXRp b24KKwkJCQlpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkgeworCQkJCQluYW1lID0gWyBuYW1lIF07 CisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyBzcGxpdCB0aGUgY2FtZWwgY2FzZWQgdmVyc2lvbiBi eSBzcGFjZXMgdW5sZXNzIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMKKwkJCQkJbmFtZSA9 IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKKwkJCQkJaWYgKCBuYW1lIGluIHRoaXNDYWNoZSAp IHsKKwkJCQkJCW5hbWUgPSBbIG5hbWUgXTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5hbWUgPSBu YW1lLnNwbGl0KCIgIik7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIElmICJu YW1lIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uCisJCQkJLy8gV2hlbiBkYXRhIGlzIGluaXRpYWxs eSBjcmVhdGVkLCB2aWEgKCJrZXkiLCAidmFsIikgc2lnbmF0dXJlLAorCQkJCS8vIGtleXMgd2ls bCBiZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLgorCQkJCS8vIFNpbmNlIHRoZXJlIGlzIG5vIHdh eSB0byB0ZWxsIF9ob3dfIGEga2V5IHdhcyBhZGRlZCwgcmVtb3ZlCisJCQkJLy8gYm90aCBwbGFp biBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NgorCQkJCS8vIFRoaXMgd2lsbCBvbmx5IHBl bmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRoLgorCQkJCW5hbWUgPSBuYW1lLmNvbmNhdCgg alF1ZXJ5Lm1hcCggbmFtZSwgalF1ZXJ5LmNhbWVsQ2FzZSApICk7CisJCQl9CisKKwkJCWZvciAo IGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJZGVsZXRlIHRoaXND YWNoZVsgbmFtZVtpXSBdOworCQkJfQorCisJCQkvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQg aW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlCisJCQkvLyBhbmQgbGV0IHRoZSBjYWNo ZSBvYmplY3QgaXRzZWxmIGdldCBkZXN0cm95ZWQKKwkJCWlmICggISggcHZ0ID8gaXNFbXB0eURh dGFPYmplY3QgOiBqUXVlcnkuaXNFbXB0eU9iamVjdCApKCB0aGlzQ2FjaGUgKSApIHsKKwkJCQly ZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5m b3JtYXRpb24KKwlpZiAoICFwdnQgKSB7CisJCWRlbGV0ZSBjYWNoZVsgaWQgXS5kYXRhOworCisJ CS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRh dGEgb2JqZWN0CisJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKKwkJaWYg KCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7CisJCQlyZXR1cm47CisJCX0K Kwl9CisKKwkvLyBEZXN0cm95IHRoZSBjYWNoZQorCWlmICggaXNOb2RlICkgeworCQlqUXVlcnku Y2xlYW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApOworCisJLy8gVXNlIGRlbGV0ZSB3aGVuIHN1cHBv cnRlZCBmb3IgZXhwYW5kb3Mgb3IgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgcGVyIGlzV2luZG93 ICgjMTAwODApCisJfSBlbHNlIGlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBj YWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7CisJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKKworCS8vIFdo ZW4gYWxsIGVsc2UgZmFpbHMsIG51bGwKKwl9IGVsc2UgeworCQljYWNoZVsgaWQgXSA9IG51bGw7 CisJfQorfQorCitqUXVlcnkuZXh0ZW5kKHsKKwljYWNoZToge30sCisKKwkvLyBVbmlxdWUgZm9y IGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKKwkvLyBOb24tZGlnaXRzIHJlbW92ZWQg dG8gbWF0Y2ggcmlubGluZWpRdWVyeQorCWV4cGFuZG86ICJqUXVlcnkiICsgKCBjb3JlX3ZlcnNp b24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCisKKwkvLyBUaGUgZm9s bG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CisJLy8g YXR0ZW1wdCB0byBhZGQgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIHRoZW0uCisJbm9EYXRhOiB7CisJ CSJlbWJlZCI6IHRydWUsCisJCS8vIEJhbiBhbGwgb2JqZWN0cyBleGNlcHQgZm9yIEZsYXNoICh3 aGljaCBoYW5kbGUgZXhwYW5kb3MpCisJCSJvYmplY3QiOiAiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0x MWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiwKKwkJImFwcGxldCI6IHRydWUKKwl9LAorCisJaGFzRGF0 YTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCWVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNh Y2hlWyBlbGVtW2pRdWVyeS5leHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKwkJ cmV0dXJuICEhZWxlbSAmJiAhaXNFbXB0eURhdGFPYmplY3QoIGVsZW0gKTsKKwl9LAorCisJZGF0 YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CisJCXJldHVybiBpbnRlcm5hbERhdGEo IGVsZW0sIG5hbWUsIGRhdGEgKTsKKwl9LAorCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0s IG5hbWUgKSB7CisJCXJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUgKTsKKwl9 LAorCisJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorCV9kYXRhOiBmdW5jdGlvbiggZWxlbSwg bmFtZSwgZGF0YSApIHsKKwkJcmV0dXJuIGludGVybmFsRGF0YSggZWxlbSwgbmFtZSwgZGF0YSwg dHJ1ZSApOworCX0sCisKKwlfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJ CXJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHRydWUgKTsKKwl9LAorCisJ Ly8gQSBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhhbmRsZSB0aGUg ZGF0YSBleHBhbmRvCisJYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCS8vIERvIG5v dCBzZXQgZGF0YSBvbiBub24tZWxlbWVudCBiZWNhdXNlIGl0IHdpbGwgbm90IGJlIGNsZWFyZWQg KCM4MzM1KS4KKwkJaWYgKCBlbGVtLm5vZGVUeXBlICYmIGVsZW0ubm9kZVR5cGUgIT09IDEgJiYg ZWxlbS5ub2RlVHlwZSAhPT0gOSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXZhciBu b0RhdGEgPSBlbGVtLm5vZGVOYW1lICYmIGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9M b3dlckNhc2UoKSBdOworCisJCS8vIG5vZGVzIGFjY2VwdCBkYXRhIHVubGVzcyBvdGhlcndpc2Ug c3BlY2lmaWVkOyByZWplY3Rpb24gY2FuIGJlIGNvbmRpdGlvbmFsCisJCXJldHVybiAhbm9EYXRh IHx8IG5vRGF0YSAhPT0gdHJ1ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpID09PSBu b0RhdGE7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWRhdGE6IGZ1bmN0aW9uKCBr ZXksIHZhbHVlICkgeworCQl2YXIgYXR0cnMsIG5hbWUsCisJCQllbGVtID0gdGhpc1swXSwKKwkJ CWkgPSAwLAorCQkJZGF0YSA9IG51bGw7CisKKwkJLy8gR2V0cyBhbGwgdmFsdWVzCisJCWlmICgg a2V5ID09PSB1bmRlZmluZWQgKSB7CisJCQlpZiAoIHRoaXMubGVuZ3RoICkgeworCQkJCWRhdGEg PSBqUXVlcnkuZGF0YSggZWxlbSApOworCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYm ICFqUXVlcnkuX2RhdGEoIGVsZW0sICJwYXJzZWRBdHRycyIgKSApIHsKKwkJCQkJYXR0cnMgPSBl bGVtLmF0dHJpYnV0ZXM7CisJCQkJCWZvciAoIDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkgewor CQkJCQkJbmFtZSA9IGF0dHJzW2ldLm5hbWU7CisKKwkJCQkJCWlmICggIW5hbWUuaW5kZXhPZigg ImRhdGEtIiApICkgeworCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnNsaWNl KDUpICk7CisKKwkJCQkJCQlkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7CisJ CQkJCQl9CisJCQkJCX0KKwkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAicGFyc2VkQXR0cnMiLCB0 cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZGF0YTsKKwkJfQorCisJCS8vIFNldHMg bXVsdGlwbGUgdmFsdWVzCisJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CisJCQly ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXkg KTsKKwkJCX0pOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9u KCB2YWx1ZSApIHsKKworCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJCS8vIFRy eSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAorCQkJCXJldHVybiBl bGVtID8gZGF0YUF0dHIoIGVsZW0sIGtleSwgalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSApICkgOiBu dWxsOworCQkJfQorCisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5LmRhdGEo IHRoaXMsIGtleSwgdmFsdWUgKTsKKwkJCX0pOworCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRz Lmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTsKKwl9LAorCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24o IGtleSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5yZW1v dmVEYXRhKCB0aGlzLCBrZXkgKTsKKwkJfSk7CisJfQorfSk7CisKK2Z1bmN0aW9uIGRhdGFBdHRy KCBlbGVtLCBrZXksIGRhdGEgKSB7CisJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxs eSwgdHJ5IHRvIGZldGNoIGFueQorCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJp YnV0ZQorCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7 CisKKwkJdmFyIG5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEi ICkudG9Mb3dlckNhc2UoKTsKKworCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsK KworCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKKwkJCXRyeSB7CisJCQkJZGF0 YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgorCQkJCQlkYXRhID09PSAiZmFsc2UiID8gZmFs c2UgOgorCQkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoKKwkJCQkJLy8gT25seSBjb252ZXJ0 IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmcKKwkJCQkJK2RhdGEg KyAiIiA9PT0gZGF0YSA/ICtkYXRhIDoKKwkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVy eS5wYXJzZUpTT04oIGRhdGEgKSA6CisJCQkJCQlkYXRhOworCQkJfSBjYXRjaCggZSApIHt9CisK KwkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRl cgorCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOworCisJCX0gZWxzZSB7CisJCQlk YXRhID0gdW5kZWZpbmVkOworCQl9CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKy8vIGNoZWNr cyBhIGNhY2hlIG9iamVjdCBmb3IgZW1wdGluZXNzCitmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVj dCggb2JqICkgeworCXZhciBuYW1lOworCWZvciAoIG5hbWUgaW4gb2JqICkgeworCisJCS8vIGlm IHRoZSBwdWJsaWMgZGF0YSBvYmplY3QgaXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0aWxsIGVt cHR5CisJCWlmICggbmFtZSA9PT0gImRhdGEiICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvYmpb bmFtZV0gKSApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICggbmFtZSAhPT0gInRvSlNPTiIg KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KK2pRdWVy eS5leHRlbmQoeworCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKKwkJdmFy IHF1ZXVlOworCisJCWlmICggZWxlbSApIHsKKwkJCXR5cGUgPSAoIHR5cGUgfHwgImZ4IiApICsg InF1ZXVlIjsKKwkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlICk7CisKKwkJCS8v IFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3Qg YSBsb29rdXAKKwkJCWlmICggZGF0YSApIHsKKwkJCQlpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNB cnJheShkYXRhKSApIHsKKwkJCQkJcXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUsIGpR dWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlxdWV1ZS5wdXNoKCBk YXRhICk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOworCQl9CisJfSwKKwor CWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgeworCQl0eXBlID0gdHlwZSB8fCAiZngi OworCisJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAorCQkJc3RhcnRM ZW5ndGggPSBxdWV1ZS5sZW5ndGgsCisJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCisJCQlob29rcyA9 IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLAorCQkJbmV4dCA9IGZ1bmN0aW9uKCkg eworCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CisJCQl9OworCisJCS8vIElmIHRo ZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGlu ZWwKKwkJaWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgeworCQkJZm4gPSBxdWV1ZS5zaGlmdCgp OworCQkJc3RhcnRMZW5ndGgtLTsKKwkJfQorCisJCWhvb2tzLmN1ciA9IGZuOworCQlpZiAoIGZu ICkgeworCisJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBx dWV1ZSBmcm9tIGJlaW5nCisJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCisJCQlpZiAoIHR5 cGUgPT09ICJmeCIgKSB7CisJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CisJCQl9 CisKKwkJCS8vIGNsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KKwkJCWRlbGV0 ZSBob29rcy5zdG9wOworCQkJZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKKwkJfQorCisJ CWlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgeworCQkJaG9va3MuZW1wdHkuZmlyZSgpOwor CQl9CisJfSwKKworCS8vIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIGNvbnN1bXB0aW9uIC0gZ2Vu ZXJhdGVzIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybnMgdGhlIGN1cnJlbnQgb25lCisJ X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgeworCQl2YXIga2V5ID0gdHlwZSAr ICJxdWV1ZUhvb2tzIjsKKwkJcmV0dXJuIGpRdWVyeS5fZGF0YSggZWxlbSwga2V5ICkgfHwgalF1 ZXJ5Ll9kYXRhKCBlbGVtLCBrZXksIHsKKwkJCWVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNl IG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKKwkJCQlqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0s IHR5cGUgKyAicXVldWUiICk7CisJCQkJalF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBrZXkgKTsK KwkJCX0pCisJCX0pOworCX0KK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlxdWV1ZTogZnVu Y3Rpb24oIHR5cGUsIGRhdGEgKSB7CisJCXZhciBzZXR0ZXIgPSAyOworCisJCWlmICggdHlwZW9m IHR5cGUgIT09ICJzdHJpbmciICkgeworCQkJZGF0YSA9IHR5cGU7CisJCQl0eXBlID0gImZ4IjsK KwkJCXNldHRlci0tOworCQl9CisKKwkJaWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkg eworCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOworCQl9CisKKwkJcmV0 dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/CisJCQl0aGlzIDoKKwkJCXRoaXMuZWFjaChmdW5jdGlv bigpIHsKKwkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsK KworCQkJCS8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCisJCQkJalF1ZXJ5Ll9xdWV1 ZUhvb2tzKCB0aGlzLCB0eXBlICk7CisKKwkJCQlpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVb MF0gIT09ICJpbnByb2dyZXNzIiApIHsKKwkJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUg KTsKKwkJCQl9CisJCQl9KTsKKwl9LAorCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQly ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5 cGUgKTsKKwkJfSk7CisJfSwKKwkvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBI ZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCisJLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5k ZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LworCWRlbGF5OiBmdW5jdGlvbiggdGltZSwgdHlw ZSApIHsKKwkJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0 aW1lIDogdGltZTsKKwkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworCQlyZXR1cm4gdGhpcy5xdWV1 ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgeworCQkJdmFyIHRpbWVvdXQgPSBzZXRU aW1lb3V0KCBuZXh0LCB0aW1lICk7CisJCQlob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7CisJCQkJ Y2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CisJCQl9OworCQl9KTsKKwl9LAorCWNsZWFyUXVldWU6 IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBb XSApOworCX0sCisJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNl cnRhaW4gdHlwZQorCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQor CXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CisJCXZhciB0bXAsCisJCQljb3VudCA9 IDEsCisJCQlkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAorCQkJZWxlbWVudHMgPSB0aGlzLAor CQkJaSA9IHRoaXMubGVuZ3RoLAorCQkJcmVzb2x2ZSA9IGZ1bmN0aW9uKCkgeworCQkJCWlmICgg ISggLS1jb3VudCApICkgeworCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxl bWVudHMgXSApOworCQkJCX0KKwkJCX07CisKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmlu ZyIgKSB7CisJCQlvYmogPSB0eXBlOworCQkJdHlwZSA9IHVuZGVmaW5lZDsKKwkJfQorCQl0eXBl ID0gdHlwZSB8fCAiZngiOworCisJCXdoaWxlKCBpLS0gKSB7CisJCQl0bXAgPSBqUXVlcnkuX2Rh dGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIgKTsKKwkJCWlmICggdG1wICYm IHRtcC5lbXB0eSApIHsKKwkJCQljb3VudCsrOworCQkJCXRtcC5lbXB0eS5hZGQoIHJlc29sdmUg KTsKKwkJCX0KKwkJfQorCQlyZXNvbHZlKCk7CisJCXJldHVybiBkZWZlci5wcm9taXNlKCBvYmog KTsKKwl9Cit9KTsKK3ZhciBub2RlSG9vaywgYm9vbEhvb2ssCisJcmNsYXNzID0gL1tcdFxyXG5d L2csCisJcnJldHVybiA9IC9cci9nLAorCXJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0 ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSwKKwlyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9p LAorCXJib29sZWFuID0gL14oPzpjaGVja2VkfHNlbGVjdGVkfGF1dG9mb2N1c3xhdXRvcGxheXxh c3luY3xjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJl YWRvbmx5fHJlcXVpcmVkfHNjb3BlZCkkL2ksCisJcnVzZURlZmF1bHQgPSAvXig/OmNoZWNrZWR8 c2VsZWN0ZWQpJC9pLAorCWdldFNldEF0dHJpYnV0ZSA9IGpRdWVyeS5zdXBwb3J0LmdldFNldEF0 dHJpYnV0ZSwKKwlnZXRTZXRJbnB1dCA9IGpRdWVyeS5zdXBwb3J0LmlucHV0OworCitqUXVlcnku Zm4uZXh0ZW5kKHsKKwlhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJCXJldHVybiBq UXVlcnkuYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5s ZW5ndGggPiAxICk7CisJfSwKKworCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgeworCQly ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMs IG5hbWUgKTsKKwkJfSk7CisJfSwKKworCXByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsK KwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwg YXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKwl9LAorCisJcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5h bWUgKSB7CisJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisJCXJldHVy biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkvLyB0cnkvY2F0Y2ggaGFuZGxlcyBjYXNlcyB3 aGVyZSBJRSBiYWxrcyAoc3VjaCBhcyByZW1vdmluZyBhIHByb3BlcnR5IG9uIHdpbmRvdykKKwkJ CXRyeSB7CisJCQkJdGhpc1sgbmFtZSBdID0gdW5kZWZpbmVkOworCQkJCWRlbGV0ZSB0aGlzWyBu YW1lIF07CisJCQl9IGNhdGNoKCBlICkge30KKwkJfSk7CisJfSwKKworCWFkZENsYXNzOiBmdW5j dGlvbiggdmFsdWUgKSB7CisJCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLAorCQkJ aSA9IDAsCisJCQlsZW4gPSB0aGlzLmxlbmd0aCwKKwkJCXByb2NlZWQgPSB0eXBlb2YgdmFsdWUg PT09ICJzdHJpbmciICYmIHZhbHVlOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVl ICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgeworCQkJCWpRdWVyeSgg dGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7 CisJCQl9KTsKKwkJfQorCisJCWlmICggcHJvY2VlZCApIHsKKwkJCS8vIFRoZSBkaXNqdW5jdGlv biBoZXJlIGlzIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgcmVtb3ZlQ2xhc3MpCisJ CQljbGFzc2VzID0gKCB2YWx1ZSB8fCAiIiApLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFtd OworCisJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJCQllbGVtID0gdGhpc1sgaSBdOwor CQkJCWN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/CisJCQkJ CSggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNlKCByY2xhc3MsICIgIiApIDoK KwkJCQkJIiAiCisJCQkJKTsKKworCQkJCWlmICggY3VyICkgeworCQkJCQlqID0gMDsKKwkJCQkJ d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgeworCQkJCQkJaWYgKCBjdXIuaW5kZXhP ZiggIiAiICsgY2xhenogKyAiICIgKSA8IDAgKSB7CisJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAi OworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIGN1 ciApOworCisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92 ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNs YXp6LCBqLAorCQkJaSA9IDAsCisJCQlsZW4gPSB0aGlzLmxlbmd0aCwKKwkJCXByb2NlZWQgPSBh cmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFs dWU7CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKKwkJCXJldHVybiB0 aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3Mo IHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKKwkJCX0pOworCQl9CisJ CWlmICggcHJvY2VlZCApIHsKKwkJCWNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIGNv cmVfcm5vdHdoaXRlICkgfHwgW107CisKKwkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQkJ CWVsZW0gPSB0aGlzWyBpIF07CisJCQkJLy8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJl dHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcykKKwkJCQljdXIgPSBlbGVtLm5vZGVU eXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgPworCQkJCQkoICIgIiArIGVsZW0uY2xhc3NO YW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CisJCQkJCSIiCisJCQkJKTsKKwor CQkJCWlmICggY3VyICkgeworCQkJCQlqID0gMDsKKwkJCQkJd2hpbGUgKCAoY2xhenogPSBjbGFz c2VzW2orK10pICkgeworCQkJCQkJLy8gUmVtb3ZlICphbGwqIGluc3RhbmNlcworCQkJCQkJd2hp bGUgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA+PSAwICkgeworCQkJCQkJCWN1 ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CisJCQkJCQl9CisJCQkJ CX0KKwkJCQkJZWxlbS5jbGFzc05hbWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6ICIi OworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwl0b2dnbGVDbGFz czogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKwkJdmFyIHR5cGUgPSB0eXBlb2YgdmFs dWUsCisJCQlpc0Jvb2wgPSB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIjsKKworCQlpZiAo IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5j dGlvbiggaSApIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0 aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOworCQkJfSk7CisJ CX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJaWYgKCB0eXBlID09PSAi c3RyaW5nIiApIHsKKwkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcworCQkJCXZh ciBjbGFzc05hbWUsCisJCQkJCWkgPSAwLAorCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksCisJ CQkJCXN0YXRlID0gc3RhdGVWYWwsCisJCQkJCWNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggY29y ZV9ybm90d2hpdGUgKSB8fCBbXTsKKworCQkJCXdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFt ZXNbIGkrKyBdKSApIHsKKwkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNl IHNlcGFyYXRlZCBsaXN0CisJCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXND bGFzcyggY2xhc3NOYW1lICk7CisJCQkJCXNlbGZbIHN0YXRlID8gImFkZENsYXNzIiA6ICJyZW1v dmVDbGFzcyIgXSggY2xhc3NOYW1lICk7CisJCQkJfQorCisJCQkvLyBUb2dnbGUgd2hvbGUgY2xh c3MgbmFtZQorCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gY29yZV9zdHJ1bmRlZmluZWQgfHwgdHlw ZSA9PT0gImJvb2xlYW4iICkgeworCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7CisJCQkJCS8v IHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKwkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFz c05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CisJCQkJfQorCisJCQkJLy8gSWYgdGhlIGVsZW1l bnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgImZhbHNlIiwKKwkJCQkvLyB0 aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJv dmUgc2F2ZWQgaXQpLgorCQkJCS8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBw cmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksCisJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRo ZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgorCQkJCXRoaXMuY2xhc3NOYW1l ID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIgOiBqUXVlcnkuX2RhdGEo IHRoaXMsICJfX2NsYXNzTmFtZV9fIiApIHx8ICIiOworCQkJfQorCQl9KTsKKwl9LAorCisJaGFz Q2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIGNsYXNzTmFtZSA9ICIgIiArIHNl bGVjdG9yICsgIiAiLAorCQkJaSA9IDAsCisJCQlsID0gdGhpcy5sZW5ndGg7CisJCWZvciAoIDsg aSA8IGw7IGkrKyApIHsKKwkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsg dGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNs YXNzTmFtZSApID49IDAgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1 cm4gZmFsc2U7CisJfSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQl2YXIgcmV0LCBo b29rcywgaXNGdW5jdGlvbiwKKwkJCWVsZW0gPSB0aGlzWzBdOworCisJCWlmICggIWFyZ3VtZW50 cy5sZW5ndGggKSB7CisJCQlpZiAoIGVsZW0gKSB7CisJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9v a3NbIGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2Vy Q2FzZSgpIF07CisKKwkJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBo b29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSkgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJcmV0dXJu IHJldDsKKwkJCQl9CisKKwkJCQlyZXQgPSBlbGVtLnZhbHVlOworCisJCQkJcmV0dXJuIHR5cGVv ZiByZXQgPT09ICJzdHJpbmciID8KKwkJCQkJLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBj YXNlcworCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOgorCQkJCQkvLyBoYW5kbGUgY2Fz ZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKKwkJCQkJcmV0ID09IG51bGwg PyAiIiA6IHJldDsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisKKwkJaXNGdW5jdGlvbiA9IGpR dWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24o IGkgKSB7CisJCQl2YXIgdmFsLAorCQkJCXNlbGYgPSBqUXVlcnkodGhpcyk7CisKKwkJCWlmICgg dGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmICggaXNG dW5jdGlvbiApIHsKKwkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBzZWxmLnZhbCgpICk7 CisJCQl9IGVsc2UgeworCQkJCXZhbCA9IHZhbHVlOworCQkJfQorCisJCQkvLyBUcmVhdCBudWxs L3VuZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZworCQkJaWYgKCB2YWwg PT0gbnVsbCApIHsKKwkJCQl2YWwgPSAiIjsKKwkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09 ICJudW1iZXIiICkgeworCQkJCXZhbCArPSAiIjsKKwkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Fy cmF5KCB2YWwgKSApIHsKKwkJCQl2YWwgPSBqUXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKCB2YWx1 ZSApIHsKKwkJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiI7CisJCQkJ fSk7CisJCQl9CisKKwkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBq UXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOworCisJCQkvLyBJ ZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZworCQkJ aWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWws ICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgeworCQkJCXRoaXMudmFsdWUgPSB2YWw7CisJCQl9 CisJCX0pOworCX0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwl2YWxIb29rczogeworCQlvcHRp b246IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJLy8gYXR0cmlidXRlcy52YWx1 ZSBpcyB1bmRlZmluZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0CisJCQkJLy8gdXNlcyAudmFsdWUu IFNlZSAjNjkzMgorCQkJCXZhciB2YWwgPSBlbGVtLmF0dHJpYnV0ZXMudmFsdWU7CisJCQkJcmV0 dXJuICF2YWwgfHwgdmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CisJCQl9 CisJCX0sCisJCXNlbGVjdDogeworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl2YXIg dmFsdWUsIG9wdGlvbiwKKwkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKKwkJCQkJaW5kZXgg PSBlbGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1v bmUiIHx8IGluZGV4IDwgMCwKKwkJCQkJdmFsdWVzID0gb25lID8gbnVsbCA6IFtdLAorCQkJCQlt YXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCwKKwkJCQkJaSA9IGluZGV4IDwg MCA/CisJCQkJCQltYXggOgorCQkJCQkJb25lID8gaW5kZXggOiAwOworCisJCQkJLy8gTG9vcCB0 aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9ucworCQkJCWZvciAoIDsgaSA8IG1heDsgaSsr ICkgeworCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CisKKwkJCQkJLy8gb2xkSUUgZG9lc24n dCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCisJCQkJCWlmICggKCBv cHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJgorCQkJCQkJCS8vIERvbid0IHJldHVy biBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKKwkJ CQkJCQkoIGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9w dGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwgKSAmJgorCQkJCQkJCSggIW9w dGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJl bnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKKworCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2 YWx1ZSBmb3IgdGhlIG9wdGlvbgorCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgp OworCisJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cworCQkJ CQkJaWYgKCBvbmUgKSB7CisJCQkJCQkJcmV0dXJuIHZhbHVlOworCQkJCQkJfQorCisJCQkJCQkv LyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQorCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVl ICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfSwKKworCQkJc2V0 OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCQkJdmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtl QXJyYXkoIHZhbHVlICk7CisKKwkJCQlqUXVlcnkoZWxlbSkuZmluZCgib3B0aW9uIikuZWFjaChm dW5jdGlvbigpIHsKKwkJCQkJdGhpcy5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnko dGhpcykudmFsKCksIHZhbHVlcyApID49IDA7CisJCQkJfSk7CisKKwkJCQlpZiAoICF2YWx1ZXMu bGVuZ3RoICkgeworCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKKwkJCQl9CisJCQkJcmV0 dXJuIHZhbHVlczsKKwkJCX0KKwkJfQorCX0sCisKKwlhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFt ZSwgdmFsdWUgKSB7CisJCXZhciBob29rcywgbm90eG1sLCByZXQsCisJCQluVHlwZSA9IGVsZW0u bm9kZVR5cGU7CisKKwkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1l bnQgYW5kIGF0dHJpYnV0ZSBub2RlcworCQlpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5U eXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRmFs bGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKwkJaWYgKCB0 eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworCQkJcmV0 dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOworCQl9CisKKwkJbm90eG1sID0g blR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOworCisJCS8vIEFsbCBhdHRy aWJ1dGVzIGFyZSBsb3dlcmNhc2UKKwkJLy8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMg ZGVmaW5lZAorCQlpZiAoIG5vdHhtbCApIHsKKwkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7 CisJCQlob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fCAoIHJib29sZWFuLnRlc3Qo IG5hbWUgKSA/IGJvb2xIb29rIDogbm9kZUhvb2sgKTsKKwkJfQorCisJCWlmICggdmFsdWUgIT09 IHVuZGVmaW5lZCApIHsKKworCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKKwkJCQlqUXVlcnku cmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOworCisJCQl9IGVsc2UgaWYgKCBob29rcyAmJiBub3R4 bWwgJiYgInNldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5h bWUgKSkgIT09IHVuZGVmaW5lZCApIHsKKwkJCQlyZXR1cm4gcmV0OworCisJCQl9IGVsc2Ugewor CQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArICIiICk7CisJCQkJcmV0dXJuIHZh bHVlOworCQkJfQorCisJCX0gZWxzZSBpZiAoIGhvb2tzICYmIG5vdHhtbCAmJiAiZ2V0IiBpbiBo b29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgeworCQkJ cmV0dXJuIHJldDsKKworCQl9IGVsc2UgeworCisJCQkvLyBJbiBJRTkrLCBGbGFzaCBvYmplY3Rz IGRvbid0IGhhdmUgLmdldEF0dHJpYnV0ZSAoIzEyOTQ1KQorCQkJLy8gU3VwcG9ydDogSUU5Kwor CQkJaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IGNvcmVfc3RydW5kZWZpbmVkICkg eworCQkJCXJldCA9ICBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOworCQkJfQorCisJCQkvLyBO b24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVm aW5lZAorCQkJcmV0dXJuIHJldCA9PSBudWxsID8KKwkJCQl1bmRlZmluZWQgOgorCQkJCXJldDsK KwkJfQorCX0sCisKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCXZh ciBuYW1lLCBwcm9wTmFtZSwKKwkJCWkgPSAwLAorCQkJYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFs dWUubWF0Y2goIGNvcmVfcm5vdHdoaXRlICk7CisKKwkJaWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5u b2RlVHlwZSA9PT0gMSApIHsKKwkJCXdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7 CisJCQkJcHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKwkJCQkv LyBCb29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisJCQkJ aWYgKCByYm9vbGVhbi50ZXN0KCBuYW1lICkgKSB7CisJCQkJCS8vIFNldCBjb3JyZXNwb25kaW5n IHByb3BlcnR5IHRvIGZhbHNlIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKKwkJCQkJLy8gQWxzbyBj bGVhciBkZWZhdWx0Q2hlY2tlZC9kZWZhdWx0U2VsZWN0ZWQgKGlmIGFwcHJvcHJpYXRlKSBmb3Ig SUU8OAorCQkJCQlpZiAoICFnZXRTZXRBdHRyaWJ1dGUgJiYgcnVzZURlZmF1bHQudGVzdCggbmFt ZSApICkgeworCQkJCQkJZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSggImRlZmF1bHQtIiArIG5hbWUg KSBdID0KKwkJCQkJCQllbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CisJCQkJCX0gZWxzZSB7CisJ CQkJCQllbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CisJCQkJCX0KKworCQkJCS8vIFNlZSAjOTY5 OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiBy ZW1vdmFsKQorCQkJCX0gZWxzZSB7CisJCQkJCWpRdWVyeS5hdHRyKCBlbGVtLCBuYW1lLCAiIiAp OworCQkJCX0KKworCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBnZXRTZXRBdHRyaWJ1dGUgPyBu YW1lIDogcHJvcE5hbWUgKTsKKwkJCX0KKwkJfQorCX0sCisKKwlhdHRySG9va3M6IHsKKwkJdHlw ZTogeworCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCQkJaWYgKCAhalF1ZXJ5 LnN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gInJhZGlvIiAmJiBqUXVlcnkubm9kZU5h bWUoZWxlbSwgImlucHV0IikgKSB7CisJCQkJCS8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRp byBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKKwkJCQkJ Ly8gUmVzZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVl IGR1cmluZyBjcmVhdGlvbgorCQkJCQl2YXIgdmFsID0gZWxlbS52YWx1ZTsKKwkJCQkJZWxlbS5z ZXRBdHRyaWJ1dGUoICJ0eXBlIiwgdmFsdWUgKTsKKwkJCQkJaWYgKCB2YWwgKSB7CisJCQkJCQll bGVtLnZhbHVlID0gdmFsOworCQkJCQl9CisJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQl9CisJCQl9 CisJCX0KKwl9LAorCisJcHJvcEZpeDogeworCQl0YWJpbmRleDogInRhYkluZGV4IiwKKwkJcmVh ZG9ubHk6ICJyZWFkT25seSIsCisJCSJmb3IiOiAiaHRtbEZvciIsCisJCSJjbGFzcyI6ICJjbGFz c05hbWUiLAorCQltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorCQljZWxsc3BhY2luZzogImNlbGxT cGFjaW5nIiwKKwkJY2VsbHBhZGRpbmc6ICJjZWxsUGFkZGluZyIsCisJCXJvd3NwYW46ICJyb3dT cGFuIiwKKwkJY29sc3BhbjogImNvbFNwYW4iLAorCQl1c2VtYXA6ICJ1c2VNYXAiLAorCQlmcmFt ZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKKwkJY29udGVudGVkaXRhYmxlOiAiY29udGVudEVkaXRh YmxlIgorCX0sCisKKwlwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCXZh ciByZXQsIGhvb2tzLCBub3R4bWwsCisJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CisKKwkJLy8g ZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBu b2RlcworCQlpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBl ID09PSAyICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJbm90eG1sID0gblR5cGUgIT09IDEgfHwg IWpRdWVyeS5pc1hNTERvYyggZWxlbSApOworCisJCWlmICggbm90eG1sICkgeworCQkJLy8gRml4 IG5hbWUgYW5kIGF0dGFjaCBob29rcworCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0g fHwgbmFtZTsKKwkJCWhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOworCQl9CisKKwkJ aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCQkJaWYgKCBob29rcyAmJiAic2V0IiBpbiBo b29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZp bmVkICkgeworCQkJCXJldHVybiByZXQ7CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuICggZWxl bVsgbmFtZSBdID0gdmFsdWUgKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaWYgKCBob29rcyAm JiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBu dWxsICkgeworCQkJCXJldHVybiByZXQ7CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGVsZW1b IG5hbWUgXTsKKwkJCX0KKwkJfQorCX0sCisKKwlwcm9wSG9va3M6IHsKKwkJdGFiSW5kZXg6IHsK KwkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0 IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBs aWNpdGx5IHNldAorCQkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8w OS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFz Y3JpcHQvCisJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRh YmluZGV4Iik7CisKKwkJCQlyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNw ZWNpZmllZCA/CisJCQkJCXBhcnNlSW50KCBhdHRyaWJ1dGVOb2RlLnZhbHVlLCAxMCApIDoKKwkJ CQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBl bGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID8KKwkJCQkJCTAgOgorCQkJCQkJdW5kZWZpbmVk OworCQkJfQorCQl9CisJfQorfSk7CisKKy8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwor Ym9vbEhvb2sgPSB7CisJZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJdmFyCisJCQkv LyBVc2UgLnByb3AgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgYXR0cmlidXRlIGlzIHVuZGVyc3Rvb2Qg YXMgYm9vbGVhbgorCQkJcHJvcCA9IGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lICksCisKKwkJCS8v IEZldGNoIGl0IGFjY29yZGluZ2x5CisJCQlhdHRyID0gdHlwZW9mIHByb3AgPT09ICJib29sZWFu IiAmJiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorCQkJZGV0YWlsID0gdHlwZW9mIHByb3Ag PT09ICJib29sZWFuIiA/CisKKwkJCQlnZXRTZXRJbnB1dCAmJiBnZXRTZXRBdHRyaWJ1dGUgPwor CQkJCQlhdHRyICE9IG51bGwgOgorCQkJCQkvLyBvbGRJRSBmYWJyaWNhdGVzIGFuIGVtcHR5IHN0 cmluZyBmb3IgbWlzc2luZyBib29sZWFuIGF0dHJpYnV0ZXMKKwkJCQkJLy8gYW5kIGNvbmZsYXRl cyBjaGVja2VkL3NlbGVjdGVkIGludG8gYXR0cm9wZXJ0aWVzCisJCQkJCXJ1c2VEZWZhdWx0LnRl c3QoIG5hbWUgKSA/CisJCQkJCQllbGVtWyBqUXVlcnkuY2FtZWxDYXNlKCAiZGVmYXVsdC0iICsg bmFtZSApIF0gOgorCQkJCQkJISFhdHRyIDoKKworCQkJCS8vIGZldGNoIGFuIGF0dHJpYnV0ZSBu b2RlIGZvciBwcm9wZXJ0aWVzIG5vdCByZWNvZ25pemVkIGFzIGJvb2xlYW4KKwkJCQllbGVtLmdl dEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKKworCQlyZXR1cm4gZGV0YWlsICYmIGRldGFpbC52YWx1 ZSAhPT0gZmFsc2UgPworCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKKwkJCXVuZGVmaW5lZDsKKwl9 LAorCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgeworCQlpZiAoIHZhbHVlID09 PSBmYWxzZSApIHsKKwkJCS8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8g ZmFsc2UKKwkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisJCX0gZWxzZSBpZiAo IGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFt ZSApICkgeworCQkJLy8gSUU8OCBuZWVkcyB0aGUgKnByb3BlcnR5KiBuYW1lCisJCQllbGVtLnNl dEF0dHJpYnV0ZSggIWdldFNldEF0dHJpYnV0ZSAmJiBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8 IG5hbWUsIG5hbWUgKTsKKworCQkvLyBVc2UgZGVmYXVsdENoZWNrZWQgYW5kIGRlZmF1bHRTZWxl Y3RlZCBmb3Igb2xkSUUKKwkJfSBlbHNlIHsKKwkJCWVsZW1bIGpRdWVyeS5jYW1lbENhc2UoICJk ZWZhdWx0LSIgKyBuYW1lICkgXSA9IGVsZW1bIG5hbWUgXSA9IHRydWU7CisJCX0KKworCQlyZXR1 cm4gbmFtZTsKKwl9Cit9OworCisvLyBmaXggb2xkSUUgdmFsdWUgYXR0cm9wZXJ0eQoraWYgKCAh Z2V0U2V0SW5wdXQgfHwgIWdldFNldEF0dHJpYnV0ZSApIHsKKwlqUXVlcnkuYXR0ckhvb2tzLnZh bHVlID0geworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQkJdmFyIHJldCA9IGVs ZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOworCQkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSgg ZWxlbSwgImlucHV0IiApID8KKworCQkJCS8vIElnbm9yZSB0aGUgdmFsdWUgKnByb3BlcnR5KiBi eSB1c2luZyBkZWZhdWx0VmFsdWUKKwkJCQllbGVtLmRlZmF1bHRWYWx1ZSA6CisKKwkJCQlyZXQg JiYgcmV0LnNwZWNpZmllZCA/IHJldC52YWx1ZSA6IHVuZGVmaW5lZDsKKwkJfSwKKwkJc2V0OiBm dW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CisJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSgg ZWxlbSwgImlucHV0IiApICkgeworCQkJCS8vIERvZXMgbm90IHJldHVybiBzbyB0aGF0IHNldEF0 dHJpYnV0ZSBpcyBhbHNvIHVzZWQKKwkJCQllbGVtLmRlZmF1bHRWYWx1ZSA9IHZhbHVlOworCQkJ fSBlbHNlIHsKKwkJCQkvLyBVc2Ugbm9kZUhvb2sgaWYgZGVmaW5lZCAoIzE5NTQpOyBvdGhlcndp c2Ugc2V0QXR0cmlidXRlIGlzIGZpbmUKKwkJCQlyZXR1cm4gbm9kZUhvb2sgJiYgbm9kZUhvb2su c2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOworCQkJfQorCQl9CisJfTsKK30KKworLy8gSUU2Lzcg ZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9z ZXRBdHRyaWJ1dGUKK2lmICggIWdldFNldEF0dHJpYnV0ZSApIHsKKworCS8vIFVzZSB0aGlzIGZv ciBhbnkgYXR0cmlidXRlIGluIElFNi83CisJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2 LzcgaXNzdWUKKwlub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7CisJCWdldDog ZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCQl2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVO b2RlKCBuYW1lICk7CisJCQlyZXR1cm4gcmV0ICYmICggbmFtZSA9PT0gImlkIiB8fCBuYW1lID09 PSAibmFtZSIgfHwgbmFtZSA9PT0gImNvb3JkcyIgPyByZXQudmFsdWUgIT09ICIiIDogcmV0LnNw ZWNpZmllZCApID8KKwkJCQlyZXQudmFsdWUgOgorCQkJCXVuZGVmaW5lZDsKKwkJfSwKKwkJc2V0 OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CisJCQkvLyBTZXQgdGhlIGV4aXN0aW5n IG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQorCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0 cmlidXRlTm9kZSggbmFtZSApOworCQkJaWYgKCAhcmV0ICkgeworCQkJCWVsZW0uc2V0QXR0cmli dXRlTm9kZSgKKwkJCQkJKHJldCA9IGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUo IG5hbWUgKSkKKwkJCQkpOworCQkJfQorCisJCQlyZXQudmFsdWUgPSB2YWx1ZSArPSAiIjsKKwor CQkJLy8gQnJlYWsgYXNzb2NpYXRpb24gd2l0aCBjbG9uZWQgZWxlbWVudHMgYnkgYWxzbyB1c2lu ZyBzZXRBdHRyaWJ1dGUgKCM5NjQ2KQorCQkJcmV0dXJuIG5hbWUgPT09ICJ2YWx1ZSIgfHwgdmFs dWUgPT09IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgPworCQkJCXZhbHVlIDoKKwkJCQl1bmRl ZmluZWQ7CisJCX0KKwl9OworCisJLy8gU2V0IGNvbnRlbnRlZGl0YWJsZSB0byBmYWxzZSBvbiBy ZW1vdmFscygjMTA0MjkpCisJLy8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVy cm9yIGFzIGFuIGludmFsaWQgdmFsdWUKKwlqUXVlcnkuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJs ZSA9IHsKKwkJZ2V0OiBub2RlSG9vay5nZXQsCisJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVl LCBuYW1lICkgeworCQkJbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSA9PT0gIiIgPyBmYWxzZSA6 IHZhbHVlLCBuYW1lICk7CisJCX0KKwl9OworCisJLy8gU2V0IHdpZHRoIGFuZCBoZWlnaHQgdG8g YXV0byBpbnN0ZWFkIG9mIDAgb24gZW1wdHkgc3RyaW5nKCBCdWcgIzgxNTAgKQorCS8vIFRoaXMg aXMgZm9yIHJlbW92YWxzCisJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5j dGlvbiggaSwgbmFtZSApIHsKKwkJalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV4 dGVuZCggalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdLCB7CisJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVt LCB2YWx1ZSApIHsKKwkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKKwkJCQkJZWxlbS5zZXRBdHRy aWJ1dGUoIG5hbWUsICJhdXRvIiApOworCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJfQorCQkJfQor CQl9KTsKKwl9KTsKK30KKworCisvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwg Y2FsbCBvbiBJRQorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21z NTM2NDI5JTI4VlMuODUlMjkuYXNweAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6 ZWQgKSB7CisJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBd LCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKwkJalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdID0galF1 ZXJ5LmV4dGVuZCggalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdLCB7CisJCQlnZXQ6IGZ1bmN0aW9u KCBlbGVtICkgeworCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwor CQkJCXJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKKwkJCX0KKwkJfSk7CisJ fSk7CisKKwkvLyBocmVmL3NyYyBwcm9wZXJ0eSBzaG91bGQgZ2V0IHRoZSBmdWxsIG5vcm1hbGl6 ZWQgVVJMICgjMTAyOTkvIzEyOTE1KQorCWpRdWVyeS5lYWNoKFsgImhyZWYiLCAic3JjIiBdLCBm dW5jdGlvbiggaSwgbmFtZSApIHsKKwkJalF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdID0geworCQkJ Z2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5h bWUsIDQgKTsKKwkJCX0KKwkJfTsKKwl9KTsKK30KKworaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5 bGUgKSB7CisJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKKwkJZ2V0OiBmdW5jdGlvbiggZWxl bSApIHsKKwkJCS8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5n CisJCQkvLyBOb3RlOiBJRSB1cHBlcmNhc2VzIGNzcyBwcm9wZXJ0eSBuYW1lcywgYnV0IGlmIHdl IHdlcmUgdG8gLnRvTG93ZXJDYXNlKCkKKwkJCS8vIC5jc3NUZXh0LCB0aGF0IHdvdWxkIGRlc3Ry b3kgY2FzZSBzZW5zdGl0aXZpdHkgaW4gVVJMJ3MsIGxpa2UgaW4gImJhY2tncm91bmQiCisJCQly ZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0IHx8IHVuZGVmaW5lZDsKKwkJfSwKKwkJc2V0OiBmdW5j dGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCQlyZXR1cm4gKCBlbGVtLnN0eWxlLmNzc1RleHQgPSB2 YWx1ZSArICIiICk7CisJCX0KKwl9OworfQorCisvLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRl ZmF1bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYW4gb3B0aW9uCisvLyBBY2Nlc3NpbmcgdGhlIHBh cmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKK2lmICggIWpRdWVyeS5zdXBw b3J0Lm9wdFNlbGVjdGVkICkgeworCWpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSBqUXVlcnku ZXh0ZW5kKCBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkLCB7CisJCWdldDogZnVuY3Rpb24oIGVs ZW0gKSB7CisJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCisJCQlpZiAoIHBhcmVu dCApIHsKKwkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKKworCQkJCS8vIE1ha2Ugc3VyZSB0aGF0 IGl0IGFsc28gd29ya3Mgd2l0aCBvcHRncm91cHMsIHNlZSAjNTcwMQorCQkJCWlmICggcGFyZW50 LnBhcmVudE5vZGUgKSB7CisJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisJ CQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9KTsKK30KKworLy8gSUU2LzcgY2Fs bCBlbmN0eXBlIGVuY29kaW5nCitpZiAoICFqUXVlcnkuc3VwcG9ydC5lbmN0eXBlICkgeworCWpR dWVyeS5wcm9wRml4LmVuY3R5cGUgPSAiZW5jb2RpbmciOworfQorCisvLyBSYWRpb3MgYW5kIGNo ZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tPbiApIHsK KwlqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CisJCWpR dWVyeS52YWxIb29rc1sgdGhpcyBdID0geworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJ CQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0ICIiIGlzIHJldHVybmVkIGluc3Rl YWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAorCQkJCXJldHVybiBlbGVtLmdl dEF0dHJpYnV0ZSgidmFsdWUiKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOworCQkJfQor CQl9OworCX0pOworfQoralF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0 aW9uKCkgeworCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0galF1ZXJ5LmV4dGVuZCggalF1ZXJ5 LnZhbEhvb2tzWyB0aGlzIF0sIHsKKwkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJ CQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgeworCQkJCXJldHVybiAoIGVsZW0uY2hl Y2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCAp OworCQkJfQorCQl9CisJfSk7Cit9KTsKK3ZhciByZm9ybUVsZW1zID0gL14oPzppbnB1dHxzZWxl Y3R8dGV4dGFyZWEpJC9pLAorCXJrZXlFdmVudCA9IC9ea2V5LywKKwlybW91c2VFdmVudCA9IC9e KD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLywKKwlyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNp bmZvY3VzfGZvY3Vzb3V0Ymx1cikkLywKKwlydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/Olwu KC4rKXwpJC87CisKK2Z1bmN0aW9uIHJldHVyblRydWUoKSB7CisJcmV0dXJuIHRydWU7Cit9CisK K2Z1bmN0aW9uIHJldHVybkZhbHNlKCkgeworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEhl bHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVi bGljIGludGVyZmFjZS4KKyAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFy eSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuCisgKi8KK2pRdWVyeS5ldmVudCA9IHsKKworCWdsb2Jh bDoge30sCisKKwlhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2Vs ZWN0b3IgKSB7CisJCXZhciB0bXAsIGV2ZW50cywgdCwgaGFuZGxlT2JqSW4sCisJCQlzcGVjaWFs LCBldmVudEhhbmRsZSwgaGFuZGxlT2JqLAorCQkJaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMs IG9yaWdUeXBlLAorCQkJZWxlbURhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKKworCQkvLyBE b24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBh bGxvdyBwbGFpbiBvYmplY3RzKQorCQlpZiAoICFlbGVtRGF0YSApIHsKKwkJCXJldHVybjsKKwkJ fQorCisJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4g bGlldSBvZiB0aGUgaGFuZGxlcgorCQlpZiAoIGhhbmRsZXIuaGFuZGxlciApIHsKKwkJCWhhbmRs ZU9iakluID0gaGFuZGxlcjsKKwkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOworCQkJ c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0 aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBs YXRlcgorCQlpZiAoICFoYW5kbGVyLmd1aWQgKSB7CisJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnku Z3VpZCsrOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBh bmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAorCQlpZiAoICEoZXZlbnRzID0g ZWxlbURhdGEuZXZlbnRzKSApIHsKKwkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9Owor CQl9CisJCWlmICggIShldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSkgKSB7CisJCQlldmVu dEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkgeworCQkJCS8vIERpc2Nh cmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kCisJCQkJ Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAorCQkJ CXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBjb3JlX3N0cnVuZGVmaW5lZCAmJiAoIWUgfHwgalF1 ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlKSA/CisJCQkJCWpRdWVyeS5ldmVudC5kaXNw YXRjaC5hcHBseSggZXZlbnRIYW5kbGUuZWxlbSwgYXJndW1lbnRzICkgOgorCQkJCQl1bmRlZmlu ZWQ7CisJCQl9OworCQkJLy8gQWRkIGVsZW0gYXMgYSBwcm9wZXJ0eSBvZiB0aGUgaGFuZGxlIGZu IHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhayB3aXRoIElFIG5vbi1uYXRpdmUgZXZlbnRzCisJCQll dmVudEhhbmRsZS5lbGVtID0gZWxlbTsKKwkJfQorCisJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVu dHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKKwkJLy8galF1ZXJ5KC4uLikuYmluZCgibW91c2VvdmVy IG1vdXNlb3V0IiwgZm4pOworCQl0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggY29yZV9y bm90d2hpdGUgKSB8fCBbIiJdOworCQl0ID0gdHlwZXMubGVuZ3RoOworCQl3aGlsZSAoIHQtLSAp IHsKKwkJCXRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CisJCQl0 eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07CisJCQluYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIg KS5zcGxpdCggIi4iICkuc29ydCgpOworCisJCQkvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBl LCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUKKwkJ CXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworCisJCQkvLyBJ ZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3Ro ZXJ3aXNlIGdpdmVuIHR5cGUKKwkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0 ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKworCQkJLy8gVXBkYXRlIHNwZWNp YWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZQorCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5z cGVjaWFsWyB0eXBlIF0gfHwge307CisKKwkJCS8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxs IGV2ZW50IGhhbmRsZXJzCisJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKHsKKwkJCQl0eXBl OiB0eXBlLAorCQkJCW9yaWdUeXBlOiBvcmlnVHlwZSwKKwkJCQlkYXRhOiBkYXRhLAorCQkJCWhh bmRsZXI6IGhhbmRsZXIsCisJCQkJZ3VpZDogaGFuZGxlci5ndWlkLAorCQkJCXNlbGVjdG9yOiBz ZWxlY3RvciwKKwkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNo Lm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAorCQkJCW5hbWVzcGFjZTogbmFtZXNwYWNl cy5qb2luKCIuIikKKwkJCX0sIGhhbmRsZU9iakluICk7CisKKwkJCS8vIEluaXQgdGhlIGV2ZW50 IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0CisJCQlpZiAoICEoaGFuZGxlcnMgPSBl dmVudHNbIHR5cGUgXSkgKSB7CisJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdOwor CQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOworCisJCQkJLy8gT25seSB1c2UgYWRkRXZl bnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1 cm5zIGZhbHNlCisJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwo IGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgeworCQkJ CQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAorCQkJCQlp ZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5l ciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CisKKwkJCQkJfSBlbHNlIGlmICggZWxlbS5h dHRhY2hFdmVudCApIHsKKwkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVu dEhhbmRsZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoIHNwZWNpYWwuYWRkICkg eworCQkJCXNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworCisJCQkJaWYgKCAh aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKKwkJCQkJaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9 IGhhbmRsZXIuZ3VpZDsKKwkJCQl9CisJCQl9CisKKwkJCS8vIEFkZCB0byB0aGUgZWxlbWVudCdz IGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250CisJCQlpZiAoIHNlbGVjdG9yICkgewor CQkJCWhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVP YmogKTsKKwkJCX0gZWxzZSB7CisJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CisJCQl9 CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQs IGZvciBldmVudCBvcHRpbWl6YXRpb24KKwkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9 IHRydWU7CisJCX0KKworCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3Mg aW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQg b2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVz LCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CisJCXZhciBqLCBoYW5kbGVPYmos IHRtcCwKKwkJCW9yaWdDb3VudCwgdCwgZXZlbnRzLAorCQkJc3BlY2lhbCwgaGFuZGxlcnMsIHR5 cGUsCisJCQluYW1lc3BhY2VzLCBvcmlnVHlwZSwKKwkJCWVsZW1EYXRhID0galF1ZXJ5Lmhhc0Rh dGEoIGVsZW0gKSAmJiBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKKworCQlpZiAoICFlbGVtRGF0YSB8 fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkv LyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0 dGVkCisJCXR5cGVzID0gKCB0eXBlcyB8fCAiIiApLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8 IFsiIl07CisJCXQgPSB0eXBlcy5sZW5ndGg7CisJCXdoaWxlICggdC0tICkgeworCQkJdG1wID0g cnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKKwkJCXR5cGUgPSBvcmlnVHlw ZSA9IHRtcFsxXTsKKwkJCW5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIg KS5zb3J0KCk7CisKKwkJCS8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwg aWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudAorCQkJaWYgKCAhdHlwZSApIHsKKwkJCQlmb3Ig KCB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlw ZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7CisJCQkJfQorCQkJCWNv bnRpbnVlOworCQkJfQorCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUg XSB8fCB7fTsKKwkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBz cGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKwkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0g fHwgW107CisJCQl0bXAgPSB0bXBbMl0gJiYgbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNw YWNlcy5qb2luKCJcXC4oPzouKlxcLnwpIikgKyAiKFxcLnwkKSIgKTsKKworCQkJLy8gUmVtb3Zl IG1hdGNoaW5nIGV2ZW50cworCQkJb3JpZ0NvdW50ID0gaiA9IGhhbmRsZXJzLmxlbmd0aDsKKwkJ CXdoaWxlICggai0tICkgeworCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CisKKwkJCQlp ZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYm CisJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYm CisJCQkJCSggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiYKKwkJ CQkJKCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxl Y3RvciA9PT0gIioqIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHsKKwkJCQkJaGFuZGxlcnMu c3BsaWNlKCBqLCAxICk7CisKKwkJCQkJaWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7CisJCQkJ CQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CisJCQkJCX0KKwkJCQkJaWYgKCBzcGVjaWFsLnJl bW92ZSApIHsKKwkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwor CQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVy IGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CisJCQkv LyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwg b2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKKwkJCWlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVy cy5sZW5ndGggKSB7CisJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJk b3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSAp IHsKKwkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUg KTsKKwkJCQl9CisKKwkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CisJCQl9CisJCX0KKworCQkv LyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAorCQlpZiAoIGpRdWVy eS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKKwkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7 CisKKwkJCS8vIHJlbW92ZURhdGEgYWxzbyBjaGVja3MgZm9yIGVtcHRpbmVzcyBhbmQgY2xlYXJz IHRoZSBleHBhbmRvIGlmIGVtcHR5CisJCQkvLyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxldGUK KwkJCWpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwgImV2ZW50cyIgKTsKKwkJfQorCX0sCisKKwl0 cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHsKKwkJ dmFyIGhhbmRsZSwgb250eXBlLCBjdXIsCisJCQlidWJibGVUeXBlLCBzcGVjaWFsLCB0bXAsIGks CisJCQlldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSwKKwkJCXR5cGUgPSBjb3JlX2hh c093bi5jYWxsKCBldmVudCwgInR5cGUiICkgPyBldmVudC50eXBlIDogZXZlbnQsCisJCQluYW1l c3BhY2VzID0gY29yZV9oYXNPd24uY2FsbCggZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5u YW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOworCisJCWN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8 IGRvY3VtZW50OworCisJCS8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5v ZGVzCisJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkg eworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9v dXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93CisJCWlmICggcmZvY3Vz TW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHsKKwkJCXJldHVy bjsKKwkJfQorCisJCWlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKKwkJCS8vIE5hbWVz cGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFu ZGxlKCkKKwkJCW5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQl0eXBlID0gbmFtZXNw YWNlcy5zaGlmdCgpOworCQkJbmFtZXNwYWNlcy5zb3J0KCk7CisJCX0KKwkJb250eXBlID0gdHlw ZS5pbmRleE9mKCI6IikgPCAwICYmICJvbiIgKyB0eXBlOworCisJCS8vIENhbGxlciBjYW4gcGFz cyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBl IHN0cmluZworCQlldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KKwkJCWV2ZW50IDoK KwkJCW5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgJiYg ZXZlbnQgKTsKKworCQlldmVudC5pc1RyaWdnZXIgPSB0cnVlOworCQlldmVudC5uYW1lc3BhY2Ug PSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKKwkJZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFt ZXNwYWNlID8KKwkJCW5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwu KD86LipcXC58KSIpICsgIihcXC58JCkiICkgOgorCQkJbnVsbDsKKworCQkvLyBDbGVhbiB1cCB0 aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWQKKwkJZXZlbnQucmVzdWx0ID0gdW5k ZWZpbmVkOworCQlpZiAoICFldmVudC50YXJnZXQgKSB7CisJCQlldmVudC50YXJnZXQgPSBlbGVt OworCQl9CisKKwkJLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2 ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAorCQlkYXRhID0gZGF0YSA9PSBudWxs ID8KKwkJCVsgZXZlbnQgXSA6CisJCQlqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0g KTsKKworCQkvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVz CisJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworCQlpZiAo ICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBs eSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIERl dGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRz IHNwZWMgKCM5OTUxKQorCQkvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93 OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KQorCQlpZiAoICFv bmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxl bSApICkgeworCisJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsK KwkJCWlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7CisJCQkJ Y3VyID0gY3VyLnBhcmVudE5vZGU7CisJCQl9CisJCQlmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBh cmVudE5vZGUgKSB7CisJCQkJZXZlbnRQYXRoLnB1c2goIGN1ciApOworCQkJCXRtcCA9IGN1cjsK KwkJCX0KKworCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5n Liwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCisJCQlpZiAoIHRtcCA9PT0gKGVsZW0u b3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7CisJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5k ZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOworCQkJfQorCQl9CisK KwkJLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aAorCQlpID0gMDsKKwkJd2hpbGUg KCAoY3VyID0gZXZlbnRQYXRoW2krK10pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgp ICkgeworCisJCQlldmVudC50eXBlID0gaSA+IDEgPworCQkJCWJ1YmJsZVR5cGUgOgorCQkJCXNw ZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKKworCQkJLy8galF1ZXJ5IGhhbmRsZXIKKwkJCWhhbmRs ZSA9ICggalF1ZXJ5Ll9kYXRhKCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBd ICYmIGpRdWVyeS5fZGF0YSggY3VyLCAiaGFuZGxlIiApOworCQkJaWYgKCBoYW5kbGUgKSB7CisJ CQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKwkJCX0KKworCQkJLy8gTmF0aXZlIGhhbmRs ZXIKKwkJCWhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOworCQkJaWYgKCBoYW5kbGUg JiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICYmIGhhbmRsZS5hcHBseSAmJiBoYW5kbGUuYXBw bHkoIGN1ciwgZGF0YSApID09PSBmYWxzZSApIHsKKwkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgp OworCQkJfQorCQl9CisJCWV2ZW50LnR5cGUgPSB0eXBlOworCisJCS8vIElmIG5vYm9keSBwcmV2 ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cKKwkJaWYgKCAhb25seUhhbmRsZXJz ICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKKworCQkJaWYgKCAoIXNwZWNpYWwu X2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZWxlbS5vd25lckRvY3VtZW50LCBk YXRhICkgPT09IGZhbHNlKSAmJgorCQkJCSEodHlwZSA9PT0gImNsaWNrIiAmJiBqUXVlcnkubm9k ZU5hbWUoIGVsZW0sICJhIiApKSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworCisJ CQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2Ft ZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgorCQkJCS8vIENhbid0IHVzZSBhbiAuaXNGdW5jdGlv bigpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCisJCQkJLy8gRG9u J3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJp YWJsZXMgYmUgKCM2MTcwKQorCQkJCWlmICggb250eXBlICYmIGVsZW1bIHR5cGUgXSAmJiAhalF1 ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisKKwkJCQkJLy8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBv bkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZAorCQkJCQl0bXAgPSBlbGVt WyBvbnR5cGUgXTsKKworCQkJCQlpZiAoIHRtcCApIHsKKwkJCQkJCWVsZW1bIG9udHlwZSBdID0g bnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2Ft ZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCisJCQkJCWpRdWVyeS5l dmVudC50cmlnZ2VyZWQgPSB0eXBlOworCQkJCQl0cnkgeworCQkJCQkJZWxlbVsgdHlwZSBdKCk7 CisJCQkJCX0gY2F0Y2ggKCBlICkgeworCQkJCQkJLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIg dG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2LCMxMjUxOCkKKwkJCQkJCS8vIG9ubHkgcmVwcm9kdWNp YmxlIG9uIHdpblhQIElFOCBuYXRpdmUsIG5vdCBJRTkgaW4gSUU4IG1vZGUKKwkJCQkJfQorCQkJ CQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOworCisJCQkJCWlmICggdG1wICkg eworCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0K KworCQlyZXR1cm4gZXZlbnQucmVzdWx0OworCX0sCisKKwlkaXNwYXRjaDogZnVuY3Rpb24oIGV2 ZW50ICkgeworCisJCS8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0 aXZlIGV2ZW50IG9iamVjdAorCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICk7CisK KwkJdmFyIGksIHJldCwgaGFuZGxlT2JqLCBtYXRjaGVkLCBqLAorCQkJaGFuZGxlclF1ZXVlID0g W10sCisJCQlhcmdzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKKwkJCWhhbmRsZXJz ID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBd IHx8IFtdLAorCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0g fHwge307CisKKwkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRo ZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKKwkJYXJnc1swXSA9IGV2ZW50OworCQlldmVudC5k ZWxlZ2F0ZVRhcmdldCA9IHRoaXM7CisKKwkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBm b3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAorCQlpZiAoIHNw ZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVu dCApID09PSBmYWxzZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIERldGVybWluZSBoYW5k bGVycworCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywg ZXZlbnQsIGhhbmRsZXJzICk7CisKKwkJLy8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkg d2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXMKKwkJaSA9IDA7CisJCXdoaWxlICgg KG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0 b3BwZWQoKSApIHsKKwkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CisKKwkJ CWogPSAwOworCQkJd2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0p ICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCisJCQkJLy8g VHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgorCQkJ CS8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRo ZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgorCQkJCWlmICggIWV2 ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5h bWVzcGFjZSApICkgeworCisJCQkJCWV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajsKKwkJCQkJ ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOworCisJCQkJCXJldCA9ICggKGpRdWVyeS5ldmVu dC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9i ai5oYW5kbGVyICkKKwkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOworCisJCQkJ CWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCQlpZiAoIChldmVudC5yZXN1bHQgPSBy ZXQpID09PSBmYWxzZSApIHsKKwkJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJ CWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQor CQl9CisKKwkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlw ZQorCQlpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkgeworCQkJc3BlY2lhbC5wb3N0RGlzcGF0 Y2guY2FsbCggdGhpcywgZXZlbnQgKTsKKwkJfQorCisJCXJldHVybiBldmVudC5yZXN1bHQ7CisJ fSwKKworCWhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkgeworCQl2YXIgc2Vs LCBoYW5kbGVPYmosIG1hdGNoZXMsIGksCisJCQloYW5kbGVyUXVldWUgPSBbXSwKKwkJCWRlbGVn YXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAorCQkJY3VyID0gZXZlbnQudGFyZ2V0 OworCisJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKKwkJLy8gQmxhY2staG9sZSBTVkcgPHVz ZT4gaW5zdGFuY2UgdHJlZXMgKCMxMzE4MCkKKwkJLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnVi YmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpCisJCWlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9k ZVR5cGUgJiYgKCFldmVudC5idXR0b24gfHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7CisK KwkJCWZvciAoIDsgY3VyICE9IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7 CisKKwkJCQkvLyBEb24ndCBjaGVjayBub24tZWxlbWVudHMgKCMxMzIwOCkKKwkJCQkvLyBEb24n dCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEz ODIsICMxMTc2NCkKKwkJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAoY3VyLmRpc2FibGVk ICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkgeworCQkJCQltYXRjaGVzID0g W107CisJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgeworCQkJCQkJ aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTsKKworCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0 aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKKwkJCQkJCXNlbCA9IGhhbmRs ZU9iai5zZWxlY3RvciArICIgIjsKKworCQkJCQkJaWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5k ZWZpbmVkICkgeworCQkJCQkJCW1hdGNoZXNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4 dCA/CisJCQkJCQkJCWpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOgorCQkJ CQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOworCQkJ CQkJfQorCQkJCQkJaWYgKCBtYXRjaGVzWyBzZWwgXSApIHsKKwkJCQkJCQltYXRjaGVzLnB1c2go IGhhbmRsZU9iaiApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICggbWF0Y2hlcy5sZW5ndGgg KSB7CisJCQkJCQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNo ZXMgfSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGQgdGhlIHJlbWFpbmlu ZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzCisJCWlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRs ZXJzLmxlbmd0aCApIHsKKwkJCWhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogdGhpcywgaGFuZGxl cnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSk7CisJCX0KKworCQlyZXR1cm4g aGFuZGxlclF1ZXVlOworCX0sCisKKwlmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJaWYgKCBl dmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHsKKwkJCXJldHVybiBldmVudDsKKwkJfQorCisJCS8v IENyZWF0ZSBhIHdyaXRhYmxlIGNvcHkgb2YgdGhlIGV2ZW50IG9iamVjdCBhbmQgbm9ybWFsaXpl IHNvbWUgcHJvcGVydGllcworCQl2YXIgaSwgcHJvcCwgY29weSwKKwkJCXR5cGUgPSBldmVudC50 eXBlLAorCQkJb3JpZ2luYWxFdmVudCA9IGV2ZW50LAorCQkJZml4SG9vayA9IHRoaXMuZml4SG9v a3NbIHR5cGUgXTsKKworCQlpZiAoICFmaXhIb29rICkgeworCQkJdGhpcy5maXhIb29rc1sgdHlw ZSBdID0gZml4SG9vayA9CisJCQkJcm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3Vz ZUhvb2tzIDoKKwkJCQlya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5rZXlIb29rcyA6CisJ CQkJe307CisJCX0KKwkJY29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCgg Zml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wczsKKworCQlldmVudCA9IG5ldyBqUXVlcnkuRXZl bnQoIG9yaWdpbmFsRXZlbnQgKTsKKworCQlpID0gY29weS5sZW5ndGg7CisJCXdoaWxlICggaS0t ICkgeworCQkJcHJvcCA9IGNvcHlbIGkgXTsKKwkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2 ZW50WyBwcm9wIF07CisJCX0KKworCQkvLyBTdXBwb3J0OiBJRTw5CisJCS8vIEZpeCB0YXJnZXQg cHJvcGVydHkgKCMxOTI1KQorCQlpZiAoICFldmVudC50YXJnZXQgKSB7CisJCQlldmVudC50YXJn ZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CisJCX0KKworCQkvLyBT dXBwb3J0OiBDaHJvbWUgMjMrLCBTYWZhcmk/CisJCS8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEg dGV4dCBub2RlICgjNTA0LCAjMTMxNDMpCisJCWlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09 PSAzICkgeworCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CisJCX0K KworCQkvLyBTdXBwb3J0OiBJRTw5CisJCS8vIEZvciBtb3VzZS9rZXkgZXZlbnRzLCBtZXRhS2V5 PT1mYWxzZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgsICMxMTMyOCkKKwkJZXZlbnQubWV0YUtl eSA9ICEhZXZlbnQubWV0YUtleTsKKworCQlyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29r LmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50OworCX0sCisKKwkvLyBJbmNs dWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudAor CXByb3BzOiAiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQg ZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFt cCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLAorCisJZml4SG9va3M6IHt9LAorCisJa2V5SG9va3M6 IHsKKwkJcHJvcHM6ICJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLAorCQlm aWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CisKKwkJCS8vIEFkZCB3aGljaCBm b3Iga2V5IGV2ZW50cworCQkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICkgeworCQkJCWV2ZW50 LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDog b3JpZ2luYWwua2V5Q29kZTsKKwkJCX0KKworCQkJcmV0dXJuIGV2ZW50OworCQl9CisJfSwKKwor CW1vdXNlSG9va3M6IHsKKwkJcHJvcHM6ICJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkg ZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0 b0VsZW1lbnQiLnNwbGl0KCIgIiksCisJCWZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5h bCApIHsKKwkJCXZhciBib2R5LCBldmVudERvYywgZG9jLAorCQkJCWJ1dHRvbiA9IG9yaWdpbmFs LmJ1dHRvbiwKKwkJCQlmcm9tRWxlbWVudCA9IG9yaWdpbmFsLmZyb21FbGVtZW50OworCisJCQkv LyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlCisJ CQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkg eworCQkJCWV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7 CisJCQkJZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OworCQkJCWJvZHkgPSBldmVudERv Yy5ib2R5OworCisJCQkJZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYg ZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2Mg JiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApOworCQkJ CWV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3Ag IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRU b3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTsKKwkJCX0KKworCQkJLy8gQWRk IHJlbGF0ZWRUYXJnZXQsIGlmIG5lY2Vzc2FyeQorCQkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdl dCAmJiBmcm9tRWxlbWVudCApIHsKKwkJCQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbUVsZW1l bnQgPT09IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZyb21FbGVtZW50Owor CQkJfQorCisJCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRk bGU7IDMgPT09IHJpZ2h0CisJCQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNv IGRvbid0IHVzZSBpdAorCQkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmlu ZWQgKSB7CisJCQkJZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAy ID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApOworCQkJfQorCisJCQlyZXR1cm4gZXZl bnQ7CisJCX0KKwl9LAorCisJc3BlY2lhbDogeworCQlsb2FkOiB7CisJCQkvLyBQcmV2ZW50IHRy aWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkCisJ CQlub0J1YmJsZTogdHJ1ZQorCQl9LAorCQljbGljazogeworCQkJLy8gRm9yIGNoZWNrYm94LCBm aXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKKwkJCXRyaWdn ZXI6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiaW5wdXQi ICkgJiYgdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgKSB7CisJCQkJCXRo aXMuY2xpY2soKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfSwKKwkJZm9j dXM6IHsKKwkJCS8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMg c2VxdWVuY2UgaXMgY29ycmVjdAorCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCB0 aGlzICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIHRoaXMuZm9jdXMgKSB7CisJCQkJCXRy eSB7CisJCQkJCQl0aGlzLmZvY3VzKCk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0gY2F0 Y2ggKCBlICkgeworCQkJCQkJLy8gU3VwcG9ydDogSUU8OQorCQkJCQkJLy8gSWYgd2UgZXJyb3Ig b24gZm9jdXMgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2LCAjMTI1MTgpLAorCQkJCQkJLy8gbGV0 IC50cmlnZ2VyKCkgcnVuIHRoZSBoYW5kbGVycworCQkJCQl9CisJCQkJfQorCQkJfSwKKwkJCWRl bGVnYXRlVHlwZTogImZvY3VzaW4iCisJCX0sCisJCWJsdXI6IHsKKwkJCXRyaWdnZXI6IGZ1bmN0 aW9uKCkgeworCQkJCWlmICggdGhpcyA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiB0aGlz LmJsdXIgKSB7CisJCQkJCXRoaXMuYmx1cigpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQor CQkJfSwKKwkJCWRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IgorCQl9LAorCisJCWJlZm9yZXVubG9h ZDogeworCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CisKKwkJCQkvLyBFdmVu IHdoZW4gcmV0dXJuVmFsdWUgZXF1YWxzIHRvIHVuZGVmaW5lZCBGaXJlZm94IHdpbGwgc3RpbGwg c2hvdyBhbGVydAorCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJ CWV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7CisJCQkJfQor CQkJfQorCQl9CisJfSwKKworCXNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQs IGJ1YmJsZSApIHsKKwkJLy8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUg YSBkaWZmZXJlbnQgb25lLgorCQkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3In cyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUKKwkJLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZl bnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuCisJCXZhciBlID0g alF1ZXJ5LmV4dGVuZCgKKwkJCW5ldyBqUXVlcnkuRXZlbnQoKSwKKwkJCWV2ZW50LAorCQkJeyB0 eXBlOiB0eXBlLAorCQkJCWlzU2ltdWxhdGVkOiB0cnVlLAorCQkJCW9yaWdpbmFsRXZlbnQ6IHt9 CisJCQl9CisJCSk7CisJCWlmICggYnViYmxlICkgeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIo IGUsIG51bGwsIGVsZW0gKTsKKwkJfSBlbHNlIHsKKwkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5j YWxsKCBlbGVtLCBlICk7CisJCX0KKwkJaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewor CQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJfQorCX0KK307CisKK2pRdWVyeS5yZW1vdmVF dmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPworCWZ1bmN0aW9uKCBlbGVtLCB0 eXBlLCBoYW5kbGUgKSB7CisJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgeworCQkJ ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CisJCX0KKwl9 IDoKKwlmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgeworCQl2YXIgbmFtZSA9ICJvbiIg KyB0eXBlOworCisJCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKKworCQkJLy8gIzg1NDUsICM3 MDU0LCBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcyBmb3IgY3VzdG9tIGV2ZW50cyBpbiBJRTYtOAor CQkJLy8gZGV0YWNoRXZlbnQgbmVlZGVkIHByb3BlcnR5IG9uIGVsZW1lbnQsIGJ5IG5hbWUgb2Yg dGhhdCBldmVudCwgdG8gcHJvcGVybHkgZXhwb3NlIGl0IHRvIEdDCisJCQlpZiAoIHR5cGVvZiBl bGVtWyBuYW1lIF0gPT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworCQkJCWVsZW1bIG5hbWUgXSA9 IG51bGw7CisJCQl9CisKKwkJCWVsZW0uZGV0YWNoRXZlbnQoIG5hbWUsIGhhbmRsZSApOworCQl9 CisJfTsKKworalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CisJLy8gQWxs b3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCisJaWYgKCAhKHRoaXMg aW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQpICkgeworCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCgg c3JjLCBwcm9wcyApOworCX0KKworCS8vIEV2ZW50IG9iamVjdAorCWlmICggc3JjICYmIHNyYy50 eXBlICkgeworCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisJCXRoaXMudHlwZSA9IHNyYy50 eXBlOworCisJCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVl biBtYXJrZWQgYXMgcHJldmVudGVkCisJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0 cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgorCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRl ZCA9ICggc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8 fAorCQkJc3JjLmdldFByZXZlbnREZWZhdWx0ICYmIHNyYy5nZXRQcmV2ZW50RGVmYXVsdCgpICkg PyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7CisKKwkvLyBFdmVudCB0eXBlCisJfSBlbHNlIHsK KwkJdGhpcy50eXBlID0gc3JjOworCX0KKworCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHBy b3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CisJaWYgKCBwcm9wcyApIHsKKwkJalF1ZXJ5 LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKKwl9CisKKwkvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYg aW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQorCXRoaXMudGltZVN0YW1wID0gc3JjICYm IHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOworCisJLy8gTWFyayBpdCBhcyBmaXhlZAor CXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlz IGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5n dWFnZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0z LUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5w cm90b3R5cGUgPSB7CisJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKwlpc1Byb3Bh Z2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisJaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3Bw ZWQ6IHJldHVybkZhbHNlLAorCisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworCQl2YXIg ZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKworCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJl dHVyblRydWU7CisJCWlmICggIWUgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBJZiBwcmV2 ZW50RGVmYXVsdCBleGlzdHMsIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKCBl LnByZXZlbnREZWZhdWx0ICkgeworCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCisJCS8vIFN1cHBv cnQ6IElFCisJCS8vIE90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRo ZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZQorCQl9IGVsc2UgeworCQkJZS5yZXR1cm5WYWx1ZSA9 IGZhbHNlOworCQl9CisJfSwKKwlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl2YXIg ZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKworCQl0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0g cmV0dXJuVHJ1ZTsKKwkJaWYgKCAhZSApIHsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBJZiBzdG9w UHJvcGFnYXRpb24gZXhpc3RzLCBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmICgg ZS5zdG9wUHJvcGFnYXRpb24gKSB7CisJCQllLnN0b3BQcm9wYWdhdGlvbigpOworCQl9CisKKwkJ Ly8gU3VwcG9ydDogSUUKKwkJLy8gU2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhl IG9yaWdpbmFsIGV2ZW50IHRvIHRydWUKKwkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOworCX0sCisJ c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKKwkJdGhpcy5pc0ltbWVkaWF0 ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CisJCXRoaXMuc3RvcFByb3BhZ2F0aW9u KCk7CisJfQorfTsKKworLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1v dXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzCitqUXVlcnkuZWFjaCh7CisJbW91c2Vl bnRlcjogIm1vdXNlb3ZlciIsCisJbW91c2VsZWF2ZTogIm1vdXNlb3V0IgorfSwgZnVuY3Rpb24o IG9yaWcsIGZpeCApIHsKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0geworCQlkZWxl Z2F0ZVR5cGU6IGZpeCwKKwkJYmluZFR5cGU6IGZpeCwKKworCQloYW5kbGU6IGZ1bmN0aW9uKCBl dmVudCApIHsKKwkJCXZhciByZXQsCisJCQkJdGFyZ2V0ID0gdGhpcywKKwkJCQlyZWxhdGVkID0g ZXZlbnQucmVsYXRlZFRhcmdldCwKKwkJCQloYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7CisK KwkJCS8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlz IG91dHNpZGUgdGhlIHRhcmdldC4KKwkJCS8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBt b3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93CisJCQlpZiAoICFyZWxhdGVkIHx8 IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVk ICkpICkgeworCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7CisJCQkJcmV0ID0g aGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJCWV2ZW50LnR5 cGUgPSBmaXg7CisJCQl9CisJCQlyZXR1cm4gcmV0OworCQl9CisJfTsKK30pOworCisvLyBJRSBz dWJtaXQgZGVsZWdhdGlvbgoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyApIHsK KworCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKKwkJc2V0dXA6IGZ1bmN0aW9uKCkg eworCQkJLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMK KwkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKKwkJCQlyZXR1cm4g ZmFsc2U7CisJCQl9CisKKwkJCS8vIExhenktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRl c2NlbmRhbnQgZm9ybSBtYXkgcG90ZW50aWFsbHkgYmUgc3VibWl0dGVkCisJCQlqUXVlcnkuZXZl bnQuYWRkKCB0aGlzLCAiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IiwgZnVuY3Rpb24o IGUgKSB7CisJCQkJLy8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNo IGluIElFICgjOTgwNykKKwkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LAorCQkJCQlmb3JtID0galF1 ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAi YnV0dG9uIiApID8gZWxlbS5mb3JtIDogdW5kZWZpbmVkOworCQkJCWlmICggZm9ybSAmJiAhalF1 ZXJ5Ll9kYXRhKCBmb3JtLCAic3VibWl0QnViYmxlcyIgKSApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50 LmFkZCggZm9ybSwgInN1Ym1pdC5fc3VibWl0IiwgZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJCQkJ ZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVlOworCQkJCQl9KTsKKwkJCQkJalF1ZXJ5Ll9kYXRh KCBmb3JtLCAic3VibWl0QnViYmxlcyIsIHRydWUgKTsKKwkJCQl9CisJCQl9KTsKKwkJCS8vIHJl dHVybiB1bmRlZmluZWQgc2luY2Ugd2UgZG9uJ3QgbmVlZCBhbiBldmVudCBsaXN0ZW5lcgorCQl9 LAorCisJCXBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJLy8gSWYgZm9ybSB3 YXMgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLCBidWJibGUgdGhlIGV2ZW50IHVwIHRoZSB0cmVlCisJ CQlpZiAoIGV2ZW50Ll9zdWJtaXRfYnViYmxlICkgeworCQkJCWRlbGV0ZSBldmVudC5fc3VibWl0 X2J1YmJsZTsKKwkJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkg eworCQkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoICJzdWJtaXQiLCB0aGlzLnBhcmVudE5vZGUs IGV2ZW50LCB0cnVlICk7CisJCQkJfQorCQkJfQorCQl9LAorCisJCXRlYXJkb3duOiBmdW5jdGlv bigpIHsKKwkJCS8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZl bnRzCisJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CisJCQkJcmV0 dXJuIGZhbHNlOworCQkJfQorCisJCQkvLyBSZW1vdmUgZGVsZWdhdGVkIGhhbmRsZXJzOyBjbGVh bkRhdGEgZXZlbnR1YWxseSByZWFwcyBzdWJtaXQgaGFuZGxlcnMgYXR0YWNoZWQgYWJvdmUKKwkJ CWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKKwkJfQorCX07Cit9CisK Ky8vIElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXgKK2lmICggIWpR dWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CisKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbC5j aGFuZ2UgPSB7CisKKwkJc2V0dXA6IGZ1bmN0aW9uKCkgeworCisJCQlpZiAoIHJmb3JtRWxlbXMu dGVzdCggdGhpcy5ub2RlTmFtZSApICkgeworCQkJCS8vIElFIGRvZXNuJ3QgZmlyZSBjaGFuZ2Ug b24gYSBjaGVjay9yYWRpbyB1bnRpbCBibHVyOyB0cmlnZ2VyIGl0IG9uIGNsaWNrCisJCQkJLy8g YWZ0ZXIgYSBwcm9wZXJ0eWNoYW5nZS4gRWF0IHRoZSBibHVyLWNoYW5nZSBpbiBzcGVjaWFsLmNo YW5nZS5oYW5kbGUuCisJCQkJLy8gVGhpcyBzdGlsbCBmaXJlcyBvbmNoYW5nZSBhIHNlY29uZCB0 aW1lIGZvciBjaGVjay9yYWRpbyBhZnRlciBibHVyLgorCQkJCWlmICggdGhpcy50eXBlID09PSAi Y2hlY2tib3giIHx8IHRoaXMudHlwZSA9PT0gInJhZGlvIiApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50 LmFkZCggdGhpcywgInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7 CisJCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lID09PSAiY2hlY2tl ZCIgKSB7CisJCQkJCQkJdGhpcy5fanVzdF9jaGFuZ2VkID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJ fSk7CisJCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJjbGljay5fY2hhbmdlIiwgZnVuY3Rp b24oIGV2ZW50ICkgeworCQkJCQkJaWYgKCB0aGlzLl9qdXN0X2NoYW5nZWQgJiYgIWV2ZW50Lmlz VHJpZ2dlciApIHsKKwkJCQkJCQl0aGlzLl9qdXN0X2NoYW5nZWQgPSBmYWxzZTsKKwkJCQkJCX0K KwkJCQkJCS8vIEFsbG93IHRyaWdnZXJlZCwgc2ltdWxhdGVkIGNoYW5nZSBldmVudHMgKCMxMTUw MCkKKwkJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggImNoYW5nZSIsIHRoaXMsIGV2ZW50LCB0 cnVlICk7CisJCQkJCX0pOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkvLyBE ZWxlZ2F0ZWQgZXZlbnQ7IGxhenktYWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBp bnB1dHMKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdl IiwgZnVuY3Rpb24oIGUgKSB7CisJCQkJdmFyIGVsZW0gPSBlLnRhcmdldDsKKworCQkJCWlmICgg cmZvcm1FbGVtcy50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwg ImNoYW5nZUJ1YmJsZXMiICkgKSB7CisJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGVsZW0sICJjaGFu Z2UuX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCQkJCWlmICggdGhpcy5wYXJlbnRO b2RlICYmICFldmVudC5pc1NpbXVsYXRlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgeworCQkJCQkJ CWpRdWVyeS5ldmVudC5zaW11bGF0ZSggImNoYW5nZSIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQs IHRydWUgKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJCWpRdWVyeS5fZGF0YSggZWxlbSwgImNo YW5nZUJ1YmJsZXMiLCB0cnVlICk7CisJCQkJfQorCQkJfSk7CisJCX0sCisKKwkJaGFuZGxlOiBm dW5jdGlvbiggZXZlbnQgKSB7CisJCQl2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDsKKworCQkJLy8g U3dhbGxvdyBuYXRpdmUgY2hhbmdlIGV2ZW50cyBmcm9tIGNoZWNrYm94L3JhZGlvLCB3ZSBhbHJl YWR5IHRyaWdnZXJlZCB0aGVtIGFib3ZlCisJCQlpZiAoIHRoaXMgIT09IGVsZW0gfHwgZXZlbnQu aXNTaW11bGF0ZWQgfHwgZXZlbnQuaXNUcmlnZ2VyIHx8IChlbGVtLnR5cGUgIT09ICJyYWRpbyIg JiYgZWxlbS50eXBlICE9PSAiY2hlY2tib3giKSApIHsKKwkJCQlyZXR1cm4gZXZlbnQuaGFuZGxl T2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJfQorCQl9LAorCisJCXRl YXJkb3duOiBmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX2No YW5nZSIgKTsKKworCQkJcmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsK KwkJfQorCX07Cit9CisKKy8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50 cworaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7CisJalF1ZXJ5LmVhY2go eyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBm aXggKSB7CisKKwkJLy8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNv bWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAorCQl2YXIgYXR0YWNoZXMgPSAwLAorCQkJaGFu ZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZp eCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7CisJCQl9 OworCisJCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKKwkJCXNldHVwOiBmdW5jdGlv bigpIHsKKwkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CisJCQkJCWRvY3VtZW50LmFkZEV2 ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKwkJCQl9CisJCQl9LAorCQkJdGVh cmRvd246IGZ1bmN0aW9uKCkgeworCQkJCWlmICggLS1hdHRhY2hlcyA9PT0gMCApIHsKKwkJCQkJ ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOworCQkJ CX0KKwkJCX0KKwkJfTsKKwl9KTsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisKKwlvbjogZnVu Y3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7CisJ CXZhciB0eXBlLCBvcmlnRm47CisKKwkJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hh bmRsZXJzCisJCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKKwkJCS8vICggdHlw ZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCisJCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0g InN0cmluZyIgKSB7CisJCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQorCQkJCWRhdGEgPSBk YXRhIHx8IHNlbGVjdG9yOworCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOworCQkJfQorCQkJZm9y ICggdHlwZSBpbiB0eXBlcyApIHsKKwkJCQl0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwg dHlwZXNbIHR5cGUgXSwgb25lICk7CisJCQl9CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCWlm ICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CisJCQkvLyAoIHR5cGVzLCBmbiApCisJ CQlmbiA9IHNlbGVjdG9yOworCQkJZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkOworCQl9IGVs c2UgaWYgKCBmbiA9PSBudWxsICkgeworCQkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJp bmciICkgeworCQkJCS8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCisJCQkJZm4gPSBkYXRhOwor CQkJCWRhdGEgPSB1bmRlZmluZWQ7CisJCQl9IGVsc2UgeworCQkJCS8vICggdHlwZXMsIGRhdGEs IGZuICkKKwkJCQlmbiA9IGRhdGE7CisJCQkJZGF0YSA9IHNlbGVjdG9yOworCQkJCXNlbGVjdG9y ID0gdW5kZWZpbmVkOworCQkJfQorCQl9CisJCWlmICggZm4gPT09IGZhbHNlICkgeworCQkJZm4g PSByZXR1cm5GYWxzZTsKKwkJfSBlbHNlIGlmICggIWZuICkgeworCQkJcmV0dXJuIHRoaXM7CisJ CX0KKworCQlpZiAoIG9uZSA9PT0gMSApIHsKKwkJCW9yaWdGbiA9IGZuOworCQkJZm4gPSBmdW5j dGlvbiggZXZlbnQgKSB7CisJCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50 IGNvbnRhaW5zIHRoZSBpbmZvCisJCQkJalF1ZXJ5KCkub2ZmKCBldmVudCApOworCQkJCXJldHVy biBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJfTsKKwkJCS8vIFVzZSBzYW1l IGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisJCQlmbi5ndWlkID0gb3Jp Z0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKKwkJfQorCQlyZXR1 cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5 cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKKwkJfSk7CisJfSwKKwlvbmU6IGZ1bmN0aW9uKCB0 eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgeworCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNl bGVjdG9yLCBkYXRhLCBmbiwgMSApOworCX0sCisJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVj dG9yLCBmbiApIHsKKwkJdmFyIGhhbmRsZU9iaiwgdHlwZTsKKwkJaWYgKCB0eXBlcyAmJiB0eXBl cy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7CisJCQkvLyAoIGV2ZW50ICkg IGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50CisJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7 CisJCQlqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKAorCQkJCWhhbmRsZU9iai5u YW1lc3BhY2UgPyBoYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNl IDogaGFuZGxlT2JqLm9yaWdUeXBlLAorCQkJCWhhbmRsZU9iai5zZWxlY3RvciwKKwkJCQloYW5k bGVPYmouaGFuZGxlcgorCQkJKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWlmICggdHlwZW9m IHR5cGVzID09PSAib2JqZWN0IiApIHsKKwkJCS8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9y XSApCisJCQlmb3IgKCB0eXBlIGluIHR5cGVzICkgeworCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxl Y3RvciwgdHlwZXNbIHR5cGUgXSApOworCQkJfQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJaWYg KCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICkg eworCQkJLy8gKCB0eXBlcyBbLCBmbl0gKQorCQkJZm4gPSBzZWxlY3RvcjsKKwkJCXNlbGVjdG9y ID0gdW5kZWZpbmVkOworCQl9CisJCWlmICggZm4gPT09IGZhbHNlICkgeworCQkJZm4gPSByZXR1 cm5GYWxzZTsKKwkJfQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5 LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApOworCQl9KTsKKwl9LAor CisJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMub24o IHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOworCX0sCisJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMs IGZuICkgeworCQlyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApOworCX0sCisKKwlk ZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7CisJCXJldHVy biB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7CisJfSwKKwl1bmRlbGVnYXRl OiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHsKKwkJLy8gKCBuYW1lc3BhY2UgKSBv ciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQorCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9 PT0gMSA/IHRoaXMub2ZmKCBzZWxlY3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxl Y3RvciB8fCAiKioiLCBmbiApOworCX0sCisKKwl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0 YSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5ldmVudC50 cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CisJCX0pOworCX0sCisJdHJpZ2dlckhhbmRsZXI6 IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQl2YXIgZWxlbSA9IHRoaXNbMF07CisJCWlmICgg ZWxlbSApIHsKKwkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxl bSwgdHJ1ZSApOworCQl9CisJfQorfSk7CisvKiEKKyAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5n aW5lCisgKiBDb3B5cmlnaHQgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJp YnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9zaXp6 bGVqcy5jb20vCisgKi8KKyhmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CisKK3ZhciBp LAorCWNhY2hlZHJ1bnMsCisJRXhwciwKKwlnZXRUZXh0LAorCWlzWE1MLAorCWNvbXBpbGUsCisJ aGFzRHVwbGljYXRlLAorCW91dGVybW9zdENvbnRleHQsCisKKwkvLyBMb2NhbCBkb2N1bWVudCB2 YXJzCisJc2V0RG9jdW1lbnQsCisJZG9jdW1lbnQsCisJZG9jRWxlbSwKKwlkb2N1bWVudElzWE1M LAorCXJidWdneVFTQSwKKwlyYnVnZ3lNYXRjaGVzLAorCW1hdGNoZXMsCisJY29udGFpbnMsCisJ c29ydE9yZGVyLAorCisJLy8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YQorCWV4cGFuZG8gPSAic2l6 emxlIiArIC0obmV3IERhdGUoKSksCisJcHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LAor CXN1cHBvcnQgPSB7fSwKKwlkaXJydW5zID0gMCwKKwlkb25lID0gMCwKKwljbGFzc0NhY2hlID0g Y3JlYXRlQ2FjaGUoKSwKKwl0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSwKKwljb21waWxlckNh Y2hlID0gY3JlYXRlQ2FjaGUoKSwKKworCS8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHMKKwlz dHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAorCU1BWF9ORUdBVElWRSA9IDEgPDwgMzEs CisKKwkvLyBBcnJheSBtZXRob2RzCisJYXJyID0gW10sCisJcG9wID0gYXJyLnBvcCwKKwlwdXNo ID0gYXJyLnB1c2gsCisJc2xpY2UgPSBhcnIuc2xpY2UsCisJLy8gVXNlIGEgc3RyaXBwZWQtZG93 biBpbmRleE9mIGlmIHdlIGNhbid0IHVzZSBhIG5hdGl2ZSBvbmUKKwlpbmRleE9mID0gYXJyLmlu ZGV4T2YgfHwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciBpID0gMCwKKwkJCWxlbiA9IHRoaXMu bGVuZ3RoOworCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJCWlmICggdGhpc1tpXSA9PT0g ZWxlbSApIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfSwKKwor CisJLy8gUmVndWxhciBleHByZXNzaW9ucworCisJLy8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0 dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCisJd2hpdGVzcGFj ZSA9ICJbXFx4MjBcXHRcXHJcXG5cXGZdIiwKKwkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3Mz LXN5bnRheC8jY2hhcmFjdGVycworCWNoYXJhY3RlckVuY29kaW5nID0gIig/OlxcXFwufFtcXHct XXxbXlxceDAwLVxceGEwXSkrIiwKKworCS8vIExvb3NlbHkgbW9kZWxlZCBvbiBDU1MgaWRlbnRp ZmllciBjaGFyYWN0ZXJzCisJLy8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlk ZW50aWZpZXIgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2F0dHJpYnV0ZS1z ZWxlY3RvcnMKKwkvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9z eW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXIKKwlpZGVudGlmaWVyID0gY2hhcmFjdGVy RW5jb2RpbmcucmVwbGFjZSggInciLCAidyMiICksCisKKwkvLyBBY2NlcHRhYmxlIG9wZXJhdG9y cyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnMKKwlv cGVyYXRvcnMgPSAiKFsqXiR8IX5dPz0pIiwKKwlhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNw YWNlICsgIiooIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICsgd2hpdGVzcGFjZSArCisJCSIq KD86IiArIG9wZXJhdG9ycyArIHdoaXRlc3BhY2UgKyAiKig/OihbJ1wiXSkoKD86XFxcXC58W15c XFxcXSkqPylcXDN8KCIgKyBpZGVudGlmaWVyICsgIil8KXwpIiArIHdoaXRlc3BhY2UgKyAiKlxc XSIsCisKKwkvLyBQcmVmZXIgYXJndW1lbnRzIHF1b3RlZCwKKwkvLyAgIHRoZW4gbm90IGNvbnRh aW5pbmcgcHNldWRvcy9icmFja2V0cywKKwkvLyAgIHRoZW4gYXR0cmlidXRlIHNlbGVjdG9ycy9u b24tcGFyZW50aGV0aWNhbCBleHByZXNzaW9ucywKKwkvLyAgIHRoZW4gYW55dGhpbmcgZWxzZQor CS8vIFRoZXNlIHByZWZlcmVuY2VzIGFyZSBoZXJlIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNl bGVjdG9ycworCS8vICAgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgUFNFVURPIHByZUZpbHRlcgor CXBzZXVkb3MgPSAiOigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSg/OlxcKCgoWydcIl0pKCg/ OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1 dGVzLnJlcGxhY2UoIDMsIDggKSArICIpKil8LiopXFwpfCkiLAorCisJLy8gTGVhZGluZyBhbmQg bm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRl c3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgorCXJ0cmltID0gbmV3IFJlZ0V4 cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hp dGVzcGFjZSArICIrJCIsICJnIiApLAorCisJcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hp dGVzcGFjZSArICIqLCIgKyB3aGl0ZXNwYWNlICsgIioiICksCisJcmNvbWJpbmF0b3JzID0gbmV3 IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIiAr IHdoaXRlc3BhY2UgKyAiKiIgKSwKKwlycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAor CXJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAorCisJ bWF0Y2hFeHByID0geworCQkiSUQiOiBuZXcgUmVnRXhwKCAiXiMoIiArIGNoYXJhY3RlckVuY29k aW5nICsgIikiICksCisJCSJDTEFTUyI6IG5ldyBSZWdFeHAoICJeXFwuKCIgKyBjaGFyYWN0ZXJF bmNvZGluZyArICIpIiApLAorCQkiTkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wiXT8o IiArIGNoYXJhY3RlckVuY29kaW5nICsgIilbJ1wiXT9cXF0iICksCisJCSJUQUciOiBuZXcgUmVn RXhwKCAiXigiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyoiICkgKyAiKSIg KSwKKwkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCisJCSJQU0VVRE8i OiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCisJCSJDSElMRCI6IG5ldyBSZWdFeHAoICJe Oihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiICsg d2hpdGVzcGFjZSArCisJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNw YWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKworCQkJIiooXFxkKyl8KSkiICsgd2hp dGVzcGFjZSArICIqXFwpfCkiLCAiaSIgKSwKKwkJLy8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1w bGVtZW50aW5nIC5pcygpCisJCS8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNl bGVjdGAKKwkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAi Kls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCisJCQl3 aGl0ZXNwYWNlICsgIiooKD86LVxcZCk/XFxkKikiICsgd2hpdGVzcGFjZSArICIqXFwpfCkoPz1b Xi1dfCQpIiwgImkiICkKKwl9LAorCisJcnNpYmxpbmcgPSAvW1x4MjBcdFxyXG5cZl0qWyt+XS8s CisKKwlybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgY29kZS8sCisKKwkvLyBFYXNpbHkt cGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnMKKwlycXVp Y2tFeHByID0gL14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLywKKworCXJpbnB1dHMg PSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLAorCXJoZWFkZXIgPSAvXmhc ZCQvaSwKKworCXJlc2NhcGUgPSAvJ3xcXC9nLAorCXJhdHRyaWJ1dGVRdW90ZXMgPSAvXD1bXHgy MFx0XHJcblxmXSooW14nIlxdXSopW1x4MjBcdFxyXG5cZl0qXF0vZywKKworCS8vIENTUyBlc2Nh cGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJh Y3RlcnMKKwlydW5lc2NhcGUgPSAvXFwoW1xkYS1mQS1GXXsxLDZ9W1x4MjBcdFxyXG5cZl0/fC4p L2csCisJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQgKSB7CisJCXZhciBoaWdoID0g IjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOworCQkvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAor CQlyZXR1cm4gaGlnaCAhPT0gaGlnaCA/CisJCQllc2NhcGVkIDoKKwkJCS8vIEJNUCBjb2RlcG9p bnQKKwkJCWhpZ2ggPCAwID8KKwkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAw MCApIDoKKwkJCQkvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFp cikKKwkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYg MHgzRkYgfCAweERDMDAgKTsKKwl9OworCisvLyBVc2UgYSBzdHJpcHBlZC1kb3duIHNsaWNlIGlm IHdlIGNhbid0IHVzZSBhIG5hdGl2ZSBvbmUKK3RyeSB7CisJc2xpY2UuY2FsbCggcHJlZmVycmVk RG9jLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7Cit9IGNhdGNo ICggZSApIHsKKwlzbGljZSA9IGZ1bmN0aW9uKCBpICkgeworCQl2YXIgZWxlbSwKKwkJCXJlc3Vs dHMgPSBbXTsKKwkJd2hpbGUgKCAoZWxlbSA9IHRoaXNbaSsrXSkgKSB7CisJCQlyZXN1bHRzLnB1 c2goIGVsZW0gKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0czsKKwl9OworfQorCisvKioKKyAqIEZv ciBmZWF0dXJlIGRldGVjdGlvbgorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9u IHRvIHRlc3QgZm9yIG5hdGl2ZSBzdXBwb3J0CisgKi8KK2Z1bmN0aW9uIGlzTmF0aXZlKCBmbiAp IHsKKwlyZXR1cm4gcm5hdGl2ZS50ZXN0KCBmbiArICIiICk7Cit9CisKKy8qKgorICogQ3JlYXRl IGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCisgKiBAcmV0dXJucyB7RnVuY3Rpb24o c3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0 IG9uIGl0c2VsZiB3aXRoCisgKglwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0 cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKQor ICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQorICovCitmdW5jdGlvbiBjcmVhdGVDYWNoZSgp IHsKKwl2YXIgY2FjaGUsCisJCWtleXMgPSBbXTsKKworCXJldHVybiAoY2FjaGUgPSBmdW5jdGlv bigga2V5LCB2YWx1ZSApIHsKKwkJLy8gVXNlIChrZXkgKyAiICIpIHRvIGF2b2lkIGNvbGxpc2lv biB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpCisJCWlm ICgga2V5cy5wdXNoKCBrZXkgKz0gIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgeworCQkJLy8g T25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzCisJCQlkZWxldGUgY2FjaGVbIGtleXMu c2hpZnQoKSBdOworCQl9CisJCXJldHVybiAoY2FjaGVbIGtleSBdID0gdmFsdWUpOworCX0pOwor fQorCisvKioKKyAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCisg KiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFyaworICovCitmdW5jdGlv biBtYXJrRnVuY3Rpb24oIGZuICkgeworCWZuWyBleHBhbmRvIF0gPSB0cnVlOworCXJldHVybiBm bjsKK30KKworLyoqCisgKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAorICogQHBh cmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJv b2xlYW4gcmVzdWx0CisgKi8KK2Z1bmN0aW9uIGFzc2VydCggZm4gKSB7CisJdmFyIGRpdiA9IGRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCisJdHJ5IHsKKwkJcmV0dXJuIGZuKCBkaXYg KTsKKwl9IGNhdGNoIChlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9IGZpbmFsbHkgeworCQkvLyBy ZWxlYXNlIG1lbW9yeSBpbiBJRQorCQlkaXYgPSBudWxsOworCX0KK30KKworZnVuY3Rpb24gU2l6 emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKKwl2YXIgbWF0Y2gsIGVs ZW0sIG0sIG5vZGVUeXBlLAorCQkvLyBRU0EgdmFycworCQlpLCBncm91cHMsIG9sZCwgbmlkLCBu ZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsKKworCWlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25l ckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7CisJ CXNldERvY3VtZW50KCBjb250ZXh0ICk7CisJfQorCisJY29udGV4dCA9IGNvbnRleHQgfHwgZG9j dW1lbnQ7CisJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CisKKwlpZiAoICFzZWxlY3RvciB8fCB0 eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworCQlyZXR1cm4gcmVzdWx0czsKKwl9CisK KwlpZiAoIChub2RlVHlwZSA9IGNvbnRleHQubm9kZVR5cGUpICE9PSAxICYmIG5vZGVUeXBlICE9 PSA5ICkgeworCQlyZXR1cm4gW107CisJfQorCisJaWYgKCAhZG9jdW1lbnRJc1hNTCAmJiAhc2Vl ZCApIHsKKworCQkvLyBTaG9ydGN1dHMKKwkJaWYgKCAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMo IHNlbGVjdG9yICkpICkgeworCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiI0lEIikKKwkJCWlmICgg KG0gPSBtYXRjaFsxXSkgKSB7CisJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKKwkJCQkJZWxl bSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTsKKwkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9k ZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKwkJCQkJLy8gbm9kZXMgdGhh dCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworCQkJCQlpZiAoIGVsZW0gJiYg ZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBP cGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXMKKwkJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBv ZiBJRAorCQkJCQkJaWYgKCBlbGVtLmlkID09PSBtICkgeworCQkJCQkJCXJlc3VsdHMucHVzaCgg ZWxlbSApOworCQkJCQkJCXJldHVybiByZXN1bHRzOworCQkJCQkJfQorCQkJCQl9IGVsc2Ugewor CQkJCQkJcmV0dXJuIHJlc3VsdHM7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBDb250 ZXh0IGlzIG5vdCBhIGRvY3VtZW50CisJCQkJCWlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYm IChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCisJ CQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7CisJCQkJ CQlyZXN1bHRzLnB1c2goIGVsZW0gKTsKKwkJCQkJCXJldHVybiByZXN1bHRzOworCQkJCQl9CisJ CQkJfQorCisJCQkvLyBTcGVlZC11cDogU2l6emxlKCJUQUciKQorCQkJfSBlbHNlIGlmICggbWF0 Y2hbMl0gKSB7CisJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0Lmdl dEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApLCAwKSApOworCQkJCXJldHVybiByZXN1bHRz OworCisJCQkvLyBTcGVlZC11cDogU2l6emxlKCIuQ0xBU1MiKQorCQkJfSBlbHNlIGlmICggKG0g PSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRCeUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1l bnRzQnlDbGFzc05hbWUgKSB7CisJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChj b250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSwgMCkgKTsKKwkJCQlyZXR1cm4gcmVz dWx0czsKKwkJCX0KKwkJfQorCisJCS8vIFFTQSBwYXRoCisJCWlmICggc3VwcG9ydC5xc2EgJiYg IXJidWdneVFTQS50ZXN0KHNlbGVjdG9yKSApIHsKKwkJCW9sZCA9IHRydWU7CisJCQluaWQgPSBl eHBhbmRvOworCQkJbmV3Q29udGV4dCA9IGNvbnRleHQ7CisJCQluZXdTZWxlY3RvciA9IG5vZGVU eXBlID09PSA5ICYmIHNlbGVjdG9yOworCisJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVs ZW1lbnQtcm9vdGVkIHF1ZXJpZXMKKwkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNw ZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKKwkJCS8vIGFuZCB3b3JraW5nIHVwIGZy b20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQorCQkJ Ly8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCisJCQlpZiAoIG5vZGVUeXBl ID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7 CisJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CisKKwkJCQlpZiAoIChvbGQgPSBj b250ZXh0LmdldEF0dHJpYnV0ZSgiaWQiKSkgKSB7CisJCQkJCW5pZCA9IG9sZC5yZXBsYWNlKCBy ZXNjYXBlLCAiXFwkJiIgKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb250ZXh0LnNldEF0dHJpYnV0 ZSggImlkIiwgbmlkICk7CisJCQkJfQorCQkJCW5pZCA9ICJbaWQ9JyIgKyBuaWQgKyAiJ10gIjsK KworCQkJCWkgPSBncm91cHMubGVuZ3RoOworCQkJCXdoaWxlICggaS0tICkgeworCQkJCQlncm91 cHNbaV0gPSBuaWQgKyB0b1NlbGVjdG9yKCBncm91cHNbaV0gKTsKKwkJCQl9CisJCQkJbmV3Q29u dGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgY29udGV4dC5wYXJlbnROb2RlIHx8 IGNvbnRleHQ7CisJCQkJbmV3U2VsZWN0b3IgPSBncm91cHMuam9pbigiLCIpOworCQkJfQorCisJ CQlpZiAoIG5ld1NlbGVjdG9yICkgeworCQkJCXRyeSB7CisJCQkJCXB1c2guYXBwbHkoIHJlc3Vs dHMsIHNsaWNlLmNhbGwoIG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCgKKwkJCQkJCW5ld1Nl bGVjdG9yCisJCQkJCSksIDAgKSApOworCQkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCQl9IGNhdGNo KHFzYUVycm9yKSB7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaWYgKCAhb2xkICkgeworCQkJCQkJ Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImlkIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0K Kwl9CisKKwkvLyBBbGwgb3RoZXJzCisJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSgg cnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOworfQorCisvKioKKyAqIERl dGVjdCB4bWwKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBh IGRvY3VtZW50CisgKi8KK2lzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7 CisJLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vz bid0IHlldCBleGlzdAorCS8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMz KQorCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwg ZWxlbSkuZG9jdW1lbnRFbGVtZW50OworCXJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVu dEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiA6IGZhbHNlOworfTsKKworLyoqCisgKiBTZXRz IGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9j dW1lbnQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9j dW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CisgKiBAcmV0dXJucyB7T2Jq ZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50CisgKi8KK3NldERvY3VtZW50ID0gU2l6 emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7CisJdmFyIGRvYyA9IG5vZGUgPyBu b2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKKworCS8vIElmIG5vIGRv Y3VtZW50IGFuZCBkb2N1bWVudEVsZW1lbnQgaXMgYXZhaWxhYmxlLCByZXR1cm4KKwlpZiAoIGRv YyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVt ZW50ICkgeworCQlyZXR1cm4gZG9jdW1lbnQ7CisJfQorCisJLy8gU2V0IG91ciBkb2N1bWVudAor CWRvY3VtZW50ID0gZG9jOworCWRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50OworCisJLy8g U3VwcG9ydCB0ZXN0cworCWRvY3VtZW50SXNYTUwgPSBpc1hNTCggZG9jICk7CisKKwkvLyBDaGVj ayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cworCXN1 cHBvcnQudGFnTmFtZU5vQ29tbWVudHMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKwkJZGl2 LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlQ29tbWVudCgiIikgKTsKKwkJcmV0dXJuICFkaXYuZ2V0 RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7CisJfSk7CisKKwkvLyBDaGVjayBpZiBhdHRy aWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzCisJc3VwcG9ydC5h dHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJCWRpdi5pbm5lckhUTUwgPSAi PHNlbGVjdD48L3NlbGVjdD4iOworCQl2YXIgdHlwZSA9IHR5cGVvZiBkaXYubGFzdENoaWxkLmdl dEF0dHJpYnV0ZSgibXVsdGlwbGUiKTsKKwkJLy8gSUU4IHJldHVybnMgYSBzdHJpbmcgZm9yIHNv bWUgYXR0cmlidXRlcyBldmVuIHdoZW4gbm90IHByZXNlbnQKKwkJcmV0dXJuIHR5cGUgIT09ICJi b29sZWFuIiAmJiB0eXBlICE9PSAic3RyaW5nIjsKKwl9KTsKKworCS8vIENoZWNrIGlmIGdldEVs ZW1lbnRzQnlDbGFzc05hbWUgY2FuIGJlIHRydXN0ZWQKKwlzdXBwb3J0LmdldEJ5Q2xhc3NOYW1l ID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJCS8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNv bmQgY2xhc3NuYW1lIChpbiA5LjYpCisJCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0naGlk ZGVuIGUnPjwvZGl2PjxkaXYgY2xhc3M9J2hpZGRlbic+PC9kaXY+IjsKKwkJaWYgKCAhZGl2Lmdl dEVsZW1lbnRzQnlDbGFzc05hbWUgfHwgIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIiku bGVuZ3RoICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gU2FmYXJpIDMuMiBjYWNo ZXMgY2xhc3MgYXR0cmlidXRlcyBhbmQgZG9lc24ndCBjYXRjaCBjaGFuZ2VzCisJCWRpdi5sYXN0 Q2hpbGQuY2xhc3NOYW1lID0gImUiOworCQlyZXR1cm4gZGl2LmdldEVsZW1lbnRzQnlDbGFzc05h bWUoImUiKS5sZW5ndGggPT09IDI7CisJfSk7CisKKwkvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJ ZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUKKwkvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5TmFt ZSBwcml2aWxlZ2VzIGZvcm0gY29udHJvbHMgb3IgcmV0dXJucyBlbGVtZW50cyBieSBJRAorCXN1 cHBvcnQuZ2V0QnlOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJCS8vIEluamVjdCBj b250ZW50CisJCWRpdi5pZCA9IGV4cGFuZG8gKyAwOworCQlkaXYuaW5uZXJIVE1MID0gIjxhIG5h bWU9JyIgKyBleHBhbmRvICsgIic+PC9hPjxkaXYgbmFtZT0nIiArIGV4cGFuZG8gKyAiJz48L2Rp dj4iOworCQlkb2NFbGVtLmluc2VydEJlZm9yZSggZGl2LCBkb2NFbGVtLmZpcnN0Q2hpbGQgKTsK KworCQkvLyBUZXN0CisJCXZhciBwYXNzID0gZG9jLmdldEVsZW1lbnRzQnlOYW1lICYmCisJCQkv LyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBmZXdlciB0aGFuIHRoZSBjb3JyZWN0IDIKKwkJ CWRvYy5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aCA9PT0gMiArCisJCQkvLyBi dWdneSBicm93c2VycyB3aWxsIHJldHVybiBtb3JlIHRoYW4gdGhlIGNvcnJlY3QgMAorCQkJZG9j LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICsgMCApLmxlbmd0aDsKKwkJc3VwcG9ydC5nZXRJ ZE5vdE5hbWUgPSAhZG9jLmdldEVsZW1lbnRCeUlkKCBleHBhbmRvICk7CisKKwkJLy8gQ2xlYW51 cAorCQlkb2NFbGVtLnJlbW92ZUNoaWxkKCBkaXYgKTsKKworCQlyZXR1cm4gcGFzczsKKwl9KTsK KworCS8vIElFNi83IHJldHVybiBtb2RpZmllZCBhdHRyaWJ1dGVzCisJRXhwci5hdHRySGFuZGxl ID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJCWRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0n Iyc+PC9hPiI7CisJCXJldHVybiBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hp bGQuZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYKKwkJCWRpdi5maXJzdENoaWxkLmdl dEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiIyI7CisJfSkgPworCQl7fSA6CisJCXsKKwkJCSJocmVm IjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAiaHJl ZiIsIDIgKTsKKwkJCX0sCisJCQkidHlwZSI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXJldHVy biBlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpOworCQkJfQorCQl9OworCisJLy8gSUQgZmluZCBh bmQgZmlsdGVyCisJaWYgKCBzdXBwb3J0LmdldElkTm90TmFtZSApIHsKKwkJRXhwci5maW5kWyJJ RCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5n ZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmICFkb2N1bWVudElzWE1MICkgeworCQkJ CXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKKwkJCQkvLyBDaGVjayBwYXJl bnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucworCQkJCS8vIG5vZGVz IHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKKwkJCQlyZXR1cm4gbSAm JiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKKwkJCX0KKwkJfTsKKwkJRXhwci5maWx0ZXJbIklE Il0gPSBmdW5jdGlvbiggaWQgKSB7CisJCQl2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNj YXBlLCBmdW5lc2NhcGUgKTsKKwkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQlyZXR1 cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKKwkJCX07CisJCX07CisJfSBl bHNlIHsKKwkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgeworCQkJ aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmICFk b2N1bWVudElzWE1MICkgeworCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQg KTsKKworCQkJCXJldHVybiBtID8KKwkJCQkJbS5pZCA9PT0gaWQgfHwgdHlwZW9mIG0uZ2V0QXR0 cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS52 YWx1ZSA9PT0gaWQgPworCQkJCQkJW21dIDoKKwkJCQkJCXVuZGVmaW5lZCA6CisJCQkJCVtdOwor CQkJfQorCQl9OworCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CisJCQl2 YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKKwkJCXJldHVy biBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJp YnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7 CisJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOworCQkJfTsKKwkJfTsK Kwl9CisKKwkvLyBUYWcKKwlFeHByLmZpbmRbIlRBRyJdID0gc3VwcG9ydC50YWdOYW1lTm9Db21t ZW50cyA/CisJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CisJCQlpZiAoIHR5cGVvZiBjb250 ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBzdHJ1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJu IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOworCQkJfQorCQl9IDoKKwkJZnVu Y3Rpb24oIHRhZywgY29udGV4dCApIHsKKwkJCXZhciBlbGVtLAorCQkJCXRtcCA9IFtdLAorCQkJ CWkgPSAwLAorCQkJCXJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcg KTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCB0YWcgPT09 ICIqIiApIHsKKwkJCQl3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHsKKwkJCQkJaWYg KCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJdG1wLnB1c2goIGVsZW0gKTsKKwkJCQkJ fQorCQkJCX0KKworCQkJCXJldHVybiB0bXA7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0czsKKwkJ fTsKKworCS8vIE5hbWUKKwlFeHByLmZpbmRbIk5BTUUiXSA9IHN1cHBvcnQuZ2V0QnlOYW1lICYm IGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CisJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxl bWVudHNCeU5hbWUgIT09IHN0cnVuZGVmaW5lZCApIHsKKwkJCXJldHVybiBjb250ZXh0LmdldEVs ZW1lbnRzQnlOYW1lKCBuYW1lICk7CisJCX0KKwl9OworCisJLy8gQ2xhc3MKKwlFeHByLmZpbmRb IkNMQVNTIl0gPSBzdXBwb3J0LmdldEJ5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUs IGNvbnRleHQgKSB7CisJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFt ZSAhPT0gc3RydW5kZWZpbmVkICYmICFkb2N1bWVudElzWE1MICkgeworCQkJcmV0dXJuIGNvbnRl eHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7CisJCX0KKwl9OworCisJLy8g UVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydAorCisJLy8gbWF0Y2hlc1NlbGVjdG9yKDph Y3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSkKKwlyYnVnZ3lN YXRjaGVzID0gW107CisKKwkvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAo Q2hyb21lIDIxKSwKKwkvLyBubyBuZWVkIHRvIGFsc28gYWRkIHRvIGJ1Z2d5TWF0Y2hlcyBzaW5j ZSBtYXRjaGVzIGNoZWNrcyBidWdneVFTQQorCS8vIEEgc3VwcG9ydCB0ZXN0IHdvdWxkIHJlcXVp cmUgdG9vIG11Y2ggY29kZSAod291bGQgaW5jbHVkZSBkb2N1bWVudCByZWFkeSkKKwlyYnVnZ3lR U0EgPSBbICI6Zm9jdXMiIF07CisKKwlpZiAoIChzdXBwb3J0LnFzYSA9IGlzTmF0aXZlKGRvYy5x dWVyeVNlbGVjdG9yQWxsKSkgKSB7CisJCS8vIEJ1aWxkIFFTQSByZWdleAorCQkvLyBSZWdleCBz dHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCisJCWFzc2VydChmdW5jdGlvbiggZGl2 ICkgeworCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQorCQkJ Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0bHkKKwkJCS8v IHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0cmlidXRlLAorCQkJLy8gc2luY2UgaXRzIHBy ZXNlbmNlIHNob3VsZCBiZSBlbm91Z2gKKwkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlj a2V0LzEyMzU5CisJCQlkaXYuaW5uZXJIVE1MID0gIjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0n Jz48L29wdGlvbj48L3NlbGVjdD4iOworCisJCQkvLyBJRTggLSBTb21lIGJvb2xlYW4gYXR0cmli dXRlcyBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5CisJCQlpZiAoICFkaXYucXVlcnlTZWxlY3Rv ckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKKwkJCQlyYnVnZ3lRU0EucHVzaCggIlxcWyIg KyB3aGl0ZXNwYWNlICsgIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRv bmx5fHNlbGVjdGVkfHZhbHVlKSIgKTsKKwkJCX0KKworCQkJLy8gV2Via2l0L09wZXJhIC0gOmNo ZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKKwkJCS8vIGh0dHA6 Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2Vk CisJCQkvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0 cworCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RoICkgewor CQkJCXJidWdneVFTQS5wdXNoKCI6Y2hlY2tlZCIpOworCQkJfQorCQl9KTsKKworCQlhc3NlcnQo ZnVuY3Rpb24oIGRpdiApIHsKKworCQkJLy8gT3BlcmEgMTAtMTIvSUU4IC0gXj0gJD0gKj0gYW5k IGVtcHR5IHZhbHVlcworCQkJLy8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmcKKwkJCWRpdi5p bm5lckhUTUwgPSAiPGlucHV0IHR5cGU9J2hpZGRlbicgaT0nJy8+IjsKKwkJCWlmICggZGl2LnF1 ZXJ5U2VsZWN0b3JBbGwoIltpXj0nJ10iKS5sZW5ndGggKSB7CisJCQkJcmJ1Z2d5UVNBLnB1c2go ICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86XCJcInwnJykiICk7CisJCQl9CisKKwkJCS8v IEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4g ZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCisJCQkvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUg YW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0cworCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JB bGwoIjplbmFibGVkIikubGVuZ3RoICkgeworCQkJCXJidWdneVFTQS5wdXNoKCAiOmVuYWJsZWQi LCAiOmRpc2FibGVkIiApOworCQkJfQorCisJCQkvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJv dyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvcworCQkJZGl2LnF1ZXJ5U2VsZWN0b3JBbGwo IiosOngiKTsKKwkJCXJidWdneVFTQS5wdXNoKCIsLio6Iik7CisJCX0pOworCX0KKworCWlmICgg KHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gaXNOYXRpdmUoIChtYXRjaGVzID0gZG9jRWxlbS5t YXRjaGVzU2VsZWN0b3IgfHwKKwkJZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHwKKwkJZG9j RWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwKKwkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9y IHx8CisJCWRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkgeworCisJCWFzc2VydChmdW5j dGlvbiggZGl2ICkgeworCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8g bWF0Y2hlc1NlbGVjdG9yCisJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQorCQkJ c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCAiZGl2IiApOwor CisJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCisJCQkvLyBHZWNrbyBk b2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkCisJCQltYXRjaGVzLmNhbGwoIGRp diwgIltzIT0nJ106eCIgKTsKKwkJCXJidWdneU1hdGNoZXMucHVzaCggIiE9IiwgcHNldWRvcyAp OworCQl9KTsKKwl9CisKKwlyYnVnZ3lRU0EgPSBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigi fCIpICk7CisJcmJ1Z2d5TWF0Y2hlcyA9IG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbigi fCIpICk7CisKKwkvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXIKKwkvLyBQdXJwb3NlZnVsbHkg ZG9lcyBub3QgaW1wbGVtZW50IGluY2x1c2l2ZSBkZXNjZW5kZW50CisJLy8gQXMgaW4sIGFuIGVs ZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGYKKwljb250YWlucyA9IGlzTmF0aXZlKGRvY0Vs ZW0uY29udGFpbnMpIHx8IGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gPworCQlmdW5j dGlvbiggYSwgYiApIHsKKwkJCXZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3Vt ZW50RWxlbWVudCA6IGEsCisJCQkJYnVwID0gYiAmJiBiLnBhcmVudE5vZGU7CisJCQlyZXR1cm4g YSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKKwkJCQlhZG93 bi5jb250YWlucyA/CisJCQkJCWFkb3duLmNvbnRhaW5zKCBidXAgKSA6CisJCQkJCWEuY29tcGFy ZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAx NgorCQkJKSk7CisJCX0gOgorCQlmdW5jdGlvbiggYSwgYiApIHsKKwkJCWlmICggYiApIHsKKwkJ CQl3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKKwkJCQkJaWYgKCBiID09PSBhICkgewor CQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7 CisJCX07CisKKwkvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisJc29ydE9yZGVyID0gZG9jRWxl bS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/CisJZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciBj b21wYXJlOworCisJCWlmICggYSA9PT0gYiApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJ CQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICggKGNvbXBhcmUgPSBiLmNvbXBhcmVEb2N1bWVudFBv c2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQ b3NpdGlvbiggYiApKSApIHsKKwkJCWlmICggY29tcGFyZSAmIDEgfHwgYS5wYXJlbnROb2RlICYm IGEucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTEgKSB7CisJCQkJaWYgKCBhID09PSBkb2MgfHwg Y29udGFpbnMoIHByZWZlcnJlZERvYywgYSApICkgeworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQor CQkJCWlmICggYiA9PT0gZG9jIHx8IGNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGIgKSApIHsKKwkJ CQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIGNvbXBh cmUgJiA0ID8gLTEgOiAxOworCQl9CisKKwkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRp b24gPyAtMSA6IDE7CisJfSA6CisJZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciBjdXIsCisJCQlp ID0gMCwKKwkJCWF1cCA9IGEucGFyZW50Tm9kZSwKKwkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKKwkJ CWFwID0gWyBhIF0sCisJCQlicCA9IFsgYiBdOworCisJCS8vIEV4aXQgZWFybHkgaWYgdGhlIG5v ZGVzIGFyZSBpZGVudGljYWwKKwkJaWYgKCBhID09PSBiICkgeworCQkJaGFzRHVwbGljYXRlID0g dHJ1ZTsKKwkJCXJldHVybiAwOworCisJCS8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBk b2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisJCX0gZWxzZSBpZiAoICFhdXAgfHwgIWJ1cCApIHsK KwkJCXJldHVybiBhID09PSBkb2MgPyAtMSA6CisJCQkJYiA9PT0gZG9jID8gMSA6CisJCQkJYXVw ID8gLTEgOgorCQkJCWJ1cCA/IDEgOgorCQkJCTA7CisKKwkJLy8gSWYgdGhlIG5vZGVzIGFyZSBz aWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKKwkJfSBlbHNlIGlmICggYXVwID09PSBi dXAgKSB7CisJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CisJCX0KKworCQkvLyBPdGhl cndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNv bgorCQljdXIgPSBhOworCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CisJCQlh cC51bnNoaWZ0KCBjdXIgKTsKKwkJfQorCQljdXIgPSBiOworCQl3aGlsZSAoIChjdXIgPSBjdXIu cGFyZW50Tm9kZSkgKSB7CisJCQlicC51bnNoaWZ0KCBjdXIgKTsKKwkJfQorCisJCS8vIFdhbGsg ZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CisJCXdoaWxlICggYXBbaV0g PT09IGJwW2ldICkgeworCQkJaSsrOworCQl9CisKKwkJcmV0dXJuIGkgPworCQkJLy8gRG8gYSBz aWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yCisJCQlzaWJs aW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKKworCQkJLy8gT3RoZXJ3aXNlIG5vZGVzIGluIG91 ciBkb2N1bWVudCBzb3J0IGZpcnN0CisJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgor CQkJYnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOgorCQkJMDsKKwl9OworCisJLy8gQWx3YXlz IGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgZHVwbGljYXRlcyBpZiBzb3J0IGRvZXNuJ3QKKwkvLyBw YXNzIHRoZW0gdG8gb3VyIGNvbXBhcmlzb24gZnVuY3Rpb24gKGFzIGluIEdvb2dsZSBDaHJvbWUp LgorCWhhc0R1cGxpY2F0ZSA9IGZhbHNlOworCVswLCAwXS5zb3J0KCBzb3J0T3JkZXIgKTsKKwlz dXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSBoYXNEdXBsaWNhdGU7CisKKwlyZXR1cm4gZG9jdW1l bnQ7Cit9OworCitTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHsK KwlyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApOworfTsKKworU2l6 emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkgeworCS8vIFNldCBk b2N1bWVudCB2YXJzIGlmIG5lZWRlZAorCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxl bSApICE9PSBkb2N1bWVudCApIHsKKwkJc2V0RG9jdW1lbnQoIGVsZW0gKTsKKwl9CisKKwkvLyBN YWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWQKKwlleHByID0gZXhw ci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOworCisJLy8gcmJ1Z2d5UVNB IGFsd2F5cyBjb250YWlucyA6Zm9jdXMsIHNvIG5vIG5lZWQgZm9yIGFuIGV4aXN0ZW5jZSBjaGVj aworCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgIWRvY3VtZW50SXNYTUwgJiYgKCFy YnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoZXhwcikpICYmICFyYnVnZ3lRU0Eu dGVzdChleHByKSApIHsKKwkJdHJ5IHsKKwkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0s IGV4cHIgKTsKKworCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9u IGRpc2Nvbm5lY3RlZCBub2RlcworCQkJaWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRN YXRjaCB8fAorCQkJCQkvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8g YmUgaW4gYSBkb2N1bWVudAorCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CisJCQkJCWVsZW0uZG9j dW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CisJCQkJcmV0dXJuIHJl dDsKKwkJCX0KKwkJfSBjYXRjaChlKSB7fQorCX0KKworCXJldHVybiBTaXp6bGUoIGV4cHIsIGRv Y3VtZW50LCBudWxsLCBbZWxlbV0gKS5sZW5ndGggPiAwOworfTsKKworU2l6emxlLmNvbnRhaW5z ID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7CisJLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYg bmVlZGVkCisJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRv Y3VtZW50ICkgeworCQlzZXREb2N1bWVudCggY29udGV4dCApOworCX0KKwlyZXR1cm4gY29udGFp bnMoIGNvbnRleHQsIGVsZW0gKTsKK307CisKK1NpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0s IG5hbWUgKSB7CisJdmFyIHZhbDsKKworCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAor CWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKKwkJ c2V0RG9jdW1lbnQoIGVsZW0gKTsKKwl9CisKKwlpZiAoICFkb2N1bWVudElzWE1MICkgeworCQlu YW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCX0KKwlpZiAoICh2YWwgPSBFeHByLmF0dHJIYW5k bGVbIG5hbWUgXSkgKSB7CisJCXJldHVybiB2YWwoIGVsZW0gKTsKKwl9CisJaWYgKCBkb2N1bWVu dElzWE1MIHx8IHN1cHBvcnQuYXR0cmlidXRlcyApIHsKKwkJcmV0dXJuIGVsZW0uZ2V0QXR0cmli dXRlKCBuYW1lICk7CisJfQorCXJldHVybiAoICh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUo IG5hbWUgKSkgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSApICYmIGVsZW1bIG5hbWUgXSA9 PT0gdHJ1ZSA/CisJCW5hbWUgOgorCQl2YWwgJiYgdmFsLnNwZWNpZmllZCA/IHZhbC52YWx1ZSA6 IG51bGw7Cit9OworCitTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgeworCXRocm93IG5l dyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cg KTsKK307CisKKy8vIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXMKK1Np enpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7CisJdmFyIGVsZW0sCisJCWR1 cGxpY2F0ZXMgPSBbXSwKKwkJaSA9IDEsCisJCWogPSAwOworCisJLy8gVW5sZXNzIHdlICprbm93 KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZQorCWhhc0R1 cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7CisJcmVzdWx0cy5zb3J0KCBzb3J0 T3JkZXIgKTsKKworCWlmICggaGFzRHVwbGljYXRlICkgeworCQlmb3IgKCA7IChlbGVtID0gcmVz dWx0c1tpXSk7IGkrKyApIHsKKwkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSAtIDEgXSApIHsK KwkJCQlqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7CisJCQl9CisJCX0KKwkJd2hpbGUgKCBqLS0g KSB7CisJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CisJCX0KKwl9CisK KwlyZXR1cm4gcmVzdWx0czsKK307CisKK2Z1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsK Kwl2YXIgY3VyID0gYiAmJiBhLAorCQlkaWZmID0gY3VyICYmICggfmIuc291cmNlSW5kZXggfHwg TUFYX05FR0FUSVZFICkgLSAoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApOworCisJ Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCisJaWYgKCBk aWZmICkgeworCQlyZXR1cm4gZGlmZjsKKwl9CisKKwkvLyBDaGVjayBpZiBiIGZvbGxvd3MgYQor CWlmICggY3VyICkgeworCQl3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNpYmxpbmcpICkgeworCQkJ aWYgKCBjdXIgPT09IGIgKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0 dXJuIGEgPyAxIDogLTE7Cit9CisKKy8vIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNl dWRvcyBmb3IgaW5wdXQgdHlwZXMKK2Z1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkg eworCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKwkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1l LnRvTG93ZXJDYXNlKCk7CisJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9 PT0gdHlwZTsKKwl9OworfQorCisvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVk b3MgZm9yIGJ1dHRvbnMKK2Z1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsKKwly ZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xv d2VyQ2FzZSgpOworCQlyZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRv biIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTsKKwl9OworfQorCisvLyBSZXR1cm5zIGEgZnVuY3Rp b24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCitmdW5jdGlvbiBjcmVhdGVQb3Np dGlvbmFsUHNldWRvKCBmbiApIHsKKwlyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1 bWVudCApIHsKKwkJYXJndW1lbnQgPSArYXJndW1lbnQ7CisJCXJldHVybiBtYXJrRnVuY3Rpb24o ZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CisJCQl2YXIgaiwKKwkJCQltYXRjaEluZGV4ZXMg PSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAorCQkJCWkgPSBtYXRjaEluZGV4ZXMu bGVuZ3RoOworCisJCQkvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGlu ZGV4ZXMKKwkJCXdoaWxlICggaS0tICkgeworCQkJCWlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4 ZXNbaV0pIF0gKSB7CisJCQkJCXNlZWRbal0gPSAhKG1hdGNoZXNbal0gPSBzZWVkW2pdKTsKKwkJ CQl9CisJCQl9CisJCX0pOworCX0pOworfQorCisvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb24gZm9y IHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzCisgKiBA cGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW0KKyAqLworZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0 ID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJdmFyIG5vZGUsCisJCXJldCA9ICIiLAorCQlpID0gMCwK KwkJbm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlOworCisJaWYgKCAhbm9kZVR5cGUgKSB7CisJCS8v IElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5CisJCWZvciAo IDsgKG5vZGUgPSBlbGVtW2ldKTsgaSsrICkgeworCQkJLy8gRG8gbm90IHRyYXZlcnNlIGNvbW1l bnQgbm9kZXMKKwkJCXJldCArPSBnZXRUZXh0KCBub2RlICk7CisJCX0KKwl9IGVsc2UgaWYgKCBu b2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7CisJ CS8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHMKKwkJLy8gaW5uZXJUZXh0IHVzYWdlIHJl bW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoc2VlICMxMTE1MykKKwkJaWYgKCB0 eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4gZWxlbS50 ZXh0Q29udGVudDsKKwkJfSBlbHNlIHsKKwkJCS8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlbgorCQkJ Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxp bmcgKSB7CisJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBp ZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgeworCQlyZXR1cm4gZWxlbS5u b2RlVmFsdWU7CisJfQorCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBp bnN0cnVjdGlvbiBub2RlcworCisJcmV0dXJuIHJldDsKK307CisKK0V4cHIgPSBTaXp6bGUuc2Vs ZWN0b3JzID0geworCisJLy8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyCisJY2FjaGVMZW5n dGg6IDUwLAorCisJY3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sCisKKwltYXRjaDogbWF0Y2hF eHByLAorCisJZmluZDoge30sCisKKwlyZWxhdGl2ZTogeworCQkiPiI6IHsgZGlyOiAicGFyZW50 Tm9kZSIsIGZpcnN0OiB0cnVlIH0sCisJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAorCQki KyI6IHsgZGlyOiAicHJldmlvdXNTaWJsaW5nIiwgZmlyc3Q6IHRydWUgfSwKKwkJIn4iOiB7IGRp cjogInByZXZpb3VzU2libGluZyIgfQorCX0sCisKKwlwcmVGaWx0ZXI6IHsKKwkJIkFUVFIiOiBm dW5jdGlvbiggbWF0Y2ggKSB7CisJCQltYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVz Y2FwZSwgZnVuZXNjYXBlICk7CisKKwkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNo WzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCisJCQltYXRjaFszXSA9ICggbWF0Y2hbNF0g fHwgbWF0Y2hbNV0gfHwgIiIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworCisJ CQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworCQkJCW1hdGNoWzNdID0gIiAiICsgbWF0Y2hb M10gKyAiICI7CisJCQl9CisKKwkJCXJldHVybiBtYXRjaC5zbGljZSggMCwgNCApOworCQl9LAor CisJCSJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKwkJCS8qIG1hdGNoZXMgZnJvbSBtYXRj aEV4cHJbIkNISUxEIl0KKwkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKKwkJCQkyIHdoYXQgKGNo aWxkfG9mLXR5cGUpCisJCQkJMyBhcmd1bWVudCAoZXZlbnxvZGR8XGQqfFxkKm4oWystXVxkKyk/ fC4uLikKKwkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQor CQkJCTUgc2lnbiBvZiB4bi1jb21wb25lbnQKKwkJCQk2IHggb2YgeG4tY29tcG9uZW50CisJCQkJ NyBzaWduIG9mIHktY29tcG9uZW50CisJCQkJOCB5IG9mIHktY29tcG9uZW50CisJCQkqLworCQkJ bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOworCisJCQlpZiAoIG1hdGNoWzFdLnNs aWNlKCAwLCAzICkgPT09ICJudGgiICkgeworCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50 CisJCQkJaWYgKCAhbWF0Y2hbM10gKSB7CisJCQkJCVNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsK KwkJCQl9CisKKwkJCQkvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0 ZXIuQ0hJTEQKKwkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZl bHkgdG8gMC8xCisJCQkJbWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNo WzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09ICJldmVuIiB8fCBtYXRjaFszXSA9PT0gIm9k ZCIgKSApOworCQkJCW1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0 Y2hbM10gPT09ICJvZGQiICk7CisKKwkJCS8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50 cworCQkJfSBlbHNlIGlmICggbWF0Y2hbM10gKSB7CisJCQkJU2l6emxlLmVycm9yKCBtYXRjaFsw XSApOworCQkJfQorCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0sCisKKwkJIlBTRVVETyI6IGZ1bmN0 aW9uKCBtYXRjaCApIHsKKwkJCXZhciBleGNlc3MsCisJCQkJdW5xdW90ZWQgPSAhbWF0Y2hbNV0g JiYgbWF0Y2hbMl07CisKKwkJCWlmICggbWF0Y2hFeHByWyJDSElMRCJdLnRlc3QoIG1hdGNoWzBd ICkgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCS8vIEFjY2VwdCBxdW90ZWQgYXJn dW1lbnRzIGFzLWlzCisJCQlpZiAoIG1hdGNoWzRdICkgeworCQkJCW1hdGNoWzJdID0gbWF0Y2hb NF07CisKKwkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1l bnRzCisJCQl9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkg JiYKKwkJCQkvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQorCQkJCShl eGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKKwkJCQkvLyBhZHZhbmNlIHRv IHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXMKKwkJCQkoZXhjZXNzID0gdW5xdW90ZWQuaW5k ZXhPZiggIikiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkg KSB7CisKKwkJCQkvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleAorCQkJCW1hdGNoWzBdID0g bWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOworCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xp Y2UoIDAsIGV4Y2VzcyApOworCQkJfQorCisJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVk ZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKKwkJCXJl dHVybiBtYXRjaC5zbGljZSggMCwgMyApOworCQl9CisJfSwKKworCWZpbHRlcjogeworCisJCSJU QUciOiBmdW5jdGlvbiggbm9kZU5hbWUgKSB7CisJCQlpZiAoIG5vZGVOYW1lID09PSAiKiIgKSB7 CisJCQkJcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfTsKKwkJCX0KKworCQkJbm9k ZU5hbWUgPSBub2RlTmFtZS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJD YXNlKCk7CisJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJcmV0dXJuIGVsZW0ubm9k ZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKKwkJCX07 CisJCX0sCisKKwkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKKwkJCXZhciBwYXR0 ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgIiAiIF07CisKKwkJCXJldHVybiBwYXR0ZXJu IHx8CisJCQkJKHBhdHRlcm4gPSBuZXcgUmVnRXhwKCAiKF58IiArIHdoaXRlc3BhY2UgKyAiKSIg KyBjbGFzc05hbWUgKyAiKCIgKyB3aGl0ZXNwYWNlICsgInwkKSIgKSkgJiYKKwkJCQljbGFzc0Nh Y2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCQlyZXR1cm4gcGF0dGVybi50 ZXN0KCBlbGVtLmNsYXNzTmFtZSB8fCAodHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1 bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpIHx8ICIiICk7CisJCQkJfSk7 CisJCX0sCisKKwkJIkFUVFIiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkgewor CQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXZhciByZXN1bHQgPSBTaXp6bGUuYXR0 ciggZWxlbSwgbmFtZSApOworCisJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKKwkJCQkJcmV0 dXJuIG9wZXJhdG9yID09PSAiIT0iOworCQkJCX0KKwkJCQlpZiAoICFvcGVyYXRvciApIHsKKwkJ CQkJcmV0dXJuIHRydWU7CisJCQkJfQorCisJCQkJcmVzdWx0ICs9ICIiOworCisJCQkJcmV0dXJu IG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKKwkJCQkJb3BlcmF0b3IgPT09 ICIhPSIgPyByZXN1bHQgIT09IGNoZWNrIDoKKwkJCQkJb3BlcmF0b3IgPT09ICJePSIgPyBjaGVj ayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6CisJCQkJCW9wZXJhdG9yID09PSAi Kj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CisJCQkJCW9wZXJh dG9yID09PSAiJD0iID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09 IGNoZWNrIDoKKwkJCQkJb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiArIHJlc3VsdCArICIgIiAp LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CisJCQkJCW9wZXJhdG9yID09PSAifD0iID8gcmVzdWx0 ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hl Y2sgKyAiLSIgOgorCQkJCQlmYWxzZTsKKwkJCX07CisJCX0sCisKKwkJIkNISUxEIjogZnVuY3Rp b24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHsKKwkJCXZhciBzaW1wbGUg PSB0eXBlLnNsaWNlKCAwLCAzICkgIT09ICJudGgiLAorCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNl KCAtNCApICE9PSAibGFzdCIsCisJCQkJb2ZUeXBlID0gd2hhdCA9PT0gIm9mLXR5cGUiOworCisJ CQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CisKKwkJCQkvLyBTaG9ydGN1dCBm b3IgOm50aC0qKG4pCisJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCXJldHVybiAhIWVsZW0u cGFyZW50Tm9kZTsKKwkJCQl9IDoKKworCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwg KSB7CisJCQkJCXZhciBjYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgZGlmZiwgbm9kZUluZGV4LCBz dGFydCwKKwkJCQkJCWRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/ICJuZXh0U2libGluZyIgOiAi cHJldmlvdXNTaWJsaW5nIiwKKwkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKKwkJCQkJ CW5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAorCQkJCQkJdXNl Q2FjaGUgPSAheG1sICYmICFvZlR5cGU7CisKKwkJCQkJaWYgKCBwYXJlbnQgKSB7CisKKwkJCQkJ CS8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSkKKwkJCQkJCWlmICggc2ltcGxl ICkgeworCQkJCQkJCXdoaWxlICggZGlyICkgeworCQkJCQkJCQlub2RlID0gZWxlbTsKKwkJCQkJ CQkJd2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHsKKwkJCQkJCQkJCWlmICggb2ZUeXBl ID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9 PT0gMSApIHsKKwkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0K KwkJCQkJCQkJLy8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3Qg eWV0IGRvbmUgc28pCisJCQkJCQkJCXN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gIm9ubHkiICYmICFz dGFydCAmJiAibmV4dFNpYmxpbmciOworCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJ CQkJCX0KKworCQkJCQkJc3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBh cmVudC5sYXN0Q2hpbGQgXTsKKworCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3Rv cmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKKwkJCQkJCWlmICggZm9yd2FyZCAmJiB1c2VDYWNo ZSApIHsKKwkJCQkJCQkvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5k ZXgKKwkJCQkJCQlvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhw YW5kbyBdID0ge30pOworCQkJCQkJCWNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdOwor CQkJCQkJCW5vZGVJbmRleCA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzFdOworCQkJ CQkJCWRpZmYgPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTsKKwkJCQkJCQlub2Rl ID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTsKKworCQkJCQkJ CXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisK KwkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKKwkJ CQkJCQkJKGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7CisKKwkJCQkJ CQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKKwkJ CQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVt ICkgeworCQkJCQkJCQkJb3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgs IGRpZmYgXTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkv LyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGUKKwkJCQkJ CX0gZWxzZSBpZiAoIHVzZUNhY2hlICYmIChjYWNoZSA9IChlbGVtWyBleHBhbmRvIF0gfHwgKGVs ZW1bIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSkgJiYgY2FjaGVbMF0gPT09IGRpcnJ1bnMgKSB7 CisJCQkJCQkJZGlmZiA9IGNhY2hlWzFdOworCisJCQkJCQkvLyB4bWwgOm50aC1jaGlsZCguLi4p IG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLikKKwkJ CQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2Vl ayBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKKwkJCQkJCQl3aGlsZSAoIChub2RlID0gKytub2RlSW5k ZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fAorCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9 IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKKworCQkJCQkJCQlpZiAoICggb2ZUeXBlID8gbm9kZS5u b2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApICYm ICsrZGlmZiApIHsKKwkJCQkJCQkJCS8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRl cmVkIGVsZW1lbnQKKwkJCQkJCQkJCWlmICggdXNlQ2FjaGUgKSB7CisJCQkJCQkJCQkJKG5vZGVb IGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdID0gWyBkaXJydW5z LCBkaWZmIF07CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCWlmICggbm9kZSA9PT0gZWxlbSApIHsK KwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJ CX0KKworCQkJCQkJLy8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0 IGN5Y2xlIHNpemUKKwkJCQkJCWRpZmYgLT0gbGFzdDsKKwkJCQkJCXJldHVybiBkaWZmID09PSBm aXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOworCQkJ CQl9CisJCQkJfTsKKwkJfSwKKworCQkiUFNFVURPIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1l bnQgKSB7CisJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKKwkJ CS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXMKKwkJCS8v IFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFy ZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzCisJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZp bHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCisJCQl2YXIgYXJncywKKwkJCQlmbiA9IEV4cHIu cHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2Uo KSBdIHx8CisJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVk byApOworCisJCQkvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0 aGF0CisJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5j dGlvbgorCQkJLy8ganVzdCBhcyBTaXp6bGUgZG9lcworCQkJaWYgKCBmblsgZXhwYW5kbyBdICkg eworCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKKwkJCX0KKworCQkJLy8gQnV0IG1haW50YWlu IHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCisJCQlpZiAoIGZuLmxlbmd0aCA+IDEgKSB7CisJ CQkJYXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOworCQkJCXJldHVybiBF eHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwor CQkJCQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CisJCQkJCQl2YXIg aWR4LAorCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKKwkJCQkJCQlpID0g bWF0Y2hlZC5sZW5ndGg7CisJCQkJCQl3aGlsZSAoIGktLSApIHsKKwkJCQkJCQlpZHggPSBpbmRl eE9mLmNhbGwoIHNlZWQsIG1hdGNoZWRbaV0gKTsKKwkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1h dGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOworCQkJCQkJfQorCQkJCQl9KSA6CisJCQkJCWZ1 bmN0aW9uKCBlbGVtICkgeworCQkJCQkJcmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7CisJCQkJ CX07CisJCQl9CisKKwkJCXJldHVybiBmbjsKKwkJfQorCX0sCisKKwlwc2V1ZG9zOiB7CisJCS8v IFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvcworCQkibm90IjogbWFya0Z1bmN0aW9uKGZ1bmN0 aW9uKCBzZWxlY3RvciApIHsKKwkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21w aWxlCisJCQkvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZworCQkJLy8g c3BhY2VzIGFzIGNvbWJpbmF0b3JzCisJCQl2YXIgaW5wdXQgPSBbXSwKKwkJCQlyZXN1bHRzID0g W10sCisJCQkJbWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEi ICkgKTsKKworCQkJcmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/CisJCQkJbWFya0Z1bmN0aW9u KGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7CisJCQkJCXZhciBlbGVt LAorCQkJCQkJdW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLAorCQkJ CQkJaSA9IHNlZWQubGVuZ3RoOworCisJCQkJCS8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBi eSBgbWF0Y2hlcmAKKwkJCQkJd2hpbGUgKCBpLS0gKSB7CisJCQkJCQlpZiAoIChlbGVtID0gdW5t YXRjaGVkW2ldKSApIHsKKwkJCQkJCQlzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7CisJ CQkJCQl9CisJCQkJCX0KKwkJCQl9KSA6CisJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHht bCApIHsKKwkJCQkJaW5wdXRbMF0gPSBlbGVtOworCQkJCQltYXRjaGVyKCBpbnB1dCwgbnVsbCwg eG1sLCByZXN1bHRzICk7CisJCQkJCXJldHVybiAhcmVzdWx0cy5wb3AoKTsKKwkJCQl9OworCQl9 KSwKKworCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJCXJl dHVybiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQlyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxl bSApLmxlbmd0aCA+IDA7CisJCQl9OworCQl9KSwKKworCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rp b24oZnVuY3Rpb24oIHRleHQgKSB7CisJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJ cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBl bGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTsKKwkJCX07CisJCX0pLAorCisJCS8vICJXaGV0 aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCisJCS8v IGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlCisJCS8vIGJl aW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsCisJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRo ZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgorCQkvLyBUaGUgbWF0 Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9y bWVkIGNhc2UtaW5zZW5zaXRpdmVseS4KKwkJLy8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBo YXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS4iCisJCS8vIGh0dHA6Ly93d3cudzMub3Jn L1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KKwkJImxhbmciOiBtYXJrRnVuY3Rpb24oIGZ1bmN0 aW9uKCBsYW5nICkgeworCQkJLy8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmlk ZXIKKwkJCWlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCAiIikgKSB7CisJCQkJU2l6emxl LmVycm9yKCAidW5zdXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKKwkJCX0KKwkJCWxhbmcgPSBs YW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKKwkJCXJl dHVybiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl2YXIgZWxlbUxhbmc7CisJCQkJZG8geworCQkJ CQlpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNYTUwgPworCQkJCQkJZWxlbS5nZXRBdHRyaWJ1 dGUoInhtbDpsYW5nIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSA6CisJCQkJCQllbGVt LmxhbmcpICkgeworCisJCQkJCQllbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7CisJ CQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyAr ICItIiApID09PSAwOworCQkJCQl9CisJCQkJfSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnRO b2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfTsK KwkJfSksCisKKwkJLy8gTWlzY2VsbGFuZW91cworCQkidGFyZ2V0IjogZnVuY3Rpb24oIGVsZW0g KSB7CisJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFz aDsKKwkJCXJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDsKKwkJfSwK KworCQkicm9vdCI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0gPT09IGRvY0Vs ZW07CisJCX0sCisKKwkJImZvY3VzIjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxl bSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRv Y3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0u dGFiSW5kZXgpOworCQl9LAorCisJCS8vIEJvb2xlYW4gcHJvcGVydGllcworCQkiZW5hYmxlZCI6 IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlOwor CQl9LAorCisJCSJkaXNhYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0u ZGlzYWJsZWQgPT09IHRydWU7CisJCX0sCisKKwkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSAp IHsKKwkJCS8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFu ZCBzZWxlY3RlZCBlbGVtZW50cworCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMt Y3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKKwkJCXZhciBub2RlTmFtZSA9IGVsZW0u bm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCXJldHVybiAobm9kZU5hbWUgPT09ICJpbnB1dCIg JiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gIm9wdGlvbiIgJiYgISFlbGVtLnNl bGVjdGVkKTsKKwkJfSwKKworCQkic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8v IEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKKwkJCS8v IG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKKwkJCWlmICggZWxlbS5wYXJlbnROb2Rl ICkgeworCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCQkJfQorCisJCQlyZXR1 cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKwkJfSwKKworCQkvLyBDb250ZW50cworCQkiZW1w dHkiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVj dG9ycy8jZW1wdHktcHNldWRvCisJCQkvLyA6ZW1wdHkgaXMgb25seSBhZmZlY3RlZCBieSBlbGVt ZW50IG5vZGVzIGFuZCBjb250ZW50IG5vZGVzKGluY2x1ZGluZyB0ZXh0KDMpLCBjZGF0YSg0KSks CisJCQkvLyAgIG5vdCBjb21tZW50LCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgb3Igb3RoZXJz CisJCQkvLyBUaGFua3MgdG8gRGllZ28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXQK KwkJCS8vICAgR3JlYXRlciB0aGFuICJAIiBtZWFucyBhbHBoYSBjaGFyYWN0ZXJzIChzcGVjaWZp Y2FsbHkgbm90IHN0YXJ0aW5nIHdpdGggIiMiIG9yICI/IikKKwkJCWZvciAoIGVsZW0gPSBlbGVt LmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgeworCQkJCWlmICgg ZWxlbS5ub2RlTmFtZSA+ICJAIiB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5 cGUgPT09IDQgKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4g dHJ1ZTsKKwkJfSwKKworCQkicGFyZW50IjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4g IUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOworCQl9LAorCisJCS8vIEVsZW1lbnQvaW5w dXQgdHlwZXMKKwkJImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIHJoZWFk ZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9LAorCisJCSJpbnB1dCI6IGZ1bmN0aW9uKCBl bGVtICkgeworCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9LAor CisJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBuYW1lID0gZWxlbS5ub2Rl TmFtZS50b0xvd2VyQ2FzZSgpOworCQkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50 eXBlID09PSAiYnV0dG9uIiB8fCBuYW1lID09PSAiYnV0dG9uIjsKKwkJfSwKKworCQkidGV4dCI6 IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJdmFyIGF0dHI7CisJCQkvLyBJRTYgYW5kIDcgd2lsbCBt YXAgZWxlbS50eXBlIHRvICd0ZXh0JyBmb3IgbmV3IEhUTUw1IHR5cGVzIChzZWFyY2gsIGV0YykK KwkJCS8vIHVzZSBnZXRBdHRyaWJ1dGUgaW5zdGVhZCB0byB0ZXN0IHRoaXMgY2FzZQorCQkJcmV0 dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJgorCQkJCWVsZW0u dHlwZSA9PT0gInRleHQiICYmCisJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBl IikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBlbGVtLnR5cGUgKTsKKwkJfSwK KworCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCisJCSJmaXJzdCI6IGNyZWF0ZVBvc2l0aW9u YWxQc2V1ZG8oZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4gWyAwIF07CisJCX0pLAorCisJCSJsYXN0 IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgg KSB7CisJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CisJCX0pLAorCisJCSJlcSI6IGNyZWF0ZVBv c2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCAp IHsKKwkJCXJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1l bnQgXTsKKwkJfSksCisKKwkJImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9u KCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKKwkJCXZhciBpID0gMDsKKwkJCWZvciAoIDsgaSA8 IGxlbmd0aDsgaSArPSAyICkgeworCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisJCQl9CisJ CQlyZXR1cm4gbWF0Y2hJbmRleGVzOworCQl9KSwKKworCQkib2RkIjogY3JlYXRlUG9zaXRpb25h bFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisJCQl2YXIgaSA9IDE7 CisJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKKwkJCQltYXRjaEluZGV4ZXMucHVz aCggaSApOworCQkJfQorCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKKwkJfSksCisKKwkJImx0Ijog Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFy Z3VtZW50ICkgeworCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6 IGFyZ3VtZW50OworCQkJZm9yICggOyAtLWkgPj0gMDsgKSB7CisJCQkJbWF0Y2hJbmRleGVzLnB1 c2goIGkgKTsKKwkJCX0KKwkJCXJldHVybiBtYXRjaEluZGV4ZXM7CisJCX0pLAorCisJCSJndCI6 IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBh cmd1bWVudCApIHsKKwkJCXZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGgg OiBhcmd1bWVudDsKKwkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKKwkJCQltYXRjaEluZGV4 ZXMucHVzaCggaSApOworCQkJfQorCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKKwkJfSkKKwl9Cit9 OworCisvLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvcworZm9yICggaSBpbiB7IHJhZGlv OiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdl OiB0cnVlIH0gKSB7CisJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSAp OworfQorZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHsKKwlFeHBy LnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOworfQorCitmdW5jdGlvbiB0 b2tlbml6ZSggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKKwl2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRv a2VucywgdHlwZSwKKwkJc29GYXIsIGdyb3VwcywgcHJlRmlsdGVycywKKwkJY2FjaGVkID0gdG9r ZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKKworCWlmICggY2FjaGVkICkgeworCQlyZXR1cm4g cGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOworCX0KKworCXNvRmFyID0gc2VsZWN0 b3I7CisJZ3JvdXBzID0gW107CisJcHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyOworCisJd2hp bGUgKCBzb0ZhciApIHsKKworCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCisJCWlmICggIW1hdGNo ZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkgeworCQkJaWYgKCBtYXRjaCAp IHsKKwkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAorCQkJCXNv RmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOworCQkJfQorCQkJ Z3JvdXBzLnB1c2goIHRva2VucyA9IFtdICk7CisJCX0KKworCQltYXRjaGVkID0gZmFsc2U7CisK KwkJLy8gQ29tYmluYXRvcnMKKwkJaWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29G YXIgKSkgKSB7CisJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKKwkJCXRva2Vucy5wdXNoKCB7 CisJCQkJdmFsdWU6IG1hdGNoZWQsCisJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3Jz IHRvIHNwYWNlCisJCQkJdHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApCisJCQl9 ICk7CisJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOworCQl9CisKKwkJ Ly8gRmlsdGVycworCQlmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkgeworCQkJaWYgKCAobWF0 Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5 cGUgXSB8fAorCQkJCShtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgewor CQkJCW1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOworCQkJCXRva2Vucy5wdXNoKCB7CisJCQkJCXZh bHVlOiBtYXRjaGVkLAorCQkJCQl0eXBlOiB0eXBlLAorCQkJCQltYXRjaGVzOiBtYXRjaAorCQkJ CX0gKTsKKwkJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOworCQkJfQor CQl9CisKKwkJaWYgKCAhbWF0Y2hlZCApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gUmV0 dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzCisJLy8gaWYgd2UncmUganVzdCBw YXJzaW5nCisJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCisJ cmV0dXJuIHBhcnNlT25seSA/CisJCXNvRmFyLmxlbmd0aCA6CisJCXNvRmFyID8KKwkJCVNpenps ZS5lcnJvciggc2VsZWN0b3IgKSA6CisJCQkvLyBDYWNoZSB0aGUgdG9rZW5zCisJCQl0b2tlbkNh Y2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKK30KKworZnVuY3Rpb24gdG9TZWxl Y3RvciggdG9rZW5zICkgeworCXZhciBpID0gMCwKKwkJbGVuID0gdG9rZW5zLmxlbmd0aCwKKwkJ c2VsZWN0b3IgPSAiIjsKKwlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJc2VsZWN0b3IgKz0g dG9rZW5zW2ldLnZhbHVlOworCX0KKwlyZXR1cm4gc2VsZWN0b3I7Cit9CisKK2Z1bmN0aW9uIGFk ZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7CisJdmFyIGRpciA9IGNv bWJpbmF0b3IuZGlyLAorCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09ICJwYXJl bnROb2RlIiwKKwkJZG9uZU5hbWUgPSBkb25lKys7CisKKwlyZXR1cm4gY29tYmluYXRvci5maXJz dCA/CisJCS8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVu dAorCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworCQkJd2hpbGUgKCAoZWxlbSA9 IGVsZW1bIGRpciBdKSApIHsKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tO b25FbGVtZW50cyApIHsKKwkJCQkJcmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCAp OworCQkJCX0KKwkJCX0KKwkJfSA6CisKKwkJLy8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3Iv cHJlY2VkaW5nIGVsZW1lbnRzCisJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisJ CQl2YXIgZGF0YSwgY2FjaGUsIG91dGVyQ2FjaGUsCisJCQkJZGlya2V5ID0gZGlycnVucyArICIg IiArIGRvbmVOYW1lOworCisJCQkvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1M IG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBkaXIgY2FjaGluZworCQkJaWYgKCB4 bWwgKSB7CisJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKwkJCQkJaWYgKCBl bGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CisJCQkJCQlpZiAoIG1h dGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgeworCQkJCQkJCXJldHVybiB0cnVlOworCQkJ CQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoIChlbGVtID0gZWxl bVsgZGlyIF0pICkgeworCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25F bGVtZW50cyApIHsKKwkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1b IGV4cGFuZG8gXSA9IHt9KTsKKwkJCQkJCWlmICggKGNhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0p ICYmIGNhY2hlWzBdID09PSBkaXJrZXkgKSB7CisJCQkJCQkJaWYgKCAoZGF0YSA9IGNhY2hlWzFd KSA9PT0gdHJ1ZSB8fCBkYXRhID09PSBjYWNoZWRydW5zICkgeworCQkJCQkJCQlyZXR1cm4gZGF0 YSA9PT0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNhY2hlID0gb3V0 ZXJDYWNoZVsgZGlyIF0gPSBbIGRpcmtleSBdOworCQkJCQkJCWNhY2hlWzFdID0gbWF0Y2hlcigg ZWxlbSwgY29udGV4dCwgeG1sICkgfHwgY2FjaGVkcnVuczsKKwkJCQkJCQlpZiAoIGNhY2hlWzFd ID09PSB0cnVlICkgeworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJ CQkJCX0KKwkJCQl9CisJCQl9CisJCX07Cit9CisKK2Z1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBt YXRjaGVycyApIHsKKwlyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CisJCWZ1bmN0aW9uKCBl bGVtLCBjb250ZXh0LCB4bWwgKSB7CisJCQl2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsKKwkJCXdo aWxlICggaS0tICkgeworCQkJCWlmICggIW1hdGNoZXJzW2ldKCBlbGVtLCBjb250ZXh0LCB4bWwg KSApIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOwor CQl9IDoKKwkJbWF0Y2hlcnNbMF07Cit9CisKK2Z1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQs IG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7CisJdmFyIGVsZW0sCisJCW5ld1VubWF0Y2hl ZCA9IFtdLAorCQlpID0gMCwKKwkJbGVuID0gdW5tYXRjaGVkLmxlbmd0aCwKKwkJbWFwcGVkID0g bWFwICE9IG51bGw7CisKKwlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJaWYgKCAoZWxlbSA9 IHVubWF0Y2hlZFtpXSkgKSB7CisJCQlpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250 ZXh0LCB4bWwgKSApIHsKKwkJCQluZXdVbm1hdGNoZWQucHVzaCggZWxlbSApOworCQkJCWlmICgg bWFwcGVkICkgeworCQkJCQltYXAucHVzaCggaSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwor CXJldHVybiBuZXdVbm1hdGNoZWQ7Cit9CisKK2Z1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRl ciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3Rv ciApIHsKKwlpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHsKKwkJ cG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKKwl9CisJaWYgKCBwb3N0Rmlu ZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7CisJCXBvc3RGaW5kZXIgPSBzZXRNYXRj aGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKKwl9CisJcmV0dXJuIG1hcmtGdW5jdGlv bihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgeworCQl2YXIgdGVtcCwg aSwgZWxlbSwKKwkJCXByZU1hcCA9IFtdLAorCQkJcG9zdE1hcCA9IFtdLAorCQkJcHJlZXhpc3Rp bmcgPSByZXN1bHRzLmxlbmd0aCwKKworCQkJLy8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBz ZWVkIG9yIGNvbnRleHQKKwkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxl Y3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtd ICksCisKKwkJCS8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBh IG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvbgorCQkJbWF0Y2hlckluID0gcHJl RmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisJCQkJY29uZGVuc2UoIGVsZW1zLCBw cmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorCQkJCWVsZW1zLAorCisJCQltYXRj aGVyT3V0ID0gbWF0Y2hlciA/CisJCQkJLy8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZp bHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0 cywKKwkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8 IHBvc3RGaWx0ZXIgKSA/CisKKwkJCQkJLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMg bmVjZXNzYXJ5CisJCQkJCVtdIDoKKworCQkJCQkvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMg ZGlyZWN0bHkKKwkJCQkJcmVzdWx0cyA6CisJCQkJbWF0Y2hlckluOworCisJCS8vIEZpbmQgcHJp bWFyeSBtYXRjaGVzCisJCWlmICggbWF0Y2hlciApIHsKKwkJCW1hdGNoZXIoIG1hdGNoZXJJbiwg bWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7CisJCX0KKworCQkvLyBBcHBseSBwb3N0RmlsdGVy CisJCWlmICggcG9zdEZpbHRlciApIHsKKwkJCXRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwg cG9zdE1hcCApOworCQkJcG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApOworCisJ CQkvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0 Y2hlckluCisJCQlpID0gdGVtcC5sZW5ndGg7CisJCQl3aGlsZSAoIGktLSApIHsKKwkJCQlpZiAo IChlbGVtID0gdGVtcFtpXSkgKSB7CisJCQkJCW1hdGNoZXJPdXRbIHBvc3RNYXBbaV0gXSA9ICEo bWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlp ZiAoIHNlZWQgKSB7CisJCQlpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkgeworCQkJCWlm ICggcG9zdEZpbmRlciApIHsKKwkJCQkJLy8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNv bmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzCisJCQkJ CXRlbXAgPSBbXTsKKwkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworCQkJCQl3aGlsZSAoIGkt LSApIHsKKwkJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHsKKwkJCQkJCQkvLyBS ZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAorCQkJ CQkJCXRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7CisJCQkJCQl9CisJCQkJCX0K KwkJCQkJcG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApOwor CQkJCX0KKworCQkJCS8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0 cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkCisJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwor CQkJCXdoaWxlICggaS0tICkgeworCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiYK KwkJCQkJCSh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YuY2FsbCggc2VlZCwgZWxlbSApIDog cHJlTWFwW2ldKSA+IC0xICkgeworCisJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBd ID0gZWxlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJLy8gQWRkIGVsZW1lbnRzIHRvIHJl c3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkCisJCX0gZWxzZSB7CisJCQltYXRj aGVyT3V0ID0gY29uZGVuc2UoCisJCQkJbWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/CisJCQkJCW1h dGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CisJCQkJ CW1hdGNoZXJPdXQKKwkJCSk7CisJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CisJCQkJcG9zdEZpbmRl ciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7CisJCQl9IGVsc2UgeworCQkJCXB1 c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKKwkJCX0KKwkJfQorCX0pOworfQorCitm dW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgeworCXZhciBjaGVja0NvbnRleHQs IG1hdGNoZXIsIGosCisJCWxlbiA9IHRva2Vucy5sZW5ndGgsCisJCWxlYWRpbmdSZWxhdGl2ZSA9 IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCisJCWltcGxpY2l0UmVsYXRpdmUgPSBs ZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsiICJdLAorCQlpID0gbGVhZGluZ1JlbGF0 aXZlID8gMSA6IDAsCisKKwkJLy8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhh dCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocykKKwkJbWF0 Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4g ZWxlbSA9PT0gY2hlY2tDb250ZXh0OworCQl9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCisJ CW1hdGNoQW55Q29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJ cmV0dXJuIGluZGV4T2YuY2FsbCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTsKKwkJfSwgaW1w bGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAorCQltYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNv bnRleHQsIHhtbCApIHsKKwkJCXJldHVybiAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwg Y29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKAorCQkJCShjaGVja0NvbnRleHQg PSBjb250ZXh0KS5ub2RlVHlwZSA/CisJCQkJCW1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwg eG1sICkgOgorCQkJCQltYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7CisJ CX0gXTsKKworCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQlpZiAoIChtYXRjaGVyID0gRXhw ci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7CisJCQltYXRjaGVycyA9IFsgYWRkQ29t YmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKKwkJfSBlbHNl IHsKKwkJCW1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVs bCwgdG9rZW5zW2ldLm1hdGNoZXMgKTsKKworCQkJLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVp bmcgYSBwb3NpdGlvbmFsIG1hdGNoZXIKKwkJCWlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkgewor CQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3Bl ciBoYW5kbGluZworCQkJCWogPSArK2k7CisJCQkJZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CisJ CQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKwkJCQkJCWJyZWFr OworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBzZXRNYXRjaGVyKAorCQkJCQlpID4gMSAmJiBl bGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwKKwkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvciggdG9r ZW5zLnNsaWNlKCAwLCBpIC0gMSApICkucmVwbGFjZSggcnRyaW0sICIkMSIgKSwKKwkJCQkJbWF0 Y2hlciwKKwkJCQkJaSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwg aiApICksCisJCQkJCWogPCBsZW4gJiYgbWF0Y2hlckZyb21Ub2tlbnMoICh0b2tlbnMgPSB0b2tl bnMuc2xpY2UoIGogKSkgKSwKKwkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQor CQkJCSk7CisJCQl9CisJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CisJCX0KKwl9CisKKwly ZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7Cit9CisKK2Z1bmN0aW9uIG1hdGNoZXJG cm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHsKKwkvLyBB IGNvdW50ZXIgdG8gc3BlY2lmeSB3aGljaCBlbGVtZW50IGlzIGN1cnJlbnRseSBiZWluZyBtYXRj aGVkCisJdmFyIG1hdGNoZXJDYWNoZWRSdW5zID0gMCwKKwkJYnlTZXQgPSBzZXRNYXRjaGVycy5s ZW5ndGggPiAwLAorCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKKwkJ c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgZXhw YW5kQ29udGV4dCApIHsKKwkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAorCQkJCXNldE1hdGNoZWQg PSBbXSwKKwkJCQltYXRjaGVkQ291bnQgPSAwLAorCQkJCWkgPSAiMCIsCisJCQkJdW5tYXRjaGVk ID0gc2VlZCAmJiBbXSwKKwkJCQlvdXRlcm1vc3QgPSBleHBhbmRDb250ZXh0ICE9IG51bGwsCisJ CQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCisJCQkJLy8gV2UgbXVzdCBhbHdh eXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBjb250ZXh0CisJCQkJZWxlbXMgPSBzZWVk IHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbIlRBRyJdKCAiKiIsIGV4cGFuZENvbnRleHQgJiYg Y29udGV4dC5wYXJlbnROb2RlIHx8IGNvbnRleHQgKSwKKwkJCQkvLyBVc2UgaW50ZWdlciBkaXJy dW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgorCQkJCWRpcnJ1bnNVbmlxdWUg PSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8 fCAwLjEpOworCisJCQlpZiAoIG91dGVybW9zdCApIHsKKwkJCQlvdXRlcm1vc3RDb250ZXh0ID0g Y29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKKwkJCQljYWNoZWRydW5zID0gbWF0Y2hl ckNhY2hlZFJ1bnM7CisJCQl9CisKKwkJCS8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRN YXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzCisJCQkvLyBLZWVwIGBpYCBhIHN0cmluZyBpZiB0 aGVyZSBhcmUgbm8gZWxlbWVudHMgc28gYG1hdGNoZWRDb3VudGAgd2lsbCBiZSAiMDAiIGJlbG93 CisJCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAo IGJ5RWxlbWVudCAmJiBlbGVtICkgeworCQkJCQlqID0gMDsKKwkJCQkJd2hpbGUgKCAobWF0Y2hl ciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKKwkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwg Y29udGV4dCwgeG1sICkgKSB7CisJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CisJCQkJCQkJ YnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKCBvdXRlcm1vc3QgKSB7CisJCQkJCQlk aXJydW5zID0gZGlycnVuc1VuaXF1ZTsKKwkJCQkJCWNhY2hlZHJ1bnMgPSArK21hdGNoZXJDYWNo ZWRSdW5zOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRz IGZvciBzZXQgZmlsdGVycworCQkJCWlmICggYnlTZXQgKSB7CisJCQkJCS8vIFRoZXkgd2lsbCBo YXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnMKKwkJCQkJaWYgKCAoZWxlbSA9 ICFtYXRjaGVyICYmIGVsZW0pICkgeworCQkJCQkJbWF0Y2hlZENvdW50LS07CisJCQkJCX0KKwor CQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Ig bm90CisJCQkJCWlmICggc2VlZCApIHsKKwkJCQkJCXVubWF0Y2hlZC5wdXNoKCBlbGVtICk7CisJ CQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hl ZCBlbGVtZW50cworCQkJbWF0Y2hlZENvdW50ICs9IGk7CisJCQlpZiAoIGJ5U2V0ICYmIGkgIT09 IG1hdGNoZWRDb3VudCApIHsKKwkJCQlqID0gMDsKKwkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0 TWF0Y2hlcnNbaisrXSkgKSB7CisJCQkJCW1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwg Y29udGV4dCwgeG1sICk7CisJCQkJfQorCisJCQkJaWYgKCBzZWVkICkgeworCQkJCQkvLyBSZWlu dGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5n CisJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKKwkJCQkJCXdoaWxlICggaS0tICkgewor CQkJCQkJCWlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7CisJCQkJCQkJ CXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOworCQkJCQkJCX0KKwkJCQkJCX0K KwkJCQkJfQorCisJCQkJCS8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdl dCBvbmx5IGFjdHVhbCBtYXRjaGVzCisJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0 Y2hlZCApOworCQkJCX0KKworCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKKwkJCQlwdXNo LmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7CisKKwkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0 Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNv cnRpbmcKKwkJCQlpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+ IDAgJiYKKwkJCQkJKCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7 CisKKwkJCQkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKKwkJCQl9CisJCQl9CisKKwkJ CS8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVycwor CQkJaWYgKCBvdXRlcm1vc3QgKSB7CisJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CisJCQkJ b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7CisJCQl9CisKKwkJCXJldHVybiB1bm1h dGNoZWQ7CisJCX07CisKKwlyZXR1cm4gYnlTZXQgPworCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0 Y2hlciApIDoKKwkJc3VwZXJNYXRjaGVyOworfQorCitjb21waWxlID0gU2l6emxlLmNvbXBpbGUg PSBmdW5jdGlvbiggc2VsZWN0b3IsIGdyb3VwIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewor CXZhciBpLAorCQlzZXRNYXRjaGVycyA9IFtdLAorCQllbGVtZW50TWF0Y2hlcnMgPSBbXSwKKwkJ Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKKworCWlmICggIWNhY2hl ZCApIHsKKwkJLy8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRo YXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50CisJCWlmICggIWdyb3VwICkgewor CQkJZ3JvdXAgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKKwkJfQorCQlpID0gZ3JvdXAubGVuZ3Ro OworCQl3aGlsZSAoIGktLSApIHsKKwkJCWNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBncm91 cFtpXSApOworCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKKwkJCQlzZXRNYXRjaGVycy5w dXNoKCBjYWNoZWQgKTsKKwkJCX0gZWxzZSB7CisJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNh Y2hlZCApOworCQkJfQorCQl9CisKKwkJLy8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uCisJ CWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hl cnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApOworCX0KKwlyZXR1cm4gY2FjaGVk OworfTsKKworZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCBy ZXN1bHRzICkgeworCXZhciBpID0gMCwKKwkJbGVuID0gY29udGV4dHMubGVuZ3RoOworCWZvciAo IDsgaSA8IGxlbjsgaSsrICkgeworCQlTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVz dWx0cyApOworCX0KKwlyZXR1cm4gcmVzdWx0czsKK30KKworZnVuY3Rpb24gc2VsZWN0KCBzZWxl Y3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKKwl2YXIgaSwgdG9rZW5zLCB0b2tlbiwg dHlwZSwgZmluZCwKKwkJbWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKKworCWlmICggIXNl ZWQgKSB7CisJCS8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkg b25lIGdyb3VwCisJCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgeworCisJCQkvLyBUYWtlIGEg c2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJ RAorCQkJdG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApOworCQkJaWYgKCB0 b2tlbnMubGVuZ3RoID4gMiAmJiAodG9rZW4gPSB0b2tlbnNbMF0pLnR5cGUgPT09ICJJRCIgJiYK KwkJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhZG9jdW1lbnRJc1hNTCAmJgorCQkJCQlF eHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgeworCisJCQkJY29udGV4dCA9IEV4cHIu ZmluZFsiSUQiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2Fw ZSApLCBjb250ZXh0IClbMF07CisJCQkJaWYgKCAhY29udGV4dCApIHsKKwkJCQkJcmV0dXJuIHJl c3VsdHM7CisJCQkJfQorCisJCQkJc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNo aWZ0KCkudmFsdWUubGVuZ3RoICk7CisJCQl9CisKKwkJCS8vIEZldGNoIGEgc2VlZCBzZXQgZm9y IHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmcKKwkJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJd LnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKKwkJCXdoaWxlICggaS0tICkg eworCQkJCXRva2VuID0gdG9rZW5zW2ldOworCisJCQkJLy8gQWJvcnQgaWYgd2UgaGl0IGEgY29t YmluYXRvcgorCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkg eworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBd KSApIHsKKwkJCQkJLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJs aW5nIGNvbWJpbmF0b3JzCisJCQkJCWlmICggKHNlZWQgPSBmaW5kKAorCQkJCQkJdG9rZW4ubWF0 Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAorCQkJCQkJcnNpYmxpbmcu dGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dAor CQkJCQkpKSApIHsKKworCQkJCQkJLy8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVt YWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5CisJCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CisJ CQkJCQlzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApOworCQkJ CQkJaWYgKCAhc2VsZWN0b3IgKSB7CisJCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2Uu Y2FsbCggc2VlZCwgMCApICk7CisJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CisJCQkJCQl9CisKKwkJ CQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gQ29tcGlsZSBh bmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbgorCS8vIFByb3ZpZGUgYG1hdGNoYCB0byBh dm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKwlj b21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSgKKwkJc2VlZCwKKwkJY29udGV4dCwKKwkJZG9jdW1l bnRJc1hNTCwKKwkJcmVzdWx0cywKKwkJcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKQorCSk7CisJ cmV0dXJuIHJlc3VsdHM7Cit9CisKKy8vIERlcHJlY2F0ZWQKK0V4cHIucHNldWRvc1sibnRoIl0g PSBFeHByLnBzZXVkb3NbImVxIl07CisKKy8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0 RmlsdGVycworZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CitFeHByLmZpbHRlcnMgPSBzZXRGaWx0 ZXJzLnByb3RvdHlwZSA9IEV4cHIucHNldWRvczsKK0V4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRG aWx0ZXJzKCk7CisKKy8vIEluaXRpYWxpemUgd2l0aCB0aGUgZGVmYXVsdCBkb2N1bWVudAorc2V0 RG9jdW1lbnQoKTsKKworLy8gT3ZlcnJpZGUgc2l6emxlIGF0dHJpYnV0ZSByZXRyaWV2YWwKK1Np enpsZS5hdHRyID0galF1ZXJ5LmF0dHI7CitqUXVlcnkuZmluZCA9IFNpenpsZTsKK2pRdWVyeS5l eHByID0gU2l6emxlLnNlbGVjdG9yczsKK2pRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5w c2V1ZG9zOworalF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0OworalF1ZXJ5LnRleHQg PSBTaXp6bGUuZ2V0VGV4dDsKK2pRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKK2pRdWVy eS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsKKworCit9KSggd2luZG93ICk7Cit2YXIgcnVu dGlsID0gL1VudGlsJC8sCisJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRp bHxBbGwpKS8sCisJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAorCXJuZWVkc0NvbnRleHQg PSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsCisJLy8gbWV0aG9kcyBndWFyYW50ZWVk IHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXQK KwlndWFyYW50ZWVkVW5pcXVlID0geworCQljaGlsZHJlbjogdHJ1ZSwKKwkJY29udGVudHM6IHRy dWUsCisJCW5leHQ6IHRydWUsCisJCXByZXY6IHRydWUKKwl9OworCitqUXVlcnkuZm4uZXh0ZW5k KHsKKwlmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciBpLCByZXQsIHNlbGYsCisJ CQlsZW4gPSB0aGlzLmxlbmd0aDsKKworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmlu ZyIgKSB7CisJCQlzZWxmID0gdGhpczsKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5 KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCQlmb3IgKCBpID0gMDsgaSA8IGxl bjsgaSsrICkgeworCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkg KSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pICk7CisJCX0KKwor CQlyZXQgPSBbXTsKKwkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkJCWpRdWVyeS5m aW5kKCBzZWxlY3RvciwgdGhpc1sgaSBdLCByZXQgKTsKKwkJfQorCisJCS8vIE5lZWRlZCBiZWNh dXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2Vs ZWN0b3IgKQorCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUo IHJldCApIDogcmV0ICk7CisJCXJldC5zZWxlY3RvciA9ICggdGhpcy5zZWxlY3RvciA/IHRoaXMu c2VsZWN0b3IgKyAiICIgOiAiIiApICsgc2VsZWN0b3I7CisJCXJldHVybiByZXQ7CisJfSwKKwor CWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKKwkJdmFyIGksCisJCQl0YXJnZXRzID0galF1ZXJ5 KCB0YXJnZXQsIHRoaXMgKSwKKwkJCWxlbiA9IHRhcmdldHMubGVuZ3RoOworCisJCXJldHVybiB0 aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCWZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7 CisJCQkJaWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbaV0gKSApIHsKKwkJCQkJ cmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9LAorCisJbm90OiBmdW5jdGlvbigg c2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVj dG9yLCBmYWxzZSkgKTsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJ CXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSApOwor CX0sCisKKwlpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISFzZWxlY3RvciAm JiAoCisJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KKwkJCQkvLyBJZiB0aGlzIGlz IGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUg cmV0dXJuZWQgc2V0CisJCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCBy ZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgorCQkJCXJuZWVkc0NvbnRleHQudGVz dCggc2VsZWN0b3IgKSA/CisJCQkJCWpRdWVyeSggc2VsZWN0b3IsIHRoaXMuY29udGV4dCApLmlu ZGV4KCB0aGlzWzBdICkgPj0gMCA6CisJCQkJCWpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlz ICkubGVuZ3RoID4gMCA6CisJCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCAp OworCX0sCisKKwljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgeworCQl2 YXIgY3VyLAorCQkJaSA9IDAsCisJCQlsID0gdGhpcy5sZW5ndGgsCisJCQlyZXQgPSBbXSwKKwkJ CXBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9y cyAhPT0gInN0cmluZyIgPworCQkJCWpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMu Y29udGV4dCApIDoKKwkJCQkwOworCisJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCWN1ciA9 IHRoaXNbaV07CisKKwkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAh PT0gY29udGV4dCAmJiBjdXIubm9kZVR5cGUgIT09IDExICkgeworCQkJCWlmICggcG9zID8gcG9z LmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVj dG9ycykgKSB7CisJCQkJCXJldC5wdXNoKCBjdXIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJ CWN1ciA9IGN1ci5wYXJlbnROb2RlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0 YWNrKCByZXQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7CisJfSwK KworCS8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KKwkvLyB0 aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKKwlpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7CisK KwkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKKwkJaWYgKCAhZWxlbSAp IHsKKwkJCXJldHVybiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgPyB0aGlzLmZp cnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xOworCQl9CisKKwkJLy8gaW5kZXggaW4gc2VsZWN0 b3IKKwkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4galF1ZXJ5 LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CisJCX0KKworCQkvLyBMb2NhdGUg dGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0dXJuIGpRdWVyeS5pbkFy cmF5KAorCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxl bWVudCBpcyB1c2VkCisJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7CisJ fSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQl2YXIgc2V0ID0g dHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/CisJCQkJalF1ZXJ5KCBzZWxlY3RvciwgY29u dGV4dCApIDoKKwkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2Rl VHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCisJCQlhbGwgPSBqUXVlcnkubWVyZ2Uo IHRoaXMuZ2V0KCksIHNldCApOworCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVu aXF1ZShhbGwpICk7CisJfSwKKworCWFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJ cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KKwkJCXRoaXMucHJldk9iamVjdCA6 IHRoaXMucHJldk9iamVjdC5maWx0ZXIoc2VsZWN0b3IpCisJCSk7CisJfQorfSk7CisKK2pRdWVy eS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7CisKK2Z1bmN0aW9uIHNpYmxpbmcoIGN1 ciwgZGlyICkgeworCWRvIHsKKwkJY3VyID0gY3VyWyBkaXIgXTsKKwl9IHdoaWxlICggY3VyICYm IGN1ci5ub2RlVHlwZSAhPT0gMSApOworCisJcmV0dXJuIGN1cjsKK30KKworalF1ZXJ5LmVhY2go eworCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVu dE5vZGU7CisJCXJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVu dCA6IG51bGw7CisJfSwKKwlwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpR dWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOworCX0sCisJcGFyZW50c1VudGlsOiBmdW5j dGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFy ZW50Tm9kZSIsIHVudGlsICk7CisJfSwKKwluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0 dXJuIHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKwl9LAorCXByZXY6IGZ1bmN0aW9u KCBlbGVtICkgeworCQlyZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsK Kwl9LAorCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmRpcigg ZWxlbSwgIm5leHRTaWJsaW5nIiApOworCX0sCisJcHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7 CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworCX0sCisJ bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisJCXJldHVybiBqUXVlcnku ZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCApOworCX0sCisJcHJldlVudGlsOiBmdW5j dGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJl dmlvdXNTaWJsaW5nIiwgdW50aWwgKTsKKwl9LAorCXNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSAp IHsKKwkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZp cnN0Q2hpbGQsIGVsZW0gKTsKKwl9LAorCWNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJ cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKKwl9LAorCWNvbnRlbnRz OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlm cmFtZSIgKSA/CisJCQllbGVtLmNvbnRlbnREb2N1bWVudCB8fCBlbGVtLmNvbnRlbnRXaW5kb3cu ZG9jdW1lbnQgOgorCQkJalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7CisJfQor fSwgZnVuY3Rpb24oIG5hbWUsIGZuICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24o IHVudGlsLCBzZWxlY3RvciApIHsKKwkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1 bnRpbCApOworCisJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CisJCQlzZWxlY3RvciA9 IHVudGlsOworCQl9CisKKwkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJz dHJpbmciICkgeworCQkJcmV0ID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHJldCApOworCQl9 CisKKwkJcmV0ID0gdGhpcy5sZW5ndGggPiAxICYmICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0g PyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDsKKworCQlpZiAoIHRoaXMubGVuZ3RoID4gMSAm JiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgeworCQkJcmV0ID0gcmV0LnJldmVyc2UoKTsK KwkJfQorCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7CisJfTsKK30pOworCitqUXVl cnkuZXh0ZW5kKHsKKwlmaWx0ZXI6IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkgeworCQlp ZiAoIG5vdCApIHsKKwkJCWV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKKwkJfQorCisJCXJl dHVybiBlbGVtcy5sZW5ndGggPT09IDEgPworCQkJalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9y KGVsZW1zWzBdLCBleHByKSA/IFsgZWxlbXNbMF0gXSA6IFtdIDoKKwkJCWpRdWVyeS5maW5kLm1h dGNoZXMoZXhwciwgZWxlbXMpOworCX0sCisKKwlkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVu dGlsICkgeworCQl2YXIgbWF0Y2hlZCA9IFtdLAorCQkJY3VyID0gZWxlbVsgZGlyIF07CisKKwkJ d2hpbGUgKCBjdXIgJiYgY3VyLm5vZGVUeXBlICE9PSA5ICYmICh1bnRpbCA9PT0gdW5kZWZpbmVk IHx8IGN1ci5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5KCBjdXIgKS5pcyggdW50aWwgKSkgKSB7 CisJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQltYXRjaGVkLnB1c2goIGN1ciAp OworCQkJfQorCQkJY3VyID0gY3VyW2Rpcl07CisJCX0KKwkJcmV0dXJuIG1hdGNoZWQ7CisJfSwK KworCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgeworCQl2YXIgciA9IFtdOworCisJCWZv ciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CisJCQlpZiAoIG4ubm9kZVR5cGUgPT09IDEg JiYgbiAhPT0gZWxlbSApIHsKKwkJCQlyLnB1c2goIG4gKTsKKwkJCX0KKwkJfQorCisJCXJldHVy biByOworCX0KK30pOworCisvLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5 IGZvciBmaWx0ZXIgYW5kIG5vdAorZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVy LCBrZWVwICkgeworCisJLy8gQ2FuJ3QgcGFzcyBudWxsIG9yIHVuZGVmaW5lZCB0byBpbmRleE9m IGluIEZpcmVmb3ggNAorCS8vIFNldCB0byAwIHRvIHNraXAgc3RyaW5nIGNoZWNrCisJcXVhbGlm aWVyID0gcXVhbGlmaWVyIHx8IDA7CisKKwlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZp ZXIgKSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwg aSApIHsKKwkJCXZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7 CisJCQlyZXR1cm4gcmV0VmFsID09PSBrZWVwOworCQl9KTsKKworCX0gZWxzZSBpZiAoIHF1YWxp Zmllci5ub2RlVHlwZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlv biggZWxlbSApIHsKKwkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApID09PSBrZWVwOwor CQl9KTsKKworCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewor CQl2YXIgZmlsdGVyZWQgPSBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7 CisJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKKwkJfSk7CisKKwkJaWYgKCBpc1NpbXBs ZS50ZXN0KCBxdWFsaWZpZXIgKSApIHsKKwkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmll ciwgZmlsdGVyZWQsICFrZWVwKTsKKwkJfSBlbHNlIHsKKwkJCXF1YWxpZmllciA9IGpRdWVyeS5m aWx0ZXIoIHF1YWxpZmllciwgZmlsdGVyZWQgKTsKKwkJfQorCX0KKworCXJldHVybiBqUXVlcnku Z3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiAoIGpRdWVyeS5pbkFy cmF5KCBlbGVtLCBxdWFsaWZpZXIgKSA+PSAwICkgPT09IGtlZXA7CisJfSk7Cit9CitmdW5jdGlv biBjcmVhdGVTYWZlRnJhZ21lbnQoIGRvY3VtZW50ICkgeworCXZhciBsaXN0ID0gbm9kZU5hbWVz LnNwbGl0KCAifCIgKSwKKwkJc2FmZUZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdt ZW50KCk7CisKKwlpZiAoIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQgKSB7CisJCXdoaWxlICggbGlz dC5sZW5ndGggKSB7CisJCQlzYWZlRnJhZy5jcmVhdGVFbGVtZW50KAorCQkJCWxpc3QucG9wKCkK KwkJCSk7CisJCX0KKwl9CisJcmV0dXJuIHNhZmVGcmFnOworfQorCit2YXIgbm9kZU5hbWVzID0g ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWls c3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8IiArCisJCSJoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0 ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsCisJcmlu bGluZWpRdWVyeSA9IC8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csCisJcm5vc2hpbWNhY2hl ID0gbmV3IFJlZ0V4cCgiPCg/OiIgKyBub2RlTmFtZXMgKyAiKVtcXHMvPl0iLCAiaSIpLAorCXJs ZWFkaW5nV2hpdGVzcGFjZSA9IC9eXHMrLywKKwlyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29s fGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dp LAorCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCisJcnRib2R5ID0gLzx0Ym9keS9pLAorCXJodG1s ID0gLzx8JiM/XHcrOy8sCisJcm5vSW5uZXJodG1sID0gLzwoPzpzY3JpcHR8c3R5bGV8bGluaykv aSwKKwltYW5pcHVsYXRpb25fcmNoZWNrYWJsZVR5cGUgPSAvXig/OmNoZWNrYm94fHJhZGlvKSQv aSwKKwkvLyBjaGVja2VkPSJjaGVja2VkIiBvciBjaGVja2VkCisJcmNoZWNrZWQgPSAvY2hlY2tl ZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKKwlyc2NyaXB0VHlwZSA9IC9eJHxcLyg/Omph dmF8ZWNtYSlzY3JpcHQvaSwKKwlyc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVwvKC4qKS8sCisJ cmNsZWFuU2NyaXB0ID0gL15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9n LAorCisJLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMx MzIwMCkKKwl3cmFwTWFwID0geworCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211 bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAorCQlsZWdlbmQ6IFsgMSwgIjxmaWVsZHNldD4iLCAi PC9maWVsZHNldD4iIF0sCisJCWFyZWE6IFsgMSwgIjxtYXA+IiwgIjwvbWFwPiIgXSwKKwkJcGFy YW06IFsgMSwgIjxvYmplY3Q+IiwgIjwvb2JqZWN0PiIgXSwKKwkJdGhlYWQ6IFsgMSwgIjx0YWJs ZT4iLCAiPC90YWJsZT4iIF0sCisJCXRyOiBbIDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5 PjwvdGFibGU+IiBdLAorCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3Jv dXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCisJCXRkOiBbIDMsICI8dGFibGU+PHRib2R5 Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAorCisJCS8vIElFNi04IGNhbid0IHNl cmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3Ms CisJCS8vIHVubGVzcyB3cmFwcGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3Rl cnMgaW4gZnJvbnQgb2YgaXQuCisJCV9kZWZhdWx0OiBqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFs aXplID8gWyAwLCAiIiwgIiIgXSA6IFsgMSwgIlg8ZGl2PiIsICI8L2Rpdj4iICBdCisJfSwKKwlz YWZlRnJhZ21lbnQgPSBjcmVhdGVTYWZlRnJhZ21lbnQoIGRvY3VtZW50ICksCisJZnJhZ21lbnRE aXYgPSBzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpICk7CisKK3dyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKK3dyYXBNYXAudGJv ZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9 IHdyYXBNYXAudGhlYWQ7Cit3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKKworalF1ZXJ5LmZuLmV4 dGVuZCh7CisJdGV4dDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4galF1ZXJ5LmFjY2Vz cyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgeworCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmlu ZWQgPworCQkJCWpRdWVyeS50ZXh0KCB0aGlzICkgOgorCQkJCXRoaXMuZW1wdHkoKS5hcHBlbmQo ICggdGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKS5jcmVhdGVU ZXh0Tm9kZSggdmFsdWUgKSApOworCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCAp OworCX0sCisKKwl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJaWYgKCBqUXVlcnkuaXNG dW5jdGlvbiggaHRtbCApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CisJ CQkJalF1ZXJ5KHRoaXMpLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApOworCQkJfSk7CisJ CX0KKworCQlpZiAoIHRoaXNbMF0gKSB7CisJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUg dGFyZ2V0IGFyb3VuZAorCQkJdmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJE b2N1bWVudCApLmVxKDApLmNsb25lKHRydWUpOworCisJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9k ZSApIHsKKwkJCQl3cmFwLmluc2VydEJlZm9yZSggdGhpc1swXSApOworCQkJfQorCisJCQl3cmFw Lm1hcChmdW5jdGlvbigpIHsKKwkJCQl2YXIgZWxlbSA9IHRoaXM7CisKKwkJCQl3aGlsZSAoIGVs ZW0uZmlyc3RDaGlsZCAmJiBlbGVtLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJ CWVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7CisJCQkJfQorCisJCQkJcmV0dXJuIGVsZW07CisJCQl9 KS5hcHBlbmQoIHRoaXMgKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwl3cmFwSW5u ZXI6IGZ1bmN0aW9uKCBodG1sICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkg KSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQlqUXVlcnkodGhpcyku d3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKKwkJCX0pOworCQl9CisKKwkJcmV0dXJu IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCisJ CQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CisKKwkJCWlmICggY29udGVudHMubGVuZ3Ro ICkgeworCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKKworCQkJfSBlbHNlIHsKKwkJCQlz ZWxmLmFwcGVuZCggaHRtbCApOworCQkJfQorCQl9KTsKKwl9LAorCisJd3JhcDogZnVuY3Rpb24o IGh0bWwgKSB7CisJCXZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTsK KworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCWpRdWVyeSggdGhpcyApLndy YXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwodGhpcywgaSkgOiBodG1sICk7CisJCX0pOwor CX0sCisKKwl1bndyYXA6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNo KGZ1bmN0aW9uKCkgeworCQkJaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiYm9keSIgKSAp IHsKKwkJCQlqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7CisJ CQl9CisJCX0pLmVuZCgpOworCX0sCisKKwlhcHBlbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4g dGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJaWYg KCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9k ZVR5cGUgPT09IDkgKSB7CisJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOworCQkJfQorCQl9 KTsKKwl9LAorCisJcHJlcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlw KGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMubm9kZVR5 cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSAp IHsKKwkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CisJCQl9 CisJCX0pOworCX0sCisKKwliZWZvcmU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21N YW5pcCggYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMu cGFyZW50Tm9kZSApIHsKKwkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0 aGlzICk7CisJCQl9CisJCX0pOworCX0sCisKKwlhZnRlcjogZnVuY3Rpb24oKSB7CisJCXJldHVy biB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJ CWlmICggdGhpcy5wYXJlbnROb2RlICkgeworCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCS8vIGtl ZXBEYXRhIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS0tZG8gbm90IGRvY3VtZW50CisJcmVtb3Zl OiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgeworCQl2YXIgZWxlbSwKKwkJCWkgPSAw OworCisJCWZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQlpZiAo ICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGgg PiAwICkgeworCQkJCWlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJ CQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSApICk7CisJCQkJfQorCisJCQkJaWYg KCBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJCWlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRh aW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKKwkJCQkJCXNldEdsb2JhbEV2YWwo IGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSApOworCQkJCQl9CisJCQkJCWVsZW0ucGFyZW50Tm9k ZS5yZW1vdmVDaGlsZCggZWxlbSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlz OworCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKSB7CisJCXZhciBlbGVtLAorCQkJaSA9IDA7CisK KwkJZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCS8vIFJlbW92 ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJaWYgKCBlbGVtLm5v ZGVUeXBlID09PSAxICkgeworCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFs c2UgKSApOworCQkJfQorCisJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcworCQkJd2hp bGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7CisJCQkJZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJz dENoaWxkICk7CisJCQl9CisKKwkJCS8vIElmIHRoaXMgaXMgYSBzZWxlY3QsIGVuc3VyZSB0aGF0 IGl0IGRpc3BsYXlzIGVtcHR5ICgjMTIzMzYpCisJCQkvLyBTdXBwb3J0OiBJRTw5CisJCQlpZiAo IGVsZW0ub3B0aW9ucyAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzZWxlY3QiICkgKSB7CisJ CQkJZWxlbS5vcHRpb25zLmxlbmd0aCA9IDA7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsK Kwl9LAorCisJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50 cyApIHsKKwkJZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDog ZGF0YUFuZEV2ZW50czsKKwkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9 PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOworCisJCXJldHVybiB0 aGlzLm1hcCggZnVuY3Rpb24gKCkgeworCQkJcmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0 YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTsKKwkJfSk7CisJfSwKKworCWh0bWw6IGZ1 bmN0aW9uKCB2YWx1ZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9u KCB2YWx1ZSApIHsKKwkJCXZhciBlbGVtID0gdGhpc1swXSB8fCB7fSwKKwkJCQlpID0gMCwKKwkJ CQlsID0gdGhpcy5sZW5ndGg7CisKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKwkJ CQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSA/CisJCQkJCWVsZW0uaW5uZXJIVE1MLnJlcGxh Y2UoIHJpbmxpbmVqUXVlcnksICIiICkgOgorCQkJCQl1bmRlZmluZWQ7CisJCQl9CisKKwkJCS8v IFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUwKKwkJ CWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZh bHVlICkgJiYKKwkJCQkoIGpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgfHwgIXJub3NoaW1j YWNoZS50ZXN0KCB2YWx1ZSApICApICYmCisJCQkJKCBqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hp dGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJgorCQkJCSF3 cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyIiLCAiIl0gKVsxXS50b0xvd2Vy Q2FzZSgpIF0gKSB7CisKKwkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwk MT48LyQyPiIgKTsKKworCQkJCXRyeSB7CisJCQkJCWZvciAoOyBpIDwgbDsgaSsrICkgeworCQkJ CQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCisJCQkJ CQllbGVtID0gdGhpc1tpXSB8fCB7fTsKKwkJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAp IHsKKwkJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTsKKwkJ CQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZWxl bSA9IDA7CisKKwkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwg dXNlIHRoZSBmYWxsYmFjayBtZXRob2QKKwkJCQl9IGNhdGNoKGUpIHt9CisJCQl9CisKKwkJCWlm ICggZWxlbSApIHsKKwkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCQkJfQorCQl9 LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOworCX0sCisKKwlyZXBsYWNlV2l0aDog ZnVuY3Rpb24oIHZhbHVlICkgeworCQl2YXIgaXNGdW5jID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZh bHVlICk7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSByZW1vdmVkIGZy b20gdGhlIERPTSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKKwkJLy8gdGhpcyBjYW4gaGVscCBm aXggcmVwbGFjaW5nIGEgcGFyZW50IHdpdGggY2hpbGQgZWxlbWVudHMKKwkJaWYgKCAhaXNGdW5j ICYmIHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIgKSB7CisJCQl2YWx1ZSA9IGpRdWVyeSggdmFs dWUgKS5ub3QoIHRoaXMgKS5kZXRhY2goKTsKKwkJfQorCisJCXJldHVybiB0aGlzLmRvbU1hbmlw KCBbIHZhbHVlIF0sIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJdmFyIG5leHQgPSB0aGlz Lm5leHRTaWJsaW5nLAorCQkJCXBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKKworCQkJaWYgKCBw YXJlbnQgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlKCk7CisJCQkJcGFyZW50Lmluc2Vy dEJlZm9yZSggZWxlbSwgbmV4dCApOworCQkJfQorCQl9KTsKKwl9LAorCisJZGV0YWNoOiBmdW5j dGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUg KTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7 CisKKwkJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cworCQlhcmdzID0gY29yZV9jb25jYXQu YXBwbHkoIFtdLCBhcmdzICk7CisKKwkJdmFyIGZpcnN0LCBub2RlLCBoYXNTY3JpcHRzLAorCQkJ c2NyaXB0cywgZG9jLCBmcmFnbWVudCwKKwkJCWkgPSAwLAorCQkJbCA9IHRoaXMubGVuZ3RoLAor CQkJc2V0ID0gdGhpcywKKwkJCWlOb0Nsb25lID0gbCAtIDEsCisJCQl2YWx1ZSA9IGFyZ3NbMF0s CisJCQlpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7CisKKwkJLy8gV2Ug Y2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0 CisJCWlmICggaXNGdW5jdGlvbiB8fCAhKCBsIDw9IDEgfHwgdHlwZW9mIHZhbHVlICE9PSAic3Ry aW5nIiB8fCBqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCB2YWx1 ZSApICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpbmRleCApIHsKKwkJCQl2 YXIgc2VsZiA9IHNldC5lcSggaW5kZXggKTsKKwkJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CisJCQkJ CWFyZ3NbMF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgdGFibGUgPyBzZWxmLmh0bWwoKSA6 IHVuZGVmaW5lZCApOworCQkJCX0KKwkJCQlzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2Fs bGJhY2sgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCBsICkgeworCQkJZnJhZ21lbnQgPSBqUXVl cnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCB0 aGlzICk7CisJCQlmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CisKKwkJCWlmICggZnJhZ21l bnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CisJCQkJZnJhZ21lbnQgPSBmaXJzdDsKKwkJ CX0KKworCQkJaWYgKCBmaXJzdCApIHsKKwkJCQl0YWJsZSA9IHRhYmxlICYmIGpRdWVyeS5ub2Rl TmFtZSggZmlyc3QsICJ0ciIgKTsKKwkJCQlzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBm cmFnbWVudCwgInNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOworCQkJCWhhc1NjcmlwdHMgPSBz Y3JpcHRzLmxlbmd0aDsKKworCQkJCS8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRo ZSBsYXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwCisJ CQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4 MDcwKS4KKwkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisJCQkJCW5vZGUgPSBmcmFnbWVudDsK KworCQkJCQlpZiAoIGkgIT09IGlOb0Nsb25lICkgeworCQkJCQkJbm9kZSA9IGpRdWVyeS5jbG9u ZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisJCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xv bmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCisJCQkJCQlpZiAoIGhhc1NjcmlwdHMg KSB7CisJCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQi ICkgKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWNhbGxiYWNrLmNhbGwoCisJCQkJCQl0YWJs ZSAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXNbaV0sICJ0YWJsZSIgKSA/CisJCQkJCQkJZmluZE9y QXBwZW5kKCB0aGlzW2ldLCAidGJvZHkiICkgOgorCQkJCQkJCXRoaXNbaV0sCisJCQkJCQlub2Rl LAorCQkJCQkJaQorCQkJCQkpOworCQkJCX0KKworCQkJCWlmICggaGFzU2NyaXB0cyApIHsKKwkJ CQkJZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDsKKwor CQkJCQkvLyBSZWVuYWJsZSBzY3JpcHRzCisJCQkJCWpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3Rv cmVTY3JpcHQgKTsKKworCQkJCQkvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmly c3QgZG9jdW1lbnQgaW5zZXJ0aW9uCisJCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsg aSsrICkgeworCQkJCQkJbm9kZSA9IHNjcmlwdHNbIGkgXTsKKwkJCQkJCWlmICggcnNjcmlwdFR5 cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkgJiYKKwkJCQkJCQkhalF1ZXJ5Ll9kYXRhKCBub2Rl LCAiZ2xvYmFsRXZhbCIgKSAmJiBqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgeworCisJ CQkJCQkJaWYgKCBub2RlLnNyYyApIHsKKwkJCQkJCQkJLy8gSG9wZSBhamF4IGlzIGF2YWlsYWJs ZS4uLgorCQkJCQkJCQlqUXVlcnkuYWpheCh7CisJCQkJCQkJCQl1cmw6IG5vZGUuc3JjLAorCQkJ CQkJCQkJdHlwZTogIkdFVCIsCisJCQkJCQkJCQlkYXRhVHlwZTogInNjcmlwdCIsCisJCQkJCQkJ CQlhc3luYzogZmFsc2UsCisJCQkJCQkJCQlnbG9iYWw6IGZhbHNlLAorCQkJCQkJCQkJInRocm93 cyI6IHRydWUKKwkJCQkJCQkJfSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJalF1ZXJ5Lmds b2JhbEV2YWwoICggbm9kZS50ZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5pbm5lckhU TUwgfHwgIiIgKS5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICkgKTsKKwkJCQkJCQl9CisJCQkJ CQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBGaXggIzExODA5OiBBdm9pZCBsZWFraW5nIG1l bW9yeQorCQkJCWZyYWdtZW50ID0gZmlyc3QgPSBudWxsOworCQkJfQorCQl9CisKKwkJcmV0dXJu IHRoaXM7CisJfQorfSk7CisKK2Z1bmN0aW9uIGZpbmRPckFwcGVuZCggZWxlbSwgdGFnICkgewor CXJldHVybiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKVswXSB8fCBlbGVtLmFwcGVu ZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCggdGFnICkgKTsKK30KKwor Ly8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMg Zm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgorZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSAp IHsKKwl2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgidHlwZSIpOworCWVsZW0udHlw ZSA9ICggYXR0ciAmJiBhdHRyLnNwZWNpZmllZCApICsgIi8iICsgZWxlbS50eXBlOworCXJldHVy biBlbGVtOworfQorZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHsKKwl2YXIgbWF0Y2gg PSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTsKKwlpZiAoIG1hdGNoICkgewor CQllbGVtLnR5cGUgPSBtYXRjaFsxXTsKKwl9IGVsc2UgeworCQllbGVtLnJlbW92ZUF0dHJpYnV0 ZSgidHlwZSIpOworCX0KKwlyZXR1cm4gZWxlbTsKK30KKworLy8gTWFyayBzY3JpcHRzIGFzIGhh dmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkCitmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVt cywgcmVmRWxlbWVudHMgKSB7CisJdmFyIGVsZW0sCisJCWkgPSAwOworCWZvciAoIDsgKGVsZW0g PSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJnbG9i YWxFdmFsIiwgIXJlZkVsZW1lbnRzIHx8IGpRdWVyeS5fZGF0YSggcmVmRWxlbWVudHNbaV0sICJn bG9iYWxFdmFsIiApICk7CisJfQorfQorCitmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBk ZXN0ICkgeworCisJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSgg c3JjICkgKSB7CisJCXJldHVybjsKKwl9CisKKwl2YXIgdHlwZSwgaSwgbCwKKwkJb2xkRGF0YSA9 IGpRdWVyeS5fZGF0YSggc3JjICksCisJCWN1ckRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QsIG9s ZERhdGEgKSwKKwkJZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CisKKwlpZiAoIGV2ZW50cyApIHsK KwkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOworCQljdXJEYXRhLmV2ZW50cyA9IHt9OworCisJCWZv ciAoIHR5cGUgaW4gZXZlbnRzICkgeworCQkJZm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUg XS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlw ZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApOworCQkJfQorCQl9CisJfQorCisJLy8gbWFrZSB0aGUg Y2xvbmVkIHB1YmxpYyBkYXRhIG9iamVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKKwlpZiAo IGN1ckRhdGEuZGF0YSApIHsKKwkJY3VyRGF0YS5kYXRhID0galF1ZXJ5LmV4dGVuZCgge30sIGN1 ckRhdGEuZGF0YSApOworCX0KK30KKworZnVuY3Rpb24gZml4Q2xvbmVOb2RlSXNzdWVzKCBzcmMs IGRlc3QgKSB7CisJdmFyIG5vZGVOYW1lLCBlLCBkYXRhOworCisJLy8gV2UgZG8gbm90IG5lZWQg dG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cworCWlmICggZGVzdC5ub2RlVHlwZSAhPT0g MSApIHsKKwkJcmV0dXJuOworCX0KKworCW5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2Vy Q2FzZSgpOworCisJLy8gSUU2LTggY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQg d2hlbiB1c2luZyBjbG9uZU5vZGUuCisJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50 ICYmIGRlc3RbIGpRdWVyeS5leHBhbmRvIF0gKSB7CisJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGRl c3QgKTsKKworCQlmb3IgKCBlIGluIGRhdGEuZXZlbnRzICkgeworCQkJalF1ZXJ5LnJlbW92ZUV2 ZW50KCBkZXN0LCBlLCBkYXRhLmhhbmRsZSApOworCQl9CisKKwkJLy8gRXZlbnQgZGF0YSBnZXRz IHJlZmVyZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8gZ2V0cyBjb3BpZWQg dG9vCisJCWRlc3QucmVtb3ZlQXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApOworCX0KKworCS8v IElFIGJsYW5rcyBjb250ZW50cyB3aGVuIGNsb25pbmcgc2NyaXB0cywgYW5kIHRyaWVzIHRvIGV2 YWx1YXRlIG5ld2x5LXNldCB0ZXh0CisJaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVz dC50ZXh0ICE9PSBzcmMudGV4dCApIHsKKwkJZGlzYWJsZVNjcmlwdCggZGVzdCApLnRleHQgPSBz cmMudGV4dDsKKwkJcmVzdG9yZVNjcmlwdCggZGVzdCApOworCisJLy8gSUU2LTEwIGltcHJvcGVy bHkgY2xvbmVzIGNoaWxkcmVuIG9mIG9iamVjdCBlbGVtZW50cyB1c2luZyBjbGFzc2lkLgorCS8v IElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBudWxs LCAjMTIxMzIuCisJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJvYmplY3QiICkgeworCQlpZiAo IGRlc3QucGFyZW50Tm9kZSApIHsKKwkJCWRlc3Qub3V0ZXJIVE1MID0gc3JjLm91dGVySFRNTDsK KwkJfQorCisJCS8vIFRoaXMgcGF0aCBhcHBlYXJzIHVuYXZvaWRhYmxlIGZvciBJRTkuIFdoZW4g Y2xvbmluZyBhbiBvYmplY3QKKwkJLy8gZWxlbWVudCBpbiBJRTksIHRoZSBvdXRlckhUTUwgc3Ry YXRlZ3kgYWJvdmUgaXMgbm90IHN1ZmZpY2llbnQuCisJCS8vIElmIHRoZSBzcmMgaGFzIGlubmVy SFRNTCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAorCQkvLyBjb3B5IHRoZSBzcmMuaW5u ZXJIVE1MIGludG8gdGhlIGRlc3QuaW5uZXJIVE1MLiAjMTAzMjQKKwkJaWYgKCBqUXVlcnkuc3Vw cG9ydC5odG1sNUNsb25lICYmICggc3JjLmlubmVySFRNTCAmJiAhalF1ZXJ5LnRyaW0oZGVzdC5p bm5lckhUTUwpICkgKSB7CisJCQlkZXN0LmlubmVySFRNTCA9IHNyYy5pbm5lckhUTUw7CisJCX0K KworCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiICYmIG1hbmlwdWxhdGlvbl9yY2hl Y2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgeworCQkvLyBJRTYtOCBmYWlscyB0byBwZXJz aXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CisJCS8vIG9yIHJhZGlv IGJ1dHRvbi4gV29yc2UsIElFNi03IGZhaWwgdG8gZ2l2ZSB0aGUgY2xvbmVkIGVsZW1lbnQKKwkJ Ly8gYSBjaGVja2VkIGFwcGVhcmFuY2UgaWYgdGhlIGRlZmF1bHRDaGVja2VkIHZhbHVlIGlzbid0 IGFsc28gc2V0CisKKwkJZGVzdC5kZWZhdWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5j aGVja2VkOworCisJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhl IHZhbHVlIG9mIGEgY2xvbmVkCisJCS8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0 eSBzdHJpbmcgaW5zdGVhZCBvZiAib24iCisJCWlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVl ICkgeworCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKKwkJfQorCisJLy8gSUU2LTggZmFpbHMg dG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKKwkv LyBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucworCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAi b3B0aW9uIiApIHsKKwkJZGVzdC5kZWZhdWx0U2VsZWN0ZWQgPSBkZXN0LnNlbGVjdGVkID0gc3Jj LmRlZmF1bHRTZWxlY3RlZDsKKworCS8vIElFNi04IGZhaWxzIHRvIHNldCB0aGUgZGVmYXVsdFZh bHVlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4KKwkvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9m IGlucHV0IGZpZWxkcworCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVO YW1lID09PSAidGV4dGFyZWEiICkgeworCQlkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0 VmFsdWU7CisJfQorfQorCitqUXVlcnkuZWFjaCh7CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXBy ZXBlbmRUbzogInByZXBlbmQiLAorCWluc2VydEJlZm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0 ZXI6ICJhZnRlciIsCisJcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgorfSwgZnVuY3Rpb24oIG5h bWUsIG9yaWdpbmFsICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9y ICkgeworCQl2YXIgZWxlbXMsCisJCQlpID0gMCwKKwkJCXJldCA9IFtdLAorCQkJaW5zZXJ0ID0g alF1ZXJ5KCBzZWxlY3RvciApLAorCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxOworCisJCWZv ciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7CisJCQllbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDog dGhpcy5jbG9uZSh0cnVlKTsKKwkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVs ZW1zICk7CisKKwkJCS8vIE1vZGVybiBicm93c2VycyBjYW4gYXBwbHkgalF1ZXJ5IGNvbGxlY3Rp b25zIGFzIGFycmF5cywgYnV0IG9sZElFIG5lZWRzIGEgLmdldCgpCisJCQljb3JlX3B1c2guYXBw bHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKKwkJfQorCisJCXJldHVybiB0aGlzLnB1c2hTdGFjaygg cmV0ICk7CisJfTsKK30pOworCitmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKKwl2 YXIgZWxlbXMsIGVsZW0sCisJCWkgPSAwLAorCQlmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVs ZW1lbnRzQnlUYWdOYW1lICE9PSBjb3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQuZ2V0RWxlbWVu dHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKSA6CisJCQl0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVj dG9yQWxsICE9PSBjb3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCgg dGFnIHx8ICIqIiApIDoKKwkJCXVuZGVmaW5lZDsKKworCWlmICggIWZvdW5kICkgeworCQlmb3Ig KCBmb3VuZCA9IFtdLCBlbGVtcyA9IGNvbnRleHQuY2hpbGROb2RlcyB8fCBjb250ZXh0OyAoZWxl bSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQlpZiAoICF0YWcgfHwgalF1ZXJ5Lm5v ZGVOYW1lKCBlbGVtLCB0YWcgKSApIHsKKwkJCQlmb3VuZC5wdXNoKCBlbGVtICk7CisJCQl9IGVs c2UgeworCQkJCWpRdWVyeS5tZXJnZSggZm91bmQsIGdldEFsbCggZWxlbSwgdGFnICkgKTsKKwkJ CX0KKwkJfQorCX0KKworCXJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5 Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/CisJCWpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0s IGZvdW5kICkgOgorCQlmb3VuZDsKK30KKworLy8gVXNlZCBpbiBidWlsZEZyYWdtZW50LCBmaXhl cyB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcGVydHkKK2Z1bmN0aW9uIGZpeERlZmF1bHRDaGVja2Vk KCBlbGVtICkgeworCWlmICggbWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlLnRlc3QoIGVsZW0u dHlwZSApICkgeworCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOworCX0KK30K KworalF1ZXJ5LmV4dGVuZCh7CisJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRz LCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKwkJdmFyIGRlc3RFbGVtZW50cywgbm9kZSwgY2xvbmUs IGksIHNyY0VsZW1lbnRzLAorCQkJaW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVy RG9jdW1lbnQsIGVsZW0gKTsKKworCQlpZiAoIGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgfHwg alF1ZXJ5LmlzWE1MRG9jKGVsZW0pIHx8ICFybm9zaGltY2FjaGUudGVzdCggIjwiICsgZWxlbS5u b2RlTmFtZSArICI+IiApICkgeworCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApOwor CisJCS8vIElFPD04IGRvZXMgbm90IHByb3Blcmx5IGNsb25lIGRldGFjaGVkLCB1bmtub3duIGVs ZW1lbnQgbm9kZXMKKwkJfSBlbHNlIHsKKwkJCWZyYWdtZW50RGl2LmlubmVySFRNTCA9IGVsZW0u b3V0ZXJIVE1MOworCQkJZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnRE aXYuZmlyc3RDaGlsZCApOworCQl9CisKKwkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVF dmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCisJCQkJKGVsZW0ubm9k ZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEpICYmICFqUXVlcnkuaXNYTUxEb2Mo ZWxlbSkgKSB7CisKKwkJCS8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2Ug cmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yCisJCQlkZXN0RWxl bWVudHMgPSBnZXRBbGwoIGNsb25lICk7CisJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSAp OworCisJCQkvLyBGaXggYWxsIElFIGNsb25pbmcgaXNzdWVzCisJCQlmb3IgKCBpID0gMDsgKG5v ZGUgPSBzcmNFbGVtZW50c1tpXSkgIT0gbnVsbDsgKytpICkgeworCQkJCS8vIEVuc3VyZSB0aGF0 IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NworCQkJCWlmICgg ZGVzdEVsZW1lbnRzW2ldICkgeworCQkJCQlmaXhDbG9uZU5vZGVJc3N1ZXMoIG5vZGUsIGRlc3RF bGVtZW50c1tpXSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIENvcHkgdGhlIGV2ZW50cyBm cm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKKwkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewor CQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKwkJCQlzcmNFbGVtZW50cyA9IHNyY0VsZW1l bnRzIHx8IGdldEFsbCggZWxlbSApOworCQkJCWRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8 fCBnZXRBbGwoIGNsb25lICk7CisKKwkJCQlmb3IgKCBpID0gMDsgKG5vZGUgPSBzcmNFbGVtZW50 c1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCQljbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVs ZW1lbnRzW2ldICk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljbG9uZUNvcHlFdmVudCggZWxl bSwgY2xvbmUgKTsKKwkJCX0KKwkJfQorCisJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9u IGhpc3RvcnkKKwkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgInNjcmlwdCIgKTsKKwkJ aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHsKKwkJCXNldEdsb2JhbEV2YWwoIGRlc3RF bGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKKwkJfQorCisJ CWRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7CisKKwkJLy8gUmV0dXJu IHRoZSBjbG9uZWQgc2V0CisJCXJldHVybiBjbG9uZTsKKwl9LAorCisJYnVpbGRGcmFnbWVudDog ZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24gKSB7CisJCXZhciBq LCBlbGVtLCBjb250YWlucywKKwkJCXRtcCwgdGFnLCB0Ym9keSwgd3JhcCwKKwkJCWwgPSBlbGVt cy5sZW5ndGgsCisKKwkJCS8vIEVuc3VyZSBhIHNhZmUgZnJhZ21lbnQKKwkJCXNhZmUgPSBjcmVh dGVTYWZlRnJhZ21lbnQoIGNvbnRleHQgKSwKKworCQkJbm9kZXMgPSBbXSwKKwkJCWkgPSAwOwor CisJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCWVsZW0gPSBlbGVtc1sgaSBdOworCisJCQlp ZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKKworCQkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQor CQkJCWlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gIm9iamVjdCIgKSB7CisJCQkJCWpRdWVy eS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKKworCQkJ CS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQorCQkJCX0gZWxzZSBpZiAoICFy aHRtbC50ZXN0KCBlbGVtICkgKSB7CisJCQkJCW5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4 dE5vZGUoIGVsZW0gKSApOworCisJCQkJLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzCisJ CQkJfSBlbHNlIHsKKwkJCQkJdG1wID0gdG1wIHx8IHNhZmUuYXBwZW5kQ2hpbGQoIGNvbnRleHQu Y3JlYXRlRWxlbWVudCgiZGl2IikgKTsKKworCQkJCQkvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJk IHJlcHJlc2VudGF0aW9uCisJCQkJCXRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsi IiwgIiJdIClbMV0udG9Mb3dlckNhc2UoKTsKKwkJCQkJd3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8 IHdyYXBNYXAuX2RlZmF1bHQ7CisKKwkJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVt LnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKSArIHdyYXBbMl07CisKKwkJCQkJLy8g RGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CisJCQkJCWogPSB3 cmFwWzBdOworCQkJCQl3aGlsZSAoIGotLSApIHsKKwkJCQkJCXRtcCA9IHRtcC5sYXN0Q2hpbGQ7 CisJCQkJCX0KKworCQkJCQkvLyBNYW51YWxseSBhZGQgbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92 ZWQgYnkgSUUKKwkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYg cmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHsKKwkJCQkJCW5vZGVzLnB1c2goIGNv bnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKCBlbGVtIClbMF0g KSApOworCQkJCQl9CisKKwkJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4g ZnJvbSB0YWJsZSBmcmFnbWVudHMKKwkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7 CisKKwkJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0 Ym9keT4KKwkJCQkJCWVsZW0gPSB0YWcgPT09ICJ0YWJsZSIgJiYgIXJ0Ym9keS50ZXN0KCBlbGVt ICkgPworCQkJCQkJCXRtcC5maXJzdENoaWxkIDoKKworCQkJCQkJCS8vIFN0cmluZyB3YXMgYSBi YXJlIDx0aGVhZD4gb3IgPHRmb290PgorCQkJCQkJCXdyYXBbMV0gPT09ICI8dGFibGU+IiAmJiAh cnRib2R5LnRlc3QoIGVsZW0gKSA/CisJCQkJCQkJCXRtcCA6CisJCQkJCQkJCTA7CisKKwkJCQkJ CWogPSBlbGVtICYmIGVsZW0uY2hpbGROb2Rlcy5sZW5ndGg7CisJCQkJCQl3aGlsZSAoIGotLSAp IHsKKwkJCQkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggKHRib2R5ID0gZWxlbS5jaGlsZE5vZGVz W2pdKSwgInRib2R5IiApICYmICF0Ym9keS5jaGlsZE5vZGVzLmxlbmd0aCApIHsKKwkJCQkJCQkJ ZWxlbS5yZW1vdmVDaGlsZCggdGJvZHkgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwor CQkJCQlqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApOworCisJCQkJCS8vIEZp eCAjMTIzOTIgZm9yIFdlYktpdCBhbmQgSUUgPiA5CisJCQkJCXRtcC50ZXh0Q29udGVudCA9ICIi OworCisJCQkJCS8vIEZpeCAjMTIzOTIgZm9yIG9sZElFCisJCQkJCXdoaWxlICggdG1wLmZpcnN0 Q2hpbGQgKSB7CisJCQkJCQl0bXAucmVtb3ZlQ2hpbGQoIHRtcC5maXJzdENoaWxkICk7CisJCQkJ CX0KKworCQkJCQkvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVy IGNsZWFudXAKKwkJCQkJdG1wID0gc2FmZS5sYXN0Q2hpbGQ7CisJCQkJfQorCQkJfQorCQl9CisK KwkJLy8gRml4ICMxMTM1NjogQ2xlYXIgZWxlbWVudHMgZnJvbSBmcmFnbWVudAorCQlpZiAoIHRt cCApIHsKKwkJCXNhZmUucmVtb3ZlQ2hpbGQoIHRtcCApOworCQl9CisKKwkJLy8gUmVzZXQgZGVm YXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKKwkJLy8gYWJvdXQgdG8g YmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQorCQlpZiAoICFqUXVlcnku c3VwcG9ydC5hcHBlbmRDaGVja2VkICkgeworCQkJalF1ZXJ5LmdyZXAoIGdldEFsbCggbm9kZXMs ICJpbnB1dCIgKSwgZml4RGVmYXVsdENoZWNrZWQgKTsKKwkJfQorCisJCWkgPSAwOworCQl3aGls ZSAoIChlbGVtID0gbm9kZXNbIGkrKyBdKSApIHsKKworCQkJLy8gIzQwODcgLSBJZiBvcmlnaW4g YW5kIGRlc3RpbmF0aW9uIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSwgYW5kIHRoaXMgaXMKKwkJCS8v IHRoYXQgZWxlbWVudCwgZG8gbm90IGRvIGFueXRoaW5nCisJCQlpZiAoIHNlbGVjdGlvbiAmJiBq UXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgIT09IC0xICkgeworCQkJCWNvbnRpbnVl OworCQkJfQorCisJCQljb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3Vt ZW50LCBlbGVtICk7CisKKwkJCS8vIEFwcGVuZCB0byBmcmFnbWVudAorCQkJdG1wID0gZ2V0QWxs KCBzYWZlLmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CisKKwkJCS8vIFByZXNlcnZl IHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKKwkJCWlmICggY29udGFpbnMgKSB7CisJCQkJc2V0 R2xvYmFsRXZhbCggdG1wICk7CisJCQl9CisKKwkJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKKwkJ CWlmICggc2NyaXB0cyApIHsKKwkJCQlqID0gMDsKKwkJCQl3aGlsZSAoIChlbGVtID0gdG1wWyBq KysgXSkgKSB7CisJCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkg KSB7CisJCQkJCQlzY3JpcHRzLnB1c2goIGVsZW0gKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJ fQorCisJCXRtcCA9IG51bGw7CisKKwkJcmV0dXJuIHNhZmU7CisJfSwKKworCWNsZWFuRGF0YTog ZnVuY3Rpb24oIGVsZW1zLCAvKiBpbnRlcm5hbCAqLyBhY2NlcHREYXRhICkgeworCQl2YXIgZWxl bSwgdHlwZSwgaWQsIGRhdGEsCisJCQlpID0gMCwKKwkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4 cGFuZG8sCisJCQljYWNoZSA9IGpRdWVyeS5jYWNoZSwKKwkJCWRlbGV0ZUV4cGFuZG8gPSBqUXVl cnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvLAorCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVj aWFsOworCisJCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgeworCisJ CQlpZiAoIGFjY2VwdERhdGEgfHwgalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKKworCQkJ CWlkID0gZWxlbVsgaW50ZXJuYWxLZXkgXTsKKwkJCQlkYXRhID0gaWQgJiYgY2FjaGVbIGlkIF07 CisKKwkJCQlpZiAoIGRhdGEgKSB7CisJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CisJCQkJCQlm b3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkgeworCQkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBd ICkgeworCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CisKKwkJCQkJ CQkvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92 ZXJoZWFkCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVt LCB0eXBlLCBkYXRhLmhhbmRsZSApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJ CS8vIFJlbW92ZSBjYWNoZSBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSByZW1vdmVkIGJ5IGpR dWVyeS5ldmVudC5yZW1vdmUKKwkJCQkJaWYgKCBjYWNoZVsgaWQgXSApIHsKKworCQkJCQkJZGVs ZXRlIGNhY2hlWyBpZCBdOworCisJCQkJCQkvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxl dGUgZXhwYW5kbyBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsCisJCQkJCQkvLyBub3IgZG9lcyBpdCBo YXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOworCQkJCQkJ Ly8gd2UgbXVzdCBoYW5kbGUgYWxsIG9mIHRoZXNlIGNhc2VzCisJCQkJCQlpZiAoIGRlbGV0ZUV4 cGFuZG8gKSB7CisJCQkJCQkJZGVsZXRlIGVsZW1bIGludGVybmFsS2V5IF07CisKKwkJCQkJCX0g ZWxzZSBpZiAoIHR5cGVvZiBlbGVtLnJlbW92ZUF0dHJpYnV0ZSAhPT0gY29yZV9zdHJ1bmRlZmlu ZWQgKSB7CisJCQkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGludGVybmFsS2V5ICk7CisKKwkJ CQkJCX0gZWxzZSB7CisJCQkJCQkJZWxlbVsgaW50ZXJuYWxLZXkgXSA9IG51bGw7CisJCQkJCQl9 CisKKwkJCQkJCWNvcmVfZGVsZXRlZElkcy5wdXNoKCBpZCApOworCQkJCQl9CisJCQkJfQorCQkJ fQorCQl9CisJfQorfSk7Cit2YXIgaWZyYW1lLCBnZXRTdHlsZXMsIGN1ckNTUywKKwlyYWxwaGEg PSAvYWxwaGFcKFteKV0qXCkvaSwKKwlyb3BhY2l0eSA9IC9vcGFjaXR5XHMqPVxzKihbXildKikv LAorCXJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLywKKwkvLyBzd2FwcGFi bGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCAidGFibGUi LCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgorCS8vIHNlZSBoZXJlIGZvciBkaXNw bGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1Mv ZGlzcGxheQorCXJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLywKKwly bWFyZ2luID0gL15tYXJnaW4vLAorCXJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3Jl X3BudW0gKyAiKSguKikkIiwgImkiICksCisJcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiAr IGNvcmVfcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKSwKKwlycmVsTnVtID0gbmV3IFJl Z0V4cCggIl4oWystXSk9KCIgKyBjb3JlX3BudW0gKyAiKSIsICJpIiApLAorCWVsZW1kaXNwbGF5 ID0geyBCT0RZOiAiYmxvY2siIH0sCisKKwljc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRl IiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKKwljc3NOb3JtYWxU cmFuc2Zvcm0gPSB7CisJCWxldHRlclNwYWNpbmc6IDAsCisJCWZvbnRXZWlnaHQ6IDQwMAorCX0s CisKKwljc3NFeHBhbmQgPSBbICJUb3AiLCAiUmlnaHQiLCAiQm90dG9tIiwgIkxlZnQiIF0sCisJ Y3NzUHJlZml4ZXMgPSBbICJXZWJraXQiLCAiTyIsICJNb3oiLCAibXMiIF07CisKKy8vIHJldHVy biBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQg cHJvcGVydHkKK2Z1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHsKKworCS8v IHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkCisJaWYgKCBu YW1lIGluIHN0eWxlICkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvLyBjaGVjayBmb3IgdmVu ZG9yIHByZWZpeGVkIG5hbWVzCisJdmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVy Q2FzZSgpICsgbmFtZS5zbGljZSgxKSwKKwkJb3JpZ05hbWUgPSBuYW1lLAorCQlpID0gY3NzUHJl Zml4ZXMubGVuZ3RoOworCisJd2hpbGUgKCBpLS0gKSB7CisJCW5hbWUgPSBjc3NQcmVmaXhlc1sg aSBdICsgY2FwTmFtZTsKKwkJaWYgKCBuYW1lIGluIHN0eWxlICkgeworCQkJcmV0dXJuIG5hbWU7 CisJCX0KKwl9CisKKwlyZXR1cm4gb3JpZ05hbWU7Cit9CisKK2Z1bmN0aW9uIGlzSGlkZGVuKCBl bGVtLCBlbCApIHsKKwkvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmls dGVyIGZ1bmN0aW9uOworCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBh cmd1bWVudAorCWVsZW0gPSBlbCB8fCBlbGVtOworCXJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCAi ZGlzcGxheSIgKSA9PT0gIm5vbmUiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1 bWVudCwgZWxlbSApOworfQorCitmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7 CisJdmFyIGRpc3BsYXksIGVsZW0sIGhpZGRlbiwKKwkJdmFsdWVzID0gW10sCisJCWluZGV4ID0g MCwKKwkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCisJZm9yICggOyBpbmRleCA8IGxlbmd0 aDsgaW5kZXgrKyApIHsKKwkJZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOworCQlpZiAoICFlbGVt LnN0eWxlICkgeworCQkJY29udGludWU7CisJCX0KKworCQl2YWx1ZXNbIGluZGV4IF0gPSBqUXVl cnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiApOworCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5k aXNwbGF5OworCQlpZiAoIHNob3cgKSB7CisJCQkvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkg b2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCisJCQkvLyBiZWluZyBoaWRkZW4gYnkg Y2FzY2FkZWQgcnVsZXMgb3Igbm90CisJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxh eSA9PT0gIm5vbmUiICkgeworCQkJCWVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOworCQkJfQorCisJ CQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5 OiBub25lCisJCQkvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJv d3NlciBzdHlsZSBpcworCQkJLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAorCQkJaWYgKCBlbGVtLnN0 eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7CisJCQkJdmFsdWVzWyBp bmRleCBdID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIsIGNzc19kZWZhdWx0RGlz cGxheShlbGVtLm5vZGVOYW1lKSApOworCQkJfQorCQl9IGVsc2UgeworCisJCQlpZiAoICF2YWx1 ZXNbIGluZGV4IF0gKSB7CisJCQkJaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKKworCQkJCWlm ICggZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKKwkJCQkJalF1 ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIsIGhpZGRlbiA/IGRpc3BsYXkgOiBqUXVlcnku Y3NzKCBlbGVtLCAiZGlzcGxheSIgKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIFNl dCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wCisJ Ly8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCWZvciAoIGluZGV4ID0gMDsgaW5kZXgg PCBsZW5ndGg7IGluZGV4KysgKSB7CisJCWVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTsKKwkJaWYg KCAhZWxlbS5zdHlsZSApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICggIXNob3cgfHwgZWxl bS5zdHlsZS5kaXNwbGF5ID09PSAibm9uZSIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAiIiAp IHsKKwkJCWVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgIiIg OiAibm9uZSI7CisJCX0KKwl9CisKKwlyZXR1cm4gZWxlbWVudHM7Cit9CisKK2pRdWVyeS5mbi5l eHRlbmQoeworCWNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworCQlyZXR1cm4galF1ZXJ5 LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgeworCQkJdmFyIGxl biwgc3R5bGVzLAorCQkJCW1hcCA9IHt9LAorCQkJCWkgPSAwOworCisJCQlpZiAoIGpRdWVyeS5p c0FycmF5KCBuYW1lICkgKSB7CisJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7CisJCQkJ bGVuID0gbmFtZS5sZW5ndGg7CisKKwkJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJCQkJ bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0 eWxlcyApOworCQkJCX0KKworCQkJCXJldHVybiBtYXA7CisJCQl9CisKKwkJCXJldHVybiB2YWx1 ZSAhPT0gdW5kZWZpbmVkID8KKwkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkg OgorCQkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKKwkJfSwgbmFtZSwgdmFsdWUsIGFyZ3Vt ZW50cy5sZW5ndGggPiAxICk7CisJfSwKKwlzaG93OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHNo b3dIaWRlKCB0aGlzLCB0cnVlICk7CisJfSwKKwloaWRlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJu IHNob3dIaWRlKCB0aGlzICk7CisJfSwKKwl0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHsKKwkJ dmFyIGJvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIjsKKworCQlyZXR1cm4gdGhpcy5l YWNoKGZ1bmN0aW9uKCkgeworCQkJaWYgKCBib29sID8gc3RhdGUgOiBpc0hpZGRlbiggdGhpcyAp ICkgeworCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKKwkJCX0gZWxzZSB7CisJCQkJalF1ZXJ5 KCB0aGlzICkuaGlkZSgpOworCQkJfQorCQl9KTsKKwl9Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7 CisJLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZh dWx0CisJLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5 CisJY3NzSG9va3M6IHsKKwkJb3BhY2l0eTogeworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29t cHV0ZWQgKSB7CisJCQkJaWYgKCBjb21wdXRlZCApIHsKKwkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5 cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKKwkJCQkJdmFyIHJldCA9IGN1ckNTUygg ZWxlbSwgIm9wYWNpdHkiICk7CisJCQkJCXJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0Owor CQkJCX0KKwkJCX0KKwkJfQorCX0sCisKKwkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHBy b3BlcnRpZXMgdG8gYWRkIHB4CisJY3NzTnVtYmVyOiB7CisJCSJjb2x1bW5Db3VudCI6IHRydWUs CisJCSJmaWxsT3BhY2l0eSI6IHRydWUsCisJCSJmb250V2VpZ2h0IjogdHJ1ZSwKKwkJImxpbmVI ZWlnaHQiOiB0cnVlLAorCQkib3BhY2l0eSI6IHRydWUsCisJCSJvcnBoYW5zIjogdHJ1ZSwKKwkJ IndpZG93cyI6IHRydWUsCisJCSJ6SW5kZXgiOiB0cnVlLAorCQkiem9vbSI6IHRydWUKKwl9LAor CisJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9y ZQorCS8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWUKKwljc3NQcm9wczogeworCQkvLyBu b3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CisJCSJmbG9hdCI6IGpRdWVyeS5zdXBwb3J0LmNz c0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IgorCX0sCisKKwkvLyBHZXQgYW5kIHNl dCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQorCXN0eWxlOiBmdW5jdGlvbiggZWxl bSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgeworCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQg YW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8 IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CisJCQlyZXR1cm47CisJCX0K KworCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUK KwkJdmFyIHJldCwgdHlwZSwgaG9va3MsCisJCQlvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2Uo IG5hbWUgKSwKKwkJCXN0eWxlID0gZWxlbS5zdHlsZTsKKworCQluYW1lID0galF1ZXJ5LmNzc1By b3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9y UHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7CisKKwkJLy8gZ2V0cyBob29rIGZvciB0aGUg cHJlZml4ZWQgdmVyc2lvbgorCQkvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9u CisJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBv cmlnTmFtZSBdOworCisJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQorCQlpZiAo IHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisJCQl0eXBlID0gdHlwZW9mIHZhbHVlOworCisJCQkv LyBjb252ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUg bnVtYmVycy4gIzczNDUKKwkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxO dW0uZXhlYyggdmFsdWUgKSkgKSB7CisJCQkJdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsy XSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOworCQkJCS8vIEZpeGVz IGJ1ZyAjOTIzNworCQkJCXR5cGUgPSAibnVtYmVyIjsKKwkJCX0KKworCQkJLy8gTWFrZSBzdXJl IHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CisJCQlpZiAo IHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7 CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBh ZGQgJ3B4JyB0byB0aGUgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcykKKwkJCWlm ICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7 CisJCQkJdmFsdWUgKz0gInB4IjsKKwkJCX0KKworCQkJLy8gRml4ZXMgIzg5MDgsIGl0IGNhbiBi ZSBkb25lIG1vcmUgY29ycmVjdGx5IGJ5IHNwZWNpZmluZyBzZXR0ZXJzIGluIGNzc0hvb2tzLAor CQkJLy8gYnV0IGl0IHdvdWxkIG1lYW4gdG8gZGVmaW5lIGVpZ2h0IChmb3IgZXZlcnkgcHJvYmxl bWF0aWMgcHJvcGVydHkpIGlkZW50aWNhbCBmdW5jdGlvbnMKKwkJCWlmICggIWpRdWVyeS5zdXBw b3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gIiIgJiYgbmFtZS5pbmRleE9mKCJiYWNr Z3JvdW5kIikgPT09IDAgKSB7CisJCQkJc3R5bGVbIG5hbWUgXSA9ICJpbmhlcml0IjsKKwkJCX0K KworCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lz ZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisJCQlpZiAoICFob29rcyB8fCAhKCJzZXQi IGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAh PT0gdW5kZWZpbmVkICkgeworCisJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhy b3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKKwkJCQkvLyBG aXhlcyBidWcgIzU1MDkKKwkJCQl0cnkgeworCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CisJ CQkJfSBjYXRjaChlKSB7fQorCQkJfQorCisJCX0gZWxzZSB7CisJCQkvLyBJZiBhIGhvb2sgd2Fz IHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKKwkJCWlmICgg aG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2Us IGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJ Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKKwkJ CXJldHVybiBzdHlsZVsgbmFtZSBdOworCQl9CisJfSwKKworCWNzczogZnVuY3Rpb24oIGVsZW0s IG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7CisJCXZhciBudW0sIHZhbCwgaG9va3MsCisJCQlvcmln TmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB3 ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKKwkJbmFtZSA9IGpRdWVyeS5jc3NQcm9w c1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclBy b3BOYW1lKCBlbGVtLnN0eWxlLCBvcmlnTmFtZSApICk7CisKKwkJLy8gZ2V0cyBob29rIGZvciB0 aGUgcHJlZml4ZWQgdmVyc2lvbgorCQkvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJz aW9uCisJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tz WyBvcmlnTmFtZSBdOworCisJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21w dXRlZCB2YWx1ZSBmcm9tIHRoZXJlCisJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgKSB7 CisJCQl2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7CisJCX0KKworCQkvLyBP dGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2Ug dGhhdAorCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgeworCQkJdmFsID0gY3VyQ1NTKCBlbGVt LCBuYW1lLCBzdHlsZXMgKTsKKwkJfQorCisJCS8vY29udmVydCAibm9ybWFsIiB0byBjb21wdXRl ZCB2YWx1ZQorCQlpZiAoIHZhbCA9PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFu c2Zvcm0gKSB7CisJCQl2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsKKwkJfQorCisJ CS8vIFJldHVybiwgY29udmVydGluZyB0byBudW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVy IHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKKwkJaWYgKCBleHRyYSA9PT0gIiIg fHwgZXh0cmEgKSB7CisJCQludW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsKKwkJCXJldHVybiBleHRy YSA9PT0gdHJ1ZSB8fCBqUXVlcnkuaXNOdW1lcmljKCBudW0gKSA/IG51bSB8fCAwIDogdmFsOwor CQl9CisJCXJldHVybiB2YWw7CisJfSwKKworCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBw aW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKKwlz d2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXZhciBy ZXQsIG5hbWUsCisJCQlvbGQgPSB7fTsKKworCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywg YW5kIGluc2VydCB0aGUgbmV3IG9uZXMKKwkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgeworCQkJ b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CisJCQllbGVtLnN0eWxlWyBuYW1lIF0g PSBvcHRpb25zWyBuYW1lIF07CisJCX0KKworCQlyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwg YXJncyB8fCBbXSApOworCisJCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcworCQlmb3IgKCBuYW1l IGluIG9wdGlvbnMgKSB7CisJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKKwkJ fQorCisJCXJldHVybiByZXQ7CisJfQorfSk7CisKKy8vIE5PVEU6IHdlJ3ZlIGluY2x1ZGVkIHRo ZSAid2luZG93IiBpbiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZQorLy8gYmVjYXVzZSBqc2RvbSBv biBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC4KK2lmICggd2luZG93LmdldENvbXB1dGVk U3R5bGUgKSB7CisJZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiB3aW5k b3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOworCX07CisKKwljdXJDU1MgPSBmdW5j dGlvbiggZWxlbSwgbmFtZSwgX2NvbXB1dGVkICkgeworCQl2YXIgd2lkdGgsIG1pbldpZHRoLCBt YXhXaWR0aCwKKwkJCWNvbXB1dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAor CisJCQkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXIn KSBpbiBJRTksIHNlZSAjMTI1MzcKKwkJCXJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWQuZ2V0UHJv cGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0gOiB1bmRlZmluZWQsCisJCQlz dHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJaWYgKCBjb21wdXRlZCApIHsKKworCQkJaWYgKCByZXQg PT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkg eworCQkJCXJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOworCQkJfQorCisJCQkvLyBB IHRyaWJ1dGUgdG8gdGhlICJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzIgorCQkJLy8gQ2hy b21lIDwgMTcgYW5kIFNhZmFyaSA1LjAgdXNlcyAiY29tcHV0ZWQgdmFsdWUiIGluc3RlYWQgb2Yg InVzZWQgdmFsdWUiIGZvciBtYXJnaW4tcmlnaHQKKwkJCS8vIFNhZmFyaSA1LjEuNyAoYXQgbGVh c3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdp ZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscworCQkJLy8gdGhpcyBpcyBhZ2FpbnN0IHRo ZSBDU1NPTSBkcmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2 ZWQtdmFsdWVzCisJCQlpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3Qo IG5hbWUgKSApIHsKKworCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKwkJCQl3 aWR0aCA9IHN0eWxlLndpZHRoOworCQkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CisJCQkJ bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsKKworCQkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVl cyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKwkJCQlzdHlsZS5taW5XaWR0aCA9IHN0eWxl Lm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7CisJCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7 CisKKwkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCisJCQkJc3R5bGUud2lkdGggPSB3 aWR0aDsKKwkJCQlzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOworCQkJCXN0eWxlLm1heFdpZHRo ID0gbWF4V2lkdGg7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9IGVsc2UgaWYg KCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlICkgeworCWdldFN0eWxlcyA9 IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4gZWxlbS5jdXJyZW50U3R5bGU7CisJfTsKKwor CWN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBfY29tcHV0ZWQgKSB7CisJCXZhciBsZWZ0 LCBycywgcnNMZWZ0LAorCQkJY29tcHV0ZWQgPSBfY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVt ICksCisJCQlyZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkWyBuYW1lIF0gOiB1bmRlZmluZWQsCisJ CQlzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJLy8gQXZvaWQgc2V0dGluZyByZXQgdG8gZW1wdHkg c3RyaW5nIGhlcmUKKwkJLy8gc28gd2UgZG9uJ3QgZGVmYXVsdCB0byBhdXRvCisJCWlmICggcmV0 ID09IG51bGwgJiYgc3R5bGUgJiYgc3R5bGVbIG5hbWUgXSApIHsKKwkJCXJldCA9IHN0eWxlWyBu YW1lIF07CisJCX0KKworCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRz CisJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8j Y29tbWVudC0xMDIyOTEKKworCQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxh ciBwaXhlbCBudW1iZXIKKwkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5n LCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCisJCS8vIGJ1dCBub3QgcG9zaXRpb24g Y3NzIGF0dHJpYnV0ZXMsIGFzIHRob3NlIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBhcmVudCBl bGVtZW50IGluc3RlYWQKKwkJLy8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0 ZWFkIGJlY2F1c2UgaXQgbWlnaHQgdHJpZ2dlciBhICJzdGFja2luZyBkb2xscyIgcHJvYmxlbQor CQlpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiAhcnBvc2l0aW9uLnRlc3QoIG5hbWUgKSAp IHsKKworCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcworCQkJbGVmdCA9IHN0eWxl LmxlZnQ7CisJCQlycyA9IGVsZW0ucnVudGltZVN0eWxlOworCQkJcnNMZWZ0ID0gcnMgJiYgcnMu bGVmdDsKKworCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZh bHVlIG91dAorCQkJaWYgKCByc0xlZnQgKSB7CisJCQkJcnMubGVmdCA9IGVsZW0uY3VycmVudFN0 eWxlLmxlZnQ7CisJCQl9CisJCQlzdHlsZS5sZWZ0ID0gbmFtZSA9PT0gImZvbnRTaXplIiA/ICIx ZW0iIDogcmV0OworCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKKworCQkJLy8gUmV2 ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworCQkJc3R5bGUubGVmdCA9IGxlZnQ7CisJCQlpZiAoIHJz TGVmdCApIHsKKwkJCQlycy5sZWZ0ID0gcnNMZWZ0OworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJl dCA9PT0gIiIgPyAiYXV0byIgOiByZXQ7CisJfTsKK30KKworZnVuY3Rpb24gc2V0UG9zaXRpdmVO dW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHsKKwl2YXIgbWF0Y2hlcyA9IHJudW1zcGxp dC5leGVjKCB2YWx1ZSApOworCXJldHVybiBtYXRjaGVzID8KKwkJLy8gR3VhcmQgYWdhaW5zdCB1 bmRlZmluZWQgInN1YnRyYWN0IiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzCisJCU1h dGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVz WyAyIF0gfHwgInB4IiApIDoKKwkJdmFsdWU7Cit9CisKK2Z1bmN0aW9uIGF1Z21lbnRXaWR0aE9y SGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxlcyApIHsKKwl2YXIg aSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSA/CisJ CS8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21l bnRhdGlvbgorCQk0IDoKKwkJLy8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwg b3IgdmVydGljYWwgcHJvcGVydGllcworCQluYW1lID09PSAid2lkdGgiID8gMSA6IDAsCisKKwkJ dmFsID0gMDsKKworCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKKwkJLy8gYm90aCBib3ggbW9k ZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQgaWYgd2Ugd2FudCBpdAorCQlpZiAoIGV4dHJh ID09PSAibWFyZ2luIiApIHsKKwkJCXZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNz c0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKKwkJfQorCisJCWlmICggaXNCb3JkZXJCb3gg KSB7CisJCQkvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3 ZSB3YW50IGNvbnRlbnQKKwkJCWlmICggZXh0cmEgPT09ICJjb250ZW50IiApIHsKKwkJCQl2YWwg LT0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0 eWxlcyApOworCQkJfQorCisJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIg bm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgorCQkJaWYgKCBleHRyYSAhPT0gIm1hcmdpbiIg KSB7CisJCQkJdmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBp IF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGF0 IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQsIHNvIGFkZCBwYWRkaW5nCisJCQl2YWwg Kz0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0 eWxlcyApOworCisJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBw YWRkaW5nLCBzbyBhZGQgYm9yZGVyCisJCQlpZiAoIGV4dHJhICE9PSAicGFkZGluZyIgKSB7CisJ CQkJdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAi V2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB2YWw7Cit9 CisKK2Z1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkgeworCisJ Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhl IGJvcmRlci1ib3ggdmFsdWUKKwl2YXIgdmFsdWVJc0JvcmRlckJveCA9IHRydWUsCisJCXZhbCA9 IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQs CisJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAorCQlpc0JvcmRlckJveCA9IGpRdWVyeS5z dXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2Us IHN0eWxlcyApID09PSAiYm9yZGVyLWJveCI7CisKKwkvLyBzb21lIG5vbi1odG1sIGVsZW1lbnRz IHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRl ZmluZWQKKwkvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNn aT9pZD02NDkyODUKKwkvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3No b3dfYnVnLmNnaT9pZD00OTE2NjgKKwlpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkgewor CQkvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3Nh cnkKKwkJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsKKwkJaWYgKCB2YWwgPCAw IHx8IHZhbCA9PSBudWxsICkgeworCQkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCQl9CisK KwkJLy8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi4K KwkJaWYgKCBybnVtbm9ucHgudGVzdCh2YWwpICkgeworCQkJcmV0dXJuIHZhbDsKKwkJfQorCisJ CS8vIHdlIG5lZWQgdGhlIGNoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCBy ZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzCisJCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVu dGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKKwkJdmFsdWVJc0JvcmRl ckJveCA9IGlzQm9yZGVyQm94ICYmICggalF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUg fHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKKworCQkvLyBOb3JtYWxpemUgIiIsIGF1 dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQorCQl2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAw OworCX0KKworCS8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRy YWN0IGlycmVsZXZhbnQgc3R5bGVzCisJcmV0dXJuICggdmFsICsKKwkJYXVnbWVudFdpZHRoT3JI ZWlnaHQoCisJCQllbGVtLAorCQkJbmFtZSwKKwkJCWV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyAi Ym9yZGVyIiA6ICJjb250ZW50IiApLAorCQkJdmFsdWVJc0JvcmRlckJveCwKKwkJCXN0eWxlcwor CQkpCisJKSArICJweCI7Cit9CisKKy8vIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlz cGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50CitmdW5jdGlvbiBjc3NfZGVmYXVsdERpc3BsYXkoIG5v ZGVOYW1lICkgeworCXZhciBkb2MgPSBkb2N1bWVudCwKKwkJZGlzcGxheSA9IGVsZW1kaXNwbGF5 WyBub2RlTmFtZSBdOworCisJaWYgKCAhZGlzcGxheSApIHsKKwkJZGlzcGxheSA9IGFjdHVhbERp c3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKKworCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywg cmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWUKKwkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwg IWRpc3BsYXkgKSB7CisJCQkvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9z c2libGUKKwkJCWlmcmFtZSA9ICggaWZyYW1lIHx8CisJCQkJalF1ZXJ5KCI8aWZyYW1lIGZyYW1l Ym9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikKKwkJCQkuY3NzKCAiY3NzVGV4dCIs ICJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQiICkKKwkJCSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVu dEVsZW1lbnQgKTsKKworCQkJLy8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28g V2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlCisJCQlkb2MgPSAoIGlmcmFt ZVswXS5jb250ZW50V2luZG93IHx8IGlmcmFtZVswXS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVu dDsKKwkJCWRvYy53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+Iik7CisJCQlkb2Mu Y2xvc2UoKTsKKworCQkJZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsK KwkJCWlmcmFtZS5kZXRhY2goKTsKKwkJfQorCisJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1 bHQgZGlzcGxheQorCQllbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7CisJfQorCisJ cmV0dXJuIGRpc3BsYXk7Cit9CisKKy8vIENhbGxlZCBPTkxZIGZyb20gd2l0aGluIGNzc19kZWZh dWx0RGlzcGxheQorZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwgZG9jICkgeworCXZhciBl bGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5i b2R5ICksCisJCWRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtWzBdLCAiZGlzcGxheSIgKTsKKwll bGVtLnJlbW92ZSgpOworCXJldHVybiBkaXNwbGF5OworfQorCitqUXVlcnkuZWFjaChbICJoZWln aHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCWpRdWVyeS5jc3NIb29rc1sg bmFtZSBdID0geworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CisJ CQlpZiAoIGNvbXB1dGVkICkgeworCQkJCS8vIGNlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGlt ZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbQorCQkJCS8vIGhvd2V2ZXIsIGl0 IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJv bSB0aGlzCisJCQkJcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgcmRpc3BsYXlzd2Fw LnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgPworCQkJCQlqUXVlcnkuc3dh cCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CisJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhl aWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKKwkJCQkJfSkgOgorCQkJCQlnZXRXaWR0aE9ySGVp Z2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworCQkJfQorCQl9LAorCisJCXNldDogZnVuY3Rpb24o IGVsZW0sIHZhbHVlLCBleHRyYSApIHsKKwkJCXZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHls ZXMoIGVsZW0gKTsKKwkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4 dHJhID8KKwkJCQlhdWdtZW50V2lkdGhPckhlaWdodCgKKwkJCQkJZWxlbSwKKwkJCQkJbmFtZSwK KwkJCQkJZXh0cmEsCisJCQkJCWpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3Nz KCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2UsIHN0eWxlcyApID09PSAiYm9yZGVyLWJveCIsCisJ CQkJCXN0eWxlcworCQkJCSkgOiAwCisJCQkpOworCQl9CisJfTsKK30pOworCitpZiAoICFqUXVl cnkuc3VwcG9ydC5vcGFjaXR5ICkgeworCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0geworCQln ZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKwkJCS8vIElFIHVzZXMgZmlsdGVycyBm b3Igb3BhY2l0eQorCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1 cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVy KSB8fCAiIiApID8KKwkJCQkoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgIiIg OgorCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiggZWxl bSwgdmFsdWUgKSB7CisJCQl2YXIgc3R5bGUgPSBlbGVtLnN0eWxlLAorCQkJCWN1cnJlbnRTdHls ZSA9IGVsZW0uY3VycmVudFN0eWxlLAorCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOdW1lcmljKCB2 YWx1ZSApID8gImFscGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiIDogIiIsCisJCQkJ ZmlsdGVyID0gY3VycmVudFN0eWxlICYmIGN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgc3R5bGUuZmls dGVyIHx8ICIiOworCisJCQkvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9l cyBub3QgaGF2ZSBsYXlvdXQKKwkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2 ZWwKKwkJCXN0eWxlLnpvb20gPSAxOworCisJCQkvLyBpZiBzZXR0aW5nIG9wYWNpdHkgdG8gMSwg YW5kIG5vIG90aGVyIGZpbHRlcnMgZXhpc3QgLSBhdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgYXR0 cmlidXRlICM2NjUyCisJCQkvLyBpZiB2YWx1ZSA9PT0gIiIsIHRoZW4gcmVtb3ZlIGlubGluZSBv cGFjaXR5ICMxMjY4NQorCQkJaWYgKCAoIHZhbHVlID49IDEgfHwgdmFsdWUgPT09ICIiICkgJiYK KwkJCQkJalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIg JiYKKwkJCQkJc3R5bGUucmVtb3ZlQXR0cmlidXRlICkgeworCisJCQkJLy8gU2V0dGluZyBzdHls ZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBj c3NUZXh0CisJCQkJLy8gaWYgImZpbHRlcjoiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUg aXMgZGlzYWJsZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpcworCQkJCS8vIHN0eWxlLnJlbW92ZUF0 dHJpYnV0ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4u LgorCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKKworCQkJCS8vIGlmIHRo ZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUgb3IgdW5zZXQgaW5s aW5lIG9wYWNpdHksIHdlIGFyZSBkb25lCisJCQkJaWYgKCB2YWx1ZSA9PT0gIiIgfHwgY3VycmVu dFN0eWxlICYmICFjdXJyZW50U3R5bGUuZmlsdGVyICkgeworCQkJCQlyZXR1cm47CisJCQkJfQor CQkJfQorCisJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcworCQkJc3R5bGUu ZmlsdGVyID0gcmFscGhhLnRlc3QoIGZpbHRlciApID8KKwkJCQlmaWx0ZXIucmVwbGFjZSggcmFs cGhhLCBvcGFjaXR5ICkgOgorCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CisJCX0KKwl9Owor fQorCisvLyBUaGVzZSBob29rcyBjYW5ub3QgYmUgYWRkZWQgdW50aWwgRE9NIHJlYWR5IGJlY2F1 c2UgdGhlIHN1cHBvcnQgdGVzdAorLy8gZm9yIGl0IGlzIG5vdCBydW4gdW50aWwgYWZ0ZXIgRE9N IHJlYWR5CitqUXVlcnkoZnVuY3Rpb24oKSB7CisJaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmVsaWFi bGVNYXJnaW5SaWdodCApIHsKKwkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0geworCQkJ Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisJCQkJaWYgKCBjb21wdXRlZCApIHsK KwkJCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9u ZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CisJCQkJCS8vIFdvcmsgYXJvdW5kIGJ5IHRlbXBvcmFy aWx5IHNldHRpbmcgZWxlbWVudCBkaXNwbGF5IHRvIGlubGluZS1ibG9jaworCQkJCQlyZXR1cm4g alF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LAorCQkJCQkJ Y3VyQ1NTLCBbIGVsZW0sICJtYXJnaW5SaWdodCIgXSApOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9 CisKKwkvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/ aWQ9MjkwODQKKwkvLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNp ZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0CisJLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUg Y3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIHdlIGp1c3QgY2hlY2sgZm9y IGl0IGhlcmUKKwlpZiAoICFqUXVlcnkuc3VwcG9ydC5waXhlbFBvc2l0aW9uICYmIGpRdWVyeS5m bi5wb3NpdGlvbiApIHsKKwkJalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlv biggaSwgcHJvcCApIHsKKwkJCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0geworCQkJCWdldDog ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJCQlpZiAoIGNvbXB1dGVkICkgeworCQkJ CQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKKwkJCQkJCS8vIGlmIGN1ckNTUyBy ZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldAorCQkJCQkJcmV0dXJuIHJudW1u b25weC50ZXN0KCBjb21wdXRlZCApID8KKwkJCQkJCQlqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigp WyBwcm9wIF0gKyAicHgiIDoKKwkJCQkJCQljb21wdXRlZDsKKwkJCQkJfQorCQkJCX0KKwkJCX07 CisJCX0pOworCX0KKworfSk7CisKK2lmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmls dGVycyApIHsKKwlqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkg eworCQkvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMgorCQkvLyBPcGVyYSByZXBvcnRzIG9mZnNl dFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRz CisJCXJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0g MCB8fAorCQkJKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKChlbGVt LnN0eWxlICYmIGVsZW0uc3R5bGUuZGlzcGxheSkgfHwgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3Bs YXkiICkpID09PSAibm9uZSIpOworCX07CisKKwlqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUg PSBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRl biggZWxlbSApOworCX07Cit9CisKKy8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUg dG8gZXhwYW5kIHByb3BlcnRpZXMKK2pRdWVyeS5lYWNoKHsKKwltYXJnaW46ICIiLAorCXBhZGRp bmc6ICIiLAorCWJvcmRlcjogIldpZHRoIgorfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkg eworCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7CisJCWV4cGFuZDogZnVu Y3Rpb24oIHZhbHVlICkgeworCQkJdmFyIGkgPSAwLAorCQkJCWV4cGFuZGVkID0ge30sCisKKwkJ CQkvLyBhc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKKwkJCQlwYXJ0cyA9 IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBd OworCisJCQlmb3IgKCA7IGkgPCA0OyBpKysgKSB7CisJCQkJZXhwYW5kZWRbIHByZWZpeCArIGNz c0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPQorCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0g MiBdIHx8IHBhcnRzWyAwIF07CisJCQl9CisKKwkJCXJldHVybiBleHBhbmRlZDsKKwkJfQorCX07 CisKKwlpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkgeworCQlqUXVlcnkuY3NzSG9va3Nb IHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOworCX0KK30pOwordmFy IHIyMCA9IC8lMjAvZywKKwlyYnJhY2tldCA9IC9cW1xdJC8sCisJckNSTEYgPSAvXHI/XG4vZywK Kwlyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkk L2ksCisJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9p OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1 cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKKwl9LAorCXNlcmlhbGl6 ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQkv LyBDYW4gYWRkIHByb3BIb29rIGZvciAiZWxlbWVudHMiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBl bGVtZW50cworCQkJdmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsICJlbGVtZW50cyIg KTsKKwkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0 aGlzOworCQl9KQorCQkuZmlsdGVyKGZ1bmN0aW9uKCl7CisJCQl2YXIgdHlwZSA9IHRoaXMudHlw ZTsKKwkJCS8vIFVzZSAuaXMoIjpkaXNhYmxlZCIpIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRd IHdvcmtzCisJCQlyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggIjpkaXNh YmxlZCIgKSAmJgorCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJz dWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKKwkJCQkoIHRoaXMuY2hlY2tlZCB8fCAhbWFu aXB1bGF0aW9uX3JjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApOworCQl9KQorCQkubWFwKGZ1 bmN0aW9uKCBpLCBlbGVtICl7CisJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CisK KwkJCXJldHVybiB2YWwgPT0gbnVsbCA/CisJCQkJbnVsbCA6CisJCQkJalF1ZXJ5LmlzQXJyYXko IHZhbCApID8KKwkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICl7CisJCQkJCQly ZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxu IiApIH07CisJCQkJCX0pIDoKKwkJCQkJeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVw bGFjZSggckNSTEYsICJcclxuIiApIH07CisJCX0pLmdldCgpOworCX0KK30pOworCisvL1Nlcmlh bGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCisvL2tleS92YWx1ZXMg aW50byBhIHF1ZXJ5IHN0cmluZworalF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlv bmFsICkgeworCXZhciBwcmVmaXgsCisJCXMgPSBbXSwKKwkJYWRkID0gZnVuY3Rpb24oIGtleSwg dmFsdWUgKSB7CisJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJl dHVybiBpdHMgdmFsdWUKKwkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2 YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOworCQkJc1sgcy5sZW5ndGgg XSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQo IHZhbHVlICk7CisJCX07CisKKwkvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1ZXJ5 IDw9IDEuMy4yIGJlaGF2aW9yLgorCWlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsK KwkJdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGlu Z3MudHJhZGl0aW9uYWw7CisJfQorCisJLy8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNz dW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy4KKwlpZiAoIGpRdWVyeS5p c0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSAp ICkgeworCQkvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHMKKwkJalF1ZXJ5LmVhY2goIGEs IGZ1bmN0aW9uKCkgeworCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKKwkJfSk7CisK Kwl9IGVsc2UgeworCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRo ZSB3YXkgMS4zLjIgb3Igb2xkZXIKKwkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJh bXMgcmVjdXJzaXZlbHkuCisJCWZvciAoIHByZWZpeCBpbiBhICkgeworCQkJYnVpbGRQYXJhbXMo IHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJfQorCX0KKworCS8v IFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KKwlyZXR1cm4gcy5qb2luKCAiJiIg KS5yZXBsYWNlKCByMjAsICIrIiApOworfTsKKworZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZp eCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgeworCXZhciBuYW1lOworCisJaWYgKCBqUXVlcnku aXNBcnJheSggb2JqICkgKSB7CisJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgorCQlqUXVlcnku ZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHsKKwkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJy YWNrZXQudGVzdCggcHJlZml4ICkgKSB7CisJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFz IGEgc2NhbGFyLgorCQkJCWFkZCggcHJlZml4LCB2ICk7CisKKwkJCX0gZWxzZSB7CisJCQkJLy8g SXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMg aW5kZXguCisJCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArICggdHlwZW9mIHYgPT09ICJv YmplY3QiID8gaSA6ICIiICkgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJCX0KKwkJ fSk7CisKKwl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09 PSAib2JqZWN0IiApIHsKKwkJLy8gU2VyaWFsaXplIG9iamVjdCBpdGVtLgorCQlmb3IgKCBuYW1l IGluIG9iaiApIHsKKwkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBv YmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOworCQl9CisKKwl9IGVsc2UgeworCQkvLyBT ZXJpYWxpemUgc2NhbGFyIGl0ZW0uCisJCWFkZCggcHJlZml4LCBvYmogKTsKKwl9Cit9CitqUXVl cnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xs IHVubG9hZCBjbGljayBkYmxjbGljayAiICsKKwkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3Zl IG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCisJImNoYW5nZSBz ZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiKS5z cGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKworCS8vIEhhbmRsZSBldmVudCBiaW5k aW5nCisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CisJCXJldHVy biBhcmd1bWVudHMubGVuZ3RoID4gMCA/CisJCQl0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBm biApIDoKKwkJCXRoaXMudHJpZ2dlciggbmFtZSApOworCX07Cit9KTsKKworalF1ZXJ5LmZuLmhv dmVyID0gZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CisJcmV0dXJuIHRoaXMubW91c2VlbnRl ciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cit9OwordmFyCisJLy8g RG9jdW1lbnQgbG9jYXRpb24KKwlhamF4TG9jUGFydHMsCisJYWpheExvY2F0aW9uLAorCWFqYXhf bm9uY2UgPSBqUXVlcnkubm93KCksCisKKwlhamF4X3JxdWVyeSA9IC9cPy8sCisJcmhhc2ggPSAv Iy4qJC8sCisJcnRzID0gLyhbPyZdKV89W14mXSovLAorCXJoZWFkZXJzID0gL14oLio/KTpbIFx0 XSooW15cclxuXSopXHI/JC9tZywgLy8gSUUgbGVhdmVzIGFuIFxyIGNoYXJhY3RlciBhdCBFT0wK KwkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KKwlybG9j YWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxl fHJlc3x3aWRnZXQpOiQvLAorCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAorCXJwcm90 b2NvbCA9IC9eXC9cLy8sCisJcnVybCA9IC9eKFtcdy4rLV0rOikoPzpcL1wvKFteXC8/IzpdKiko Pzo6KFxkKyl8KXwpLywKKworCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QK KwlfbG9hZCA9IGpRdWVyeS5mbi5sb2FkLAorCisJLyogUHJlZmlsdGVycworCSAqIDEpIFRoZXkg YXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAu anMgZm9yIGFuIGV4YW1wbGUpCisJICogMikgVGhlc2UgYXJlIGNhbGxlZDoKKwkgKiAgICAtIEJF Rk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CisJICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxp emF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKQorCSAq IDMpIGtleSBpcyB0aGUgZGF0YVR5cGUKKwkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBj YW4gYmUgdXNlZAorCSAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRh dGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gIioiIGlmIG5lZWRlZAorCSAqLworCXBy ZWZpbHRlcnMgPSB7fSwKKworCS8qIFRyYW5zcG9ydHMgYmluZGluZ3MKKwkgKiAxKSBrZXkgaXMg dGhlIGRhdGFUeXBlCisJICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQK KwkgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQg VEhFTiBnbyB0byAiKiIgaWYgbmVlZGVkCisJICovCisJdHJhbnNwb3J0cyA9IHt9LAorCisJLy8g QXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNl IGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCisJYWxsVHlwZXMgPSAiKi8iLmNvbmNhdCgiKiIp OworCisvLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwor Ly8gYSBmaWVsZCBmcm9tIHdpbmRvdy5sb2NhdGlvbiBpZiBkb2N1bWVudC5kb21haW4gaGFzIGJl ZW4gc2V0Cit0cnkgeworCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cit9IGNhdGNoKCBl ICkgeworCS8vIFVzZSB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgYW4gQSBlbGVtZW50CisJLy8gc2lu Y2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KKwlhamF4TG9jYXRp b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKKwlhamF4TG9jYXRpb24uaHJlZiA9 ICIiOworCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOworfQorCisvLyBTZWdtZW50 IGxvY2F0aW9uIGludG8gcGFydHMKK2FqYXhMb2NQYXJ0cyA9IHJ1cmwuZXhlYyggYWpheExvY2F0 aW9uLnRvTG93ZXJDYXNlKCkgKSB8fCBbXTsKKworLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBq UXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKK2Z1bmN0aW9uIGFk ZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkgeworCisJLy8gZGF0YVR5cGVF eHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKKwlyZXR1cm4gZnVuY3Rp b24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHsKKworCQlpZiAoIHR5cGVvZiBkYXRhVHlw ZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgeworCQkJZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lv bjsKKwkJCWRhdGFUeXBlRXhwcmVzc2lvbiA9ICIqIjsKKwkJfQorCisJCXZhciBkYXRhVHlwZSwK KwkJCWkgPSAwLAorCQkJZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNl KCkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5j dGlvbiggZnVuYyApICkgeworCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBl RXhwcmVzc2lvbgorCQkJd2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7CisJ CQkJLy8gUHJlcGVuZCBpZiByZXF1ZXN0ZWQKKwkJCQlpZiAoIGRhdGFUeXBlWzBdID09PSAiKyIg KSB7CisJCQkJCWRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCAiKiI7CisJCQkJCShz dHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnVuc2hp ZnQoIGZ1bmMgKTsKKworCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKKwkJCQl9IGVsc2UgeworCQkJ CQkoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5w dXNoKCBmdW5jICk7CisJCQkJfQorCQkJfQorCQl9CisJfTsKK30KKworLy8gQmFzZSBpbnNwZWN0 aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzCitmdW5jdGlvbiBpbnNw ZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9w dGlvbnMsIGpxWEhSICkgeworCisJdmFyIGluc3BlY3RlZCA9IHt9LAorCQlzZWVraW5nVHJhbnNw b3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTsKKworCWZ1bmN0aW9uIGluc3BlY3Qo IGRhdGFUeXBlICkgeworCQl2YXIgc2VsZWN0ZWQ7CisJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9 IHRydWU7CisJCWpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0 aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7CisJCQl2YXIgZGF0YVR5cGVPclRyYW5zcG9y dCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiAp OworCQkJaWYoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSAic3RyaW5nIiAmJiAhc2Vl a2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7CisJ CQkJb3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApOworCQkJ CWluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9 IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkgeworCQkJCXJldHVybiAhKCBzZWxlY3RlZCA9 IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiBzZWxlY3RlZDsK Kwl9CisKKwlyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNw ZWN0ZWRbICIqIiBdICYmIGluc3BlY3QoICIqIiApOworfQorCisvLyBBIHNwZWNpYWwgZXh0ZW5k IGZvciBhamF4IG9wdGlvbnMKKy8vIHRoYXQgdGFrZXMgImZsYXQiIG9wdGlvbnMgKG5vdCB0byBi ZSBkZWVwIGV4dGVuZGVkKQorLy8gRml4ZXMgIzk4ODcKK2Z1bmN0aW9uIGFqYXhFeHRlbmQoIHRh cmdldCwgc3JjICkgeworCXZhciBkZWVwLCBrZXksCisJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFq YXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKKworCWZvciAoIGtleSBpbiBzcmMgKSB7CisJ CWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgeworCQkJKCBmbGF0T3B0aW9uc1sga2V5 IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9IHNyY1sga2V5 IF07CisJCX0KKwl9CisJaWYgKCBkZWVwICkgeworCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJn ZXQsIGRlZXAgKTsKKwl9CisKKwlyZXR1cm4gdGFyZ2V0OworfQorCitqUXVlcnkuZm4ubG9hZCA9 IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CisJaWYgKCB0eXBlb2YgdXJsICE9 PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKKwkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1 bWVudHMgKTsKKwl9CisKKwl2YXIgc2VsZWN0b3IsIHJlc3BvbnNlLCB0eXBlLAorCQlzZWxmID0g dGhpcywKKwkJb2ZmID0gdXJsLmluZGV4T2YoIiAiKTsKKworCWlmICggb2ZmID49IDAgKSB7CisJ CXNlbGVjdG9yID0gdXJsLnNsaWNlKCBvZmYsIHVybC5sZW5ndGggKTsKKwkJdXJsID0gdXJsLnNs aWNlKCAwLCBvZmYgKTsKKwl9CisKKwkvLyBJZiBpdCdzIGEgZnVuY3Rpb24KKwlpZiAoIGpRdWVy eS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKKworCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRo ZSBjYWxsYmFjaworCQljYWxsYmFjayA9IHBhcmFtczsKKwkJcGFyYW1zID0gdW5kZWZpbmVkOwor CisJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworCX0gZWxzZSBpZiAoIHBhcmFt cyAmJiB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKKwkJdHlwZSA9ICJQT1NUIjsKKwl9 CisKKwkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAor CWlmICggc2VsZi5sZW5ndGggPiAwICkgeworCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IHVybCwK KworCQkJLy8gaWYgInR5cGUiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiAiR0VUIiBtZXRo b2Qgd2lsbCBiZSB1c2VkCisJCQl0eXBlOiB0eXBlLAorCQkJZGF0YVR5cGU6ICJodG1sIiwKKwkJ CWRhdGE6IHBhcmFtcworCQl9KS5kb25lKGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CisKKwkJ CS8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFjaworCQkJcmVzcG9u c2UgPSBhcmd1bWVudHM7CisKKwkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPworCisJCQkJLy8gSWYg YSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEg ZHVtbXkgZGl2CisJCQkJLy8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9u IERlbmllZCcgZXJyb3JzCisJCQkJalF1ZXJ5KCI8ZGl2PiIpLmFwcGVuZCggalF1ZXJ5LnBhcnNl SFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDoKKworCQkJCS8vIE90aGVy d2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CisJCQkJcmVzcG9uc2VUZXh0ICk7CisKKwkJfSkuY29t cGxldGUoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkgeworCQkJc2VsZi5l YWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywg anFYSFIgXSApOworCQl9KTsKKwl9CisKKwlyZXR1cm4gdGhpczsKK307CisKKy8vIEF0dGFjaCBh IGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCitqUXVl cnkuZWFjaCggWyAiYWpheFN0YXJ0IiwgImFqYXhTdG9wIiwgImFqYXhDb21wbGV0ZSIsICJhamF4 RXJyb3IiLCAiYWpheFN1Y2Nlc3MiLCAiYWpheFNlbmQiIF0sIGZ1bmN0aW9uKCBpLCB0eXBlICl7 CisJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKXsKKwkJcmV0dXJuIHRoaXMub24o IHR5cGUsIGZuICk7CisJfTsKK30pOworCitqUXVlcnkuZWFjaCggWyAiZ2V0IiwgInBvc3QiIF0s IGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7CisJalF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1 cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0 YSBhcmd1bWVudCB3YXMgb21pdHRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkg KSB7CisJCQl0eXBlID0gdHlwZSB8fCBjYWxsYmFjazsKKwkJCWNhbGxiYWNrID0gZGF0YTsKKwkJ CWRhdGEgPSB1bmRlZmluZWQ7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdXJs OiB1cmwsCisJCQl0eXBlOiBtZXRob2QsCisJCQlkYXRhVHlwZTogdHlwZSwKKwkJCWRhdGE6IGRh dGEsCisJCQlzdWNjZXNzOiBjYWxsYmFjaworCQl9KTsKKwl9OworfSk7CisKK2pRdWVyeS5leHRl bmQoeworCisJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVy aWVzCisJYWN0aXZlOiAwLAorCisJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5l eHQgcmVxdWVzdAorCWxhc3RNb2RpZmllZDoge30sCisJZXRhZzoge30sCisKKwlhamF4U2V0dGlu Z3M6IHsKKwkJdXJsOiBhamF4TG9jYXRpb24sCisJCXR5cGU6ICJHRVQiLAorCQlpc0xvY2FsOiBy bG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAorCQlnbG9iYWw6IHRydWUs CisJCXByb2Nlc3NEYXRhOiB0cnVlLAorCQlhc3luYzogdHJ1ZSwKKwkJY29udGVudFR5cGU6ICJh cHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAorCQkvKgor CQl0aW1lb3V0OiAwLAorCQlkYXRhOiBudWxsLAorCQlkYXRhVHlwZTogbnVsbCwKKwkJdXNlcm5h bWU6IG51bGwsCisJCXBhc3N3b3JkOiBudWxsLAorCQljYWNoZTogbnVsbCwKKwkJdGhyb3dzOiBm YWxzZSwKKwkJdHJhZGl0aW9uYWw6IGZhbHNlLAorCQloZWFkZXJzOiB7fSwKKwkJKi8KKworCQlh Y2NlcHRzOiB7CisJCQkiKiI6IGFsbFR5cGVzLAorCQkJdGV4dDogInRleHQvcGxhaW4iLAorCQkJ aHRtbDogInRleHQvaHRtbCIsCisJCQl4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwK KwkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCisJCX0sCisKKwkJ Y29udGVudHM6IHsKKwkJCXhtbDogL3htbC8sCisJCQlodG1sOiAvaHRtbC8sCisJCQlqc29uOiAv anNvbi8KKwkJfSwKKworCQlyZXNwb25zZUZpZWxkczogeworCQkJeG1sOiAicmVzcG9uc2VYTUwi LAorCQkJdGV4dDogInJlc3BvbnNlVGV4dCIKKwkJfSwKKworCQkvLyBEYXRhIGNvbnZlcnRlcnMK KwkJLy8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsICIqIikgYW5kIGRlc3RpbmF0 aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2UKKwkJY29udmVydGVyczogeworCisJCQkvLyBD b252ZXJ0IGFueXRoaW5nIHRvIHRleHQKKwkJCSIqIHRleHQiOiB3aW5kb3cuU3RyaW5nLAorCisJ CQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKKwkJCSJ0ZXh0IGh0 bWwiOiB0cnVlLAorCisJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCisJ CQkidGV4dCBqc29uIjogalF1ZXJ5LnBhcnNlSlNPTiwKKworCQkJLy8gUGFyc2UgdGV4dCBhcyB4 bWwKKwkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAorCQl9LAorCisJCS8vIEZvciBvcHRp b25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CisJCS8vIHlvdSBjYW4gYWRkIHlv dXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKKwkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBv bmUgdGhhdCBzaG91bGRuJ3QgYmUKKwkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQp CisJCWZsYXRPcHRpb25zOiB7CisJCQl1cmw6IHRydWUsCisJCQljb250ZXh0OiB0cnVlCisJCX0K Kwl9LAorCisJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0 YXJnZXQKKwkvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuCisJ Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KKwlhamF4 U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgeworCQlyZXR1cm4gc2V0dGluZ3Mg PworCisJCQkvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdAorCQkJYWpheEV4dGVuZCggYWph eEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOgorCisJ CQkvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisJCQlhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNl dHRpbmdzLCB0YXJnZXQgKTsKKwl9LAorCisJYWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJz T3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksCisJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0 ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCisKKwkvLyBNYWluIG1ldGhvZAorCWFqYXg6 IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CisKKwkJLy8gSWYgdXJsIGlzIGFuIG9iamVjdCwg c2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKKwkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0 IiApIHsKKwkJCW9wdGlvbnMgPSB1cmw7CisJCQl1cmwgPSB1bmRlZmluZWQ7CisJCX0KKworCQkv LyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdAorCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7 fTsKKworCQl2YXIgLy8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzCisJCQlwYXJ0cywKKwkJ CS8vIExvb3AgdmFyaWFibGUKKwkJCWksCisJCQkvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBh cmFtCisJCQljYWNoZVVSTCwKKwkJCS8vIFJlc3BvbnNlIGhlYWRlcnMgYXMgc3RyaW5nCisJCQly ZXNwb25zZUhlYWRlcnNTdHJpbmcsCisJCQkvLyB0aW1lb3V0IGhhbmRsZQorCQkJdGltZW91dFRp bWVyLAorCisJCQkvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNo ZWQKKwkJCWZpcmVHbG9iYWxzLAorCisJCQl0cmFuc3BvcnQsCisJCQkvLyBSZXNwb25zZSBoZWFk ZXJzCisJCQlyZXNwb25zZUhlYWRlcnMsCisJCQkvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMg b2JqZWN0CisJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKKwkJCS8vIENh bGxiYWNrcyBjb250ZXh0CisJCQljYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcywKKwkJ CS8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlz IGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb24KKwkJCWdsb2JhbEV2ZW50Q29udGV4dCA9 IHMuY29udGV4dCAmJiAoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRl eHQuanF1ZXJ5ICkgPworCQkJCWpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOgorCQkJCWpRdWVy eS5ldmVudCwKKwkJCS8vIERlZmVycmVkcworCQkJZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQo KSwKKwkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIp LAorCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKwkJCXN0YXR1c0NvZGUgPSBzLnN0 YXR1c0NvZGUgfHwge30sCisJCQkvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNl KQorCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKKwkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwK KwkJCS8vIFRoZSBqcVhIUiBzdGF0ZQorCQkJc3RhdGUgPSAwLAorCQkJLy8gRGVmYXVsdCBhYm9y dCBtZXNzYWdlCisJCQlzdHJBYm9ydCA9ICJjYW5jZWxlZCIsCisJCQkvLyBGYWtlIHhocgorCQkJ anFYSFIgPSB7CisJCQkJcmVhZHlTdGF0ZTogMCwKKworCQkJCS8vIEJ1aWxkcyBoZWFkZXJzIGhh c2h0YWJsZSBpZiBuZWVkZWQKKwkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSAp IHsKKwkJCQkJdmFyIG1hdGNoOworCQkJCQlpZiAoIHN0YXRlID09PSAyICkgeworCQkJCQkJaWYg KCAhcmVzcG9uc2VIZWFkZXJzICkgeworCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OworCQkJ CQkJCXdoaWxlICggKG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5n ICkpICkgeworCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkg XSA9IG1hdGNoWyAyIF07CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJbWF0Y2ggPSByZXNwb25z ZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07CisJCQkJCX0KKwkJCQkJcmV0dXJuIG1hdGNo ID09IG51bGwgPyBudWxsIDogbWF0Y2g7CisJCQkJfSwKKworCQkJCS8vIFJhdyBzdHJpbmcKKwkJ CQlnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkgeworCQkJCQlyZXR1cm4gc3RhdGUg PT09IDIgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsOworCQkJCX0sCisKKwkJCQkvLyBD YWNoZXMgdGhlIGhlYWRlcgorCQkJCXNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2 YWx1ZSApIHsKKwkJCQkJdmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQkJCQlpZiAo ICFzdGF0ZSApIHsKKwkJCQkJCW5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0g cmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lOworCQkJCQkJcmVxdWVzdEhlYWRl cnNbIG5hbWUgXSA9IHZhbHVlOworCQkJCQl9CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0sCisK KwkJCQkvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlcgorCQkJCW92ZXJy aWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQkJCQlpZiAoICFzdGF0ZSApIHsKKwkJ CQkJCXMubWltZVR5cGUgPSB0eXBlOworCQkJCQl9CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0s CisKKwkJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworCQkJCXN0YXR1c0NvZGU6IGZ1 bmN0aW9uKCBtYXAgKSB7CisJCQkJCXZhciBjb2RlOworCQkJCQlpZiAoIG1hcCApIHsKKwkJCQkJ CWlmICggc3RhdGUgPCAyICkgeworCQkJCQkJCWZvciAoIGNvZGUgaW4gbWFwICkgeworCQkJCQkJ CQkvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9s ZCBvbmVzCisJCQkJCQkJCXN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBd LCBtYXBbIGNvZGUgXSBdOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gRXhl Y3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzCisJCQkJCQkJanFYSFIuYWx3YXlzKCBtYXBb IGpxWEhSLnN0YXR1cyBdICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuIHRoaXM7CisJ CQkJfSwKKworCQkJCS8vIENhbmNlbCB0aGUgcmVxdWVzdAorCQkJCWFib3J0OiBmdW5jdGlvbigg c3RhdHVzVGV4dCApIHsKKwkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJv cnQ7CisJCQkJCWlmICggdHJhbnNwb3J0ICkgeworCQkJCQkJdHJhbnNwb3J0LmFib3J0KCBmaW5h bFRleHQgKTsKKwkJCQkJfQorCQkJCQlkb25lKCAwLCBmaW5hbFRleHQgKTsKKwkJCQkJcmV0dXJu IHRoaXM7CisJCQkJfQorCQkJfTsKKworCQkvLyBBdHRhY2ggZGVmZXJyZWRzCisJCWRlZmVycmVk LnByb21pc2UoIGpxWEhSICkuY29tcGxldGUgPSBjb21wbGV0ZURlZmVycmVkLmFkZDsKKwkJanFY SFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7CisJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKKwor CQkvLyBSZW1vdmUgaGFzaCBjaGFyYWN0ZXIgKCM3NTMxOiBhbmQgc3RyaW5nIHByb21vdGlvbikK KwkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAoIzU4NjY6IElFNyBpc3N1ZSB3aXRo IHByb3RvY29sLWxlc3MgdXJscykKKwkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGlu Z3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKKwkJLy8g V2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCisJCXMudXJsID0gKCAo IHVybCB8fCBzLnVybCB8fCBhamF4TG9jYXRpb24gKSArICIiICkucmVwbGFjZSggcmhhc2gsICIi ICkucmVwbGFjZSggcnByb3RvY29sLCBhamF4TG9jUGFydHNbIDEgXSArICIvLyIgKTsKKworCQkv LyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDQKKwkJcy50 eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlw ZTsKKworCQkvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0CisJCXMuZGF0YVR5cGVzID0galF1ZXJ5 LnRyaW0oIHMuZGF0YVR5cGUgfHwgIioiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggY29yZV9ybm90 d2hpdGUgKSB8fCBbIiJdOworCisJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3Jk ZXIgd2hlbiB3ZSBoYXZlIGEgcHJvdG9jb2w6aG9zdDpwb3J0IG1pc21hdGNoCisJCWlmICggcy5j cm9zc0RvbWFpbiA9PSBudWxsICkgeworCQkJcGFydHMgPSBydXJsLmV4ZWMoIHMudXJsLnRvTG93 ZXJDYXNlKCkgKTsKKwkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKKwkJCQkoIHBhcnRz WyAxIF0gIT09IGFqYXhMb2NQYXJ0c1sgMSBdIHx8IHBhcnRzWyAyIF0gIT09IGFqYXhMb2NQYXJ0 c1sgMiBdIHx8CisJCQkJCSggcGFydHNbIDMgXSB8fCAoIHBhcnRzWyAxIF0gPT09ICJodHRwOiIg PyA4MCA6IDQ0MyApICkgIT0KKwkJCQkJCSggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9j UGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSApCisJCQkpOworCQl9CisKKwkJ Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCisJCWlmICggcy5kYXRhICYm IHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CisJCQlzLmRh dGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOworCQl9CisKKwkJLy8g QXBwbHkgcHJlZmlsdGVycworCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmls dGVycywgcywgb3B0aW9ucywganFYSFIgKTsKKworCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVk IGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQorCQlpZiAoIHN0YXRlID09PSAyICkgewor CQkJcmV0dXJuIGpxWEhSOworCQl9CisKKwkJLy8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBh cyBvZiBub3cgaWYgYXNrZWQgdG8KKwkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKKworCQkvLyBX YXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCisJCWlmICggZmlyZUdsb2JhbHMgJiYgalF1 ZXJ5LmFjdGl2ZSsrID09PSAwICkgeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFy dCIpOworCQl9CisKKwkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCisJCXMudHlwZSA9IHMudHlwZS50 b1VwcGVyQ2FzZSgpOworCisJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CisJ CXMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApOworCisJCS8vIFNhdmUg dGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZQor CQkvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb24KKwkJY2FjaGVVUkwgPSBz LnVybDsKKworCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8g Y29udGVudAorCQlpZiAoICFzLmhhc0NvbnRlbnQgKSB7CisKKwkJCS8vIElmIGRhdGEgaXMgYXZh aWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKKwkJCWlmICggcy5kYXRhICkgeworCQkJCWNhY2hl VVJMID0gKCBzLnVybCArPSAoIGFqYXhfcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAi PyIgKSArIHMuZGF0YSApOworCQkJCS8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mg bm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKKwkJCQlkZWxldGUgcy5kYXRhOworCQkJfQor CisJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCisJCQlpZiAoIHMuY2FjaGUg PT09IGZhbHNlICkgeworCQkJCXMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPworCisJCQkJ CS8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlCisJ CQkJCWNhY2hlVVJMLnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgYWpheF9ub25jZSsrICkgOgorCisJ CQkJCS8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmQKKwkJCQkJY2FjaGVVUkwgKyAoIGFq YXhfcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArICJfPSIgKyBhamF4X25v bmNlKys7CisJCQl9CisJCX0KKworCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9v ciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgorCQlpZiAoIHMu aWZNb2RpZmllZCApIHsKKwkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSAp IHsKKwkJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVl cnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7CisJCQl9CisJCQlpZiAoIGpRdWVyeS5ldGFn WyBjYWNoZVVSTCBdICkgeworCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1h dGNoIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKKwkJCX0KKwkJfQorCisJCS8vIFNldCB0 aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudAorCQlpZiAoIHMuZGF0YSAm JiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250 ZW50VHlwZSApIHsKKwkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBz LmNvbnRlbnRUeXBlICk7CisJCX0KKworCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0 aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisJCWpxWEhSLnNldFJlcXVlc3RI ZWFkZXIoCisJCQkiQWNjZXB0IiwKKwkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBz LmRhdGFUeXBlc1swXSBdID8KKwkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMu ZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7IHE9MC4wMSIgOiAi IiApIDoKKwkJCQlzLmFjY2VwdHNbICIqIiBdCisJCSk7CisKKwkJLy8gQ2hlY2sgZm9yIGhlYWRl cnMgb3B0aW9uCisJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgeworCQkJanFYSFIuc2V0UmVxdWVz dEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKKwkJfQorCisJCS8vIEFsbG93IGN1c3RvbSBo ZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKwkJaWYgKCBzLmJlZm9yZVNlbmQgJiYg KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxz ZSB8fCBzdGF0ZSA9PT0gMiApICkgeworCQkJLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBh bmQgcmV0dXJuCisJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKKwkJfQorCisJCS8vIGFib3J0aW5n IGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgorCQlzdHJBYm9ydCA9ICJhYm9ydCI7CisKKwkJ Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCisJCWZvciAoIGkgaW4geyBzdWNjZXNz OiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHsKKwkJCWpxWEhSWyBpIF0oIHNbIGkgXSAp OworCQl9CisKKwkJLy8gR2V0IHRyYW5zcG9ydAorCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmls dGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworCQkv LyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKKwkJaWYgKCAhdHJhbnNwb3J0ICkgewor CQkJZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7CisJCX0gZWxzZSB7CisJCQlqcVhIUi5yZWFk eVN0YXRlID0gMTsKKworCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKKwkJCWlmICggZmlyZUdsb2Jh bHMgKSB7CisJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFY SFIsIHMgXSApOworCQkJfQorCQkJLy8gVGltZW91dAorCQkJaWYgKCBzLmFzeW5jICYmIHMudGlt ZW91dCA+IDAgKSB7CisJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsK KwkJCQkJanFYSFIuYWJvcnQoInRpbWVvdXQiKTsKKwkJCQl9LCBzLnRpbWVvdXQgKTsKKwkJCX0K KworCQkJdHJ5IHsKKwkJCQlzdGF0ZSA9IDE7CisJCQkJdHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RI ZWFkZXJzLCBkb25lICk7CisJCQl9IGNhdGNoICggZSApIHsKKwkJCQkvLyBQcm9wYWdhdGUgZXhj ZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCisJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CisJCQkJ CWRvbmUoIC0xLCBlICk7CisJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCisJCQkJfSBl bHNlIHsKKwkJCQkJdGhyb3cgZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBDYWxsYmFjayBm b3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKKwkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRp dmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CisJCQl2YXIgaXNTdWNjZXNzLCBz dWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAorCQkJCXN0YXR1c1RleHQgPSBuYXRp dmVTdGF0dXNUZXh0OworCisJCQkvLyBDYWxsZWQgb25jZQorCQkJaWYgKCBzdGF0ZSA9PT0gMiAp IHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIFN0YXRlIGlzICJkb25lIiBub3cKKwkJCXN0 YXRlID0gMjsKKworCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKKwkJCWlmICggdGlt ZW91dFRpbWVyICkgeworCQkJCWNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7CisJCQl9CisK KwkJCS8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9u CisJCQkvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2Vk KQorCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOworCisJCQkvLyBDYWNoZSByZXNwb25zZSBoZWFk ZXJzCisJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOworCisJCQkvLyBT ZXQgcmVhZHlTdGF0ZQorCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsK KworCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKKwkJCWlmICggcmVzcG9uc2VzICkgeworCQkJCXJl c3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApOworCQkJ fQorCisJCQkvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZworCQkJaWYgKCBz dGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNCApIHsKKworCQkJ CS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVy LCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCisJCQkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CisJCQkJ CW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKKwkJ CQkJaWYgKCBtb2RpZmllZCApIHsKKwkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJM IF0gPSBtb2RpZmllZDsKKwkJCQkJfQorCQkJCQltb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNl SGVhZGVyKCJldGFnIik7CisJCQkJCWlmICggbW9kaWZpZWQgKSB7CisJCQkJCQlqUXVlcnkuZXRh Z1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gaWYgbm8g Y29udGVudAorCQkJCWlmICggc3RhdHVzID09PSAyMDQgKSB7CisJCQkJCWlzU3VjY2VzcyA9IHRy dWU7CisJCQkJCXN0YXR1c1RleHQgPSAibm9jb250ZW50IjsKKworCQkJCS8vIGlmIG5vdCBtb2Rp ZmllZAorCQkJCX0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkgeworCQkJCQlpc1N1Y2Nlc3Mg PSB0cnVlOworCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKKworCQkJCS8vIElmIHdl IGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAorCQkJCX0gZWxzZSB7CisJCQkJCWlzU3VjY2Vz cyA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApOworCQkJCQlzdGF0dXNUZXh0ID0gaXNTdWNj ZXNzLnN0YXRlOworCQkJCQlzdWNjZXNzID0gaXNTdWNjZXNzLmRhdGE7CisJCQkJCWVycm9yID0g aXNTdWNjZXNzLmVycm9yOworCQkJCQlpc1N1Y2Nlc3MgPSAhZXJyb3I7CisJCQkJfQorCQkJfSBl bHNlIHsKKwkJCQkvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dAorCQkJCS8vIHRo ZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cworCQkJCWVy cm9yID0gc3RhdHVzVGV4dDsKKwkJCQlpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHsKKwkJ CQkJc3RhdHVzVGV4dCA9ICJlcnJvciI7CisJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKKwkJCQkJ CXN0YXR1cyA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCBkYXRhIGZvciB0 aGUgZmFrZSB4aHIgb2JqZWN0CisJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CisJCQlqcVhIUi5z dGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArICIiOworCisJ CQkvLyBTdWNjZXNzL0Vycm9yCisJCQlpZiAoIGlzU3VjY2VzcyApIHsKKwkJCQlkZWZlcnJlZC5y ZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhS IF0gKTsKKwkJCX0gZWxzZSB7CisJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250 ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7CisJCQl9CisKKwkJCS8vIFN0YXR1 cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7 CisJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOworCisJCQlpZiAoIGZpcmVHbG9iYWxzICkgewor CQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAiYWpheFN1Y2Nlc3Mi IDogImFqYXhFcnJvciIsCisJCQkJCVsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBl cnJvciBdICk7CisJCQl9CisKKwkJCS8vIENvbXBsZXRlCisJCQljb21wbGV0ZURlZmVycmVkLmZp cmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOworCisJCQlp ZiAoIGZpcmVHbG9iYWxzICkgeworCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWph eENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CisJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpB WCBjb3VudGVyCisJCQkJaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHsKKwkJCQkJalF1ZXJ5 LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJu IGpxWEhSOworCX0sCisKKwlnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewor CQlyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiAp OworCX0sCisKKwlnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKwkJ cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOworCX0KK30p OworCisvKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CisgKiAtIHNldHMg YWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQorICogLSBmaW5kcyB0aGUgcmlnaHQg ZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRh VHlwZSkKKyAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQorICovCitmdW5j dGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkgeworCXZhciBm aXJzdERhdGFUeXBlLCBjdCwgZmluYWxEYXRhVHlwZSwgdHlwZSwKKwkJY29udGVudHMgPSBzLmNv bnRlbnRzLAorCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKKwkJcmVzcG9uc2VGaWVsZHMgPSBz LnJlc3BvbnNlRmllbGRzOworCisJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKKwlmb3IgKCB0 eXBlIGluIHJlc3BvbnNlRmllbGRzICkgeworCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewor CQkJanFYSFJbIHJlc3BvbnNlRmllbGRzW3R5cGVdIF0gPSByZXNwb25zZXNbIHR5cGUgXTsKKwkJ fQorCX0KKworCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGlu IHRoZSBwcm9jZXNzCisJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CisJCWRhdGFU eXBlcy5zaGlmdCgpOworCQlpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7CisJCQljdCA9IHMubWlt ZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpOworCQl9CisJ fQorCisJLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBl CisJaWYgKCBjdCApIHsKKwkJZm9yICggdHlwZSBpbiBjb250ZW50cyApIHsKKwkJCWlmICggY29u dGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7CisJCQkJZGF0 YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8v IENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRh VHlwZQorCWlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkgeworCQlmaW5hbERhdGFU eXBlID0gZGF0YVR5cGVzWyAwIF07CisJfSBlbHNlIHsKKwkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRh dGFUeXBlcworCQlmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKKwkJCWlmICggIWRhdGFUeXBl c1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewor CQkJCWZpbmFsRGF0YVR5cGUgPSB0eXBlOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCAhZmly c3REYXRhVHlwZSApIHsKKwkJCQlmaXJzdERhdGFUeXBlID0gdHlwZTsKKwkJCX0KKwkJfQorCQkv LyBPciBqdXN0IHVzZSBmaXJzdCBvbmUKKwkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUg fHwgZmlyc3REYXRhVHlwZTsKKwl9CisKKwkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCisJLy8g V2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKKwkvLyBhbmQgcmV0dXJu IHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisJaWYgKCBmaW5hbERhdGFUeXBlICkgeworCQlp ZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgeworCQkJZGF0YVR5cGVzLnVu c2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERh dGFUeXBlIF07CisJfQorfQorCisvLyBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVz dCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlCitmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVz cG9uc2UgKSB7CisJdmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsCisJCWNvbnZlcnRlcnMg PSB7fSwKKwkJaSA9IDAsCisJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNh c2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KKwkJZGF0YVR5cGVzID0gcy5k YXRhVHlwZXMuc2xpY2UoKSwKKwkJcHJldiA9IGRhdGFUeXBlc1sgMCBdOworCisJLy8gQXBwbHkg dGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKKwlpZiAoIHMuZGF0YUZpbHRlciApIHsKKwkJcmVz cG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7CisJfQorCisJLy8g Q3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzCisJaWYgKCBkYXRhVHlw ZXNbIDEgXSApIHsKKwkJZm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CisJCQljb252ZXJ0 ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdOworCQl9CisJ fQorCisJLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUsIHRvbGVyYXRpbmcg bGlzdCBtb2RpZmljYXRpb24KKwlmb3IgKCA7IChjdXJyZW50ID0gZGF0YVR5cGVzWysraV0pOyAp IHsKKworCQkvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlz IG5vbi1hdXRvCisJCWlmICggY3VycmVudCAhPT0gIioiICkgeworCisJCQkvLyBDb252ZXJ0IHJl c3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJy ZW50CisJCQlpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkgeworCisJCQkJ Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKKwkJCQljb252ID0gY29udmVydGVyc1sgcHJldiAr ICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3VycmVudCBdOworCisJCQkJ Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKKwkJCQlpZiAoICFjb252ICkgeworCQkJCQlm b3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkgeworCisJCQkJCQkvLyBJZiBjb252MiBvdXRwdXRz IGN1cnJlbnQKKwkJCQkJCXRtcCA9IGNvbnYyLnNwbGl0KCIgIik7CisJCQkJCQlpZiAoIHRtcFsg MSBdID09PSBjdXJyZW50ICkgeworCisJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVk IHRvIGFjY2VwdGVkIGlucHV0CisJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyAiICIg KyB0bXBbIDAgXSBdIHx8CisJCQkJCQkJCWNvbnZlcnRlcnNbICIqICIgKyB0bXBbIDAgXSBdOwor CQkJCQkJCWlmICggY29udiApIHsKKwkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29u dmVydGVycworCQkJCQkJCQlpZiAoIGNvbnYgPT09IHRydWUgKSB7CisJCQkJCQkJCQljb252ID0g Y29udmVydGVyc1sgY29udjIgXTsKKworCQkJCQkJCQkvLyBPdGhlcndpc2UsIGluc2VydCB0aGUg aW50ZXJtZWRpYXRlIGRhdGFUeXBlCisJCQkJCQkJCX0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNv bnYyIF0gIT09IHRydWUgKSB7CisJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CisJCQkJCQkJ CQlkYXRhVHlwZXMuc3BsaWNlKCBpLS0sIDAsIGN1cnJlbnQgKTsKKwkJCQkJCQkJfQorCisJCQkJ CQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIEFw cGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKQorCQkJCWlmICggY29udiAhPT0g dHJ1ZSApIHsKKworCQkJCQkvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwg Y2F0Y2ggYW5kIHJldHVybiB0aGVtCisJCQkJCWlmICggY29udiAmJiBzWyJ0aHJvd3MiXSApIHsK KwkJCQkJCXJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJ CXRyeSB7CisJCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOworCQkJCQkJfSBjYXRj aCAoIGUgKSB7CisJCQkJCQkJcmV0dXJuIHsgc3RhdGU6ICJwYXJzZXJlcnJvciIsIGVycm9yOiBj b252ID8gZSA6ICJObyBjb252ZXJzaW9uIGZyb20gIiArIHByZXYgKyAiIHRvICIgKyBjdXJyZW50 IH07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFVwZGF0ZSBwcmV2IGZv ciBuZXh0IGl0ZXJhdGlvbgorCQkJcHJldiA9IGN1cnJlbnQ7CisJCX0KKwl9CisKKwlyZXR1cm4g eyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9OworfQorLy8gSW5zdGFsbCBzY3Jp cHQgZGF0YVR5cGUKK2pRdWVyeS5hamF4U2V0dXAoeworCWFjY2VwdHM6IHsKKwkJc2NyaXB0OiAi dGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21h c2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCisJfSwKKwljb250ZW50czogeworCQlz Y3JpcHQ6IC8oPzpqYXZhfGVjbWEpc2NyaXB0LworCX0sCisJY29udmVydGVyczogeworCQkidGV4 dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKKwkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0 ICk7CisJCQlyZXR1cm4gdGV4dDsKKwkJfQorCX0KK30pOworCisvLyBIYW5kbGUgY2FjaGUncyBz cGVjaWFsIGNhc2UgYW5kIGdsb2JhbAoralF1ZXJ5LmFqYXhQcmVmaWx0ZXIoICJzY3JpcHQiLCBm dW5jdGlvbiggcyApIHsKKwlpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKKwkJcy5jYWNo ZSA9IGZhbHNlOworCX0KKwlpZiAoIHMuY3Jvc3NEb21haW4gKSB7CisJCXMudHlwZSA9ICJHRVQi OworCQlzLmdsb2JhbCA9IGZhbHNlOworCX0KK30pOworCisvLyBCaW5kIHNjcmlwdCB0YWcgaGFj ayB0cmFuc3BvcnQKK2pRdWVyeS5hamF4VHJhbnNwb3J0KCAic2NyaXB0IiwgZnVuY3Rpb24ocykg eworCisJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1 ZXN0cworCWlmICggcy5jcm9zc0RvbWFpbiApIHsKKworCQl2YXIgc2NyaXB0LAorCQkJaGVhZCA9 IGRvY3VtZW50LmhlYWQgfHwgalF1ZXJ5KCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRF bGVtZW50OworCisJCXJldHVybiB7CisKKwkJCXNlbmQ6IGZ1bmN0aW9uKCBfLCBjYWxsYmFjayAp IHsKKworCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCisJ CQkJc2NyaXB0LmFzeW5jID0gdHJ1ZTsKKworCQkJCWlmICggcy5zY3JpcHRDaGFyc2V0ICkgewor CQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKwkJCQl9CisKKwkJCQlzY3Jp cHQuc3JjID0gcy51cmw7CisKKwkJCQkvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2Vy cworCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rp b24oIF8sIGlzQWJvcnQgKSB7CisKKwkJCQkJaWYgKCBpc0Fib3J0IHx8ICFzY3JpcHQucmVhZHlT dGF0ZSB8fCAvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KCBzY3JpcHQucmVhZHlTdGF0ZSApICkgewor CisJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKKwkJCQkJCXNjcmlwdC5vbmxvYWQg PSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsKKworCQkJCQkJLy8gUmVtb3ZlIHRo ZSBzY3JpcHQKKwkJCQkJCWlmICggc2NyaXB0LnBhcmVudE5vZGUgKSB7CisJCQkJCQkJc2NyaXB0 LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCQkJfQorCisJCQkJCQkvLyBE ZXJlZmVyZW5jZSB0aGUgc2NyaXB0CisJCQkJCQlzY3JpcHQgPSBudWxsOworCisJCQkJCQkvLyBD YWxsYmFjayBpZiBub3QgYWJvcnQKKwkJCQkJCWlmICggIWlzQWJvcnQgKSB7CisJCQkJCQkJY2Fs bGJhY2soIDIwMCwgInN1Y2Nlc3MiICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCisJCQkJ Ly8gQ2lyY3VtdmVudCBJRTYgYnVncyB3aXRoIGJhc2UgZWxlbWVudHMgKCMyNzA5IGFuZCAjNDM3 OCkgYnkgcHJlcGVuZGluZworCQkJCS8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBh dm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeQorCQkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBz Y3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOworCQkJfSwKKworCQkJYWJvcnQ6IGZ1bmN0aW9uKCkg eworCQkJCWlmICggc2NyaXB0ICkgeworCQkJCQlzY3JpcHQub25sb2FkKCB1bmRlZmluZWQsIHRy dWUgKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorfSk7Cit2YXIgb2xkQ2FsbGJhY2tzID0gW10s CisJcmpzb25wID0gLyg9KVw/KD89JnwkKXxcP1w/LzsKKworLy8gRGVmYXVsdCBqc29ucCBzZXR0 aW5ncworalF1ZXJ5LmFqYXhTZXR1cCh7CisJanNvbnA6ICJjYWxsYmFjayIsCisJanNvbnBDYWxs YmFjazogZnVuY3Rpb24oKSB7CisJCXZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8 fCAoIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBhamF4X25vbmNlKysgKSApOworCQl0aGlzWyBj YWxsYmFjayBdID0gdHJ1ZTsKKwkJcmV0dXJuIGNhbGxiYWNrOworCX0KK30pOworCisvLyBEZXRl Y3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVx dWVzdHMKK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBv cmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKKworCXZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0 dGVuLCByZXNwb25zZUNvbnRhaW5lciwKKwkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAm JiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KKwkJCSJ1cmwiIDoKKwkJCXR5cGVvZiBzLmRhdGEg PT09ICJzdHJpbmciICYmICEoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNh dGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSAmJiByanNvbnAudGVzdCggcy5kYXRhICkgJiYg ImRhdGEiCisJCSk7CisKKwkvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMg Impzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldAorCWlmICgganNvblByb3AgfHwg cy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKKworCQkvLyBHZXQgY2FsbGJhY2sgbmFt ZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0CisJCWNh bGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25w Q2FsbGJhY2sgKSA/CisJCQlzLmpzb25wQ2FsbGJhY2soKSA6CisJCQlzLmpzb25wQ2FsbGJhY2s7 CisKKwkJLy8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YQorCQlpZiAoIGpz b25Qcm9wICkgeworCQkJc1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpz b25wLCAiJDEiICsgY2FsbGJhY2tOYW1lICk7CisJCX0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZh bHNlICkgeworCQkJcy51cmwgKz0gKCBhamF4X3JxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDog Ij8iICkgKyBzLmpzb25wICsgIj0iICsgY2FsbGJhY2tOYW1lOworCQl9CisKKwkJLy8gVXNlIGRh dGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgorCQlz LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl0gPSBmdW5jdGlvbigpIHsKKwkJCWlmICggIXJlc3Bv bnNlQ29udGFpbmVyICkgeworCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMg bm90IGNhbGxlZCIgKTsKKwkJCX0KKwkJCXJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdOwor CQl9OworCisJCS8vIGZvcmNlIGpzb24gZGF0YVR5cGUKKwkJcy5kYXRhVHlwZXNbIDAgXSA9ICJq c29uIjsKKworCQkvLyBJbnN0YWxsIGNhbGxiYWNrCisJCW92ZXJ3cml0dGVuID0gd2luZG93WyBj YWxsYmFja05hbWUgXTsKKwkJd2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkgewor CQkJcmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7CisJCX07CisKKwkJLy8gQ2xlYW4tdXAg ZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpCisJCWpxWEhSLmFsd2F5cyhmdW5jdGlv bigpIHsKKwkJCS8vIFJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWUKKwkJCXdpbmRvd1sgY2FsbGJh Y2tOYW1lIF0gPSBvdmVyd3JpdHRlbjsKKworCQkJLy8gU2F2ZSBiYWNrIGFzIGZyZWUKKwkJCWlm ICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CisJCQkJLy8gbWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcg dGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCisJCQkJcy5qc29ucENhbGxi YWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrOworCisJCQkJLy8gc2F2ZSB0aGUg Y2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQorCQkJCW9sZENhbGxiYWNrcy5wdXNoKCBjYWxs YmFja05hbWUgKTsKKwkJCX0KKworCQkJLy8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQg d2UgaGF2ZSBhIHJlc3BvbnNlCisJCQlpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5p c0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgeworCQkJCW92ZXJ3cml0dGVuKCByZXNwb25zZUNv bnRhaW5lclsgMCBdICk7CisJCQl9CisKKwkJCXJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0 ZW4gPSB1bmRlZmluZWQ7CisJCX0pOworCisJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAorCQlyZXR1 cm4gInNjcmlwdCI7CisJfQorfSk7Cit2YXIgeGhyQ2FsbGJhY2tzLCB4aHJTdXBwb3J0ZWQsCisJ eGhySWQgPSAwLAorCS8vICM1MjgwOiBJbnRlcm5ldCBFeHBsb3JlciB3aWxsIGtlZXAgY29ubmVj dGlvbnMgYWxpdmUgaWYgd2UgZG9uJ3QgYWJvcnQgb24gdW5sb2FkCisJeGhyT25VbmxvYWRBYm9y dCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ICYmIGZ1bmN0aW9uKCkgeworCQkvLyBBYm9ydCBhbGwg cGVuZGluZyByZXF1ZXN0cworCQl2YXIga2V5OworCQlmb3IgKCBrZXkgaW4geGhyQ2FsbGJhY2tz ICkgeworCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggdW5kZWZpbmVkLCB0cnVlICk7CisJCX0KKwl9 OworCisvLyBGdW5jdGlvbnMgdG8gY3JlYXRlIHhocnMKK2Z1bmN0aW9uIGNyZWF0ZVN0YW5kYXJk WEhSKCkgeworCXRyeSB7CisJCXJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7CisJ fSBjYXRjaCggZSApIHt9Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUFjdGl2ZVhIUigpIHsKKwl0cnkg eworCQlyZXR1cm4gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIp OworCX0gY2F0Y2goIGUgKSB7fQorfQorCisvLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Cisv LyAoVGhpcyBpcyBzdGlsbCBhdHRhY2hlZCB0byBhamF4U2V0dGluZ3MgZm9yIGJhY2t3YXJkIGNv bXBhdGliaWxpdHkpCitqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVYT2Jq ZWN0ID8KKwkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CisJICogaW1wbGVtZW50IHRo ZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcgKGNhbid0IHJlcXVlc3QgbG9jYWwgZmlsZXMpLAorCSAq IHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQorCSAqIEFk ZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwor CSAqIHdlIG5lZWQgYSBmYWxsYmFjay4KKwkgKi8KKwlmdW5jdGlvbigpIHsKKwkJcmV0dXJuICF0 aGlzLmlzTG9jYWwgJiYgY3JlYXRlU3RhbmRhcmRYSFIoKSB8fCBjcmVhdGVBY3RpdmVYSFIoKTsK Kwl9IDoKKwkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0 dHBSZXF1ZXN0IG9iamVjdAorCWNyZWF0ZVN0YW5kYXJkWEhSOworCisvLyBEZXRlcm1pbmUgc3Vw cG9ydCBwcm9wZXJ0aWVzCit4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigp OworalF1ZXJ5LnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggIndpdGhDcmVkZW50 aWFscyIgaW4geGhyU3VwcG9ydGVkICk7Cit4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuc3VwcG9ydC5h amF4ID0gISF4aHJTdXBwb3J0ZWQ7CisKKy8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dz ZXIgY2FuIHByb3ZpZGUgYW4geGhyCitpZiAoIHhoclN1cHBvcnRlZCApIHsKKworCWpRdWVyeS5h amF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkgeworCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxv d2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CisJCWlmICggIXMuY3Jvc3NE b21haW4gfHwgalF1ZXJ5LnN1cHBvcnQuY29ycyApIHsKKworCQkJdmFyIGNhbGxiYWNrOworCisJ CQlyZXR1cm4geworCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKKwor CQkJCQkvLyBHZXQgYSBuZXcgeGhyCisJCQkJCXZhciBoYW5kbGUsIGksCisJCQkJCQl4aHIgPSBz LnhocigpOworCisJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAorCQkJCQkvLyBQYXNzaW5nIG51bGwg dXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKKwkJCQkJ aWYgKCBzLnVzZXJuYW1lICkgeworCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5 bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXhoci5v cGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5jICk7CisJCQkJCX0KKworCQkJCQkvLyBBcHBseSBj dXN0b20gZmllbGRzIGlmIHByb3ZpZGVkCisJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CisJCQkJ CQlmb3IgKCBpIGluIHMueGhyRmllbGRzICkgeworCQkJCQkJCXhoclsgaSBdID0gcy54aHJGaWVs ZHNbIGkgXTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBp ZiBuZWVkZWQKKwkJCQkJaWYgKCBzLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkg eworCQkJCQkJeGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUgKTsKKwkJCQkJfQorCisJ CQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCisJCQkJCS8vIEZvciBjcm9zcy1kb21haW4g cmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKKwkJCQkJ Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUg c3VyZS4KKwkJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFz aXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCisJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1 ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgorCQkJCQlpZiAo ICFzLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gKSB7CisJCQkJ CQloZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gPSAiWE1MSHR0cFJlcXVlc3QiOworCQkJCQl9 CisKKwkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1 ZXN0cyBpbiBGaXJlZm94IDMKKwkJCQkJdHJ5IHsKKwkJCQkJCWZvciAoIGkgaW4gaGVhZGVycyAp IHsKKwkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CisJCQkJ CQl9CisJCQkJCX0gY2F0Y2goIGVyciApIHt9CisKKwkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVz dAorCQkJCQkvLyBUaGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24gd2hpY2ggaXMgYWN0dWFsbHkK KwkJCQkJLy8gaGFuZGxlZCBpbiBqUXVlcnkuYWpheCAoc28gbm8gdHJ5L2NhdGNoIGhlcmUpCisJ CQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CisKKwkJ CQkJLy8gTGlzdGVuZXIKKwkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsK KwkJCQkJCXZhciBzdGF0dXMsIHJlc3BvbnNlSGVhZGVycywgc3RhdHVzVGV4dCwgcmVzcG9uc2Vz OworCisJCQkJCQkvLyBGaXJlZm94IHRocm93cyBleGNlcHRpb25zIHdoZW4gYWNjZXNzaW5nIHBy b3BlcnRpZXMKKwkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cnJl ZAorCQkJCQkJLy8gaHR0cDovL2hlbHBmdWwua25vYnMtZGlhbHMuY29tL2luZGV4LnBocC9Db21w b25lbnRfcmV0dXJuZWRfZmFpbHVyZV9jb2RlOl8weDgwMDQwMTExXyhOU19FUlJPUl9OT1RfQVZB SUxBQkxFKQorCQkJCQkJdHJ5IHsKKworCQkJCQkJCS8vIFdhcyBuZXZlciBjYWxsZWQgYW5kIGlz IGFib3J0ZWQgb3IgY29tcGxldGUKKwkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8 fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgeworCisJCQkJCQkJCS8vIE9ubHkgY2FsbGVkIG9u Y2UKKwkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CisKKwkJCQkJCQkJLy8gRG8gbm90IGtl ZXAgYXMgYWN0aXZlIGFueW1vcmUKKwkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CisJCQkJCQkJCQl4 aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisJCQkJCQkJCQlpZiAoIHhock9u VW5sb2FkQWJvcnQgKSB7CisJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07 CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyBJZiBpdCdzIGFuIGFib3J0CisJ CQkJCQkJCWlmICggaXNBYm9ydCApIHsKKwkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlm IG5lZWRlZAorCQkJCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSAhPT0gNCApIHsKKwkJCQkJCQkJ CQl4aHIuYWJvcnQoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJl c3BvbnNlcyA9IHt9OworCQkJCQkJCQkJc3RhdHVzID0geGhyLnN0YXR1czsKKwkJCQkJCQkJCXJl c3BvbnNlSGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKKworCQkJCQkJCQkJ Ly8gV2hlbiByZXF1ZXN0aW5nIGJpbmFyeSBkYXRhLCBJRTYtOSB3aWxsIHRocm93IGFuIGV4Y2Vw dGlvbgorCQkJCQkJCQkJLy8gb24gYW55IGF0dGVtcHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAo IzExNDI2KQorCQkJCQkJCQkJaWYgKCB0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCA9PT0gInN0cmlu ZyIgKSB7CisJCQkJCQkJCQkJcmVzcG9uc2VzLnRleHQgPSB4aHIucmVzcG9uc2VUZXh0OworCQkJ CQkJCQkJfQorCisJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBh Y2Nlc3NpbmcKKwkJCQkJCQkJCS8vIHN0YXR1c1RleHQgZm9yIGZhdWx0eSBjcm9zcy1kb21haW4g cmVxdWVzdHMKKwkJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0 dXNUZXh0OworCQkJCQkJCQkJfSBjYXRjaCggZSApIHsKKwkJCQkJCQkJCQkvLyBXZSBub3JtYWxp emUgd2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHQKKwkJCQkJCQkJCQlzdGF0 dXNUZXh0ID0gIiI7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9y IG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKKworCQkJCQkJCQkJLy8gSWYgdGhlIHJlcXVlc3QgaXMg bG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2VzcworCQkJCQkJCQkJLy8gKHN1 Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdl CisJCQkJCQkJCQkvLyBjYW4gZG8gZ2l2ZW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbnMpCisJCQkJ CQkJCQlpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNyb3NzRG9tYWluICkgeworCQkJ CQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OworCQkJCQkJCQkJLy8g SUUgLSAjMTQ1MDogc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQK KwkJCQkJCQkJCX0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMTIyMyApIHsKKwkJCQkJCQkJCQlzdGF0 dXMgPSAyMDQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGNhdGNo KCBmaXJlZm94QWNjZXNzRXhjZXB0aW9uICkgeworCQkJCQkJCWlmICggIWlzQWJvcnQgKSB7CisJ CQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOworCQkJCQkJCX0K KwkJCQkJCX0KKworCQkJCQkJLy8gQ2FsbCBjb21wbGV0ZSBpZiBuZWVkZWQKKwkJCQkJCWlmICgg cmVzcG9uc2VzICkgeworCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3Bv bnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CisJCQkJCQl9CisJCQkJCX07CisKKwkJCQkJaWYgKCAh cy5hc3luYyApIHsKKwkJCQkJCS8vIGlmIHdlJ3JlIGluIHN5bmMgbW9kZSB3ZSBmaXJlIHRoZSBj YWxsYmFjaworCQkJCQkJY2FsbGJhY2soKTsKKwkJCQkJfSBlbHNlIGlmICggeGhyLnJlYWR5U3Rh dGUgPT09IDQgKSB7CisJCQkJCQkvLyAoSUU2ICYgSUU3KSBpZiBpdCdzIGluIGNhY2hlIGFuZCBo YXMgYmVlbgorCQkJCQkJLy8gcmV0cmlldmVkIGRpcmVjdGx5IHdlIG5lZWQgdG8gZmlyZSB0aGUg Y2FsbGJhY2sKKwkJCQkJCXNldFRpbWVvdXQoIGNhbGxiYWNrICk7CisJCQkJCX0gZWxzZSB7CisJ CQkJCQloYW5kbGUgPSArK3hocklkOworCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewor CQkJCQkJCS8vIENyZWF0ZSB0aGUgYWN0aXZlIHhocnMgY2FsbGJhY2tzIGxpc3QgaWYgbmVlZGVk CisJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKKwkJCQkJCQlpZiAoICF4 aHJDYWxsYmFja3MgKSB7CisJCQkJCQkJCXhockNhbGxiYWNrcyA9IHt9OworCQkJCQkJCQlqUXVl cnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOworCQkJCQkJCX0KKwkJCQkJ CQkvLyBBZGQgdG8gbGlzdCBvZiBhY3RpdmUgeGhycyBjYWxsYmFja3MKKwkJCQkJCQl4aHJDYWxs YmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CisJCQkJCQl9CisJCQkJCQl4aHIub25yZWFkeXN0 YXRlY2hhbmdlID0gY2FsbGJhY2s7CisJCQkJCX0KKwkJCQl9LAorCisJCQkJYWJvcnQ6IGZ1bmN0 aW9uKCkgeworCQkJCQlpZiAoIGNhbGxiYWNrICkgeworCQkJCQkJY2FsbGJhY2soIHVuZGVmaW5l ZCwgdHJ1ZSApOworCQkJCQl9CisJCQkJfQorCQkJfTsKKwkJfQorCX0pOworfQordmFyIGZ4Tm93 LCB0aW1lcklkLAorCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAorCXJmeG51 bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBjb3JlX3BudW0gKyAiKShbYS16JV0q KSQiLCAiaSIgKSwKKwlycnVuID0gL3F1ZXVlSG9va3MkLywKKwlhbmltYXRpb25QcmVmaWx0ZXJz ID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0sCisJdHdlZW5lcnMgPSB7CisJCSIqIjogW2Z1bmN0aW9u KCBwcm9wLCB2YWx1ZSApIHsKKwkJCXZhciBlbmQsIHVuaXQsCisJCQkJdHdlZW4gPSB0aGlzLmNy ZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApLAorCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbHVl ICksCisJCQkJdGFyZ2V0ID0gdHdlZW4uY3VyKCksCisJCQkJc3RhcnQgPSArdGFyZ2V0IHx8IDAs CisJCQkJc2NhbGUgPSAxLAorCQkJCW1heEl0ZXJhdGlvbnMgPSAyMDsKKworCQkJaWYgKCBwYXJ0 cyApIHsKKwkJCQllbmQgPSArcGFydHNbMl07CisJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICggalF1 ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7CisKKwkJCQkvLyBXZSBuZWVkIHRv IGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKKwkJCQlpZiAoIHVuaXQgIT09ICJweCIgJiYgc3RhcnQg KSB7CisJCQkJCS8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0 aW5nIHBvaW50CisJCQkJCS8vIFByZWZlciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0 aGlzIHByb2Nlc3Mgd2lsbCBiZSB0cml2aWFsIGlmIGl0IHVzZXMgdGhlIHNhbWUgdW5pdHMKKwkJ CQkJLy8gRmFsbGJhY2sgdG8gZW5kIG9yIGEgc2ltcGxlIGNvbnN0YW50CisJCQkJCXN0YXJ0ID0g alF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCwgdHJ1ZSApIHx8IGVuZCB8fCAxOworCisJCQkJ CWRvIHsKKwkJCQkJCS8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUg dW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqCisJCQkJCQkvLyBVc2UgYSBzdHJpbmcgZm9yIGRvdWJs aW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdl ZCBiZWxvdworCQkJCQkJc2NhbGUgPSBzY2FsZSB8fCAiLjUiOworCisJCQkJCQkvLyBBZGp1c3Qg YW5kIGFwcGx5CisJCQkJCQlzdGFydCA9IHN0YXJ0IC8gc2NhbGU7CisJCQkJCQlqUXVlcnkuc3R5 bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApOworCisJCQkJCS8vIFVwZGF0ZSBz Y2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpCisJCQkJCS8vIEFu ZCBicmVha2luZyB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3Ig aWYgd2UndmUganVzdCBoYWQgZW5vdWdoCisJCQkJCX0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxl ID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9u cyApOworCQkJCX0KKworCQkJCXR3ZWVuLnVuaXQgPSB1bml0OworCQkJCXR3ZWVuLnN0YXJ0ID0g c3RhcnQ7CisJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5n IGEgcmVsYXRpdmUgYW5pbWF0aW9uCisJCQkJdHdlZW4uZW5kID0gcGFydHNbMV0gPyBzdGFydCAr ICggcGFydHNbMV0gKyAxICkgKiBlbmQgOiBlbmQ7CisJCQl9CisJCQlyZXR1cm4gdHdlZW47CisJ CX1dCisJfTsKKworLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4g c3luY2hyb25vdXNseQorZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CisJc2V0VGltZW91dChmdW5j dGlvbigpIHsKKwkJZnhOb3cgPSB1bmRlZmluZWQ7CisJfSk7CisJcmV0dXJuICggZnhOb3cgPSBq UXVlcnkubm93KCkgKTsKK30KKworZnVuY3Rpb24gY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHBy b3BzICkgeworCWpRdWVyeS5lYWNoKCBwcm9wcywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewor CQl2YXIgY29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdl ZW5lcnNbICIqIiBdICksCisJCQlpbmRleCA9IDAsCisJCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxl bmd0aDsKKwkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKwkJCWlmICggY29s bGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSB7CisKKwkJ CQkvLyB3ZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eQorCQkJCXJldHVybjsKKwkJCX0KKwkJ fQorCX0pOworfQorCitmdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlv bnMgKSB7CisJdmFyIHJlc3VsdCwKKwkJc3RvcHBlZCwKKwkJaW5kZXggPSAwLAorCQlsZW5ndGgg PSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCwKKwkJZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJy ZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgeworCQkJLy8gZG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUg OmFuaW1hdGVkIHNlbGVjdG9yCisJCQlkZWxldGUgdGljay5lbGVtOworCQl9KSwKKwkJdGljayA9 IGZ1bmN0aW9uKCkgeworCQkJaWYgKCBzdG9wcGVkICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJ CX0KKwkJCXZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisJCQkJcmVt YWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVy YXRpb24gLSBjdXJyZW50VGltZSApLAorCQkJCS8vIGFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFs bG93IHVzIHRvIHVzZSAxIC0gKCAwLjUgfHwgMCApICgjMTI0OTcpCisJCQkJdGVtcCA9IHJlbWFp bmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLAorCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwK KwkJCQlpbmRleCA9IDAsCisJCQkJbGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7CisK KwkJCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworCQkJCWFuaW1hdGlvbi50 d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CisJCQl9CisKKwkJCWRlZmVycmVkLm5vdGlm eVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7CisKKwkJCWlm ICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkgeworCQkJCXJldHVybiByZW1haW5pbmc7CisJCQl9 IGVsc2UgeworCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7 CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9LAorCQlhbmltYXRpb24gPSBkZWZlcnJlZC5w cm9taXNlKHsKKwkJCWVsZW06IGVsZW0sCisJCQlwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHBy b3BlcnRpZXMgKSwKKwkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsgc3BlY2lhbEVhc2lu Zzoge30gfSwgb3B0aW9ucyApLAorCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAor CQkJb3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLAorCQkJc3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVh dGVGeE5vdygpLAorCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCisJCQl0d2VlbnM6IFtd LAorCQkJY3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7CisJCQkJdmFyIHR3ZWVu ID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAorCQkJCQkJ YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVh c2luZyApOworCQkJCWFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTsKKwkJCQlyZXR1cm4g dHdlZW47CisJCQl9LAorCQkJc3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7CisJCQkJdmFyIGlu ZGV4ID0gMCwKKwkJCQkJLy8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8g cnVuIGFsbCB0aGUgdHdlZW5zCisJCQkJCS8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydAor CQkJCQlsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwOworCQkJ CWlmICggc3RvcHBlZCApIHsKKwkJCQkJcmV0dXJuIHRoaXM7CisJCQkJfQorCQkJCXN0b3BwZWQg PSB0cnVlOworCQkJCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworCQkJCQlh bmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOworCQkJCX0KKworCQkJCS8vIHJlc29s dmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKKwkJCQkvLyBvdGhlcndpc2UsIHJlamVj dAorCQkJCWlmICggZ290b0VuZCApIHsKKwkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0s IFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWZlcnJlZC5y ZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CisJCQkJfQorCQkJCXJl dHVybiB0aGlzOworCQkJfQorCQl9KSwKKwkJcHJvcHMgPSBhbmltYXRpb24ucHJvcHM7CisKKwlw cm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOworCisJZm9y ICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisJCXJlc3VsdCA9IGFuaW1hdGlvblBy ZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9u Lm9wdHMgKTsKKwkJaWYgKCByZXN1bHQgKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQor CisJY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICk7CisKKwlpZiAoIGpRdWVyeS5pc0Z1 bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgeworCQlhbmltYXRpb24ub3B0cy5zdGFy dC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKKwl9CisKKwlqUXVlcnkuZngudGltZXIoCisJCWpR dWVyeS5leHRlbmQoIHRpY2ssIHsKKwkJCWVsZW06IGVsZW0sCisJCQlhbmltOiBhbmltYXRpb24s CisJCQlxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWUKKwkJfSkKKwkpOworCisJLy8gYXR0YWNo IGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKKwlyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmlt YXRpb24ub3B0cy5wcm9ncmVzcyApCisJCS5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmlt YXRpb24ub3B0cy5jb21wbGV0ZSApCisJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKKwkJ LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Cit9CisKK2Z1bmN0aW9uIHByb3BGaWx0 ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgeworCXZhciB2YWx1ZSwgbmFtZSwgaW5kZXgsIGVh c2luZywgaG9va3M7CisKKwkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBj c3NIb29rIHBhc3MKKwlmb3IgKCBpbmRleCBpbiBwcm9wcyApIHsKKwkJbmFtZSA9IGpRdWVyeS5j YW1lbENhc2UoIGluZGV4ICk7CisJCWVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTsKKwkJ dmFsdWUgPSBwcm9wc1sgaW5kZXggXTsKKwkJaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSAp IHsKKwkJCWVhc2luZyA9IHZhbHVlWyAxIF07CisJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0g dmFsdWVbIDAgXTsKKwkJfQorCisJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CisJCQlwcm9wc1sg bmFtZSBdID0gdmFsdWU7CisJCQlkZWxldGUgcHJvcHNbIGluZGV4IF07CisJCX0KKworCQlob29r cyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdOworCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGlu IGhvb2tzICkgeworCQkJdmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7CisJCQlkZWxldGUg cHJvcHNbIG5hbWUgXTsKKworCQkJLy8gbm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbnQgb3Zl cndyaXRlIGtleXMgYWxyZWFkeSBwcmVzZW50LgorCQkJLy8gYWxzbyAtIHJldXNpbmcgJ2luZGV4 JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCAibmFtZSIKKwkJCWZvciAo IGluZGV4IGluIHZhbHVlICkgeworCQkJCWlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHsKKwkJ CQkJcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTsKKwkJCQkJc3BlY2lhbEVhc2luZ1sg aW5kZXggXSA9IGVhc2luZzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlzcGVjaWFsRWFz aW5nWyBuYW1lIF0gPSBlYXNpbmc7CisJCX0KKwl9Cit9CisKK2pRdWVyeS5BbmltYXRpb24gPSBq UXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHsKKworCXR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywg Y2FsbGJhY2sgKSB7CisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7CisJCQlj YWxsYmFjayA9IHByb3BzOworCQkJcHJvcHMgPSBbICIqIiBdOworCQl9IGVsc2UgeworCQkJcHJv cHMgPSBwcm9wcy5zcGxpdCgiICIpOworCQl9CisKKwkJdmFyIHByb3AsCisJCQlpbmRleCA9IDAs CisJCQlsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisKKwkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7 IGluZGV4KysgKSB7CisJCQlwcm9wID0gcHJvcHNbIGluZGV4IF07CisJCQl0d2VlbmVyc1sgcHJv cCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKKwkJCXR3ZWVuZXJzWyBwcm9wIF0udW5zaGlm dCggY2FsbGJhY2sgKTsKKwkJfQorCX0sCisKKwlwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFj aywgcHJlcGVuZCApIHsKKwkJaWYgKCBwcmVwZW5kICkgeworCQkJYW5pbWF0aW9uUHJlZmlsdGVy cy51bnNoaWZ0KCBjYWxsYmFjayApOworCQl9IGVsc2UgeworCQkJYW5pbWF0aW9uUHJlZmlsdGVy cy5wdXNoKCBjYWxsYmFjayApOworCQl9CisJfQorfSk7CisKK2Z1bmN0aW9uIGRlZmF1bHRQcmVm aWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgeworCS8qanNoaW50IHZhbGlkdGhpczp0cnVlICov CisJdmFyIHByb3AsIGluZGV4LCBsZW5ndGgsCisJCXZhbHVlLCBkYXRhU2hvdywgdG9nZ2xlLAor CQl0d2VlbiwgaG9va3MsIG9sZGZpcmUsCisJCWFuaW0gPSB0aGlzLAorCQlzdHlsZSA9IGVsZW0u c3R5bGUsCisJCW9yaWcgPSB7fSwKKwkJaGFuZGxlZCA9IFtdLAorCQloaWRkZW4gPSBlbGVtLm5v ZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICk7CisKKwkvLyBoYW5kbGUgcXVldWU6IGZhbHNlIHBy b21pc2VzCisJaWYgKCAhb3B0cy5xdWV1ZSApIHsKKwkJaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9v a3MoIGVsZW0sICJmeCIgKTsKKwkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgeworCQkJ aG9va3MudW5xdWV1ZWQgPSAwOworCQkJb2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7CisJCQlo b29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CisJCQkJaWYgKCAhaG9va3MudW5xdWV1ZWQg KSB7CisJCQkJCW9sZGZpcmUoKTsKKwkJCQl9CisJCQl9OworCQl9CisJCWhvb2tzLnVucXVldWVk Kys7CisKKwkJYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7CisJCQkvLyBkb2luZyB0aGlzIG1ha2Vz IHN1cmUgdGhhdCB0aGUgY29tcGxldGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorCQkJLy8gYmVm b3JlIHRoaXMgY29tcGxldGVzCisJCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKKwkJCQlob29r cy51bnF1ZXVlZC0tOworCQkJCWlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgImZ4IiApLmxlbmd0 aCApIHsKKwkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOworCQkJCX0KKwkJCX0pOworCQl9KTsKKwl9 CisKKwkvLyBoZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzcworCWlmICggZWxlbS5ub2RlVHlwZSA9 PT0gMSAmJiAoICJoZWlnaHQiIGluIHByb3BzIHx8ICJ3aWR0aCIgaW4gcHJvcHMgKSApIHsKKwkJ Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisJCS8vIFJlY29yZCBhbGwgMyBv dmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKKwkJLy8gY2hhbmdlIHRoZSBv dmVyZmxvdyBhdHRyaWJ1dGUgd2hlbiBvdmVyZmxvd1ggYW5kCisJCS8vIG92ZXJmbG93WSBhcmUg c2V0IHRvIHRoZSBzYW1lIHZhbHVlCisJCW9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93 LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdOworCisJCS8vIFNldCBkaXNwbGF5 IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCisJCS8vIGFuaW1hdGlv bnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5pbWF0 ZWQKKwkJaWYgKCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYK KwkJCQlqUXVlcnkuY3NzKCBlbGVtLCAiZmxvYXQiICkgPT09ICJub25lIiApIHsKKworCQkJLy8g aW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CisJCQkvLyBibG9jay1s ZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAorCQkJaWYgKCAhalF1 ZXJ5LnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCB8fCBjc3NfZGVmYXVsdERpc3BsYXko IGVsZW0ubm9kZU5hbWUgKSA9PT0gImlubGluZSIgKSB7CisJCQkJc3R5bGUuZGlzcGxheSA9ICJp bmxpbmUtYmxvY2siOworCisJCQl9IGVsc2UgeworCQkJCXN0eWxlLnpvb20gPSAxOworCQkJfQor CQl9CisJfQorCisJaWYgKCBvcHRzLm92ZXJmbG93ICkgeworCQlzdHlsZS5vdmVyZmxvdyA9ICJo aWRkZW4iOworCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgeworCQkJ YW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7CisJCQkJc3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJm bG93WyAwIF07CisJCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOworCQkJ CXN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTsKKwkJCX0pOworCQl9CisJfQor CisKKwkvLyBzaG93L2hpZGUgcGFzcworCWZvciAoIGluZGV4IGluIHByb3BzICkgeworCQl2YWx1 ZSA9IHByb3BzWyBpbmRleCBdOworCQlpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7CisJ CQlkZWxldGUgcHJvcHNbIGluZGV4IF07CisJCQl0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09 ICJ0b2dnbGUiOworCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIg KSApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWhhbmRsZWQucHVzaCggaW5kZXggKTsKKwkJ fQorCX0KKworCWxlbmd0aCA9IGhhbmRsZWQubGVuZ3RoOworCWlmICggbGVuZ3RoICkgeworCQlk YXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIgKSB8fCBqUXVlcnkuX2RhdGEo IGVsZW0sICJmeHNob3ciLCB7fSApOworCQlpZiAoICJoaWRkZW4iIGluIGRhdGFTaG93ICkgewor CQkJaGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOworCQl9CisKKwkJLy8gc3RvcmUgc3RhdGUgaWYg aXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byAicmV2ZXJzZSIKKwkJaWYg KCB0b2dnbGUgKSB7CisJCQlkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuOworCQl9CisJCWlmICgg aGlkZGVuICkgeworCQkJalF1ZXJ5KCBlbGVtICkuc2hvdygpOworCQl9IGVsc2UgeworCQkJYW5p bS5kb25lKGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeSggZWxlbSApLmhpZGUoKTsKKwkJCX0pOwor CQl9CisJCWFuaW0uZG9uZShmdW5jdGlvbigpIHsKKwkJCXZhciBwcm9wOworCQkJalF1ZXJ5Ll9y ZW1vdmVEYXRhKCBlbGVtLCAiZnhzaG93IiApOworCQkJZm9yICggcHJvcCBpbiBvcmlnICkgewor CQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7CisJCQl9CisJCX0p OworCQlmb3IgKCBpbmRleCA9IDAgOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisJCQlw cm9wID0gaGFuZGxlZFsgaW5kZXggXTsKKwkJCXR3ZWVuID0gYW5pbS5jcmVhdGVUd2VlbiggcHJv cCwgaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAgKTsKKwkJCW9yaWdbIHByb3AgXSA9IGRh dGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CisKKwkJCWlmICgg ISggcHJvcCBpbiBkYXRhU2hvdyApICkgeworCQkJCWRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5z dGFydDsKKwkJCQlpZiAoIGhpZGRlbiApIHsKKwkJCQkJdHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7 CisJCQkJCXR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0 IiA/IDEgOiAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworZnVuY3Rpb24gVHdlZW4oIGVs ZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkgeworCXJldHVybiBuZXcgVHdlZW4ucHJv dG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7Cit9CitqUXVl cnkuVHdlZW4gPSBUd2VlbjsKKworVHdlZW4ucHJvdG90eXBlID0geworCWNvbnN0cnVjdG9yOiBU d2VlbiwKKwlpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcs IHVuaXQgKSB7CisJCXRoaXMuZWxlbSA9IGVsZW07CisJCXRoaXMucHJvcCA9IHByb3A7CisJCXRo aXMuZWFzaW5nID0gZWFzaW5nIHx8ICJzd2luZyI7CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7 CisJCXRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7CisJCXRoaXMuZW5kID0gZW5k OworCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIg OiAicHgiICk7CisJfSwKKwljdXI6IGZ1bmN0aW9uKCkgeworCQl2YXIgaG9va3MgPSBUd2Vlbi5w cm9wSG9va3NbIHRoaXMucHJvcCBdOworCisJCXJldHVybiBob29rcyAmJiBob29rcy5nZXQgPwor CQkJaG9va3MuZ2V0KCB0aGlzICkgOgorCQkJVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCgg dGhpcyApOworCX0sCisJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKKwkJdmFyIGVhc2VkLAor CQkJaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOworCisJCWlmICggdGhpcy5v cHRpb25zLmR1cmF0aW9uICkgeworCQkJdGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdb IHRoaXMuZWFzaW5nIF0oCisJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVy Y2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCisJCQkpOworCQl9IGVsc2UgeworCQkJ dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CisJCX0KKwkJdGhpcy5ub3cgPSAoIHRoaXMuZW5k IC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0OworCisJCWlmICggdGhpcy5vcHRp b25zLnN0ZXAgKSB7CisJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMu bm93LCB0aGlzICk7CisJCX0KKworCQlpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHsKKwkJCWhv b2tzLnNldCggdGhpcyApOworCQl9IGVsc2UgeworCQkJVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0 LnNldCggdGhpcyApOworCQl9CisJCXJldHVybiB0aGlzOworCX0KK307CisKK1R3ZWVuLnByb3Rv dHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTsKKworVHdlZW4ucHJvcEhvb2tz ID0geworCV9kZWZhdWx0OiB7CisJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgeworCQkJdmFyIHJl c3VsdDsKKworCQkJaWYgKCB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJgorCQkJ CSghdHdlZW4uZWxlbS5zdHlsZSB8fCB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0g bnVsbCkgKSB7CisJCQkJcmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTsKKwkJCX0KKwor CQkJLy8gcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mg d2lsbCBhdXRvbWF0aWNhbGx5CisJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJh Y2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzCisJCQkvLyBzbywgc2ltcGxlIHZhbHVl cyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgorCQkJLy8gY29tcGxleCB2YWx1 ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMuCisJCQlyZXN1bHQg PSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOworCQkJLy8gRW1wdHkg c3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgor CQkJcmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSAiYXV0byIgPyAwIDogcmVzdWx0OworCQl9 LAorCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKKwkJCS8vIHVzZSBzdGVwIGhvb2sgZm9yIGJh Y2sgY29tcGF0IC0gdXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlIC0gdXNlIC5zdHlsZSBpZiBpdHMK KwkJCS8vIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxl CisJCQlpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7CisJCQkJalF1ZXJ5LmZ4 LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKKwkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0u c3R5bGUgJiYgKCB0d2Vlbi5lbGVtLnN0eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3Ag XSBdICE9IG51bGwgfHwgalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKKwkJCQlq UXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVu aXQgKTsKKwkJCX0gZWxzZSB7CisJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4u bm93OworCQkJfQorCQl9CisJfQorfTsKKworLy8gUmVtb3ZlIGluIDIuMCAtIHRoaXMgc3VwcG9y dHMgSUU4J3MgcGFuaWMgYmFzZWQgYXBwcm9hY2gKKy8vIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRp c2Nvbm5lY3RlZCBub2RlcworCitUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJv cEhvb2tzLnNjcm9sbExlZnQgPSB7CisJc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7CisJCWlmICgg dHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CisJCQl0d2Vl bi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7CisJCX0KKwl9Cit9OworCitqUXVlcnku ZWFjaChbICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsK Kwl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1 bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHNwZWVkID09IG51 bGwgfHwgdHlwZW9mIHNwZWVkID09PSAiYm9vbGVhbiIgPworCQkJY3NzRm4uYXBwbHkoIHRoaXMs IGFyZ3VtZW50cyApIDoKKwkJCXRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3Bl ZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKKwl9OworfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoewor CWZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHsKKworCQkv LyBzaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKKwkJ cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygp CisKKwkJCS8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAorCQkJLmVuZCgpLmFuaW1h dGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOworCX0sCisJYW5p bWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQl2YXIg ZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLAorCQkJb3B0YWxsID0galF1ZXJ5 LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAorCQkJZG9BbmltYXRpb24gPSBmdW5j dGlvbigpIHsKKwkJCQkvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0 eSBlYXNpbmcgd29uJ3QgYmUgbG9zdAorCQkJCXZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBq UXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTsKKwkJCQlkb0FuaW1hdGlvbi5maW5p c2ggPSBmdW5jdGlvbigpIHsKKwkJCQkJYW5pbS5zdG9wKCB0cnVlICk7CisJCQkJfTsKKwkJCQkv LyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHkKKwkJ CQlpZiAoIGVtcHR5IHx8IGpRdWVyeS5fZGF0YSggdGhpcywgImZpbmlzaCIgKSApIHsKKwkJCQkJ YW5pbS5zdG9wKCB0cnVlICk7CisJCQkJfQorCQkJfTsKKwkJCWRvQW5pbWF0aW9uLmZpbmlzaCA9 IGRvQW5pbWF0aW9uOworCisJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNl ID8KKwkJCXRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6CisJCQl0aGlzLnF1ZXVlKCBvcHRhbGwu cXVldWUsIGRvQW5pbWF0aW9uICk7CisJfSwKKwlzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJR dWV1ZSwgZ290b0VuZCApIHsKKwkJdmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHsK KwkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKKwkJCWRlbGV0ZSBob29rcy5zdG9wOworCQkJc3Rv cCggZ290b0VuZCApOworCQl9OworCisJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkg eworCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CisJCQljbGVhclF1ZXVlID0gdHlwZTsKKwkJCXR5 cGUgPSB1bmRlZmluZWQ7CisJCX0KKwkJaWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNl ICkgeworCQkJdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworCQl9CisKKwkJcmV0dXJu IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCXZhciBkZXF1ZXVlID0gdHJ1ZSwKKwkJCQlpbmRl eCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAorCQkJCXRpbWVycyA9IGpR dWVyeS50aW1lcnMsCisJCQkJZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApOworCisJCQlpZiAo IGluZGV4ICkgeworCQkJCWlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3Ag KSB7CisJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOworCQkJCX0KKwkJCX0gZWxzZSB7 CisJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKKwkJCQkJaWYgKCBkYXRhWyBpbmRleCBdICYm IGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7CisJCQkJCQlzdG9w UXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJZm9yICgg aW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKwkJCQlpZiAoIHRpbWVyc1sgaW5k ZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1 ZXVlID09PSB0eXBlKSApIHsKKwkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0Vu ZCApOworCQkJCQlkZXF1ZXVlID0gZmFsc2U7CisJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAx ICk7CisJCQkJfQorCQkJfQorCisJCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYg dGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCisJCQkvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwg Y2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQorCQkJLy8g YnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQKKwkJCWlmICggZGVxdWV1ZSB8fCAhZ290b0Vu ZCApIHsKKwkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQkJfQorCQl9KTsKKwl9 LAorCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CisJCWlmICggdHlwZSAhPT0gZmFsc2UgKSB7 CisJCQl0eXBlID0gdHlwZSB8fCAiZngiOworCQl9CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rp b24oKSB7CisJCQl2YXIgaW5kZXgsCisJCQkJZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApLAor CQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKKwkJCQlob29rcyA9IGRhdGFbIHR5 cGUgKyAicXVldWVIb29rcyIgXSwKKwkJCQl0aW1lcnMgPSBqUXVlcnkudGltZXJzLAorCQkJCWxl bmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKKworCQkJLy8gZW5hYmxlIGZpbmlzaGlu ZyBmbGFnIG9uIHByaXZhdGUgZGF0YQorCQkJZGF0YS5maW5pc2ggPSB0cnVlOworCisJCQkvLyBl bXB0eSB0aGUgcXVldWUgZmlyc3QKKwkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsK KworCQkJaWYgKCBob29rcyAmJiBob29rcy5jdXIgJiYgaG9va3MuY3VyLmZpbmlzaCApIHsKKwkJ CQlob29rcy5jdXIuZmluaXNoLmNhbGwoIHRoaXMgKTsKKwkJCX0KKworCQkJLy8gbG9vayBmb3Ig YW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW0KKwkJCWZvciAoIGluZGV4ID0g dGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7CisJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxl bSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CisJCQkJCXRp bWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTsKKwkJCQkJdGltZXJzLnNwbGljZSggaW5k ZXgsIDEgKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGlu IHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCisJCQlmb3IgKCBpbmRleCA9IDA7IGluZGV4 IDwgbGVuZ3RoOyBpbmRleCsrICkgeworCQkJCWlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVb IGluZGV4IF0uZmluaXNoICkgeworCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhp cyApOworCQkJCX0KKwkJCX0KKworCQkJLy8gdHVybiBvZmYgZmluaXNoaW5nIGZsYWcKKwkJCWRl bGV0ZSBkYXRhLmZpbmlzaDsKKwkJfSk7CisJfQorfSk7CisKKy8vIEdlbmVyYXRlIHBhcmFtZXRl cnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCitmdW5jdGlvbiBnZW5GeCggdHlwZSwg aW5jbHVkZVdpZHRoICkgeworCXZhciB3aGljaCwKKwkJYXR0cnMgPSB7IGhlaWdodDogdHlwZSB9 LAorCQlpID0gMDsKKworCS8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0 byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcywKKwkvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRo LCBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0CisJaW5jbHVkZVdp ZHRoID0gaW5jbHVkZVdpZHRoPyAxIDogMDsKKwlmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNs dWRlV2lkdGggKSB7CisJCXdoaWNoID0gY3NzRXhwYW5kWyBpIF07CisJCWF0dHJzWyAibWFyZ2lu IiArIHdoaWNoIF0gPSBhdHRyc1sgInBhZGRpbmciICsgd2hpY2ggXSA9IHR5cGU7CisJfQorCisJ aWYgKCBpbmNsdWRlV2lkdGggKSB7CisJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5 cGU7CisJfQorCisJcmV0dXJuIGF0dHJzOworfQorCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9y IGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCh7CisJc2xpZGVEb3duOiBnZW5GeCgic2hv dyIpLAorCXNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCisJc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dn bGUiKSwKKwlmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCisJZmFkZU91dDogeyBvcGFjaXR5 OiAiaGlkZSIgfSwKKwlmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KK30sIGZ1bmN0 aW9uKCBuYW1lLCBwcm9wcyApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVl ZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNw ZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisJfTsKK30pOworCitqUXVlcnkuc3BlZWQgPSBmdW5j dGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CisJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBz cGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHsKKwkJY29t cGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKKwkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVl ZCApICYmIHNwZWVkLAorCQlkdXJhdGlvbjogc3BlZWQsCisJCWVhc2luZzogZm4gJiYgZWFzaW5n IHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZworCX07 CisKKwlvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRp b24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKKwkJb3B0LmR1cmF0aW9uIGluIGpRdWVy eS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5m eC5zcGVlZHMuX2RlZmF1bHQ7CisKKwkvLyBub3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRl ZmluZWQvbnVsbCAtPiAiZngiCisJaWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUg PT09IHRydWUgKSB7CisJCW9wdC5xdWV1ZSA9ICJmeCI7CisJfQorCisJLy8gUXVldWVpbmcKKwlv cHQub2xkID0gb3B0LmNvbXBsZXRlOworCisJb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CisJ CWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHsKKwkJCW9wdC5vbGQuY2FsbCgg dGhpcyApOworCQl9CisKKwkJaWYgKCBvcHQucXVldWUgKSB7CisJCQlqUXVlcnkuZGVxdWV1ZSgg dGhpcywgb3B0LnF1ZXVlICk7CisJCX0KKwl9OworCisJcmV0dXJuIG9wdDsKK307CisKK2pRdWVy eS5lYXNpbmcgPSB7CisJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKKwkJcmV0dXJuIHA7CisJfSwK Kwlzd2luZzogZnVuY3Rpb24oIHAgKSB7CisJCXJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRo LlBJICkgLyAyOworCX0KK307CisKK2pRdWVyeS50aW1lcnMgPSBbXTsKK2pRdWVyeS5meCA9IFR3 ZWVuLnByb3RvdHlwZS5pbml0OworalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKKwl2YXIg dGltZXIsCisJCXRpbWVycyA9IGpRdWVyeS50aW1lcnMsCisJCWkgPSAwOworCisJZnhOb3cgPSBq UXVlcnkubm93KCk7CisKKwlmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7CisJCXRp bWVyID0gdGltZXJzWyBpIF07CisJCS8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5 IGJlZW4gcmVtb3ZlZAorCQlpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciAp IHsKKwkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOworCQl9CisJfQorCisJaWYgKCAhdGltZXJz Lmxlbmd0aCApIHsKKwkJalF1ZXJ5LmZ4LnN0b3AoKTsKKwl9CisJZnhOb3cgPSB1bmRlZmluZWQ7 Cit9OworCitqUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7CisJaWYgKCB0aW1l cigpICYmIGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKSApIHsKKwkJalF1ZXJ5LmZ4LnN0YXJ0 KCk7CisJfQorfTsKKworalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CisKK2pRdWVyeS5meC5zdGFy dCA9IGZ1bmN0aW9uKCkgeworCWlmICggIXRpbWVySWQgKSB7CisJCXRpbWVySWQgPSBzZXRJbnRl cnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApOworCX0KK307CisKK2pR dWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7CisJY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOwor CXRpbWVySWQgPSBudWxsOworfTsKKworalF1ZXJ5LmZ4LnNwZWVkcyA9IHsKKwlzbG93OiA2MDAs CisJZmFzdDogMjAwLAorCS8vIERlZmF1bHQgc3BlZWQKKwlfZGVmYXVsdDogNDAwCit9OworCisv LyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludAoralF1ZXJ5LmZ4LnN0ZXAgPSB7fTsK KworaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgeworCWpRdWVyeS5l eHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVy eS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKwkJCXJldHVybiBlbGVtID09 PSBmbi5lbGVtOworCQl9KS5sZW5ndGg7CisJfTsKK30KK2pRdWVyeS5mbi5vZmZzZXQgPSBmdW5j dGlvbiggb3B0aW9ucyApIHsKKwlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CisJCXJldHVybiBv cHRpb25zID09PSB1bmRlZmluZWQgPworCQkJdGhpcyA6CisJCQl0aGlzLmVhY2goZnVuY3Rpb24o IGkgKSB7CisJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsK KwkJCX0pOworCX0KKworCXZhciBkb2NFbGVtLCB3aW4sCisJCWJveCA9IHsgdG9wOiAwLCBsZWZ0 OiAwIH0sCisJCWVsZW0gPSB0aGlzWyAwIF0sCisJCWRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRv Y3VtZW50OworCisJaWYgKCAhZG9jICkgeworCQlyZXR1cm47CisJfQorCisJZG9jRWxlbSA9IGRv Yy5kb2N1bWVudEVsZW1lbnQ7CisKKwkvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0 ZWQgRE9NIG5vZGUKKwlpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsK KwkJcmV0dXJuIGJveDsKKwl9CisKKwkvLyBJZiB3ZSBkb24ndCBoYXZlIGdCQ1IsIGp1c3QgdXNl IDAsMCByYXRoZXIgdGhhbiBlcnJvcgorCS8vIEJsYWNrQmVycnkgNSwgaU9TIDMgKG9yaWdpbmFs IGlQaG9uZSkKKwlpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gY29y ZV9zdHJ1bmRlZmluZWQgKSB7CisJCWJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7 CisJfQorCXdpbiA9IGdldFdpbmRvdyggZG9jICk7CisJcmV0dXJuIHsKKwkJdG9wOiBib3gudG9w ICArICggd2luLnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wICkgIC0gKCBkb2NFbGVt LmNsaWVudFRvcCAgfHwgMCApLAorCQlsZWZ0OiBib3gubGVmdCArICggd2luLnBhZ2VYT2Zmc2V0 IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCApIC0gKCBkb2NFbGVtLmNsaWVudExlZnQgfHwgMCApCisJ fTsKK307CisKK2pRdWVyeS5vZmZzZXQgPSB7CisKKwlzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVt LCBvcHRpb25zLCBpICkgeworCQl2YXIgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9z aXRpb24iICk7CisKKwkJLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFy ZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbQorCQlpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiAp IHsKKwkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOworCQl9CisKKwkJdmFyIGN1 ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKKwkJCWN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCks CisJCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApLAorCQkJY3VyQ1NTTGVm dCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAorCQkJY2FsY3VsYXRlUG9zaXRpb24gPSAo IHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYgalF1 ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKKwkJCXBy b3BzID0ge30sIGN1clBvc2l0aW9uID0ge30sIGN1clRvcCwgY3VyTGVmdDsKKworCQkvLyBuZWVk IHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBp cyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKKwkJaWYgKCBj YWxjdWxhdGVQb3NpdGlvbiApIHsKKwkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigp OworCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOworCQkJY3VyTGVmdCA9IGN1clBvc2l0aW9u LmxlZnQ7CisJCX0gZWxzZSB7CisJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8 fCAwOworCQkJY3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwOworCQl9CisK KwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkgeworCQkJb3B0aW9ucyA9IG9w dGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7CisJCX0KKworCQlpZiAoIG9wdGlvbnMu dG9wICE9IG51bGwgKSB7CisJCQlwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0 LnRvcCApICsgY3VyVG9wOworCQl9CisJCWlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7CisJ CQlwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVm dDsKKwkJfQorCisJCWlmICggInVzaW5nIiBpbiBvcHRpb25zICkgeworCQkJb3B0aW9ucy51c2lu Zy5jYWxsKCBlbGVtLCBwcm9wcyApOworCQl9IGVsc2UgeworCQkJY3VyRWxlbS5jc3MoIHByb3Bz ICk7CisJCX0KKwl9Cit9OworCisKK2pRdWVyeS5mbi5leHRlbmQoeworCisJcG9zaXRpb246IGZ1 bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWyAwIF0gKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl2 YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsCisJCQlwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVm dDogMCB9LAorCQkJZWxlbSA9IHRoaXNbIDAgXTsKKworCQkvLyBmaXhlZCBlbGVtZW50cyBhcmUg b2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNh dXNlIGl0IGlzIGl0J3Mgb25seSBvZmZzZXQgcGFyZW50CisJCWlmICggalF1ZXJ5LmNzcyggZWxl bSwgInBvc2l0aW9uIiApID09PSAiZml4ZWQiICkgeworCQkJLy8gd2UgYXNzdW1lIHRoYXQgZ2V0 Qm91bmRpbmdDbGllbnRSZWN0IGlzIGF2YWlsYWJsZSB3aGVuIGNvbXB1dGVkIHBvc2l0aW9uIGlz IGZpeGVkCisJCQlvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworCQl9IGVs c2UgeworCQkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKKwkJCW9mZnNldFBhcmVudCA9IHRo aXMub2Zmc2V0UGFyZW50KCk7CisKKwkJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKKwkJCW9mZnNl dCA9IHRoaXMub2Zmc2V0KCk7CisJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVu dFsgMCBdLCAiaHRtbCIgKSApIHsKKwkJCQlwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zm c2V0KCk7CisJCQl9CisKKwkJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycworCQkJcGFyZW50 T2Zmc2V0LnRvcCAgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJUb3BX aWR0aCIsIHRydWUgKTsKKwkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNl dFBhcmVudFsgMCBdLCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOworCQl9CisKKwkJLy8gU3Vi dHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucworCQkvLyBub3RlOiB3aGVu IGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVm dAorCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5j b3JyZWN0bHkgYmUgMAorCQlyZXR1cm4geworCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRP ZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRydWUgKSwKKwkJCWxl ZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAi bWFyZ2luTGVmdCIsIHRydWUpCisJCX07CisJfSwKKworCW9mZnNldFBhcmVudDogZnVuY3Rpb24o KSB7CisJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHsKKwkJCXZhciBvZmZzZXRQYXJlbnQg PSB0aGlzLm9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisJCQl3aGls ZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgImh0 bWwiICkgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iKSA9PT0gInN0YXRp YyIgKSApIHsKKwkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50Owor CQkJfQorCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7 CisJCX0pOworCX0KK30pOworCisKKy8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3Ag bWV0aG9kcworalF1ZXJ5LmVhY2goIHtzY3JvbGxMZWZ0OiAicGFnZVhPZmZzZXQiLCBzY3JvbGxU b3A6ICJwYWdlWU9mZnNldCJ9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkgeworCXZhciB0b3Ag PSAvWS8udGVzdCggcHJvcCApOworCisJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2 YWwgKSB7CisJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0 aG9kLCB2YWwgKSB7CisJCQl2YXIgd2luID0gZ2V0V2luZG93KCBlbGVtICk7CisKKwkJCWlmICgg dmFsID09PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIHdpbiA/IChwcm9wIGluIHdpbikgPyB3 aW5bIHByb3AgXSA6CisJCQkJCXdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBd IDoKKwkJCQkJZWxlbVsgbWV0aG9kIF07CisJCQl9CisKKwkJCWlmICggd2luICkgeworCQkJCXdp bi5zY3JvbGxUbygKKwkJCQkJIXRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgp LAorCQkJCQl0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbFRvcCgpCisJCQkJKTsKKwor CQkJfSBlbHNlIHsKKwkJCQllbGVtWyBtZXRob2QgXSA9IHZhbDsKKwkJCX0KKwkJfSwgbWV0aG9k LCB2YWwsIGFyZ3VtZW50cy5sZW5ndGgsIG51bGwgKTsKKwl9OworfSk7CisKK2Z1bmN0aW9uIGdl dFdpbmRvdyggZWxlbSApIHsKKwlyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPworCQll bGVtIDoKKwkJZWxlbS5ub2RlVHlwZSA9PT0gOSA/CisJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVs ZW0ucGFyZW50V2luZG93IDoKKwkJCWZhbHNlOworfQorLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBp bm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRo b2RzCitqUXVlcnkuZWFjaCggeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBm dW5jdGlvbiggbmFtZSwgdHlwZSApIHsKKwlqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiAiaW5uZXIi ICsgbmFtZSwgY29udGVudDogdHlwZSwgIiI6ICJvdXRlciIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBk ZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgeworCQkvLyBtYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJI ZWlnaHQsIG91dGVyV2lkdGgKKwkJalF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1h cmdpbiwgdmFsdWUgKSB7CisJCQl2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAo IGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSAiYm9vbGVhbiIgKSwKKwkJCQlleHRy YSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ ICJtYXJnaW4iIDogImJvcmRlciIgKTsKKworCQkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMs IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKKwkJCQl2YXIgZG9jOworCisJCQkJaWYg KCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKwkJCQkJLy8gQXMgb2YgNS84LzIwMTIgdGhp cyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhl cmUKKwkJCQkJLy8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0 IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOgorCQkJCQkvLyBodHRwczovL2dpdGh1Yi5jb20v anF1ZXJ5L2pxdWVyeS9wdWxsLzc2NAorCQkJCQlyZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVu dEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOworCQkJCX0KKworCQkJCS8vIEdldCBkb2N1bWVu dCB3aWR0aCBvciBoZWlnaHQKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CisJCQkJ CWRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50OworCisJCQkJCS8vIEVpdGhlciBzY3JvbGxbV2lk dGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0 XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXN0CisJCQkJCS8vIHVuZm9ydHVuYXRlbHksIHRoaXMgY2F1 c2VzIGJ1ZyAjMzgzOCBpbiBJRTYvOCBvbmx5LCBidXQgdGhlcmUgaXMgY3VycmVudGx5IG5vIGdv b2QsIHNtYWxsIHdheSB0byBmaXggaXQuCisJCQkJCXJldHVybiBNYXRoLm1heCgKKwkJCQkJCWVs ZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisJCQkJ CQllbGVtLmJvZHlbICJvZmZzZXQiICsgbmFtZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBdLAor CQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQorCQkJCQkpOworCQkJCX0KKworCQkJCXJldHVy biB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KKwkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0 aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAorCQkJCQlq UXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDoKKworCQkJCQkvLyBTZXQgd2lkdGggb3Ig aGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFs dWUsIGV4dHJhICk7CisJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQs IGNoYWluYWJsZSwgbnVsbCApOworCQl9OworCX0pOworfSk7CisvLyBMaW1pdCBzY29wZSBwb2xs dXRpb24gZnJvbSBhbnkgZGVwcmVjYXRlZCBBUEkKKy8vIChmdW5jdGlvbigpIHsKKworLy8gfSko KTsKKy8vIEV4cG9zZSBqUXVlcnkgdG8gdGhlIGdsb2JhbCBvYmplY3QKK3dpbmRvdy5qUXVlcnkg PSB3aW5kb3cuJCA9IGpRdWVyeTsKKworLy8gRXhwb3NlIGpRdWVyeSBhcyBhbiBBTUQgbW9kdWxl LCBidXQgb25seSBmb3IgQU1EIGxvYWRlcnMgdGhhdAorLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVz IHdpdGggbG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnkKKy8vIGluIGEgcGFnZSB0 aGF0IGFsbCBtaWdodCBjYWxsIGRlZmluZSgpLiBUaGUgbG9hZGVyIHdpbGwgaW5kaWNhdGUKKy8v IHRoZXkgaGF2ZSBzcGVjaWFsIGFsbG93YW5jZXMgZm9yIG11bHRpcGxlIGpRdWVyeSB2ZXJzaW9u cyBieQorLy8gc3BlY2lmeWluZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFz IGEgbmFtZWQgbW9kdWxlLAorLy8gc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0 aCBvdGhlciBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLAorLy8gYnV0IG5vdCB1c2UgYSBwcm9w ZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdCB1bmRlcnN0YW5kcyBhbm9ueW1vdXMKKy8vIEFN RCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byBy ZWdpc3Rlci4KKy8vIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUg bmFtZXMgYXJlIGRlcml2ZWQgZnJvbQorLy8gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3Jt YWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2UgZmlsZSBuYW1lLgorLy8gRG8gdGhpcyBhZnRl ciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBj YWxsCisvLyBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2ls bCB3b3JrLgoraWYgKCB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQg JiYgZGVmaW5lLmFtZC5qUXVlcnkgKSB7CisJZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0aW9u ICgpIHsgcmV0dXJuIGpRdWVyeTsgfSApOworfQorCit9KSggd2luZG93ICk7CmRpZmYgLS1naXQg YS9hc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvYXNzZXRzL2pzL2pxdWVyeS1taWdyYXRlLTEuMS4xLmpz IGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9qcXVlcnktbWlncmF0ZS0xLjEuMS5q cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlmOTU0Ci0tLSAvZGV2L251 bGwKKysrIGIvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9qcXVlcnktbWlncmF0ZS0x LjEuMS5qcwpAQCAtMCwwICsxLDUxMSBAQAorLyohCisgKiBqUXVlcnkgTWlncmF0ZSAtIHYxLjEu MSAtIDIwMTMtMDItMTYKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3Jh dGUKKyAqIENvcHlyaWdodCAyMDA1LCAyMDEzIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBv dGhlciBjb250cmlidXRvcnM7IExpY2Vuc2VkIE1JVAorICovCisoZnVuY3Rpb24oIGpRdWVyeSwg d2luZG93LCB1bmRlZmluZWQgKSB7CisvLyBTZWUgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNr ZXQvMTMzMzUKKy8vICJ1c2Ugc3RyaWN0IjsKKworCit2YXIgd2FybmVkQWJvdXQgPSB7fTsKKwor Ly8gTGlzdCBvZiB3YXJuaW5ncyBhbHJlYWR5IGdpdmVuOyBwdWJsaWMgcmVhZCBvbmx5CitqUXVl cnkubWlncmF0ZVdhcm5pbmdzID0gW107CisKKy8vIFNldCB0byB0cnVlIHRvIHByZXZlbnQgY29u c29sZSBvdXRwdXQ7IG1pZ3JhdGVXYXJuaW5ncyBzdGlsbCBtYWludGFpbmVkCisvLyBqUXVlcnku bWlncmF0ZU11dGUgPSBmYWxzZTsKKworLy8gU2hvdyBhIG1lc3NhZ2Ugb24gdGhlIGNvbnNvbGUg c28gZGV2cyBrbm93IHdlJ3JlIGFjdGl2ZQoraWYgKCAhalF1ZXJ5Lm1pZ3JhdGVNdXRlICYmIHdp bmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICkgeworCWNvbnNvbGUubG9nKCJKUU1JR1JBVEU6 IExvZ2dpbmcgaXMgYWN0aXZlIik7Cit9CisKKy8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRy YWNlcyB0aGF0IGFwcGVhciB3aXRoIHdhcm5pbmdzCitpZiAoIGpRdWVyeS5taWdyYXRlVHJhY2Ug PT09IHVuZGVmaW5lZCApIHsKKwlqUXVlcnkubWlncmF0ZVRyYWNlID0gdHJ1ZTsKK30KKworLy8g Rm9yZ2V0IGFueSB3YXJuaW5ncyB3ZSd2ZSBhbHJlYWR5IGdpdmVuOyBwdWJsaWMKK2pRdWVyeS5t aWdyYXRlUmVzZXQgPSBmdW5jdGlvbigpIHsKKwl3YXJuZWRBYm91dCA9IHt9OworCWpRdWVyeS5t aWdyYXRlV2FybmluZ3MubGVuZ3RoID0gMDsKK307CisKK2Z1bmN0aW9uIG1pZ3JhdGVXYXJuKCBt c2cpIHsKKwlpZiAoICF3YXJuZWRBYm91dFsgbXNnIF0gKSB7CisJCXdhcm5lZEFib3V0WyBtc2cg XSA9IHRydWU7CisJCWpRdWVyeS5taWdyYXRlV2FybmluZ3MucHVzaCggbXNnICk7CisJCWlmICgg d2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuICYmICFqUXVlcnkubWlncmF0ZU11dGUgKSB7 CisJCQljb25zb2xlLndhcm4oICJKUU1JR1JBVEU6ICIgKyBtc2cgKTsKKwkJCWlmICggalF1ZXJ5 Lm1pZ3JhdGVUcmFjZSAmJiBjb25zb2xlLnRyYWNlICkgeworCQkJCWNvbnNvbGUudHJhY2UoKTsK KwkJCX0KKwkJfQorCX0KK30KKworZnVuY3Rpb24gbWlncmF0ZVdhcm5Qcm9wKCBvYmosIHByb3As IHZhbHVlLCBtc2cgKSB7CisJaWYgKCBPYmplY3QuZGVmaW5lUHJvcGVydHkgKSB7CisJCS8vIE9u IEVTNSBicm93c2VycyAobm9uLW9sZElFKSwgd2FybiBpZiB0aGUgY29kZSB0cmllcyB0byBnZXQg cHJvcDsKKwkJLy8gYWxsb3cgcHJvcGVydHkgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBzb21l IG90aGVyIHBsdWdpbiB3YW50cyBpdAorCQl0cnkgeworCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5 KCBvYmosIHByb3AsIHsKKwkJCQljb25maWd1cmFibGU6IHRydWUsCisJCQkJZW51bWVyYWJsZTog dHJ1ZSwKKwkJCQlnZXQ6IGZ1bmN0aW9uKCkgeworCQkJCQltaWdyYXRlV2FybiggbXNnICk7CisJ CQkJCXJldHVybiB2YWx1ZTsKKwkJCQl9LAorCQkJCXNldDogZnVuY3Rpb24oIG5ld1ZhbHVlICkg eworCQkJCQltaWdyYXRlV2FybiggbXNnICk7CisJCQkJCXZhbHVlID0gbmV3VmFsdWU7CisJCQkJ fQorCQkJfSk7CisJCQlyZXR1cm47CisJCX0gY2F0Y2goIGVyciApIHsKKwkJCS8vIElFOCBpcyBh IGRvcGUgYWJvdXQgT2JqZWN0LmRlZmluZVByb3BlcnR5LCBjYW4ndCB3YXJuIHRoZXJlCisJCX0K Kwl9CisKKwkvLyBOb24tRVM1IChvciBicm9rZW4pIGJyb3dzZXI7IGp1c3Qgc2V0IHRoZSBwcm9w ZXJ0eQorCWpRdWVyeS5fZGVmaW5lUHJvcGVydHlCcm9rZW4gPSB0cnVlOworCW9ialsgcHJvcCBd ID0gdmFsdWU7Cit9CisKK2lmICggZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gIkJhY2tDb21wYXQi ICkgeworCS8vIGpRdWVyeSBoYXMgbmV2ZXIgc3VwcG9ydGVkIG9yIHRlc3RlZCBRdWlya3MgTW9k ZQorCW1pZ3JhdGVXYXJuKCAialF1ZXJ5IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggUXVpcmtzIE1v ZGUiICk7Cit9CisKKwordmFyIGF0dHJGbiA9IGpRdWVyeSggIjxpbnB1dC8+IiwgeyBzaXplOiAx IH0gKS5hdHRyKCJzaXplIikgJiYgalF1ZXJ5LmF0dHJGbiwKKwlvbGRBdHRyID0galF1ZXJ5LmF0 dHIsCisJdmFsdWVBdHRyR2V0ID0galF1ZXJ5LmF0dHJIb29rcy52YWx1ZSAmJiBqUXVlcnkuYXR0 ckhvb2tzLnZhbHVlLmdldCB8fAorCQlmdW5jdGlvbigpIHsgcmV0dXJuIG51bGw7IH0sCisJdmFs dWVBdHRyU2V0ID0galF1ZXJ5LmF0dHJIb29rcy52YWx1ZSAmJiBqUXVlcnkuYXR0ckhvb2tzLnZh bHVlLnNldCB8fAorCQlmdW5jdGlvbigpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSwKKwlybm9UeXBl ID0gL14oPzppbnB1dHxidXR0b24pJC9pLAorCXJub0F0dHJOb2RlVHlwZSA9IC9eWzIzOF0kLywK KwlyYm9vbGVhbiA9IC9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJv bHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1 aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLAorCXJ1c2VEZWZhdWx0ID0gL14oPzpjaGVja2VkfHNl bGVjdGVkKSQvaTsKKworLy8galF1ZXJ5LmF0dHJGbgorbWlncmF0ZVdhcm5Qcm9wKCBqUXVlcnks ICJhdHRyRm4iLCBhdHRyRm4gfHwge30sICJqUXVlcnkuYXR0ckZuIGlzIGRlcHJlY2F0ZWQiICk7 CisKK2pRdWVyeS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgewor CXZhciBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCksCisJCW5UeXBlID0gZWxlbSAmJiBl bGVtLm5vZGVUeXBlOworCisJaWYgKCBwYXNzICkgeworCQkvLyBTaW5jZSBwYXNzIGlzIHVzZWQg aW50ZXJuYWxseSwgd2Ugb25seSB3YXJuIGZvciBuZXcgalF1ZXJ5CisJCS8vIHZlcnNpb25zIHdo ZXJlIHRoZXJlIGlzbid0IGEgcGFzcyBhcmcgaW4gdGhlIGZvcm1hbCBwYXJhbXMKKwkJaWYgKCBv bGRBdHRyLmxlbmd0aCA8IDQgKSB7CisJCQltaWdyYXRlV2FybigialF1ZXJ5LmZuLmF0dHIoIHBy b3BzLCBwYXNzICkgaXMgZGVwcmVjYXRlZCIpOworCQl9CisJCWlmICggZWxlbSAmJiAhcm5vQXR0 ck5vZGVUeXBlLnRlc3QoIG5UeXBlICkgJiYKKwkJCShhdHRyRm4gPyBuYW1lIGluIGF0dHJGbiA6 IGpRdWVyeS5pc0Z1bmN0aW9uKGpRdWVyeS5mbltuYW1lXSkpICkgeworCQkJcmV0dXJuIGpRdWVy eSggZWxlbSApWyBuYW1lIF0oIHZhbHVlICk7CisJCX0KKwl9CisKKwkvLyBXYXJuIGlmIHVzZXIg dHJpZXMgdG8gc2V0IGB0eXBlYCwgc2luY2UgaXQgYnJlYWtzIG9uIElFIDYvNy84OyBieSBjaGVj a2luZworCS8vIGZvciBkaXNjb25uZWN0ZWQgZWxlbWVudHMgd2UgZG9uJ3Qgd2FybiBvbiAkKCAi PGJ1dHRvbj4iLCB7IHR5cGU6ICJidXR0b24iIH0gKS4KKwlpZiAoIG5hbWUgPT09ICJ0eXBlIiAm JiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHJub1R5cGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYm IGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJbWlncmF0ZVdhcm4oIkNhbid0IGNoYW5nZSB0aGUgJ3R5 cGUnIG9mIGFuIGlucHV0IG9yIGJ1dHRvbiBpbiBJRSA2LzcvOCIpOworCX0KKworCS8vIFJlc3Rv cmUgYm9vbEhvb2sgZm9yIGJvb2xlYW4gcHJvcGVydHkvYXR0cmlidXRlIHN5bmNocm9uaXphdGlv bgorCWlmICggIWpRdWVyeS5hdHRySG9va3NbIGxvd2VyTmFtZSBdICYmIHJib29sZWFuLnRlc3Qo IGxvd2VyTmFtZSApICkgeworCQlqUXVlcnkuYXR0ckhvb2tzWyBsb3dlck5hbWUgXSA9IHsKKwkJ CWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCQkJLy8gQWxpZ24gYm9vbGVhbiBhdHRy aWJ1dGVzIHdpdGggY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzCisJCQkJLy8gRmFsbCBiYWNrIHRv IGF0dHJpYnV0ZSBwcmVzZW5jZSB3aGVyZSBzb21lIGJvb2xlYW5zIGFyZSBub3Qgc3VwcG9ydGVk CisJCQkJdmFyIGF0dHJOb2RlLAorCQkJCQlwcm9wZXJ0eSA9IGpRdWVyeS5wcm9wKCBlbGVtLCBu YW1lICk7CisJCQkJcmV0dXJuIHByb3BlcnR5ID09PSB0cnVlIHx8IHR5cGVvZiBwcm9wZXJ0eSAh PT0gImJvb2xlYW4iICYmCisJCQkJCSggYXR0ck5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUo bmFtZSkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KKworCQkJCQluYW1lLnRv TG93ZXJDYXNlKCkgOgorCQkJCQl1bmRlZmluZWQ7CisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbigg ZWxlbSwgdmFsdWUsIG5hbWUgKSB7CisJCQkJdmFyIHByb3BOYW1lOworCQkJCWlmICggdmFsdWUg PT09IGZhbHNlICkgeworCQkJCQkvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0 IHRvIGZhbHNlCisJCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisJCQkJfSBl bHNlIHsKKwkJCQkJLy8gdmFsdWUgaXMgdHJ1ZSBzaW5jZSB3ZSBrbm93IGF0IHRoaXMgcG9pbnQg aXQncyB0eXBlIGJvb2xlYW4gYW5kIG5vdCBmYWxzZQorCQkJCQkvLyBTZXQgYm9vbGVhbiBhdHRy aWJ1dGVzIHRvIHRoZSBzYW1lIG5hbWUgYW5kIHNldCB0aGUgRE9NIHByb3BlcnR5CisJCQkJCXBy b3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOworCQkJCQlpZiAoIHByb3BO YW1lIGluIGVsZW0gKSB7CisJCQkJCQkvLyBPbmx5IHNldCB0aGUgSURMIHNwZWNpZmljYWxseSBp ZiBpdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudAorCQkJCQkJZWxlbVsgcHJvcE5hbWUg XSA9IHRydWU7CisJCQkJCX0KKworCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50 b0xvd2VyQ2FzZSgpICk7CisJCQkJfQorCQkJCXJldHVybiBuYW1lOworCQkJfQorCQl9OworCisJ CS8vIFdhcm4gb25seSBmb3IgYXR0cmlidXRlcyB0aGF0IGNhbiByZW1haW4gZGlzdGluY3QgZnJv bSB0aGVpciBwcm9wZXJ0aWVzIHBvc3QtMS45CisJCWlmICggcnVzZURlZmF1bHQudGVzdCggbG93 ZXJOYW1lICkgKSB7CisJCQltaWdyYXRlV2FybiggImpRdWVyeS5mbi5hdHRyKCciICsgbG93ZXJO YW1lICsgIicpIG1heSB1c2UgcHJvcGVydHkgaW5zdGVhZCBvZiBhdHRyaWJ1dGUiICk7CisJCX0K Kwl9CisKKwlyZXR1cm4gb2xkQXR0ci5jYWxsKCBqUXVlcnksIGVsZW0sIG5hbWUsIHZhbHVlICk7 Cit9OworCisvLyBhdHRySG9va3M6IHZhbHVlCitqUXVlcnkuYXR0ckhvb2tzLnZhbHVlID0gewor CWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCXZhciBub2RlTmFtZSA9ICggZWxlbS5u b2RlTmFtZSB8fCAiIiApLnRvTG93ZXJDYXNlKCk7CisJCWlmICggbm9kZU5hbWUgPT09ICJidXR0 b24iICkgeworCQkJcmV0dXJuIHZhbHVlQXR0ckdldC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7 CisJCX0KKwkJaWYgKCBub2RlTmFtZSAhPT0gImlucHV0IiAmJiBub2RlTmFtZSAhPT0gIm9wdGlv biIgKSB7CisJCQltaWdyYXRlV2FybigialF1ZXJ5LmZuLmF0dHIoJ3ZhbHVlJykgbm8gbG9uZ2Vy IGdldHMgcHJvcGVydGllcyIpOworCQl9CisJCXJldHVybiBuYW1lIGluIGVsZW0gPworCQkJZWxl bS52YWx1ZSA6CisJCQludWxsOworCX0sCisJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7 CisJCXZhciBub2RlTmFtZSA9ICggZWxlbS5ub2RlTmFtZSB8fCAiIiApLnRvTG93ZXJDYXNlKCk7 CisJCWlmICggbm9kZU5hbWUgPT09ICJidXR0b24iICkgeworCQkJcmV0dXJuIHZhbHVlQXR0clNl dC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCX0KKwkJaWYgKCBub2RlTmFtZSAhPT0gImlu cHV0IiAmJiBub2RlTmFtZSAhPT0gIm9wdGlvbiIgKSB7CisJCQltaWdyYXRlV2FybigialF1ZXJ5 LmZuLmF0dHIoJ3ZhbHVlJywgdmFsKSBubyBsb25nZXIgc2V0cyBwcm9wZXJ0aWVzIik7CisJCX0K KwkJLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAor CQllbGVtLnZhbHVlID0gdmFsdWU7CisJfQorfTsKKworCit2YXIgbWF0Y2hlZCwgYnJvd3NlciwK KwlvbGRJbml0ID0galF1ZXJ5LmZuLmluaXQsCisJb2xkUGFyc2VKU09OID0galF1ZXJ5LnBhcnNl SlNPTiwKKwkvLyBOb3RlIHRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgIzk1MjEgWFNTIGZpeCBm cm9tIDEuNyEKKwlycXVpY2tFeHByID0gL14oPzpbXjxdKig8W1x3XFddKz4pW14+XSp8IyhbXHdc LV0qKSkkLzsKKworLy8gJChodG1sKSAibG9va3MgbGlrZSBodG1sIiBydWxlIGNoYW5nZQoralF1 ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7 CisJdmFyIG1hdGNoOworCisJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJz dHJpbmciICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICYmCisJCQkobWF0Y2gg PSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICYmIG1hdGNoWzFdICkgeworCQkvLyBUaGlz IGlzIGFuIEhUTUwgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgIm9sZCIgcnVsZXM7IGlzIGl0IHN0 aWxsPworCQlpZiAoIHNlbGVjdG9yLmNoYXJBdCggMCApICE9PSAiPCIgKSB7CisJCQltaWdyYXRl V2FybigiJChodG1sKSBIVE1MIHN0cmluZ3MgbXVzdCBzdGFydCB3aXRoICc8JyBjaGFyYWN0ZXIi KTsKKwkJfQorCQkvLyBOb3cgcHJvY2VzcyB1c2luZyBsb29zZSBydWxlczsgbGV0IHByZS0xLjgg cGxheSB0b28KKwkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQuY29udGV4dCApIHsKKwkJCS8vIGpR dWVyeSBvYmplY3QgYXMgY29udGV4dDsgcGFyc2VIVE1MIGV4cGVjdHMgYSBET00gb2JqZWN0CisJ CQljb250ZXh0ID0gY29udGV4dC5jb250ZXh0OworCQl9CisJCWlmICggalF1ZXJ5LnBhcnNlSFRN TCApIHsKKwkJCXJldHVybiBvbGRJbml0LmNhbGwoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoIGpR dWVyeS50cmltKHNlbGVjdG9yKSwgY29udGV4dCwgdHJ1ZSApLAorCQkJCQljb250ZXh0LCByb290 alF1ZXJ5ICk7CisJCX0KKwl9CisJcmV0dXJuIG9sZEluaXQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50 cyApOworfTsKK2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworLy8gTGV0 ICQucGFyc2VKU09OKGZhbHN5X3ZhbHVlKSByZXR1cm4gbnVsbAoralF1ZXJ5LnBhcnNlSlNPTiA9 IGZ1bmN0aW9uKCBqc29uICkgeworCWlmICggIWpzb24gJiYganNvbiAhPT0gbnVsbCApIHsKKwkJ bWlncmF0ZVdhcm4oImpRdWVyeS5wYXJzZUpTT04gcmVxdWlyZXMgYSB2YWxpZCBKU09OIHN0cmlu ZyIpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIG9sZFBhcnNlSlNPTi5hcHBseSggdGhp cywgYXJndW1lbnRzICk7Cit9OworCitqUXVlcnkudWFNYXRjaCA9IGZ1bmN0aW9uKCB1YSApIHsK Kwl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CisKKwl2YXIgbWF0Y2ggPSAvKGNocm9tZSlbIFwvXShb XHcuXSspLy5leGVjKCB1YSApIHx8CisJCS8od2Via2l0KVsgXC9dKFtcdy5dKykvLmV4ZWMoIHVh ICkgfHwKKwkJLyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoIHVhICkg fHwKKwkJLyhtc2llKSAoW1x3Ll0rKS8uZXhlYyggdWEgKSB8fAorCQl1YS5pbmRleE9mKCJjb21w YXRpYmxlIikgPCAwICYmIC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyggdWEg KSB8fAorCQlbXTsKKworCXJldHVybiB7CisJCWJyb3dzZXI6IG1hdGNoWyAxIF0gfHwgIiIsCisJ CXZlcnNpb246IG1hdGNoWyAyIF0gfHwgIjAiCisJfTsKK307CisKKy8vIERvbid0IGNsb2JiZXIg YW55IGV4aXN0aW5nIGpRdWVyeS5icm93c2VyIGluIGNhc2UgaXQncyBkaWZmZXJlbnQKK2lmICgg IWpRdWVyeS5icm93c2VyICkgeworCW1hdGNoZWQgPSBqUXVlcnkudWFNYXRjaCggbmF2aWdhdG9y LnVzZXJBZ2VudCApOworCWJyb3dzZXIgPSB7fTsKKworCWlmICggbWF0Y2hlZC5icm93c2VyICkg eworCQlicm93c2VyWyBtYXRjaGVkLmJyb3dzZXIgXSA9IHRydWU7CisJCWJyb3dzZXIudmVyc2lv biA9IG1hdGNoZWQudmVyc2lvbjsKKwl9CisKKwkvLyBDaHJvbWUgaXMgV2Via2l0LCBidXQgV2Vi a2l0IGlzIGFsc28gU2FmYXJpLgorCWlmICggYnJvd3Nlci5jaHJvbWUgKSB7CisJCWJyb3dzZXIu d2Via2l0ID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCBicm93c2VyLndlYmtpdCApIHsKKwkJYnJvd3Nl ci5zYWZhcmkgPSB0cnVlOworCX0KKworCWpRdWVyeS5icm93c2VyID0gYnJvd3NlcjsKK30KKwor Ly8gV2FybiBpZiB0aGUgY29kZSB0cmllcyB0byBnZXQgalF1ZXJ5LmJyb3dzZXIKK21pZ3JhdGVX YXJuUHJvcCggalF1ZXJ5LCAiYnJvd3NlciIsIGpRdWVyeS5icm93c2VyLCAialF1ZXJ5LmJyb3dz ZXIgaXMgZGVwcmVjYXRlZCIgKTsKKworalF1ZXJ5LnN1YiA9IGZ1bmN0aW9uKCkgeworCWZ1bmN0 aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCXJldHVybiBuZXcgalF1ZXJ5 U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CisJfQorCWpRdWVyeS5leHRlbmQoIHRy dWUsIGpRdWVyeVN1YiwgdGhpcyApOworCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsKKwlq UXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOworCWpRdWVyeVN1Yi5m bi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKKwlqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7CisJ alF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsK KwkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0 IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKKwkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRl eHQgKTsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuZm4uaW5pdC5jYWxsKCB0aGlzLCBzZWxlY3Rv ciwgY29udGV4dCwgcm9vdGpRdWVyeVN1YiApOworCX07CisJalF1ZXJ5U3ViLmZuLmluaXQucHJv dG90eXBlID0galF1ZXJ5U3ViLmZuOworCXZhciByb290alF1ZXJ5U3ViID0galF1ZXJ5U3ViKGRv Y3VtZW50KTsKKwltaWdyYXRlV2FybiggImpRdWVyeS5zdWIoKSBpcyBkZXByZWNhdGVkIiApOwor CXJldHVybiBqUXVlcnlTdWI7Cit9OworCisKKy8vIEVuc3VyZSB0aGF0ICQuYWpheCBnZXRzIHRo ZSBuZXcgcGFyc2VKU09OIGRlZmluZWQgaW4gY29yZS5qcworalF1ZXJ5LmFqYXhTZXR1cCh7CisJ Y29udmVydGVyczogeworCQkidGV4dCBqc29uIjogalF1ZXJ5LnBhcnNlSlNPTgorCX0KK30pOwor CisKK3ZhciBvbGRGbkRhdGEgPSBqUXVlcnkuZm4uZGF0YTsKKworalF1ZXJ5LmZuLmRhdGEgPSBm dW5jdGlvbiggbmFtZSApIHsKKwl2YXIgcmV0LCBldnQsCisJCWVsZW0gPSB0aGlzWzBdOworCisJ Ly8gSGFuZGxlcyAxLjcgd2hpY2ggaGFzIHRoaXMgYmVoYXZpb3IgYW5kIDEuOCB3aGljaCBkb2Vz bid0CisJaWYgKCBlbGVtICYmIG5hbWUgPT09ICJldmVudHMiICYmIGFyZ3VtZW50cy5sZW5ndGgg PT09IDEgKSB7CisJCXJldCA9IGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lICk7CisJCWV2dCA9IGpR dWVyeS5fZGF0YSggZWxlbSwgbmFtZSApOworCQlpZiAoICggcmV0ID09PSB1bmRlZmluZWQgfHwg cmV0ID09PSBldnQgKSAmJiBldnQgIT09IHVuZGVmaW5lZCApIHsKKwkJCW1pZ3JhdGVXYXJuKCJV c2Ugb2YgalF1ZXJ5LmZuLmRhdGEoJ2V2ZW50cycpIGlzIGRlcHJlY2F0ZWQiKTsKKwkJCXJldHVy biBldnQ7CisJCX0KKwl9CisJcmV0dXJuIG9sZEZuRGF0YS5hcHBseSggdGhpcywgYXJndW1lbnRz ICk7Cit9OworCisKK3ZhciByc2NyaXB0VHlwZSA9IC9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksCisJ b2xkU2VsZiA9IGpRdWVyeS5mbi5hbmRTZWxmIHx8IGpRdWVyeS5mbi5hZGRCYWNrOworCitqUXVl cnkuZm4uYW5kU2VsZiA9IGZ1bmN0aW9uKCkgeworCW1pZ3JhdGVXYXJuKCJqUXVlcnkuZm4uYW5k U2VsZigpIHJlcGxhY2VkIGJ5IGpRdWVyeS5mbi5hZGRCYWNrKCkiKTsKKwlyZXR1cm4gb2xkU2Vs Zi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cit9OworCisvLyBTaW5jZSBqUXVlcnkuY2xlYW4g aXMgdXNlZCBpbnRlcm5hbGx5IG9uIG9sZGVyIHZlcnNpb25zLCB3ZSBvbmx5IHNoaW0gaWYgaXQn cyBtaXNzaW5nCitpZiAoICFqUXVlcnkuY2xlYW4gKSB7CisJalF1ZXJ5LmNsZWFuID0gZnVuY3Rp b24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKKwkJLy8gU2V0IGNvbnRl eHQgcGVyIDEuOCBsb2dpYworCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKwkJY29u dGV4dCA9ICFjb250ZXh0Lm5vZGVUeXBlICYmIGNvbnRleHRbMF0gfHwgY29udGV4dDsKKwkJY29u dGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0OworCisJCW1pZ3JhdGVXYXJu KCJqUXVlcnkuY2xlYW4oKSBpcyBkZXByZWNhdGVkIik7CisKKwkJdmFyIGksIGVsZW0sIGhhbmRs ZVNjcmlwdCwganNUYWdzLAorCQkJcmV0ID0gW107CisKKwkJalF1ZXJ5Lm1lcmdlKCByZXQsIGpR dWVyeS5idWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCApLmNoaWxkTm9kZXMgKTsKKworCQkv LyBDb21wbGV4IGxvZ2ljIGxpZnRlZCBkaXJlY3RseSBmcm9tIGpRdWVyeSAxLjgKKwkJaWYgKCBm cmFnbWVudCApIHsKKwkJCS8vIFNwZWNpYWwgaGFuZGxpbmcgb2YgZWFjaCBzY3JpcHQgZWxlbWVu dAorCQkJaGFuZGxlU2NyaXB0ID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJLy8gQ2hlY2sgaWYg d2UgY29uc2lkZXIgaXQgZXhlY3V0YWJsZQorCQkJCWlmICggIWVsZW0udHlwZSB8fCByc2NyaXB0 VHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHsKKwkJCQkJLy8gRGV0YWNoIHRoZSBzY3JpcHQgYW5k IHN0b3JlIGl0IGluIHRoZSBzY3JpcHRzIGFycmF5IChpZiBwcm92aWRlZCkgb3IgdGhlIGZyYWdt ZW50CisJCQkJCS8vIFJldHVybiB0cnV0aHkgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiBo YW5kbGVkCisJCQkJCXJldHVybiBzY3JpcHRzID8KKwkJCQkJCXNjcmlwdHMucHVzaCggZWxlbS5w YXJlbnROb2RlID8gZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICkgOiBlbGVtICkg OgorCQkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKKwkJCQl9CisJCQl9OworCisJ CQlmb3IgKCBpID0gMDsgKGVsZW0gPSByZXRbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQkvLyBD aGVjayBpZiB3ZSdyZSBkb25lIGFmdGVyIGhhbmRsaW5nIGFuIGV4ZWN1dGFibGUgc2NyaXB0CisJ CQkJaWYgKCAhKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzY3JpcHQiICkgJiYgaGFuZGxlU2Ny aXB0KCBlbGVtICkgKSApIHsKKwkJCQkJLy8gQXBwZW5kIHRvIGZyYWdtZW50IGFuZCBoYW5kbGUg ZW1iZWRkZWQgc2NyaXB0cworCQkJCQlmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApOworCQkJ CQlpZiAoIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiAp IHsKKwkJCQkJCS8vIGhhbmRsZVNjcmlwdCBhbHRlcnMgdGhlIERPTSwgc28gdXNlIGpRdWVyeS5t ZXJnZSB0byBlbnN1cmUgc25hcHNob3QgaXRlcmF0aW9uCisJCQkJCQlqc1RhZ3MgPSBqUXVlcnku Z3JlcCggalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0 IikgKSwgaGFuZGxlU2NyaXB0ICk7CisKKwkJCQkJCS8vIFNwbGljZSB0aGUgc2NyaXB0cyBpbnRv IHJldCBhZnRlciB0aGVpciBmb3JtZXIgYW5jZXN0b3IgYW5kIGFkdmFuY2Ugb3VyIGluZGV4IGJl eW9uZCB0aGVtCisJCQkJCQlyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0 KCBqc1RhZ3MgKSApOworCQkJCQkJaSArPSBqc1RhZ3MubGVuZ3RoOworCQkJCQl9CisJCQkJfQor CQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9OworfQorCit2YXIgZXZlbnRBZGQgPSBqUXVl cnkuZXZlbnQuYWRkLAorCWV2ZW50UmVtb3ZlID0galF1ZXJ5LmV2ZW50LnJlbW92ZSwKKwlldmVu dFRyaWdnZXIgPSBqUXVlcnkuZXZlbnQudHJpZ2dlciwKKwlvbGRUb2dnbGUgPSBqUXVlcnkuZm4u dG9nZ2xlLAorCW9sZExpdmUgPSBqUXVlcnkuZm4ubGl2ZSwKKwlvbGREaWUgPSBqUXVlcnkuZm4u ZGllLAorCWFqYXhFdmVudHMgPSAiYWpheFN0YXJ0fGFqYXhTdG9wfGFqYXhTZW5kfGFqYXhDb21w bGV0ZXxhamF4RXJyb3J8YWpheFN1Y2Nlc3MiLAorCXJhamF4RXZlbnQgPSBuZXcgUmVnRXhwKCAi XFxiKD86IiArIGFqYXhFdmVudHMgKyAiKVxcYiIgKSwKKwlyaG92ZXJIYWNrID0gLyg/Ol58XHMp aG92ZXIoXC5cUyt8KVxiLywKKwlob3ZlckhhY2sgPSBmdW5jdGlvbiggZXZlbnRzICkgeworCQlp ZiAoIHR5cGVvZiggZXZlbnRzICkgIT09ICJzdHJpbmciIHx8IGpRdWVyeS5ldmVudC5zcGVjaWFs LmhvdmVyICkgeworCQkJcmV0dXJuIGV2ZW50czsKKwkJfQorCQlpZiAoIHJob3ZlckhhY2sudGVz dCggZXZlbnRzICkgKSB7CisJCQltaWdyYXRlV2FybigiJ2hvdmVyJyBwc2V1ZG8tZXZlbnQgaXMg ZGVwcmVjYXRlZCwgdXNlICdtb3VzZWVudGVyIG1vdXNlbGVhdmUnIik7CisJCX0KKwkJcmV0dXJu IGV2ZW50cyAmJiBldmVudHMucmVwbGFjZSggcmhvdmVySGFjaywgIm1vdXNlZW50ZXIkMSBtb3Vz ZWxlYXZlJDEiICk7CisJfTsKKworLy8gRXZlbnQgcHJvcHMgcmVtb3ZlZCBpbiAxLjksIHB1dCB0 aGVtIGJhY2sgaWYgbmVlZGVkOyBubyBwcmFjdGljYWwgd2F5IHRvIHdhcm4gdGhlbQoraWYgKCBq UXVlcnkuZXZlbnQucHJvcHMgJiYgalF1ZXJ5LmV2ZW50LnByb3BzWyAwIF0gIT09ICJhdHRyQ2hh bmdlIiApIHsKKwlqUXVlcnkuZXZlbnQucHJvcHMudW5zaGlmdCggImF0dHJDaGFuZ2UiLCAiYXR0 ck5hbWUiLCAicmVsYXRlZE5vZGUiLCAic3JjRWxlbWVudCIgKTsKK30KKworLy8gVW5kb2N1bWVu dGVkIGpRdWVyeS5ldmVudC5oYW5kbGUgd2FzICJkZXByZWNhdGVkIiBpbiBqUXVlcnkgMS43Citp ZiAoIGpRdWVyeS5ldmVudC5kaXNwYXRjaCApIHsKKwltaWdyYXRlV2FyblByb3AoIGpRdWVyeS5l dmVudCwgImhhbmRsZSIsIGpRdWVyeS5ldmVudC5kaXNwYXRjaCwgImpRdWVyeS5ldmVudC5oYW5k bGUgaXMgdW5kb2N1bWVudGVkIGFuZCBkZXByZWNhdGVkIiApOworfQorCisvLyBTdXBwb3J0IGZv ciAnaG92ZXInIHBzZXVkby1ldmVudCBhbmQgYWpheCBldmVudCB3YXJuaW5ncworalF1ZXJ5LmV2 ZW50LmFkZCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3Ig KXsKKwlpZiAoIGVsZW0gIT09IGRvY3VtZW50ICYmIHJhamF4RXZlbnQudGVzdCggdHlwZXMgKSAp IHsKKwkJbWlncmF0ZVdhcm4oICJBSkFYIGV2ZW50cyBzaG91bGQgYmUgYXR0YWNoZWQgdG8gZG9j dW1lbnQ6ICIgKyB0eXBlcyApOworCX0KKwlldmVudEFkZC5jYWxsKCB0aGlzLCBlbGVtLCBob3Zl ckhhY2soIHR5cGVzIHx8ICIiICksIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICk7Cit9OworalF1 ZXJ5LmV2ZW50LnJlbW92ZSA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0 b3IsIG1hcHBlZFR5cGVzICl7CisJZXZlbnRSZW1vdmUuY2FsbCggdGhpcywgZWxlbSwgaG92ZXJI YWNrKCB0eXBlcyApIHx8ICIiLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKTsKK307 CisKK2pRdWVyeS5mbi5lcnJvciA9IGZ1bmN0aW9uKCkgeworCXZhciBhcmdzID0gQXJyYXkucHJv dG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMCk7CisJbWlncmF0ZVdhcm4oImpRdWVyeS5m bi5lcnJvcigpIGlzIGRlcHJlY2F0ZWQiKTsKKwlhcmdzLnNwbGljZSggMCwgMCwgImVycm9yIiAp OworCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKKwkJcmV0dXJuIHRoaXMuYmluZC5hcHBseSgg dGhpcywgYXJncyApOworCX0KKwkvLyBlcnJvciBldmVudCBzaG91bGQgbm90IGJ1YmJsZSB0byB3 aW5kb3csIGFsdGhvdWdoIGl0IGRvZXMgcHJlLTEuNworCXRoaXMudHJpZ2dlckhhbmRsZXIuYXBw bHkoIHRoaXMsIGFyZ3MgKTsKKwlyZXR1cm4gdGhpczsKK307CisKK2pRdWVyeS5mbi50b2dnbGUg PSBmdW5jdGlvbiggZm4sIGZuMiApIHsKKworCS8vIERvbid0IG1lc3Mgd2l0aCBhbmltYXRpb24g b3IgY3NzIHRvZ2dsZXMKKwlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSB8fCAhalF1ZXJ5 LmlzRnVuY3Rpb24oIGZuMiApICkgeworCQlyZXR1cm4gb2xkVG9nZ2xlLmFwcGx5KCB0aGlzLCBh cmd1bWVudHMgKTsKKwl9CisJbWlncmF0ZVdhcm4oImpRdWVyeS5mbi50b2dnbGUoaGFuZGxlciwg aGFuZGxlci4uLikgaXMgZGVwcmVjYXRlZCIpOworCisJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJn dW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQorCXZhciBhcmdzID0gYXJndW1lbnRzLAorCQln dWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAorCQlpID0gMCwKKwkJdG9nZ2xlciA9IGZ1 bmN0aW9uKCBldmVudCApIHsKKwkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhl Y3V0ZQorCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5fZGF0YSggdGhpcywgImxhc3RUb2dn bGUiICsgZm4uZ3VpZCApIHx8IDAgKSAlIGk7CisJCQlqUXVlcnkuX2RhdGEoIHRoaXMsICJsYXN0 VG9nZ2xlIiArIGZuLmd1aWQsIGxhc3RUb2dnbGUgKyAxICk7CisKKwkJCS8vIE1ha2Ugc3VyZSB0 aGF0IGNsaWNrcyBzdG9wCisJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisJCQkvLyBhbmQg ZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkJCXJldHVybiBhcmdzWyBsYXN0VG9nZ2xlIF0uYXBwbHko IHRoaXMsIGFyZ3VtZW50cyApIHx8IGZhbHNlOworCQl9OworCisJLy8gbGluayBhbGwgdGhlIGZ1 bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKKwl0 b2dnbGVyLmd1aWQgPSBndWlkOworCXdoaWxlICggaSA8IGFyZ3MubGVuZ3RoICkgeworCQlhcmdz WyBpKysgXS5ndWlkID0gZ3VpZDsKKwl9CisKKwlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciAp OworfTsKKworalF1ZXJ5LmZuLmxpdmUgPSBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkgewor CW1pZ3JhdGVXYXJuKCJqUXVlcnkuZm4ubGl2ZSgpIGlzIGRlcHJlY2F0ZWQiKTsKKwlpZiAoIG9s ZExpdmUgKSB7CisJCXJldHVybiBvbGRMaXZlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwl9 CisJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vbiggdHlwZXMsIHRoaXMuc2VsZWN0b3IsIGRhdGEs IGZuICk7CisJcmV0dXJuIHRoaXM7Cit9OworCitqUXVlcnkuZm4uZGllID0gZnVuY3Rpb24oIHR5 cGVzLCBmbiApIHsKKwltaWdyYXRlV2FybigialF1ZXJ5LmZuLmRpZSgpIGlzIGRlcHJlY2F0ZWQi KTsKKwlpZiAoIG9sZERpZSApIHsKKwkJcmV0dXJuIG9sZERpZS5hcHBseSggdGhpcywgYXJndW1l bnRzICk7CisJfQorCWpRdWVyeSggdGhpcy5jb250ZXh0ICkub2ZmKCB0eXBlcywgdGhpcy5zZWxl Y3RvciB8fCAiKioiLCBmbiApOworCXJldHVybiB0aGlzOworfTsKKworLy8gVHVybiBnbG9iYWwg ZXZlbnRzIGludG8gZG9jdW1lbnQtdHJpZ2dlcmVkIGV2ZW50cworalF1ZXJ5LmV2ZW50LnRyaWdn ZXIgPSBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyAgKXsKKwlpZiAo ICFlbGVtICYmICFyYWpheEV2ZW50LnRlc3QoIGV2ZW50ICkgKSB7CisJCW1pZ3JhdGVXYXJuKCAi R2xvYmFsIGV2ZW50cyBhcmUgdW5kb2N1bWVudGVkIGFuZCBkZXByZWNhdGVkIiApOworCX0KKwly ZXR1cm4gZXZlbnRUcmlnZ2VyLmNhbGwoIHRoaXMsICBldmVudCwgZGF0YSwgZWxlbSB8fCBkb2N1 bWVudCwgb25seUhhbmRsZXJzICApOworfTsKK2pRdWVyeS5lYWNoKCBhamF4RXZlbnRzLnNwbGl0 KCJ8IiksCisJZnVuY3Rpb24oIF8sIG5hbWUgKSB7CisJCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBu YW1lIF0gPSB7CisJCQlzZXR1cDogZnVuY3Rpb24oKSB7CisJCQkJdmFyIGVsZW0gPSB0aGlzOwor CisJCQkJLy8gVGhlIGRvY3VtZW50IG5lZWRzIG5vIHNoaW1taW5nOyBtdXN0IGJlICE9PSBmb3Ig b2xkSUUKKwkJCQlpZiAoIGVsZW0gIT09IGRvY3VtZW50ICkgeworCQkJCQlqUXVlcnkuZXZlbnQu YWRkKCBkb2N1bWVudCwgbmFtZSArICIuIiArIGpRdWVyeS5ndWlkLCBmdW5jdGlvbigpIHsKKwkJ CQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBuYW1lLCBudWxsLCBlbGVtLCB0cnVlICk7CisJCQkJ CX0pOworCQkJCQlqUXVlcnkuX2RhdGEoIHRoaXMsIG5hbWUsIGpRdWVyeS5ndWlkKysgKTsKKwkJ CQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSwKKwkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsK KwkJCQlpZiAoIHRoaXMgIT09IGRvY3VtZW50ICkgeworCQkJCQlqUXVlcnkuZXZlbnQucmVtb3Zl KCBkb2N1bWVudCwgbmFtZSArICIuIiArIGpRdWVyeS5fZGF0YSggdGhpcywgbmFtZSApICk7CisJ CQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CispOworCisKK30pKCBqUXVl cnksIHdpbmRvdyApOwpkaWZmIC0tZ2l0IGEvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9q cy9qcXVlcnkuYmEtaGFzaGNoYW5nZS5qcyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMv anMvanF1ZXJ5LmJhLWhhc2hjaGFuZ2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uNDcxMDVmNAotLS0gL2Rldi9udWxsCisrKyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9h c3NldHMvanMvanF1ZXJ5LmJhLWhhc2hjaGFuZ2UuanMKQEAgLTAsMCArMSwzOTAgQEAKKy8qIQor ICogalF1ZXJ5IGhhc2hjaGFuZ2UgZXZlbnQgLSB2MS4zIC0gNy8yMS8yMDEwCisgKiBodHRwOi8v YmVuYWxtYW4uY29tL3Byb2plY3RzL2pxdWVyeS1oYXNoY2hhbmdlLXBsdWdpbi8KKyAqIAorICog Q29weXJpZ2h0IChjKSAyMDEwICJDb3dib3kiIEJlbiBBbG1hbgorICogRHVhbCBsaWNlbnNlZCB1 bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCisgKiBodHRwOi8vYmVuYWxtYW4uY29tL2Fi b3V0L2xpY2Vuc2UvCisgKi8KKworLy8gU2NyaXB0OiBqUXVlcnkgaGFzaGNoYW5nZSBldmVudAor Ly8KKy8vICpWZXJzaW9uOiAxLjMsIExhc3QgdXBkYXRlZDogNy8yMS8yMDEwKgorLy8gCisvLyBQ cm9qZWN0IEhvbWUgLSBodHRwOi8vYmVuYWxtYW4uY29tL3Byb2plY3RzL2pxdWVyeS1oYXNoY2hh bmdlLXBsdWdpbi8KKy8vIEdpdEh1YiAgICAgICAtIGh0dHA6Ly9naXRodWIuY29tL2Nvd2JveS9q cXVlcnktaGFzaGNoYW5nZS8KKy8vIFNvdXJjZSAgICAgICAtIGh0dHA6Ly9naXRodWIuY29tL2Nv d2JveS9qcXVlcnktaGFzaGNoYW5nZS9yYXcvbWFzdGVyL2pxdWVyeS5iYS1oYXNoY2hhbmdlLmpz CisvLyAoTWluaWZpZWQpICAgLSBodHRwOi8vZ2l0aHViLmNvbS9jb3dib3kvanF1ZXJ5LWhhc2hj aGFuZ2UvcmF3L21hc3Rlci9qcXVlcnkuYmEtaGFzaGNoYW5nZS5taW4uanMgKDAuOGtiIGd6aXBw ZWQpCisvLyAKKy8vIEFib3V0OiBMaWNlbnNlCisvLyAKKy8vIENvcHlyaWdodCAoYykgMjAxMCAi Q293Ym95IiBCZW4gQWxtYW4sCisvLyBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQ TCBsaWNlbnNlcy4KKy8vIGh0dHA6Ly9iZW5hbG1hbi5jb20vYWJvdXQvbGljZW5zZS8KKy8vIAor Ly8gQWJvdXQ6IEV4YW1wbGVzCisvLyAKKy8vIFRoZXNlIHdvcmtpbmcgZXhhbXBsZXMsIGNvbXBs ZXRlIHdpdGggZnVsbHkgY29tbWVudGVkIGNvZGUsIGlsbHVzdHJhdGUgYSBmZXcKKy8vIHdheXMg aW4gd2hpY2ggdGhpcyBwbHVnaW4gY2FuIGJlIHVzZWQuCisvLyAKKy8vIGhhc2hjaGFuZ2UgZXZl bnQgLSBodHRwOi8vYmVuYWxtYW4uY29tL2NvZGUvcHJvamVjdHMvanF1ZXJ5LWhhc2hjaGFuZ2Uv ZXhhbXBsZXMvaGFzaGNoYW5nZS8KKy8vIGRvY3VtZW50LmRvbWFpbiAtIGh0dHA6Ly9iZW5hbG1h bi5jb20vY29kZS9wcm9qZWN0cy9qcXVlcnktaGFzaGNoYW5nZS9leGFtcGxlcy9kb2N1bWVudF9k b21haW4vCisvLyAKKy8vIEFib3V0OiBTdXBwb3J0IGFuZCBUZXN0aW5nCisvLyAKKy8vIEluZm9y bWF0aW9uIGFib3V0IHdoYXQgdmVyc2lvbiBvciB2ZXJzaW9ucyBvZiBqUXVlcnkgdGhpcyBwbHVn aW4gaGFzIGJlZW4KKy8vIHRlc3RlZCB3aXRoLCB3aGF0IGJyb3dzZXJzIGl0IGhhcyBiZWVuIHRl c3RlZCBpbiwgYW5kIHdoZXJlIHRoZSB1bml0IHRlc3RzCisvLyByZXNpZGUgKHNvIHlvdSBjYW4g dGVzdCBpdCB5b3Vyc2VsZikuCisvLyAKKy8vIGpRdWVyeSBWZXJzaW9ucyAtIDEuMi42LCAxLjMu MiwgMS40LjEsIDEuNC4yCisvLyBCcm93c2VycyBUZXN0ZWQgLSBJbnRlcm5ldCBFeHBsb3JlciA2 LTgsIEZpcmVmb3ggMi00LCBDaHJvbWUgNS02LCBTYWZhcmkgMy4yLTUsCisvLyAgICAgICAgICAg ICAgICAgICBPcGVyYSA5LjYtMTAuNjAsIGlQaG9uZSAzLjEsIEFuZHJvaWQgMS42LTIuMiwgQmxh Y2tCZXJyeSA0LjYtNS4KKy8vIFVuaXQgVGVzdHMgICAgICAtIGh0dHA6Ly9iZW5hbG1hbi5jb20v Y29kZS9wcm9qZWN0cy9qcXVlcnktaGFzaGNoYW5nZS91bml0LworLy8gCisvLyBBYm91dDogS25v d24gaXNzdWVzCisvLyAKKy8vIFdoaWxlIHRoaXMgalF1ZXJ5IGhhc2hjaGFuZ2UgZXZlbnQgaW1w bGVtZW50YXRpb24gaXMgcXVpdGUgc3RhYmxlIGFuZAorLy8gcm9idXN0LCB0aGVyZSBhcmUgYSBm ZXcgdW5mb3J0dW5hdGUgYnJvd3NlciBidWdzIHN1cnJvdW5kaW5nIGV4cGVjdGVkCisvLyBoYXNo Y2hhbmdlIGV2ZW50LWJhc2VkIGJlaGF2aW9ycywgaW5kZXBlbmRlbnQgb2YgYW55IEphdmFTY3Jp cHQKKy8vIHdpbmRvdy5vbmhhc2hjaGFuZ2UgYWJzdHJhY3Rpb24uIFNlZSB0aGUgZm9sbG93aW5n IGV4YW1wbGVzIGZvciBtb3JlCisvLyBpbmZvcm1hdGlvbjoKKy8vIAorLy8gQ2hyb21lOiBCYWNr IEJ1dHRvbiAtIGh0dHA6Ly9iZW5hbG1hbi5jb20vY29kZS9wcm9qZWN0cy9qcXVlcnktaGFzaGNo YW5nZS9leGFtcGxlcy9idWctY2hyb21lLWJhY2stYnV0dG9uLworLy8gRmlyZWZveDogUmVtb3Rl IFhNTEh0dHBSZXF1ZXN0IC0gaHR0cDovL2JlbmFsbWFuLmNvbS9jb2RlL3Byb2plY3RzL2pxdWVy eS1oYXNoY2hhbmdlL2V4YW1wbGVzL2J1Zy1maXJlZm94LXJlbW90ZS14aHIvCisvLyBXZWJLaXQ6 IEJhY2sgQnV0dG9uIGluIGFuIElmcmFtZSAtIGh0dHA6Ly9iZW5hbG1hbi5jb20vY29kZS9wcm9q ZWN0cy9qcXVlcnktaGFzaGNoYW5nZS9leGFtcGxlcy9idWctd2Via2l0LWhhc2gtaWZyYW1lLwor Ly8gU2FmYXJpOiBCYWNrIEJ1dHRvbiBmcm9tIGEgZGlmZmVyZW50IGRvbWFpbiAtIGh0dHA6Ly9i ZW5hbG1hbi5jb20vY29kZS9wcm9qZWN0cy9qcXVlcnktaGFzaGNoYW5nZS9leGFtcGxlcy9idWct c2FmYXJpLWJhY2stZnJvbS1kaWZmLWRvbWFpbi8KKy8vIAorLy8gQWxzbyBub3RlIHRoYXQgc2hv dWxkIGEgYnJvd3NlciBuYXRpdmVseSBzdXBwb3J0IHRoZSB3aW5kb3cub25oYXNoY2hhbmdlIAor Ly8gZXZlbnQsIGJ1dCBub3QgcmVwb3J0IHRoYXQgaXQgZG9lcywgdGhlIGZhbGxiYWNrIHBvbGxp bmcgbG9vcCB3aWxsIGJlIHVzZWQuCisvLyAKKy8vIEFib3V0OiBSZWxlYXNlIEhpc3RvcnkKKy8v IAorLy8gMS4zICAgLSAoNy8yMS8yMDEwKSBSZW9yZ2FuaXplZCBJRTYvNyBJZnJhbWUgY29kZSB0 byBtYWtlIGl0IG1vcmUKKy8vICAgICAgICAgInJlbW92YWJsZSIgZm9yIG1vYmlsZS1vbmx5IGRl dmVsb3BtZW50LiBBZGRlZCBJRTYvNyBkb2N1bWVudC50aXRsZQorLy8gICAgICAgICBzdXBwb3J0 LiBBdHRlbXB0ZWQgdG8gbWFrZSBJZnJhbWUgYXMgaGlkZGVuIGFzIHBvc3NpYmxlIGJ5IHVzaW5n CisvLyAgICAgICAgIHRlY2huaXF1ZXMgZnJvbSBodHRwOi8vd3d3LnBhY2llbGxvZ3JvdXAuY29t L2Jsb2cvP3A9NjA0LiBBZGRlZCAKKy8vICAgICAgICAgc3VwcG9ydCBmb3IgdGhlICJzaG9ydGN1 dCIgZm9ybWF0ICQod2luZG93KS5oYXNoY2hhbmdlKCBmbiApIGFuZAorLy8gICAgICAgICAkKHdp bmRvdykuaGFzaGNoYW5nZSgpIGxpa2UgalF1ZXJ5IHByb3ZpZGVzIGZvciBidWlsdC1pbiBldmVu dHMuCisvLyAgICAgICAgIFJlbmFtZWQgalF1ZXJ5Lmhhc2hjaGFuZ2VEZWxheSB0byA8alF1ZXJ5 LmZuLmhhc2hjaGFuZ2UuZGVsYXk+IGFuZAorLy8gICAgICAgICBsb3dlcmVkIGl0cyBkZWZhdWx0 IHZhbHVlIHRvIDUwLiBBZGRlZCA8alF1ZXJ5LmZuLmhhc2hjaGFuZ2UuZG9tYWluPgorLy8gICAg ICAgICBhbmQgPGpRdWVyeS5mbi5oYXNoY2hhbmdlLnNyYz4gcHJvcGVydGllcyBwbHVzIGRvY3Vt ZW50LWRvbWFpbi5odG1sCisvLyAgICAgICAgIGZpbGUgdG8gYWRkcmVzcyBhY2Nlc3MgZGVuaWVk IGlzc3VlcyB3aGVuIHNldHRpbmcgZG9jdW1lbnQuZG9tYWluIGluCisvLyAgICAgICAgIElFNi83 LgorLy8gMS4yICAgLSAoMi8xMS8yMDEwKSBGaXhlZCBhIGJ1ZyB3aGVyZSBjb21pbmcgYmFjayB0 byBhIHBhZ2UgdXNpbmcgdGhpcyBwbHVnaW4KKy8vICAgICAgICAgZnJvbSBhIHBhZ2Ugb24gYW5v dGhlciBkb21haW4gd291bGQgY2F1c2UgYW4gZXJyb3IgaW4gU2FmYXJpIDQuIEFsc28sCisvLyAg ICAgICAgIElFNi83IElmcmFtZSBpcyBub3cgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGJvZHkgKHRoaXMg YWN0dWFsbHkgd29ya3MpLAorLy8gICAgICAgICB3aGljaCBwcmV2ZW50cyB0aGUgcGFnZSBmcm9t IHNjcm9sbGluZyB3aGVuIHRoZSBldmVudCBpcyBmaXJzdCBib3VuZC4KKy8vICAgICAgICAgRXZl bnQgY2FuIGFsc28gbm93IGJlIGJvdW5kIGJlZm9yZSBET00gcmVhZHksIGJ1dCBpdCB3b24ndCBi ZSB1c2FibGUKKy8vICAgICAgICAgYmVmb3JlIHRoZW4gaW4gSUU2LzcuCisvLyAxLjEgICAtICgx LzIxLzIwMTApIEluY29ycG9yYXRlZCBkb2N1bWVudC5kb2N1bWVudE1vZGUgdGVzdCB0byBmaXgg SUU4IGJ1ZworLy8gICAgICAgICB3aGVyZSBicm93c2VyIHZlcnNpb24gaXMgaW5jb3JyZWN0bHkg cmVwb3J0ZWQgYXMgOC4wLCBkZXNwaXRlCisvLyAgICAgICAgIGluY2x1c2lvbiBvZiB0aGUgWC1V QS1Db21wYXRpYmxlIElFPUVtdWxhdGVJRTcgbWV0YSB0YWcuCisvLyAxLjAgICAtICgxLzkvMjAx MCkgSW5pdGlhbCBSZWxlYXNlLiBCcm9rZSBvdXQgdGhlIGpRdWVyeSBCQlEgZXZlbnQuc3BlY2lh bAorLy8gICAgICAgICB3aW5kb3cub25oYXNoY2hhbmdlIGZ1bmN0aW9uYWxpdHkgaW50byBhIHNl cGFyYXRlIHBsdWdpbiBmb3IgdXNlcnMKKy8vICAgICAgICAgd2hvIHdhbnQganVzdCB0aGUgYmFz aWMgZXZlbnQgJiBiYWNrIGJ1dHRvbiBzdXBwb3J0LCB3aXRob3V0IGFsbCB0aGUKKy8vICAgICAg ICAgZXh0cmEgYXdlc29tZW5lc3MgdGhhdCBCQlEgcHJvdmlkZXMuIFRoaXMgcGx1Z2luIHdpbGwg YmUgaW5jbHVkZWQgYXMKKy8vICAgICAgICAgcGFydCBvZiBqUXVlcnkgQkJRLCBidXQgYWxzbyBi ZSBhdmFpbGFibGUgc2VwYXJhdGVseS4KKworKGZ1bmN0aW9uKCQsd2luZG93LHVuZGVmaW5lZCl7 CisgICckOm5vbXVuZ2UnOyAvLyBVc2VkIGJ5IFlVSSBjb21wcmVzc29yLgorICAKKyAgLy8gUmV1 c2VkIHN0cmluZy4KKyAgdmFyIHN0cl9oYXNoY2hhbmdlID0gJ2hhc2hjaGFuZ2UnLAorICAgIAor ICAgIC8vIE1ldGhvZCAvIG9iamVjdCByZWZlcmVuY2VzLgorICAgIGRvYyA9IGRvY3VtZW50LAor ICAgIGZha2Vfb25oYXNoY2hhbmdlLAorICAgIHNwZWNpYWwgPSAkLmV2ZW50LnNwZWNpYWwsCisg ICAgCisgICAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IHdpbmRvdy5vbmhhc2hjaGFuZ2U/ IE5vdGUgdGhhdCBJRTggcnVubmluZyBpbgorICAgIC8vIElFNyBjb21wYXRpYmlsaXR5IG1vZGUg cmVwb3J0cyB0cnVlIGZvciAnb25oYXNoY2hhbmdlJyBpbiB3aW5kb3csIGV2ZW4KKyAgICAvLyB0 aG91Z2ggdGhlIGV2ZW50IGlzbid0IHN1cHBvcnRlZCwgc28gYWxzbyB0ZXN0IGRvY3VtZW50LmRv Y3VtZW50TW9kZS4KKyAgICBkb2NfbW9kZSA9IGRvYy5kb2N1bWVudE1vZGUsCisgICAgc3VwcG9y dHNfb25oYXNoY2hhbmdlID0gJ29uJyArIHN0cl9oYXNoY2hhbmdlIGluIHdpbmRvdyAmJiAoIGRv Y19tb2RlID09PSB1bmRlZmluZWQgfHwgZG9jX21vZGUgPiA3ICk7CisgIAorICAvLyBHZXQgbG9j YXRpb24uaGFzaCAob3Igd2hhdCB5b3UnZCBleHBlY3QgbG9jYXRpb24uaGFzaCB0byBiZSkgc2Fu cyBhbnkKKyAgLy8gbGVhZGluZyAjLiBUaGFua3MgZm9yIG1ha2luZyB0aGlzIG5lY2Vzc2FyeSwg RmlyZWZveCEKKyAgZnVuY3Rpb24gZ2V0X2ZyYWdtZW50KCB1cmwgKSB7CisgICAgdXJsID0gdXJs IHx8IGxvY2F0aW9uLmhyZWY7CisgICAgcmV0dXJuICcjJyArIHVybC5yZXBsYWNlKCAvXlteI10q Iz8oLiopJC8sICckMScgKTsKKyAgfTsKKyAgCisgIC8vIE1ldGhvZDogalF1ZXJ5LmZuLmhhc2hj aGFuZ2UKKyAgLy8gCisgIC8vIEJpbmQgYSBoYW5kbGVyIHRvIHRoZSB3aW5kb3cub25oYXNoY2hh bmdlIGV2ZW50IG9yIHRyaWdnZXIgYWxsIGJvdW5kCisgIC8vIHdpbmRvdy5vbmhhc2hjaGFuZ2Ug ZXZlbnQgaGFuZGxlcnMuIFRoaXMgYmVoYXZpb3IgaXMgY29uc2lzdGVudCB3aXRoCisgIC8vIGpR dWVyeSdzIGJ1aWx0LWluIGV2ZW50IGhhbmRsZXJzLgorICAvLyAKKyAgLy8gVXNhZ2U6CisgIC8v IAorICAvLyA+IGpRdWVyeSh3aW5kb3cpLmhhc2hjaGFuZ2UoIFsgaGFuZGxlciBdICk7CisgIC8v IAorICAvLyBBcmd1bWVudHM6CisgIC8vIAorICAvLyAgaGFuZGxlciAtIChGdW5jdGlvbikgT3B0 aW9uYWwgaGFuZGxlciB0byBiZSBib3VuZCB0byB0aGUgaGFzaGNoYW5nZQorICAvLyAgICBldmVu dC4gVGhpcyBpcyBhICJzaG9ydGN1dCIgZm9yIHRoZSBtb3JlIHZlcmJvc2UgZm9ybToKKyAgLy8g ICAgalF1ZXJ5KHdpbmRvdykuYmluZCggJ2hhc2hjaGFuZ2UnLCBoYW5kbGVyICkuIElmIGhhbmRs ZXIgaXMgb21pdHRlZCwKKyAgLy8gICAgYWxsIGJvdW5kIHdpbmRvdy5vbmhhc2hjaGFuZ2UgZXZl bnQgaGFuZGxlcnMgd2lsbCBiZSB0cmlnZ2VyZWQuIFRoaXMKKyAgLy8gICAgaXMgYSBzaG9ydGN1 dCBmb3IgdGhlIG1vcmUgdmVyYm9zZQorICAvLyAgICBqUXVlcnkod2luZG93KS50cmlnZ2VyKCAn aGFzaGNoYW5nZScgKS4gVGhlc2UgZm9ybXMgYXJlIGRlc2NyaWJlZCBpbgorICAvLyAgICB0aGUg PGhhc2hjaGFuZ2UgZXZlbnQ+IHNlY3Rpb24uCisgIC8vIAorICAvLyBSZXR1cm5zOgorICAvLyAK KyAgLy8gIChqUXVlcnkpIFRoZSBpbml0aWFsIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRz LgorICAKKyAgLy8gQWxsb3cgdGhlICJzaG9ydGN1dCIgZm9ybWF0ICQoZWxlbSkuaGFzaGNoYW5n ZSggZm4gKSBmb3IgYmluZGluZyBhbmQKKyAgLy8gJChlbGVtKS5oYXNoY2hhbmdlKCkgZm9yIHRy aWdnZXJpbmcsIGxpa2UgalF1ZXJ5IGRvZXMgZm9yIGJ1aWx0LWluIGV2ZW50cy4KKyAgJC5mblsg c3RyX2hhc2hjaGFuZ2UgXSA9IGZ1bmN0aW9uKCBmbiApIHsKKyAgICByZXR1cm4gZm4gPyB0aGlz LmJpbmQoIHN0cl9oYXNoY2hhbmdlLCBmbiApIDogdGhpcy50cmlnZ2VyKCBzdHJfaGFzaGNoYW5n ZSApOworICB9OworICAKKyAgLy8gUHJvcGVydHk6IGpRdWVyeS5mbi5oYXNoY2hhbmdlLmRlbGF5 CisgIC8vIAorICAvLyBUaGUgbnVtZXJpYyBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSBhdCB3 aGljaCB0aGUgPGhhc2hjaGFuZ2UgZXZlbnQ+CisgIC8vIHBvbGxpbmcgbG9vcCBleGVjdXRlcy4g RGVmYXVsdHMgdG8gNTAuCisgIAorICAvLyBQcm9wZXJ0eTogalF1ZXJ5LmZuLmhhc2hjaGFuZ2Uu ZG9tYWluCisgIC8vIAorICAvLyBJZiB5b3UncmUgc2V0dGluZyBkb2N1bWVudC5kb21haW4gaW4g eW91ciBKYXZhU2NyaXB0LCBhbmQgeW91IHdhbnQgaGFzaAorICAvLyBoaXN0b3J5IHRvIHdvcmsg aW4gSUU2LzcsIG5vdCBvbmx5IG11c3QgdGhpcyBwcm9wZXJ0eSBiZSBzZXQsIGJ1dCB5b3UgbXVz dAorICAvLyBhbHNvIHNldCBkb2N1bWVudC5kb21haW4gQkVGT1JFIGpRdWVyeSBpcyBsb2FkZWQg aW50byB0aGUgcGFnZS4gVGhpcworICAvLyBwcm9wZXJ0eSBpcyBvbmx5IGFwcGxpY2FibGUgaWYg eW91IGFyZSBzdXBwb3J0aW5nIElFNi83IChvciBJRTggb3BlcmF0aW5nCisgIC8vIGluICJJRTcg Y29tcGF0aWJpbGl0eSIgbW9kZSkuCisgIC8vIAorICAvLyBJbiBhZGRpdGlvbiwgdGhlIDxqUXVl cnkuZm4uaGFzaGNoYW5nZS5zcmM+IHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIHRoZQorICAvLyBw YXRoIG9mIHRoZSBpbmNsdWRlZCAiZG9jdW1lbnQtZG9tYWluLmh0bWwiIGZpbGUsIHdoaWNoIGNh biBiZSByZW5hbWVkIG9yCisgIC8vIG1vZGlmaWVkIGlmIG5lY2Vzc2FyeSAobm90ZSB0aGF0IHRo ZSBkb2N1bWVudC5kb21haW4gc3BlY2lmaWVkIG11c3QgYmUgdGhlCisgIC8vIHNhbWUgaW4gYm90 aCB5b3VyIG1haW4gSmF2YVNjcmlwdCBhcyB3ZWxsIGFzIGluIHRoaXMgZmlsZSkuCisgIC8vIAor ICAvLyBVc2FnZToKKyAgLy8gCisgIC8vIGpRdWVyeS5mbi5oYXNoY2hhbmdlLmRvbWFpbiA9IGRv Y3VtZW50LmRvbWFpbjsKKyAgCisgIC8vIFByb3BlcnR5OiBqUXVlcnkuZm4uaGFzaGNoYW5nZS5z cmMKKyAgLy8gCisgIC8vIElmLCBmb3Igc29tZSByZWFzb24sIHlvdSBuZWVkIHRvIHNwZWNpZnkg YW4gSWZyYW1lIHNyYyBmaWxlIChmb3IgZXhhbXBsZSwKKyAgLy8gd2hlbiBzZXR0aW5nIGRvY3Vt ZW50LmRvbWFpbiBhcyBpbiA8alF1ZXJ5LmZuLmhhc2hjaGFuZ2UuZG9tYWluPiksIHlvdSBjYW4K KyAgLy8gZG8gc28gdXNpbmcgdGhpcyBwcm9wZXJ0eS4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhp cyBwcm9wZXJ0eSwgaGlzdG9yeQorICAvLyB3b24ndCBiZSByZWNvcmRlZCBpbiBJRTYvNyB1bnRp bCB0aGUgSWZyYW1lIHNyYyBmaWxlIGxvYWRzLiBUaGlzIHByb3BlcnR5CisgIC8vIGlzIG9ubHkg YXBwbGljYWJsZSBpZiB5b3UgYXJlIHN1cHBvcnRpbmcgSUU2LzcgKG9yIElFOCBvcGVyYXRpbmcg aW4gIklFNworICAvLyBjb21wYXRpYmlsaXR5IiBtb2RlKS4KKyAgLy8gCisgIC8vIFVzYWdlOgor ICAvLyAKKyAgLy8galF1ZXJ5LmZuLmhhc2hjaGFuZ2Uuc3JjID0gJ3BhdGgvdG8vZmlsZS5odG1s JzsKKyAgCisgICQuZm5bIHN0cl9oYXNoY2hhbmdlIF0uZGVsYXkgPSA1MDsKKyAgLyoKKyAgJC5m blsgc3RyX2hhc2hjaGFuZ2UgXS5kb21haW4gPSBudWxsOworICAkLmZuWyBzdHJfaGFzaGNoYW5n ZSBdLnNyYyA9IG51bGw7CisgICovCisgIAorICAvLyBFdmVudDogaGFzaGNoYW5nZSBldmVudAor ICAvLyAKKyAgLy8gRmlyZWQgd2hlbiBsb2NhdGlvbi5oYXNoIGNoYW5nZXMuIEluIGJyb3dzZXJz IHRoYXQgc3VwcG9ydCBpdCwgdGhlIG5hdGl2ZQorICAvLyBIVE1MNSB3aW5kb3cub25oYXNoY2hh bmdlIGV2ZW50IGlzIHVzZWQsIG90aGVyd2lzZSBhIHBvbGxpbmcgbG9vcCBpcworICAvLyBpbml0 aWFsaXplZCwgcnVubmluZyBldmVyeSA8alF1ZXJ5LmZuLmhhc2hjaGFuZ2UuZGVsYXk+IG1pbGxp c2Vjb25kcyB0bworICAvLyBzZWUgaWYgdGhlIGhhc2ggaGFzIGNoYW5nZWQuIEluIElFNi83IChh bmQgSUU4IG9wZXJhdGluZyBpbiAiSUU3CisgIC8vIGNvbXBhdGliaWxpdHkiIG1vZGUpLCBhIGhp ZGRlbiBJZnJhbWUgaXMgY3JlYXRlZCB0byBhbGxvdyB0aGUgYmFjayBidXR0b24KKyAgLy8gYW5k IGhhc2gtYmFzZWQgaGlzdG9yeSB0byB3b3JrLgorICAvLyAKKyAgLy8gVXNhZ2UgYXMgZGVzY3Jp YmVkIGluIDxqUXVlcnkuZm4uaGFzaGNoYW5nZT46CisgIC8vIAorICAvLyA+IC8vIEJpbmQgYW4g ZXZlbnQgaGFuZGxlci4KKyAgLy8gPiBqUXVlcnkod2luZG93KS5oYXNoY2hhbmdlKCBmdW5jdGlv bihlKSB7CisgIC8vID4gICB2YXIgaGFzaCA9IGxvY2F0aW9uLmhhc2g7CisgIC8vID4gICAuLi4K KyAgLy8gPiB9KTsKKyAgLy8gPiAKKyAgLy8gPiAvLyBNYW51YWxseSB0cmlnZ2VyIHRoZSBldmVu dCBoYW5kbGVyLgorICAvLyA+IGpRdWVyeSh3aW5kb3cpLmhhc2hjaGFuZ2UoKTsKKyAgLy8gCisg IC8vIEEgbW9yZSB2ZXJib3NlIHVzYWdlIHRoYXQgYWxsb3dzIGZvciBldmVudCBuYW1lc3BhY2lu ZzoKKyAgLy8gCisgIC8vID4gLy8gQmluZCBhbiBldmVudCBoYW5kbGVyLgorICAvLyA+IGpRdWVy eSh3aW5kb3cpLmJpbmQoICdoYXNoY2hhbmdlJywgZnVuY3Rpb24oZSkgeworICAvLyA+ICAgdmFy IGhhc2ggPSBsb2NhdGlvbi5oYXNoOworICAvLyA+ICAgLi4uCisgIC8vID4gfSk7CisgIC8vID4g CisgIC8vID4gLy8gTWFudWFsbHkgdHJpZ2dlciB0aGUgZXZlbnQgaGFuZGxlci4KKyAgLy8gPiBq UXVlcnkod2luZG93KS50cmlnZ2VyKCAnaGFzaGNoYW5nZScgKTsKKyAgLy8gCisgIC8vIEFkZGl0 aW9uYWwgTm90ZXM6CisgIC8vIAorICAvLyAqIFRoZSBwb2xsaW5nIGxvb3AgYW5kIElmcmFtZSBh cmUgbm90IGNyZWF0ZWQgdW50aWwgYXQgbGVhc3Qgb25lIGhhbmRsZXIKKyAgLy8gICBpcyBhY3R1 YWxseSBib3VuZCB0byB0aGUgJ2hhc2hjaGFuZ2UnIGV2ZW50LgorICAvLyAqIElmIHlvdSBuZWVk IHRoZSBib3VuZCBoYW5kbGVyKHMpIHRvIGV4ZWN1dGUgaW1tZWRpYXRlbHksIGluIGNhc2VzIHdo ZXJlCisgIC8vICAgYSBsb2NhdGlvbi5oYXNoIGV4aXN0cyBvbiBwYWdlIGxvYWQsIHZpYSBib29r bWFyayBvciBwYWdlIHJlZnJlc2ggZm9yCisgIC8vICAgZXhhbXBsZSwgdXNlIGpRdWVyeSh3aW5k b3cpLmhhc2hjaGFuZ2UoKSBvciB0aGUgbW9yZSB2ZXJib3NlIAorICAvLyAgIGpRdWVyeSh3aW5k b3cpLnRyaWdnZXIoICdoYXNoY2hhbmdlJyApLgorICAvLyAqIFRoZSBldmVudCBjYW4gYmUgYm91 bmQgYmVmb3JlIERPTSByZWFkeSwgYnV0IHNpbmNlIGl0IHdvbid0IGJlIHVzYWJsZQorICAvLyAg IGJlZm9yZSB0aGVuIGluIElFNi83IChkdWUgdG8gdGhlIG5lY2Vzc2FyeSBJZnJhbWUpLCByZWNv bW1lbmRlZCB1c2FnZSBpcworICAvLyAgIHRvIGJpbmQgaXQgaW5zaWRlIGEgRE9NIHJlYWR5IGhh bmRsZXIuCisgIAorICAvLyBPdmVycmlkZSBleGlzdGluZyAkLmV2ZW50LnNwZWNpYWwuaGFzaGNo YW5nZSBtZXRob2RzIChhbGxvd2luZyB0aGlzIHBsdWdpbgorICAvLyB0byBiZSBkZWZpbmVkIGFm dGVyIGpRdWVyeSBCQlEgaW4gQkJRJ3Mgc291cmNlIGNvZGUpLgorICBzcGVjaWFsWyBzdHJfaGFz aGNoYW5nZSBdID0gJC5leHRlbmQoIHNwZWNpYWxbIHN0cl9oYXNoY2hhbmdlIF0sIHsKKyAgICAK KyAgICAvLyBDYWxsZWQgb25seSB3aGVuIHRoZSBmaXJzdCAnaGFzaGNoYW5nZScgZXZlbnQgaXMg Ym91bmQgdG8gd2luZG93LgorICAgIHNldHVwOiBmdW5jdGlvbigpIHsKKyAgICAgIC8vIElmIHdp bmRvdy5vbmhhc2hjaGFuZ2UgaXMgc3VwcG9ydGVkIG5hdGl2ZWx5LCB0aGVyZSdzIG5vdGhpbmcg dG8gZG8uLgorICAgICAgaWYgKCBzdXBwb3J0c19vbmhhc2hjaGFuZ2UgKSB7IHJldHVybiBmYWxz ZTsgfQorICAgICAgCisgICAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gY3JlYXRlIG91ciBv d24uIEFuZCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcworICAgICAgLy8gdW50aWwgdGhlIHVz ZXIgYmluZHMgdG8gdGhlIGV2ZW50LCBqdXN0IGluIGNhc2UgdGhleSBuZXZlciBkbywgc2luY2Ug aXQKKyAgICAgIC8vIHdpbGwgY3JlYXRlIGEgcG9sbGluZyBsb29wIGFuZCBwb3NzaWJseSBldmVu IGEgaGlkZGVuIElmcmFtZS4KKyAgICAgICQoIGZha2Vfb25oYXNoY2hhbmdlLnN0YXJ0ICk7Cisg ICAgfSwKKyAgICAKKyAgICAvLyBDYWxsZWQgb25seSB3aGVuIHRoZSBsYXN0ICdoYXNoY2hhbmdl JyBldmVudCBpcyB1bmJvdW5kIGZyb20gd2luZG93LgorICAgIHRlYXJkb3duOiBmdW5jdGlvbigp IHsKKyAgICAgIC8vIElmIHdpbmRvdy5vbmhhc2hjaGFuZ2UgaXMgc3VwcG9ydGVkIG5hdGl2ZWx5 LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uLgorICAgICAgaWYgKCBzdXBwb3J0c19vbmhhc2hjaGFu Z2UgKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgCisgICAgICAvLyBPdGhlcndpc2UsIHdlIG5l ZWQgdG8gc3RvcCBvdXJzIChpZiBwb3NzaWJsZSkuCisgICAgICAkKCBmYWtlX29uaGFzaGNoYW5n ZS5zdG9wICk7CisgICAgfQorICAgIAorICB9KTsKKyAgCisgIC8vIGZha2Vfb25oYXNoY2hhbmdl IGRvZXMgYWxsIHRoZSB3b3JrIG9mIHRyaWdnZXJpbmcgdGhlIHdpbmRvdy5vbmhhc2hjaGFuZ2UK KyAgLy8gZXZlbnQgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdCwg aW5jbHVkaW5nIGNyZWF0aW5nIGEKKyAgLy8gcG9sbGluZyBsb29wIHRvIHdhdGNoIGZvciBoYXNo IGNoYW5nZXMgYW5kIGluIElFIDYvNyBjcmVhdGluZyBhIGhpZGRlbgorICAvLyBJZnJhbWUgdG8g ZW5hYmxlIGJhY2sgYW5kIGZvcndhcmQuCisgIGZha2Vfb25oYXNoY2hhbmdlID0gKGZ1bmN0aW9u KCl7CisgICAgdmFyIHNlbGYgPSB7fSwKKyAgICAgIHRpbWVvdXRfaWQsCisgICAgICAKKyAgICAg IC8vIFJlbWVtYmVyIHRoZSBpbml0aWFsIGhhc2ggc28gaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVk IGltbWVkaWF0ZWx5LgorICAgICAgbGFzdF9oYXNoID0gZ2V0X2ZyYWdtZW50KCksCisgICAgICAK KyAgICAgIGZuX3JldHZhbCA9IGZ1bmN0aW9uKHZhbCl7IHJldHVybiB2YWw7IH0sCisgICAgICBo aXN0b3J5X3NldCA9IGZuX3JldHZhbCwKKyAgICAgIGhpc3RvcnlfZ2V0ID0gZm5fcmV0dmFsOwor ICAgIAorICAgIC8vIFN0YXJ0IHRoZSBwb2xsaW5nIGxvb3AuCisgICAgc2VsZi5zdGFydCA9IGZ1 bmN0aW9uKCkgeworICAgICAgdGltZW91dF9pZCB8fCBwb2xsKCk7CisgICAgfTsKKyAgICAKKyAg ICAvLyBTdG9wIHRoZSBwb2xsaW5nIGxvb3AuCisgICAgc2VsZi5zdG9wID0gZnVuY3Rpb24oKSB7 CisgICAgICB0aW1lb3V0X2lkICYmIGNsZWFyVGltZW91dCggdGltZW91dF9pZCApOworICAgICAg dGltZW91dF9pZCA9IHVuZGVmaW5lZDsKKyAgICB9OworICAgIAorICAgIC8vIFRoaXMgcG9sbGlu ZyBsb29wIGNoZWNrcyBldmVyeSAkLmZuLmhhc2hjaGFuZ2UuZGVsYXkgbWlsbGlzZWNvbmRzIHRv IHNlZQorICAgIC8vIGlmIGxvY2F0aW9uLmhhc2ggaGFzIGNoYW5nZWQsIGFuZCB0cmlnZ2VycyB0 aGUgJ2hhc2hjaGFuZ2UnIGV2ZW50IG9uCisgICAgLy8gd2luZG93IHdoZW4gbmVjZXNzYXJ5Lgor ICAgIGZ1bmN0aW9uIHBvbGwoKSB7CisgICAgICB2YXIgaGFzaCA9IGdldF9mcmFnbWVudCgpLAor ICAgICAgICBoaXN0b3J5X2hhc2ggPSBoaXN0b3J5X2dldCggbGFzdF9oYXNoICk7CisgICAgICAK KyAgICAgIGlmICggaGFzaCAhPT0gbGFzdF9oYXNoICkgeworICAgICAgICBoaXN0b3J5X3NldCgg bGFzdF9oYXNoID0gaGFzaCwgaGlzdG9yeV9oYXNoICk7CisgICAgICAgIAorICAgICAgICAkKHdp bmRvdykudHJpZ2dlciggc3RyX2hhc2hjaGFuZ2UgKTsKKyAgICAgICAgCisgICAgICB9IGVsc2Ug aWYgKCBoaXN0b3J5X2hhc2ggIT09IGxhc3RfaGFzaCApIHsKKyAgICAgICAgbG9jYXRpb24uaHJl ZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSggLyMuKi8sICcnICkgKyBoaXN0b3J5X2hhc2g7Cisg ICAgICB9CisgICAgICAKKyAgICAgIHRpbWVvdXRfaWQgPSBzZXRUaW1lb3V0KCBwb2xsLCAkLmZu WyBzdHJfaGFzaGNoYW5nZSBdLmRlbGF5ICk7CisgICAgfTsKKyAgICAKKyAgICAvLyB2dnZ2dnZ2 dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2 dnZ2dnZ2dnYKKyAgICAvLyB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2IFJFTU9WRSBJRiBOT1QgU1VQUE9S VElORyBJRTYvNy84IHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYKKyAgICAvLyB2dnZ2dnZ2dnZ2dnZ2dnZ2 dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYK KyAgICAkLmJyb3dzZXIubXNpZSAmJiAhc3VwcG9ydHNfb25oYXNoY2hhbmdlICYmIChmdW5jdGlv bigpeworICAgICAgLy8gTm90IG9ubHkgZG8gSUU2LzcgbmVlZCB0aGUgIm1hZ2ljYWwiIElmcmFt ZSB0cmVhdG1lbnQsIGJ1dCBzbyBkb2VzIElFOAorICAgICAgLy8gd2hlbiBydW5uaW5nIGluICJJ RTcgY29tcGF0aWJpbGl0eSIgbW9kZS4KKyAgICAgIAorICAgICAgdmFyIGlmcmFtZSwKKyAgICAg ICAgaWZyYW1lX3NyYzsKKyAgICAgIAorICAgICAgLy8gV2hlbiB0aGUgZXZlbnQgaXMgYm91bmQg YW5kIHBvbGxpbmcgc3RhcnRzIGluIElFIDYvNywgY3JlYXRlIGEgaGlkZGVuCisgICAgICAvLyBJ ZnJhbWUgZm9yIGhpc3RvcnkgaGFuZGxpbmcuCisgICAgICBzZWxmLnN0YXJ0ID0gZnVuY3Rpb24o KXsKKyAgICAgICAgaWYgKCAhaWZyYW1lICkgeworICAgICAgICAgIGlmcmFtZV9zcmMgPSAkLmZu WyBzdHJfaGFzaGNoYW5nZSBdLnNyYzsKKyAgICAgICAgICBpZnJhbWVfc3JjID0gaWZyYW1lX3Ny YyAmJiBpZnJhbWVfc3JjICsgZ2V0X2ZyYWdtZW50KCk7CisgICAgICAgICAgCisgICAgICAgICAg Ly8gQ3JlYXRlIGhpZGRlbiBJZnJhbWUuIEF0dGVtcHQgdG8gbWFrZSBJZnJhbWUgYXMgaGlkZGVu IGFzIHBvc3NpYmxlCisgICAgICAgICAgLy8gYnkgdXNpbmcgdGVjaG5pcXVlcyBmcm9tIGh0dHA6 Ly93d3cucGFjaWVsbG9ncm91cC5jb20vYmxvZy8/cD02MDQuCisgICAgICAgICAgaWZyYW1lID0g JCgnPGlmcmFtZSB0YWJpbmRleD0iLTEiIHRpdGxlPSJlbXB0eSIvPicpLmhpZGUoKQorICAgICAg ICAgICAgCisgICAgICAgICAgICAvLyBXaGVuIElmcmFtZSBoYXMgY29tcGxldGVseSBsb2FkZWQs IGluaXRpYWxpemUgdGhlIGhpc3RvcnkgYW5kCisgICAgICAgICAgICAvLyBzdGFydCBwb2xsaW5n LgorICAgICAgICAgICAgLm9uZSggJ2xvYWQnLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICBp ZnJhbWVfc3JjIHx8IGhpc3Rvcnlfc2V0KCBnZXRfZnJhZ21lbnQoKSApOworICAgICAgICAgICAg ICBwb2xsKCk7CisgICAgICAgICAgICB9KQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBM b2FkIElmcmFtZSBzcmMgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2Ugbm90aGluZy4KKyAgICAgICAg ICAgIC5hdHRyKCAnc3JjJywgaWZyYW1lX3NyYyB8fCAnamF2YXNjcmlwdDowJyApCisgICAgICAg ICAgICAKKyAgICAgICAgICAgIC8vIEFwcGVuZCBJZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUg Ym9keSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5CisgICAgICAgICAgICAvLyBpbml0aWFsIHBhZ2Ug c2Nyb2xsaW5nICh5ZXMsIHRoaXMgd29ya3MpLgorICAgICAgICAgICAgLmluc2VydEFmdGVyKCAn Ym9keScgKVswXS5jb250ZW50V2luZG93OworICAgICAgICAgIAorICAgICAgICAgIC8vIFdoZW5l dmVyIGBkb2N1bWVudC50aXRsZWAgY2hhbmdlcywgdXBkYXRlIHRoZSBJZnJhbWUncyB0aXRsZSB0 bworICAgICAgICAgIC8vIHByZXR0aWZ5IHRoZSBiYWNrL25leHQgaGlzdG9yeSBtZW51IGVudHJp ZXMuIFNpbmNlIElFIHNvbWV0aW1lcworICAgICAgICAgIC8vIGVycm9ycyB3aXRoICJVbnNwZWNp ZmllZCBlcnJvciIgdGhlIHZlcnkgZmlyc3QgdGltZSB0aGlzIGlzIHNldAorICAgICAgICAgIC8v ICh5ZXMsIHZlcnkgdXNlZnVsKSB3cmFwIHRoaXMgd2l0aCBhIHRyeS9jYXRjaCBibG9jay4KKyAg ICAgICAgICBkb2Mub25wcm9wZXJ0eWNoYW5nZSA9IGZ1bmN0aW9uKCl7CisgICAgICAgICAgICB0 cnkgeworICAgICAgICAgICAgICBpZiAoIGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gJ3RpdGxlJyAp IHsKKyAgICAgICAgICAgICAgICBpZnJhbWUuZG9jdW1lbnQudGl0bGUgPSBkb2MudGl0bGU7Cisg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goZSkge30KKyAgICAgICAgICB9Owor ICAgICAgICAgIAorICAgICAgICB9CisgICAgICB9OworICAgICAgCisgICAgICAvLyBPdmVycmlk ZSB0aGUgInN0b3AiIG1ldGhvZCBzaW5jZSBhbiBJRTYvNyBJZnJhbWUgd2FzIGNyZWF0ZWQuIEV2 ZW4KKyAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IGJvdW5kIGV2ZW50IGhhbmRs ZXJzLCB0aGUgcG9sbGluZyBsb29wCisgICAgICAvLyBpcyBzdGlsbCBuZWNlc3NhcnkgZm9yIGJh Y2svbmV4dCB0byB3b3JrIGF0IGFsbCEKKyAgICAgIHNlbGYuc3RvcCA9IGZuX3JldHZhbDsKKyAg ICAgIAorICAgICAgLy8gR2V0IGhpc3RvcnkgYnkgbG9va2luZyBhdCB0aGUgaGlkZGVuIElmcmFt ZSdzIGxvY2F0aW9uLmhhc2guCisgICAgICBoaXN0b3J5X2dldCA9IGZ1bmN0aW9uKCkgeworICAg ICAgICByZXR1cm4gZ2V0X2ZyYWdtZW50KCBpZnJhbWUubG9jYXRpb24uaHJlZiApOworICAgICAg fTsKKyAgICAgIAorICAgICAgLy8gU2V0IGEgbmV3IGhpc3RvcnkgaXRlbSBieSBvcGVuaW5nIGFu ZCB0aGVuIGNsb3NpbmcgdGhlIElmcmFtZQorICAgICAgLy8gZG9jdW1lbnQsICp0aGVuKiBzZXR0 aW5nIGl0cyBsb2NhdGlvbi5oYXNoLiBJZiBkb2N1bWVudC5kb21haW4gaGFzCisgICAgICAvLyBi ZWVuIHNldCwgdXBkYXRlIHRoYXQgYXMgd2VsbC4KKyAgICAgIGhpc3Rvcnlfc2V0ID0gZnVuY3Rp b24oIGhhc2gsIGhpc3RvcnlfaGFzaCApIHsKKyAgICAgICAgdmFyIGlmcmFtZV9kb2MgPSBpZnJh bWUuZG9jdW1lbnQsCisgICAgICAgICAgZG9tYWluID0gJC5mblsgc3RyX2hhc2hjaGFuZ2UgXS5k b21haW47CisgICAgICAgIAorICAgICAgICBpZiAoIGhhc2ggIT09IGhpc3RvcnlfaGFzaCApIHsK KyAgICAgICAgICAvLyBVcGRhdGUgSWZyYW1lIHdpdGggYW55IGluaXRpYWwgYGRvY3VtZW50LnRp dGxlYCB0aGF0IG1pZ2h0IGJlIHNldC4KKyAgICAgICAgICBpZnJhbWVfZG9jLnRpdGxlID0gZG9j LnRpdGxlOworICAgICAgICAgIAorICAgICAgICAgIC8vIE9wZW5pbmcgdGhlIElmcmFtZSdzIGRv Y3VtZW50IGFmdGVyIGl0IGhhcyBiZWVuIGNsb3NlZCBpcyB3aGF0CisgICAgICAgICAgLy8gYWN0 dWFsbHkgYWRkcyBhIGhpc3RvcnkgZW50cnkuCisgICAgICAgICAgaWZyYW1lX2RvYy5vcGVuKCk7 CisgICAgICAgICAgCisgICAgICAgICAgLy8gU2V0IGRvY3VtZW50LmRvbWFpbiBmb3IgdGhlIElm cmFtZSBkb2N1bWVudCBhcyB3ZWxsLCBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgZG9tYWluICYm IGlmcmFtZV9kb2Mud3JpdGUoICc8c2NyaXB0PmRvY3VtZW50LmRvbWFpbj0iJyArIGRvbWFpbiAr ICciPC9zY3JpcHQ+JyApOworICAgICAgICAgIAorICAgICAgICAgIGlmcmFtZV9kb2MuY2xvc2Uo KTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBVcGRhdGUgdGhlIElmcmFtZSdzIGhhc2gsIGZv ciBncmVhdCBqdXN0aWNlLgorICAgICAgICAgIGlmcmFtZS5sb2NhdGlvbi5oYXNoID0gaGFzaDsK KyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIAorICAgIH0pKCk7CisgICAgLy8gXl5eXl5eXl5e Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e Xl5eXl5eCisgICAgLy8gXl5eXl5eXl5eXl5eXl5eXl5eXiBSRU1PVkUgSUYgTk9UIFNVUFBPUlRJ TkcgSUU2LzcvOCBeXl5eXl5eXl5eXl5eXl5eXl5eCisgICAgLy8gXl5eXl5eXl5eXl5eXl5eXl5e Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisg ICAgCisgICAgcmV0dXJuIHNlbGY7CisgIH0pKCk7CisgIAorfSkoalF1ZXJ5LHRoaXMpOwpkaWZm IC0tZ2l0IGEvYXNzZW1ibGVyL2dlbl9yZWdpb25zL2Fzc2V0cy9qcy9qcXVlcnkuaG90a2V5cy5q cyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvanF1ZXJ5LmhvdGtleXMuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwNWY5ZAotLS0gL2Rldi9udWxsCisr KyBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9hc3NldHMvanMvanF1ZXJ5LmhvdGtleXMuanMKQEAg LTAsMCArMSwxMDAgQEAKKy8qCisgKiBqUXVlcnkgSG90a2V5cyBQbHVnaW4KKyAqIENvcHlyaWdo dCAyMDEwLCBKb2huIFJlc2lnCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BM IFZlcnNpb24gMiBsaWNlbnNlcy4KKyAqCisgKiBCYXNlZCB1cG9uIHRoZSBwbHVnaW4gYnkgVHp1 cnkgQmFyIFlvY2hheToKKyAqIGh0dHA6Ly9naXRodWIuY29tL3R6dXJ5YnkvaG90a2V5cworICoK KyAqIE9yaWdpbmFsIGlkZWEgYnk6CisgKiBCaW5ueSBWIEEsIGh0dHA6Ly93d3cub3BlbmpzLmNv bS9zY3JpcHRzL2V2ZW50cy9rZXlib2FyZF9zaG9ydGN1dHMvCisqLworCisoZnVuY3Rpb24oalF1 ZXJ5KXsKKwkKKwlqUXVlcnkuaG90a2V5cyA9IHsKKwkJdmVyc2lvbjogIjAuOCIsCisKKwkJc3Bl Y2lhbEtleXM6IHsKKwkJCTg6ICJiYWNrc3BhY2UiLCA5OiAidGFiIiwgMTM6ICJyZXR1cm4iLCAx NjogInNoaWZ0IiwgMTc6ICJjdHJsIiwgMTg6ICJhbHQiLCAxOTogInBhdXNlIiwKKwkJCTIwOiAi Y2Fwc2xvY2siLCAyNzogImVzYyIsIDMyOiAic3BhY2UiLCAzMzogInBhZ2V1cCIsIDM0OiAicGFn ZWRvd24iLCAzNTogImVuZCIsIDM2OiAiaG9tZSIsCisJCQkzNzogImxlZnQiLCAzODogInVwIiwg Mzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLCAKKwkJCTk2 OiAiMCIsIDk3OiAiMSIsIDk4OiAiMiIsIDk5OiAiMyIsIDEwMDogIjQiLCAxMDE6ICI1IiwgMTAy OiAiNiIsIDEwMzogIjciLAorCQkJMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAi KyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLCAKKwkJCTExMjogImYxIiwgMTEzOiAi ZjIiLCAxMTQ6ICJmMyIsIDExNTogImY0IiwgMTE2OiAiZjUiLCAxMTc6ICJmNiIsIDExODogImY3 IiwgMTE5OiAiZjgiLCAKKwkJCTEyMDogImY5IiwgMTIxOiAiZjEwIiwgMTIyOiAiZjExIiwgMTIz OiAiZjEyIiwgMTQ0OiAibnVtbG9jayIsIDE0NTogInNjcm9sbCIsIDE5MTogIi8iLCAyMjQ6ICJt ZXRhIgorCQl9LAorCQorCQlzaGlmdE51bXM6IHsKKwkJCSJgIjogIn4iLCAiMSI6ICIhIiwgIjIi OiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwg CisJCQkiOCI6ICIqIiwgIjkiOiAiKCIsICIwIjogIikiLCAiLSI6ICJfIiwgIj0iOiAiKyIsICI7 IjogIjogIiwgIiciOiAiXCIiLCAiLCI6ICI8IiwgCisJCQkiLiI6ICI+IiwgICIvIjogIj8iLCAg IlxcIjogInwiCisJCX0KKwl9OworCisJZnVuY3Rpb24ga2V5SGFuZGxlciggaGFuZGxlT2JqICkg eworCQkvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmll ZAorCQlpZiAoIHR5cGVvZiBoYW5kbGVPYmouZGF0YSAhPT0gInN0cmluZyIgKSB7CisJCQlyZXR1 cm47CisJCX0KKwkJCisJCXZhciBvcmlnSGFuZGxlciA9IGhhbmRsZU9iai5oYW5kbGVyLAorCQkJ a2V5cyA9IGhhbmRsZU9iai5kYXRhLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKSwKKwkJCXRleHRB Y2NlcHRpbmdJbnB1dFR5cGVzID0gWyJ0ZXh0IiwgInBhc3N3b3JkIiwgIm51bWJlciIsICJlbWFp bCIsICJ1cmwiLCAicmFuZ2UiLCAiZGF0ZSIsICJtb250aCIsICJ3ZWVrIiwgInRpbWUiLCAiZGF0 ZXRpbWUiLCAiZGF0ZXRpbWUtbG9jYWwiLCAic2VhcmNoIiwgImNvbG9yIl07CisJCisJCWhhbmRs ZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJLy8gRG9uJ3QgZmlyZSBpbiB0 ZXh0LWFjY2VwdGluZyBpbnB1dHMgdGhhdCB3ZSBkaWRuJ3QgZGlyZWN0bHkgYmluZCB0bworCQkJ aWYgKCB0aGlzICE9PSBldmVudC50YXJnZXQgJiYgKC90ZXh0YXJlYXxzZWxlY3QvaS50ZXN0KCBl dmVudC50YXJnZXQubm9kZU5hbWUgKSB8fAorCQkJCWpRdWVyeS5pbkFycmF5KGV2ZW50LnRhcmdl dC50eXBlLCB0ZXh0QWNjZXB0aW5nSW5wdXRUeXBlcykgPiAtMSApICkgeworCQkJCXJldHVybjsK KwkJCX0KKwkJCQorCQkJLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3Bl Y2lhbCBrZXlzCisJCQl2YXIgc3BlY2lhbCA9IGV2ZW50LnR5cGUgIT09ICJrZXlwcmVzcyIgJiYg alF1ZXJ5LmhvdGtleXMuc3BlY2lhbEtleXNbIGV2ZW50LndoaWNoIF0sCisJCQkJY2hhcmFjdGVy ID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQud2hpY2ggKS50b0xvd2VyQ2FzZSgpLAorCQkJ CWtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKKworCQkJLy8gY2hlY2sgY29tYmluYXRp b25zIChhbHR8Y3RybHxzaGlmdCthbnl0aGluZykKKwkJCWlmICggZXZlbnQuYWx0S2V5ICYmIHNw ZWNpYWwgIT09ICJhbHQiICkgeworCQkJCW1vZGlmICs9ICJhbHQrIjsKKwkJCX0KKworCQkJaWYg KCBldmVudC5jdHJsS2V5ICYmIHNwZWNpYWwgIT09ICJjdHJsIiApIHsKKwkJCQltb2RpZiArPSAi Y3RybCsiOworCQkJfQorCQkJCisJCQkvLyBUT0RPOiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHdv cmtzIGNvbnNpc3RlbnRseSBhY3Jvc3MgcGxhdGZvcm1zCisJCQlpZiAoIGV2ZW50Lm1ldGFLZXkg JiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgeworCQkJCW1vZGlmICs9 ICJtZXRhKyI7CisJCQl9CisKKwkJCWlmICggZXZlbnQuc2hpZnRLZXkgJiYgc3BlY2lhbCAhPT0g InNoaWZ0IiApIHsKKwkJCQltb2RpZiArPSAic2hpZnQrIjsKKwkJCX0KKworCQkJaWYgKCBzcGVj aWFsICkgeworCQkJCXBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CisKKwkJCX0g ZWxzZSB7CisJCQkJcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOworCQkJCXBv c3NpYmxlWyBtb2RpZiArIGpRdWVyeS5ob3RrZXlzLnNoaWZ0TnVtc1sgY2hhcmFjdGVyIF0gXSA9 IHRydWU7CisKKwkJCQkvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNo aWZ0KyQiIG9yIGp1c3QgIiQiCisJCQkJaWYgKCBtb2RpZiA9PT0gInNoaWZ0KyIgKSB7CisJCQkJ CXBvc3NpYmxlWyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVl OworCQkJCX0KKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkg PCBsOyBpKysgKSB7CisJCQkJaWYgKCBwb3NzaWJsZVsga2V5c1tpXSBdICkgeworCQkJCQlyZXR1 cm4gb3JpZ0hhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJCX0KKwkJCX0KKwkJ fTsKKwl9CisKKwlqUXVlcnkuZWFjaChbICJrZXlkb3duIiwgImtleXVwIiwgImtleXByZXNzIiBd LCBmdW5jdGlvbigpIHsKKwkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBr ZXlIYW5kbGVyIH07CisJfSk7CisKK30pKCBqUXVlcnkgKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJsZXIvZ2VuX3JlZ2lvbnMvZ2VuX3JlZ2lvbnMuaHRt bCBiL2Fzc2VtYmxlci9nZW5fcmVnaW9ucy9nZW5fcmVnaW9ucy5odG1sCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2IwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NlbWJs ZXIvZ2VuX3JlZ2lvbnMvZ2VuX3JlZ2lvbnMuaHRtbApAQCAtMCwwICsxLDE3MyBAQAorPCFET0NU WVBFIGh0bWw+Cis8aHRtbD4KKworICA8IS0tIEpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0 ZXh0L2phdmFzY3JpcHQiCisgICAgICAgICAgc3JjPSJhc3NldHMvanMvanF1ZXJ5LTEuOS4xLmpz Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiCisgICAgICAgICAg c3JjPSJhc3NldHMvanMvanF1ZXJ5LW1pZ3JhdGUtMS4xLjEuanMiPjwvc2NyaXB0PgorICA8c2Ny aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIKKyAgICAgICAgICBzcmM9ImFzc2V0cy9qcy9qcXVl cnkuaG90a2V5cy5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0 IgorICAgICAgICAgIHNyYz0iYXNzZXRzL2pzL2pxdWVyeS5iYS1oYXNoY2hhbmdlLmpzIj48L3Nj cmlwdD4KKworICA8IS0tIEJvb3RzdGFwIC0tPgorICA8bGluayBocmVmPSJhc3NldHMvY3NzL2Jv b3RzdHJhcC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9InNjcmVlbiI+CisKKyAgPGhlYWQ+ CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBj b250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KKyAgICA8bWV0 YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iR0VOIFJlZ2lzdGVyIHZpc3VhbGlzYXRpb24g dG9vbCI+CisgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJDaHJpcyBDdW1taW5zIj4K KyAgICA8dGl0bGU+R0VOIFJlZ2lzdGVyIFJlZ2lvbnM8L3RpdGxlPgorCisgICAgPGRpdiBjbGFz cz0ibmF2YmFyIj4KKyAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1pbm5lciIgc3R5bGU9InBhZGRp bmctYm90dG9tOiA0cHgiPgorICAgICAgICA8YSBjbGFzcz0iYnJhbmQiIGhyZWY9IiIKKyAgICAg ICAgICAgc3R5bGU9InBhZGRpbmctdG9wOiAxNnB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij5HRU4g UmVnaW9uczwvYT4KKyAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIj4KKyAgICAgICAgICA8 YSBpZD0iZXhlYy1zaXplLWJ0biIgY2xhc3M9ImJ0biBkcm9wZG93bi10b2dnbGUiCisgICAgICAg ICAgICAgZGF0YS10b2dnbGU9ImRyb3Bkb3duIiBocmVmPSIjIiBzdHlsZT0id2lkdGg6IDY0cHg7 Ij4KKyAgICAgICAgICAgIEV4ZWNTaXplIDxzcGFuIGNsYXNzPSJjYXJldCI+PC9zcGFuPgorICAg ICAgICAgIDwvYT4KKyAgICAgICAgICA8dWwgaWQ9ImV4ZWMtc2l6ZS11bCIgY2xhc3M9ImRyb3Bk b3duLW1lbnUiIHJvbGU9Im1lbnUiCisgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0iZExh YmVsIj4KKyAgICAgICAgICAgIDxsaT5FeGVjU2l6ZTwvbGk+CisgICAgICAgICAgICA8bGkgY2xh c3M9ImRpdmlkZXIiPjwvbGk+CisgICAgICAgICAgICA8bGk+PGE+MTwvYT48L2xpPgorICAgICAg ICAgICAgPGxpPjxhPjI8L2E+PC9saT4KKyAgICAgICAgICAgIDxsaT48YT40PC9hPjwvbGk+Cisg ICAgICAgICAgICA8bGkgaWQ9ImRlZmF1bHQtZXhlYy1zaXplLWxpIj48YT44PC9hPjwvbGk+Cisg ICAgICAgICAgICA8bGk+PGE+MTY8L2E+PC9saT4KKyAgICAgICAgICAgIDxsaT48YT4zMjwvYT48 L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvZGl2PiA8IS0tIC8uYnRuLWdyb3VwIC0t PgorICAgICAgICAmbmJzcDsKKyAgICAgICAgPGlucHV0IGlkPSJyZWdpb24tZm9ybSIgdHlwZT0i dGV4dCIgY2xhc3M9InNlYXJjaC1xdWVyeSIKKyAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJS ZWdpb24iIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogM3B4OyIKKyAgICAgICAgICAg ICAgID4mbmJzcDsKKyAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCBpbmxpbmUiIHN0eWxl PSJwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogOXB4OyI+CisgICAgICAgICAgPGlucHV0IGlkPSJh ZHZhbmNlZCIgY2xhc3M9ImNoZWNrYm94IGlubGluZSIgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIi CisgICAgICAgICAgICAgICAgIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogLTJweDsi PgorICAgICAgICAgIC0tYWR2YW5jZWQgJm5ic3A7ICZuYnNwOworICAgICAgICA8L2xhYmVsPgor ICAgICAgICA8YnV0dG9uIGlkPSJzaGFyZS1idG4iIGNsYXNzPSJidG4gcHVsbC1yaWdodCIgb25j bGljaz0ic2hhcmVCdG5DYigpOyIKKyAgICAgICAgICAgICAgICBzdHlsZT0icG9zaXRpb246IHJl bGF0aXZlOyB0b3A6IDVweDsiPgorICAgICAgICAgIDxzdHJvbmc+U2hhcmU8L3N0cm9uZz4KKyAg ICAgICAgPC9idXR0b24+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4gPCEtLSAvLm5hdmJhciAt LT4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICA8 ZGl2IGNsYXNzPSJzcGFuMTEiPgorICAgICAgICA8ZGl2IGlkPSJzaGFyZSIgY2xhc3M9ImFsZXJ0 IGFsZXJ0LXN1Y2Nlc3MiPgorICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0i Y2xvc2UiPgorICAgICAgICAgICAgJnRpbWVzOworICAgICAgICAgIDwvYnV0dG9uPgorICAgICAg ICAgIDxzdHJvbmc+VVJMIEhhc2g8L3N0cm9uZz4KKyAgICAgICAgICA8dGV4dGFyZWEgaWQ9InNo YXJlLWhhc2giIGNsYXNzPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6 IDQwMHB4OyBoZWlnaHQ6IDIwcHg7IHJlc2l6ZTogbm9uZTsiCisgICAgICAgICAgICAgICAgICAg IHJlYWRvbmx5PjwvdGV4dGFyZWE+CisgICAgICAgIDwvZGl2PiA8IS0tIC8uYWxlcnQgLS0+Cisg ICAgICAgIDxkaXYgaWQ9ImFsZXJ0LWVycm9yIiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IiPgor ICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiPgorICAgICAgICAg ICAgJnRpbWVzOworICAgICAgICAgIDwvYnV0dG9uPgorICAgICAgICAgIDxkaXYgaWQ9ImFsZXJ0 LWVycm9yLXBsYWNlaG9sZGVyIj48L2Rpdj4KKyAgICAgICAgPC9kaXY+IDwhLS0gLy5hbGVydCAt LT4KKyAgICAgICAgPGRpdiBpZD0iYWxlcnQiIGNsYXNzPSJhbGVydCI+CisgICAgICAgICAgPGJ1 dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSI+CisgICAgICAgICAgICAmdGltZXM7Cisg ICAgICAgICAgPC9idXR0b24+CisgICAgICAgICAgPGRpdiBpZD0iYWxlcnQtcGxhY2Vob2xkZXIi PjwvZGl2PgorICAgICAgICA8L2Rpdj4gPCEtLSAvLmFsZXJ0IC0tPgorICAgICAgPC9kaXY+IDwh LS0gLy5zcGFuMTEgLS0+CisgICAgPC9kaXY+IDwhLS0gLy5yb3cgLS0+CisgICAgPGRpdiBjbGFz cz0iY29udGFpbmVyIj4KKyAgICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgIDxkaXYgY2xh c3M9InNwYW4xMSI+CisgICAgICAgICAgPGNhbnZhcyBpZD0iY2FudmFzIiB3aWR0aD0iOTAwIiBo ZWlnaHQ9IjQxMiI+CisgICAgICAgICAgICBVbnN1cHBvcnRlZCBicm93c2VyIQorICAgICAgICAg IDwvY2FudmFzPgorICAgICAgICA8L2Rpdj4gPCEtLSAvLnNwYW4xMSAtLT4KKyAgICAgIDwvZGl2 PiA8IS0tIC8ucm93IC0tPgorICAgICAgPGRpdiBjbGFzcz0ic3BhbjExIj4KKyAgICAgICAgPGRp diBjbGFzcz0icm93Ij4KKyAgICAgICAgICA8cCBpZD0iY2FudmFzLWNhcHRpb24iPjwvcD4KKyAg ICAgICAgPC9kaXY+IDwhLS0gLy5yb3cgLS0+CisgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+Cisg ICAgICAgICAgPGgyPlVzYWdlPC9oMj4KKyAgICAgICAgICA8b2w+CisgICAgICAgICAgICA8bGk+ U2VsZWN0IGFuIGV4ZWN1dGlvbiBzaXplIGZyb20gdGhlIGRyb3Bkb3duIGJveC48L2xpPgorICAg ICAgICAgICAgPGxpPkVudGVyIGEgcmVnaXN0ZXIgcmVnaW9uIGRlc2NyaXB0aW9uIGludG8gdGhl IHRleHQgYXJlYS48L2xpPgorICAgICAgICAgICAgPGxpPlNlbGVjdCAnLS1hZHZhbmNlZCcgdG8g Y2hhbmdlIFN1YlJlZ051bSBmcm9tIGJlaW5nIGluIGJ5dGVzIHRvCisgICAgICAgICAgICB0aGUg dW5pdCBvZiBkYXRhIHR5cGUuPC9saT4KKyAgICAgICAgICA8L29sPgorICAgICAgICAgIDxoMj5T aGFyaW5nPC9oMj4KKworICAgICAgICAgIFRoZSBwYWdlIFVSTCBjb250YWlucyBhIGRlc2NyaXB0 aW9uIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSByZWdpb24KKyAgICAgICAgICB3aGljaCBjYW4g YmUgc2hhcmVkLCBzYXZlZCBvciBib29rbWFya2VkIGZvciBsYXRlciByZWZlcmVuY2UuIEZvcgor ICAgICAgICAgIGV4YW1wbGUsIDxjb2RlPmZpbGU6Ly8vcGF0aC90by9nZW4tcmVnaW9ucy5odG1s I2V4ZWNzaXplPTgmYW1wO3JlZ2lvbj0xLjA8MT46RiZhbXA7YWR2YW5jZWQ9MDwvY29kZT4uCisg ICAgICAgICAgU2luY2UgdGhpcyBpcyBhIHBhdGggdG8gYSBsb2NhbCBmaWxlLCB5b3UgbWF5IHdh bnQgdG8gdXNlIHRoZSBTaGFyZQorICAgICAgICAgIGJ1dHRvbiB0byBjb3B5IGp1c3QgdGhlIHJl bGV2YW50IHBhcnQgc2luY2Ugb3RoZXIgcGVvcGxlJ3MgbG9jYWwgcGF0aHMKKyAgICAgICAgICBt YXkgbm90IG1hdGNoICh0aGVzZSBVUkwgaGFzaGVzIGNhbiBiZSBjb3BpZWQgb250byB0aGUgZW5k IG9mIHRoZSBmaWxlCisgICAgICAgICAgcGF0aCBvciBhbHRlcm5hdGl2ZWx5IHBhc3RlZCBkaXJl Y3RseSBpbnRvIHRoZSByZWdpb24gdGV4dCBib3ggYW5kCisgICAgICAgICAgc3VibWl0dGVkIGxp a2UgYSBub3JtYWwgcmVnaW9uIGRlc2NyaXB0aW9uKS4KKyAgICAgICAgICA8aDI+S2V5IEJpbmRp bmdzPC9oMj4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHBhZ2Utd2lkZSBrZXliaW5kaW5ncyBh cmUgZGVmaW5lZCBmb3IgY29udmVuaWVuY2U6CisgICAgICAgICAgPGJyLz48YnIvPgorICAgICAg ICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMjAiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IGxl ZnQ6IDMwcHg7Ij4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0 ZXh0LWFsaWduOiByaWdodDsgcGFkZGluZy1yaWdodDogMTBweDsiPgorICAgICAgICAgICAgICAg IDxjb2RlPjxzdHJvbmc+W3JldHVybl08L2NvZGU+PC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICAg ICAgPHRkPlN1Ym1pdCByZWdpb248L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAg IDx0cj4KKyAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsgcGFkZGlu Zy1yaWdodDogMTBweDsiPgorICAgICAgICAgICAgICAgIDxjb2RlPjxzdHJvbmc+W2VzY2FwZV08 L2NvZGU+PC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICAgICAgPHRkPkRpc21pc3Mgd2FybmluZ3M8 L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAg PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsgcGFkZGluZy1yaWdodDogMTBweDsiPgorICAg ICAgICAgICAgICAgIDxjb2RlPjxzdHJvbmc+ZTwvY29kZT48L3N0cm9uZz48L3RkPgorICAgICAg ICAgICAgICA8dGQ+VG9nZ2xlIHRocm91Z2ggZXhlY3V0aW9uIHNpemVzPC90ZD4KKyAgICAgICAg ICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4 dC1hbGlnbjogcmlnaHQ7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KKyAgICAgICAgICAgICAgICA8 Y29kZT48c3Ryb25nPmE8L2NvZGU+PC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRv Z2dsZSAtLWFkdmFuY2VkPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+ CisgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7IHBhZGRpbmctcmln aHQ6IDEwcHg7Ij4KKyAgICAgICAgICAgICAgICA8Y29kZT48c3Ryb25nPnI8L2NvZGU+PC9zdHJv bmc+PC90ZD4KKyAgICAgICAgICAgICAgPHRkPkZvY3VzIG9uIHJlZ2lvbiB0ZXh0IGJveDwvdGQ+ CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQg c3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CisgICAgICAg ICAgICAgICAgPGNvZGU+PHN0cm9uZz5jPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CisgICAgICAgICAg ICAgIDx0ZD5DbGVhciByZWdpb24gdGV4dCBib3g8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAg ICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdo dDsgcGFkZGluZy1yaWdodDogMTBweDsiPgorICAgICAgICAgICAgICAgIDxjb2RlPjxzdHJvbmc+ czwvY29kZT48L3N0cm9uZz48L3RkPgorICAgICAgICAgICAgICA8dGQ+U2hhcmU8L3RkPgorICAg ICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPjxici8+PGJyLz4KKyAgICAgICAgPC9k aXY+IDwhLS0gLy5yb3cgLS0+CisgICAgICA8L2Rpdj4gPCEtLSAvLnNwYW4xMSAtLT4KKyAgICA8 L2Rpdj4gPCEtLSAvLmNvbnRhaW5lciAtLT4KKyAgPC9ib2R5PgorCisgIDwhLS0gR0VOIFJlZ2lv bnMgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImFzc2V0cy9qcy9n ZW5fcmVnaW9ucy5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQ+aW5pdCgpOzwvc2NyaXB0PiA8IS0t IEJvb3RzdHJhcCBvdXIgc2NyaXB0LiAtLT4KKyAgPG5vc2NyaXB0PkphdmFTY3JpcHQgc3VwcG9y dCB1bmF2YWlsYWJsZSE8L25vc2NyaXB0PgorCisgIDwhLS0gQm9vdHN0cmFwIC0tPgorICA8c2Ny aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJhc3NldHMvanMvYm9vdHN0cmFwLWFsZXJ0 LmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYXNz ZXRzL2pzL2Jvb3RzdHJhcC1kcm9wZG93bi5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0i dGV4dC9qYXZhc2NyaXB0IiBzcmM9ImFzc2V0cy9qcy9ib290c3RyYXAtYnV0dG9uLmpzIj48L3Nj cmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYXNzZXRzL2pzL2Jv b3RzdHJhcC1jb2xsYXBzZS5qcyI+PC9zY3JpcHQ+Cis8L2h0bWw+Ci0tIAoxLjguMS40CgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFp bGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=